From 7b5f3d7c7b6eea9e203c3d69dc254cd64b65af12 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 8 Feb 2024 00:08:26 +0000 Subject: [PATCH 001/199] ci(release): update version to 6.5.0.dev1, reset IDEVELOPMODE to 1 --- CITATION.cff | 2 +- DISCLAIMER.md | 17 ++++++++--------- README.md | 19 +++++++++---------- code.json | 4 ++-- doc/version.py | 4 ++-- doc/version.tex | 2 +- meson.build | 2 +- src/Utilities/version.f90 | 26 ++++++++++++-------------- version.txt | 2 +- 9 files changed, 37 insertions(+), 41 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 1595372ce9e..afb385b533a 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -2,7 +2,7 @@ cff-version: 1.2.0 message: If you use this software, please cite the software itself. type: software title: MODFLOW 6 Modular Hydrologic Model -version: 6.4.3 +version: 6.5.0.dev1 date-released: '2024-02-07' doi: 10.5066/F76Q1VQV abstract: MODFLOW 6 is an object-oriented program and framework developed to provide diff --git a/DISCLAIMER.md b/DISCLAIMER.md index 9226475a939..f32778cb5e4 100644 --- a/DISCLAIMER.md +++ b/DISCLAIMER.md @@ -1,12 +1,11 @@ Disclaimer ---------- -This software has been approved for release by the U.S. Geological Survey -(USGS). Although the software has been subjected to rigorous review, the USGS -reserves the right to update the software as needed pursuant to further analysis -and review. No warranty, expressed or implied, is made by the USGS or the U.S. -Government as to the functionality of the software and related material nor -shall the fact of release constitute any such warranty. Furthermore, the -software is released on condition that neither the USGS nor the U.S. Government -shall be held liable for any damages resulting from its authorized or -unauthorized use. +This software is preliminary or provisional and is subject to revision. It is +being provided to meet the need for timely best science. The software has not +received final approval by the U.S. Geological Survey (USGS). No warranty, +expressed or implied, is made by the USGS or the U.S. Government as to the +functionality of the software and related material nor shall the fact of release +constitute any such warranty. The software is provided on the condition that +neither the USGS nor the U.S. Government shall be held liable for any damages +resulting from the authorized or unauthorized use of the software. diff --git a/README.md b/README.md index 5e561c379b6..303b0f49002 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ This is the development repository for the USGS MODFLOW 6 Hydrologic Model. The official USGS distribution is available at [USGS Release Page](https://water.usgs.gov/ogw/modflow/MODFLOW.html). -### Version 6.4.3 +### Version 6.5.0.dev1 (preliminary) [![GitHub release](https://img.shields.io/github/release/MODFLOW-USGS/modflow6.svg)](https://github.com/MODFLOW-USGS/modflow6/releases/latest) [![MODFLOW 6 continuous integration](https://github.com/MODFLOW-USGS/modflow6/actions/workflows/ci.yml/badge.svg)](https://github.com/MODFLOW-USGS/modflow6/actions/workflows/ci.yml) @@ -108,13 +108,12 @@ Citations for specific versions are included with the [releases](https://github. Disclaimer ---------- -This software has been approved for release by the U.S. Geological Survey -(USGS). Although the software has been subjected to rigorous review, the USGS -reserves the right to update the software as needed pursuant to further analysis -and review. No warranty, expressed or implied, is made by the USGS or the U.S. -Government as to the functionality of the software and related material nor -shall the fact of release constitute any such warranty. Furthermore, the -software is released on condition that neither the USGS nor the U.S. Government -shall be held liable for any damages resulting from its authorized or -unauthorized use. +This software is preliminary or provisional and is subject to revision. It is +being provided to meet the need for timely best science. The software has not +received final approval by the U.S. Geological Survey (USGS). No warranty, +expressed or implied, is made by the USGS or the U.S. Government as to the +functionality of the software and related material nor shall the fact of release +constitute any such warranty. The software is provided on the condition that +neither the USGS nor the U.S. Government shall be held liable for any damages +resulting from the authorized or unauthorized use of the software. diff --git a/code.json b/code.json index 0538ab48eb0..45049765bd2 100644 --- a/code.json +++ b/code.json @@ -1,6 +1,6 @@ [ { - "status": "Release", + "status": "Preliminary", "languages": [ "Fortran2008" ], @@ -18,7 +18,7 @@ "email": "langevin@usgs.gov" }, "laborHours": -1, - "version": "6.4.3", + "version": "6.5.0.dev1", "date": { "metadataLastUpdated": "2024-02-07" }, diff --git a/doc/version.py b/doc/version.py index 5456e79843b..c4fda5d1f40 100644 --- a/doc/version.py +++ b/doc/version.py @@ -1,3 +1,3 @@ # MODFLOW 6 version file automatically created using...update_version.py -# created on...February 07, 2024 21:53:23 -__version__ = "6.4.3" +# created on...February 07, 2024 21:29:25 +__version__ = "6.5.0.dev1" diff --git a/doc/version.tex b/doc/version.tex index 88c37fbb614..1aa74e9d7a9 100644 --- a/doc/version.tex +++ b/doc/version.tex @@ -1,3 +1,3 @@ -\newcommand{\modflowversion}{mf6.4.3} +\newcommand{\modflowversion}{mf6.5.0.dev1} \newcommand{\modflowdate}{February 07, 2024} \newcommand{\currentmodflowversion}{Version \modflowversion---\modflowdate} diff --git a/meson.build b/meson.build index f1bca2b04f0..605420c63a0 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project( 'MODFLOW 6', 'fortran', - version: '6.4.3', + version: '6.5.0.dev1', license: 'CC0', meson_version: '>= 1.1.0', default_options : [ diff --git a/src/Utilities/version.f90 b/src/Utilities/version.f90 index 011f2ec6917..b01704b6aa0 100644 --- a/src/Utilities/version.f90 +++ b/src/Utilities/version.f90 @@ -17,8 +17,8 @@ module VersionModule public ! -- modflow 6 version integer(I4B), parameter :: IDEVELOPMODE = 1 - character(len=*), parameter :: VERSIONNUMBER = '6.4.3' - character(len=*), parameter :: VERSIONTAG = ' 02/07/2024' + character(len=*), parameter :: VERSIONNUMBER = '6.5.0.dev1' + character(len=*), parameter :: VERSIONTAG = ' (preliminary) 02/07/2024' character(len=40), parameter :: VERSION = VERSIONNUMBER//VERSIONTAG character(len=2), parameter :: MFVNAM = ' 6' character(len=*), parameter :: MFTITLE = & @@ -75,18 +75,16 @@ module VersionModule ! -- disclaimer must be appropriate for version (release or release candidate) character(len=*), parameter :: FMTDISCLAIMER = & "(/,& - &'This software has been approved for release by the U.S. Geological ',/,& - &'Survey (USGS). Although the software has been subjected to rigorous ',/,& - &'review, the USGS reserves the right to update the software as needed ',/,& - &'pursuant to further analysis and review. No warranty, expressed or ',/,& - &'implied, is made by the USGS or the U.S. Government as to the ',/,& - &'functionality of the software and related material nor shall the ',/,& - &'fact of release constitute any such warranty. Furthermore, the ',/,& - &'software is released on condition that neither the USGS nor the U.S. ',/,& - &'Government shall be held liable for any damages resulting from its ',/,& - &'authorized or unauthorized use. Also refer to the USGS Water ',/,& - &'Resources Software User Rights Notice for complete use, copyright, ',/,& - &'and distribution information.',/)" + &'This software is preliminary or provisional and is subject to ',/,& + &'revision. It is being provided to meet the need for timely best ',/,& + &'science. The software has not received final approval by the U.S. ',/,& + &'Geological Survey (USGS). No warranty, expressed or implied, is made ',/,& + &'by the USGS or the U.S. Government as to the functionality of the ',/,& + &'software and related material nor shall the fact of release ',/,& + &'constitute any such warranty. The software is provided on the ',/,& + &'condition that neither the USGS nor the U.S. Government shall be held ',/,& + &'liable for any damages resulting from the authorized or unauthorized ',/,& + &'use of the software.',/)" contains diff --git a/version.txt b/version.txt index 8e0a2119a7d..510f24f8334 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -6.4.3 \ No newline at end of file +6.5.0.dev1 \ No newline at end of file From e338e83e4bacd1746bf786cbc84e24c7462a59ba Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 8 Feb 2024 10:40:59 -0500 Subject: [PATCH 002/199] ci: remove release reset step, validate cff, make citation from cff (#1596) --- .github/workflows/ci.yml | 5 +- .github/workflows/release_dispatch.yml | 80 ++------------------------ CITATION.cff | 4 +- distribution/update_version.py | 80 ++++++++++++++++++++++---- 4 files changed, 80 insertions(+), 89 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b0333674e46..7b3bd375a51 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,8 +57,11 @@ jobs: - name: Check Fortran source formatting run: python .github/common/fortran_format_check.py - - name: Check msvs project files + - name: Check MSVS project files run: python .github/common/msvs_vfproj_check.py + + - name: Check CITATION.cff + uses: dieghernan/cff-validator@v3 build: name: Build diff --git a/.github/workflows/release_dispatch.yml b/.github/workflows/release_dispatch.yml index 3037c98698e..efa9cc52295 100644 --- a/.github/workflows/release_dispatch.yml +++ b/.github/workflows/release_dispatch.yml @@ -240,82 +240,14 @@ jobs: GITHUB_TOKEN: ${{ github.token }} run: | # create draft release - ver=$(python distribution/update_version.py -g) - title="MODFLOW $ver" + version=$(python distribution/update_version.py -g) + title="MODFLOW $version" + citation=$(python distribution/update_version.py -c) notes=' - This is the approved USGS MODFLOW '$ver' release. + This is the approved USGS MODFLOW '$version' release. - *Insert citation here* + '$citation' Visit the USGS "MODFLOW and Related Programs" site for information on MODFLOW 6 and related software: https://doi.org/10.5066/F76Q1VQV ' - gh release create "$ver" ../mf*/mf*.zip ../release_notes/release.pdf --target master --title "$title" --notes "$notes" --draft --latest - - reset: - name: Draft reset PR - # runs only after GitHub release post is published (promoted from draft to public) - # to bring release commits from master back into develop and reset IDEVELOPMODE=1. - if: github.event_name == 'release' && (inputs.reset == 'true' || inputs.reset == '') - runs-on: ubuntu-22.04 - defaults: - run: - shell: bash -l {0} - steps: - - - name: Checkout modflow6 - uses: actions/checkout@v4 - with: - repository: ${{ github.repository_owner }}/modflow6 - path: modflow6 - - - name: Setup Micromamba - uses: mamba-org/setup-micromamba@v1 - with: - environment-file: modflow6/environment.yml - cache-downloads: true - cache-environment: true - - - name: Get release tag - uses: oprypin/find-latest-tag@v1 - id: latest_tag - with: - repository: ${{ github.repository }} - releases-only: true - - - name: Create pull request - working-directory: modflow6 - env: - GITHUB_TOKEN: ${{ github.token }} - run: | - # create reset branch from master - reset_branch="post-release-${{ steps.latest_tag.outputs.tag }}-reset" - git fetch origin - git checkout master - git switch -c $reset_branch - - # configure git - git config core.sharedRepository true - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - - # updating version numbers if enabled - if [[ ("${{ inputs.commit_version }}" == "true") || ("${{ inputs.commit_version }}" == "") ]]; then - ver="${{ steps.latest_tag.outputs.tag }}" - python distribution/update_version.py -v "$ver" - git add -A - git commit -m "ci(release): update version to $ver, reset IDEVELOPMODE to 1" - else - # in either case we at least need to reset IDEVELOPMODE to 1 - python distribution/update_version.py - git add -A - git commit -m "ci(release): reset IDEVELOPMODE to 1" - fi - - # push reset branch - git push -u origin $reset_branch - - # create PR into develop - body=' - Reinitialize the `develop` branch following a successful release. - ' - gh pr create -B "develop" -H "$reset_branch" --title "Reinitialize develop branch" --draft --body "$body \ No newline at end of file + gh release create "$version" ../mf*/mf*.zip ../release_notes/release.pdf --target master --title "$title" --notes "$notes" --draft --latest diff --git a/CITATION.cff b/CITATION.cff index afb385b533a..c2fff462923 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -3,7 +3,7 @@ message: If you use this software, please cite the software itself. type: software title: MODFLOW 6 Modular Hydrologic Model version: 6.5.0.dev1 -date-released: '2024-02-07' +date-released: '2024-02-08' doi: 10.5066/F76Q1VQV abstract: MODFLOW 6 is an object-oriented program and framework developed to provide a platform for supporting multiple models and multiple types of models within the @@ -29,7 +29,7 @@ authors: affiliation: U.S. Geological Survey orcid: https://orcid.org/0000-0002-4443-1107 - family-names: Russcher - given-names: Martijn + given-names: Martijn J. alias: mjr-deltares affiliation: Deltares orcid: https://orcid.org/0000-0001-8799-6514 diff --git a/distribution/update_version.py b/distribution/update_version.py index e09e0c69aef..282c53593b4 100755 --- a/distribution/update_version.py +++ b/distribution/update_version.py @@ -123,6 +123,49 @@ def get_disclaimer(approved: bool = False, formatted: bool = False) -> str: return _preliminary_fmtdisclaimer if formatted else _preliminary_disclaimer +def get_software_citation( + timestamp: datetime, version: Version, approved: bool = False +) -> str: + # get data Software/Code citation for FloPy + citation = yaml.safe_load((project_root_path / "CITATION.cff").read_text()) + + sb = "" + if not approved: + sb = f" (preliminary)" + # format author names + authors = [] + for author in citation["authors"]: + tauthor = author["family-names"] + ", " + gnames = author["given-names"].split() + if len(gnames) > 1: + for gname in gnames: + tauthor += gname[0] + if len(gname) > 1: + tauthor += "." + # tauthor += " " + else: + tauthor += author["given-names"] + authors.append(tauthor.rstrip()) + + line = "" + for ipos, tauthor in enumerate(authors): + if ipos > 0: + line += ", " + if ipos == len(authors) - 1: + line += "and " + # add formatted author name to line + line += tauthor + + # add the rest of the citation + line += ( + f", {timestamp.year}, MODFLOW 6 Modular Hydrologic Model version {version}{sb}: " + f"U.S. Geological Survey Software Release, {timestamp:%-d %B %Y}, " + "https://doi.org/10.5066/P9FL1JCC" + ) + + return line + + def log_update(path, version: Version): print(f"Updated {path} with version {version}") @@ -292,11 +335,7 @@ def update_version( try: lock = FileLock(lock_path) previous = Version(version_file_path.read_text().strip()) - version = ( - version - if version - else previous - ) + version = version if version else previous with lock: update_version_txt_and_py(version, timestamp) @@ -320,7 +359,9 @@ def update_version( [ None, _initial_version, - Version(f"{_initial_version.major}.{_initial_version.minor}.dev{_initial_version.micro}"), + Version( + f"{_initial_version.major}.{_initial_version.minor}.dev{_initial_version.micro}" + ), ], ) @pytest.mark.parametrize("approved", [True, False]) @@ -417,17 +458,32 @@ def test_update_version(version, approved, developmode): action="store_true", help="Get the current version number, don't update anything (defaults to false)", ) + parser.add_argument( + "-c", + "--citation", + required=False, + action="store_true", + help="Show the citation, don't update anything (defaults to False)", + ) args = parser.parse_args() + approved = args.approved + releasemode = args.releasemode + version = Version(args.version) if args.version else _current_version if args.get: print(Version((project_root_path / "version.txt").read_text().strip())) + elif args.citation: + print( + get_software_citation( + timestamp=datetime.now(), version=version, approved=approved + ) + ) else: - print(f"Updating to version {args.version} with options") - print(f" releasemode: {args.releasemode}") - print(f" approved: {args.approved}") - version = Version(args.version) if args.version else _current_version + print(f"Updating to version {version} with options") + print(f" approved: {approved}") + print(f" releasemode: {releasemode}") update_version( version=version, timestamp=datetime.now(), - approved=args.approved, - developmode=not args.releasemode, + approved=approved, + developmode=not releasemode, ) From 967f16807216bae33fc6b019997917faa4e7cd90 Mon Sep 17 00:00:00 2001 From: mjr-deltares <45555666+mjr-deltares@users.noreply.github.com> Date: Thu, 8 Feb 2024 23:47:53 +0100 Subject: [PATCH 003/199] fix(par): first version of message cache for MPI traffic (#1582) * - cache mpi headers and bodies * - final step in implementing caching: only cache message bodies (skip routing of headers and maps when possible) * - fix: initialize mpi request handles * - add MPI error check * - PETSc vec readonly access * - add more strategic MPI error checks --- make/makefile | 60 ++-- msvs/mf6core.vfproj | 10 + pymake/excludefiles.txt | 2 + src/Distributed/MpiMessageBuilder.f90 | 40 +-- src/Distributed/MpiMessageCache.f90 | 130 ++++++++ src/Distributed/MpiRouter.f90 | 353 +++++++++++++++++----- src/Distributed/MpiRunControl.F90 | 2 + src/Distributed/MpiUnitCache.f90 | 166 ++++++++++ src/Distributed/MpiWorld.f90 | 18 ++ src/Distributed/VirtualDataContainer.f90 | 3 + src/Model/Connection/GwfGwfConnection.f90 | 2 +- src/Solution/PETSc/PetscConvergence.F90 | 15 +- src/Solution/ParallelSolution.f90 | 8 + src/Utilities/STLVecInt.f90 | 30 ++ src/Utilities/SimStages.f90 | 1 + src/meson.build | 2 + utils/mf5to6/make/makefile | 8 +- 17 files changed, 691 insertions(+), 159 deletions(-) create mode 100644 src/Distributed/MpiMessageCache.f90 create mode 100644 src/Distributed/MpiUnitCache.f90 diff --git a/make/makefile b/make/makefile index 885d0663ab9..20d30e6d03f 100644 --- a/make/makefile +++ b/make/makefile @@ -5,36 +5,36 @@ include ./makedefaults # Define the source file directories SOURCEDIR1=../src -SOURCEDIR2=../src/Exchange -SOURCEDIR3=../src/Model -SOURCEDIR4=../src/Model/Geometry -SOURCEDIR5=../src/Model/TransportModel +SOURCEDIR2=../src/Model +SOURCEDIR3=../src/Model/TransportModel +SOURCEDIR4=../src/Model/GroundWaterFlow +SOURCEDIR5=../src/Model/Geometry SOURCEDIR6=../src/Model/ModelUtilities -SOURCEDIR7=../src/Model/Connection -SOURCEDIR8=../src/Model/GroundWaterTransport -SOURCEDIR9=../src/Model/GroundWaterFlow -SOURCEDIR10=../src/Distributed -SOURCEDIR11=../src/Solution -SOURCEDIR12=../src/Solution/PETSc -SOURCEDIR13=../src/Solution/LinearMethods -SOURCEDIR14=../src/Timing -SOURCEDIR15=../src/Utilities -SOURCEDIR16=../src/Utilities/TimeSeries -SOURCEDIR17=../src/Utilities/Libraries -SOURCEDIR18=../src/Utilities/Libraries/rcm -SOURCEDIR19=../src/Utilities/Libraries/sparsekit -SOURCEDIR20=../src/Utilities/Libraries/sparskit2 -SOURCEDIR21=../src/Utilities/Libraries/blas -SOURCEDIR22=../src/Utilities/Libraries/daglib -SOURCEDIR23=../src/Utilities/Idm -SOURCEDIR24=../src/Utilities/Idm/selector -SOURCEDIR25=../src/Utilities/Idm/mf6blockfile -SOURCEDIR26=../src/Utilities/Matrix -SOURCEDIR27=../src/Utilities/Vector -SOURCEDIR28=../src/Utilities/Observation -SOURCEDIR29=../src/Utilities/OutputControl -SOURCEDIR30=../src/Utilities/Memory -SOURCEDIR31=../src/Utilities/ArrayRead +SOURCEDIR7=../src/Model/GroundWaterTransport +SOURCEDIR8=../src/Model/Connection +SOURCEDIR9=../src/Distributed +SOURCEDIR10=../src/Utilities +SOURCEDIR11=../src/Utilities/Idm +SOURCEDIR12=../src/Utilities/Idm/mf6blockfile +SOURCEDIR13=../src/Utilities/Idm/selector +SOURCEDIR14=../src/Utilities/Vector +SOURCEDIR15=../src/Utilities/Matrix +SOURCEDIR16=../src/Utilities/Observation +SOURCEDIR17=../src/Utilities/ArrayRead +SOURCEDIR18=../src/Utilities/OutputControl +SOURCEDIR19=../src/Utilities/Libraries +SOURCEDIR20=../src/Utilities/Libraries/blas +SOURCEDIR21=../src/Utilities/Libraries/rcm +SOURCEDIR22=../src/Utilities/Libraries/sparsekit +SOURCEDIR23=../src/Utilities/Libraries/sparskit2 +SOURCEDIR24=../src/Utilities/Libraries/daglib +SOURCEDIR25=../src/Utilities/Memory +SOURCEDIR26=../src/Utilities/TimeSeries +SOURCEDIR27=../src/Timing +SOURCEDIR28=../src/Solution +SOURCEDIR29=../src/Solution/PETSc +SOURCEDIR30=../src/Solution/LinearMethods +SOURCEDIR31=../src/Exchange VPATH = \ ${SOURCEDIR1} \ @@ -237,6 +237,7 @@ $(OBJDIR)/SparseMatrix.o \ $(OBJDIR)/LinearSolverBase.o \ $(OBJDIR)/ims8reordering.o \ $(OBJDIR)/ModflowInput.o \ +$(OBJDIR)/IdmLogger.o \ $(OBJDIR)/Integer2dReader.o \ $(OBJDIR)/VirtualExchange.o \ $(OBJDIR)/GridSorting.o \ @@ -268,7 +269,6 @@ $(OBJDIR)/RouterBase.o \ $(OBJDIR)/ImsLinearSolver.o \ $(OBJDIR)/ims8base.o \ $(OBJDIR)/StructVector.o \ -$(OBJDIR)/IdmLogger.o \ $(OBJDIR)/DefinitionSelect.o \ $(OBJDIR)/InputLoadType.o \ $(OBJDIR)/Integer1dReader.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index 04ba48ba0dd..f0a03e6f2da 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -54,6 +54,11 @@ + + + + + @@ -64,6 +69,11 @@ + + + + + diff --git a/pymake/excludefiles.txt b/pymake/excludefiles.txt index 33694f4ea5d..c2677d02b3d 100644 --- a/pymake/excludefiles.txt +++ b/pymake/excludefiles.txt @@ -5,6 +5,8 @@ ../src/Utilities/Matrix/PetscMatrix.F90 ../src/Utilities/Vector/PetscVector.F90 ../src/Distributed/MpiMessageBuilder.f90 +../src/Distributed/MpiMessageCache.f90 ../src/Distributed/MpiRouter.f90 ../src/Distributed/MpiRunControl.F90 +../src/Distributed/MpiUnitCache.f90 ../src/Distributed/MpiWorld.f90 diff --git a/src/Distributed/MpiMessageBuilder.f90 b/src/Distributed/MpiMessageBuilder.f90 index b92165923f8..8c9be363329 100644 --- a/src/Distributed/MpiMessageBuilder.f90 +++ b/src/Distributed/MpiMessageBuilder.f90 @@ -42,7 +42,6 @@ module MpiMessageBuilderModule procedure, private :: create_vdc_snd_map procedure, private :: create_vdc_snd_body procedure, private :: create_vdc_rcv_body - procedure, private :: create_element_map end type contains @@ -114,7 +113,7 @@ subroutine create_header_snd(this, rank, stage, hdrs_snd_type) class(MpiMessageBuilderType) :: this integer(I4B) :: rank integer(I4B) :: stage - integer :: hdrs_snd_type + integer, intent(out) :: hdrs_snd_type ! local integer(I4B) :: i, offset, nr_types class(VirtualDataContainerType), pointer :: vdc @@ -186,7 +185,7 @@ end subroutine create_header_snd subroutine create_header_rcv(this, hdr_rcv_type) class(MpiMessageBuilderType) :: this - integer :: hdr_rcv_type + integer, intent(out) :: hdr_rcv_type ! local integer :: ierr @@ -203,7 +202,7 @@ subroutine create_map_snd(this, rank, stage, map_snd_type) class(MpiMessageBuilderType) :: this integer(I4B) :: rank integer(I4B) :: stage - integer :: map_snd_type + integer, intent(out) :: map_snd_type ! local integer(I4B) :: i, offset, nr_types class(VirtualDataContainerType), pointer :: vdc @@ -280,7 +279,7 @@ subroutine create_map_rcv(this, rcv_map, nr_headers, map_rcv_type) class(MpiMessageBuilderType) :: this type(VdcReceiverMapsType), dimension(:) :: rcv_map integer(I4B) :: nr_headers - integer :: map_rcv_type + integer, intent(out) :: map_rcv_type ! local integer(I4B) :: i, j, nr_elems, type_cnt integer :: ierr, max_nr_maps @@ -323,7 +322,7 @@ subroutine create_body_rcv(this, rank, stage, body_rcv_type) class(MpiMessageBuilderType) :: this integer(I4B) :: rank integer(I4B) :: stage - integer :: body_rcv_type + integer, intent(out) :: body_rcv_type ! local integer(I4B) :: i, nr_types, offset class(VirtualDataContainerType), pointer :: vdc @@ -400,7 +399,7 @@ subroutine create_body_snd(this, rank, stage, headers, maps, body_snd_type) integer(I4B) :: stage type(VdcHeaderType), dimension(:) :: headers type(VdcReceiverMapsType), dimension(:) :: maps - integer :: body_snd_type + integer, intent(out) :: body_snd_type ! local integer(I4B) :: i, nr_headers class(VirtualDataContainerType), pointer :: vdc @@ -627,33 +626,6 @@ function create_vdc_snd_body(this, vdc, vdc_maps, rank, stage) result(new_type) end function create_vdc_snd_body - !> @brief Temp. function to generate a dummy (complete) map - !< - function create_element_map(this, rank, vdc, vd) result(el_map) - use MemoryManagerModule, only: get_mem_shape, get_mem_rank - use ConstantsModule, only: MAXMEMRANK - class(MpiMessageBuilderType) :: this - integer(I4B) :: rank - class(VirtualDataContainerType), pointer :: vdc - class(VirtualDataType), pointer :: vd - integer(I4B), dimension(:), pointer, contiguous :: el_map - ! local - integer(I4B), dimension(MAXMEMRANK) :: mem_shp - integer(I4B) :: i, nrow, mem_rank - - el_map => null() - call get_mem_rank(vd%virtual_mt%name, vd%virtual_mt%path, mem_rank) - call get_mem_shape(vd%virtual_mt%name, vd%virtual_mt%path, mem_shp) - if (mem_rank > 0) then - nrow = mem_shp(mem_rank) - allocate (el_map(nrow)) - do i = 1, nrow - el_map(i) = i - 1 - end do - end if - - end function create_element_map - function get_vdc_from_hdr(this, header) result(vdc) class(MpiMessageBuilderType) :: this type(VdcHeaderType) :: header diff --git a/src/Distributed/MpiMessageCache.f90 b/src/Distributed/MpiMessageCache.f90 new file mode 100644 index 00000000000..222a4f2ac27 --- /dev/null +++ b/src/Distributed/MpiMessageCache.f90 @@ -0,0 +1,130 @@ +module MpiMessageCacheModule + use KindModule, only: I4B + use SimStagesModule, only: NR_SIM_STAGES + use ListModule + use STLVecIntModule + use MpiUnitCacheModule + implicit none + private + + ! the message types for caching during a simulation stage: + integer(I4B), public, parameter :: MPI_BDY_RCV = 1 !< receiving data (body) from ranks + integer(I4B), public, parameter :: MPI_BDY_SND = 2 !< sending data (body) to ranks + integer(I4B), public, parameter :: NR_MSG_TYPES = 2 !< the total number of message types to be cached + + ! expose this from the unit cache module + public :: NO_CACHED_VALUE + + !> @brief Facility to cache the constructed MPI datatypes. + !! This will avoid having to construct them over and over + !! again for the communication inside the timestep loop. + !! This class deals with separate caches for different + !! units (solutions or global) and for different types of + !< messages within the communication stage. + type, public :: MpiMessageCacheType + type(STLVecInt) :: cached_ids !< a vector with ids for the cached units (solution ids) + type(ListType) :: unit_caches !< a list with caches per unit + contains + procedure :: init => mmc_init + procedure :: get => mmc_get + procedure :: put => mmc_put + procedure :: destroy => mmc_destroy + end type MpiMessageCacheType + +contains + + !< @brief Initialize the MPI type cache system. + !< + subroutine mmc_init(this) + class(MpiMessageCacheType) :: this !< the message cache + + call this%cached_ids%init() + + end subroutine mmc_init + + !< @brief Get the cached mpi datatype for the given + !! unit, rank, stage, and message element. Returns + !< NO_CACHED_VALUE when not in cache. + function mmc_get(this, unit, rank, stage, msg_id) result(mpi_type) + class(MpiMessageCacheType) :: this !< the message cache + integer(I4B) :: unit !< the unit (solution or global) + integer(I4B) :: rank !< the rank of the MPI process to communicate with + integer(I4B) :: stage !< the simulation stage at which the message is sent + integer(I4B) :: msg_id !< the message type as an integer between 1 and NR_MSG_TYPES (see above for predefined values) + integer :: mpi_type !< the resulting mpi datatype + ! local + integer(I4B) :: unit_idx + class(*), pointer :: obj_ptr + + mpi_type = NO_CACHED_VALUE + + unit_idx = this%cached_ids%get_index(unit) + if (unit_idx == -1) return ! not cached + + obj_ptr => this%unit_caches%GetItem(unit_idx) + select type (obj_ptr) + class is (MpiUnitCacheType) + mpi_type = obj_ptr%get_cached(rank, stage, msg_id) + end select + + end function mmc_get + + !> @brief Put the mpi datatype for this particular unit, + !! rank, and stage in cache. The datatype should be + !< committed to the type database externally. + subroutine mmc_put(this, unit, rank, stage, msg_id, mpi_type) + class(MpiMessageCacheType) :: this !< the message cache + integer(I4B) :: unit !< the unit (solution or global) + integer(I4B) :: rank !< the rank of the MPI process to communicate with + integer(I4B) :: stage !< the simulation stage at which the message is sent + integer(I4B) :: msg_id !< the message type as an integer between 1 and NR_MSG_TYPES (see above for predefined values) + integer :: mpi_type !< the mpi datatype to cache + ! local + integer(I4B) :: unit_idx + type(MpiUnitCacheType), pointer :: new_cache + class(*), pointer :: obj_ptr + + unit_idx = this%cached_ids%get_index(unit) + if (unit_idx == -1) then + ! add to vector with cached unit ids + call this%cached_ids%push_back(unit) + ! create and add unit cache + allocate (new_cache) + call new_cache%init(NR_SIM_STAGES, NR_MSG_TYPES) + obj_ptr => new_cache + call this%unit_caches%Add(obj_ptr) + unit_idx = this%cached_ids%size + end if + + ! get the cache for this unit + obj_ptr => this%unit_caches%GetItem(unit_idx) + select type (obj_ptr) + class is (MpiUnitCacheType) + call obj_ptr%cache(rank, stage, msg_id, mpi_type) + end select + + end subroutine mmc_put + + !< @brief Destroy the MPI type cache system. + !< + subroutine mmc_destroy(this) + class(MpiMessageCacheType) :: this !< the message cache + ! local + integer(I4B) :: i + class(*), pointer :: obj_ptr + + ! clear caches + do i = 1, this%cached_ids%size + obj_ptr => this%unit_caches%GetItem(i) + select type (obj_ptr) + class is (MpiUnitCacheType) + call obj_ptr%destroy() + end select + end do + call this%unit_caches%Clear(destroy=.true.) + + call this%cached_ids%destroy() + + end subroutine mmc_destroy + +end module diff --git a/src/Distributed/MpiRouter.f90 b/src/Distributed/MpiRouter.f90 index e3cc403b832..b4fcd6c1eff 100644 --- a/src/Distributed/MpiRouter.f90 +++ b/src/Distributed/MpiRouter.f90 @@ -11,6 +11,7 @@ module MpiRouterModule use VirtualExchangeModule, only: VirtualExchangeType use VirtualSolutionModule use MpiMessageBuilderModule + use MpiMessageCacheModule use MpiWorldModule use mpi implicit none @@ -27,6 +28,7 @@ module MpiRouterModule type(VdcPtrType), dimension(:), pointer :: rte_models => null() !< the currently active models to be routed type(VdcPtrType), dimension(:), pointer :: rte_exchanges => null() !< the currently active exchanges to be routed type(MpiMessageBuilderType) :: message_builder + type(MpiMessageCacheType) :: msg_cache type(MpiWorldType), pointer :: mpi_world => null() integer(I4B) :: imon !< the output file unit for the mpi monitor logical(LGP) :: enable_monitor !< when true, log diagnostics @@ -38,11 +40,14 @@ module MpiRouterModule ! private procedure, private :: activate procedure, private :: deactivate - procedure, private :: mr_update_senders - procedure, private :: mr_update_senders_sln - procedure, private :: mr_update_receivers - procedure, private :: mr_update_receivers_sln - procedure, private :: mr_route_active + procedure, private :: update_senders + procedure, private :: update_senders_sln + procedure, private :: update_receivers + procedure, private :: update_receivers_sln + procedure, private :: route_active + procedure, private :: is_cached + procedure, private :: compose_messages + procedure, private :: load_messages end type MpiRouterType contains @@ -73,8 +78,9 @@ subroutine mr_initialize(this) ! to log or not to log this%enable_monitor = .false. - ! initialize the MPI message builder + ! initialize the MPI message builder and cache call this%message_builder%init() + call this%msg_cache%init() ! get mpi world for our process this%mpi_world => get_mpi_world() @@ -102,6 +108,7 @@ subroutine mr_initialize(this) call MPI_Allreduce(MPI_IN_PLACE, this%model_proc_ids, nr_models, & MPI_INTEGER, MPI_SUM, this%mpi_world%comm, ierr) + call CHECK_MPI(ierr) ! set the process id to the models and exchanges do i = 1, nr_models @@ -181,7 +188,7 @@ subroutine mr_route_all(this, stage) ! route all call this%activate(this%all_models, this%all_exchanges) - call this%mr_route_active(stage) + call this%route_active(0, stage) call this%deactivate() if (this%enable_monitor) then @@ -206,7 +213,7 @@ subroutine mr_route_sln(this, virtual_sol, stage) ! route for this solution call this%activate(virtual_sol%models, virtual_sol%exchanges) - call this%mr_route_active(stage) + call this%route_active(virtual_sol%solution_id, stage) call this%deactivate() if (this%enable_monitor) then @@ -215,39 +222,50 @@ subroutine mr_route_sln(this, virtual_sol, stage) end subroutine mr_route_sln - !> @brief Routes the models and exchanges. This is the - !< workhorse routine - subroutine mr_route_active(this, stage) - class(MpiRouterType) :: this - integer(I4B) :: stage + !> @brief Routes the models and exchanges over MPI, + !! either constructing the message bodies in a sequence + !! of communication steps, or by loading from cache + !< for efficiency. + subroutine route_active(this, unit, stage) + use SimModule, only: store_error + class(MpiRouterType) :: this !< this mpi router + integer(I4B) :: unit !< the solution id, or equal to 0 when global + integer(I4B) :: stage !< the stage to route ! local - integer(I4B) :: i, j, k + integer(I4B) :: i integer(I4B) :: rnk integer :: ierr, msg_size + logical(LGP) :: from_cache ! mpi handles integer, dimension(:), allocatable :: rcv_req integer, dimension(:), allocatable :: snd_req integer, dimension(:, :), allocatable :: rcv_stat - integer, dimension(:, :), allocatable :: snd_stat - ! message header - integer(I4B) :: max_headers - type(VdcHeaderType), dimension(:, :), allocatable :: headers - integer, dimension(:), allocatable :: hdr_rcv_t - integer, dimension(:), allocatable :: hdr_snd_t - integer, dimension(:), allocatable :: hdr_rcv_cnt - - ! maps - type(VdcReceiverMapsType), dimension(:, :), allocatable :: rcv_maps - integer, dimension(:), allocatable :: map_rcv_t - integer, dimension(:), allocatable :: map_snd_t ! message body integer, dimension(:), allocatable :: body_rcv_t integer, dimension(:), allocatable :: body_snd_t ! update adress list - call this%mr_update_senders() - call this%mr_update_receivers() + call this%update_senders() + call this%update_receivers() + + if (this%senders%size /= this%receivers%size) then + call store_error("Internal error: receivers should equal senders", & + terminate=.true.) + end if + + ! allocate body data + allocate (body_rcv_t(this%senders%size)) + allocate (body_snd_t(this%receivers%size)) + + ! allocate handles + allocate (rcv_req(this%receivers%size)) + allocate (snd_req(this%senders%size)) + allocate (rcv_stat(MPI_STATUS_SIZE, this%receivers%size)) + + ! always initialize request handles + rcv_req = MPI_REQUEST_NULL + snd_req = MPI_REQUEST_NULL if (this%enable_monitor) then write (this%imon, '(2x,a,*(i3))') "process ids sending data: ", & @@ -256,11 +274,132 @@ subroutine mr_route_active(this, stage) this%receivers%get_values() end if + ! from cache or build + from_cache = this%is_cached(unit, stage) + if (.not. from_cache) then + call this%compose_messages(unit, stage, body_snd_t, body_rcv_t) + else + call this%load_messages(unit, stage, body_snd_t, body_rcv_t) + end if + + if (this%enable_monitor) then + write (this%imon, '(2x,a)') "== communicating bodies ==" + end if + + ! recv bodies + do i = 1, this%senders%size + rnk = this%senders%at(i) + if (this%enable_monitor) then + write (this%imon, '(4x,a,i0)') "receiving from process: ", rnk + end if + + call MPI_Type_size(body_rcv_t(i), msg_size, ierr) + if (msg_size > 0) then + call MPI_Irecv(MPI_BOTTOM, 1, body_rcv_t(i), rnk, stage, & + this%mpi_world%comm, rcv_req(i), ierr) + call CHECK_MPI(ierr) + end if + + if (this%enable_monitor) then + write (this%imon, '(6x,a,i0)') "message body size: ", msg_size + end if + end do + + ! send bodies + do i = 1, this%receivers%size + rnk = this%receivers%at(i) + if (this%enable_monitor) then + write (this%imon, '(4x,a,i0)') "sending to process: ", rnk + end if + + call MPI_Type_size(body_snd_t(i), msg_size, ierr) + if (msg_size > 0) then + call MPI_Isend(MPI_Bottom, 1, body_snd_t(i), rnk, stage, & + this%mpi_world%comm, snd_req(i), ierr) + call CHECK_MPI(ierr) + end if + + if (this%enable_monitor) then + write (this%imon, '(6x,a,i0)') "message body size: ", msg_size + end if + call flush (this%imon) + end do + + ! wait for exchange of all messages + call MPI_WaitAll(this%senders%size, rcv_req, rcv_stat, ierr) + call CHECK_MPI(ierr) + + deallocate (rcv_req, snd_req, rcv_stat) + deallocate (body_rcv_t, body_snd_t) + + end subroutine route_active + + !> @brief Constructs the message bodies' MPI datatypes. + !! + !! Constructs the message bodies' MPI datatypes for a + !! unit (a solution) and a given stage. This is done in + !! a sequence of 6 steps (distributed over 3 phases): + !! + !! == synchronizing headers (VdcHeaderType) == + !! + !! step 1: + !! Receive headers from remote addresses requesting data + !! from virtual data containers (models, exchanges, ...) local to this process + !! step 2: + !! Send headers to remote addresses to indicate for which + !! virtual data containers (models, exchanges, ...) data is requested + !! + !! == synchronizing maps (VdcReceiverMapsType) == + !! + !! step 3: + !! Based on the received headers, receive element maps (which elements are + !! to be sent from a contiguous array) for outgoing data + !! step 4: + !! Send element maps to remote addresses to specify incoming data + !! + !! == construct message body data types (VirtualDataContainerType) == + !! + !! step 5: + !! Construct the message receive body based on the virtual + !! data items in the virtual data containers, and cache + !! + !! step 6: + !! Construct the message send body, based on received header data and + !! and maps, from the virtual data containers, and cache + !< + subroutine compose_messages(this, unit, stage, body_snd_t, body_rcv_t) + class(MpiRouterType) :: this + integer(I4B) :: unit + integer(I4B) :: stage + integer, dimension(:) :: body_snd_t + integer, dimension(:) :: body_rcv_t + ! local + integer(I4B) :: i, j, k + integer(I4B) :: rnk + integer :: ierr + ! mpi handles + integer, dimension(:), allocatable :: rcv_req + integer, dimension(:), allocatable :: snd_req + integer, dimension(:, :), allocatable :: rcv_stat + ! message header + integer(I4B) :: max_headers + type(VdcHeaderType), dimension(:, :), allocatable :: headers + integer, dimension(:), allocatable :: hdr_rcv_t + integer, dimension(:), allocatable :: hdr_snd_t + integer, dimension(:), allocatable :: hdr_rcv_cnt + ! maps + type(VdcReceiverMapsType), dimension(:, :), allocatable :: rcv_maps + integer, dimension(:), allocatable :: map_rcv_t + integer, dimension(:), allocatable :: map_snd_t + ! allocate handles allocate (rcv_req(this%receivers%size)) allocate (snd_req(this%senders%size)) allocate (rcv_stat(MPI_STATUS_SIZE, this%receivers%size)) - allocate (snd_stat(MPI_STATUS_SIZE, this%senders%size)) + + ! init handles + rcv_req = MPI_REQUEST_NULL + snd_req = MPI_REQUEST_NULL ! allocate header data max_headers = size(this%rte_models) + size(this%rte_exchanges) @@ -274,10 +413,6 @@ subroutine mr_route_active(this, stage) allocate (map_rcv_t(this%receivers%size)) allocate (rcv_maps(max_headers, this%receivers%size)) ! for every header, we potentially need the maps - ! allocate body data - allocate (body_rcv_t(this%senders%size)) - allocate (body_snd_t(this%receivers%size)) - if (this%enable_monitor) then write (this%imon, '(2x,a)') "== communicating headers ==" end if @@ -291,7 +426,7 @@ subroutine mr_route_active(this, stage) call this%message_builder%create_header_rcv(hdr_rcv_t(i)) call MPI_Irecv(headers(:, i), max_headers, hdr_rcv_t(i), rnk, stage, & this%mpi_world%comm, rcv_req(i), ierr) - ! don't free mpi datatype, we need the count below + call CHECK_MPI(ierr) end do ! send header for incoming data @@ -303,11 +438,16 @@ subroutine mr_route_active(this, stage) call this%message_builder%create_header_snd(rnk, stage, hdr_snd_t(i)) call MPI_Isend(MPI_BOTTOM, 1, hdr_snd_t(i), rnk, stage, & this%mpi_world%comm, snd_req(i), ierr) - call MPI_Type_free(hdr_snd_t(i), ierr) + call CHECK_MPI(ierr) end do ! wait for exchange of all headers call MPI_WaitAll(this%receivers%size, rcv_req, rcv_stat, ierr) + call CHECK_MPI(ierr) + + ! reinit handles + rcv_req = MPI_REQUEST_NULL + snd_req = MPI_REQUEST_NULL ! after WaitAll we can count incoming headers from statuses do i = 1, this%receivers%size @@ -323,9 +463,15 @@ subroutine mr_route_active(this, stage) write (this%imon, '(6x,a,99i6)') "map sizes: ", headers(j, i)%map_sizes end do end if + end do + ! clean up types + do i = 1, this%receivers%size call MPI_Type_free(hdr_rcv_t(i), ierr) end do + do i = 1, this%senders%size + call MPI_Type_free(hdr_snd_t(i), ierr) + end do if (this%enable_monitor) then write (this%imon, '(2x,a)') "== communicating maps ==" @@ -347,9 +493,9 @@ subroutine mr_route_active(this, stage) call this%message_builder%create_map_rcv(rcv_maps(:, i), hdr_rcv_cnt(i), & map_rcv_t(i)) - call MPI_Irecv(MPI_BOTTOM, 1, map_rcv_t(i), rnk, stage, & this%mpi_world%comm, rcv_req(i), ierr) + call CHECK_MPI(ierr) end do ! send maps @@ -358,13 +504,16 @@ subroutine mr_route_active(this, stage) if (this%enable_monitor) then write (this%imon, '(4x,a,i0)') "send map to process: ", rnk end if + call this%message_builder%create_map_snd(rnk, stage, map_snd_t(i)) call MPI_Isend(MPI_BOTTOM, 1, map_snd_t(i), rnk, stage, & this%mpi_world%comm, snd_req(i), ierr) + call CHECK_MPI(ierr) end do ! wait on receiving maps call MPI_WaitAll(this%receivers%size, rcv_req, rcv_stat, ierr) + call CHECK_MPI(ierr) ! print maps if (this%enable_monitor) then @@ -395,77 +544,75 @@ subroutine mr_route_active(this, stage) end do if (this%enable_monitor) then - write (this%imon, '(2x,a)') "== communicating bodies ==" + write (this%imon, '(2x,a)') "== composing message bodies ==" end if - ! recv bodies + ! construct recv bodies and cache do i = 1, this%senders%size rnk = this%senders%at(i) if (this%enable_monitor) then - write (this%imon, '(4x,a,i0)') "receiving from process: ", rnk + write (this%imon, '(4x,a,i0)') "build recv body for process: ", rnk end if call this%message_builder%create_body_rcv(rnk, stage, body_rcv_t(i)) - call MPI_Type_size(body_rcv_t(i), msg_size, ierr) - if (msg_size > 0) then - call MPI_Irecv(MPI_BOTTOM, 1, body_rcv_t(i), rnk, stage, & - this%mpi_world%comm, rcv_req(i), ierr) - end if - - if (this%enable_monitor) then - write (this%imon, '(6x,a,i0)') "message body size: ", msg_size - end if + call this%msg_cache%put(unit, rnk, stage, MPI_BDY_RCV, body_rcv_t(i)) end do - ! send bodies + ! construct send bodies and cache do i = 1, this%receivers%size rnk = this%receivers%at(i) if (this%enable_monitor) then - write (this%imon, '(4x,a,i0)') "sending to process: ", rnk + write (this%imon, '(4x,a,i0)') "build send body for process: ", rnk end if + call this%message_builder%create_body_snd( & rnk, stage, headers(1:hdr_rcv_cnt(i), i), & rcv_maps(:, i), body_snd_t(i)) - call MPI_Type_size(body_snd_t(i), msg_size, ierr) - if (msg_size > 0) then - call MPI_Isend(MPI_Bottom, 1, body_snd_t(i), rnk, stage, & - this%mpi_world%comm, snd_req(i), ierr) - end if - - if (this%enable_monitor) then - write (this%imon, '(6x,a,i0)') "message body size: ", msg_size - end if - call flush (this%imon) - end do - - ! wait for exchange of all messages - call MPI_WaitAll(this%senders%size, rcv_req, snd_stat, ierr) - - ! clean up types - do i = 1, this%senders%size - call MPI_Type_free(body_rcv_t(i), ierr) - end do - do i = 1, this%receivers%size - call MPI_Type_free(body_snd_t(i), ierr) + call this%msg_cache%put(unit, rnk, stage, MPI_BDY_SND, body_snd_t(i)) end do - ! done sending, clean up element maps + ! clean up element maps do i = 1, this%receivers%size do j = 1, hdr_rcv_cnt(i) call rcv_maps(j, i)%destroy() end do end do - deallocate (rcv_req, snd_req, rcv_stat, snd_stat) + deallocate (rcv_req, snd_req, rcv_stat) deallocate (hdr_rcv_t, hdr_snd_t, hdr_rcv_cnt) deallocate (headers) deallocate (map_rcv_t, map_snd_t) deallocate (rcv_maps) - deallocate (body_rcv_t, body_snd_t) - end subroutine mr_route_active + end subroutine compose_messages - subroutine mr_update_senders(this) + !> @brief Load the message body MPI datatypes from cache + !< + subroutine load_messages(this, unit, stage, body_snd_t, body_rcv_t) + class(MpiRouterType) :: this + integer(I4B) :: unit + integer(I4B) :: stage + integer, dimension(:), allocatable :: body_snd_t + integer, dimension(:), allocatable :: body_rcv_t + ! local + integer(I4B) :: i, rnk + + if (this%enable_monitor) then + write (this%imon, '(2x,a)') "... running from cache ..." + end if + + do i = 1, this%receivers%size + rnk = this%receivers%at(i) + body_snd_t(i) = this%msg_cache%get(unit, rnk, stage, MPI_BDY_SND) + end do + do i = 1, this%senders%size + rnk = this%senders%at(i) + body_rcv_t(i) = this%msg_cache%get(unit, rnk, stage, MPI_BDY_RCV) + end do + + end subroutine load_messages + + subroutine update_senders(this) class(MpiRouterType) :: this ! local integer(I4B) :: i @@ -486,9 +633,9 @@ subroutine mr_update_senders(this) end if end do - end subroutine mr_update_senders + end subroutine update_senders - subroutine mr_update_senders_sln(this, virtual_sol) + subroutine update_senders_sln(this, virtual_sol) class(MpiRouterType) :: this type(VirtualSolutionType) :: virtual_sol ! local @@ -510,9 +657,9 @@ subroutine mr_update_senders_sln(this, virtual_sol) end if end do - end subroutine mr_update_senders_sln + end subroutine update_senders_sln - subroutine mr_update_receivers(this) + subroutine update_receivers(this) class(MpiRouterType) :: this ! local integer(I4B) :: i @@ -524,9 +671,9 @@ subroutine mr_update_receivers(this) call this%receivers%push_back(this%senders%at(i)) end do - end subroutine mr_update_receivers + end subroutine update_receivers - subroutine mr_update_receivers_sln(this, virtual_sol) + subroutine update_receivers_sln(this, virtual_sol) class(MpiRouterType) :: this type(VirtualSolutionType) :: virtual_sol ! local @@ -539,11 +686,51 @@ subroutine mr_update_receivers_sln(this, virtual_sol) call this%receivers%push_back(this%senders%at(i)) end do - end subroutine mr_update_receivers_sln + end subroutine update_receivers_sln + + !> @brief Check if this stage is cached + !< + function is_cached(this, unit, stage) result(in_cache) + use SimModule, only: ustop + class(MpiRouterType) :: this + integer(I4B) :: unit + integer(I4B) :: stage + logical(LGP) :: in_cache + ! local + integer(I4B) :: i, rnk + integer(I4B) :: no_cache_cnt + integer :: cached_type + + in_cache = .false. + no_cache_cnt = 0 + + do i = 1, this%receivers%size + rnk = this%receivers%at(i) + cached_type = this%msg_cache%get(unit, rnk, stage, MPI_BDY_SND) + if (cached_type == NO_CACHED_VALUE) no_cache_cnt = no_cache_cnt + 1 + end do + do i = 1, this%senders%size + rnk = this%senders%at(i) + cached_type = this%msg_cache%get(unit, rnk, stage, MPI_BDY_RCV) + if (cached_type == NO_CACHED_VALUE) no_cache_cnt = no_cache_cnt + 1 + end do + + ! it should be all or nothing + if (no_cache_cnt == this%receivers%size + this%senders%size) then + in_cache = .false. + else if (no_cache_cnt == 0) then + in_cache = .true. + else + call ustop("Internal error: MPI message cache corrupt...") + end if + + end function is_cached subroutine mr_destroy(this) class(MpiRouterType) :: this + call this%msg_cache%destroy() + call this%senders%destroy() call this%receivers%destroy() diff --git a/src/Distributed/MpiRunControl.F90 b/src/Distributed/MpiRunControl.F90 index e37f50c174a..796b59bf9b6 100644 --- a/src/Distributed/MpiRunControl.F90 +++ b/src/Distributed/MpiRunControl.F90 @@ -79,6 +79,7 @@ subroutine mpi_ctrl_start(this) #else if (.not. mpi_world%has_comm()) then call MPI_Init(ierr) + call CHECK_MPI(ierr) call mpi_world%set_comm(MPI_COMM_WORLD) end if #endif @@ -130,6 +131,7 @@ subroutine mpi_ctrl_finish(this) CHKERRQ(ierr) #else call MPI_Finalize(ierr) + call CHECK_MPI(ierr) #endif ! finish everything else by calling parent diff --git a/src/Distributed/MpiUnitCache.f90 b/src/Distributed/MpiUnitCache.f90 new file mode 100644 index 00000000000..51bf4a546f1 --- /dev/null +++ b/src/Distributed/MpiUnitCache.f90 @@ -0,0 +1,166 @@ +module MpiUnitCacheModule + use KindModule, only: I4B, LGP + use ListModule + use STLVecIntModule + use SimStagesModule, only: NR_SIM_STAGES + use mpi + implicit none + private + + integer(I4B), public, parameter :: NO_CACHED_VALUE = -1 + + type, public :: MpiUnitCacheType + ! private + type(STLVecInt), private :: cached_ranks + type(STLVecInt), private :: cached_messages + integer(I4B), private :: nr_stages + integer(I4B), private :: nr_msg_types + contains + procedure :: init => cc_init + procedure :: get_cached => cc_get_cached + procedure :: cache => mc_cache + procedure :: destroy => cc_destroy + ! private + procedure, private :: is_rank_cached + procedure, private :: add_rank_cache + procedure, private :: get_rank_index + procedure, private :: get_msg_index + end type MpiUnitCacheType + +contains + + !> @brief Initialize the unit cache. + !< + subroutine cc_init(this, nr_stages, nr_msg_types) + class(MpiUnitCacheType) :: this + integer(I4B) :: nr_stages !< number of (simulation) stages + integer(I4B) :: nr_msg_types !< number of message types to be cached during a stage + + this%nr_stages = nr_stages + this%nr_msg_types = nr_msg_types + call this%cached_ranks%init() + call this%cached_messages%init() + + end subroutine cc_init + + !> @brief Get the cached mpi type for this rank and + !< stage. Equal to NO_CACHED_VALUE when not present. + function cc_get_cached(this, rank, stage, msg_id) result(mpi_type) + class(MpiUnitCacheType) :: this + integer(I4B) :: rank + integer(I4B) :: stage + integer(I4B) :: msg_id + integer :: mpi_type + ! local + integer(I4B) :: msg_idx + + mpi_type = NO_CACHED_VALUE + msg_idx = this%get_msg_index(rank, stage, msg_id) + if (msg_idx > 0) then + mpi_type = this%cached_messages%at(msg_idx) + end if + + end function cc_get_cached + + !> @brief Cache the mpi datatype for this particular + !! rank and stage. The datatype should be committed + !< to the type database externally. + subroutine mc_cache(this, rank, stage, msg_id, mpi_type) + class(MpiUnitCacheType) :: this + integer(I4B) :: rank + integer(I4B) :: stage + integer(I4B) :: msg_id + integer :: mpi_type + ! local + integer(I4B) :: msg_idx + + ! add if rank not present in cache yet + if (.not. this%is_rank_cached(rank)) then + call this%add_rank_cache(rank) + end if + + ! rank has been added to cache, now set + ! mpi datatype for this stage's message: + msg_idx = this%get_msg_index(rank, stage, msg_id) + call this%cached_messages%set(msg_idx, mpi_type) + + end subroutine mc_cache + + function is_rank_cached(this, rank) result(in_cache) + class(MpiUnitCacheType) :: this + integer(I4B) :: rank + logical(LGP) :: in_cache + + in_cache = this%cached_ranks%contains(rank) + + end function is_rank_cached + + subroutine add_rank_cache(this, rank) + class(MpiUnitCacheType) :: this + integer(I4B) :: rank + ! local + integer(I4B) :: i, j + + call this%cached_ranks%push_back(rank) + do i = 1, this%nr_stages + do j = 1, this%nr_msg_types + call this%cached_messages%push_back(NO_CACHED_VALUE) + end do + end do + + end subroutine add_rank_cache + + !> @Brief returns -1 when not present + !< + function get_rank_index(this, rank) result(rank_index) + class(MpiUnitCacheType) :: this + integer(I4B) :: rank + integer(I4B) :: rank_index + + rank_index = this%cached_ranks%get_index(rank) + + end function get_rank_index + + !> @Brief returns -1 when not present + !< + function get_msg_index(this, rank, stage, msg_id) result(msg_index) + class(MpiUnitCacheType) :: this + integer(I4B) :: rank + integer(I4B) :: stage + integer(I4B) :: msg_id + integer(I4B) :: msg_index + ! local + integer(I4B) :: rank_idx + integer(I4B) :: rank_offset, stage_offset + + msg_index = -1 + rank_idx = this%get_rank_index(rank) + if (rank_idx < 1) return + + rank_offset = (rank_idx - 1) * (this%nr_stages * this%nr_msg_types) + stage_offset = (stage - 1) * this%nr_msg_types + msg_index = rank_offset + stage_offset + msg_id + + end function get_msg_index + + !> @brief Clean up the unit cache. + !< + subroutine cc_destroy(this) + class(MpiUnitCacheType) :: this + ! local + integer(I4B) :: i + integer :: mpi_type, ierr + + do i = 1, this%cached_messages%size + mpi_type = this%cached_messages%at(i) + if (mpi_type /= NO_CACHED_VALUE) then + call MPI_Type_free(mpi_type, ierr) + end if + end do + + call this%cached_ranks%destroy() + call this%cached_messages%destroy() + + end subroutine cc_destroy + +end module diff --git a/src/Distributed/MpiWorld.f90 b/src/Distributed/MpiWorld.f90 index 8962c99d757..7ee3498467e 100644 --- a/src/Distributed/MpiWorld.f90 +++ b/src/Distributed/MpiWorld.f90 @@ -6,6 +6,7 @@ module MpiWorldModule private public :: get_mpi_world + public :: CHECK_MPI type, public :: MpiWorldType integer(I4B) :: mpi_rank !< the id for this process @@ -108,4 +109,21 @@ subroutine mpiw_destroy(this) end subroutine mpiw_destroy + !> @brief Check the MPI error code, report, and + !< terminate when not MPI_SUCCESS + subroutine CHECK_MPI(mpi_error_code) + use SimModule, only: store_error + integer :: mpi_error_code + ! local + character(len=1024) :: mpi_err_msg + integer :: err_len + integer :: ierr + + if (mpi_error_code /= MPI_SUCCESS) then + call MPI_Error_string(mpi_error_code, mpi_err_msg, err_len, ierr) + call store_error("Internal error: "//trim(mpi_err_msg), terminate=.true.) + end if + + end subroutine CHECK_MPI + end module MpiWorldModule diff --git a/src/Distributed/VirtualDataContainer.f90 b/src/Distributed/VirtualDataContainer.f90 index 1a49f66b8d7..d8ca55e4fed 100644 --- a/src/Distributed/VirtualDataContainer.f90 +++ b/src/Distributed/VirtualDataContainer.f90 @@ -326,6 +326,9 @@ subroutine print_items(this, imon, items) vdi => get_virtual_data_from_list(this%virtual_data_list, items%at(i)) write (imon, *) vdi%var_name, ":", vdi%mem_path end do + if (items%size == 0) then + write (imon, *) "... empty ...", this%name + end if write (imon, *) "<===== items" end subroutine print_items diff --git a/src/Model/Connection/GwfGwfConnection.f90 b/src/Model/Connection/GwfGwfConnection.f90 index 625c41d8525..bbfdb6961dc 100644 --- a/src/Model/Connection/GwfGwfConnection.f90 +++ b/src/Model/Connection/GwfGwfConnection.f90 @@ -13,7 +13,7 @@ module GwfGwfConnectionModule use DisConnExchangeModule use GwfGwfExchangeModule, only: GwfExchangeType, GetGwfExchangeFromList, & CastAsGwfExchange - use GwfNpfModule, only: GwfNpfType, hcond, vcond + use GwfNpfModule, only: GwfNpfType use GwfBuyModule, only: GwfBuyType use BaseDisModule, only: DisBaseType use ConnectionsModule, only: ConnectionsType diff --git a/src/Solution/PETSc/PetscConvergence.F90 b/src/Solution/PETSc/PetscConvergence.F90 index 7c4dcd2cf81..0928d7aa017 100644 --- a/src/Solution/PETSc/PetscConvergence.F90 +++ b/src/Solution/PETSc/PetscConvergence.F90 @@ -92,10 +92,11 @@ subroutine petsc_check_convergence(ksp, n, rnorm, flag, context, ierr) CHKERRQ(ierr) call VecCopy(res, context%res_old, ierr) CHKERRQ(ierr) - call VecDestroy(res, ierr) - CHKERRQ(ierr) flag = KSP_CONVERGED_ITERATING end if + + call VecDestroy(res, ierr) + CHKERRQ(ierr) return end if @@ -131,10 +132,10 @@ subroutine petsc_check_convergence(ksp, n, rnorm, flag, context, ierr) call VecDestroy(res, ierr) CHKERRQ(ierr) - ! get dv and dr per local model - call VecGetArrayF90(context%delta_x, local_dx, ierr) + ! get dv and dr per local model (readonly!) + call VecGetArrayReadF90(context%delta_x, local_dx, ierr) CHKERRQ(ierr) - call VecGetArrayF90(context%delta_res, local_dr, ierr) + call VecGetArrayReadF90(context%delta_res, local_dr, ierr) CHKERRQ(ierr) do i = 1, summary%convnmod ! reset @@ -162,9 +163,9 @@ subroutine petsc_check_convergence(ksp, n, rnorm, flag, context, ierr) summary%convlocdr(i, iter_cnt) = idx_dr end if end do - call VecRestoreArrayF90(x, local_dx, ierr) + call VecRestoreArrayF90(context%delta_x, local_dx, ierr) CHKERRQ(ierr) - call VecRestoreArrayF90(x, local_dr, ierr) + call VecRestoreArrayF90(context%delta_res, local_dr, ierr) CHKERRQ(ierr) if (norm < context%dvclose) then diff --git a/src/Solution/ParallelSolution.f90 b/src/Solution/ParallelSolution.f90 index 687755e71ae..09c00392ef9 100644 --- a/src/Solution/ParallelSolution.f90 +++ b/src/Solution/ParallelSolution.f90 @@ -43,6 +43,7 @@ function par_has_converged(this, max_dvc) result(has_converged) abs_max_dvc = abs(max_dvc) call MPI_Allreduce(abs_max_dvc, global_max_dvc, 1, MPI_DOUBLE_PRECISION, & MPI_MAX, mpi_world%comm, ierr) + call CHECK_MPI(ierr) if (global_max_dvc <= this%dvclose) then has_converged = .true. end if @@ -68,6 +69,7 @@ function par_package_convergence(this, dpak, cpakout, iend) & call MPI_Allreduce(icnvg_local, icnvg_global, 1, MPI_INTEGER, & MPI_MIN, mpi_world%comm, ierr) + call CHECK_MPI(ierr) end function par_package_convergence @@ -82,6 +84,7 @@ function par_sync_newtonur_flag(this, inewtonur) result(ivalue) mpi_world => get_mpi_world() call MPI_Allreduce(inewtonur, ivalue, 1, MPI_INTEGER, & MPI_MAX, mpi_world%comm, ierr) + call CHECK_MPI(ierr) end function par_sync_newtonur_flag @@ -108,6 +111,7 @@ function par_nur_has_converged(this, dxold_max, hncg) & call MPI_Allreduce(icnvg_local, icnvg_global, 1, MPI_INTEGER, & MPI_MIN, mpi_world%comm, ierr) + call CHECK_MPI(ierr) if (icnvg_global == 1) has_converged = .true. end function par_nur_has_converged @@ -131,6 +135,7 @@ subroutine par_calc_ptc(this, iptc, ptcf) ! now reduce call MPI_Allreduce(ptcf_loc, ptcf_glo_max, 1, MPI_DOUBLE_PRECISION, & MPI_MAX, mpi_world%comm, ierr) + call CHECK_MPI(ierr) iptc = 0 ptcf = DZERO @@ -161,8 +166,10 @@ subroutine par_underrelax(this, kiter, bigch, neq, active, x, xtemp) ! first reduce largest change over all processes call MPI_Allreduce(bigch, dvc_global_max, 1, MPI_DOUBLE_PRECISION, & MPI_MAX, mpi_world%comm, ierr) + call CHECK_MPI(ierr) call MPI_Allreduce(bigch, dvc_global_min, 1, MPI_DOUBLE_PRECISION, & MPI_MIN, mpi_world%comm, ierr) + call CHECK_MPI(ierr) if (abs(dvc_global_min) > abs(dvc_global_max)) then dvc_global_max = dvc_global_min @@ -192,6 +199,7 @@ subroutine par_backtracking_xupdate(this, btflag) call MPI_Allreduce(btflag_local, btflag, 1, MPI_INTEGER, & MPI_MAX, mpi_world%comm, ierr) + call CHECK_MPI(ierr) end subroutine par_backtracking_xupdate diff --git a/src/Utilities/STLVecInt.f90 b/src/Utilities/STLVecInt.f90 index 6551e697705..7431da49026 100644 --- a/src/Utilities/STLVecInt.f90 +++ b/src/Utilities/STLVecInt.f90 @@ -21,10 +21,12 @@ module STLVecIntModule procedure, pass(this) :: add_array_unique !< adds elements of array at the end of the vector, if not present yet procedure, pass(this) :: at !< random access, unsafe, no bounds checking procedure, pass(this) :: at_safe !< random access with bounds checking + procedure, pass(this) :: set !< set value at index, no bounds checking procedure, pass(this) :: clear !< empties the vector, leaves memory unchanged procedure, pass(this) :: shrink_to_fit !< reduces the allocated memory to fit the actual vector size procedure, pass(this) :: destroy !< deletes the memory procedure, pass(this) :: contains !< true when element already present + procedure, pass(this) :: get_index !< return index of first occurrence of value in array, -1 when not present procedure, pass(this) :: get_values !< returns a copy of the values ! private procedure, private, pass(this) :: expand @@ -119,6 +121,15 @@ function at_safe(this, idx) result(value) end function at_safe + subroutine set(this, idx, value) + class(STLVecInt), intent(inout) :: this + integer(I4B), intent(in) :: idx + integer(I4B) :: value + + this%values(idx) = value + + end subroutine set + subroutine clear(this) class(STLVecInt), intent(inout) :: this @@ -200,6 +211,25 @@ function contains(this, val) result(res) end function contains + !> @brief Return index of first occurrence, + !< returns -1 when not present + function get_index(this, val) result(idx) + class(STLVecInt), intent(inout) :: this + integer(I4B) :: val + integer(I4B) :: idx + ! local + integer(I4B) :: i + + idx = -1 + do i = 1, this%size + if (this%at(i) == val) then + idx = i + return + end if + end do + + end function get_index + function get_values(this) result(values) class(STLVecInt), intent(in) :: this integer(I4B), dimension(:), allocatable :: values diff --git a/src/Utilities/SimStages.f90 b/src/Utilities/SimStages.f90 index 9168f05b9a8..01bd7d1e312 100644 --- a/src/Utilities/SimStages.f90 +++ b/src/Utilities/SimStages.f90 @@ -21,6 +21,7 @@ module SimStagesModule integer(I4B), public, parameter :: STG_BFR_EXG_AD = 12 !< before exchange advance (per solution) integer(I4B), public, parameter :: STG_BFR_EXG_CF = 13 !< before exchange calculate (per solution) integer(I4B), public, parameter :: STG_BFR_EXG_FC = 14 !< before exchange formulate (per solution) + integer(I4B), public, parameter :: NR_SIM_STAGES = 14 !< before exchange formulate (per solution) contains diff --git a/src/meson.build b/src/meson.build index b25a391edb3..8bd2cb66d93 100644 --- a/src/meson.build +++ b/src/meson.build @@ -275,6 +275,8 @@ modflow_petsc_sources = files( modflow_mpi_sources = files( 'Distributed' / 'MpiMessageBuilder.f90', + 'Distributed' / 'MpiMessageCache.f90', + 'Distributed' / 'MpiUnitCache.f90', 'Distributed' / 'MpiRouter.f90', 'Distributed' / 'MpiRunControl.F90', 'Distributed' / 'MpiWorld.f90', diff --git a/utils/mf5to6/make/makefile b/utils/mf5to6/make/makefile index ccf5741d638..0e3b414c298 100644 --- a/utils/mf5to6/make/makefile +++ b/utils/mf5to6/make/makefile @@ -5,10 +5,10 @@ include ./makedefaults # Define the source file directories SOURCEDIR1=../src -SOURCEDIR2=../src/LGR -SOURCEDIR3=../src/Preproc -SOURCEDIR4=../src/MF2005 -SOURCEDIR5=../src/NWT +SOURCEDIR2=../src/MF2005 +SOURCEDIR3=../src/NWT +SOURCEDIR4=../src/LGR +SOURCEDIR5=../src/Preproc SOURCEDIR6=../../../src/Utilities/Memory SOURCEDIR7=../../../src/Utilities/TimeSeries SOURCEDIR8=../../../src/Utilities From 6004b5acab3196a2aa7caa0e2231184e14a86218 Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Fri, 9 Feb 2024 08:21:54 -0800 Subject: [PATCH 004/199] chore(timer.f90): cleanup docstrings in Timer utility (#1600) * chore(timer.f90): cleanup docstrings in Timer utility * Restoring uppercase of intrinsic --- src/Utilities/Timer.f90 | 261 +++++++++++++++++++--------------------- 1 file changed, 125 insertions(+), 136 deletions(-) diff --git a/src/Utilities/Timer.f90 b/src/Utilities/Timer.f90 index 55c92761d17..576043a3472 100644 --- a/src/Utilities/Timer.f90 +++ b/src/Utilities/Timer.f90 @@ -1,7 +1,8 @@ module TimerModule use KindModule, only: DP, I4B - use ConstantsModule, only: LINELENGTH, DZERO + use ConstantsModule, only: LINELENGTH, DZERO, DONE, DSECPERDY, DSECPERHR, & + DSIXTY use MessageModule, only: write_message implicit none private @@ -12,183 +13,171 @@ module TimerModule contains + !> @brief Start simulation timer + !< subroutine print_start_time() -! ****************************************************************************** -! Start simulation timer -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ - ! -- dummy ! -- local character(len=LINELENGTH) :: line integer(I4B) :: i - ! -- format + ! -- formats character(len=*), parameter :: fmtdt = & "(1X,'Run start date and time (yyyy/mm/dd hh:mm:ss): ', & &I4,'/',I2.2,'/',I2.2,1X,I2,':',I2.2,':',I2.2)" -! ------------------------------------------------------------------------------ ! ! -- Get current date and time, assign to IBDT, and write to screen call date_and_time(values=ibdt) write (line, fmtdt) (ibdt(i), i=1, 3), (ibdt(i), i=5, 7) call write_message(line, skipafter=1) ! - ! -- return + ! -- Return return end subroutine print_start_time - SUBROUTINE elapsed_time(iout, iprtim) -! ****************************************************************************** -! Get end time and calculate elapsed time -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ + !> @brief Get end time and calculate elapsed time + !< + subroutine elapsed_time(iout, iprtim) ! -- dummy - integer(i4b), intent(in) :: iout + integer(I4B), intent(in) :: iout integer(I4B), intent(in) :: iprtim ! -- local character(len=LINELENGTH) :: line - INTEGER(I4B) :: IEDT(8), IDPM(12) + integer(I4B) :: IEDT(8), IDPM(12) integer(I4B) :: NSPD integer(I4B) :: i integer(I4B) :: ndays, leap, ibd, ied, mb, me, nm, mc, m integer(I4B) :: nhours, nmins, nsecs, msecs, nrsecs real(DP) :: elsec, rsecs - DATA IDPM/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/ ! Days per month - DATA NSPD/86400/ ! Seconds per day - ! -- format + data IDPM/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/ !< Days per month + data NSPD/86400/ !< Seconds per day + ! -- formats character(len=*), parameter :: fmtdt = & - "(1X,'Run end date and time (yyyy/mm/dd hh:mm:ss): ', & - &I4,'/',I2.2,'/',I2.2,1X,I2,':',I2.2,':',I2.2)" -! ------------------------------------------------------------------------------ -! -! Get current date and time, assign to IEDT, and write. - CALL DATE_AND_TIME(VALUES=IEDT) + "(1x,'Run end date and time (yyyy/mm/dd hh:mm:ss): ', & + &I4,'/',I2.2,'/',I2.2,1x,I2,':',I2.2,':',I2.2)" + character(len=*), parameter :: fmttma = & + "(1x,'Elapsed run time: ',I3,' Days, ',I2,' Hours, ',I2, & + &' Minutes, ', I2, ' Seconds')" + character(len=*), parameter :: fmttmb = & + &"(1x,'Elapsed run time: ',I2,' Hours, ',I2,' Minutes, ',I2,' Seconds')" + character(len=*), parameter :: fmttmc = & + &"(1x,'Elapsed run time: ',I2,' Minutes, ',I2,'.',I3.3,' Seconds')" + character(len=*), parameter :: fmttmd = & + &"(1x,'Elapsed run time: ',I2,'.',I3.3,' Seconds')" ! - ! -- write elapsed time to stdout + ! -- Get current date and time, assign to IEDT, and write. + call date_and_time(values=IEDT) + ! + ! -- Write elapsed time to stdout write (line, fmtdt) (IEDT(I), I=1, 3), (IEDT(I), I=5, 7) call write_message(line, skipbefore=1) ! - ! -- write elapsted time to iout - IF (IPRTIM .GT. 0) THEN + ! -- Write elapsted time to iout + if (iprtim > 0) then call write_message(line, iunit=iout, skipbefore=1) - END IF -! -! Calculate elapsed time in days and seconds - NDAYS = 0 - LEAP = 0 - IF (MOD(IEDT(1), 4) .EQ. 0) LEAP = 1 - IBD = IBDT(3) ! BEGIN DAY - IED = IEDT(3) ! END DAY -! FIND DAYS - IF (IBDT(2) .NE. IEDT(2)) THEN -! MONTHS DIFFER - MB = IBDT(2) ! BEGIN MONTH - ME = IEDT(2) ! END MONTH - NM = ME - MB + 1 ! NUMBER OF MONTHS TO LOOK AT - IF (MB .GT. ME) NM = NM + 12 - MC = MB - 1 - DO M = 1, NM - MC = MC + 1 ! MC IS CURRENT MONTH - IF (MC .EQ. 13) MC = 1 - IF (MC .EQ. MB) THEN - NDAYS = NDAYS + IDPM(MC) - IBD - IF (MC .EQ. 2) NDAYS = NDAYS + LEAP - ELSEIF (MC .EQ. ME) THEN - NDAYS = NDAYS + IED - ELSE - NDAYS = NDAYS + IDPM(MC) - IF (MC .EQ. 2) NDAYS = NDAYS + LEAP - END IF - END DO - ELSEIF (IBD .LT. IED) THEN -! START AND END IN SAME MONTH, ONLY ACCOUNT FOR DAYS - NDAYS = IED - IBD - END IF - ELSEC = NDAYS * NSPD -! -! ADD OR SUBTRACT SECONDS - ELSEC = ELSEC + (IEDT(5) - IBDT(5)) * 3600.0 - ELSEC = ELSEC + (IEDT(6) - IBDT(6)) * 60.0 - ELSEC = ELSEC + (IEDT(7) - IBDT(7)) - ELSEC = ELSEC + (IEDT(8) - IBDT(8)) * 0.001 -! -! CONVERT SECONDS TO DAYS, HOURS, MINUTES, AND SECONDS - NDAYS = INT(ELSEC / NSPD) - RSECS = MOD(ELSEC, 86400.0_DP) - NHOURS = INT(RSECS / 3600.0) - RSECS = MOD(RSECS, 3600.0_DP) - NMINS = INT(RSECS / 60.0) - RSECS = MOD(RSECS, 60.0_DP) - NSECS = INT(RSECS) - RSECS = MOD(RSECS, 1.0_DP) - MSECS = NINT(RSECS * 1000.0) - NRSECS = NSECS - IF (RSECS .GE. 0.5) NRSECS = NRSECS + 1 -! -! Write elapsed time to screen - IF (NDAYS .GT. 0) THEN - WRITE (line, 1010) NDAYS, NHOURS, NMINS, NRSECS -1010 FORMAT(1X, 'Elapsed run time: ', I3, ' Days, ', I2, ' Hours, ', I2, & - ' Minutes, ', I2, ' Seconds') - ELSEIF (NHOURS .GT. 0) THEN - WRITE (line, 1020) NHOURS, NMINS, NRSECS -1020 FORMAT(1X, 'Elapsed run time: ', I2, ' Hours, ', I2, & - ' Minutes, ', I2, ' Seconds') - ELSEIF (NMINS .GT. 0) THEN - WRITE (line, 1030) NMINS, NSECS, MSECS -1030 FORMAT(1X, 'Elapsed run time: ', I2, ' Minutes, ', & - I2, '.', I3.3, ' Seconds') - ELSE - WRITE (line, 1040) NSECS, MSECS -1040 FORMAT(1X, 'Elapsed run time: ', I2, '.', I3.3, ' Seconds') - END IF + end if + ! + ! -- Calculate elapsed time in days and seconds + ndays = 0 + leap = 0 + if (mod(IEDT(1), 4) == 0) leap = 1 + ibd = ibdt(3) !< Begin Day + ied = IEDT(3) !< End Day + ! + ! -- Find days + if (ibdt(2) /= IEDT(2)) then + ! -- Months differ + mb = ibdt(2) !< Begin month + me = IEDT(2) !< End month + nm = me - mb + 1 !< Number of months to look at + if (mb > me) nm = nm + 12 + mc = mb - 1 + do m = 1, nm + mc = mc + 1 !< mc is current month + if (mc == 13) mc = 1 + if (mc == mb) then + ndays = ndays + IDPM(mc) - ibd + if (mc == 2) ndays = ndays + leap + elseif (mc == me) then + ndays = ndays + ied + else + ndays = ndays + IDPM(mc) + if (mc == 2) ndays = ndays + leap + end if + end do + elseif (ibd < ied) then + ! -- Start and end in same month, only account for days + ndays = ied - ibd + end if + elsec = ndays * NSPD + ! + ! -- Add or subtract seconds + elsec = elsec + (IEDT(5) - ibdt(5)) * 3600.0 + elsec = elsec + (IEDT(6) - ibdt(6)) * 60.0 + elsec = elsec + (IEDT(7) - ibdt(7)) + elsec = elsec + (IEDT(8) - ibdt(8)) * 0.001 + ! + ! -- Convert seconds to days, hours, minutes, and seconds + ndays = int(elsec / nspd) + rsecs = mod(elsec, DSECPERDY) + nhours = int(rsecs / 3600.0) + rsecs = mod(rsecs, DSECPERHR) + nmins = int(rsecs / 60.0) + rsecs = mod(rsecs, DSIXTY) + nsecs = int(rsecs) + rsecs = mod(rsecs, DONE) + msecs = nint(rsecs * 1000.0) + nrsecs = nsecs + if (rsecs > 0.5) nrsecs = nrsecs + 1 + ! + ! -- Write elapsed time to screen + if (ndays > 0) then + write (line, fmttma) ndays, nhours, nmins, nrsecs + elseif (nhours > 0) then + write (line, fmttmb) nhours, nmins, nrsecs + elseif (nmins > 0) then + write (line, fmttmc) nmins, nsecs, msecs + else + write (line, fmttmd) nsecs, msecs + end if call write_message(line, skipafter=1) -! -! Write times to file if requested - IF (IPRTIM .GT. 0) THEN - IF (NDAYS .GT. 0) THEN - WRITE (IOUT, 1010) NDAYS, NHOURS, NMINS, NRSECS - ELSEIF (NHOURS .GT. 0) THEN - WRITE (IOUT, 1020) NHOURS, NMINS, NRSECS - ELSEIF (NMINS .GT. 0) THEN - WRITE (IOUT, 1030) NMINS, NSECS, MSECS + ! + ! -- Write times to file if requested + if (iprtim > 0) then + IF (NDAYS > 0) THEN + WRITE (IOUT, fmttma) NDAYS, NHOURS, NMINS, NRSECS + ELSEIF (NHOURS > 0) THEN + WRITE (IOUT, fmttmb) NHOURS, NMINS, NRSECS + ELSEIF (NMINS > 0) THEN + WRITE (IOUT, fmttmc) NMINS, NSECS, MSECS ELSE - WRITE (IOUT, 1040) NSECS, MSECS + WRITE (IOUT, fmttmd) NSECS, MSECS END IF END IF -! - RETURN - END SUBROUTINE elapsed_time + ! + ! -- Return + return + end subroutine elapsed_time -! -!-------TIMER FOR SUBROUTINES - SUBROUTINE code_timer(it, t1, ts) -! ****************************************************************************** -! Get end time and calculate elapsed time -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ + !> @brief Get end time and calculate elapsed time + !! + !! Timer for subroutines + !< + subroutine code_timer(it, t1, ts) ! -- dummy - INTEGER(I4B), INTENT(IN) :: it - REAL(DP), INTENT(INOUT) :: t1 - REAL(DP), INTENT(INOUT) :: ts + integer(I4B), intent(in) :: it + real(DP), intent(inout) :: t1 + real(DP), intent(inout) :: ts ! -- local - REAL(DP) :: dt -! ------------------------------------------------------------------------------ + real(DP) :: dt ! - IF (IT == 0) THEN + if (it == 0) then call CPU_TIME(t1) - ELSE + else call CPU_TIME(dt) ts = ts + dt - t1 - END IF + end if ! - ! -- RETURN - RETURN - END SUBROUTINE code_timer + ! -- Return + return + end subroutine code_timer end module TimerModule From b0f1919a31f1848edce7c0c08529e13ead5541dd Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Fri, 9 Feb 2024 08:23:19 -0800 Subject: [PATCH 005/199] chore(ListReader.f90): cleanup docstrings in ListReader utility (#1592) --- src/Utilities/ListReader.f90 | 217 +++++++++++++++-------------------- 1 file changed, 94 insertions(+), 123 deletions(-) diff --git a/src/Utilities/ListReader.f90 b/src/Utilities/ListReader.f90 index db38583f1b5..99c39aaf077 100644 --- a/src/Utilities/ListReader.f90 +++ b/src/Utilities/ListReader.f90 @@ -1,4 +1,5 @@ -! -- Generic List Reader Module +!> @brief Generic List Reader Module +!< module ListReaderModule use KindModule, only: DP, I4B @@ -14,37 +15,39 @@ module ListReaderModule public ListReaderType type :: ListReaderType - integer(I4B) :: in = 0 ! unit number of file containing control record - integer(I4B) :: inlist = 0 ! unit number of file from which list will be read - integer(I4B) :: iout = 0 ! unit number to output messages - integer(I4B) :: inamedbound = 0 ! flag indicating boundary names are to be read - integer(I4B) :: ierr = 0 ! error flag - integer(I4B) :: nlist = 0 ! number of entries in list. -1 indicates number will be automatically determined - integer(I4B) :: ibinary = 0 ! flag indicating to read binary list - integer(I4B) :: istart = 0 ! string starting location - integer(I4B) :: istop = 0 ! string ending location - integer(I4B) :: lloc = 0 ! entry number in line - integer(I4B) :: iclose = 0 ! flag indicating whether or not to close file - integer(I4B) :: ndim = 0 ! number of dimensions in model - integer(I4B) :: ntxtrlist = 0 ! number of text entries found in rlist - integer(I4B) :: ntxtauxvar = 0 ! number of text entries found in auxvar - character(len=LENLISTLABEL) :: label = '' ! label for printing list - character(len=:), allocatable, private :: line ! current line - integer(I4B), dimension(:), pointer, contiguous :: mshape => null() ! pointer to model shape - integer(I4B), dimension(:), pointer, contiguous :: nodelist => null() ! pointer to nodelist - real(DP), dimension(:, :), pointer, contiguous :: rlist => null() ! pointer to rlist - real(DP), dimension(:, :), pointer, contiguous :: auxvar => null() ! pointer to auxvar - character(len=16), dimension(:), pointer :: auxname => null() ! pointer to aux names + integer(I4B) :: in = 0 !< unit number of file containing control record + integer(I4B) :: inlist = 0 !< unit number of file from which list will be read + integer(I4B) :: iout = 0 !< unit number to output messages + integer(I4B) :: inamedbound = 0 !< flag indicating boundary names are to be read + integer(I4B) :: ierr = 0 !< error flag + integer(I4B) :: nlist = 0 !< number of entries in list. -1 indicates number will be automatically determined + integer(I4B) :: ibinary = 0 !< flag indicating to read binary list + integer(I4B) :: istart = 0 !< string starting location + integer(I4B) :: istop = 0 !< string ending location + integer(I4B) :: lloc = 0 !< entry number in line + integer(I4B) :: iclose = 0 !< flag indicating whether or not to close file + integer(I4B) :: ndim = 0 !< number of dimensions in model + integer(I4B) :: ntxtrlist = 0 !< number of text entries found in rlist + integer(I4B) :: ntxtauxvar = 0 !< number of text entries found in auxvar + character(len=LENLISTLABEL) :: label = '' !< label for printing list + character(len=:), allocatable, private :: line !< current line + integer(I4B), dimension(:), pointer, contiguous :: mshape => null() !< pointer to model shape + integer(I4B), dimension(:), pointer, contiguous :: nodelist => null() !< pointer to nodelist + real(DP), dimension(:, :), pointer, contiguous :: rlist => null() !< pointer to rlist + real(DP), dimension(:, :), pointer, contiguous :: auxvar => null() !< pointer to auxvar + character(len=16), dimension(:), pointer :: auxname => null() !< pointer to aux names character(len=LENBOUNDNAME), dimension(:), pointer, & - contiguous :: boundname => null() ! pointer to boundname - integer(I4B), dimension(:), allocatable :: idxtxtrow ! row locations of text in rlist - integer(I4B), dimension(:), allocatable :: idxtxtcol ! col locations of text in rlist - integer(I4B), dimension(:), allocatable :: idxtxtauxrow ! row locations of text in auxvar - integer(I4B), dimension(:), allocatable :: idxtxtauxcol ! col locations of text in auxvar - character(len=LENTIMESERIESNAME), dimension(:), allocatable :: txtrlist ! text found in rlist - character(len=LENTIMESERIESNAME), dimension(:), allocatable :: txtauxvar ! text found in auxvar + contiguous :: boundname => null() !< pointer to boundname + integer(I4B), dimension(:), allocatable :: idxtxtrow !< row locations of text in rlist + integer(I4B), dimension(:), allocatable :: idxtxtcol !< col locations of text in rlist + integer(I4B), dimension(:), allocatable :: idxtxtauxrow !< row locations of text in auxvar + integer(I4B), dimension(:), allocatable :: idxtxtauxcol !< col locations of text in auxvar + character(len=LENTIMESERIESNAME), dimension(:), allocatable :: txtrlist !< text found in rlist + character(len=LENTIMESERIESNAME), dimension(:), allocatable :: txtauxvar !< text found in auxvar type(LongLineReaderType), pointer :: line_reader => null() + contains + procedure :: read_list procedure :: write_list procedure, private :: read_control_record @@ -56,15 +59,11 @@ module ListReaderModule contains + !> @brief Initialize the reader + !< subroutine read_list(this, line_reader, in, iout, nlist, inamedbound, & mshape, nodelist, rlist, auxvar, auxname, boundname, & label) -! ****************************************************************************** -! init -- Initialize the reader -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ ! -- modules use ConstantsModule, only: LENBOUNDNAME ! -- dummy @@ -82,8 +81,6 @@ subroutine read_list(this, line_reader, in, iout, nlist, inamedbound, & character(len=LENBOUNDNAME), & dimension(:), pointer, contiguous, intent(inout) :: boundname character(len=LENLISTLABEL), intent(in) :: label - ! -- local -! ------------------------------------------------------------------------------ ! ! -- Copy variables this%in = in @@ -119,17 +116,13 @@ subroutine read_list(this, line_reader, in, iout, nlist, inamedbound, & ! -- Set nlist for return nlist = this%nlist ! - ! -- return + ! -- Return return end subroutine read_list + !> @brief Check for a control record, and parse if found + !< subroutine read_control_record(this) -! ****************************************************************************** -! read_control_record -- Check for a control record, and parse if found -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ ! -- modules use InputOutputModule, only: urword ! -- dummy @@ -140,7 +133,6 @@ subroutine read_control_record(this) ! -- formats character(len=*), parameter :: fmtlsf = & "(1X,'LIST SCALING FACTOR=',1PG12.5)" -! ------------------------------------------------------------------------------ ! ! -- Set default values, which may be changed by control record this%inlist = this%in @@ -159,19 +151,15 @@ subroutine read_control_record(this) call this%set_openclose() end select ! - ! -- return + ! -- Return return end subroutine read_control_record + !> @brief Set up for open/close file + !! + !! OPEN/CLOSE fname [(BINARY)] + !< subroutine set_openclose(this) -! ****************************************************************************** -! set_openclose -- set up for open/close file -! -! OPEN/CLOSE fname [(BINARY)] -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ ! -- modules use InputOutputModule, only: urword, openfile use OpenSpecModule, only: form, access @@ -195,14 +183,13 @@ subroutine set_openclose(this) &"(1x,'TO READ ', I0, ' RECORDS.')" character(len=*), parameter :: fmtof = & &"(1X,/1X,'OPENING FILE ON UNIT ',I0,':',/1X,A)" -! ------------------------------------------------------------------------------ ! - ! -- get filename + ! -- Get filename call urword(this%line, this%lloc, this%istart, this%istop, 0, idum, r, & this%iout, this%in) fname = this%line(this%istart:this%istop) ! - ! -- check to see if file OPEN/CLOSE file exists + ! -- Check to see if file OPEN/CLOSE file exists inquire (file=fname, exist=exists) if (.not. exists) then write (errmsg, fmtocne) this%line(this%istart:this%istop) @@ -247,23 +234,15 @@ subroutine set_openclose(this) call this%line_reader%rdcom(this%inlist, this%iout, this%line, & this%ierr) ! - ! -- return + ! -- Return return end subroutine set_openclose + !> @brief Read the data + !< subroutine read_data(this) -! ****************************************************************************** -! read_data -- read the data -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ - ! -- modules ! -- dummy class(ListReaderType) :: this - ! -- local - ! -- formats -! ------------------------------------------------------------------------------ ! ! -- Read the list if (this%ibinary == 1) then @@ -272,21 +251,18 @@ subroutine read_data(this) call this%read_ascii() end if ! - ! -- if open/close, then close file + ! -- If open/close, then close file if (this%iclose == 1) then close (this%inlist) end if - ! -- return + ! + ! -- Return return end subroutine read_data + !> @brief Read the data from a binary file + !< subroutine read_binary(this) -! ****************************************************************************** -! read_binary -- read the data from a binary file -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ ! -- modules use ConstantsModule, only: LINELENGTH, LENBIGLINE ! -- dummy @@ -305,9 +281,8 @@ subroutine read_binary(this) character(len=*), parameter :: fmtlsterronly = & "('ERROR READING LIST FROM FILE: ',& &1x,a,1x,' ON UNIT: ',I0)" -! ------------------------------------------------------------------------------ ! - ! -- determine array sizes + ! -- Determine array sizes mxlist = size(this%rlist, 2) ldim = size(this%rlist, 1) naux = size(this%auxvar, 1) @@ -318,7 +293,7 @@ subroutine read_binary(this) ii = 1 readloop: do ! - ! -- read layer, row, col, or cell number + ! -- Read layer, row, col, or cell number read (this%inlist, iostat=this%ierr) cellid ! ! -- If not end of record, then store nodenumber, else @@ -326,7 +301,7 @@ subroutine read_binary(this) select case (this%ierr) case (0) ! - ! -- ensure cellid is valid, store an error otherwise + ! -- Ensure cellid is valid, store an error otherwise call check_cellid(ii, cellid, this%mshape, this%ndim) ! ! -- Check range @@ -347,7 +322,7 @@ subroutine read_binary(this) this%mshape(1), this%mshape(2), this%mshape(3)) end if this%nodelist(ii) = nod - + ! ! -- Read remainder of record read (this%inlist, iostat=this%ierr) (this%rlist(jj, ii), jj=1, ldim), & (this%auxvar(jj, ii), jj=1, naux) @@ -377,7 +352,7 @@ subroutine read_binary(this) if (ii == this%nlist) exit readloop end if ! - ! -- increment ii + ! -- Increment ii ii = ii + 1 ! end do readloop @@ -387,17 +362,13 @@ subroutine read_binary(this) call store_error_unit(this%inlist) end if ! - ! -- return + ! -- Return return end subroutine read_binary + !> @brief Read the data from an ascii file + !< subroutine read_ascii(this) -! ****************************************************************************** -! read_ascii -- read the data from an ascii file -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ ! -- modules use ConstantsModule, only: LENBOUNDNAME, LINELENGTH, DZERO use InputOutputModule, only: urword @@ -417,9 +388,8 @@ subroutine read_ascii(this) &the maximum number of records. Number of records found is ',I0,& &' but MAXBOUND is ', I0, '. Try increasing MAXBOUND for this list. & &Error occurred reading the following line: ', a, 5x, '>>> ', a)" -! ------------------------------------------------------------------------------ ! - ! -- determine array sizes + ! -- Determine array sizes mxlist = size(this%rlist, 2) ldim = size(this%rlist, 1) naux = size(this%auxvar, 1) @@ -443,8 +413,8 @@ subroutine read_ascii(this) call urword(this%line, this%lloc, this%istart, this%istop, 1, idum, r, & this%iout, this%inlist) if (this%line(this%istart:this%istop) == 'END' .or. this%ierr < 0) then - ! If END was found then call line_reader backspace - ! emulator so that caller can proceed with reading END. + ! -- If END was found then call line_reader backspace + ! emulator so that caller can proceed with reading END. if (this%ierr == 0) then call this%line_reader%bkspc(this%inlist) end if @@ -477,7 +447,7 @@ subroutine read_ascii(this) cellid(3), r, this%iout, this%inlist) end if ! - ! -- ensure cellid is valid, store an error otherwise + ! -- Ensure cellid is valid, store an error otherwise call check_cellid(ii, cellid, this%mshape, this%ndim) ! ! -- Calculate user node number @@ -567,7 +537,7 @@ subroutine read_ascii(this) if (ii == this%nlist) exit readloop end if ! - ! -- increment ii row counter + ! -- Increment ii row counter ii = ii + 1 ! end do readloop @@ -577,18 +547,21 @@ subroutine read_ascii(this) call store_error_unit(this%inlist) end if ! - ! -- return + ! -- Return return end subroutine read_ascii - !> @ brief Check for valid cellid + !> @brief Check for valid cellid !< subroutine check_cellid(ii, cellid, mshape, ndim) + ! -- dummy integer(I4B), intent(in) :: ii integer(I4B), dimension(:), intent(in) :: cellid !< cellid integer(I4B), dimension(:), intent(in) :: mshape !< model shape integer(I4B), intent(in) :: ndim !< size of mshape + ! -- local character(len=20) :: cellstr, mshstr + ! -- formats character(len=*), parameter :: fmterr = & "('List entry ',i0,' contains cellid ',a,' but this cellid is invalid & &for model with shape ', a)" @@ -598,6 +571,7 @@ subroutine check_cellid(ii, cellid, mshape, ndim) "('(',i0,',',i0,')')" character(len=*), parameter :: fmtndim3 = & "('(',i0,',',i0,',',i0,')')" + ! if (ndim == 1) then if (cellid(1) < 1 .or. cellid(1) > mshape(1)) then write (cellstr, fmtndim1) cellid(1) @@ -623,16 +597,14 @@ subroutine check_cellid(ii, cellid, mshape, ndim) call store_error(errmsg) end if end if + ! + ! -- Return return end subroutine check_cellid + !> @brief Write input data to a list + !< subroutine write_list(this) -! ****************************************************************************** -! write_list -- Write input data to a list -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ ! -- modules use ConstantsModule, only: LINELENGTH, LENBOUNDNAME, & TABLEFT, TABCENTER @@ -653,16 +625,15 @@ subroutine write_list(this) type(TableType), pointer :: inputtab => null() ! -- formats character(len=LINELENGTH) :: fmtlstbn -! ------------------------------------------------------------------------------ ! ! -- Determine sizes ldim = size(this%rlist, 1) naux = size(this%auxvar, 1) ! - ! -- dimension table + ! -- Dimension table ntabrows = this%nlist ! - ! -- start building format statement to parse this%label, which + ! -- Start building format statement to parse this%label, which ! contains the column headers (except for boundname and auxnames) ipos = index(this%label, 'NO.') if (ipos /= 0) then @@ -671,17 +642,17 @@ subroutine write_list(this) else fmtlstbn = '(a7' end if - ! -- sequence number, layer, row, and column. + ! -- Sequence number, layer, row, and column. if (size(this%mshape) == 3) then ntabcols = 4 fmtlstbn = trim(fmtlstbn)//',a7,a7,a7' ! - ! -- sequence number, layer, and cell2d. + ! -- Sequence number, layer, and cell2d. else if (size(this%mshape) == 2) then ntabcols = 3 fmtlstbn = trim(fmtlstbn)//',a7,a7' ! - ! -- sequence number and node. + ! -- Sequence number and node. else ntabcols = 2 fmtlstbn = trim(fmtlstbn)//',a7' @@ -706,40 +677,40 @@ subroutine write_list(this) end do fmtlstbn = trim(fmtlstbn)//')' ! - ! -- allocate words + ! -- Allocate words allocate (words(ntabcols)) ! - ! -- parse this%label into words + ! -- Parse this%label into words read (this%label, fmtlstbn) (words(i), i=1, ntabcols) ! - ! -- initialize the input table object + ! -- Initialize the input table object call table_cr(inputtab, ' ', ' ') call inputtab%table_df(ntabrows, ntabcols, this%iout) ! - ! -- add the columns + ! -- Add the columns ipos = 1 call inputtab%initialize_column(words(ipos), 10, alignment=TABCENTER) ! - ! -- discretization + ! -- Discretization do i = 1, size(this%mshape) ipos = ipos + 1 call inputtab%initialize_column(words(ipos), 7, alignment=TABCENTER) end do ! - ! -- non-optional variables + ! -- Non-optional variables do i = 1, ldim ipos = ipos + 1 call inputtab%initialize_column(words(ipos), 16, alignment=TABCENTER) end do ! - ! -- boundname + ! -- Boundname if (this%inamedbound == 1) then ipos = ipos + 1 tag = 'BOUNDNAME' call inputtab%initialize_column(tag, LENBOUNDNAME, alignment=TABLEFT) end if ! - ! -- aux variables + ! -- Aux variables do i = 1, naux call inputtab%initialize_column(this%auxname(i), 16, alignment=TABCENTER) end do @@ -748,7 +719,7 @@ subroutine write_list(this) do ii = 1, this%nlist call inputtab%add_term(ii) ! - ! -- discretization + ! -- Discretization if (size(this%mshape) == 3) then nod = this%nodelist(ii) call get_ijk(nod, this%mshape(2), this%mshape(3), this%mshape(1), & @@ -766,29 +737,29 @@ subroutine write_list(this) call inputtab%add_term(nod) end if ! - ! -- non-optional variables + ! -- Non-optional variables do jj = 1, ldim call inputtab%add_term(this%rlist(jj, ii)) end do ! - ! -- boundname + ! -- Boundname if (this%inamedbound == 1) then call inputtab%add_term(this%boundname(ii)) end if ! - ! -- aux variables + ! -- Aux variables do jj = 1, naux call inputtab%add_term(this%auxvar(jj, ii)) end do end do ! - ! -- deallocate the local variables + ! -- Deallocate the local variables call inputtab%table_da() deallocate (inputtab) nullify (inputtab) deallocate (words) ! - ! -- return + ! -- Return return end subroutine write_list From ffd82945ac63bcc16255120c20c24fa0a5682d9d Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Fri, 9 Feb 2024 11:03:20 -0600 Subject: [PATCH 006/199] fix(mvr): improve water mover performance (#1605) --- doc/ReleaseNotes/ReleaseNotes.tex | 1 + doc/ReleaseNotes/appendixA.tex | 1 + doc/ReleaseNotes/develop.tex | 68 +++++++++++++------------- doc/ReleaseNotes/previous/v6.4.3.tex | 65 ++++++++++++++++++++++++ src/Model/GroundWaterFlow/gwf3mvr8.f90 | 64 +++++++++++++++++++----- 5 files changed, 152 insertions(+), 47 deletions(-) create mode 100644 doc/ReleaseNotes/previous/v6.4.3.tex diff --git a/doc/ReleaseNotes/ReleaseNotes.tex b/doc/ReleaseNotes/ReleaseNotes.tex index 0ea54536e6c..6d41dd8ad47 100644 --- a/doc/ReleaseNotes/ReleaseNotes.tex +++ b/doc/ReleaseNotes/ReleaseNotes.tex @@ -177,6 +177,7 @@ \section{Release History} 6.4.1 & December 9, 2022 & \url{https://doi.org/10.5066/P9FL1JCC} \\ 6.4.2 & June 28, 2023 & \url{https://doi.org/10.5066/P9FL1JCC} \\ 6.4.3 & February 7, 2024 & \url{https://doi.org/10.5066/P9FL1JCC} \\ +6.x.x & Xxx x, 202x & \url{https://doi.org/10.5066/P9FL1JCC} \\ \hline \label{tab:releases} \end{tabular*} diff --git a/doc/ReleaseNotes/appendixA.tex b/doc/ReleaseNotes/appendixA.tex index 199d7151043..bcc041cb842 100644 --- a/doc/ReleaseNotes/appendixA.tex +++ b/doc/ReleaseNotes/appendixA.tex @@ -1,5 +1,6 @@ This appendix describes changes introduced into MODFLOW~6 in previous releases. These changes may substantially affect users. + \input{./previous/v6.4.3.tex} \input{./previous/v6.4.2.tex} \input{./previous/v6.4.1.tex} \input{./previous/v6.4.0.tex} diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index 05253619fd4..f4813a50b54 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -2,50 +2,47 @@ % after a release has just been made. \item \currentmodflowversion - - \underline{NEW FUNCTIONALITY} - \begin{itemize} - \item The Input Data Processor (IDP), first released in version 6.4.2, is a general utility for reading user-provided input files. Package-specific routines for reading input files continue to be replaced by the IDP approach. For packages that use IDP for input, logging information is written to the simulation list file (mfsim.lst). Additional information on the IDP and the list of supported packages is contained in the MODFLOW 6 Description of Input and Output (mf6io.pdf) under a section titled ``Processing of Program Input.'' - \item The source code was refactored to support compilation of a parallel version of MODFLOW 6 based on the Message Passing Interface (MPI) and the Portable, Extensible Toolkit for Scientific Computation (PETSc) libraries. The parallel version of MODFLOW is considered preliminary. Limited testing of the parallel version has been performed on laptops, desktops, and supercomputers, but significant changes are expected in future releases. User support for the parallel version of MODFLOW 6 may be provided in the future. + + %\underline{NEW FUNCTIONALITY} + %\begin{itemize} % \item xxx - \end{itemize} + % \item xxx + % \item xxx + %\end{itemize} - \underline{EXAMPLES} - \begin{itemize} - \item A new exampled called ex-gwf-rad-disu was added. This new example uses a DISU grid to represent radial groundwater flow to a pumping well. - \item A new exampled called ex-gwf-curv-90 was added. This new example demonstrates use of a DISV grid to represent a curvilinear spatial discretization. For this example, the curvilinear grid is applied to one quarter of a radial groundwater flow system. - \item A new exampled called ex-gwf-curvilin was added. This new example uses a curvilinear grid, represented with the DISV Package, to simulate groundwater flow through a multi-region aquifer with bends in the domain boundaries. - \end{itemize} + %\underline{EXAMPLES} + %\begin{itemize} + % \item xxx + % \item xxx + % \item xxx + %\end{itemize} - \textbf{\underline{BUG FIXES AND OTHER CHANGES TO EXISTING FUNCTIONALITY}} \\ - \underline{BASIC FUNCTIONALITY} - \begin{itemize} - \item Improve error message if the size of data read from a binary array file is inconsistent with READARRAY control line and variable description keywords. - \item The area calculation for cells in the DISV package was inaccurate for some cases with very large cell vertex coordinates. The area calculation was improved by using transformed cell vertex coordinates prior to making the area calculation. - \item Auxiliary variables in RCH and EVT Array-Based input packages are now reset to zero when otherwise not specified in period input data and the auxiliary parameter is not controlled by a time-series. + %\textbf{\underline{BUG FIXES AND OTHER CHANGES TO EXISTING FUNCTIONALITY}} \\ + %\underline{BASIC FUNCTIONALITY} + %\begin{itemize} % \item xxx % \item xxx - \end{itemize} + % \item xxx + %\end{itemize} - \underline{INTERNAL FLOW PACKAGES} - \begin{itemize} - \item The data header in the binary output file written by the viscosity (VSC) package was printing `` VISCOSI'' instead of `` VISCOSITY''. The viscosity package now prints the full `` VISCOSITY'' header in the binary output file. - \item The CSUB Package did not support output of z-displacement arrays for models using the DISU package. The CSUB package was updated to support calculation of z-displacement arrays for DISU model grids. + %\underline{INTERNAL FLOW PACKAGES} + %\begin{itemize} % \item xxx - \end{itemize} + % \item xxx + % \item xxx + %\end{itemize} - \underline{STRESS PACKAGES} - \begin{itemize} - \item This release contains a fix for a longstanding issue related to the use of AUXMULTNAME and time series. Previous release notes included the following description of a known issue: \textit{``The AUXMULTNAME option can be used to scale input values, such as riverbed conductance, using values in an auxiliary column. When this AUXMULTNAME option is used, the multiplier value in the AUXMULTNAME column should not be represented with a time series unless the value to scale is also represented with a time series.''} With this release, the Input Data Processor (IDP) is now used to read stress package input files, and the limitation with AUXMULTNAME and time series no longer applies. + %\underline{STRESS PACKAGES} + %\begin{itemize} % \item xxx % \item xxx - \end{itemize} + % \item xxx + %\end{itemize} \underline{ADVANCED STRESS PACKAGES} \begin{itemize} - \item Added functionality to support zero values for each grid dimension when specifying the CELLID for SFR reaches that are not connected to an underlying groundwater grid cell. For example, for a DIS grid a CELLID of 0 0 0 should be specified for reaches with no connection to a groundwater cell. Warning messages will be issued if NONE is specified for the CELLID of an unconnected reach. Specifying a CELLID of NONE will eventually be deprecated and will cause MODFLOW 6 to terminate with an error. - \item Added functionality to support specification of a DNODATA (3.0E+30) BEDLEAK value for LAK package connections. This DNODATA value is used to identify lake-GWF connections where conductance is solely a function of aquifer properties in the connected GWF cell. In this case, the lakebed sediments are assumed to be absent and all resistance to flow is assumed to be within the GWF cell. Warning messages are now issued if NONE is specified for LAK package connections. Specifying a BEDLEAK value equal to NONE will eventually be deprecated and will cause MODFLOW 6 to terminate with an error. - \item SFR diversion would not be updated if the outflow of its upstream reach is zero. If diversion was not zero in the previous stress period, it would report mass balance error in the SFR budget. This bug was fixed by always updating the diversion. + \item Refactoring of the Water Mover package in version 6.4.3 introduced a reduction in performance for GWF models with a large number of movers. The program was corrected so that performance is similar to previous versions. + % \item xxx % \item xxx \end{itemize} @@ -56,9 +53,10 @@ % \item xxx %\end{itemize} - \underline{EXCHANGES} - \begin{itemize} - \item A model budget error would occur when a constant-head (CHD) cell in one model had a direct connection to an active cell in another model. For the model budget to be calculated correctly a new term called ``FLOW-JA-FACE-CHD'' was added to the GWF model budget. This term is only included in the budget table when the GWF Model is connected to another GWF Model using a GWF-GWF Exchange. Additionally, the CHD budget calculation for a very specific (and rare) configuration was also incorrect. The incorrect budget calculation occurred when the following conditions were met: (1) a GWF model was connected to another GWF model with a GWF-GWF Exchange; (2) the model as well as the Exchange had the XT3D option enabled, and (3) the model was configured with a CHD cell that is either an Exchange cell, i.e. a cell that is part of the EXCHANGEDATA block, or a cell directly connected to such an Exchange cell. The size of the error depends on the degree of anisotropy around the particular CHD cell and shows up as a discrepancy in the volume budget table reported in the GWF list file. The program has been updated with the correct budget calculation. + %\underline{EXCHANGES} + %\begin{itemize} % \item xxx % \item xxx - \end{itemize} + % \item xxx + %\end{itemize} + diff --git a/doc/ReleaseNotes/previous/v6.4.3.tex b/doc/ReleaseNotes/previous/v6.4.3.tex new file mode 100644 index 00000000000..3140ebd5b07 --- /dev/null +++ b/doc/ReleaseNotes/previous/v6.4.3.tex @@ -0,0 +1,65 @@ +% Use this template for starting initializing the release notes +% after a release has just been made. + + %\item \currentmodflowversion + \subsection{Version mf6.4.3--February 7, 2024} + + \underline{NEW FUNCTIONALITY} + \begin{itemize} + \item The Input Data Processor (IDP), first released in version 6.4.2, is a general utility for reading user-provided input files. Package-specific routines for reading input files continue to be replaced by the IDP approach. For packages that use IDP for input, logging information is written to the simulation list file (mfsim.lst). Additional information on the IDP and the list of supported packages is contained in the MODFLOW 6 Description of Input and Output (mf6io.pdf) under a section titled ``Processing of Program Input.'' + \item The source code was refactored to support compilation of a parallel version of MODFLOW 6 based on the Message Passing Interface (MPI) and the Portable, Extensible Toolkit for Scientific Computation (PETSc) libraries. The parallel version of MODFLOW is considered preliminary. Limited testing of the parallel version has been performed on laptops, desktops, and supercomputers, but significant changes are expected in future releases. User support for the parallel version of MODFLOW 6 may be provided in the future. + % \item xxx + \end{itemize} + + \underline{EXAMPLES} + \begin{itemize} + \item A new exampled called ex-gwf-rad-disu was added. This new example uses a DISU grid to represent radial groundwater flow to a pumping well. + \item A new exampled called ex-gwf-curv-90 was added. This new example demonstrates use of a DISV grid to represent a curvilinear spatial discretization. For this example, the curvilinear grid is applied to one quarter of a radial groundwater flow system. + \item A new exampled called ex-gwf-curvilin was added. This new example uses a curvilinear grid, represented with the DISV Package, to simulate groundwater flow through a multi-region aquifer with bends in the domain boundaries. + \end{itemize} + + \textbf{\underline{BUG FIXES AND OTHER CHANGES TO EXISTING FUNCTIONALITY}} \\ + \underline{BASIC FUNCTIONALITY} + \begin{itemize} + \item Improve error message if the size of data read from a binary array file is inconsistent with READARRAY control line and variable description keywords. + \item The area calculation for cells in the DISV package was inaccurate for some cases with very large cell vertex coordinates. The area calculation was improved by using transformed cell vertex coordinates prior to making the area calculation. + \item Auxiliary variables in RCH and EVT Array-Based input packages are now reset to zero when otherwise not specified in period input data and the auxiliary parameter is not controlled by a time-series. + % \item xxx + % \item xxx + \end{itemize} + + \underline{INTERNAL FLOW PACKAGES} + \begin{itemize} + \item The data header in the binary output file written by the viscosity (VSC) package was printing `` VISCOSI'' instead of `` VISCOSITY''. The viscosity package now prints the full `` VISCOSITY'' header in the binary output file. + \item The CSUB Package did not support output of z-displacement arrays for models using the DISU package. The CSUB package was updated to support calculation of z-displacement arrays for DISU model grids. + % \item xxx + \end{itemize} + + \underline{STRESS PACKAGES} + \begin{itemize} + \item This release contains a fix for a longstanding issue related to the use of AUXMULTNAME and time series. Previous release notes included the following description of a known issue: \textit{``The AUXMULTNAME option can be used to scale input values, such as riverbed conductance, using values in an auxiliary column. When this AUXMULTNAME option is used, the multiplier value in the AUXMULTNAME column should not be represented with a time series unless the value to scale is also represented with a time series.''} With this release, the Input Data Processor (IDP) is now used to read stress package input files, and the limitation with AUXMULTNAME and time series no longer applies. + % \item xxx + % \item xxx + \end{itemize} + + \underline{ADVANCED STRESS PACKAGES} + \begin{itemize} + \item Added functionality to support zero values for each grid dimension when specifying the CELLID for SFR reaches that are not connected to an underlying groundwater grid cell. For example, for a DIS grid a CELLID of 0 0 0 should be specified for reaches with no connection to a groundwater cell. Warning messages will be issued if NONE is specified for the CELLID of an unconnected reach. Specifying a CELLID of NONE will eventually be deprecated and will cause MODFLOW 6 to terminate with an error. + \item Added functionality to support specification of a DNODATA (3.0E+30) BEDLEAK value for LAK package connections. This DNODATA value is used to identify lake-GWF connections where conductance is solely a function of aquifer properties in the connected GWF cell. In this case, the lakebed sediments are assumed to be absent and all resistance to flow is assumed to be within the GWF cell. Warning messages are now issued if NONE is specified for LAK package connections. Specifying a BEDLEAK value equal to NONE will eventually be deprecated and will cause MODFLOW 6 to terminate with an error. + \item SFR diversion would not be updated if the outflow of its upstream reach is zero. If diversion was not zero in the previous stress period, it would report mass balance error in the SFR budget. This bug was fixed by always updating the diversion. + % \item xxx + \end{itemize} + + %\underline{SOLUTION} + %\begin{itemize} + % \item xxx + % \item xxx + % \item xxx + %\end{itemize} + + \underline{EXCHANGES} + \begin{itemize} + \item A model budget error would occur when a constant-head (CHD) cell in one model had a direct connection to an active cell in another model. For the model budget to be calculated correctly a new term called ``FLOW-JA-FACE-CHD'' was added to the GWF model budget. This term is only included in the budget table when the GWF Model is connected to another GWF Model using a GWF-GWF Exchange. Additionally, the CHD budget calculation for a very specific (and rare) configuration was also incorrect. The incorrect budget calculation occurred when the following conditions were met: (1) a GWF model was connected to another GWF model with a GWF-GWF Exchange; (2) the model as well as the Exchange had the XT3D option enabled, and (3) the model was configured with a CHD cell that is either an Exchange cell, i.e. a cell that is part of the EXCHANGEDATA block, or a cell directly connected to such an Exchange cell. The size of the error depends on the degree of anisotropy around the particular CHD cell and shows up as a discrepancy in the volume budget table reported in the GWF list file. The program has been updated with the correct budget calculation. + % \item xxx + % \item xxx + \end{itemize} diff --git a/src/Model/GroundWaterFlow/gwf3mvr8.f90 b/src/Model/GroundWaterFlow/gwf3mvr8.f90 index 5488b31e0e9..cf536f3c4e1 100644 --- a/src/Model/GroundWaterFlow/gwf3mvr8.f90 +++ b/src/Model/GroundWaterFlow/gwf3mvr8.f90 @@ -102,7 +102,7 @@ ! if(this%inmvr > 0) call this%mvr%mvr_ot() ! module GwfMvrModule - use KindModule, only: DP, I4B + use KindModule, only: DP, I4B, LGP use ConstantsModule, only: LENMEMPATH, LENPACKAGENAME, LENMODELNAME, & LENBUDTXT, LENAUXNAME, LENPAKLOC, & DZERO, DNODATA, MAXCHARLEN, TABCENTER, & @@ -123,6 +123,7 @@ module GwfMvrModule public :: GwfMvrType, mvr_cr type, extends(NumericalPackageType) :: GwfMvrType + logical(LGP), pointer :: reset_mapped_id ! flag to indicate mapped ids must be reset; true when movers change integer(I4B), pointer :: ibudgetout => null() !< binary budget output file integer(I4B), pointer :: ibudcsv => null() !< unit number for csv budget output file integer(I4B), pointer :: maxmvr => null() !< max number of movers to be specified @@ -172,6 +173,7 @@ module GwfMvrModule procedure, private :: mvr_setup_budobj procedure, private :: mvr_setup_outputtab procedure, private :: mvr_print_outputtab + procedure, private :: set_mapped_id end type GwfMvrType @@ -337,6 +339,7 @@ subroutine mvr_rp(this) write (this%iout, '(/,2x,a,i0)') 'READING WATER MOVERS FOR PERIOD ', kper nlist = -1 i = 1 + this%reset_mapped_id = .true. ! ! -- set mname to '' if this is an exchange mover, or to the model name if (this%iexgmvr == 0) then @@ -492,19 +495,16 @@ subroutine mvr_bd(this) ! -- dummy class(GwfMvrType) :: this ! -- locals - integer(I4B) :: i, mapped_id - class(PackageMoverType), pointer :: pkg_mvr ! -- formats -! ------------------------------------------------------------------------------ ! - ! -- set the feature maps - allocate (pkg_mvr) - do i = 1, this%nmvr - call set_packagemover_pointer(pkg_mvr, this%mvr(i)%mem_path_src) - mapped_id = pkg_mvr%iprmap(this%mvr(i)%iRchNrSrc) - this%mvr(i)%iRchNrSrcMapped = mapped_id - end do - deallocate (pkg_mvr) + ! -- set the feature maps; for performance reasons, + ! this should only be called for the first time + ! step of a stress period in which a new set of + ! movers was provided in a period block. + if (this%reset_mapped_id) then + call this%set_mapped_id() + this%reset_mapped_id = .false. + end if ! ! -- fill the budget object call this%fill_budobj() @@ -699,6 +699,7 @@ subroutine mvr_da(this) end if ! ! -- Scalars + call mem_deallocate(this%reset_mapped_id) call mem_deallocate(this%ibudgetout) call mem_deallocate(this%ibudcsv) call mem_deallocate(this%maxmvr) @@ -1045,6 +1046,7 @@ subroutine allocate_scalars(this) call this%NumericalPackageType%allocate_scalars() ! ! -- Allocate + call mem_allocate(this%reset_mapped_id, 'RESET_MAPPED_ID', this%memoryPath) call mem_allocate(this%ibudgetout, 'IBUDGETOUT', this%memoryPath) call mem_allocate(this%ibudcsv, 'IBUDCSV', this%memoryPath) call mem_allocate(this%maxmvr, 'MAXMVR', this%memoryPath) @@ -1055,6 +1057,7 @@ subroutine allocate_scalars(this) call mem_allocate(this%imodelnames, 'IMODELNAMES', this%memoryPath) ! ! -- Initialize + this%reset_mapped_id = .false. this%ibudgetout = 0 this%ibudcsv = 0 this%maxmvr = -1 @@ -1345,4 +1348,41 @@ subroutine mvr_print_outputtab(this) return end subroutine mvr_print_outputtab + !> @brief Set mapped id + !! + !! For the budget output, we don't write outlet number, + !! instead we write the lake number. Normally the receiver + !! number is the same as the feature number provided by the + !! user. For moving water from a lake, the user specifies the + !! outlet number, not the lake number, in the mover package. + !! The iRchNrSrcMapped variable contains the lake number, not + !! the outlet number, and is written to the budget files. For + !! other packages, the iRchNrSrcMapped value is simply the well + !! number, the stream reach, or the uzf cell number. + !! This routine needs to be called each time a new set of movers + !! is read. It can't be called from within mvr_rp because the + !! iprmap isn't updated by lake until lak_rp, which is called + !! after mvr_rp. + !< + subroutine set_mapped_id(this) + ! -- dummy + class(GwfMvrType) :: this + ! -- locals + integer(I4B) :: i, mapped_id + class(PackageMoverType), pointer :: pkg_mvr + ! -- formats + ! + ! -- set the feature maps + allocate (pkg_mvr) + do i = 1, this%nmvr + call set_packagemover_pointer(pkg_mvr, this%mvr(i)%mem_path_src) + mapped_id = pkg_mvr%iprmap(this%mvr(i)%iRchNrSrc) + this%mvr(i)%iRchNrSrcMapped = mapped_id + end do + deallocate (pkg_mvr) + ! + ! -- Return + return + end subroutine set_mapped_id + end module From 7f37518b139d308d9b97a4e2245f97eefd9f29d1 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Fri, 9 Feb 2024 12:55:46 -0600 Subject: [PATCH 007/199] docs(mf6io): correct description of CDIST in gwfgwf/gwtgwt (#1606) * docs(mf6io): correct description of CDIST in gwfgwf/gwtgwt * correct deprecation warnings to use proper version number --- doc/mf6io/mf6ivar/dfn/exg-gwfgwf.dfn | 3 ++- doc/mf6io/mf6ivar/dfn/exg-gwtgwt.dfn | 2 +- doc/mf6io/mf6ivar/md/mf6ivar.md | 4 ++-- doc/mf6io/mf6ivar/tex/exg-gwfgwf-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/exg-gwtgwt-desc.tex | 2 +- src/Model/GroundWaterFlow/gwf3lak8.f90 | 2 +- src/Model/GroundWaterFlow/gwf3sfr8.f90 | 2 +- 7 files changed, 9 insertions(+), 8 deletions(-) diff --git a/doc/mf6io/mf6ivar/dfn/exg-gwfgwf.dfn b/doc/mf6io/mf6ivar/dfn/exg-gwfgwf.dfn index 2232bfbdf90..e27195cb393 100644 --- a/doc/mf6io/mf6ivar/dfn/exg-gwfgwf.dfn +++ b/doc/mf6io/mf6ivar/dfn/exg-gwfgwf.dfn @@ -8,7 +8,8 @@ shape (naux) reader urword optional true longname keyword to specify aux variables -description an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWF-GWF Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' is provided in the description of the DISU Package. If an auxiliary variable with the name ``CDIST'' is found, then this information will be used as the straight-line connection distance, including the vertical component, between the two cell centers. Both ANGLDEGX and CDIST are required if specific discharge is calculated for either of the groundwater models. +description an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWF-GWF Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' and when it is required is provided in the description of the DISU Package. If an auxiliary variable with the name ``CDIST'' is found, then this information will be used in the calculation of specific discharge within model cells connected by the exchange. For a horizontal connection, CDIST should be specified as the horizontal distance between the cell centers, and should not include the vertical component. For vertical connections, CDIST should be specified as the difference in elevation between the two cell centers. Both ANGLDEGX and CDIST are required if specific discharge is calculated for either of the groundwater models. + block options name boundnames diff --git a/doc/mf6io/mf6ivar/dfn/exg-gwtgwt.dfn b/doc/mf6io/mf6ivar/dfn/exg-gwtgwt.dfn index f5aeb241996..7d8b419ddd1 100644 --- a/doc/mf6io/mf6ivar/dfn/exg-gwtgwt.dfn +++ b/doc/mf6io/mf6ivar/dfn/exg-gwtgwt.dfn @@ -24,7 +24,7 @@ shape (naux) reader urword optional true longname keyword to specify aux variables -description an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWF-GWF Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' is provided in the description of the DISU Package. If an auxiliary variable with the name ``CDIST'' is found, then this information will be used as the straight-line connection distance, including the vertical component, between the two cell centers. Both ANGLDEGX and CDIST are required if specific discharge is calculated for either of the groundwater models. +description an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWT-GWT Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' is provided in the description of the DISU Package. ANGLDEGX must be specified if dispersion is simulated in the connected GWT models. block options name boundnames diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index a1a6b95f5ac..011c23b068b 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -29,7 +29,7 @@ | SIM | TDIS | PERIODDATA | PERLEN | DOUBLE PRECISION | is the length of a stress period. | | SIM | TDIS | PERIODDATA | NSTP | INTEGER | is the number of time steps in a stress period. | | SIM | TDIS | PERIODDATA | TSMULT | DOUBLE PRECISION | is the multiplier for the length of successive time steps. The length of a time step is calculated by multiplying the length of the previous time step by TSMULT. The length of the first time step, $\Delta t_1$, is related to PERLEN, NSTP, and TSMULT by the relation $\Delta t_1= perlen \frac{tsmult - 1}{tsmult^{nstp}-1}$. | -| EXG | GWFGWF | OPTIONS | AUXILIARY | STRING (NAUX) | an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWF-GWF Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' is provided in the description of the DISU Package. If an auxiliary variable with the name ``CDIST'' is found, then this information will be used as the straight-line connection distance, including the vertical component, between the two cell centers. Both ANGLDEGX and CDIST are required if specific discharge is calculated for either of the groundwater models. | +| EXG | GWFGWF | OPTIONS | AUXILIARY | STRING (NAUX) | an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWF-GWF Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' and when it is required is provided in the description of the DISU Package. If an auxiliary variable with the name ``CDIST'' is found, then this information will be used in the calculation of specific discharge within model cells connected by the exchange. For a horizontal connection, CDIST should be specified as the horizontal distance between the cell centers, and should not include the vertical component. For vertical connections, CDIST should be specified as the difference in elevation between the two cell centers. Both ANGLDEGX and CDIST are required if specific discharge is calculated for either of the groundwater models. | | EXG | GWFGWF | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of GWF Exchange cells. | | EXG | GWFGWF | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of exchange entries will be echoed to the listing file immediately after it is read. | | EXG | GWFGWF | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of exchange flow rates will be printed to the listing file for every stress period in which ``SAVE BUDGET'' is specified in Output Control. | @@ -58,7 +58,7 @@ | EXG | GWFGWF | EXCHANGEDATA | BOUNDNAME | STRING | name of the GWF Exchange cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | | EXG | GWTGWT | OPTIONS | GWFMODELNAME1 | STRING | keyword to specify name of first corresponding GWF Model. In the simulation name file, the GWT6-GWT6 entry contains names for GWT Models (exgmnamea and exgmnameb). The GWT Model with the name exgmnamea must correspond to the GWF Model with the name gwfmodelname1. | | EXG | GWTGWT | OPTIONS | GWFMODELNAME2 | STRING | keyword to specify name of second corresponding GWF Model. In the simulation name file, the GWT6-GWT6 entry contains names for GWT Models (exgmnamea and exgmnameb). The GWT Model with the name exgmnameb must correspond to the GWF Model with the name gwfmodelname2. | -| EXG | GWTGWT | OPTIONS | AUXILIARY | STRING (NAUX) | an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWF-GWF Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' is provided in the description of the DISU Package. If an auxiliary variable with the name ``CDIST'' is found, then this information will be used as the straight-line connection distance, including the vertical component, between the two cell centers. Both ANGLDEGX and CDIST are required if specific discharge is calculated for either of the groundwater models. | +| EXG | GWTGWT | OPTIONS | AUXILIARY | STRING (NAUX) | an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWT-GWT Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' is provided in the description of the DISU Package. ANGLDEGX must be specified if dispersion is simulated in the connected GWT models. | | EXG | GWTGWT | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of GWT Exchange cells. | | EXG | GWTGWT | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of exchange entries will be echoed to the listing file immediately after it is read. | | EXG | GWTGWT | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of exchange flow rates will be printed to the listing file for every stress period in which ``SAVE BUDGET'' is specified in Output Control. | diff --git a/doc/mf6io/mf6ivar/tex/exg-gwfgwf-desc.tex b/doc/mf6io/mf6ivar/tex/exg-gwfgwf-desc.tex index 65778b0847b..825d7a89e7a 100644 --- a/doc/mf6io/mf6ivar/tex/exg-gwfgwf-desc.tex +++ b/doc/mf6io/mf6ivar/tex/exg-gwfgwf-desc.tex @@ -3,7 +3,7 @@ \item \textbf{Block: OPTIONS} \begin{description} -\item \texttt{auxiliary}---an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWF-GWF Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' is provided in the description of the DISU Package. If an auxiliary variable with the name ``CDIST'' is found, then this information will be used as the straight-line connection distance, including the vertical component, between the two cell centers. Both ANGLDEGX and CDIST are required if specific discharge is calculated for either of the groundwater models. +\item \texttt{auxiliary}---an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWF-GWF Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' and when it is required is provided in the description of the DISU Package. If an auxiliary variable with the name ``CDIST'' is found, then this information will be used in the calculation of specific discharge within model cells connected by the exchange. For a horizontal connection, CDIST should be specified as the horizontal distance between the cell centers, and should not include the vertical component. For vertical connections, CDIST should be specified as the difference in elevation between the two cell centers. Both ANGLDEGX and CDIST are required if specific discharge is calculated for either of the groundwater models. \item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of GWF Exchange cells. diff --git a/doc/mf6io/mf6ivar/tex/exg-gwtgwt-desc.tex b/doc/mf6io/mf6ivar/tex/exg-gwtgwt-desc.tex index 85c90ef8aea..d58eb0416e7 100644 --- a/doc/mf6io/mf6ivar/tex/exg-gwtgwt-desc.tex +++ b/doc/mf6io/mf6ivar/tex/exg-gwtgwt-desc.tex @@ -7,7 +7,7 @@ \item \texttt{gwfmodelname2}---keyword to specify name of second corresponding GWF Model. In the simulation name file, the GWT6-GWT6 entry contains names for GWT Models (exgmnamea and exgmnameb). The GWT Model with the name exgmnameb must correspond to the GWF Model with the name gwfmodelname2. -\item \texttt{auxiliary}---an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWF-GWF Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' is provided in the description of the DISU Package. If an auxiliary variable with the name ``CDIST'' is found, then this information will be used as the straight-line connection distance, including the vertical component, between the two cell centers. Both ANGLDEGX and CDIST are required if specific discharge is calculated for either of the groundwater models. +\item \texttt{auxiliary}---an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWT-GWT Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' is provided in the description of the DISU Package. ANGLDEGX must be specified if dispersion is simulated in the connected GWT models. \item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of GWT Exchange cells. diff --git a/src/Model/GroundWaterFlow/gwf3lak8.f90 b/src/Model/GroundWaterFlow/gwf3lak8.f90 index 3834f640263..bda281b18a6 100644 --- a/src/Model/GroundWaterFlow/gwf3lak8.f90 +++ b/src/Model/GroundWaterFlow/gwf3lak8.f90 @@ -829,7 +829,7 @@ subroutine lak_read_lake_connections(this) 'DNODATA (', DNODATA, ') value.' ! ! -- create deprecation warning - call deprecation_warning('CONNECTIONDATA', 'bedleak=NONE', '6.5.0', & + call deprecation_warning('CONNECTIONDATA', 'bedleak=NONE', '6.4.3', & warnmsg, this%parser%GetUnit()) case default read (keyword, *) rval diff --git a/src/Model/GroundWaterFlow/gwf3sfr8.f90 b/src/Model/GroundWaterFlow/gwf3sfr8.f90 index c9a4141fc9d..dea9390e846 100644 --- a/src/Model/GroundWaterFlow/gwf3sfr8.f90 +++ b/src/Model/GroundWaterFlow/gwf3sfr8.f90 @@ -923,7 +923,7 @@ subroutine sfr_read_packagedata(this) 'of 0 0 0 should be specified for unconnected reaches' ! ! -- create deprecation warning - call deprecation_warning('PACKAGEDATA', 'CELLID=NONE', '6.5.0', & + call deprecation_warning('PACKAGEDATA', 'CELLID=NONE', '6.4.3', & warnmsg, this%parser%GetUnit()) else From 67f189188950b221fa19f8b6f8540748ba663502 Mon Sep 17 00:00:00 2001 From: mjreno Date: Fri, 9 Feb 2024 14:00:16 -0500 Subject: [PATCH 008/199] feat(idm): update TDIS package for IDM (#1579) * integrate sim-tdis with idm * rebuild makefiles * fix comment * rebuild makefiles --------- Co-authored-by: mjreno --- doc/mf6io/framework/processing_of_input.tex | 1 + make/makefile | 125 ++++---- msvs/mf6core.vfproj | 1 + src/SimulationCreate.f90 | 10 +- src/Timing/simtdisidm.f90 | 259 +++++++++++++++ src/Timing/tdis.f90 | 301 ++++++++---------- src/Utilities/Idm/IdmLoad.f90 | 18 ++ src/Utilities/Idm/SourceLoad.F90 | 59 +++- .../Idm/selector/IdmSimDfnSelector.f90 | 11 + src/meson.build | 1 + src/mf6core.f90 | 6 +- utils/idmloader/scripts/dfn2f90.py | 4 + 12 files changed, 549 insertions(+), 247 deletions(-) create mode 100644 src/Timing/simtdisidm.f90 diff --git a/doc/mf6io/framework/processing_of_input.tex b/doc/mf6io/framework/processing_of_input.tex index 6af3f1a933b..b625e2ffece 100644 --- a/doc/mf6io/framework/processing_of_input.tex +++ b/doc/mf6io/framework/processing_of_input.tex @@ -15,6 +15,7 @@ \subsection{Supported Components} \textbf{Component / Subcomponent} & \textbf{File Type} \\ \hline SIM/NAM & mfsim.nam \\ +SIM/TDIS & TDIS6 \\ GWF/NAM & GWF name file \\ GWT/NAM & GWT name file \\ GWF/CHD & CHD6 \\ diff --git a/make/makefile b/make/makefile index 20d30e6d03f..229db4c9bc3 100644 --- a/make/makefile +++ b/make/makefile @@ -5,36 +5,36 @@ include ./makedefaults # Define the source file directories SOURCEDIR1=../src -SOURCEDIR2=../src/Model -SOURCEDIR3=../src/Model/TransportModel -SOURCEDIR4=../src/Model/GroundWaterFlow -SOURCEDIR5=../src/Model/Geometry +SOURCEDIR2=../src/Exchange +SOURCEDIR3=../src/Timing +SOURCEDIR4=../src/Model +SOURCEDIR5=../src/Model/Connection SOURCEDIR6=../src/Model/ModelUtilities -SOURCEDIR7=../src/Model/GroundWaterTransport -SOURCEDIR8=../src/Model/Connection -SOURCEDIR9=../src/Distributed -SOURCEDIR10=../src/Utilities -SOURCEDIR11=../src/Utilities/Idm -SOURCEDIR12=../src/Utilities/Idm/mf6blockfile -SOURCEDIR13=../src/Utilities/Idm/selector -SOURCEDIR14=../src/Utilities/Vector -SOURCEDIR15=../src/Utilities/Matrix -SOURCEDIR16=../src/Utilities/Observation -SOURCEDIR17=../src/Utilities/ArrayRead -SOURCEDIR18=../src/Utilities/OutputControl -SOURCEDIR19=../src/Utilities/Libraries -SOURCEDIR20=../src/Utilities/Libraries/blas -SOURCEDIR21=../src/Utilities/Libraries/rcm -SOURCEDIR22=../src/Utilities/Libraries/sparsekit -SOURCEDIR23=../src/Utilities/Libraries/sparskit2 -SOURCEDIR24=../src/Utilities/Libraries/daglib -SOURCEDIR25=../src/Utilities/Memory -SOURCEDIR26=../src/Utilities/TimeSeries -SOURCEDIR27=../src/Timing -SOURCEDIR28=../src/Solution -SOURCEDIR29=../src/Solution/PETSc -SOURCEDIR30=../src/Solution/LinearMethods -SOURCEDIR31=../src/Exchange +SOURCEDIR7=../src/Model/GroundWaterFlow +SOURCEDIR8=../src/Model/Geometry +SOURCEDIR9=../src/Model/TransportModel +SOURCEDIR10=../src/Model/GroundWaterTransport +SOURCEDIR11=../src/Solution +SOURCEDIR12=../src/Solution/LinearMethods +SOURCEDIR13=../src/Solution/PETSc +SOURCEDIR14=../src/Distributed +SOURCEDIR15=../src/Utilities +SOURCEDIR16=../src/Utilities/TimeSeries +SOURCEDIR17=../src/Utilities/Idm +SOURCEDIR18=../src/Utilities/Idm/selector +SOURCEDIR19=../src/Utilities/Idm/mf6blockfile +SOURCEDIR20=../src/Utilities/ArrayRead +SOURCEDIR21=../src/Utilities/Memory +SOURCEDIR22=../src/Utilities/Matrix +SOURCEDIR23=../src/Utilities/Vector +SOURCEDIR24=../src/Utilities/Observation +SOURCEDIR25=../src/Utilities/OutputControl +SOURCEDIR26=../src/Utilities/Libraries +SOURCEDIR27=../src/Utilities/Libraries/rcm +SOURCEDIR28=../src/Utilities/Libraries/sparskit2 +SOURCEDIR29=../src/Utilities/Libraries/sparsekit +SOURCEDIR30=../src/Utilities/Libraries/blas +SOURCEDIR31=../src/Utilities/Libraries/daglib VPATH = \ ${SOURCEDIR1} \ @@ -88,36 +88,10 @@ $(OBJDIR)/TableTerm.o \ $(OBJDIR)/Table.o \ $(OBJDIR)/MemoryHelper.o \ $(OBJDIR)/CharString.o \ +$(OBJDIR)/InputDefinition.o \ $(OBJDIR)/Memory.o \ $(OBJDIR)/List.o \ -$(OBJDIR)/LongLineReader.o \ -$(OBJDIR)/DevFeature.o \ -$(OBJDIR)/MemoryList.o \ -$(OBJDIR)/TimeSeriesRecord.o \ -$(OBJDIR)/MathUtil.o \ -$(OBJDIR)/BlockParser.o \ -$(OBJDIR)/MemoryManager.o \ -$(OBJDIR)/TimeSeries.o \ -$(OBJDIR)/ats.o \ -$(OBJDIR)/GeomUtil.o \ -$(OBJDIR)/TimeSeriesLink.o \ -$(OBJDIR)/TimeSeriesFileList.o \ -$(OBJDIR)/tdis.o \ -$(OBJDIR)/HashTable.o \ -$(OBJDIR)/VectorBase.o \ -$(OBJDIR)/Sparse.o \ -$(OBJDIR)/DisvGeom.o \ -$(OBJDIR)/ArrayReaders.o \ -$(OBJDIR)/TimeSeriesManager.o \ -$(OBJDIR)/SmoothingFunctions.o \ -$(OBJDIR)/MemoryManagerExt.o \ -$(OBJDIR)/MatrixBase.o \ -$(OBJDIR)/ListReader.o \ -$(OBJDIR)/Connections.o \ -$(OBJDIR)/InputDefinition.o \ -$(OBJDIR)/TimeArray.o \ -$(OBJDIR)/ObsOutput.o \ -$(OBJDIR)/DiscretizationBase.o \ +$(OBJDIR)/simtdisidm.o \ $(OBJDIR)/simnamidm.o \ $(OBJDIR)/gwt1idm.o \ $(OBJDIR)/gwt1ic1idm.o \ @@ -144,18 +118,46 @@ $(OBJDIR)/gwf3chd8idm.o \ $(OBJDIR)/gwtgwtidm.o \ $(OBJDIR)/gwfgwtidm.o \ $(OBJDIR)/gwfgwfidm.o \ -$(OBJDIR)/TimeArraySeries.o \ -$(OBJDIR)/ObsOutputList.o \ -$(OBJDIR)/Observe.o \ +$(OBJDIR)/LongLineReader.o \ +$(OBJDIR)/DevFeature.o \ +$(OBJDIR)/MemoryList.o \ $(OBJDIR)/IdmSimDfnSelector.o \ $(OBJDIR)/IdmGwtDfnSelector.o \ $(OBJDIR)/IdmGwfDfnSelector.o \ $(OBJDIR)/IdmExgDfnSelector.o \ +$(OBJDIR)/TimeSeriesRecord.o \ +$(OBJDIR)/MathUtil.o \ +$(OBJDIR)/BlockParser.o \ +$(OBJDIR)/MemoryManager.o \ +$(OBJDIR)/IdmDfnSelector.o \ +$(OBJDIR)/TimeSeries.o \ +$(OBJDIR)/SourceCommon.o \ +$(OBJDIR)/MemoryManagerExt.o \ +$(OBJDIR)/ats.o \ +$(OBJDIR)/GeomUtil.o \ +$(OBJDIR)/TimeSeriesLink.o \ +$(OBJDIR)/TimeSeriesFileList.o \ +$(OBJDIR)/tdis.o \ +$(OBJDIR)/HashTable.o \ +$(OBJDIR)/VectorBase.o \ +$(OBJDIR)/Sparse.o \ +$(OBJDIR)/DisvGeom.o \ +$(OBJDIR)/ArrayReaders.o \ +$(OBJDIR)/TimeSeriesManager.o \ +$(OBJDIR)/SmoothingFunctions.o \ +$(OBJDIR)/MatrixBase.o \ +$(OBJDIR)/ListReader.o \ +$(OBJDIR)/Connections.o \ +$(OBJDIR)/TimeArray.o \ +$(OBJDIR)/ObsOutput.o \ +$(OBJDIR)/DiscretizationBase.o \ +$(OBJDIR)/TimeArraySeries.o \ +$(OBJDIR)/ObsOutputList.o \ +$(OBJDIR)/Observe.o \ $(OBJDIR)/TimeArraySeriesLink.o \ $(OBJDIR)/ObsUtility.o \ $(OBJDIR)/ObsContainer.o \ $(OBJDIR)/BudgetFileReader.o \ -$(OBJDIR)/IdmDfnSelector.o \ $(OBJDIR)/TimeArraySeriesManager.o \ $(OBJDIR)/PackageMover.o \ $(OBJDIR)/Obs3.o \ @@ -164,7 +166,6 @@ $(OBJDIR)/Budget.o \ $(OBJDIR)/BudgetTerm.o \ $(OBJDIR)/sort.o \ $(OBJDIR)/SfrCrossSectionUtils.o \ -$(OBJDIR)/SourceCommon.o \ $(OBJDIR)/BoundaryPackage.o \ $(OBJDIR)/VirtualBase.o \ $(OBJDIR)/STLVecInt.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index f0a03e6f2da..8d3b1c90737 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -286,6 +286,7 @@ + diff --git a/src/SimulationCreate.f90 b/src/SimulationCreate.f90 index ce5c0fc1a19..8aebdb1742a 100644 --- a/src/SimulationCreate.f90 +++ b/src/SimulationCreate.f90 @@ -50,14 +50,8 @@ end subroutine simulation_cr subroutine simulation_da() ! -- modules use MemoryManagerModule, only: mem_deallocate - use MemoryManagerExtModule, only: memorylist_remove - use SimVariablesModule, only: idm_context ! -- local ! ------------------------------------------------------------------------------ - ! - ! -- Deallocate input memory - call memorylist_remove('SIM', 'NAM', idm_context) - call memorylist_remove(component='SIM', context=idm_context) ! ! -- variables deallocate (model_names) @@ -183,11 +177,13 @@ subroutine timing_create() ! -- dummy ! -- locals character(len=LENMEMPATH) :: input_mempath + character(len=LENMEMPATH) :: tdis_input_mempath character(len=:), pointer :: tdis6 logical :: terminate = .true. ! ! -- set input memory path input_mempath = create_mem_path('SIM', 'NAM', idm_context) + tdis_input_mempath = create_mem_path('SIM', 'TDIS', idm_context) ! write (iout, '(/1x,a)') 'READING SIMULATION TIMING' ! @@ -196,7 +192,7 @@ subroutine timing_create() ! ! -- create timing if (tdis6 /= '') then - call tdis_cr(tdis6) + call tdis_cr(tdis6, tdis_input_mempath) else call store_error('TIMING block variable TDIS6 is unset'// & ' in simulation control input.', terminate) diff --git a/src/Timing/simtdisidm.f90 b/src/Timing/simtdisidm.f90 new file mode 100644 index 00000000000..e5de3a1787f --- /dev/null +++ b/src/Timing/simtdisidm.f90 @@ -0,0 +1,259 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module SimTdisInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public sim_tdis_param_definitions + public sim_tdis_aggregate_definitions + public sim_tdis_block_definitions + public SimTdisParamFoundType + public sim_tdis_multi_package + + type SimTdisParamFoundType + logical :: time_units = .false. + logical :: start_date_time = .false. + logical :: ats_filerecord = .false. + logical :: ats6 = .false. + logical :: filein = .false. + logical :: ats6_filename = .false. + logical :: nper = .false. + logical :: perlen = .false. + logical :: nstp = .false. + logical :: tsmult = .false. + end type SimTdisParamFoundType + + logical :: sim_tdis_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + simtdis_time_units = InputParamDefinitionType & + ( & + 'SIM', & ! component + 'TDIS', & ! subcomponent + 'OPTIONS', & ! block + 'TIME_UNITS', & ! tag name + 'TIME_UNITS', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + simtdis_start_date_time = InputParamDefinitionType & + ( & + 'SIM', & ! component + 'TDIS', & ! subcomponent + 'OPTIONS', & ! block + 'START_DATE_TIME', & ! tag name + 'START_DATE_TIME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + simtdis_ats_filerecord = InputParamDefinitionType & + ( & + 'SIM', & ! component + 'TDIS', & ! subcomponent + 'OPTIONS', & ! block + 'ATS_FILERECORD', & ! tag name + 'ATS_FILERECORD', & ! fortran variable + 'RECORD ATS6 FILEIN ATS6_FILENAME', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + simtdis_ats6 = InputParamDefinitionType & + ( & + 'SIM', & ! component + 'TDIS', & ! subcomponent + 'OPTIONS', & ! block + 'ATS6', & ! tag name + 'ATS6', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + simtdis_filein = InputParamDefinitionType & + ( & + 'SIM', & ! component + 'TDIS', & ! subcomponent + 'OPTIONS', & ! block + 'FILEIN', & ! tag name + 'FILEIN', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + simtdis_ats6_filename = InputParamDefinitionType & + ( & + 'SIM', & ! component + 'TDIS', & ! subcomponent + 'OPTIONS', & ! block + 'ATS6_FILENAME', & ! tag name + 'ATS6_FILENAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + simtdis_nper = InputParamDefinitionType & + ( & + 'SIM', & ! component + 'TDIS', & ! subcomponent + 'DIMENSIONS', & ! block + 'NPER', & ! tag name + 'NPER', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + simtdis_perlen = InputParamDefinitionType & + ( & + 'SIM', & ! component + 'TDIS', & ! subcomponent + 'PERIODDATA', & ! block + 'PERLEN', & ! tag name + 'PERLEN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + simtdis_nstp = InputParamDefinitionType & + ( & + 'SIM', & ! component + 'TDIS', & ! subcomponent + 'PERIODDATA', & ! block + 'NSTP', & ! tag name + 'NSTP', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + simtdis_tsmult = InputParamDefinitionType & + ( & + 'SIM', & ! component + 'TDIS', & ! subcomponent + 'PERIODDATA', & ! block + 'TSMULT', & ! tag name + 'TSMULT', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + sim_tdis_param_definitions(*) = & + [ & + simtdis_time_units, & + simtdis_start_date_time, & + simtdis_ats_filerecord, & + simtdis_ats6, & + simtdis_filein, & + simtdis_ats6_filename, & + simtdis_nper, & + simtdis_perlen, & + simtdis_nstp, & + simtdis_tsmult & + ] + + type(InputParamDefinitionType), parameter :: & + simtdis_perioddata = InputParamDefinitionType & + ( & + 'SIM', & ! component + 'TDIS', & ! subcomponent + 'PERIODDATA', & ! block + 'PERIODDATA', & ! tag name + 'PERIODDATA', & ! fortran variable + 'RECARRAY PERLEN NSTP TSMULT', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + sim_tdis_aggregate_definitions(*) = & + [ & + simtdis_perioddata & + ] + + type(InputBlockDefinitionType), parameter :: & + sim_tdis_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'PERIODDATA', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module SimTdisInputModule diff --git a/src/Timing/tdis.f90 b/src/Timing/tdis.f90 index 0aa32fc93bb..a3cf0bb36b4 100644 --- a/src/Timing/tdis.f90 +++ b/src/Timing/tdis.f90 @@ -6,8 +6,7 @@ module TdisModule use KindModule, only: DP, I4B, LGP use SimVariablesModule, only: iout, isim_level - use BlockParserModule, only: BlockParserType - use ConstantsModule, only: LINELENGTH, LENDATETIME, VALL + use ConstantsModule, only: LINELENGTH, LENDATETIME, LENMEMPATH, VALL ! implicit none ! @@ -40,55 +39,46 @@ module TdisModule integer(I4B), public, dimension(:), pointer, contiguous :: nstp => null() !< number of time steps in each stress period real(DP), public, dimension(:), pointer, contiguous :: tsmult => null() !< time step multiplier for each stress period character(len=LENDATETIME), pointer :: datetime0 => null() !< starting date and time for the simulation + character(len=LENMEMPATH), pointer :: input_mempath => null() !< input context mempath for tdis + character(len=LINELENGTH), pointer :: input_fname => null() !< input filename for tdis ! - type(BlockParserType), private :: parser - contains !> @brief Create temporal discretization !< - subroutine tdis_cr(fname) + subroutine tdis_cr(fname, inmempath) ! -- modules use InputOutputModule, only: getunit, openfile use ConstantsModule, only: LINELENGTH, DZERO use AdaptiveTimeStepModule, only: ats_cr ! -- dummy character(len=*), intent(in) :: fname + character(len=*), intent(in) :: inmempath ! -- local - integer(I4B) :: inunit ! -- formats character(len=*), parameter :: fmtheader = & "(1X,/1X,'TDIS -- TEMPORAL DISCRETIZATION PACKAGE,', / & - &' VERSION 1 : 11/13/2014 - INPUT READ FROM UNIT ',I4)" + &' VERSION 1 : 11/13/2014 - INPUT READ FROM MEMPATH: ', A)" ! ! -- Allocate the scalar variables call tdis_allocate_scalars() ! - ! -- Get a unit number for tdis and open the file if it is not opened - inquire (file=fname, number=inunit) - if (inunit < 0) then - inunit = getunit() - call openfile(inunit, iout, fname, 'TDIS') - end if + ! -- set input context and fname + input_fname = fname + input_mempath = inmempath ! ! -- Identify package - write (iout, fmtheader) inunit - ! - ! -- Initialize block parser - call parser%Initialize(inunit, iout) + write (iout, fmtheader) input_mempath ! - ! -- Read options - call tdis_read_options() + ! -- Source options + call tdis_source_options() ! - ! -- Read dimensions and then allocate arrays - call tdis_read_dimensions() + ! -- Source dimensions and then allocate arrays + call tdis_source_dimensions() call tdis_allocate_arrays() ! - ! -- Read timing - call tdis_read_timing() - ! - ! -- Close the file - call parser%Clear() + ! -- Source timing + call tdis_source_timing() ! if (inats > 0) then call ats_cr(inats, nper) @@ -458,6 +448,8 @@ subroutine tdis_da() ! ! -- strings deallocate (datetime0) + deallocate (input_mempath) + deallocate (input_fname) ! ! -- Arrays call mem_deallocate(perlen) @@ -468,104 +460,83 @@ subroutine tdis_da() return end subroutine tdis_da - !> @brief Read the timing discretization options + !> @brief Source the timing discretization options !< - subroutine tdis_read_options() + subroutine tdis_source_options() ! -- modules use ConstantsModule, only: LINELENGTH - use SimModule, only: store_error use InputOutputModule, only: GetUnit, openfile + use MemoryManagerExtModule, only: mem_set_value + use SourceCommonModule, only: filein_fname + use SimTdisInputModule, only: SimTdisParamFoundType ! -- local - character(len=LINELENGTH) :: errmsg, keyword, fname - integer(I4B) :: ierr - logical :: isfound, endOfBlock - logical :: undspec + type(SimTdisParamFoundType) :: found + character(len=LINELENGTH), dimension(6) :: time_units = & + &[character(len=LINELENGTH) :: 'UNDEFINED', 'SECONDS', 'MINUTES', 'HOURS', & + 'DAYS', 'YEARS'] + character(len=LINELENGTH) :: fname ! -- formats character(len=*), parameter :: fmtitmuni = & &"(4x,'SIMULATION TIME UNIT IS ',A)" character(len=*), parameter :: fmtdatetime0 = & &"(4x,'SIMULATION STARTING DATE AND TIME IS ',A)" - !data ! - ! -- set variables + ! -- initialize time unit to undefined itmuni = 0 - undspec = .false. - ! - ! -- get options block - call parser%GetBlock('OPTIONS', isfound, ierr, & - supportOpenClose=.true., blockRequired=.false.) - ! - ! -- parse options block if detected - if (isfound) then - write (iout, '(1x,a)') 'PROCESSING TDIS OPTIONS' - do - call parser%GetNextLine(endOfBlock) - if (endOfBlock) exit - call parser%GetStringCaps(keyword) - select case (keyword) - case ('TIME_UNITS') - call parser%GetStringCaps(keyword) - select case (keyword) - case ('UNDEFINED') - itmuni = 0 - write (iout, fmtitmuni) 'UNDEFINED' - undspec = .true. - case ('SECONDS') - itmuni = 1 - write (iout, fmtitmuni) 'SECONDS' - case ('MINUTES') - itmuni = 2 - write (iout, fmtitmuni) 'MINUTES' - case ('HOURS') - itmuni = 3 - write (iout, fmtitmuni) 'HOURS' - case ('DAYS') - itmuni = 4 - write (iout, fmtitmuni) 'DAYS' - case ('YEARS') - itmuni = 5 - write (iout, fmtitmuni) 'YEARS' - case default - write (errmsg, '(a,a)') 'Unknown TIME_UNITS: ', & - trim(keyword) - call store_error(errmsg) - call parser%StoreErrorUnit() - end select - case ('START_DATE_TIME') - call parser%GetString(datetime0) - write (iout, fmtdatetime0) datetime0 - case ('ATS6') - call parser%GetStringCaps(keyword) - if (trim(adjustl(keyword)) /= 'FILEIN') then - errmsg = 'ATS6 keyword must be followed by "FILEIN" '// & - 'then by filename.' - call store_error(errmsg) - end if - call parser%GetString(fname) - inats = GetUnit() - call openfile(inats, iout, fname, 'ATS') - case default - write (errmsg, '(a,a)') 'Unknown TDIS option: ', & - trim(keyword) - call store_error(errmsg) - call parser%StoreErrorUnit() - end select - end do - write (iout, '(1x,a)') 'END OF TDIS OPTIONS' + ! + ! -- source options from input context + call mem_set_value(itmuni, 'TIME_UNITS', input_mempath, time_units, & + found%time_units) + call mem_set_value(datetime0, 'START_DATE_TIME', input_mempath, & + found%start_date_time) + ! + if (found%time_units) then + ! + ! -- adjust to 0-based indexing for itmuni + itmuni = itmuni - 1 end if ! - ! -- Set to itmuni to undefined if not specified - if (itmuni == 0) then - if (.not. undspec) then + ! -- enforce 0 or 1 ATS6_FILENAME entries in option block + if (filein_fname(fname, 'ATS6_FILENAME', input_mempath, & + input_fname)) then + inats = GetUnit() + call openfile(inats, iout, fname, 'ATS') + end if + ! + ! -- log values to list file + write (iout, '(1x,a)') 'PROCESSING TDIS OPTIONS' + ! + if (found%time_units) then + select case (itmuni) + case (0) write (iout, fmtitmuni) 'UNDEFINED' - end if + case (1) + write (iout, fmtitmuni) 'SECONDS' + case (2) + write (iout, fmtitmuni) 'MINUTES' + case (3) + write (iout, fmtitmuni) 'HOURS' + case (4) + write (iout, fmtitmuni) 'DAYS' + case (5) + write (iout, fmtitmuni) 'YEARS' + case default + end select + else + write (iout, fmtitmuni) 'UNDEFINED' end if ! + if (found%start_date_time) then + write (iout, fmtdatetime0) datetime0 + end if + ! + write (iout, '(1x,a)') 'END OF TDIS OPTIONS' + ! ! -- Return return - end subroutine tdis_read_options + end subroutine tdis_source_options - !> @brief Read dimension NPER + !> @brief Allocate tdis scalars !< subroutine tdis_allocate_scalars() ! -- modules @@ -593,6 +564,8 @@ subroutine tdis_allocate_scalars() ! ! -- strings allocate (datetime0) + allocate (input_mempath) + allocate (input_fname) ! ! -- Initialize variables nper = 0 @@ -632,64 +605,48 @@ subroutine tdis_allocate_arrays() return end subroutine tdis_allocate_arrays - !> @brief Read dimension NPER + !> @brief Source dimension NPER !< - subroutine tdis_read_dimensions() + subroutine tdis_source_dimensions() ! -- modules use ConstantsModule, only: LINELENGTH - use SimModule, only: store_error + use MemoryManagerExtModule, only: mem_set_value + use SourceCommonModule, only: filein_fname + use SimTdisInputModule, only: SimTdisParamFoundType ! -- local - character(len=LINELENGTH) :: errmsg, keyword - integer(I4B) :: ierr - logical :: isfound, endOfBlock + type(SimTdisParamFoundType) :: found ! -- formats character(len=*), parameter :: fmtnper = & "(1X,I4,' STRESS PERIOD(S) IN SIMULATION')" ! - ! -- get DIMENSIONS block - call parser%GetBlock('DIMENSIONS', isfound, ierr, & - supportOpenClose=.true.) - ! - ! -- parse block if detected - if (isfound) then - write (iout, '(1x,a)') 'PROCESSING TDIS DIMENSIONS' - do - call parser%GetNextLine(endOfBlock) - if (endOfBlock) exit - call parser%GetStringCaps(keyword) - select case (keyword) - case ('NPER') - nper = parser%GetInteger() - write (iout, fmtnper) nper - case default - write (errmsg, '(a,a)') 'Unknown TDIS dimension: ', & - trim(keyword) - call store_error(errmsg) - call parser%StoreErrorUnit() - end select - end do - write (iout, '(1x,a)') 'END OF TDIS DIMENSIONS' - else - write (errmsg, '(a)') 'Required DIMENSIONS block not found.' - call store_error(errmsg) - call parser%StoreErrorUnit() + ! -- source dimensions from input context + call mem_set_value(nper, 'NPER', input_mempath, found%nper) + ! + ! -- log values to list file + write (iout, '(1x,a)') 'PROCESSING TDIS DIMENSIONS' + ! + if (found%nper) then + write (iout, fmtnper) nper end if ! + write (iout, '(1x,a)') 'END OF TDIS DIMENSIONS' + ! ! -- Return return - end subroutine tdis_read_dimensions + end subroutine tdis_source_dimensions - !> @brief Read timing information + !> @brief Source timing information !< - subroutine tdis_read_timing() + subroutine tdis_source_timing() ! -- modules use ConstantsModule, only: LINELENGTH, DZERO - use SimModule, only: store_error, count_errors + use SimModule, only: store_error_filename, count_errors + use MemoryManagerExtModule, only: mem_set_value + use SourceCommonModule, only: filein_fname + use SimTdisInputModule, only: SimTdisParamFoundType ! -- local - character(len=LINELENGTH) :: errmsg - integer(I4B) :: ierr + type(SimTdisParamFoundType) :: found integer(I4B) :: n - logical :: isfound, endOfBlock ! -- formats character(len=*), parameter :: fmtheader = & "(1X,//1X,'STRESS PERIOD LENGTH TIME STEPS', & @@ -697,41 +654,33 @@ subroutine tdis_read_timing() character(len=*), parameter :: fmtrow = & "(1X,I8,1PG21.7,I7,0PF25.3)" ! - ! -- get PERIODDATA block - call parser%GetBlock('PERIODDATA', isfound, ierr, & - supportOpenClose=.true.) - ! - ! -- parse block if detected - if (isfound) then - write (iout, '(1x,a)') 'PROCESSING TDIS PERIODDATA' - write (iout, fmtheader) - do n = 1, nper - call parser%GetNextLine(endOfBlock) - perlen(n) = parser%GetDouble() - nstp(n) = parser%GetInteger() - tsmult(n) = parser%GetDouble() - write (iout, fmtrow) n, perlen(n), nstp(n), tsmult(n) - totalsimtime = totalsimtime + perlen(n) - end do - ! - ! -- Check timing information - call check_tdis_timing(nper, perlen, nstp, tsmult) - call parser%terminateblock() - ! - ! -- Check for errors - if (count_errors() > 0) then - call parser%StoreErrorUnit() - end if - write (iout, '(1x,a)') 'END OF TDIS PERIODDATA' - else - write (errmsg, '(a)') 'Required PERIODDATA block not found.' - call store_error(errmsg) - call parser%StoreErrorUnit() + ! -- source perioddata from input context + call mem_set_value(perlen, 'PERLEN', input_mempath, found%perlen) + call mem_set_value(nstp, 'NSTP', input_mempath, found%nstp) + call mem_set_value(tsmult, 'TSMULT', input_mempath, found%tsmult) + ! + ! -- Check timing information + call check_tdis_timing(nper, perlen, nstp, tsmult) + ! + ! -- Check for errors + if (count_errors() > 0) then + call store_error_filename(input_fname) end if ! + ! -- log timing + write (iout, '(1x,a)') 'PROCESSING TDIS PERIODDATA' + write (iout, fmtheader) + ! + do n = 1, size(perlen) + write (iout, fmtrow) n, perlen(n), nstp(n), tsmult(n) + totalsimtime = totalsimtime + perlen(n) + end do + ! + write (iout, '(1x,a)') 'END OF TDIS PERIODDATA' + ! ! -- Return return - end subroutine tdis_read_timing + end subroutine tdis_source_timing !> @brief Check the tdis timing information !! @@ -742,7 +691,7 @@ end subroutine tdis_read_timing subroutine check_tdis_timing(nper, perlen, nstp, tsmult) ! -- modules use ConstantsModule, only: LINELENGTH, DZERO, DONE - use SimModule, only: store_error, count_errors + use SimModule, only: store_error ! -- dummy integer(I4B), intent(in) :: nper real(DP), dimension(:), contiguous, intent(in) :: perlen diff --git a/src/Utilities/Idm/IdmLoad.f90 b/src/Utilities/Idm/IdmLoad.f90 index b7c95f238dd..26c6aa21973 100644 --- a/src/Utilities/Idm/IdmLoad.f90 +++ b/src/Utilities/Idm/IdmLoad.f90 @@ -21,6 +21,7 @@ module IdmLoadModule implicit none private public :: simnam_load + public :: simtdis_load public :: load_models public :: load_exchanges public :: idm_df @@ -109,6 +110,11 @@ subroutine idm_da(iout) end if end do ! + ! -- deallocate input context SIM paths + call memorylist_remove('SIM', 'TDIS', idm_context) + call memorylist_remove('SIM', 'NAM', idm_context) + call memorylist_remove(component='SIM', context=idm_context) + ! ! -- return return end subroutine idm_da @@ -442,6 +448,18 @@ subroutine simnam_load(paramlog) return end subroutine simnam_load + !> @brief MODFLOW 6 tdis input load routine + !< + subroutine simtdis_load() + use SourceLoadModule, only: load_simtdis + ! + ! -- load sim tdis file + call load_simtdis() + ! + ! --return + return + end subroutine simtdis_load + !> @brief retrieve list of model dynamic loaders !< function dynamic_model_pkgs(modelname, modelfname, iout) & diff --git a/src/Utilities/Idm/SourceLoad.F90 b/src/Utilities/Idm/SourceLoad.F90 index a41a4393464..4339e21697a 100644 --- a/src/Utilities/Idm/SourceLoad.F90 +++ b/src/Utilities/Idm/SourceLoad.F90 @@ -18,7 +18,7 @@ module SourceLoadModule private public :: create_input_loader public :: open_source_file - public :: load_modelnam, load_simnam + public :: load_modelnam, load_simnam, load_simtdis public :: remote_model_ndim contains @@ -174,6 +174,63 @@ subroutine load_simnam() return end subroutine load_simnam + subroutine load_simtdis() + ! -- modules + use SimVariablesModule, only: simfile, iout + use MemoryHelperModule, only: create_mem_path + use MemoryManagerModule, only: mem_setptr + use SimVariablesModule, only: idm_context + use SourceCommonModule, only: package_source_type + use IdmMf6FileModule, only: input_load + ! -- dummy + ! -- locals + character(len=LENMEMPATH) :: input_mempath + type(ModflowInputType) :: mf6_input + character(len=LENPACKAGENAME) :: source_type + character(len=:), pointer :: tdis6 + logical :: lexist + ! + ! -- set input memory path + input_mempath = create_mem_path('SIM', 'NAM', idm_context) + ! + ! -- set pointers to input context timing params + call mem_setptr(tdis6, 'TDIS6', input_mempath) + ! + ! -- create timing + if (tdis6 /= '') then + ! + ! -- set source type + source_type = package_source_type(tdis6) + ! + select case (source_type) + case ('MF6FILE') + ! + inquire (file=trim(adjustl(tdis6)), exist=lexist) + ! + if (lexist) then + ! + ! -- create description of input + mf6_input = getModflowInput('TDIS6', 'SIM', 'TDIS', & + 'SIM', 'TDIS', simfile) + ! + ! -- open namfile and load to input context + call input_load(tdis6, mf6_input, simfile, iout) + ! + else + write (errmsg, '(a)') & + 'Simulation TIMING input file "'//trim(tdis6)// & + '" does not exist.' + call store_error(errmsg) + call store_error_filename(simfile) + end if + case default + end select + end if + ! + ! -- return + return + end subroutine load_simtdis + function remote_model_ndim(mtype, mfname) result(ncelldim) use SourceCommonModule, only: package_source_type use ConstantsModule, only: LINELENGTH diff --git a/src/Utilities/Idm/selector/IdmSimDfnSelector.f90 b/src/Utilities/Idm/selector/IdmSimDfnSelector.f90 index bf18e39f182..d5701798ccb 100644 --- a/src/Utilities/Idm/selector/IdmSimDfnSelector.f90 +++ b/src/Utilities/Idm/selector/IdmSimDfnSelector.f90 @@ -6,6 +6,7 @@ module IdmSimDfnSelectorModule use InputDefinitionModule, only: InputParamDefinitionType, & InputBlockDefinitionType use SimNamInputModule + use SimTdisInputModule implicit none private @@ -36,6 +37,8 @@ function sim_param_definitions(subcomponent) result(input_definition) select case (subcomponent) case ('NAM') call set_param_pointer(input_definition, sim_nam_param_definitions) + case ('TDIS') + call set_param_pointer(input_definition, sim_tdis_param_definitions) case default end select return @@ -48,6 +51,8 @@ function sim_aggregate_definitions(subcomponent) result(input_definition) select case (subcomponent) case ('NAM') call set_param_pointer(input_definition, sim_nam_aggregate_definitions) + case ('TDIS') + call set_param_pointer(input_definition, sim_tdis_aggregate_definitions) case default end select return @@ -60,6 +65,8 @@ function sim_block_definitions(subcomponent) result(input_definition) select case (subcomponent) case ('NAM') call set_block_pointer(input_definition, sim_nam_block_definitions) + case ('TDIS') + call set_block_pointer(input_definition, sim_tdis_block_definitions) case default end select return @@ -71,6 +78,8 @@ function sim_idm_multi_package(subcomponent) result(multi_package) select case (subcomponent) case ('NAM') multi_package = sim_nam_multi_package + case ('TDIS') + multi_package = sim_tdis_multi_package case default call store_error('Idm selector subcomponent not found; '//& &'component="SIM"'//& @@ -86,6 +95,8 @@ function sim_idm_integrated(subcomponent) result(integrated) select case (subcomponent) case ('NAM') integrated = .true. + case ('TDIS') + integrated = .true. case default end select return diff --git a/src/meson.build b/src/meson.build index 8bd2cb66d93..51cc3f51d56 100644 --- a/src/meson.build +++ b/src/meson.build @@ -161,6 +161,7 @@ modflow_sources = files( 'Solution' / 'SolutionFactory.F90', 'Solution' / 'SolutionGroup.f90', 'Timing' / 'ats.f90', + 'Timing' / 'simtdisidm.f90', 'Timing' / 'tdis.f90', 'Utilities' / 'ArrayRead' / 'ArrayReaderBase.f90', 'Utilities' / 'ArrayRead' / 'Double1dReader.f90', diff --git a/src/mf6core.f90 b/src/mf6core.f90 index 814cfe1857d..fd66e15a88a 100644 --- a/src/mf6core.f90 +++ b/src/mf6core.f90 @@ -268,7 +268,8 @@ subroutine static_input_load() ! -- modules use ConstantsModule, only: LENMEMPATH use SimVariablesModule, only: iout - use IdmLoadModule, only: simnam_load, load_models, load_exchanges + use IdmLoadModule, only: simnam_load, simtdis_load, & + load_models, load_exchanges use MemoryHelperModule, only: create_mem_path use MemoryManagerModule, only: mem_setptr, mem_allocate use SimVariablesModule, only: idm_context, iparamlog @@ -282,6 +283,9 @@ subroutine static_input_load() ! -- load simnam input context call simnam_load(iparamlog) ! + ! -- load tdis to input context + call simtdis_load() + ! ! -- allocate model load mask input_mempath = create_mem_path(component='SIM', context=idm_context) call mem_setptr(nummodels, 'NUMMODELS', input_mempath) diff --git a/utils/idmloader/scripts/dfn2f90.py b/utils/idmloader/scripts/dfn2f90.py index 5b5a0c58c99..de1ab63a976 100644 --- a/utils/idmloader/scripts/dfn2f90.py +++ b/utils/idmloader/scripts/dfn2f90.py @@ -962,6 +962,10 @@ def _write_master_component(self, fh=None): DFN_PATH / "sim-nam.dfn", SRC_PATH / "simnamidm.f90", ], + [ + DFN_PATH / "sim-tdis.dfn", + SRC_PATH / "Timing" / "simtdisidm.f90", + ], ] dfn_d = {} From 55add1c53e6509d6a7f1175f9fce37f11f0ace6d Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Fri, 9 Feb 2024 14:56:03 -0800 Subject: [PATCH 009/199] feat(GWE): Introduce Groundwater Energy Transport (#1493) * feat(GWE): Introduce Groundwater Energy Transport * fix typo in meson file * fix a formating issue that was popping up in an MST autotest * some legacy line leftover from a botched rebase, possibly * Need update initial autotest to conform to new autotest standards adopted with #1464 * Start looking for post-rebase breakages * Get gwfgwe and gwegwe exchanges up-to-date based on #1505 * Code that had been moved to set_active_status in FMI was still present in fmi_fc(). Removing. * Forgot to remove unused variables after making changes in 4d76729 * Adding another autotest specific to GWE * Adding another autotest after getting it #1464 compliant * Compliantizing another new autotest with PR #1464 * Fixes in response to https://github.com/MODFLOW-USGS/modflow6/pull/1493#discussion_r1434957257 * Fix in response to https://github.com/MODFLOW-USGS/modflow6/pull/1493#discussion_r1434959417 * Rerunning black in response to https://github.com/MODFLOW-USGS/modflow6/pull/1493#discussion_r1434968145 * Fix in response to https://github.com/MODFLOW-USGS/modflow6/pull/1493#discussion_r1434970996 * Made changes to dfn files in response to https://github.com/MODFLOW-USGS/modflow6/pull/1493#discussion_r1434974211 and https://github.com/MODFLOW-USGS/modflow6/pull/1493#discussion_r1434973634 and reran mf6ivar.py, which updated the tex files in this commit * Fix in response to https://github.com/MODFLOW-USGS/modflow6/pull/1493#discussion_r1434970996 * remove unnecessary line of script * Add missing lines to ConnectionBuilder.f90 related to GWE * Add a GWE vs GWT comparison autotest * GWE-GWE exchanges now working. Other clean-up for code uniformity * Rebrand constant temperature package acronym to CTP * Missed an import renaming update * Forgot to remove a now obsolete file due to renaming. * Rebrand energy storage and transfer package acronym to EST * Forgot to remove a now obsolete file due to renaming (again) * Rebrand gwe dispersion package acronym to CND (conduction) since that is the dominant process in heat transport * Remove gwe-related code from generalized transport code (tsp1.f90 & tsp1ssm1.f90) * add single-cell test for energy source loading (ESL) package * Adding energy source loading (ESL) package * remove unused variable * fprettify * Add another ESL autotest * Adding another autotest that compares gwe to three different analytical solutions from Carslaw & Jaeger (1947) * Bringing over Stallman autotest from previous GWE PR (#1237) * Adding streamflow energy transport (SFE) package * Add autotest for SFE * Adding lake energy transport (LKE) package. Includes new autotest * forgot meson update * Adding multi-aquifer well energy transport (MWE) package. Includes new autotest * Adding unsaturated-zone energy transport (UZE) package. Includes 2 new autotests * Attempting to reapply a failing autotest. Unable to discern why it is failing as downloaded contents from its failure are working locally. * removing troublesome autotest. Downloaded contents from failed run on Actions doesn't yield the same output that the logs are reporting. This particular autotest has an analytical solution (and a plot) that might be better shown on the modflow6-examples repo anyway * Removing a file that shouldn't have been added (snuck in among other staged files) * Update release notes --- autotest/test_gwe_cnd.py | 495 ++++ autotest/test_gwe_drycell_cnd0.py | 423 ++++ autotest/test_gwe_drycell_cnd1.py | 484 ++++ autotest/test_gwe_drycell_cnd2.py | 669 ++++++ autotest/test_gwe_esl01.py | 369 +++ autotest/test_gwe_esl02.py | 366 +++ autotest/test_gwe_esl_analyt_sln.py | 561 +++++ autotest/test_gwe_lke_conduction.py | 780 +++++++ autotest/test_gwe_mwe_conduction.py | 570 +++++ autotest/test_gwe_sfe_strmbedcond.py | 799 +++++++ autotest/test_gwe_stallman.py | 404 ++++ autotest/test_gwe_uze00.py | 612 +++++ autotest/test_gwe_vs_gwt.py | 564 +++++ autotest/test_gwegwe_exchng_with_comp2gwt.py | 1086 +++++++++ doc/Common/gwe-ctpobs.tex | 1 + doc/Common/gwe-eslobs.tex | 1 + doc/Common/gwe-esrobs.tex | 1 + doc/Common/gwe-gweobs.tex | 1 + doc/Common/gwe-lkeobs.tex | 18 + doc/Common/gwe-mweobs.tex | 13 + doc/Common/gwe-obs.tex | 2 + doc/Common/gwe-obstypetable.tex | 94 + doc/Common/gwe-sfeobs.tex | 17 + doc/Common/gwe-uzeobs.tex | 14 + doc/MODFLOW6References.bib | 22 + doc/ReleaseNotes/develop.tex | 8 +- doc/mf6io/body.tex | 5 + doc/mf6io/gwe/adv.tex | 16 + doc/mf6io/gwe/cnd.tex | 17 + doc/mf6io/gwe/ctp.tex | 47 + doc/mf6io/gwe/esl.tex | 47 + doc/mf6io/gwe/est.tex | 18 + doc/mf6io/gwe/fmi.tex | 54 + doc/mf6io/gwe/gwe-gwe.tex | 45 + doc/mf6io/gwe/gwe-obs.tex | 39 + doc/mf6io/gwe/gwe.tex | 151 ++ doc/mf6io/gwe/ic.tex | 17 + doc/mf6io/gwe/lke.tex | 55 + doc/mf6io/gwe/mwe.tex | 55 + doc/mf6io/gwe/namefile.tex | 52 + doc/mf6io/gwe/oc.tex | 25 + doc/mf6io/gwe/sfe.tex | 55 + doc/mf6io/gwe/ssm.tex | 114 + doc/mf6io/gwe/uze.tex | 55 + doc/mf6io/mf6io.bbl | 12 + doc/mf6io/mf6ivar/dfn/common.dfn | 3 + doc/mf6io/mf6ivar/dfn/exg-gwegwe.dfn | 280 +++ doc/mf6io/mf6ivar/dfn/exg-gwfgwe.dfn | 3 + doc/mf6io/mf6ivar/dfn/gwe-adv.dfn | 11 + doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn | 92 + doc/mf6io/mf6ivar/dfn/gwe-ctp.dfn | 213 ++ doc/mf6io/mf6ivar/dfn/gwe-dis.dfn | 122 + doc/mf6io/mf6ivar/dfn/gwe-disu.dfn | 277 +++ doc/mf6io/mf6ivar/dfn/gwe-disv.dfn | 204 ++ doc/mf6io/mf6ivar/dfn/gwe-esl.dfn | 205 ++ doc/mf6io/mf6ivar/dfn/gwe-est.dfn | 106 + doc/mf6io/mf6ivar/dfn/gwe-fmi.dfn | 58 + doc/mf6io/mf6ivar/dfn/gwe-ic.dfn | 11 + doc/mf6io/mf6ivar/dfn/gwe-lke.dfn | 481 ++++ doc/mf6io/mf6ivar/dfn/gwe-mwe.dfn | 447 ++++ doc/mf6io/mf6ivar/dfn/gwe-nam.dfn | 74 + doc/mf6io/mf6ivar/dfn/gwe-oc.dfn | 313 +++ doc/mf6io/mf6ivar/dfn/gwe-sfe.dfn | 480 ++++ doc/mf6io/mf6ivar/dfn/gwe-ssm.dfn | 122 + doc/mf6io/mf6ivar/dfn/gwe-uze.dfn | 438 ++++ doc/mf6io/mf6ivar/dfn/gwf-rcha.dfn | 2 +- doc/mf6io/mf6ivar/dfn/utl-spt.dfn | 118 + doc/mf6io/mf6ivar/dfn/utl-spta.dfn | 89 + .../examples/exg-gwegwe-example-obs.dat | 12 + .../mf6ivar/examples/exg-gwegwe-example.dat | 57 + .../mf6ivar/examples/gwe-adv-example.dat | 3 + .../mf6ivar/examples/gwe-cnd-example.dat | 19 + .../mf6ivar/examples/gwe-ctp-example-obs.dat | 16 + .../mf6ivar/examples/gwe-ctp-example.dat | 15 + .../mf6ivar/examples/gwe-esl-example-obs.dat | 11 + .../mf6ivar/examples/gwe-esl-example.dat | 13 + .../mf6ivar/examples/gwe-est-example.dat | 16 + .../mf6ivar/examples/gwe-fmi-example.dat | 14 + doc/mf6io/mf6ivar/examples/gwe-ic-example.dat | 10 + .../mf6ivar/examples/gwe-lke-example-obs.dat | 25 + .../mf6ivar/examples/gwe-lke-example.dat | 24 + .../mf6ivar/examples/gwe-mwe-example-obs.dat | 43 + .../mf6ivar/examples/gwe-mwe-example.dat | 24 + .../mf6ivar/examples/gwe-nam-example.dat | 16 + doc/mf6io/mf6ivar/examples/gwe-oc-example.dat | 10 + .../mf6ivar/examples/gwe-sfe-example-obs.dat | 24 + .../mf6ivar/examples/gwe-sfe-example.dat | 24 + .../mf6ivar/examples/gwe-ssm-example.dat | 16 + .../mf6ivar/examples/gwe-uze-example-obs.dat | 12 + .../mf6ivar/examples/gwe-uze-example.dat | 24 + .../mf6ivar/examples/utl-obs-gwe-example.dat | 18 + .../mf6ivar/examples/utl-spt-example.dat | 28 + .../mf6ivar/examples/utl-spta-example.dat | 20 + doc/mf6io/mf6ivar/md/mf6ivar.md | 346 ++- doc/mf6io/mf6ivar/md/mf6memvar.md | 1713 ++++++++------ doc/mf6io/mf6ivar/mf6ivar.py | 672 +++--- doc/mf6io/mf6ivar/tex/appendixA.tex | 76 + doc/mf6io/mf6ivar/tex/exg-gwegwe-desc.tex | 63 + .../mf6ivar/tex/exg-gwegwe-dimensions.dat | 3 + .../mf6ivar/tex/exg-gwegwe-exchangedata.dat | 5 + doc/mf6io/mf6ivar/tex/exg-gwegwe-options.dat | 14 + doc/mf6io/mf6ivar/tex/exg-gwfgwe-desc.tex | 3 + doc/mf6io/mf6ivar/tex/gwe-adv-desc.tex | 9 + doc/mf6io/mf6ivar/tex/gwe-adv-options.dat | 3 + doc/mf6io/mf6ivar/tex/gwe-cnd-desc.tex | 29 + doc/mf6io/mf6ivar/tex/gwe-cnd-griddata.dat | 16 + doc/mf6io/mf6ivar/tex/gwe-cnd-options.dat | 4 + doc/mf6io/mf6ivar/tex/gwe-ctp-desc.tex | 49 + doc/mf6io/mf6ivar/tex/gwe-ctp-dimensions.dat | 3 + doc/mf6io/mf6ivar/tex/gwe-ctp-options.dat | 10 + doc/mf6io/mf6ivar/tex/gwe-ctp-period.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-dis-desc.tex | 41 + doc/mf6io/mf6ivar/tex/gwe-dis-dimensions.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-dis-griddata.dat | 12 + doc/mf6io/mf6ivar/tex/gwe-dis-options.dat | 7 + doc/mf6io/mf6ivar/tex/gwe-disu-cell2d.dat | 5 + .../mf6ivar/tex/gwe-disu-connectiondata.dat | 14 + doc/mf6io/mf6ivar/tex/gwe-disu-desc.tex | 81 + doc/mf6io/mf6ivar/tex/gwe-disu-dimensions.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-disu-griddata.dat | 10 + doc/mf6io/mf6ivar/tex/gwe-disu-options.dat | 8 + doc/mf6io/mf6ivar/tex/gwe-disu-vertices.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-disv-cell2d.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-disv-desc.tex | 61 + doc/mf6io/mf6ivar/tex/gwe-disv-dimensions.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-disv-griddata.dat | 8 + doc/mf6io/mf6ivar/tex/gwe-disv-options.dat | 7 + doc/mf6io/mf6ivar/tex/gwe-disv-vertices.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-esl-desc.tex | 49 + doc/mf6io/mf6ivar/tex/gwe-esl-dimensions.dat | 3 + doc/mf6io/mf6ivar/tex/gwe-esl-options.dat | 10 + doc/mf6io/mf6ivar/tex/gwe-esl-period.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-est-desc.tex | 35 + doc/mf6io/mf6ivar/tex/gwe-est-griddata.dat | 10 + doc/mf6io/mf6ivar/tex/gwe-est-options.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-est-packagedata.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-fmi-desc.tex | 21 + doc/mf6io/mf6ivar/tex/gwe-fmi-options.dat | 4 + doc/mf6io/mf6ivar/tex/gwe-fmi-packagedata.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-ic-desc.tex | 9 + doc/mf6io/mf6ivar/tex/gwe-ic-griddata.dat | 4 + doc/mf6io/mf6ivar/tex/gwe-lke-desc.tex | 101 + doc/mf6io/mf6ivar/tex/gwe-lke-options.dat | 15 + doc/mf6io/mf6ivar/tex/gwe-lke-packagedata.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-lke-period.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-mwe-desc.tex | 92 + doc/mf6io/mf6ivar/tex/gwe-mwe-options.dat | 15 + doc/mf6io/mf6ivar/tex/gwe-mwe-packagedata.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-mwe-period.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-nam-desc.tex | 25 + doc/mf6io/mf6ivar/tex/gwe-nam-options.dat | 6 + doc/mf6io/mf6ivar/tex/gwe-nam-packages.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-oc-desc.tex | 63 + doc/mf6io/mf6ivar/tex/gwe-oc-options.dat | 6 + doc/mf6io/mf6ivar/tex/gwe-oc-period.dat | 4 + doc/mf6io/mf6ivar/tex/gwe-sfe-desc.tex | 101 + doc/mf6io/mf6ivar/tex/gwe-sfe-options.dat | 15 + doc/mf6io/mf6ivar/tex/gwe-sfe-packagedata.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-sfe-period.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-ssm-desc.tex | 35 + doc/mf6io/mf6ivar/tex/gwe-ssm-fileinput.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-ssm-options.dat | 4 + doc/mf6io/mf6ivar/tex/gwe-ssm-sources.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-uze-desc.tex | 91 + doc/mf6io/mf6ivar/tex/gwe-uze-options.dat | 15 + doc/mf6io/mf6ivar/tex/gwe-uze-packagedata.dat | 5 + doc/mf6io/mf6ivar/tex/gwe-uze-period.dat | 5 + doc/mf6io/mf6ivar/tex/gwf-rcha-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/utl-spt-desc.tex | 37 + doc/mf6io/mf6ivar/tex/utl-spt-dimensions.dat | 3 + doc/mf6io/mf6ivar/tex/utl-spt-options.dat | 4 + doc/mf6io/mf6ivar/tex/utl-spt-period.dat | 5 + doc/mf6io/mf6ivar/tex/utl-spta-desc.tex | 25 + doc/mf6io/mf6ivar/tex/utl-spta-options.dat | 5 + doc/mf6io/mf6ivar/tex/utl-spta-period.dat | 4 + doc/mf6io/obs/obs-gwe.tex | 7 + doc/mf6io/obs/obs.tex | 2 + doc/mf6io/usgs.bst | 2080 +++++++++++++++++ make/makefile | 87 +- msvs/mf6core.vfproj | 28 + src/Distributed/VirtualDataContainer.f90 | 14 +- src/Distributed/VirtualGweExchange.f90 | 109 + src/Distributed/VirtualGweModel.f90 | 211 ++ src/Exchange/GweGweExchange.f90 | 1246 ++++++++++ src/Exchange/GwfGweExchange.f90 | 546 +++++ src/Exchange/GwfGwtExchange.f90 | 2 +- src/Exchange/gwegweidm.f90 | 582 +++++ src/Exchange/gwfgweidm.f90 | 70 + src/Model/Connection/ConnectionBuilder.f90 | 7 + src/Model/Connection/GweGweConnection.f90 | 535 +++++ src/Model/Connection/GweInterfaceModel.f90 | 274 +++ src/Model/Connection/GwtGwtConnection.f90 | 6 +- src/Model/Connection/GwtInterfaceModel.f90 | 90 +- src/Model/GroundWaterEnergy/gwe1.f90 | 991 ++++++++ src/Model/GroundWaterEnergy/gwe1cnd1.f90 | 943 ++++++++ src/Model/GroundWaterEnergy/gwe1cnd1idm.f90 | 231 ++ src/Model/GroundWaterEnergy/gwe1ctp1.f90 | 533 +++++ src/Model/GroundWaterEnergy/gwe1ctp1idm.f90 | 411 ++++ src/Model/GroundWaterEnergy/gwe1dis1idm.f90 | 313 +++ src/Model/GroundWaterEnergy/gwe1disu1idm.f90 | 618 +++++ src/Model/GroundWaterEnergy/gwe1disv1idm.f90 | 460 ++++ src/Model/GroundWaterEnergy/gwe1esl1.f90 | 296 +++ src/Model/GroundWaterEnergy/gwe1est1.f90 | 912 ++++++++ src/Model/GroundWaterEnergy/gwe1ic1idm.f90 | 79 + src/Model/GroundWaterEnergy/gwe1idm.f90 | 196 ++ src/Model/GroundWaterEnergy/gwe1lke1.f90 | 1241 ++++++++++ src/Model/GroundWaterEnergy/gwe1mwe1.f90 | 1018 ++++++++ src/Model/GroundWaterEnergy/gwe1sfe1.f90 | 1149 +++++++++ src/Model/GroundWaterEnergy/gwe1uze1.f90 | 1395 +++++++++++ src/Model/GroundWaterTransport/gwt1.f90 | 3 +- src/Model/GroundWaterTransport/gwt1cnc1.f90 | 3 + src/Model/GroundWaterTransport/gwt1dsp1.f90 | 2 +- src/Model/GroundWaterTransport/gwt1lkt1.f90 | 3 +- src/Model/GroundWaterTransport/gwt1mwt1.f90 | 3 +- src/Model/GroundWaterTransport/gwt1sft1.f90 | 3 +- src/Model/GroundWaterTransport/gwt1uzt1.f90 | 3 +- .../ModelUtilities/FlowModelInterface.f90 | 14 +- src/Model/ModelUtilities/GweCndOptions.f90 | 12 + src/Model/ModelUtilities/GweInputData.f90 | 211 ++ .../ModelUtilities/ModelPackageInput.f90 | 16 + src/Model/ModelUtilities/Xt3dInterface.f90 | 2 +- src/Model/TransportModel/tsp1.f90 | 87 +- src/Model/TransportModel/tsp1apt1.f90 | 33 +- src/Model/TransportModel/tsp1fmi1.f90 | 155 +- src/Model/TransportModel/tsp1ic1.f90 | 3 + src/Model/TransportModel/tsp1ssm1.f90 | 3 +- src/SimulationCreate.f90 | 26 + src/Utilities/Idm/selector/IdmDfnSelector.f90 | 13 + .../Idm/selector/IdmExgDfnSelector.f90 | 22 + .../Idm/selector/IdmGweDfnSelector.f90 | 160 ++ src/meson.build | 27 + utils/idmloader/scripts/dfn2f90.py | 143 +- 232 files changed, 34486 insertions(+), 1239 deletions(-) create mode 100644 autotest/test_gwe_cnd.py create mode 100644 autotest/test_gwe_drycell_cnd0.py create mode 100644 autotest/test_gwe_drycell_cnd1.py create mode 100644 autotest/test_gwe_drycell_cnd2.py create mode 100644 autotest/test_gwe_esl01.py create mode 100644 autotest/test_gwe_esl02.py create mode 100644 autotest/test_gwe_esl_analyt_sln.py create mode 100644 autotest/test_gwe_lke_conduction.py create mode 100644 autotest/test_gwe_mwe_conduction.py create mode 100644 autotest/test_gwe_sfe_strmbedcond.py create mode 100644 autotest/test_gwe_stallman.py create mode 100644 autotest/test_gwe_uze00.py create mode 100644 autotest/test_gwe_vs_gwt.py create mode 100644 autotest/test_gwegwe_exchng_with_comp2gwt.py create mode 100644 doc/Common/gwe-ctpobs.tex create mode 100644 doc/Common/gwe-eslobs.tex create mode 100644 doc/Common/gwe-esrobs.tex create mode 100644 doc/Common/gwe-gweobs.tex create mode 100644 doc/Common/gwe-lkeobs.tex create mode 100644 doc/Common/gwe-mweobs.tex create mode 100644 doc/Common/gwe-obs.tex create mode 100644 doc/Common/gwe-obstypetable.tex create mode 100644 doc/Common/gwe-sfeobs.tex create mode 100644 doc/Common/gwe-uzeobs.tex create mode 100644 doc/mf6io/gwe/adv.tex create mode 100644 doc/mf6io/gwe/cnd.tex create mode 100644 doc/mf6io/gwe/ctp.tex create mode 100644 doc/mf6io/gwe/esl.tex create mode 100644 doc/mf6io/gwe/est.tex create mode 100644 doc/mf6io/gwe/fmi.tex create mode 100644 doc/mf6io/gwe/gwe-gwe.tex create mode 100644 doc/mf6io/gwe/gwe-obs.tex create mode 100644 doc/mf6io/gwe/gwe.tex create mode 100644 doc/mf6io/gwe/ic.tex create mode 100644 doc/mf6io/gwe/lke.tex create mode 100644 doc/mf6io/gwe/mwe.tex create mode 100644 doc/mf6io/gwe/namefile.tex create mode 100644 doc/mf6io/gwe/oc.tex create mode 100644 doc/mf6io/gwe/sfe.tex create mode 100644 doc/mf6io/gwe/ssm.tex create mode 100644 doc/mf6io/gwe/uze.tex create mode 100644 doc/mf6io/mf6ivar/dfn/exg-gwegwe.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/exg-gwfgwe.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-adv.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-ctp.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-dis.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-disu.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-disv.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-esl.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-est.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-fmi.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-ic.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-lke.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-mwe.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-nam.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-oc.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-sfe.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-ssm.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-uze.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/utl-spt.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/utl-spta.dfn create mode 100644 doc/mf6io/mf6ivar/examples/exg-gwegwe-example-obs.dat create mode 100644 doc/mf6io/mf6ivar/examples/exg-gwegwe-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-adv-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-cnd-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-ctp-example-obs.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-ctp-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-esl-example-obs.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-esl-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-est-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-fmi-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-ic-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-lke-example-obs.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-lke-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-mwe-example-obs.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-mwe-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-nam-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-oc-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-sfe-example-obs.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-sfe-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-ssm-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-uze-example-obs.dat create mode 100644 doc/mf6io/mf6ivar/examples/gwe-uze-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/utl-obs-gwe-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/utl-spt-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/utl-spta-example.dat create mode 100644 doc/mf6io/mf6ivar/tex/exg-gwegwe-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/exg-gwegwe-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/exg-gwegwe-exchangedata.dat create mode 100644 doc/mf6io/mf6ivar/tex/exg-gwegwe-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/exg-gwfgwe-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-adv-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-adv-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-cnd-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-cnd-griddata.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-cnd-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-ctp-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-ctp-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-ctp-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-ctp-period.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-dis-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-dis-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-dis-griddata.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-dis-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-disu-cell2d.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-disu-connectiondata.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-disu-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-disu-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-disu-griddata.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-disu-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-disu-vertices.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-disv-cell2d.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-disv-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-disv-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-disv-griddata.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-disv-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-disv-vertices.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-esl-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-esl-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-esl-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-esl-period.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-est-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-est-griddata.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-est-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-est-packagedata.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-fmi-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-fmi-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-fmi-packagedata.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-ic-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-ic-griddata.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-lke-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-lke-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-lke-packagedata.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-lke-period.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-mwe-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-mwe-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-mwe-packagedata.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-mwe-period.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-nam-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-nam-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-nam-packages.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-oc-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-oc-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-oc-period.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-sfe-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-sfe-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-sfe-packagedata.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-sfe-period.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-ssm-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-ssm-fileinput.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-ssm-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-ssm-sources.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-uze-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-uze-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-uze-packagedata.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-uze-period.dat create mode 100644 doc/mf6io/mf6ivar/tex/utl-spt-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/utl-spt-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/utl-spt-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/utl-spt-period.dat create mode 100644 doc/mf6io/mf6ivar/tex/utl-spta-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/utl-spta-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/utl-spta-period.dat create mode 100644 doc/mf6io/obs/obs-gwe.tex create mode 100644 doc/mf6io/usgs.bst create mode 100644 src/Distributed/VirtualGweExchange.f90 create mode 100644 src/Distributed/VirtualGweModel.f90 create mode 100644 src/Exchange/GweGweExchange.f90 create mode 100644 src/Exchange/GwfGweExchange.f90 create mode 100644 src/Exchange/gwegweidm.f90 create mode 100644 src/Exchange/gwfgweidm.f90 create mode 100644 src/Model/Connection/GweGweConnection.f90 create mode 100644 src/Model/Connection/GweInterfaceModel.f90 create mode 100644 src/Model/GroundWaterEnergy/gwe1.f90 create mode 100644 src/Model/GroundWaterEnergy/gwe1cnd1.f90 create mode 100644 src/Model/GroundWaterEnergy/gwe1cnd1idm.f90 create mode 100644 src/Model/GroundWaterEnergy/gwe1ctp1.f90 create mode 100644 src/Model/GroundWaterEnergy/gwe1ctp1idm.f90 create mode 100644 src/Model/GroundWaterEnergy/gwe1dis1idm.f90 create mode 100644 src/Model/GroundWaterEnergy/gwe1disu1idm.f90 create mode 100644 src/Model/GroundWaterEnergy/gwe1disv1idm.f90 create mode 100644 src/Model/GroundWaterEnergy/gwe1esl1.f90 create mode 100644 src/Model/GroundWaterEnergy/gwe1est1.f90 create mode 100644 src/Model/GroundWaterEnergy/gwe1ic1idm.f90 create mode 100644 src/Model/GroundWaterEnergy/gwe1idm.f90 create mode 100644 src/Model/GroundWaterEnergy/gwe1lke1.f90 create mode 100644 src/Model/GroundWaterEnergy/gwe1mwe1.f90 create mode 100644 src/Model/GroundWaterEnergy/gwe1sfe1.f90 create mode 100644 src/Model/GroundWaterEnergy/gwe1uze1.f90 create mode 100644 src/Model/ModelUtilities/GweCndOptions.f90 create mode 100644 src/Model/ModelUtilities/GweInputData.f90 create mode 100644 src/Utilities/Idm/selector/IdmGweDfnSelector.f90 diff --git a/autotest/test_gwe_cnd.py b/autotest/test_gwe_cnd.py new file mode 100644 index 00000000000..967e59859d5 --- /dev/null +++ b/autotest/test_gwe_cnd.py @@ -0,0 +1,495 @@ +""" +Test problem for GWE + +One-Dimensional Transport in a Uniform Flow Field. +The purpose of this script is to test the new heat transport model developed +for MODFLOW 6. To that end, this problem uses the setup of the first MT3DMS +test problem but adapts it for heat. MODFLOW 6 is setup using the new GWE +model with input parameters entered in their native units. + +It may be possible to find a 1D heat transport analytical solution in the +future. +""" + +# Imports + +import os +import numpy as np +import pytest + +try: + import pymake +except: + msg = "Error. Pymake package is not available.\n" + msg += "Try installing using the following command:\n" + msg += " pip install https://github.com/modflowpy/pymake/zipball/master" + raise Exception(msg) + +try: + import flopy +except: + msg = "Error. FloPy package is not available.\n" + msg += "Try installing using the following command:\n" + msg += " pip install flopy" + raise Exception(msg) + + +from framework import TestFramework + +# Base simulation and model name and workspace + +viscosity_on = [False] +cases = ["cnd01"] + +# Model units + +length_units = "meters" +time_units = "days" + +# Table MODFLOW 6 GWE comparison to MT3DMS + +nper = 1 # Number of periods +nlay = 1 # Number of layers +ncol = 101 # Number of columns +nrow = 1 # Number of rows +delr = 10.0 # Column width ($m$) +delc = 1.0 # Row width ($m$) +top = 0.0 # Top of the model ($m$) +botm = -1.0 # Layer bottom elevations ($m$) +prsity = 0.25 # Porosity +perlen = 2000 # Simulation time ($days$) +k11 = 1.0 # Horizontal hydraulic conductivity ($m/d$) + +# Set some static model parameter values + +k33 = k11 # Vertical hydraulic conductivity ($m/d$) +laytyp = 1 +nstp = 100.0 +dt0 = perlen / nstp +Lx = (ncol - 1) * delr +v = 0.24 +q = v * prsity +h1 = q * Lx +strt = np.zeros((nlay, nrow, ncol), dtype=float) +strt[0, 0, 0] = h1 # Starting head ($m$) +l = 1000.0 # Needed for plots +icelltype = 1 # Cell conversion type +ibound = np.ones((nlay, nrow, ncol), dtype=int) +ibound[0, 0, 0] = -1 +ibound[0, 0, -1] = -1 + +# Set some static transport related model parameter values + +mixelm = 0 # FD +rhob = 1110.0 +sp2 = 0.0 # read, but not used in this problem +kd = 1.8168e-4 +strt_temp = np.zeros((nlay, nrow, ncol), dtype=float) +dispersivity = 1.0 +dmcoef = 3.2519e-7 # Molecular diffusion coefficient + +# Set some static heat transport related model parameter values +cpw = 4183.0 +rhow = 1000.0 +lhv = 2454.0 + +# Set solver parameter values (and related) +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-6, 1e-6, 1.0 +ttsmult = 1.0 +dceps = 1.0e-5 # HMOC parameters in case they are invoked +nplane = 1 # HMOC +npl = 0 # HMOC +nph = 4 # HMOC +npmin = 0 # HMOC +npmax = 8 # HMOC +nlsink = nplane # HMOC +npsink = nph # HMOC + +# Static temporal data used by TDIS file + +tdis_rc = [] +tdis_rc.append((perlen, nstp, 1.0)) + +# ### Create MODFLOW 6 GWE MT3DMS Example 1 Boundary Conditions +# +# Constant head cells are specified on both ends of the model + +chdspd = [[(0, 0, 0), h1], [(0, 0, ncol - 1), 0.0]] +c0 = 40.0 +ctpspd = [[(0, 0, 0), c0]] + + +def build_models(idx, test): + # Base MF6 GWE model type + ws = test.workspace + name = cases[idx] + + print("Building MF6 model...()".format(name)) + + # generate names for each model + gwfname = "gwf-" + name + gwename = "gwe-" + name + + sim_ws = os.path.join(ws, name) + sim = flopy.mf6.MFSimulation( + sim_name=name, sim_ws=ws, exe_name="mf6", version="mf6" + ) + + # Instantiating MODFLOW 6 time discretization + flopy.mf6.ModflowTdis( + sim, nper=nper, perioddata=tdis_rc, time_units=time_units + ) + + # Instantiating MODFLOW 6 groundwater flow model + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=gwfname, + save_flows=True, + model_nam_file="{}.nam".format(gwfname), + ) + + # Instantiating MODFLOW 6 solver for flow model + imsgwf = 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, + filename="{}.ims".format(gwfname), + ) + sim.register_ims_package(imsgwf, [gwfname]) + + # Instantiating MODFLOW 6 discretization package + flopy.mf6.ModflowGwfdis( + gwf, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=np.ones((nlay, nrow, ncol), dtype=int), + filename="{}.dis".format(gwfname), + ) + + # Instantiating MODFLOW 6 node-property flow package + flopy.mf6.ModflowGwfnpf( + gwf, + save_flows=False, + icelltype=icelltype, + k=k11, + k33=k33, + save_specific_discharge=True, + filename="{}.npf".format(gwfname), + ) + + # Instantiating MODFLOW 6 initial conditions package for flow model + flopy.mf6.ModflowGwfic(gwf, strt=strt, filename="{}.ic".format(gwfname)) + + # Instantiating VSC + if viscosity_on[idx]: + # Instantiate viscosity (VSC) package + vsc_filerecord = "{}.vsc.bin".format(gwfname) + vsc_pd = [(0, 0.0, 20.0, gwename, "temperature")] + flopy.mf6.ModflowGwfvsc( + gwf, + viscref=8.904e-4, + viscosity_filerecord=vsc_filerecord, + thermal_formulation="nonlinear", + thermal_a2=10.0, + thermal_a3=248.37, + thermal_a4=133.16, + nviscspecies=len(vsc_pd), + packagedata=vsc_pd, + pname="vsc", + filename="{}.vsc".format(gwfname), + ) + + # Instantiating MODFLOW 6 constant head package + flopy.mf6.ModflowGwfchd( + gwf, + maxbound=len(chdspd), + stress_period_data=chdspd, + save_flows=False, + pname="CHD-1", + filename="{}.chd".format(gwfname), + ) + + # Instantiating MODFLOW 6 output control package for flow model + flopy.mf6.ModflowGwfoc( + gwf, + head_filerecord="{}.hds".format(gwfname), + budget_filerecord="{}.cbc".format(gwfname), + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + printrecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + ) + + # Instantiating MODFLOW 6 groundwater transport package + gwe = flopy.mf6.MFModel( + sim, + model_type="gwe6", + modelname=gwename, + model_nam_file="{}.nam".format(gwename), + ) + gwe.name_file.save_flows = True + imsgwe = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwename), + ) + sim.register_ims_package(imsgwe, [gwe.name]) + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwedis( + gwe, + nogrb=True, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=1, + filename="{}.dis".format(gwename), + ) + + # Instantiating MODFLOW 6 transport initial concentrations + flopy.mf6.ModflowGweic( + gwe, strt=strt_temp, filename="{}.ic".format(gwename) + ) + + # Instantiating MODFLOW 6 transport advection package + if mixelm == 0: + scheme = "UPSTREAM" + elif mixelm == -1: + scheme = "TVD" + else: + raise Exception() + flopy.mf6.ModflowGweadv( + gwe, scheme=scheme, filename="{}.adv".format(gwename) + ) + + # Instantiating MODFLOW 6 transport dispersion package + if dispersivity != 0: + flopy.mf6.ModflowGwecnd( + gwe, + xt3d_off=True, + alh=dispersivity, + ath1=dispersivity, + ktw=0.5918, + kts=0.2700, + filename="{}.cnd".format(gwename), + ) + + # Instantiating MODFLOW 6 transport mass storage package (formerly "reaction" package in MT3DMS) + flopy.mf6.ModflowGweest( + gwe, + save_flows=True, + porosity=prsity, + cps=760.0, + rhos=1500.0, + packagedata=[cpw, rhow, lhv], + filename="{}.est".format(gwename), + ) + + # Instantiating MODFLOW 6 transport constant concentration package + flopy.mf6.ModflowGwectp( + gwe, + maxbound=len(ctpspd), + stress_period_data=ctpspd, + save_flows=False, + pname="CTP-1", + filename="{}.ctp".format(gwename), + ) + + # Instantiating MODFLOW 6 transport source-sink mixing package + flopy.mf6.ModflowGwessm( + gwe, sources=[[]], filename="{}.ssm".format(gwename) + ) + + # Instantiate MODFLOW 6 heat transport output control package + flopy.mf6.ModflowGweoc( + gwe, + budget_filerecord="{}.cbc".format(gwename), + temperature_filerecord="{}.ucn".format(gwename), + temperatureprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + printrecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + ) + + # Instantiating MODFLOW 6 flow-transport exchange mechanism + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname, + exgmnameb=gwename, + filename="{}.gwfgwe".format(name), + ) + + return sim, None + + +def check_output(idx, test): + print("evaluating results...") + + # read transport results from GWE model + name = cases[idx] + gwename = "gwe-" + name + + fpth = os.path.join(test.workspace, f"{gwename}.ucn") + try: + # load temperatures + cobj = flopy.utils.HeadFile( + fpth, precision="double", text="TEMPERATURE" + ) + conc1 = cobj.get_alldata() + except: + assert False, f'could not load concentration data from "{fpth}"' + + # This is the answer + c_ans = [ + 4.00000000e01, + 3.99999983e01, + 3.99999898e01, + 3.99999566e01, + 3.99998462e01, + 3.99995197e01, + 3.99986427e01, + 3.99964775e01, + 3.99915230e01, + 3.99809477e01, + 3.99597839e01, + 3.99198995e01, + 3.98488519e01, + 3.97288247e01, + 3.95359427e01, + 3.92403042e01, + 3.88070317e01, + 3.81985089e01, + 3.73777505e01, + 3.63125911e01, + 3.49801399e01, + 3.33708033e01, + 3.14911723e01, + 2.93652158e01, + 2.70334931e01, + 2.45504338e01, + 2.19800532e01, + 1.93907148e01, + 1.68496655e01, + 1.44180473e01, + 1.21469471e01, + 1.00748333e01, + 8.22648357e00, + 6.61329449e00, + 5.23470060e00, + 4.08034410e00, + 3.13261741e00, + 2.36924164e00, + 1.76562010e00, + 1.29679741e00, + 9.38944408e-01, + 6.70362685e-01, + 4.72056032e-01, + 3.27947150e-01, + 2.24829892e-01, + 1.52144844e-01, + 1.01654320e-01, + 6.70766201e-02, + 4.37223104e-02, + 2.81598160e-02, + 1.79249349e-02, + 1.12795213e-02, + 7.01828727e-03, + 4.31895689e-03, + 2.62924728e-03, + 1.58374083e-03, + 9.44125798e-04, + 5.57133590e-04, + 3.25507431e-04, + 1.88330495e-04, + 1.07925092e-04, + 6.12700035e-05, + 3.44648666e-05, + 1.92125906e-05, + 1.06157638e-05, + 5.81494908e-06, + 3.15821246e-06, + 1.70101068e-06, + 9.08679391e-07, + 4.81524218e-07, + 2.53159103e-07, + 1.32068539e-07, + 6.83748562e-08, + 3.51353218e-08, + 1.79225415e-08, + 9.07652498e-09, + 4.56413759e-09, + 2.27913640e-09, + 1.13033292e-09, + 5.56823550e-10, + 2.72491770e-10, + 1.32483548e-10, + 6.40015158e-11, + 3.07244529e-11, + 1.46584603e-11, + 6.95098705e-12, + 3.27643160e-12, + 1.53530190e-12, + 7.15261898e-13, + 3.31325318e-13, + 1.52616350e-13, + 6.99104644e-14, + 3.18504005e-14, + 1.44329547e-14, + 6.50576657e-15, + 2.91728603e-15, + 1.30145909e-15, + 5.77678170e-16, + 2.55141072e-16, + 1.12178999e-16, + 5.01900830e-17, + ] + + msg = f"gwe temperatures do not match stored concentrations" + assert np.allclose(conc1[-1, 0, 0, :], c_ans, atol=1e-5), msg + + +# - No need to change any code below +@pytest.mark.parametrize( + "idx, name", + list(enumerate(cases)), +) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + targets=targets, + ) + test.run() diff --git a/autotest/test_gwe_drycell_cnd0.py b/autotest/test_gwe_drycell_cnd0.py new file mode 100644 index 00000000000..8ab3e9ac7e6 --- /dev/null +++ b/autotest/test_gwe_drycell_cnd0.py @@ -0,0 +1,423 @@ +""" +Test problem for GWE + +Test the energy "flowing" through a dry cell. The test checks for +some of the flow-through energy being left behind and warming the +cell it passes through. Based on the model appearing in the +MT3D-USGS documention, pages 13-14. Dry cell is in layer 1, row 1 +column 4. + + +-------+-------+-------+-------+-------+-------+ + -> | -> | | | DRY | | | + | | -> | | CELL| | | + | | | -> -+-> | | | | + +-------+-------+-------+---+---+-------+-------+ + | | | | v | | | + -> | -> | -> | -> | -> | -> | -> | -> + | | | | | | | + +-------+-------+-------+-------+-------+-------+ + + ---> Direction of flow ---> +""" + +# Imports + +import os + +import numpy as np +import pytest +import flopy + +from framework import TestFramework + +# Base simulation and model name and workspace + +scheme = "UPSTREAM" +# scheme = "TVD" + +cases = ["drycell0"] + +# Model units +length_units = "meters" +time_units = "days" + +# Table MODFLOW 6 GWE comparison to MT3DMS + +nrow = 1 +ncol = 6 +nlay = 2 +delr = 10.0 # Column width ($m$) +delc = 10.0 # Row width ($m$) +top = 20.0 # Top of model +k11 = 100.0 # Horizontal hydraulic conductivity ($m/d$) +ss = 1e-6 # Specific storage +sy = 0.20 # Specific Yield +prsity = 0.20 # Porosity +nper = 2 # Number of periods +perlen = [1, 100] # Simulation time ($days$) +nstp = [1, 10] # 10 day transient time steps +steady = {0: True, 1: False} +transient = {0: False, 1: True} + +# Set some static model parameter values + +k33 = k11 # Vertical hydraulic conductivity ($m/d$) +idomain = 1 # All cells included in the simulation +iconvert = 1 # All cells are convertible + +icelltype = 1 # Cell conversion type (>1: unconfined) + +# Set some static transport related model parameter values +botm = [] +botm.append(np.ones((nrow, ncol), dtype=float) * 10) +botm.append(np.zeros((nrow, ncol), dtype=float)) +botm = np.array(botm) + +# GWE related parameters +rhow = 1000.0 +cpw = 4183.0 +lhv = 2454.0 + +# Head input +left_hd = 15.0 +right_hd = 2.0 +strt_hd1 = np.ones((nrow, ncol), dtype=float) * 11.0 +strt_hd2 = np.ones((nrow, ncol), dtype=float) * 11.0 +strt_hd1[0] = strt_hd2[0] = left_hd +strt_hd1[-1] = strt_hd2[-1] = right_hd +strt_hd = np.array([strt_hd1, strt_hd2]) +strt_temp = 10.0 + +chd_data = {} +chd_data[0] = [ + [(0, 0, 0), left_hd], + [(1, 0, 0), left_hd], + [(1, 0, ncol - 1), right_hd], +] +chd_mf6 = chd_data + +dispersivity = 0.0 # dispersion (remember, 1D model) + +# Set solver parameter values (and related) +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-10, 1e-10, 1.0 +ttsmult = 1.0 + +# Set up temporal data used by TDIS file +tdis_rc = [] +for i in np.arange(nper): + tdis_rc.append((perlen[i], nstp[i], ttsmult)) + +# ### Generate MODFLOW 6 Example test model +# + + +def build_models(idx, test): + # Base MF6 GWF model type + ws = test.workspace + name = cases[idx] + + print("Building MF6 model...()".format(name)) + + # generate names for each model + gwfname = "gwf-" + name + gwename1 = "gwe-" + name + + sim = flopy.mf6.MFSimulation( + sim_name=name, sim_ws=ws, exe_name="mf6", version="mf6" + ) + + # Instantiating MODFLOW 6 time discretization + flopy.mf6.ModflowTdis( + sim, nper=nper, perioddata=tdis_rc, time_units=time_units + ) + + # Instantiating MODFLOW 6 groundwater flow model + gwf = flopy.mf6.ModflowGwf( + sim, + newtonoptions="UNDER_RELAXATION", + modelname=gwfname, + save_flows=True, + model_nam_file="{}.nam".format(gwfname), + ) + + # Instantiating MODFLOW 6 solver for flow model + imsgwf = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwfname), + ) + sim.register_ims_package(imsgwf, [gwfname]) + + # Instantiating MODFLOW 6 discretization package + flopy.mf6.ModflowGwfdis( + gwf, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=np.ones((nlay, nrow, ncol)), + pname="DIS-1", + filename="{}.dis".format(gwfname), + ) + + # Instantiating MODFLOW 6 storage package + flopy.mf6.ModflowGwfsto( + gwf, + ss=ss, + sy=sy, + iconvert=iconvert, + steady_state=steady, + transient=transient, + pname="STO", + filename="{}.sto".format(gwfname), + ) + + # Instantiating MODFLOW 6 node-property flow package + flopy.mf6.ModflowGwfnpf( + gwf, + save_flows=True, + icelltype=icelltype, + k=k11, + k33=k33, + alternative_cell_averaging="AMT-HMK", + save_specific_discharge=True, + pname="NPF-1", + filename="{}.npf".format(gwfname), + ) + + # Instantiating MODFLOW 6 constant head package + flopy.mf6.ModflowGwfchd( + gwf, + stress_period_data=chd_mf6, + filename="{}.chd".format(gwfname), + ) + + # Instantiating MODFLOW 6 initial conditions package for flow model + flopy.mf6.ModflowGwfic(gwf, strt=strt_hd, filename="{}.ic".format(gwfname)) + + # Instantiating MODFLOW 6 output control package for flow model + flopy.mf6.ModflowGwfoc( + gwf, + pname="OC-1", + head_filerecord="{}.hds".format(gwfname), + budget_filerecord="{}.cbc".format(gwfname), + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + printrecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + ) + + # ---------------------------------------------------- + # Instantiating MODFLOW 6 GWE model + # ---------------------------------------------------- + gwe1 = flopy.mf6.ModflowGwe( + sim, modelname=gwename1, model_nam_file="{}.nam".format(gwename1) + ) + gwe1.name_file.save_flows = True + imsgwe1 = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwename1), + ) + sim.register_ims_package(imsgwe1, [gwe1.name]) + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwedis( + gwe1, + nogrb=True, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=1, + pname="DIS-2", + filename="{}.dis".format(gwename1), + ) + + # Instantiating MODFLOW 6 transport initial concentrations + flopy.mf6.ModflowGweic( + gwe1, strt=strt_temp, pname="IC-2", filename="{}.ic".format(gwename1) + ) + + # Instantiating MODFLOW 6 transport advection package + flopy.mf6.ModflowGweadv( + gwe1, scheme=scheme, pname="ADV-2", filename="{}.adv".format(gwename1) + ) + + # Instantiating MODFLOW 6 transport dispersion package + flopy.mf6.ModflowGwecnd( + gwe1, + xt3d_off=False, + alh=dispersivity, + ath1=dispersivity, + ktw=0.5918 * 86400, + # ktw=0.0, + kts=0.2700 * 86400, + # kts=0.0, + pname="CND-2", + filename="{}.cnd".format(gwename1), + ) + + # Instantiating MODFLOW 6 transport mass storage package (formerly "reaction" package in MT3DMS) + flopy.mf6.ModflowGweest( + gwe1, + save_flows=True, + porosity=prsity, + cps=760.0, + rhos=1500.0, + packagedata=[cpw, rhow, lhv], + pname="EST-2", + filename="{}.est".format(gwename1), + ) + + # Instantiating MODFLOW 6 heat transport source-sink mixing package + flopy.mf6.ModflowGwessm( + gwe1, sources=[[]], pname="SSM-2", filename="{}.ssm".format(gwename1) + ) + + # Instantiate MODFLOW 6 heat transport output control package + flopy.mf6.ModflowGweoc( + gwe1, + pname="OC-2", + budget_filerecord="{}.cbc".format(gwename1), + temperature_filerecord="{}.ucn".format(gwename1), + temperatureprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + printrecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + ) + + # Instantiate a constant temperature in 1 of the dry cells + ctmpspd = { + 0: [[(0, 0, 0), strt_temp], [(1, 0, 0), strt_temp]], + 1: [[(0, 0, 0), strt_temp + 10], [(1, 0, 0), strt_temp + 10]], + } + flopy.mf6.ModflowGwectp( + gwe1, + stress_period_data=ctmpspd, + pname="CTP-2", + filename="{}.ctmp".format(gwename1), + ) + + # Instantiating MODFLOW 6 flow-transport exchange mechanism + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname, + exgmnameb=gwename1, + pname="GWFGWE1", + filename="{}.gwfgwe1".format(gwename1), + ) + + return sim, None + + +def check_output(idx, test): + print("evaluating results...") + + # read transport results from GWE model + name = cases[idx] + gwename = "gwe-" + name + + fpth = os.path.join(test.workspace, f"{gwename}.ucn") + try: + # load temperatures + cobj = flopy.utils.HeadFile( + fpth, precision="double", text="TEMPERATURE" + ) + conc1 = cobj.get_alldata() + except: + assert False, f'could not load temperature data from "{fpth}"' + + # Check that the two perpetually dry cells: + # 1) after warming begins (2nd stress period onward), should be greater + # than their initial condition + msg0 = "There should be warming in a dry cell via conduction" + assert np.all(conc1[1:, 0, 0, 4] > 10.0), msg0 + assert np.all(conc1[1:, 0, 0, 5] > 10.0), msg0 + + msg1 = ( + "Cell at 1, 1, 5 should be warmer than the cell at 1, 1, 6 " + "throughout the simulation by virtue of it being physically " + "upstream" + ) + assert np.all(conc1[1:, 0, 0, 4] > conc1[1:, 0, 0, 5]), msg1 + + # 2) monotonically increase from being in contact with the warmer + # water passing by the cells below + msg2 = ( + "Perpetually dry cell should be steadily warming as a result of it " + "being in contact with warming cell below it." + ) + assert np.all(np.diff(conc1[:, 0, 0, 5]) > 0), msg2 + assert np.all(np.diff(conc1[:, 0, 0, 4]) > 0), msg2 + + # Because this is a steady flow problem, the largest incremental warming + # increments happen in the first two stress periods. After that, the amount + # of warming from time step to time step decreases. + msg3 = ( + "After the first two stress periods, the relative amount of " + "warming in layer 1, row 1, and column 4 should slow, but isn't" + ) + assert np.all(np.diff(np.diff(conc1[2:, 0, 0, 4])) < 0), msg3 + + # The 'pass-through' cell (layer 1, row 1, column 4 - see diagram at top + # of script) should be warming more than its two neighbors to the right. + msg4 = ( + "Pass through cell should be warming up at a higher rate than " + "the dry cells." + ) + assert np.all(conc1[:, 0, 0, 3] > conc1[:, 0, 0, 4]), msg4 + + # Pass through cell should not be as warm as the cell from which it + # receives water, since that cell will have already robbed the water + # passing through of some of its heat + msg5 = ( + "Pass through cell should not be as warm as its neighbor to " + "the left" + ) + assert np.all(conc1[:, 0, 0, 2] > conc1[:, 0, 0, 3]), msg5 + + +# - No need to change any code below +@pytest.mark.parametrize( + "idx, name", + list(enumerate(cases)), +) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/autotest/test_gwe_drycell_cnd1.py b/autotest/test_gwe_drycell_cnd1.py new file mode 100644 index 00000000000..638cb17b884 --- /dev/null +++ b/autotest/test_gwe_drycell_cnd1.py @@ -0,0 +1,484 @@ +""" +Test problem for GWE + +Test the energy "flowing" between two dry cells via conduction +only using a temperature gradient + + ~: Represents conduction + + A) 1st model configuration + + +---------+---------+ + | |~ | + | |~ | + +---------+---------+ + + B) 2nd model configuration + + +---------+ + | | + | ~ ~ | + +---------+ + | | + | | + +---------+ + + C) 3rd model configuration + + +---------+ + +---------+ | + | |~ | + | +---------+ + +---------+ +""" + +# Imports + +import os +import numpy as np +import pytest +import flopy + +from framework import TestFramework + + +# Monotonicity function +def isMonotonic(A): + x, y = [], [] + x.extend(A) + y.extend(A) + x.sort() + y.sort(reverse=True) + if np.all(x == A) or np.all(y == A): + return True + return False + + +# Base simulation and model name and workspace + +scheme = "UPSTREAM" +# scheme = "TVD" + +cases = [ + "drycell2-a", # 2-cell model, horizontally connected with tops and bots aligned + "drycell2-b", # 2-cell model, vertically connected + "drycell2-c", # 2-cell model, horizontally connected with staggered alignment (reduced shared cell face area) +] + +conn_types = ( + "horizontal", + "vertical", + "staggered", +) + +dis_data = { + conn_types[0]: { + "nrow": 1, + "ncol": 2, + "nlay": 1, + "top": np.ones(2, dtype=float), + "bot": np.zeros(2, dtype=float), + "strthd": np.zeros(2, dtype=float), + }, + conn_types[1]: { + "nrow": 1, + "ncol": 1, + "nlay": 2, + "top": 2, + "bot": np.array([[[1.0]], [[0.0]]], dtype=float), + "strthd": np.zeros(2, dtype=float), + }, + conn_types[2]: { + "nrow": 2, + "ncol": 1, + "nlay": 1, + "top": np.array([[[1.0], [1.5]]], dtype=float), + "bot": np.array([[[0.0], [0.5]]], dtype=float), + "strthd": -1 * np.ones(2, dtype=float), + }, +} + +# Model units +length_units = "meters" +time_units = "days" + +# Table MODFLOW 6 GWE comparison to MT3DMS + +delr = 1.0 # Column width ($m$) +delc = 1.0 # Row width ($m$) +k11 = 1.0 # Horizontal hydraulic conductivity ($m/d$) +ss = 1e-6 # Specific storage +sy = 0.20 # Specific Yield +prsity = 0.20 # Porosity +nper = 4 # Number of periods +perlen = [1, 1000, 1, 1000] # Simulation time ($days$) +nstp = [1, 10, 1, 10] # 10 day transient time steps +steady = {0: False} +transient = {0: True} + +# Set some static model parameter values + +k33 = k11 # Vertical hydraulic conductivity ($m/d$) +idomain = 1 # All cells included in the simulation +iconvert = 1 # All cells are convertible + +icelltype = 1 # Cell conversion type (>1: unconfined) + +# Set some static transport related model parameter values +strt_temp1 = 4.0 +strt_temp2 = 34.0 +dispersivity = 0.0 # dispersion (remember, 1D model) + +# GWE related parameters +rhow = 1000.0 +cpw = 4183.0 +lhv = 2454.0 + +# Set solver parameter values (and related) +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-10, 1e-10, 1.0 +ttsmult = 1.0 + +# Set up temporal data used by TDIS file +tdis_rc = [] +for i in np.arange(nper): + tdis_rc.append((perlen[i], nstp[i], ttsmult)) + +# ### Create MODFLOW 6 GWE MT3DMS Example 1 Boundary Conditions +# +# No GWF, only Heat conduction simulated + + +def build_models(idx, test): + conn_type = conn_types[idx] + + # Base MF6 GWF model type + ws = test.workspace + name = cases[idx] + + print("Building MF6 model...()".format(name)) + + # generate names for each model + gwfname = "gwf-" + name + gwename1 = "gwe-" + name + + sim = flopy.mf6.MFSimulation( + sim_name=name, sim_ws=ws, exe_name="mf6", version="mf6" + ) + + # Instantiating MODFLOW 6 time discretization + flopy.mf6.ModflowTdis( + sim, nper=nper, perioddata=tdis_rc, time_units=time_units + ) + + # Instantiating MODFLOW 6 groundwater flow model + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=gwfname, + save_flows=True, + model_nam_file="{}.nam".format(gwfname), + ) + + # Instantiating MODFLOW 6 solver for flow model + imsgwf = 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, + filename="{}.ims".format(gwfname), + ) + sim.register_ims_package(imsgwf, [gwfname]) + + # Instantiating MODFLOW 6 discretization package + flopy.mf6.ModflowGwfdis( + gwf, + length_units=length_units, + nlay=dis_data[conn_type]["nlay"], + nrow=dis_data[conn_type]["nrow"], + ncol=dis_data[conn_type]["ncol"], + delr=delr, + delc=delc, + top=dis_data[conn_type]["top"], + botm=dis_data[conn_type]["bot"], + idomain=np.ones( + ( + dis_data[conn_type]["nlay"], + dis_data[conn_type]["nrow"], + dis_data[conn_type]["ncol"], + ), + dtype=int, + ), + pname="DIS-1", + filename="{}.dis".format(gwfname), + ) + + # Instantiating MODFLOW 6 storage package + flopy.mf6.ModflowGwfsto( + gwf, + ss=ss, + sy=sy, + iconvert=iconvert, + steady_state=steady, + transient=transient, + pname="STO", + filename="{}.sto".format(gwfname), + ) + + # Instantiating MODFLOW 6 node-property flow package + flopy.mf6.ModflowGwfnpf( + gwf, + save_flows=True, + icelltype=icelltype, + k=k11, + k33=k33, + save_specific_discharge=True, + pname="NPF-1", + filename="{}.npf".format(gwfname), + ) + + # Instantiating MODFLOW 6 initial conditions package for flow model + flopy.mf6.ModflowGwfic( + gwf, + strt=dis_data[conn_type]["strthd"], + filename="{}.ic".format(gwfname), + ) + + # Instantiating MODFLOW 6 output control package for flow model + flopy.mf6.ModflowGwfoc( + gwf, + pname="OC-1", + head_filerecord="{}.hds".format(gwfname), + budget_filerecord="{}.cbc".format(gwfname), + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + printrecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + ) + + # ---------------------------------------------------- + # Instantiating MODFLOW 6 GWE model + # ---------------------------------------------------- + gwe1 = flopy.mf6.ModflowGwe( + sim, modelname=gwename1, model_nam_file="{}.nam".format(gwename1) + ) + gwe1.name_file.save_flows = True + imsgwe1 = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwename1), + ) + sim.register_ims_package(imsgwe1, [gwe1.name]) + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwedis( + gwe1, + nogrb=True, + nlay=dis_data[conn_type]["nlay"], + nrow=dis_data[conn_type]["nrow"], + ncol=dis_data[conn_type]["ncol"], + delr=delr, + delc=delc, + top=dis_data[conn_type]["top"], + botm=dis_data[conn_type]["bot"], + idomain=1, + pname="DIS-2", + filename="{}.dis".format(gwename1), + ) + + # Instantiating MODFLOW 6 transport initial concentrations + flopy.mf6.ModflowGweic( + gwe1, strt=strt_temp1, pname="IC-2", filename="{}.ic".format(gwename1) + ) + + # Instantiating MODFLOW 6 transport advection package + flopy.mf6.ModflowGweadv( + gwe1, scheme=scheme, pname="ADV-2", filename="{}.adv".format(gwename1) + ) + + # Instantiating MODFLOW 6 transport dispersion package + flopy.mf6.ModflowGwecnd( + gwe1, + xt3d_off=True, + alh=dispersivity, + ath1=dispersivity, + ktw=0.5918 * 86400, + kts=0.2700 * 86400, + pname="CND-2", + filename="{}.cnd".format(gwename1), + ) + + # Instantiating MODFLOW 6 transport mass storage package (formerly "reaction" package in MT3DMS) + flopy.mf6.ModflowGweest( + gwe1, + save_flows=True, + porosity=prsity, + cps=760.0, + rhos=1500.0, + packagedata=[cpw, rhow, lhv], + pname="EST-2", + filename="{}.est".format(gwename1), + ) + + # Instantiate MODFLOW 6 heat transport output control package + flopy.mf6.ModflowGweoc( + gwe1, + pname="OC-2", + budget_filerecord="{}.cbc".format(gwename1), + temperature_filerecord="{}.ucn".format(gwename1), + temperatureprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + printrecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + ) + + # Instantiate a constant temperature in 1 of the dry cells + ctmpspd = { + 0: [ + [(0, 0, 0), strt_temp1], + [ + ( + dis_data[conn_type]["nlay"] - 1, + dis_data[conn_type]["nrow"] - 1, + dis_data[conn_type]["ncol"] - 1, + ), + strt_temp1 + 10, + ], + ], + 1: [], + 2: [ + [(0, 0, 0), strt_temp2], + [ + ( + dis_data[conn_type]["nlay"] - 1, + dis_data[conn_type]["nrow"] - 1, + dis_data[conn_type]["ncol"] - 1, + ), + strt_temp2 - 10, + ], + ], + 3: [], + } + flopy.mf6.ModflowGwectp( + gwe1, + stress_period_data=ctmpspd, + pname="CTP-2", + filename="{}.ctmp".format(gwename1), + ) + + # Instantiating MODFLOW 6 flow-transport exchange mechanism + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname, + exgmnameb=gwename1, + pname="GWFGWE1", + filename="{}.gwfgwe1".format(gwename1), + ) + + return sim, None + + +def check_output(idx, test): + print("evaluating results...") + + # read transport results from GWE model + name = cases[idx] + gwename = "gwe-" + name + + # All indices are 0 based + # initialize + idxl = 0 + idxr = 0 + idxc = 0 + # override depending on scenario + if idx == 0: + idxc = 1 + + if idx == 1: + idxl = 1 + + if idx == 2: + idxr = 1 + + fpth = os.path.join(test.workspace, f"{gwename}.ucn") + + try: + # load temperatures + cobj = flopy.utils.HeadFile( + fpth, precision="double", text="TEMPERATURE" + ) + conc1 = cobj.get_alldata() + except: + assert False, f'could not load temperature data from "{fpth}"' + + # Ensure constant temperatures are initiated properly in teh 1st and 3rd + # stress periods, which are separated by period of "turning off" the + # constant temperature boundary + msg0 = "Grid cell temperatures do not reflect user-specified difference" + assert conc1[0, 0, 0, 0] + 10.0 == conc1[0, idxl, idxr, idxc], msg0 + assert conc1[11, 0, 0, 0] - 10.0 == conc1[11, idxl, idxr, idxc], msg0 + + # After running transient stress period, temperatures in grid cells + # should equilibrate through the process of conduction only (there + # is no gwf flow) + msg1 = "Grid cell temperatures should have equilabrated via conduction" + assert np.isclose(conc1[10, 0, 0, 0], conc1[10, idxl, idxr, idxc]), msg1 + assert np.isclose(conc1[21, 0, 0, 0], conc1[21, idxl, idxr, idxc]), msg1 + + # Ensure that as the cells equilibrate, they do so in a monotonic manner + msg2 = "There should be a monotonic increase as the 2 cells equilibrate" + msg3 = "There should be a monotonic decrease as the 2 cells equilibrate" + assert isMonotonic(np.diff(conc1[1:11, 0, 0, 0])), msg2 + assert isMonotonic(np.diff(conc1[1:11, idxl, idxr, idxc])), msg3 + assert isMonotonic(np.diff(conc1[12:, 0, 0, 0])), msg3 + assert isMonotonic(np.diff(conc1[12:, idxl, idxr, idxc])), msg2 + + # Ensure that the equilibrated temperature is half the starting difference between the cells + msg4 = ( + "The final equilibrated cell temperature does not split the " + "difference of the starting temperature" + ) + initTdiff1 = abs(conc1[0, 0, 0, 0] - conc1[0, idxl, idxr, idxc]) + initTdiff2 = abs(conc1[11, 0, 0, 0] - conc1[11, idxl, idxr, idxc]) + assert np.isclose( + conc1[10, 0, 0, 0], + conc1[0, 0, 0, 0] + initTdiff1 / 2, + ), msg4 + assert np.isclose( + conc1[21, 0, 0, 0], + conc1[11, 0, 0, 0] - initTdiff2 / 2, + ), msg4 + + +# - No need to change any code below +@pytest.mark.parametrize( + "idx, name", + list(enumerate(cases)), +) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/autotest/test_gwe_drycell_cnd2.py b/autotest/test_gwe_drycell_cnd2.py new file mode 100644 index 00000000000..aaa798c29b9 --- /dev/null +++ b/autotest/test_gwe_drycell_cnd2.py @@ -0,0 +1,669 @@ +""" +Test problem for GWE + +Test conduction from a partially saturated group of cells into their dry +neighbors. Referring to this test as a flowing trough problem. + + + Profile view of columns w/ approximate water table profile shown + +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ + |-------|_______|_______| | | | | | | | | | + | | | |-------|_______| | | | | | | | + | | | | | |-------|_______| | | | | | + | | | | | | | |-------| | | | | + | | | | | | | | |-------| | | | + | | | | | | | | | |-------| | | + | | | | | | | | | | |-------| | + | | | | | | | | | | | |-------| + | | | | | | | | | | | | | + | | | | | | | | | | | | | + | | | | | | | | | | | | | + | | | | | | | | | | | | | + +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ + + ^ + | + v + + Profile view of rows + +-------+-------+ + | | | + | | | <- dry cell that's checked for warming owing to increasing + | v +-------+ temperature of neighboring cell + |-------| <- water table + | | + | | + | | + | | + | | + | | + | | + | | + +-------+ +""" + +# Imports + +import os + +import numpy as np +import pytest +import flopy + +from framework import TestFramework + +# Base simulation and model name and workspace + + +def my_ceil(a, precision=0): + return np.round(a + 0.5 * 10 ** (-precision), precision) + + +def my_floor(a, precision=0): + return np.round(a - 0.5 * 10 ** (-precision), precision) + + +# Monotonicity function +def isMonotonic(A): + x, y = [], [] + x.extend(A) + y.extend(A) + x.sort() + y.sort(reverse=True) + if np.all(x == A) or np.all(y == A): + return True + return False + + +scheme = "UPSTREAM" +# scheme = "TVD" + +cases = ["drycl-cnduct"] + +# Model units +length_units = "meters" +time_units = "days" + +# Table MODFLOW 6 GWE comparison to MT3DMS + +nlay = 1 # Number of layers +ncol = 12 # Number of columns +nrow = 2 # Number of rows +delr = 1.0 # Column width ($m$) +delc = 1.0 # Row width ($m$) +top = 10.0 # Top of the model ($m$) +k11 = 4.61426 # Horizontal hydraulic conductivity ($m/d$) +ss = 1e-6 # Specific storage +sy = 0.20 # Specific Yield +nper = 11 # Number of periods +perlen = 1 # Simulation time ($days$) +nstp = 1 # One day time steps +steady = {0: True, 1: False} +transient = {0: False, 1: True} + + +# Set some static model parameter values +k33 = k11 # Vertical hydraulic conductivity ($m/d$) +idomain = 1 # All cells included in the simulation +iconvert = 1 # All cells are convertible + +bot_r1 = np.zeros(ncol).tolist() +# This is the head solution for row 1, so round up to ensure neighboring cells remain dry +r2 = [ + 6.99850, + 6.78111, + 6.55650, + 6.32391, + 6.08242, + 5.83092, + 5.56805, + 5.29211, + 5.00092, + 4.69161, + 4.36032, + 4.00150, +] +bot_r2 = [my_ceil(val, precision=1) for val in r2] +botm = np.array([bot_r1, bot_r2]) + +strtdry = [my_floor(val, precision=2) for val in r2] +strt = np.array([strtdry, strtdry]) # Starting head ($m$) +icelltype = 1 # Cell conversion type (>1: unconfined) + +# Set some static transport related model parameter values +prsity = 0.20 # Porosity +strt_conc = np.ones((nlay, nrow, ncol), dtype=float) * 4.0 +strt_temp = np.ones((nlay, nrow, ncol), dtype=float) * 4.0 +dispersivity = 0.1 # dispersion (remember, 1D model) +cpw = 4183.0 +cps = 760.0 +rhow = 1000.0 +rhos = 1500.0 +lhv = 2454.0 +ktw = 0.5918 * 86400 +kts = 0.2700 * 86400 + +# Parameter equivalents: +# ---------------------- +# "Distribution Coefficient" +Kd = cps / (cpw * rhow) +# "Bulk Density" +rhob = (1 - prsity) * rhos +# "Molecular Diffusion" +Kt_bulk = prsity * ktw + (1 - prsity) * kts +Dm = Kt_bulk / (prsity * rhow * cpw) + +# Set solver parameter values (and related) +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-10, 1e-10, 1.0 +ttsmult = 1.0 + +# Set up temporal data used by TDIS file +tdis_rc = [] +for i in np.arange(nper): + tdis_rc.append((perlen, nstp, ttsmult)) + +# ### Create MODFLOW 6 GWE MT3DMS Example 1 Boundary Conditions +# +# Constant head cells are specified on both ends of the model + +# Scenario 1a (GHB to GHB) +ghbcond = 1000.0 +ghb_conc = 4.0 +ghb_temp = 4.0 +ghb_conc_warmup = 30.0 +ghb_temp_warmup = 30.0 +# left boundary: cellid, elv, cond, conc, temp; right bnd: cellid, elv, cond, conc, temp +ghbspd = { + # Steady state stress period + 0: [ + [(0, 0, 0), 7.0, ghbcond, ghb_conc, ghb_temp], + [(0, 0, ncol - 1), 4.0, ghbcond, ghb_conc, ghb_temp], + ], + # First transient stress period + 1: [ + [(0, 0, 0), 7.0, ghbcond, ghb_conc_warmup, ghb_temp_warmup], + [(0, 0, ncol - 1), 4.0, ghbcond, ghb_conc, ghb_temp], + ], +} + + +def build_models(idx, test): + # Base MF6 GWF model type + ws = test.workspace + name = cases[idx] + + print("Building MF6 model...()".format(name)) + + # generate names for each model + gwfname = "gwf-" + name + gwtname = "gwt-" + name + gwename = "gwe-" + name + + sim = flopy.mf6.MFSimulation( + sim_name=name, sim_ws=ws, exe_name="mf6", version="mf6" + ) + + # Instantiating MODFLOW 6 time discretization + flopy.mf6.ModflowTdis( + sim, nper=nper, perioddata=tdis_rc, time_units=time_units + ) + + # Instantiating MODFLOW 6 groundwater flow model + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=gwfname, + save_flows=True, + model_nam_file="{}.nam".format(gwfname), + ) + + # Instantiating MODFLOW 6 solver for flow model + imsgwf = 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, + filename="{}.ims".format(gwfname), + ) + sim.register_ims_package(imsgwf, [gwfname]) + + # Instantiating MODFLOW 6 discretization package + flopy.mf6.ModflowGwfdis( + gwf, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=np.ones((nlay, nrow, ncol), dtype=int), + pname="DIS-1", + filename="{}.dis".format(gwfname), + ) + + # Instantiating MODFLOW 6 storage package + flopy.mf6.ModflowGwfsto( + gwf, + ss=ss, + sy=sy, + iconvert=iconvert, + steady_state=steady, + transient=transient, + pname="STO", + filename="{}.sto".format(gwfname), + ) + + # Instantiating MODFLOW 6 node-property flow package + flopy.mf6.ModflowGwfnpf( + gwf, + save_flows=True, + icelltype=icelltype, + k=k11, + k33=k33, + save_specific_discharge=True, + pname="NPF-1", + filename="{}.npf".format(gwfname), + ) + + # Instantiating MODFLOW 6 initial conditions package for flow model + flopy.mf6.ModflowGwfic(gwf, strt=strt, filename="{}.ic".format(gwfname)) + + # Instatiate left and right general-head boundaries for driving flow + flopy.mf6.ModflowGwfghb( + gwf, + maxbound=len(ghbspd[0]), + stress_period_data=ghbspd, + auxiliary=["CONCENTRATION", "TEMPERATURE"], + save_flows=True, + pname="GHB-1", + filename="{}.ghb".format(gwfname), + ) + + # Instantiating MODFLOW 6 output control package for flow model + flopy.mf6.ModflowGwfoc( + gwf, + pname="OC-1", + head_filerecord="{}.hds".format(gwfname), + budget_filerecord="{}.cbc".format(gwfname), + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + printrecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + ) + + # ---------------------------------------------------- + # Instantiating MODFLOW 6 GWT model + # ---------------------------------------------------- + gwt = flopy.mf6.MFModel( + sim, + model_type="gwt6", + modelname=gwtname, + model_nam_file="{}.nam".format(gwtname), + ) + gwt.name_file.save_flows = True + imsgwt = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwtname), + ) + sim.register_ims_package(imsgwt, [gwt.name]) + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwtdis( + gwt, + nogrb=True, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=1, + pname="DIS-2", + filename="{}.dis".format(gwtname), + ) + + # Instantiating MODFLOW 6 transport initial concentrations + flopy.mf6.ModflowGwtic( + gwt, strt=strt_conc, pname="IC-2", filename="{}.ic".format(gwtname) + ) + + # Instantiating MODFLOW 6 transport advection package + flopy.mf6.ModflowGwtadv( + gwt, scheme=scheme, pname="ADV-2", filename="{}.adv".format(gwtname) + ) + + # Instantiating MODFLOW 6 transport dispersion package + if dispersivity != 0: + flopy.mf6.ModflowGwtdsp( + gwt, + xt3d_off=True, + alh=dispersivity, + ath1=dispersivity, + atv=dispersivity, + diffc=Dm, + pname="DSP-2", + filename="{}.dsp".format(gwtname), + ) + + # Instantiating MODFLOW 6 transport mass storage package (formerly "reaction" package in MT3DMS) + flopy.mf6.ModflowGwtmst( + gwt, + porosity=prsity, + first_order_decay=False, + decay=None, + decay_sorbed=None, + sorption="linear", + bulk_density=rhob, + distcoef=Kd, + save_flows=True, + pname="MST-2", + filename="{}.mst".format(gwtname), + ) + + # Instantiating MODFLOW 6 transport source-sink mixing package + global pname + srctype = "AUX" + auxname = "CONCENTRATION" + pname = ["GHB-1"] + # Inpput to SSM is: + sources = [[itm, srctype, auxname] for itm in pname] + + flopy.mf6.ModflowGwtssm( + gwt, sources=sources, pname="SSM-2", filename="{}.ssm".format(gwtname) + ) + + # Instantiate MODFLOW 6 solute transport output control package + flopy.mf6.ModflowGwtoc( + gwt, + pname="OC-2", + budget_filerecord="{}.cbc".format(gwtname), + concentration_filerecord="{}.ucn".format(gwtname), + concentrationprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("CONCENTRATION", "ALL"), ("BUDGET", "ALL")], + printrecord=[("CONCENTRATION", "ALL"), ("BUDGET", "ALL")], + ) + + # Instantiating MODFLOW 6 flow-transport exchange mechanism + flopy.mf6.ModflowGwfgwt( + sim, + exgtype="GWF6-GWT6", + exgmnamea=gwfname, + exgmnameb=gwtname, + pname="GWFGWT", + filename="{}.gwfgwt".format(gwtname), + ) + + # --------------------------------------------------------- + # Instantiating MODFLOW 6 GWE model + # --------------------------------------------------------- + gwe = flopy.mf6.MFModel( + sim, + model_type="gwe6", + modelname=gwename, + model_nam_file="{}.nam".format(gwename), + ) + gwe.name_file.save_flows = True + imsgwe = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwename), + ) + sim.register_ims_package(imsgwe, [gwe.name]) + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwedis( + gwe, + nogrb=True, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=1, + pname="DIS-3", + filename="{}.dis".format(gwename), + ) + + # Instantiating MODFLOW 6 transport initial concentrations + flopy.mf6.ModflowGweic( + gwe, strt=strt_temp, pname="IC-3", filename="{}.ic".format(gwename) + ) + + # Instantiating MODFLOW 6 transport advection package + flopy.mf6.ModflowGweadv( + gwe, scheme=scheme, pname="ADV-3", filename="{}.adv".format(gwename) + ) + + # Instantiating MODFLOW 6 transport dispersion package + if dispersivity != 0: + flopy.mf6.ModflowGwecnd( + gwe, + xt3d_off=False, + alh=dispersivity, + ath1=dispersivity, + ktw=ktw, + kts=kts, + pname="CND-3", + filename="{}.cnd".format(gwename), + ) + + # Instantiating MODFLOW 6 transport mass storage package (formerly "reaction" package in MT3DMS) + flopy.mf6.ModflowGweest( + gwe, + save_flows=True, + porosity=prsity, + cps=cps, + rhos=rhos, + packagedata=[cpw, rhow, lhv], + pname="EST-3", + filename="{}.est".format(gwename), + ) + + # Instantiating MODFLOW 6 transport source-sink mixing package + srctype = "AUX" + auxname = "TEMPERATURE" + pname = ["GHB-1"] + # Inpput to SSM is: + sources = [[itm, srctype, auxname] for itm in pname] + + flopy.mf6.ModflowGwessm( + gwe, sources=sources, pname="SSM-3", filename="{}.ssm".format(gwename) + ) + + # Instantiate MODFLOW 6 heat transport output control package + flopy.mf6.ModflowGweoc( + gwe, + pname="OC-3", + budget_filerecord="{}.cbc".format(gwename), + temperature_filerecord="{}.ucn".format(gwename), + temperatureprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + printrecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + ) + + # Instantiating MODFLOW 6 flow-transport exchange mechanism + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname, + exgmnameb=gwename, + pname="GWFGWE", + filename="{}.gwfgwe".format(gwename), + ) + + return sim, None + + +def check_output(idx, test): + print("evaluating results...") + + # read transport results from GWE model + name = cases[idx] + gwfname = "gwf-" + name + gwtname = "gwt-" + name + gwename = "gwe-" + name + + # Pull gw heads from GWF + fpth = os.path.join(test.workspace, f"{gwfname}.hds") + try: + # load temperatures + hobj = flopy.utils.HeadFile(fpth, precision="double", text="HEAD") + hds = hobj.get_alldata() + except: + assert False, f'could not load head data from "{fpth}"' + + # Pull parameter-equivalent calculated temperatures from GWT + fpth = os.path.join(test.workspace, f"{gwtname}.ucn") + try: + # load temperatures + cobj = flopy.utils.HeadFile( + fpth, precision="double", text="CONCENTRATION" + ) + conc1 = cobj.get_alldata() + except: + assert False, f'could not load concentration data from "{fpth}"' + + # Pull natively-calculated temperature output from GWE + fpth = os.path.join(test.workspace, f"{gwename}.ucn") + try: + # load temperatures + tobj = flopy.utils.HeadFile( + fpth, precision="double", text="TEMPERATURE" + ) + temp1 = tobj.get_alldata() + except: + assert False, f'could not load temperature data from "{fpth}"' + + # Check heads satisfy problem set up (i.e., all of row 2 is dry) + hdsr1 = hds[0, 0, 0, :] + assert np.all( + hdsr1 < bot_r2 + ), "heads in row 1 should be below bottom elevation of row 2" + assert np.all(hds[0, 0, 1, :] < 0), "row 2 is not dry" + + # Starting temperatures after steady flow period should be 4.0 degrees + np.all( + np.isclose(temp1[0], strt_temp, atol=1e-10) + ), "Steady state temperatures not as expected" + # Same with concentrations in non-dry cells + assert np.all( + np.isclose(conc1[0, :, 0], strt_conc[:, 0]) + ), "Steady state concentrations not as expected" + # Unlike GWE, GWT will not keep dry cells active and output should reflect this + assert np.all( + conc1[:, :, 1, :] < 0 + ), "Concentrations should be set to 'inactive' (-1.e+30) in row 2" + + # Starting in the transient stress period, the water entering in the + # 'trough' row is warmed to 30.0 C. First check that this is the case + assert np.all( + temp1[-1] > temp1[0] + ), "Transient period temperature increase does not appear to have kicked in" + # Dry cell temperatures are only warmed through conduction with neighboring + # 'trough' cells and shouldn't be as warm as wet cells at the end of the + # warming period + assert np.all( + temp1[-1, :, 0] > temp1[-1, 0, 1] + ), "Cells with water should be warmer than dry cells" + + # None of the cells should reach the temperature of the incoming water + # during the simulation period owing to the thermal bleeding that occurs + # to the adjacent dry cells. + assert np.all( + temp1[-1] < ghb_temp_warmup + ), "Cells should not reach the temperature of the incoming water" + + # An increasing amount of thermal bleeding should occur moving in the + # direction of flow since the thickness of the dry cells increases in the + # downstream direction + assert np.all( + np.diff(temp1[-1, :, 0, :-1]) < 0 + ), "Temperature change in the downstream direction should be negative" + assert isMonotonic(np.diff(temp1[-1, :, 0, :-1])), ( + "A monotonic increase in the amount of heat lost to neighboring dry " + "cells is expected" + ) + + # Check temporal changes in temperature in the most upstream and downstream + # dry cells. Cell bottoms in row 2 were calculated using a rounding function + # to the nearest tenth place and as a result a monotonic tapering-off of + # the temperature increase in the in the interior cells cannot be + # guaranteed because of conduction with not only the wet cell in row 1, but + # also conduction among its two dry neighbors (also with variable thickness + colid = 0 + m_arr = np.diff(temp1[1:, 0, 1, colid]) + assert isMonotonic(m_arr), ( + "Temperatures should be monotonically tapering-off in their " + "relative temperature increase with time in the upstream-most" + "dry cell" + ) + + colid = 11 + m_arr = np.diff(temp1[1:, 0, 1, colid]) + assert isMonotonic(m_arr), ( + "Temperatures should be monotonically tapering-off in their " + "relative temperature increase with time in the downstream-most" + "dry cell" + ) + + # Run a few checks between GWE and its GWT counterpart + # In GWT there is no solute interaction with a dry cell, so concentrations + # in the dry cell should remain inactive (i.e., no "molecular diffusion") + # and greater than their GWE counterpart temperatures since there is + # no "retardation" of concentration (temperature) owing to conduction + assert np.all( + conc1[:, :, 1, :] < 0 + ), "The dry cells should never have a non-inactive concentration value" + + +# - No need to change any code below +@pytest.mark.parametrize( + "idx, name", + list(enumerate(cases)), +) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/autotest/test_gwe_esl01.py b/autotest/test_gwe_esl01.py new file mode 100644 index 00000000000..56370d8f627 --- /dev/null +++ b/autotest/test_gwe_esl01.py @@ -0,0 +1,369 @@ +""" +A "bathtub" test problem for GWE - bathtub meaning a single cell model +(and actually, the bathtub is dry in this example) + +Test the energy source loading package by warming a single cell with a known +amount of energy input. + + Model configuration + + ~: Represents energy source loading + + +---------+ + | | + | ~ | + | | + +---------+ + +""" + +# Imports + +import os +import numpy as np +import pytest +import flopy + +from framework import TestFramework + + +# Base simulation and model name and workspace + +scheme = "UPSTREAM" +# scheme = "TVD" + +cases = [ + "warmup", # 1-cell "bathtub" model with easily calculate-able answers +] + +# Model units +length_units = "meters" +time_units = "days" + +# Parameterization + +nrow = ncol = nlay = 1 +top = 1.0 +botm = [0.0] +delr = 1.0 # Column width ($m$) +delc = 1.0 # Row width ($m$) +k11 = 1.0 # Horizontal hydraulic conductivity ($m/d$) +ss = 1e-6 # Specific storage +sy = 0.10 # Specific Yield +prsity = sy # Porosity +nper = 4 # Number of periods +perlen = [1, 1, 1, 1] # Simulation time ($days$) +nstp = [1, 1, 1, 1] # 10 day transient time steps +steady = {0: False} +transient = {0: True} +strthd = 0.0 + +# Set some static model parameter values + +k33 = k11 # Vertical hydraulic conductivity ($m/d$) +idomain = 1 # All cells included in the simulation +iconvert = 1 # All cells are convertible + +icelltype = 1 # Cell conversion type (>1: unconfined) + +# Set some static transport related model parameter values +strt_temp1 = 0.0 +dispersivity = 0.0 # dispersion (remember, 1D model) + +# GWE related parameters +rhow = 1000.0 +cpw = 4183.0 +lhv = 2454.0 +cps = 760.0 +rhos = 1500.0 + +# Set solver parameter values (and related) +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-10, 1e-10, 1.0 +ttsmult = 1.0 + +# Set up temporal data used by TDIS file +tdis_rc = [] +for i in np.arange(nper): + tdis_rc.append((perlen[i], nstp[i], ttsmult)) + +Joules_added_for_1degC_rise = ( + delr * delc * (top - botm[0]) * (1 - prsity) * cps * rhos +) + +# ### Create MODFLOW 6 GWE +# +# No GWF, only Heat conduction simulated + + +def build_models(idx, test): + # Base MF6 GWF model type + ws = test.workspace + name = cases[idx] + + print("Building MF6 model...()".format(name)) + + # generate names for each model + gwfname = "gwf-" + name + gwename = "gwe-" + name + + sim = flopy.mf6.MFSimulation( + sim_name=name, sim_ws=ws, exe_name="mf6", version="mf6" + ) + + # Instantiating MODFLOW 6 time discretization + flopy.mf6.ModflowTdis( + sim, nper=nper, perioddata=tdis_rc, time_units=time_units + ) + + # Instantiating MODFLOW 6 groundwater flow model + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=gwfname, + save_flows=True, + model_nam_file="{}.nam".format(gwfname), + ) + + # Instantiating MODFLOW 6 solver for flow model + imsgwf = 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, + filename="{}.ims".format(gwfname), + ) + sim.register_ims_package(imsgwf, [gwfname]) + + # Instantiating MODFLOW 6 discretization package + flopy.mf6.ModflowGwfdis( + gwf, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=1, + pname="DIS-1", + filename="{}.dis".format(gwfname), + ) + + # Instantiating MODFLOW 6 storage package + flopy.mf6.ModflowGwfsto( + gwf, + ss=ss, + sy=sy, + iconvert=iconvert, + steady_state=steady, + transient=transient, + pname="STO", + filename="{}.sto".format(gwfname), + ) + + # Instantiating MODFLOW 6 node-property flow package + flopy.mf6.ModflowGwfnpf( + gwf, + save_flows=True, + icelltype=icelltype, + k=k11, + k33=k33, + save_specific_discharge=True, + pname="NPF-1", + filename="{}.npf".format(gwfname), + ) + + # Instantiating MODFLOW 6 initial conditions package for flow model + flopy.mf6.ModflowGwfic( + gwf, + strt=strthd, + pname="IC-HD", + filename="{}.ic".format(gwfname), + ) + + # Instantiating MODFLOW 6 output control package for flow model + flopy.mf6.ModflowGwfoc( + gwf, + pname="OC-1", + head_filerecord="{}.hds".format(gwfname), + budget_filerecord="{}.cbc".format(gwfname), + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + printrecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + ) + + # ---------------------------------- + # Instantiating MODFLOW 6 GWE model + # ---------------------------------- + gwe = flopy.mf6.ModflowGwe( + sim, modelname=gwename, model_nam_file="{}.nam".format(gwename) + ) + gwe.name_file.save_flows = True + + imsgwe = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwename), + ) + sim.register_ims_package(imsgwe, [gwe.name]) + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwedis( + gwe, + nogrb=True, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=1, + pname="DIS-GWE", + filename="{}.dis".format(gwename), + ) + + # Instantiating MODFLOW 6 transport initial concentrations + flopy.mf6.ModflowGweic( + gwe, strt=strt_temp1, pname="IC-2", filename="{}.ic".format(gwename) + ) + + # Instantiating MODFLOW 6 transport advection package + flopy.mf6.ModflowGweadv( + gwe, scheme=scheme, pname="ADV-2", filename="{}.adv".format(gwename) + ) + + # Instantiating MODFLOW 6 transport dispersion package + flopy.mf6.ModflowGwecnd( + gwe, + xt3d_off=True, + alh=dispersivity, + ath1=dispersivity, + ktw=0.5918 * 86400, + kts=0.2700 * 86400, + pname="CND-2", + filename="{}.cnd".format(gwename), + ) + + # Instantiating MODFLOW 6 transport mass storage package (formerly "reaction" package in MT3DMS) + flopy.mf6.ModflowGweest( + gwe, + save_flows=True, + porosity=prsity, + cps=cps, + rhos=rhos, + packagedata=[cpw, rhow, lhv], + pname="EST-2", + filename="{}.est".format(gwename), + ) + + # Instantiate MODFLOW 6 heat transport output control package + flopy.mf6.ModflowGweoc( + gwe, + pname="OC-1", + budget_filerecord="{}.cbc".format(gwename), + temperature_filerecord="{}.ucn".format(gwename), + temperatureprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + printrecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + ) + + # Instantiate energy source loading (ESL) package + # Energy is added such that the temperature change in the cell will be + # +1.0, +2.0, -1.0, and 0.0 degrees Celcius from stress period to stress + # period + esl_spd = { + 0: [ + [(0, 0, 0), Joules_added_for_1degC_rise], + ], + 1: [[(0, 0, 0), 2 * Joules_added_for_1degC_rise]], + 2: [[(0, 0, 0), -1 * Joules_added_for_1degC_rise]], + 3: [], + } + flopy.mf6.ModflowGweesl( + gwe, + stress_period_data=esl_spd, + pname="ESL-1", + filename="{}.esl".format(gwename), + ) + + # Instantiating MODFLOW 6 flow-transport exchange mechanism + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname, + exgmnameb=gwename, + pname="GWFGWE1", + filename="{}.gwfgwe1".format(gwename), + ) + + return sim, None + + +def check_output(idx, test): + print("evaluating results...") + + # read transport results from GWE model + name = cases[idx] + gwename = "gwe-" + name + + fpth = os.path.join(test.workspace, f"{gwename}.ucn") + + try: + # load temperatures + tobj = flopy.utils.HeadFile( + fpth, precision="double", text="TEMPERATURE" + ) + temps = tobj.get_alldata() + except: + assert False, f'could not load temperature data from "{fpth}"' + + # Energy source loading was carefully chosen to result in a +1, + # +2 (for an absolute value of 3 deg C), -1, and 0.0 degree C + # change between stress periods. + known_ans = [1.0, 3.0, 2.0, 2.0] + msg0 = ( + "Grid cell temperatures do not reflect the expected difference " + "in stress period " + ) + for index in np.arange(4): + assert np.isclose(temps[index, 0, 0, 0], known_ans[index]), msg0 + str( + index + ) + + +# - No need to change any code below +@pytest.mark.parametrize( + "idx, name", + list(enumerate(cases)), +) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/autotest/test_gwe_esl02.py b/autotest/test_gwe_esl02.py new file mode 100644 index 00000000000..05ded2783cc --- /dev/null +++ b/autotest/test_gwe_esl02.py @@ -0,0 +1,366 @@ +""" +A "bathtub" test problem for GWE - bathtub meaning a single cell model +(and actually, the bathtub is dry in this example) + +Test the energy source loading package by warming a single cell with a known +amount of energy input. + + Model configuration + + *: Represents energy source loading + ~: Represents conduction into neighboring cell + + +---------+---------+ + | |~ | + | * |~ | + | |~ | + +---------+---------+ + +""" + +# Imports + +import os +import numpy as np +import pytest +import flopy + +from framework import TestFramework + + +# Base simulation and model name and workspace + +scheme = "UPSTREAM" +# scheme = "TVD" + +cases = [ + "2cell_cnd", # 2-cell model, horizontally connected with tops and bottoms aligned + "3cell_cnd", +] +ncol = [2, 3] + +# Model units +length_units = "meters" +time_units = "days" + +# Parameterization + +nrow = nlay = 1 +top = 1.0 +botm = [0.0] +delr = 1.0 # Column width ($m$) +delc = 1.0 # Row width ($m$) +k11 = 1.0 # Horizontal hydraulic conductivity ($m/d$) +ss = 1e-6 # Specific storage +sy = 0.10 # Specific Yield +prsity = sy # Porosity +steady = {0: False} +transient = {0: True} +strthd = strt_temp1 = 0.0 + +# Set some static model parameter values + +k33 = k11 # Vertical hydraulic conductivity ($m/d$) +idomain = 1 # All cells included in the simulation +iconvert = 1 # All cells are convertible +icelltype = 1 # Cell conversion type (>0: unconfined) + +# Set some static transport related model parameter values +dispersivity = 0.0 # dispersion (remember, 1D model) + +# GWE related parameters +rhow = 1000.0 +cpw = 4183.0 +lhv = 2454.0 +cps = 760.0 +rhos = 1500.0 + +# Set solver parameter values (and related) +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-10, 1e-10, 1.0 +ttsmult = 1.0 + +# Set up temporal data used by TDIS file +perlen = [1, 1e5] # Simulation time ($days$) +nstp = [1, 100] # 10 day transient time steps +ttsmult = 1.0 +tdis_rc = [] +for i in np.arange(len(perlen)): + tdis_rc.append((perlen[i], nstp[i], ttsmult)) + + +# ### Create MODFLOW 6 GWE model +# +# No GWF, only heat conduction simulated between two cells with energy supplied +# by energy source loading package + + +def build_models(idx, test): + # Base MF6 GWF model type + ws = test.workspace + name = cases[idx] + + print("Building MF6 model...()".format(name)) + + # generate names for each model + gwfname = "gwf-" + name + gwename = "gwe-" + name + + sim = flopy.mf6.MFSimulation( + sim_name=name, sim_ws=ws, exe_name="mf6", version="mf6" + ) + + # Instantiating MODFLOW 6 time discretization + flopy.mf6.ModflowTdis( + sim, nper=len(perlen), perioddata=tdis_rc, time_units=time_units + ) + + # Instantiating MODFLOW 6 groundwater flow model + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=gwfname, + save_flows=True, + model_nam_file="{}.nam".format(gwfname), + ) + + # Instantiating MODFLOW 6 solver for flow model + imsgwf = 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, + filename="{}.ims".format(gwfname), + ) + sim.register_ims_package(imsgwf, [gwfname]) + + # Instantiating MODFLOW 6 discretization package + flopy.mf6.ModflowGwfdis( + gwf, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol[idx], + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=1, + pname="DIS-1", + filename="{}.dis".format(gwfname), + ) + + # Instantiating MODFLOW 6 storage package + flopy.mf6.ModflowGwfsto( + gwf, + ss=ss, + sy=sy, + iconvert=iconvert, + steady_state=steady, + transient=transient, + pname="STO", + filename="{}.sto".format(gwfname), + ) + + # Instantiating MODFLOW 6 node-property flow package + flopy.mf6.ModflowGwfnpf( + gwf, + save_flows=True, + icelltype=icelltype, + k=k11, + k33=k33, + save_specific_discharge=True, + pname="NPF-1", + filename="{}.npf".format(gwfname), + ) + + # Instantiating MODFLOW 6 initial conditions package for flow model + flopy.mf6.ModflowGwfic( + gwf, + strt=strthd, + pname="IC-HD", + filename="{}.ic".format(gwfname), + ) + + # Instantiating MODFLOW 6 output control package for flow model + flopy.mf6.ModflowGwfoc( + gwf, + pname="OC-1", + head_filerecord="{}.hds".format(gwfname), + budget_filerecord="{}.cbc".format(gwfname), + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + printrecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + ) + + # ---------------------------------- + # Instantiating MODFLOW 6 GWE model + # ---------------------------------- + gwe = flopy.mf6.ModflowGwe( + sim, modelname=gwename, model_nam_file="{}.nam".format(gwename) + ) + gwe.name_file.save_flows = True + + imsgwe = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwename), + ) + sim.register_ims_package(imsgwe, [gwe.name]) + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwedis( + gwe, + nogrb=True, + nlay=nlay, + nrow=nrow, + ncol=ncol[idx], + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=1, + pname="DIS-1", + filename="{}.dis".format(gwename), + ) + + # Instantiating MODFLOW 6 transport initial concentrations + flopy.mf6.ModflowGweic( + gwe, strt=strt_temp1, pname="IC-1", filename="{}.ic".format(gwename) + ) + + # Instantiating MODFLOW 6 transport advection package + flopy.mf6.ModflowGweadv( + gwe, scheme=scheme, pname="ADV-1", filename="{}.adv".format(gwename) + ) + + # Instantiating MODFLOW 6 transport dispersion package + flopy.mf6.ModflowGwecnd( + gwe, + xt3d_off=True, + alh=dispersivity, + ath1=dispersivity, + ktw=0.5918 * 86400, + kts=0.2700 * 86400, + pname="CND-1", + filename="{}.cnd".format(gwename), + ) + + # Instantiating MODFLOW 6 transport mass storage package (formerly "reaction" package in MT3DMS) + flopy.mf6.ModflowGweest( + gwe, + save_flows=True, + porosity=prsity, + cps=cps, + rhos=rhos, + packagedata=[cpw, rhow, lhv], + pname="EST-1", + filename="{}.est".format(gwename), + ) + + # Instantiate MODFLOW 6 heat transport output control package + flopy.mf6.ModflowGweoc( + gwe, + pname="OC-1", + budget_filerecord="{}.cbc".format(gwename), + temperature_filerecord="{}.ucn".format(gwename), + temperatureprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], + printrecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], + ) + + # Instantiate energy source loading (ESL) package + # Energy is added such that the temperature change in the cell will be + # +1.0, +2.0, -1.0, and 0.0 degrees Celcius from stress period to stress + # period + factor = ncol[idx] + Specified_joules_added = ( + factor * delr * delc * (top - botm[0]) * (1 - prsity) * cps * rhos + ) + esl_spd = { + 0: [ + [(0, 0, 0), Specified_joules_added], + ], + 1: [], + } + flopy.mf6.ModflowGweesl( + gwe, + stress_period_data=esl_spd, + pname="ESL-1", + filename="{}.esl".format(gwename), + ) + + # Instantiating MODFLOW 6 flow-transport exchange mechanism + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname, + exgmnameb=gwename, + pname="GWFGWE1", + filename="{}.gwfgwe1".format(gwename), + ) + + return sim, None + + +def check_output(idx, test): + print("evaluating results...") + + # read transport results from GWE model + name = cases[idx] + gwename = "gwe-" + name + + fpth = os.path.join(test.workspace, f"{gwename}.ucn") + + try: + # load temperatures + tobj = flopy.utils.HeadFile( + fpth, precision="double", text="TEMPERATURE" + ) + temps = tobj.get_alldata() + except: + assert False, f'could not load temperature data from "{fpth}"' + + # Energy source loading was crafted such that each cell in + # the simulation would rise by 1 degree at the end of the simulation. + msg0 = ( + "Grid cell temperatures do not reflect the expected difference" + "in stress period " + ) + ans = ncol[idx] + assert np.isclose(np.sum(temps[-1]), ans), msg0 + str(index) + + +# - No need to change any code below +@pytest.mark.parametrize( + "idx, name", + list(enumerate(cases)), +) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/autotest/test_gwe_esl_analyt_sln.py b/autotest/test_gwe_esl_analyt_sln.py new file mode 100644 index 00000000000..8d39c6416a3 --- /dev/null +++ b/autotest/test_gwe_esl_analyt_sln.py @@ -0,0 +1,561 @@ +""" + An analytical solution provided by Carslaw & Jaeger (1947) and discussed in + accompanying Techniques & Methods report. + + Energy is added to the right hand side boundary using the energy source loading + (ESL) package. Basic model set up is below, with a slab of unit thickness + (1.0 m) that is 100 m "deep" with energy being loaded on right side. + Temperature will begin to rise on the right and propagate to the left. There are + no sinks in this first example. + + Section 43, case i: + ------------------- + + | <-------------------------- 10 m --------------------------> | + + +------------------------------------------------------------------+ + | Initial temperature = T_0 | <-- *ESL + +------------------------------------------------------------------+ + ^ * ESL: Energy Source Loading Boundary + | + No heat-flow boundary + + + Section 43, case ii: + -------------------- + + +------------------------------------------------------------------+ + | Initial temperature = 0.0 | <-- *ESL + +------------------------------------------------------------------+ + ^ + | + Specified temperature boundary, T_0 + + + Section 43, case iii: + --------------------- + + +------------------------------------------------------------------+ +CTP -> | | <- CTP = T_0 + = T_0 +------------------------------------------------------------------+ + \-------------------------------------------------------------/ + | + Uniform, constant heat production throughout the slab + + + Specified temperature boundary, T_0 + +""" + +import os +import math +import pytest +import flopy +import numpy as np +import matplotlib.pyplot as plt + +from framework import TestFramework + +# Parameters that vary by scenario +cases = ["esl_casei", "esl_caseii", "esl_caseiii"] +perlen = {0: [100, 900], 1: [100, 9900], 2: [100, 900]} +nstp = [100, 900] +tsmult = [ + [1.0, 1.0], + [1.0, 1.0], + [1.0, 1.0], +] + +T_0 = 0.0 # Initial temperature in all scenarios. +# Additionally serves as the CTP bnd temperature in scenarios ii and iii + +xt3d = [True] + +# Parameters for tdis package + +# Model parameters + +# Slab thickness +el = 10.0 # meters + +# Cell dimensions +nlay, nrow, ncol = 1, 1, 1000 +delc = delz = 1.0 +delr = el / ncol + +top = 1.0 +laytyp = 1 +strt = 0.0 +ss = 0.0 +sy = 0.1 +botm = [0.0] +strt = 0.0 +hnoflo = 1e30 +hdry = -1e30 +hk = 1.0 +alh = 0.0 +alv = 0.0 +ath1 = 0.0 +atv = 0.0 +lhv = 2454.0 + +# Solver parameters +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-6, 1e-6, 1.0 + +# Boundary condition (same for all scenarios +chd_perdat = {0: [[(0, 0, 0), 0.0000000], [(0, 0, ncol - 1), 0.0000000]]} + +# The following lists the parameter used in generating an analytical solution +# for comparing the MF6 solution to. + +# Density of the solids +rhos = 2700.0 # kg/m^3 + +# Density of water +rhow = 1000.0 # kg/m^3 + +# Heat capacity of the solids +Cps = 703.7 # J / (kg * C) + +# Heat capacity of water +Cpw = 4183.0 # J / (kg * C) + +# "Bulk" thermal conductivity +# For this problem, K_t_bulk represents the thermal conductivity of the +# solid material only since the problem represents a dry slab +Kts = 0.2700 * 86400 # * 1e8 # J / (day * m * C) +Ktw = 0.5918 * 86400 # J / (day * m * C) + +# Amount of saturation in a cell (cells are dry in this example) +Sw = 0.0 # dimensionless + +# Define porosity +theta = 0.1 # dimensionless + +# Equation 4-6 (for now anyway) +K_t_bulk = Sw * theta * Ktw + (1 - theta) * Kts + +# Eqn 7-4: Bulk specific heat on a per volume basis +rho_C_bulk = Sw * theta * rhow * Cpw + (1 - theta) * rhos * Cps + +# Eqn 7-3: Bulk thermal diffusivity +D = K_t_bulk / rho_C_bulk + +# Energy input to boundary (q_x term in the documentation) +def calc_ener_input(primer_val): + ener_add_rate = delr * delc * delz * rho_C_bulk * primer_val + return ener_add_rate + + +# Define function to solve analytical solution +# Function names derive from equation numbers in Techniques and Methdos + + +def build_models(idx, test, ener_input): + + name = cases[idx] + + # Build MODFLOW 6 files + ws = test.workspace + sim = flopy.mf6.MFSimulation( + sim_name=name, version="mf6", exe_name="mf6", sim_ws=ws + ) + + # Create tdis package + tdis_rc = [] + for i in range(len(perlen[idx])): + tdis_rc.append((perlen[idx][i], nstp[i], tsmult[idx][i])) + + flopy.mf6.ModflowTdis( + sim, time_units="DAYS", nper=len(perlen[idx]), perioddata=tdis_rc + ) + + # Create GWF model + gwfname = "gwf_" + name + gwf = flopy.mf6.MFModel( + sim, + model_type="gwf6", + modelname=gwfname, + model_nam_file=f"{gwfname}.nam", + ) + gwf.name_file.save_flows = True + + # Create iterative model solution and register the gwf model with it + imsgwf = 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, + filename=f"{gwfname}.ims", + ) + sim.register_ims_package(imsgwf, [gwf.name]) + + # Discretization package + flopy.mf6.ModflowGwfdis( + gwf, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=np.ones((nlay, nrow, ncol), dtype=int), + pname="DIS-GWF", + filename=f"{gwfname}.dis", + ) + + # Initial conditions + flopy.mf6.ModflowGwfic( + gwf, strt=strt, pname="IC-HD", filename=f"{gwfname}.ic" + ) + + # Node property flow + flopy.mf6.ModflowGwfnpf( + gwf, + save_specific_discharge=True, + icelltype=laytyp, + k=hk, + k33=hk, + filename=f"{gwfname}.npf", + ) + + # Instantiating MODFLOW 6 storage package + flopy.mf6.ModflowGwfsto( + gwf, + ss=ss, + sy=sy, + iconvert=1, + steady_state=False, + transient=True, + pname="STO", + filename="{}.sto".format(gwfname), + ) + + # Constant head files + chd = None + # chd = flopy.mf6.ModflowGwfchd( + # gwf, + # maxbound=len(chd_perdat[0]), + # stress_period_data=chd_perdat, + # save_flows=False, + # pname="CHD-1", + # filename=f"{gwfname}.chd" + # ) + + # Output control + flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord=f"{gwfname}.cbc", + head_filerecord=f"{gwfname}.hds", + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + printrecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + ) + + # ----------------- + # Create GWE model + # ----------------- + + gwename = "gwe_" + name + gwe = flopy.mf6.MFModel( + sim, + model_type="gwe6", + modelname=gwename, + model_nam_file=f"{gwename}.nam", + ) + gwe.name_file.save_flows = True + + # Create iterative model solution and register the gwt model with it + imsgwe = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename=f"{gwename}.ims", + ) + sim.register_ims_package(imsgwe, [gwe.name]) + + flopy.mf6.ModflowGwedis( + gwe, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=1, + filename=f"{gwename}.dis", + ) + + # Initial conditions + flopy.mf6.ModflowGweic( + gwe, strt=T_0, pname="IC-1", filename=f"{gwename}.ic" + ) + + # Advection + flopy.mf6.ModflowGweadv( + gwe, scheme="UPSTREAM", pname="ADV-E", filename=f"{gwename}.adv" + ) + + # Heat conduction + flopy.mf6.ModflowGwecnd( + gwe, + alh=alh, + alv=alv, + ath1=ath1, + atv=atv, + ktw=Ktw, + kts=Kts, + pname="CND-1", + filename="{}.cnd".format(gwename), + ) + + flopy.mf6.ModflowGweest( + gwe, + porosity=theta, + cps=Cps, + rhos=rhos, + packagedata=[Cpw, rhow, lhv], + pname="EST-1", + filename="{}.est".format(gwename), + ) + + # Constant temperature + # Note: Implementation of the CTP boundary depends on which analytical sln is in view + # See notes at top of script regarding scenarios + if idx > 0: + if idx == 1: + ctp = {0: [[(0, 0, 0), T_0]]} + elif idx == 2: + ctp = {0: [[(0, 0, 0), T_0], [(0, 0, ncol - 1), T_0]]} + flopy.mf6.ModflowGwectp( + gwe, + maxbound=len(ctp), + stress_period_data=ctp, + save_flows=True, + pname="CTP-1", + filename=f"{gwename}.ctp", + ) + + # Instantiate energy source loading (ESL) package + if idx < 2: + esrc = {0: [[(0, 0, ncol - 1), ener_input]]} + + elif idx == 2: + esrcs = [] + for j in np.arange(ncol): + esrcs.append([(0, 0, j), ener_input]) + esrc = {0: esrcs} + + flopy.mf6.ModflowGweesl( + gwe, + maxbound=len(esrc[0]), + stress_period_data=esrc, + save_flows=False, + pname="ESL-1", + filename=f"{gwename}.esl", + ) + + # Sources + if chd is not None: + flopy.mf6.ModflowGwessm( + gwe, sources=[[]], pname="SSM-E", filename=f"{gwename}.ssm" + ) + + # Output control + flopy.mf6.ModflowGweoc( + gwe, + budget_filerecord=f"{gwename}.cbc", + temperature_filerecord=f"{gwename}.ucn", + temperatureprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], + printrecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], + ) + + # GWF GWE exchange + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname, + exgmnameb=gwename, + filename=f"{name}.gwfgwe", + ) + + return sim, None + + +def eq7_24(x, t, l, D, T_0, ener_add_rate): + # Compute corresponding x_hat term + x_hat = x / l # Dimensionless distance + + # Compute corresponding t_hat term + t_hat = D * t / l ** 2 # Dimensionless time + + # Solve equation 7-24 + term1 = (1 / 2) * (x_hat ** 2 - 1 / 3) + summation_terms = [ + ((-1) ** n) + / n ** 2 + * math.exp(-1 * n ** 2 * math.pi ** 2 * t_hat) + * math.cos(n * math.pi * x_hat) + for n in np.arange(1, 1000) + ] + term2 = 2 / (math.pi ** 2) * np.sum(summation_terms) + T = T_0 + ener_add_rate * l / K_t_bulk * (t_hat + term1 - term2) + + return T + + +def eq7_25(x, t, l, D, T_0, ener_add_rate): + # Compute corresponding x_hat term + x_hat = x / l # Dimensionless distance + + # Compute corresponding t_hat term + t_hat = D * t / l ** 2 # Dimensionless time + + # Solve equation 7-25 + summation_terms = [ + ((-1) ** n) + / (2 * n + 1) ** 2 + * math.exp(-1 * (2 * n + 1) ** 2 * math.pi ** 2 * t_hat / 4) + * math.sin((2 * n + 1) * math.pi * x_hat / 2) + for n in np.arange(0, 1000) + ] + term1 = (8 / math.pi ** 2) * np.sum(summation_terms) + + T = T_0 + ener_add_rate * l / K_t_bulk * (x_hat - term1) + + return T + + +def eq7_26(x, t, el, D, T_0, ener_add_rate): + # Compute corresponding x_hat term + x_hat = x / el # Dimensionless distance + + # Compute corresponding t_hat term + t_hat = D * t / el ** 2 # Dimensionless time + + # Solve equation 7-26 + term1 = x_hat * (1 - x_hat) + summation_terms = [ + 1 + / (2 * n + 1) ** 3 + * math.exp(-1 * (2 * n + 1) ** 2 * math.pi ** 2 * t_hat) + * math.sin((2 * n + 1) * math.pi * x_hat) + for n in np.arange(0, 1000) + ] + term2 = (8 / math.pi ** 3) * np.sum(summation_terms) + T = T_0 + 0.5 * ener_add_rate * el ** 2 / K_t_bulk * (term1 - term2) + + return T + + +def check_output(idx, test, ener_input): + name = test.name + gwename = "gwe_" + name + + fpth = os.path.join(test.workspace, f"{gwename}.ucn") + tobj = flopy.utils.HeadFile(fpth, precision="double", text="TEMPERATURE") + sim_temps = tobj.get_alldata() + + # Compare simulated output to analytical solutions (scenario dependent) + if idx < 2: + t_accumulate = 0.0 + area_input = delc * delz + ener_flux = ener_input / area_input + + for sp, t in enumerate(perlen[idx]): + # Time to solution + t_accumulate += t # days + + # Iterate over x which represents the cell centroid locations for which + # analytical solution is desired (cell centroid locations) + cell_centroids = [] + analytical_temps = [] + for x in np.arange(delr / 2, el + (delr / 2), delr): + cell_centroids.append(x) + if idx == 0: + T = eq7_24(x, t_accumulate, el, D, T_0, ener_flux) + elif idx == 1: + T = eq7_25(x, t_accumulate, el, D, T_0, ener_flux) + analytical_temps.append(T) + + analytical_temps = np.array(analytical_temps) + assert np.allclose( + analytical_temps, sim_temps[sp, 0, 0, :], atol=0.005 + ), "simulated solution is whacked" + # plt.plot(cell_centroids, analytical_temps, "r-", label="Analytical Solution") + # plt.plot(cell_centroids, sim_temps[sp, 0, 0, :], "b--", label="GWE") + # plt.axhline(0.0, color='black') + # plt.legend() + # plt.show() + + elif idx == 2: + + t_accumulate = 0.0 + ener_src = ener_input / (delr * delc * delz) + + for sp, t in enumerate(perlen[idx]): + # Time to solution + t_accumulate += t # days + + analytical_temps = [] + cell_centroids = [] + for x in np.arange(delr / 2, el + (delr / 2), delr): + cell_centroids.append(x) + T = eq7_26(x, t_accumulate, el - (delr * 2), D, T_0, ener_src) + analytical_temps.append(T) + + analytical_temps = np.array(analytical_temps) + if sp == 0: + atol = 0.16 + else: + atol = 0.47 + + assert np.allclose( + analytical_temps, sim_temps[sp, 0, 0, :], atol=atol + ), "simulated solution is whacked" + + # plt.plot(cell_centroids, analytical_temps, "r-", label="Analytical Solution") + # plt.plot(cell_centroids, sim_temps[sp, 0, 0, :], "b--", label="GWE") + # plt.axhline(0.0, color='black') + # plt.legend() + # plt.show() + + +# - No need to change any code below +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + if idx < 2: + ener_input = calc_ener_input(1.0) + elif idx == 2: + ener_input = calc_ener_input(0.1) + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t, ener_input), + check=lambda t: check_output(idx, t, ener_input), + ) + test.run() diff --git a/autotest/test_gwe_lke_conduction.py b/autotest/test_gwe_lke_conduction.py new file mode 100644 index 00000000000..412df9816e9 --- /dev/null +++ b/autotest/test_gwe_lke_conduction.py @@ -0,0 +1,780 @@ +# Simple single lake model. Lake cut into top two layers of a 5 layer +# model. Model is loosely based on the first example problem in +# Merritt and Konikow (2000) which also is one of the MT3D-USGS test +# problems. This test developed to isolate lake-aquifer interaction; +# no SFR or other advanced packages. Problem set up to have only +# conductive exchange with groundwater, then groundwater pass-through: +# that is, gw inflow on the left side, gw outflow on the +# right side of the lake. +# +# starting groundwater temperature: 4.0 +# left chd boundary inflow temperature: 4.0 +# starting lake temperature: 20.0 +# + +import os + +import numpy as np +import pytest +import flopy +from framework import TestFramework + + +def process_line(line): + m_arr = line.strip().split() + if any("=" in itm and len(itm) > 1 for itm in m_arr): + m_arr = [ + float(itm.split("=")[-1]) if len(itm.split("=")) > 1 else itm + for itm in m_arr + ] + nm = m_arr[-2] + else: + nm = m_arr[-3] + val = m_arr[-1] + return {nm: float(val)} + + +def get_bud(fname, srchStr): + in_bud_lst = {} + out_bud_lst = {} + with open(fname, "r") as f: + for line in f: + if srchStr in line: + # Read the package budget + line = next(f) + while not "TOTAL IN =" in line: + if "=" in line: + in_bud_lst.update(process_line(line)) + + line = next(f) + + # Get "total in" + dct = process_line(line) + T_in = dct["IN"] + + line = next(f) + while not "TOTAL OUT =" in line: + if "=" in line: + out_bud_lst.update(process_line(line)) + + line = next(f) + + # Get "total out" + dct = process_line(line) + T_out = dct["OUT"] + + break + + return T_in, T_out, in_bud_lst, out_bud_lst + + +def trenddetector(list_of_index, array_of_data, order=1): + result = np.polyfit(list_of_index, list(array_of_data), order) + slope = result[-2] + return float(slope) + + +cases = ["lke-conductn", "lke-conductm", "lke-conductr"] + +# +# The last letter in the names above indicates the following +# n = "no lk/gw exchange" +# m = "mixed" (i.e., convection one direction, conductive gradient the other direction?) +# r = "reversed thermal gradients (warm gw, cold lake) + +strt_gw_temp = [4.0, 4.0, 20.0] +strt_lk_temp = [20.0, 20.0, 4.0] +lak_leakance = [0.0, 1.0, 1.0] +strt_lk_stg = [33.75, 33.75, 33.75] +lkbdthkcnd = [ + 0.0001, + 0.0001, + 0.0001, +] # Thickness to consider for feature/gw conduction + +# Model units +length_units = "m" +time_units = "days" + +# model domain and grid definition +delr = [ + 76.2, + 304.8, + 304.8, + 304.8, + 304.8, + 304.8, + 152.4, + 152.4, + 152.4, + 152.4, + 152.4, + 304.8, + 304.8, + 304.8, + 304.8, + 304.8, + 76.2, +] + +delc = [ + 76.2, + 304.8, + 304.8, + 304.8, + 304.8, + 304.8, + 152.4, + 152.4, + 152.4, + 152.4, + 152.4, + 304.8, + 304.8, + 304.8, + 304.8, + 304.8, + 76.2, +] + +fixedstrthds = [ + 35.052, + 34.9267, + 34.7216, + 34.5062, + 34.2755, + 34.0237, + 33.8143, + 33.6657, + 33.5077, + 33.3394, + 33.1599, + 32.8728, + 32.4431, + 31.9632, + 31.4353, + 30.8627, + 30.48, +] + +nrow = len(delc) +ncol = len(delr) +top = np.ones((nrow, ncol)) * 35.6616 +bot1 = np.ones_like(top) * 32.6136 +bot2 = np.ones_like(top) * 29.5656 +bot3 = np.ones_like(top) * 26.5176 +bot4 = np.ones_like(top) * 23.4696 +bot5 = np.ones_like(top) * 20.4216 +botm = np.array([bot1, bot2, bot3, bot4, bot5]) +nlay = botm.shape[0] +ibound = np.ones_like(botm) + +# deactive gw cells where lake cells are active +ibound[0, 6:11, 6:11] = 0 # layer 1 +ibound[1, 7:10, 7:10] = 0 # layer 2 + +strthd = np.zeros_like(ibound) +for j in np.arange(ncol): + strthd[:, :, j] = fixedstrthds[j] + +# setup lake array +lakibnd = np.zeros_like(ibound) +lakibnd[0] = 1 - ibound[0] # layer 1 +lakibnd[1] = 1 - ibound[1] # layer 2 + +# NPF parameters +k11 = 9.144 # = 30 ft/day +k33 = 0.9144 # = 30 ft/day +ss = 3e-4 +sy = 0.20 +hani = 1 +laytyp = 1 + +# Package boundary conditions +chdl = 35.052 +chdr = 30.48 +viscref = 8.904e-4 + +# time params +transient = {0: True} +nstp = [10] +tsmult = [1.0] +perlen = [5000] + +# solver params +nouter, ninner = 1000, 300 +hclose, rclose, relax = 1e-3, 1e-4, 0.97 + +# Transport related parameters +al = 1 # longitudinal dispersivity ($m$) +ath1 = al # horizontal transverse dispersivity +atv = al # vertical transverse dispersivity +mixelm = 0 # Upstream vs TVD (Upstream selected) +porosity = 0.20 # porosity (unitless) +K_therm = 2.0 # Thermal conductivity # ($W/m/C$) +rhow = 1000 # Density of water ($kg/m^3$) +rhos = 2650 # Density of the aquifer material ($kg/m^3$) +Cpw = 4180 # Heat Capacity of water ($J/kg/C$) +Cps = 880 # Heat capacity of the solids ($J/kg/C$) +lhv = 2454000.0 # Latent heat of vaporization ($J/kg$) +K_therm_lakebed = 1.5 # Thermal conductivity of the lakebed material ($W/m/C$) + + +# +# MODFLOW 6 flopy GWF & GWE simulation object (sim) is returned +# + + +def build_models(idx, test): + global lak_lkup_dict + + # Base simulation and model name and workspace + ws = test.workspace + name = cases[idx] + + print("Building model...{}".format(name)) + + # generate names for each model + gwfname = "gwf-" + name + gwename = "gwe-" + name + + sim = flopy.mf6.MFSimulation( + sim_name=name, sim_ws=ws, exe_name="mf6", version="mf6" + ) + + tdis_rc = [] + for i in range(len(nstp)): + tdis_rc.append((perlen[i], nstp[i], tsmult[i])) + + flopy.mf6.ModflowTdis( + sim, nper=len(nstp), perioddata=tdis_rc, time_units=time_units + ) + + gwf = flopy.mf6.ModflowGwf( + sim, modelname=gwfname, save_flows=True, newtonoptions="newton" + ) + + # Instantiating solver + ims = flopy.mf6.ModflowIms( + sim, + print_option="ALL", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="cooley", + inner_maximum=ninner, + inner_dvclose=hclose, + rcloserecord=rclose, + linear_acceleration="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwfname), + ) + sim.register_ims_package(ims, [gwfname]) + + # Instantiate discretization package + flopy.mf6.ModflowGwfdis( + gwf, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=ibound, + filename="{}.dis".format(gwfname), + ) + + # Instantiate node property flow package + flopy.mf6.ModflowGwfnpf( + gwf, + save_specific_discharge=True, + icelltype=1, # >0 means saturated thickness varies with computed head + k=k11, + k33=k33, + ) + + # Instantiate storage package + flopy.mf6.ModflowGwfsto( + gwf, + save_flows=False, + iconvert=laytyp, + ss=ss, + sy=sy, + transient=transient, + ) + + # Instantiate initial conditions package + flopy.mf6.ModflowGwfic(gwf, strt=strthd) + + # Instantiate output control package + flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord=f"{gwfname}.cbc", + head_filerecord=f"{gwfname}.hds", + headprintrecord=[("COLUMNS", 17, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + printrecord=[("HEAD", "ALL"), ("BUDGET", "LAST")], + ) + + # Instantiate constant head package + # (for driving gw flow from left to right) + chdlistl = [] + chdlistr = [] + for k in np.arange(nlay): + for i in np.arange(nrow): + # left side + if botm[k, i, 0] <= chdl: + chdlistl.append([(k, i, 0), chdl, strt_gw_temp[idx]]) + # right side + if botm[k, i, -1] <= chdr: + chdlistr.append([(k, i, ncol - 1), chdr, 10.0]) + + flopy.mf6.ModflowGwfchd( + gwf, + stress_period_data=chdlistl, + print_input=True, + print_flows=True, + save_flows=False, + pname="CHD-L", + auxiliary="TEMPERATURE", + filename=f"{gwfname}.left.chd", + ) + + flopy.mf6.ModflowGwfchd( + gwf, + stress_period_data=chdlistr, + print_input=True, + print_flows=True, + save_flows=False, + pname="CHD-R", + auxiliary="TEMPERATURE", + filename=f"{gwfname}.right.chd", + ) + + # Instantiate lake package + lakeconnectiondata = [] + nlakecon = [0] # Expand this to [0, 0, ...] for each additional lake + ilakconn = -1 + lak_lkup_dict = {} + for k in [0, 1]: + for i in range(nrow): + for j in range(ncol): + if lakibnd[k, i, j] == 0: + continue + else: + ilak = int(lakibnd[k, i, j] - 1) + # back + if i > 0: + if ( + lakibnd[k, i - 1, j] == 0 + and ibound[k, i - 1, j] == 1 + ): + ilakconn += 1 + # by setting belev==telev, MF6 will automatically + # re-assign elevations based on cell dimensions + h = [ + ilak, # + ilakconn, # + (k, i - 1, j), # + "horizontal", # + lak_leakance[idx], # + 0.0, # + 0.0, # + delc[i] / 2.0, # + delr[j], # + ] + lakeconnectiondata.append(h) + lak_lkup_dict.update({ilakconn: (k, i, j)}) + + # left + if j > 0: + if ( + lakibnd[k, i, j - 1] == 0 + and ibound[k, i, j - 1] == 1 + ): + ilakconn += 1 + h = [ + ilak, + ilakconn, + (k, i, j - 1), + "horizontal", + lak_leakance[idx], + 0.0, + 0.0, + delr[j] / 2.0, + delc[i], + ] + lakeconnectiondata.append(h) + lak_lkup_dict.update({ilakconn: (k, i, j)}) + + # right + if j < ncol - 1: + if ( + lakibnd[k, i, j + 1] == 0 + and ibound[k, i, j + 1] == 1 + ): + ilakconn += 1 + h = [ + ilak, + ilakconn, + (k, i, j + 1), + "horizontal", + lak_leakance[idx], + 0.0, + 0.0, + delr[j] / 2.0, + delc[i], + ] + lakeconnectiondata.append(h) + lak_lkup_dict.update({ilakconn: (k, i, j)}) + + # front + if i < nrow - 1: + if ( + lakibnd[k, i + 1, j] == 0 + and ibound[k, i + 1, j] == 1 + ): + ilakconn += 1 + h = [ + ilak, + ilakconn, + (k, i + 1, j), + "horizontal", + lak_leakance[idx], + 0.0, + 0.0, + delc[i] / 2.0, + delr[j], + ] + lakeconnectiondata.append(h) + lak_lkup_dict.update({ilakconn: (k, i, j)}) + + # vertical + if lakibnd[k, i, j] == 1 and ibound[k + 1, i, j] == 1: + ilakconn += 1 + v = [ + ilak, + ilakconn, + (k + 1, i, j), + "vertical", + lak_leakance[idx], + 0.0, + 0.0, + 0.0, + 0.0, + ] + lakeconnectiondata.append(v) + lak_lkup_dict.update({ilakconn: (k, i, j)}) + + strtStg = strt_lk_stg[idx] + lakpackagedata = [ + [0, strtStg, len(lakeconnectiondata), strt_lk_temp[idx], "lake1"] + ] + lak_pkdat_dict = {"filename": "lak_pakdata.in", "data": lakpackagedata} + + lakeperioddata = {0: []} + + lak_obs = { + "{}.lakeobs".format(gwfname): [ + ("lakestage", "stage", "lake1"), + ("gwexchng", "lak", "lake1"), + ] + } + lak = flopy.mf6.ModflowGwflak( + gwf, + auxiliary="TEMPERATURE", + time_conversion=86400.0, + print_stage=True, + print_flows=True, + budget_filerecord=gwfname + ".lak.bud", + length_conversion=1.0, + mover=False, + pname="LAK-1", + boundnames=True, + nlakes=len(lakpackagedata), + noutlets=0, + packagedata=lak_pkdat_dict, + connectiondata=lakeconnectiondata, + perioddata=lakeperioddata, + observations=lak_obs, + filename="{}.lak".format(gwfname), + ) + + # pull in the tabfile defining the lake stage, vol, & surface area + fname = os.path.join("data", "vsc04-laktab", "stg-vol-surfarea.dat") + tabinput = [] + with open(fname, "r") as f: + # peel off the hdr line + hdr = next(f) + for line in f: + m_arr = line.strip().split(",") + # , , , + tabinput.append([float(m_arr[0]), m_arr[1], m_arr[2]]) + + tab6_filename = "{}.laktab".format(gwfname) + flopy.mf6.ModflowUtllaktab( + gwf, + nrow=len(tabinput), + ncol=3, + table=tabinput, + filename=tab6_filename, + pname="LAK_tab", + parent_file=lak, + ) + + # ----------------- + # Create GWE model + # ----------------- + + gwe = flopy.mf6.ModflowGwe( + sim, modelname=gwename, model_nam_file="{}.nam".format(gwename) + ) + gwe.name_file.save_flows = True + + imsgwe = flopy.mf6.ModflowIms( + sim, + print_option="ALL", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="NONE", + inner_maximum=ninner, + inner_dvclose=hclose, + rcloserecord=rclose, + linear_acceleration="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename=f"{gwename}.ims", + ) + sim.register_ims_package(imsgwe, [gwename]) + + # Instantiating MODFLOW 6 enregy transport discretization package + flopy.mf6.ModflowGwedis( + gwe, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=ibound, + filename="{}.dis".format(gwename), + ) + + # Instantiating MODFLOW 6 energy transport initial temperatures + strttemp = strt_gw_temp[idx] + flopy.mf6.ModflowGweic( + gwe, strt=strttemp, filename="{}.ic".format(gwename) + ) + + # Instantiate mobile storage and transfer package + flopy.mf6.ModflowGweest( + gwe, + porosity=porosity, + cps=Cps, + rhos=rhos, + packagedata=[Cpw, rhow, lhv], + pname="MST-1", + filename=f"{gwename}.mst", + ) + + # Instantiating MODFLOW 6 energy transport advection package + if mixelm == 0: + scheme = "UPSTREAM" + elif mixelm == -1: + scheme = "TVD" + else: + raise Exception() + + # Instantiate advection package + flopy.mf6.ModflowGweadv( + gwe, scheme=scheme, filename="{}.adv".format(gwename) + ) + + # Instantiate dispersion package + flopy.mf6.ModflowGwecnd( + gwe, + xt3d_off=True, + ktw=0.5918, + kts=0.2700, + filename="{}.dsp".format(gwename), + ) + + # Instantiate source/sink mixing package + sourcerecarray = [ + ("CHD-L", "AUX", "TEMPERATURE"), + ("CHD-R", "AUX", "TEMPERATURE"), + ] + flopy.mf6.ModflowGwessm( + gwe, sources=sourcerecarray, filename=f"{gwename}.ssm" + ) + + # Instantiating MODFLOW 6 transport output control package + flopy.mf6.ModflowGweoc( + gwe, + budget_filerecord="{}.cbc".format(gwename), + temperature_filerecord="{}.ucn".format(gwename), + temperatureprintrecord=[ + ("COLUMNS", 17, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + printrecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + filename="{}.oc".format(gwename), + ) + + # Instantiating MODFLOW 6 lake energy transport (lke) package + lkepackagedata = [ + (0, strt_lk_temp[idx], K_therm_lakebed, lkbdthkcnd[idx], "lake1") + ] + + # lkeperioddata = {0: [(0, "STATUS", "CONSTANT"), (0, "TEMPERATURE", 4.0)]} + + # note: for specifying lake number, use fortran indexing! + lke_obs = { + "{}.lakobs".format(gwename): [ + ("resTemp", "temperature", 1), + ("resGwEnerExchng", "lke", "lake1"), + ] + } + + flopy.mf6.ModflowGwelke( + gwe, # Set time_conversion for use with Manning's eqn. + flow_package_name="LAK-1", + flow_package_auxiliary_name="TEMPERATURE", + budget_filerecord=gwename + ".lke.bud", + boundnames=True, + save_flows=True, + print_input=True, + print_flows=False, + print_temperature=True, + packagedata=lkepackagedata, + # lakeperioddata=lkeperioddata, + observations=lke_obs, + pname="LKE-1", + filename="{}.lke".format(gwename), + ) + + # GWF-GWE exchange + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname, + exgmnameb=gwename, + filename=f"{name}.gwfgwe", + ) + + return sim, None + + +def check_output(idx, test): + print("evaluating results...") + + # read flow results from model + name = cases[idx] + gwename = "gwe-" + name + + # Retrieve simulated temperature for the lake + fname = gwename + ".lakobs" + lktemp_file = os.path.join(test.workspace, fname) + lktemp = np.genfromtxt(lktemp_file, names=True, delimiter=",") + lktemp = lktemp["RESTEMP"].astype(float).reshape((lktemp.size, 1)) + + # Retrieve groundwater temperatures + fname = gwename + ".ucn" + fname = os.path.join(test.workspace, fname) + assert os.path.isfile(fname) + gwtempobj = flopy.utils.HeadFile( + fname, precision="double", text="TEMPERATURE" + ) + gwe_temps = gwtempobj.get_alldata() + + # gw exchng (item 'GWF') should be zero in heat transport budget + srchStr = "LKE-1 BUDGET FOR ENTIRE MODEL AT END OF TIME STEP 1, STRESS PERIOD 1" + fname = gwename + ".lst" + fname = os.path.join(test.workspace, fname) + + # Retrieve budget + T_in, T_out, in_bud_lst, out_bud_lst = get_bud(fname, srchStr) + assert np.isclose( + T_in, T_out, atol=0.1 + ), "There is a heat budget discrepancy where there shouldn't be" + + msg1 = "Budget item 'GWF' should be 0.0 for this scenario" + msg2 = ( + "Thermal conduction is occurring in the wrong direction based " + "on the thermal gradient between the lake and groundwater system" + ) + msg3 = ( + "There should be a cooling trend in the lake based on heat loss " + "to the groundwater system" + ) + msg4 = ( + "There should be a warming trend in the groundwater adjacent " + "to the lake" + ) + msg5 = ( + "Budget item 'GWF' should reflect heat entering the lake " + "(via gw/sw exchange)" + ) + msg6 = ( + "Budget item 'GWF' should reflect heat exiting the lake " + "(via gw/sw exchange)" + ) + + if name[-1] == "n": + + assert in_bud_lst["GWF"] == 0.0, msg1 + assert out_bud_lst["GWF"] == 0.0, msg1 + + if name[-1] != "n": + + assert in_bud_lst["GWF"] > 0.0, msg5 + assert out_bud_lst["GWF"] > 0.0, msg6 + + # Determine gw/sfe temperature gradient direction + if lktemp[0] > gwe_temps[0, 0, 0, 0]: + # conduction will be from lake to gw cells + assert in_bud_lst["LAKEBED-COND"] == 0.0, msg2 + assert out_bud_lst["LAKEBED-COND"] > 0.0, msg2 + + slp = trenddetector(np.arange(len(lktemp)), lktemp) + # Lake should be cooling through conductive exchange with cold gw + assert slp < 0.0, msg3 + + slp = trenddetector(np.arange(lktemp.shape[0]), gwe_temps[:, 1, 8, 11]) + # gw should be warming through conductive exchange with a warm lake + assert slp > 0.0, msg4 + + else: # thermally reversed scenario (cold lake, warm gw) + + # conduction will be from gw cells to lake + assert in_bud_lst["LAKEBED-COND"] > 0.0, msg2 + assert out_bud_lst["LAKEBED-COND"] == 0.0, msg2 + + slp = trenddetector(np.arange(len(lktemp)), lktemp) + # Lake should be warming through conductive exchange with warm gw + assert slp > 0.0, msg3 + + slp = trenddetector(np.arange(lktemp.shape[0]), gwe_temps[:, 1, 8, 11]) + # gw should be cooling through conductive exchange with a cold lake + assert slp < 0.0, msg4 + + +# - No need to change any code below +@pytest.mark.parametrize( + "idx, name", + list(enumerate(cases)), +) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/autotest/test_gwe_mwe_conduction.py b/autotest/test_gwe_mwe_conduction.py new file mode 100644 index 00000000000..b5570a0527f --- /dev/null +++ b/autotest/test_gwe_mwe_conduction.py @@ -0,0 +1,570 @@ +# Test mwe package. Looks at wetted area of well for calculating +# heat conduction exchange. This test is related to test_gwf_maw06.py but +# with some further customization for testing GWE capabilities. +# - Test has 0 flow conductance with gw cells in layers 1-3 +# - Test uses MAW to inject water into layer 4 (bottom layer) +# - Test includes conductive exchng only between MWE feature and +# layers 1 to 3 +# - Water extracted by normal WEL features in bottom corners of model +# - Water table saturates only ~1/2 of top layer; therefore +# conductive exchange + +import os + +import flopy +import numpy as np +import pytest +from framework import TestFramework + + +def process_line(line): + m_arr = line.strip().split() + if any("=" in itm and len(itm) > 1 for itm in m_arr): + m_arr = [ + float(itm.split("=")[-1]) if len(itm.split("=")) > 1 else itm + for itm in m_arr + ] + nm = m_arr[-2] + else: + nm = m_arr[-3] + val = m_arr[-1] + return {nm: float(val)} + + +def get_bud(fname, srchStr): + in_bud_lst = {} + out_bud_lst = {} + with open(fname, "r") as f: + for line in f: + if srchStr in line: + # Read the package budget + line = next(f) + while not "TOTAL IN =" in line: + if "=" in line: + in_bud_lst.update(process_line(line)) + + line = next(f) + + # Get "total in" + dct = process_line(line) + T_in = dct["IN"] + + line = next(f) + while not "TOTAL OUT =" in line: + if "=" in line: + out_bud_lst.update(process_line(line)) + + line = next(f) + + # Get "total out" + dct = process_line(line) + T_out = dct["OUT"] + + break + + return T_in, T_out, in_bud_lst, out_bud_lst + + +def get_welbore_heat_flow(fname, srchStr): + ener_Q = [] + with open(fname, "r") as f: + for line in f: + if srchStr in line: + # Read an established format + for i in np.arange(3): # read & discard 3 lines + line = next(f) + for i in np.arange( + 4 + ): # read & digest 4 lines of needed output + line = next(f) + m_arr = line.strip().split() + ener_Q.append([int(m_arr[0]), float(m_arr[2])]) + break + + return np.array(ener_Q) + + +def trenddetector(list_of_index, array_of_data, order=1): + result = np.polyfit(list_of_index, list(array_of_data), order) + slope = result[-2] + return float(slope) + + +cases = ["mwe_01"] +mawstrt = 3.5 + +# Flow related parameters +lx = 70.0 +ly = 70.0 +nlay = 4 +nrow = 7 +ncol = 7 +nper = 1 +delc = ly / nrow +delr = lx / ncol +top = 4.0 +botm = [3.0, 2.0, 1.0, 0.0] +strt = 3.5 +transient = {0: True} + +perlen = [10.0] +nstp = [10] +tsmult = [1.0] + +Kh = [1.0, 1.0, 1e-6, 100] +Kv = [1.0, 1.0, 1e-6, 100] + +Sy = 0.3 +Ss = 0.0 + +# Transport related parameters +mixelm = 0 # Upstream vs TVD (Upstream selected) +strttemp = 1.0 # Initial temperature ($^{\circ}C$) +porosity = Sy # porosity (unitless) +ktw = 0.5918 # Thermal Conductivity of Water ($W/m/^{\circ}C$) +kts = 0.2700 # Thermal Conductivity of Aquifer Solids ($W/m/^{\circ}C$) +rhow = 1000 # Density of water ($kg/m^3$) +rhos = 2650 # Density of the aquifer material ($kg/m^3$) +Cpw = 4180 # Heat Capacity of water ($J/kg/C$) +Cps = 880 # Heat capacity of the solids ($J/kg/C$) +lhv = 2454000.0 # Latent heat of vaporization ($J/kg$) +K_therm_maw = 1.5 # Thermal conductivity of the lakebed material ($W/m/C$) +wthkcnd = 0.01 +mawradius = 0.1 +mawbottom = 0.0 + +# Solver settings +nouter, ninner = 700, 10 +hclose, rclose, relax = 1e-8, 1e-6, 0.97 + + +def build_models(idx, test): + + tdis_rc = [] + for i in range(nper): + tdis_rc.append((perlen[i], nstp[i], tsmult[i])) + + name = cases[idx] + + # Instantiate MODFLOW 6 simulation + ws = test.workspace + sim = flopy.mf6.MFSimulation( + sim_name=name, version="mf6", exe_name="mf6", sim_ws=ws + ) + + # Instantiate Time Discretization package + flopy.mf6.ModflowTdis( + sim, time_units="DAYS", nper=nper, perioddata=tdis_rc + ) + + # Instantiate Groundwater Flow model + gwfname = "gwf-" + name + gwename = "gwe-" + name + newtonoptions = "NEWTON UNDER_RELAXATION" + gwf = flopy.mf6.ModflowGwf( + sim, modelname=gwfname, newtonoptions=newtonoptions + ) + + ims = flopy.mf6.ModflowIms( + sim, + print_option="ALL", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="SIMPLE", + under_relaxation_gamma=0.1, + inner_maximum=ninner, + inner_dvclose=hclose, + rcloserecord=rclose, + linear_acceleration="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename=f"{gwfname}.ims", + ) + sim.register_ims_package(ims, [gwfname]) + + # Instantiate Discretization package + flopy.mf6.ModflowGwfdis( + gwf, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + length_units="METERS", + pname="DIS", + filename=f"{gwfname}.dis", + ) + + # Instantiate Initial Conditions package + flopy.mf6.ModflowGwfic( + gwf, + strt=strt, + pname="IC", + filename=f"{gwfname}.ic", + ) + + # Instantiate Node Property Flow package + flopy.mf6.ModflowGwfnpf( + gwf, + xt3doptions=False, + save_flows=True, + save_specific_discharge=True, + icelltype=1, + k=Kh, + k33=Kv, + pname="NPF", + filename=f"{gwfname}.npf", + ) + + # Instantiate Storage package + flopy.mf6.ModflowGwfsto( + gwf, + sy=Sy, + ss=Ss, + iconvert=1, + transient=transient, + pname="STO", + filename=f"{gwfname}.sto", + ) + + # Instantiate Well package (for extracting MAW-injected water) + wellist = [] + for i in [0, nrow - 1]: + for j in [0, ncol - 1]: + wellist.append([(nlay - 1, i, j), -7.0, 0.01]) + + flopy.mf6.ModflowGwfwel( + gwf, + stress_period_data=wellist, + print_input=True, + print_flows=True, + save_flows=False, + pname="WEL", + auxiliary="TEMPERATURE", + filename=f"{gwfname}.wel", + ) + + # Instantiate Multi-Aquifer Well package (injects water) + mstrt = mawstrt + mawcondeqn = "SPECIFIED" + mawngwfnodes = nlay + # + mawpackagedata = [ + [0, mawradius, mawbottom, mstrt, mawcondeqn, mawngwfnodes] + ] + # + conncond = [0.0, 0.0, 0.0, 1000.0] + mawconnectiondata = [ + [0, icon, (icon, 3, 3), top, mawbottom, conncond[icon], -999.0] + for icon in range(nlay) + ] + # + mawperioddata = [[0, "STATUS", "ACTIVE"], [0, "RATE", 28.0]] + maw = flopy.mf6.ModflowGwfmaw( + gwf, + print_input=True, + print_head=True, + print_flows=True, + save_flows=True, + head_filerecord=f"{gwfname}.maw.bin", + budget_filerecord=f"{gwfname}.maw.cbc", + packagedata=mawpackagedata, + connectiondata=mawconnectiondata, + perioddata=mawperioddata, + pname="MAW-1", + ) + opth = f"{gwfname}.maw.obs" + obsdata = { + f"{gwfname}.maw.obs.csv": [ + ("whead", "head", (0,)), + ] + } + maw.obs.initialize( + filename=opth, digits=20, print_input=True, continuous=obsdata + ) + + # Instantiate Output Control package + flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord=f"{gwfname}.cbc", + head_filerecord=f"{gwfname}.hds", + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[ + ( + "HEAD", + "ALL", + ), + ( + "BUDGET", + "ALL", + ), + ], + printrecord=[ + ( + "HEAD", + "ALL", + ), + ( + "BUDGET", + "ALL", + ), + ], + ) + + # Create GWE model + # ---------------- + gwe = flopy.mf6.ModflowGwe( + sim, modelname=gwename, model_nam_file="{}.nam".format(gwename) + ) + gwe.name_file.save_flows = True + + imsgwe = flopy.mf6.ModflowIms( + sim, + print_option="ALL", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="NONE", + inner_maximum=ninner, + inner_dvclose=hclose, + rcloserecord=rclose, + linear_acceleration="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename=f"{gwename}.ims", + ) + sim.register_ims_package(imsgwe, [gwename]) + + # Instantiating MODFLOW 6 enregy transport discretization package + flopy.mf6.ModflowGwedis( + gwe, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + pname="DIS", + filename="{}.dis".format(gwename), + ) + + # Instantiating MODFLOW 6 energy transport initial temperatures + flopy.mf6.ModflowGweic( + gwe, strt=strttemp, filename="{}.ic".format(gwename) + ) + + # Instantiate mobile storage and transfer package + flopy.mf6.ModflowGweest( + gwe, + porosity=porosity, + cps=Cps, + rhos=rhos, + packagedata=[Cpw, rhow, lhv], + pname="MST-1", + filename=f"{gwename}.mst", + ) + + # Instantiating MODFLOW 6 energy transport advection package + if mixelm == 0: + scheme = "UPSTREAM" + elif mixelm == -1: + scheme = "TVD" + else: + raise Exception() + + # Instantiate advection package + flopy.mf6.ModflowGweadv( + gwe, scheme=scheme, pname="ADV", filename="{}.adv".format(gwename) + ) + + # Instantiate dispersion package + flopy.mf6.ModflowGwecnd( + gwe, + xt3d_off=True, + ktw=0.5918, + kts=0.2700, + filename="{}.dsp".format(gwename), + ) + + # Instantiate source/sink mixing package + sourcerecarray = [ + ("WEL", "AUX", "TEMPERATURE"), + ] + flopy.mf6.ModflowGwessm( + gwe, sources=sourcerecarray, filename=f"{gwename}.ssm" + ) + + # Instantiating MODFLOW 6 transport output control package + flopy.mf6.ModflowGweoc( + gwe, + budget_filerecord="{}.cbc".format(gwename), + temperature_filerecord="{}.ucn".format(gwename), + temperatureprintrecord=[ + ("COLUMNS", 17, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + printrecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + filename="{}.oc".format(gwename), + ) + + # Instantiating MODFLOW 6 multi-well energy transport (mwe) package + # ,, , , + mwepackagedata = [(0, 1.0, K_therm_maw, wthkcnd, "well1")] + + mweperioddata = {0: [(0, "RATE", 40.0)]} + + # note: for specifying lake number, use fortran indexing! + mwe_obs = { + "{}.mweobs".format(gwename): [ + ("MweTemp", "temperature", 1), + ] + } + + flopy.mf6.ModflowGwemwe( + gwe, + flow_package_name="MAW-1", + budget_filerecord=gwename + ".mwe.bud", + boundnames=True, + save_flows=True, + print_input=True, + print_flows=True, + print_temperature=True, + packagedata=mwepackagedata, + mweperioddata=mweperioddata, + observations=mwe_obs, + pname="MWE-1", + filename="{}.mwe".format(gwename), + ) + + # Instantiate GWF-GWE exchange + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname, + exgmnameb=gwename, + filename=f"{name}.gwfgwe", + ) + + return sim, None + + +def check_output(idx, test): + print("evaluating results...") + + top_local = [4.0, 3.0, 2.0, 1.0] + botm_local = [3.0, 2.0, 1.0, 0.0] + + # calculate volume of water and make sure it is conserved + name = cases[idx] + gwfname = "gwf-" + name + fname = gwfname + ".maw.bin" + fname = os.path.join(test.workspace, fname) + assert os.path.isfile(fname) + bobj = flopy.utils.HeadFile(fname, text="HEAD") + stage = bobj.get_alldata().flatten() + + name = cases[idx] + gwfname = "gwf-" + name + fname = gwfname + ".maw.cbc" + fname = os.path.join(test.workspace, fname) + assert os.path.isfile(fname) + bobj = flopy.utils.CellBudgetFile(fname, precision="double") + gwfarea = bobj.get_data(text="GWF") + + # Retrieve simulated temperature for the multi-aquifer well + gwename = "gwe-" + name + fname = gwename + ".mweobs" + mwtemp_file = os.path.join(test.workspace, fname) + assert os.path.isfile(mwtemp_file) + mwtemp = np.genfromtxt(mwtemp_file, names=True, delimiter=",") + mwtemp = mwtemp["MWETEMP"].astype(float).reshape((mwtemp.size, 1)) + + # Retrieve gw temperatures + fname = gwename + ".ucn" + fname = os.path.join(test.workspace, fname) + assert os.path.isfile(fname) + gwtempobj = flopy.utils.HeadFile( + fname, precision="double", text="TEMPERATURE" + ) + gwe_temps = gwtempobj.get_alldata() + + # Calculate conductive exchange external to MF6 and compare to MF6 values + # Evaluates first time step only + wellbore_cnd_time1 = [] + for i in np.arange(nlay): + if stage[0] > top_local[i]: + thk = top_local[i] - botm_local[i] + elif stage[0] > botm_local[i]: + thk = stage[0] - botm_local[i] + else: + thk = 0 + + # Check that MF6 (GWF) wellbore wetted area matches explicitly calc + + wa = 2 * mawradius * np.pi * thk + welborecnd = K_therm_maw * wa / wthkcnd + gw_temp = gwe_temps[0, i, 3, 3] + deltaT = mwtemp[0][0] - gw_temp + + wellbore_cnd_time1.append(welborecnd * deltaT) + + # Retrieve budget + fname = os.path.join(test.workspace, gwename + ".lst") + srchStr = ( + "MWE-1 BUDGET FOR ENTIRE MODEL AT END OF TIME STEP 1, " + "STRESS PERIOD 1" + ) + T_in, T_out, in_bud_lst, out_bud_lst = get_bud(fname, srchStr) + assert np.isclose( + T_in, T_out, atol=0.1 + ), "There is a heat budget discrepancy where there shouldn't be" + + msg1 = ( + "Conductive heat exchanges calculated explicitly and by MF6 " + "do not match" + ) + msg2 = ( + "Individually summing well bore 'heat flows' is not matching " + "the global budget heat flow into the aquifer" + ) + msg3 = "Groundwater should be warming, but isn't" + + # Get MF6 saved wellbore heat "flows" + srchStr = "MWE PACKAGE (MWE-1) FLOW RATES PERIOD 1 STEP 1" + wbcnd_mf6 = get_welbore_heat_flow(fname, srchStr) + + # Check top 3 layers (4th layer handled different) + for i in np.arange(nlay - 1): + assert np.isclose( + wbcnd_mf6[i, 1], round(wellbore_cnd_time1[i], 4) + ), msg1 + + # Layer 4 "heat flow" includes convection and conduction, compare + # "heat flow" from all layers to global budget line item 'IN: GWF' + glob_bud_gw_in = out_bud_lst["GWF"] + out_bud_lst["WELLBORE-COND"] + mwe_out = wbcnd_mf6.sum(axis=0)[1] + assert np.isclose(mwe_out, glob_bud_gw_in, rtol=1e-9), msg2 + + # Ensure that temperatures near the injection point are rising + slp = trenddetector(np.arange(gwe_temps.shape[0]), gwe_temps[:, 3, 3, 3]) + assert slp > 0.0, msg3 + + +# - No need to change any code below +@pytest.mark.parametrize( + "idx, name", + list(enumerate(cases)), +) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/autotest/test_gwe_sfe_strmbedcond.py b/autotest/test_gwe_sfe_strmbedcond.py new file mode 100644 index 00000000000..6c9deb027e8 --- /dev/null +++ b/autotest/test_gwe_sfe_strmbedcond.py @@ -0,0 +1,799 @@ +# Test conduction between an advanced package feature, in this case stream +# reaches with varying channel geometries and the host GWE gw cells. +# This test should include: +# - no gw-sw interaction +# - with gw-sw interaction +# - hot gw cell warming an upstream reach +# - thermally hot stream water warming host gw cells +# + +import os + +import flopy +import numpy as np +import pytest +import math +from framework import TestFramework + +cases = ["sfe-conductn", "sfe-conducti", "sfe-conducto", "sfe-conductm"] +# +# The last letter in the names above indicates the following +# n = "no gw/sw exchange" +# i = "gwf into strm" +# o = "strm to gw" +# m = "mixed" (i.e., convection one direction, conductive gradient the other direction?) + +k11 = 500.0 +rhk = [0.0, k11, k11, k11] +strt_gw_temp = [4.0, 4.0, 4.0, 20.0] +strm_temp = [18.0, 18.0, 20.0, 4.0] +chd_condition = ["n", "i", "o", "m"] +surf_Q_in = [ + [8.64, 0.0], + [8640.0, 0.0], + [8640.0, 0.0], + [8640.0, 0.0], +] # 86400 m^3/d = 1 m^3/s = 35.315 cfs + + +def get_x_frac(x_coord1, rwid): + x_xsec1 = [val / rwid for val in x_coord1] + return x_xsec1 + + +def get_xy_pts(x, y, rwid): + x_xsec1 = get_x_frac(x, rwid) + x_sec_tab = [[xx, hh] for xx, hh, in zip(x_xsec1, y)] + return x_sec_tab + + +# Model units +length_units = "m" +time_units = "days" + +# model domain and grid definition +Lx = 90.0 +Ly = 90.0 +nrow = 3 +ncol = 3 +nlay = 1 +delr = Lx / ncol +delc = Ly / nrow +xmax = ncol * delr +ymax = nrow * delc +X, Y = np.meshgrid( + np.linspace(delr / 2, xmax - delr / 2, ncol), + np.linspace(ymax - delc / 2, 0 + delc / 2, nrow), +) +ibound = np.ones((nlay, nrow, ncol)) +# Because eqn uses negative values in the Y direction, need to do a little manipulation +Y_m = -1 * np.flipud(Y) +top = np.array( + [ + [101.50, 101.25, 101.00], + [101.25, 101.00, 100.75], + [101.50, 101.25, 101.00], + ] +) + +botm = np.array( + [ + [98.5, 98.25, 98.0], + [98.25, 98.0, 97.75], + [98.5, 98.25, 98.0], + ] +) +strthd = 98.75 +chd_on = True + +# NPF parameters +ss = 0.00001 +sy = 0.20 +hani = 1 +laytyp = 1 + +# Package boundary conditions +sfr_evaprate = 0.1 +rwid = [9.0, 10.0, 20] +# Channel geometry: trapezoidal +x_sec_tab1 = get_xy_pts( + [0.0, 2.0, 4.0, 5.0, 7.0, 9.0], + [0.66666667, 0.33333333, 0.0, 0.0, 0.33333333, 0.66666667], + rwid[0], +) + +x_sec_tab2 = get_xy_pts( + [0.0, 2.0, 4.0, 6.0, 8.0, 10.0], + [0.5, 0.25, 0.0, 0.0, 0.25, 0.5], + rwid[1], +) + +x_sec_tab3 = get_xy_pts( + [0.0, 4.0, 8.0, 12.0, 16.0, 20.0], + [0.33333333, 0.16666667, 0.0, 0.0, 0.16666667, 0.33333333], + rwid[2], +) +x_sec_tab = [x_sec_tab1, x_sec_tab2, x_sec_tab3] + + +def calc_wp(j, stg): + if j < 1: + rise = 1 / 3 + run = 2 + bot_wid = 1.0 + elif j < 2: + rise = 1 / 4 + run = 2 + bot_wid = 2.0 + else: + rise = 1 / 6 + run = 4 + bot_wid = 4.0 + + ang = math.atan2(rise, run) + hyp_len = stg / math.sin(ang) + wp = hyp_len * 2 + bot_wid + + return wp + + +def process_line(line): + m_arr = line.strip().split() + if any("=" in itm and len(itm) > 1 for itm in m_arr): + m_arr = [ + float(itm.split("=")[-1]) if len(itm.split("=")) > 1 else itm + for itm in m_arr + ] + nm = m_arr[-2] + else: + nm = m_arr[-3] + val = m_arr[-1] + return {nm: float(val)} + + +def get_bud(fname, srchStr): + in_bud_lst = {} + out_bud_lst = {} + with open(fname, "r") as f: + for line in f: + if srchStr in line: + # Read the package budget + line = next(f) + while not "TOTAL IN =" in line: + if "=" in line: + in_bud_lst.update(process_line(line)) + + line = next(f) + + # Get "total in" + dct = process_line(line) + T_in = dct["IN"] + + line = next(f) + while not "TOTAL OUT =" in line: + if "=" in line: + out_bud_lst.update(process_line(line)) + + line = next(f) + + # Get "total out" + dct = process_line(line) + T_out = dct["OUT"] + + break + + return T_in, T_out, in_bud_lst, out_bud_lst + + +def trenddetector(list_of_index, array_of_data, order=1): + result = np.polyfit(list_of_index, list(array_of_data), order) + slope = result[-2] + return float(slope) + + +# Transport related parameters +porosity = sy # porosity (unitless) +K_therm = 2.0 # Thermal conductivity # ($W/m/C$) +rhow = 1000 # Density of water ($kg/m^3$) +rhos = 2650 # Density of the aquifer material ($kg/m^3$) +Cpw = 4180 # Heat capacity of water ($J/kg/C$) +Cps = 880 # Heat capacity of the solids ($J/kg/C$) +lhv = 2454000.0 # Latent heat of vaporization ($J/kg$) +K_therm_strmbed = [ + 1.5, + 1.75, + 2.0, +] # Thermal conductivity of the streambed material ($W/m/C$) +rbthcnd = [0.0001, 0.0001, 0.0001, 0.0001] + +# time params +steady = {0: False, 1: False} +transient = {0: True, 1: True} +nstp = [1, 1] +tsmult = [1, 1] +perlen = [1, 1] + +nouter, ninner = 1000, 300 +hclose, rclose, relax = 1e-3, 1e-4, 0.97 + +# +# MODFLOW 6 flopy GWF object +# + + +def build_models(idx, test): + # Base simulation and model name and workspace + ws = test.workspace + name = cases[idx] + + print("Building model...{}".format(name)) + + # generate names for each model + gwfname = "gwf-" + name + gwename = "gwe-" + name + + sim = flopy.mf6.MFSimulation( + sim_name=name, sim_ws=ws, exe_name="mf6", version="mf6" + ) + + # Instantiating time discretization + tdis_rc = [] + for i in range(len(nstp)): + tdis_rc.append((perlen[i], nstp[i], tsmult[i])) + + flopy.mf6.ModflowTdis( + sim, nper=len(nstp), perioddata=tdis_rc, time_units=time_units + ) + + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=gwfname, + save_flows=True, + newtonoptions="newton", + ) + + # Instantiating solver + ims = flopy.mf6.ModflowIms( + sim, + print_option="ALL", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="cooley", + inner_maximum=ninner, + inner_dvclose=hclose, + rcloserecord=rclose, + linear_acceleration="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwfname), + ) + sim.register_ims_package(ims, [gwfname]) + + # Instantiate discretization package + flopy.mf6.ModflowGwfdis( + gwf, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + ) + + # Instantiate node property flow package + flopy.mf6.ModflowGwfnpf( + gwf, + save_specific_discharge=True, + icelltype=1, # >0 means saturated thickness varies with computed head + k=k11, + ) + + # Instantiate storage package + flopy.mf6.ModflowGwfsto( + gwf, + save_flows=False, + iconvert=laytyp, + ss=ss, + sy=sy, + steady_state=steady, + transient=transient, + ) + + # Instantiate initial conditions package + flopy.mf6.ModflowGwfic(gwf, strt=strthd) + + # Instantiate output control package + flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord=f"{gwfname}.cbc", + head_filerecord=f"{gwfname}.hds", + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + printrecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + ) + + # Instantiate constant head boundary package + if chd_condition[idx] == "n": + chdelev1 = top[0, 0] - 3.0 + chdelev2 = top[0, -1] - 3.0 + elif chd_condition[idx] == "i": + chdelev1 = top[0, 0] - 0.05 + chdelev2 = top[0, -1] - 0.05 + elif chd_condition[idx] == "o": + chdelev1 = top[0, 0] - 3.0 + chdelev2 = top[0, -1] - 3.0 + elif chd_condition[idx] == "m": + chdelev1 = top[0, 0] - 3.0 # convection from stream to gw, + chdelev2 = top[0, -1] - 3.0 # conduction from gw to strm + + # Instatiate constant head boundary package + if chd_on: + chdlist1 = [ + [(0, 0, 0), chdelev1, strt_gw_temp[idx]], + [(0, 0, ncol - 1), chdelev2, strt_gw_temp[idx]], + [(0, nrow - 1, 0), chdelev1, strt_gw_temp[idx]], + [(0, nrow - 1, ncol - 1), chdelev2, strt_gw_temp[idx]], + ] + flopy.mf6.ModflowGwfchd( + gwf, + stress_period_data=chdlist1, + print_input=True, + print_flows=True, + save_flows=False, + pname="CHD-1", + auxiliary="TEMPERATURE", + filename=f"{gwfname}.chd", + ) + + # Instantiate streamflow routing package + # Determine the middle row and store in rMid (account for 0-base) + rMid = 1 + # sfr data + nreaches = ncol + rlen = delr + roughness = 0.035 + rbth = 1.0 + strmbd_hk = rhk[idx] + strm_up = 100.25 + strm_dn = 99 + slope = ( + (strm_up - strm_dn) / ((ncol - 1) * delr) / 10 + ) # divide by 10 to further reduce slop + ustrf = 1.0 + ndv = 0 + strm_incision = 1.0 + + # use trapezoidal cross-section for channel geometry + sfr_xsec_tab_nm1 = "{}.xsec.tab1".format(gwfname) + sfr_xsec_tab_nm2 = "{}.xsec.tab2".format(gwfname) + sfr_xsec_tab_nm3 = "{}.xsec.tab3".format(gwfname) + sfr_xsec_tab_nm = [sfr_xsec_tab_nm1, sfr_xsec_tab_nm2, sfr_xsec_tab_nm3] + crosssections = [] + for n in range(nreaches): + # 3 reaches, 3 cross section types + crosssections.append([n, sfr_xsec_tab_nm[n]]) + + # Setup the tables + for n in range(len(x_sec_tab)): + flopy.mf6.ModflowUtlsfrtab( + gwf, + nrow=len(x_sec_tab[n]), + ncol=2, + table=x_sec_tab[n], + filename=sfr_xsec_tab_nm[n], + pname=f"sfrxsectable" + str(n + 1), + ) + + packagedata = [] + for irch in range(nreaches): + nconn = 1 + if 0 < irch < nreaches - 1: + nconn += 1 + rp = [ + irch, + (0, rMid, irch), + rlen, + rwid[irch], + slope, + top[rMid, irch] - strm_incision, + rbth, + strmbd_hk, + roughness, + nconn, + ustrf, + ndv, + ] + packagedata.append(rp) + + connectiondata = [] + for irch in range(nreaches): + rc = [irch] + if irch > 0: + rc.append(irch - 1) + if irch < nreaches - 1: + rc.append(-(irch + 1)) + connectiondata.append(rc) + + sfr_perioddata = {} + for t in np.arange(len(surf_Q_in[idx])): + sfrbndx = [] + for i in np.arange(nreaches): + if i == 0: + sfrbndx.append([i, "INFLOW", surf_Q_in[idx][t]]) + # sfrbndx.append([i, "EVAPORATION", sfr_evaprate]) + + sfr_perioddata.update({t: sfrbndx}) + + # Instantiate SFR observation points + sfr_obs = { + "{}.sfr.obs.csv".format(gwfname): [ + ("rch1_depth", "depth", 1), + ("rch2_depth", "depth", 2), + ("rch3_depth", "depth", 3), + ], + "digits": 8, + "print_input": True, + "filename": name + ".sfr.obs", + } + + budpth = f"{gwfname}.sfr.cbc" + flopy.mf6.ModflowGwfsfr( + gwf, + save_flows=True, + print_stage=True, + print_flows=True, + print_input=True, + length_conversion=1.0, + time_conversion=86400, + budget_filerecord=budpth, + mover=False, + nreaches=nreaches, + packagedata=packagedata, + connectiondata=connectiondata, + crosssections=crosssections, + perioddata=sfr_perioddata, + observations=sfr_obs, + pname="SFR-1", + filename="{}.sfr".format(gwfname), + ) + + # -------------------------------------------------- + # Setup the GWE model for simulating heat transport + # -------------------------------------------------- + gwe = flopy.mf6.ModflowGwe(sim, modelname=gwename) + + # Instantiating solver for GWT + imsgwe = flopy.mf6.ModflowIms( + sim, + print_option="ALL", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="NONE", + inner_maximum=ninner, + inner_dvclose=hclose, + rcloserecord=rclose, + linear_acceleration="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwename), + ) + sim.register_ims_package(imsgwe, [gwename]) + + # Instantiating DIS for GWE + flopy.mf6.ModflowGwedis( + gwe, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + pname="DIS", + filename="{}.dis".format(gwename), + ) + + # Instantiate Mobile Storage and Transfer package + flopy.mf6.ModflowGweest( + gwe, + save_flows=True, + porosity=porosity, + cps=Cps, + rhos=rhos, + packagedata=[Cpw, rhow, lhv], + pname="EST", + filename="{}.est".format(gwename), + ) + + # Instantiate Energy Transport Initial Conditions package + flopy.mf6.ModflowGweic(gwe, strt=strt_gw_temp[idx]) + + # Instantiate Advection package + flopy.mf6.ModflowGweadv(gwe, scheme="UPSTREAM") + + # Instantiate Dispersion package (also handles conduction) + flopy.mf6.ModflowGwecnd( + gwe, + xt3d_off=True, + ktw=0.5918, + kts=0.2700, + pname="CND", + filename="{}.cnd".format(gwename), + ) + + # Instantiating MODFLOW 6 transport source-sink mixing package + # [b/c at least one boundary back is active (SFR), ssm must be on] + sourcerecarray = [("CHD-1", "AUX", "TEMPERATURE")] + flopy.mf6.ModflowGwessm( + gwe, sources=sourcerecarray, filename="{}.ssm".format(gwename) + ) + + # Instantiate Streamflow Energy Transport package + sfepackagedata = [] + for irno in range(ncol): + t = (irno, strm_temp[idx], K_therm_strmbed[irno], rbthcnd[idx]) + sfepackagedata.append(t) + + sfeperioddata = [] + for irno in range(ncol): + if irno == 0: + sfeperioddata.append((irno, "INFLOW", strm_temp[idx])) + # sfeperioddata.append((irno, sfr_applied_bnd[idx], sfe_applied_temp[idx])) + + flopy.mf6.modflow.ModflowGwesfe( + gwe, + boundnames=False, + save_flows=True, + print_input=False, + print_flows=False, + print_temperature=True, + temperature_filerecord=gwename + ".sfe.bin", + budget_filerecord=gwename + ".sfe.bud", + packagedata=sfepackagedata, + reachperioddata=sfeperioddata, + flow_package_name="SFR-1", + pname="SFE-1", + filename="{}.sfe".format(gwename), + ) + + # Instantiate Output Control package for transport + flopy.mf6.ModflowGweoc( + gwe, + temperature_filerecord="{}.ucn".format(gwename), + saverecord=[("TEMPERATURE", "ALL")], + temperatureprintrecord=[ + ("COLUMNS", 3, "WIDTH", 20, "DIGITS", 8, "GENERAL") + ], + printrecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + filename="{}.oc".format(gwename), + ) + + # Instantiate Gwf-Gwe Exchange package + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname, + exgmnameb=gwename, + filename="{}.gwfgwe".format(gwename), + ) + + return sim, None + + +def check_output(idx, test): + print("evaluating results...") + + # read flow results from model + name = cases[idx] + gwfname = "gwf-" + name + + fname = gwfname + ".sfr.cbc" + fname = os.path.join(test.workspace, fname) + assert os.path.isfile(fname) + + sfrobj = flopy.utils.binaryfile.CellBudgetFile(fname, precision="double") + sfr_wetted_interface_area = sfrobj.get_data(text="gwf") + + # Retrieve simulated stage of each reach + sfr_pth0 = os.path.join(test.workspace, f"{gwfname}.sfr.obs.csv") + sfrstg = np.genfromtxt(sfr_pth0, names=True, delimiter=",") + + # Extract shared wetted interfacial areas + shared_area = [] + for t in range(len(sfr_wetted_interface_area)): + sp_area = [] + for i in range(ncol): + sp_area.append(sfr_wetted_interface_area[t][i][3]) + + shared_area.append(sp_area) + + shared_area = np.array(shared_area) + + # Calculate wetted streambed area for comparison + for j, stg in enumerate(list(sfrstg[0])[1:]): + wp = calc_wp(j, stg) + wa = wp * delr + msg = ( + "Wetted streambed area for reach " + + str(j) + + "in stress period 1 does not match explicitly-calculated answer" + ) + assert np.isclose(wa, shared_area[0, j], atol=1e-4), msg + + msg = ( + "Wetted streambed area of all reaches should be zero in stess " + "period 2" + ) + for val in list(sfrstg[1])[1:]: + assert val == 0.0, msg + + # Sub-scenario checks + # initialize search term + srchStr = "SFE-1 BUDGET FOR ENTIRE MODEL AT END OF TIME STEP 1, STRESS PERIOD 1" + fname = "gwe-" + name + ".lst" + fname = os.path.join(test.workspace, fname) + + # gw exchng (item 'GWF') should be zero in heat transport budget + T_in, T_out, in_bud_lst, out_bud_lst = get_bud(fname, srchStr) + assert np.isclose( + T_in, T_out, atol=0.1 + ), "There is a heat budget discrepancy" + + # Get temperature of streamwater + fname1 = "gwe-" + name + ".sfe.bin" + fname1 = os.path.join(test.workspace, fname1) + sfeobj = flopy.utils.HeadFile( + fname1, precision="double", text="TEMPERATURE" + ) + sfe_temps = sfeobj.get_alldata() + + # Get temperature of gw + fname2 = "gwe-" + name + ".ucn" + fname2 = os.path.join(test.workspace, fname2) + gwobj = flopy.utils.HeadFile( + fname2, precision="double", text="TEMPERATURE" + ) + gw_temps = gwobj.get_alldata() + + msg1 = "Budget item 'GWF' should be 0.0 for this scenario" + msg2 = "Thermal conduction is occurring in the wrong direction" + msg3 = ( + "There should be a decreasing temperatures trend in " + "downstream direction owing to conductive losses" + ) + msg4 = ( + "There should be an increasing temperature trend in " + "the row of cells hosting the stream owing to increasing " + "conductive losses from the stream to the aquifer " + "(i.e., greater shared wetted areas)" + ) + if ( + name[-1] == "n" + ): # no gw/sw convective exchange, simulates conductive exchange only + + assert in_bud_lst["GWF"] == 0.0, msg1 + assert out_bud_lst["GWF"] == 0.0, msg1 + + # Determine gw/sfe temperature gradient direction + if sfe_temps[0, 0, 0, 0] > gw_temps[0, 0, 0, 0]: + # conduction will be from stream to gw + assert in_bud_lst["STREAMBED-COND"] == 0.0, msg2 + assert out_bud_lst["STREAMBED-COND"] > 0.0, msg2 + + slp = trenddetector( + np.arange(0, sfe_temps.shape[-1]), sfe_temps[0, 0, 0, :] + ) + assert slp < 0.0, msg3 + + slp = trenddetector( + np.arange(0, gw_temps.shape[-2]), gw_temps[0, 0, 1, :] + ) + assert slp > 0.0, msg4 + + else: + assert in_bud_lst["STREAMBED-COND"] > 0.0, msg2 + assert out_bud_lst["STREAMBED-COND"] == 0.0, msg2 + + # streamflow gain from aquifer ("into stream") + if name[-1] == "i": + + msg = "Budget item 'GWF' should reflect heat entering stream" + assert in_bud_lst["GWF"] > 0.0, msg + assert out_bud_lst["GWF"] == 0.0, msg + + # Determine gw/sfe temperature gradient direction + if sfe_temps[0, 0, 0, 0] > gw_temps[0, 0, 0, 0]: + # conduction will be from stream to gw + assert in_bud_lst["STREAMBED-COND"] == 0.0, msg2 + assert out_bud_lst["STREAMBED-COND"] > 0.0, msg2 + + slp = trenddetector( + np.arange(0, sfe_temps.shape[-1]), sfe_temps[0, 0, 0, :] + ) + assert slp < 0.0, msg3 + + slp = trenddetector( + np.arange(0, gw_temps.shape[-2]), gw_temps[0, 0, 1, :] + ) + assert slp > 0.0, msg4 + + else: + assert in_bud_lst["STREAMBED-COND"] > 0.0, msg2 + assert out_bud_lst["STREAMBED-COND"] == 0.0, msg2 + + # streamflow loss to aquifer ("out of stream") + if name[-1] == "o": + + msg = "Budget item 'GWF' should reflect heat exiting stream" + assert in_bud_lst["GWF"] == 0.0, msg + assert out_bud_lst["GWF"] > 0.0, msg + + # Determine gw/sfe temperature gradient direction + if sfe_temps[0, 0, 0, 0] > gw_temps[0, 0, 0, 0]: + # conduction will be from stream to gw + assert in_bud_lst["STREAMBED-COND"] == 0.0, msg2 + assert out_bud_lst["STREAMBED-COND"] > 0.0, msg2 + + slp = trenddetector( + np.arange(0, sfe_temps.shape[-1]), sfe_temps[0, 0, 0, :] + ) + assert slp < 0.0, msg3 + + slp = trenddetector( + np.arange(0, gw_temps.shape[-2]), gw_temps[0, 0, 1, :] + ) + assert slp < 0.0, msg4 + + else: + assert in_bud_lst["STREAMBED-COND"] > 0.0, msg2 + assert out_bud_lst["STREAMBED-COND"] == 0.0, msg2 + + # Reverse temperature gradient (cold stream, warm aquifer) + # Loss of streamwater to aquifer + # Thus, convection from strm to gw, conduction from gw to strm + if name[-1] == "m": # 'm' for mixed + + msg = "Budget item 'GWF' should reflect heat exiting stream" + assert in_bud_lst["GWF"] == 0.0, msg + assert out_bud_lst["GWF"] > 0.0, msg + + # Determine gw/sfe temperature gradient direction + if sfe_temps[0, 0, 0, 0] > gw_temps[0, 0, 0, 0]: + # conduction will be from stream to gw + assert in_bud_lst["STREAMBED-COND"] == 0.0, msg2 + assert out_bud_lst["STREAMBED-COND"] > 0.0, msg2 + + else: + assert in_bud_lst["STREAMBED-COND"] > 0.0, msg2 + assert out_bud_lst["STREAMBED-COND"] == 0.0, msg2 + + slp = trenddetector( + np.arange(0, sfe_temps.shape[-1]), sfe_temps[0, 0, 0, :] + ) + assert slp > 0.0, msg3 + + slp = trenddetector( + np.arange(0, gw_temps.shape[-2]), gw_temps[0, 0, 1, :] + ) + assert slp > 0.0, msg4 + + +# - No need to change any code below +@pytest.mark.parametrize( + "idx, name", + list(enumerate(cases)), +) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/autotest/test_gwe_stallman.py b/autotest/test_gwe_stallman.py new file mode 100644 index 00000000000..ddbf90a8252 --- /dev/null +++ b/autotest/test_gwe_stallman.py @@ -0,0 +1,404 @@ +# ## Test problem for GWE +# +# One-Dimensional Stallman Problem +# Compare MF6-GWE simulation results with analytical solution + + +# Imports +import os +import numpy as np +import pytest +import matplotlib.pyplot as plt +import flopy + +from framework import TestFramework + +# Base simulation and model name and workspace + +viscosity_on = [False] +cases = ["stallman"] + +# Model units + +length_units = "meters" +time_units = "seconds" + +# Table MODFLOW 6 GWE parameters + +nper = 600 # Number of periods +nstp = 6 # Number of time steps +perlen = 525600 # Simulation time length ($s$) +nlay = 120 # Number of layers +nrow = 1 # Number of rows +ncol = 1 # Number of columns +system_length = 60.0 # Length of system ($m$) +delr = 1.0 # Column width ($m$) +delc = 1.0 # Row width ($m$) +delv_str = "ranges from 0.1 to 1" # Layer thickness +top = 60.0 # Top of the model ($m$) +hydraulic_conductivity = 1.0e-4 # Hydraulic conductivity ($m s^{-1}$) +porosity = 0.35 # Porosity (unitless) +alphal = 0.0 # Longitudinal dispersivity ($m$) +alphat = 0.0 # Transverse dispersivity ($m$) +diffc = 1.02882e-06 # Diffusion coefficient ($m s^{-1}$) +T_az = 10 # Ambient temperature ($^o C$) +dT = 5 # Temperature variation ($^o C$) +bulk_dens = 2630 # Bulk density ($kg/m^3$) +kd = 0.000191663 # Distribution coefficient (unitless) +ktw = 0.58 +kts = 2 +cpw = 4174.0 +cps = 800.0 +rhow = 1000.0 +rhos = bulk_dens +lhv = 2454000.0 # Latent heat of vaporization ($J/kg$) + +# Stress period input +per_data = [] +for k in range(nper): + per_data.append((perlen, nstp, 1.0)) +per_mf6 = per_data + +# Geometry input +tp = top +botm = [] +for i in range(nlay): + if i == 0: + botm.append(59.9) + elif i == 119: + botm.append(0.0) + else: + botm.append(60 - i * 0.5) + +# Head input +chd_data = {} +# for k in range(nper): +chd_data[0] = [[(0, 0, 0), 60.000000], [(119, 0, 0), 59.701801]] +chd_mf6 = chd_data + +# Initial temperature input +strt_temp = T_az * np.ones((nlay, 1, 1), dtype=np.float32) + +# Boundary temperature input +cnc_data = {} +for k in range(nper): + cnc_temp = T_az + dT * np.sin(2 * np.pi * k * perlen / 365 / 86400) + cnc_data[k] = [[(0, 0, 0), cnc_temp]] +cnc_mf6 = cnc_data + +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-8, 1e-8, 0.97 + + +# Analytical solution for Stallman analysis (Stallman 1965, JGR) +def Stallman(T_az, dT, tau, t, c_rho, darcy_flux, ko, c_w, rho_w, zbotm, nlay): + zstallman = np.zeros((nlay, 2)) + K = np.pi * c_rho / ko / tau + V = darcy_flux * c_w * rho_w / 2 / ko + a = ((K ** 2 + V ** 4 / 4) ** 0.5 + V ** 2 / 2) ** 0.5 - V + b = ((K ** 2 + V ** 4 / 4) ** 0.5 - V ** 2 / 2) ** 0.5 + for i in range(len(zstallman)): + zstallman[i, 0] = zbotm[i] + zstallman[i, 1] = ( + dT + * np.exp(-a * (-zstallman[i, 0])) + * np.sin(2 * np.pi * t / tau - b * (-zstallman[i, 0])) + + T_az + ) + return zstallman + + +# +# MODFLOW 6 (sim) flopy objects returned if building the model +# + + +def build_models(idx, test): + # Base MF6 GWE model type + ws = test.workspace + name = cases[idx] + + print("Building MF6 model...()".format(name)) + + # generate names for each model + gwfname = "gwf-" + name + gwename = "gwe-" + name + + # sim_ws = os.path.join(ws, name) + sim = flopy.mf6.MFSimulation( + sim_name=name, sim_ws=ws, exe_name="mf6", version="mf6" + ) + + # Instantiating MODFLOW 6 time discretization + flopy.mf6.ModflowTdis( + sim, nper=nper, perioddata=per_mf6, time_units=time_units + ) + + # Instantiating MODFLOW 6 groundwater flow model + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=gwfname, + save_flows=True, + model_nam_file="{}.nam".format(gwfname), + ) + + # Instantiating MODFLOW 6 solver for flow model + imsgwf = 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, + filename="{}.ims".format(gwfname), + ) + sim.register_ims_package(imsgwf, [gwfname]) + + # Instantiating MODFLOW 6 discretization package + flopy.mf6.ModflowGwfdis( + gwf, + nogrb=True, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + filename="{}.dis".format(gwfname), + ) + + # Instantiating MODFLOW 6 node-property flow package + flopy.mf6.ModflowGwfnpf( + gwf, + save_specific_discharge=True, + icelltype=0, + k=hydraulic_conductivity, + filename="{}.npf".format(gwfname), + ) + + # Instantiating MODFLOW 6 initial conditions package for flow model + flopy.mf6.ModflowGwfic(gwf, strt=top, filename="{}.ic".format(gwfname)) + + # Instantiating VSC + if viscosity_on[idx]: + # Instantiate viscosity (VSC) package + vsc_filerecord = "{}.vsc.bin".format(gwfname) + vsc_pd = [(0, 0.0, 20.0, gwename, "temperature")] + flopy.mf6.ModflowGwfvsc( + gwf, + viscref=8.904e-4, + viscosity_filerecord=vsc_filerecord, + thermal_formulation="nonlinear", + thermal_a2=10.0, + thermal_a3=248.37, + thermal_a4=133.16, + nviscspecies=len(vsc_pd), + packagedata=vsc_pd, + pname="vsc", + filename="{}.vsc".format(gwfname), + ) + + # Instantiating MODFLOW 6 constant head package + flopy.mf6.ModflowGwfchd( + gwf, + stress_period_data=chd_mf6, + filename="{}.chd".format(gwfname), + ) + + # Instantiating MODFLOW 6 output control package for flow model + flopy.mf6.ModflowGwfoc( + gwf, + head_filerecord="{}.hds".format(gwfname), + budget_filerecord="{}.cbc".format(gwfname), + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + printrecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + ) + + # ---------------------------------- + # Instantiating MODFLOW 6 GWE model + # ---------------------------------- + + # Instantiating MODFLOW 6 groundwater heat transport package + gwe = flopy.mf6.MFModel( + sim, + model_type="gwe6", + modelname=gwename, + model_nam_file="{}.nam".format(gwename), + ) + gwe.name_file.save_flows = True + imsgwe = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwename), + ) + sim.register_ims_package(imsgwe, [gwe.name]) + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwedis( + gwe, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + filename="{}.dis".format(gwename), + ) + + # Instantiating MODFLOW 6 transport initial concentrations + flopy.mf6.ModflowGweic( + gwe, strt=strt_temp, filename="{}.ic".format(gwename) + ) + + # Instantiating MODFLOW 6 transport advection package + flopy.mf6.ModflowGweadv( + gwe, scheme="TVD", filename="{}.adv".format(gwename) + ) + + # Instantiating MODFLOW 6 transport dispersion package + flopy.mf6.ModflowGwecnd( + gwe, + xt3d_off=True, + alh=alphal, + ath1=alphat, + ktw=ktw, + kts=kts, + pname="CND-1", + filename="{}.dsp".format(gwename), + ) + + # Instantiating MODFLOW 6 transport mass storage package (formerly "reaction" package in MT3DMS) + flopy.mf6.ModflowGweest( + gwe, + porosity=porosity, + cps=cps, + rhos=rhos, + packagedata=[cpw, rhow, lhv], + filename="{}.mst".format(gwename), + ) + + # Instantiating MODFLOW 6 transport constant concentration package + flopy.mf6.ModflowGwectp( + gwe, + stress_period_data=cnc_mf6, + pname="CTP-1", + filename="{}.tmp".format(gwename), + ) + + # Instantiating MODFLOW 6 transport source-sink mixing package + flopy.mf6.ModflowGwessm( + gwe, sources=[[]], filename="{}.ssm".format(gwename) + ) + + # Instantiate MODFLOW 6 heat transport output control package + flopy.mf6.ModflowGweoc( + gwe, + budget_filerecord="{}.cbc".format(gwename), + temperature_filerecord="{}.ucn".format(gwename), + temperatureprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], + printrecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], + ) + + # Instantiating MODFLOW 6 flow-transport exchange mechanism + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname, + exgmnameb=gwename, + filename="{}.gwfgwe".format(name), + ) + return sim, None + + +def check_output(idx, test): + print("evaluating results...") + + # read transport results from GWE model + name = cases[idx] + gwename = "gwe-" + name + + fpth = os.path.join(test.workspace, f"{gwename}.ucn") + try: + # load temperatures + tobj = flopy.utils.HeadFile( + fpth, precision="double", text="TEMPERATURE" + ) + times = tobj.get_times() + sim_temps = tobj.get_data(totim=times[540]) + except: + assert False, f'could not load concentration data from "{fpth}"' + + # Prepare to compare the results of MF6-GWE with analytical solution + zconc = np.zeros((nlay, 2)) + for i in range(nlay): + if i != (nlay - 1): + zconc[i + 1, 0] = -(60 - botm[i]) + zconc[i, 1] = sim_temps[i][0][0] + + # Analytical solution - Stallman analysis + tau = 365 * 86400 + t = 283824000.0 + c_w = 4174 + rho_w = 1000 + c_r = 800 + rho_r = 2630 + c_rho = c_r * rho_r * (1 - porosity) + c_w * rho_w * porosity + darcy_flux = 5.00e-07 + ko = 1.503 + analytical_temps = Stallman( + T_az, dT, tau, t, c_rho, darcy_flux, ko, c_w, rho_w, zconc[:, 0], nlay + ) + + # plt.plot(zconc[:, 1], zconc[:, 0], "k--", linewidth=0.5, label="MF6-GWE") + # plt.plot(zanal[:, 1], zanal[:, 0], "bo", mfc="none", label="Analytical") + # plt.xlim(T_az - dT, T_az + dT) + # plt.ylim(-top, 0) + # plt.ylabel("Depth (m)") + # plt.xlabel("Temperature (deg C)") + # plt.legend() + # plt.savefig("stallman.png") + + msg = f"gwe temperatures do not match analytical temperatures" + assert np.allclose(zconc[:, 1], analytical_temps[:, 1], atol=1e-1), msg + + return + + +# - No need to change any code below +@pytest.mark.parametrize( + "idx, name", + list(enumerate(cases)), +) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/autotest/test_gwe_uze00.py b/autotest/test_gwe_uze00.py new file mode 100644 index 00000000000..5ef6a0e885e --- /dev/null +++ b/autotest/test_gwe_uze00.py @@ -0,0 +1,612 @@ +# +# - Outer columns not active for unsaturated zone, but are present to host +# constant head boundaries at the bottom of the model. +# +# +-------+ +# |///////| = Inactive cell +# +-------+ +# +# Model depiction: +# +# +-------+-------+-------+ +# |///////| |///////| Layer 1 +# +-------+-------+-------+ +# |///////| |///////| Layer 2 +# +-------+-------+-------+ +# |///////| |///////| Layer 3 +# +-------+-------+-------+ +# |///////| |///////| +# + -- -- + -- -- + -- -- + +# |///////| |///////| Layer x (Middle portion of model not shown) +# + -- -- + -- -- + -- -- + +# |///////| |///////| +# +-------+-------+-------+ +# | | | | Layer 99 +# +-------+-------+-------+ +# | | | | Layer 100 +# +-------+-------+-------+ + +import os + +import flopy +import numpy as np +import pytest +from framework import TestFramework + +import flopy.utils.binaryfile as bf +import math + +import matplotlib.pyplot as plt + + +# Analytical solution, from Barends (2010) Equation 5 +def temp_analyt(t, z, t0, tinfil, v, d): + if t == 0.0: + temp = t0 + else: + denom = 2.0 * math.sqrt(d * t) + ztermm = (z - v * t) / denom + ztermp = (z + v * t) / denom + vterm = v * z / d + if vterm < 100.0: + # might need to adjust this limit + temp = t0 + 0.5 * (tinfil - t0) * ( + math.erfc(ztermm) + math.exp(vterm) * math.erfc(ztermp) + ) + else: + zeta = 1.0 / (1.0 + 0.47047 * ztermp) + polyterm = zeta * ( + 0.3480242 + zeta * (-0.0958798 + zeta * 0.7478556) + ) + temp = t0 + 0.5 * (tinfil - t0) * ( + math.erfc(ztermm) + math.exp(vterm - ztermp ** 2) * polyterm + ) + + return temp + + +# Model units +length_units = "meters" +time_units = "days" + +nlay, nrow, ncol = 101, 1, 3 +nper = 2 +perlen = [1.0e9, 100.0] +nstp = [1, 100] +tsmult = len(perlen) * [1.0] + +delr = 1.0 +delc = 1.0 +delz = 0.1 # 10 cm +strt = 0.05 +top = 10.0005 +botm = [ + 9.9995 +] # Top layer is very thin for application of the boundary condition +for i in np.arange(1, nlay): + bot = 10.0 - (i * delz) + botm.append(round(bot, 1)) + +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-9, 1e-3, 0.97 +steady = {0: False, 1: False} +transient = {0: True, 1: True} + +idomain_u = [0, 1, 0] +idomain_l = [1, 1, 1] +idomain = [] +for i in np.arange(nlay): + if i < 99: + idomain.append(idomain_u) + else: + idomain.append(idomain_l) + +idomain = np.array(idomain) + +strt_temp = 10.0 +scheme = "UPSTREAM" +dispersivity = 0.0 +prsity = 0.2 + +# transient uzf info +# iuzno cellid landflg ivertcn surfdp vks thtr thts thti eps [bndnm] +uzf_pkdat = [[0, (0, 0, 1), 1, 1, 0.00001, 1, 0.0001, 0.20, 0.055, 4]] + +# Continue building the UZF list of objects +for iuzno in np.arange(1, 101, 1): + if iuzno < 99: + ivertconn = iuzno + 1 + else: + ivertconn = -1 + + uzf_pkdat.append( + [iuzno, (iuzno, 0, 1), 0, ivertconn, 0.01, 1, 0.0001, 0.20, 0.055, 4] + ) + +iuz_cell_dict = {} +cell_iuz_dict = {} +for i, itm in enumerate(uzf_pkdat): + iuz_cell_dict.update({itm[0]: (itm[1][0], itm[1][1], itm[1][2])}) + cell_iuz_dict.update({(itm[1][0], itm[1][1], itm[1][2]): itm[0]}) + +finf = 0.01 +extdp = 0.0 +pet = 0.0 +extwc = 0.0 +zero = 0.0 +uzf_spd = { + 0: [[0, finf, pet, extdp, extwc, zero, zero, zero]], + 1: [[0, finf, pet, extdp, extwc, zero, zero, zero]], +} + +cases = ["uze00"] + + +def build_models(idx, test): + name = cases[idx] + + # build MODFLOW 6 files + ws = test.workspace + sim = flopy.mf6.MFSimulation( + sim_name=name, version="mf6", exe_name="mf6", sim_ws=ws + ) + + # create tdis package + tdis_rc = [] + for i in range(nper): + tdis_rc.append((perlen[i], nstp[i], tsmult[i])) + + flopy.mf6.ModflowTdis( + sim, time_units=time_units, nper=nper, perioddata=tdis_rc + ) + + gwfname = "gwf_" + name + gwename = "gwe_" + name + + newtonoptions = ["NEWTON", "UNDER_RELAXATION"] + # create gwf model + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=gwfname, + newtonoptions=newtonoptions, + save_flows=True, + ) + + # create iterative model solution and register the gwf model with it + ims = flopy.mf6.ModflowIms( + sim, + print_option="SUMMARY", + complexity="MODERATE", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="DBD", + inner_maximum=ninner, + inner_dvclose=hclose, + rcloserecord=rclose, + linear_acceleration="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename=f"{gwfname}.ims", + ) + sim.register_ims_package(ims, [gwf.name]) + + flopy.mf6.ModflowGwfdis( + gwf, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=idomain, + filename=f"{gwfname}.dis", + ) + + # initial conditions + flopy.mf6.ModflowGwfic( + gwf, + strt=strt, + filename=f"{gwfname}.ic", + ) + + # node property flow + flopy.mf6.ModflowGwfnpf( + gwf, + save_flows=True, + icelltype=1, + k=100.0, + k33=10, + filename=f"{gwfname}.npf", + ) + + # aquifer storage + flopy.mf6.ModflowGwfsto( + gwf, + iconvert=1, + ss=1e-5, + sy=prsity, + steady_state=steady, + transient=transient, + filename=f"{gwfname}.sto", + ) + + # chd files + chdval = 0.05 + chdspd = {0: [[(100, 0, 0), chdval, 10.0], [(100, 0, 2), chdval, 10.0]]} + + flopy.mf6.ModflowGwfchd( + gwf, + auxiliary=["TEMPERATURE"], + print_flows=True, + stress_period_data=chdspd, + pname="CHD-1", + filename=f"{gwfname}.chd", + ) + + # Unsaturated-zone flow package + flopy.mf6.ModflowGwfuzf( + gwf, + print_flows=True, + save_flows=True, + wc_filerecord=gwfname + ".uzfwc.bin", + simulate_et=False, + simulate_gwseep=False, + linear_gwet=False, + boundnames=False, + ntrailwaves=15, + nwavesets=40, + nuzfcells=len(uzf_pkdat), + packagedata=uzf_pkdat, + perioddata=uzf_spd, + budget_filerecord=f"{gwfname}.uzf.bud", + pname="UZF-1", + filename=f"{gwfname}.uzf", + ) + + # output control + flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord=f"{name}.cbc", + head_filerecord=f"{name}.hds", + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + printrecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + filename=f"{gwfname}.oc", + ) + + # ---------------------------------- + # Instantiating MODFLOW 6 GWE model + # ---------------------------------- + gwe = flopy.mf6.ModflowGwe( + sim, modelname=gwename, model_nam_file=f"{gwename}.nam" + ) + gwe.name_file.save_flows = True + + imsgwe = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwename), + ) + sim.register_ims_package(imsgwe, [gwe.name]) + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwedis( + gwe, + nogrb=True, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=idomain, + pname="DIS", + filename=f"{gwename}.dis", + ) + + # Instantiating MODFLOW 6 transport initial concentrations + flopy.mf6.ModflowGweic( + gwe, + strt=strt_temp, + pname="IC", + filename=f"{gwename}.ic", + ) + + # Instantiating MODFLOW 6 transport advection package + flopy.mf6.ModflowGweadv( + gwe, scheme=scheme, pname="ADV", filename="{}.adv".format(gwename) + ) + + # Instantiating MODFLOW 6 transport dispersion package + flopy.mf6.ModflowGwecnd( + gwe, + xt3d_off=False, + alh=dispersivity, + ath1=dispersivity, + ktw=0.5918 * 86400, + kts=0.2700 * 86400, + pname="DSP", + filename=f"{gwename}.dsp", + ) + + # Instantiating MODFLOW 6 transport mass storage package + rhow = 1000.0 + cpw = 4183.0 + lhv = 2500.0 + flopy.mf6.ModflowGweest( + gwe, + save_flows=True, + porosity=prsity, + cps=760.0, + rhos=1500.0, + packagedata=[cpw, rhow, lhv], + pname="MST", + filename=f"{gwename}.mst", + ) + + # Instantiating MODFLOW 6 constant temperature boundary condition at + ctpspd = {0: [[(0, 0, 1), 10.0]], 1: [[(0, 0, 1), 20.0]]} + + flopy.mf6.ModflowGwectp( + gwe, + save_flows=True, + print_flows=True, + stress_period_data=ctpspd, + pname="CTP", + filename="{}.ctp".format(gwename), + ) + + # Instantiating MODFLOW 6 transport source-sink mixing package + srctype = "AUX" + auxname = "TEMPERATURE" + pname = ["CHD-1"] + # Inpput to SSM is: + sources = [[itm, srctype, auxname] for itm in pname] + + flopy.mf6.ModflowGwessm( + gwe, + sources=sources, + pname="SSM", + filename=f"{gwename}.ssm", + ) + + # Instantiating MODFLOW 6 energy transport source-sink mixing package + uzepackagedata = [(iuz, 10.0) for iuz in range(nlay)] + uzeperioddata = { + 0: [[0, "INFILTRATION", 10.0]], + 1: [[0, "INFILTRATION", 20.0]], + } + + flopy.mf6.ModflowGweuze( + gwe, + flow_package_name="UZF-1", + boundnames=False, + save_flows=True, + print_input=True, + print_flows=True, + print_temperature=True, + temperature_filerecord=gwename + ".uze.bin", + budget_filerecord=gwename + ".uze.bud", + packagedata=uzepackagedata, + uzeperioddata=uzeperioddata, + pname="UZE-1", + filename=f"{gwename}.uze", + ) + + # Instantiate MODFLOW 6 heat transport output control package + flopy.mf6.ModflowGweoc( + gwe, + pname="OC", + budget_filerecord="{}.cbc".format(gwename), + temperature_filerecord="{}.ucn".format(gwename), + temperatureprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + printrecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + filename=f"{gwename}.oc", + ) + + # Instantiate Gwf-Gwe Exchange package + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname, + exgmnameb=gwename, + filename="{}.gwfgwe".format(gwename), + ) + + return sim, None + + +def check_output(idx, test): + print("evaluating flow...") + + name = cases[idx] + gwfname = "gwf_" + name + gwename = "gwe_" + name + ws = test.workspace + + # check some output... + wc_fl = gwfname + ".uzfwc.bin" + wcobj = flopy.utils.HeadFile(os.path.join(ws, wc_fl), text="water-content") + wc = wcobj.get_alldata() + + fl2 = gwename + ".uze.bin" + + uzeobj = flopy.utils.HeadFile(os.path.join(ws, fl2), text="TEMPERATURE") + temps = uzeobj.get_alldata() + + t = np.linspace(0.0, 100.0, 101) + z = np.arange(0.05, 10.0, 0.1) + z = np.insert(z, 0, 0.0) + + t0 = 10.0 + tinfil = 20.0 + + q = finf # infiltration rate + rhos = 1500.0 + Cps = 760.0 + rhow = 1000.0 + Cpw = 4183.0 + rhowCpw = Cpw * rhow + rhosCps = Cps * rhos + + Kts = 23328.0 + Ktw = 0.0 + + steady_wc = wc[1, 0, 0, 1] + Sw = steady_wc / prsity + + rhoCp_bulk = Sw * prsity * rhowCpw + (1 - prsity) * rhosCps + Kt_bulk = Sw * prsity * Ktw + (1 - prsity) * Kts + v = rhowCpw / rhoCp_bulk * q + D = Kt_bulk / rhoCp_bulk + + # Put analytical solution in place + analytical_sln = np.zeros((len(t), len(z))) + for i, tm in enumerate(t): + for j, depth in enumerate(z): + temp = temp_analyt(tm, depth, t0, tinfil, v, D) + analytical_sln[i, j] = temp + + # Run checks + msg0 = ( + "Simulated solution no longer falling within" + " default tolerance where it previously did" + ) + # Compare day 1. For layer 20 and below, the defaults of allclose should work + assert np.allclose(analytical_sln[1, 19:], temps[1, 0, 0, 19:]), msg0 + # Compare day 10. For layer 39 and below, the defaults of allclose should work + assert np.allclose(analytical_sln[10, 38:], temps[10, 0, 0, 38:]), msg0 + # Compare day 50. For layer 84 and below, the defaults of allclose should work + assert np.allclose(analytical_sln[50, 83:], temps[50, 0, 0, 83:]), msg0 + # Compare day 100, fits are generally good, but do not pass allclose default settings + + # Ensure that the differences in the 1st day fall within established bounds + msg1 = ( + "Simulated fits to analytical solution are " + "falling outside established bounds on day 1" + ) + assert ( + np.max(analytical_sln[1, :18] - temps[1, 0, 0, :18]) <= 1.52921097880 + ), msg1 + assert ( + np.min(analytical_sln[1, :18] - temps[1, 0, 0, :18]) >= -0.32260871278 + ), msg1 + + # Ensure that the differences on day 10 fall within established bounds + msg2 = ( + "Simulated fits to analytical solution are " + "falling outside established bounds on day 10" + ) + assert ( + np.max(analytical_sln[10, :37] - temps[10, 0, 0, :37]) <= 0.15993441016 + ), msg2 + assert ( + np.min(analytical_sln[10, :37] - temps[10, 0, 0, :37]) + >= -0.22298707253 + ), msg2 + + # Ensure that the differences on day 50 fall within established bounds + msg3 = ( + "Simulated fits to analytical solution are " + "falling outside established bounds on day 50" + ) + assert ( + np.max(analytical_sln[50, :82] - temps[50, 0, 0, :82]) <= 0.09327747258 + ), msg3 + assert ( + np.min(analytical_sln[50, :82] - temps[50, 0, 0, :82]) + >= -0.21182907402 + ), msg3 + + # Ensure that the differences on day 50 fall within established bounds + msg3 = ( + "Simulated fits to analytical solution are " + "falling outside established bounds on day 50" + ) + assert ( + np.max(analytical_sln[50, :82] - temps[50, 0, 0, :82]) <= 0.09327747258 + ), msg3 + assert ( + np.min(analytical_sln[50, :82] - temps[50, 0, 0, :82]) + >= -0.21182907402 + ), msg3 + + # Ensure that the differences on day 100 fall within established bounds + msg4 = ( + "Simulated fits to analytical solution are " + "falling outside established bounds on day 100" + ) + assert np.max(analytical_sln[100] - temps[100]) <= 0.10680304268, msg4 + assert np.min(analytical_sln[100] - temps[100]) >= -0.20763221276, msg4 + + # If a plot is needed for visual inspection, change following if statement to "True" + if False: + analytical_sln = np.zeros((len(t), len(z))) + for i, tm in enumerate(t): + for j, depth in enumerate(z): + temp = temp_analyt(tm, depth, t0, tinfil, v, D) + analytical_sln[i, j] = temp + + # first transient stress period + line1 = plt.plot( + analytical_sln[1], z, "-", color="red", label="Analytical" + ) + line2 = plt.plot( + temps[1, 0, 0], z, "-.", color="blue", label="MODFLOW 6" + ) + # 10th transient stress period + plt.plot(analytical_sln[10], z, "-", color="red") + plt.plot(temps[10, 0, 0], z, "-.", color="blue") + # 50th transient stress period + plt.plot(analytical_sln[50], z, "-", color="red") + plt.plot(temps[50, 0, 0], z, "-.", color="blue") + # last stress period + plt.plot(analytical_sln[100], z, "-", color="red") + plt.plot(temps[100, 0, 0], z, "-.", color="blue") + # add labels + plt.text(11.0, 0.85, "1 day", fontsize=10) + plt.text(12.0, 1.65, "10 days", fontsize=10) + plt.text(14.0, 2.90, "50 days", fontsize=10) + plt.text(16.0, 4.00, "100 days", fontsize=10) + + plt.gca().invert_yaxis() + plt.xlabel( + "$Temperature, C$" + ) # For latex replace with: '$Temperature, ^{\circ}C$' + plt.ylabel("$Depth, m$") + plt.minorticks_on() + plt.axhline(y=0.0) + plt.legend(loc="lower right", frameon=False) + plt.savefig(os.path.join(ws, "fit_view.png"), format="png") + + +# - No need to change any code below +@pytest.mark.parametrize( + "idx, name", + list(enumerate(cases)), +) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/autotest/test_gwe_vs_gwt.py b/autotest/test_gwe_vs_gwt.py new file mode 100644 index 00000000000..422ce9a65f3 --- /dev/null +++ b/autotest/test_gwe_vs_gwt.py @@ -0,0 +1,564 @@ +""" +Two-Dimensional Transport in a Radial Flow Field Comparison of +MODFLOW 6 GWT with GWE + +The purpose of this script is to test the new heat transport model developed +for MODFLOW 6. To that end, this problem uses the setup of MT3DMS example problem +#5 but adapts it for heat. MODFLOW 6 is setup using GWT and the new GWE +model with input parameters entered in their native units. The equivalent +values are calculated for "tricking" GWT into heat transport for comparison +between the two. +""" + +# Imports +import flopy +import numpy as np +import os +import sys +import pytest + +from framework import TestFramework + +# Base simulation and model name and workspace +cases = ["t_vs_c"] + +# Model units + +length_units = "meters" +time_units = "days" + +# Table + +nlay = 1 # Number of layers +nrow = 31 # Number of rows +ncol = 31 # Number of columns +delr = 10.0 # Column width ($m$) +delc = 10.0 # Row width ($m$) +delz = 1.0 # Layer thickness ($m$) +top = 0.0 # Top of the model ($m$) +prsity = 0.3 # Porosity +perlen = 27 # Simulation time ($days$) +k11 = 1.0 # Horizontal hydraulic conductivity ($m/d$) +qwell = 100.0 # Volumetric injection rate ($m^3/d$) +twell = 100.0 # Concentration of injected water ($mg/L$) +al = 10.0 # Longitudinal dispersivity ($m$) +trpt = 1.0 # Ratio of transverse to longitudinal dispersitivity + +dmcoef = 3.2519e-7 +rhob = 1110.0 +sp2 = 0.0 # read, but not used in this problem +kd = 1.8168e-4 + +cpw = 4183.0 +cps = 760.0 +rhow = 1000.0 +rhos = 1500.0 +lhv = 2454.0 + +# Additional model input + +perlen = [27] +nper = len(perlen) +nstp = [27] +tsmult = [1.0] +strt_temp = 0.0 +c0 = 100.0 +dt0 = 0.3 +ath1 = al * trpt +botm = [top - delz] # Model geometry +k33 = k11 # Vertical hydraulic conductivity ($m/d$) +icelltype = 0 +mixelm = -1 +strt = np.zeros((nlay, nrow, ncol), dtype=float) + +# Active model domain +idomain = np.ones((nlay, nrow, ncol), dtype=int) +icbund = 1 + +# Boundary conditions +# MF2K5 pumping info: + +welspd = {0: [[0, 15, 15, qwell]]} # Well pumping info for MF2K5 +spd = {0: [0, 15, 15, twell, -1]} # Well pumping info for MT3DMS + +# MF6 pumping information + +# (k, i, j), flow, conc +spd_mf6 = {0: [[(0, 15, 15), qwell, c0]]} + +# MF6 constant head boundaries: + +chdspd = [] +# Loop through the left & right sides. +for i in np.arange(nrow): + chdspd.append([(0, i, 0), strt[0, i, 0]]) + chdspd.append([(0, i, ncol - 1), strt[0, i, ncol - 1]]) +# Loop through the top & bottom while omitting the corner cells +for j in np.arange(1, ncol - 1): + chdspd.append([(0, 0, j), strt[0, 0, j]]) + chdspd.append([(0, nrow - 1, j), strt[0, nrow - 1, j]]) + +chdspd = {0: chdspd} + +# Solver settings + +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-6, 1e-6, 1.0 +percel = 1.0 # HMOC parameters +itrack = 3 +wd = 0.5 +dceps = 1.0e-5 +nplane = 1 +npl = 0 +nph = 16 +npmin = 2 +npmax = 32 +dchmoc = 1.0e-3 +nlsink = nplane +npsink = nph + +# Static temporal data used by TDIS file + +tdis_rc = [] +tdis_rc.append((perlen, nstp, 1.0)) + +# ### Functions to build, write, and run models and plot MT3DMS Example 10 Problem results +# +# MODFLOW 6 flopy simulation object (sim) is returned if building the model + + +def build_models(idx, test): + # MODFLOW 6 + ws = test.workspace + name = cases[idx] + gwfname = "gwf_" + name + gwename = "gwe_" + name + gwtname = "gwt_" + name + + sim = flopy.mf6.MFSimulation( + sim_name=name, + sim_ws=ws, + exe_name="mf6", + ) + + # Instantiating MODFLOW 6 time discretization + tdis_rc = [] + for i in range(nper): + tdis_rc.append((perlen[i], nstp[i], tsmult[i])) + + flopy.mf6.ModflowTdis( + sim, nper=nper, perioddata=tdis_rc, time_units=time_units + ) + + # Instantiating MODFLOW 6 groundwater flow model + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=gwfname, + save_flows=True, + model_nam_file="{}.nam".format(gwfname), + ) + + # Instantiating MODFLOW 6 solver for flow model + imsgwf = 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, + filename="{}.ims".format(gwfname), + ) + sim.register_ims_package(imsgwf, [gwf.name]) + + # Instantiating MODFLOW 6 discretization package + flopy.mf6.ModflowGwfdis( + gwf, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=idomain, + pname="DIS-1", + filename="{}.dis".format(gwfname), + ) + + # Instantiating MODFLOW 6 node-property flow package + flopy.mf6.ModflowGwfnpf( + gwf, + save_flows=False, + icelltype=icelltype, + k=k11, + k33=k33, + save_specific_discharge=True, + pname="NPF-1", + filename="{}.npf".format(gwfname), + ) + + # Instantiating MODFLOW 6 storage package (steady flow conditions, so no actual storage, using to print values in .lst file) + flopy.mf6.ModflowGwfsto( + gwf, ss=0, sy=0, pname="STO-1", filename="{}.sto".format(gwfname) + ) + + # Instantiating MODFLOW 6 initial conditions package for flow model + flopy.mf6.ModflowGwfic( + gwf, strt=strt, pname="IC-1", filename="{}.ic".format(gwfname) + ) + + # Instantiating MODFLOW 6 constant head package + flopy.mf6.ModflowGwfchd( + gwf, + maxbound=len(chdspd), + stress_period_data=chdspd, + save_flows=False, + pname="CHD-1", + filename="{}.chd".format(gwfname), + ) + + # Instantiate the wel package + flopy.mf6.ModflowGwfwel( + gwf, + print_input=True, + print_flows=True, + stress_period_data=spd_mf6, + save_flows=False, + auxiliary="TEMPERATURE", + pname="WEL-1", + filename="{}.wel".format(gwfname), + ) + + # Instantiating MODFLOW 6 output control package for flow model + flopy.mf6.ModflowGwfoc( + gwf, + head_filerecord="{}.hds".format(gwfname), + budget_filerecord="{}.bud".format(gwfname), + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + printrecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + ) + + # ---------------------------------------------------- + # Instantiating MODFLOW 6 GWE model + # ---------------------------------------------------- + + # Instantiating MODFLOW 6 groundwater heat transport package + gwe = flopy.mf6.MFModel( + sim, + model_type="gwe6", + modelname=gwename, + model_nam_file="{}.nam".format(gwename), + ) + gwe.name_file.save_flows = True + + # create iterative model solution and register the gwe model with it + imsgwe = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwename), + ) + sim.register_ims_package(imsgwe, [gwe.name]) + + # Instantiating MODFLOW 6 heat transport discretization package + flopy.mf6.ModflowGwedis( + gwe, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=1, + filename="{}.dis".format(gwename), + ) + + # Instantiating MODFLOW 6 heat transport initial temperatures + flopy.mf6.ModflowGweic( + gwe, strt=strt_temp, pname="IC-1", filename="{}.ic".format(gwename) + ) + + # Instantiating MODFLOW 6 heat transport advection package + if mixelm >= 0: + scheme = "UPSTREAM" + elif mixelm == -1: + scheme = "TVD" + else: + raise Exception() + flopy.mf6.ModflowGweadv( + gwe, scheme=scheme, filename="{}.adv".format(gwename) + ) + + # Instantiating MODFLOW 6 heat transport conduction package + if al != 0: + flopy.mf6.ModflowGwecnd( + gwe, + alh=al, + ath1=ath1, + ktw=0.5918, + kts=0.2700, + filename="{}.cnd".format(gwename), + ) + + # Instantiating MODFLOW 6 heat transport mass storage package (formerly "reaction" package in MT3DMS) + flopy.mf6.ModflowGweest( + gwe, + porosity=prsity, + cps=760.0, + packagedata=[cpw, rhow, lhv], + rhos=1500.0, + filename="{}.est".format(gwename), + ) + + # Instantiating MODFLOW 6 heat transport source-sink mixing package + sourcerecarray = [("WEL-1", "AUX", "TEMPERATURE")] + flopy.mf6.ModflowGwessm( + gwe, + sources=sourcerecarray, + pname="SSM-1", + filename="{}.ssm".format(gwename), + ) + + # Instantiating MODFLOW 6 heat transport output control package + flopy.mf6.ModflowGweoc( + gwe, + budget_filerecord="{}.cbc".format(gwename), + temperature_filerecord="{}.ucn".format(gwename), + temperatureprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], + printrecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], + ) + + # Instantiating MODFLOW 6 flow-transport exchange mechanism + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname, + exgmnameb=gwename, + filename="{}.gwfgwe".format(name), + ) + + # ---------------------------------------------------- + # Instantiating MODFLOW 6 GWT model + # ---------------------------------------------------- + + # Instantiating MODFLOW 6 groundwater transport package to simulate heat + # transport the now "old-fashion way" + gwt = flopy.mf6.MFModel( + sim, + model_type="gwt6", + modelname=gwtname, + model_nam_file=f"{gwtname}.nam", + ) + gwt.name_file.save_flows = True + + # create iterative model solution and register the gwt model with it + imsgwt = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename=f"{gwtname}.ims", + ) + sim.register_ims_package(imsgwt, [gwt.name]) + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwtdis( + gwt, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=1, + filename=f"{gwtname}.dis", + ) + + # Instantiating MODFLOW 6 transport initial concentrations + flopy.mf6.ModflowGwtic( + gwt, strt=strt_temp, pname="IC-1", filename=f"{gwtname}.ic" + ) + + # Instantiating MODFLOW 6 transport advection package + flopy.mf6.ModflowGwtadv( + gwt, scheme=scheme, pname="ADV-1", filename=f"{gwtname}.adv" + ) + + # Instantiating MODFLOW 6 transport dispersion package + if al != 0: + flopy.mf6.ModflowGwtdsp( + gwt, + alh=al, + ath1=ath1, + diffc=dmcoef, + pname="DSP-1", + filename=f"{gwtname}.dsp", + ) + + # Instantiating MODFLOW 6 transport mass storage package (formerly "reaction" package in MT3DMS) + flopy.mf6.ModflowGwtmst( + gwt, + porosity=prsity, + first_order_decay=False, + decay=None, + decay_sorbed=None, + sorption="linear", + bulk_density=rhob, + distcoef=kd, + filename=f"{gwtname}.mst", + ) + + # Instantiating MODFLOW 6 transport source-sink mixing package + sourcerecarray = [("WEL-1", "AUX", "TEMPERATURE")] + flopy.mf6.ModflowGwtssm( + gwt, sources=sourcerecarray, pname="SSM-1", filename=f"{gwtname}.ssm" + ) + + # Instantiating MODFLOW 6 transport output control package + flopy.mf6.ModflowGwtoc( + gwt, + budget_filerecord=f"{gwtname}.cbc", + concentration_filerecord=f"{gwtname}.ucn", + concentrationprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("CONCENTRATION", "LAST"), ("BUDGET", "LAST")], + printrecord=[("CONCENTRATION", "LAST"), ("BUDGET", "LAST")], + ) + + # Instantiating MODFLOW 6 flow-transport exchange mechanism + flopy.mf6.ModflowGwfgwt( + sim, + exgtype="GWF6-GWT6", + exgmnamea=gwfname, + exgmnameb=gwtname, + filename=f"{name}.gwfgwt", + ) + + return sim, None + + +def check_output(idx, test): + print("evaluating results...") + + # read transport results from GWE and GWT models + name = cases[idx] + gwename = "gwe_" + name + gwtname = "gwt_" + name + + fpth = os.path.join(test.workspace, f"{gwename}.ucn") + try: + # load temperatures + tobj = flopy.utils.HeadFile( + fpth, precision="double", text="TEMPERATURE" + ) + temps = tobj.get_alldata() + except: + assert False, f'could not load temperature data from "{fpth}"' + + fpth = os.path.join(test.workspace, f"{gwtname}.ucn") + try: + # load temperatures (though stored as "concentrations") + cobj = flopy.utils.HeadFile( + fpth, precision="double", text="CONCENTRATION" + ) + conc = cobj.get_alldata() + except: + assert False, f'could not load concentration data from "{fpth}"' + + # There are some differences between the GWE and GWT solutions. + # For the time being, the solutions are close in that they have + # the same shape; however, as the energy spreads outward in a + # radial flow field simulated by a rectalinear grid, there appears + # to be a halo that forms when differencing the GWE and GWT solutions. + # The maximum of that difference occurs along row 18 (0-based). The + # entire row containing the max difference is stored here for comparison + + diff_ans = np.array( + [ + 1.23070342e-08, + 1.45018687e-07, + 1.58995667e-06, + 1.57489411e-05, + 1.37313132e-04, + 1.02408164e-03, + 6.32680308e-03, + 3.12276340e-02, + 1.18381212e-01, + 3.32011273e-01, + 6.72832216e-01, + 9.91435902e-01, + 1.11198602e00, + 1.02310179e00, + 8.56220661e-01, + 7.61168469e-01, + 8.56220661e-01, + 1.02310179e00, + 1.11198602e00, + 9.91435902e-01, + 6.72832216e-01, + 3.32011273e-01, + 1.18381212e-01, + 3.12276340e-02, + 6.32680308e-03, + 1.02408164e-03, + 1.37313132e-04, + 1.57489411e-05, + 1.58995667e-06, + 1.45018687e-07, + 1.23070339e-08, + ] + ) + + diff = temps[0, 0] - conc[0, 0] + assert diff.max() <= diff_ans.max(), "Max difference should be <= 1.112" + assert np.allclose(diff[18, :], diff_ans), ( + "The difference between a GWE and equivalent GWT solution has " + "changed. Some investigation required." + ) + + +# - No need to change any code below +@pytest.mark.parametrize( + "idx, name", + list(enumerate(cases)), +) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/autotest/test_gwegwe_exchng_with_comp2gwt.py b/autotest/test_gwegwe_exchng_with_comp2gwt.py new file mode 100644 index 00000000000..ecefa3fb51e --- /dev/null +++ b/autotest/test_gwegwe_exchng_with_comp2gwt.py @@ -0,0 +1,1086 @@ +""" +Two-Dimensional Heat Transport (GWE) in a Radial Flow Field with Comparison to a MODFLOW 6 GWT model + +The purpose of this script is to test the new heat transport model developed +for MODFLOW 6. To that end, this problem uses the setup of the fifth MT3DMS +test problem but adapts it for heat. Moreover, this example also attempts to +adapt the fifth MT3DMS problem to a GWE-GWE example by splitting the model +domain diagonally in half. As such, MODFLOW 6 is setup using the new GWE +model with input parameters entered in their native units. The equivalent +values are calculated for "tricking" MT3DMS into heat transport. + +Cheap depiction of model in plan view follows (not to scale): + + +---------------------------------------------------------------------------+ + | | + +---+ | + | | + +---+ | + | | + +---+ +---+ | + | | | | + | +---+ +---+ | + | | | | + | +---+ +---+ "GWx-ur" | + | | | | + | +---+ +---+ | + | | | | + | +---+ +---+ | + | | | | + | +---+ +---+ | + | | | | + | +---+ +---+ | + | | | * <-- Inj. well with 100 deg C | + | +---+ +---+ water entering simulation> | + | | | Inj. well creates a radial | + | +---+ +---+ (outward) flow field. | + | | | | + | +---+ +---+ | + | | | | + | +---+ +---+ | + | | | | + | +---+ +---+ | + | | | | + | +---+ +---+ | + | | | | + | +---+ +---+ | + | "GWx-ll" | | | + | +---+ +---+ | + | | | | + | +---+ +---+ | + | | | | + | +---+ +---+ + | | + | +---+ + | | + | +---+ + | | + +---------------------------------------------------------------------------+ + +""" + + +import os +import sys + +sys.path.append(os.path.join("..", "common")) + +# Imports + +import matplotlib.pyplot as plt +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +# from figspecs import USGSFigure + + +# Set figure properties specific to this problem +plotModel = plotSave = False +figure_size = (6, 4.5) + +cases = ["gwegwe-gwtgwt"] + +# Model units + +length_units = "meters" +time_units = "days" + +# Table + +nlay = 1 # Number of layers +nrow = 31 # Number of rows +ncol = 31 # Number of columns +delr = 10.0 # Column width ($m$) +delc = 10.0 # Row width ($m$) +delz = 1.0 # Layer thickness ($m$) +top = 0.0 # Top of the model ($m$) +prsity = 0.3 # Porosity +perlen = 27 # Simulation time ($days$) +k11 = 1.0 # Horizontal hydraulic conductivity ($m/d$) +qwell = 100.0 # Volumetric injection rate ($m^3/d$) +twell = 100.0 # Concentration of injected water ($mg/L$) +al = 10.0 # Longitudinal dispersivity ($m$) +trpt = 1.0 # Ratio of transverse to longitudinal dispersitivity + +dmcoef = 3.2519e-7 +rhob = 1110.0 +sp2 = 0.0 # read, but not used in this problem +kd = 1.8168e-4 + +cpw = 4183.0 +cps = 760.0 +rhow = 1000.0 +rhos = 1500.0 +lhv = 2454.0 + +# Additional model input + +perlen = [27] +nper = len(perlen) +nstp = [27] +tsmult = [1.0] +strt_temp = 0.0 +dt0 = 0.3 +ath1 = al * trpt +botm = [top - delz] # Model geometry +k33 = k11 # Vertical hydraulic conductivity ($m/d$) +icelltype = 0 +mixelm = 0 +strt = np.zeros((nlay, nrow, ncol), dtype=float) + +# Active model domain +ibound_mf2k5 = np.ones((nlay, nrow, ncol), dtype=int) * -1 +ibound_mf2k5[:, 1 : nrow - 1, 1 : ncol - 1] = 1 +icbund = 1 +idomain = np.ones((nlay, nrow, ncol), dtype=int) +idomain_ll = idomain.copy() +for rw in np.arange(idomain_ll.shape[1]): # For each row + idomain_ll[0, rw, rw:] = 0 + +idomain_ur = 1 - idomain_ll + +# Work up the exchanges +# Exchange data for GWF-GWF and GWE-GWE +exgdata = [] + +# Stair-step down the shared interface +for i in np.arange(nrow): + for j in np.arange(ncol): + # Checking between rows (i.e., the vertical (y-axis) direction) + if i < (nrow - 1): + # Check to see if two touching cells in adjacent models are both active + # Check + if idomain_ur[0, i, j] > 0 and idomain_ll[0, i + 1, j] > 0: + exgdata.append( + ((0, i, j), (0, i + 1, j), 1, 5, 5, 10, 270.0, 10.0) + ) + if j < (ncol - 1): + if idomain_ur[0, i, j + 1] > 0 and idomain_ll[0, i, j] > 0: + exgdata.append( + ((0, i, j + 1), (0, i, j), 1, 5, 5, 10, 180.0, 10.0) + ) + + +# Boundary conditions +# MF2K5 pumping info: + +welspd = {0: [[0, 15, 15, qwell]]} # Well pumping info for MF2K5 +spd = {0: [0, 15, 15, twell, -1]} # Well pupming info for MT3DMS + +# MF6 pumping information + +# (k, i, j), flow, temperature +spd_mf6 = {0: [[(0, 15, 15), qwell, twell]]} + +# MF6 constant head boundaries: + +chdspd_ur = [] +chdspd_ll = [] +# Loop through the left & right sides. +for i in np.arange(nrow): + if i == 0: + # A special case, this one cell on the left boundary happens to fall in the + # in the "ur" model + chdspd_ur.append([(0, i, 0), strt[0, i, 0]]) + else: + chdspd_ll.append([(0, i, 0), strt[0, i, 0], 0.0]) + + chdspd_ur.append([(0, i, ncol - 1), strt[0, i, ncol - 1]]) + +# Loop through the top & bottom while omitting the corner cells +for j in np.arange(1, ncol - 1): + chdspd_ur.append([(0, 0, j), strt[0, 0, j]]) + chdspd_ll.append([(0, nrow - 1, j), strt[0, nrow - 1, j], 0.0]) + +chdspd_ur = {0: chdspd_ur} +chdspd_ll = {0: chdspd_ll} + +# Solver settings + +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-8, 1e-8, 1.0 +percel = 1.0 # HMOC parameters +itrack = 3 +wd = 0.5 +dceps = 1.0e-5 +nplane = 1 +npl = 0 +nph = 16 +npmin = 2 +npmax = 32 +dchmoc = 1.0e-3 +nlsink = nplane +npsink = nph + +# Static temporal data used by TDIS file + +tdis_rc = [] +tdis_rc.append((perlen, nstp, 1.0)) + +# Model names +gwfname_up = "gwf-ur" +gwfname_lo = "gwf-ll" +gwename_up = "gwe-ur" +gwename_lo = "gwe-ll" +gwtname_up = "gwt-ur" +gwtname_lo = "gwt-ll" + +# Functions to build, write, and run models +# +# MODFLOW 6 flopy simulation object (sim) is returned if building the model + + +def build_models(idx, test): + + # ----------- + # MODFLOW 6 + # ----------- + + ws = test.workspace + name = cases[idx] + + sim = flopy.mf6.MFSimulation( + sim_name=name, sim_ws=ws, exe_name="mf6", version="mf6" + ) + + # Instantiating MODFLOW 6 time discretization + tdis_rc = [] + for i in range(nper): + tdis_rc.append((perlen[i], nstp[i], tsmult[i])) + + flopy.mf6.ModflowTdis( + sim, nper=nper, perioddata=tdis_rc, time_units=time_units + ) + + # add both solutions to the simulation + add_flow(sim) + add_energy(sim) + add_transport(sim) + + # Instantiating MODFLOW 6 flow-energy transport exchange mechanism + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname_up, + exgmnameb=gwename_up, + filename="{}.gwfgwe".format("upper"), + ) + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname_lo, + exgmnameb=gwename_lo, + filename="{}.gwfgwe".format("lower"), + ) + + # Next, instantiate MODFLOW 6 flow-solute transport exchange mechanism + flopy.mf6.ModflowGwfgwt( + sim, + exgtype="GWF6-GWT6", + exgmnamea=gwfname_up, + exgmnameb=gwtname_up, + filename="{}.gwfgwt".format("upper"), + ) + flopy.mf6.ModflowGwfgwt( + sim, + exgtype="GWF6-GWT6", + exgmnamea=gwfname_lo, + exgmnameb=gwtname_lo, + filename="{}.gwfgwt".format("lower"), + ) + + return sim + + +# Instatiate the upper and lower flow models +def add_flow(sim): + # Instantiating MODFLOW 6 solver for flow model + imsgwf = 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, + filename="{}.ims".format("gwfsolver"), + ) + + gwf_upper = add_upper_gwfmodel(sim) + gwf_lower = add_lower_gwfmodel(sim) + + sim.register_ims_package(imsgwf, [gwf_upper.name, gwf_lower.name]) + + # Add the exchange data + gwfgwf = flopy.mf6.ModflowGwfgwf( + sim, + exgtype="GWF6-GWF6", + nexg=len(exgdata), + exgmnamea=gwf_upper.name, + exgmnameb=gwf_lower.name, + exchangedata=exgdata, + xt3d=False, + print_flows=True, + auxiliary=["ANGLDEGX", "CDIST"], + filename="{}.gwfgwf".format("exchng"), + ) + + +# Create the upper GWF model +def add_upper_gwfmodel(sim): + mname = gwfname_up + + # Instantiating MODFLOW 6 groundwater flow model + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=mname, + save_flows=True, + model_nam_file="{}.nam".format(mname), + ) + + # Instantiating MODFLOW 6 discretization package + flopy.mf6.ModflowGwfdis( + gwf, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=idomain_ur, + filename="{}.dis".format(mname), + ) + + # Instantiating MODFLOW 6 node-property flow package + flopy.mf6.ModflowGwfnpf( + gwf, + save_flows=False, + icelltype=icelltype, + k=k11, + k33=k33, + save_specific_discharge=True, + filename="{}.npf".format(mname), + ) + + # Instantiating MODFLOW 6 storage package + # (steady flow conditions, so no actual storage, using to print values in .lst file) + flopy.mf6.ModflowGwfsto(gwf, ss=0, sy=0, filename="{}.sto".format(mname)) + + # Instantiating MODFLOW 6 initial conditions package for flow model + flopy.mf6.ModflowGwfic(gwf, strt=strt, filename="{}.ic".format(mname)) + + # Instantiating MODFLOW 6 constant head package + flopy.mf6.ModflowGwfchd( + gwf, + maxbound=len(chdspd_ur), + stress_period_data=chdspd_ur, + save_flows=False, + pname="CHD-1", + filename="{}.chd".format(mname), + ) + + # Instantiate the wel package + flopy.mf6.ModflowGwfwel( + gwf, + print_input=True, + print_flows=True, + stress_period_data=spd_mf6, + save_flows=False, + auxiliary="TEMPERATURE", + pname="WEL-1", + filename="{}.wel".format(mname), + ) + + # Instantiating MODFLOW 6 output control package for flow model + flopy.mf6.ModflowGwfoc( + gwf, + head_filerecord="{}.hds".format(mname), + budget_filerecord="{}.bud".format(mname), + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + printrecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + ) + + return gwf + + +# Create the lower GWF model +def add_lower_gwfmodel(sim): + mname = gwfname_lo + + # Instantiating MODFLOW 6 groundwater flow model + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=mname, + save_flows=True, + model_nam_file="{}.nam".format(mname), + ) + + # Instantiating MODFLOW 6 discretization package + flopy.mf6.ModflowGwfdis( + gwf, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=idomain_ll, + filename="{}.dis".format(mname), + ) + + # Instantiating MODFLOW 6 initial conditions package for flow model + flopy.mf6.ModflowGwfic(gwf, strt=strt, filename="{}.ic".format(mname)) + + # Instantiating MODFLOW 6 node-property flow package + flopy.mf6.ModflowGwfnpf( + gwf, + save_flows=False, + icelltype=icelltype, + k=k11, + k33=k33, + save_specific_discharge=True, + filename="{}.npf".format(mname), + ) + + # Instantiating MODFLOW 6 storage package + # (steady flow conditions, so no actual storage, using to print values in .lst file) + flopy.mf6.ModflowGwfsto(gwf, ss=0, sy=0, filename="{}.sto".format(mname)) + + # Instantiating MODFLOW 6 constant head package + flopy.mf6.ModflowGwfchd( + gwf, + maxbound=len(chdspd_ll), + stress_period_data=chdspd_ll, + auxiliary="TEMPERATURE", + save_flows=False, + pname="CHD-1", + filename="{}.chd".format(mname), + ) + + # Instantiating MODFLOW 6 output control package for flow model + flopy.mf6.ModflowGwfoc( + gwf, + head_filerecord="{}.hds".format(mname), + budget_filerecord="{}.bud".format(mname), + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + printrecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + ) + + return gwf + + +# Create the upper and lower GWE models +def add_energy(sim): + # create iterative model solution and register the gwt model with it + imsgwe = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format("gwesolver"), + ) + + # Set the advection scheme, it is needed by both gwe model instantiation and gwegwe exchange + if mixelm >= 0: + scheme = "UPSTREAM" + elif mixelm == -1: + scheme = "TVD" + else: + raise Exception() + + # Add transport models + gwe_upper = add_upper_gwemodel(sim, scheme) + gwe_lower = add_lower_gwemodel(sim, scheme) + + sim.register_ims_package(imsgwe, [gwe_upper.name, gwe_lower.name]) + + # Create energy transport to energy transport coupling + assert exgdata is not None + flopy.mf6.ModflowGwegwe( + sim, + exgtype="GWE6-GWE6", + gwfmodelname1=gwfname_up, + gwfmodelname2=gwfname_lo, + adv_scheme=scheme, + nexg=len(exgdata), + exgmnamea=gwe_upper.name, + exgmnameb=gwe_lower.name, + exchangedata=exgdata, + auxiliary=["ANGLDEGX", "CDIST"], + filename="{}.gwegwe".format("exchng"), + ) + + return sim + + +# Create the outer GWT model +def add_upper_gwemodel(sim, scheme): + # Instantiating MODFLOW 6 groundwater heat transport package + mname = gwename_up + + gwe = flopy.mf6.MFModel( + sim, + model_type="gwe6", + modelname=mname, + model_nam_file="{}.nam".format(mname), + ) + gwe.name_file.save_flows = True + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwedis( + gwe, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=idomain_ur, + filename="{}.dis".format(mname), + ) + + # Instantiating MODFLOW 6 heat transport initial temperature + flopy.mf6.ModflowGweic(gwe, strt=strt_temp, filename="{}.ic".format(mname)) + + flopy.mf6.ModflowGweadv( + gwe, scheme=scheme, filename="{}.adv".format(mname) + ) + + # Instantiating MODFLOW 6 heat transport dispersion package + if al != 0: + flopy.mf6.ModflowGwecnd( + gwe, + alh=al, + ath1=ath1, + ktw=0.5918, + kts=0.2700, + filename="{}.cnd".format(mname), + ) + + # Instantiating MODFLOW 6 transport mass storage package + flopy.mf6.ModflowGweest( + gwe, + porosity=prsity, + cps=cps, + rhos=rhos, + packagedata=[cpw, rhow, lhv], + pname="EST-UP", + filename="{}.est".format(mname), + ) + + # Instantiating MODFLOW 6 heat transport source-sink mixing package + sourcerecarray = [("WEL-1", "AUX", "TEMPERATURE")] + flopy.mf6.ModflowGwessm( + gwe, sources=sourcerecarray, filename="{}.ssm".format(mname) + ) + + # Instantiating MODFLOW 6 heat transport output control package + flopy.mf6.ModflowGweoc( + gwe, + budget_filerecord="{}.cbc".format(mname), + temperature_filerecord="{}.ucn".format(mname), + temperatureprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], + printrecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], + ) + + return gwe + + +# Create the lower GWE model +def add_lower_gwemodel(sim, scheme): + # Instantiating MODFLOW 6 groundwater heat transport package + mname = gwename_lo + + gwe = flopy.mf6.MFModel( + sim, + model_type="gwe6", + modelname=mname, + model_nam_file="{}.nam".format(mname), + ) + gwe.name_file.save_flows = True + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwedis( + gwe, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=idomain_ll, + filename="{}.dis".format(mname), + ) + + # Instantiating MODFLOW 6 heat transport initial temperature + flopy.mf6.ModflowGweic(gwe, strt=strt_temp, filename="{}.ic".format(mname)) + + # Instantiating MODFLOW 6 heat transport advection package (lower model) + flopy.mf6.ModflowGweadv( + gwe, scheme=scheme, filename="{}.adv".format(mname) + ) + + # Instantiating MODFLOW 6 heat transport dispersion package + if al != 0: + flopy.mf6.ModflowGwecnd( + gwe, + alh=al, + ath1=ath1, + ktw=0.5918, + kts=0.2700, + filename="{}.cnd".format(mname), + ) + + # Instantiating MODFLOW 6 transport mass storage package + flopy.mf6.ModflowGweest( + gwe, + porosity=prsity, + cps=cps, + rhos=rhos, + packagedata=[cpw, rhow, lhv], + pname="EST-LO", + filename="{}.est".format(mname), + ) + + # Instantiating MODFLOW 6 heat transport source-sink mixing package + sourcerecarray = [("CHD-1", "AUX", "TEMPERATURE")] + flopy.mf6.ModflowGwessm( + gwe, sources=sourcerecarray, filename="{}.ssm".format(mname) + ) + + # Instantiating MODFLOW 6 heat transport output control package + # flopy.mf6.ModflowGweoc( + # gwe, + # budget_filerecord="{}.cbc".format(mname), + # temperature_filerecord="{}.ucn".format(mname), + # temperatureprintrecord=[ + # ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + # ], + # saverecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], + # printrecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], + # ) + flopy.mf6.ModflowGweoc( + gwe, + budget_filerecord="{}.cbc".format(mname), + temperature_filerecord="{}.ucn".format(mname), + temperatureprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], + printrecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], + ) + + return gwe + + +# Add an equivalent solute transport model for comparing to +def add_transport(sim): + # create iterative model solution and register the gwt model with it + imsgwt = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format("gwtsolver"), + ) + + # Set the advection scheme, it is needed by both gwe model instantiation and gwegwe exchange + if mixelm >= 0: + scheme = "UPSTREAM" + elif mixelm == -1: + scheme = "TVD" + else: + raise Exception() + + # Add transport models + gwt_upper = add_upper_gwtmodel(sim, scheme) + gwt_lower = add_lower_gwtmodel(sim, scheme) + + sim.register_ims_package(imsgwt, [gwt_upper.name, gwt_lower.name]) + + # Create transport-transport coupling + assert exgdata is not None + flopy.mf6.ModflowGwtgwt( + sim, + exgtype="GWT6-GWT6", + gwfmodelname1=gwfname_up, + gwfmodelname2=gwfname_lo, + adv_scheme=scheme, + nexg=len(exgdata), + exgmnamea=gwt_upper.name, + exgmnameb=gwt_lower.name, + exchangedata=exgdata, + auxiliary=["ANGLDEGX", "CDIST"], + filename="{}.gwtgwt".format("exchng"), + ) + + return sim + + +# Create the upper GWT model +def add_upper_gwtmodel(sim, scheme): + # Instantiating MODFLOW 6 groundwater solute transport + # model for comparison with GWE + mname = gwtname_up + + gwt = flopy.mf6.MFModel( + sim, + model_type="gwt6", + modelname=mname, + model_nam_file="{}.nam".format(mname), + ) + gwt.name_file.save_flows = True + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwtdis( + gwt, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=idomain_ur, + filename="{}.dis".format(mname), + ) + + # Instantiating MODFLOW 6 heat transport initial temperature + flopy.mf6.ModflowGwtic(gwt, strt=strt_temp, filename="{}.ic".format(mname)) + + flopy.mf6.ModflowGwtadv( + gwt, scheme=scheme, filename="{}.adv".format(mname) + ) + + # Instantiating MODFLOW 6 heat transport dispersion package + if al != 0: + flopy.mf6.ModflowGwtdsp( + gwt, + alh=al, + ath1=ath1, + diffc=dmcoef, + filename="{}.dsp".format(mname), + ) + + # Instantiating MODFLOW 6 transport mass storage package + flopy.mf6.ModflowGwtmst( + gwt, + sorption="LINEAR", + porosity=prsity, + bulk_density=1110.0, + distcoef=kd, + filename="{}.mst".format(mname), + ) + + # Instantiating MODFLOW 6 source-sink mixing package transport + sourcerecarray = [("WEL-1", "AUX", "TEMPERATURE")] + flopy.mf6.ModflowGwtssm( + gwt, sources=sourcerecarray, filename="{}.ssm".format(mname) + ) + + flopy.mf6.ModflowGwtoc( + gwt, + budget_filerecord="{}.cbc".format(mname), + concentration_filerecord="{}.ucn".format(mname), + concentrationprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("CONCENTRATION", "LAST"), ("BUDGET", "LAST")], + printrecord=[("CONCENTRATION", "LAST"), ("BUDGET", "LAST")], + ) + + return gwt + + +# Create the lower GWT model +def add_lower_gwtmodel(sim, scheme): + # Instantiating MODFLOW 6 groundwater solute transport package + mname = gwtname_lo + + gwt = flopy.mf6.MFModel( + sim, + model_type="gwt6", + modelname=mname, + model_nam_file="{}.nam".format(mname), + ) + gwt.name_file.save_flows = True + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwtdis( + gwt, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=idomain_ll, + filename="{}.dis".format(mname), + ) + + # Instantiating MODFLOW 6 solute transport initial concentration (temperature) + flopy.mf6.ModflowGwtic(gwt, strt=strt_temp, filename="{}.ic".format(mname)) + + # Instantiating MODFLOW 6 solute transport advection package (lower model) + flopy.mf6.ModflowGwtadv( + gwt, scheme=scheme, filename="{}.adv".format(mname) + ) + + # Instantiating MODFLOW 6 heat transport dispersion package + if al != 0: + flopy.mf6.ModflowGwtdsp( + gwt, + alh=al, + ath1=ath1, + diffc=dmcoef, + filename="{}.dsp".format(mname), + ) + + # Instantiating MODFLOW 6 transport mass storage package + flopy.mf6.ModflowGwtmst( + gwt, + sorption="LINEAR", + porosity=prsity, + bulk_density=rhob, + distcoef=kd, + filename="{}.mst".format(mname), + ) + + # Instantiating MODFLOW 6 solute transport source-sink mixing package + sourcerecarray = [("CHD-1", "AUX", "TEMPERATURE")] + flopy.mf6.ModflowGwtssm( + gwt, sources=sourcerecarray, filename="{}.ssm".format(mname) + ) + + # Instantiating MODFLOW 6 solute transport output control package + flopy.mf6.ModflowGwtoc( + gwt, + budget_filerecord="{}.cbc".format(mname), + concentration_filerecord="{}.ucn".format(mname), + concentrationprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("CONCENTRATION", "LAST"), ("BUDGET", "LAST")], + printrecord=[("CONCENTRATION", "LAST"), ("BUDGET", "LAST")], + ) + + return gwt + + +def fict_model(out_pth): + # Instantiate the MODFLOW model + mf = flopy.modflow.Modflow( + modelname="dummy_mod", model_ws=out_pth, exe_name="mfnwt" + ) + + # Instantiate discretization package + # units: itmuni=4 (days), lenuni=2 (m) + flopy.modflow.ModflowDis( + mf, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + nper=nper, + nstp=nstp, + perlen=perlen, + itmuni=4, + lenuni=2, + ) + + return mf + + +# Function to plot the model results +def check_output(idx, test): + print("evaluating results...") + + out_pth = test.workspace + # read transport results from GWE and GWT models + fpth = os.path.join(out_pth, gwename_up + ".ucn") + turobj = flopy.utils.HeadFile(fpth, text="temperature") + temp_ur = turobj.get_alldata() + + fpth = os.path.join(out_pth, gwename_lo + ".ucn") + tllobj = flopy.utils.HeadFile(fpth, text="temperature") + temp_ll = tllobj.get_alldata() + + fpth = os.path.join(out_pth, gwtname_up + ".ucn") + curobj = flopy.utils.HeadFile(fpth, text="concentration") + conc_ur = curobj.get_alldata() + + fpth = os.path.join(out_pth, gwtname_lo + ".ucn") + cllobj = flopy.utils.HeadFile(fpth, text="concentration") + conc_ll = cllobj.get_alldata() + + # Stitch together the temperatures from the upper-right and lower-left models + tm = k = 0 + stitched_temps = np.zeros((nrow, ncol)) + for i in np.arange(nrow): + for j in np.arange(ncol): + if idomain_ur[k, i, j] > 0: + stitched_temps[i, j] = temp_ur[tm, k, i, j] + elif idomain_ll[k, i, j] > 0: + stitched_temps[i, j] = temp_ll[tm, k, i, j] + + # Stitch together the "concentrations" (which represent temperatures) from the upper-right and lower-left models + tm = k = 0 + stitched_conc = np.zeros((nrow, ncol)) + for i in np.arange(nrow): + for j in np.arange(ncol): + if idomain_ur[k, i, j] > 0: + stitched_conc[i, j] = conc_ur[tm, k, i, j] + elif idomain_ll[k, i, j] > 0: + stitched_conc[i, j] = conc_ll[tm, k, i, j] + + diff_ans = np.array( + [ + 1.72851147e-06, + 1.02569324e-05, + 6.03854917e-05, + 3.24474242e-04, + 1.55996452e-03, + 6.58075914e-03, + 2.38852818e-02, + 7.31492711e-02, + 1.85545249e-01, + 3.83629779e-01, + 6.39985972e-01, + 8.62111344e-01, + 9.55210100e-01, + 9.08020311e-01, + 7.95058119e-01, + 7.17466620e-01, + 7.95058119e-01, + 9.08020311e-01, + 9.55210110e-01, + 8.62111344e-01, + 6.39985972e-01, + 3.83629779e-01, + 1.85545249e-01, + 7.31492710e-02, + 2.38852818e-02, + 6.58075913e-03, + 1.55996452e-03, + 3.24474242e-04, + 6.03854915e-05, + 1.02569324e-05, + 1.72851146e-06, + ] + ) + + diff = stitched_temps - stitched_conc + assert diff.max() <= diff_ans.max(), "Max difference should be <= 0.95" + assert np.allclose(diff[18, :], diff_ans), ( + "The difference between a GWE and equivalent GWT solution has " + "changed. Some investigation required." + ) + + # Ensure that all 6 models are present within the simulation + mf6_sim = flopy.mf6.MFSimulation.load(sim_ws=test.workspace) + models = [] + for mname in mf6_sim.model_names: + models.append(mf6_sim.get_model(mname)) + assert ( + len(models) == 6 + ), "Unexpected number of models encountered while loading simulation" + + if plotModel: + # Create figure for scenario + sim_name = cases[idx] + mod = mf6_sim.get_model(mname) + + plt.rcParams["lines.dashed_pattern"] = [5.0, 5.0] + + fig = plt.figure(figsize=figure_size, dpi=300, tight_layout=True) + ax2 = fig.add_subplot(1, 1, 1, aspect="equal") + + # temp1 = stitched_conc[:, :] + # temp2 = stitched_temps[:, :] + + levels = [0.2, 5, 20, 50, 90] + + mod4plot = fict_model(out_pth) + mm = flopy.plot.PlotMapView(model=mod4plot) + mm.plot_grid(color=".5", alpha=0.2) + mm.plot_ibound(ibound=idomain_ur, color_noflow="grey", alpha=0.1) + cs1 = mm.contour_array(stitched_conc, levels=levels, colors="r") + plt.clabel(cs1, inline=1, fontsize=10) + cs2 = mm.contour_array( + stitched_temps, levels=levels, colors="k", linestyles=":" + ) + plt.clabel(cs2, inline=1, fontsize=10) + labels = ["GWT", "GWE"] + lines = [cs1.collections[0], cs2.collections[0]] + + plt.xlabel("Distance Along X-Axis, in meters") + plt.ylabel("Distance Along Y-Axis, in meters") + title = "Comparison of GWT and GWE isoconcentration lines" + ax2.legend(lines, labels, loc="upper right") + + # Add labels to the plot + # style = dict(size=10, color='black') + # ax2.text(235, 140, "Location of x-section \nshown in Fig. x", **style) + + # save figure + if plotSave: + fpth = os.path.join( + out_pth, + "{}".format(sim_name + "-planView.png"), + ) + fig.savefig(fpth) + + +# - No need to change any code below +@pytest.mark.parametrize( + "idx, name", + list(enumerate(cases)), +) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/doc/Common/gwe-ctpobs.tex b/doc/Common/gwe-ctpobs.tex new file mode 100644 index 00000000000..8c141d5ae43 --- /dev/null +++ b/doc/Common/gwe-ctpobs.tex @@ -0,0 +1 @@ +CTP & ctp & cellid or boundname & -- & Energy flow between the groundwater system and a constant-temperature boundary or a group of cells with constant-temperature boundaries. diff --git a/doc/Common/gwe-eslobs.tex b/doc/Common/gwe-eslobs.tex new file mode 100644 index 00000000000..c25662d1dd8 --- /dev/null +++ b/doc/Common/gwe-eslobs.tex @@ -0,0 +1 @@ +ESL & esl & cellid or boundname & -- & Energy source loading rate between the groundwater system and a energy source loading boundary or a group of boundaries. \ No newline at end of file diff --git a/doc/Common/gwe-esrobs.tex b/doc/Common/gwe-esrobs.tex new file mode 100644 index 00000000000..1bb6fbb305a --- /dev/null +++ b/doc/Common/gwe-esrobs.tex @@ -0,0 +1 @@ +ESR & esr & cellid or boundname & -- & Energy source loading rate between the groundwater system and a energy source loading boundary or a group of boundaries. \ No newline at end of file diff --git a/doc/Common/gwe-gweobs.tex b/doc/Common/gwe-gweobs.tex new file mode 100644 index 00000000000..cc8058514c5 --- /dev/null +++ b/doc/Common/gwe-gweobs.tex @@ -0,0 +1 @@ +GWE-GWE & flow-ja-face & exchange number or boundname & -- & Energy flow between model 1 and model 2 for a specified exchange (which is the consecutive exchange number listed in the EXCHANGEDATA block), or the sum of these exchange flows by boundname if boundname is specified. \ No newline at end of file diff --git a/doc/Common/gwe-lkeobs.tex b/doc/Common/gwe-lkeobs.tex new file mode 100644 index 00000000000..f66ba397ae3 --- /dev/null +++ b/doc/Common/gwe-lkeobs.tex @@ -0,0 +1,18 @@ +% general APT observations +LKE & temperature & lakeno or boundname & -- & Lake temperature. If boundname is specified, boundname must be unique for each lake. \\ +LKE & flow-ja-face & lakeno or boundname & lakeno or -- & Energy flow between two lakes connected by an outlet. If more than one outlet is used to connect the same two lakes, then the energy flow for only the first outlet can be observed. If a boundname is specified for ID1, then the result is the total energy flow for all outlets for a lake. If a boundname is specified for ID1 then ID2 is not used.\\ +LKE & storage & lakeno or boundname & -- & Simulated energy storage flow rate for a lake or group of lakes. \\ +LKE & constant & lakeno or boundname & -- & Simulated energy constant-flow rate for a lake or group of lakes. \\ +LKE & from-mvr & lakeno or boundname & -- & Simulated energy inflow into a lake or group of lakes from the MVE package. Energy inflow is calculated as the product of provider temperature and the mover flow rate. \\ +LKE & to-mvr & outletno or boundname & -- & Energy outflow from a lake outlet, a lake, or a group of lakes that is available for the MVR package. If boundname is not specified for ID, then the outflow available for the MVR package from a specific lake outlet is observed. In this case, ID is the outlet number, which must be between 1 and NOUTLETS. \\ +LKE & lke & lakeno or boundname & \texttt{iconn} or -- & Energy flow rate for a lake or group of lakes and its aquifer connection(s). If boundname is not specified for ID, then the simulated lake-aquifer flow rate at a specific lake connection is observed. In this case, ID2 must be specified and is the connection number \texttt{iconn} for lake \texttt{lakeno}. \\ + +%observations specific to the lake package +% rainfall evaporation runoff ext-inflow withdrawal outflow +LKE & rainfall & lakeno or boundname & -- & Rainfall rate applied to a lake or group of lakes multiplied by the rainfall temperature. \\ +LKE & evaporation & lakeno or boundname & -- & Simulated evaporation rate from a lake or group of lakes multiplied by the latent heat of evaporation for determining the energy lost from a lake. \\ +LKE & runoff & lakeno or boundname & -- & Runoff rate applied to a lake or group of lakes multiplied by the runoff temperature. \\ +LKE & ext-inflow & lakeno or boundname & -- & Energy inflow into a lake or group of lakes calculated as the external inflow rate multiplied by the inflow temperature. \\ +LKE & withdrawal & lakeno or boundname & -- & Specified withdrawal rate from a lake or group of lakes multiplied by the simulated lake temperature. \\ +LKE & ext-outflow & lakeno or boundname & -- & External outflow from a lake or a group of lakes, through their outlets, to an external boundary. If the water mover is active, the reported ext-outflow value plus the rate to mover is equal to the total outlet outflow. + diff --git a/doc/Common/gwe-mweobs.tex b/doc/Common/gwe-mweobs.tex new file mode 100644 index 00000000000..a2c51bf6a3b --- /dev/null +++ b/doc/Common/gwe-mweobs.tex @@ -0,0 +1,13 @@ +% general APT observations +MWE & temperature & mawno or boundname & -- & Well temperature. If boundname is specified, boundname must be unique for each well. \\ +%flowjaface not included +MWE & storage & mawno or boundname & -- & Simulated energy storage flow rate for a well or group of wells. \\ +MWE & constant & mawno or boundname & -- & Simulated energy constant-flow rate for a well or group of wells. \\ +MWE & from-mvr & mawno or boundname & -- & Simulated energy inflow into a well or group of wells from the MVE package. Energy inflow is calculated as the product of provider temperature and the mover flow rate. \\ +MWE & mwe & mawno or boundname & \texttt{iconn} or -- & Energy flow rate for a well or group of wells and its aquifer connection(s). If boundname is not specified for ID, then the simulated well-aquifer flow rate at a specific well connection is observed. In this case, ID2 must be specified and is the connection number \texttt{iconn} for well \texttt{mawno}. \\ + +% observations specific to the mwe package +MWE & rate & mawno or boundname & -- & Simulated energy flow rate for a well or group of wells. \\ +MWE & fw-rate & mawno or boundname & -- & Simulated energy flow rate for a flowing well or group of flowing wells. \\ +MWE & rate-to-mvr & well or boundname & -- & Simulated energy flow rate that is sent to the MVE Package for a well or group of wells.\\ +MWE & fw-rate-to-mvr & well or boundname & -- & Simulated energy flow rate that is sent to the MVE Package from a flowing well or group of flowing wells. \\ diff --git a/doc/Common/gwe-obs.tex b/doc/Common/gwe-obs.tex new file mode 100644 index 00000000000..4d3913438b0 --- /dev/null +++ b/doc/Common/gwe-obs.tex @@ -0,0 +1,2 @@ +GWE & temperature & cellid & -- & Temperature at a specified cell. \\ +GWE & flow-ja-face & cellid & cellid & Energy flow in dimensions of watts between two adjacent cells. The energy flow rate includes the contributions from both advection and conduction (including mechanical dispersion) if those packages are active \ No newline at end of file diff --git a/doc/Common/gwe-obstypetable.tex b/doc/Common/gwe-obstypetable.tex new file mode 100644 index 00000000000..ff089c6f6da --- /dev/null +++ b/doc/Common/gwe-obstypetable.tex @@ -0,0 +1,94 @@ + +\begingroup +\makeatletter +\ifx\LT@ii\@undefined\else +\def\LT@entry#1#2{\noexpand\LT@entry{-#1}{#2}} +\xdef\LT@i{\LT@ii} +\fi +\endgroup + +% model observations +\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +\caption{Available observation types for the GWE Model} \tabularnewline + +\hline +\hline +\textbf{Model} & \textbf{Observation types} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endfirsthead + +\captionsetup{textformat=simple} +\caption*{\textbf{Table \arabic{table}.}{\quad}List of symbols used in this report.---Continued} \\ + +\hline +\hline +\textbf{Model} & \textbf{Observation types} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endhead + +\hline +\endfoot + +\input{../Common/gwe-obs.tex} +\end{longtable} +\addtocounter{table}{-1} + +% stress packages +\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +\hline +\hline +\textbf{Stress Package} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endfirsthead + +\captionsetup{textformat=simple} +\caption*{\textbf{Table \arabic{table}.}{\quad}Available GWE observation types.---Continued} \\ + +\hline +\hline +\textbf{Stress Package} & \textbf{Observation types} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endhead + +\hline +\endfoot + +\input{../Common/gwe-ctpobs.tex} \\ +\hline +% \input{../Common/gwe-esrobs.tex} \\ +% \hline +\input{../Common/gwe-sfeobs.tex} \\ +\hline +% \input{../Common/gwe-lkeobs.tex} \\ +% \hline +% \input{../Common/gwe-mweobs.tex} \\ +\hline +\input{../Common/gwe-uzeobs.tex} +\label{table:gwe-obstypetable} +\end{longtable} +\addtocounter{table}{-1} + +% exchange +\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +\hline +\hline +\textbf{Exchange} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endfirsthead + +\captionsetup{textformat=simple} +\caption*{\textbf{Table \arabic{table}.}{\quad}Available GWE observation types.---Continued} \\ + +\hline +\hline +\textbf{Exchange} & \textbf{Observation types} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endhead + +\hline +\endfoot + +\input{../Common/gwe-gweobs.tex} +\end{longtable} + +\normalsize diff --git a/doc/Common/gwe-sfeobs.tex b/doc/Common/gwe-sfeobs.tex new file mode 100644 index 00000000000..b6b602d8049 --- /dev/null +++ b/doc/Common/gwe-sfeobs.tex @@ -0,0 +1,17 @@ +% general APT observations +SFE & temperature & rno or boundname & -- & Reach temperature. If boundname is specified, boundname must be unique for each reach. \\ +SFE & flow-ja-face & rno or boundname & rno or -- & Energy flow between two reaches. If a boundname is specified for ID1, then the result is the total energy flow for all reaches. If a boundname is specified for ID1 then ID2 is not used.\\ +SFE & storage & rno or boundname & -- & Simulated energy storage flow rate for a reach or group of reaches. \\ +SFE & constant & rno or boundname & -- & Simulated energy constant-flow rate for a reach or group of reaches. \\ +SFE & from-mvr & rno or boundname & -- & Simulated energy inflow into a reach or group of reaches from the MVE package. Energy inflow is calculated as the product of provider temperature and the mover flow rate. \\ +SFE & to-mvr & rno or boundname & -- & Energy outflow from a reach, or a group of reaches that is available for the MVR package. If boundname is not specified for ID, then the outflow available for the MVR package from a specific reach is observed. \\ +SFE & sfe & rno or boundname & -- & Energy flow rate for a reach or group of reaches and its aquifer connection(s). \\ + +%observations specific to the stream energy transport package +% rainfall evaporation runoff ext-inflow withdrawal outflow +SFE & rainfall & rno or boundname & -- & Rainfall rate applied to a reach or group of reaches multiplied by the rainfall temperature. \\ +SFE & evaporation & rno or boundname & -- & Simulated evaporation rate from a reach or group of reaches multiplied by the latent heat of vaporization for determining the amount of energy lost from a reach. \\ +SFE & runoff & rno or boundname & -- & Runoff rate applied to a reach or group of reaches multiplied by the runoff temperature. \\ +SFE & ext-inflow & rno or boundname & -- & Energy inflow into a reach or group of reaches calculated as the external inflow rate multiplied by the inflow temperature. \\ +SFE & ext-outflow & rno or boundname & -- & External outflow from a reach or group of reaches to an external boundary. If boundname is not specified for ID, then the external outflow from a specific reach is observed. In this case, ID is the reach rno. \\ +SFE & strmbd-cond & rno or boundname & -- & Amount of heat conductively exchanged with the streambed material. diff --git a/doc/Common/gwe-uzeobs.tex b/doc/Common/gwe-uzeobs.tex new file mode 100644 index 00000000000..241c86ef653 --- /dev/null +++ b/doc/Common/gwe-uzeobs.tex @@ -0,0 +1,14 @@ +% general APT observations +UZE & temperature & uzeno or boundname & -- & uze cell temperature. If boundname is specified, boundname must be unique for each uze cell. \\ +UZE & flow-ja-face & uzeno or boundname & uzeno or -- & Energy flow between two uze cells. If a boundname is specified for ID1, then the result is the total energy flow for all uze cells. If a boundname is specified for ID1 then ID2 is not used.\\ +UZE & storage & uzeno or boundname & -- & Simulated energy storage flow rate for a uze cell or group of uze cells. \\ +UZE & constant & uzeno or boundname & -- & Simulated energy constant-flow rate for a uze cell or a group of uze cells. \\ +UZE & from-mvr & uzeno or boundname & -- & Simulated energy inflow into a uze cell or group of uze cells from the MVE package. Energy inflow is calculated as the product of provider temperature and the mover flow rate. \\ +UZE & uze & uzeno or boundname & -- & Energy flow rate for a uze cell or group of uze cells and its aquifer connection(s). \\ + +%observations specific to the uze package +% infiltration rej-inf uzet rej-inf-to-mvr +UZE & infiltration & uzeno or boundname & -- & Infiltration rate applied to a uze cell or group of uze cells multiplied by the infiltration temperature. \\ +UZE & rej-inf & uzeno or boundname & -- & Rejected infiltration rate applied to a uze cell or group of uze cells multiplied by the infiltration temperature. \\ +UZE & uzet & uzeno or boundname & -- & Unsaturated zone evapotranspiration rate applied to a uze cell or group of uze cells multiplied by the uze cell temperature. \\ +UZE & rej-inf-to-mvr & uzeno or boundname & -- & Rejected infiltration rate applied to a uze cell or group of uze cells multiplied by the infiltration temperature that is sent to the mover package. \\ diff --git a/doc/MODFLOW6References.bib b/doc/MODFLOW6References.bib index 0623f871f57..e1b6525749d 100644 --- a/doc/MODFLOW6References.bib +++ b/doc/MODFLOW6References.bib @@ -8,6 +8,28 @@ +@article{mazheng2010, + author = {Ma, Rui and Zheng, Chunmiao}, + title = {Effects of Density and Viscosity in Modeling Heat as a Groundwater Tracer}, + journal = {Groundwater}, + year = {2010}, + volume = {48}, + number = {3}, + pages = {380--389}, + doi = {10.1111/j.1745-6584.2009.00660.x}, + } + +@article{hechtmendez, + author = {Hecht-Mendez, J. and Molina-Giraldo, N. and Blum, P. and Bayer, P.}, + title = {Evaluating MT3DMS for Heat Transport Simulation of Closed Geothermal Systems}, + journal = {Groundwater}, + year = {2010}, + volume = {48}, + number = {5}, + pages = {741--756}, + doi = {10.1111/j.1745-6584.2010.00678.x}, + } + @article{morway2021, author = {Morway, Eric D. and Langevin, Christian D. and Hughes, Joseph D.}, title = {Use of the {MODFLOW 6} Water Mover Package to Represent Natural and Managed Hydrologic Connections}, diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index f4813a50b54..11ac03ea128 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -3,12 +3,12 @@ \item \currentmodflowversion - %\underline{NEW FUNCTIONALITY} - %\begin{itemize} - % \item xxx + \underline{NEW FUNCTIONALITY} + \begin{itemize} + \item A new Groundwater Energy (GWE) transport model is introduced to the code base for simulating heat transport in the subsurface. Additional information for activating the GWE model type within a MODFLOW 6 simulation is available within the mf6io.pdf document. New example problems have been developed for testing and demonstrating GWE capabilities (in addition to other internal tests that help verify the accuracy of GWE); however, additional changes to the code and input may be necessary in response to user needs and further testing. % \item xxx % \item xxx - %\end{itemize} + \end{itemize} %\underline{EXAMPLES} %\begin{itemize} diff --git a/doc/mf6io/body.tex b/doc/mf6io/body.tex index 32f0150cf94..b3da3ed0042 100644 --- a/doc/mf6io/body.tex +++ b/doc/mf6io/body.tex @@ -45,6 +45,11 @@ \SECTION{Groundwater Transport (GWT) Model Input} \input{gwt/gwt.tex} +%GWE Model Input Instructions +\newpage +\SECTION{Groundwater Energy Transport (GWE) Model Input} +\input{gwe/gwe.tex} + %Sparse Matrix Solution (IMS) \newpage \SECTION{Iterative Model Solution} diff --git a/doc/mf6io/gwe/adv.tex b/doc/mf6io/gwe/adv.tex new file mode 100644 index 00000000000..3c10f398dec --- /dev/null +++ b/doc/mf6io/gwe/adv.tex @@ -0,0 +1,16 @@ +Advection (ADV) Package information is read from the file that is specified by ``ADV6'' as the file type. Only one ADV Package can be specified for a GWE model. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-adv-options.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/gwe-adv-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-adv-example.dat} + diff --git a/doc/mf6io/gwe/cnd.tex b/doc/mf6io/gwe/cnd.tex new file mode 100644 index 00000000000..aeb317f899e --- /dev/null +++ b/doc/mf6io/gwe/cnd.tex @@ -0,0 +1,17 @@ +Conduction (CND) Package information is read from the file that is specified by ``CND6'' as the file type. Only one CND Package can be specified for a GWE model. The CND Package is based on the mathematical formulation presented for the XT3D option of the NPF Package available to represent full three-dimensional anisotropy in groundwater flow. XT3D can be computationally expensive and can be turned off to use a simplified and approximate form of the dispersion equations that also account for conduction in a heat transport model. For most problems, however, XT3D will be required to accurately represent conduction and dispersion. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-cnd-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-cnd-griddata.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/gwe-cnd-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-cnd-example.dat} + diff --git a/doc/mf6io/gwe/ctp.tex b/doc/mf6io/gwe/ctp.tex new file mode 100644 index 00000000000..0953d2e3367 --- /dev/null +++ b/doc/mf6io/gwe/ctp.tex @@ -0,0 +1,47 @@ +Constant Temperature (CTP) Package information is read from the file that is specified by ``CTP6'' as the file type. Any number of CTP Packages can be specified for a single GWE model, but the same cell cannot be designated as a constant temperature by more than one CTP entry. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\vspace{5mm} + +\noindent \textit{FOR EACH SIMULATION} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-ctp-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-ctp-dimensions.dat} +\vspace{5mm} +\noindent \textit{FOR ANY STRESS PERIOD} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-ctp-period.dat} +\packageperioddescription + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/gwe-ctp-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-ctp-example.dat} + +\vspace{5mm} +\subsubsection{Available observation types} +CTP Package observations are limited to the simulated constant temperature energy flow rate (\texttt{ctp}). The data required for the CTP Package observation type is defined in table~\ref{table:gwe-ctpobstype}. Negative and positive values for an observation represent a loss from and gain to the GWE model, respectively. + +\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +\caption{Available CTP Package observation types} \tabularnewline + +\hline +\hline +\textbf{Model} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endhead + +\hline +\endfoot + +\input{../Common/gwe-ctpobs.tex} +\label{table:gwe-ctpobstype} +\end{longtable} + +\vspace{5mm} +\subsubsection{Example Observation Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-ctp-example-obs.dat} diff --git a/doc/mf6io/gwe/esl.tex b/doc/mf6io/gwe/esl.tex new file mode 100644 index 00000000000..a32c4b3c497 --- /dev/null +++ b/doc/mf6io/gwe/esl.tex @@ -0,0 +1,47 @@ +Input to the Energy Source Loading (ESL) Package is read from the file that has type ``ESL6'' in the Name File. Any number of SRC Packages can be specified for a single groundwater energy transport model. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\vspace{5mm} + +\noindent \textit{FOR EACH SIMULATION} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-esl-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-esl-dimensions.dat} +\vspace{5mm} +\noindent \textit{FOR ANY STRESS PERIOD} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-esl-period.dat} +\packageperioddescription + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/gwe-esl-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-esl-example.dat} + +\vspace{5mm} +\subsubsection{Available observation types} +Energy Source Loading Package observations include the simulated energy source loading rates (\texttt{esl}). The data required for each ESL Package observation type is defined in table~\ref{table:gwe-eslobstype}. The \texttt{esl} observation is equal to the simulated energy source loading rate. Negative and positive values for an observation represent a loss from and gain to the GWE model, respectively. + +\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +\caption{Available ESL Package observation types} \tabularnewline + +\hline +\hline +\textbf{Stress Package} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endhead + +\hline +\endfoot + +\input{../Common/gwe-eslobs.tex} +\label{table:gwe-eslobstype} +\end{longtable} + +\vspace{5mm} +\subsubsection{Example Observation Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-esl-example-obs.dat} diff --git a/doc/mf6io/gwe/est.tex b/doc/mf6io/gwe/est.tex new file mode 100644 index 00000000000..4306af74ca3 --- /dev/null +++ b/doc/mf6io/gwe/est.tex @@ -0,0 +1,18 @@ +Energy Storage and Transfer (EST) Package information is read from the file that is specified by ``EST6'' as the file type. Only one EST Package can be specified for a GWE model. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-est-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-est-griddata.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-est-packagedata.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/gwe-est-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-est-example.dat} + diff --git a/doc/mf6io/gwe/fmi.tex b/doc/mf6io/gwe/fmi.tex new file mode 100644 index 00000000000..5eab129cbed --- /dev/null +++ b/doc/mf6io/gwe/fmi.tex @@ -0,0 +1,54 @@ +Flow Model Interface (FMI) Package information is read from the file that is specified by ``FMI6'' as the file type. The FMI Package is optional, but if provided, only one FMI Package can be specified for a GWE model. + +For most simulations, the GWE Model needs groundwater flows for every cell in the model grid, for all boundary conditions, and for other terms, such as the flow of water in or out of storage. The FMI Package is the interface between the GWE Model and simulated groundwater flows provided by a corresponding GWF Model that is running concurrently within the simulation or from binary budget files that were created from a previous GWF model run. The following are several different FMI simulation cases: + +\begin{itemize} + +\item Flows are provided by a corresponding GWF Model running in the same simulation---in this case, all groundwater flows are calculated by the corresponding GWF Model and provided through FMI to the energy transport model. This is a common use case in which the user wants to run the flow and energy transport models as part of a single simulation. The GWF and GWE models must be part of a GWF-GWE Exchange that is listed in mfsim.nam. If a GWF-GWE Exchange is specified by the user, then the user does not need to specify an FMI Package input file for the simulation, unless an FMI option is needed. If a GWF-GWE Exchange is specified and the FMI Package is specified, then the PACKAGEDATA block below is not read or used. + +\item There is no groundwater flow and the user is interested only in the effects of diffusion, sorption, and decay or production---in this case, FMI should not be provided in the GWE name file and the GWE model should not be listed in any GWF-GWE Exchanges in mfsim.nam. In this case, all groundwater flows are assumed to be zero and cells are assumed to be fully saturated. The SSM Package should not be activated in this case, because there can be no sources or sinks of water. Likewise, none of the advanced transport packages (LKE, SFE, MWE, and UZE) should be specified in the GWE name file. This type of model simulation without an FMI Package is included as an option to represent diffusion, sorption, and decay or growth in the absence of any groundwater flow. + +\item Flows are provided from a previous GWF model simulation---in this case the FMI Package should be listed in the GWE name file and the head and budget files should be listed in the FMI PACKAGEDATA block. In this case, FMI reads the simulated head and flows from these files and makes them available to the energy transport model. There are some additional considerations when the heads and flows are provided from binary files. + +\begin{itemize} +\item The binary budget file must contain the simulated flows for all of the packages that were included in the GWF model run. Saving of flows can be activated for all packages by specifying ``SAVE\_FLOWS'' as an option in the GWF name file. The GWF Output Control Package must also have ``SAVE BUGET ALL'' specified. The easiest way to ensure that all flows and heads are saved is to use the following simple form of a GWF Output Control file: + +\begin{verbatim} +BEGIN OPTIONS + HEAD FILEOUT mymodel.hds + BUDGET FILEOUT mymodel.bud +END OPTIONS + +BEGIN PERIOD 1 + SAVE HEAD ALL + SAVE BUDGET ALL +END PERIOD +\end{verbatim} + +\item The binary budget file must have the same number of budget terms listed for each time step. This will always be the case when the binary budget file is created by \mf. +\item The advanced flow packages (LAK, SFR, MAW, and UZF) all have options for saving a detailed budget file the describes all of the flows for each lake, reach, well, or UZF cell. These budget files can also be used as input to FMI if a corresponding advanced transport package is needed, such as LKE, SFE, MWE, and UZE. If the Water Mover Package is also specified for the GWF Model, then the the budget file for the Water Mover Package will also need to be specified as input to this FMI Package. +\item The binary heads file must have heads saved for all layers in the model. This will always be the case when the binary head file is created by \mf. This was not always the case as previous MODFLOW versions allowed different save options for each layer. +\item If the binary budget and head files have more than one time step for a single stress period, then the budget and head information must be contained within the binary file for every time step in the simulation stress period. +\item The binary budget and head files must correspond in terms of information stored for each time step and stress period. +\item If the binary budget and head files have information provided for only the first time step of a given stress period, this information will be used for all time steps in that stress period in the GWE simulation. If the final stress period (which may be the only stress period) in the binary budget and head files has information provided for only one time step, this information will be used for any subsequent time steps and stress periods in the GWE simulation. This makes it possible to provide flows, for example, from a steady-state GWF stress period and have those flows used for all GWE time steps in that stress period, for all remaining time steps in the GWE simulation, or for all time steps throughout the entire GWE simulation. With this option, it is possible to have smaller time steps in the GWE simulation than the time steps used in the GWF simulation. Note that this cannot be done when the GWF and GWE models are run in the same simulation, because in that case, both models are solved for each time step in the stress period, as listed in the TDIS Package. This option for reading flows from a previous GWF simulation may offer an efficient alternative to running both models in the same simulation, but it comes at the cost of having potentially very large budget files. +\end{itemize} + +\end{itemize} + +\noindent Determination of which FMI use case to invoke requires careful consideration of the different advantages and disadvantages of each case. For example, running GWE and GWF in the same simulation can often be faster because GWF flows are passed through memory to the GWE model instead of being written to files. The disadvantage of this approach is that the same time step lengths must be used for both GWF and GWE. Ultimately, it should be relatively straightforward to test different ways in which GWF and GWE interact and select the use case most appropriate for the particular problem. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-fmi-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-fmi-packagedata.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/gwe-fmi-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-fmi-example.dat} + diff --git a/doc/mf6io/gwe/gwe-gwe.tex b/doc/mf6io/gwe/gwe-gwe.tex new file mode 100644 index 00000000000..7428d6d4af7 --- /dev/null +++ b/doc/mf6io/gwe/gwe-gwe.tex @@ -0,0 +1,45 @@ +Input to the Groundwater Energy Transport (GWE-GWE) Exchange is read from the file that has type ``GWE6-GWE6'' in the Simulation Name File. + +The list of exchanges entered into the EXCHANGEDATA block must be identical to the list of exchanges entered for the GWF-GWF input file. One way to ensure that this information is identical is to put this list into an external file and refer to this same list using the OPEN/CLOSE functionality in both this EXCHANGEDATA input block and the EXCHANGEDATA input block in the GWF-GWF input file. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/exg-gwegwe-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/exg-gwegwe-dimensions.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/exg-gwegwe-exchangedata.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/exg-gwegwe-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/exg-gwegwe-example.dat} + +\vspace{5mm} +\subsubsection{Available observation types} +GWE-GWE Exchange observations include the simulated flow for any exchange (\texttt{flow-ja-face}). The data required for each GWE-GWE Exchange observation type is defined in table~\ref{table:gwe-gweobstype}. For \texttt{flow-ja-face} observation types, negative and positive values represent a loss from and gain to the first model specified for this exchange. + +\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +\caption{Available GWE-GWE Exchange observation types} \tabularnewline + +\hline +\hline +\textbf{Exchange} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endhead + +\hline +\endfoot + +\input{../Common/gwe-gweobs.tex} +\label{table:gwe-gweobstype} +\end{longtable} + + +\vspace{5mm} +\subsubsection{Example Observation Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/exg-gwegwe-example-obs.dat} + diff --git a/doc/mf6io/gwe/gwe-obs.tex b/doc/mf6io/gwe/gwe-obs.tex new file mode 100644 index 00000000000..a46ca5de597 --- /dev/null +++ b/doc/mf6io/gwe/gwe-obs.tex @@ -0,0 +1,39 @@ + +GWE Model observations include the simulated groundwater temperature (\texttt{temperature}), and the energy flow, with units of energy per time, between two connected cells (\texttt{flow-ja-face}). The data required for each GWE Model observation type is defined in table~\ref{table:gweobstype}. For \texttt{flow-ja-face} observation types, negative and positive values represent a loss from and gain to the \texttt{cellid} specified for ID, respectively. + +\subsubsection{Structure of Blocks} +\vspace{5mm} + +\noindent \textit{FOR EACH SIMULATION} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/utl-obs-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/utl-obs-continuous.dat} + +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/utl-obs-desc.tex} +\end{description} + + +\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +\caption{Available GWE model observation types} \tabularnewline + +\hline +\hline +\textbf{Model} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endhead + +\hline +\endfoot + +\input{../Common/gwe-obs.tex} +\label{table:gweobstype} +\end{longtable} + +\vspace{5mm} +\subsubsection{Example Observation Input File} + +An example GWE Model observation file is shown below. + +\lstinputlisting[style=inputfile]{./mf6ivar/examples/utl-obs-gwe-example.dat} + diff --git a/doc/mf6io/gwe/gwe.tex b/doc/mf6io/gwe/gwe.tex new file mode 100644 index 00000000000..c4ab64fe833 --- /dev/null +++ b/doc/mf6io/gwe/gwe.tex @@ -0,0 +1,151 @@ +Like GWT \citep{modflow6gwt}, the GWE Model simulates three-dimensional transport in flowing groundwater. The primary difference between GWT and GWE is that heat (i.e., temperature), instead of concentration, is the simulated ``species.'' As such, the GWE Model solves the heat transport equation using numerical methods and a generalized control-volume finite-difference approach, which can be used with regular MODFLOW grids (DIS Package) or with unstructured grids (DISV and DISU Packages). The GWE Model is designed to work with most of the new capabilities released with the GWF Model, including the Newton flow formulation, XT3D \citep{modflow6xt3d}, unstructured grids, advanced packages, the movement of water between packages. The GWF and GWE (and, if active, GWT) models operate simultaneously during a \mf simulation to represent coupled groundwater flow and heat transport. The GWE Model can also run separately from a GWF Model by reading the heads and flows saved by a previously run GWF Model. The GWE model is also capable of working with the flows from another groundwater flow model as long as the cell-by-cell and boundary flows and groundwater heads are written to ``linker'' files in the correct format. + +The purpose of the GWE Model is to calculate changes in groundwater temperature in both space and time. Groundwater temperature within an aquifer can change in response to different energy transport processes. These processes include (1) convective (advective) transport of heat with flowing groundwater, (2) the combined hydrodynamic dispersion processes of velocity-dependent mechanical dispersion and conduction (analogous to chemical diffusion), (3) thermal equilibrium with the aquifer matrix, (4) mixing with fluids from groundwater sources and sinks, and (5) direct addition of thermal energy. + +For GWE, the energy present in the aquifer is assumed to instantaneously equilibrate between the aqueous and solid phase domains. For example, a pulse of heat convecting through an aquifer will be retarded through thermal equilibration with the aquifer material. Conversely, the introduction of cold groundwater into a previously warm region of the aquifer will warmup, at least in part, as energy within the aquifer matrix transfers to the aqueous phase. Unlike GWT, the GWE Model type does not support an immobile domain. The energy that is transferred between the aqeous and solid phases of the groundwater system are tracked in the GWE Model budget. + +This section describes the data files for a \mf Groundwater Energy Transport (GWE) Model. A GWE Model is added to the simulation by including a GWE entry in the MODELS block of the simulation name file. There are three types of spatial discretization approaches that can be used with the GWE Model: DIS, DISV, and DISU. The input instructions for these three packages are not described here in this section on GWE Model input; input instructions for these three packages are described in the section on GWF Model input. + +The GWE Model is designed to permit input to be gathered, as it is needed, from many different files. Likewise, results from the model calculations can be written to a number of output files. The GWE Model Listing File is a key file to which the GWE model output is written. As \mf runs, information about the GWE Model is written to the GWE Model Listing File, including much of the input data (as a record of the simulation) and calculated results. Details about the files used by each package are provided in this section. + +The GWE Model reads a file called the Name File, which specifies most of the files that will be used in a groundwater energy transport simulation. Several files are always required whereas other files are optional depending on the question(s) being addressed by the model. The Output Control Package receives instructions from the user to control the amount and frequency of output. Details about the Name File and the Output Control Package are described in this section. + +For the GWE Model, ``flows'' (unless stated otherwise) represent the ``flow'' of energy, often expressed in units of energy (e.g., joules) per time, rather than groundwater flow. + +\subsection{Information for Existing Heat Transport Modelers} +An important goal of the \mf GWE Model is to alleviate the need for ``parameter equivalents'' when simulating heat transport in groundwater systems. In the past, codes like HST3D \citep{kipp1987} or VS2DH \citep{healy1996} simulated energy transport directly by supporting the use of native heat transport units. For example, users could directly specify thermal conductivity of the fluid and solid phases, as well as the heat capacity of both phases. Alternatively, codes like MT3DMS \citep{zheng1999mt3dms}, MT3D-USGS \citep{mt3dusgs}, and MODFLOW-USG \citep{modflowusg} could be used to simulate the movement of heat in groundwater, but required users to leverage existing variables as surrogates for heat transport. For example, the molecular diffusion parameter may be used as a surrogate for simulating thermal conduction in an aquifer \citep{mazheng2010, hechtmendez}. + +The following list summarizes important aspects of GWE for simulating heat transport with \mf: + +\begin{enumerate} + +\item The GWE Model uses parameters that are native to heat transport, including thermal conductivity of water, heat capacity of water, thermal conductivity of the aquifer material, heat capacity of of the aquifer material, and latent heat of vaporization. Therefore, users do not need to pre-calculate ``parameter equivalents'' when generating GWE model input; users can instead enter native parameter values that are readily available. + +\item Thermal energy transport budgets written to the \mf list file are reported in units of energy (e.g., joules). Previously, using a program like MT3D-USGS \citep{mt3dusgs} to simulate heat transport, units in the list file budget did not correspond to thermal energy, but were reported in units of $\frac{m^{3 \;\circ}C}{d}$. To convert to thermal energy units, values in the list file had to be post-processed by multiplying each line item by the density of water ($\rho_w$) and the heat capacity of water ($C_p$) \citep{langevin2008seawat}. + +\item Thermal equilibrium between the aqueous and solid phases is assumed. Thus, simulated temperatures are representive of both phases. As a result, thermal conduction between adjacent cells may still occur even in the absense of convection. + +\item In GWE, dry cells (devoid of groundwater) remain active for simulating thermal conduction. For example, energy (heat) transfer will be simulated between a partially saturated cell (i.e., ``water-table'' cell) and an overlying dry cell. In this way, a more full accounting of various heat transport processes is represented in the subsurface. Moreover, this approach readily supports heat transport in the unsaturated-zone when the UZE (unsaturated-zone energy transport) Package is active. + +\item Heat transport is supported for all five of the advanced GWF packages using the following packages in GWE: (1) streamflow energy transport, SFE Package; (2) lake energy transport, LKE Package; (3) multi-aquifer well energy transport, MWE Package; (4) unsaturated zone energy transport, UZE Package; and the (5) Water Mover Package, MVE. Similar to GWT, GWE will simulate heat transfer between an advanced package and the groundwater system via groundwater surface-water exchange; however, GWE also simulates a conductive transfer of heat between an advanced package feature and the aquifer. To take advantage of this functionality, users must specify the thermal conductivity of the material separating a stream from the aquifer, for example, the thermal conductivity of the streambed (or lakebed), as well as the thickness of the streambed (or lakebed). As with the advanced GWT packages, GWE simulates thermal convection between package features, such as between two stream reaches for example. Also, dispersive heat transport among among advanced package features is not represented, similar to GWT. + +\item Where the GWF model simulates evaporation from an open body of water, for example from the surface of a stream or lake, the latent heat of vaporization may be used to simulate evaporative cooling. As water is converted from liquid to gas, the energy required by the phase change is drawn from the remaining body of water and the resulting cool down is calculated. + +\end{enumerate} + +Many of the same considerations listed for the GWT model should be kept in mind when developing a GWE model. For convenience, many of those considerations are adapted for GWE and repeated here. + +\begin{enumerate} + +\item A GWE Model can access flows calculated by a GWF Model that is running in the same simulation as the GWE Model. Alternatively, a GWE Model can read binary head and budget files created from a previous GWF Model simulation (provided these files contain all of the required information for all time steps); there is no specialized flow and transport link file \citep{zheng2001modflow} as there is for MT3D. Details on these two different use cases are provided in the chapter on the FMI Package. + +\item The GWE Model is based on a generalized control-volume finite-difference method, which means that heat transport can be simulated using regular MODFLOW grids consisting of layers, rows, and columns, or heat transport can be simulated using unstructured grids. + +\item GWE and GWT use the same advection package source code. As a result, advection can be simulated using central-in-space weighting, upstream weighting, or an implicit second-order TVD scheme. Currently, neither the GWE or GWT models can use a Method of Characteristics (particle-based approaches) or an explicit TVD scheme to simulate convective (or advective) transport. Consequently, the GWE Model may require a higher level of spatial discretization than other transport models that use higher order terms for advection dominated systems. This can be an important limitation in problems involving sharp heat fronts. + +\item The Viscosity Package may reference a GWE model directly for adjusting the viscosity-affected groundwater flow. + +\item GWE and GWT use the same Source and Sink Mixing (SSM) Package for representing the effects of GWF stress package inflows and outflows on simulated temperatures and concentrations. In a GWE simulation, there are two ways in which users can assign concentrations to the individual features in these stress package. The first way is to activate a temperature auxiliary variable in the corresponding GWF stress package. In the SSM input file, the user provides the name of the auxiliary variable to be used for temperature. The second way is to create a special SPC file, which contains user-assigned time-varying temperatures for stress package features. + +\item The GWE model includes an EST Package, but does not include an IST Package. Heat transport-related parameters such as thermal conductivities and heat capacities are specified in the EST Package. + +\item A GWE-GWE Exchange (introduced in version 6.5.0) can be used to tightly couple multiple heat transport models, as might be done in a nested grid configuration. + +\item There is no option to automatically run the GWE Model to steady state using a single time step. This is an option available in MT3DMS \citep{zheng2010supplemental}. Steady state conditions must be determined by running the transport model under transient conditions until temperatures stabilize. + +\item As is the case with GWT, the GWE Model has not yet been programmed to work with the Skeletal Storage, Compaction, and Subsidence (CSUB) Package for the GWF Model. + +\item There are many other differences between the \mf GWE Model and other solute transport models that work with MODFLOW, especially with regards to program design and input and output. Descriptions for the GWE input and output are described here. + +\end{enumerate} + +\subsection{Units of Length and Time} +The GWF Model formulates the groundwater flow equation without using prescribed length and time units. Any consistent units of length and time can be used when specifying the input data for a simulation. This capability gives a certain amount of freedom to the user, but care must be exercised to avoid mixing units. The program cannot detect the use of inconsistent units. + +\subsection{Thermal Energy Budget} +A summary of all inflow (sources) and outflow (sinks) of thermal energy is referred to as an energy budget. \mf calculates an energy budget for the overall model as a check on the acceptability of the solution, and to provide a summary of the sources and sinks of energy to the flow system. The energy budget is printed to the GWE Model Listing File for specified time steps. + +\subsection{Time Stepping} + +For the present implementation of the GWE Model, all terms in the heat transport equation are solved implicitly. With the implicit approach applied to the transport equation, it is possible to take relatively large time steps and efficiently obtain a stable solution. If the time steps are too large, however, accuracy of the model results will suffer, so there is usually some compromise required between the desired level of accuracy and length of the time step. An assessment of accuracy can be performed by simply running simulations with shorter time steps and comparing results. + +In \mf time step lengths are controlled by the user and specified in the Temporal Discretization (TDIS) input file. When the flow model and heat transport model are included in the same simulation, then the length of the time step specified in TDIS is used for both models. If the GWE Model runs in a separate simulation from the GWE Model, then the time steps used for the heat transport model can be different, and likely shorter, than the time steps used for the flow solution. Instructions for specifying time steps are described in the TDIS section of this user guide; additional information on GWF and GWE configurations are in the Flow Model Interface section. + + + +\newpage +\subsection{GWE Model Name File} +\input{gwe/namefile.tex} + +%\newpage +%\subsection{Structured Discretization (DIS) Input File} +%\input{gwf/dis} + +%\newpage +%\subsection{Discretization with Vertices (DISV) Input File} +%\input{gwf/disv} + +%\newpage +%\subsection{Unstructured Discretization (DISU) Input File} +%\input{gwf/disu} + +\newpage +\subsection{Initial Conditions (IC) Package} +\input{gwe/ic} + +\newpage +\subsection{Output Control (OC) Option} +\input{gwe/oc} + +\newpage +\subsection{Observation (OBS) Utility for a GWE Model} +\input{gwe/gwe-obs} + +\newpage +\subsection{Advection (ADV) Package} +\input{gwe/adv} + +\newpage +\subsection{Conduction (CND) Package} +\input{gwe/cnd} + +\newpage +\subsection{Energy Storage and Transfer (EST) Package} +\input{gwe/est} + +\newpage +\subsection{Source and Sink Mixing (SSM) Package} +\input{gwe/ssm} + +\newpage +\subsection{Constant Temperature (CTP) Package} +\input{gwe/ctp} + +\newpage +\subsection{Energy Source Loading (ESL) Package} +\input{gwe/esl} + +\newpage +\subsection{Streamflow Energy Transport (SFE) Package} +\input{gwe/sfe} + +\newpage +\subsection{Lake Energy Transport (LKE) Package} +\input{gwe/lke} + +\newpage +\subsection{Multi-Aquifer Well Energy Transport (MWE) Package} +\input{gwe/mwe} + +\newpage +\subsection{Unsaturated-Zone Energy Transport (UZE) Package} +\input{gwe/uze} + +\newpage +\subsection{Flow Model Interface (FMI) Package} +\input{gwe/fmi} + +\newpage +\subsection{Groundwater Energy Transport (GWE) Exchange} +\input{gwe/gwe-gwe} + diff --git a/doc/mf6io/gwe/ic.tex b/doc/mf6io/gwe/ic.tex new file mode 100644 index 00000000000..aa9c1accaad --- /dev/null +++ b/doc/mf6io/gwe/ic.tex @@ -0,0 +1,17 @@ +Initial Conditions (IC) Package information is read from the file that is specified by ``IC6'' as the file type. Only one IC Package can be specified for a GWE model. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +%\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-ic-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-ic-griddata.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/gwe-ic-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-ic-example.dat} + diff --git a/doc/mf6io/gwe/lke.tex b/doc/mf6io/gwe/lke.tex new file mode 100644 index 00000000000..4b9e28581c5 --- /dev/null +++ b/doc/mf6io/gwe/lke.tex @@ -0,0 +1,55 @@ +Lake Energy Transport (LKE) Package information is read from the file that is specified by ``LKE6'' as the file type. There can be as many LKE Packages as necessary for a GWE model. Each LKE Package is designed to work with flows from a single corresponding GWF LAK Package. By default \mf uses the LKE package name to determine which LAK Package corresponds to the LKE Package. Therefore, the package name of the LKE Package (as specified in the GWE name file) must match with the name of the corresponding LAK Package (as specified in the GWF name file). Alternatively, the name of the flow package can be specified using the FLOW\_PACKAGE\_NAME keyword in the options block. The GWE LKE Package cannot be used without a corresponding GWF LAK Package. + +The LKE Package does not have a dimensions block; instead, dimensions for the LKE Package are set using the dimensions from the corresponding LAK Package. For example, the LAK Package requires specification of the number of lakes (NLAKES). LKE sets the number of lakes equal to NLAKES. Therefore, the PACKAGEDATA block below must have NLAKES entries in it. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-lke-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-lke-packagedata.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-lke-period.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/gwe-lke-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-lke-example.dat} + +\vspace{5mm} +\subsubsection{Available observation types} +Lake Energy Transport Package observations include lake temperature and all of the terms that contribute to the continuity equation for each lake. Additional LKE Package observations include energy flow rates for individual outlets, lakes, or groups of lakes (\texttt{outlet}). The data required for each LKE Package observation type is defined in table~\ref{table:gwe-lkeobstype}. Negative and positive values for \texttt{lke} observations represent a loss from and gain to the GWE model, respectively. For all other flow terms, negative and positive values represent a loss from and gain from the LKE package, respectively. + +\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +\caption{Available LKE Package observation types} \tabularnewline + +\hline +\hline +\textbf{Stress Package} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endfirsthead + +\captionsetup{textformat=simple} +\caption*{\textbf{Table \arabic{table}.}{\quad}Available LKE Package observation types.---Continued} \tabularnewline + +\hline +\hline +\textbf{Stress Package} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endhead + + +\hline +\endfoot + +\input{../Common/gwe-lkeobs.tex} +\label{table:gwe-lkeobstype} +\end{longtable} + +\vspace{5mm} +\subsubsection{Example Observation Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-lke-example-obs.dat} + + diff --git a/doc/mf6io/gwe/mwe.tex b/doc/mf6io/gwe/mwe.tex new file mode 100644 index 00000000000..70fc673987d --- /dev/null +++ b/doc/mf6io/gwe/mwe.tex @@ -0,0 +1,55 @@ +Multi-Aquifer Well Energy Transport (MWE) Package information is read from the file that is specified by ``MWE6'' as the file type. There can be as many MWE Packages as necessary for a GWE model. Each MWE Package is designed to work with flows from a corresponding GWF MAW Package. By default \mf uses the MWE package name to determine which MAW Package corresponds to the MWE Package. Therefore, the package name of the MWE Package (as specified in the GWE name file) must match with the name of the corresponding MAW Package (as specified in the GWF name file). Alternatively, the name of the flow package can be specified using the FLOW\_PACKAGE\_NAME keyword in the options block. The GWE MWE Package cannot be used without a corresponding GWF MAW Package. + +The MWE Package does not have a dimensions block; instead, dimensions for the MWE Package are set using the dimensions from the corresponding MAW Package. For example, the MAW Package requires specification of the number of wells (NMAWWELLS). MWE sets the number of wells equal to NMAWWELLS. Therefore, the PACKAGEDATA block below must have NMAWWELLS entries in it. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-mwe-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-mwe-packagedata.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-mwe-period.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/gwe-mwe-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-mwe-example.dat} + +\vspace{5mm} +\subsubsection{Available observation types} +Multi-Aquifer Well Energy Transport Package observations include well temperature and all of the terms that contribute to the continuity equation for each well. Additional MWE Package observations include energy flow rates for individual wells, or groups of wells; the well volume (\texttt{volume}); and the conductance for a well-aquifer connection conductance (\texttt{conductance}). The data required for each MWE Package observation type is defined in table~\ref{table:gwe-mweobstype}. Negative and positive values for \texttt{mwe} observations represent a loss from and gain to the GWE model, respectively. For all other flow terms, negative and positive values represent a loss from and gain from the MWE package, respectively. + +\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +\caption{Available MWE Package observation types} \tabularnewline + +\hline +\hline +\textbf{Stress Package} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endfirsthead + +\captionsetup{textformat=simple} +\caption*{\textbf{Table \arabic{table}.}{\quad}Available MWE Package observation types.---Continued} \tabularnewline + +\hline +\hline +\textbf{Stress Package} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endhead + + +\hline +\endfoot + +\input{../Common/gwe-mweobs.tex} +\label{table:gwe-mweobstype} +\end{longtable} + +\vspace{5mm} +\subsubsection{Example Observation Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-mwe-example-obs.dat} + + diff --git a/doc/mf6io/gwe/namefile.tex b/doc/mf6io/gwe/namefile.tex new file mode 100644 index 00000000000..d8cc1d18fec --- /dev/null +++ b/doc/mf6io/gwe/namefile.tex @@ -0,0 +1,52 @@ +The GWE Model Name File specifies the options and packages that are active for a GWE model. The Name File contains two blocks: OPTIONS and PACKAGES. The length of each line must be 299 characters or less. The lines in each block can be in any order. Files listed in the PACKAGES block must exist when the program starts. + +Comment lines are indicated when the first character in a line is one of the valid comment characters. Commented lines can be located anywhere in the file. Any text characters can follow the comment character. Comment lines have no effect on the simulation; their purpose is to allow users to provide documentation about a particular simulation. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-nam-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-nam-packages.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/gwe-nam-desc.tex} +\end{description} + +\begin{table}[H] +\caption{Ftype values described in this report. The \texttt{Pname} column indicates whether or not a package name can be provided in the name file. The capability to provide a package name also indicates that the GWE Model can have more than one package of that Ftype} +\small +\begin{center} +\begin{tabular*}{\columnwidth}{l l l} +\hline +\hline +Ftype & Input File Description & \texttt{Pname}\\ +\hline +DIS6 & Rectilinear Discretization Input File \\ +DISV6 & Discretization by Vertices Input File \\ +DISU6 & Unstructured Discretization Input File \\ +FMI6 & Flow Model Interface Package & \\ +IC6 & Initial Conditions Package \\ +OC6 & Output Control Option \\ +ADV6 & Advection Package \\ +CND6 & Conduction Package \\ +SSM6 & Source and Sink Mixing Package \\ +EST6 & Energy Storage and Transfer Package \\ +CTP6 & Constant Temperature Package & * \\ +ESL6 & Energy Source Loading Package & * \\ +SFE6 & Streamflow Energy Transport Package & * \\ +LKE6 & Lake Energy Transport Package & * \\ +MWE6 & Multi-Aquifer Well Energy Transport Package & * \\ +UZE6 & Unsaturated-Zone Energy Transport Package & * \\ +OBS6 & Observations Option \\ +\hline +\end{tabular*} +\label{table:ftype} +\end{center} +\normalsize +\end{table} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-nam-example.dat} + diff --git a/doc/mf6io/gwe/oc.tex b/doc/mf6io/gwe/oc.tex new file mode 100644 index 00000000000..d534a14eb08 --- /dev/null +++ b/doc/mf6io/gwe/oc.tex @@ -0,0 +1,25 @@ +Input to the Output Control Option of the Groundwater Energy Transport Model is read from the file that is specified as type ``OC6'' in the Name File. If no ``OC6'' file is specified, default output control is used. The Output Control Option determines how and when temperatures are printed to the listing file and/or written to a separate binary output file. Under the default, temperature and the overall energy transport budget are written to the Listing File at the end of every stress period. The default printout format for temperatures is 10G11.4. The temperatures and overall energy transport budget are also written to the list file if the simulation terminates prematurely due to failed convergence. + +Output Control data must be specified using words. The numeric codes supported in earlier MODFLOW versions can no longer be used. + +For the PRINT and SAVE options of temperature, there is no option to specify individual layers. Whenever the temperature array is printed or saved, all layers are printed or saved. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\vspace{5mm} + +\noindent \textit{FOR EACH SIMULATION} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-oc-options.dat} +\vspace{5mm} +\noindent \textit{FOR ANY STRESS PERIOD} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-oc-period.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/gwe-oc-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-oc-example.dat} diff --git a/doc/mf6io/gwe/sfe.tex b/doc/mf6io/gwe/sfe.tex new file mode 100644 index 00000000000..4f1e5fca4db --- /dev/null +++ b/doc/mf6io/gwe/sfe.tex @@ -0,0 +1,55 @@ +Streamflow Energy Transport (SFE) Package information is read from the file that is specified by ``SFE6'' as the file type. There can be as many SFE Packages as necessary for a GWE model. Each SFE Package is designed to work with flows from a corresponding GWF SFR Package. By default \mf uses the SFE package name to determine which SFR Package corresponds to the SFE Package. Therefore, the package name of the SFE Package (as specified in the GWE name file) must match with the name of the corresponding SFR Package (as specified in the GWF name file). Alternatively, the name of the flow package can be specified using the FLOW\_PACKAGE\_NAME keyword in the options block. The GWE SFE Package cannot be used without a corresponding GWF SFR Package. + +The SFE Package does not have a dimensions block; instead, dimensions for the SFE Package are set using the dimensions from the corresponding SFR Package. For example, the SFR Package requires specification of the number of reaches (NREACHES). SFE sets the number of reaches equal to NREACHES. Therefore, the PACKAGEDATA block below must have NREACHES entries in it. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-sfe-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-sfe-packagedata.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-sfe-period.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/gwe-sfe-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-sfe-example.dat} + +\vspace{5mm} +\subsubsection{Available observation types} +Streamflow Energy Transport Package observations include reach temperature and all of the terms that contribute to the continuity equation for each reach. Additional SFE Package observations include energy flow rates for individual reaches, or groups of reaches. The data required for each SFE Package observation type is defined in table~\ref{table:gwe-sfeobstype}. Negative and positive values for \texttt{sfe} observations represent a loss from and gain to the GWE model, respectively. For all other flow terms, negative and positive values represent a loss from and gain from the SFE package, respectively. + +\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +\caption{Available SFE Package observation types} \tabularnewline + +\hline +\hline +\textbf{Stress Package} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endfirsthead + +\captionsetup{textformat=simple} +\caption*{\textbf{Table \arabic{table}.}{\quad}Available SFE Package observation types.---Continued} \tabularnewline + +\hline +\hline +\textbf{Stress Package} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endhead + + +\hline +\endfoot + +\input{../Common/gwe-sfeobs.tex} +\label{table:gwe-sfeobstype} +\end{longtable} + +\vspace{5mm} +\subsubsection{Example Observation Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-sfe-example-obs.dat} + + diff --git a/doc/mf6io/gwe/ssm.tex b/doc/mf6io/gwe/ssm.tex new file mode 100644 index 00000000000..ab8de50a564 --- /dev/null +++ b/doc/mf6io/gwe/ssm.tex @@ -0,0 +1,114 @@ +Source and Sink Mixing (SSM) Package information is read from the file that is specified by ``SSM6'' as the file type. Only one SSM Package can be specified for a GWE model. The SSM Package is required if the flow model has any stress packages. + +The SSM Package is used to add or remove thermal energy from GWE model cells based on inflows and outflows from GWF stress packages. If a GWF stress package provides flow into a model cell, that flow can be assigned a user-specified temperature. If a GWF stress package removes water from a model cell, the temperature of that water is the temperature of the cell from which the water is removed. For flow boundary conditions that include evapotranspiration, the latent heat of vaporization may be used to represent evaporative cooling. There are several different ways for the user to specify the temperatures. + +\begin{itemize} +\item The default condition is that sources have a temperature of zero and sinks withdraw water at the calculated temperature of the cell. This default condition is assigned to any GWF stress package that is not included in a SOURCES block or FILEINPUT block. +\item A second option is to assign auxiliary variables in the GWF model and include a temperature for each stress boundary. In this case, the user provides the name of the package and the name of the auxiliary variable containing temperature values for each boundary. As described below for srctype, there are multiple options for defining this behavior. +\item A third option is to prepare an SPT6 file for any desired GWF stress package. This SPT6 file allows users to change temperatures by stress period, or to use the time-series option to interpolate temperatures by time step. This third option was introduced in MODFLOW version 6.3.0. Information for this approach is entered in an optional FILEINPUT block below. The SPT6 input file supports list-based temperature input for most corresponding GWF stress packages, but also supports a READASARRAYS array-based input format if a corresponding GWF recharge or evapotranspiration package uses the READASARRAYS option. +\end{itemize} + +\noindent The auxiliary method and the SPT6 file input method can both be used for a GWE model, but only one approach can be assigned per GWF stress package. If a flow package specified in the SOURCES or FILEINPUT blocks is also represented using an advanced transport package (SFE, LKE, MWE, or UZE), then the advanced transport package will override SSM calculations for that package. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-ssm-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-ssm-sources.dat} +\vspace{5mm} +\noindent \textit{FILEINPUT BLOCK IS OPTIONAL} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-ssm-fileinput.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/gwe-ssm-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-ssm-example.dat} + +% when obs are ready, they should go here + +\newpage +\subsection{Stress Package Temperatures (SPT) -- List-Based Input} +As mentioned in the previous section on the SSM Package, temperatures can be specified for GWF stress packages using auxiliary variables, or they can be specified using input files dedicated to this purpose. The Stress Package Temperatures (SPT) input file can be used to provide temperatures that are assigned for GWF sources and sinks. An SPT input file can be list based or array based. List-based input files can be used for list-based GWF stress packages, such as wells, drains, and rivers. Array-based input files can be used for array-based GWF stress packages, such as recharge and evapotranspiration (provided the READASARRAYS options is used; these packages can also be provided in a list-based format). Array-based SPT input files are discussed in the next section. This section describes the list-based input format for the SPT input file. + +An SPT6 file can be prepared to provide user-specified temperatures for a GWF stress package, such a Well or General-Head Boundary Package, for example. One SPT6 file applies to one GWF stress package. Names for the SPT6 input files are provided in the FILEINPUT block of the SSM Package. SPT6 entries cannot be specified in the GWE name file. Use of the SPT6 input file is an alternative to specifying stress package temperatures as auxiliary variables in the flow model stress package. + +The boundary number in the PERIOD block corresponds to the boundary number in the GWF stress period package. Assignment of the boundary number is straightforward for the advanced packages (SFR, LAK, MAW, and UZF) because the features in these advanced packages are defined once at the beginning of the simulation and they do not change. For the other stress packages, however, the order of boundaries may change between stress periods. Consider the following Well Package input file, for example: + +\begin{verbatim} +# This is an example of a GWF Well Package +# in which the order of the wells changes from +# stress period 1 to 2. This must be explicitly +# handled by the user if using the SPT6 input +# for a GWE model. +BEGIN options + BOUNDNAMES +END options + +BEGIN dimensions + MAXBOUND 3 +END dimensions + +BEGIN period 1 + 1 77 65 -2200 SHALLOW_WELL + 2 77 65 -24.0 INTERMEDIATE_WELL + 3 77 65 -6.20 DEEP_WELL +END period + +BEGIN period 2 + 1 77 65 -1100 SHALLOW_WELL + 3 77 65 -3.10 DEEP_WELL + 2 77 65 -12.0 INTERMEDIATE_WELL +END period +\end{verbatim} + +\noindent In this Well input file, the order of the wells changed between periods 1 and 2. This reordering must be explicitly taken into account by the user when creating an SSMI6 file, because the boundary number in the SSMI file corresponds to the boundary number in the Well input file. In stress period 1, boundary number 2 is the INTERMEDIATE\_WELL, whereas in stress period 2, boundary number 2 is the DEEP\_WELL. When using this SSMI capability to specify boundary temperatures, it is recommended that users write the corresponding GWF stress packages using the same number, cell locations, and order of boundary conditions for each stress period. In addition, users can activate the PRINT\_FLOWS option in the SSM input file. When the SSM Package prints the individual solute flows to the transport list file, it includes a column containing the boundary temperature. Users can check the boundary temperatures in this output to verify that they are assigned as intended. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\vspace{5mm} + +\noindent \textit{FOR EACH SIMULATION} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/utl-spt-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/utl-spt-dimensions.dat} +\vspace{5mm} +\noindent \textit{FOR ANY STRESS PERIOD} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/utl-spt-period.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/utl-spt-desc.tex} +\end{description} + +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/utl-spt-example.dat} + +% SPT array based +\newpage +\subsection{Stress Package Temperatures (SPT) -- Array-Based Input} + +This section describes array-based input for the SPT input file. If the READASARRAYS options is specified for either the GWF Recharge (RCH) or Evapotranspiration (EVT) Packages, then temperatures for these packages can be specified using array-based temperature input. This SPT array-based input is distinguished from the list-based input in the previous section through specification of the READASARRAYS option. When the READASARRAYS option is specified, then there is no DIMENSIONS block in the SPT input file. Instead, the shape of the array for temperatures is the number of rows by number of columns (NROW, NCOL), for a regular MODFLOW grid (DIS), and the number of cells in a layer (NCPL) for a discretization by vertices (DISV) grid. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\vspace{5mm} + +\noindent \textit{FOR EACH SIMULATION} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/utl-spta-options.dat} +\vspace{5mm} +\noindent \textit{FOR ANY STRESS PERIOD} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/utl-spta-period.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/utl-spta-desc.tex} +\end{description} + +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/utl-spta-example.dat} + diff --git a/doc/mf6io/gwe/uze.tex b/doc/mf6io/gwe/uze.tex new file mode 100644 index 00000000000..1e65d5bbd11 --- /dev/null +++ b/doc/mf6io/gwe/uze.tex @@ -0,0 +1,55 @@ +Unsaturated Zone Energy Transport (UZE) Package information is read from the file that is specified by ``UZE6'' as the file type. There can be as many UZE Packages as necessary for a GWE model. Each UZE Package is designed to work with flows from a corresponding GWF UZF Package. By default \mf uses the UZE package name to determine which UZF Package corresponds to the UZE Package. Therefore, the package name of the UZE Package (as specified in the GWE name file) must match with the name of the corresponding UZF Package (as specified in the GWF name file). Alternatively, the name of the flow package can be specified using the FLOW\_PACKAGE\_NAME keyword in the options block. The GWE UZE Package cannot be used without a corresponding GWF UZF Package. + +The UZE Package does not have a dimensions block; instead, dimensions for the UZE Package are set using the dimensions from the corresponding UZF Package. For example, the UZF Package requires specification of the number of cells (NUZFCELLS). UZE sets the number of UZE cells equal to NUZFCELLS. Therefore, the PACKAGEDATA block below must have NUZFCELLS entries in it. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-uze-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-uze-packagedata.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-uze-period.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/gwe-uze-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-uze-example.dat} + +\vspace{5mm} +\subsubsection{Available observation types} +Unsaturated Zone Energy Transport Package observations include UZF cell temperature and all of the terms that contribute to the continuity equation for each UZF cell. Additional UZE Package observations include energy flow rates for individual UZF cells, or groups of UZF cells. The data required for each UZE Package observation type is defined in table~\ref{table:gwe-uzeobstype}. Negative and positive values for \texttt{uzt} observations represent a loss from and gain to the GWE model, respectively. For all other flow terms, negative and positive values represent a loss from and gain from the UZE package, respectively. + +\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +\caption{Available UZE Package observation types} \tabularnewline + +\hline +\hline +\textbf{Stress Package} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endfirsthead + +\captionsetup{textformat=simple} +\caption*{\textbf{Table \arabic{table}.}{\quad}Available UZE Package observation types.---Continued} \tabularnewline + +\hline +\hline +\textbf{Stress Package} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endhead + + +\hline +\endfoot + +\input{../Common/gwe-uzeobs.tex} +\label{table:gwe-uzeobstype} +\end{longtable} + +\vspace{5mm} +\subsubsection{Example Observation Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-uze-example-obs.dat} + + diff --git a/doc/mf6io/mf6io.bbl b/doc/mf6io/mf6io.bbl index 240c6f51337..9fb5b05f2a4 100644 --- a/doc/mf6io/mf6io.bbl +++ b/doc/mf6io/mf6io.bbl @@ -64,6 +64,13 @@ Harbaugh, A.W., 2005, MODFLOW-2005, the U.S. Geological Survey modular Techniques and Methods, book 6, chap. A16, variously paged}, accessed June 27, 2017, at \url{https://pubs.usgs.gov/tm/2005/tm6A16/}. +\bibitem[{Hecht-Mendez and others(2010)Hecht-Mendez, Molina-Giraldo, Blum, and + Bayer}]{hechtmendez} +Hecht-Mendez, J., Molina-Giraldo, N., Blum, P., and Bayer, P., 2010, Evaluating + mt3dms for heat transport simulation of closed geothermal systems: + Groundwater, v.~48, no.~5, p.~741--756, + \url{https://doi.org/10.1111/j.1745-6584.2010.00678.x}. + \bibitem[{Hill(1990)}]{hill1990preconditioned} Hill, M.C., 1990, Preconditioned Conjugate-Gradient 2 (PCG2), a computer program for solving ground-water flow equations: {U.S. Geological Survey @@ -172,6 +179,11 @@ Leake, S.A., and Lilly, M.R., 1997, Documentation of computer program (FHB1) (MODFLOW): {U.S. Geological Survey Open-File Report 97--571, 50 p.}, accessed June 27, 2017, at \url{https://pubs.er.usgs.gov/publication/ofr97571}. +\bibitem[{Ma and Zheng(2010)}]{mazheng2010} +Ma, Rui, and Zheng, Chunmiao, 2010, Effects of density and viscosity in + modeling heat as a groundwater tracer: Groundwater, v.~48, no.~3, + p.~380--389, \url{https://doi.org/10.1111/j.1745-6584.2009.00660.x}. + \bibitem[{Maddock and others(2012)Maddock, Baird, Hanson, Schmid, and Ajami}]{modflowripetpack} Maddock, Thomas, I., Baird, K.J., Hanson, R.T., Schmid, W., and Ajami, H., diff --git a/doc/mf6io/mf6ivar/dfn/common.dfn b/doc/mf6io/mf6ivar/dfn/common.dfn index b69ae67edf9..0fd5220c2f0 100644 --- a/doc/mf6io/mf6ivar/dfn/common.dfn +++ b/doc/mf6io/mf6ivar/dfn/common.dfn @@ -21,6 +21,9 @@ description keyword to indicate that the list of {#1} {#2} will be printed to th name print_concentration description keyword to indicate that the list of {#1} {#2} will be printed to the listing file for every stress period in which ``CONCENTRATION PRINT'' is specified in Output Control. If there is no Output Control option and PRINT\_{#3} is specified, then {#2} are printed for the last time step of each stress period. +name print_temperature +description keyword to indicate that the list of {#1} {#2} will be printed to the listing file for every stress period in which ``TEMPERATURE PRINT'' is specified in Output Control. If there is no Output Control option and PRINT\_{#3} is specified, then {#2} are printed for the last time step of each stress period. + name print_flows description keyword to indicate that the list of {#1} flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. diff --git a/doc/mf6io/mf6ivar/dfn/exg-gwegwe.dfn b/doc/mf6io/mf6ivar/dfn/exg-gwegwe.dfn new file mode 100644 index 00000000000..315296422bf --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/exg-gwegwe.dfn @@ -0,0 +1,280 @@ +# --------------------- exg gwegwe options --------------------- +# flopy multi-package + +block options +name gwfmodelname1 +type string +reader urword +optional false +longname keyword to specify name of first corresponding GWF Model +description keyword to specify name of first corresponding GWF Model. In the simulation name file, the GWE6-GWE6 entry contains names for GWE Models (exgmnamea and exgmnameb). The GWE Model with the name exgmnamea must correspond to the GWF Model with the name gwfmodelname1. + +block options +name gwfmodelname2 +type string +reader urword +optional false +longname keyword to specify name of second corresponding GWF Model +description keyword to specify name of second corresponding GWF Model. In the simulation name file, the GWE6-GWE6 entry contains names for GWE Models (exgmnamea and exgmnameb). The GWE Model with the name exgmnameb must correspond to the GWF Model with the name gwfmodelname2. + +block options +name auxiliary +type string +shape (naux) +reader urword +optional true +longname keyword to specify aux variables +description an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWF-GWF Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' is provided in the description of the DISU Package. If an auxiliary variable with the name ``CDIST'' is found, then this information will be used as the straight-line connection distance, including the vertical component, between the two cell centers. Both ANGLDEGX and CDIST are required if specific discharge is calculated for either of the groundwater models. + +block options +name boundnames +type keyword +shape +reader urword +optional true +longname +description REPLACE boundnames {'{#1}': 'GWE Exchange'} + +block options +name print_input +type keyword +reader urword +optional true +longname keyword to print input to list file +description keyword to indicate that the list of exchange entries will be echoed to the listing file immediately after it is read. +mf6internal iprpak + +block options +name print_flows +type keyword +reader urword +optional true +longname keyword to print gwfgwf flows to list file +description keyword to indicate that the list of exchange flow rates will be printed to the listing file for every stress period in which ``SAVE BUDGET'' is specified in Output Control. +mf6internal iprflow + +block options +name save_flows +type keyword +reader urword +optional true +longname keyword to save GWFGWF flows +description keyword to indicate that cell-by-cell flow terms will be written to the budget file for each model provided that the Output Control for the models are set up with the ``BUDGET SAVE FILE'' option. +mf6internal ipakcb + +block options +name adv_scheme +type string +valid upstream central tvd +reader urword +optional true +longname advective scheme +description scheme used to solve the advection term. Can be upstream, central, or TVD. If not specified, upstream weighting is the default weighting scheme. + +block options +name cnd_xt3d_off +type keyword +shape +reader urword +optional true +longname deactivate xt3d +description deactivate the xt3d method for the dispersive flux and use the faster and less accurate approximation for this exchange. + +block options +name cnd_xt3d_rhs +type keyword +shape +reader urword +optional true +longname xt3d on right-hand side +description add xt3d dispersion terms to right-hand side, when possible, for this exchange. + +block options +name filein +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an input filename is expected next. + +block options +name mve_filerecord +type record mve6 filein mve6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name mve6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname obs keyword +description keyword to specify that record corresponds to an energy transport mover file. + +block options +name mve6_filename +type string +preserve_case true +in_record true +tagged false +reader urword +optional false +longname mve6 input filename +description is the file name of the transport mover input file to apply to this exchange. Information for the transport mover are provided in the file provided with these keywords. + +block options +name obs_filerecord +type record obs6 filein obs6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name obs6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname obs keyword +description keyword to specify that record corresponds to an observations file. + +block options +name obs6_filename +type string +preserve_case true +in_record true +tagged false +reader urword +optional false +longname obs6 input filename +description is the file name of the observations input file for this exchange. See the ``Observation utility'' section for instructions for preparing observation input files. Table \ref{table:gwe-obstypetable} lists observation type(s) supported by the GWE-GWE package. + +block options +name dev_interfacemodel_on +type keyword +reader urword +optional true +longname activate interface model on exchange +description activates the interface model mechanism for calculating the coefficients at (and possibly near) the exchange. This keyword should only be used for development purposes. +mf6internal dev_ifmod_on + +# --------------------- exg gwegwe dimensions --------------------- + +block dimensions +name nexg +type integer +reader urword +optional false +longname number of exchanges +description keyword and integer value specifying the number of GWE-GWE exchanges. + + +# --------------------- exg gwegwe exchangedata --------------------- + +block exchangedata +name exchangedata +type recarray cellidm1 cellidm2 ihc cl1 cl2 hwva aux boundname +shape (nexg) +reader urword +optional false +longname exchange data +description + +block exchangedata +name cellidm1 +type integer +in_record true +tagged false +reader urword +optional false +longname cellid of first cell +description is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. +numeric_index true + +block exchangedata +name cellidm2 +type integer +in_record true +tagged false +reader urword +optional false +longname cellid of second cell +description is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. +numeric_index true + +block exchangedata +name ihc +type integer +in_record true +tagged false +reader urword +optional false +longname integer flag for connection type +description is an integer flag indicating the direction between node n and all of its m connections. If IHC = 0 then the connection is vertical. If IHC = 1 then the connection is horizontal. If IHC = 2 then the connection is horizontal for a vertically staggered grid. + +block exchangedata +name cl1 +type double precision +in_record true +tagged false +reader urword +optional false +longname connection distance +description is the distance between the center of cell 1 and the its shared face with cell 2. + +block exchangedata +name cl2 +type double precision +in_record true +tagged false +reader urword +optional false +longname connection distance +description is the distance between the center of cell 2 and the its shared face with cell 1. + +block exchangedata +name hwva +type double precision +in_record true +tagged false +reader urword +optional false +longname horizontal cell width or area for vertical flow +description is the horizontal width of the flow connection between cell 1 and cell 2 if IHC $>$ 0, or it is the area perpendicular to flow of the vertical connection between cell 1 and cell 2 if IHC = 0. + +block exchangedata +name aux +type double precision +in_record true +tagged false +shape (naux) +reader urword +optional true +longname auxiliary variables +description represents the values of the auxiliary variables for each GWEGWE Exchange. The values of auxiliary variables must be present for each exchange. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. + +block exchangedata +name boundname +type string +shape +tagged false +in_record true +reader urword +optional true +longname exchange boundname +description REPLACE boundname {'{#1}': 'GWE Exchange'} diff --git a/doc/mf6io/mf6ivar/dfn/exg-gwfgwe.dfn b/doc/mf6io/mf6ivar/dfn/exg-gwfgwe.dfn new file mode 100644 index 00000000000..fe5410261fc --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/exg-gwfgwe.dfn @@ -0,0 +1,3 @@ +# --------------------- exg gwfgwe options --------------------- + + diff --git a/doc/mf6io/mf6ivar/dfn/gwe-adv.dfn b/doc/mf6io/mf6ivar/dfn/gwe-adv.dfn new file mode 100644 index 00000000000..682ed4a756a --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/gwe-adv.dfn @@ -0,0 +1,11 @@ +# --------------------- gwe adv options --------------------- + +block options +name scheme +type string +valid central upstream tvd +reader urword +optional true +longname advective scheme +description scheme used to solve the advection term. Can be upstream, central, or TVD. If not specified, upstream weighting is the default weighting scheme. + diff --git a/doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn b/doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn new file mode 100644 index 00000000000..e49626edf32 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn @@ -0,0 +1,92 @@ +# --------------------- gwe cnd options --------------------- + +block options +name xt3d_off +type keyword +shape +reader urword +optional true +longname deactivate xt3d +description deactivate the xt3d method and use the faster and less accurate approximation. This option may provide a fast and accurate solution under some circumstances, such as when flow aligns with the model grid, there is no mechanical dispersion, or when the longitudinal and transverse dispersivities are equal. This option may also be used to assess the computational demand of the XT3D approach by noting the run time differences with and without this option on. + +block options +name xt3d_rhs +type keyword +shape +reader urword +optional true +longname xt3d on right-hand side +description add xt3d terms to right-hand side, when possible. This option uses less memory, but may require more iterations. + +# --------------------- gwe cnd griddata --------------------- + +block griddata +name alh +type double precision +shape (nodes) +reader readarray +layered true +optional true +longname longitudinal dispersivity in horizontal direction +description longitudinal dispersivity in horizontal direction. If flow is strictly horizontal, then this is the longitudinal dispersivity that will be used. If flow is not strictly horizontal or strictly vertical, then the longitudinal dispersivity is a function of both ALH and ALV. If mechanical dispersion is represented (by specifying any dispersivity values) then this array is required. + +block griddata +name alv +type double precision +shape (nodes) +reader readarray +layered true +optional true +longname longitudinal dispersivity in vertical direction +description longitudinal dispersivity in vertical direction. If flow is strictly vertical, then this is the longitudinal dispsersivity value that will be used. If flow is not strictly horizontal or strictly vertical, then the longitudinal dispersivity is a function of both ALH and ALV. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ALH. + +block griddata +name ath1 +type double precision +shape (nodes) +reader readarray +layered true +optional true +longname transverse dispersivity in horizontal direction +description transverse dispersivity in horizontal direction. This is the transverse dispersivity value for the second ellipsoid axis. If flow is strictly horizontal and directed in the x direction (along a row for a regular grid), then this value controls spreading in the y direction. If mechanical dispersion is represented (by specifying any dispersivity values) then this array is required. + +block griddata +name ath2 +type double precision +shape (nodes) +reader readarray +layered true +optional true +longname transverse dispersivity in horizontal direction +description transverse dispersivity in horizontal direction. This is the transverse dispersivity value for the third ellipsoid axis. If flow is strictly horizontal and directed in the x direction (along a row for a regular grid), then this value controls spreading in the z direction. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ATH1. + +block griddata +name atv +type double precision +shape (nodes) +reader readarray +layered true +optional true +longname transverse dispersivity when flow is in vertical direction +description transverse dispersivity when flow is in vertical direction. If flow is strictly vertical and directed in the z direction, then this value controls spreading in the x and y directions. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ATH2. + +block griddata +name ktw +type double precision +shape (nodes) +reader readarray +layered true +optional true +longname thermal conductivity of the simulated fluid +description thermal conductivity of the simulated fluid + +block griddata +name kts +type double precision +shape (nodes) +reader readarray +layered true +optional true +longname thermal conductivity of the aquifer material +description thermal conductivity of the aquifer material + diff --git a/doc/mf6io/mf6ivar/dfn/gwe-ctp.dfn b/doc/mf6io/mf6ivar/dfn/gwe-ctp.dfn new file mode 100644 index 00000000000..d8dd2bc68bf --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/gwe-ctp.dfn @@ -0,0 +1,213 @@ +# --------------------- gwe ctp options --------------------- +# flopy multi-package + +block options +name auxiliary +type string +shape (naux) +reader urword +optional true +longname keyword to specify aux variables +description REPLACE auxnames {'{#1}': 'Groundwater Energy Transport'} + +block options +name auxmultname +type string +shape +reader urword +optional true +longname name of auxiliary variable for multiplier +description REPLACE auxmultname {'{#1}': 'temperature value'} + +block options +name boundnames +type keyword +shape +reader urword +optional true +longname +description REPLACE boundnames {'{#1}': 'constant temperature'} + +block options +name print_input +type keyword +reader urword +optional true +longname print input to listing file +description REPLACE print_input {'{#1}': 'constant temperature'} +mf6internal iprflow + +block options +name print_flows +type keyword +reader urword +optional true +longname print calculated flows to listing file +description REPLACE print_flows {'{#1}': 'constant temperature'} +mf6internal ipakcb + +block options +name save_flows +type keyword +reader urword +optional true +longname save constant temperature flows to budget file +description REPLACE save_flows {'{#1}': 'constant temperature'} +mf6internal iprpak + +block options +name ts_filerecord +type record ts6 filein ts6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name ts6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname time series keyword +description keyword to specify that record corresponds to a time-series file. + +block options +name filein +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an input filename is expected next. + +block options +name ts6_filename +type string +preserve_case true +in_record true +reader urword +optional false +tagged false +longname file name of time series information +description REPLACE timeseriesfile {} + +block options +name obs_filerecord +type record obs6 filein obs6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name obs6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname obs keyword +description keyword to specify that record corresponds to an observations file. + +block options +name obs6_filename +type string +preserve_case true +in_record true +tagged false +reader urword +optional false +longname obs6 input filename +description REPLACE obs6_filename {'{#1}': 'Constant Temperature'} + + +# --------------------- gwe ctp dimensions --------------------- + +block dimensions +name maxbound +type integer +reader urword +optional false +longname maximum number of constant temperatures +description REPLACE maxbound {'{#1}': 'constant temperatures'} + + +# --------------------- gwe ctp period --------------------- + +block period +name iper +type integer +block_variable True +in_record true +tagged false +shape +valid +reader urword +optional false +longname stress period number +description REPLACE iper {} + +block period +name stress_period_data +type recarray cellid temp aux boundname +shape (maxbound) +reader urword +longname +description +mf6internal spd + +block period +name cellid +type integer +shape (ncelldim) +tagged false +in_record true +reader urword +longname cell identifier +description REPLACE cellid {} + +block period +name temp +type double precision +shape +tagged false +in_record true +reader urword +time_series true +longname constant temperature value +description is the constant temperature value. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. +mf6internal tspvar + +block period +name aux +type double precision +in_record true +tagged false +shape (naux) +reader urword +optional true +time_series true +longname auxiliary variables +description REPLACE aux {'{#1}': 'constant temperature'} +mf6internal auxvar + +block period +name boundname +type string +shape +tagged false +in_record true +reader urword +optional true +longname constant temperature name +description REPLACE boundname {'{#1}': 'constant temperature'} diff --git a/doc/mf6io/mf6ivar/dfn/gwe-dis.dfn b/doc/mf6io/mf6ivar/dfn/gwe-dis.dfn new file mode 100644 index 00000000000..bb77bac782e --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/gwe-dis.dfn @@ -0,0 +1,122 @@ +# --------------------- gwe dis options --------------------- + +block options +name length_units +type string +reader urword +optional true +longname model length units +description is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. + +block options +name nogrb +type keyword +reader urword +optional true +longname do not write binary grid file +description keyword to deactivate writing of the binary grid file. + +block options +name xorigin +type double precision +reader urword +optional true +longname x-position of the model grid origin +description x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name yorigin +type double precision +reader urword +optional true +longname y-position of the model grid origin +description y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name angrot +type double precision +reader urword +optional true +longname rotation angle +description counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + + +# --------------------- gwe dis dimensions --------------------- + +block dimensions +name nlay +type integer +reader urword +optional false +longname number of layers +description is the number of layers in the model grid. +default_value 1 + +block dimensions +name nrow +type integer +reader urword +optional false +longname number of rows +description is the number of rows in the model grid. +default_value 2 + +block dimensions +name ncol +type integer +reader urword +optional false +longname number of columns +description is the number of columns in the model grid. +default_value 2 + +# --------------------- gwe dis griddata --------------------- + +block griddata +name delr +type double precision +shape (ncol) +reader readarray +longname spacing along a row +description is the column spacing in the row direction. +default_value 1.0 + +block griddata +name delc +type double precision +shape (nrow) +reader readarray +longname spacing along a column +description is the row spacing in the column direction. +default_value 1.0 + +block griddata +name top +type double precision +shape (ncol, nrow) +reader readarray +longname cell top elevation +description is the top elevation for each cell in the top model layer. +default_value 1.0 + +block griddata +name botm +type double precision +shape (ncol, nrow, nlay) +reader readarray +layered true +longname cell bottom elevation +description is the bottom elevation for each cell. +default_value 0. + +block griddata +name idomain +type integer +shape (ncol, nrow, nlay) +reader readarray +layered true +optional true +longname idomain existence array +description is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. + + diff --git a/doc/mf6io/mf6ivar/dfn/gwe-disu.dfn b/doc/mf6io/mf6ivar/dfn/gwe-disu.dfn new file mode 100644 index 00000000000..ec86d0852c7 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/gwe-disu.dfn @@ -0,0 +1,277 @@ +# --------------------- gwe disu options --------------------- + +block options +name length_units +type string +reader urword +optional true +longname model length units +description is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. + +block options +name nogrb +type keyword +reader urword +optional true +longname do not write binary grid file +description keyword to deactivate writing of the binary grid file. + +block options +name xorigin +type double precision +reader urword +optional true +longname x-position origin of the model grid coordinate system +description x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name yorigin +type double precision +reader urword +optional true +longname y-position origin of the model grid coordinate system +description y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name angrot +type double precision +reader urword +optional true +longname rotation angle +description counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name vertical_offset_tolerance +type double precision +reader urword +optional true +default_value 0.0 +longname vertical length dimension for top and bottom checking +description checks are performed to ensure that the top of a cell is not higher than the bottom of an overlying cell. This option can be used to specify the tolerance that is used for checking. If top of a cell is above the bottom of an overlying cell by a value less than this tolerance, then the program will not terminate with an error. The default value is zero. This option should generally not be used. +mf6internal voffsettol + +# --------------------- gwe disu dimensions --------------------- + +block dimensions +name nodes +type integer +reader urword +optional false +longname number of layers +description is the number of cells in the model grid. + +block dimensions +name nja +type integer +reader urword +optional false +longname number of columns +description is the sum of the number of connections and NODES. When calculating the total number of connections, the connection between cell n and cell m is considered to be different from the connection between cell m and cell n. Thus, NJA is equal to the total number of connections, including n to m and m to n, and the total number of cells. + +block dimensions +name nvert +type integer +reader urword +optional true +longname number of vertices +description is the total number of (x, y) vertex pairs used to define the plan-view shape of each cell in the model grid. If NVERT is not specified or is specified as zero, then the VERTICES and CELL2D blocks below are not read. NVERT and the accompanying VERTICES and CELL2D blocks should be specified for most simulations. If the XT3D or SAVE\_SPECIFIC\_DISCHARGE options are specified in the NPF Package, then this information is required. + +# --------------------- gwe disu griddata --------------------- + +block griddata +name top +type double precision +shape (nodes) +reader readarray +longname cell top elevation +description is the top elevation for each cell in the model grid. + +block griddata +name bot +type double precision +shape (nodes) +reader readarray +longname cell bottom elevation +description is the bottom elevation for each cell. + +block griddata +name area +type double precision +shape (nodes) +reader readarray +longname cell surface area +description is the cell surface area (in plan view). + +block griddata +name idomain +type integer +shape (nodes) +reader readarray +layered false +optional true +longname idomain existence array +description is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1 or greater, the cell exists in the simulation. IDOMAIN values of -1 cannot be specified for the DISU Package. + +# --------------------- gwe disu connectiondata --------------------- + +block connectiondata +name iac +type integer +shape (nodes) +reader readarray +longname number of cell connections +description is the number of connections (plus 1) for each cell. The sum of all the entries in IAC must be equal to NJA. + +block connectiondata +name ja +type integer +shape (nja) +reader readarray +longname grid connectivity +description is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWE cells and their connections to the other GWE cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code. +numeric_index true +jagged_array iac + +block connectiondata +name ihc +type integer +shape (nja) +reader readarray +longname connection type +description is an index array indicating the direction between node n and all of its m connections. If IHC = 0 then cell n and cell m are connected in the vertical direction. Cell n overlies cell m if the cell number for n is less than m; cell m overlies cell n if the cell number for m is less than n. If IHC = 1 then cell n and cell m are connected in the horizontal direction. If IHC = 2 then cell n and cell m are connected in the horizontal direction, and the connection is vertically staggered. A vertically staggered connection is one in which a cell is horizontally connected to more than one cell in a horizontal connection. +jagged_array iac + +block connectiondata +name cl12 +type double precision +shape (nja) +reader readarray +longname connection lengths +description is the array containing connection lengths between the center of cell n and the shared face with each adjacent m cell. +jagged_array iac + +block connectiondata +name hwva +type double precision +shape (nja) +reader readarray +longname connection lengths +description is a symmetric array of size NJA. For horizontal connections, entries in HWVA are the horizontal width perpendicular to flow. For vertical connections, entries in HWVA are the vertical area for flow. Thus, values in the HWVA array contain dimensions of both length and area. Entries in the HWVA array have a one-to-one correspondence with the connections specified in the JA array. Likewise, there is a one-to-one correspondence between entries in the HWVA array and entries in the IHC array, which specifies the connection type (horizontal or vertical). Entries in the HWVA array must be symmetric; the program will terminate with an error if the value for HWVA for an n to m connection does not equal the value for HWVA for the corresponding n to m connection. +jagged_array iac + +block connectiondata +name angldegx +type double precision +optional true +shape (nja) +reader readarray +longname angle of face normal to connection +description is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specifed in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. +jagged_array iac + +# --------------------- gwe disu vertices --------------------- + +block vertices +name vertices +type recarray iv xv yv +shape (nvert) +reader urword +optional false +longname vertices data +description + +block vertices +name iv +type integer +in_record true +tagged false +reader urword +optional false +longname vertex number +description is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. +numeric_index true + +block vertices +name xv +type double precision +in_record true +tagged false +reader urword +optional false +longname x-coordinate for vertex +description is the x-coordinate for the vertex. + +block vertices +name yv +type double precision +in_record true +tagged false +reader urword +optional false +longname y-coordinate for vertex +description is the y-coordinate for the vertex. + + +# --------------------- gwe disu cell2d --------------------- + +block cell2d +name cell2d +type recarray icell2d xc yc ncvert icvert +shape (nodes) +reader urword +optional false +longname cell2d data +description + +block cell2d +name icell2d +type integer +in_record true +tagged false +reader urword +optional false +longname cell2d number +description is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES. +numeric_index true + +block cell2d +name xc +type double precision +in_record true +tagged false +reader urword +optional false +longname x-coordinate for cell center +description is the x-coordinate for the cell center. + +block cell2d +name yc +type double precision +in_record true +tagged false +reader urword +optional false +longname y-coordinate for cell center +description is the y-coordinate for the cell center. + +block cell2d +name ncvert +type integer +in_record true +tagged false +reader urword +optional false +longname number of cell vertices +description is the number of vertices required to define the cell. There may be a different number of vertices for each cell. + +block cell2d +name icvert +type integer +shape (ncvert) +in_record true +tagged false +reader urword +optional false +longname array of vertex numbers +description is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. +numeric_index true diff --git a/doc/mf6io/mf6ivar/dfn/gwe-disv.dfn b/doc/mf6io/mf6ivar/dfn/gwe-disv.dfn new file mode 100644 index 00000000000..b752a40b03c --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/gwe-disv.dfn @@ -0,0 +1,204 @@ +# --------------------- gwe disv options --------------------- + +block options +name length_units +type string +reader urword +optional true +longname model length units +description is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. + +block options +name nogrb +type keyword +reader urword +optional true +longname do not write binary grid file +description keyword to deactivate writing of the binary grid file. + +block options +name xorigin +type double precision +reader urword +optional true +longname x-position origin of the model grid coordinate system +description x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name yorigin +type double precision +reader urword +optional true +longname y-position origin of the model grid coordinate system +description y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name angrot +type double precision +reader urword +optional true +longname rotation angle +description counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +# --------------------- gwe disv dimensions --------------------- + +block dimensions +name nlay +type integer +reader urword +optional false +longname number of layers +description is the number of layers in the model grid. + +block dimensions +name ncpl +type integer +reader urword +optional false +longname number of cells per layer +description is the number of cells per layer. This is a constant value for the grid and it applies to all layers. + +block dimensions +name nvert +type integer +reader urword +optional false +longname number of columns +description is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. + +# --------------------- gwe disv griddata --------------------- + +block griddata +name top +type double precision +shape (ncpl) +reader readarray +longname model top elevation +description is the top elevation for each cell in the top model layer. + +block griddata +name botm +type double precision +shape (ncpl, nlay) +reader readarray +layered true +longname model bottom elevation +description is the bottom elevation for each cell. + +block griddata +name idomain +type integer +shape (ncpl, nlay) +reader readarray +layered true +optional true +longname idomain existence array +description is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. + + +# --------------------- gwe disv vertices --------------------- + +block vertices +name vertices +type recarray iv xv yv +shape (nvert) +reader urword +optional false +longname vertices data +description + +block vertices +name iv +type integer +in_record true +tagged false +reader urword +optional false +longname vertex number +description is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. +numeric_index true + +block vertices +name xv +type double precision +in_record true +tagged false +reader urword +optional false +longname x-coordinate for vertex +description is the x-coordinate for the vertex. + +block vertices +name yv +type double precision +in_record true +tagged false +reader urword +optional false +longname y-coordinate for vertex +description is the y-coordinate for the vertex. + + +# --------------------- gwe disv cell2d --------------------- + +block cell2d +name cell2d +type recarray icell2d xc yc ncvert icvert +shape (ncpl) +reader urword +optional false +longname cell2d data +description + +block cell2d +name icell2d +type integer +in_record true +tagged false +reader urword +optional false +longname cell2d number +description is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. +numeric_index true + +block cell2d +name xc +type double precision +in_record true +tagged false +reader urword +optional false +longname x-coordinate for cell center +description is the x-coordinate for the cell center. + +block cell2d +name yc +type double precision +in_record true +tagged false +reader urword +optional false +longname y-coordinate for cell center +description is the y-coordinate for the cell center. + +block cell2d +name ncvert +type integer +in_record true +tagged false +reader urword +optional false +longname number of cell vertices +description is the number of vertices required to define the cell. There may be a different number of vertices for each cell. + +block cell2d +name icvert +type integer +shape (ncvert) +in_record true +tagged false +reader urword +optional false +longname array of vertex numbers +description is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices. +numeric_index true diff --git a/doc/mf6io/mf6ivar/dfn/gwe-esl.dfn b/doc/mf6io/mf6ivar/dfn/gwe-esl.dfn new file mode 100644 index 00000000000..534db1b0278 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/gwe-esl.dfn @@ -0,0 +1,205 @@ +# --------------------- gwe esl options --------------------- + +block options +name auxiliary +type string +shape (naux) +reader urword +optional true +longname keyword to specify aux variables +description REPLACE auxnames {'{#1}': 'Groundwater Energy Transport'} + +block options +name auxmultname +type string +shape +reader urword +optional true +longname name of auxiliary variable for multiplier +description REPLACE auxmultname {'{#1}': 'energy loading rate'} + +block options +name boundnames +type keyword +shape +reader urword +optional true +longname +description REPLACE boundnames {'{#1}': 'energy source loading'} + +block options +name print_input +type keyword +reader urword +optional true +longname print input to listing file +description REPLACE print_input {'{#1}': 'energy source loading'} + +block options +name print_flows +type keyword +reader urword +optional true +longname print calculated flows to listing file +description REPLACE print_flows {'{#1}': 'energy source loading'} + +block options +name save_flows +type keyword +reader urword +optional true +longname save well flows to budget file +description REPLACE save_flows {'{#1}': 'energy source loading'} + +block options +name ts_filerecord +type record ts6 filein ts6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name ts6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname head keyword +description keyword to specify that record corresponds to a time-series file. + +block options +name filein +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an input filename is expected next. + +block options +name ts6_filename +type string +preserve_case true +in_record true +reader urword +optional false +tagged false +longname file name of time series information +description REPLACE timeseriesfile {} + +block options +name obs_filerecord +type record obs6 filein obs6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name obs6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname obs keyword +description keyword to specify that record corresponds to an observations file. + +block options +name obs6_filename +type string +preserve_case true +in_record true +tagged false +reader urword +optional false +longname obs6 input filename +description REPLACE obs6_filename {'{#1}': 'Energy Source Loading'} + +# --------------------- gwe esl dimensions --------------------- + +block dimensions +name maxbound +type integer +reader urword +optional false +longname maximum number of sources +description REPLACE maxbound {'{#1}': 'sources'} + + +# --------------------- gwe esl period --------------------- + +block period +name iper +type integer +block_variable True +in_record true +tagged false +shape +valid +reader urword +optional false +longname stress period number +description REPLACE iper {} + +block period +name stress_period_data +type recarray cellid senerrate aux boundname +shape (maxbound) +reader urword +longname +description + +block period +name cellid +type integer +shape (ncelldim) +tagged false +in_record true +reader urword +longname cell identifier +description REPLACE cellid {} + +block period +name senerrate +type double precision +shape +tagged false +in_record true +reader urword +time_series true +longname energy source loading rate +description is the energy source loading rate. A positive value indicates addition of energy and a negative value indicates removal of energy. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. + +block period +name aux +type double precision +in_record true +tagged false +shape (naux) +reader urword +optional true +time_series true +longname auxiliary variables +description REPLACE aux {'{#1}': 'energy source'} + +block period +name boundname +type string +shape +tagged false +in_record true +reader urword +optional true +longname well name +description REPLACE boundname {'{#1}': 'energy source'} diff --git a/doc/mf6io/mf6ivar/dfn/gwe-est.dfn b/doc/mf6io/mf6ivar/dfn/gwe-est.dfn new file mode 100644 index 00000000000..a31e9a45697 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/gwe-est.dfn @@ -0,0 +1,106 @@ +# --------------------- gwe est options --------------------- + +block options +name save_flows +type keyword +reader urword +optional true +longname save calculated flows to budget file +description REPLACE save_flows {'{#1}': 'EST'} + +block options +name zero_order_decay +type keyword +reader urword +optional true +longname activate zero-order decay +description is a text keyword to indicate that zero-order decay will occur. Use of this keyword requires that DECAY and DECAY\_SORBED (if sorption is active) are specified in the GRIDDATA block. + +block options +name latent_heat_vaporization +type keyword +reader urword +optional true +longname activate cooling associated with evaporation +description is a text keyword to indicate that cooling associated with evaporation will occur. Use of this keyword requires that LATHEATVAP are specified in the GRIDDATA block. While the EST package does not simulate evaporation, multiple other packages in a GWE simulation may. For example, evaporation may occur from the surface of streams or lakes. Owing to the energy consumed by the change in phase, the latent heat of vaporization is required. + +# --------------------- gwe est griddata --------------------- + +block griddata +name porosity +type double precision +shape (nodes) +reader readarray +layered true +longname porosity +description is the mobile domain porosity, defined as the mobile domain pore volume per mobile domain volume. The GWE model does not support the concept of an immobile domain in the context of heat transport. + +block griddata +name decay +type double precision +shape (nodes) +reader readarray +layered true +optional true +longname aqueous phase decay rate coefficient +description is the rate coefficient for zero-order decay for the aqueous phase of the mobile domain. A negative value indicates heat (energy) production. The dimensions of decay for zero-order decay is energy per length cubed per time. Zero-order decay will have no effect on simulation results unless zero-order decay is specified in the options block. + +block griddata +name cps +type double precision +shape (nodes) +reader readarray +layered true +longname heat capacity of the aquifer material +description is the mass-based heat capacity of dry solids (aquifer material). For example, units of J/kg/C may be used (or equivalent). + +block griddata +name rhos +type double precision +shape (nodes) +reader readarray +layered true +longname density of aquifer material +description is a user-specified value of the density of aquifer material not considering the voids. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kg/m3. + +# --------------------- gwe est packagedata --------------------- + +block packagedata +name packagedata +type recarray cpw rhow latheatvap +shape +reader urword +longname +description + +block packagedata +name cpw +type double precision +shape +tagged false +in_record true +reader urword +longname heat capacity of water +description is the mass-based heat capacity of the simulated fluid. For example, units of J/kg/C may be used (or equivalent). + +block packagedata +name rhow +type double precision +shape +tagged false +in_record true +reader urword +longname density of water +description is a user-specified value of the density of water. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kg/m3. + + +block packagedata +name latheatvap +type double precision +shape +tagged false +in_record true +reader urword +longname latent heat of vaporization +description is the user-specified value for the latent heat of vaporization. For example, if working in SI units, values may be entered as kJ/kg. + diff --git a/doc/mf6io/mf6ivar/dfn/gwe-fmi.dfn b/doc/mf6io/mf6ivar/dfn/gwe-fmi.dfn new file mode 100644 index 00000000000..fb71131e605 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/gwe-fmi.dfn @@ -0,0 +1,58 @@ +# --------------------- gwe fmi options --------------------- + +block options +name save_flows +type keyword +reader urword +optional true +longname save calculated flow imbalance correction to budget file +description REPLACE save_flows {'{#1}': 'FMI'} + +block options +name flow_imbalance_correction +type keyword +reader urword +optional true +longname correct for flow imbalance +description correct for an imbalance in flows by assuming that any residual flow error comes in or leaves at the temperature of the cell. When this option is activated, the GWE Model budget written to the listing file will contain two additional entries: FLOW-ERROR and FLOW-CORRECTION. These two entries will be equal but opposite in sign. The FLOW-CORRECTION term is a mass flow that is added to offset the error caused by an imprecise flow balance. If these terms are not relatively small, the flow model should be rerun with stricter convergence tolerances. + +# --------------------- gwe fmi packagedata --------------------- + +block packagedata +name packagedata +type recarray flowtype filein fname +reader urword +optional false +longname flowtype list +description + +block packagedata +name flowtype +in_record true +type string +tagged false +reader urword +longname flow type +description is the word GWFBUDGET, GWFHEAD, GWFMOVER or the name of an advanced GWF stress package. If GWFBUDGET is specified, then the corresponding file must be a budget file from a previous GWF Model run. If an advanced GWF stress package name appears then the corresponding file must be the budget file saved by a LAK, SFR, MAW or UZF Package. + +block packagedata +name filein +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an input filename is expected next. + +block packagedata +name fname +in_record true +type string +preserve_case true +tagged false +reader urword +longname file name +description is the name of the file containing flows. The path to the file should be included if the file is not located in the folder where the program was run. + diff --git a/doc/mf6io/mf6ivar/dfn/gwe-ic.dfn b/doc/mf6io/mf6ivar/dfn/gwe-ic.dfn new file mode 100644 index 00000000000..0cda10416ba --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/gwe-ic.dfn @@ -0,0 +1,11 @@ +# --------------------- gwe ic griddata --------------------- + +block griddata +name strt +type double precision +shape (nodes) +reader readarray +layered true +longname starting temperature +description is the initial (starting) temperature---that is, the temperature at the beginning of the GWE Model simulation. STRT must be specified for all GWE Model simulations. One value is read for every model cell. +default_value 0.0 diff --git a/doc/mf6io/mf6ivar/dfn/gwe-lke.dfn b/doc/mf6io/mf6ivar/dfn/gwe-lke.dfn new file mode 100644 index 00000000000..b59b50420b2 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/gwe-lke.dfn @@ -0,0 +1,481 @@ +# --------------------- gwe lke options --------------------- +# flopy multi-package + +block options +name flow_package_name +type string +shape +reader urword +optional true +longname keyword to specify name of corresponding flow package +description keyword to specify the name of the corresponding flow package. If not specified, then the corresponding flow package must have the same name as this advanced transport package (the name associated with this package in the GWE name file). + +block options +name auxiliary +type string +shape (naux) +reader urword +optional true +longname keyword to specify aux variables +description REPLACE auxnames {'{#1}': 'Groundwater Energy Transport'} + +block options +name flow_package_auxiliary_name +type string +shape +reader urword +optional true +longname keyword to specify name of temperature auxiliary variable in flow package +description keyword to specify the name of an auxiliary variable in the corresponding flow package. If specified, then the simulated temperatures from this advanced transport package will be copied into the auxiliary variable specified with this name. Note that the flow package must have an auxiliary variable with this name or the program will terminate with an error. If the flows for this advanced transport package are read from a file, then this option will have no effect. + +block options +name boundnames +type keyword +shape +reader urword +optional true +longname +description REPLACE boundnames {'{#1}': 'lake'} + +block options +name print_input +type keyword +reader urword +optional true +longname print input to listing file +description REPLACE print_input {'{#1}': 'lake'} + +block options +name print_temperature +type keyword +reader urword +optional true +longname print calculated temperatures to listing file +description REPLACE print_temperature {'{#1}': 'lake', '{#2}': 'temperature', '{#3}': 'TEMPERATURE'} + +block options +name print_flows +type keyword +reader urword +optional true +longname print calculated flows to listing file +description REPLACE print_flows {'{#1}': 'lake'} + +block options +name save_flows +type keyword +reader urword +optional true +longname save lake flows to budget file +description REPLACE save_flows {'{#1}': 'lake'} + +block options +name temperature_filerecord +type record temperature fileout tempfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name temperature +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname stage keyword +description keyword to specify that record corresponds to temperature. + +block options +name tempfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the binary output file to write temperature information. + +block options +name budget_filerecord +type record budget fileout budgetfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name budget +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname budget keyword +description keyword to specify that record corresponds to the budget. + +block options +name fileout +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an output filename is expected next. + +block options +name budgetfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the binary output file to write budget information. + +block options +name budgetcsv_filerecord +type record budgetcsv fileout budgetcsvfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name budgetcsv +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname budget keyword +description keyword to specify that record corresponds to the budget CSV. + +block options +name budgetcsvfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. + +block options +name ts_filerecord +type record ts6 filein ts6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name ts6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname head keyword +description keyword to specify that record corresponds to a time-series file. + +block options +name filein +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an input filename is expected next. + +block options +name ts6_filename +type string +preserve_case true +in_record true +reader urword +optional false +tagged false +longname file name of time series information +description REPLACE timeseriesfile {} + +block options +name obs_filerecord +type record obs6 filein obs6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name obs6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname obs keyword +description keyword to specify that record corresponds to an observations file. + +block options +name obs6_filename +type string +preserve_case true +in_record true +tagged false +reader urword +optional false +longname obs6 input filename +description REPLACE obs6_filename {'{#1}': 'LKE'} + + +# --------------------- gwe lke packagedata --------------------- + +block packagedata +name packagedata +type recarray lakeno strt ktf rbthcnd aux boundname +shape (maxbound) +reader urword +longname +description + +block packagedata +name lakeno +type integer +shape +tagged false +in_record true +reader urword +longname lake number for this entry +description integer value that defines the lake number associated with the specified PACKAGEDATA data on the line. LAKENO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once. +numeric_index true + +block packagedata +name strt +type double precision +shape +tagged false +in_record true +reader urword +longname starting lake temperature +description real value that defines the starting temperature for the lake. + +block packagedata +name ktf +type double precision +shape +tagged false +in_record true +reader urword +longname boundary thermal conductivity +description is the thermal conductivity of the of the interface between the aquifer cell and the lake. + +block packagedata +name rbthcnd +type double precision +shape +tagged false +in_record true +reader urword +longname streambed thickness +description real value that defines the thickness of the lakebed material through which conduction occurs. Must be greater than 0. + +block packagedata +name aux +type double precision +in_record true +tagged false +shape (naux) +reader urword +time_series true +optional true +longname auxiliary variables +description REPLACE aux {'{#1}': 'lake'} + +block packagedata +name boundname +type string +shape +tagged false +in_record true +reader urword +optional true +longname lake name +description REPLACE boundname {'{#1}': 'lake'} + + +# --------------------- gwe lke period --------------------- + +block period +name iper +type integer +block_variable True +in_record true +tagged false +shape +valid +reader urword +optional false +longname stress period number +description REPLACE iper {} + +block period +name lakeperioddata +type recarray lakeno laksetting +shape +reader urword +longname +description + +block period +name lakeno +type integer +shape +tagged false +in_record true +reader urword +longname lake number for this entry +description integer value that defines the lake number associated with the specified PERIOD data on the line. LAKENO must be greater than zero and less than or equal to NLAKES. +numeric_index true + +block period +name laksetting +type keystring status temperature rainfall evaporation runoff ext-inflow auxiliaryrecord +shape +tagged false +in_record true +reader urword +longname +description line of information that is parsed into a keyword and values. Keyword values that can be used to start the LAKSETTING string include: STATUS, TEMPERATURE, RAINFALL, EVAPORATION, RUNOFF, and AUXILIARY. These settings are used to assign the temperature associated with the corresponding flow terms. Temperatures cannot be specified for all flow terms. For example, the Lake Package supports a ``WITHDRAWAL'' flow term. If this withdrawal term is active, then water will be withdrawn from the lake at the calculated temperature of the lake. + +block period +name status +type string +shape +tagged true +in_record true +reader urword +longname lake temperature status +description keyword option to define lake status. STATUS can be ACTIVE, INACTIVE, or CONSTANT. By default, STATUS is ACTIVE, which means that temperature will be calculated for the lake. If a lake is inactive, then there will be no solute mass fluxes into or out of the lake and the inactive value will be written for the lake temperature. If a lake is constant, then the temperature for the lake will be fixed at the user specified value. + +block period +name temperature +type string +shape +tagged true +in_record true +time_series true +reader urword +longname lake temperature +description real or character value that defines the temperature for the lake. The specified TEMPERATURE is only applied if the lake is a constant temperature lake. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. + +block period +name rainfall +type string +shape +tagged true +in_record true +reader urword +time_series true +longname rainfall temperature +description real or character value that defines the rainfall temperature for the lake. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. + +block period +name evaporation +type string +shape +tagged true +in_record true +reader urword +time_series true +longname evaporation temperature +description real or character value that defines the temperature of evaporated water $(^{\circ}C)$ for the reach. If this temperature value is larger than the simulated temperature in the reach, then the evaporated water will be removed at the same temperature as the reach. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. + + +block period +name runoff +type string +shape +tagged true +in_record true +reader urword +time_series true +longname runoff temperature +description real or character value that defines the temperature of runoff for the lake. Value must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. + +block period +name ext-inflow +type string +shape +tagged true +in_record true +reader urword +time_series true +longname ext-inflow temperature +description real or character value that defines the temperature of external inflow for the lake. Value must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. + +block period +name auxiliaryrecord +type record auxiliary auxname auxval +shape +tagged +in_record true +reader urword +longname +description + +block period +name auxiliary +type keyword +shape +in_record true +reader urword +longname +description keyword for specifying auxiliary variable. + +block period +name auxname +type string +shape +tagged false +in_record true +reader urword +longname +description name for the auxiliary variable to be assigned AUXVAL. AUXNAME must match one of the auxiliary variable names defined in the OPTIONS block. If AUXNAME does not match one of the auxiliary variable names defined in the OPTIONS block the data are ignored. + +block period +name auxval +type double precision +shape +tagged false +in_record true +reader urword +time_series true +longname auxiliary variable value +description value for the auxiliary variable. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. diff --git a/doc/mf6io/mf6ivar/dfn/gwe-mwe.dfn b/doc/mf6io/mf6ivar/dfn/gwe-mwe.dfn new file mode 100644 index 00000000000..c805b6533fe --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/gwe-mwe.dfn @@ -0,0 +1,447 @@ +# --------------------- gwe mwe options --------------------- +# flopy multi-package + +block options +name flow_package_name +type string +shape +reader urword +optional true +longname keyword to specify name of corresponding flow package +description keyword to specify the name of the corresponding flow package. If not specified, then the corresponding flow package must have the same name as this advanced transport package (the name associated with this package in the GWE name file). + +block options +name auxiliary +type string +shape (naux) +reader urword +optional true +longname keyword to specify aux variables +description REPLACE auxnames {'{#1}': 'Groundwater Energy Transport'} + +block options +name flow_package_auxiliary_name +type string +shape +reader urword +optional true +longname keyword to specify name of temperature auxiliary variable in flow package +description keyword to specify the name of an auxiliary variable in the corresponding flow package. If specified, then the simulated temperatures from this advanced transport package will be copied into the auxiliary variable specified with this name. Note that the flow package must have an auxiliary variable with this name or the program will terminate with an error. If the flows for this advanced transport package are read from a file, then this option will have no effect. + +block options +name boundnames +type keyword +shape +reader urword +optional true +longname +description REPLACE boundnames {'{#1}': 'well'} + +block options +name print_input +type keyword +reader urword +optional true +longname print input to listing file +description REPLACE print_input {'{#1}': 'well'} + +block options +name print_temperature +type keyword +reader urword +optional true +longname print calculated temperatures to listing file +description REPLACE print_temperature {'{#1}': 'well', '{#2}': 'temperature', '{#3}': 'TEMPERATURE'} + +block options +name print_flows +type keyword +reader urword +optional true +longname print calculated flows to listing file +description REPLACE print_flows {'{#1}': 'well'} + +block options +name save_flows +type keyword +reader urword +optional true +longname save well flows to budget file +description REPLACE save_flows {'{#1}': 'well'} + +block options +name temperature_filerecord +type record temperature fileout tempfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name temperature +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname stage keyword +description keyword to specify that record corresponds to temperature. + +block options +name tempfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the binary output file to write temperature information. + +block options +name budget_filerecord +type record budget fileout budgetfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name budget +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname budget keyword +description keyword to specify that record corresponds to the budget. + +block options +name fileout +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an output filename is expected next. + +block options +name budgetfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the binary output file to write budget information. + +block options +name budgetcsv_filerecord +type record budgetcsv fileout budgetcsvfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name budgetcsv +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname budget keyword +description keyword to specify that record corresponds to the budget CSV. + +block options +name budgetcsvfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. + +block options +name ts_filerecord +type record ts6 filein ts6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name ts6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname head keyword +description keyword to specify that record corresponds to a time-series file. + +block options +name filein +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an input filename is expected next. + +block options +name ts6_filename +type string +preserve_case true +in_record true +reader urword +optional false +tagged false +longname file name of time series information +description REPLACE timeseriesfile {} + +block options +name obs_filerecord +type record obs6 filein obs6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name obs6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname obs keyword +description keyword to specify that record corresponds to an observations file. + +block options +name obs6_filename +type string +preserve_case true +in_record true +tagged false +reader urword +optional false +longname obs6 input filename +description REPLACE obs6_filename {'{#1}': 'MWE'} + + +# --------------------- gwe mwe packagedata --------------------- + +block packagedata +name packagedata +type recarray mawno strt ktf fthk aux boundname +shape (maxbound) +reader urword +longname +description + +block packagedata +name mawno +type integer +shape +tagged false +in_record true +reader urword +longname well number for this entry +description integer value that defines the well number associated with the specified PACKAGEDATA data on the line. MAWNO must be greater than zero and less than or equal to NMAWWELLS. Well information must be specified for every well or the program will terminate with an error. The program will also terminate with an error if information for a well is specified more than once. +numeric_index true + +block packagedata +name strt +type double precision +shape +tagged false +in_record true +reader urword +longname starting well temperature +description real value that defines the starting temperature for the well. + +block packagedata +name ktf +type double precision +shape +tagged false +in_record true +reader urword +longname thermal conductivity of the feature +description is the thermal conductivity of the of the interface between the aquifer cell and the feature. + +block packagedata +name fthk +type double precision +shape +tagged false +in_record true +reader urword +longname thickness of the well feature +description real value that defines the thickness of the material through which conduction occurs. Must be greater than 0. + +block packagedata +name aux +type double precision +in_record true +tagged false +shape (naux) +reader urword +time_series true +optional true +longname auxiliary variables +description REPLACE aux {'{#1}': 'well'} + +block packagedata +name boundname +type string +shape +tagged false +in_record true +reader urword +optional true +longname well name +description REPLACE boundname {'{#1}': 'well'} + + +# --------------------- gwe mwe period --------------------- + +block period +name iper +type integer +block_variable True +in_record true +tagged false +shape +valid +reader urword +optional false +longname stress period number +description REPLACE iper {} + +block period +name mweperioddata +type recarray mawno mwesetting +shape +reader urword +longname +description + +block period +name mawno +type integer +shape +tagged false +in_record true +reader urword +longname well number for this entry +description integer value that defines the well number associated with the specified PERIOD data on the line. MAWNO must be greater than zero and less than or equal to NMAWWELLS. +numeric_index true + +block period +name mwesetting +type keystring status temperature rate auxiliaryrecord +shape +tagged false +in_record true +reader urword +longname +description line of information that is parsed into a keyword and values. Keyword values that can be used to start the MWESETTING string include: STATUS, TEMPERATURE, RAINFALL, EVAPORATION, RUNOFF, and AUXILIARY. These settings are used to assign the temperature of associated with the corresponding flow terms. Temperatures cannot be specified for all flow terms. For example, the Multi-Aquifer Well Package supports a ``WITHDRAWAL'' flow term. If this withdrawal term is active, then water will be withdrawn from the well at the calculated temperature of the well. + +block period +name status +type string +shape +tagged true +in_record true +reader urword +longname well temperature status +description keyword option to define well status. STATUS can be ACTIVE, INACTIVE, or CONSTANT. By default, STATUS is ACTIVE, which means that temperature will be calculated for the well. If a well is inactive, then there will be no solute mass fluxes into or out of the well and the inactive value will be written for the well temperature. If a well is constant, then the temperature for the well will be fixed at the user specified value. + +block period +name temperature +type string +shape +tagged true +in_record true +time_series true +reader urword +longname well temperature +description real or character value that defines the temperature for the well. The specified TEMPERATURE is only applied if the well is a constant temperature well. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. + +block period +name rate +type string +shape +tagged true +in_record true +reader urword +time_series true +longname well injection temperature +description real or character value that defines the injection solute temperature $^{\circ}C$ for the well. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. + +block period +name auxiliaryrecord +type record auxiliary auxname auxval +shape +tagged +in_record true +reader urword +longname +description + +block period +name auxiliary +type keyword +shape +in_record true +reader urword +longname +description keyword for specifying auxiliary variable. + +block period +name auxname +type string +shape +tagged false +in_record true +reader urword +longname +description name for the auxiliary variable to be assigned AUXVAL. AUXNAME must match one of the auxiliary variable names defined in the OPTIONS block. If AUXNAME does not match one of the auxiliary variable names defined in the OPTIONS block the data are ignored. + +block period +name auxval +type double precision +shape +tagged false +in_record true +reader urword +time_series true +longname auxiliary variable value +description value for the auxiliary variable. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. diff --git a/doc/mf6io/mf6ivar/dfn/gwe-nam.dfn b/doc/mf6io/mf6ivar/dfn/gwe-nam.dfn new file mode 100644 index 00000000000..70c89d67135 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/gwe-nam.dfn @@ -0,0 +1,74 @@ +# --------------------- gwe nam options --------------------- + +block options +name list +type string +reader urword +optional true +preserve_case true +longname name of listing file +description is name of the listing file to create for this GWE model. If not specified, then the name of the list file will be the basename of the GWE model name file and the ``.lst'' extension. For example, if the GWE name file is called ``my.model.nam'' then the list file will be called ``my.model.lst''. + +block options +name print_input +type keyword +reader urword +optional true +longname print input to listing file +description REPLACE print_input {'{#1}': 'all model stress package'} + +block options +name print_flows +type keyword +reader urword +optional true +longname print calculated flows to listing file +description REPLACE print_flows {'{#1}': 'all model package'} + +block options +name save_flows +type keyword +reader urword +optional true +longname save flows for all packages to budget file +description REPLACE save_flows {'{#1}': 'all model package'} + +# --------------------- gwe nam packages --------------------- + +block packages +name packages +type recarray ftype fname pname +reader urword +optional false +longname package list +description + +block packages +name ftype +in_record true +type string +tagged false +reader urword +longname package type +description is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. + +block packages +name fname +in_record true +type string +preserve_case true +tagged false +reader urword +longname file name +description is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. + +block packages +name pname +in_record true +type string +tagged false +reader urword +optional true +longname user name for package +description is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single GWE Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. + diff --git a/doc/mf6io/mf6ivar/dfn/gwe-oc.dfn b/doc/mf6io/mf6ivar/dfn/gwe-oc.dfn new file mode 100644 index 00000000000..296113c7ba6 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/gwe-oc.dfn @@ -0,0 +1,313 @@ +# --------------------- gwt oc options --------------------- + +block options +name budget_filerecord +type record budget fileout budgetfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name budget +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname budget keyword +description keyword to specify that record corresponds to the budget. + +block options +name fileout +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an output filename is expected next. + +block options +name budgetfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the output file to write budget information. + +block options +name budgetcsv_filerecord +type record budgetcsv fileout budgetcsvfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name budgetcsv +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname budget keyword +description keyword to specify that record corresponds to the budget CSV. + +block options +name budgetcsvfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. + +block options +name temperature_filerecord +type record temperature fileout temperaturefile +shape +reader urword +tagged true +optional true +longname +description + +block options +name temperature +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname temperature keyword +description keyword to specify that record corresponds to temperature. + +block options +name temperaturefile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the output file to write conc information. + +block options +name temperatureprintrecord +type record temperature print_format formatrecord +shape +reader urword +optional true +longname +description + +block options +name print_format +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname keyword to indicate that a print format follows +description keyword to specify format for printing to the listing file. + +block options +name formatrecord +type record columns width digits format +shape +in_record true +reader urword +tagged +optional false +longname +description + +block options +name columns +type integer +shape +in_record true +reader urword +tagged true +optional +longname number of columns +description number of columns for writing data. + +block options +name width +type integer +shape +in_record true +reader urword +tagged true +optional +longname width for each number +description width for writing each number. + +block options +name digits +type integer +shape +in_record true +reader urword +tagged true +optional +longname number of digits +description number of digits to use for writing a number. + +block options +name format +type string +shape +in_record true +reader urword +tagged false +optional false +longname write format +description write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + + +# --------------------- gwt oc period --------------------- + +block period +name iper +type integer +block_variable True +in_record true +tagged false +shape +valid +reader urword +optional false +longname stress period number +description REPLACE iper {} + +block period +name saverecord +type record save rtype ocsetting +shape +reader urword +tagged false +optional true +longname +description + +block period +name save +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname keyword to save +description keyword to indicate that information will be saved this stress period. + +block period +name printrecord +type record print rtype ocsetting +shape +reader urword +tagged false +optional true +longname +description + +block period +name print +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname keyword to save +description keyword to indicate that information will be printed this stress period. + +block period +name rtype +type string +shape +in_record true +reader urword +tagged false +optional false +longname record type +description type of information to save or print. Can be BUDGET or TEMPERATURE. + +block period +name ocsetting +type keystring all first last frequency steps +shape +tagged false +in_record true +reader urword +longname +description specifies the steps for which the data will be saved. + +block period +name all +type keyword +shape +in_record true +reader urword +longname +description keyword to indicate save for all time steps in period. + +block period +name first +type keyword +shape +in_record true +reader urword +longname +description keyword to indicate save for first step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +block period +name last +type keyword +shape +in_record true +reader urword +longname +description keyword to indicate save for last step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +block period +name frequency +type integer +shape +tagged true +in_record true +reader urword +longname +description save at the specified time step frequency. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +block period +name steps +type integer +shape ($ 0, or it is the area perpendicular to flow of the vertical connection between cell 1 and cell 2 if IHC = 0. | | EXG | GWTGWT | EXCHANGEDATA | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each GWTGWT Exchange. The values of auxiliary variables must be present for each exchange. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. | | EXG | GWTGWT | EXCHANGEDATA | BOUNDNAME | STRING | name of the GWT Exchange cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | +| EXG | GWEGWE | OPTIONS | GWFMODELNAME1 | STRING | keyword to specify name of first corresponding GWF Model. In the simulation name file, the GWE6-GWE6 entry contains names for GWE Models (exgmnamea and exgmnameb). The GWE Model with the name exgmnamea must correspond to the GWF Model with the name gwfmodelname1. | +| EXG | GWEGWE | OPTIONS | GWFMODELNAME2 | STRING | keyword to specify name of second corresponding GWF Model. In the simulation name file, the GWE6-GWE6 entry contains names for GWE Models (exgmnamea and exgmnameb). The GWE Model with the name exgmnameb must correspond to the GWF Model with the name gwfmodelname2. | +| EXG | GWEGWE | OPTIONS | AUXILIARY | STRING (NAUX) | an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWF-GWF Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' is provided in the description of the DISU Package. If an auxiliary variable with the name ``CDIST'' is found, then this information will be used as the straight-line connection distance, including the vertical component, between the two cell centers. Both ANGLDEGX and CDIST are required if specific discharge is calculated for either of the groundwater models. | +| EXG | GWEGWE | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of GWE Exchange cells. | +| EXG | GWEGWE | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of exchange entries will be echoed to the listing file immediately after it is read. | +| EXG | GWEGWE | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of exchange flow rates will be printed to the listing file for every stress period in which ``SAVE BUDGET'' is specified in Output Control. | +| EXG | GWEGWE | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that cell-by-cell flow terms will be written to the budget file for each model provided that the Output Control for the models are set up with the ``BUDGET SAVE FILE'' option. | +| EXG | GWEGWE | OPTIONS | ADV_SCHEME | STRING | scheme used to solve the advection term. Can be upstream, central, or TVD. If not specified, upstream weighting is the default weighting scheme. | +| EXG | GWEGWE | OPTIONS | CND_XT3D_OFF | KEYWORD | deactivate the xt3d method for the dispersive flux and use the faster and less accurate approximation for this exchange. | +| EXG | GWEGWE | OPTIONS | CND_XT3D_RHS | KEYWORD | add xt3d dispersion terms to right-hand side, when possible, for this exchange. | +| EXG | GWEGWE | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| EXG | GWEGWE | OPTIONS | MVE6 | KEYWORD | keyword to specify that record corresponds to an energy transport mover file. | +| EXG | GWEGWE | OPTIONS | MVE6_FILENAME | STRING | is the file name of the transport mover input file to apply to this exchange. Information for the transport mover are provided in the file provided with these keywords. | +| EXG | GWEGWE | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | +| EXG | GWEGWE | OPTIONS | OBS6_FILENAME | STRING | is the file name of the observations input file for this exchange. See the ``Observation utility'' section for instructions for preparing observation input files. Table \ref{table:gwe-obstypetable} lists observation type(s) supported by the GWE-GWE package. | +| EXG | GWEGWE | OPTIONS | DEV_INTERFACEMODEL_ON | KEYWORD | activates the interface model mechanism for calculating the coefficients at (and possibly near) the exchange. This keyword should only be used for development purposes. | +| EXG | GWEGWE | DIMENSIONS | NEXG | INTEGER | keyword and integer value specifying the number of GWE-GWE exchanges. | +| EXG | GWEGWE | EXCHANGEDATA | CELLIDM1 | INTEGER | is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. | +| EXG | GWEGWE | EXCHANGEDATA | CELLIDM2 | INTEGER | is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. | +| EXG | GWEGWE | EXCHANGEDATA | IHC | INTEGER | is an integer flag indicating the direction between node n and all of its m connections. If IHC = 0 then the connection is vertical. If IHC = 1 then the connection is horizontal. If IHC = 2 then the connection is horizontal for a vertically staggered grid. | +| EXG | GWEGWE | EXCHANGEDATA | CL1 | DOUBLE PRECISION | is the distance between the center of cell 1 and the its shared face with cell 2. | +| EXG | GWEGWE | EXCHANGEDATA | CL2 | DOUBLE PRECISION | is the distance between the center of cell 2 and the its shared face with cell 1. | +| EXG | GWEGWE | EXCHANGEDATA | HWVA | DOUBLE PRECISION | is the horizontal width of the flow connection between cell 1 and cell 2 if IHC $>$ 0, or it is the area perpendicular to flow of the vertical connection between cell 1 and cell 2 if IHC = 0. | +| EXG | GWEGWE | EXCHANGEDATA | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each GWEGWE Exchange. The values of auxiliary variables must be present for each exchange. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. | +| EXG | GWEGWE | EXCHANGEDATA | BOUNDNAME | STRING | name of the GWE Exchange cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | | SLN | IMS | OPTIONS | PRINT_OPTION | STRING | is a flag that controls printing of convergence information from the solver. NONE means print nothing. SUMMARY means print only the total number of iterations and nonlinear residual reduction summaries. ALL means print linear matrix solver convergence information to the solution listing file and model specific linear matrix solver convergence information to each model listing file in addition to SUMMARY information. NONE is default if PRINT\_OPTION is not specified. | | SLN | IMS | OPTIONS | COMPLEXITY | STRING | is an optional keyword that defines default non-linear and linear solver parameters. SIMPLE - indicates that default solver input values will be defined that work well for nearly linear models. This would be used for models that do not include nonlinear stress packages and models that are either confined or consist of a single unconfined layer that is thick enough to contain the water table within a single layer. MODERATE - indicates that default solver input values will be defined that work well for moderately nonlinear models. This would be used for models that include nonlinear stress packages and models that consist of one or more unconfined layers. The MODERATE option should be used when the SIMPLE option does not result in successful convergence. COMPLEX - indicates that default solver input values will be defined that work well for highly nonlinear models. This would be used for models that include nonlinear stress packages and models that consist of one or more unconfined layers representing complex geology and surface-water/groundwater interaction. The COMPLEX option should be used when the MODERATE option does not result in successful convergence. Non-linear and linear solver parameters assigned using a specified complexity can be modified in the NONLINEAR and LINEAR blocks. If the COMPLEXITY option is not specified, NONLINEAR and LINEAR variables will be assigned the simple complexity values. | | SLN | IMS | OPTIONS | CSV_OUTPUT | KEYWORD | keyword to specify that the record corresponds to the comma separated values solver convergence output. The CSV\_OUTPUT option has been deprecated and split into the CSV_OUTER_OUTPUT and CSV_INNER_OUTPUT options. Starting with MODFLOW 6 version 6.1.1 if the CSV_OUTPUT option is specified, then it is treated as the CSV_OUTER_OUTPUT option. | @@ -442,7 +467,7 @@ | GWF | RCHA | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the Recharge package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the Recharge package. | | GWF | RCHA | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | | GWF | RCHA | PERIOD | IRCH | INTEGER (NCOL*NROW; NCPL) | IRCH is the layer number that defines the layer in each vertical column where recharge is applied. If IRCH is omitted, recharge by default is applied to cells in layer 1. IRCH can only be used if READASARRAYS is specified in the OPTIONS block. If IRCH is specified, it must be specified as the first variable in the PERIOD block or MODFLOW will terminate with an error. | -| GWF | RCHA | PERIOD | RECHARGE | DOUBLE PRECISION (NCOL*NROW; NCPL) | is the recharge flux rate ($LT^{-1}$). This rate is multiplied inside the program by the surface area of the cell to calculate the volumetric recharge rate. The recharge array may be defined by a time-array series (see the "Using Time-Array Series in a Package" section). | +| GWF | RCHA | PERIOD | RECHARGE | DOUBLE PRECISION (NCOL*NROW; NCPL) | is the recharge flux rate ($LT^{-1}$). This rate is multiplied inside the program by the surface area of the cell to calculate the volumetric recharge rate. The recharge array may be defined by a time-array series (see the ``Using Time-Array Series in a Package'' section). | | GWF | RCHA | PERIOD | AUX | DOUBLE PRECISION (NCOL*NROW; NCPL) | is an array of values for auxiliary variable aux(iaux), where iaux is a value from 1 to naux, and aux(iaux) must be listed as part of the auxiliary variables. A separate array can be specified for each auxiliary variable. If an array is not specified for an auxiliary variable, then a value of zero is assigned. If the value specified here for the auxiliary variable is the same as auxmultname, then the recharge array will be multiplied by this array. | | GWF | EVT | OPTIONS | FIXED_CELL | KEYWORD | indicates that evapotranspiration will not be reassigned to a cell underlying the cell specified in the list if the specified cell is inactive. | | GWF | EVT | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | @@ -1159,6 +1184,309 @@ | GWT | API | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the api boundary package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the api boundary package. | | GWT | API | OPTIONS | MOVER | KEYWORD | keyword to indicate that this instance of the api boundary Package can be used with the Water Mover (MVR) Package. When the MOVER option is specified, additional memory is allocated within the package to store the available, provided, and received water. | | GWT | API | DIMENSIONS | MAXBOUND | INTEGER | integer value specifying the maximum number of api boundary cells that will be specified for use during any stress period. | +| GWE | ADV | OPTIONS | SCHEME | STRING | scheme used to solve the advection term. Can be upstream, central, or TVD. If not specified, upstream weighting is the default weighting scheme. | +| GWE | CND | OPTIONS | XT3D_OFF | KEYWORD | deactivate the xt3d method and use the faster and less accurate approximation. This option may provide a fast and accurate solution under some circumstances, such as when flow aligns with the model grid, there is no mechanical dispersion, or when the longitudinal and transverse dispersivities are equal. This option may also be used to assess the computational demand of the XT3D approach by noting the run time differences with and without this option on. | +| GWE | CND | OPTIONS | XT3D_RHS | KEYWORD | add xt3d terms to right-hand side, when possible. This option uses less memory, but may require more iterations. | +| GWE | CND | GRIDDATA | ALH | DOUBLE PRECISION (NODES) | longitudinal dispersivity in horizontal direction. If flow is strictly horizontal, then this is the longitudinal dispersivity that will be used. If flow is not strictly horizontal or strictly vertical, then the longitudinal dispersivity is a function of both ALH and ALV. If mechanical dispersion is represented (by specifying any dispersivity values) then this array is required. | +| GWE | CND | GRIDDATA | ALV | DOUBLE PRECISION (NODES) | longitudinal dispersivity in vertical direction. If flow is strictly vertical, then this is the longitudinal dispsersivity value that will be used. If flow is not strictly horizontal or strictly vertical, then the longitudinal dispersivity is a function of both ALH and ALV. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ALH. | +| GWE | CND | GRIDDATA | ATH1 | DOUBLE PRECISION (NODES) | transverse dispersivity in horizontal direction. This is the transverse dispersivity value for the second ellipsoid axis. If flow is strictly horizontal and directed in the x direction (along a row for a regular grid), then this value controls spreading in the y direction. If mechanical dispersion is represented (by specifying any dispersivity values) then this array is required. | +| GWE | CND | GRIDDATA | ATH2 | DOUBLE PRECISION (NODES) | transverse dispersivity in horizontal direction. This is the transverse dispersivity value for the third ellipsoid axis. If flow is strictly horizontal and directed in the x direction (along a row for a regular grid), then this value controls spreading in the z direction. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ATH1. | +| GWE | CND | GRIDDATA | ATV | DOUBLE PRECISION (NODES) | transverse dispersivity when flow is in vertical direction. If flow is strictly vertical and directed in the z direction, then this value controls spreading in the x and y directions. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ATH2. | +| GWE | CND | GRIDDATA | KTW | DOUBLE PRECISION (NODES) | thermal conductivity of the simulated fluid | +| GWE | CND | GRIDDATA | KTS | DOUBLE PRECISION (NODES) | thermal conductivity of the aquifer material | +| GWE | CTP | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | +| GWE | CTP | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of temperature value. | +| GWE | CTP | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of constant temperature cells. | +| GWE | CTP | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of constant temperature information will be written to the listing file immediately after it is read. | +| GWE | CTP | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of constant temperature flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| GWE | CTP | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that constant temperature flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWE | CTP | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | +| GWE | CTP | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| GWE | CTP | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | +| GWE | CTP | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | +| GWE | CTP | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the Constant Temperature package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the Constant Temperature package. | +| GWE | CTP | DIMENSIONS | MAXBOUND | INTEGER | integer value specifying the maximum number of constant temperatures cells that will be specified for use during any stress period. | +| GWE | CTP | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| GWE | CTP | PERIOD | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | +| GWE | CTP | PERIOD | TEMP | DOUBLE PRECISION | is the constant temperature value. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWE | CTP | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each constant temperature. The values of auxiliary variables must be present for each constant temperature. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWE | CTP | PERIOD | BOUNDNAME | STRING | name of the constant temperature cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | +| GWE | DIS | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | +| GWE | DIS | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | +| GWE | DIS | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWE | DIS | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWE | DIS | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWE | DIS | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | +| GWE | DIS | DIMENSIONS | NROW | INTEGER | is the number of rows in the model grid. | +| GWE | DIS | DIMENSIONS | NCOL | INTEGER | is the number of columns in the model grid. | +| GWE | DIS | GRIDDATA | DELR | DOUBLE PRECISION (NCOL) | is the column spacing in the row direction. | +| GWE | DIS | GRIDDATA | DELC | DOUBLE PRECISION (NROW) | is the row spacing in the column direction. | +| GWE | DIS | GRIDDATA | TOP | DOUBLE PRECISION (NCOL, NROW) | is the top elevation for each cell in the top model layer. | +| GWE | DIS | GRIDDATA | BOTM | DOUBLE PRECISION (NCOL, NROW, NLAY) | is the bottom elevation for each cell. | +| GWE | DIS | GRIDDATA | IDOMAIN | INTEGER (NCOL, NROW, NLAY) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. | +| GWE | DISV | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | +| GWE | DISV | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | +| GWE | DISV | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWE | DISV | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWE | DISV | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWE | DISV | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | +| GWE | DISV | DIMENSIONS | NCPL | INTEGER | is the number of cells per layer. This is a constant value for the grid and it applies to all layers. | +| GWE | DISV | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. | +| GWE | DISV | GRIDDATA | TOP | DOUBLE PRECISION (NCPL) | is the top elevation for each cell in the top model layer. | +| GWE | DISV | GRIDDATA | BOTM | DOUBLE PRECISION (NCPL, NLAY) | is the bottom elevation for each cell. | +| GWE | DISV | GRIDDATA | IDOMAIN | INTEGER (NCPL, NLAY) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. | +| GWE | DISV | VERTICES | IV | INTEGER | is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. | +| GWE | DISV | VERTICES | XV | DOUBLE PRECISION | is the x-coordinate for the vertex. | +| GWE | DISV | VERTICES | YV | DOUBLE PRECISION | is the y-coordinate for the vertex. | +| GWE | DISV | CELL2D | ICELL2D | INTEGER | is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. | +| GWE | DISV | CELL2D | XC | DOUBLE PRECISION | is the x-coordinate for the cell center. | +| GWE | DISV | CELL2D | YC | DOUBLE PRECISION | is the y-coordinate for the cell center. | +| GWE | DISV | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | +| GWE | DISV | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices. | +| GWE | DISU | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | +| GWE | DISU | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | +| GWE | DISU | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWE | DISU | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWE | DISU | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWE | DISU | OPTIONS | VERTICAL_OFFSET_TOLERANCE | DOUBLE PRECISION | checks are performed to ensure that the top of a cell is not higher than the bottom of an overlying cell. This option can be used to specify the tolerance that is used for checking. If top of a cell is above the bottom of an overlying cell by a value less than this tolerance, then the program will not terminate with an error. The default value is zero. This option should generally not be used. | +| GWE | DISU | DIMENSIONS | NODES | INTEGER | is the number of cells in the model grid. | +| GWE | DISU | DIMENSIONS | NJA | INTEGER | is the sum of the number of connections and NODES. When calculating the total number of connections, the connection between cell n and cell m is considered to be different from the connection between cell m and cell n. Thus, NJA is equal to the total number of connections, including n to m and m to n, and the total number of cells. | +| GWE | DISU | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to define the plan-view shape of each cell in the model grid. If NVERT is not specified or is specified as zero, then the VERTICES and CELL2D blocks below are not read. NVERT and the accompanying VERTICES and CELL2D blocks should be specified for most simulations. If the XT3D or SAVE\_SPECIFIC\_DISCHARGE options are specified in the NPF Package, then this information is required. | +| GWE | DISU | GRIDDATA | TOP | DOUBLE PRECISION (NODES) | is the top elevation for each cell in the model grid. | +| GWE | DISU | GRIDDATA | BOT | DOUBLE PRECISION (NODES) | is the bottom elevation for each cell. | +| GWE | DISU | GRIDDATA | AREA | DOUBLE PRECISION (NODES) | is the cell surface area (in plan view). | +| GWE | DISU | GRIDDATA | IDOMAIN | INTEGER (NODES) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1 or greater, the cell exists in the simulation. IDOMAIN values of -1 cannot be specified for the DISU Package. | +| GWE | DISU | CONNECTIONDATA | IAC | INTEGER (NODES) | is the number of connections (plus 1) for each cell. The sum of all the entries in IAC must be equal to NJA. | +| GWE | DISU | CONNECTIONDATA | JA | INTEGER (NJA) | is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWE cells and their connections to the other GWE cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code. | +| GWE | DISU | CONNECTIONDATA | IHC | INTEGER (NJA) | is an index array indicating the direction between node n and all of its m connections. If IHC = 0 then cell n and cell m are connected in the vertical direction. Cell n overlies cell m if the cell number for n is less than m; cell m overlies cell n if the cell number for m is less than n. If IHC = 1 then cell n and cell m are connected in the horizontal direction. If IHC = 2 then cell n and cell m are connected in the horizontal direction, and the connection is vertically staggered. A vertically staggered connection is one in which a cell is horizontally connected to more than one cell in a horizontal connection. | +| GWE | DISU | CONNECTIONDATA | CL12 | DOUBLE PRECISION (NJA) | is the array containing connection lengths between the center of cell n and the shared face with each adjacent m cell. | +| GWE | DISU | CONNECTIONDATA | HWVA | DOUBLE PRECISION (NJA) | is a symmetric array of size NJA. For horizontal connections, entries in HWVA are the horizontal width perpendicular to flow. For vertical connections, entries in HWVA are the vertical area for flow. Thus, values in the HWVA array contain dimensions of both length and area. Entries in the HWVA array have a one-to-one correspondence with the connections specified in the JA array. Likewise, there is a one-to-one correspondence between entries in the HWVA array and entries in the IHC array, which specifies the connection type (horizontal or vertical). Entries in the HWVA array must be symmetric; the program will terminate with an error if the value for HWVA for an n to m connection does not equal the value for HWVA for the corresponding n to m connection. | +| GWE | DISU | CONNECTIONDATA | ANGLDEGX | DOUBLE PRECISION (NJA) | is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specifed in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. | +| GWE | DISU | VERTICES | IV | INTEGER | is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. | +| GWE | DISU | VERTICES | XV | DOUBLE PRECISION | is the x-coordinate for the vertex. | +| GWE | DISU | VERTICES | YV | DOUBLE PRECISION | is the y-coordinate for the vertex. | +| GWE | DISU | CELL2D | ICELL2D | INTEGER | is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES. | +| GWE | DISU | CELL2D | XC | DOUBLE PRECISION | is the x-coordinate for the cell center. | +| GWE | DISU | CELL2D | YC | DOUBLE PRECISION | is the y-coordinate for the cell center. | +| GWE | DISU | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | +| GWE | DISU | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. | +| GWE | ESL | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | +| GWE | ESL | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of energy loading rate. | +| GWE | ESL | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of energy source loading cells. | +| GWE | ESL | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of energy source loading information will be written to the listing file immediately after it is read. | +| GWE | ESL | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of energy source loading flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| GWE | ESL | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that energy source loading flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWE | ESL | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | +| GWE | ESL | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| GWE | ESL | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | +| GWE | ESL | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | +| GWE | ESL | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the Energy Source Loading package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the Energy Source Loading package. | +| GWE | ESL | DIMENSIONS | MAXBOUND | INTEGER | integer value specifying the maximum number of sources cells that will be specified for use during any stress period. | +| GWE | ESL | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| GWE | ESL | PERIOD | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | +| GWE | ESL | PERIOD | SENERRATE | DOUBLE PRECISION | is the energy source loading rate. A positive value indicates addition of energy and a negative value indicates removal of energy. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWE | ESL | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each energy source. The values of auxiliary variables must be present for each energy source. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWE | ESL | PERIOD | BOUNDNAME | STRING | name of the energy source cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | +| GWE | EST | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that EST flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWE | EST | OPTIONS | ZERO_ORDER_DECAY | KEYWORD | is a text keyword to indicate that zero-order decay will occur. Use of this keyword requires that DECAY and DECAY\_SORBED (if sorption is active) are specified in the GRIDDATA block. | +| GWE | EST | OPTIONS | LATENT_HEAT_VAPORIZATION | KEYWORD | is a text keyword to indicate that cooling associated with evaporation will occur. Use of this keyword requires that LATHEATVAP are specified in the GRIDDATA block. While the EST package does not simulate evaporation, multiple other packages in a GWE simulation may. For example, evaporation may occur from the surface of streams or lakes. Owing to the energy consumed by the change in phase, the latent heat of vaporization is required. | +| GWE | EST | GRIDDATA | POROSITY | DOUBLE PRECISION (NODES) | is the mobile domain porosity, defined as the mobile domain pore volume per mobile domain volume. The GWE model does not support the concept of an immobile domain in the context of heat transport. | +| GWE | EST | GRIDDATA | DECAY | DOUBLE PRECISION (NODES) | is the rate coefficient for zero-order decay for the aqueous phase of the mobile domain. A negative value indicates heat (energy) production. The dimensions of decay for zero-order decay is energy per length cubed per time. Zero-order decay will have no effect on simulation results unless zero-order decay is specified in the options block. | +| GWE | EST | GRIDDATA | CPS | DOUBLE PRECISION (NODES) | is the mass-based heat capacity of dry solids (aquifer material). For example, units of J/kg/C may be used (or equivalent). | +| GWE | EST | GRIDDATA | RHOS | DOUBLE PRECISION (NODES) | is a user-specified value of the density of aquifer material not considering the voids. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kg/m3. | +| GWE | EST | PACKAGEDATA | CPW | DOUBLE PRECISION | is the mass-based heat capacity of the simulated fluid. For example, units of J/kg/C may be used (or equivalent). | +| GWE | EST | PACKAGEDATA | RHOW | DOUBLE PRECISION | is a user-specified value of the density of water. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kg/m3. | +| GWE | EST | PACKAGEDATA | LATHEATVAP | DOUBLE PRECISION | is the user-specified value for the latent heat of vaporization. For example, if working in SI units, values may be entered as kJ/kg. | +| GWE | IC | GRIDDATA | STRT | DOUBLE PRECISION (NODES) | is the initial (starting) temperature---that is, the temperature at the beginning of the GWE Model simulation. STRT must be specified for all GWE Model simulations. One value is read for every model cell. | +| GWE | LKE | OPTIONS | FLOW_PACKAGE_NAME | STRING | keyword to specify the name of the corresponding flow package. If not specified, then the corresponding flow package must have the same name as this advanced transport package (the name associated with this package in the GWE name file). | +| GWE | LKE | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | +| GWE | LKE | OPTIONS | FLOW_PACKAGE_AUXILIARY_NAME | STRING | keyword to specify the name of an auxiliary variable in the corresponding flow package. If specified, then the simulated temperatures from this advanced transport package will be copied into the auxiliary variable specified with this name. Note that the flow package must have an auxiliary variable with this name or the program will terminate with an error. If the flows for this advanced transport package are read from a file, then this option will have no effect. | +| GWE | LKE | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of lake cells. | +| GWE | LKE | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of lake information will be written to the listing file immediately after it is read. | +| GWE | LKE | OPTIONS | PRINT_TEMPERATURE | KEYWORD | keyword to indicate that the list of lake temperature will be printed to the listing file for every stress period in which ``TEMPERATURE PRINT'' is specified in Output Control. If there is no Output Control option and PRINT\_TEMPERATURE is specified, then temperature are printed for the last time step of each stress period. | +| GWE | LKE | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of lake flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| GWE | LKE | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that lake flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWE | LKE | OPTIONS | TEMPERATURE | KEYWORD | keyword to specify that record corresponds to temperature. | +| GWE | LKE | OPTIONS | TEMPFILE | STRING | name of the binary output file to write temperature information. | +| GWE | LKE | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | +| GWE | LKE | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | +| GWE | LKE | OPTIONS | BUDGETFILE | STRING | name of the binary output file to write budget information. | +| GWE | LKE | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | +| GWE | LKE | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | +| GWE | LKE | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | +| GWE | LKE | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| GWE | LKE | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | +| GWE | LKE | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | +| GWE | LKE | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the LKE package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the LKE package. | +| GWE | LKE | PACKAGEDATA | LAKENO | INTEGER | integer value that defines the lake number associated with the specified PACKAGEDATA data on the line. LAKENO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once. | +| GWE | LKE | PACKAGEDATA | STRT | DOUBLE PRECISION | real value that defines the starting temperature for the lake. | +| GWE | LKE | PACKAGEDATA | KTF | DOUBLE PRECISION | is the thermal conductivity of the of the interface between the aquifer cell and the lake. | +| GWE | LKE | PACKAGEDATA | RBTHCND | DOUBLE PRECISION | real value that defines the thickness of the lakebed material through which conduction occurs. Must be greater than 0. | +| GWE | LKE | PACKAGEDATA | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each lake. The values of auxiliary variables must be present for each lake. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWE | LKE | PACKAGEDATA | BOUNDNAME | STRING | name of the lake cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | +| GWE | LKE | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| GWE | LKE | PERIOD | LAKENO | INTEGER | integer value that defines the lake number associated with the specified PERIOD data on the line. LAKENO must be greater than zero and less than or equal to NLAKES. | +| GWE | LKE | PERIOD | LAKSETTING | KEYSTRING | line of information that is parsed into a keyword and values. Keyword values that can be used to start the LAKSETTING string include: STATUS, TEMPERATURE, RAINFALL, EVAPORATION, RUNOFF, and AUXILIARY. These settings are used to assign the temperature associated with the corresponding flow terms. Temperatures cannot be specified for all flow terms. For example, the Lake Package supports a ``WITHDRAWAL'' flow term. If this withdrawal term is active, then water will be withdrawn from the lake at the calculated temperature of the lake. | +| GWE | LKE | PERIOD | STATUS | STRING | keyword option to define lake status. STATUS can be ACTIVE, INACTIVE, or CONSTANT. By default, STATUS is ACTIVE, which means that temperature will be calculated for the lake. If a lake is inactive, then there will be no solute mass fluxes into or out of the lake and the inactive value will be written for the lake temperature. If a lake is constant, then the temperature for the lake will be fixed at the user specified value. | +| GWE | LKE | PERIOD | TEMPERATURE | STRING | real or character value that defines the temperature for the lake. The specified TEMPERATURE is only applied if the lake is a constant temperature lake. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWE | LKE | PERIOD | RAINFALL | STRING | real or character value that defines the rainfall temperature for the lake. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWE | LKE | PERIOD | EVAPORATION | STRING | real or character value that defines the temperature of evaporated water $(^{\circ}C)$ for the reach. If this temperature value is larger than the simulated temperature in the reach, then the evaporated water will be removed at the same temperature as the reach. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWE | LKE | PERIOD | RUNOFF | STRING | real or character value that defines the temperature of runoff for the lake. Value must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWE | LKE | PERIOD | EXT-INFLOW | STRING | real or character value that defines the temperature of external inflow for the lake. Value must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWE | LKE | PERIOD | AUXILIARY | KEYWORD | keyword for specifying auxiliary variable. | +| GWE | LKE | PERIOD | AUXNAME | STRING | name for the auxiliary variable to be assigned AUXVAL. AUXNAME must match one of the auxiliary variable names defined in the OPTIONS block. If AUXNAME does not match one of the auxiliary variable names defined in the OPTIONS block the data are ignored. | +| GWE | LKE | PERIOD | AUXVAL | DOUBLE PRECISION | value for the auxiliary variable. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWE | MWE | OPTIONS | FLOW_PACKAGE_NAME | STRING | keyword to specify the name of the corresponding flow package. If not specified, then the corresponding flow package must have the same name as this advanced transport package (the name associated with this package in the GWE name file). | +| GWE | MWE | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | +| GWE | MWE | OPTIONS | FLOW_PACKAGE_AUXILIARY_NAME | STRING | keyword to specify the name of an auxiliary variable in the corresponding flow package. If specified, then the simulated temperatures from this advanced transport package will be copied into the auxiliary variable specified with this name. Note that the flow package must have an auxiliary variable with this name or the program will terminate with an error. If the flows for this advanced transport package are read from a file, then this option will have no effect. | +| GWE | MWE | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of well cells. | +| GWE | MWE | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of well information will be written to the listing file immediately after it is read. | +| GWE | MWE | OPTIONS | PRINT_TEMPERATURE | KEYWORD | keyword to indicate that the list of well temperature will be printed to the listing file for every stress period in which ``TEMPERATURE PRINT'' is specified in Output Control. If there is no Output Control option and PRINT\_TEMPERATURE is specified, then temperature are printed for the last time step of each stress period. | +| GWE | MWE | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of well flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| GWE | MWE | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that well flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWE | MWE | OPTIONS | TEMPERATURE | KEYWORD | keyword to specify that record corresponds to temperature. | +| GWE | MWE | OPTIONS | TEMPFILE | STRING | name of the binary output file to write temperature information. | +| GWE | MWE | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | +| GWE | MWE | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | +| GWE | MWE | OPTIONS | BUDGETFILE | STRING | name of the binary output file to write budget information. | +| GWE | MWE | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | +| GWE | MWE | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | +| GWE | MWE | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | +| GWE | MWE | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| GWE | MWE | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | +| GWE | MWE | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | +| GWE | MWE | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the MWE package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the MWE package. | +| GWE | MWE | PACKAGEDATA | MAWNO | INTEGER | integer value that defines the well number associated with the specified PACKAGEDATA data on the line. MAWNO must be greater than zero and less than or equal to NMAWWELLS. Well information must be specified for every well or the program will terminate with an error. The program will also terminate with an error if information for a well is specified more than once. | +| GWE | MWE | PACKAGEDATA | STRT | DOUBLE PRECISION | real value that defines the starting temperature for the well. | +| GWE | MWE | PACKAGEDATA | KTF | DOUBLE PRECISION | is the thermal conductivity of the of the interface between the aquifer cell and the feature. | +| GWE | MWE | PACKAGEDATA | FTHK | DOUBLE PRECISION | real value that defines the thickness of the material through which conduction occurs. Must be greater than 0. | +| GWE | MWE | PACKAGEDATA | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each well. The values of auxiliary variables must be present for each well. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWE | MWE | PACKAGEDATA | BOUNDNAME | STRING | name of the well cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | +| GWE | MWE | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| GWE | MWE | PERIOD | MAWNO | INTEGER | integer value that defines the well number associated with the specified PERIOD data on the line. MAWNO must be greater than zero and less than or equal to NMAWWELLS. | +| GWE | MWE | PERIOD | MWESETTING | KEYSTRING | line of information that is parsed into a keyword and values. Keyword values that can be used to start the MWESETTING string include: STATUS, TEMPERATURE, RAINFALL, EVAPORATION, RUNOFF, and AUXILIARY. These settings are used to assign the temperature of associated with the corresponding flow terms. Temperatures cannot be specified for all flow terms. For example, the Multi-Aquifer Well Package supports a ``WITHDRAWAL'' flow term. If this withdrawal term is active, then water will be withdrawn from the well at the calculated temperature of the well. | +| GWE | MWE | PERIOD | STATUS | STRING | keyword option to define well status. STATUS can be ACTIVE, INACTIVE, or CONSTANT. By default, STATUS is ACTIVE, which means that temperature will be calculated for the well. If a well is inactive, then there will be no solute mass fluxes into or out of the well and the inactive value will be written for the well temperature. If a well is constant, then the temperature for the well will be fixed at the user specified value. | +| GWE | MWE | PERIOD | TEMPERATURE | STRING | real or character value that defines the temperature for the well. The specified TEMPERATURE is only applied if the well is a constant temperature well. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWE | MWE | PERIOD | RATE | STRING | real or character value that defines the injection solute temperature $^{\circ}C$ for the well. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWE | MWE | PERIOD | AUXILIARY | KEYWORD | keyword for specifying auxiliary variable. | +| GWE | MWE | PERIOD | AUXNAME | STRING | name for the auxiliary variable to be assigned AUXVAL. AUXNAME must match one of the auxiliary variable names defined in the OPTIONS block. If AUXNAME does not match one of the auxiliary variable names defined in the OPTIONS block the data are ignored. | +| GWE | MWE | PERIOD | AUXVAL | DOUBLE PRECISION | value for the auxiliary variable. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWE | NAM | OPTIONS | LIST | STRING | is name of the listing file to create for this GWE model. If not specified, then the name of the list file will be the basename of the GWE model name file and the ``.lst'' extension. For example, if the GWE name file is called ``my.model.nam'' then the list file will be called ``my.model.lst''. | +| GWE | NAM | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of all model stress package information will be written to the listing file immediately after it is read. | +| GWE | NAM | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of all model package flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| GWE | NAM | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that all model package flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWE | NAM | PACKAGES | FTYPE | STRING | is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. | +| GWE | NAM | PACKAGES | FNAME | STRING | is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. | +| GWE | NAM | PACKAGES | PNAME | STRING | is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single GWE Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. | +| GWE | OC | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | +| GWE | OC | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | +| GWE | OC | OPTIONS | BUDGETFILE | STRING | name of the output file to write budget information. | +| GWE | OC | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | +| GWE | OC | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | +| GWE | OC | OPTIONS | TEMPERATURE | KEYWORD | keyword to specify that record corresponds to temperature. | +| GWE | OC | OPTIONS | TEMPERATUREFILE | STRING | name of the output file to write conc information. | +| GWE | OC | OPTIONS | PRINT_FORMAT | KEYWORD | keyword to specify format for printing to the listing file. | +| GWE | OC | OPTIONS | COLUMNS | INTEGER | number of columns for writing data. | +| GWE | OC | OPTIONS | WIDTH | INTEGER | width for writing each number. | +| GWE | OC | OPTIONS | DIGITS | INTEGER | number of digits to use for writing a number. | +| GWE | OC | OPTIONS | FORMAT | STRING | write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. | +| GWE | OC | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| GWE | OC | PERIOD | SAVE | KEYWORD | keyword to indicate that information will be saved this stress period. | +| GWE | OC | PERIOD | PRINT | KEYWORD | keyword to indicate that information will be printed this stress period. | +| GWE | OC | PERIOD | RTYPE | STRING | type of information to save or print. Can be BUDGET or TEMPERATURE. | +| GWE | OC | PERIOD | OCSETTING | KEYSTRING | specifies the steps for which the data will be saved. | +| GWE | OC | PERIOD | ALL | KEYWORD | keyword to indicate save for all time steps in period. | +| GWE | OC | PERIOD | FIRST | KEYWORD | keyword to indicate save for first step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | +| GWE | OC | PERIOD | LAST | KEYWORD | keyword to indicate save for last step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | +| GWE | OC | PERIOD | FREQUENCY | INTEGER | save at the specified time step frequency. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | +| GWE | OC | PERIOD | STEPS | INTEGER ( 0: - name = vd['name'] - if 'block' in vd: - block = vd['block'] + name = vd["name"] + if "block" in vd: + block = vd["block"] key = (name, block) else: key = name if key in vardict: raise Exception( - 'Variable already exists in dictionary: ' + name) + "Variable already exists in dictionary: " + name + ) vardict[key] = vd vd = {} continue # skip comments - if '#' in line.strip()[0]: + if "#" in line.strip()[0]: continue ll = line.strip().split() if len(ll) > 1: k = ll[0] - istart = line.index(' ') + istart = line.index(" ") v = line[istart:].strip() if k in vd: - raise Exception('Attribute already exists in dictionary: ' + k) + raise Exception("Attribute already exists in dictionary: " + k) vd[k] = v if len(vd) > 0: - name = vd['name'] - if 'block' in vd: - block = vd['block'] + name = vd["name"] + if "block" in vd: + block = vd["block"] key = (name, block) else: key = name if key in vardict: - raise Exception( - 'Variable already exists in dictionary: ' + name) + raise Exception("Variable already exists in dictionary: " + name) vardict[key] = vd return vardict -COMMONDESCRIPTIONS = parse_mf6var_file(os.path.join('.', 'dfn', 'common.dfn')) +COMMONDESCRIPTIONS = parse_mf6var_file(os.path.join(".", "dfn", "common.dfn")) VALID_TYPES = [ - 'integer', - 'double precision', - 'string', - 'keystring', - 'keyword', - 'recarray', - 'record', + "integer", + "double precision", + "string", + "keystring", + "keyword", + "recarray", + "record", ] -def block_entry(varname, block, vardict, prefix=' '): +def block_entry(varname, block, vardict, prefix=" "): key = (varname, block) v = vardict[key] - s = '{}'.format(varname.upper()) - if 'tagged' in v: - if v['tagged'] == 'false': - s = '' + s = "{}".format(varname.upper()) + if "tagged" in v: + if v["tagged"] == "false": + s = "" # set up the time series marker @ - tsmarker = '' - if 'time_series' in v: - if v['time_series'] == 'true': - tsmarker = '@' + tsmarker = "" + if "time_series" in v: + if v["time_series"] == "true": + tsmarker = "@" # check valid type - vtype = v['type'] + vtype = v["type"] if vtype == "double precision": pass elif " " in vtype: @@ -234,65 +233,67 @@ def block_entry(varname, block, vardict, prefix=' '): if vtype not in VALID_TYPES: raise ValueError( "{}: {}: {!r} is not a valid type from {}".format( - fname, key, vtype, VALID_TYPES) + fname, key, vtype, VALID_TYPES + ) ) # record or recarray - if v['type'].startswith('rec'): - varnames = v['type'].strip().split()[1:] - s = '' + if v["type"].startswith("rec"): + varnames = v["type"].strip().split()[1:] + s = "" for vn in varnames: - blockentry = block_entry(vn, block, vardict, prefix='') - s += '{} '.format(blockentry.strip()) - if v['type'].startswith('recarray'): + blockentry = block_entry(vn, block, vardict, prefix="") + s += "{} ".format(blockentry.strip()) + if v["type"].startswith("recarray"): s = s.strip() - s = '{}{}\n{}{}\n{}{}'.format('', s, prefix, s, prefix, '...') + s = "{}{}\n{}{}\n{}{}".format("", s, prefix, s, prefix, "...") # layered - elif v['reader'] in ['readarray', 'u1ddbl', 'u2ddbl', 'u1dint']: - shape = v['shape'] - reader = v['reader'].upper() - layered = '' - if 'layered' in v: - if v['layered'] == 'true': - layered = ' [LAYERED]' - s = '{}{}\n{}{}<{}{}> -- {}'.format(s, layered, prefix, prefix, - varname, - shape, reader) + elif v["reader"] in ["readarray", "u1ddbl", "u2ddbl", "u1dint"]: + shape = v["shape"] + reader = v["reader"].upper() + layered = "" + if "layered" in v: + if v["layered"] == "true": + layered = " [LAYERED]" + s = "{}{}\n{}{}<{}{}> -- {}".format( + s, layered, prefix, prefix, varname, shape, reader + ) # keyword - elif v['type'] != 'keyword': + elif v["type"] != "keyword": vtmp = varname - if 'shape' in v: - shape = v['shape'] + if "shape" in v: + shape = v["shape"] vtmp += shape - s = '{} <{}{}{}>'.format(s, tsmarker, vtmp, tsmarker) + s = "{} <{}{}{}>".format(s, tsmarker, vtmp, tsmarker) # if optional, wrap string in square brackets - if 'optional' in v: - if v['optional'] == 'true': - s = '[{}]'.format(s.strip()) + if "optional" in v: + if v["optional"] == "true": + s = "[{}]".format(s.strip()) # prepend with prefix and return string - s = '{}{}'.format(prefix, s) + s = "{}{}".format(prefix, s) return s -def write_block(vardict, block, blk_var_list, varexcludeprefix=None, - indent=None): +def write_block( + vardict, block, blk_var_list, varexcludeprefix=None, indent=None +): if indent is None: prepend = "" else: prepend = indent * " " - s = prepend + 'BEGIN {}'.format(block.upper()) + s = prepend + "BEGIN {}".format(block.upper()) for variable in blk_var_list: ts = block_entry(variable[0], block, vardict).strip() if variable[1]: - s = '{} [{}]'.format(s, ts) + s = "{} [{}]".format(s, ts) else: - s = '{} {}'.format(s, ts) - s += '\n' + s = "{} {}".format(s, ts) + s += "\n" for iv, key in enumerate(vardict): name, b = key v = vardict[key] @@ -304,23 +305,23 @@ def write_block(vardict, block, blk_var_list, varexcludeprefix=None, n = name.upper() if n.startswith(varexcludeprefix.upper()): addv = False - if 'in_record' in v: - if v['in_record'] == 'true': + if "in_record" in v: + if v["in_record"] == "true": # do not separately include this variable # because it is part of a record addv = False - if 'block_variable' in v: - if v['block_variable'] == 'true': + if "block_variable" in v: + if v["block_variable"] == "true": # do not separately include this variable # because it is part of a record addv = False - if 'deprecated' in v: - if v['deprecated'] != '': + if "deprecated" in v: + if v["deprecated"] != "": addv = False if addv: ts = block_entry(name, block, vardict, prefix=" " + prepend) - s += '{}\n'.format(ts) - s += prepend + 'END {}'.format(block.upper()) + s += "{}\n".format(ts) + s += prepend + "END {}".format(block.upper()) return s @@ -330,11 +331,11 @@ def get_description(desc): substitutions if so. """ - if desc.strip().split()[0] == 'REPLACE': + if desc.strip().split()[0] == "REPLACE": bcoption = desc.strip().split()[1] - constantstring = COMMONDESCRIPTIONS[bcoption]['description'] - istart = desc.index('{') - istop = desc.rfind('}') + 1 + constantstring = COMMONDESCRIPTIONS[bcoption]["description"] + istart = desc.index("{") + istop = desc.rfind("}") + 1 d = eval(desc[istart:istop]) # d = eval(desc[desc.index('{'):]) for k in d: @@ -345,13 +346,13 @@ def get_description(desc): def write_desc(vardict, block, blk_var_list, varexcludeprefix=None): - s = '' + s = "" for iv, (name, b) in enumerate(vardict): v = vardict[(name, b)] - if v['block'] == block: - if 'block_variable' in v and v['block_variable']: - optional = 'optional' in v and v['optional'] == 'true' - blk_var_list.append((v['name'], optional)) + if v["block"] == block: + if "block_variable" in v and v["block_variable"]: + optional = "optional" in v and v["optional"] == "true" + blk_var_list.append((v["name"], optional)) addv = True if varexcludeprefix is not None: # exclude variables that start with `dev_`. These are @@ -359,61 +360,61 @@ def write_desc(vardict, block, blk_var_list, varexcludeprefix=None): n = name.upper() if n.startswith(varexcludeprefix.upper()): addv = False - if v['type'].startswith('rec'): + if v["type"].startswith("rec"): addv = False - if 'deprecated' in v: - if v['deprecated'] != '': + if "deprecated" in v: + if v["deprecated"] != "": addv = False - if 'removed' in v: - if v['removed'] != '': + if "removed" in v: + if v["removed"] != "": addv = False if addv: - if v['type'] == 'keyword': + if v["type"] == "keyword": n = name.upper() else: - if 'tagged' in v: + if "tagged" in v: # could be used in future to write tag and name - n = '{}'.format(name) + n = "{}".format(name) else: n = name - n = n.replace('_', '\\_') - if 'description' in v: - desc = get_description(v['description']) + n = n.replace("_", "\\_") + if "description" in v: + desc = get_description(v["description"]) else: - msg = '' + msg = "" for k, v in v.items(): - msg += ' {}: {}\n'.format(k, v) + msg += " {}: {}\n".format(k, v) print(msg) raise Exception(msg) - ss = '\\texttt{' + n + '}---' + desc - if 'time_series' in v: - if v['time_series'] == 'true': - fmt = '\\textcolor{blue}\{\}' - ss = '\\textcolor{blue}{' + ss + '}' + ss = "\\texttt{" + n + "}---" + desc + if "time_series" in v: + if v["time_series"] == "true": + fmt = "\\textcolor{blue}\{\}" + ss = "\\textcolor{blue}{" + ss + "}" # \textcolor{declared-color}{text} - s += '\\item ' + ss + '\n\n' + s += "\\item " + ss + "\n\n" - t = v['type'] - if t.startswith('keystring'): + t = v["type"] + if t.startswith("keystring"): # s += '\\begin{verbatim}\n' - s += '\\begin{lstlisting}[style=blockdefinition]\n' + s += "\\begin{lstlisting}[style=blockdefinition]\n" for vn in t.strip().split()[1:]: - blockentry = block_entry(vn, block, vardict, '') - s += '{}\n'.format(blockentry) + blockentry = block_entry(vn, block, vardict, "") + s += "{}\n".format(blockentry) # s += '\\end{verbatim}\n\n' - s += '\\end{lstlisting}\n\n' + s += "\\end{lstlisting}\n\n" return s def write_desc_md(vardict, block, blk_var_list, varexcludeprefix=None): - s = '' + s = "" for iv, (name, b) in enumerate(vardict): v = vardict[(name, b)] - if v['block'] == block: - if 'block_variable' in v and v['block_variable']: - optional = 'optional' in v and v['optional'] == 'true' - blk_var_list.append((v['name'], optional)) + if v["block"] == block: + if "block_variable" in v and v["block_variable"]: + optional = "optional" in v and v["optional"] == "true" + blk_var_list.append((v["name"], optional)) addv = True if varexcludeprefix is not None: # exclude variables that start with `dev_`. These are @@ -421,45 +422,45 @@ def write_desc_md(vardict, block, blk_var_list, varexcludeprefix=None): n = name.upper() if n.startswith(varexcludeprefix.upper()): addv = False - if v['type'].startswith('rec'): + if v["type"].startswith("rec"): addv = False - if 'deprecated' in v: - if v['deprecated'] != '': + if "deprecated" in v: + if v["deprecated"] != "": addv = False - if 'removed' in v: - if v['removed'] != '': + if "removed" in v: + if v["removed"] != "": addv = False if addv: - if v['type'] == 'keyword': + if v["type"] == "keyword": n = name.upper() else: - if 'tagged' in v: + if "tagged" in v: # could be used in future to write tag and name - n = '{}'.format(name) + n = "{}".format(name) else: n = name - if 'description' in v: - desc = get_description(v['description']) + if "description" in v: + desc = get_description(v["description"]) else: - msg = '' + msg = "" for k, v in v.items(): - msg += ' {}: {}\n'.format(k, v) + msg += " {}: {}\n".format(k, v) print(msg) raise Exception(msg) desc = md_replace(desc) - ss = '`' + n + '` ' + desc - if 'time_series' in v: - if v['time_series'] == 'true': - ss = '' + ss + '' - s += ' * ' + ss + '\n\n' - - t = v['type'] - if t.startswith('keystring'): + ss = "`" + n + "` " + desc + if "time_series" in v: + if v["time_series"] == "true": + ss = '' + ss + "" + s += " * " + ss + "\n\n" + + t = v["type"] + if t.startswith("keystring"): for vn in t.strip().split()[1:]: blockentry = md_replace( block_entry(vn, block, vardict, 10 * " ") ) - s += '{}\n'.format(blockentry) + s += "{}\n".format(blockentry) return s @@ -470,7 +471,7 @@ def md_replace(s): re.compile("\\\\cite{(.*?)\\}"): ("\\cite{{{}}}", None), re.compile("\\\\citep{(.*?)\\}"): ("\\citep{{{}}}", None), re.compile("\\\\texttt{(.*?)\\}"): ("\\texttt{{{}}}", "`{}`"), - re.compile("\\$(.*?)\\$"): ("${}$", '{}'), + re.compile("\\$(.*?)\\$"): ("${}$", "{}"), re.compile("\\^{(.*?)\\}"): ("^{{{}}}", "{}"), re.compile("\\^(.*?)\\ "): ("^{:.1}", "{:.1}"), re.compile("\\``(.*?)\\''"): ("``{}''", '"{}"'), @@ -487,7 +488,7 @@ def md_replace(s): # replace individual characters replace_dict = { - "\mf": 'MODFLOW 6', + "\mf": "MODFLOW 6", "~": " ", "@": "", "$": "", @@ -505,9 +506,12 @@ def md_replace(s): def get_examples(component): pth = os.path.join("examples") - files = [filename for filename in sorted(os.listdir(pth)) if - component.lower() in filename.lower() and - "-obs" not in filename.lower()] + files = [ + filename + for filename in sorted(os.listdir(pth)) + if component.lower() in filename.lower() + and "-obs" not in filename.lower() + ] s = "" for idx, filename in enumerate(files): if idx == 0: @@ -515,7 +519,7 @@ def get_examples(component): if len(files) > 1: s += "Example {}\n\n".format(idx + 1) fpth = os.path.join(pth, filename) - with open(fpth, 'r') as f: + with open(fpth, "r") as f: lines = f.readlines() s += "```\n" for line in lines: @@ -527,16 +531,18 @@ def get_examples(component): def get_obs_examples(component): pth = os.path.join("examples") - files = [filename for filename in sorted(os.listdir(pth)) if - component.lower() in filename.lower() and - "-obs" in filename.lower()] + files = [ + filename + for filename in sorted(os.listdir(pth)) + if component.lower() in filename.lower() and "-obs" in filename.lower() + ] s = "" for idx, filename in enumerate(files): s += "#### Example Observation Input File\n" if len(files) > 1: s += "Example {}\n\n".format(idx + 1) fpth = os.path.join(pth, filename) - with open(fpth, 'r') as f: + with open(fpth, "r") as f: lines = f.readlines() s += "```\n" for line in lines: @@ -548,17 +554,24 @@ def get_obs_examples(component): def get_obs_table(component): pth = os.path.join("..", "..", "Common") - files = [filename for filename in sorted(os.listdir(pth)) if - component.lower() in filename.lower() and - filename.lower().endswith("obs.tex")] + files = [ + filename + for filename in sorted(os.listdir(pth)) + if component.lower() in filename.lower() + and filename.lower().endswith("obs.tex") + ] s = "" if files: s += "#### Available Observation Types\n\n" - s += "| Stress Package | Observation Type | ID1 | ID2 | Description |\n" - s += "|----------------|------------------|-----|-----|-------------|\n" + s += ( + "| Stress Package | Observation Type | ID1 | ID2 | Description |\n" + ) + s += ( + "|----------------|------------------|-----|-----|-------------|\n" + ) for idx, filename in enumerate(files): fpth = os.path.join(pth, filename) - with open(fpth, 'r') as f: + with open(fpth, "r") as f: lines = f.readlines() for line in lines: line = md_replace(line.rstrip()) @@ -575,14 +588,15 @@ def get_obs_table(component): def write_md_header(f): - s = '# MODFLOW 6 INPUT VARIABLES\n\n' + s = "# MODFLOW 6 INPUT VARIABLES\n\n" fmd.write(s) - s = '| {} | {} | {} | {} | {} | {} |\n'.format('component', 'package', - 'block', 'variable name', - 'type', 'description') + s = "| {} | {} | {} | {} | {} | {} |\n".format( + "component", "package", "block", "variable name", "type", "description" + ) fmd.write(s) - s = '| {} | {} | {} | {} | {} | {} |\n'.format(':---:', ':---:', ':---:', - ':---:', ':---:', '---') + s = "| {} | {} | {} | {} | {} | {} |\n".format( + ":---:", ":---:", ":---:", ":---:", ":---:", "---" + ) fmd.write(s) return @@ -593,142 +607,173 @@ def write_md(f, vardict, component, package): for iv, (name, b) in enumerate(vardict): n = name.upper() v = vardict[(name, b)] - b = v['block'].upper() - t = v['type'].upper() - s = '' - if t.startswith('REC'): + b = v["block"].upper() + t = v["type"].upper() + s = "" + if t.startswith("REC"): pass else: - if t.startswith('KEYSTRING'): - t = 'KEYSTRING' - t = '{}'.format(t) - if 'shape' in v: - shape = v['shape'].upper() - t = '{} {}'.format(t, shape) - d = get_description(v['description']) - s = '| {} | {} | {} | {} | {} | {} |\n'.format(c, p, b, n, t, d) + if t.startswith("KEYSTRING"): + t = "KEYSTRING" + t = "{}".format(t) + if "shape" in v: + shape = v["shape"].upper() + t = "{} {}".format(t, shape) + d = get_description(v["description"]) + s = "| {} | {} | {} | {} | {} | {} |\n".format(c, p, b, n, t, d) f.write(s) return def write_appendix(texdir, allblocks): - fname = os.path.join(texdir, 'appendixA.tex') - with open(fname, 'w') as f: - f.write('\\small\n\\begin{longtable}{p{1.5cm} p{1.5cm} p{3cm} c}\n') + fname = os.path.join(texdir, "appendixA.tex") + with open(fname, "w") as f: + f.write("\\small\n\\begin{longtable}{p{1.5cm} p{1.5cm} p{3cm} c}\n") f.write( - '\\caption{List of block names organized by component and input file ' - 'type. OPEN/CLOSE indicates whether or not the block information ' - 'can be contained in separate file} \\tabularnewline \n\n') - f.write('\\hline\n\\hline\n') + "\\caption{List of block names organized by component and input file " + "type. OPEN/CLOSE indicates whether or not the block information " + "can be contained in separate file} \\tabularnewline \n\n" + ) + f.write("\\hline\n\\hline\n") f.write( - '\\textbf{Component} & \\textbf{FTYPE} & \\textbf{Blockname} & \\textbf{OPEN/CLOSE} \\\\\n') - f.write('\\hline\n\\endfirsthead\n\n\n') + "\\textbf{Component} & \\textbf{FTYPE} & \\textbf{Blockname} & \\textbf{OPEN/CLOSE} \\\\\n" + ) + f.write("\\hline\n\\endfirsthead\n\n\n") - f.write('\captionsetup{textformat=simple}\n') - f.write('\caption*{\\textbf{Table A--\\arabic{table}.}{\quad}List of block' - ' names organized by component and input file type. OPEN/CLOSE ' - 'indicates whether or not the block information can be contained ' - 'in separate file.---Continued} \\tabularnewline\n') + f.write("\captionsetup{textformat=simple}\n") + f.write( + "\caption*{\\textbf{Table A--\\arabic{table}.}{\quad}List of block" + " names organized by component and input file type. OPEN/CLOSE " + "indicates whether or not the block information can be contained " + "in separate file.---Continued} \\tabularnewline\n" + ) - f.write('\n\\hline\n\\hline\n') + f.write("\n\\hline\n\\hline\n") f.write( - '\\textbf{Component} & \\textbf{FTYPE} & \\textbf{Blockname} & \\textbf{OPEN/CLOSE} \\\\\n') - f.write('\\hline\n\\endhead\n\n\\hline\n\\endfoot\n\n\n') + "\\textbf{Component} & \\textbf{FTYPE} & \\textbf{Blockname} & \\textbf{OPEN/CLOSE} \\\\\n" + ) + f.write("\\hline\n\\endhead\n\n\\hline\n\\endfoot\n\n\n") - lastftype = '' + lastftype = "" for b in allblocks: - l = b.strip().split('-') + l = b.strip().split("-") component, ftype, blockname = l if lastftype != ftype: - f.write('\\hline\n') - oc = 'yes' - if 'griddata' in blockname.lower(): - oc = 'no' - if 'utl' in component.lower() and \ - 'tas' in ftype.lower() and 'time' in blockname.lower(): - oc = 'no' - s = '{} & {} & {} & {} \\\\ \n'.format(component.upper(), - ftype.upper(), - blockname.upper(), oc) + f.write("\\hline\n") + oc = "yes" + if "griddata" in blockname.lower(): + oc = "no" + if ( + "utl" in component.lower() + and "tas" in ftype.lower() + and "time" in blockname.lower() + ): + oc = "no" + s = "{} & {} & {} & {} \\\\ \n".format( + component.upper(), ftype.upper(), blockname.upper(), oc + ) f.write(s) lastftype = ftype f.write( - '\n\n\\hline\n\\end{longtable}\n\\label{table:blocks}\n\\normalsize\n') - - -if __name__ == '__main__': - - file_order = ['sim-nam', # dfn completed tex updated - 'sim-tdis', # dfn completed tex updated - 'exg-gwfgwf', # dfn completed tex updated - 'exg-gwfgwt', - 'exg-gwtgwt', - 'sln-ims', # dfn completed tex updated - 'sln-ems', # dfn completed tex updated - 'gwf-nam', # dfn completed tex updated - 'gwf-dis', # dfn completed tex updated - 'gwf-disv', # dfn completed tex updated - 'gwf-disu', # dfn completed tex updated - 'gwf-ic', # dfn completed tex updated - 'gwf-npf', # dfn completed tex updated - 'gwf-buy', # dfn completed tex updated - 'gwf-sto', # dfn completed tex updated - 'gwf-csub', # dfn completed tex updated - 'gwf-hfb', # dfn completed tex updated - 'gwf-chd', # dfn completed tex updated - 'gwf-wel', # dfn completed tex updated - 'gwf-drn', # dfn completed tex updated - 'gwf-riv', # dfn completed tex updated - 'gwf-ghb', # dfn completed tex updated - 'gwf-rch', # dfn completed tex updated - 'gwf-rcha', # dfn completed tex updated - 'gwf-evt', # dfn completed tex updated - 'gwf-evta', # dfn completed tex updated - 'gwf-maw', # dfn completed tex updated - 'gwf-sfr', # dfn completed tex updated - 'gwf-lak', # dfn completed tex updated - 'gwf-uzf', # dfn completed tex updated - 'gwf-mvr', # dfn completed tex updated - 'gwf-gnc', # dfn completed tex updated - 'gwf-oc', # dfn completed tex updated - 'gwf-vsc', - 'gwf-api', - 'gwt-adv', - 'gwt-dsp', - 'gwt-cnc', - 'gwt-dis', - 'gwt-disv', - 'gwt-disu', - 'gwt-ic', - 'gwt-nam', - 'gwt-oc', - 'gwt-ssm', - 'gwt-src', - 'gwt-mst', - 'gwt-ist', - 'gwt-sft', - 'gwt-lkt', - 'gwt-mwt', - 'gwt-uzt', - 'gwt-fmi', - 'gwt-mvt', - 'gwt-api', - 'utl-spc', - 'utl-spca', - 'utl-obs', - 'utl-laktab', - 'utl-sfrtab', - 'utl-ts', - 'utl-tas', - 'utl-ats', - 'utl-tvk', - 'utl-tvs'] + "\n\n\\hline\n\\end{longtable}\n\\label{table:blocks}\n\\normalsize\n" + ) + + +if __name__ == "__main__": + file_order = [ + "sim-nam", # dfn completed tex updated + "sim-tdis", # dfn completed tex updated + "exg-gwfgwf", # dfn completed tex updated + "exg-gwfgwt", + "exg-gwtgwt", + "exg-gwfgwe", + "exg-gwegwe", + "sln-ims", # dfn completed tex updated + "sln-ems", # dfn completed tex updated + "gwf-nam", # dfn completed tex updated + "gwf-dis", # dfn completed tex updated + "gwf-disv", # dfn completed tex updated + "gwf-disu", # dfn completed tex updated + "gwf-ic", # dfn completed tex updated + "gwf-npf", # dfn completed tex updated + "gwf-buy", # dfn completed tex updated + "gwf-sto", # dfn completed tex updated + "gwf-csub", # dfn completed tex updated + "gwf-hfb", # dfn completed tex updated + "gwf-chd", # dfn completed tex updated + "gwf-wel", # dfn completed tex updated + "gwf-drn", # dfn completed tex updated + "gwf-riv", # dfn completed tex updated + "gwf-ghb", # dfn completed tex updated + "gwf-rch", # dfn completed tex updated + "gwf-rcha", # dfn completed tex updated + "gwf-evt", # dfn completed tex updated + "gwf-evta", # dfn completed tex updated + "gwf-maw", # dfn completed tex updated + "gwf-sfr", # dfn completed tex updated + "gwf-lak", # dfn completed tex updated + "gwf-uzf", # dfn completed tex updated + "gwf-mvr", # dfn completed tex updated + "gwf-gnc", # dfn completed tex updated + "gwf-oc", # dfn completed tex updated + "gwf-vsc", + "gwf-api", + "gwt-adv", + "gwt-dsp", + "gwt-cnc", + "gwt-dis", + "gwt-disv", + "gwt-disu", + "gwt-ic", + "gwt-nam", + "gwt-oc", + "gwt-ssm", + "gwt-src", + "gwt-mst", + "gwt-ist", + "gwt-sft", + "gwt-lkt", + "gwt-mwt", + "gwt-uzt", + "gwt-fmi", + "gwt-mvt", + "gwt-api", + "gwe-adv", + "gwe-cnd", + "gwe-ctp", + "gwe-dis", + "gwe-disv", + "gwe-disu", + "gwe-esl", + "gwe-est", + "gwe-ic", + "gwe-lke", + "gwe-mwe", + "gwe-nam", + "gwe-oc", + "gwe-ssm", + "gwe-sfe", + "gwe-uze", + "gwe-fmi", + "utl-spc", + "utl-spca", + "utl-spt", + "utl-spta", + "utl-obs", + "utl-laktab", + "utl-sfrtab", + "utl-ts", + "utl-tas", + "utl-ats", + "utl-tvk", + "utl-tvs", + ] # directories - dfndir = os.path.join('.', 'dfn') - texdir = os.path.join('.', 'tex') - mddir = os.path.join('.', 'md') + dfndir = os.path.join(".", "dfn") + texdir = os.path.join(".", "tex") + mddir = os.path.join(".", "md") docdir = os.path.join("..", "..", "..", ".build_rtd_docs", "_mf6io") # regenerate docdir @@ -740,20 +785,22 @@ def write_appendix(texdir, allblocks): allblocks = [] # setup a markdown file - fname = os.path.join(mddir, 'mf6ivar.md') - with open(fname, 'w') as fmd: + fname = os.path.join(mddir, "mf6ivar.md") + with open(fname, "w") as fmd: write_md_header(fmd) # construct list of dfn files to process in the order of file_order files = os.listdir(dfndir) for f in files: - if 'common' in f: + if "common" in f: continue - if '.DS_Store' in f: + if ".DS_Store" in f: continue if os.path.splitext(f)[0] not in file_order: - raise Exception('File not in file_order: ', f) - files = [fname + '.dfn' for fname in file_order if fname + '.dfn' in files] + raise Exception("File not in file_order: ", f) + files = [ + fname + ".dfn" for fname in file_order if fname + ".dfn" in files + ] # files = ['gwf-obs.dfn'] # # create rst file for markdown @@ -765,48 +812,57 @@ def write_appendix(texdir, allblocks): # frst.write(s) for txtname in files: - component, package = os.path.splitext(txtname)[0].split('-')[0:2] + component, package = os.path.splitext(txtname)[0].split("-")[0:2] vardict = parse_mf6var_file(os.path.join(dfndir, txtname)) # make list of unique block names blocks = [] for k in vardict: v = vardict[k] - b = v['block'] + b = v["block"] if b not in blocks: blocks.append(b) # add a full block name to allblocks for block in blocks: - b = '{}-{}-{}'.format(component, package, block) + b = "{}-{}-{}".format(component, package, block) allblocks.append(b) # go through each block and write information - desc = '% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py \n\n' + desc = "% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py \n\n" for b in blocks: blk_var_list = [] # Write the name of the block to the latex file - desc += '\item \\textbf{}\n\n'.format('{Block: ' + b.upper() + '}') - - desc += '\\begin{description}\n' - desc += write_desc(vardict, b, blk_var_list, - varexcludeprefix='dev_') - desc += '\\end{description}\n' - - fname = os.path.join(texdir, os.path.splitext(txtname)[ - 0] + '-' + b + '.dat') - f = open(fname, 'w') - s = write_block(vardict, b, blk_var_list, - varexcludeprefix='dev_') + '\n' + desc += "\item \\textbf{}\n\n".format( + "{Block: " + b.upper() + "}" + ) + + desc += "\\begin{description}\n" + desc += write_desc( + vardict, b, blk_var_list, varexcludeprefix="dev_" + ) + desc += "\\end{description}\n" + + fname = os.path.join( + texdir, os.path.splitext(txtname)[0] + "-" + b + ".dat" + ) + f = open(fname, "w") + s = ( + write_block( + vardict, b, blk_var_list, varexcludeprefix="dev_" + ) + + "\n" + ) f.write(s) if VERBOSE: print(s) f.close() - fname = os.path.join(texdir, - os.path.splitext(txtname)[0] + '-desc' + '.tex') - f = open(fname, 'w') - s = desc + '\n' + fname = os.path.join( + texdir, os.path.splitext(txtname)[0] + "-desc" + ".tex" + ) + f = open(fname, "w") + s = desc + "\n" f.write(s) if VERBOSE: print(s) @@ -814,8 +870,8 @@ def write_appendix(texdir, allblocks): # write markdown description mdname = os.path.splitext(txtname)[0] - fname = os.path.join(docdir, mdname + '.md') - f = open(fname, 'w') + fname = os.path.join(docdir, mdname + ".md") + f = open(fname, "w") f.write("### {}\n\n".format(mdname.upper())) f.write("#### Structure of Blocks\n\n") f.write("_FOR EACH SIMULATION_\n\n") @@ -824,17 +880,27 @@ def write_appendix(texdir, allblocks): blk_var_list = [] # Write the name of the block to the latex file - desc += '##### Block: {}\n\n'.format(b.upper()) + desc += "##### Block: {}\n\n".format(b.upper()) - desc += write_desc_md(vardict, b, blk_var_list, - varexcludeprefix='dev_') + desc += write_desc_md( + vardict, b, blk_var_list, varexcludeprefix="dev_" + ) if "period" in b.lower(): f.write("\n_FOR ANY STRESS PERIOD_\n\n") f.write("```\n") - s = md_replace(write_block(vardict, b, blk_var_list, - varexcludeprefix='dev_', - indent=4)) + "\n" + s = ( + md_replace( + write_block( + vardict, + b, + blk_var_list, + varexcludeprefix="dev_", + indent=4, + ) + ) + + "\n" + ) # s = s.replace("@", "") + "\n" f.write(s) f.write("```\n") @@ -877,5 +943,3 @@ def write_appendix(texdir, allblocks): for b in allblocks: print(b) write_appendix(texdir, allblocks) - - diff --git a/doc/mf6io/mf6ivar/tex/appendixA.tex b/doc/mf6io/mf6ivar/tex/appendixA.tex index 7cbb933e60e..b9581283c5e 100644 --- a/doc/mf6io/mf6ivar/tex/appendixA.tex +++ b/doc/mf6io/mf6ivar/tex/appendixA.tex @@ -41,6 +41,10 @@ EXG & GWTGWT & DIMENSIONS & yes \\ EXG & GWTGWT & EXCHANGEDATA & yes \\ \hline +EXG & GWEGWE & OPTIONS & yes \\ +EXG & GWEGWE & DIMENSIONS & yes \\ +EXG & GWEGWE & EXCHANGEDATA & yes \\ +\hline SLN & IMS & OPTIONS & yes \\ SLN & IMS & NONLINEAR & yes \\ SLN & IMS & LINEAR & yes \\ @@ -240,6 +244,71 @@ GWT & API & OPTIONS & yes \\ GWT & API & DIMENSIONS & yes \\ \hline +GWE & ADV & OPTIONS & yes \\ +\hline +GWE & CND & OPTIONS & yes \\ +GWE & CND & GRIDDATA & no \\ +\hline +GWE & CTP & OPTIONS & yes \\ +GWE & CTP & DIMENSIONS & yes \\ +GWE & CTP & PERIOD & yes \\ +\hline +GWE & DIS & OPTIONS & yes \\ +GWE & DIS & DIMENSIONS & yes \\ +GWE & DIS & GRIDDATA & no \\ +\hline +GWE & DISV & OPTIONS & yes \\ +GWE & DISV & DIMENSIONS & yes \\ +GWE & DISV & GRIDDATA & no \\ +GWE & DISV & VERTICES & yes \\ +GWE & DISV & CELL2D & yes \\ +\hline +GWE & DISU & OPTIONS & yes \\ +GWE & DISU & DIMENSIONS & yes \\ +GWE & DISU & GRIDDATA & no \\ +GWE & DISU & CONNECTIONDATA & yes \\ +GWE & DISU & VERTICES & yes \\ +GWE & DISU & CELL2D & yes \\ +\hline +GWE & ESL & OPTIONS & yes \\ +GWE & ESL & DIMENSIONS & yes \\ +GWE & ESL & PERIOD & yes \\ +\hline +GWE & EST & OPTIONS & yes \\ +GWE & EST & GRIDDATA & no \\ +GWE & EST & PACKAGEDATA & yes \\ +\hline +GWE & IC & GRIDDATA & no \\ +\hline +GWE & LKE & OPTIONS & yes \\ +GWE & LKE & PACKAGEDATA & yes \\ +GWE & LKE & PERIOD & yes \\ +\hline +GWE & MWE & OPTIONS & yes \\ +GWE & MWE & PACKAGEDATA & yes \\ +GWE & MWE & PERIOD & yes \\ +\hline +GWE & NAM & OPTIONS & yes \\ +GWE & NAM & PACKAGES & yes \\ +\hline +GWE & OC & OPTIONS & yes \\ +GWE & OC & PERIOD & yes \\ +\hline +GWE & SSM & OPTIONS & yes \\ +GWE & SSM & SOURCES & yes \\ +GWE & SSM & FILEINPUT & yes \\ +\hline +GWE & SFE & OPTIONS & yes \\ +GWE & SFE & PACKAGEDATA & yes \\ +GWE & SFE & PERIOD & yes \\ +\hline +GWE & UZE & OPTIONS & yes \\ +GWE & UZE & PACKAGEDATA & yes \\ +GWE & UZE & PERIOD & yes \\ +\hline +GWE & FMI & OPTIONS & yes \\ +GWE & FMI & PACKAGEDATA & yes \\ +\hline UTL & SPC & OPTIONS & yes \\ UTL & SPC & DIMENSIONS & yes \\ UTL & SPC & PERIOD & yes \\ @@ -247,6 +316,13 @@ UTL & SPCA & OPTIONS & yes \\ UTL & SPCA & PERIOD & yes \\ \hline +UTL & SPT & OPTIONS & yes \\ +UTL & SPT & DIMENSIONS & yes \\ +UTL & SPT & PERIOD & yes \\ +\hline +UTL & SPTA & OPTIONS & yes \\ +UTL & SPTA & PERIOD & yes \\ +\hline UTL & OBS & OPTIONS & yes \\ UTL & OBS & CONTINUOUS & yes \\ \hline diff --git a/doc/mf6io/mf6ivar/tex/exg-gwegwe-desc.tex b/doc/mf6io/mf6ivar/tex/exg-gwegwe-desc.tex new file mode 100644 index 00000000000..1aac574010d --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/exg-gwegwe-desc.tex @@ -0,0 +1,63 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{gwfmodelname1}---keyword to specify name of first corresponding GWF Model. In the simulation name file, the GWE6-GWE6 entry contains names for GWE Models (exgmnamea and exgmnameb). The GWE Model with the name exgmnamea must correspond to the GWF Model with the name gwfmodelname1. + +\item \texttt{gwfmodelname2}---keyword to specify name of second corresponding GWF Model. In the simulation name file, the GWE6-GWE6 entry contains names for GWE Models (exgmnamea and exgmnameb). The GWE Model with the name exgmnameb must correspond to the GWF Model with the name gwfmodelname2. + +\item \texttt{auxiliary}---an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWF-GWF Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' is provided in the description of the DISU Package. If an auxiliary variable with the name ``CDIST'' is found, then this information will be used as the straight-line connection distance, including the vertical component, between the two cell centers. Both ANGLDEGX and CDIST are required if specific discharge is calculated for either of the groundwater models. + +\item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of GWE Exchange cells. + +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of exchange entries will be echoed to the listing file immediately after it is read. + +\item \texttt{PRINT\_FLOWS}---keyword to indicate that the list of exchange flow rates will be printed to the listing file for every stress period in which ``SAVE BUDGET'' is specified in Output Control. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that cell-by-cell flow terms will be written to the budget file for each model provided that the Output Control for the models are set up with the ``BUDGET SAVE FILE'' option. + +\item \texttt{adv\_scheme}---scheme used to solve the advection term. Can be upstream, central, or TVD. If not specified, upstream weighting is the default weighting scheme. + +\item \texttt{CND\_XT3D\_OFF}---deactivate the xt3d method for the dispersive flux and use the faster and less accurate approximation for this exchange. + +\item \texttt{CND\_XT3D\_RHS}---add xt3d dispersion terms to right-hand side, when possible, for this exchange. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{MVE6}---keyword to specify that record corresponds to an energy transport mover file. + +\item \texttt{mve6\_filename}---is the file name of the transport mover input file to apply to this exchange. Information for the transport mover are provided in the file provided with these keywords. + +\item \texttt{OBS6}---keyword to specify that record corresponds to an observations file. + +\item \texttt{obs6\_filename}---is the file name of the observations input file for this exchange. See the ``Observation utility'' section for instructions for preparing observation input files. Table \ref{table:gwe-obstypetable} lists observation type(s) supported by the GWE-GWE package. + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{nexg}---keyword and integer value specifying the number of GWE-GWE exchanges. + +\end{description} +\item \textbf{Block: EXCHANGEDATA} + +\begin{description} +\item \texttt{cellidm1}---is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. + +\item \texttt{cellidm2}---is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. + +\item \texttt{ihc}---is an integer flag indicating the direction between node n and all of its m connections. If IHC = 0 then the connection is vertical. If IHC = 1 then the connection is horizontal. If IHC = 2 then the connection is horizontal for a vertically staggered grid. + +\item \texttt{cl1}---is the distance between the center of cell 1 and the its shared face with cell 2. + +\item \texttt{cl2}---is the distance between the center of cell 2 and the its shared face with cell 1. + +\item \texttt{hwva}---is the horizontal width of the flow connection between cell 1 and cell 2 if IHC $>$ 0, or it is the area perpendicular to flow of the vertical connection between cell 1 and cell 2 if IHC = 0. + +\item \texttt{aux}---represents the values of the auxiliary variables for each GWEGWE Exchange. The values of auxiliary variables must be present for each exchange. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. + +\item \texttt{boundname}---name of the GWE Exchange cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/exg-gwegwe-dimensions.dat b/doc/mf6io/mf6ivar/tex/exg-gwegwe-dimensions.dat new file mode 100644 index 00000000000..405fdc5cdf7 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/exg-gwegwe-dimensions.dat @@ -0,0 +1,3 @@ +BEGIN DIMENSIONS + NEXG +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/exg-gwegwe-exchangedata.dat b/doc/mf6io/mf6ivar/tex/exg-gwegwe-exchangedata.dat new file mode 100644 index 00000000000..c11fc9ce016 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/exg-gwegwe-exchangedata.dat @@ -0,0 +1,5 @@ +BEGIN EXCHANGEDATA + [] [] + [] [] + ... +END EXCHANGEDATA diff --git a/doc/mf6io/mf6ivar/tex/exg-gwegwe-options.dat b/doc/mf6io/mf6ivar/tex/exg-gwegwe-options.dat new file mode 100644 index 00000000000..bb69493d8ea --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/exg-gwegwe-options.dat @@ -0,0 +1,14 @@ +BEGIN OPTIONS + GWFMODELNAME1 + GWFMODELNAME2 + [AUXILIARY ] + [BOUNDNAMES] + [PRINT_INPUT] + [PRINT_FLOWS] + [SAVE_FLOWS] + [ADV_SCHEME ] + [CND_XT3D_OFF] + [CND_XT3D_RHS] + [MVE6 FILEIN ] + [OBS6 FILEIN ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/exg-gwfgwe-desc.tex b/doc/mf6io/mf6ivar/tex/exg-gwfgwe-desc.tex new file mode 100644 index 00000000000..bf95ac4119f --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/exg-gwfgwe-desc.tex @@ -0,0 +1,3 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + + diff --git a/doc/mf6io/mf6ivar/tex/gwe-adv-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-adv-desc.tex new file mode 100644 index 00000000000..fc18c7d2f3b --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-adv-desc.tex @@ -0,0 +1,9 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{scheme}---scheme used to solve the advection term. Can be upstream, central, or TVD. If not specified, upstream weighting is the default weighting scheme. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-adv-options.dat b/doc/mf6io/mf6ivar/tex/gwe-adv-options.dat new file mode 100644 index 00000000000..9ecafe688f1 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-adv-options.dat @@ -0,0 +1,3 @@ +BEGIN OPTIONS + [SCHEME ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-cnd-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-cnd-desc.tex new file mode 100644 index 00000000000..c1d37b1c117 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-cnd-desc.tex @@ -0,0 +1,29 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{XT3D\_OFF}---deactivate the xt3d method and use the faster and less accurate approximation. This option may provide a fast and accurate solution under some circumstances, such as when flow aligns with the model grid, there is no mechanical dispersion, or when the longitudinal and transverse dispersivities are equal. This option may also be used to assess the computational demand of the XT3D approach by noting the run time differences with and without this option on. + +\item \texttt{XT3D\_RHS}---add xt3d terms to right-hand side, when possible. This option uses less memory, but may require more iterations. + +\end{description} +\item \textbf{Block: GRIDDATA} + +\begin{description} +\item \texttt{alh}---longitudinal dispersivity in horizontal direction. If flow is strictly horizontal, then this is the longitudinal dispersivity that will be used. If flow is not strictly horizontal or strictly vertical, then the longitudinal dispersivity is a function of both ALH and ALV. If mechanical dispersion is represented (by specifying any dispersivity values) then this array is required. + +\item \texttt{alv}---longitudinal dispersivity in vertical direction. If flow is strictly vertical, then this is the longitudinal dispsersivity value that will be used. If flow is not strictly horizontal or strictly vertical, then the longitudinal dispersivity is a function of both ALH and ALV. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ALH. + +\item \texttt{ath1}---transverse dispersivity in horizontal direction. This is the transverse dispersivity value for the second ellipsoid axis. If flow is strictly horizontal and directed in the x direction (along a row for a regular grid), then this value controls spreading in the y direction. If mechanical dispersion is represented (by specifying any dispersivity values) then this array is required. + +\item \texttt{ath2}---transverse dispersivity in horizontal direction. This is the transverse dispersivity value for the third ellipsoid axis. If flow is strictly horizontal and directed in the x direction (along a row for a regular grid), then this value controls spreading in the z direction. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ATH1. + +\item \texttt{atv}---transverse dispersivity when flow is in vertical direction. If flow is strictly vertical and directed in the z direction, then this value controls spreading in the x and y directions. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ATH2. + +\item \texttt{ktw}---thermal conductivity of the simulated fluid + +\item \texttt{kts}---thermal conductivity of the aquifer material + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-cnd-griddata.dat b/doc/mf6io/mf6ivar/tex/gwe-cnd-griddata.dat new file mode 100644 index 00000000000..ea8514e771b --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-cnd-griddata.dat @@ -0,0 +1,16 @@ +BEGIN GRIDDATA + [ALH [LAYERED] + -- READARRAY] + [ALV [LAYERED] + -- READARRAY] + [ATH1 [LAYERED] + -- READARRAY] + [ATH2 [LAYERED] + -- READARRAY] + [ATV [LAYERED] + -- READARRAY] + [KTW [LAYERED] + -- READARRAY] + [KTS [LAYERED] + -- READARRAY] +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/gwe-cnd-options.dat b/doc/mf6io/mf6ivar/tex/gwe-cnd-options.dat new file mode 100644 index 00000000000..8fd75f9d224 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-cnd-options.dat @@ -0,0 +1,4 @@ +BEGIN OPTIONS + [XT3D_OFF] + [XT3D_RHS] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-ctp-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-ctp-desc.tex new file mode 100644 index 00000000000..5fd2b217104 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-ctp-desc.tex @@ -0,0 +1,49 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{auxiliary}---defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. + +\item \texttt{auxmultname}---name of auxiliary variable to be used as multiplier of temperature value. + +\item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of constant temperature cells. + +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of constant temperature information will be written to the listing file immediately after it is read. + +\item \texttt{PRINT\_FLOWS}---keyword to indicate that the list of constant temperature flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that constant temperature flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\item \texttt{TS6}---keyword to specify that record corresponds to a time-series file. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{ts6\_filename}---defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. + +\item \texttt{OBS6}---keyword to specify that record corresponds to an observations file. + +\item \texttt{obs6\_filename}---name of input file to define observations for the Constant Temperature package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the Constant Temperature package. + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{maxbound}---integer value specifying the maximum number of constant temperatures cells that will be specified for use during any stress period. + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. + +\item \texttt{cellid}---is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. + +\item \textcolor{blue}{\texttt{temp}---is the constant temperature value. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{aux}---represents the values of the auxiliary variables for each constant temperature. The values of auxiliary variables must be present for each constant temperature. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \texttt{boundname}---name of the constant temperature cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-ctp-dimensions.dat b/doc/mf6io/mf6ivar/tex/gwe-ctp-dimensions.dat new file mode 100644 index 00000000000..7b4c7bf6ec7 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-ctp-dimensions.dat @@ -0,0 +1,3 @@ +BEGIN DIMENSIONS + MAXBOUND +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-ctp-options.dat b/doc/mf6io/mf6ivar/tex/gwe-ctp-options.dat new file mode 100644 index 00000000000..0985bd51e40 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-ctp-options.dat @@ -0,0 +1,10 @@ +BEGIN OPTIONS + [AUXILIARY ] + [AUXMULTNAME ] + [BOUNDNAMES] + [PRINT_INPUT] + [PRINT_FLOWS] + [SAVE_FLOWS] + [TS6 FILEIN ] + [OBS6 FILEIN ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-ctp-period.dat b/doc/mf6io/mf6ivar/tex/gwe-ctp-period.dat new file mode 100644 index 00000000000..71db20fc4ec --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-ctp-period.dat @@ -0,0 +1,5 @@ +BEGIN PERIOD + <@temp@> [<@aux(naux)@>] [] + <@temp@> [<@aux(naux)@>] [] + ... +END PERIOD diff --git a/doc/mf6io/mf6ivar/tex/gwe-dis-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-dis-desc.tex new file mode 100644 index 00000000000..afef5a5fa76 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-dis-desc.tex @@ -0,0 +1,41 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{length\_units}---is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. + +\item \texttt{NOGRB}---keyword to deactivate writing of the binary grid file. + +\item \texttt{xorigin}---x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\item \texttt{yorigin}---y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{nlay}---is the number of layers in the model grid. + +\item \texttt{nrow}---is the number of rows in the model grid. + +\item \texttt{ncol}---is the number of columns in the model grid. + +\end{description} +\item \textbf{Block: GRIDDATA} + +\begin{description} +\item \texttt{delr}---is the column spacing in the row direction. + +\item \texttt{delc}---is the row spacing in the column direction. + +\item \texttt{top}---is the top elevation for each cell in the top model layer. + +\item \texttt{botm}---is the bottom elevation for each cell. + +\item \texttt{idomain}---is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-dis-dimensions.dat b/doc/mf6io/mf6ivar/tex/gwe-dis-dimensions.dat new file mode 100644 index 00000000000..227d0e1f799 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-dis-dimensions.dat @@ -0,0 +1,5 @@ +BEGIN DIMENSIONS + NLAY + NROW + NCOL +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-dis-griddata.dat b/doc/mf6io/mf6ivar/tex/gwe-dis-griddata.dat new file mode 100644 index 00000000000..daae94c0ee3 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-dis-griddata.dat @@ -0,0 +1,12 @@ +BEGIN GRIDDATA + DELR + -- READARRAY + DELC + -- READARRAY + TOP + -- READARRAY + BOTM [LAYERED] + -- READARRAY + [IDOMAIN [LAYERED] + -- READARRAY] +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/gwe-dis-options.dat b/doc/mf6io/mf6ivar/tex/gwe-dis-options.dat new file mode 100644 index 00000000000..67e3ed895ae --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-dis-options.dat @@ -0,0 +1,7 @@ +BEGIN OPTIONS + [LENGTH_UNITS ] + [NOGRB] + [XORIGIN ] + [YORIGIN ] + [ANGROT ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-disu-cell2d.dat b/doc/mf6io/mf6ivar/tex/gwe-disu-cell2d.dat new file mode 100644 index 00000000000..27900d67235 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-disu-cell2d.dat @@ -0,0 +1,5 @@ +BEGIN CELL2D + + + ... +END CELL2D diff --git a/doc/mf6io/mf6ivar/tex/gwe-disu-connectiondata.dat b/doc/mf6io/mf6ivar/tex/gwe-disu-connectiondata.dat new file mode 100644 index 00000000000..9623a8be839 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-disu-connectiondata.dat @@ -0,0 +1,14 @@ +BEGIN CONNECTIONDATA + IAC + -- READARRAY + JA + -- READARRAY + IHC + -- READARRAY + CL12 + -- READARRAY + HWVA + -- READARRAY + [ANGLDEGX + -- READARRAY] +END CONNECTIONDATA diff --git a/doc/mf6io/mf6ivar/tex/gwe-disu-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-disu-desc.tex new file mode 100644 index 00000000000..14d67b19f02 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-disu-desc.tex @@ -0,0 +1,81 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{length\_units}---is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. + +\item \texttt{NOGRB}---keyword to deactivate writing of the binary grid file. + +\item \texttt{xorigin}---x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\item \texttt{yorigin}---y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\item \texttt{vertical\_offset\_tolerance}---checks are performed to ensure that the top of a cell is not higher than the bottom of an overlying cell. This option can be used to specify the tolerance that is used for checking. If top of a cell is above the bottom of an overlying cell by a value less than this tolerance, then the program will not terminate with an error. The default value is zero. This option should generally not be used. + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{nodes}---is the number of cells in the model grid. + +\item \texttt{nja}---is the sum of the number of connections and NODES. When calculating the total number of connections, the connection between cell n and cell m is considered to be different from the connection between cell m and cell n. Thus, NJA is equal to the total number of connections, including n to m and m to n, and the total number of cells. + +\item \texttt{nvert}---is the total number of (x, y) vertex pairs used to define the plan-view shape of each cell in the model grid. If NVERT is not specified or is specified as zero, then the VERTICES and CELL2D blocks below are not read. NVERT and the accompanying VERTICES and CELL2D blocks should be specified for most simulations. If the XT3D or SAVE\_SPECIFIC\_DISCHARGE options are specified in the NPF Package, then this information is required. + +\end{description} +\item \textbf{Block: GRIDDATA} + +\begin{description} +\item \texttt{top}---is the top elevation for each cell in the model grid. + +\item \texttt{bot}---is the bottom elevation for each cell. + +\item \texttt{area}---is the cell surface area (in plan view). + +\item \texttt{idomain}---is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1 or greater, the cell exists in the simulation. IDOMAIN values of -1 cannot be specified for the DISU Package. + +\end{description} +\item \textbf{Block: CONNECTIONDATA} + +\begin{description} +\item \texttt{iac}---is the number of connections (plus 1) for each cell. The sum of all the entries in IAC must be equal to NJA. + +\item \texttt{ja}---is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWE cells and their connections to the other GWE cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code. + +\item \texttt{ihc}---is an index array indicating the direction between node n and all of its m connections. If IHC = 0 then cell n and cell m are connected in the vertical direction. Cell n overlies cell m if the cell number for n is less than m; cell m overlies cell n if the cell number for m is less than n. If IHC = 1 then cell n and cell m are connected in the horizontal direction. If IHC = 2 then cell n and cell m are connected in the horizontal direction, and the connection is vertically staggered. A vertically staggered connection is one in which a cell is horizontally connected to more than one cell in a horizontal connection. + +\item \texttt{cl12}---is the array containing connection lengths between the center of cell n and the shared face with each adjacent m cell. + +\item \texttt{hwva}---is a symmetric array of size NJA. For horizontal connections, entries in HWVA are the horizontal width perpendicular to flow. For vertical connections, entries in HWVA are the vertical area for flow. Thus, values in the HWVA array contain dimensions of both length and area. Entries in the HWVA array have a one-to-one correspondence with the connections specified in the JA array. Likewise, there is a one-to-one correspondence between entries in the HWVA array and entries in the IHC array, which specifies the connection type (horizontal or vertical). Entries in the HWVA array must be symmetric; the program will terminate with an error if the value for HWVA for an n to m connection does not equal the value for HWVA for the corresponding n to m connection. + +\item \texttt{angldegx}---is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specifed in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. + +\end{description} +\item \textbf{Block: VERTICES} + +\begin{description} +\item \texttt{iv}---is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. + +\item \texttt{xv}---is the x-coordinate for the vertex. + +\item \texttt{yv}---is the y-coordinate for the vertex. + +\end{description} +\item \textbf{Block: CELL2D} + +\begin{description} +\item \texttt{icell2d}---is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES. + +\item \texttt{xc}---is the x-coordinate for the cell center. + +\item \texttt{yc}---is the y-coordinate for the cell center. + +\item \texttt{ncvert}---is the number of vertices required to define the cell. There may be a different number of vertices for each cell. + +\item \texttt{icvert}---is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-disu-dimensions.dat b/doc/mf6io/mf6ivar/tex/gwe-disu-dimensions.dat new file mode 100644 index 00000000000..56d54756a40 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-disu-dimensions.dat @@ -0,0 +1,5 @@ +BEGIN DIMENSIONS + NODES + NJA + [NVERT ] +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-disu-griddata.dat b/doc/mf6io/mf6ivar/tex/gwe-disu-griddata.dat new file mode 100644 index 00000000000..2978f43b84e --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-disu-griddata.dat @@ -0,0 +1,10 @@ +BEGIN GRIDDATA + TOP + -- READARRAY + BOT + -- READARRAY + AREA + -- READARRAY + [IDOMAIN + -- READARRAY] +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/gwe-disu-options.dat b/doc/mf6io/mf6ivar/tex/gwe-disu-options.dat new file mode 100644 index 00000000000..281b79a4a27 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-disu-options.dat @@ -0,0 +1,8 @@ +BEGIN OPTIONS + [LENGTH_UNITS ] + [NOGRB] + [XORIGIN ] + [YORIGIN ] + [ANGROT ] + [VERTICAL_OFFSET_TOLERANCE ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-disu-vertices.dat b/doc/mf6io/mf6ivar/tex/gwe-disu-vertices.dat new file mode 100644 index 00000000000..6831f23b5ff --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-disu-vertices.dat @@ -0,0 +1,5 @@ +BEGIN VERTICES + + + ... +END VERTICES diff --git a/doc/mf6io/mf6ivar/tex/gwe-disv-cell2d.dat b/doc/mf6io/mf6ivar/tex/gwe-disv-cell2d.dat new file mode 100644 index 00000000000..27900d67235 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-disv-cell2d.dat @@ -0,0 +1,5 @@ +BEGIN CELL2D + + + ... +END CELL2D diff --git a/doc/mf6io/mf6ivar/tex/gwe-disv-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-disv-desc.tex new file mode 100644 index 00000000000..dac7917328f --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-disv-desc.tex @@ -0,0 +1,61 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{length\_units}---is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. + +\item \texttt{NOGRB}---keyword to deactivate writing of the binary grid file. + +\item \texttt{xorigin}---x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\item \texttt{yorigin}---y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{nlay}---is the number of layers in the model grid. + +\item \texttt{ncpl}---is the number of cells per layer. This is a constant value for the grid and it applies to all layers. + +\item \texttt{nvert}---is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. + +\end{description} +\item \textbf{Block: GRIDDATA} + +\begin{description} +\item \texttt{top}---is the top elevation for each cell in the top model layer. + +\item \texttt{botm}---is the bottom elevation for each cell. + +\item \texttt{idomain}---is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. + +\end{description} +\item \textbf{Block: VERTICES} + +\begin{description} +\item \texttt{iv}---is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. + +\item \texttt{xv}---is the x-coordinate for the vertex. + +\item \texttt{yv}---is the y-coordinate for the vertex. + +\end{description} +\item \textbf{Block: CELL2D} + +\begin{description} +\item \texttt{icell2d}---is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. + +\item \texttt{xc}---is the x-coordinate for the cell center. + +\item \texttt{yc}---is the y-coordinate for the cell center. + +\item \texttt{ncvert}---is the number of vertices required to define the cell. There may be a different number of vertices for each cell. + +\item \texttt{icvert}---is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-disv-dimensions.dat b/doc/mf6io/mf6ivar/tex/gwe-disv-dimensions.dat new file mode 100644 index 00000000000..b05791a77b3 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-disv-dimensions.dat @@ -0,0 +1,5 @@ +BEGIN DIMENSIONS + NLAY + NCPL + NVERT +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-disv-griddata.dat b/doc/mf6io/mf6ivar/tex/gwe-disv-griddata.dat new file mode 100644 index 00000000000..e263cb1d7bb --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-disv-griddata.dat @@ -0,0 +1,8 @@ +BEGIN GRIDDATA + TOP + -- READARRAY + BOTM [LAYERED] + -- READARRAY + [IDOMAIN [LAYERED] + -- READARRAY] +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/gwe-disv-options.dat b/doc/mf6io/mf6ivar/tex/gwe-disv-options.dat new file mode 100644 index 00000000000..67e3ed895ae --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-disv-options.dat @@ -0,0 +1,7 @@ +BEGIN OPTIONS + [LENGTH_UNITS ] + [NOGRB] + [XORIGIN ] + [YORIGIN ] + [ANGROT ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-disv-vertices.dat b/doc/mf6io/mf6ivar/tex/gwe-disv-vertices.dat new file mode 100644 index 00000000000..6831f23b5ff --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-disv-vertices.dat @@ -0,0 +1,5 @@ +BEGIN VERTICES + + + ... +END VERTICES diff --git a/doc/mf6io/mf6ivar/tex/gwe-esl-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-esl-desc.tex new file mode 100644 index 00000000000..b330d892aaa --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-esl-desc.tex @@ -0,0 +1,49 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{auxiliary}---defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. + +\item \texttt{auxmultname}---name of auxiliary variable to be used as multiplier of energy loading rate. + +\item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of energy source loading cells. + +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of energy source loading information will be written to the listing file immediately after it is read. + +\item \texttt{PRINT\_FLOWS}---keyword to indicate that the list of energy source loading flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that energy source loading flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\item \texttt{TS6}---keyword to specify that record corresponds to a time-series file. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{ts6\_filename}---defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. + +\item \texttt{OBS6}---keyword to specify that record corresponds to an observations file. + +\item \texttt{obs6\_filename}---name of input file to define observations for the Energy Source Loading package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the Energy Source Loading package. + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{maxbound}---integer value specifying the maximum number of sources cells that will be specified for use during any stress period. + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. + +\item \texttt{cellid}---is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. + +\item \textcolor{blue}{\texttt{senerrate}---is the energy source loading rate. A positive value indicates addition of energy and a negative value indicates removal of energy. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{aux}---represents the values of the auxiliary variables for each energy source. The values of auxiliary variables must be present for each energy source. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \texttt{boundname}---name of the energy source cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-esl-dimensions.dat b/doc/mf6io/mf6ivar/tex/gwe-esl-dimensions.dat new file mode 100644 index 00000000000..7b4c7bf6ec7 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-esl-dimensions.dat @@ -0,0 +1,3 @@ +BEGIN DIMENSIONS + MAXBOUND +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-esl-options.dat b/doc/mf6io/mf6ivar/tex/gwe-esl-options.dat new file mode 100644 index 00000000000..0985bd51e40 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-esl-options.dat @@ -0,0 +1,10 @@ +BEGIN OPTIONS + [AUXILIARY ] + [AUXMULTNAME ] + [BOUNDNAMES] + [PRINT_INPUT] + [PRINT_FLOWS] + [SAVE_FLOWS] + [TS6 FILEIN ] + [OBS6 FILEIN ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-esl-period.dat b/doc/mf6io/mf6ivar/tex/gwe-esl-period.dat new file mode 100644 index 00000000000..1d90784538b --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-esl-period.dat @@ -0,0 +1,5 @@ +BEGIN PERIOD + <@senerrate@> [<@aux(naux)@>] [] + <@senerrate@> [<@aux(naux)@>] [] + ... +END PERIOD diff --git a/doc/mf6io/mf6ivar/tex/gwe-est-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-est-desc.tex new file mode 100644 index 00000000000..bf787adc828 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-est-desc.tex @@ -0,0 +1,35 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{SAVE\_FLOWS}---keyword to indicate that EST flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\item \texttt{ZERO\_ORDER\_DECAY}---is a text keyword to indicate that zero-order decay will occur. Use of this keyword requires that DECAY and DECAY\_SORBED (if sorption is active) are specified in the GRIDDATA block. + +\item \texttt{LATENT\_HEAT\_VAPORIZATION}---is a text keyword to indicate that cooling associated with evaporation will occur. Use of this keyword requires that LATHEATVAP are specified in the GRIDDATA block. While the EST package does not simulate evaporation, multiple other packages in a GWE simulation may. For example, evaporation may occur from the surface of streams or lakes. Owing to the energy consumed by the change in phase, the latent heat of vaporization is required. + +\end{description} +\item \textbf{Block: GRIDDATA} + +\begin{description} +\item \texttt{porosity}---is the mobile domain porosity, defined as the mobile domain pore volume per mobile domain volume. The GWE model does not support the concept of an immobile domain in the context of heat transport. + +\item \texttt{decay}---is the rate coefficient for zero-order decay for the aqueous phase of the mobile domain. A negative value indicates heat (energy) production. The dimensions of decay for zero-order decay is energy per length cubed per time. Zero-order decay will have no effect on simulation results unless zero-order decay is specified in the options block. + +\item \texttt{cps}---is the mass-based heat capacity of dry solids (aquifer material). For example, units of J/kg/C may be used (or equivalent). + +\item \texttt{rhos}---is a user-specified value of the density of aquifer material not considering the voids. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kg/m3. + +\end{description} +\item \textbf{Block: PACKAGEDATA} + +\begin{description} +\item \texttt{cpw}---is the mass-based heat capacity of the simulated fluid. For example, units of J/kg/C may be used (or equivalent). + +\item \texttt{rhow}---is a user-specified value of the density of water. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kg/m3. + +\item \texttt{latheatvap}---is the user-specified value for the latent heat of vaporization. For example, if working in SI units, values may be entered as kJ/kg. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-est-griddata.dat b/doc/mf6io/mf6ivar/tex/gwe-est-griddata.dat new file mode 100644 index 00000000000..b67c69b58c4 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-est-griddata.dat @@ -0,0 +1,10 @@ +BEGIN GRIDDATA + POROSITY [LAYERED] + -- READARRAY + [DECAY [LAYERED] + -- READARRAY] + CPS [LAYERED] + -- READARRAY + RHOS [LAYERED] + -- READARRAY +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/gwe-est-options.dat b/doc/mf6io/mf6ivar/tex/gwe-est-options.dat new file mode 100644 index 00000000000..4b459df2f8f --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-est-options.dat @@ -0,0 +1,5 @@ +BEGIN OPTIONS + [SAVE_FLOWS] + [ZERO_ORDER_DECAY] + [LATENT_HEAT_VAPORIZATION] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-est-packagedata.dat b/doc/mf6io/mf6ivar/tex/gwe-est-packagedata.dat new file mode 100644 index 00000000000..d94a5a61d14 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-est-packagedata.dat @@ -0,0 +1,5 @@ +BEGIN PACKAGEDATA + + + ... +END PACKAGEDATA diff --git a/doc/mf6io/mf6ivar/tex/gwe-fmi-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-fmi-desc.tex new file mode 100644 index 00000000000..b9279ac8597 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-fmi-desc.tex @@ -0,0 +1,21 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{SAVE\_FLOWS}---keyword to indicate that FMI flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\item \texttt{FLOW\_IMBALANCE\_CORRECTION}---correct for an imbalance in flows by assuming that any residual flow error comes in or leaves at the temperature of the cell. When this option is activated, the GWE Model budget written to the listing file will contain two additional entries: FLOW-ERROR and FLOW-CORRECTION. These two entries will be equal but opposite in sign. The FLOW-CORRECTION term is a mass flow that is added to offset the error caused by an imprecise flow balance. If these terms are not relatively small, the flow model should be rerun with stricter convergence tolerances. + +\end{description} +\item \textbf{Block: PACKAGEDATA} + +\begin{description} +\item \texttt{flowtype}---is the word GWFBUDGET, GWFHEAD, GWFMOVER or the name of an advanced GWF stress package. If GWFBUDGET is specified, then the corresponding file must be a budget file from a previous GWF Model run. If an advanced GWF stress package name appears then the corresponding file must be the budget file saved by a LAK, SFR, MAW or UZF Package. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{fname}---is the name of the file containing flows. The path to the file should be included if the file is not located in the folder where the program was run. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-fmi-options.dat b/doc/mf6io/mf6ivar/tex/gwe-fmi-options.dat new file mode 100644 index 00000000000..d5ceb2575c8 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-fmi-options.dat @@ -0,0 +1,4 @@ +BEGIN OPTIONS + [SAVE_FLOWS] + [FLOW_IMBALANCE_CORRECTION] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-fmi-packagedata.dat b/doc/mf6io/mf6ivar/tex/gwe-fmi-packagedata.dat new file mode 100644 index 00000000000..85d840ad9ef --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-fmi-packagedata.dat @@ -0,0 +1,5 @@ +BEGIN PACKAGEDATA + FILEIN + FILEIN + ... +END PACKAGEDATA diff --git a/doc/mf6io/mf6ivar/tex/gwe-ic-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-ic-desc.tex new file mode 100644 index 00000000000..7cf8d73b07a --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-ic-desc.tex @@ -0,0 +1,9 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: GRIDDATA} + +\begin{description} +\item \texttt{strt}---is the initial (starting) temperature---that is, the temperature at the beginning of the GWE Model simulation. STRT must be specified for all GWE Model simulations. One value is read for every model cell. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-ic-griddata.dat b/doc/mf6io/mf6ivar/tex/gwe-ic-griddata.dat new file mode 100644 index 00000000000..260626850a7 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-ic-griddata.dat @@ -0,0 +1,4 @@ +BEGIN GRIDDATA + STRT [LAYERED] + -- READARRAY +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/gwe-lke-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-lke-desc.tex new file mode 100644 index 00000000000..7a240c13d5d --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-lke-desc.tex @@ -0,0 +1,101 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{flow\_package\_name}---keyword to specify the name of the corresponding flow package. If not specified, then the corresponding flow package must have the same name as this advanced transport package (the name associated with this package in the GWE name file). + +\item \texttt{auxiliary}---defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. + +\item \texttt{flow\_package\_auxiliary\_name}---keyword to specify the name of an auxiliary variable in the corresponding flow package. If specified, then the simulated temperatures from this advanced transport package will be copied into the auxiliary variable specified with this name. Note that the flow package must have an auxiliary variable with this name or the program will terminate with an error. If the flows for this advanced transport package are read from a file, then this option will have no effect. + +\item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of lake cells. + +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of lake information will be written to the listing file immediately after it is read. + +\item \texttt{PRINT\_TEMPERATURE}---keyword to indicate that the list of lake temperature will be printed to the listing file for every stress period in which ``TEMPERATURE PRINT'' is specified in Output Control. If there is no Output Control option and PRINT\_TEMPERATURE is specified, then temperature are printed for the last time step of each stress period. + +\item \texttt{PRINT\_FLOWS}---keyword to indicate that the list of lake flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that lake flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\item \texttt{TEMPERATURE}---keyword to specify that record corresponds to temperature. + +\item \texttt{tempfile}---name of the binary output file to write temperature information. + +\item \texttt{BUDGET}---keyword to specify that record corresponds to the budget. + +\item \texttt{FILEOUT}---keyword to specify that an output filename is expected next. + +\item \texttt{budgetfile}---name of the binary output file to write budget information. + +\item \texttt{BUDGETCSV}---keyword to specify that record corresponds to the budget CSV. + +\item \texttt{budgetcsvfile}---name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. + +\item \texttt{TS6}---keyword to specify that record corresponds to a time-series file. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{ts6\_filename}---defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. + +\item \texttt{OBS6}---keyword to specify that record corresponds to an observations file. + +\item \texttt{obs6\_filename}---name of input file to define observations for the LKE package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the LKE package. + +\end{description} +\item \textbf{Block: PACKAGEDATA} + +\begin{description} +\item \texttt{lakeno}---integer value that defines the lake number associated with the specified PACKAGEDATA data on the line. LAKENO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once. + +\item \texttt{strt}---real value that defines the starting temperature for the lake. + +\item \texttt{ktf}---is the thermal conductivity of the of the interface between the aquifer cell and the lake. + +\item \texttt{rbthcnd}---real value that defines the thickness of the lakebed material through which conduction occurs. Must be greater than 0. + +\item \textcolor{blue}{\texttt{aux}---represents the values of the auxiliary variables for each lake. The values of auxiliary variables must be present for each lake. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \texttt{boundname}---name of the lake cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. + +\item \texttt{lakeno}---integer value that defines the lake number associated with the specified PERIOD data on the line. LAKENO must be greater than zero and less than or equal to NLAKES. + +\item \texttt{laksetting}---line of information that is parsed into a keyword and values. Keyword values that can be used to start the LAKSETTING string include: STATUS, TEMPERATURE, RAINFALL, EVAPORATION, RUNOFF, and AUXILIARY. These settings are used to assign the temperature associated with the corresponding flow terms. Temperatures cannot be specified for all flow terms. For example, the Lake Package supports a ``WITHDRAWAL'' flow term. If this withdrawal term is active, then water will be withdrawn from the lake at the calculated temperature of the lake. + +\begin{lstlisting}[style=blockdefinition] +STATUS +TEMPERATURE <@temperature@> +RAINFALL <@rainfall@> +EVAPORATION <@evaporation@> +RUNOFF <@runoff@> +EXT-INFLOW <@ext-inflow@> +AUXILIARY <@auxval@> +\end{lstlisting} + +\item \texttt{status}---keyword option to define lake status. STATUS can be ACTIVE, INACTIVE, or CONSTANT. By default, STATUS is ACTIVE, which means that temperature will be calculated for the lake. If a lake is inactive, then there will be no solute mass fluxes into or out of the lake and the inactive value will be written for the lake temperature. If a lake is constant, then the temperature for the lake will be fixed at the user specified value. + +\item \textcolor{blue}{\texttt{temperature}---real or character value that defines the temperature for the lake. The specified TEMPERATURE is only applied if the lake is a constant temperature lake. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{rainfall}---real or character value that defines the rainfall temperature for the lake. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{evaporation}---real or character value that defines the temperature of evaporated water $(^{\circ}C)$ for the reach. If this temperature value is larger than the simulated temperature in the reach, then the evaporated water will be removed at the same temperature as the reach. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{runoff}---real or character value that defines the temperature of runoff for the lake. Value must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{ext-inflow}---real or character value that defines the temperature of external inflow for the lake. Value must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \texttt{AUXILIARY}---keyword for specifying auxiliary variable. + +\item \texttt{auxname}---name for the auxiliary variable to be assigned AUXVAL. AUXNAME must match one of the auxiliary variable names defined in the OPTIONS block. If AUXNAME does not match one of the auxiliary variable names defined in the OPTIONS block the data are ignored. + +\item \textcolor{blue}{\texttt{auxval}---value for the auxiliary variable. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-lke-options.dat b/doc/mf6io/mf6ivar/tex/gwe-lke-options.dat new file mode 100644 index 00000000000..ef83c7fa718 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-lke-options.dat @@ -0,0 +1,15 @@ +BEGIN OPTIONS + [FLOW_PACKAGE_NAME ] + [AUXILIARY ] + [FLOW_PACKAGE_AUXILIARY_NAME ] + [BOUNDNAMES] + [PRINT_INPUT] + [PRINT_TEMPERATURE] + [PRINT_FLOWS] + [SAVE_FLOWS] + [TEMPERATURE FILEOUT ] + [BUDGET FILEOUT ] + [BUDGETCSV FILEOUT ] + [TS6 FILEIN ] + [OBS6 FILEIN ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-lke-packagedata.dat b/doc/mf6io/mf6ivar/tex/gwe-lke-packagedata.dat new file mode 100644 index 00000000000..74aaecb370e --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-lke-packagedata.dat @@ -0,0 +1,5 @@ +BEGIN PACKAGEDATA + [<@aux(naux)@>] [] + [<@aux(naux)@>] [] + ... +END PACKAGEDATA diff --git a/doc/mf6io/mf6ivar/tex/gwe-lke-period.dat b/doc/mf6io/mf6ivar/tex/gwe-lke-period.dat new file mode 100644 index 00000000000..dfe899b47ef --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-lke-period.dat @@ -0,0 +1,5 @@ +BEGIN PERIOD + + + ... +END PERIOD diff --git a/doc/mf6io/mf6ivar/tex/gwe-mwe-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-mwe-desc.tex new file mode 100644 index 00000000000..04ee7036eb2 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-mwe-desc.tex @@ -0,0 +1,92 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{flow\_package\_name}---keyword to specify the name of the corresponding flow package. If not specified, then the corresponding flow package must have the same name as this advanced transport package (the name associated with this package in the GWE name file). + +\item \texttt{auxiliary}---defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. + +\item \texttt{flow\_package\_auxiliary\_name}---keyword to specify the name of an auxiliary variable in the corresponding flow package. If specified, then the simulated temperatures from this advanced transport package will be copied into the auxiliary variable specified with this name. Note that the flow package must have an auxiliary variable with this name or the program will terminate with an error. If the flows for this advanced transport package are read from a file, then this option will have no effect. + +\item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of well cells. + +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of well information will be written to the listing file immediately after it is read. + +\item \texttt{PRINT\_TEMPERATURE}---keyword to indicate that the list of well temperature will be printed to the listing file for every stress period in which ``TEMPERATURE PRINT'' is specified in Output Control. If there is no Output Control option and PRINT\_TEMPERATURE is specified, then temperature are printed for the last time step of each stress period. + +\item \texttt{PRINT\_FLOWS}---keyword to indicate that the list of well flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that well flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\item \texttt{TEMPERATURE}---keyword to specify that record corresponds to temperature. + +\item \texttt{tempfile}---name of the binary output file to write temperature information. + +\item \texttt{BUDGET}---keyword to specify that record corresponds to the budget. + +\item \texttt{FILEOUT}---keyword to specify that an output filename is expected next. + +\item \texttt{budgetfile}---name of the binary output file to write budget information. + +\item \texttt{BUDGETCSV}---keyword to specify that record corresponds to the budget CSV. + +\item \texttt{budgetcsvfile}---name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. + +\item \texttt{TS6}---keyword to specify that record corresponds to a time-series file. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{ts6\_filename}---defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. + +\item \texttt{OBS6}---keyword to specify that record corresponds to an observations file. + +\item \texttt{obs6\_filename}---name of input file to define observations for the MWE package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the MWE package. + +\end{description} +\item \textbf{Block: PACKAGEDATA} + +\begin{description} +\item \texttt{mawno}---integer value that defines the well number associated with the specified PACKAGEDATA data on the line. MAWNO must be greater than zero and less than or equal to NMAWWELLS. Well information must be specified for every well or the program will terminate with an error. The program will also terminate with an error if information for a well is specified more than once. + +\item \texttt{strt}---real value that defines the starting temperature for the well. + +\item \texttt{ktf}---is the thermal conductivity of the of the interface between the aquifer cell and the feature. + +\item \texttt{fthk}---real value that defines the thickness of the material through which conduction occurs. Must be greater than 0. + +\item \textcolor{blue}{\texttt{aux}---represents the values of the auxiliary variables for each well. The values of auxiliary variables must be present for each well. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \texttt{boundname}---name of the well cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. + +\item \texttt{mawno}---integer value that defines the well number associated with the specified PERIOD data on the line. MAWNO must be greater than zero and less than or equal to NMAWWELLS. + +\item \texttt{mwesetting}---line of information that is parsed into a keyword and values. Keyword values that can be used to start the MWESETTING string include: STATUS, TEMPERATURE, RAINFALL, EVAPORATION, RUNOFF, and AUXILIARY. These settings are used to assign the temperature of associated with the corresponding flow terms. Temperatures cannot be specified for all flow terms. For example, the Multi-Aquifer Well Package supports a ``WITHDRAWAL'' flow term. If this withdrawal term is active, then water will be withdrawn from the well at the calculated temperature of the well. + +\begin{lstlisting}[style=blockdefinition] +STATUS +TEMPERATURE <@temperature@> +RATE <@rate@> +AUXILIARY <@auxval@> +\end{lstlisting} + +\item \texttt{status}---keyword option to define well status. STATUS can be ACTIVE, INACTIVE, or CONSTANT. By default, STATUS is ACTIVE, which means that temperature will be calculated for the well. If a well is inactive, then there will be no solute mass fluxes into or out of the well and the inactive value will be written for the well temperature. If a well is constant, then the temperature for the well will be fixed at the user specified value. + +\item \textcolor{blue}{\texttt{temperature}---real or character value that defines the temperature for the well. The specified TEMPERATURE is only applied if the well is a constant temperature well. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{rate}---real or character value that defines the injection solute temperature $^{\circ}C$ for the well. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \texttt{AUXILIARY}---keyword for specifying auxiliary variable. + +\item \texttt{auxname}---name for the auxiliary variable to be assigned AUXVAL. AUXNAME must match one of the auxiliary variable names defined in the OPTIONS block. If AUXNAME does not match one of the auxiliary variable names defined in the OPTIONS block the data are ignored. + +\item \textcolor{blue}{\texttt{auxval}---value for the auxiliary variable. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-mwe-options.dat b/doc/mf6io/mf6ivar/tex/gwe-mwe-options.dat new file mode 100644 index 00000000000..ef83c7fa718 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-mwe-options.dat @@ -0,0 +1,15 @@ +BEGIN OPTIONS + [FLOW_PACKAGE_NAME ] + [AUXILIARY ] + [FLOW_PACKAGE_AUXILIARY_NAME ] + [BOUNDNAMES] + [PRINT_INPUT] + [PRINT_TEMPERATURE] + [PRINT_FLOWS] + [SAVE_FLOWS] + [TEMPERATURE FILEOUT ] + [BUDGET FILEOUT ] + [BUDGETCSV FILEOUT ] + [TS6 FILEIN ] + [OBS6 FILEIN ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-mwe-packagedata.dat b/doc/mf6io/mf6ivar/tex/gwe-mwe-packagedata.dat new file mode 100644 index 00000000000..0d46cfac181 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-mwe-packagedata.dat @@ -0,0 +1,5 @@ +BEGIN PACKAGEDATA + [<@aux(naux)@>] [] + [<@aux(naux)@>] [] + ... +END PACKAGEDATA diff --git a/doc/mf6io/mf6ivar/tex/gwe-mwe-period.dat b/doc/mf6io/mf6ivar/tex/gwe-mwe-period.dat new file mode 100644 index 00000000000..4c9a183703a --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-mwe-period.dat @@ -0,0 +1,5 @@ +BEGIN PERIOD + + + ... +END PERIOD diff --git a/doc/mf6io/mf6ivar/tex/gwe-nam-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-nam-desc.tex new file mode 100644 index 00000000000..c42592c0fa3 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-nam-desc.tex @@ -0,0 +1,25 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{list}---is name of the listing file to create for this GWE model. If not specified, then the name of the list file will be the basename of the GWE model name file and the ``.lst'' extension. For example, if the GWE name file is called ``my.model.nam'' then the list file will be called ``my.model.lst''. + +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of all model stress package information will be written to the listing file immediately after it is read. + +\item \texttt{PRINT\_FLOWS}---keyword to indicate that the list of all model package flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that all model package flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\end{description} +\item \textbf{Block: PACKAGES} + +\begin{description} +\item \texttt{ftype}---is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. + +\item \texttt{fname}---is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. + +\item \texttt{pname}---is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single GWE Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-nam-options.dat b/doc/mf6io/mf6ivar/tex/gwe-nam-options.dat new file mode 100644 index 00000000000..a65ebd5e24d --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-nam-options.dat @@ -0,0 +1,6 @@ +BEGIN OPTIONS + [LIST ] + [PRINT_INPUT] + [PRINT_FLOWS] + [SAVE_FLOWS] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-nam-packages.dat b/doc/mf6io/mf6ivar/tex/gwe-nam-packages.dat new file mode 100644 index 00000000000..ee5dc814ee7 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-nam-packages.dat @@ -0,0 +1,5 @@ +BEGIN PACKAGES + [] + [] + ... +END PACKAGES diff --git a/doc/mf6io/mf6ivar/tex/gwe-oc-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-oc-desc.tex new file mode 100644 index 00000000000..5cf6ff3a1d4 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-oc-desc.tex @@ -0,0 +1,63 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{BUDGET}---keyword to specify that record corresponds to the budget. + +\item \texttt{FILEOUT}---keyword to specify that an output filename is expected next. + +\item \texttt{budgetfile}---name of the output file to write budget information. + +\item \texttt{BUDGETCSV}---keyword to specify that record corresponds to the budget CSV. + +\item \texttt{budgetcsvfile}---name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. + +\item \texttt{TEMPERATURE}---keyword to specify that record corresponds to temperature. + +\item \texttt{temperaturefile}---name of the output file to write conc information. + +\item \texttt{PRINT\_FORMAT}---keyword to specify format for printing to the listing file. + +\item \texttt{columns}---number of columns for writing data. + +\item \texttt{width}---width for writing each number. + +\item \texttt{digits}---number of digits to use for writing a number. + +\item \texttt{format}---write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. + +\item \texttt{SAVE}---keyword to indicate that information will be saved this stress period. + +\item \texttt{PRINT}---keyword to indicate that information will be printed this stress period. + +\item \texttt{rtype}---type of information to save or print. Can be BUDGET or TEMPERATURE. + +\item \texttt{ocsetting}---specifies the steps for which the data will be saved. + +\begin{lstlisting}[style=blockdefinition] +ALL +FIRST +LAST +FREQUENCY +STEPS +\end{lstlisting} + +\item \texttt{ALL}---keyword to indicate save for all time steps in period. + +\item \texttt{FIRST}---keyword to indicate save for first step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +\item \texttt{LAST}---keyword to indicate save for last step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +\item \texttt{frequency}---save at the specified time step frequency. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +\item \texttt{steps}---save for each step specified in STEPS. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-oc-options.dat b/doc/mf6io/mf6ivar/tex/gwe-oc-options.dat new file mode 100644 index 00000000000..aedf37e5832 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-oc-options.dat @@ -0,0 +1,6 @@ +BEGIN OPTIONS + [BUDGET FILEOUT ] + [BUDGETCSV FILEOUT ] + [TEMPERATURE FILEOUT ] + [TEMPERATURE PRINT_FORMAT COLUMNS WIDTH DIGITS ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-oc-period.dat b/doc/mf6io/mf6ivar/tex/gwe-oc-period.dat new file mode 100644 index 00000000000..abcceee3794 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-oc-period.dat @@ -0,0 +1,4 @@ +BEGIN PERIOD + [SAVE ] + [PRINT ] +END PERIOD diff --git a/doc/mf6io/mf6ivar/tex/gwe-sfe-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-sfe-desc.tex new file mode 100644 index 00000000000..af8496fe18d --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-sfe-desc.tex @@ -0,0 +1,101 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{flow\_package\_name}---keyword to specify the name of the corresponding flow package. If not specified, then the corresponding flow package must have the same name as this advanced transport package (the name associated with this package in the GWE name file). + +\item \texttt{auxiliary}---defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. + +\item \texttt{flow\_package\_auxiliary\_name}---keyword to specify the name of an auxiliary variable provided in the corresponding flow package (i.e., FLOW\_PACKAE\_NAME). If specified, then the simulated temperatures from this advanced energy transport package will be copied into the auxiliary variable specified with this name. Note that the flow package must have an auxiliary variable with this name or the program will terminate with an error. If the flows for this advanced energy transport package are read from a file, then this option will have no effect. + +\item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of reach cells. + +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of reach information will be written to the listing file immediately after it is read. + +\item \texttt{PRINT\_TEMPERATURE}---keyword to indicate that the list of reach temperatures will be printed to the listing file for every stress period in which ``TEMPERATURE PRINT'' is specified in Output Control. If there is no Output Control option and PRINT\_TEMPERATURE is specified, then temperatures are printed for the last time step of each stress period. + +\item \texttt{PRINT\_FLOWS}---keyword to indicate that the list of reach flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that reach flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\item \texttt{TEMPERATURE}---keyword to specify that record corresponds to temperature. + +\item \texttt{tempfile}---name of the binary output file to write temperature information. + +\item \texttt{BUDGET}---keyword to specify that record corresponds to the budget. + +\item \texttt{FILEOUT}---keyword to specify that an output filename is expected next. + +\item \texttt{budgetfile}---name of the binary output file to write budget information. + +\item \texttt{BUDGETCSV}---keyword to specify that record corresponds to the budget CSV. + +\item \texttt{budgetcsvfile}---name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. + +\item \texttt{TS6}---keyword to specify that record corresponds to a time-series file. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{ts6\_filename}---defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. + +\item \texttt{OBS6}---keyword to specify that record corresponds to an observations file. + +\item \texttt{obs6\_filename}---name of input file to define observations for the SFT package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the SFT package. + +\end{description} +\item \textbf{Block: PACKAGEDATA} + +\begin{description} +\item \texttt{rno}---integer value that defines the reach number associated with the specified PACKAGEDATA data on the line. RNO must be greater than zero and less than or equal to NREACHES. Reach information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if information for a reach is specified more than once. + +\item \texttt{strt}---real value that defines the starting temperature for the reach. + +\item \texttt{ktf}---is the thermal conductivity of the of the interface between the aquifer cell and the stream reach. + +\item \texttt{rbthcnd}---real value that defines the thickness of the streambed material through which conduction occurs. Must be greater than 0. + +\item \textcolor{blue}{\texttt{aux}---represents the values of the auxiliary variables for each reach. The values of auxiliary variables must be present for each reach. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \texttt{boundname}---name of the reach cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. + +\item \texttt{rno}---integer value that defines the reach number associated with the specified PERIOD data on the line. RNO must be greater than zero and less than or equal to NREACHES. + +\item \texttt{reachsetting}---line of information that is parsed into a keyword and values. Keyword values that can be used to start the REACHSETTING string include: STATUS, TEMPERATURE, RAINFALL, EVAPORATION, RUNOFF, and AUXILIARY. These settings are used to assign the temperature of associated with the corresponding flow terms. Temperatures cannot be specified for all flow terms. For example, the Streamflow Package supports a ``DIVERSION'' flow term. Diversion water will be routed using the calculated temperature of the reach. + +\begin{lstlisting}[style=blockdefinition] +STATUS +TEMPERATURE <@temperature@> +RAINFALL <@rainfall@> +EVAPORATION <@evaporation@> +RUNOFF <@runoff@> +INFLOW <@inflow@> +AUXILIARY <@auxval@> +\end{lstlisting} + +\item \texttt{status}---keyword option to define reach status. STATUS can be ACTIVE, INACTIVE, or CONSTANT. By default, STATUS is ACTIVE, which means that temperature will be calculated for the reach. If a reach is inactive, then there will be no energy fluxes into or out of the reach and the inactive value will be written for the reach temperature. If a reach is constant, then the temperature for the reach will be fixed at the user specified value. + +\item \textcolor{blue}{\texttt{temperature}---real or character value that defines the temperature for the reach. The specified TEMPERATURE is only applied if the reach is a constant temperature reach. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{rainfall}---real or character value that defines the rainfall temperature $(^{\circ}C)$ for the reach. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{evaporation}---real or character value that defines the temperature of evaporated water $(^{\circ}C)$ for the reach. If this temperature value is larger than the simulated temperature in the reach, then the evaporated water will be removed at the same temperature as the reach. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{runoff}---real or character value that defines the temperature of runoff $(^{\circ}C)$ for the reach. Value must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{inflow}---real or character value that defines the temperature of inflow $(^{\circ}C)$ for the reach. Value must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \texttt{AUXILIARY}---keyword for specifying auxiliary variable. + +\item \texttt{auxname}---name for the auxiliary variable to be assigned AUXVAL. AUXNAME must match one of the auxiliary variable names defined in the OPTIONS block. If AUXNAME does not match one of the auxiliary variable names defined in the OPTIONS block the data are ignored. + +\item \textcolor{blue}{\texttt{auxval}---value for the auxiliary variable. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-sfe-options.dat b/doc/mf6io/mf6ivar/tex/gwe-sfe-options.dat new file mode 100644 index 00000000000..ef83c7fa718 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-sfe-options.dat @@ -0,0 +1,15 @@ +BEGIN OPTIONS + [FLOW_PACKAGE_NAME ] + [AUXILIARY ] + [FLOW_PACKAGE_AUXILIARY_NAME ] + [BOUNDNAMES] + [PRINT_INPUT] + [PRINT_TEMPERATURE] + [PRINT_FLOWS] + [SAVE_FLOWS] + [TEMPERATURE FILEOUT ] + [BUDGET FILEOUT ] + [BUDGETCSV FILEOUT ] + [TS6 FILEIN ] + [OBS6 FILEIN ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-sfe-packagedata.dat b/doc/mf6io/mf6ivar/tex/gwe-sfe-packagedata.dat new file mode 100644 index 00000000000..d75a5bae2d0 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-sfe-packagedata.dat @@ -0,0 +1,5 @@ +BEGIN PACKAGEDATA + [<@aux(naux)@>] [] + [<@aux(naux)@>] [] + ... +END PACKAGEDATA diff --git a/doc/mf6io/mf6ivar/tex/gwe-sfe-period.dat b/doc/mf6io/mf6ivar/tex/gwe-sfe-period.dat new file mode 100644 index 00000000000..1b56b2824e2 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-sfe-period.dat @@ -0,0 +1,5 @@ +BEGIN PERIOD + + + ... +END PERIOD diff --git a/doc/mf6io/mf6ivar/tex/gwe-ssm-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-ssm-desc.tex new file mode 100644 index 00000000000..41ce8867b95 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-ssm-desc.tex @@ -0,0 +1,35 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{PRINT\_FLOWS}---keyword to indicate that the list of SSM flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that SSM flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\end{description} +\item \textbf{Block: SOURCES} + +\begin{description} +\item \texttt{pname}---name of the flow package for which an auxiliary variable contains a source temperature. If this flow package is represented using an advanced transport package (SFE, LKE, MWE, or UZE), then the advanced transport package will override SSM terms specified here. + +\item \texttt{srctype}---keyword indicating how temperature will be assigned for sources and sinks. Keyword must be specified as either AUX or AUXMIXED. For both options the user must provide an auxiliary variable in the corresponding flow package. The auxiliary variable must have the same name as the AUXNAME value that follows. If the AUX keyword is specified, then the auxiliary variable specified by the user will be assigned as the concenration value for groundwater sources (flows with a positive sign). For negative flow rates (sinks), groundwater will be withdrawn from the cell at the simulated temperature of the cell. The AUXMIXED option provides an alternative method for how to determine the temperature of sinks. If the cell temperature is larger than the user-specified auxiliary temperature, then the temperature of groundwater withdrawn from the cell will be assigned as the user-specified temperature. Alternatively, if the user-specified auxiliary temperature is larger than the cell temperature, then groundwater will be withdrawn at the cell temperature. Thus, the AUXMIXED option is designed to work with the Evapotranspiration (EVT) and Recharge (RCH) Packages where water may be withdrawn at a temperature that is less than the cell temperature. + +\item \texttt{auxname}---name of the auxiliary variable in the package PNAME. This auxiliary variable must exist and be specified by the user in that package. The values in this auxiliary variable will be used to set the temperature associated with the flows for that boundary package. + +\end{description} +\item \textbf{Block: FILEINPUT} + +\begin{description} +\item \texttt{pname}---name of the flow package for which an SPT6 input file contains a source temperature. If this flow package is represented using an advanced transport package (SFE, LKE, MWE, or UZE), then the advanced transport package will override SSM terms specified here. + +\item \texttt{SPT6}---keyword to specify that record corresponds to a source sink mixing input file. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{spt6\_filename}---character string that defines the path and filename for the file containing source and sink input data for the flow package. The SPT6\_FILENAME file is a flexible input file that allows temperatures to be specified by stress period and with time series. Instructions for creating the SPT6\_FILENAME input file are provided in the next section on file input for boundary temperatures. + +\item \texttt{MIXED}---keyword to specify that these stress package boundaries will have the mixed condition. The MIXED condition is described in the SOURCES block for AUXMIXED. The MIXED condition allows for water to be withdrawn at a temperature that is less than the cell temperature. It is intended primarily for representing evapotranspiration. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-ssm-fileinput.dat b/doc/mf6io/mf6ivar/tex/gwe-ssm-fileinput.dat new file mode 100644 index 00000000000..9f931f3daf3 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-ssm-fileinput.dat @@ -0,0 +1,5 @@ +BEGIN FILEINPUT + SPT6 FILEIN [MIXED] + SPT6 FILEIN [MIXED] + ... +END FILEINPUT diff --git a/doc/mf6io/mf6ivar/tex/gwe-ssm-options.dat b/doc/mf6io/mf6ivar/tex/gwe-ssm-options.dat new file mode 100644 index 00000000000..de7ccf03076 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-ssm-options.dat @@ -0,0 +1,4 @@ +BEGIN OPTIONS + [PRINT_FLOWS] + [SAVE_FLOWS] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-ssm-sources.dat b/doc/mf6io/mf6ivar/tex/gwe-ssm-sources.dat new file mode 100644 index 00000000000..82557990b00 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-ssm-sources.dat @@ -0,0 +1,5 @@ +BEGIN SOURCES + + + ... +END SOURCES diff --git a/doc/mf6io/mf6ivar/tex/gwe-uze-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-uze-desc.tex new file mode 100644 index 00000000000..791b8dd9404 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-uze-desc.tex @@ -0,0 +1,91 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{flow\_package\_name}---keyword to specify the name of the corresponding flow package. If not specified, then the corresponding flow package must have the same name as this advanced transport package (the name associated with this package in the GWE name file). + +\item \texttt{auxiliary}---defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. + +\item \texttt{flow\_package\_auxiliary\_name}---keyword to specify the name of an auxiliary variable in the corresponding flow package. If specified, then the simulated concentrations from this advanced transport package will be copied into the auxiliary variable specified with this name. Note that the flow package must have an auxiliary variable with this name or the program will terminate with an error. If the flows for this advanced transport package are read from a file, then this option will have no effect. + +\item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of unsaturated zone flow cells. + +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of unsaturated zone flow information will be written to the listing file immediately after it is read. + +\item \texttt{PRINT\_TEMPERATURE}---keyword to indicate that the list of UZF cell temperatures will be printed to the listing file for every stress period in which ``TEMPERATURE PRINT'' is specified in Output Control. If there is no Output Control option and PRINT\_TEMPERATURE is specified, then temperatures are printed for the last time step of each stress period. + +\item \texttt{PRINT\_FLOWS}---keyword to indicate that the list of unsaturated zone flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that unsaturated zone flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\item \texttt{TEMPERATURE}---keyword to specify that record corresponds to temperature. + +\item \texttt{tempfile}---name of the binary output file to write temperature information. + +\item \texttt{BUDGET}---keyword to specify that record corresponds to the budget. + +\item \texttt{FILEOUT}---keyword to specify that an output filename is expected next. + +\item \texttt{budgetfile}---name of the binary output file to write budget information. + +\item \texttt{BUDGETCSV}---keyword to specify that record corresponds to the budget CSV. + +\item \texttt{budgetcsvfile}---name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. + +\item \texttt{TS6}---keyword to specify that record corresponds to a time-series file. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{ts6\_filename}---defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. + +\item \texttt{OBS6}---keyword to specify that record corresponds to an observations file. + +\item \texttt{obs6\_filename}---name of input file to define observations for the UZE package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the UZE package. + +\end{description} +\item \textbf{Block: PACKAGEDATA} + +\begin{description} +\item \texttt{uzfno}---integer value that defines the UZF cell number associated with the specified PACKAGEDATA data on the line. UZFNO must be greater than zero and less than or equal to NUZFCELLS. Unsaturated zone flow information must be specified for every UZF cell or the program will terminate with an error. The program also will terminate with an error if information for a UZF cell is specified more than once. + +\item \texttt{strt}---real value that defines the starting temperature for the unsaturated zone flow cell. + +\item \textcolor{blue}{\texttt{aux}---represents the values of the auxiliary variables for each unsaturated zone flow. The values of auxiliary variables must be present for each unsaturated zone flow. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \texttt{boundname}---name of the unsaturated zone flow cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. + +\item \texttt{uzfno}---integer value that defines the UZF cell number associated with the specified PERIOD data on the line. UZFNO must be greater than zero and less than or equal to NUZFCELLS. + +\item \texttt{uzesetting}---line of information that is parsed into a keyword and values. Keyword values that can be used to start the UZESETTING string include: STATUS, TEMPERATURE, INFILTRATION, UZET, and AUXILIARY. These settings are used to assign the temperature associated with the corresponding flow terms. Temperatures cannot be specified for all flow terms. + +\begin{lstlisting}[style=blockdefinition] +STATUS +TEMPERATURE <@temperature@> +INFILTRATION <@infiltration@> +UZET <@uzet@> +AUXILIARY <@auxval@> +\end{lstlisting} + +\item \texttt{status}---keyword option to define UZF cell status. STATUS can be ACTIVE, INACTIVE, or CONSTANT. By default, STATUS is ACTIVE, which means that temperature will be calculated for the UZF cell. If a UZF cell is inactive, then there will be no energy fluxes into or out of the UZF cell and the inactive value will be written for the UZF cell temperature. If a UZF cell is constant, then the temperature for the UZF cell will be fixed at the user specified value. + +\item \textcolor{blue}{\texttt{temperature}---real or character value that defines the temperature for the unsaturated zone flow cell. The specified TEMPERATURE is only applied if the unsaturated zone flow cell is a constant temperature cell. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{infiltration}---real or character value that defines the temperature of the infiltration $(^\circ C)$ for the UZF cell. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{uzet}---real or character value that states what fraction of the simulated unsaturated zone evapotranspiration is associated with evaporation. The evaporative losses from the unsaturated zone moisture content will have an evaporative cooling effect on the GWE cell from which the evaporation originated. If this value is larger than 1, then it will be reset to 1. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \texttt{AUXILIARY}---keyword for specifying auxiliary variable. + +\item \texttt{auxname}---name for the auxiliary variable to be assigned AUXVAL. AUXNAME must match one of the auxiliary variable names defined in the OPTIONS block. If AUXNAME does not match one of the auxiliary variable names defined in the OPTIONS block the data are ignored. + +\item \textcolor{blue}{\texttt{auxval}---value for the auxiliary variable. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-uze-options.dat b/doc/mf6io/mf6ivar/tex/gwe-uze-options.dat new file mode 100644 index 00000000000..ef83c7fa718 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-uze-options.dat @@ -0,0 +1,15 @@ +BEGIN OPTIONS + [FLOW_PACKAGE_NAME ] + [AUXILIARY ] + [FLOW_PACKAGE_AUXILIARY_NAME ] + [BOUNDNAMES] + [PRINT_INPUT] + [PRINT_TEMPERATURE] + [PRINT_FLOWS] + [SAVE_FLOWS] + [TEMPERATURE FILEOUT ] + [BUDGET FILEOUT ] + [BUDGETCSV FILEOUT ] + [TS6 FILEIN ] + [OBS6 FILEIN ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-uze-packagedata.dat b/doc/mf6io/mf6ivar/tex/gwe-uze-packagedata.dat new file mode 100644 index 00000000000..b6b04c298fe --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-uze-packagedata.dat @@ -0,0 +1,5 @@ +BEGIN PACKAGEDATA + [<@aux(naux)@>] [] + [<@aux(naux)@>] [] + ... +END PACKAGEDATA diff --git a/doc/mf6io/mf6ivar/tex/gwe-uze-period.dat b/doc/mf6io/mf6ivar/tex/gwe-uze-period.dat new file mode 100644 index 00000000000..b06edb21028 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-uze-period.dat @@ -0,0 +1,5 @@ +BEGIN PERIOD + + + ... +END PERIOD diff --git a/doc/mf6io/mf6ivar/tex/gwf-rcha-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-rcha-desc.tex index a3230eee906..1f558f3244e 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-rcha-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-rcha-desc.tex @@ -35,7 +35,7 @@ \item \texttt{irch}---IRCH is the layer number that defines the layer in each vertical column where recharge is applied. If IRCH is omitted, recharge by default is applied to cells in layer 1. IRCH can only be used if READASARRAYS is specified in the OPTIONS block. If IRCH is specified, it must be specified as the first variable in the PERIOD block or MODFLOW will terminate with an error. -\item \textcolor{blue}{\texttt{recharge}---is the recharge flux rate ($LT^{-1}$). This rate is multiplied inside the program by the surface area of the cell to calculate the volumetric recharge rate. The recharge array may be defined by a time-array series (see the "Using Time-Array Series in a Package" section).} +\item \textcolor{blue}{\texttt{recharge}---is the recharge flux rate ($LT^{-1}$). This rate is multiplied inside the program by the surface area of the cell to calculate the volumetric recharge rate. The recharge array may be defined by a time-array series (see the ``Using Time-Array Series in a Package'' section).} \item \textcolor{blue}{\texttt{aux}---is an array of values for auxiliary variable aux(iaux), where iaux is a value from 1 to naux, and aux(iaux) must be listed as part of the auxiliary variables. A separate array can be specified for each auxiliary variable. If an array is not specified for an auxiliary variable, then a value of zero is assigned. If the value specified here for the auxiliary variable is the same as auxmultname, then the recharge array will be multiplied by this array.} diff --git a/doc/mf6io/mf6ivar/tex/utl-spt-desc.tex b/doc/mf6io/mf6ivar/tex/utl-spt-desc.tex new file mode 100644 index 00000000000..5dcfc20c51e --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/utl-spt-desc.tex @@ -0,0 +1,37 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of spt information will be written to the listing file immediately after it is read. + +\item \texttt{TS6}---keyword to specify that record corresponds to a time-series file. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{ts6\_filename}---defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{maxbound}---integer value specifying the maximum number of spt cells that will be specified for use during any stress period. + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. + +\item \texttt{bndno}---integer value that defines the boundary package feature number associated with the specified PERIOD data on the line. BNDNO must be greater than zero and less than or equal to MAXBOUND. + +\item \texttt{sptsetting}---line of information that is parsed into a keyword and values. Keyword values that can be used to start the SPTSETTING string include: TEMPERATURE. + +\begin{lstlisting}[style=blockdefinition] +TEMPERATURE <@temperature@> +\end{lstlisting} + +\item \textcolor{blue}{\texttt{temperature}---is the boundary temperature. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. By default, the TEMPERATURE for each boundary feature is zero.} + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/utl-spt-dimensions.dat b/doc/mf6io/mf6ivar/tex/utl-spt-dimensions.dat new file mode 100644 index 00000000000..7b4c7bf6ec7 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/utl-spt-dimensions.dat @@ -0,0 +1,3 @@ +BEGIN DIMENSIONS + MAXBOUND +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/utl-spt-options.dat b/doc/mf6io/mf6ivar/tex/utl-spt-options.dat new file mode 100644 index 00000000000..1bbdfe99d14 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/utl-spt-options.dat @@ -0,0 +1,4 @@ +BEGIN OPTIONS + [PRINT_INPUT] + [TS6 FILEIN ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/utl-spt-period.dat b/doc/mf6io/mf6ivar/tex/utl-spt-period.dat new file mode 100644 index 00000000000..c2c27b1895c --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/utl-spt-period.dat @@ -0,0 +1,5 @@ +BEGIN PERIOD + + + ... +END PERIOD diff --git a/doc/mf6io/mf6ivar/tex/utl-spta-desc.tex b/doc/mf6io/mf6ivar/tex/utl-spta-desc.tex new file mode 100644 index 00000000000..cc610d06868 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/utl-spta-desc.tex @@ -0,0 +1,25 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{READASARRAYS}---indicates that array-based input will be used for the SPT Package. This keyword must be specified to use array-based input. + +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of spt information will be written to the listing file immediately after it is read. + +\item \texttt{TAS6}---keyword to specify that record corresponds to a time-array-series file. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{tas6\_filename}---defines a time-array-series file defining a time-array series that can be used to assign time-varying values. See the Time-Variable Input section for instructions on using the time-array series capability. + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. + +\item \texttt{temperature}---is the temperature of the associated Recharge or Evapotranspiration stress package. The temperature array may be defined by a time-array series (see the ``Using Time-Array Series in a Package'' section). + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/utl-spta-options.dat b/doc/mf6io/mf6ivar/tex/utl-spta-options.dat new file mode 100644 index 00000000000..33922d8eaa7 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/utl-spta-options.dat @@ -0,0 +1,5 @@ +BEGIN OPTIONS + READASARRAYS + [PRINT_INPUT] + [TAS6 FILEIN ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/utl-spta-period.dat b/doc/mf6io/mf6ivar/tex/utl-spta-period.dat new file mode 100644 index 00000000000..4f3a67077fb --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/utl-spta-period.dat @@ -0,0 +1,4 @@ +BEGIN PERIOD + TEMPERATURE + -- READARRAY +END PERIOD diff --git a/doc/mf6io/obs/obs-gwe.tex b/doc/mf6io/obs/obs-gwe.tex new file mode 100644 index 00000000000..e1f8d191dd5 --- /dev/null +++ b/doc/mf6io/obs/obs-gwe.tex @@ -0,0 +1,7 @@ +Observations are available for GWE models and GWE stress packages. Available observation types have been listed for each package that supports observations (tables~\ref{table:gweobstype} to~\ref{table:gwe-cntobstype}). All available observation types are repeated in Table~\ref{table:gwe-obstypetable} for convenience. + +The sign convention adopted for transport observations are identical to the conventions used in budgets contained in listing files and used in the cell-by-cell budget output. For flow-ja-face observation types, negative and positive values represent a loss from and gain to the cellid specified for ID, respectively. For standard stress packages, negative and positive values represent a loss from and gain to the GWE model, respectively. For advanced transport packages (Package = LKE, MWE, SFE, and UZE), negative and positive values for exchanges with the GWE model (Observation type = lke, mwe, sfe, and uze) represent a loss from and gain to the GWE model, respectively. For other advanced stress package flow terms, negative and positive values represent a loss from and gain from the advanced package, respectively. + +\FloatBarrier +\input{../Common/gwe-obstypetable} +\FloatBarrier diff --git a/doc/mf6io/obs/obs.tex b/doc/mf6io/obs/obs.tex index d3223c62f80..618f6cdff95 100644 --- a/doc/mf6io/obs/obs.tex +++ b/doc/mf6io/obs/obs.tex @@ -33,3 +33,5 @@ \subsubsection{GWF Observations} \subsubsection{GWT Observations} \input{./obs/obs-gwt.tex} +\subsubsection{GWE Observations} +\input{./obs/obs-gwe.tex} diff --git a/doc/mf6io/usgs.bst b/doc/mf6io/usgs.bst new file mode 100644 index 00000000000..326cc9cf966 --- /dev/null +++ b/doc/mf6io/usgs.bst @@ -0,0 +1,2080 @@ +%% +%% This is file `usgs.bst', +%%% ADAPTED BY MIKE FIENEN FROM agufull08.bst +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% merlin.mbs (with options: `head,ay,nat,seq-labc,nm-rev1,jnrlst,lab,lab-it,keyxyr,blkyear,dt-beg,yr-par,xmth,note-yr,thtit-a,trnum-it,vol-it,volp-com,pgsep-c,num-xser,ser-vol,ser-ed,pg-bk,pg-pre,pre-edn,agu-doi,doi,edpar,bkedcap,edby,blk-com,pp,ed,abr,ednx,xedn,jabr,and-com,em-it,nfss,{}') +%% physjour.mbs (with options: `ay,nat,seq-labc,nm-rev1,jnrlst,lab,lab-it,keyxyr,blkyear,dt-beg,yr-par,xmth,note-yr,thtit-a,trnum-it,vol-it,volp-com,pgsep-c,num-xser,ser-vol,ser-ed,pg-bk,pg-pre,pre-edn,agu-doi,doi,edpar,bkedcap,edby,blk-com,pp,ed,abr,ednx,xedn,jabr,and-com,em-it,nfss,{}') +%% geojour.mbs (with options: `ay,nat,seq-labc,nm-rev1,jnrlst,lab,lab-it,keyxyr,blkyear,dt-beg,yr-par,xmth,note-yr,thtit-a,trnum-it,vol-it,volp-com,pgsep-c,num-xser,ser-vol,ser-ed,pg-bk,pg-pre,pre-edn,agu-doi,doi,edpar,bkedcap,edby,blk-com,pp,ed,abr,ednx,xedn,jabr,and-com,em-it,nfss,{}') +%% photjour.mbs (with options: `ay,nat,seq-labc,nm-rev1,jnrlst,lab,lab-it,keyxyr,blkyear,dt-beg,yr-par,xmth,note-yr,thtit-a,trnum-it,vol-it,volp-com,pgsep-c,num-xser,ser-vol,ser-ed,pg-bk,pg-pre,pre-edn,agu-doi,doi,edpar,bkedcap,edby,blk-com,pp,ed,abr,ednx,xedn,jabr,and-com,em-it,nfss,{}') +%% merlin.mbs (with options: `tail,ay,nat,seq-labc,nm-rev1,jnrlst,lab,lab-it,keyxyr,blkyear,dt-beg,yr-par,xmth,note-yr,thtit-a,trnum-it,vol-it,volp-com,pgsep-c,num-xser,ser-vol,ser-ed,pg-bk,pg-pre,pre-edn,agu-doi,doi,edpar,bkedcap,edby,blk-com,pp,ed,abr,ednx,xedn,jabr,and-com,em-it,nfss,{}') +%% ---------------------------------------- +%% *** For journals of the American Geophysical Union *** +%% *** NOTE: this version does not limit the number of authors in ref list. +%% *** Use agu08.bst to limit authors to maximum 9. +%% *** +%% ---------------------------------------- +%% *** Version 3.1 from 2008/08/27 +%% *** Multiple authors of same first author and year now in order of citation +%% *** and other minor fixes +%% *** Renamed to agu08.bst and agufull08.bst +%% *** +%% *** Version 3.0 from 2004/02/06 +%% *** Changed date format for AGU journals +%% *** The date now appears in parentheses after authors +%% *** +%% *** Version 2.2 from 2003/06/26 +%% *** (with bug fix from 2003/08/19) +%% *** Includes new fields eid and doi +%% *** The eid is what the AGU calls "citation number" +%% *** and doi is the DOI number; both of these are +%% *** used as substitution for page number +%% *** The issue number is now also included as +%% *** 84(3) for vol. 84, nr. 3 +%% *** +%% *** Version 2.1d from 1999/05/20 +%% *** Book editors done right as P. James (Ed.), +%% *** Missing italics with some authors fixed +%% *** +%% *** Version 2.1c from 1999/02/11 +%% *** This version does not crash older BibTeX installations with +%% *** more than 3000 wiz-functions +%% *** +%% *** Version 2.1b from 1997/11/18 +%% *** (page numbers over 9999 are broken with commas, as 12,345) +%% *** +%% *** Version 2.1a from 1997/05/26 +%% *** (contains improvements from copy editor comments, +%% *** notes added with first word lowercase (bug in 2.1 fixed) +%% *** and journal `number' never output +%% *** abbreviation for grl corrected) +%% *** +%% +%% Copyright 1994-2008 Patrick W Daly + % =============================================================== + % IMPORTANT NOTICE: + % This bibliographic style (bst) file has been generated from one or + % more master bibliographic style (mbs) files, listed above. + % + % This generated file can be redistributed and/or modified under the terms + % of the LaTeX Project Public License Distributed from CTAN + % archives in directory macros/latex/base/lppl.txt; either + % version 1 of the License, or any later version. + % =============================================================== + % Name and version information of the main mbs file: + % \ProvidesFile{merlin.mbs}[2008/08/27 4.30 (PWD, AO, DPC)] + % For use with BibTeX version 0.99a or later + %------------------------------------------------------------------- + % This bibliography style file is intended for texts in ENGLISH + % This is an author-year citation style bibliography. As such, it is + % non-standard LaTeX, and requires a special package file to function properly. + % Such a package is natbib.sty by Patrick W. Daly + % The form of the \bibitem entries is + % \bibitem[Jones et al.(1990)]{key}... + % \bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}... + % The essential feature is that the label (the part in brackets) consists + % of the author names, as they should appear in the citation, with the year + % in parentheses following. There must be no space before the opening + % parenthesis! + % With natbib v5.3, a full list of authors may also follow the year. + % In natbib.sty, it is possible to define the type of enclosures that is + % really wanted (brackets or parentheses), but in either case, there must + % be parentheses in the label. + % The \cite command functions as follows: + % \citet{key} ==>> Jones et al. (1990) + % \citet*{key} ==>> Jones, Baker, and Smith (1990) + % \citep{key} ==>> (Jones et al., 1990) + % \citep*{key} ==>> (Jones, Baker, and Smith, 1990) + % \citep[chap. 2]{key} ==>> (Jones et al., 1990, chap. 2) + % \citep[e.g.][]{key} ==>> (e.g. Jones et al., 1990) + % \citep[e.g.][p. 32]{key} ==>> (e.g. Jones et al., 1990, p. 32) + % \citeauthor{key} ==>> Jones et al. + % \citeauthor*{key} ==>> Jones, Baker, and Smith + % \citeyear{key} ==>> 1990 + %--------------------------------------------------------------------- + +ENTRY + { address + author + booktitle + chapter + doi + urldate + url + urllink + edition + editor + eid + howpublished + institution + journal + key + month + note + number + organization + pages + publisher + school + series + title + type + volume + year + } + {} + { label extra.label sort.label short.list } +INTEGERS { output.state before.all mid.sentence after.sentence after.block } +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} +STRINGS { s t} +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} +FUNCTION {outputc.nonnull} +{ 's := + output.state mid.sentence = + { ": " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} +FUNCTION {outputc} +{ duplicate$ empty$ + 'pop$ + 'outputc.nonnull + if$ +} +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} +FUNCTION {outputc.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'outputc.nonnull + if$ +} +FUNCTION {fin.entry} +{ add.period$ + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} +FUNCTION {add.blank} +{ " " * before.all 'output.state := +} + +FUNCTION {date.block} +{ + skip$ +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "\textit{" swap$ * "}" * } + if$ +} +FUNCTION {cite.name.font} +%{ emphasize } +{ } +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {capitalize} +{ "u" change.case$ "t" change.case$ } + +FUNCTION {space.word} +{ " " swap$ * " " * } + % Here are the language-specific definitions for explicit words. + % Each function has a name bbl.xxx where xxx is the English word. + % The language selected here is ENGLISH +FUNCTION {bbl.and} +{ "and" } + +FUNCTION {bbl.etal} +{ "and others" } + +FUNCTION {bbl.andothers} +{ "and others" } + +FUNCTION {bbl.editors} +{ "eds." } + +FUNCTION {bbl.editor} +{ "ed." } + +FUNCTION {bbl.edby} +{ "edited by" } + +FUNCTION {bbl.edition} +{ "ed." } + +FUNCTION {bbl.volume} +{ "v." } + +FUNCTION {bbl.of} +{ "of" } + +FUNCTION {bbl.number} +{ "no." } + +FUNCTION {bbl.nr} +{ "no." } + +FUNCTION {bbl.in} +{ "\emph{in}" } + +FUNCTION {bbl.pages} +{ "p." } + +FUNCTION {bbl.page} +{ "p." } + +FUNCTION {bbl.chapter} +{ "Chap." } + +FUNCTION {bbl.techrep} +%{ "Tech. Rep." } REMOVE THE TECH REPORT WORDS FOR USGS +{""} +FUNCTION {bbl.mthesis} +{ "M.S. thesis" } + +FUNCTION {bbl.phdthesis} +{ "Ph.D. thesis" } + +MACRO {jan} {"Jan."} + +MACRO {feb} {"Feb."} + +MACRO {mar} {"Mar."} + +MACRO {apr} {"Apr."} + +MACRO {may} {"May"} + +MACRO {jun} {"Jun."} + +MACRO {jul} {"Jul."} + +MACRO {aug} {"Aug."} + +MACRO {sep} {"Sep."} + +MACRO {oct} {"Oct."} + +MACRO {nov} {"Nov."} + +MACRO {dec} {"Dec."} + + %------------------------------------------------------------------- + % Begin module: + % \ProvidesFile{physjour.mbs}[2002/01/14 2.2 (PWD)] +MACRO {aa}{"Astron. \& Astrophys."} +MACRO {aasup}{"Astron. \& Astrophys. Suppl. Ser."} +MACRO {aj} {"Astron. J."} +MACRO {aph} {"Acta Phys."} +MACRO {advp} {"Adv. Phys."} +MACRO {ajp} {"Amer. J. Phys."} +MACRO {ajm} {"Amer. J. Math."} +MACRO {amsci} {"Amer. Sci."} +MACRO {anofd} {"Ann. Fluid Dyn."} +MACRO {am} {"Ann. Math."} +MACRO {ap} {"Ann. Phys. (NY)"} +MACRO {adp} {"Ann. Phys. (Leipzig)"} +MACRO {ao} {"Appl. Opt."} +MACRO {apl} {"Appl. Phys. Lett."} +MACRO {app} {"Astroparticle Phys."} +MACRO {apj} {"Astrophys. J."} +MACRO {apjsup} {"Astrophys. J. Suppl."} +MACRO {apss} {"Astrophys. Space Sci."} +MACRO {araa} {"Ann. Rev. Astron. Astrophys."} +MACRO {baas} {"Bull. Amer. Astron. Soc."} +MACRO {baps} {"Bull. Amer. Phys. Soc."} +MACRO {cmp} {"Comm. Math. Phys."} +MACRO {cpam} {"Commun. Pure Appl. Math."} +MACRO {cppcf} {"Comm. Plasma Phys. \& Controlled Fusion"} +MACRO {cpc} {"Comp. Phys. Comm."} +MACRO {cqg} {"Class. Quant. Grav."} +MACRO {cra} {"C. R. Acad. Sci. A"} +MACRO {fed} {"Fusion Eng. \& Design"} +MACRO {ft} {"Fusion Tech."} +MACRO {grg} {"Gen. Relativ. Gravit."} +MACRO {ieeens} {"IEEE Trans. Nucl. Sci."} +MACRO {ieeeps} {"IEEE Trans. Plasma Sci."} +MACRO {ijimw} {"Interntl. J. Infrared \& Millimeter Waves"} +MACRO {ip} {"Infrared Phys."} +MACRO {irp} {"Infrared Phys."} +MACRO {jap} {"J. Appl. Phys."} +MACRO {jasa} {"J. Acoust. Soc. America"} +MACRO {jcp} {"J. Comp. Phys."} +MACRO {jetp} {"Sov. Phys.--JETP"} +MACRO {jfe} {"J. Fusion Energy"} +MACRO {jfm} {"J. Fluid Mech."} +MACRO {jmp} {"J. Math. Phys."} +MACRO {jne} {"J. Nucl. Energy"} +MACRO {jnec} {"J. Nucl. Energy, C: Plasma Phys., Accelerators, Thermonucl. Res."} +MACRO {jnm} {"J. Nucl. Mat."} +MACRO {jpc} {"J. Phys. Chem."} +MACRO {jpp} {"J. Plasma Phys."} +MACRO {jpsj} {"J. Phys. Soc. Japan"} +MACRO {jsi} {"J. Sci. Instrum."} +MACRO {jvst} {"J. Vac. Sci. \& Tech."} +MACRO {nat} {"Nature"} +MACRO {nature} {"Nature"} +MACRO {nedf} {"Nucl. Eng. \& Design/Fusion"} +MACRO {nf} {"Nucl. Fusion"} +MACRO {nim} {"Nucl. Inst. \& Meth."} +MACRO {nimpr} {"Nucl. Inst. \& Meth. in Phys. Res."} +MACRO {np} {"Nucl. Phys."} +MACRO {npb} {"Nucl. Phys. B"} +MACRO {nt/f} {"Nucl. Tech./Fusion"} +MACRO {npbpc} {"Nucl. Phys. B (Proc. Suppl.)"} +MACRO {inc} {"Nuovo Cimento"} +MACRO {nc} {"Nuovo Cimento"} +MACRO {pf} {"Phys. Fluids"} +MACRO {pfa} {"Phys. Fluids A: Fluid Dyn."} +MACRO {pfb} {"Phys. Fluids B: Plasma Phys."} +MACRO {pl} {"Phys. Lett."} +MACRO {pla} {"Phys. Lett. A"} +MACRO {plb} {"Phys. Lett. B"} +MACRO {prep} {"Phys. Rep."} +MACRO {pnas} {"Proc. Nat. Acad. Sci. USA"} +MACRO {pp} {"Phys. Plasmas"} +MACRO {ppcf} {"Plasma Phys. \& Controlled Fusion"} +MACRO {phitrsl} {"Philos. Trans. Roy. Soc. London"} +MACRO {prl} {"Phys. Rev. Lett."} +MACRO {pr} {"Phys. Rev."} +MACRO {physrev} {"Phys. Rev."} +MACRO {pra} {"Phys. Rev. A"} +MACRO {prb} {"Phys. Rev. B"} +MACRO {prc} {"Phys. Rev. C"} +MACRO {prd} {"Phys. Rev. D"} +MACRO {pre} {"Phys. Rev. E"} +MACRO {ps} {"Phys. Scripta"} +MACRO {procrsl} {"Proc. Roy. Soc. London"} +MACRO {rmp} {"Rev. Mod. Phys."} +MACRO {rsi} {"Rev. Sci. Inst."} +MACRO {science} {"Science"} +MACRO {sciam} {"Sci. Am."} +MACRO {sam} {"Stud. Appl. Math."} +MACRO {sjpp} {"Sov. J. Plasma Phys."} +MACRO {spd} {"Sov. Phys.--Doklady"} +MACRO {sptp} {"Sov. Phys.--Tech. Phys."} +MACRO {spu} {"Sov. Phys.--Uspeki"} +MACRO {st} {"Sky and Telesc."} + % End module: physjour.mbs + %------------------------------------------------------------------- + % Begin module: + % \ProvidesFile{geojour.mbs}[2002/07/10 2.0h (PWD)] +MACRO {aisr} {"Adv. Space Res."} +MACRO {ag} {"Ann. Geophys."} +MACRO {anigeo} {"Ann. Geofis."} +MACRO {angl} {"Ann. Glaciol."} +MACRO {andmet} {"Ann. d. Meteor."} +MACRO {andgeo} {"Ann. d. Geophys."} +MACRO {andphy} {"Ann. Phys.-Paris"} +MACRO {afmgb} {"Arch. Meteor. Geophys. Bioklimatol."} +MACRO {atph} {"Atm\'osphera"} +MACRO {aao} {"Atmos. Ocean"} +MACRO {ass}{"Astrophys. Space Sci."} +MACRO {atenv} {"Atmos. Environ."} +MACRO {aujag} {"Aust. J. Agr. Res."} +MACRO {aumet} {"Aust. Meteorol. Mag."} +MACRO {blmet} {"Bound.-Lay. Meteorol."} +MACRO {bams} {"Bull. Amer. Meteorol. Soc."} +MACRO {cch} {"Clim. Change"} +MACRO {cdyn} {"Clim. Dynam."} +MACRO {cbul} {"Climatol. Bull."} +MACRO {cap} {"Contrib. Atmos. Phys."} +MACRO {dsr} {"Deep-Sea Res."} +MACRO {dhz} {"Dtsch. Hydrogr. Z."} +MACRO {dao} {"Dynam. Atmos. Oceans"} +MACRO {eco} {"Ecology"} +MACRO {empl}{"Earth, Moon and Planets"} +MACRO {envres} {"Environ. Res."} +MACRO {envst} {"Environ. Sci. Technol."} +MACRO {ecms} {"Estuarine Coastal Mar. Sci."} +MACRO {expa}{"Exper. Astron."} +MACRO {geoint} {"Geofis. Int."} +MACRO {geopub} {"Geofys. Publ."} +MACRO {geogeo} {"Geol. Geofiz."} +MACRO {gafd} {"Geophys. Astrophys. Fluid Dyn."} +MACRO {gfd} {"Geophys. Fluid Dyn."} +MACRO {geomag} {"Geophys. Mag."} +MACRO {georl} {"Geophys. Res. Lett."} +MACRO {grl} {"Geophys. Res. Lett."} +MACRO {ga} {"Geophysica"} +MACRO {gs} {"Geophysics"} +MACRO {ieeetap} {"IEEE Trans. Antenn. Propag."} +MACRO {ijawp} {"Int. J. Air Water Pollut."} +MACRO {ijc} {"Int. J. Climatol."} +MACRO {ijrs} {"Int. J. Remote Sens."} +MACRO {jam} {"J. Appl. Meteorol."} +MACRO {jaot} {"J. Atmos. Ocean. Technol."} +MACRO {jatp} {"J. Atmos. Terr. Phys."} +MACRO {jastp} {"J. Atmos. Solar-Terr. Phys."} +MACRO {jce} {"J. Climate"} +MACRO {jcam} {"J. Climate Appl. Meteor."} +MACRO {jcm} {"J. Climate Meteor."} +MACRO {jcy} {"J. Climatol."} +MACRO {jgr} {"J. Geophys. Res."} +MACRO {jga} {"J. Glaciol."} +MACRO {jh} {"J. Hydrol."} +MACRO {jmr} {"J. Mar. Res."} +MACRO {jmrj} {"J. Meteor. Res. Japan"} +MACRO {jm} {"J. Meteor."} +MACRO {jpo} {"J. Phys. Oceanogr."} +MACRO {jra} {"J. Rech. Atmos."} +MACRO {jaes} {"J. Aeronaut. Sci."} +MACRO {japca} {"J. Air Pollut. Control Assoc."} +MACRO {jas} {"J. Atmos. Sci."} +MACRO {jmts} {"J. Mar. Technol. Soc."} +MACRO {jmsj} {"J. Meteorol. Soc. Japan"} +MACRO {josj} {"J. Oceanogr. Soc. Japan"} +MACRO {jwm} {"J. Wea. Mod."} +MACRO {lao} {"Limnol. Oceanogr."} +MACRO {mwl} {"Mar. Wea. Log"} +MACRO {mau} {"Mausam"} +MACRO {meteor} {"``Meteor'' Forschungsergeb."} +MACRO {map} {"Meteorol. Atmos. Phys."} +MACRO {metmag} {"Meteor. Mag."} +MACRO {metmon} {"Meteor. Monogr."} +MACRO {metrun} {"Meteor. Rundsch."} +MACRO {metzeit} {"Meteor. Z."} +MACRO {metgid} {"Meteor. Gidrol."} +MACRO {mwr} {"Mon. Weather Rev."} +MACRO {nwd} {"Natl. Weather Dig."} +MACRO {nzjmfr} {"New Zeal. J. Mar. Freshwater Res."} +MACRO {npg} {"Nonlin. Proc. Geophys."} +MACRO {om} {"Oceanogr. Meteorol."} +MACRO {ocac} {"Oceanol. Acta"} +MACRO {oceanus} {"Oceanus"} +MACRO {paleoc} {"Paleoceanography"} +MACRO {pce} {"Phys. Chem. Earth"} +MACRO {pmg} {"Pap. Meteor. Geophys."} +MACRO {ppom} {"Pap. Phys. Oceanogr. Meteor."} +MACRO {physzeit} {"Phys. Z."} +MACRO {pps} {"Planet. Space Sci."} +MACRO {pss} {"Planet. Space Sci."} +MACRO {pag} {"Pure Appl. Geophys."} +MACRO {qjrms} {"Quart. J. Roy. Meteorol. Soc."} +MACRO {quatres} {"Quat. Res."} +MACRO {rsci} {"Radio Sci."} +MACRO {rse} {"Remote Sens. Environ."} +MACRO {rgeo} {"Rev. Geophys."} +MACRO {rgsp} {"Rev. Geophys. Space Phys."} +MACRO {rdgeo} {"Rev. Geofis."} +MACRO {revmeta} {"Rev. Meteorol."} +MACRO {sgp}{"Surveys in Geophys."} +MACRO {sp} {"Solar Phys."} +MACRO {ssr} {"Space Sci. Rev."} +MACRO {tellus} {"Tellus"} +MACRO {tac} {"Theor. Appl. Climatol."} +MACRO {tagu} {"Trans. Am. Geophys. Union (EOS)"} +MACRO {wrr} {"Water Resour. Res."} +MACRO {weather} {"Weather"} +MACRO {wafc} {"Weather Forecast."} +MACRO {ww} {"Weatherwise"} +MACRO {wmob} {"WMO Bull."} +MACRO {zeitmet} {"Z. Meteorol."} + % End module: geojour.mbs + %------------------------------------------------------------------- + % Begin module: + % \ProvidesFile{photjour.mbs}[1999/02/24 2.0b (PWD)] + +MACRO {appopt} {"Appl. Opt."} +MACRO {bell} {"Bell Syst. Tech. J."} +MACRO {ell} {"Electron. Lett."} +MACRO {jasp} {"J. Appl. Spectr."} +MACRO {jqe} {"IEEE J. Quantum Electron."} +MACRO {jlwt} {"J. Lightwave Technol."} +MACRO {jmo} {"J. Mod. Opt."} +MACRO {josa} {"J. Opt. Soc. America"} +MACRO {josaa} {"J. Opt. Soc. Amer.~A"} +MACRO {josab} {"J. Opt. Soc. Amer.~B"} +MACRO {jdp} {"J. Phys. (Paris)"} +MACRO {oc} {"Opt. Commun."} +MACRO {ol} {"Opt. Lett."} +MACRO {phtl} {"IEEE Photon. Technol. Lett."} +MACRO {pspie} {"Proc. Soc. Photo-Opt. Instrum. Eng."} +MACRO {sse} {"Solid-State Electron."} +MACRO {sjot} {"Sov. J. Opt. Technol."} +MACRO {sjqe} {"Sov. J. Quantum Electron."} +MACRO {sleb} {"Sov. Phys.--Leb. Inst. Rep."} +MACRO {stph} {"Sov. Phys.--Techn. Phys."} +MACRO {stphl} {"Sov. Techn. Phys. Lett."} +MACRO {vr} {"Vision Res."} +MACRO {zph} {"Z. f. Physik"} +MACRO {zphb} {"Z. f. Physik~B"} +MACRO {zphd} {"Z. f. Physik~D"} + +MACRO {CLEO} {"CLEO"} +MACRO {ASSL} {"Adv. Sol.-State Lasers"} +MACRO {OSA} {"OSA"} + % End module: photjour.mbs +%% Copyright 1994-2008 Patrick W Daly +MACRO {acmcs} {"ACM Comput. Surv."} + +MACRO {acta} {"Acta Inf."} + +MACRO {cacm} {"Commun. ACM"} + +MACRO {ibmjrd} {"IBM J. Res. Dev."} + +MACRO {ibmsj} {"IBM Syst.~J."} + +MACRO {ieeese} {"IEEE Trans. Software Eng."} + +MACRO {ieeetc} {"IEEE Trans. Comput."} + +MACRO {ieeetcad} + {"IEEE Trans. Comput. Aid. Des."} + +MACRO {ipl} {"Inf. Process. Lett."} + +MACRO {jacm} {"J.~ACM"} + +MACRO {jcss} {"J.~Comput. Syst. Sci."} + +MACRO {scp} {"Sci. Comput. Program."} + +MACRO {sicomp} {"SIAM J. Comput."} + +MACRO {tocs} {"ACM Trans. Comput. Syst."} + +MACRO {tods} {"ACM Trans. Database Syst."} + +MACRO {tog} {"ACM Trans. Graphic."} + +MACRO {toms} {"ACM Trans. Math. Software"} + +MACRO {toois} {"ACM Trans. Office Inf. Syst."} + +MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."} + +MACRO {tcs} {"Theor. Comput. Sci."} + +FUNCTION {bibinfo.check} +{ swap$ + duplicate$ missing$ + { + pop$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ pop$ + } + { swap$ + pop$ + } + if$ + } + if$ +} +FUNCTION {bibinfo.warn} +{ swap$ + duplicate$ missing$ + { + swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ "empty " swap$ * " in " * cite$ * warning$ + } + { swap$ + pop$ + } + if$ + } + if$ +} + + +STRINGS {ss tt fm} +FUNCTION {format.onlyfirst} +{ + 'ss := %% Make a copy of the name in s + %% Extract the First (and possible Medium) names + %% and store it in variable fm + ss #1 "{ff}" format.name$ 'fm := + + %% Note that now fm could contain: + %% * An empty string ("") if the author has no first name (only Last name was provided) + %% * A single word (like "First") if the author has no medium name + %% * A sequence of words (like "First Medium") + %% For the last case we want to abbreviate "Medium", without dot + + %% Test if we are in the first case + fm empty$ { + % If empty (no first name), use the standard formatting + ss #1 "{vv~}{ll}{, f{.}.}{, jj}" format.name$ + }{ % Otherwise, attempt the trick + %% Now the trick. Interpret "First Medium" + %% as if "Medium" were a last name, and abbreviate it + fm #1 "{f.}{l}" format.name$ 'tt := %% And store the result in tt + %% Consider the particular case in which no Medium name is present + %% In this case, "First" will be interpreted as a last name, and + %% thus abbreviated. This can be detected because the resulting + %% string has length 1 + tt text.length$ #1 > { %% If there was a medium name + fm #1 "{f.}{l.}" format.name$ 'tt := + tt %% Store the abbreviated version + }{ %% Else store the original version of the name + fm + } if$ + + %% After the above, the top of the stack will contain + %% either "First" unabbreviated (if the author has not middle name) + %% or "First M", as required + 'tt := %% Copy that value to tt + + %% Now complete the standard formatting of the author, omitting + %% the first name part, which is stored in tt + ss #1 "{vv~}{ll}{, jj}" format.name$ + %% And concatenate to it the value of tt + ", " * + tt * + }if$ %% If the trick has to be done +} + +INTEGERS { nameptr namesleft numnames } +STRINGS { bibinfo} + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv~}{ll}{, ff}{, jj}" + format.name$ + bibinfo bibinfo.check + format.onlyfirst 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + numnames #1 > + { "," * } + 'skip$ + if$ + t "others" = + { + " " * bbl.etal * + } + { + bbl.and + space.word * t * + } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} + + +FUNCTION {format.names.ed} +{ + 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{f.~}{vv~}{ll}{, jj}" + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + numnames #2 > + { "," * } + 'skip$ + if$ + t "others" = + { + + " " * bbl.etal * + } + { + bbl.and + space.word * t * + } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} +FUNCTION {format.key} +{ empty$ + { key field.or.null } + { "" } + if$ +} + +FUNCTION {format.authors} +{ author "author" format.names +} +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { + " " * + get.bbl.editor + capitalize + "(" swap$ * ")" * + * + } + if$ +} +FUNCTION {format.book.pages} +{ pages "pages" bibinfo.check + duplicate$ empty$ 'skip$ + { "~" * bbl.pages * } + if$ +} +FUNCTION {format.doi} +{ doi empty$ + { "" } + { + urldate empty$ + { + "\url{https://doi.org/" doi * "}" * + } + { + "at \url{https://doi.org/" doi * "}" * + } + if$ + } + if$ +} +FUNCTION {format.urldate} +{ urldate empty$ + { "" } + { + url empty$ + { + doi empty$ + { "" } + { + "accessed " urldate * + } + if$ + } + { + "accessed " urldate * + } + if$ + } + if$ +} +FUNCTION {format.url} +{ url empty$ + { "" } + { + urldate empty$ + { + "\url{" url * "}" * + } + { + "at \url{" url * "}" * + } + if$ + } + if$ +} +FUNCTION {format.urllink} +{ urllink empty$ + { "" } + { + " (Available online at \url{" urllink * "})" * + } + if$ +} +FUNCTION {format.note} +{ + note empty$ + { "" } + { note #1 #1 substring$ + duplicate$ "{" = + 'skip$ + { output.state mid.sentence = + { "l" } + { "u" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + } + if$ +} + +FUNCTION {format.title} +{ title + duplicate$ empty$ 'skip$ + { "t" change.case$ } + if$ + "title" bibinfo.check +} +FUNCTION {format.full.names} +{'s := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv~}{ll}" format.name$ + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal * + cite.name.font + } + { + numnames #2 > + { "," * } + 'skip$ + if$ + bbl.and + space.word * t * + } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + t "others" = + 'skip$ + { cite.name.font } + if$ +} + +FUNCTION {author.editor.key.full} +{ author empty$ + { editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.full.names } + if$ + } + { author format.full.names } + if$ +} + +FUNCTION {author.key.full} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { author format.full.names } + if$ +} + +FUNCTION {editor.key.full} +{ editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.full.names } + if$ +} + +FUNCTION {make.full.names} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.full + { type$ "proceedings" = + 'editor.key.full + 'author.key.full + if$ + } + if$ +} + +FUNCTION {output.bibitem} +{ newline$ + "\bibitem[{" write$ + label write$ + ")" make.full.names duplicate$ short.list = + { pop$ } + { * } + if$ + "}]{" * write$ + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {if.digit} +{ duplicate$ "0" = + swap$ duplicate$ "1" = + swap$ duplicate$ "2" = + swap$ duplicate$ "3" = + swap$ duplicate$ "4" = + swap$ duplicate$ "5" = + swap$ duplicate$ "6" = + swap$ duplicate$ "7" = + swap$ duplicate$ "8" = + swap$ "9" = or or or or or or or or or +} +FUNCTION {n.separate} +{ 't := + "" + #0 'numnames := + { t empty$ not } + { t #-1 #1 substring$ if.digit + { numnames #1 + 'numnames := } + { #0 'numnames := } + if$ + t #-1 #1 substring$ swap$ * + t #-2 global.max$ substring$ 't := + numnames #5 = + { duplicate$ #1 #2 substring$ swap$ + #3 global.max$ substring$ + "," swap$ * * + } + 'skip$ + if$ + } + while$ +} +FUNCTION {n.dashify} +{ + n.separate + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ bbl.in + " " * } + +FUNCTION {format.date} +{ year "year" bibinfo.check duplicate$ empty$ + { + } + 'skip$ + if$ + extra.label * + before.all 'output.state := + ", " swap$ * "" * +} +FUNCTION {format.btitle} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { + %emphasize + } + if$ +} +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { bbl.volume volume tie.or.space.prefix + "volume" bibinfo.check * * + series "series" bibinfo.check + duplicate$ empty$ 'pop$ + + % { emphasize ", " * swap$ * } % REMOVE ITALICS FOR USGS + { ", " * swap$ * } + if$ + "volume and number" number either.or.check + } + if$ +} +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { series empty$ + { number "number" bibinfo.check } + { output.state mid.sentence = + { bbl.number } + { bbl.number capitalize } + if$ + number tie.or.space.prefix "number" bibinfo.check * * + bbl.in space.word * + series "series" bibinfo.check * + } + if$ + } + if$ + } + { "" } + if$ +} + +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { + output.state mid.sentence = + { "l" } + { "t" } + if$ change.case$ + "edition" bibinfo.check + " " * bbl.edition * + } + if$ +} +INTEGERS { multiresult } +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { duplicate$ multi.page.check + { + bbl.pages swap$ + n.dashify + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + } + if$ +} +FUNCTION {format.journal.pages} +{ pages duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ + { pop$ pop$ format.pages } + { + ", p.~" * + swap$ + n.dashify + "pages" bibinfo.check + * + } + if$ + } + if$ +} +FUNCTION {format.journal.eid} +{ eid "eid" bibinfo.check + duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ 'skip$ + { + ", " * + } + if$ + swap$ * + } + if$ +} +FUNCTION {format.vol.num.pages} +{ volume field.or.null + duplicate$ empty$ 'skip$ + { + bbl.volume swap$ tie.or.space.prefix + "volume" bibinfo.check + * * + } + if$ + number "number" bibinfo.check duplicate$ empty$ 'skip$ + { + swap$ duplicate$ empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + swap$ + ", " bbl.nr * number tie.or.space.prefix pop$ * swap$ * + } + if$ * + eid empty$ + { format.journal.pages } + { format.journal.eid } + if$ +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ +} + +FUNCTION {format.booktitle} +{ + booktitle "booktitle" bibinfo.check + %emphasize +} + +FUNCTION {format.editor} +{ + editor "editor" format.names + duplicate$ empty$ 'pop$ + { + %emphasize + } + if$ +} + +FUNCTION {format.in.ed.booktitle} +{ format.booktitle duplicate$ empty$ 'skip$ + { + format.bvolume duplicate$ empty$ 'pop$ + { ", " swap$ * * } + if$ + editor "editor" format.names.ed duplicate$ empty$ 'pop$ + { + bbl.edby + " " * swap$ * + swap$ + "," * + " " * swap$ + * } + if$ + word.in swap$ * + } + if$ +} + +FUNCTION {formatc.in.ed.booktitle} +{ format.editor duplicate$ empty$ 'skip$ + { + format.bvolume duplicate$ empty$ 'pop$ + { ", " swap$ * * } + if$ + format.booktitle duplicate$ empty$ 'pop$ + { + swap$ + "," * + " " * swap$ + * } + if$ + word.in swap$ * + } + if$ +} + +FUNCTION {format.thesis.type} +{ type duplicate$ empty$ + 'pop$ + { swap$ pop$ + "t" change.case$ "type" bibinfo.check + } + if$ +} +FUNCTION {format.tr.number} +{ number "number" bibinfo.check + type duplicate$ empty$ + { pop$ bbl.techrep } + 'skip$ + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ "t" change.case$ } + { tie.or.space.prefix * * } + if$ +} +FUNCTION {format.article.crossref} +{ + word.in + " \cite{" * crossref * "}" * +} +FUNCTION {format.book.crossref} +{ volume duplicate$ empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + pop$ word.in + } + { bbl.volume + swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * + } + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.incoll.inproc.crossref} +{ + word.in + " \cite{" * crossref * "}" * +} +FUNCTION {format.org.or.pub} +{ 't := + "" + address empty$ t empty$ and + 'skip$ + { + t empty$ + { address "address" bibinfo.check * + } + { t * + address empty$ + 'skip$ + { ", " * address "address" bibinfo.check * } + if$ + } + if$ + } + if$ +} +FUNCTION {formatc.org.or.pub} +{ 't := + "" + address empty$ t empty$ and + 'skip$ + { + t empty$ + { address "address" bibinfo.check * + } + { t * + address empty$ + 'skip$ + { ": " * address "address" bibinfo.check * } + if$ + } + if$ + } + if$ +} +FUNCTION {format.publisher.address} +{ format.org.or.pub publisher "publisher" bibinfo.warn +} +FUNCTION {formatc.publisher.address} +{ formatc.org.or.pub publisher "publisher" bibinfo.warn +} + +FUNCTION {format.organization.address} +{ organization "organization" bibinfo.check format.org.or.pub +} + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + format.title "title" output.check + crossref missing$ + { + journal + "journal" bibinfo.check + %emphasize + "journal" outputc.check + format.vol.num.pages output + format.urldate output + format.doi output + format.url output + format.urllink output + } + { format.article.crossref output.nonnull + format.pages output + } + if$ + format.note output + fin.entry +} +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + editor format.key output + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + format.date "year" output.check + date.block + format.btitle "title" output.check + publisher empty$ + { format.number.series outputc.nonnull } + { formatc.publisher.address output + format.book.pages output + } + if$ + format.urldate output + format.doi output + format.url output + format.urllink output + format.note output + fin.entry +} +FUNCTION {booklet} +{ output.bibitem + format.authors output + author format.key output + format.date "year" output.check + date.block + format.title "title" output.check + howpublished "howpublished" bibinfo.check output + address "address" bibinfo.check output + format.book.pages output + format.urldate output + format.doi output + format.url output + format.urllink output + format.note output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + editor format.key output + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + format.date "year" output.check + date.block + format.btitle "title" output.check + publisher empty$ + { format.number.series outputc.nonnull } + { formatc.publisher.address output + format.book.pages output + } +% crossref missing$ +% { +% format.bvolume output +% format.chapter.pages "chapter and pages" output.check +% format.number.series output +% format.edition output +% formatc.publisher.address output +% } +% { +% format.chapter.pages "chapter and pages" output.check +% format.book.crossref output.nonnull +% } + if$ + format.urldate output + format.doi output + format.url output + format.urllink output + format.note output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + format.title "title" output.check + publisher empty$ + { formatc.in.ed.booktitle "booktitle" output.check + format.number.series outputc.nonnull } + { formatc.in.ed.booktitle "booktitle" output.check + formatc.publisher.address output + format.book.pages output + } +% crossref missing$ +% { format.in.ed.booktitle "booktitle" output.check +% format.number.series output +% format.edition output +% format.chapter.pages output +% formatc.publisher.address output +% } +% { format.incoll.inproc.crossref output.nonnull +% format.chapter.pages output +% } + if$ + format.urldate output + format.doi output + format.url output + format.urllink output + format.note output + fin.entry +} +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + format.title "title" output.check + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.number.series output + publisher empty$ + { format.organization.address output } + { organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + format.pages output + } + { format.incoll.inproc.crossref output.nonnull + format.pages output + } + if$ + format.urldate output + format.doi output + format.url output + format.urllink output + format.note output + fin.entry +} +FUNCTION {conference} { inproceedings } +FUNCTION {manual} +{ output.bibitem + format.authors output + author format.key output + format.date "year" output.check + date.block + format.btitle "title" output.check + organization "organization" bibinfo.check output + address "address" bibinfo.check output + format.edition output + format.urldate output + format.doi output + format.url output + format.urllink output + format.note output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + format.title + "title" output.check + bbl.mthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.urldate output + format.doi output + format.url output + format.urllink output + format.note output + format.book.pages output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + author format.key output + format.date "year" output.check + date.block + format.title output + howpublished "howpublished" bibinfo.check output + format.urldate output + format.doi output + format.url output + format.urllink output + format.note output + fin.entry +} +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + format.title + "title" output.check + bbl.phdthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.urldate output + format.doi output + format.url output + format.urllink output + format.note output + format.book.pages output + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + format.editors output + editor format.key output + format.date "year" output.check + date.block + format.btitle "title" output.check + format.bvolume output + format.number.series output + publisher empty$ + { format.organization.address output } + { organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + format.urldate output + format.doi output + format.url output + format.urllink output + format.note output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + format.title + "title" output.check + % format.tr.number emphasize output.nonnull + institution "institution" bibinfo.warn output + address "address" bibinfo.check output + format.book.pages output + fin.entry +} + +FUNCTION {online} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + format.title + "title" output.check + % format.tr.number emphasize output.nonnull + + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + author format.key output + format.date "year" output.check + date.block + format.title "title" output.check + format.urldate output + format.doi output + format.url output + format.urllink output + format.note "note" output.check + fin.entry +} + +FUNCTION {default.type} { misc } +READ +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} +INTEGERS { len } +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} +FUNCTION {format.lab.names} +{ 's := + "" 't := + s #1 "{vv~}{ll}" format.name$ + s num.names$ duplicate$ + #2 > + { pop$ + " " * bbl.etal * + cite.name.font + "others" 't := + } + { #2 < + 'skip$ + { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { + " " * bbl.etal * + cite.name.font + "others" 't := + } + { bbl.and space.word * s #2 "{vv~}{ll}" format.name$ + * } + if$ + } + if$ + } + if$ + t "others" = + 'skip$ + { cite.name.font } + if$ +} + +FUNCTION {author.key.label} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.editor.key.label} +{ author empty$ + { editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.label} +{ editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {calc.short.authors} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.label + { type$ "proceedings" = + 'editor.key.label + 'author.key.label + if$ + } + if$ + 'short.list := +} + +FUNCTION {calc.label} +{ calc.short.authors + short.list + "(" + * + year duplicate$ empty$ + short.list key field.or.null = or + { pop$ "" } + 'skip$ + if$ + * + 'label := +} + +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" + format.name$ 't := + nameptr #1 > + { + " " * + namesleft #1 = t "others" = and + { "zzzzz" 't := } + 'skip$ + if$ + numnames #2 > nameptr #2 = and + { "zz" * year field.or.null * " " * + #1 'namesleft := + } + { t sortify * } + if$ + } + { t sortify * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {editor.sort} +{ editor empty$ + { key empty$ + { "to sort, need editor or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ +} +FUNCTION {presort} +{ calc.label + label sortify + " " + * + type$ "book" = + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.sort + 'author.sort + if$ + } + if$ + #1 entry.max$ substring$ + 'sort.label := + sort.label + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {presort} +SORT +STRINGS { last.label next.extra } +INTEGERS { last.extra.num last.extra.num.extended last.extra.num.blank number.label } +FUNCTION {initialize.extra.label.stuff} +{ #0 int.to.chr$ 'last.label := + "" 'next.extra := + #0 'last.extra.num := + "a" chr.to.int$ #1 - 'last.extra.num.blank := + last.extra.num.blank 'last.extra.num.extended := + #0 'number.label := +} +FUNCTION {forward.pass} +{ last.label label = + { last.extra.num #1 + 'last.extra.num := + last.extra.num "z" chr.to.int$ > + { "a" chr.to.int$ 'last.extra.num := + last.extra.num.extended #1 + 'last.extra.num.extended := + } + 'skip$ + if$ + last.extra.num.extended last.extra.num.blank > + { last.extra.num.extended int.to.chr$ + last.extra.num int.to.chr$ + * 'extra.label := } + { last.extra.num int.to.chr$ 'extra.label := } + if$ + } + { "a" chr.to.int$ 'last.extra.num := + "" 'extra.label := + label 'last.label := + } + if$ + number.label #1 + 'number.label := +} +FUNCTION {reverse.pass} +{ next.extra "b" = + { "a" 'extra.label := } + 'skip$ + if$ + extra.label 'next.extra := + extra.label + duplicate$ empty$ + 'skip$ + { "{\natexlab{" swap$ * "}}" * } + if$ + 'extra.label := + label extra.label * 'label := +} +EXECUTE {initialize.extra.label.stuff} +ITERATE {forward.pass} +REVERSE {reverse.pass} +FUNCTION {bib.sort.order} +{ sort.label + " " + * + year field.or.null sortify + * + #1 entry.max$ substring$ + 'sort.key$ := +} +ITERATE {bib.sort.order} +SORT +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" number.label int.to.str$ * "}" * + write$ newline$ + "\providecommand{\natexlab}[1]{#1}" + write$ newline$ + "\expandafter\ifx\csname urlstyle\endcsname\relax" + write$ newline$ + " \providecommand{\doi}[1]{doi:\discretionary{}{}{}#1}\else" + write$ newline$ + " \providecommand{\doi}{doi:\discretionary{}{}{}\begingroup \urlstyle{rm}\Url}\fi" + write$ newline$ +} +EXECUTE {begin.bib} +EXECUTE {init.state.consts} +ITERATE {call.type$} +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} +EXECUTE {end.bib} +%% End of customized bst file +%% +%% End of file `agufull08.bst'. diff --git a/make/makefile b/make/makefile index 229db4c9bc3..d7d5d3cef71 100644 --- a/make/makefile +++ b/make/makefile @@ -1,40 +1,41 @@ -# makefile created by pymake (version 1.2.9.dev0) for the 'mf6' executable. +# makefile created by pymake (version 1.2.7) for the 'mf6' executable. include ./makedefaults # Define the source file directories SOURCEDIR1=../src -SOURCEDIR2=../src/Exchange -SOURCEDIR3=../src/Timing +SOURCEDIR2=../src/Distributed +SOURCEDIR3=../src/Exchange SOURCEDIR4=../src/Model SOURCEDIR5=../src/Model/Connection -SOURCEDIR6=../src/Model/ModelUtilities -SOURCEDIR7=../src/Model/GroundWaterFlow -SOURCEDIR8=../src/Model/Geometry -SOURCEDIR9=../src/Model/TransportModel -SOURCEDIR10=../src/Model/GroundWaterTransport -SOURCEDIR11=../src/Solution -SOURCEDIR12=../src/Solution/LinearMethods -SOURCEDIR13=../src/Solution/PETSc -SOURCEDIR14=../src/Distributed -SOURCEDIR15=../src/Utilities -SOURCEDIR16=../src/Utilities/TimeSeries -SOURCEDIR17=../src/Utilities/Idm -SOURCEDIR18=../src/Utilities/Idm/selector +SOURCEDIR6=../src/Model/Geometry +SOURCEDIR7=../src/Model/GroundWaterEnergy +SOURCEDIR8=../src/Model/GroundWaterFlow +SOURCEDIR9=../src/Model/GroundWaterTransport +SOURCEDIR10=../src/Model/ModelUtilities +SOURCEDIR11=../src/Model/TransportModel +SOURCEDIR12=../src/Solution +SOURCEDIR13=../src/Solution/LinearMethods +SOURCEDIR14=../src/Solution/PETSc +SOURCEDIR15=../src/Timing +SOURCEDIR16=../src/Utilities +SOURCEDIR17=../src/Utilities/ArrayRead +SOURCEDIR18=../src/Utilities/Idm SOURCEDIR19=../src/Utilities/Idm/mf6blockfile -SOURCEDIR20=../src/Utilities/ArrayRead -SOURCEDIR21=../src/Utilities/Memory -SOURCEDIR22=../src/Utilities/Matrix -SOURCEDIR23=../src/Utilities/Vector -SOURCEDIR24=../src/Utilities/Observation -SOURCEDIR25=../src/Utilities/OutputControl -SOURCEDIR26=../src/Utilities/Libraries -SOURCEDIR27=../src/Utilities/Libraries/rcm -SOURCEDIR28=../src/Utilities/Libraries/sparskit2 -SOURCEDIR29=../src/Utilities/Libraries/sparsekit -SOURCEDIR30=../src/Utilities/Libraries/blas -SOURCEDIR31=../src/Utilities/Libraries/daglib +SOURCEDIR20=../src/Utilities/Idm/selector +SOURCEDIR21=../src/Utilities/Libraries +SOURCEDIR22=../src/Utilities/Libraries/blas +SOURCEDIR23=../src/Utilities/Libraries/daglib +SOURCEDIR24=../src/Utilities/Libraries/rcm +SOURCEDIR25=../src/Utilities/Libraries/sparsekit +SOURCEDIR26=../src/Utilities/Libraries/sparskit2 +SOURCEDIR27=../src/Utilities/Matrix +SOURCEDIR28=../src/Utilities/Memory +SOURCEDIR29=../src/Utilities/Observation +SOURCEDIR30=../src/Utilities/OutputControl +SOURCEDIR31=../src/Utilities/TimeSeries +SOURCEDIR32=../src/Utilities/Vector VPATH = \ ${SOURCEDIR1} \ @@ -67,7 +68,8 @@ ${SOURCEDIR27} \ ${SOURCEDIR28} \ ${SOURCEDIR29} \ ${SOURCEDIR30} \ -${SOURCEDIR31} +${SOURCEDIR31} \ +${SOURCEDIR32} .SUFFIXES: .f90 .F90 .o @@ -115,15 +117,25 @@ $(OBJDIR)/gwf3disv8idm.o \ $(OBJDIR)/gwf3disu8idm.o \ $(OBJDIR)/gwf3dis8idm.o \ $(OBJDIR)/gwf3chd8idm.o \ +$(OBJDIR)/gwe1idm.o \ +$(OBJDIR)/gwe1ic1idm.o \ +$(OBJDIR)/gwe1disv1idm.o \ +$(OBJDIR)/gwe1disu1idm.o \ +$(OBJDIR)/gwe1dis1idm.o \ +$(OBJDIR)/gwe1ctp1idm.o \ +$(OBJDIR)/gwe1cnd1idm.o \ $(OBJDIR)/gwtgwtidm.o \ $(OBJDIR)/gwfgwtidm.o \ $(OBJDIR)/gwfgwfidm.o \ +$(OBJDIR)/gwfgweidm.o \ +$(OBJDIR)/gwegweidm.o \ $(OBJDIR)/LongLineReader.o \ $(OBJDIR)/DevFeature.o \ $(OBJDIR)/MemoryList.o \ $(OBJDIR)/IdmSimDfnSelector.o \ $(OBJDIR)/IdmGwtDfnSelector.o \ $(OBJDIR)/IdmGwfDfnSelector.o \ +$(OBJDIR)/IdmGweDfnSelector.o \ $(OBJDIR)/IdmExgDfnSelector.o \ $(OBJDIR)/TimeSeriesRecord.o \ $(OBJDIR)/MathUtil.o \ @@ -199,6 +211,7 @@ $(OBJDIR)/VirtualModel.o \ $(OBJDIR)/BaseExchange.o \ $(OBJDIR)/tsp1fmi1.o \ $(OBJDIR)/GwtSpc.o \ +$(OBJDIR)/GweInputData.o \ $(OBJDIR)/OutputControl.o \ $(OBJDIR)/tsp1ic1.o \ $(OBJDIR)/TspAdvOptions.o \ @@ -233,6 +246,7 @@ $(OBJDIR)/Mover.o \ $(OBJDIR)/GwfMvrPeriodData.o \ $(OBJDIR)/ims8misc.o \ $(OBJDIR)/GwfBuyInputData.o \ +$(OBJDIR)/GweCndOptions.o \ $(OBJDIR)/VirtualSolution.o \ $(OBJDIR)/SparseMatrix.o \ $(OBJDIR)/LinearSolverBase.o \ @@ -266,6 +280,14 @@ $(OBJDIR)/gwf3buy8.o \ $(OBJDIR)/GhostNode.o \ $(OBJDIR)/gwf3evt8.o \ $(OBJDIR)/gwf3chd8.o \ +$(OBJDIR)/gwe1uze1.o \ +$(OBJDIR)/gwe1sfe1.o \ +$(OBJDIR)/gwe1mwe1.o \ +$(OBJDIR)/gwe1lke1.o \ +$(OBJDIR)/gwe1est1.o \ +$(OBJDIR)/gwe1esl1.o \ +$(OBJDIR)/gwe1ctp1.o \ +$(OBJDIR)/gwe1cnd1.o \ $(OBJDIR)/RouterBase.o \ $(OBJDIR)/ImsLinearSolver.o \ $(OBJDIR)/ims8base.o \ @@ -280,6 +302,7 @@ $(OBJDIR)/DistributedVariable.o \ $(OBJDIR)/gwt1.o \ $(OBJDIR)/gwf3.o \ $(OBJDIR)/GwfExchangeMover.o \ +$(OBJDIR)/gwe1.o \ $(OBJDIR)/SerialRouter.o \ $(OBJDIR)/Timer.o \ $(OBJDIR)/LinearSolverFactory.o \ @@ -295,6 +318,8 @@ $(OBJDIR)/GwtInterfaceModel.o \ $(OBJDIR)/GwtGwtExchange.o \ $(OBJDIR)/GwfInterfaceModel.o \ $(OBJDIR)/GwfGwfExchange.o \ +$(OBJDIR)/GweInterfaceModel.o \ +$(OBJDIR)/GweGweExchange.o \ $(OBJDIR)/RouterFactory.o \ $(OBJDIR)/NumericalSolution.o \ $(OBJDIR)/MappedMemory.o \ @@ -304,6 +329,7 @@ $(OBJDIR)/LoadMf6File.o \ $(OBJDIR)/ExplicitSolution.o \ $(OBJDIR)/GwtGwtConnection.o \ $(OBJDIR)/GwfGwfConnection.o \ +$(OBJDIR)/GweGweConnection.o \ $(OBJDIR)/VirtualDataManager.o \ $(OBJDIR)/Mapper.o \ $(OBJDIR)/IdmMf6File.o \ @@ -312,9 +338,12 @@ $(OBJDIR)/VirtualGwtModel.o \ $(OBJDIR)/VirtualGwtExchange.o \ $(OBJDIR)/VirtualGwfModel.o \ $(OBJDIR)/VirtualGwfExchange.o \ +$(OBJDIR)/VirtualGweModel.o \ +$(OBJDIR)/VirtualGweExchange.o \ $(OBJDIR)/SolutionGroup.o \ $(OBJDIR)/SolutionFactory.o \ $(OBJDIR)/GwfGwtExchange.o \ +$(OBJDIR)/GwfGweExchange.o \ $(OBJDIR)/RunControl.o \ $(OBJDIR)/SourceLoad.o \ $(OBJDIR)/ModelPackageInputs.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index 8d3b1c90737..b9cbf1a7366 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -95,6 +95,8 @@ + + @@ -105,7 +107,11 @@ + + + + @@ -121,6 +127,8 @@ + + @@ -131,6 +139,23 @@ + + + + + + + + + + + + + + + + + @@ -201,6 +226,8 @@ + + @@ -308,6 +335,7 @@ + diff --git a/src/Distributed/VirtualDataContainer.f90 b/src/Distributed/VirtualDataContainer.f90 index d8ca55e4fed..3350bd64e5b 100644 --- a/src/Distributed/VirtualDataContainer.f90 +++ b/src/Distributed/VirtualDataContainer.f90 @@ -16,10 +16,13 @@ module VirtualDataContainerModule integer(I4B), public, parameter :: VDC_UNKNOWN_TYPE = 0 integer(I4B), public, parameter :: VDC_GWFMODEL_TYPE = 1 integer(I4B), public, parameter :: VDC_GWTMODEL_TYPE = 2 - integer(I4B), public, parameter :: VDC_GWFEXG_TYPE = 3 - integer(I4B), public, parameter :: VDC_GWTEXG_TYPE = 4 - integer(I4B), public, parameter :: VDC_GWFMVR_TYPE = 5 - integer(I4B), public, parameter :: VDC_GWTMVT_TYPE = 6 + integer(I4B), public, parameter :: VDC_GWEMODEL_TYPE = 3 + integer(I4B), public, parameter :: VDC_GWFEXG_TYPE = 4 + integer(I4B), public, parameter :: VDC_GWTEXG_TYPE = 5 + integer(I4B), public, parameter :: VDC_GWEEXG_TYPE = 6 + integer(I4B), public, parameter :: VDC_GWFMVR_TYPE = 7 + integer(I4B), public, parameter :: VDC_GWTMVT_TYPE = 8 + integer(I4B), public, parameter :: VDC_GWEMVE_TYPE = 9 !> @brief Wrapper for virtual data containers !! @@ -449,10 +452,13 @@ function VDC_TYPE_TO_STR(cntr_type) result(cntr_str) if (cntr_type == VDC_UNKNOWN_TYPE) then; cntr_str = "unknown" else if (cntr_type == VDC_GWFMODEL_TYPE) then; cntr_str = "GWF Model" else if (cntr_type == VDC_GWTMODEL_TYPE) then; cntr_str = "GWT Model" + else if (cntr_type == VDC_GWEMODEL_TYPE) then; cntr_str = "GWE Model" else if (cntr_type == VDC_GWFEXG_TYPE) then; cntr_str = "GWF Exchange" else if (cntr_type == VDC_GWTEXG_TYPE) then; cntr_str = "GWT Exchange" + else if (cntr_type == VDC_GWEEXG_TYPE) then; cntr_str = "GWE Exchange" else if (cntr_type == VDC_GWFMVR_TYPE) then; cntr_str = "GWF Mover" else if (cntr_type == VDC_GWTMVT_TYPE) then; cntr_str = "GWT Mover" + else if (cntr_type == VDC_GWEMVE_TYPE) then; cntr_str = "GWE Mover" else; cntr_str = "Undefined" end if diff --git a/src/Distributed/VirtualGweExchange.f90 b/src/Distributed/VirtualGweExchange.f90 new file mode 100644 index 00000000000..2cb9b6483c2 --- /dev/null +++ b/src/Distributed/VirtualGweExchange.f90 @@ -0,0 +1,109 @@ +module VirtualGweExchangeModule + use KindModule, only: I4B + use SimStagesModule + use VirtualBaseModule + use VirtualDataListsModule, only: virtual_exchange_list + use VirtualDataContainerModule, only: VDC_GWEEXG_TYPE + use VirtualExchangeModule + implicit none + private + + public :: add_virtual_gwe_exchange + + type, public, extends(VirtualExchangeType) :: VirtualGweExchangeType + type(VirtualDbl1dType), pointer :: gwfsimvals => null() + contains + procedure :: create => vtx_create + procedure :: destroy => vtx_destroy + procedure :: prepare_stage => vtx_prepare_stage + ! private + procedure, private :: init_virtual_data + procedure, private :: allocate_data + procedure, private :: deallocate_data + end type VirtualGweExchangeType + +contains + +!> @brief Add a virtual GWE-GWE exchange to the simulation +!< + subroutine add_virtual_gwe_exchange(name, exchange_id, model1_id, model2_id) + character(len=*) :: name + integer(I4B) :: exchange_id + integer(I4B) :: model1_id + integer(I4B) :: model2_id + ! local + class(VirtualGweExchangeType), pointer :: v_exg + class(*), pointer :: obj_ptr + + allocate (v_exg) + call v_exg%create(name, exchange_id, model1_id, model2_id) + + obj_ptr => v_exg + call virtual_exchange_list%Add(obj_ptr) + + end subroutine add_virtual_gwe_exchange + +!> @brief Create a virtual GWE-GWE exchange +!< + subroutine vtx_create(this, name, exg_id, m1_id, m2_id) + class(VirtualGweExchangeType) :: this + character(len=*) :: name + integer(I4B) :: exg_id + integer(I4B) :: m1_id + integer(I4B) :: m2_id + + ! create base + call this%VirtualExchangeType%create(name, exg_id, m1_id, m2_id) + this%container_type = VDC_GWEEXG_TYPE + + call this%allocate_data() + call this%init_virtual_data() + + end subroutine vtx_create + + subroutine init_virtual_data(this) + class(VirtualGweExchangeType) :: this + + call this%set(this%gwfsimvals%base(), 'GWFSIMVALS', '', MAP_ALL_TYPE) + + end subroutine init_virtual_data + + subroutine vtx_prepare_stage(this, stage) + class(VirtualGweExchangeType) :: this + integer(I4B) :: stage + ! local + integer(I4B) :: nexg + + ! prepare base exchange data items + call this%VirtualExchangeType%prepare_stage(stage) + + if (stage == STG_BFR_CON_AR) then + nexg = this%nexg%get() + call this%map(this%gwfsimvals%base(), nexg, (/STG_BFR_EXG_AD/)) + end if + + end subroutine vtx_prepare_stage + + subroutine vtx_destroy(this) + class(VirtualGweExchangeType) :: this + + call this%VirtualExchangeType%destroy() + call this%deallocate_data() + + end subroutine vtx_destroy + + subroutine allocate_data(this) + class(VirtualGweExchangeType) :: this + + allocate (this%gwfsimvals) + + end subroutine allocate_data + + subroutine deallocate_data(this) + class(VirtualGweExchangeType) :: this + + deallocate (this%gwfsimvals) + + end subroutine deallocate_data + +end module VirtualGweExchangeModule diff --git a/src/Distributed/VirtualGweModel.f90 b/src/Distributed/VirtualGweModel.f90 new file mode 100644 index 00000000000..ef9c93cf696 --- /dev/null +++ b/src/Distributed/VirtualGweModel.f90 @@ -0,0 +1,211 @@ +module VirtualGweModelModule + use KindModule, only: I4B + use SimStagesModule + use VirtualBaseModule + use VirtualDataContainerModule, only: VDC_GWEMODEL_TYPE + use VirtualModelModule + use NumericalModelModule, only: NumericalModelType + implicit none + private + + public :: add_virtual_gwe_model + + type, extends(VirtualModelType) :: VirtualGweModelType + ! CND + !type(VirtualIntType), pointer :: cnd_idiffc => null() + type(VirtualIntType), pointer :: cnd_idisp => null() + !type(VirtualDbl1dType), pointer :: cnd_diffc => null() + type(VirtualDbl1dType), pointer :: cnd_alh => null() + type(VirtualDbl1dType), pointer :: cnd_alv => null() + type(VirtualDbl1dType), pointer :: cnd_ath1 => null() + type(VirtualDbl1dType), pointer :: cnd_ath2 => null() + type(VirtualDbl1dType), pointer :: cnd_atv => null() + type(VirtualDbl1dType), pointer :: cnd_ktw => null() + type(VirtualDbl1dType), pointer :: cnd_kts => null() + ! FMI + type(VirtualDbl1dType), pointer :: fmi_gwfhead => null() + type(VirtualDbl1dType), pointer :: fmi_gwfsat => null() + type(VirtualDbl2dType), pointer :: fmi_gwfspdis => null() + type(VirtualDbl1dType), pointer :: fmi_gwfflowja => null() + ! EST + type(VirtualDbl1dType), pointer :: est_porosity => null() + ! GWE Model fields + type(VirtualIntType), pointer :: incnd => null() + type(VirtualIntType), pointer :: inest => null() + contains + ! public + procedure :: create => vgwe_create + procedure :: prepare_stage => vgwe_prepare_stage + procedure :: destroy => vgwe_destroy + ! private + procedure, private :: init_virtual_data + procedure, private :: allocate_data + procedure, private :: deallocate_data + end type VirtualGweModelType + +contains + + subroutine add_virtual_gwe_model(model_id, model_name, model) + use VirtualDataListsModule, only: virtual_model_list + integer(I4B) :: model_id !< global model id + character(len=*) :: model_name !< model name + class(NumericalModelType), pointer :: model !< the actual model (can be null() when remote) + ! local + class(VirtualGweModelType), pointer :: virtual_gwe_model + class(*), pointer :: obj + + allocate (virtual_gwe_model) + call virtual_gwe_model%create(model_name, model_id, model) + + obj => virtual_gwe_model + call virtual_model_list%Add(obj) + + end subroutine add_virtual_gwe_model + + subroutine vgwe_create(this, name, id, model) + class(VirtualGweModelType) :: this + character(len=*) :: name + integer(I4B) :: id + class(NumericalModelType), pointer :: model + + ! create base + call this%VirtualModelType%create(name, id, model) + this%container_type = VDC_GWEMODEL_TYPE + + call this%allocate_data() + call this%init_virtual_data() + + end subroutine vgwe_create + + subroutine init_virtual_data(this) + class(VirtualGweModelType) :: this + + !call this%set(this%cnd_idiffc%base(), 'IDIFFC', 'CND', MAP_ALL_TYPE) + call this%set(this%cnd_idisp%base(), 'IDISP', 'CND', MAP_ALL_TYPE) + !call this%set(this%cnd_diffc%base(), 'DIFFC', 'CND', MAP_NODE_TYPE) + call this%set(this%cnd_alh%base(), 'ALH', 'CND', MAP_NODE_TYPE) + call this%set(this%cnd_alv%base(), 'ALV', 'CND', MAP_NODE_TYPE) + call this%set(this%cnd_ath1%base(), 'ATH1', 'CND', MAP_NODE_TYPE) + call this%set(this%cnd_ath2%base(), 'ATH2', 'CND', MAP_NODE_TYPE) + call this%set(this%cnd_atv%base(), 'ATV', 'CND', MAP_NODE_TYPE) + call this%set(this%cnd_ktw%base(), 'KTW', 'CND', MAP_NODE_TYPE) + call this%set(this%cnd_kts%base(), 'KTS', 'CND', MAP_NODE_TYPE) + call this%set(this%fmi_gwfhead%base(), 'GWFHEAD', 'FMI', MAP_NODE_TYPE) + call this%set(this%fmi_gwfsat%base(), 'GWFSAT', 'FMI', MAP_NODE_TYPE) + call this%set(this%fmi_gwfspdis%base(), 'GWFSPDIS', 'FMI', MAP_NODE_TYPE) + call this%set(this%fmi_gwfflowja%base(), 'GWFFLOWJA', 'FMI', MAP_CONN_TYPE) + call this%set(this%est_porosity%base(), 'POROSITY', 'EST', MAP_NODE_TYPE) + call this%set(this%incnd%base(), 'INCND', '', MAP_ALL_TYPE) + call this%set(this%inest%base(), 'INEST', '', MAP_ALL_TYPE) + + end subroutine init_virtual_data + + subroutine vgwe_prepare_stage(this, stage) + class(VirtualGweModelType) :: this + integer(I4B) :: stage + ! local + integer(I4B) :: nr_nodes, nr_conns + + ! prepare base (=numerical) model data items + call this%VirtualModelType%prepare_stage(stage) + + nr_nodes = 0 + nr_conns = 0 + + if (stage == STG_AFT_MDL_DF) then + + !call this%map(this%cnd_idiffc%base(), (/STG_AFT_MDL_DF/)) + call this%map(this%cnd_idisp%base(), (/STG_AFT_MDL_DF/)) + call this%map(this%incnd%base(), (/STG_AFT_MDL_DF/)) + call this%map(this%inest%base(), (/STG_AFT_MDL_DF/)) + + else if (stage == STG_BFR_CON_AR) then + + nr_nodes = this%element_maps(MAP_NODE_TYPE)%nr_virt_elems + nr_conns = this%element_maps(MAP_CONN_TYPE)%nr_virt_elems + + call this%map(this%x%base(), nr_nodes, & + (/STG_BFR_CON_AR, STG_BFR_EXG_AD, STG_BFR_EXG_CF/)) + call this%map(this%ibound%base(), nr_nodes, (/STG_BFR_CON_AR/)) + + !if (this%cnd_idiffc%get() > 0) then + ! call this%map(this%cnd_diffc%base(), nr_nodes, (/STG_BFR_CON_AR/)) + !end if + + if (this%cnd_idisp%get() > 0) then + call this%map(this%cnd_alh%base(), nr_nodes, (/STG_BFR_CON_AR/)) + call this%map(this%cnd_alv%base(), nr_nodes, (/STG_BFR_CON_AR/)) + call this%map(this%cnd_ath1%base(), nr_nodes, (/STG_BFR_CON_AR/)) + call this%map(this%cnd_ath2%base(), nr_nodes, (/STG_BFR_CON_AR/)) + call this%map(this%cnd_atv%base(), nr_nodes, (/STG_BFR_CON_AR/)) + call this%map(this%cnd_ktw%base(), nr_nodes, (/STG_BFR_CON_AR/)) + end if + + call this%map(this%fmi_gwfhead%base(), nr_nodes, (/STG_BFR_EXG_AD/)) + call this%map(this%fmi_gwfsat%base(), nr_nodes, (/STG_BFR_EXG_AD/)) + call this%map(this%fmi_gwfspdis%base(), 3, nr_nodes, (/STG_BFR_EXG_AD/)) + call this%map(this%fmi_gwfflowja%base(), nr_conns, (/STG_BFR_EXG_AD/)) + + if (this%incnd%get() > 0 .and. this%inest%get() > 0) then + call this%map(this%est_porosity%base(), nr_nodes, (/STG_AFT_CON_AR/)) + end if + + end if + + end subroutine vgwe_prepare_stage + + subroutine allocate_data(this) + class(VirtualGweModelType) :: this + + !allocate (this%cnd_idiffc) + allocate (this%cnd_idisp) + !allocate (this%cnd_diffc) + allocate (this%cnd_alh) + allocate (this%cnd_alv) + allocate (this%cnd_ath1) + allocate (this%cnd_ath2) + allocate (this%cnd_atv) + allocate (this%cnd_ktw) + allocate (this%cnd_kts) + allocate (this%fmi_gwfhead) + allocate (this%fmi_gwfsat) + allocate (this%fmi_gwfspdis) + allocate (this%fmi_gwfflowja) + allocate (this%est_porosity) + allocate (this%incnd) + allocate (this%inest) + + end subroutine allocate_data + + subroutine deallocate_data(this) + class(VirtualGweModelType) :: this + + !deallocate (this%cnd_idiffc) + deallocate (this%cnd_idisp) + !deallocate (this%cnd_diffc) + deallocate (this%cnd_alh) + deallocate (this%cnd_alv) + deallocate (this%cnd_ath1) + deallocate (this%cnd_ath2) + deallocate (this%cnd_atv) + deallocate (this%cnd_ktw) + deallocate (this%cnd_kts) + deallocate (this%fmi_gwfhead) + deallocate (this%fmi_gwfsat) + deallocate (this%fmi_gwfspdis) + deallocate (this%fmi_gwfflowja) + deallocate (this%est_porosity) + deallocate (this%incnd) + deallocate (this%inest) + + end subroutine deallocate_data + + subroutine vgwe_destroy(this) + class(VirtualGweModelType) :: this + + call this%VirtualModelType%destroy() + call this%deallocate_data() + + end subroutine vgwe_destroy + +end module VirtualGweModelModule diff --git a/src/Exchange/GweGweExchange.f90 b/src/Exchange/GweGweExchange.f90 new file mode 100644 index 00000000000..0593bd15eea --- /dev/null +++ b/src/Exchange/GweGweExchange.f90 @@ -0,0 +1,1246 @@ +!> @brief This module contains the GweGweExchangeModule Module +!! +!! This module contains the code for connecting two GWE Models. +!! The methods are based on the simple two point flux approximation +!! with the option to use ghost nodes to improve accuracy. This +!! exchange is used by GweGweConnection with the more sophisticated +!! interface model coupling approach when XT3D is needed. +!! +!< +module GweGweExchangeModule + + use KindModule, only: DP, I4B, LGP + use SimVariablesModule, only: errmsg, model_loc_idx + use SimModule, only: store_error, store_error_filename, & + count_errors, ustop + use BaseModelModule, only: BaseModelType, GetBaseModelFromList + use BaseExchangeModule, only: BaseExchangeType, AddBaseExchangeToList + use ConstantsModule, only: LENBOUNDNAME, NAMEDBOUNDFLAG, LINELENGTH, & + TABCENTER, TABLEFT, LENAUXNAME, DNODATA, & + LENMODELNAME + use ListModule, only: ListType + use ListsModule, only: basemodellist + use VirtualModelModule, only: get_virtual_model + use DisConnExchangeModule, only: DisConnExchangeType + use GweModule, only: GweModelType + use TspMvtModule, only: TspMvtType + use VirtualModelModule, only: VirtualModelType + use ObserveModule, only: ObserveType + use ObsModule, only: ObsType + use TableModule, only: TableType, table_cr + use MatrixBaseModule + + implicit none + + private + public :: GweExchangeType + public :: gweexchange_create + public :: GetGweExchangeFromList + public :: CastAsGweExchange + + !> @brief Derived type for GwtExchangeType + !! + !! This derived type contains information and methods for + !! connecting two GWT models. + !! + !< + type, extends(DisConnExchangeType) :: GweExchangeType + ! + ! -- names of the GWF models that are connected by this exchange + character(len=LENMODELNAME) :: gwfmodelname1 = '' !< name of gwfmodel that corresponds to gwtmodel1 + character(len=LENMODELNAME) :: gwfmodelname2 = '' !< name of gwfmodel that corresponds to gwtmodel2 + real(DP), dimension(:), pointer, contiguous :: gwfsimvals => null() !< simulated gwf flow rate for each exchange + ! + ! -- pointers to gwt models + class(GweModelType), pointer :: gwemodel1 => null() !< pointer to GWT Model 1 + class(GweModelType), pointer :: gwemodel2 => null() !< pointer to GWT Model 2 + ! + ! -- GWT specific option block: + integer(I4B), pointer :: inewton => null() !< unneeded newton flag allows for mvt to be used here + integer(I4B), pointer :: iAdvScheme !< the advection scheme at the interface: + !! 0 = upstream, 1 = central, 2 = TVD + ! + ! -- Mover transport package + integer(I4B), pointer :: inmvt => null() !< unit number for mover transport (0 if off) + type(TspMvtType), pointer :: mvt => null() !< water mover object + ! + ! -- Observation package + integer(I4B), pointer :: inobs => null() !< unit number for GWT-GWT observations + type(ObsType), pointer :: obs => null() !< observation object + ! + ! -- internal data + real(DP), dimension(:), pointer, contiguous :: cond => null() !< conductance + real(DP), dimension(:), pointer, contiguous :: simvals => null() !< simulated flow rate for each exchange + ! + ! -- table objects + type(TableType), pointer :: outputtab1 => null() + type(TableType), pointer :: outputtab2 => null() + + contains + + procedure :: exg_df => gwe_gwe_df + procedure :: exg_ar => gwe_gwe_ar + procedure :: exg_rp => gwe_gwe_rp + procedure :: exg_ad => gwe_gwe_ad + procedure :: exg_fc => gwe_gwe_fc + procedure :: exg_bd => gwe_gwe_bd + procedure :: exg_ot => gwe_gwe_ot + procedure :: exg_da => gwe_gwe_da + procedure :: exg_fp => gwe_gwe_fp + procedure :: connects_model => gwe_gwe_connects_model + procedure :: use_interface_model + procedure :: allocate_scalars + procedure :: allocate_arrays + procedure :: source_options + procedure :: read_mvt + procedure :: gwe_gwe_bdsav + procedure, private :: gwe_gwe_bdsav_model + procedure, private :: gwe_gwe_df_obs + procedure, private :: gwe_gwe_rp_obs + procedure, public :: gwe_gwe_save_simvals + procedure, private :: validate_exchange + end type GweExchangeType + +contains + + !> @ brief Create GWT GWT exchange + !! + !! Create a new GWT to GWT exchange object. + !< + subroutine gweexchange_create(filename, name, id, m1_id, m2_id, input_mempath) + ! -- modules + use BaseModelModule, only: BaseModelType + use ListsModule, only: baseexchangelist + use ObsModule, only: obs_cr + use MemoryHelperModule, only: create_mem_path + ! -- dummy + character(len=*), intent(in) :: filename !< filename for reading + integer(I4B), intent(in) :: id !< id for the exchange + character(len=*) :: name !< the exchange name + integer(I4B), intent(in) :: m1_id !< id for model 1 + integer(I4B), intent(in) :: m2_id !< id for model 2 + character(len=*), intent(in) :: input_mempath + ! -- local + type(GweExchangeType), pointer :: exchange + class(BaseModelType), pointer :: mb + class(BaseExchangeType), pointer :: baseexchange + integer(I4B) :: m1_index, m2_index + ! + ! -- Create a new exchange and add it to the baseexchangelist container + allocate (exchange) + baseexchange => exchange + call AddBaseExchangeToList(baseexchangelist, baseexchange) + ! + ! -- Assign id and name + exchange%id = id + exchange%name = name + exchange%memoryPath = create_mem_path(exchange%name) + exchange%input_mempath = input_mempath + ! + ! -- allocate scalars and set defaults + call exchange%allocate_scalars() + exchange%filename = filename + exchange%typename = 'GWE-GWE' + exchange%iAdvScheme = 0 + exchange%ixt3d = 1 + ! + ! -- set gwemodel1 + m1_index = model_loc_idx(m1_id) + mb => GetBaseModelFromList(basemodellist, m1_index) + if (m1_index > 0) then + select type (mb) + type is (GweModelType) + exchange%model1 => mb + exchange%gwemodel1 => mb + end select + end if + exchange%v_model1 => get_virtual_model(m1_id) + ! + ! -- set gwemodel2 + m2_index = model_loc_idx(m2_id) + if (m2_index > 0) then + mb => GetBaseModelFromList(basemodellist, m2_index) + select type (mb) + type is (GweModelType) + exchange%model2 => mb + exchange%gwemodel2 => mb + end select + end if + exchange%v_model2 => get_virtual_model(m2_id) + ! + ! -- Verify that gwt model1 is of the correct type + if (.not. associated(exchange%gwemodel1) .and. m1_index > 0) then + write (errmsg, '(3a)') 'Problem with GWE-GWE exchange ', & + trim(exchange%name), & + '. First specified GWE Model does not appear to be of the correct type.' + call store_error(errmsg, terminate=.true.) + end if + ! + ! -- Verify that gwe model2 is of the correct type + if (.not. associated(exchange%gwemodel2) .and. m2_index > 0) then + write (errmsg, '(3a)') 'Problem with GWE-GWE exchange ', & + trim(exchange%name), & + '. Second specified GWE Model does not appear to be of the correct type.' + call store_error(errmsg, terminate=.true.) + end if + ! + ! -- Create the obs package + call obs_cr(exchange%obs, exchange%inobs) + ! + ! -- Return + return + end subroutine gweexchange_create + + !> @ brief Define GWE GWE exchange + !! + !! Define GWE to GWE exchange object. + !< + subroutine gwe_gwe_df(this) + ! -- modules + use SimVariablesModule, only: iout + use InputOutputModule, only: getunit, openfile + use GhostNodeModule, only: gnc_cr + ! -- dummy + class(GweExchangeType) :: this !< GwtExchangeType + ! + ! -- log the exchange + write (iout, '(/a,a)') ' Creating exchange: ', this%name + ! + ! -- Ensure models are in same solution + if (associated(this%gwemodel1) .and. associated(this%gwemodel2)) then + if (this%gwemodel1%idsoln /= this%gwemodel2%idsoln) then + call store_error('Two models are connect in a GWE '// & + 'exchange but they are in different solutions. '// & + 'GWE models must be in same solution: '// & + trim(this%gwemodel1%name)//' '// & + trim(this%gwemodel2%name)) + call store_error_filename(this%filename) + end if + end if + ! + ! -- source options + call this%source_options(iout) + ! + ! -- source dimensions + call this%source_dimensions(iout) + ! + ! -- allocate arrays + call this%allocate_arrays() + ! + ! -- source exchange data + call this%source_data(iout) + ! + ! -- Read mover information + if (this%inmvt > 0) then + call this%read_mvt(iout) + call this%mvt%mvt_df(this%gwemodel1%dis) + end if + ! + ! -- Store obs + call this%gwe_gwe_df_obs() + if (associated(this%gwemodel1)) then + call this%obs%obs_df(iout, this%name, 'GWE-GWE', this%gwemodel1%dis) + end if + ! + ! -- validate + call this%validate_exchange() + ! + ! -- Return + return + end subroutine gwe_gwe_df + + !> @brief validate exchange data after reading + !< + subroutine validate_exchange(this) + ! -- dummy + class(GweExchangeType) :: this !< GweExchangeType + ! + + ! Ensure gwfmodel names were entered + if (this%gwfmodelname1 == '') then + write (errmsg, '(3a)') 'GWE-GWE exchange ', trim(this%name), & + ' requires that GWFMODELNAME1 be entered in the & + &OPTIONS block.' + call store_error(errmsg) + end if + if (this%gwfmodelname2 == '') then + write (errmsg, '(3a)') 'GWE-GWE exchange ', trim(this%name), & + ' requires that GWFMODELNAME2 be entered in the & + &OPTIONS block.' + call store_error(errmsg) + end if + ! + ! Periodic boundary condition in exchange don't allow XT3D (=interface model) + if (associated(this%model1, this%model2)) then + if (this%ixt3d > 0) then + write (errmsg, '(3a)') 'GWE-GWE exchange ', trim(this%name), & + ' is a periodic boundary condition which cannot'// & + ' be configured with XT3D' + call store_error(errmsg) + end if + end if + ! + ! Check to see if dispersion is on in either model1 or model2. + ! If so, then ANGLDEGX must be provided as an auxiliary variable for this + ! GWE-GWE exchange (this%ianglex > 0). + if (associated(this%gwemodel1) .and. associated(this%gwemodel2)) then + if (this%gwemodel1%incnd /= 0 .or. this%gwemodel2%incnd /= 0) then + if (this%ianglex == 0) then + write (errmsg, '(3a)') 'GWE-GWE exchange ', trim(this%name), & + ' requires that ANGLDEGX be specified as an'// & + ' auxiliary variable because dispersion was '// & + 'specified in one or both transport models.' + call store_error(errmsg) + end if + end if + end if + ! + if (this%ixt3d > 0 .and. this%ianglex == 0) then + write (errmsg, '(3a)') 'GWE-GWE exchange ', trim(this%name), & + ' requires that ANGLDEGX be specified as an'// & + ' auxiliary variable because XT3D is enabled' + call store_error(errmsg) + end if + ! + if (count_errors() > 0) then + call ustop() + end if + ! + ! -- Return + return + end subroutine validate_exchange + + !> @ brief Allocate and read + !! + !! Allocated and read and calculate saturated conductance + !< + subroutine gwe_gwe_ar(this) + ! -- dummy + class(GweExchangeType) :: this !< GwtExchangeType + ! + ! -- If mover is active, then call ar routine + if (this%inmvt > 0) call this%mvt%mvt_ar() + ! + ! -- Observation AR + call this%obs%obs_ar() + ! + ! -- Return + return + end subroutine gwe_gwe_ar + + !> @ brief Read and prepare + !! + !! Read new data for mover and obs + !< + subroutine gwe_gwe_rp(this) + ! -- modules + use TdisModule, only: readnewdata + ! -- dummy + class(GweExchangeType) :: this !< GweExchangeType + ! + ! -- Check with TDIS on whether or not it is time to RP + if (.not. readnewdata) return + ! + ! -- Read and prepare for mover + if (this%inmvt > 0) call this%mvt%mvt_rp() + ! + ! -- Read and prepare for observations + call this%gwe_gwe_rp_obs() + ! + ! -- Return + return + end subroutine gwe_gwe_rp + + !> @ brief Advance + !! + !! Advance mover and obs + !< + subroutine gwe_gwe_ad(this) + ! -- dummy + class(GweExchangeType) :: this !< GweExchangeType + ! + ! -- Advance mover + !if(this%inmvt > 0) call this%mvt%mvt_ad() + ! + ! -- Push simulated values to preceding time step + call this%obs%obs_ad() + ! + ! -- Return + return + end subroutine gwe_gwe_ad + + !> @ brief Fill coefficients + !! + !! Calculate conductance and fill coefficient matrix + !< + subroutine gwe_gwe_fc(this, kiter, matrix_sln, rhs_sln, inwtflag) + ! -- dummy + class(GweExchangeType) :: this !< GwtExchangeType + integer(I4B), intent(in) :: kiter + class(MatrixBaseType), pointer :: matrix_sln + real(DP), dimension(:), intent(inout) :: rhs_sln + integer(I4B), optional, intent(in) :: inwtflag + ! + ! -- Call mvt fc routine + if (this%inmvt > 0) call this%mvt%mvt_fc(this%gwemodel1%x, this%gwemodel2%x) + ! + ! -- Return + return + end subroutine gwe_gwe_fc + + !> @ brief Budget + !! + !! Accumulate budget terms + !< + subroutine gwe_gwe_bd(this, icnvg, isuppress_output, isolnid) + ! -- modules + use ConstantsModule, only: DZERO, LENBUDTXT, LENPACKAGENAME + use BudgetModule, only: rate_accumulator + ! -- dummy + class(GweExchangeType) :: this !< GweExchangeType + integer(I4B), intent(inout) :: icnvg + integer(I4B), intent(in) :: isuppress_output + integer(I4B), intent(in) :: isolnid + ! -- local + character(len=LENBUDTXT), dimension(1) :: budtxt + real(DP), dimension(2, 1) :: budterm + real(DP) :: ratin, ratout + ! + ! -- initialize + budtxt(1) = ' FLOW-JA-FACE' + ! + ! -- Calculate ratin/ratout and pass to model budgets + call rate_accumulator(this%simvals, ratin, ratout) + ! + ! -- Add the budget terms to model 1 + if (associated(this%gwemodel1)) then + budterm(1, 1) = ratin + budterm(2, 1) = ratout + call this%gwemodel1%model_bdentry(budterm, budtxt, this%name) + end if + ! + ! -- Add the budget terms to model 2 + if (associated(this%gwemodel2)) then + budterm(1, 1) = ratout + budterm(2, 1) = ratin + call this%gwemodel2%model_bdentry(budterm, budtxt, this%name) + end if + ! + ! -- Call mvt bd routine + if (this%inmvt > 0) call this%mvt%mvt_bd(this%gwemodel1%x, this%gwemodel2%x) + ! + ! -- Return + return + end subroutine gwe_gwe_bd + + !> @ brief Budget save + !! + !! Output individual flows to listing file and binary budget files + !< + subroutine gwe_gwe_bdsav(this) + ! -- dummy + class(GweExchangeType) :: this !< GweExchangeType + ! -- local + integer(I4B) :: icbcfl, ibudfl + ! + ! -- budget for model1 + if (associated(this%gwemodel1)) then + call this%gwe_gwe_bdsav_model(this%gwemodel1) + end if + ! + ! -- budget for model2 + if (associated(this%gwemodel2)) then + call this%gwe_gwe_bdsav_model(this%gwemodel2) + end if + ! + ! -- Set icbcfl, ibudfl to zero so that flows will be printed and + ! saved, if the options were set in the MVT package + icbcfl = 1 + ibudfl = 1 + ! + ! -- Call mvt bd routine + !cdl todo: if(this%inmvt > 0) call this%mvt%mvt_bdsav(icbcfl, ibudfl, isuppress_output) + ! + ! -- Calculate and write simulated values for observations + if (this%inobs /= 0) then + call this%gwe_gwe_save_simvals() + end if + ! + ! -- Return + return + end subroutine gwe_gwe_bdsav + + !> @ brief Budget save + !! + !! Output individual flows to listing file and binary budget files + !< + subroutine gwe_gwe_bdsav_model(this, model) + ! -- modules + use ConstantsModule, only: DZERO, LENBUDTXT, LENPACKAGENAME + use TdisModule, only: kstp, kper + ! -- dummy + class(GweExchangeType) :: this !< GwtExchangeType + class(GweModelType), pointer :: model + ! -- local + character(len=LENBOUNDNAME) :: bname + character(len=LENPACKAGENAME + 4) :: packname + character(len=LENBUDTXT), dimension(1) :: budtxt + type(TableType), pointer :: output_tab + class(VirtualModelType), pointer :: nbr_model + character(len=20) :: nodestr + integer(I4B) :: ntabrows + integer(I4B) :: nodeu + integer(I4B) :: i, n1, n2, n1u, n2u + integer(I4B) :: ibinun + real(DP) :: ratin, ratout, rrate + logical(LGP) :: is_for_model1 + integer(I4B) :: isuppress_output + ! + ! -- initialize local variables + isuppress_output = 0 + budtxt(1) = ' FLOW-JA-FACE' + packname = 'EXG '//this%name + packname = adjustr(packname) + if (associated(model, this%gwemodel1)) then + output_tab => this%outputtab1 + nbr_model => this%v_model2 + is_for_model1 = .true. + else + output_tab => this%outputtab2 + nbr_model => this%v_model1 + is_for_model1 = .false. + end if + ! + ! -- update output tables + if (this%iprflow /= 0) then + ! + ! -- update titles + if (model%oc%oc_save('BUDGET')) then + call output_tab%set_title(packname) + end if + ! + ! -- set table kstp and kper + call output_tab%set_kstpkper(kstp, kper) + ! + ! -- update maxbound of tables + ntabrows = 0 + do i = 1, this%nexg + n1 = this%nodem1(i) + n2 = this%nodem2(i) + ! + ! -- If both cells are active then calculate flow rate + if (this%v_model1%ibound%get(n1) /= 0 .and. & + this%v_model2%ibound%get(n2) /= 0) then + ntabrows = ntabrows + 1 + end if + end do + if (ntabrows > 0) then + call output_tab%set_maxbound(ntabrows) + end if + end if + ! + ! -- Print and write budget terms for model 1 + ! + ! -- Set binary unit numbers for saving flows + if (this%ipakcb /= 0) then + ibinun = model%oc%oc_save_unit('BUDGET') + else + ibinun = 0 + end if + ! + ! -- If save budget flag is zero for this stress period, then + ! shut off saving + if (.not. model%oc%oc_save('BUDGET')) ibinun = 0 + if (isuppress_output /= 0) then + ibinun = 0 + end if + ! + ! -- If cell-by-cell flows will be saved as a list, write header. + if (ibinun /= 0) then + call model%dis%record_srcdst_list_header(budtxt(1), & + model%name, & + this%name, & + nbr_model%name, & + this%name, & + this%naux, this%auxname, & + ibinun, this%nexg, & + model%iout) + end if + ! + ! Initialize accumulators + ratin = DZERO + ratout = DZERO + ! + ! -- Loop through all exchanges + do i = 1, this%nexg + ! + ! -- Assign boundary name + if (this%inamedbound > 0) then + bname = this%boundname(i) + else + bname = '' + end if + ! + ! -- Calculate the flow rate between n1 and n2 + rrate = DZERO + n1 = this%nodem1(i) + n2 = this%nodem2(i) + ! + ! -- If both cells are active then calculate flow rate + if (this%v_model1%ibound%get(n1) /= 0 .and. & + this%v_model2%ibound%get(n2) /= 0) then + rrate = this%simvals(i) + ! + ! -- Print the individual rates to model list files if requested + if (this%iprflow /= 0) then + if (model%oc%oc_save('BUDGET')) then + ! + ! -- set nodestr and write outputtab table + if (is_for_model1) then + nodeu = model%dis%get_nodeuser(n1) + call model%dis%nodeu_to_string(nodeu, nodestr) + call output_tab%print_list_entry(i, trim(adjustl(nodestr)), & + rrate, bname) + else + nodeu = model%dis%get_nodeuser(n2) + call model%dis%nodeu_to_string(nodeu, nodestr) + call output_tab%print_list_entry(i, trim(adjustl(nodestr)), & + -rrate, bname) + end if + end if + end if + if (rrate < DZERO) then + ratout = ratout - rrate + else + ratin = ratin + rrate + end if + end if + ! + ! -- If saving cell-by-cell flows in list, write flow + n1u = this%v_model1%dis_get_nodeuser(n1) + n2u = this%v_model2%dis_get_nodeuser(n2) + if (ibinun /= 0) then + if (is_for_model1) then + call model%dis%record_mf6_list_entry( & + ibinun, n1u, n2u, rrate, this%naux, this%auxvar(:, i), & + .false., .false.) + else + call model%dis%record_mf6_list_entry( & + ibinun, n2u, n1u, -rrate, this%naux, this%auxvar(:, i), & + .false., .false.) + end if + end if + ! + end do + ! + ! -- Return + return + end subroutine gwe_gwe_bdsav_model + + !> @ brief Output + !! + !! Write output + !< + subroutine gwe_gwe_ot(this) + ! -- modules + use SimVariablesModule, only: iout + use ConstantsModule, only: DZERO + ! -- dummy + class(GweExchangeType) :: this !< GweExchangeType + ! -- local + integer(I4B) :: iexg, n1, n2 + integer(I4B) :: ibudfl + real(DP) :: flow + character(len=LINELENGTH) :: node1str, node2str + ! -- format + character(len=*), parameter :: fmtheader = & + "(/1x, 'SUMMARY OF EXCHANGE RATES FOR EXCHANGE ', a, ' WITH ID ', i0, /, & + &2a16, 5a16, /, 112('-'))" + character(len=*), parameter :: fmtheader2 = & + "(/1x, 'SUMMARY OF EXCHANGE RATES FOR EXCHANGE ', a, ' WITH ID ', i0, /, & + &2a16, 4a16, /, 96('-'))" + character(len=*), parameter :: fmtdata = & + "(2a16, 5(1pg16.6))" + ! + ! -- Call bdsave + call this%gwe_gwe_bdsav() + ! + ! -- Write a table of exchanges + if (this%iprflow /= 0) then + write (iout, fmtheader2) trim(adjustl(this%name)), this%id, 'NODEM1', & + 'NODEM2', 'COND', 'X_M1', 'X_M2', 'FLOW' + do iexg = 1, this%nexg + n1 = this%nodem1(iexg) + n2 = this%nodem2(iexg) + flow = this%simvals(iexg) + call this%v_model1%dis_noder_to_string(n1, node1str) + call this%v_model2%dis_noder_to_string(n2, node2str) + write (iout, fmtdata) trim(adjustl(node1str)), & + trim(adjustl(node2str)), & + this%cond(iexg), this%v_model1%x%get(n1), & + this%v_model2%x%get(n2), flow + end do + end if + ! + !cdl Implement when MVT is ready + ! -- Mover budget output + ibudfl = 1 + if (this%inmvt > 0) call this%mvt%mvt_ot_bdsummary(ibudfl) + ! + ! -- OBS output + call this%obs%obs_ot() + ! + ! -- Return + return + end subroutine gwe_gwe_ot + + !> @ brief Source options + !! + !! Source the options block + !< + subroutine source_options(this, iout) + ! -- modules + use ConstantsModule, only: LENVARNAME + use InputOutputModule, only: getunit, openfile + use MemoryManagerExtModule, only: mem_set_value + use CharacterStringModule, only: CharacterStringType + use ExgGwegweInputModule, only: ExgGwegweParamFoundType + use SourceCommonModule, only: filein_fname + ! -- dummy + class(GweExchangeType) :: this !< GweExchangeType + integer(I4B), intent(in) :: iout + ! -- local + type(ExgGwegweParamFoundType) :: found + character(len=LENVARNAME), dimension(3) :: adv_scheme = & + &[character(len=LENVARNAME) :: 'UPSTREAM', 'CENTRAL', 'TVD'] + character(len=LINELENGTH) :: mvt_fname + ! + ! -- update defaults with values sourced from input context + call mem_set_value(this%gwfmodelname1, 'GWFMODELNAME1', this%input_mempath, & + found%gwfmodelname1) + call mem_set_value(this%gwfmodelname2, 'GWFMODELNAME2', this%input_mempath, & + found%gwfmodelname2) + call mem_set_value(this%iAdvScheme, 'ADV_SCHEME', this%input_mempath, & + adv_scheme, found%adv_scheme) + call mem_set_value(this%ixt3d, 'CND_XT3D_OFF', this%input_mempath, & + found%cnd_xt3d_off) + call mem_set_value(this%ixt3d, 'CND_XT3D_RHS', this%input_mempath, & + found%cnd_xt3d_rhs) + ! + write (iout, '(1x,a)') 'PROCESSING GWE-GWE EXCHANGE OPTIONS' + ! + ! -- source base class options + call this%DisConnExchangeType%source_options(iout) + ! + if (found%gwfmodelname1) then + write (iout, '(4x,a,a)') & + 'GWFMODELNAME1 IS SET TO: ', trim(this%gwfmodelname1) + end if + ! + if (found%gwfmodelname2) then + write (iout, '(4x,a,a)') & + 'GWFMODELNAME2 IS SET TO: ', trim(this%gwfmodelname2) + end if + ! + if (found%adv_scheme) then + ! -- count from 0 + this%iAdvScheme = this%iAdvScheme - 1 + write (iout, '(4x,a,a)') & + 'ADVECTION SCHEME METHOD HAS BEEN SET TO: ', & + trim(adv_scheme(this%iAdvScheme + 1)) + end if + ! + if (found%cnd_xt3d_off .and. found%cnd_xt3d_rhs) then + errmsg = 'CND_XT3D_OFF and CND_XT3D_RHS cannot both be set as options.' + call store_error(errmsg) + call store_error_filename(this%filename) + else if (found%cnd_xt3d_off) then + this%ixt3d = 0 + write (iout, '(4x,a)') 'XT3D FORMULATION HAS BEEN SHUT OFF.' + else if (found%cnd_xt3d_rhs) then + this%ixt3d = 2 + write (iout, '(4x,a)') 'XT3D RIGHT-HAND SIDE FORMULATION IS SELECTED.' + end if + ! + ! -- enforce 0 or 1 MVR6_FILENAME entries in option block + if (filein_fname(mvt_fname, 'MVE6_FILENAME', this%input_mempath, & + this%filename)) then + this%inmvt = getunit() + call openfile(this%inmvt, iout, mvt_fname, 'MVT') + write (iout, '(4x,a)') 'WATER MOVER ENERGY TRANSPORT & + &INFORMATION WILL BE READ FROM ', trim(mvt_fname) + end if + ! + ! -- enforce 0 or 1 OBS6_FILENAME entries in option block + if (filein_fname(this%obs%inputFilename, 'OBS6_FILENAME', & + this%input_mempath, this%filename)) then + this%obs%active = .true. + this%obs%inUnitObs = GetUnit() + call openfile(this%obs%inUnitObs, iout, this%obs%inputFilename, 'OBS') + end if + ! + write (iout, '(1x,a)') 'END OF GWE-GWE EXCHANGE OPTIONS' + ! + ! -- return + return + end subroutine source_options + + !> @ brief Read mover + !! + !! Read and process movers + !< + subroutine read_mvt(this, iout) + ! -- modules + use TspMvtModule, only: mvt_cr + ! -- dummy + class(GweExchangeType) :: this !< GwtExchangeType + integer(I4B), intent(in) :: iout + ! + ! -- Create and initialize the mover object Here, fmi is set to the one + ! for gwtmodel1 so that a call to save flows has an associated dis + ! object. + call mvt_cr(this%mvt, this%name, this%inmvt, iout, this%gwemodel1%fmi, & + this%gwemodel1%eqnsclfac, & + gwfmodelname1=this%gwfmodelname1, & + gwfmodelname2=this%gwfmodelname2, & + fmi2=this%gwemodel2%fmi) + ! + ! -- Return + return + end subroutine read_mvt + + !> @ brief Allocate scalars + !! + !! Allocate scalar variables + !< + subroutine allocate_scalars(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + use ConstantsModule, only: DZERO + ! -- dummy + class(GweExchangeType) :: this !< GwtExchangeType + ! + call this%DisConnExchangeType%allocate_scalars() + ! + call mem_allocate(this%inewton, 'INEWTON', this%memoryPath) + call mem_allocate(this%inobs, 'INOBS', this%memoryPath) + call mem_allocate(this%iAdvScheme, 'IADVSCHEME', this%memoryPath) + this%inewton = 0 + this%inobs = 0 + this%iAdvScheme = 0 + ! + call mem_allocate(this%inmvt, 'INMVT', this%memoryPath) + this%inmvt = 0 + ! + ! -- Return + return + end subroutine allocate_scalars + + !> @ brief Deallocate + !! + !! Deallocate memory associated with this object + !< + subroutine gwe_gwe_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + ! -- dummy + class(GweExchangeType) :: this !< GwtExchangeType + ! + ! -- objects + if (this%inmvt > 0) then + call this%mvt%mvt_da() + deallocate (this%mvt) + end if + call this%obs%obs_da() + deallocate (this%obs) + ! + ! -- arrays + call mem_deallocate(this%cond) + call mem_deallocate(this%simvals) + call mem_deallocate(this%gwfsimvals, 'GWFSIMVALS', this%memoryPath) ! linked memory + ! + ! -- output table objects + if (associated(this%outputtab1)) then + call this%outputtab1%table_da() + deallocate (this%outputtab1) + nullify (this%outputtab1) + end if + if (associated(this%outputtab2)) then + call this%outputtab2%table_da() + deallocate (this%outputtab2) + nullify (this%outputtab2) + end if + ! + ! -- scalars + deallocate (this%filename) + call mem_deallocate(this%inewton) + call mem_deallocate(this%inobs) + call mem_deallocate(this%iAdvScheme) + call mem_deallocate(this%inmvt) + ! + ! -- deallocate base + call this%DisConnExchangeType%disconnex_da() + ! + ! -- Return + return + end subroutine gwe_gwe_da + + !> @ brief Allocate arrays + !! + !! Allocate arrays + !< + subroutine allocate_arrays(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweExchangeType) :: this !< GweExchangeType + ! -- local + character(len=LINELENGTH) :: text + integer(I4B) :: ntabcol, i + ! + call this%DisConnExchangeType%allocate_arrays() + ! + call mem_allocate(this%cond, this%nexg, 'COND', this%memoryPath) + call mem_allocate(this%simvals, this%nexg, 'SIMVALS', this%memoryPath) + ! + ! -- Initialize + do i = 1, this%nexg + this%cond(i) = DNODATA + end do + ! + ! -- allocate and initialize the output table + if (this%iprflow /= 0) then + ! + ! -- dimension table + ntabcol = 3 + if (this%inamedbound > 0) then + ntabcol = ntabcol + 1 + end if + ! + ! -- initialize the output table objects + ! outouttab1 + if (this%v_model1%is_local) then + call table_cr(this%outputtab1, this%name, ' ') + call this%outputtab1%table_df(this%nexg, ntabcol, this%gwemodel1%iout, & + transient=.TRUE.) + text = 'NUMBER' + call this%outputtab1%initialize_column(text, 10, alignment=TABCENTER) + text = 'CELLID' + call this%outputtab1%initialize_column(text, 20, alignment=TABLEFT) + text = 'RATE' + call this%outputtab1%initialize_column(text, 15, alignment=TABCENTER) + if (this%inamedbound > 0) then + text = 'NAME' + call this%outputtab1%initialize_column(text, 20, alignment=TABLEFT) + end if + end if + ! outouttab2 + if (this%v_model2%is_local) then + call table_cr(this%outputtab2, this%name, ' ') + call this%outputtab2%table_df(this%nexg, ntabcol, this%gwemodel2%iout, & + transient=.TRUE.) + text = 'NUMBER' + call this%outputtab2%initialize_column(text, 10, alignment=TABCENTER) + text = 'CELLID' + call this%outputtab2%initialize_column(text, 20, alignment=TABLEFT) + text = 'RATE' + call this%outputtab2%initialize_column(text, 15, alignment=TABCENTER) + if (this%inamedbound > 0) then + text = 'NAME' + call this%outputtab2%initialize_column(text, 20, alignment=TABLEFT) + end if + end if + end if + ! + ! -- Return + return + end subroutine allocate_arrays + + !> @ brief Define observations + !! + !! Define the observations associated with this object + !< + subroutine gwe_gwe_df_obs(this) + ! -- dummy + class(GweExchangeType) :: this !< GweExchangeType + ! -- local + integer(I4B) :: indx + ! + ! -- Store obs type and assign procedure pointer + ! for gwt-gwt observation type. + call this%obs%StoreObsType('flow-ja-face', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => gwe_gwe_process_obsID + ! + ! -- Return + return + end subroutine gwe_gwe_df_obs + + !> @ brief Read and prepare observations + !! + !! Handle observation exchanges exchange-boundary names. + !< + subroutine gwe_gwe_rp_obs(this) + ! -- modules + use ConstantsModule, only: DZERO + ! -- dummy + class(GweExchangeType) :: this !< GwtExchangeType + ! -- local + integer(I4B) :: i + integer(I4B) :: j + class(ObserveType), pointer :: obsrv => null() + character(len=LENBOUNDNAME) :: bname + logical :: jfound + ! -- formats +10 format('Exchange "', a, '" for observation "', a, & + '" is invalid in package "', a, '"') +20 format('Exchange id "', i0, '" for observation "', a, & + '" is invalid in package "', a, '"') + ! + do i = 1, this%obs%npakobs + obsrv => this%obs%pakobs(i)%obsrv + ! + ! -- indxbnds needs to be reset each stress period because + ! list of boundaries can change each stress period. + ! -- Not true for exchanges, but leave this in for now anyway. + call obsrv%ResetObsIndex() + obsrv%BndFound = .false. + ! + bname = obsrv%FeatureName + if (bname /= '') then + ! -- Observation location(s) is(are) based on a boundary name. + ! Iterate through all boundaries to identify and store + ! corresponding index(indices) in bound array. + jfound = .false. + do j = 1, this%nexg + if (this%boundname(j) == bname) then + jfound = .true. + obsrv%BndFound = .true. + obsrv%CurrentTimeStepEndValue = DZERO + call obsrv%AddObsIndex(j) + end if + end do + if (.not. jfound) then + write (errmsg, 10) trim(bname), trim(obsrv%ObsTypeId), trim(this%name) + call store_error(errmsg) + end if + else + ! -- Observation location is a single exchange number + if (obsrv%intPak1 <= this%nexg .and. obsrv%intPak1 > 0) then + jfound = .true. + obsrv%BndFound = .true. + obsrv%CurrentTimeStepEndValue = DZERO + call obsrv%AddObsIndex(obsrv%intPak1) + else + jfound = .false. + end if + if (.not. jfound) then + write (errmsg, 20) obsrv%intPak1, trim(obsrv%ObsTypeId), trim(this%name) + call store_error(errmsg) + end if + end if + end do + ! + ! -- write summary of error messages + if (count_errors() > 0) then + call store_error_filename(this%obs%inputFilename) + end if + ! + ! -- Return + return + end subroutine gwe_gwe_rp_obs + + !> @ brief Final processing + !! + !! Conduct any final processing + !< + subroutine gwe_gwe_fp(this) + ! -- dummy + class(GweExchangeType) :: this !< GwtExchangeType + ! + ! -- Return + return + end subroutine gwe_gwe_fp + + !> @brief Return true when this exchange provides matrix coefficients for + !! solving @param model + !< + function gwe_gwe_connects_model(this, model) result(is_connected) + ! -- dummy + class(GweExchangeType) :: this !< GweExchangeType + class(BaseModelType), pointer, intent(in) :: model !< the model to which the exchange might hold a connection + ! -- return + logical(LGP) :: is_connected !< true, when connected + ! + is_connected = .false. + ! + ! only connected when model is GwtModelType of course + select type (model) + class is (GweModelType) + if (associated(this%gwemodel1, model)) then + is_connected = .true. + else if (associated(this%gwemodel2, model)) then + is_connected = .true. + end if + end select + ! + ! -- Return + return + end function gwe_gwe_connects_model + + !> @brief Should interface model be used for this exchange + !! + !! For now this always returns true, since we do not support + !! a classic-style two-point flux approximation for GWT-GWT. + !! If we ever add logic to support a simpler non-interface + !! model flux calculation, then logic should be added here to + !! set the return accordingly. + !< + function use_interface_model(this) result(use_im) + ! -- dummy + class(GweExchangeType) :: this !< GweExchangeType + ! -- return + logical(LGP) :: use_im !< true when interface model should be used + ! + ! For now set use_im to .true. since the interface model approach + ! must currently be used for any GWT-GWT exchange. + use_im = .true. + ! + ! -- Return + return + end function + + !> @ brief Save simulated flow observations + !! + !! Save the simulated flows for each exchange + !< + subroutine gwe_gwe_save_simvals(this) + ! -- dummy + use SimVariablesModule, only: errmsg + use ConstantsModule, only: DZERO + use ObserveModule, only: ObserveType + class(GweExchangeType), intent(inout) :: this + ! -- local + integer(I4B) :: i + integer(I4B) :: j + integer(I4B) :: n1 + integer(I4B) :: n2 + integer(I4B) :: iexg + real(DP) :: v + type(ObserveType), pointer :: obsrv => null() + ! + ! -- Write simulated values for all gwt-gwt observations + if (this%obs%npakobs > 0) then + call this%obs%obs_bd_clear() + do i = 1, this%obs%npakobs + obsrv => this%obs%pakobs(i)%obsrv + do j = 1, obsrv%indxbnds_count + iexg = obsrv%indxbnds(j) + v = DZERO + select case (obsrv%ObsTypeId) + case ('FLOW-JA-FACE') + n1 = this%nodem1(iexg) + n2 = this%nodem2(iexg) + v = this%simvals(iexg) + case default + errmsg = 'Unrecognized observation type: '// & + trim(obsrv%ObsTypeId) + call store_error(errmsg) + call store_error_filename(this%obs%inputFilename) + end select + call this%obs%SaveOneSimval(obsrv, v) + end do + end do + end if + ! + ! -- Return + return + end subroutine gwe_gwe_save_simvals + + !> @ brief Obs ID processer + !! + !! Process observations for this exchange + !< + subroutine gwe_gwe_process_obsID(obsrv, dis, inunitobs, iout) + ! -- modules + use ConstantsModule, only: LINELENGTH + use InputOutputModule, only: urword + use ObserveModule, only: ObserveType + use BaseDisModule, only: DisBaseType + ! -- dummy + type(ObserveType), intent(inout) :: obsrv + class(DisBaseType), intent(in) :: dis + integer(I4B), intent(in) :: inunitobs + integer(I4B), intent(in) :: iout + ! -- local + integer(I4B) :: n, iexg, istat + integer(I4B) :: icol, istart, istop + real(DP) :: r + character(len=LINELENGTH) :: strng + ! + strng = obsrv%IDstring + icol = 1 + ! -- get exchange index + call urword(strng, icol, istart, istop, 1, n, r, iout, inunitobs) + read (strng(istart:istop), '(i10)', iostat=istat) iexg + if (istat == 0) then + obsrv%intPak1 = iexg + else + ! Integer can't be read from strng; it's presumed to be an exchange + ! boundary name (already converted to uppercase) + obsrv%FeatureName = trim(adjustl(strng)) + ! -- Observation may require summing rates from multiple exchange + ! boundaries, so assign intPak1 as a value that indicates observation + ! is for a named exchange boundary or group of exchange boundaries. + obsrv%intPak1 = NAMEDBOUNDFLAG + end if + ! + ! -- Return + return + end subroutine gwe_gwe_process_obsID + + !> @ brief Cast polymorphic object as exchange + !! + !! Cast polymorphic object as exchange + !< + function CastAsGweExchange(obj) result(res) + implicit none + ! -- dummy + class(*), pointer, intent(inout) :: obj + ! -- return + class(GweExchangeType), pointer :: res + ! + res => null() + if (.not. associated(obj)) return + ! + select type (obj) + class is (GweExchangeType) + res => obj + end select + ! + ! -- Return + return + end function CastAsGweExchange + + !> @ brief Get exchange from list + !! + !! Return an exchange from the list for specified index + !< + function GetGweExchangeFromList(list, idx) result(res) + implicit none + ! -- dummy + type(ListType), intent(inout) :: list + integer(I4B), intent(in) :: idx + ! -- return + class(GweExchangeType), pointer :: res + ! -- local + class(*), pointer :: obj + ! + obj => list%GetItem(idx) + res => CastAsGweExchange(obj) + ! + ! -- Return + return + end function GetGweExchangeFromList + +end module GweGweExchangeModule + diff --git a/src/Exchange/GwfGweExchange.f90 b/src/Exchange/GwfGweExchange.f90 new file mode 100644 index 00000000000..3295aadcc8f --- /dev/null +++ b/src/Exchange/GwfGweExchange.f90 @@ -0,0 +1,546 @@ +module GwfGweExchangeModule + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: LENPACKAGENAME + use ListsModule, only: basemodellist, baseexchangelist, & + baseconnectionlist + use SimModule, only: store_error + use SimVariablesModule, only: errmsg + use BaseExchangeModule, only: BaseExchangeType, AddBaseExchangeToList + use SpatialModelConnectionModule, only: SpatialModelConnectionType, & + get_smc_from_list + use GweGweConnectionModule, only: GweGweConnectionType, CastAsGweGweConnection + use GwfGwfConnectionModule, only: GwfGwfConnectionType, CastAsGwfGwfConnection + use GwfGwfExchangeModule, only: GwfExchangeType, & + GetGwfExchangeFromList + use BaseModelModule, only: BaseModelType, GetBaseModelFromList + use GwfModule, only: GwfModelType + use GweModule, only: GweModelType + use BndModule, only: BndType, GetBndFromList + + implicit none + public :: GwfGweExchangeType + public :: gwfgwe_cr + + type, extends(BaseExchangeType) :: GwfGweExchangeType + + integer(I4B), pointer :: m1_idx => null() !< index into the list of base exchanges for model 1 + integer(I4B), pointer :: m2_idx => null() !< index into the list of base exchanges for model 2 + + contains + + procedure :: exg_df + procedure :: exg_ar + procedure :: exg_da + procedure, private :: set_model_pointers + procedure, private :: allocate_scalars + procedure, private :: gwfbnd2gwefmi + procedure, private :: gwfconn2gweconn + procedure, private :: link_connections + + end type GwfGweExchangeType + +contains + + !> @brief Create a new GWF to GWE exchange object + !< + subroutine gwfgwe_cr(filename, id, m1_id, m2_id) + ! -- modules + use SimVariablesModule, only: model_loc_idx + ! -- dummy + character(len=*), intent(in) :: filename + integer(I4B), intent(in) :: id + integer(I4B), intent(in) :: m1_id + integer(I4B), intent(in) :: m2_id + ! -- local + class(BaseExchangeType), pointer :: baseexchange => null() + type(GwfGweExchangeType), pointer :: exchange => null() + character(len=20) :: cint + ! + ! -- Create a new exchange and add it to the baseexchangelist container + allocate (exchange) + baseexchange => exchange + call AddBaseExchangeToList(baseexchangelist, baseexchange) + ! + ! -- Assign id and name + exchange%id = id + write (cint, '(i0)') id + exchange%name = 'GWF-GWE_'//trim(adjustl(cint)) + exchange%memoryPath = exchange%name + ! + ! -- allocate scalars + call exchange%allocate_scalars() + ! + ! -- NB: convert from id to local model index in base model list + exchange%m1_idx = model_loc_idx(m1_id) + exchange%m2_idx = model_loc_idx(m2_id) + ! + ! -- set model pointers + call exchange%set_model_pointers() + ! + ! -- Return + return + end subroutine gwfgwe_cr + + !> @brief Allocate and read + !< + subroutine set_model_pointers(this) + ! -- dummy + class(GwfGweExchangeType) :: this + ! -- local + class(BaseModelType), pointer :: mb => null() + type(GwfModelType), pointer :: gwfmodel => null() + type(GweModelType), pointer :: gwemodel => null() + ! + ! -- set gwfmodel + gwfmodel => null() + mb => GetBaseModelFromList(basemodellist, this%m1_idx) + select type (mb) + type is (GwfModelType) + gwfmodel => mb + end select + ! + ! -- set gwemodel + gwemodel => null() + mb => GetBaseModelFromList(basemodellist, this%m2_idx) + select type (mb) + type is (GweModelType) + gwemodel => mb + end select + ! + ! -- Verify that gwf model is of the correct type + if (.not. associated(gwfmodel)) then + write (errmsg, '(3a)') 'Problem with GWF-GWE exchange ', trim(this%name), & + '. Specified GWF Model does not appear to be of the correct type.' + call store_error(errmsg, terminate=.true.) + end if + ! + ! -- Verify that gwe model is of the correct type + if (.not. associated(gwemodel)) then + write (errmsg, '(3a)') 'Problem with GWF-GWE exchange ', trim(this%name), & + '. Specified GWF Model does not appear to be of the correct type.' + call store_error(errmsg, terminate=.true.) + end if + ! + ! -- Tell transport model fmi flows are not read from file + gwemodel%fmi%flows_from_file = .false. + ! + ! -- Set a pointer to the GWF bndlist. This will allow the transport model + ! to look through the flow packages and establish a link to GWF flows + gwemodel%fmi%gwfbndlist => gwfmodel%bndlist + ! + ! -- Return + return + end subroutine set_model_pointers + + !> @brief Define the GwfGwe Exchange object + !< + subroutine exg_df(this) + ! -- modules + use MemoryManagerModule, only: mem_checkin + ! -- dummy + class(GwfGweExchangeType) :: this + ! -- local + class(BaseModelType), pointer :: mb => null() + type(GwfModelType), pointer :: gwfmodel => null() + type(GweModelType), pointer :: gwemodel => null() + ! + ! -- set gwfmodel + mb => GetBaseModelFromList(basemodellist, this%m1_idx) + select type (mb) + type is (GwfModelType) + gwfmodel => mb + end select + ! + ! -- set gwemodel + mb => GetBaseModelFromList(basemodellist, this%m2_idx) + select type (mb) + type is (GweModelType) + gwemodel => mb + end select + ! + ! -- Check to make sure that flow is solved before transport and in a + ! different IMS solution + if (gwfmodel%idsoln >= gwemodel%idsoln) then + write (errmsg, '(3a)') 'Problem with GWF-GWE exchange ', trim(this%name), & + '. The GWF model must be solved by a different IMS than the GWE model. & + &Furthermore, the IMS specified for GWF must be listed in mfsim.nam & + &before the IMS for GWE.' + call store_error(errmsg, terminate=.true.) + end if + ! + ! -- Set pointer to flowja + gwemodel%fmi%gwfflowja => gwfmodel%flowja + call mem_checkin(gwemodel%fmi%gwfflowja, & + 'GWFFLOWJA', gwemodel%fmi%memoryPath, & + 'FLOWJA', gwfmodel%memoryPath) + + ! + ! -- Set the npf flag so that specific discharge is available for + ! transport calculations if dispersion is active + if (gwemodel%incnd > 0) then + gwfmodel%npf%icalcspdis = 1 + end if + ! + ! -- Return + return + end subroutine exg_df + + !> @brief Allocate and read + !< + subroutine exg_ar(this) + ! -- modules + use MemoryManagerModule, only: mem_checkin + ! -- dummy + class(GwfGweExchangeType) :: this + ! -- local + class(BaseModelType), pointer :: mb => null() + type(GwfModelType), pointer :: gwfmodel => null() + type(GweModelType), pointer :: gwemodel => null() + ! -- formats + character(len=*), parameter :: fmtdiserr = & + "('GWF and GWE Models do not have the same discretization for exchange& + & ',a,'.& + & GWF Model has ', i0, ' user nodes and ', i0, ' reduced nodes.& + & GWE Model has ', i0, ' user nodes and ', i0, ' reduced nodes.& + & Ensure discretization packages, including IDOMAIN, are identical.')" + ! + ! -- set gwfmodel + mb => GetBaseModelFromList(basemodellist, this%m1_idx) + select type (mb) + type is (GwfModelType) + gwfmodel => mb + end select + ! + ! -- set gwemodel + mb => GetBaseModelFromList(basemodellist, this%m2_idx) + select type (mb) + type is (GweModelType) + gwemodel => mb + end select + ! + ! -- Check to make sure sizes are identical + if (gwemodel%dis%nodes /= gwfmodel%dis%nodes .or. & + gwemodel%dis%nodesuser /= gwfmodel%dis%nodesuser) then + write (errmsg, fmtdiserr) trim(this%name), & + gwfmodel%dis%nodesuser, & + gwfmodel%dis%nodes, & + gwemodel%dis%nodesuser, & + gwemodel%dis%nodes + call store_error(errmsg, terminate=.TRUE.) + end if + ! + ! -- setup pointers to gwf variables allocated in gwf_ar + gwemodel%fmi%gwfhead => gwfmodel%x + call mem_checkin(gwemodel%fmi%gwfhead, & + 'GWFHEAD', gwemodel%fmi%memoryPath, & + 'X', gwfmodel%memoryPath) + gwemodel%fmi%gwfsat => gwfmodel%npf%sat + call mem_checkin(gwemodel%fmi%gwfsat, & + 'GWFSAT', gwemodel%fmi%memoryPath, & + 'SAT', gwfmodel%npf%memoryPath) + gwemodel%fmi%gwfspdis => gwfmodel%npf%spdis + call mem_checkin(gwemodel%fmi%gwfspdis, & + 'GWFSPDIS', gwemodel%fmi%memoryPath, & + 'SPDIS', gwfmodel%npf%memoryPath) + ! + ! -- setup pointers to the flow storage rates. GWF strg arrays are + ! available after the gwf_ar routine is called. + if (gwemodel%inest > 0) then + if (gwfmodel%insto > 0) then + gwemodel%fmi%gwfstrgss => gwfmodel%sto%strgss + gwemodel%fmi%igwfstrgss = 1 + if (gwfmodel%sto%iusesy == 1) then + gwemodel%fmi%gwfstrgsy => gwfmodel%sto%strgsy + gwemodel%fmi%igwfstrgsy = 1 + end if + end if + end if + ! + ! -- Set a pointer to conc in buy + if (gwfmodel%inbuy > 0) then + call gwfmodel%buy%set_concentration_pointer(gwemodel%name, gwemodel%x, & + gwemodel%ibound) + end if + ! + ! -- Set a pointer to conc (which could be a temperature) in vsc + if (gwfmodel%invsc > 0) then + call gwfmodel%vsc%set_concentration_pointer(gwemodel%name, gwemodel%x, & + gwemodel%ibound, 1) + end if + ! + ! -- transfer the boundary package information from gwf to gwe + call this%gwfbnd2gwefmi() + ! + ! -- if mover package is active, then set a pointer to it's budget object + if (gwfmodel%inmvr /= 0) then + gwemodel%fmi%mvrbudobj => gwfmodel%mvr%budobj + end if + ! + ! -- connect Connections + call this%gwfconn2gweconn(gwfmodel, gwemodel) + ! + ! -- Return + return + end subroutine exg_ar + + !> @brief Link GWE connections to GWF connections or exchanges + !< + subroutine gwfconn2gweconn(this, gwfModel, gweModel) + ! -- modules + use SimModule, only: store_error + use SimVariablesModule, only: iout + use MemoryManagerModule, only: mem_checkin + ! -- dummy + class(GwfGweExchangeType) :: this !< this exchange + type(GwfModelType), pointer :: gwfModel !< the flow model + type(GweModelType), pointer :: gweModel !< the energy transport model + ! -- local + class(SpatialModelConnectionType), pointer :: conn => null() + class(*), pointer :: objPtr => null() + class(GweGweConnectionType), pointer :: gweConn => null() + class(GwfGwfConnectionType), pointer :: gwfConn => null() + class(GwfExchangeType), pointer :: gwfEx => null() + integer(I4B) :: ic1, ic2, iex + integer(I4B) :: gwfConnIdx, gwfExIdx + logical(LGP) :: areEqual + ! + ! loop over all connections + gweloop: do ic1 = 1, baseconnectionlist%Count() + ! + conn => get_smc_from_list(baseconnectionlist, ic1) + if (.not. associated(conn%owner, gweModel)) cycle gweloop + ! + ! start with a GWE conn. + objPtr => conn + gweConn => CastAsGweGweConnection(objPtr) + gwfConnIdx = -1 + gwfExIdx = -1 + ! + ! find matching GWF conn. in same list + gwfloop: do ic2 = 1, baseconnectionlist%Count() + conn => get_smc_from_list(baseconnectionlist, ic2) + ! + if (associated(conn%owner, gwfModel)) then + objPtr => conn + gwfConn => CastAsGwfGwfConnection(objPtr) + ! + ! for now, connecting the same nodes nrs will be + ! sufficient evidence of equality + areEqual = all(gwfConn%prim_exchange%nodem1 == & + gweConn%prim_exchange%nodem1) + areEqual = areEqual .and. all(gwfConn%prim_exchange%nodem2 == & + gweConn%prim_exchange%nodem2) + if (areEqual) then + ! same DIS, same exchange: link and go to next GWE conn. + write (iout, '(/6a)') 'Linking exchange ', & + trim(gweConn%prim_exchange%name), & + ' to ', trim(gwfConn%prim_exchange%name), & + ' (using interface model) for GWE model ', & + trim(gweModel%name) + gwfConnIdx = ic2 + call this%link_connections(gweConn, gwfConn) + exit gwfloop + end if + end if + end do gwfloop + ! + ! fallback option: coupling to old gwfgwf exchange, + ! (this will go obsolete at some point) + if (gwfConnIdx == -1) then + gwfloopexg: do iex = 1, baseexchangelist%Count() + gwfEx => GetGwfExchangeFromList(baseexchangelist, iex) + ! + ! -- There is no guarantee that iex is a gwfExg, in which case + ! it will return as null. cycle if so. + if (.not. associated(gwfEx)) cycle gwfloopexg + ! + if (associated(gwfEx%model1, gwfModel) .or. & + associated(gwfEx%model2, gwfModel)) then + + ! check exchanges have same node counts + areEqual = size(gwfEx%nodem1) == size(gweConn%prim_exchange%nodem1) + ! then, connecting the same nodes nrs will be + ! sufficient evidence of equality + if (areEqual) & + areEqual = all(gwfEx%nodem1 == gweConn%prim_exchange%nodem1) + if (areEqual) & + areEqual = all(gwfEx%nodem2 == gweConn%prim_exchange%nodem2) + if (areEqual) then + ! link exchange to connection + write (iout, '(/6a)') 'Linking exchange ', & + trim(gweConn%prim_exchange%name), & + ' to ', trim(gwfEx%name), ' for GWE model ', & + trim(gweModel%name) + gwfExIdx = iex + if (gweConn%owns_exchange) then + gweConn%gweExchange%gwfsimvals => gwfEx%simvals + call mem_checkin(gweConn%gweExchange%gwfsimvals, & + 'GWFSIMVALS', gweConn%gweExchange%memoryPath, & + 'SIMVALS', gwfEx%memoryPath) + end if + ! + !cdl link up mvt to mvr + if (gwfEx%inmvr > 0) then + if (gweConn%owns_exchange) then + !cdl todo: check and make sure gweEx has mvt active + call gweConn%gweExchange%mvt%set_pointer_mvrbudobj( & + gwfEx%mvr%budobj) + end if + end if + ! + if (associated(gwfEx%model2, gwfModel)) gweConn%exgflowSign = -1 + gweConn%gweInterfaceModel%fmi%flows_from_file = .false. + ! + exit gwfloopexg + end if + end if + ! + end do gwfloopexg + end if + ! + if (gwfConnIdx == -1 .and. gwfExIdx == -1) then + ! none found, report + write (errmsg, '(/6a)') 'Missing GWF-GWF exchange when connecting GWE'// & + ' model ', trim(gweModel%name), ' with exchange ', & + trim(gweConn%prim_exchange%name), ' to GWF model ', & + trim(gwfModel%name) + call store_error(errmsg, terminate=.true.) + end if + ! + end do gweloop + ! + ! -- Return + return + end subroutine gwfconn2gweconn + + !> @brief Links a GWE connection to its GWF counterpart + !< + subroutine link_connections(this, gweConn, gwfConn) + ! -- modules + use MemoryManagerModule, only: mem_checkin + ! -- dummy + class(GwfGweExchangeType) :: this !< this exchange + class(GweGweConnectionType), pointer :: gweConn !< GWE connection + class(GwfGwfConnectionType), pointer :: gwfConn !< GWF connection + ! + !gweConn%exgflowja => gwfConn%exgflowja + if (gweConn%owns_exchange) then + gweConn%gweExchange%gwfsimvals => gwfConn%gwfExchange%simvals + call mem_checkin(gweConn%gweExchange%gwfsimvals, & + 'GWFSIMVALS', gweConn%gweExchange%memoryPath, & + 'SIMVALS', gwfConn%gwfExchange%memoryPath) + end if + ! + !cdl link up mvt to mvr + if (gwfConn%gwfExchange%inmvr > 0) then + if (gweConn%owns_exchange) then + !cdl todo: check and make sure gweEx has mvt active + call gweConn%gweExchange%mvt%set_pointer_mvrbudobj( & + gwfConn%gwfExchange%mvr%budobj) + end if + end if + ! + if (associated(gwfConn%gwfExchange%model2, gwfConn%owner)) then + gweConn%exgflowSign = -1 + end if + ! + ! fmi flows are not read from file + gweConn%gweInterfaceModel%fmi%flows_from_file = .false. + ! + ! set concentration pointer for buoyancy + !call gwfConn%gwfInterfaceModel%buy%set_concentration_pointer( & + ! gweConn%gweModel%name, & + ! gweConn%conc, & + ! gweConn%icbound) + ! + ! -- Return + return + end subroutine link_connections + + !> @brief Deallocate memory + !< + subroutine exg_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + ! -- dummy + class(GwfGweExchangeType) :: this + ! + call mem_deallocate(this%m1_idx) + call mem_deallocate(this%m2_idx) + ! + ! -- Return + return + end subroutine exg_da + + !> @brief Allocate GwfGwe exchange scalars + !< + subroutine allocate_scalars(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GwfGweExchangeType) :: this + ! + call mem_allocate(this%m1_idx, 'M1ID', this%memoryPath) + call mem_allocate(this%m2_idx, 'M2ID', this%memoryPath) + this%m1_idx = 0 + this%m2_idx = 0 + ! + ! -- Return + return + end subroutine allocate_scalars + + !> @brief Call routines in FMI that will set pointers to the necessary flow + !! data (SIMVALS and SIMTOMVR) stored within each GWF flow package + !< + subroutine gwfbnd2gwefmi(this) + ! -- dummy + class(GwfGweExchangeType) :: this + ! -- local + integer(I4B) :: ngwfpack, ip, iterm, imover + class(BaseModelType), pointer :: mb => null() + type(GwfModelType), pointer :: gwfmodel => null() + type(GweModelType), pointer :: gwemodel => null() + class(BndType), pointer :: packobj => null() + ! + ! -- set gwfmodel + mb => GetBaseModelFromList(basemodellist, this%m1_idx) + select type (mb) + type is (GwfModelType) + gwfmodel => mb + end select + ! + ! -- set gwemodel + mb => GetBaseModelFromList(basemodellist, this%m2_idx) + select type (mb) + type is (GweModelType) + gwemodel => mb + end select + ! + ! -- Call routines in FMI that will set pointers to the necessary flow + ! data (SIMVALS and SIMTOMVR) stored within each GWF flow package + ngwfpack = gwfmodel%bndlist%Count() + iterm = 1 + do ip = 1, ngwfpack + packobj => GetBndFromList(gwfmodel%bndlist, ip) + call gwemodel%fmi%gwfpackages(iterm)%set_pointers( & + 'SIMVALS', & + packobj%memoryPath, packobj%input_mempath) + iterm = iterm + 1 + ! + ! -- If a mover is active for this package, then establish a separate + ! pointer link for the mover flows stored in SIMTOMVR + imover = packobj%imover + if (packobj%isadvpak /= 0) imover = 0 + if (imover /= 0) then + call gwemodel%fmi%gwfpackages(iterm)%set_pointers( & + 'SIMTOMVR', & + packobj%memoryPath, packobj%input_mempath) + iterm = iterm + 1 + end if + end do + ! + ! -- Return + return + end subroutine gwfbnd2gwefmi + +end module GwfGweExchangeModule diff --git a/src/Exchange/GwfGwtExchange.f90 b/src/Exchange/GwfGwtExchange.f90 index 9313efcce59..65a33bc0a8b 100644 --- a/src/Exchange/GwfGwtExchange.f90 +++ b/src/Exchange/GwfGwtExchange.f90 @@ -132,7 +132,7 @@ subroutine set_model_pointers(this) return end subroutine set_model_pointers - !> @brief Define GwfGwt Exchange object + !> @brief Define the GwfGwt Exchange object !< subroutine exg_df(this) ! -- modules diff --git a/src/Exchange/gwegweidm.f90 b/src/Exchange/gwegweidm.f90 new file mode 100644 index 00000000000..588078857a2 --- /dev/null +++ b/src/Exchange/gwegweidm.f90 @@ -0,0 +1,582 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module ExgGwegweInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public exg_gwegwe_param_definitions + public exg_gwegwe_aggregate_definitions + public exg_gwegwe_block_definitions + public ExgGwegweParamFoundType + public exg_gwegwe_multi_package + + type ExgGwegweParamFoundType + logical :: gwfmodelname1 = .false. + logical :: gwfmodelname2 = .false. + logical :: auxiliary = .false. + logical :: boundnames = .false. + logical :: iprpak = .false. + logical :: iprflow = .false. + logical :: ipakcb = .false. + logical :: adv_scheme = .false. + logical :: cnd_xt3d_off = .false. + logical :: cnd_xt3d_rhs = .false. + logical :: filein = .false. + logical :: mve_filerecord = .false. + logical :: mve6 = .false. + logical :: mve6_filename = .false. + logical :: obs_filerecord = .false. + logical :: obs6 = .false. + logical :: obs6_filename = .false. + logical :: dev_ifmod_on = .false. + logical :: nexg = .false. + logical :: cellidm1 = .false. + logical :: cellidm2 = .false. + logical :: ihc = .false. + logical :: cl1 = .false. + logical :: cl2 = .false. + logical :: hwva = .false. + logical :: aux = .false. + logical :: boundname = .false. + end type ExgGwegweParamFoundType + + logical :: exg_gwegwe_multi_package = .true. + + type(InputParamDefinitionType), parameter :: & + exggwegwe_gwfmodelname1 = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'GWFMODELNAME1', & ! tag name + 'GWFMODELNAME1', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_gwfmodelname2 = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'GWFMODELNAME2', & ! tag name + 'GWFMODELNAME2', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_auxiliary = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'AUXILIARY', & ! tag name + 'AUXILIARY', & ! fortran variable + 'STRING', & ! type + 'NAUX', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_boundnames = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'BOUNDNAMES', & ! tag name + 'BOUNDNAMES', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_iprpak = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_INPUT', & ! tag name + 'IPRPAK', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_iprflow = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_FLOWS', & ! tag name + 'IPRFLOW', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_ipakcb = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'SAVE_FLOWS', & ! tag name + 'IPAKCB', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_adv_scheme = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'ADV_SCHEME', & ! tag name + 'ADV_SCHEME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_cnd_xt3d_off = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'CND_XT3D_OFF', & ! tag name + 'CND_XT3D_OFF', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_cnd_xt3d_rhs = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'CND_XT3D_RHS', & ! tag name + 'CND_XT3D_RHS', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_filein = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'FILEIN', & ! tag name + 'FILEIN', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_mve_filerecord = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'MVE_FILERECORD', & ! tag name + 'MVE_FILERECORD', & ! fortran variable + 'RECORD MVE6 FILEIN MVE6_FILENAME', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_mve6 = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'MVE6', & ! tag name + 'MVE6', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_mve6_filename = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'MVE6_FILENAME', & ! tag name + 'MVE6_FILENAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_obs_filerecord = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'OBS_FILERECORD', & ! tag name + 'OBS_FILERECORD', & ! fortran variable + 'RECORD OBS6 FILEIN OBS6_FILENAME', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_obs6 = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'OBS6', & ! tag name + 'OBS6', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_obs6_filename = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'OBS6_FILENAME', & ! tag name + 'OBS6_FILENAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_dev_ifmod_on = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'OPTIONS', & ! block + 'DEV_INTERFACEMODEL_ON', & ! tag name + 'DEV_IFMOD_ON', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_nexg = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'DIMENSIONS', & ! block + 'NEXG', & ! tag name + 'NEXG', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_cellidm1 = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'EXCHANGEDATA', & ! block + 'CELLIDM1', & ! tag name + 'CELLIDM1', & ! fortran variable + 'INTEGER1D', & ! type + 'NCELLDIM', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_cellidm2 = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'EXCHANGEDATA', & ! block + 'CELLIDM2', & ! tag name + 'CELLIDM2', & ! fortran variable + 'INTEGER1D', & ! type + 'NCELLDIM', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_ihc = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'EXCHANGEDATA', & ! block + 'IHC', & ! tag name + 'IHC', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_cl1 = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'EXCHANGEDATA', & ! block + 'CL1', & ! tag name + 'CL1', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_cl2 = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'EXCHANGEDATA', & ! block + 'CL2', & ! tag name + 'CL2', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_hwva = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'EXCHANGEDATA', & ! block + 'HWVA', & ! tag name + 'HWVA', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_aux = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'EXCHANGEDATA', & ! block + 'AUX', & ! tag name + 'AUX', & ! fortran variable + 'DOUBLE1D', & ! type + 'NAUX', & ! shape + .false., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exggwegwe_boundname = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'EXCHANGEDATA', & ! block + 'BOUNDNAME', & ! tag name + 'BOUNDNAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exg_gwegwe_param_definitions(*) = & + [ & + exggwegwe_gwfmodelname1, & + exggwegwe_gwfmodelname2, & + exggwegwe_auxiliary, & + exggwegwe_boundnames, & + exggwegwe_iprpak, & + exggwegwe_iprflow, & + exggwegwe_ipakcb, & + exggwegwe_adv_scheme, & + exggwegwe_cnd_xt3d_off, & + exggwegwe_cnd_xt3d_rhs, & + exggwegwe_filein, & + exggwegwe_mve_filerecord, & + exggwegwe_mve6, & + exggwegwe_mve6_filename, & + exggwegwe_obs_filerecord, & + exggwegwe_obs6, & + exggwegwe_obs6_filename, & + exggwegwe_dev_ifmod_on, & + exggwegwe_nexg, & + exggwegwe_cellidm1, & + exggwegwe_cellidm2, & + exggwegwe_ihc, & + exggwegwe_cl1, & + exggwegwe_cl2, & + exggwegwe_hwva, & + exggwegwe_aux, & + exggwegwe_boundname & + ] + + type(InputParamDefinitionType), parameter :: & + exggwegwe_exchangedata = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'GWEGWE', & ! subcomponent + 'EXCHANGEDATA', & ! block + 'EXCHANGEDATA', & ! tag name + 'EXCHANGEDATA', & ! fortran variable + 'RECARRAY CELLIDM1 CELLIDM2 IHC CL1 CL2 HWVA AUX BOUNDNAME', & ! type + 'NEXG', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exg_gwegwe_aggregate_definitions(*) = & + [ & + exggwegwe_exchangedata & + ] + + type(InputBlockDefinitionType), parameter :: & + exg_gwegwe_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'EXCHANGEDATA', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module ExgGwegweInputModule diff --git a/src/Exchange/gwfgweidm.f90 b/src/Exchange/gwfgweidm.f90 new file mode 100644 index 00000000000..bc69319b14c --- /dev/null +++ b/src/Exchange/gwfgweidm.f90 @@ -0,0 +1,70 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module ExgGwfgweInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public exg_gwfgwe_param_definitions + public exg_gwfgwe_aggregate_definitions + public exg_gwfgwe_block_definitions + public ExgGwfgweParamFoundType + public exg_gwfgwe_multi_package + + type ExgGwfgweParamFoundType + end type ExgGwfgweParamFoundType + + logical :: exg_gwfgwe_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + exg_gwfgwe_param_definitions(*) = & + [ & + InputParamDefinitionType & + ( & + '', & ! component + '', & ! subcomponent + '', & ! block + '', & ! tag name + '', & ! fortran variable + '', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) & + ] + + type(InputParamDefinitionType), parameter :: & + exg_gwfgwe_aggregate_definitions(*) = & + [ & + InputParamDefinitionType & + ( & + '', & ! component + '', & ! subcomponent + '', & ! block + '', & ! tag name + '', & ! fortran variable + '', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) & + ] + + type(InputBlockDefinitionType), parameter :: & + exg_gwfgwe_block_definitions(*) = & + [ & + InputBlockDefinitionType & + ( & + '', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_varaible + ) & + ] + +end module ExgGwfgweInputModule diff --git a/src/Model/Connection/ConnectionBuilder.f90 b/src/Model/Connection/ConnectionBuilder.f90 index c7b6d28b8d6..d53aa51bedb 100644 --- a/src/Model/Connection/ConnectionBuilder.f90 +++ b/src/Model/Connection/ConnectionBuilder.f90 @@ -147,6 +147,7 @@ function createModelConnection(model, exchange) result(connection) use SimModule, only: ustop use GwfGwfConnectionModule, only: GwfGwfConnectionType use GwtGwtConnectionModule, only: GwtGwtConnectionType + use GweGweConnectionModule, only: GweGweConnectionType use GwfModule, only: GwfModelType class(NumericalModelType), pointer, intent(in) :: model !< the model for which the connection will be created @@ -156,6 +157,7 @@ function createModelConnection(model, exchange) result(connection) ! different concrete connection types: class(GwfGwfConnectionType), pointer :: flowConnection => null() class(GwtGwtConnectionType), pointer :: transportConnection => null() + class(GweGweConnectionType), pointer :: energyTransportConnection => null() connection => null() @@ -171,6 +173,11 @@ function createModelConnection(model, exchange) result(connection) call transportConnection%construct(model, exchange) connection => transportConnection transportConnection => null() + case ('GWE-GWE') + allocate (GweGweConnectionType :: energyTransportConnection) + call energyTransportConnection%construct(model, exchange) + connection => energyTransportConnection + energyTransportConnection => null() case default write (*, *) 'Error (which should never happen): '// & 'undefined exchangetype found' diff --git a/src/Model/Connection/GweGweConnection.f90 b/src/Model/Connection/GweGweConnection.f90 new file mode 100644 index 00000000000..2f4464b0d27 --- /dev/null +++ b/src/Model/Connection/GweGweConnection.f90 @@ -0,0 +1,535 @@ +module GweGweConnectionModule + use KindModule, only: I4B, DP, LGP + use ConstantsModule, only: LINELENGTH, LENCOMPONENTNAME, DZERO, LENBUDTXT + use CsrUtilsModule, only: getCSRIndex + use SimModule, only: ustop + use MemoryManagerModule, only: mem_allocate, mem_deallocate, mem_checkin + use SpatialModelConnectionModule + use NumericalModelModule + use GweModule + use DisConnExchangeModule + use GweGweExchangeModule + use GweInterfaceModelModule + use SparseModule, only: sparsematrix + use ConnectionsModule, only: ConnectionsType + use CellWithNbrsModule, only: GlobalCellType + use DistVariableModule + use SimStagesModule + use MatrixBaseModule + + implicit none + private + + public :: CastAsGweGweConnection + + !> Connects a GWE model to other GWE models in space. Derives + !! from NumericalExchangeType so the solution can use it to + !! fetch the coefficients for this connection. + !< + type, public, extends(SpatialModelConnectionType) :: GweGweConnectionType + + class(GweModelType), pointer :: gweModel => null() !< the model for which this connection exists + class(GweExchangeType), pointer :: gweExchange => null() !< the primary exchange, cast to GWE-GWE + class(GweInterfaceModelType), pointer :: gweInterfaceModel => null() !< the interface model + integer(I4B), pointer :: iIfaceAdvScheme => null() !< the advection scheme at the interface: + !! 0 = upstream, 1 = central, 2 = TVD + integer(I4B), pointer :: iIfaceXt3d => null() !< XT3D in the interface CND package: 0 = no, 1 = lhs, 2 = rhs + integer(I4B), pointer :: exgflowSign => null() !< indicates the flow direction of exgflowja + real(DP), dimension(:), pointer, contiguous :: exgflowjaGwe => null() !< gwe-flowja at the interface (this is a subset of the GWT + !! interface model flowja's) + + real(DP), dimension(:), pointer, contiguous :: gwfflowja => null() !< gwfflowja for the interface model + real(DP), dimension(:), pointer, contiguous :: gwfsat => null() !< gwfsat for the interface model + real(DP), dimension(:), pointer, contiguous :: gwfhead => null() !< gwfhead for the interface model + real(DP), dimension(:, :), pointer, contiguous :: gwfspdis => null() !< gwfspdis for the interface model + + real(DP), dimension(:), pointer, contiguous :: conc => null() !< pointer to concentration array + integer(I4B), dimension(:), pointer, contiguous :: icbound => null() !< store pointer to gwe ibound array + + integer(I4B) :: iout = 0 !< the list file for the interface model + + contains + + procedure, pass(this) :: gweGweConnection_ctor + generic, public :: construct => gweGweConnection_ctor + + procedure :: exg_ar => gwegwecon_ar + procedure :: exg_df => gwegwecon_df + procedure :: exg_rp => gwegwecon_rp + procedure :: exg_ad => gwegwecon_ad + procedure :: exg_fc => gwegwecon_fc + procedure :: exg_da => gwegwecon_da + procedure :: exg_cq => gwegwecon_cq + procedure :: exg_bd => gwegwecon_bd + procedure :: exg_ot => gwegwecon_ot + + ! overriding 'protected' + procedure :: validateConnection + + ! local stuff + procedure, private :: allocate_scalars + procedure, private :: allocate_arrays + procedure, private :: cfg_dist_vars + procedure, private :: setGridExtent + procedure, private :: setFlowToExchange + + end type GweGweConnectionType + +contains + + !> @brief Basic construction of the connection + !< + subroutine gweGweConnection_ctor(this, model, gweEx) + ! -- modules + use InputOutputModule, only: openfile + ! -- dummy + class(GweGweConnectionType) :: this !< the connection + class(NumericalModelType), pointer :: model !< the model owning this connection, + !! this must be a GweModelType + class(DisConnExchangeType), pointer :: gweEx !< the GWE-GWE exchange the interface model is created for + ! -- local + character(len=LINELENGTH) :: fname + character(len=LENCOMPONENTNAME) :: name + class(*), pointer :: objPtr + logical(LGP) :: write_ifmodel_listfile = .false. + ! + objPtr => model + this%gweModel => CastAsGweModel(objPtr) + objPtr => gweEx + this%gweExchange => CastAsGweExchange(objPtr) + ! + if (gweEx%v_model1%is_local .and. gweEx%v_model2%is_local) then + this%owns_exchange = associated(model, gweEx%model1) + else + this%owns_exchange = .true. + end if + ! + if (gweEx%v_model1 == model) then + write (name, '(a,i0)') 'GWECON1_', gweEx%id + else + write (name, '(a,i0)') 'GWECON2_', gweEx%id + end if + ! + ! -- .lst file for interface model + if (write_ifmodel_listfile) then + fname = trim(name)//'.im.lst' + call openfile(this%iout, 0, fname, 'LIST', filstat_opt='REPLACE') + write (this%iout, '(4a)') 'Creating GWE-GWE connection for model ', & + trim(this%gweModel%name), 'from exchange ', & + trim(gweEx%name) + end if + ! + ! -- First call base constructor + call this%SpatialModelConnectionType%spatialConnection_ctor(model, & + gweEx, & + name) + ! + call this%allocate_scalars() + this%typename = 'GWE-GWE' + this%iIfaceAdvScheme = 0 + this%iIfaceXt3d = 0 + this%exgflowSign = 1 + ! + allocate (this%gweInterfaceModel) + this%interface_model => this%gweInterfaceModel + ! + end subroutine gweGweConnection_ctor + + !> @brief Allocate scalar variables for this connection + !< + subroutine allocate_scalars(this) + ! -- dummy + class(GweGweConnectionType) :: this !< the connection + ! + call mem_allocate(this%iIfaceAdvScheme, 'IADVSCHEME', this%memoryPath) + call mem_allocate(this%iIfaceXt3d, 'IXT3D', this%memoryPath) + call mem_allocate(this%exgflowSign, 'EXGFLOWSIGN', this%memoryPath) + ! + end subroutine allocate_scalars + + !> @brief define the GWE-GWE connection + !< + subroutine gwegwecon_df(this) + ! -- dummy + class(GweGweConnectionType) :: this !< the connection + ! -- local + character(len=LENCOMPONENTNAME) :: imName + + ! -- Determine advection scheme (the GWE-GWE exchange + ! has been read at this point) + this%iIfaceAdvScheme = this%gweExchange%iAdvScheme + ! + ! -- Determine xt3d setting on interface + this%iIfaceXt3d = this%gweExchange%ixt3d + + ! -- Turn off when off in the owning model + if (this%gweModel%incnd > 0) then + this%iIfaceXt3d = this%gweModel%cnd%ixt3d + end if + + ! -- Determine the required size of the interface model grid + call this%setGridExtent() + + ! -- Now set up the GridConnection + call this%spatialcon_df() + + ! -- We have to 'catch up' and create the interface model + ! here, then the remainder of this routine will be define + if (this%prim_exchange%v_model1 == this%owner) then + write (imName, '(a,i0)') 'GWEIM1_', this%gweExchange%id + else + write (imName, '(a,i0)') 'GWEIM2_', this%gweExchange%id + end if + call this%gweInterfaceModel%gweifmod_cr(imName, & + this%iout, & + this%ig_builder) + call this%gweInterfaceModel%set_idsoln(this%gweModel%idsoln) + this%gweInterfaceModel%iAdvScheme = this%iIfaceAdvScheme + this%gweInterfaceModel%ixt3d = this%iIfaceXt3d + call this%gweInterfaceModel%model_df() + + call this%cfg_dist_vars() + + call this%allocate_arrays() + call this%gweInterfaceModel%allocate_fmi() + + ! -- Connect X, RHS, IBOUND, and flowja + call this%spatialcon_setmodelptrs() + + ! -- Connect pointers (used by BUY) + this%conc => this%gweInterfaceModel%x + this%icbound => this%gweInterfaceModel%ibound + + ! -- Add connections from the interface model to solution matrix + call this%spatialcon_connect() + + end subroutine gwegwecon_df + + !> @brief Configure distributed variables for this interface model + !< + subroutine cfg_dist_vars(this) + ! -- dummy + class(GweGweConnectionType) :: this !< the connection + ! + call this%cfg_dv('X', '', SYNC_NDS, & + (/STG_BFR_CON_AR, STG_BFR_EXG_AD, STG_BFR_EXG_CF/)) + call this%cfg_dv('IBOUND', '', SYNC_NDS, (/STG_BFR_CON_AR/)) + call this%cfg_dv('TOP', 'DIS', SYNC_NDS, (/STG_BFR_CON_AR/)) + call this%cfg_dv('BOT', 'DIS', SYNC_NDS, (/STG_BFR_CON_AR/)) + call this%cfg_dv('AREA', 'DIS', SYNC_NDS, (/STG_BFR_CON_AR/)) + ! + if (this%gweInterfaceModel%cnd%idisp > 0) then + call this%cfg_dv('ALH', 'CND', SYNC_NDS, (/STG_BFR_CON_AR/)) + call this%cfg_dv('ALV', 'CND', SYNC_NDS, (/STG_BFR_CON_AR/)) + call this%cfg_dv('ATH1', 'CND', SYNC_NDS, (/STG_BFR_CON_AR/)) + call this%cfg_dv('ATH2', 'CND', SYNC_NDS, (/STG_BFR_CON_AR/)) + call this%cfg_dv('ATV', 'CND', SYNC_NDS, (/STG_BFR_CON_AR/)) + call this%cfg_dv('KTW', 'CND', SYNC_NDS, (/STG_BFR_CON_AR/)) + call this%cfg_dv('KTS', 'CND', SYNC_NDS, (/STG_BFR_CON_AR/)) + end if + call this%cfg_dv('GWFHEAD', 'FMI', SYNC_NDS, (/STG_BFR_EXG_AD/)) + call this%cfg_dv('GWFSAT', 'FMI', SYNC_NDS, (/STG_BFR_EXG_AD/)) + call this%cfg_dv('GWFSPDIS', 'FMI', SYNC_NDS, (/STG_BFR_EXG_AD/)) + call this%cfg_dv('GWFFLOWJA', 'FMI', SYNC_CON, (/STG_BFR_EXG_AD/)) + call this%cfg_dv('GWFFLOWJA', 'FMI', SYNC_EXG, (/STG_BFR_EXG_AD/), & + exg_var_name='GWFSIMVALS') + ! -- Fill porosity from est packages, needed for cnd + if (this%gweModel%incnd > 0 .and. this%gweModel%inest > 0) then + call this%cfg_dv('POROSITY', 'EST', SYNC_NDS, (/STG_AFT_CON_AR/)) + end if + ! + end subroutine cfg_dist_vars + + !> @brief Allocate array variables for this connection + !< + subroutine allocate_arrays(this) + class(GweGweConnectionType) :: this !< the connection + + call mem_allocate(this%exgflowjaGwe, this%ig_builder%nrOfBoundaryCells, & + 'EXGFLOWJAGWT', this%memoryPath) + + end subroutine allocate_arrays + + !> @brief Set required extent of the interface grid from + !< the configuration + subroutine setGridExtent(this) + ! -- dummy + class(GweGweConnectionType) :: this !< the connection + ! -- local + logical(LGP) :: hasAdv, hasCnd + ! + hasAdv = this%gweModel%inadv > 0 + hasCnd = this%gweModel%incnd > 0 + ! + if (hasAdv) then + if (this%iIfaceAdvScheme == 2) then + this%exg_stencil_depth = 2 + if (this%gweModel%adv%iadvwt == 2) then + this%int_stencil_depth = 2 + end if + end if + end if + ! + if (hasCnd) then + if (this%iIfaceXt3d > 0) then + this%exg_stencil_depth = 2 + if (this%gweModel%cnd%ixt3d > 0) then + this%int_stencil_depth = 2 + end if + end if + end if + ! + end subroutine setGridExtent + + !> @brief allocate and read/set the connection's data structures + !< + subroutine gwegwecon_ar(this) + class(GweGweConnectionType) :: this !< the connection + + ! check if we can construct an interface model + ! NB: only makes sense after the models' allocate&read have been + ! called, which is why we do it here + call this%validateConnection() + + ! -- Allocate and read base + call this%spatialcon_ar() + + ! ... and now the interface model + call this%gweInterfaceModel%model_ar() + + ! -- Set a pointer in the interface model to the gwecommon data + if (this%gweModel%inest > 0) then + this%gweInterfaceModel%gwecommon%gwecpw = this%gweModel%gwecommon%gwecpw + this%gweInterfaceModel%gwecommon%gwerhow = this%gweModel%gwecommon%gwerhow + end if + + !-- Set the equation scaling factor in the interface model to that of + ! underlying GWE model + if (this%gweModel%incnd > 0) then + this%gweInterfaceModel%ieqnsclfac = this%gweModel%cnd%eqnsclfac + end if + + ! -- AR the movers and obs through the exchange + if (this%owns_exchange) then + !cdl implement this when MVT is ready + !cdl if (this%gweExchange%inmvt > 0) then + !cdl call this%gweExchange%mvt%mvt_ar() + !cdl end if + if (this%gweExchange%inobs > 0) then + call this%gweExchange%obs%obs_ar() + end if + end if + + end subroutine gwegwecon_ar + + !> @brief validate this connection prior to constructing + !< the interface model + subroutine validateConnection(this) + use SimVariablesModule, only: errmsg + use SimModule, only: count_errors, store_error + class(GweGweConnectionType) :: this !< this connection + + ! -- Base validation, the spatial/geometry part + call this%SpatialModelConnectionType%validateConnection() + + ! -- We cannot validate this (yet) in parallel mode + if (.not. this%gweExchange%v_model1%is_local) return + if (.not. this%gweExchange%v_model2%is_local) return + + ! -- GWE related matters + if ((this%gweExchange%gwemodel1%inadv > 0 .and. & + this%gweExchange%gwemodel2%inadv == 0) .or. & + (this%gweExchange%gwemodel2%inadv > 0 .and. & + this%gweExchange%gwemodel1%inadv == 0)) then + write (errmsg, '(1x,a,a,a)') 'Cannot connect GWE models in exchange ', & + trim(this%gweExchange%name), ' because one model is configured with ADV & + &and the other one is not' + call store_error(errmsg) + end if + ! + if ((this%gweExchange%gwemodel1%incnd > 0 .and. & + this%gweExchange%gwemodel2%incnd == 0) .or. & + (this%gweExchange%gwemodel2%incnd > 0 .and. & + this%gweExchange%gwemodel1%incnd == 0)) then + write (errmsg, '(1x,a,a,a)') 'Cannot connect GWE models in exchange ', & + trim(this%gweExchange%name), ' because one model is configured with CND & + &and the other one is not' + call store_error(errmsg) + end if + ! + ! Abort on errors + if (count_errors() > 0) then + write (errmsg, '(a)') 'Errors occurred while processing exchange(s)' + call ustop() + end if + ! + end subroutine validateConnection + + subroutine gwegwecon_rp(this) + ! -- dummy + class(GweGweConnectionType) :: this !< the connection + ! + ! Call exchange rp routines + if (this%owns_exchange) then + call this%gweExchange%exg_rp() + end if + ! + end subroutine gwegwecon_rp + + !> @brief Advance this connection + !< + subroutine gwegwecon_ad(this) + ! + class(GweGweConnectionType) :: this !< this connection + ! + ! -- Recalculate conduction ellipse + if (this%gweInterfaceModel%incnd > 0) call this%gweInterfaceModel%cnd%cnd_ad() + ! + if (this%owns_exchange) then + call this%gweExchange%exg_ad() + end if + ! + end subroutine gwegwecon_ad + + subroutine gwegwecon_fc(this, kiter, matrix_sln, rhs_sln, inwtflag) + ! -- dummy + class(GweGweConnectionType) :: this !< the connection + integer(I4B), intent(in) :: kiter !< the iteration counter + class(MatrixBaseType), pointer :: matrix_sln !< the system matrix + real(DP), dimension(:), intent(inout) :: rhs_sln !< global right-hand-side + integer(I4B), optional, intent(in) :: inwtflag !< newton-raphson flag + ! + call this%SpatialModelConnectionType%spatialcon_fc( & + kiter, matrix_sln, rhs_sln, inwtflag) + ! + ! FC the movers through the exchange + if (this%owns_exchange) then + if (this%gweExchange%inmvt > 0) then + call this%gweExchange%mvt%mvt_fc(this%gweExchange%gwemodel1%x, & + this%gweExchange%gwemodel2%x) + end if + end if + ! + end subroutine gwegwecon_fc + + subroutine gwegwecon_cq(this, icnvg, isuppress_output, isolnid) + ! -- dummy + class(GweGweConnectionType) :: this !< the connection + integer(I4B), intent(inout) :: icnvg !< convergence flag + integer(I4B), intent(in) :: isuppress_output !< suppress output when =1 + integer(I4B), intent(in) :: isolnid !< solution id + ! + call this%gweInterfaceModel%model_cq(icnvg, isuppress_output) + call this%setFlowToExchange() + ! + end subroutine gwegwecon_cq + + !> @brief Set the flows (flowja from interface model) to the + !< simvals in the exchange, leaving the budget calcution in there + subroutine setFlowToExchange(this) + ! -- modules + use IndexMapModule + ! -- dummy + class(GweGweConnectionType) :: this !< this connection + ! -- local + integer(I4B) :: i + class(GweExchangeType), pointer :: gweEx + type(IndexMapSgnType), pointer :: map + ! + if (this%owns_exchange) then + gweEx => this%gweExchange + map => this%interface_map%exchange_maps(this%interface_map%prim_exg_idx) + ! + ! -- Use (half of) the exchange map in reverse: + do i = 1, size(map%src_idx) + if (map%sign(i) < 0) cycle ! simvals is defined from exg%m1 => exg%m2 + gweEx%simvals(map%src_idx(i)) = & + this%gweInterfaceModel%flowja(map%tgt_idx(i)) + end do + end if + ! + end subroutine setFlowToExchange + + subroutine gwegwecon_bd(this, icnvg, isuppress_output, isolnid) + ! -- modules + use BudgetModule, only: rate_accumulator + ! -- dummy + class(GweGweConnectionType) :: this !< the connection + integer(I4B), intent(inout) :: icnvg !< convergence flag + integer(I4B), intent(in) :: isuppress_output !< suppress output when =1 + integer(I4B), intent(in) :: isolnid !< solution id + ! + ! -- Call exchange budget routine, also calls bd + ! for movers. + if (this%owns_exchange) then + call this%gweExchange%exg_bd(icnvg, isuppress_output, isolnid) + end if + ! + end subroutine gwegwecon_bd + + subroutine gwegwecon_ot(this) + ! -- dummy + class(GweGweConnectionType) :: this !< the connection + ! + ! -- Call exg_ot() here as it handles all output processing + ! based on gweExchange%simvals(:), which was correctly + ! filled from gwegwecon + if (this%owns_exchange) then + call this%gweExchange%exg_ot() + end if + ! + end subroutine gwegwecon_ot + + subroutine gwegwecon_da(this) + ! -- dummy + class(GweGweConnectionType) :: this !< the connection + ! -- local + logical(LGP) :: isOpen + ! + ! -- Scalars + call mem_deallocate(this%iIfaceAdvScheme) + call mem_deallocate(this%iIfaceXt3d) + call mem_deallocate(this%exgflowSign) + ! + ! -- Arrays + call mem_deallocate(this%exgflowjaGwe) + ! + ! -- Interface model + call this%gweInterfaceModel%model_da() + deallocate (this%gweInterfaceModel) + ! + ! -- Dealloc base + call this%spatialcon_da() + ! + inquire (this%iout, opened=isOpen) + if (isOpen) then + close (this%iout) + end if + ! + ! -- We need to deallocate the exchange we own: + if (this%owns_exchange) then + call this%gweExchange%exg_da() + end if + ! + end subroutine gwegwecon_da + + !> @brief Cast to GweGweConnectionType + !< + function CastAsGweGweConnection(obj) result(res) + implicit none + ! -- dummy + class(*), pointer, intent(inout) :: obj !< object to be cast + ! -- return + class(GweGweConnectionType), pointer :: res !< the GweGweConnection + ! + res => null() + if (.not. associated(obj)) return + ! + select type (obj) + class is (GweGweConnectionType) + res => obj + end select + ! + end function CastAsGweGweConnection + +end module diff --git a/src/Model/Connection/GweInterfaceModel.f90 b/src/Model/Connection/GweInterfaceModel.f90 new file mode 100644 index 00000000000..d7f1978f5ff --- /dev/null +++ b/src/Model/Connection/GweInterfaceModel.f90 @@ -0,0 +1,274 @@ +module GweInterfaceModelModule + use KindModule, only: I4B, DP + use ConstantsModule, only: DONE + use MemoryManagerModule, only: mem_allocate, mem_deallocate, mem_reallocate + use MemoryHelperModule, only: create_mem_path + use NumericalModelModule, only: NumericalModelType + use GweModule, only: GweModelType, CastAsGweModel + use GwfDisuModule, only: disu_cr, CastAsDisuType + use TspFmiModule, only: fmi_cr, TspFmiType + use TspAdvModule, only: adv_cr, TspAdvType + use TspAdvOptionsModule, only: TspAdvOptionsType + use GweCndModule, only: cnd_cr, GweCndType + use GweCndOptionsModule, only: GweCndOptionsType + use GweEstModule, only: est_cr + use TspObsModule, only: tsp_obs_cr + use GridConnectionModule + use GweInputDataModule, only: GweInputDataType + + implicit none + private + + !> The GWE Interface Model is a utility to calculate the solution's exchange + !! coefficients from the interface between a GWE model and its GWE neighbors. + !! The interface model itself will not be part of the solution, it is not + !! being solved. + !< + type, public, extends(GweModelType) :: GweInterfaceModelType + + integer(i4B), pointer :: iAdvScheme => null() !< the advection scheme: 0 = up, 1 = central, 2 = tvd + integer(i4B), pointer :: ixt3d => null() !< xt3d setting: 0 = off, 1 = lhs, 2 = rhs + real(DP), pointer :: ieqnsclfac => null() !< governing eqn scaling factor: 1: GWT, >1: GWE + + class(GridConnectionType), pointer :: gridConnection => null() !< The grid connection class will provide the interface grid + class(GweModelType), private, pointer :: owner => null() !< the real GWE model for which the exchange coefficients + !! are calculated with this interface model + + real(DP), dimension(:), pointer, contiguous :: porosity => null() !< to be filled with EST porosity + + contains + + procedure, pass(this) :: gweifmod_cr + procedure :: model_df => gweifmod_df + procedure :: model_ar => gweifmod_ar + procedure :: model_da => gweifmod_da + procedure, public :: allocate_fmi + procedure :: allocate_scalars + end type GweInterfaceModelType + +contains + + !> @brief Create the interface model, analogously to what + !< happens in gwe_cr + subroutine gweifmod_cr(this, name, iout, gridConn) + ! -- modules + use GweInputDataModule, only: gweshared_dat_cr + ! -- dummy + class(GweInterfaceModelType) :: this !< the GWE interface model + character(len=*), intent(in) :: name !< the interface model's name + integer(I4B), intent(in) :: iout !< the output unit + class(GridConnectionType), pointer, intent(in) :: gridConn !< the grid connection data for creating a DISU + ! -- local + class(*), pointer :: modelPtr + integer(I4B), target :: inobs + integer(I4B) :: adv_unit, cnd_unit + ! + this%memoryPath = create_mem_path(name) + call this%allocate_scalars(name) + ! + ! -- Instantiate shared data container + call gweshared_dat_cr(this%gwecommon) + ! + ! -- Defaults + this%iAdvScheme = 0 + this%ixt3d = 0 + this%ieqnsclfac = DONE + ! + this%iout = iout + this%gridConnection => gridConn + modelPtr => gridConn%model + this%owner => CastAsGweModel(modelPtr) + ! + inobs = 0 + adv_unit = 0 + cnd_unit = 0 + if (this%owner%inadv > 0) then + this%inadv = huge(1_I4B) + adv_unit = huge(1_I4B) + end if + if (this%owner%incnd > 0) then + this%incnd = huge(1_I4B) + cnd_unit = huge(1_I4B) + end if + ! + ! -- Create dis and packages + call disu_cr(this%dis, this%name, '', -1, this%iout) + call fmi_cr(this%fmi, this%name, 0, this%iout, this%ieqnsclfac, & + this%depvartype) + call adv_cr(this%adv, this%name, adv_unit, this%iout, this%fmi, & + this%ieqnsclfac) + call cnd_cr(this%cnd, this%name, '', -cnd_unit, this%iout, this%fmi, & + this%ieqnsclfac, this%gwecommon) + call tsp_obs_cr(this%obs, inobs) + ! + ! -- Return + return + end subroutine gweifmod_cr + + !> @brief Allocate scalars associated with the interface model object + !< + subroutine allocate_scalars(this, modelname) + ! -- dummy + class(GweInterfaceModelType) :: this !< the GWE interface model + character(len=*), intent(in) :: modelname !< the model name + ! + call this%GweModelType%allocate_scalars(modelname) + ! + call mem_allocate(this%iAdvScheme, 'ADVSCHEME', this%memoryPath) + call mem_allocate(this%ixt3d, 'IXT3D', this%memoryPath) + call mem_allocate(this%ieqnsclfac, 'IEQNSCLFAC', this%memoryPath) + ! + ! -- Return + return + end subroutine allocate_scalars + + !> @brief Allocate a Flow Model Interface (FMI) object for the interface model + !< + subroutine allocate_fmi(this) + ! -- dummy + class(GweInterfaceModelType) :: this !< the GWT interface model + ! + call mem_allocate(this%fmi%gwfflowja, this%nja, 'GWFFLOWJA', & + this%fmi%memoryPath) + call mem_allocate(this%fmi%gwfhead, this%neq, 'GWFHEAD', & + this%fmi%memoryPath) + call mem_allocate(this%fmi%gwfsat, this%neq, 'GWFSAT', & + this%fmi%memoryPath) + call mem_allocate(this%fmi%gwfspdis, 3, this%neq, 'GWFSPDIS', & + this%fmi%memoryPath) + ! + ! -- Return + return + end subroutine allocate_fmi + + !> @brief Define the GWE interface model + !< + subroutine gweifmod_df(this) + ! -- dummy + class(GweInterfaceModelType) :: this !< the GWE interface model + ! -- local + class(*), pointer :: disPtr + type(TspAdvOptionsType) :: adv_options + type(GweCndOptionsType) :: cnd_options + ! + this%moffset = 0 + adv_options%iAdvScheme = this%iAdvScheme + cnd_options%ixt3d = this%ixt3d + ! + ! -- Define DISU + disPtr => this%dis + call this%gridConnection%getDiscretization(CastAsDisuType(disPtr)) + call this%fmi%fmi_df(this%dis, 0) + ! + if (this%inadv > 0) then + call this%adv%adv_df(adv_options) + end if + ! + if (this%incnd > 0) then + this%cnd%idisp = this%owner%cnd%idisp + call this%cnd%cnd_df(this%dis, cnd_options) + ! + if (this%cnd%idisp > 0) then + call mem_reallocate(this%cnd%alh, this%dis%nodes, 'ALH', & + trim(this%cnd%memoryPath)) + call mem_reallocate(this%cnd%alv, this%dis%nodes, 'ALV', & + trim(this%cnd%memoryPath)) + call mem_reallocate(this%cnd%ath1, this%dis%nodes, 'ATH1', & + trim(this%cnd%memoryPath)) + call mem_reallocate(this%cnd%ath2, this%dis%nodes, 'ATH2', & + trim(this%cnd%memoryPath)) + call mem_reallocate(this%cnd%atv, this%dis%nodes, 'ATV', & + trim(this%cnd%memoryPath)) + call mem_reallocate(this%cnd%ktw, this%dis%nodes, 'KTW', & + trim(this%cnd%memoryPath)) + call mem_reallocate(this%cnd%kts, this%dis%nodes, 'KTS', & + trim(this%cnd%memoryPath)) + end if + allocate (this%est) + call mem_allocate(this%est%porosity, this%dis%nodes, & + 'POROSITY', create_mem_path(this%name, 'EST')) + end if + ! + ! -- Assign or point model members to dis members + this%neq = this%dis%nodes + this%nja = this%dis%nja + this%ia => this%dis%con%ia + this%ja => this%dis%con%ja + ! + ! -- Define shared data (cpw, rhow, latent heat of vaporization) + call this%gwecommon%gweshared_dat_df(this%neq) + ! + ! -- Allocate model arrays, now that neq and nja are assigned + call this%allocate_arrays() + ! + ! -- Return + return + end subroutine gweifmod_df + + !> @brief Override allocate and read the GWE interface model and its packages + !! so that we can create stuff from memory instead of input files + !< + subroutine gweifmod_ar(this) + ! -- dummy + class(GweInterfaceModelType) :: this !< the GWE interface model + ! + call this%fmi%fmi_ar(this%ibound) + if (this%inadv > 0) then + call this%adv%adv_ar(this%dis, this%ibound) + end if + if (this%incnd > 0) then + call this%cnd%cnd_ar(this%ibound, this%est%porosity) + end if + ! + ! -- Return + return + end subroutine gweifmod_ar + + !> @brief Clean up resources + !< + subroutine gweifmod_da(this) + ! -- dummy + class(GweInterfaceModelType) :: this !< the GWE interface model + ! + ! -- members specified in the interface model input for use by the + ! interface model + call mem_deallocate(this%iAdvScheme) + call mem_deallocate(this%ixt3d) + call mem_deallocate(this%ieqnsclfac) + ! + ! -- gwe packages + call this%dis%dis_da() + call this%fmi%fmi_da() + call this%adv%adv_da() + call this%cnd%cnd_da() + ! + deallocate (this%dis) + deallocate (this%fmi) + deallocate (this%adv) + deallocate (this%cnd) + ! + if (associated(this%est)) then + call mem_deallocate(this%est%porosity) + deallocate (this%est) + end if + ! + ! -- gwe scalars + call mem_deallocate(this%inic) + call mem_deallocate(this%infmi) + call mem_deallocate(this%inadv) + call mem_deallocate(this%incnd) + call mem_deallocate(this%inssm) + call mem_deallocate(this%inest) + call mem_deallocate(this%inmvt) + call mem_deallocate(this%inoc) + call mem_deallocate(this%inobs) + call mem_deallocate(this%eqnsclfac) + ! + ! -- base + call this%NumericalModelType%model_da() + ! + ! -- Return + return + end subroutine gweifmod_da + +end module GweInterfaceModelModule diff --git a/src/Model/Connection/GwtGwtConnection.f90 b/src/Model/Connection/GwtGwtConnection.f90 index 0f8ea2eb798..87b8352cbe4 100644 --- a/src/Model/Connection/GwtGwtConnection.f90 +++ b/src/Model/Connection/GwtGwtConnection.f90 @@ -154,7 +154,7 @@ subroutine gwtgwtcon_df(this) ! determine advection scheme (the GWT-GWT exchange ! has been read at this point) this%iIfaceAdvScheme = this%gwtExchange%iAdvScheme - + ! ! determine xt3d setting on interface- (TODO_MJR: default is on?) this%iIfaceXt3d = this%gwtExchange%ixt3d @@ -377,11 +377,11 @@ subroutine gwtgwtcon_fc(this, kiter, matrix_sln, rhs_sln, inwtflag) class(MatrixBaseType), pointer :: matrix_sln !< the system matrix real(DP), dimension(:), intent(inout) :: rhs_sln !< global right-hand-side integer(I4B), optional, intent(in) :: inwtflag !< newton-raphson flag - ! local + ! call this%SpatialModelConnectionType%spatialcon_fc( & kiter, matrix_sln, rhs_sln, inwtflag) - + ! ! FC the movers through the exchange if (this%owns_exchange) then if (this%gwtExchange%inmvt > 0) then diff --git a/src/Model/Connection/GwtInterfaceModel.f90 b/src/Model/Connection/GwtInterfaceModel.f90 index 4adfda4c36d..59d5eec3827 100644 --- a/src/Model/Connection/GwtInterfaceModel.f90 +++ b/src/Model/Connection/GwtInterfaceModel.f90 @@ -18,10 +18,11 @@ module GwtInterfaceModelModule implicit none private - !> The GWT Interface Model is a utility to calculate the solution's - !! exchange coefficients from the interface between a GWT model and - !! its GWT neighbors. The interface model itself will not be part - !! of the solution, it is not being solved. + !> The GWT Interface Model is a utility to calculate the solution's exchange + !! coefficients from the interface between a GWT model and its GWT neighbors. + !! The interface model itself will not be part of the solution, it is not + !! being solved. + !< type, public, extends(GwtModelType) :: GwtInterfaceModelType integer(i4B), pointer :: iAdvScheme => null() !< the advection scheme: 0 = up, 1 = central, 2 = tvd @@ -46,6 +47,7 @@ module GwtInterfaceModelModule !> @brief Create the interface model, analogously to what !< happens in gwt_cr subroutine gwtifmod_cr(this, name, iout, gridConn) + ! -- dummy class(GwtInterfaceModelType) :: this !< the GWT interface model character(len=*), intent(in) :: name !< the interface model's name integer(I4B), intent(in) :: iout !< the output unit @@ -54,20 +56,20 @@ subroutine gwtifmod_cr(this, name, iout, gridConn) class(*), pointer :: modelPtr integer(I4B), target :: inobs integer(I4B) :: adv_unit, dsp_unit - + ! this%memoryPath = create_mem_path(name) call this%allocate_scalars(name) - + ! ! defaults this%iAdvScheme = 0 this%ixt3d = 0 this%ieqnsclfac = DONE - + ! this%iout = iout this%gridConnection => gridConn modelPtr => gridConn%model this%owner => CastAsGwtModel(modelPtr) - + ! inobs = 0 adv_unit = 0 dsp_unit = 0 @@ -79,7 +81,7 @@ subroutine gwtifmod_cr(this, name, iout, gridConn) this%indsp = huge(1_I4B) dsp_unit = huge(1_I4B) end if - + ! ! create dis and packages call disu_cr(this%dis, this%name, '', -1, this%iout) call fmi_cr(this%fmi, this%name, 0, this%iout, this%ieqnsclfac, & @@ -88,24 +90,34 @@ subroutine gwtifmod_cr(this, name, iout, gridConn) this%ieqnsclfac) call dsp_cr(this%dsp, this%name, '', -dsp_unit, this%iout, this%fmi) call tsp_obs_cr(this%obs, inobs) - + ! + ! -- Return + return end subroutine gwtifmod_cr + !> @brief Allocate scalars associated with the interface model object + !< subroutine allocate_scalars(this, modelname) + ! -- dummy class(GwtInterfaceModelType) :: this !< the GWT interface model character(len=*), intent(in) :: modelname !< the model name - + ! call this%GwtModelType%allocate_scalars(modelname) - + ! call mem_allocate(this%iAdvScheme, 'ADVSCHEME', this%memoryPath) call mem_allocate(this%ixt3d, 'IXT3D', this%memoryPath) call mem_allocate(this%ieqnsclfac, 'IEQNSCLFAC', this%memoryPath) - + ! + ! -- Return + return end subroutine allocate_scalars + !> @brief Allocate a Flow Model Interface (FMI) object for the interface model + !< subroutine allocate_fmi(this) + ! -- dummy class(GwtInterfaceModelType) :: this !< the GWT interface model - + ! call mem_allocate(this%fmi%gwfflowja, this%nja, 'GWFFLOWJA', & this%fmi%memoryPath) call mem_allocate(this%fmi%gwfhead, this%neq, 'GWFHEAD', & @@ -114,27 +126,30 @@ subroutine allocate_fmi(this) this%fmi%memoryPath) call mem_allocate(this%fmi%gwfspdis, 3, this%neq, 'GWFSPDIS', & this%fmi%memoryPath) - + ! + ! -- Return + return end subroutine allocate_fmi !> @brief Define the GWT interface model !< subroutine gwtifmod_df(this) + ! -- dummy class(GwtInterfaceModelType) :: this !< the GWT interface model - ! local + ! -- local class(*), pointer :: disPtr type(TspAdvOptionsType) :: adv_options type(GwtDspOptionsType) :: dsp_options - + ! this%moffset = 0 adv_options%iAdvScheme = this%iAdvScheme dsp_options%ixt3d = this%ixt3d - + ! ! define DISU disPtr => this%dis call this%gridConnection%getDiscretization(CastAsDisuType(disPtr)) - call this%fmi%fmi_df(this%dis) - + call this%fmi%fmi_df(this%dis, 1) + ! if (this%inadv > 0) then call this%adv%adv_df(adv_options) end if @@ -162,7 +177,7 @@ subroutine gwtifmod_df(this) call mem_allocate(this%mst%thetam, this%dis%nodes, & 'THETAM', create_mem_path(this%name, 'MST')) end if - + ! ! assign or point model members to dis members this%neq = this%dis%nodes this%nja = this%dis%nja @@ -171,15 +186,18 @@ subroutine gwtifmod_df(this) ! ! allocate model arrays, now that neq and nja are assigned call this%allocate_arrays() - + ! + ! -- Return + return end subroutine gwtifmod_df - !> @brief Override allocate and read the GWT interface model and its - !! packages so that we can create stuff from memory instead of input - !< files + !> @brief Override allocate and read the GWT interface model and its packages + !! so that we can create stuff from memory instead of input files + !< subroutine gwtifmod_ar(this) + ! -- dummy class(GwtInterfaceModelType) :: this !< the GWT interface model - + ! call this%fmi%fmi_ar(this%ibound) if (this%inadv > 0) then call this%adv%adv_ar(this%dis, this%ibound) @@ -187,35 +205,39 @@ subroutine gwtifmod_ar(this) if (this%indsp > 0) then call this%dsp%dsp_ar(this%ibound, this%mst%thetam) end if - + ! + ! -- Return + return end subroutine gwtifmod_ar !> @brief Clean up resources !< subroutine gwtifmod_da(this) + ! -- dummy class(GwtInterfaceModelType) :: this !< the GWT interface model + ! ! this call mem_deallocate(this%iAdvScheme) call mem_deallocate(this%ixt3d) call mem_deallocate(this%ieqnsclfac) - + ! ! gwt packages call this%dis%dis_da() call this%fmi%fmi_da() call this%adv%adv_da() call this%dsp%dsp_da() - + ! deallocate (this%dis) deallocate (this%fmi) deallocate (this%adv) deallocate (this%dsp) - + ! if (associated(this%mst)) then call mem_deallocate(this%mst%thetam) deallocate (this%mst) end if - + ! ! gwt scalars call mem_deallocate(this%inic) call mem_deallocate(this%infmi) @@ -227,10 +249,12 @@ subroutine gwtifmod_da(this) call mem_deallocate(this%inoc) call mem_deallocate(this%inobs) call mem_deallocate(this%eqnsclfac) - + ! ! base call this%NumericalModelType%model_da() - + ! + ! -- Return + return end subroutine gwtifmod_da end module GwtInterfaceModelModule diff --git a/src/Model/GroundWaterEnergy/gwe1.f90 b/src/Model/GroundWaterEnergy/gwe1.f90 new file mode 100644 index 00000000000..fafde6d3101 --- /dev/null +++ b/src/Model/GroundWaterEnergy/gwe1.f90 @@ -0,0 +1,991 @@ +! Groundwater Energy Transport (GWE) Model + +module GweModule + + use KindModule, only: DP, I4B + use InputOutputModule, only: ParseLine, upcase + use ConstantsModule, only: LENFTYPE, LENMEMPATH, DZERO, LENPAKLOC, & + LENVARNAME, LENPACKAGETYPE + use VersionModule, only: write_listfile_header + use NumericalModelModule, only: NumericalModelType + use BaseModelModule, only: BaseModelType + use BndModule, only: BndType, AddBndToList, GetBndFromList + use GweCndModule, only: GweCndType + use GweEstModule, only: GweEstType + use BudgetModule, only: BudgetType + use GweInputDataModule, only: GweInputDataType + use TransportModelModule + use MatrixBaseModule + + implicit none + + private + public :: gwe_cr + public :: GweModelType + public :: CastAsGweModel + + public :: GWE_NBASEPKG, GWE_NMULTIPKG + public :: GWE_BASEPKG, GWE_MULTIPKG + character(len=LENVARNAME), parameter :: dvt = 'TEMPERATURE ' !< dependent variable type, varies based on model type + character(len=LENVARNAME), parameter :: dvu = 'ENERGY ' !< dependent variable unit of measure, either "mass" or "energy" + character(len=LENVARNAME), parameter :: dvua = 'E ' !< abbreviation of the dependent variable unit of measure, either "M" or "E" + + type, extends(TransportModelType) :: GweModelType + + type(GweInputDataType), pointer :: gwecommon => null() !< container for data shared with multiple packages + type(GweEstType), pointer :: est => null() !< mass storage and transfer package + type(GweCndType), pointer :: cnd => null() !< dispersion package + integer(I4B), pointer :: inest => null() ! unit number EST + integer(I4B), pointer :: incnd => null() ! unit number CND + + contains + + procedure :: model_df => gwe_df + procedure :: model_ac => gwe_ac + procedure :: model_mc => gwe_mc + procedure :: model_ar => gwe_ar + procedure :: model_rp => gwe_rp + procedure :: model_ad => gwe_ad + procedure :: model_cf => gwe_cf + procedure :: model_fc => gwe_fc + procedure :: model_cc => gwe_cc + procedure :: model_cq => gwe_cq + procedure :: model_bd => gwe_bd + procedure :: model_ot => gwe_ot + procedure :: model_da => gwe_da + procedure :: model_bdentry => gwe_bdentry + procedure :: allocate_scalars + procedure :: get_iasym => gwe_get_iasym + procedure :: create_packages => create_gwe_packages + procedure, private :: create_bndpkgs + procedure, private :: package_create + + end type GweModelType + + !> @brief GWE base package array descriptors + !! + !! GWE6 model base package types. Only listed packages are candidates + !! for input and these will be loaded in the order specified. + !< + integer(I4B), parameter :: GWE_NBASEPKG = 50 + character(len=LENPACKAGETYPE), dimension(GWE_NBASEPKG) :: GWE_BASEPKG + data GWE_BASEPKG/'DIS6 ', 'DISV6', 'DISU6', ' ', ' ', & ! 5 + &'IC6 ', 'FMI6 ', 'EST6 ', 'ADV6 ', ' ', & ! 10 + &'CND6 ', 'SSM6 ', 'MVT6 ', 'OC6 ', ' ', & ! 15 + &'OBS6 ', ' ', ' ', ' ', ' ', & ! 20 + &30*' '/ ! 50 + + !> @brief GWE multi package array descriptors + !! + !! GWE6 model multi-instance package types. Only listed packages are + !! candidates for input and these will be loaded in the order specified. + !< + integer(I4B), parameter :: GWE_NMULTIPKG = 50 + character(len=LENPACKAGETYPE), dimension(GWE_NMULTIPKG) :: GWE_MULTIPKG + data GWE_MULTIPKG/'CTP6 ', 'ESL6 ', 'LKE6 ', 'SFE6 ', ' ', & ! 5 + &'MWE6 ', 'UZE6 ', 'API6 ', ' ', ' ', & ! 10 + &40*' '/ ! 50 + + ! -- Size of supported model package arrays + integer(I4B), parameter :: NIUNIT_GWE = GWE_NBASEPKG + GWE_NMULTIPKG + +contains + + !> @brief Create a new groundwater energy transport model object + !< + subroutine gwe_cr(filename, id, modelname) + ! -- modules + use ListsModule, only: basemodellist + use BaseModelModule, only: AddBaseModelToList + use ConstantsModule, only: LINELENGTH, LENPACKAGENAME + use MemoryHelperModule, only: create_mem_path + use MemoryManagerExtModule, only: mem_set_value + use GwfNamInputModule, only: GwfNamParamFoundType + use BudgetModule, only: budget_cr + use GweInputDataModule, only: gweshared_dat_cr + ! -- dummy + character(len=*), intent(in) :: filename + integer(I4B), intent(in) :: id + character(len=*), intent(in) :: modelname + ! -- local + integer(I4B) :: indis + type(GweModelType), pointer :: this + class(BaseModelType), pointer :: model + ! + ! -- Allocate a new GWE Model (this) and add it to basemodellist + allocate (this) + ! + ! -- Set memory path before allocation in memory manager can be done + this%memoryPath = create_mem_path(modelname) + ! + ! -- Allocate scalars and add model to basemodellist + call this%allocate_scalars(modelname) + ! + ! -- Set labels for transport model - needed by create_packages() below + call this%set_tsp_labels(this%macronym, dvt, dvu, dvua) + ! + model => this + call AddBaseModelToList(basemodellist, model) + ! + ! -- Instantiate shared data container + call gweshared_dat_cr(this%gwecommon) + ! + ! -- Call parent class routine + call this%tsp_cr(filename, id, modelname, 'GWE', indis) + ! + ! -- Create model packages + call this%create_packages(indis) + ! + ! -- Return + return + end subroutine gwe_cr + + !> @brief Define packages of the GWE model + !! + !! This subroutine defines a gwe model type. Steps include: + !! - call df routines for each package + !! - set variables and pointers + !< + subroutine gwe_df(this) + ! -- modules + use SimModule, only: store_error + use GweInputDataModule, only: gweshared_dat_df + ! -- dummy + class(GweModelType) :: this + ! -- local + integer(I4B) :: ip + class(BndType), pointer :: packobj + ! + ! -- Define packages and utility objects + call this%dis%dis_df() + call this%fmi%fmi_df(this%dis, 0) + if (this%inmvt > 0) call this%mvt%mvt_df(this%dis) + if (this%inadv > 0) call this%adv%adv_df() + if (this%incnd > 0) call this%cnd%cnd_df(this%dis) + if (this%inssm > 0) call this%ssm%ssm_df() + call this%oc%oc_df() + call this%budget%budget_df(NIUNIT_GWE, this%depvarunit, & + this%depvarunitabbrev) + ! + ! -- Check for SSM package + if (this%inssm == 0) then + if (this%fmi%nflowpack > 0) then + call store_error('Flow model has boundary packages, but there & + &is no SSM package. The SSM package must be activated.', & + terminate=.TRUE.) + end if + end if + ! + ! -- Assign or point model members to dis members + this%neq = this%dis%nodes + this%nja = this%dis%nja + this%ia => this%dis%con%ia + this%ja => this%dis%con%ja + ! + ! -- Define shared data (cpw, rhow, latent heat of vaporization) + call this%gwecommon%gweshared_dat_df(this%neq) + ! + ! -- Allocate model arrays, now that neq and nja are assigned + call this%allocate_arrays() + ! + ! -- Define packages and assign iout for time series managers + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_df(this%neq, this%dis) + packobj%TsManager%iout = this%iout + packobj%TasManager%iout = this%iout + end do + ! + ! -- Store information needed for observations + call this%obs%obs_df(this%iout, this%name, 'GWE', this%dis) + ! + ! -- Return + return + end subroutine gwe_df + + !> @brief Add the internal connections of this model to the sparse matrix + !< + subroutine gwe_ac(this, sparse) + ! -- modules + use SparseModule, only: sparsematrix + ! -- dummy + class(GweModelType) :: this + type(sparsematrix), intent(inout) :: sparse + ! -- local + class(BndType), pointer :: packobj + integer(I4B) :: ip + ! + ! -- Add the internal connections of this model to sparse + call this%dis%dis_ac(this%moffset, sparse) + if (this%incnd > 0) & + call this%cnd%cnd_ac(this%moffset, sparse) + ! + ! -- Add any package connections + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ac(this%moffset, sparse) + end do + ! + ! -- Return + return + end subroutine gwe_ac + + !> @brief Map the positions of the GWE model connections in the numerical + !! solution coefficient matrix. + !< + subroutine gwe_mc(this, matrix_sln) + ! -- dummy + class(GweModelType) :: this + class(MatrixBaseType), pointer :: matrix_sln !< global system matrix + ! -- local + class(BndType), pointer :: packobj + integer(I4B) :: ip + ! + ! -- Find the position of each connection in the global ia, ja structure + ! and store them in idxglo. + call this%dis%dis_mc(this%moffset, this%idxglo, matrix_sln) + ! + if (this%incnd > 0) call this%cnd%cnd_mc(this%moffset, matrix_sln) + ! + ! -- Map any package connections + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_mc(this%moffset, matrix_sln) + end do + ! + ! -- Return + return + end subroutine gwe_mc + + !> @brief GWE Model Allocate and Read + !! + !! This subroutine: + !! - allocates and reads packages that are part of this model, + !! - allocates memory for arrays used by this model object + !< + subroutine gwe_ar(this) + ! -- modules + use ConstantsModule, only: DHNOFLO + ! -- dummy + class(GweModelType) :: this + ! -- locals + integer(I4B) :: ip + class(BndType), pointer :: packobj + ! + ! -- Allocate and read modules attached to model + call this%fmi%fmi_ar(this%ibound) + if (this%inmvt > 0) call this%mvt%mvt_ar() + if (this%inic > 0) call this%ic%ic_ar(this%x) + if (this%inest > 0) call this%est%est_ar(this%dis, this%ibound) + if (this%inadv > 0) call this%adv%adv_ar(this%dis, this%ibound) + if (this%incnd > 0) call this%cnd%cnd_ar(this%ibound, this%est%porosity) + if (this%inssm > 0) call this%ssm%ssm_ar(this%dis, this%ibound, this%x) + if (this%inobs > 0) call this%obs%tsp_obs_ar(this%ic, this%x, this%flowja) + ! + ! -- Set governing equation scale factor + this%eqnsclfac = this%gwecommon%gwerhow * this%gwecommon%gwecpw + ! + ! -- Call dis_ar to write binary grid file + !call this%dis%dis_ar(this%npf%icelltype) + ! + ! -- Set up output control + call this%oc%oc_ar(this%x, this%dis, DHNOFLO, this%depvartype) + call this%budget%set_ibudcsv(this%oc%ibudcsv) + ! + ! -- Package input files now open, so allocate and read + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%set_pointers(this%dis%nodes, this%ibound, this%x, & + this%xold, this%flowja) + ! -- Read and allocate package + call packobj%bnd_ar() + end do + ! + ! -- Return + return + end subroutine gwe_ar + + !> @brief GWE Model Read and Prepare + !! + !! This subroutine calls the attached packages' read and prepare routines + !< + subroutine gwe_rp(this) + ! -- modules + use TdisModule, only: readnewdata + ! -- dummy + class(GweModelType) :: this + ! -- local + class(BndType), pointer :: packobj + integer(I4B) :: ip + ! + ! -- In fmi, check for mvt and mvrbudobj consistency + call this%fmi%fmi_rp(this%inmvt) + if (this%inmvt > 0) call this%mvt%mvt_rp() + ! + ! -- Check with TDIS on whether or not it is time to RP + if (.not. readnewdata) return + ! + ! -- Read and prepare + if (this%inoc > 0) call this%oc%oc_rp() + if (this%inssm > 0) call this%ssm%ssm_rp() + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_rp() + call packobj%bnd_rp_obs() + end do + ! + ! -- Return + return + end subroutine gwe_rp + + !> @brief GWE Model Time Step Advance + !! + !! This subroutine calls the attached packages' advance subroutines + !< + subroutine gwe_ad(this) + ! -- modules + use SimVariablesModule, only: isimcheck, iFailedStepRetry + ! -- dummy + class(GweModelType) :: this + class(BndType), pointer :: packobj + ! -- local + integer(I4B) :: irestore + integer(I4B) :: ip, n + ! + ! -- Reset state variable + irestore = 0 + if (iFailedStepRetry > 0) irestore = 1 + if (irestore == 0) then + ! + ! -- Copy x into xold + do n = 1, this%dis%nodes + if (this%ibound(n) == 0) then + this%xold(n) = DZERO + else + this%xold(n) = this%x(n) + end if + end do + else + ! + ! -- Copy xold into x if this time step is a redo + do n = 1, this%dis%nodes + this%x(n) = this%xold(n) + end do + end if + ! + ! -- Advance fmi + call this%fmi%fmi_ad(this%x) + ! + ! -- Advance + if (this%incnd > 0) call this%cnd%cnd_ad() + if (this%inssm > 0) call this%ssm%ssm_ad() + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ad() + if (isimcheck > 0) then + call packobj%bnd_ck() + end if + end do + ! + ! -- Push simulated values to preceding time/subtime step + call this%obs%obs_ad() + ! + ! -- Return + return + end subroutine gwe_ad + + !> @brief GWE Model calculate coefficients + !! + !! This subroutine calls the attached packages' calculate coefficients + !! subroutines + !< + subroutine gwe_cf(this, kiter) + ! -- dummy + class(GweModelType) :: this + integer(I4B), intent(in) :: kiter + ! -- local + class(BndType), pointer :: packobj + integer(I4B) :: ip + ! + ! -- Call package cf routines + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_cf() + end do + ! + ! -- Return + return + end subroutine gwe_cf + + !> @brief GWE Model fill coefficients + !! + !! This subroutine calls the attached packages' fill coefficients + !! subroutines + !< + subroutine gwe_fc(this, kiter, matrix_sln, inwtflag) + ! -- dummy + class(GweModelType) :: this + integer(I4B), intent(in) :: kiter + class(MatrixBaseType), pointer :: matrix_sln + integer(I4B), intent(in) :: inwtflag + ! -- local + class(BndType), pointer :: packobj + integer(I4B) :: ip + ! + ! -- Call fc routines + call this%fmi%fmi_fc(this%dis%nodes, this%xold, this%nja, matrix_sln, & + this%idxglo, this%rhs) + if (this%inmvt > 0) then + call this%mvt%mvt_fc(this%x, this%x) + end if + if (this%inest > 0) then + call this%est%est_fc(this%dis%nodes, this%xold, this%nja, matrix_sln, & + this%idxglo, this%x, this%rhs, kiter) + end if + if (this%inadv > 0) then + call this%adv%adv_fc(this%dis%nodes, matrix_sln, this%idxglo, this%x, & + this%rhs) + end if + if (this%incnd > 0) then + call this%cnd%cnd_fc(kiter, this%dis%nodes, this%nja, matrix_sln, & + this%idxglo, this%rhs, this%x) + end if + if (this%inssm > 0) then + call this%ssm%ssm_fc(matrix_sln, this%idxglo, this%rhs) + end if + ! + ! -- Packages + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_fc(this%rhs, this%ia, this%idxglo, matrix_sln) + end do + ! + ! -- Return + return + end subroutine gwe_fc + + !> @brief GWE Model Final Convergence Check + !! + !! If MVR/MVT is active, this subroutine calls the MVR convergence check + !! subroutines. + !< + subroutine gwe_cc(this, innertot, kiter, iend, icnvgmod, cpak, ipak, dpak) + ! -- dummy + class(GweModelType) :: this + integer(I4B), intent(in) :: innertot + integer(I4B), intent(in) :: kiter + integer(I4B), intent(in) :: iend + integer(I4B), intent(in) :: icnvgmod + character(len=LENPAKLOC), intent(inout) :: cpak + integer(I4B), intent(inout) :: ipak + real(DP), intent(inout) :: dpak + ! + ! -- If mover is on, then at least 2 outers required + if (this%inmvt > 0) call this%mvt%mvt_cc(kiter, iend, icnvgmod, cpak, dpak) + ! + ! -- Return + return + end subroutine gwe_cc + + !> @brief GWE Model calculate flow + !! + !! This subroutine calls the attached packages' intercell flows (flow ja) + !< + subroutine gwe_cq(this, icnvg, isuppress_output) + ! -- modules + use SparseModule, only: csr_diagsum + ! -- dummy + class(GweModelType) :: this + integer(I4B), intent(in) :: icnvg + integer(I4B), intent(in) :: isuppress_output + ! -- local + integer(I4B) :: i + integer(I4B) :: ip + class(BndType), pointer :: packobj + ! + ! -- Construct the flowja array. Flowja is calculated each time, even if + ! output is suppressed. (flowja is positive into a cell.) The diagonal + ! position of the flowja array will contain the flow residual after + ! these routines are called, so each package is responsible for adding + ! its flow to this diagonal position. + do i = 1, this%nja + this%flowja(i) = DZERO + end do + if (this%inadv > 0) call this%adv%adv_cq(this%x, this%flowja) + if (this%incnd > 0) call this%cnd%cnd_cq(this%x, this%flowja) + if (this%inest > 0) call this%est%est_cq(this%dis%nodes, this%x, this%xold, & + this%flowja) + if (this%inssm > 0) call this%ssm%ssm_cq(this%flowja) + if (this%infmi > 0) call this%fmi%fmi_cq(this%x, this%flowja) + ! + ! -- Go through packages and call cq routines. cf() routines are called + ! first to regenerate non-linear terms to be consistent with the final + ! conc solution. + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_cf() + call packobj%bnd_cq(this%x, this%flowja) + end do + ! + ! -- Finalize calculation of flowja by adding face flows to the diagonal. + ! This results in the flow residual being stored in the diagonal + ! position for each cell. + call csr_diagsum(this%dis%con%ia, this%flowja) + ! + ! -- Return + return + end subroutine gwe_cq + + !> @brief GWE Model Budget + !! + !! This subroutine: + !! - calculates intercell flows (flowja) + !! - calculates package contributions to the model budget + !< + subroutine gwe_bd(this, icnvg, isuppress_output) + use ConstantsModule, only: DZERO + ! -- dummy + class(GweModelType) :: this + integer(I4B), intent(in) :: icnvg + integer(I4B), intent(in) :: isuppress_output + ! -- local + integer(I4B) :: ip + class(BndType), pointer :: packobj + ! + ! -- Save the solution convergence flag + this%icnvg = icnvg + ! + ! -- Budget routines (start by resetting). Sole purpose of this section + ! is to add in and outs to model budget. All ins and out for a model + ! should be added here to this%budget. In a subsequent exchange call, + ! exchange flows might also be added. + call this%budget%reset() + if (this%inest > 0) call this%est%est_bd(isuppress_output, this%budget) + if (this%inssm > 0) call this%ssm%ssm_bd(isuppress_output, this%budget) + if (this%infmi > 0) call this%fmi%fmi_bd(isuppress_output, this%budget) + if (this%inmvt > 0) call this%mvt%mvt_bd(this%x, this%x) + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_bd(this%budget) + end do + ! + ! -- Return + return + end subroutine gwe_bd + + !> @brief GWE Model Output + !! + !! This subroutine calls the parent class output routine. + !< + subroutine gwe_ot(this) + ! -- dummy + class(GweModelType) :: this + ! -- local + integer(I4B) :: icbcfl + integer(I4B) :: icbcun + ! -- formats + ! + ! -- Initialize + icbcfl = 0 + ! + ! -- Because est belongs to gwe, call est_ot_flow directly (and not from parent) + if (this%oc%oc_save('BUDGET')) icbcfl = 1 + icbcun = this%oc%oc_save_unit('BUDGET') + if (this%inest > 0) call this%est%est_ot_flow(icbcfl, icbcun) + ! + ! -- Call parent class _ot routines. + call this%tsp_ot(this%inest) + ! + ! -- Return + return + end subroutine gwe_ot + + !> @brief Deallocate + !! + !! Deallocate memmory at conclusion of model run + !< + subroutine gwe_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + use MemoryManagerExtModule, only: memorylist_remove + use SimVariablesModule, only: idm_context + ! -- dummy + class(GweModelType) :: this + ! -- local + integer(I4B) :: ip + class(BndType), pointer :: packobj + ! + ! -- Deallocate idm memory + call memorylist_remove(this%name, 'NAM', idm_context) + call memorylist_remove(component=this%name, context=idm_context) + ! + ! -- Internal flow packages deallocate + call this%dis%dis_da() + call this%ic%ic_da() + call this%fmi%fmi_da() + call this%adv%adv_da() + call this%cnd%cnd_da() + call this%ssm%ssm_da() + call this%est%est_da() + call this%mvt%mvt_da() + call this%budget%budget_da() + call this%oc%oc_da() + call this%obs%obs_da() + call this%gwecommon%gweshared_dat_da() + ! + ! -- Internal package objects + deallocate (this%dis) + deallocate (this%ic) + deallocate (this%fmi) + deallocate (this%adv) + deallocate (this%cnd) + deallocate (this%ssm) + deallocate (this%est) + deallocate (this%mvt) + deallocate (this%budget) + deallocate (this%oc) + deallocate (this%obs) + nullify (this%gwecommon) + ! + ! -- Boundary packages + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_da() + deallocate (packobj) + end do + ! + ! -- Scalars + call mem_deallocate(this%inest) + call mem_deallocate(this%incnd) + ! + ! -- Parent class members + call this%TransportModelType%tsp_da() + ! + ! -- NumericalModelType + call this%NumericalModelType%model_da() + ! + ! -- Return + return + end subroutine gwe_da + + !> @brief GroundWater Energy Transport Model Budget Entry + !! + !! This subroutine adds a budget entry to the flow budget. It was added as + !! a method for the gwe model object so that the exchange object could add its + !! contributions. + !< + subroutine gwe_bdentry(this, budterm, budtxt, rowlabel) + ! -- modules + use ConstantsModule, only: LENBUDTXT + use TdisModule, only: delt + ! -- dummy + class(GweModelType) :: this + real(DP), dimension(:, :), intent(in) :: budterm + character(len=LENBUDTXT), dimension(:), intent(in) :: budtxt + character(len=*), intent(in) :: rowlabel + ! + call this%budget%addentry(budterm, delt, budtxt, rowlabel=rowlabel) + ! + ! -- Return + return + end subroutine gwe_bdentry + + !> @brief return 1 if any package causes the matrix to be asymmetric. + !! Otherwise return 0. + !< + function gwe_get_iasym(this) result(iasym) + class(GweModelType) :: this + ! -- local + integer(I4B) :: iasym + integer(I4B) :: ip + class(BndType), pointer :: packobj + ! + ! -- Start by setting iasym to zero + iasym = 0 + ! + ! -- ADV + if (this%inadv > 0) then + if (this%adv%iasym /= 0) iasym = 1 + end if + ! + ! -- CND + if (this%incnd > 0) then + if (this%cnd%ixt3d /= 0) iasym = 1 + end if + ! + ! -- Check for any packages that introduce matrix asymmetry + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + if (packobj%iasym /= 0) iasym = 1 + end do + ! + ! -- Return + return + end function gwe_get_iasym + + !> Allocate memory for non-allocatable members + !! + !! A subroutine for allocating the scalars specific to the GWE model type. + !! Additional scalars used by the parent class are allocated by the parent + !! class. + !< + subroutine allocate_scalars(this, modelname) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweModelType) :: this + character(len=*), intent(in) :: modelname + ! + ! -- Allocate parent class scalars + call this%allocate_tsp_scalars(modelname) + ! + ! -- Allocate members that are part of model class + call mem_allocate(this%inest, 'INEST', this%memoryPath) + call mem_allocate(this%incnd, 'INCND', this%memoryPath) + ! + this%inest = 0 + this%incnd = 0 + ! + ! -- Return + return + end subroutine allocate_scalars + + !> @brief Create boundary condition packages for this model + !! + !! This subroutine calls the package create routines for packages activated + !! by the user. + !< + subroutine package_create(this, filtyp, ipakid, ipaknum, pakname, mempath, & + inunit, iout) + ! -- modules + use ConstantsModule, only: LINELENGTH + use SimModule, only: store_error + use GweCtpModule, only: ctp_create + use GweEslModule, only: esl_create + use GweLkeModule, only: lke_create + use GweSfeModule, only: sfe_create + use GweMweModule, only: mwe_create + use GweUzeModule, only: uze_create + use ApiModule, only: api_create + ! -- dummy + class(GweModelType) :: this + character(len=*), intent(in) :: filtyp + character(len=LINELENGTH) :: errmsg + integer(I4B), intent(in) :: ipakid + integer(I4B), intent(in) :: ipaknum + character(len=*), intent(in) :: pakname + character(len=*), intent(in) :: mempath + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + ! -- local + class(BndType), pointer :: packobj + class(BndType), pointer :: packobj2 + integer(I4B) :: ip + ! + ! -- This part creates the package object + select case (filtyp) + case ('CTP6') + call ctp_create(packobj, ipakid, ipaknum, inunit, iout, this%name, & + pakname, this%depvartype, mempath) + case ('ESL6') + call esl_create(packobj, ipakid, ipaknum, inunit, iout, this%name, & + pakname, this%gwecommon) + case ('LKE6') + call lke_create(packobj, ipakid, ipaknum, inunit, iout, this%name, & + pakname, this%fmi, this%eqnsclfac, this%gwecommon, & + this%depvartype, this%depvarunit, this%depvarunitabbrev) + case ('SFE6') + call sfe_create(packobj, ipakid, ipaknum, inunit, iout, this%name, & + pakname, this%fmi, this%eqnsclfac, this%gwecommon, & + this%depvartype, this%depvarunit, this%depvarunitabbrev) + case ('MWE6') + call mwe_create(packobj, ipakid, ipaknum, inunit, iout, this%name, & + pakname, this%fmi, this%eqnsclfac, this%gwecommon, & + this%depvartype, this%depvarunit, this%depvarunitabbrev) + case ('UZE6') + call uze_create(packobj, ipakid, ipaknum, inunit, iout, this%name, & + pakname, this%fmi, this%eqnsclfac, this%gwecommon, & + this%depvartype, this%depvarunit, this%depvarunitabbrev) + !case('API6') + ! call api_create(packobj, ipakid, ipaknum, inunit, iout, this%name, & + ! pakname) + case default + write (errmsg, *) 'Invalid package type: ', filtyp + call store_error(errmsg, terminate=.TRUE.) + end select + ! + ! -- Packages is the bndlist that is associated with the parent model + ! -- The following statement puts a pointer to this package in the ipakid + ! -- position of packages. + do ip = 1, this%bndlist%Count() + packobj2 => GetBndFromList(this%bndlist, ip) + if (packobj2%packName == pakname) then + write (errmsg, '(a,a)') 'Cannot create package. Package name '// & + 'already exists: ', trim(pakname) + call store_error(errmsg, terminate=.TRUE.) + end if + end do + call AddBndToList(this%bndlist, packobj) + ! + ! -- Return + return + end subroutine package_create + + !> @brief Cast to GweModelType + !< + function CastAsGweModel(model) result(gwemodel) + ! -- dummy + class(*), pointer :: model !< The object to be cast + ! -- return + class(GweModelType), pointer :: gwemodel !< The GWE model + ! + gwemodel => null() + if (.not. associated(model)) return + select type (model) + type is (GweModelType) + gwemodel => model + end select + ! + ! -- Return + return + end function CastAsGweModel + + !> @brief Source package info and begin to process + !< + subroutine create_bndpkgs(this, bndpkgs, pkgtypes, pkgnames, & + mempaths, inunits) + ! -- modules + use ConstantsModule, only: LINELENGTH, LENPACKAGENAME + use CharacterStringModule, only: CharacterStringType + ! -- dummy + class(GweModelType) :: this + integer(I4B), dimension(:), allocatable, intent(inout) :: bndpkgs + type(CharacterStringType), dimension(:), contiguous, & + pointer, intent(inout) :: pkgtypes + type(CharacterStringType), dimension(:), contiguous, & + pointer, intent(inout) :: pkgnames + type(CharacterStringType), dimension(:), contiguous, & + pointer, intent(inout) :: mempaths + integer(I4B), dimension(:), contiguous, & + pointer, intent(inout) :: inunits + ! -- local + integer(I4B) :: ipakid, ipaknum + character(len=LENFTYPE) :: pkgtype, bndptype + character(len=LENPACKAGENAME) :: pkgname + character(len=LENMEMPATH) :: mempath + integer(I4B), pointer :: inunit + integer(I4B) :: n + ! + if (allocated(bndpkgs)) then + ! + ! -- Create stress packages + ipakid = 1 + bndptype = '' + do n = 1, size(bndpkgs) + ! + pkgtype = pkgtypes(bndpkgs(n)) + pkgname = pkgnames(bndpkgs(n)) + mempath = mempaths(bndpkgs(n)) + inunit => inunits(bndpkgs(n)) + ! + if (bndptype /= pkgtype) then + ipaknum = 1 + bndptype = pkgtype + end if + ! + call this%package_create(pkgtype, ipakid, ipaknum, pkgname, mempath, & + inunit, this%iout) + ipakid = ipakid + 1 + ipaknum = ipaknum + 1 + end do + ! + ! -- Cleanup + deallocate (bndpkgs) + end if + ! + ! -- Return + return + end subroutine create_bndpkgs + + !> @brief Source package info and begin to process + !< + subroutine create_gwe_packages(this, indis) + ! -- modules + use ConstantsModule, only: LINELENGTH, LENPACKAGENAME + use CharacterStringModule, only: CharacterStringType + use ArrayHandlersModule, only: expandarray + use MemoryManagerModule, only: mem_setptr + use MemoryHelperModule, only: create_mem_path + use SimVariablesModule, only: idm_context + use GweEstModule, only: est_cr + use GweCndModule, only: cnd_cr + ! -- dummy + class(GweModelType) :: this + integer(I4B), intent(in) :: indis + ! -- local + type(CharacterStringType), dimension(:), contiguous, & + pointer :: pkgtypes => null() + type(CharacterStringType), dimension(:), contiguous, & + pointer :: pkgnames => null() + type(CharacterStringType), dimension(:), contiguous, & + pointer :: mempaths => null() + integer(I4B), dimension(:), contiguous, & + pointer :: inunits => null() + character(len=LENMEMPATH) :: model_mempath + character(len=LENFTYPE) :: pkgtype + character(len=LENPACKAGENAME) :: pkgname + character(len=LENMEMPATH) :: mempath + integer(I4B), pointer :: inunit + integer(I4B), dimension(:), allocatable :: bndpkgs + integer(I4B) :: n + character(len=LENMEMPATH) :: mempathcnd = '' + ! + ! -- Set input memory paths, input/model and input/model/namfile + model_mempath = create_mem_path(component=this%name, context=idm_context) + ! + ! -- Set pointers to model path package info + call mem_setptr(pkgtypes, 'PKGTYPES', model_mempath) + call mem_setptr(pkgnames, 'PKGNAMES', model_mempath) + call mem_setptr(mempaths, 'MEMPATHS', model_mempath) + call mem_setptr(inunits, 'INUNITS', model_mempath) + ! + do n = 1, size(pkgtypes) + ! + ! -- Attributes for this input package + pkgtype = pkgtypes(n) + pkgname = pkgnames(n) + mempath = mempaths(n) + inunit => inunits(n) + ! + ! -- Create dis package as it is a prerequisite for other packages + select case (pkgtype) + case ('EST6') + this%inest = inunit + case ('CND6') + this%incnd = 1 + mempathcnd = mempath + case ('CTP6', 'ESL6', 'LKE6', 'SFE6', & + 'MWE6', 'UZE6', 'API6') + call expandarray(bndpkgs) + bndpkgs(size(bndpkgs)) = n + case default + ! TODO + end select + end do + ! + ! -- Create packages that are tied directly to model + call est_cr(this%est, this%name, this%inest, this%iout, this%fmi, & + this%eqnsclfac, this%gwecommon) + call cnd_cr(this%cnd, this%name, mempathcnd, this%incnd, this%iout, & + this%fmi, this%eqnsclfac, this%gwecommon) + ! + ! -- Check to make sure that required ftype's have been specified + call this%ftype_check(indis, this%inest) + ! + call this%create_bndpkgs(bndpkgs, pkgtypes, pkgnames, mempaths, inunits) + ! + ! -- Return + return + end subroutine create_gwe_packages + +end module GweModule diff --git a/src/Model/GroundWaterEnergy/gwe1cnd1.f90 b/src/Model/GroundWaterEnergy/gwe1cnd1.f90 new file mode 100644 index 00000000000..f3a1646ef55 --- /dev/null +++ b/src/Model/GroundWaterEnergy/gwe1cnd1.f90 @@ -0,0 +1,943 @@ +module GweCndModule + + use KindModule, only: DP, I4B + use ConstantsModule, only: DONE, DZERO, DHALF, DPI + use NumericalPackageModule, only: NumericalPackageType + use BaseDisModule, only: DisBaseType + use TspFmiModule, only: TspFmiType + use Xt3dModule, only: Xt3dType, xt3d_cr + use GweCndOptionsModule, only: GweCndOptionsType + use GweInputDataModule, only: GweInputDataType + use MatrixBaseModule + + implicit none + private + public :: GweCndType + public :: cnd_cr + + type, extends(NumericalPackageType) :: GweCndType + + integer(I4B), dimension(:), pointer, contiguous :: ibound => null() ! pointer to GWE model ibound + type(TspFmiType), pointer :: fmi => null() ! pointer to GWE fmi object + type(GweInputDataType), pointer :: gwecommon => null() !< pointer to shared gwe data used by multiple packages but set in est + real(DP), dimension(:), pointer, contiguous :: porosity => null() ! pointer to GWE storage porosity + real(DP), dimension(:), pointer, contiguous :: alh => null() ! longitudinal horizontal dispersivity + real(DP), dimension(:), pointer, contiguous :: alv => null() ! longitudinal vertical dispersivity + real(DP), dimension(:), pointer, contiguous :: ath1 => null() ! transverse horizontal dispersivity + real(DP), dimension(:), pointer, contiguous :: ath2 => null() ! transverse horizontal dispersivity + real(DP), dimension(:), pointer, contiguous :: atv => null() ! transverse vertical dispersivity + real(DP), dimension(:), pointer, contiguous :: ktw => null() ! thermal conductivity of water + real(DP), dimension(:), pointer, contiguous :: kts => null() ! thermal conductivity of aquifer material + integer(I4B), pointer :: idisp => null() ! flag indicating mechanical dispersion is active + integer(I4B), pointer :: ialh => null() ! longitudinal horizontal dispersivity data flag + integer(I4B), pointer :: ialv => null() ! longitudinal vertical dispersivity data flag + integer(I4B), pointer :: iath1 => null() ! transverse horizontal dispersivity data flag + integer(I4B), pointer :: iath2 => null() ! transverse horizontal dispersivity data flag + integer(I4B), pointer :: iatv => null() ! transverse vertical dispersivity data flag + integer(I4B), pointer :: ixt3doff => null() ! xt3d off flag, xt3d is set inactive if 1 + integer(I4B), pointer :: ixt3drhs => null() ! xt3d rhs flag, xt3d rhs is set active if 1 + integer(I4B), pointer :: iktw => null() ! thermal conductivity of water data flag + integer(I4B), pointer :: ikts => null() ! thermal conductivity of aquifer material data flag + integer(I4B), pointer :: ixt3d => null() ! flag indicating xt3d is active + type(Xt3dType), pointer :: xt3d => null() ! xt3d object + real(DP), dimension(:), pointer, contiguous :: dispcoef => null() ! disp coefficient (only if xt3d not active) + integer(I4B), pointer :: id22 => null() ! flag indicating d22 is available + integer(I4B), pointer :: id33 => null() ! flag indicating d33 is available + real(DP), dimension(:), pointer, contiguous :: d11 => null() ! dispersion coefficient + real(DP), dimension(:), pointer, contiguous :: d22 => null() ! dispersion coefficient + real(DP), dimension(:), pointer, contiguous :: d33 => null() ! dispersion coefficient + real(DP), dimension(:), pointer, contiguous :: angle1 => null() ! rotation angle 1 + real(DP), dimension(:), pointer, contiguous :: angle2 => null() ! rotation angle 2 + real(DP), dimension(:), pointer, contiguous :: angle3 => null() ! rotation angle 3 + integer(I4B), pointer :: iangle1 => null() ! flag indicating angle1 is available + integer(I4B), pointer :: iangle2 => null() ! flag indicating angle2 is available + integer(I4B), pointer :: iangle3 => null() ! flag indicating angle3 is available + real(DP), pointer :: eqnsclfac => null() !< governing equation scale factor; =rhow*cpw for energy + + contains + + procedure :: cnd_df + procedure :: cnd_ac + procedure :: cnd_mc + procedure :: cnd_ar + procedure :: cnd_ad + procedure :: cnd_fc + procedure :: cnd_cq + procedure :: cnd_da + procedure :: allocate_scalars + procedure :: allocate_arrays + procedure, private :: source_options + procedure, private :: source_griddata + procedure, private :: log_options + procedure, private :: log_griddata + procedure, private :: calcdispellipse + procedure, private :: calcdispcoef + + end type GweCndType + +contains + + !> @brief Create a new CND object + !! + !! Create a new CND package + !< + subroutine cnd_cr(cndobj, name_model, input_mempath, inunit, iout, fmi, & + eqnsclfac, gwecommon) + ! -- modules + use KindModule, only: LGP + use MemoryManagerExtModule, only: mem_set_value + ! -- dummy + type(GweCndType), pointer :: cndobj + character(len=*), intent(in) :: name_model + character(len=*), intent(in) :: input_mempath + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + type(TspFmiType), intent(in), target :: fmi + real(DP), intent(in), pointer :: eqnsclfac !< governing equation scale factor + type(GweInputDataType), intent(in), target, optional :: gwecommon !< shared data container for use by multiple GWE packages + ! -- formats + character(len=*), parameter :: fmtcnd = & + "(1x,/1x,'CND-- THERMAL CONDUCTION AND DISPERSION PACKAGE, VERSION 1, ', & + &'01/01/2024, INPUT READ FROM MEMPATH ', A, //)" + ! + ! -- Create the object + allocate (cndobj) + ! + ! -- create name and memory path + call cndobj%set_names(1, name_model, 'CND', 'CND', input_mempath) + ! + ! -- Allocate scalars + call cndobj%allocate_scalars() + ! + ! -- Set variables + cndobj%inunit = inunit + cndobj%iout = iout + cndobj%fmi => fmi + cndobj%eqnsclfac => eqnsclfac + if (present(gwecommon)) then + cndobj%gwecommon => gwecommon + end if + ! + if (cndobj%inunit > 0) then + ! + ! -- Print a message identifying the dispersion package. + if (cndobj%iout > 0) then + write (cndobj%iout, fmtcnd) input_mempath + end if + end if + ! + ! -- Return + return + end subroutine cnd_cr + + !> @brief Define CND object + !< + subroutine cnd_df(this, dis, cndOptions) + ! -- modules + ! -- dummy + class(GweCndType) :: this + class(DisBaseType), pointer :: dis + type(GweCndOptionsType), optional, intent(in) :: cndOptions !< the optional CND options, used when not + !! creating CND from file + ! + ! -- Store pointer to dis + this%dis => dis + ! + ! + ! -- set default xt3d representation to on and lhs + this%ixt3d = 1 + ! + ! -- Read dispersion options + if (present(cndOptions)) then + this%ixt3d = cndOptions%ixt3d + ! + ! -- Allocate only, grid data will not be read from file + call this%allocate_arrays(this%dis%nodes) + else + ! + ! -- Source options + call this%source_options() + call this%allocate_arrays(this%dis%nodes) + ! + ! -- Source dispersion data + call this%source_griddata() + end if + ! + ! -- xt3d create + if (this%ixt3d > 0) then + call xt3d_cr(this%xt3d, this%name_model, this%inunit, this%iout, & + ldispopt=.true.) + this%xt3d%ixt3d = this%ixt3d + call this%xt3d%xt3d_df(dis) + end if + ! + ! -- Return + return + end subroutine cnd_df + + !> @brief Add connections to CND + !! + !! Add connections for extended neighbors to the sparse matrix + !< + subroutine cnd_ac(this, moffset, sparse) + ! -- modules + use SparseModule, only: sparsematrix + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweCndType) :: this + integer(I4B), intent(in) :: moffset + type(sparsematrix), intent(inout) :: sparse + ! + ! -- Add extended neighbors (neighbors of neighbors) + if (this%ixt3d > 0) call this%xt3d%xt3d_ac(moffset, sparse) + ! + ! -- Return + return + end subroutine cnd_ac + + !> @brief Map CND connections + !! + !! Map connections and construct iax, jax, and idxglox + !< + subroutine cnd_mc(this, moffset, matrix_sln) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweCndType) :: this + integer(I4B), intent(in) :: moffset + class(MatrixBaseType), pointer :: matrix_sln + ! + ! -- Call xt3d map connections + if (this%ixt3d > 0) call this%xt3d%xt3d_mc(moffset, matrix_sln) + ! + ! -- Return + return + end subroutine cnd_mc + + !> @brief Allocate and read method for package + !! + !! Method to allocate and read static data for the package. + !< + subroutine cnd_ar(this, ibound, porosity) + ! -- modules + ! -- dummy + class(GweCndType) :: this + integer(I4B), dimension(:), pointer, contiguous :: ibound + real(DP), dimension(:), pointer, contiguous :: porosity + ! -- local + ! -- formats + character(len=*), parameter :: fmtcnd = & + "(1x,/1x,'CND-- THERMAL CONDUCTION AND DISPERSION PACKAGE, VERSION 1, ', & + &'5/01/2023, INPUT READ FROM UNIT ', i0, //)" + ! + ! -- cnd pointers to arguments that were passed in + this%ibound => ibound + this%porosity => porosity + ! + ! -- Return + return + end subroutine cnd_ar + + !> @brief Advance method for the package + !< + subroutine cnd_ad(this) + ! -- modules + use TdisModule, only: kstp, kper + ! -- dummy + class(GweCndType) :: this + ! + ! -- xt3d + ! TODO: might consider adding a new mf6 level set pointers method, and + ! doing this stuff there instead of in the time step loop. + if (kstp * kper == 1) then + if (this%ixt3d > 0) then + call this%xt3d%xt3d_ar(this%fmi%ibdgwfsat0, this%d11, this%id33, & + this%d33, this%fmi%gwfsat, this%id22, this%d22, & + this%iangle1, this%iangle2, this%iangle3, & + this%angle1, this%angle2, this%angle3) + end if + end if + ! + ! -- Fill d11, d22, d33, angle1, angle2, angle3 using specific discharge + call this%calcdispellipse() + ! + ! -- Recalculate dispersion coefficients if the flows were updated + if (this%fmi%iflowsupdated == 1) then + if (this%ixt3d == 0) then + call this%calcdispcoef() + else if (this%ixt3d > 0) then + call this%xt3d%xt3d_fcpc(this%dis%nodes, .true.) + end if + end if + ! + ! -- Return + return + end subroutine cnd_ad + + !> @brief Fill coefficient method for package + !! + !! Method to calculate and fill coefficients for the package. + !< + subroutine cnd_fc(this, kiter, nodes, nja, matrix_sln, idxglo, rhs, cnew) + ! -- dummy + class(GweCndType) :: this + integer(I4B) :: kiter + integer(I4B), intent(in) :: nodes + integer(I4B), intent(in) :: nja + class(MatrixBaseType), pointer :: matrix_sln + integer(I4B), intent(in), dimension(nja) :: idxglo + real(DP), intent(inout), dimension(nodes) :: rhs + real(DP), intent(inout), dimension(nodes) :: cnew + ! -- local + integer(I4B) :: n, m, idiag, idiagm, ipos, isympos, isymcon + real(DP) :: dnm + ! + if (this%ixt3d > 0) then + call this%xt3d%xt3d_fc(kiter, matrix_sln, idxglo, rhs, cnew) + else + do n = 1, nodes + if (this%fmi%ibdgwfsat0(n) == 0) cycle + idiag = this%dis%con%ia(n) + do ipos = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1 + if (this%dis%con%mask(ipos) == 0) cycle + m = this%dis%con%ja(ipos) + if (m < n) cycle + if (this%fmi%ibdgwfsat0(m) == 0) cycle + isympos = this%dis%con%jas(ipos) + dnm = this%dispcoef(isympos) + ! + ! -- Contribution to row n + call matrix_sln%add_value_pos(idxglo(ipos), dnm) + call matrix_sln%add_value_pos(idxglo(idiag), -dnm) + ! + ! -- Contribution to row m + idiagm = this%dis%con%ia(m) + isymcon = this%dis%con%isym(ipos) + call matrix_sln%add_value_pos(idxglo(isymcon), dnm) + call matrix_sln%add_value_pos(idxglo(idiagm), -dnm) + end do + end do + end if + ! + ! -- Return + return + end subroutine cnd_fc + + !> @ brief Calculate flows for package + !! + !! Method to calculate dispersion contribution to flowja + !< + subroutine cnd_cq(this, cnew, flowja) + ! -- modules + ! -- dummy + class(GweCndType) :: this + real(DP), intent(inout), dimension(:) :: cnew + real(DP), intent(inout), dimension(:) :: flowja + ! -- local + integer(I4B) :: n, m, ipos, isympos + real(DP) :: dnm, qnm + ! + ! -- Calculate dispersion and add to flowja + if (this%ixt3d > 0) then + call this%xt3d%xt3d_flowja(cnew, flowja) + else + do n = 1, this%dis%nodes + if (this%fmi%ibdgwfsat0(n) == 0) cycle + do ipos = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1 + m = this%dis%con%ja(ipos) + if (this%fmi%ibdgwfsat0(m) == 0) cycle + isympos = this%dis%con%jas(ipos) + dnm = this%dispcoef(isympos) +!! qnm = dnm * (cnew(m) - cnew(n)) * this%eqnsclfac + qnm = dnm * (cnew(m) - cnew(n)) + flowja(ipos) = flowja(ipos) + qnm + end do + end do + end if + ! + ! -- Return + return + end subroutine cnd_cq + + !> @ brief Allocate scalar variables for package + !! + !! Method to allocate scalar variables for the package. + !< + subroutine allocate_scalars(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + use ConstantsModule, only: DZERO + ! -- dummy + class(GweCndType) :: this + ! + ! -- allocate scalars in NumericalPackageType + call this%NumericalPackageType%allocate_scalars() + ! + ! -- Allocate + call mem_allocate(this%idisp, 'IDISP', this%memoryPath) + call mem_allocate(this%ialh, 'IALH', this%memoryPath) + call mem_allocate(this%ialv, 'IALV', this%memoryPath) + call mem_allocate(this%iath1, 'IATH1', this%memoryPath) + call mem_allocate(this%iath2, 'IATH2', this%memoryPath) + call mem_allocate(this%iatv, 'IATV', this%memoryPath) + call mem_allocate(this%ixt3doff, 'IXT3DOFF', this%memoryPath) + call mem_allocate(this%ixt3drhs, 'IXT3DRHS', this%memoryPath) + call mem_allocate(this%ixt3d, 'IXT3D', this%memoryPath) + call mem_allocate(this%id22, 'ID22', this%memoryPath) + call mem_allocate(this%id33, 'ID33', this%memoryPath) + call mem_allocate(this%iangle1, 'IANGLE1', this%memoryPath) + call mem_allocate(this%iangle2, 'IANGLE2', this%memoryPath) + call mem_allocate(this%iangle3, 'IANGLE3', this%memoryPath) + call mem_allocate(this%iktw, 'IKTW', this%memoryPath) + call mem_allocate(this%ikts, 'IKTS', this%memoryPath) + ! + ! -- Initialize + this%idisp = 0 + this%ialh = 0 + this%ialv = 0 + this%iath1 = 0 + this%iath2 = 0 + this%iatv = 0 + this%ixt3doff = 0 + this%ixt3drhs = 0 + this%ixt3d = 0 + this%id22 = 1 + this%id33 = 1 + this%iangle1 = 1 + this%iangle2 = 1 + this%iangle3 = 1 + this%iktw = 1 + this%ikts = 1 + ! + ! -- Return + return + end subroutine allocate_scalars + + !> @ brief Allocate arrays for package + !! + !! Method to allocate arrays for the package. + !< + subroutine allocate_arrays(this, nodes) + ! -- modules + use MemoryManagerModule, only: mem_allocate + use ConstantsModule, only: DZERO + ! -- dummy + class(GweCndType) :: this + integer(I4B), intent(in) :: nodes + ! + ! -- Allocate + call mem_allocate(this%alh, nodes, 'ALH', trim(this%memoryPath)) + call mem_allocate(this%alv, nodes, 'ALV', trim(this%memoryPath)) + call mem_allocate(this%ath1, nodes, 'ATH1', trim(this%memoryPath)) + call mem_allocate(this%ath2, nodes, 'ATH2', trim(this%memoryPath)) + call mem_allocate(this%atv, nodes, 'ATV', trim(this%memoryPath)) + call mem_allocate(this%d11, nodes, 'D11', trim(this%memoryPath)) + call mem_allocate(this%d22, nodes, 'D22', trim(this%memoryPath)) + call mem_allocate(this%d33, nodes, 'D33', trim(this%memoryPath)) + call mem_allocate(this%angle1, nodes, 'ANGLE1', trim(this%memoryPath)) + call mem_allocate(this%angle2, nodes, 'ANGLE2', trim(this%memoryPath)) + call mem_allocate(this%angle3, nodes, 'ANGLE3', trim(this%memoryPath)) + call mem_allocate(this%ktw, nodes, 'KTW', trim(this%memoryPath)) + call mem_allocate(this%kts, nodes, 'KTS', trim(this%memoryPath)) + ! + ! -- Allocate dispersion coefficient array if xt3d not in use + if (this%ixt3d == 0) then + call mem_allocate(this%dispcoef, this%dis%njas, 'DISPCOEF', & + trim(this%memoryPath)) + else + call mem_allocate(this%dispcoef, 0, 'DISPCOEF', trim(this%memoryPath)) + end if + ! + ! -- Return + return + end subroutine allocate_arrays + + !> @ brief Deallocate memory + !! + !! Method to deallocate memory for the package. + !< + subroutine cnd_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + use MemoryManagerExtModule, only: memorylist_remove + use SimVariablesModule, only: idm_context + ! -- dummy + class(GweCndType) :: this + ! -- local + ! + ! -- Deallocate input memory + call memorylist_remove(this%name_model, 'CND', idm_context) + ! + ! -- deallocate arrays + if (this%inunit /= 0) then + call mem_deallocate(this%alh) + call mem_deallocate(this%alv, 'ALV', trim(this%memoryPath)) + call mem_deallocate(this%ath1) + call mem_deallocate(this%ath2, 'ATH2', trim(this%memoryPath)) + call mem_deallocate(this%atv, 'ATV', trim(this%memoryPath)) + call mem_deallocate(this%d11) + call mem_deallocate(this%d22) + call mem_deallocate(this%d33) + call mem_deallocate(this%angle1) + call mem_deallocate(this%angle2) + call mem_deallocate(this%angle3) + call mem_deallocate(this%ktw) + call mem_deallocate(this%kts) + call mem_deallocate(this%dispcoef) + if (this%ixt3d > 0) call this%xt3d%xt3d_da() + end if + ! + ! -- deallocate objects + if (this%ixt3d > 0) deallocate (this%xt3d) + nullify (this%gwecommon) + ! + ! -- deallocate scalars + call mem_deallocate(this%idisp) + call mem_deallocate(this%ialh) + call mem_deallocate(this%ialv) + call mem_deallocate(this%iath1) + call mem_deallocate(this%iath2) + call mem_deallocate(this%iatv) + call mem_deallocate(this%ixt3doff) + call mem_deallocate(this%ixt3drhs) + call mem_deallocate(this%ixt3d) + call mem_deallocate(this%id22) + call mem_deallocate(this%id33) + call mem_deallocate(this%iangle1) + call mem_deallocate(this%iangle2) + call mem_deallocate(this%iangle3) + call mem_deallocate(this%iktw) + call mem_deallocate(this%ikts) + ! + ! -- deallocate variables in NumericalPackageType + call this%NumericalPackageType%da() + ! + ! -- Return + return + end subroutine cnd_da + + !> @brief Write user options to list file + !< + subroutine log_options(this, found) + use GweCndInputModule, only: GweCndParamFoundType + class(GweCndType) :: this + type(GweCndParamFoundType), intent(in) :: found + ! + write (this%iout, '(1x,a)') 'Setting CND Options' + write (this%iout, '(4x,a,i0)') 'XT3D formulation [0=INACTIVE, 1=ACTIVE, & + &3=ACTIVE RHS] set to: ', this%ixt3d + write (this%iout, '(1x,a,/)') 'End Setting CND Options' + ! -- Return + return + end subroutine log_options + + !> @brief Update simulation mempath options + !< + subroutine source_options(this) + ! -- modules + use MemoryManagerExtModule, only: mem_set_value + use GweCndInputModule, only: GweCndParamFoundType + ! -- dummy + class(GweCndType) :: this + ! -- locals + type(GweCndParamFoundType) :: found + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%ixt3doff, 'XT3D_OFF', this%input_mempath, & + found%xt3d_off) + call mem_set_value(this%ixt3drhs, 'XT3D_RHS', this%input_mempath, & + found%xt3d_rhs) + ! + ! -- set xt3d state flag + if (found%xt3d_off) this%ixt3d = 0 + if (found%xt3d_rhs) this%ixt3d = 2 + ! + ! -- log options + if (this%iout > 0) then + call this%log_options(found) + end if + ! + ! -- Return + return + end subroutine source_options + + !> @brief Write dimensions to list file + !< + subroutine log_griddata(this, found) + use GweCndInputModule, only: GweCndParamFoundType + class(GweCndType) :: this + type(GweCndParamFoundType), intent(in) :: found + ! + write (this%iout, '(1x,a)') 'Setting CND Griddata' + ! + if (found%alh) then + write (this%iout, '(4x,a)') 'ALH set from input file' + end if + ! + if (found%alv) then + write (this%iout, '(4x,a)') 'ALV set from input file' + end if + ! + if (found%ath1) then + write (this%iout, '(4x,a)') 'ATH1 set from input file' + end if + ! + if (found%ath2) then + write (this%iout, '(4x,a)') 'ATH2 set from input file' + end if + ! + if (found%atv) then + write (this%iout, '(4x,a)') 'ATV set from input file' + end if + ! + if (found%ktw) then + write (this%iout, '(4x,a)') 'KTW set from input file' + end if + ! + if (found%kts) then + write (this%iout, '(4x,a)') 'KTS set from input file' + end if + ! + write (this%iout, '(1x,a,/)') 'End Setting CND Griddata' + ! + ! -- Return + return + end subroutine log_griddata + + !> @brief Update CND simulation data from input mempath + !< + subroutine source_griddata(this) + ! -- modules + use SimModule, only: count_errors, store_error + use MemoryManagerModule, only: mem_reallocate, mem_reassignptr + use MemoryManagerExtModule, only: mem_set_value + use ConstantsModule, only: LENMEMPATH, LINELENGTH + use GweCndInputModule, only: GweCndParamFoundType + ! -- dummy + class(GweCndType) :: this + ! -- locals + character(len=LINELENGTH) :: errmsg + type(GweCndParamFoundType) :: found + integer(I4B), dimension(:), pointer, contiguous :: map + ! -- formats + ! + ! -- set map + map => null() + if (this%dis%nodes < this%dis%nodesuser) map => this%dis%nodeuser + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%alh, 'ALH', this%input_mempath, map, found%alh) + call mem_set_value(this%alv, 'ALV', this%input_mempath, map, found%alv) + call mem_set_value(this%ath1, 'ATH1', this%input_mempath, map, found%ath1) + call mem_set_value(this%ath2, 'ATH2', this%input_mempath, map, found%ath2) + call mem_set_value(this%atv, 'ATV', this%input_mempath, map, found%atv) + call mem_set_value(this%ktw, 'KTW', this%input_mempath, map, found%ktw) + call mem_set_value(this%kts, 'KTS', this%input_mempath, map, found%kts) + ! + ! -- set active flags + if (found%alh) this%ialh = 1 + if (found%alv) this%ialv = 1 + if (found%ath1) this%iath1 = 1 + if (found%ath2) this%iath2 = 1 + if (found%atv) this%iatv = 1 + if (found%ktw) this%iktw = 1 + if (found%kts) this%ikts = 1 + ! + ! -- set this%idisp flag + if (found%alh) this%idisp = this%idisp + 1 + if (found%alv) this%idisp = this%idisp + 1 + if (found%ath1) this%idisp = this%idisp + 1 + if (found%ath2) this%idisp = this%idisp + 1 + ! + ! -- manage dispersion arrays + if (this%idisp > 0) then + if (.not. (found%alh .and. found%ath1)) then + write (errmsg, '(1x,a)') & + 'if dispersivities are specified then ALH and ATH1 are required.' + call store_error(errmsg) + end if + ! -- If alv not specified then point it to alh + if (.not. found%alv) & + call mem_reassignptr(this%alv, 'ALV', trim(this%memoryPath), & + 'ALH', trim(this%memoryPath)) + ! -- If ath2 not specified then point it to ath1 + if (.not. found%ath2) & + call mem_reassignptr(this%ath2, 'ATH2', trim(this%memoryPath), & + 'ATH1', trim(this%memoryPath)) + ! -- If atv not specified then point it to ath2 + if (.not. found%atv) & + call mem_reassignptr(this%atv, 'ATV', trim(this%memoryPath), & + 'ATH2', trim(this%memoryPath)) + else + call mem_reallocate(this%alh, 0, 'ALH', trim(this%memoryPath)) + call mem_reallocate(this%alv, 0, 'ALV', trim(this%memoryPath)) + call mem_reallocate(this%ath1, 0, 'ATH1', trim(this%memoryPath)) + call mem_reallocate(this%ath2, 0, 'ATH2', trim(this%memoryPath)) + call mem_reallocate(this%atv, 0, 'ATV', trim(this%memoryPath)) + end if + ! + ! -- log griddata + if (this%iout > 0) then + call this%log_griddata(found) + end if + ! + ! -- Return + return + end subroutine source_griddata + + !> @brief Calculate dispersion coefficients + !< + subroutine calcdispellipse(this) + ! -- modules + ! -- dummy + class(GweCndType) :: this + ! -- local + integer(I4B) :: nodes, n + real(DP) :: q, qx, qy, qz + real(DP) :: alh, alv, ath1, ath2, atv, a + real(DP) :: al, at1, at2 + real(DP) :: qzoqsquared + real(DP) :: ktbulk ! TODO: Implement additional options for characterizing ktbulk (see Markle refs) + real(DP) :: dstar + real(DP) :: qsw + ! + ! -- loop through and calculate dispersion coefficients and angles + nodes = size(this%d11) + do n = 1, nodes + ! + ! -- initialize + this%d11(n) = DZERO + this%d22(n) = DZERO + this%d33(n) = DZERO + this%angle1(n) = DZERO + this%angle2(n) = DZERO + this%angle3(n) = DZERO + if (this%fmi%ibdgwfsat0(n) == 0) cycle + ! + ! -- specific discharge + qx = DZERO + qy = DZERO + qz = DZERO + q = DZERO + qx = this%fmi%gwfspdis(1, n) + qy = this%fmi%gwfspdis(2, n) + qz = this%fmi%gwfspdis(3, n) + q = qx**2 + qy**2 + qz**2 + if (q > DZERO) q = sqrt(q) + ! + ! -- dispersion coefficients + alh = DZERO + alv = DZERO + ath1 = DZERO + ath2 = DZERO + atv = DZERO + if (this%idisp > 0) then + alh = this%alh(n) + alv = this%alv(n) + ath1 = this%ath1(n) + ath2 = this%ath2(n) + atv = this%atv(n) + end if + ! + ! -- calculate + ktbulk = DZERO + if (this%iktw > 0) ktbulk = ktbulk + this%porosity(n) * this%ktw(n) * & + this%fmi%gwfsat(n) + if (this%ikts > 0) ktbulk = ktbulk + (DONE - this%porosity(n)) * this%kts(n) + ! + ! -- The division by rhow*cpw below is undertaken to render dstar in the + ! form of a thermal diffusivity, and not because the governing + ! equation is scaled by rhow*cpw. Because of this conceptual + ! distinction, ktbulk is divided by the explicitly calculated product + ! rhow*cpw, and not by the equivalent scale factor eqnsclfac, even + ! though it should make no practical difference in the result. + dstar = ktbulk / (this%gwecommon%gwecpw * this%gwecommon%gwerhow) + ! + ! -- Calculate the longitudal and transverse dispersivities + al = DZERO + at1 = DZERO + at2 = DZERO + if (q > DZERO) then + qzoqsquared = (qz / q)**2 + al = alh * (DONE - qzoqsquared) + alv * qzoqsquared + at1 = ath1 * (DONE - qzoqsquared) + atv * qzoqsquared + at2 = ath2 * (DONE - qzoqsquared) + atv * qzoqsquared + end if + ! + ! -- Calculate and save the diagonal components of the dispersion tensor + qsw = q * this%fmi%gwfsat(n) * this%eqnsclfac + this%d11(n) = al * qsw + ktbulk + this%d22(n) = at1 * qsw + ktbulk + this%d33(n) = at2 * qsw + ktbulk + ! + ! -- Angles of rotation if velocity based dispersion tensor + if (this%idisp > 0) then + ! + ! -- angle3 is zero + this%angle3(n) = DZERO + ! + ! -- angle2 + a = DZERO + if (q > DZERO) a = qz / q + this%angle2(n) = asin(a) + ! + ! -- angle1 + a = q * cos(this%angle2(n)) + if (a /= DZERO) then + a = qx / a + else + a = DZERO + end if + ! + ! -- acos(1) not defined, so set to zero if necessary + if (a <= -DONE) then + this%angle1(n) = DPI + elseif (a >= DONE) then + this%angle1(n) = DZERO + else + this%angle1(n) = acos(a) + end if + ! + end if + end do + ! + ! -- Return + return + end subroutine calcdispellipse + + !> @brief Calculate dispersion coefficients + !< + subroutine calcdispcoef(this) + ! -- modules + use GwfNpfModule, only: hyeff_calc + ! -- dummy + class(GweCndType) :: this + ! -- local + integer(I4B) :: nodes, n, m, idiag, ipos + real(DP) :: clnm, clmn, dn, dm + real(DP) :: vg1, vg2, vg3 + integer(I4B) :: ihc, isympos + integer(I4B) :: iavgmeth + real(DP) :: satn, satm, topn, topm, botn, botm + real(DP) :: hwva, cond, cn, cm, denom + real(DP) :: anm, amn, thksatn, thksatm, sill_top, sill_bot, tpn, tpm + ! + ! -- set iavgmeth = 1 to use arithmetic averaging for effective dispersion + iavgmeth = 1 + ! + ! -- Process connections + nodes = size(this%d11) + do n = 1, nodes + if (this%fmi%ibdgwfsat0(n) == 0) cycle + idiag = this%dis%con%ia(n) + do ipos = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1 + ! + ! -- Set m to connected cell + m = this%dis%con%ja(ipos) + ! + ! -- skip for lower triangle + if (m < n) cycle + isympos = this%dis%con%jas(ipos) + this%dispcoef(isympos) = DZERO + if (this%fmi%ibdgwfsat0(m) == 0) cycle + ! + ! -- cell dimensions + hwva = this%dis%con%hwva(isympos) + clnm = this%dis%con%cl1(isympos) + clmn = this%dis%con%cl2(isympos) + ihc = this%dis%con%ihc(isympos) + topn = this%dis%top(n) + topm = this%dis%top(m) + botn = this%dis%bot(n) + botm = this%dis%bot(m) + ! + ! -- flow model information + satn = this%fmi%ibdgwfsat0(n) + satm = this%fmi%ibdgwfsat0(m) + ! + ! -- Calculate dispersion coefficient for cell n in the direction + ! normal to the shared n-m face and for cell m in the direction + ! normal to the shared n-m face. + call this%dis%connection_normal(n, m, ihc, vg1, vg2, vg3, ipos) + dn = hyeff_calc(this%d11(n), this%d22(n), this%d33(n), & + this%angle1(n), this%angle2(n), this%angle3(n), & + vg1, vg2, vg3, iavgmeth) + dm = hyeff_calc(this%d11(m), this%d22(m), this%d33(m), & + this%angle1(m), this%angle2(m), this%angle3(m), & + vg1, vg2, vg3, iavgmeth) + ! + ! -- Calculate dispersion conductance based on NPF subroutines and the + ! effective dispersion coefficients dn and dm. + if (ihc == 0) then + clnm = satn * (topn - botn) * DHALF + clmn = satm * (topm - botm) * DHALF + anm = hwva + ! + ! -- n is convertible and unsaturated + if (satn == DZERO) then + anm = DZERO + else if (n > m .and. satn < DONE) then + anm = DZERO + end if + ! + ! -- m is convertible and unsaturated + if (satm == DZERO) then + anm = DZERO + else if (m > n .and. satm < DONE) then + anm = DZERO + end if + ! + ! -- amn is the same as anm for vertical flow + amn = anm + ! + else + ! + ! -- horizontal conductance + thksatn = (topn - botn) * satn + thksatm = (topm - botm) * satm + ! + ! -- handle vertically staggered case + if (ihc == 2) then + sill_top = min(topn, topm) + sill_bot = max(botn, botm) + tpn = botn + thksatn + tpm = botm + thksatm + thksatn = max(min(tpn, sill_top) - sill_bot, DZERO) + thksatm = max(min(tpm, sill_top) - sill_bot, DZERO) + end if + ! + ! -- calculate the saturated area term + anm = thksatn * hwva + amn = thksatm * hwva + ! + ! -- n or m is unsaturated, so no dispersion + if (satn == DZERO .or. satm == DZERO) then + anm = DZERO + amn = DZERO + end if + ! + end if + ! + ! -- calculate conductance using the two half cell conductances + cn = DZERO + if (clnm > DZERO) cn = dn * anm / clnm + cm = DZERO + if (clmn > DZERO) cm = dm * amn / clmn + denom = cn + cm + if (denom > DZERO) then + cond = cn * cm / denom + else + cond = DZERO + end if + ! + ! -- Assign the calculated dispersion conductance + this%dispcoef(isympos) = cond + ! + end do + end do + ! + ! -- Return + return + end subroutine calcdispcoef + +end module GweCndModule diff --git a/src/Model/GroundWaterEnergy/gwe1cnd1idm.f90 b/src/Model/GroundWaterEnergy/gwe1cnd1idm.f90 new file mode 100644 index 00000000000..9757a46bcc1 --- /dev/null +++ b/src/Model/GroundWaterEnergy/gwe1cnd1idm.f90 @@ -0,0 +1,231 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module GweCndInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public gwe_cnd_param_definitions + public gwe_cnd_aggregate_definitions + public gwe_cnd_block_definitions + public GweCndParamFoundType + public gwe_cnd_multi_package + + type GweCndParamFoundType + logical :: xt3d_off = .false. + logical :: xt3d_rhs = .false. + logical :: alh = .false. + logical :: alv = .false. + logical :: ath1 = .false. + logical :: ath2 = .false. + logical :: atv = .false. + logical :: ktw = .false. + logical :: kts = .false. + end type GweCndParamFoundType + + logical :: gwe_cnd_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + gwecnd_xt3d_off = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CND', & ! subcomponent + 'OPTIONS', & ! block + 'XT3D_OFF', & ! tag name + 'XT3D_OFF', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwecnd_xt3d_rhs = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CND', & ! subcomponent + 'OPTIONS', & ! block + 'XT3D_RHS', & ! tag name + 'XT3D_RHS', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwecnd_alh = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CND', & ! subcomponent + 'GRIDDATA', & ! block + 'ALH', & ! tag name + 'ALH', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwecnd_alv = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CND', & ! subcomponent + 'GRIDDATA', & ! block + 'ALV', & ! tag name + 'ALV', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwecnd_ath1 = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CND', & ! subcomponent + 'GRIDDATA', & ! block + 'ATH1', & ! tag name + 'ATH1', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwecnd_ath2 = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CND', & ! subcomponent + 'GRIDDATA', & ! block + 'ATH2', & ! tag name + 'ATH2', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwecnd_atv = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CND', & ! subcomponent + 'GRIDDATA', & ! block + 'ATV', & ! tag name + 'ATV', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwecnd_ktw = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CND', & ! subcomponent + 'GRIDDATA', & ! block + 'KTW', & ! tag name + 'KTW', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwecnd_kts = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CND', & ! subcomponent + 'GRIDDATA', & ! block + 'KTS', & ! tag name + 'KTS', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwe_cnd_param_definitions(*) = & + [ & + gwecnd_xt3d_off, & + gwecnd_xt3d_rhs, & + gwecnd_alh, & + gwecnd_alv, & + gwecnd_ath1, & + gwecnd_ath2, & + gwecnd_atv, & + gwecnd_ktw, & + gwecnd_kts & + ] + + type(InputParamDefinitionType), parameter :: & + gwe_cnd_aggregate_definitions(*) = & + [ & + InputParamDefinitionType & + ( & + '', & ! component + '', & ! subcomponent + '', & ! block + '', & ! tag name + '', & ! fortran variable + '', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) & + ] + + type(InputBlockDefinitionType), parameter :: & + gwe_cnd_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'GRIDDATA', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module GweCndInputModule diff --git a/src/Model/GroundWaterEnergy/gwe1ctp1.f90 b/src/Model/GroundWaterEnergy/gwe1ctp1.f90 new file mode 100644 index 00000000000..e8963a50bd2 --- /dev/null +++ b/src/Model/GroundWaterEnergy/gwe1ctp1.f90 @@ -0,0 +1,533 @@ +module GweCtpModule + ! + use KindModule, only: DP, I4B + use ConstantsModule, only: DZERO, DONE, NAMEDBOUNDFLAG, LENFTYPE, & + LENPACKAGENAME, LENVARNAME + use SimVariablesModule, only: errmsg + use SimModule, only: count_errors, store_error, store_error_filename + use ObsModule, only: DefaultObsIdProcessor + use BndModule, only: BndType + use BndExtModule, only: BndExtType + use ObserveModule, only: ObserveType + use TimeSeriesLinkModule, only: TimeSeriesLinkType, & + GetTimeSeriesLinkFromList + use InputOutputModule, only: str_pad_left + use MatrixBaseModule + ! + implicit none + ! + private + public :: ctp_create + ! + character(len=LENFTYPE) :: ftype = 'CTP' + character(len=LENPACKAGENAME) :: text = ' CTP' + ! + type, extends(BndExtType) :: GweCtpType + + real(DP), dimension(:), pointer, contiguous :: tspvar => null() !< constant temperature array + real(DP), dimension(:), pointer, contiguous :: ratectpin => null() !< simulated flows into constant temperature (excluding other CNTs) + real(DP), dimension(:), pointer, contiguous :: ratectpout => null() !< simulated flows out of constant temperature (excluding to other CNTs) + character(len=LENVARNAME) :: depvartype = '' !< stores string of dependent variable type, depending on model type + contains + procedure :: bnd_rp => ctp_rp + procedure :: bnd_ad => ctp_ad + procedure :: bnd_ck => ctp_ck + procedure :: bnd_fc => ctp_fc + procedure :: bnd_cq => ctp_cq + procedure :: bnd_bd => ctp_bd + procedure :: bnd_da => ctp_da + procedure :: allocate_arrays => ctp_allocate_arrays + procedure :: define_listlabel + procedure :: bound_value => ctp_bound_value + procedure :: temp_mult + ! -- methods for observations + procedure, public :: bnd_obs_supported => ctp_obs_supported + procedure, public :: bnd_df_obs => ctp_df_obs + ! -- method for time series + procedure, public :: bnd_rp_ts => ctp_rp_ts + end type GweCtpType + +contains + + !> @brief Create a new constant temperature package + !! + !! Routine points packobj to the newly created package + !< + subroutine ctp_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, & + depvartype, mempath) + ! -- dummy + class(BndType), pointer :: packobj + integer(I4B), intent(in) :: id + integer(I4B), intent(in) :: ibcnum + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + character(len=*), intent(in) :: namemodel + character(len=*), intent(in) :: pakname + character(len=LENVARNAME), intent(in) :: depvartype + character(len=*), intent(in) :: mempath + ! -- local + type(GweCtpType), pointer :: ctpobj + ! + ! -- allocate the object and assign values to object variables + allocate (ctpobj) + packobj => ctpobj + ! + ! -- create name and memory path + call packobj%set_names(ibcnum, namemodel, pakname, ftype, mempath) + packobj%text = text + ! + ! -- allocate scalars + call ctpobj%allocate_scalars() + ! + ! -- initialize package + call packobj%pack_initialize() + ! + ! -- store values + packobj%inunit = inunit + packobj%iout = iout + packobj%id = id + packobj%ibcnum = ibcnum + packobj%ncolbnd = 1 + packobj%iscloc = 1 + ! + ! -- Store the appropriate label based on the dependent variable + ctpobj%depvartype = depvartype + ! + ! -- Return + return + end subroutine ctp_create + + !> @brief Allocate arrays specific to the constant temperature package + !< + subroutine ctp_allocate_arrays(this, nodelist, auxvar) + ! -- modules + use MemoryManagerModule, only: mem_allocate, mem_setptr, mem_checkin + ! -- dummy + class(GweCtpType) :: this + integer(I4B), dimension(:), pointer, contiguous, optional :: nodelist + real(DP), dimension(:, :), pointer, contiguous, optional :: auxvar + ! -- local + integer(I4B) :: i + ! + ! -- call standard BndType allocate scalars + call this%BndExtType%allocate_arrays(nodelist, auxvar) + ! + ! -- allocate ratectpex + call mem_allocate(this%ratectpin, this%maxbound, 'RATECTPIN', this%memoryPath) + call mem_allocate(this%ratectpout, this%maxbound, 'RATECTPOUT', & + this%memoryPath) + do i = 1, this%maxbound + this%ratectpin(i) = DZERO + this%ratectpout(i) = DZERO + end do + ! -- set constant head array input context pointer + call mem_setptr(this%tspvar, 'TSPVAR', this%input_mempath) + ! + ! -- checkin constant head array input context pointer + call mem_checkin(this%tspvar, 'TSPVAR', this%memoryPath, & + 'TSPVAR', this%input_mempath) + ! + ! + ! -- Return + return + end subroutine ctp_allocate_arrays + + !> @brief Constant temperature read and prepare (rp) routine + !< + subroutine ctp_rp(this) + ! -- modules + use SimModule, only: store_error + use InputOutputModule, only: lowcase + implicit none + ! -- dummy + class(GweCtpType), intent(inout) :: this + ! -- local + integer(I4B) :: i, node, ibd, ierr + character(len=30) :: nodestr + character(len=LENVARNAME) :: dvtype + ! + ! -- Reset previous CTPs to active cell + do i = 1, this%nbound + node = this%nodelist(i) + this%ibound(node) = this%ibcnum + end do + ! + ! -- Call the parent class read and prepare + call this%BndExtType%bnd_rp() + ! + ! -- Set ibound to -(ibcnum + 1) for constant temperature cells + ierr = 0 + do i = 1, this%nbound + node = this%nodelist(i) + ibd = this%ibound(node) + if (ibd < 0) then + call this%dis%noder_to_string(node, nodestr) + dvtype = trim(this%depvartype) + call lowcase(dvtype) + call store_error('Cell is already a constant ' & + //dvtype//': '//trim(adjustl(nodestr))) + ierr = ierr + 1 + else + this%ibound(node) = -this%ibcnum + end if + end do + ! + ! -- Stop if errors detected + if (ierr > 0) then + call store_error_filename(this%input_fname) + end if + ! + ! -- Write the list to iout if requested + if (this%iprpak /= 0) then + call this%write_list() + end if + ! + ! -- Return + return + end subroutine ctp_rp + + !> @brief Constant temperature package advance routine + !! + !! Add package connections to matrix + !< + subroutine ctp_ad(this) + ! -- dummy + class(GweCtpType) :: this + ! -- local + integer(I4B) :: i, node + real(DP) :: cb + ! + ! -- Advance the time series + call this%TsManager%ad() + ! + ! -- Process each entry in the constant temperature cell list + do i = 1, this%nbound + node = this%nodelist(i) + cb = this%temp_mult(i) + ! + this%xnew(node) = cb + this%xold(node) = this%xnew(node) + end do + ! + ! -- For each observation, push simulated value and corresponding + ! simulation time from "current" to "preceding" and reset + ! "current" value. + call this%obs%obs_ad() + ! + ! -- Return + return + end subroutine ctp_ad + + !> @brief Check constant temperature boundary condition data + !< + subroutine ctp_ck(this) + ! -- dummy + class(GweCtpType), intent(inout) :: this + ! -- local + character(len=30) :: nodestr + integer(I4B) :: i + integer(I4B) :: node + ! -- formats + character(len=*), parameter :: fmtctperr = & + &"('Specified dependent variable boundary ',i0, & + &' temperature (',g0,') is less than zero for cell', a)" + ! + ! -- check stress period data + do i = 1, this%nbound + node = this%nodelist(i) + ! -- accumulate errors + if (this%temp_mult(i) < DZERO) then + call this%dis%noder_to_string(node, nodestr) + write (errmsg, fmt=fmtctperr) i, this%tspvar(i), trim(nodestr) + call store_error(errmsg) + end if + end do + ! + ! -- write summary of ctp package error messages + if (count_errors() > 0) then + call store_error_filename(this%input_fname) + end if + ! + ! -- Return + return + end subroutine ctp_ck + + !> @brief Override bnd_fc and do nothing + !! + !! For constant temperature boundary type, the call to bnd_fc needs to be + !! overwritten to prevent logic found in bnd from being executed + !< + subroutine ctp_fc(this, rhs, ia, idxglo, matrix_sln) + ! -- dummy + class(GweCtpType) :: this + real(DP), dimension(:), intent(inout) :: rhs + integer(I4B), dimension(:), intent(in) :: ia + integer(I4B), dimension(:), intent(in) :: idxglo + class(MatrixBaseType), pointer :: matrix_sln + ! + ! -- Return + return + end subroutine ctp_fc + + !> @brief Calculate flow associated with constant temperature boundary + !! + !! This method overrides bnd_cq() + !< + subroutine ctp_cq(this, x, flowja, iadv) + ! -- dummy + class(GweCtpType), intent(inout) :: this + real(DP), dimension(:), intent(in) :: x + real(DP), dimension(:), contiguous, intent(inout) :: flowja + integer(I4B), optional, intent(in) :: iadv + ! -- local + integer(I4B) :: i + integer(I4B) :: ipos + integer(I4B) :: node + integer(I4B) :: n2 + integer(I4B) :: idiag + real(DP) :: rate + real(DP) :: ratein, rateout + real(DP) :: q + ! + ! -- If no boundaries, skip flow calculations. + if (this%nbound > 0) then + ! + ! -- Loop through each boundary calculating flow. + do i = 1, this%nbound + node = this%nodelist(i) + idiag = this%dis%con%ia(node) + rate = DZERO + ratein = DZERO + rateout = DZERO + ! + ! -- Calculate the flow rate into the cell. + do ipos = this%dis%con%ia(node) + 1, & + this%dis%con%ia(node + 1) - 1 + q = flowja(ipos) + rate = rate - q + ! -- Only accumulate chin and chout for active + ! connected cells + n2 = this%dis%con%ja(ipos) + if (this%ibound(n2) > 0) then + if (q < DZERO) then + ratein = ratein - q + else + rateout = rateout + q + end if + end if + end do + ! + ! -- For CTP, store total flow in rhs so it is available for other + ! calculations + this%rhs(i) = -rate + this%hcof(i) = DZERO + ! + ! -- Save simulated value to simvals array. + this%simvals(i) = rate + this%ratectpin(i) = ratein + this%ratectpout(i) = rateout + flowja(idiag) = flowja(idiag) + rate + ! + end do + ! + end if + ! + ! -- Return + return + end subroutine ctp_cq + + !> @brief Add package ratin/ratout to model budget + !< + subroutine ctp_bd(this, model_budget) + ! -- modules + use TdisModule, only: delt + use BudgetModule, only: BudgetType, rate_accumulator + ! -- dummy + class(GweCtpType) :: this + ! -- local + type(BudgetType), intent(inout) :: model_budget + real(DP) :: ratin + real(DP) :: ratout + real(DP) :: dum + integer(I4B) :: isuppress_output + ! + isuppress_output = 0 + call rate_accumulator(this%ratectpin(1:this%nbound), ratin, dum) + call rate_accumulator(this%ratectpout(1:this%nbound), ratout, dum) + call model_budget%addentry(ratin, ratout, delt, this%text, & + isuppress_output, this%packName) + ! + ! -- Return + return + end subroutine ctp_bd + + !> @brief Deallocate memory + !! + !! Method to deallocate memory for the package. + !< + subroutine ctp_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + ! -- dummy + class(GweCtpType) :: this + ! + ! -- Deallocate parent package + call this%BndExtType%bnd_da() + ! + ! -- arrays + call mem_deallocate(this%ratectpin) + call mem_deallocate(this%ratectpout) + call mem_deallocate(this%tspvar, 'TSPVAR', this%memoryPath) + ! + ! -- Return + return + end subroutine ctp_da + + !> @brief Define labels used in list file + !! + !! Define the list heading that is written to iout when PRINT_INPUT option + !! is used. + !< + subroutine define_listlabel(this) + ! -- dummy + class(GweCtpType), intent(inout) :: this + ! + ! -- create the header list label + this%listlabel = trim(this%filtyp)//' NO.' + if (this%dis%ndim == 3) then + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'ROW' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'COL' + elseif (this%dis%ndim == 2) then + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'CELL2D' + else + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'NODE' + end if + write (this%listlabel, '(a, a16)') trim(this%listlabel), & + trim(this%depvartype) + if (this%inamedbound == 1) then + write (this%listlabel, '(a, a16)') trim(this%listlabel), 'BOUNDARY NAME' + end if + ! + ! -- Return + return + end subroutine define_listlabel + + !> @brief Procedure related to observation processing + !! + !! This routine: + !! - returns true because the SDV package supports observations, + !! - overrides packagetype%_obs_supported() + logical function ctp_obs_supported(this) + ! -- dummy + class(GweCtpType) :: this + ! + ctp_obs_supported = .true. + ! + ! -- Return + return + end function ctp_obs_supported + + !> @brief Procedure related to observation processing + !! + !! This routine: + !! - defines observations + !! - stores observation types supported by either of the SDV packages + !! (CTP or CTP), + !! - overrides BndExtType%bnd_df_obs + !< + subroutine ctp_df_obs(this) + ! -- dummy + class(GweCtpType) :: this + ! -- local + integer(I4B) :: indx + ! + call this%obs%StoreObsType(this%filtyp, .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => DefaultObsIdProcessor + ! + ! -- Return + return + end subroutine ctp_df_obs + + ! -- Procedure related to time series + + !> @brief Procedure related to time series + !! + !! Assign tsLink%Text appropriately for all time series in use by package. + !! For the constant temperature packages, the dependent variable can also be + !! controlled by a time series. + !< + subroutine ctp_rp_ts(this) + ! -- dummy + class(GweCtpType), intent(inout) :: this + ! -- local + integer(I4B) :: i, nlinks + type(TimeSeriesLinkType), pointer :: tslink => null() + ! + nlinks = this%TsManager%boundtslinks%Count() + do i = 1, nlinks + tslink => GetTimeSeriesLinkFromList(this%TsManager%boundtslinks, i) + if (associated(tslink)) then + select case (tslink%JCol) + case (1) + tslink%Text = trim(this%depvartype) + end select + end if + end do + ! + ! -- Return + return + end subroutine ctp_rp_ts + + !> @brief Apply auxiliary multiplier to specified temperature if + !< appropriate + function temp_mult(this, row) result(temp) + ! -- modules + use ConstantsModule, only: DZERO + ! -- dummy + class(GweCtpType), intent(inout) :: this !< BndExtType object + integer(I4B), intent(in) :: row + ! -- result + real(DP) :: temp + ! + if (this%iauxmultcol > 0) then + temp = this%tspvar(row) * this%auxvar(this%iauxmultcol, row) + else + temp = this%tspvar(row) + end if + ! + ! -- Return + return + end function temp_mult + + !> @ brief Return a bound value + !! + !! Return a bound value associated with an ncolbnd index and row. + !< + function ctp_bound_value(this, col, row) result(bndval) + ! -- modules + use ConstantsModule, only: DZERO + ! -- dummy variables + class(GweCtpType), intent(inout) :: this !< BndExtType object + integer(I4B), intent(in) :: col + integer(I4B), intent(in) :: row + ! -- result + real(DP) :: bndval + ! + select case (col) + case (1) + bndval = this%temp_mult(row) + case default + write (errmsg, '(3a)') 'Programming error. ', & + & adjustl(trim(this%filtyp)), ' bound value requested column '& + &'outside range of ncolbnd (1).' + call store_error(errmsg) + call store_error_filename(this%input_fname) + end select + ! + ! -- Return + return + end function ctp_bound_value + +end module GweCtpModule diff --git a/src/Model/GroundWaterEnergy/gwe1ctp1idm.f90 b/src/Model/GroundWaterEnergy/gwe1ctp1idm.f90 new file mode 100644 index 00000000000..3b2ca0a2889 --- /dev/null +++ b/src/Model/GroundWaterEnergy/gwe1ctp1idm.f90 @@ -0,0 +1,411 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module GweCtpInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public gwe_ctp_param_definitions + public gwe_ctp_aggregate_definitions + public gwe_ctp_block_definitions + public GweCtpParamFoundType + public gwe_ctp_multi_package + + type GweCtpParamFoundType + logical :: auxiliary = .false. + logical :: auxmultname = .false. + logical :: boundnames = .false. + logical :: iprflow = .false. + logical :: ipakcb = .false. + logical :: iprpak = .false. + logical :: ts_filerecord = .false. + logical :: ts6 = .false. + logical :: filein = .false. + logical :: ts6_filename = .false. + logical :: obs_filerecord = .false. + logical :: obs6 = .false. + logical :: obs6_filename = .false. + logical :: maxbound = .false. + logical :: cellid = .false. + logical :: tspvar = .false. + logical :: auxvar = .false. + logical :: boundname = .false. + end type GweCtpParamFoundType + + logical :: gwe_ctp_multi_package = .true. + + type(InputParamDefinitionType), parameter :: & + gwectp_auxiliary = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'OPTIONS', & ! block + 'AUXILIARY', & ! tag name + 'AUXILIARY', & ! fortran variable + 'STRING', & ! type + 'NAUX', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_auxmultname = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'OPTIONS', & ! block + 'AUXMULTNAME', & ! tag name + 'AUXMULTNAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_boundnames = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'OPTIONS', & ! block + 'BOUNDNAMES', & ! tag name + 'BOUNDNAMES', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_iprflow = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_INPUT', & ! tag name + 'IPRFLOW', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_ipakcb = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_FLOWS', & ! tag name + 'IPAKCB', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_iprpak = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'OPTIONS', & ! block + 'SAVE_FLOWS', & ! tag name + 'IPRPAK', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_ts_filerecord = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'OPTIONS', & ! block + 'TS_FILERECORD', & ! tag name + 'TS_FILERECORD', & ! fortran variable + 'RECORD TS6 FILEIN TS6_FILENAME', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_ts6 = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'OPTIONS', & ! block + 'TS6', & ! tag name + 'TS6', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_filein = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'OPTIONS', & ! block + 'FILEIN', & ! tag name + 'FILEIN', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_ts6_filename = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'OPTIONS', & ! block + 'TS6_FILENAME', & ! tag name + 'TS6_FILENAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_obs_filerecord = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'OPTIONS', & ! block + 'OBS_FILERECORD', & ! tag name + 'OBS_FILERECORD', & ! fortran variable + 'RECORD OBS6 FILEIN OBS6_FILENAME', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_obs6 = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'OPTIONS', & ! block + 'OBS6', & ! tag name + 'OBS6', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_obs6_filename = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'OPTIONS', & ! block + 'OBS6_FILENAME', & ! tag name + 'OBS6_FILENAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_maxbound = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'DIMENSIONS', & ! block + 'MAXBOUND', & ! tag name + 'MAXBOUND', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_cellid = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'PERIOD', & ! block + 'CELLID', & ! tag name + 'CELLID', & ! fortran variable + 'INTEGER1D', & ! type + 'NCELLDIM', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_tspvar = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'PERIOD', & ! block + 'TEMP', & ! tag name + 'TSPVAR', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .true. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_auxvar = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'PERIOD', & ! block + 'AUX', & ! tag name + 'AUXVAR', & ! fortran variable + 'DOUBLE1D', & ! type + 'NAUX', & ! shape + .false., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .true. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwectp_boundname = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'PERIOD', & ! block + 'BOUNDNAME', & ! tag name + 'BOUNDNAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwe_ctp_param_definitions(*) = & + [ & + gwectp_auxiliary, & + gwectp_auxmultname, & + gwectp_boundnames, & + gwectp_iprflow, & + gwectp_ipakcb, & + gwectp_iprpak, & + gwectp_ts_filerecord, & + gwectp_ts6, & + gwectp_filein, & + gwectp_ts6_filename, & + gwectp_obs_filerecord, & + gwectp_obs6, & + gwectp_obs6_filename, & + gwectp_maxbound, & + gwectp_cellid, & + gwectp_tspvar, & + gwectp_auxvar, & + gwectp_boundname & + ] + + type(InputParamDefinitionType), parameter :: & + gwectp_spd = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CTP', & ! subcomponent + 'PERIOD', & ! block + 'STRESS_PERIOD_DATA', & ! tag name + 'SPD', & ! fortran variable + 'RECARRAY CELLID TEMP AUX BOUNDNAME', & ! type + 'MAXBOUND', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwe_ctp_aggregate_definitions(*) = & + [ & + gwectp_spd & + ] + + type(InputBlockDefinitionType), parameter :: & + gwe_ctp_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'PERIOD', & ! blockname + .true., & ! required + .true., & ! aggregate + .true. & ! block_variable + ) & + ] + +end module GweCtpInputModule diff --git a/src/Model/GroundWaterEnergy/gwe1dis1idm.f90 b/src/Model/GroundWaterEnergy/gwe1dis1idm.f90 new file mode 100644 index 00000000000..cda16809731 --- /dev/null +++ b/src/Model/GroundWaterEnergy/gwe1dis1idm.f90 @@ -0,0 +1,313 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module GweDisInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public gwe_dis_param_definitions + public gwe_dis_aggregate_definitions + public gwe_dis_block_definitions + public GweDisParamFoundType + public gwe_dis_multi_package + + type GweDisParamFoundType + logical :: length_units = .false. + logical :: nogrb = .false. + logical :: xorigin = .false. + logical :: yorigin = .false. + logical :: angrot = .false. + logical :: nlay = .false. + logical :: nrow = .false. + logical :: ncol = .false. + logical :: delr = .false. + logical :: delc = .false. + logical :: top = .false. + logical :: botm = .false. + logical :: idomain = .false. + end type GweDisParamFoundType + + logical :: gwe_dis_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + gwedis_length_units = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'LENGTH_UNITS', & ! tag name + 'LENGTH_UNITS', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedis_nogrb = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'NOGRB', & ! tag name + 'NOGRB', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedis_xorigin = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'XORIGIN', & ! tag name + 'XORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedis_yorigin = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'YORIGIN', & ! tag name + 'YORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedis_angrot = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'ANGROT', & ! tag name + 'ANGROT', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedis_nlay = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DIS', & ! subcomponent + 'DIMENSIONS', & ! block + 'NLAY', & ! tag name + 'NLAY', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedis_nrow = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DIS', & ! subcomponent + 'DIMENSIONS', & ! block + 'NROW', & ! tag name + 'NROW', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedis_ncol = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DIS', & ! subcomponent + 'DIMENSIONS', & ! block + 'NCOL', & ! tag name + 'NCOL', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedis_delr = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DIS', & ! subcomponent + 'GRIDDATA', & ! block + 'DELR', & ! tag name + 'DELR', & ! fortran variable + 'DOUBLE1D', & ! type + 'NCOL', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedis_delc = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DIS', & ! subcomponent + 'GRIDDATA', & ! block + 'DELC', & ! tag name + 'DELC', & ! fortran variable + 'DOUBLE1D', & ! type + 'NROW', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedis_top = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DIS', & ! subcomponent + 'GRIDDATA', & ! block + 'TOP', & ! tag name + 'TOP', & ! fortran variable + 'DOUBLE2D', & ! type + 'NCOL NROW', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedis_botm = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DIS', & ! subcomponent + 'GRIDDATA', & ! block + 'BOTM', & ! tag name + 'BOTM', & ! fortran variable + 'DOUBLE3D', & ! type + 'NCOL NROW NLAY', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedis_idomain = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DIS', & ! subcomponent + 'GRIDDATA', & ! block + 'IDOMAIN', & ! tag name + 'IDOMAIN', & ! fortran variable + 'INTEGER3D', & ! type + 'NCOL NROW NLAY', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwe_dis_param_definitions(*) = & + [ & + gwedis_length_units, & + gwedis_nogrb, & + gwedis_xorigin, & + gwedis_yorigin, & + gwedis_angrot, & + gwedis_nlay, & + gwedis_nrow, & + gwedis_ncol, & + gwedis_delr, & + gwedis_delc, & + gwedis_top, & + gwedis_botm, & + gwedis_idomain & + ] + + type(InputParamDefinitionType), parameter :: & + gwe_dis_aggregate_definitions(*) = & + [ & + InputParamDefinitionType & + ( & + '', & ! component + '', & ! subcomponent + '', & ! block + '', & ! tag name + '', & ! fortran variable + '', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) & + ] + + type(InputBlockDefinitionType), parameter :: & + gwe_dis_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'GRIDDATA', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module GweDisInputModule diff --git a/src/Model/GroundWaterEnergy/gwe1disu1idm.f90 b/src/Model/GroundWaterEnergy/gwe1disu1idm.f90 new file mode 100644 index 00000000000..4e61f3935b2 --- /dev/null +++ b/src/Model/GroundWaterEnergy/gwe1disu1idm.f90 @@ -0,0 +1,618 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module GweDisuInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public gwe_disu_param_definitions + public gwe_disu_aggregate_definitions + public gwe_disu_block_definitions + public GweDisuParamFoundType + public gwe_disu_multi_package + + type GweDisuParamFoundType + logical :: length_units = .false. + logical :: nogrb = .false. + logical :: xorigin = .false. + logical :: yorigin = .false. + logical :: angrot = .false. + logical :: voffsettol = .false. + logical :: nodes = .false. + logical :: nja = .false. + logical :: nvert = .false. + logical :: top = .false. + logical :: bot = .false. + logical :: area = .false. + logical :: idomain = .false. + logical :: iac = .false. + logical :: ja = .false. + logical :: ihc = .false. + logical :: cl12 = .false. + logical :: hwva = .false. + logical :: angldegx = .false. + logical :: iv = .false. + logical :: xv = .false. + logical :: yv = .false. + logical :: icell2d = .false. + logical :: xc = .false. + logical :: yc = .false. + logical :: ncvert = .false. + logical :: icvert = .false. + end type GweDisuParamFoundType + + logical :: gwe_disu_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + gwedisu_length_units = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'OPTIONS', & ! block + 'LENGTH_UNITS', & ! tag name + 'LENGTH_UNITS', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_nogrb = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'OPTIONS', & ! block + 'NOGRB', & ! tag name + 'NOGRB', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_xorigin = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'OPTIONS', & ! block + 'XORIGIN', & ! tag name + 'XORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_yorigin = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'OPTIONS', & ! block + 'YORIGIN', & ! tag name + 'YORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_angrot = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'OPTIONS', & ! block + 'ANGROT', & ! tag name + 'ANGROT', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_voffsettol = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'OPTIONS', & ! block + 'VERTICAL_OFFSET_TOLERANCE', & ! tag name + 'VOFFSETTOL', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_nodes = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'DIMENSIONS', & ! block + 'NODES', & ! tag name + 'NODES', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_nja = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'DIMENSIONS', & ! block + 'NJA', & ! tag name + 'NJA', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_nvert = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'DIMENSIONS', & ! block + 'NVERT', & ! tag name + 'NVERT', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_top = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'GRIDDATA', & ! block + 'TOP', & ! tag name + 'TOP', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_bot = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'GRIDDATA', & ! block + 'BOT', & ! tag name + 'BOT', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_area = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'GRIDDATA', & ! block + 'AREA', & ! tag name + 'AREA', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_idomain = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'GRIDDATA', & ! block + 'IDOMAIN', & ! tag name + 'IDOMAIN', & ! fortran variable + 'INTEGER1D', & ! type + 'NODES', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_iac = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'CONNECTIONDATA', & ! block + 'IAC', & ! tag name + 'IAC', & ! fortran variable + 'INTEGER1D', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_ja = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'CONNECTIONDATA', & ! block + 'JA', & ! tag name + 'JA', & ! fortran variable + 'INTEGER1D', & ! type + 'NJA', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_ihc = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'CONNECTIONDATA', & ! block + 'IHC', & ! tag name + 'IHC', & ! fortran variable + 'INTEGER1D', & ! type + 'NJA', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_cl12 = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'CONNECTIONDATA', & ! block + 'CL12', & ! tag name + 'CL12', & ! fortran variable + 'DOUBLE1D', & ! type + 'NJA', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_hwva = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'CONNECTIONDATA', & ! block + 'HWVA', & ! tag name + 'HWVA', & ! fortran variable + 'DOUBLE1D', & ! type + 'NJA', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_angldegx = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'CONNECTIONDATA', & ! block + 'ANGLDEGX', & ! tag name + 'ANGLDEGX', & ! fortran variable + 'DOUBLE1D', & ! type + 'NJA', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_iv = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'VERTICES', & ! block + 'IV', & ! tag name + 'IV', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_xv = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'VERTICES', & ! block + 'XV', & ! tag name + 'XV', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_yv = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'VERTICES', & ! block + 'YV', & ! tag name + 'YV', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_icell2d = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'CELL2D', & ! block + 'ICELL2D', & ! tag name + 'ICELL2D', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_xc = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'CELL2D', & ! block + 'XC', & ! tag name + 'XC', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_yc = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'CELL2D', & ! block + 'YC', & ! tag name + 'YC', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_ncvert = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'CELL2D', & ! block + 'NCVERT', & ! tag name + 'NCVERT', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_icvert = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'CELL2D', & ! block + 'ICVERT', & ! tag name + 'ICVERT', & ! fortran variable + 'INTEGER1D', & ! type + 'NCVERT', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwe_disu_param_definitions(*) = & + [ & + gwedisu_length_units, & + gwedisu_nogrb, & + gwedisu_xorigin, & + gwedisu_yorigin, & + gwedisu_angrot, & + gwedisu_voffsettol, & + gwedisu_nodes, & + gwedisu_nja, & + gwedisu_nvert, & + gwedisu_top, & + gwedisu_bot, & + gwedisu_area, & + gwedisu_idomain, & + gwedisu_iac, & + gwedisu_ja, & + gwedisu_ihc, & + gwedisu_cl12, & + gwedisu_hwva, & + gwedisu_angldegx, & + gwedisu_iv, & + gwedisu_xv, & + gwedisu_yv, & + gwedisu_icell2d, & + gwedisu_xc, & + gwedisu_yc, & + gwedisu_ncvert, & + gwedisu_icvert & + ] + + type(InputParamDefinitionType), parameter :: & + gwedisu_vertices = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'VERTICES', & ! block + 'VERTICES', & ! tag name + 'VERTICES', & ! fortran variable + 'RECARRAY IV XV YV', & ! type + 'NVERT', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisu_cell2d = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'CELL2D', & ! block + 'CELL2D', & ! tag name + 'CELL2D', & ! fortran variable + 'RECARRAY ICELL2D XC YC NCVERT ICVERT', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwe_disu_aggregate_definitions(*) = & + [ & + gwedisu_vertices, & + gwedisu_cell2d & + ] + + type(InputBlockDefinitionType), parameter :: & + gwe_disu_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'GRIDDATA', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'CONNECTIONDATA', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'VERTICES', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'CELL2D', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module GweDisuInputModule diff --git a/src/Model/GroundWaterEnergy/gwe1disv1idm.f90 b/src/Model/GroundWaterEnergy/gwe1disv1idm.f90 new file mode 100644 index 00000000000..e109482271f --- /dev/null +++ b/src/Model/GroundWaterEnergy/gwe1disv1idm.f90 @@ -0,0 +1,460 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module GweDisvInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public gwe_disv_param_definitions + public gwe_disv_aggregate_definitions + public gwe_disv_block_definitions + public GweDisvParamFoundType + public gwe_disv_multi_package + + type GweDisvParamFoundType + logical :: length_units = .false. + logical :: nogrb = .false. + logical :: xorigin = .false. + logical :: yorigin = .false. + logical :: angrot = .false. + logical :: nlay = .false. + logical :: ncpl = .false. + logical :: nvert = .false. + logical :: top = .false. + logical :: botm = .false. + logical :: idomain = .false. + logical :: iv = .false. + logical :: xv = .false. + logical :: yv = .false. + logical :: icell2d = .false. + logical :: xc = .false. + logical :: yc = .false. + logical :: ncvert = .false. + logical :: icvert = .false. + end type GweDisvParamFoundType + + logical :: gwe_disv_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + gwedisv_length_units = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'LENGTH_UNITS', & ! tag name + 'LENGTH_UNITS', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_nogrb = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'NOGRB', & ! tag name + 'NOGRB', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_xorigin = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'XORIGIN', & ! tag name + 'XORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_yorigin = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'YORIGIN', & ! tag name + 'YORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_angrot = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'ANGROT', & ! tag name + 'ANGROT', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_nlay = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'DIMENSIONS', & ! block + 'NLAY', & ! tag name + 'NLAY', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_ncpl = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'DIMENSIONS', & ! block + 'NCPL', & ! tag name + 'NCPL', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_nvert = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'DIMENSIONS', & ! block + 'NVERT', & ! tag name + 'NVERT', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_top = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'GRIDDATA', & ! block + 'TOP', & ! tag name + 'TOP', & ! fortran variable + 'DOUBLE1D', & ! type + 'NCPL', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_botm = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'GRIDDATA', & ! block + 'BOTM', & ! tag name + 'BOTM', & ! fortran variable + 'DOUBLE2D', & ! type + 'NCPL NLAY', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_idomain = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'GRIDDATA', & ! block + 'IDOMAIN', & ! tag name + 'IDOMAIN', & ! fortran variable + 'INTEGER2D', & ! type + 'NCPL NLAY', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_iv = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'VERTICES', & ! block + 'IV', & ! tag name + 'IV', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_xv = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'VERTICES', & ! block + 'XV', & ! tag name + 'XV', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_yv = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'VERTICES', & ! block + 'YV', & ! tag name + 'YV', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_icell2d = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'ICELL2D', & ! tag name + 'ICELL2D', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_xc = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'XC', & ! tag name + 'XC', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_yc = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'YC', & ! tag name + 'YC', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_ncvert = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'NCVERT', & ! tag name + 'NCVERT', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_icvert = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'ICVERT', & ! tag name + 'ICVERT', & ! fortran variable + 'INTEGER1D', & ! type + 'NCVERT', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwe_disv_param_definitions(*) = & + [ & + gwedisv_length_units, & + gwedisv_nogrb, & + gwedisv_xorigin, & + gwedisv_yorigin, & + gwedisv_angrot, & + gwedisv_nlay, & + gwedisv_ncpl, & + gwedisv_nvert, & + gwedisv_top, & + gwedisv_botm, & + gwedisv_idomain, & + gwedisv_iv, & + gwedisv_xv, & + gwedisv_yv, & + gwedisv_icell2d, & + gwedisv_xc, & + gwedisv_yc, & + gwedisv_ncvert, & + gwedisv_icvert & + ] + + type(InputParamDefinitionType), parameter :: & + gwedisv_vertices = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'VERTICES', & ! block + 'VERTICES', & ! tag name + 'VERTICES', & ! fortran variable + 'RECARRAY IV XV YV', & ! type + 'NVERT', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwedisv_cell2d = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'CELL2D', & ! tag name + 'CELL2D', & ! fortran variable + 'RECARRAY ICELL2D XC YC NCVERT ICVERT', & ! type + 'NCPL', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwe_disv_aggregate_definitions(*) = & + [ & + gwedisv_vertices, & + gwedisv_cell2d & + ] + + type(InputBlockDefinitionType), parameter :: & + gwe_disv_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'GRIDDATA', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'VERTICES', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'CELL2D', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module GweDisvInputModule diff --git a/src/Model/GroundWaterEnergy/gwe1esl1.f90 b/src/Model/GroundWaterEnergy/gwe1esl1.f90 new file mode 100644 index 00000000000..dd18988ca72 --- /dev/null +++ b/src/Model/GroundWaterEnergy/gwe1esl1.f90 @@ -0,0 +1,296 @@ +module GweEslModule + ! + use KindModule, only: DP, I4B + use ConstantsModule, only: DZERO, DEM1, DONE, LENFTYPE + use BndModule, only: BndType + use ObsModule, only: DefaultObsIdProcessor + use TimeSeriesLinkModule, only: TimeSeriesLinkType, & + GetTimeSeriesLinkFromList + use BlockParserModule, only: BlockParserType + use GweInputDataModule, only: GweInputDataType + use MatrixBaseModule + ! + implicit none + ! + private + public :: esl_create + ! + character(len=LENFTYPE) :: ftype = 'ESL' + character(len=16) :: text = ' ESL' + ! + type, extends(BndType) :: GweEslType + + type(GweInputDataType), pointer :: gwecommon => null() !< pointer to shared gwe data used by multiple packages but set in mst + + contains + + procedure :: allocate_scalars => esl_allocate_scalars + procedure :: bnd_cf => esl_cf + procedure :: bnd_fc => esl_fc + procedure :: bnd_da => esl_da + procedure :: define_listlabel + ! -- methods for observations + procedure, public :: bnd_obs_supported => esl_obs_supported + procedure, public :: bnd_df_obs => esl_df_obs + ! -- methods for time series + procedure, public :: bnd_rp_ts => esl_rp_ts + + end type GweEslType + +contains + + !> @brief Create an energy source loading package + !! + !! This subroutine points bndobj to the newly created package + !< + subroutine esl_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, & + gwecommon) + ! -- dummy + class(BndType), pointer :: packobj + integer(I4B), intent(in) :: id + integer(I4B), intent(in) :: ibcnum + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + character(len=*), intent(in) :: namemodel + character(len=*), intent(in) :: pakname + type(GweInputDataType), intent(in), target :: gwecommon !< shared data container for use by multiple GWE packages + ! -- local + type(GweEslType), pointer :: eslobj + ! + ! -- Allocate the object and assign values to object variables + allocate (eslobj) + packobj => eslobj + ! + ! -- Create name and memory path + call packobj%set_names(ibcnum, namemodel, pakname, ftype) + packobj%text = text + ! + ! -- Allocate scalars + call eslobj%allocate_scalars() + ! + ! -- Initialize package + call packobj%pack_initialize() + ! + packobj%inunit = inunit + packobj%iout = iout + packobj%id = id + packobj%ibcnum = ibcnum + packobj%ncolbnd = 1 + packobj%iscloc = 1 + ! + ! -- Store pointer to shared data module for accessing cpw, rhow + ! for the budget calculations, and for accessing the latent heat of + ! vaporization for evaporative cooling. + eslobj%gwecommon => gwecommon + ! + ! -- Return + return + end subroutine esl_create + + !> @brief Deallocate memory + !< + subroutine esl_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + ! -- dummy + class(GweEslType) :: this + ! + ! -- Deallocate parent package + call this%BndType%bnd_da() + ! + ! -- Return + return + end subroutine esl_da + + !> @brief Allocate scalars + !! + !! Allocate scalars specific to this energy source loading package + !< + subroutine esl_allocate_scalars(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweEslType) :: this + ! + ! -- call standard BndType allocate scalars + call this%BndType%allocate_scalars() + ! + ! -- allocate the object and assign values to object variables + ! + ! -- Set values + ! + ! -- Return + return + end subroutine esl_allocate_scalars + + !> @brief Formulate the HCOF and RHS terms + !! + !! This subroutine: + !! - calculates hcof and rhs terms + !! - skip if no sources + !< + subroutine esl_cf(this) + ! -- dummy + class(GweEslType) :: this + ! -- local + integer(I4B) :: i, node + real(DP) :: q + ! + ! -- Return if no sources + if (this%nbound == 0) return + ! + ! -- Calculate hcof and rhs for each source entry + do i = 1, this%nbound + node = this%nodelist(i) + this%hcof(i) = DZERO + if (this%ibound(node) <= 0) then + this%rhs(i) = DZERO + cycle + end if + q = this%bound(1, i) + this%rhs(i) = -q + end do + ! + ! -- Return + return + end subroutine esl_cf + + !> @brief Add matrix terms related to specified energy source loading + !! + !! Copy rhs and hcof into solution rhs and amat + !< + subroutine esl_fc(this, rhs, ia, idxglo, matrix_sln) + ! -- dummy + class(GweEslType) :: this + real(DP), dimension(:), intent(inout) :: rhs + integer(I4B), dimension(:), intent(in) :: ia + integer(I4B), dimension(:), intent(in) :: idxglo + class(MatrixBaseType), pointer :: matrix_sln + ! -- local + integer(I4B) :: i, n, ipos + ! + ! -- pakmvrobj fc + if (this%imover == 1) then + call this%pakmvrobj%fc() + end if + ! + ! -- Copy package rhs and hcof into solution rhs and amat + do i = 1, this%nbound + n = this%nodelist(i) + rhs(n) = rhs(n) + this%rhs(i) + ipos = ia(n) + call matrix_sln%add_value_pos(idxglo(ipos), this%hcof(i)) + ! + ! -- If mover is active and mass is being withdrawn, + ! store available mass (as positive value). + if (this%imover == 1 .and. this%rhs(i) > DZERO) then + call this%pakmvrobj%accumulate_qformvr(i, this%rhs(i)) + end if + end do + ! + ! -- Return + return + end subroutine esl_fc + + !> @brief Define list labels + !! + !! Define the list heading that is written to iout when + !! PRINT_INPUT option is used. + !< + subroutine define_listlabel(this) + ! -- dummy + class(GweEslType), intent(inout) :: this + ! + ! -- Create the header list label + this%listlabel = trim(this%filtyp)//' NO.' + if (this%dis%ndim == 3) then + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'ROW' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'COL' + elseif (this%dis%ndim == 2) then + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'CELL2D' + else + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'NODE' + end if + write (this%listlabel, '(a, a16)') trim(this%listlabel), 'STRESS RATE' + if (this%inamedbound == 1) then + write (this%listlabel, '(a, a16)') trim(this%listlabel), 'BOUNDARY NAME' + end if + ! + ! -- Return + return + end subroutine define_listlabel + + ! -- Procedures related to observations + + !> @brief Support function for specified energy source loading observations + !! + !! This function: + !! - returns true because ESL package supports observations. + !! - overrides BndType%bnd_obs_supported() + !< + logical function esl_obs_supported(this) + implicit none + ! -- dummy + class(GweEslType) :: this + ! + esl_obs_supported = .true. + ! + ! -- Return + return + end function esl_obs_supported + + !> @brief Define observations + !! + !! This subroutine: + !! - stores observation types supported by ESL package. + !! - overrides BndType%bnd_df_obs + !< + subroutine esl_df_obs(this) + implicit none + ! -- dummy + class(GweEslType) :: this + ! -- local + integer(I4B) :: indx + ! + call this%obs%StoreObsType('esl', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => DefaultObsIdProcessor + ! + ! -- Store obs type and assign procedure pointer + ! for to-mvr observation type. + call this%obs%StoreObsType('to-mvr', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => DefaultObsIdProcessor + ! + ! -- Return + return + end subroutine esl_df_obs + + !> @brief Procedure related to time series + !! + !! Assign tsLink%Text appropriately for all time series in use by package. + !! In the ESL package only the SENERRATE variable can be controlled by time + !! series. + !< + subroutine esl_rp_ts(this) + ! -- dummy + class(GweEslType), intent(inout) :: this + ! -- local + integer(I4B) :: i, nlinks + type(TimeSeriesLinkType), pointer :: tslink => null() + ! + nlinks = this%TsManager%boundtslinks%Count() + do i = 1, nlinks + tslink => GetTimeSeriesLinkFromList(this%TsManager%boundtslinks, i) + if (associated(tslink)) then + if (tslink%JCol == 1) then + tslink%Text = 'SMASSRATE' + end if + end if + end do + ! + ! -- Return + return + end subroutine esl_rp_ts + +end module GweEslModule diff --git a/src/Model/GroundWaterEnergy/gwe1est1.f90 b/src/Model/GroundWaterEnergy/gwe1est1.f90 new file mode 100644 index 00000000000..c5a0dba3f65 --- /dev/null +++ b/src/Model/GroundWaterEnergy/gwe1est1.f90 @@ -0,0 +1,912 @@ +!> -- @ brief Energy Storage and Transfer (EST) Module +!! +!! The GweEstModule contains the GweEstType, which is related +!! to GwtEstModule; however, there are some important differences +!! owing to the fact that a sorbed phase is not considered. +!! Instead, a single temperature is simulated for each grid +!! cell and is represenative of both the aqueous and solid +!! phases (i.e., instantaneous thermal equilibrium is +!! assumed). Also, "thermal bleeding" is accomodated, where +!! conductive processes can transport into, through, or +!! out of dry cells that are part of the active domain. +!< +module GweEstModule + + use KindModule, only: DP, I4B + use ConstantsModule, only: DONE, DZERO, DTWO, DHALF, LENBUDTXT + use SimVariablesModule, only: errmsg, warnmsg + use SimModule, only: store_error, count_errors, & + store_warning + use MatrixBaseModule + use NumericalPackageModule, only: NumericalPackageType + use BaseDisModule, only: DisBaseType + use TspFmiModule, only: TspFmiType + use GweInputDataModule, only: GweInputDataType + + implicit none + public :: GweEstType + public :: est_cr + ! + integer(I4B), parameter :: NBDITEMS = 2 + character(len=LENBUDTXT), dimension(NBDITEMS) :: budtxt + data budtxt/' STORAGE-CELLBLK', ' DECAY-AQUEOUS'/ + + !> @ brief Energy storage and transfer + !! + !! Data and methods for handling changes in temperature + !< + type, extends(NumericalPackageType) :: GweEstType + ! + ! -- storage + real(DP), pointer :: cpw => null() !< heat capacity of water + real(DP), pointer :: rhow => null() !< density of water + real(DP), dimension(:), pointer, contiguous :: cps => null() !< heat capacity of solid + real(DP), dimension(:), pointer, contiguous :: rhos => null() !< density of solid + real(DP), dimension(:), pointer, contiguous :: porosity => null() !< porosity + real(DP), dimension(:), pointer, contiguous :: ratesto => null() !< rate of energy storage + ! + ! -- decay + integer(I4B), pointer :: idcy => null() !< order of decay rate (0:none, 1:first, 2:zero) + integer(I4B), pointer :: ilhv => null() !< latent heat of vaporization for calculating temperature change associcated with evaporation (0: not specified, not 0: specified) + real(DP), dimension(:), pointer, contiguous :: decay => null() !< first or zero order decay rate (aqueous) + real(DP), dimension(:), pointer, contiguous :: ratedcy => null() !< rate of decay + real(DP), dimension(:), pointer, contiguous :: decaylast => null() !< decay rate used for last iteration (needed for zero order decay) + ! + ! -- misc + integer(I4B), dimension(:), pointer, contiguous :: ibound => null() !< pointer to model ibound + type(TspFmiType), pointer :: fmi => null() !< pointer to fmi object + type(GweInputDataType), pointer :: gwecommon => null() !< pointer to shared gwe data used by multiple packages but set in est + real(DP), pointer :: latheatvap => null() !< latent heat of vaporization + real(DP), pointer :: eqnsclfac => null() !< governing equation scale factor; =rhow*cpw for energy + + contains + + procedure :: est_ar + procedure :: est_fc + procedure :: est_fc_sto + procedure :: est_fc_dcy + procedure :: est_cq + procedure :: est_cq_sto + procedure :: est_cq_dcy + procedure :: est_bd + procedure :: est_ot_flow + procedure :: est_da + procedure :: allocate_scalars + procedure, private :: allocate_arrays + procedure, private :: read_options + procedure, private :: read_data + procedure, private :: read_packagedata + + end type GweEstType + +contains + + !> @ brief Create a new EST package object + !! + !! Create a new EST package + !< + subroutine est_cr(estobj, name_model, inunit, iout, fmi, eqnsclfac, gwecommon) + ! -- dummy + type(GweEstType), pointer :: estobj !< unallocated new est object to create + character(len=*), intent(in) :: name_model !< name of the model + integer(I4B), intent(in) :: inunit !< unit number of WEL package input file + integer(I4B), intent(in) :: iout !< unit number of model listing file + type(TspFmiType), intent(in), target :: fmi !< fmi package for this GWE model + real(DP), intent(in), pointer :: eqnsclfac !< governing equation scale factor + type(GweInputDataType), intent(in), target :: gwecommon !< shared data container for use by multiple GWE packages + ! + ! -- Create the object + allocate (estobj) + ! + ! -- create name and memory path + call estobj%set_names(1, name_model, 'EST', 'EST') + ! + ! -- Allocate scalars + call estobj%allocate_scalars() + ! + ! -- Set variables + estobj%inunit = inunit + estobj%iout = iout + estobj%fmi => fmi + estobj%eqnsclfac => eqnsclfac + estobj%gwecommon => gwecommon + ! + ! -- Initialize block parser + call estobj%parser%Initialize(estobj%inunit, estobj%iout) + ! + ! -- Return + return + end subroutine est_cr + + !> @ brief Allocate and read method for package + !! + !! Method to allocate and read static data for the package. + !< + subroutine est_ar(this, dis, ibound) + ! -- modules + use GweInputDataModule, only: set_gwe_dat_ptrs + ! -- dummy + class(GweEstType), intent(inout) :: this !< GweEstType object + class(DisBaseType), pointer, intent(in) :: dis !< pointer to dis package + integer(I4B), dimension(:), pointer, contiguous :: ibound !< pointer to GWE ibound array + ! -- local + ! -- formats + character(len=*), parameter :: fmtest = & + "(1x,/1x,'EST -- ENERGY STORAGE AND TRANSFER PACKAGE, VERSION 1, & + &7/29/2020 INPUT READ FROM UNIT ', i0, //)" + ! + ! --print a message identifying the energy storage and transfer package. + write (this%iout, fmtest) this%inunit + ! + ! -- Read options + call this%read_options() + ! + ! -- store pointers to arguments that were passed in + this%dis => dis + this%ibound => ibound + ! + ! -- Allocate arrays + call this%allocate_arrays(dis%nodes) + ! + ! -- read the gridded data + call this%read_data() + ! + ! -- read package data that is not gridded + call this%read_packagedata() + ! + ! -- set pointers for data required by other packages + if (this%ilhv == 1) then + call this%gwecommon%set_gwe_dat_ptrs(this%rhow, this%cpw, this%rhow, & + this%cpw, this%latheatvap) + else + call this%gwecommon%set_gwe_dat_ptrs(this%rhow, this%cpw, this%rhow, & + this%cpw) + end if + ! + ! -- Return + return + end subroutine est_ar + + !> @ brief Fill coefficient method for package + !! + !! Method to calculate and fill coefficients for the package. + !< + subroutine est_fc(this, nodes, cold, nja, matrix_sln, idxglo, cnew, & + rhs, kiter) + ! -- modules + ! -- dummy + class(GweEstType) :: this !< GweEstType object + integer, intent(in) :: nodes !< number of nodes + real(DP), intent(in), dimension(nodes) :: cold !< temperature at end of last time step + integer(I4B), intent(in) :: nja !< number of GWE connections + class(MatrixBaseType), pointer :: matrix_sln !< solution matrix + integer(I4B), intent(in), dimension(nja) :: idxglo !< mapping vector for model (local) to solution (global) + real(DP), intent(inout), dimension(nodes) :: rhs !< right-hand side vector for model + real(DP), intent(in), dimension(nodes) :: cnew !< temperature at end of this time step + integer(I4B), intent(in) :: kiter !< solution outer iteration number + ! -- local + ! + ! -- storage contribution + call this%est_fc_sto(nodes, cold, nja, matrix_sln, idxglo, rhs) + ! + ! -- decay contribution + if (this%idcy /= 0) then + call this%est_fc_dcy(nodes, cold, cnew, nja, matrix_sln, idxglo, & + rhs, kiter) + end if + ! + ! -- Return + return + end subroutine est_fc + + !> @ brief Fill storage coefficient method for package + !! + !! Method to calculate and fill storage coefficients for the package. + !< + subroutine est_fc_sto(this, nodes, cold, nja, matrix_sln, idxglo, rhs) + ! -- modules + use TdisModule, only: delt + ! -- dummy + class(GweEstType) :: this !< GweEstType object + integer, intent(in) :: nodes !< number of nodes + real(DP), intent(in), dimension(nodes) :: cold !< temperature at end of last time step + integer(I4B), intent(in) :: nja !< number of GWE connections + class(MatrixBaseType), pointer :: matrix_sln !< solution coefficient matrix + integer(I4B), intent(in), dimension(nja) :: idxglo !< mapping vector for model (local) to solution (global) + real(DP), intent(inout), dimension(nodes) :: rhs !< right-hand side vector for model + ! -- local + integer(I4B) :: n, idiag + real(DP) :: tled + real(DP) :: hhcof, rrhs + real(DP) :: vnew, vold, vcell, vsolid, term + ! + ! -- set variables + tled = DONE / delt + ! + ! -- loop through and calculate storage contribution to hcof and rhs + do n = 1, this%dis%nodes + ! + ! -- skip if transport inactive + if (this%ibound(n) <= 0) cycle + ! + ! -- calculate new and old water volumes and solid volume + vcell = this%dis%area(n) * (this%dis%top(n) - this%dis%bot(n)) + vnew = vcell * this%fmi%gwfsat(n) * this%porosity(n) + vold = vnew + if (this%fmi%igwfstrgss /= 0) vold = vold + this%fmi%gwfstrgss(n) * delt + if (this%fmi%igwfstrgsy /= 0) vold = vold + this%fmi%gwfstrgsy(n) * delt + vsolid = vcell * (DONE - this%porosity(n)) + ! + ! -- add terms to diagonal and rhs accumulators + term = (this%rhos(n) * this%cps(n)) * vsolid + hhcof = -(this%eqnsclfac * vnew + term) * tled + rrhs = -(this%eqnsclfac * vold + term) * tled * cold(n) + idiag = this%dis%con%ia(n) + call matrix_sln%add_value_pos(idxglo(idiag), hhcof) + rhs(n) = rhs(n) + rrhs + end do + ! + ! -- Return + return + end subroutine est_fc_sto + + !> @ brief Fill decay coefficient method for package + !! + !! Method to calculate and fill decay coefficients for the package. + !< + subroutine est_fc_dcy(this, nodes, cold, cnew, nja, matrix_sln, & + idxglo, rhs, kiter) + ! -- modules + use TdisModule, only: delt + ! -- dummy + class(GweEstType) :: this !< GweEstType object + integer, intent(in) :: nodes !< number of nodes + real(DP), intent(in), dimension(nodes) :: cold !< temperature at end of last time step + real(DP), intent(in), dimension(nodes) :: cnew !< temperature at end of this time step + integer(I4B), intent(in) :: nja !< number of GWE connections + class(MatrixBaseType), pointer :: matrix_sln !< solution coefficient matrix + integer(I4B), intent(in), dimension(nja) :: idxglo !< mapping vector for model (local) to solution (global) + real(DP), intent(inout), dimension(nodes) :: rhs !< right-hand side vector for model + integer(I4B), intent(in) :: kiter !< solution outer iteration number + ! -- local + integer(I4B) :: n, idiag + real(DP) :: hhcof, rrhs + real(DP) :: swtpdt + real(DP) :: vcell + real(DP) :: decay_rate + ! + ! -- loop through and calculate decay contribution to hcof and rhs + do n = 1, this%dis%nodes + ! + ! -- skip if transport inactive + if (this%ibound(n) <= 0) cycle + ! + ! -- calculate new and old water volumes + vcell = this%dis%area(n) * (this%dis%top(n) - this%dis%bot(n)) + swtpdt = this%fmi%gwfsat(n) + ! + ! -- add decay rate terms to accumulators + idiag = this%dis%con%ia(n) + if (this%idcy == 1) then + ! + ! -- first order decay rate is a function of temperature, so add ! note: May want to remove first-order decay for temperature and support only zero-order + ! to left hand side + hhcof = -this%decay(n) * vcell * swtpdt * this%porosity(n) & + * this%eqnsclfac + call matrix_sln%add_value_pos(idxglo(idiag), hhcof) + elseif (this%idcy == 2) then + ! + ! -- Call function to get zero-order decay rate, which may be changed + ! from the user-specified rate to prevent negative temperatures ! Important note: still need to think through negative temps + decay_rate = get_zero_order_decay(this%decay(n), this%decaylast(n), & + kiter, cold(n), cnew(n), delt) + ! -- This term does get divided by eqnsclfac for fc purposes because it + ! should start out being a rate of energy + this%decaylast(n) = decay_rate + rrhs = decay_rate * vcell * swtpdt * this%porosity(n) + rhs(n) = rhs(n) + rrhs + end if + ! + end do + ! + ! -- Return + return + end subroutine est_fc_dcy + + !> @ brief Calculate flows for package + !! + !! Method to calculate flows for the package. + !< + subroutine est_cq(this, nodes, cnew, cold, flowja) + ! -- modules + ! -- dummy + class(GweEstType) :: this !< GweEstType object + integer(I4B), intent(in) :: nodes !< number of nodes + real(DP), intent(in), dimension(nodes) :: cnew !< temperature at end of this time step + real(DP), intent(in), dimension(nodes) :: cold !< temperature at end of last time step + real(DP), dimension(:), contiguous, intent(inout) :: flowja !< flow between two connected control volumes + ! -- local + ! + ! - storage + call this%est_cq_sto(nodes, cnew, cold, flowja) + ! + ! -- decay + if (this%idcy /= 0) then + call this%est_cq_dcy(nodes, cnew, cold, flowja) + end if + ! + ! -- Return + return + end subroutine est_cq + + !> @ brief Calculate storage terms for package + !! + !! Method to calculate storage terms for the package. + !< + subroutine est_cq_sto(this, nodes, cnew, cold, flowja) + ! -- modules + use TdisModule, only: delt + ! -- dummy + class(GweEstType) :: this !< GweEstType object + integer(I4B), intent(in) :: nodes !< number of nodes + real(DP), intent(in), dimension(nodes) :: cnew !< temperature at end of this time step + real(DP), intent(in), dimension(nodes) :: cold !< temperature at end of last time step + real(DP), dimension(:), contiguous, intent(inout) :: flowja !< flow between two connected control volumes + ! -- local + integer(I4B) :: n + integer(I4B) :: idiag + real(DP) :: rate + real(DP) :: tled + real(DP) :: vwatnew, vwatold, vcell, vsolid, term + real(DP) :: hhcof, rrhs + ! + ! -- initialize + tled = DONE / delt + ! + ! -- Calculate storage change + do n = 1, nodes + this%ratesto(n) = DZERO + ! + ! -- skip if transport inactive + if (this%ibound(n) <= 0) cycle + ! + ! -- calculate new and old water volumes and solid volume + vcell = this%dis%area(n) * (this%dis%top(n) - this%dis%bot(n)) + vwatnew = vcell * this%fmi%gwfsat(n) * this%porosity(n) + vwatold = vwatnew + if (this%fmi%igwfstrgss /= 0) vwatold = vwatold + this%fmi%gwfstrgss(n) & + * delt + if (this%fmi%igwfstrgsy /= 0) vwatold = vwatold + this%fmi%gwfstrgsy(n) & + * delt + vsolid = vcell * (DONE - this%porosity(n)) + ! + ! -- calculate rate + term = (this%rhos(n) * this%cps(n)) * vsolid + hhcof = -(this%eqnsclfac * vwatnew + term) * tled + rrhs = -(this%eqnsclfac * vwatold + term) * tled * cold(n) + rate = hhcof * cnew(n) - rrhs + this%ratesto(n) = rate + idiag = this%dis%con%ia(n) + flowja(idiag) = flowja(idiag) + rate + end do + ! + ! -- Return + return + end subroutine est_cq_sto + + !> @ brief Calculate decay terms for package + !! + !! Method to calculate decay terms for the package. + !< + subroutine est_cq_dcy(this, nodes, cnew, cold, flowja) ! Important note: this handles only decay in water; need to add zero-order (but not first-order?) decay in solid + ! -- modules + use TdisModule, only: delt + ! -- dummy + class(GweEstType) :: this !< GweEstType object + integer(I4B), intent(in) :: nodes !< number of nodes + real(DP), intent(in), dimension(nodes) :: cnew !< temperature at end of this time step + real(DP), intent(in), dimension(nodes) :: cold !< temperature at end of last time step + real(DP), dimension(:), contiguous, intent(inout) :: flowja !< flow between two connected control volumes + ! -- local + integer(I4B) :: n + integer(I4B) :: idiag + real(DP) :: rate + real(DP) :: swtpdt + real(DP) :: hhcof, rrhs + real(DP) :: vcell + real(DP) :: decay_rate + ! + ! -- initialize + ! + ! -- Calculate decay change + do n = 1, nodes + ! + ! -- skip if transport inactive + this%ratedcy(n) = DZERO + if (this%ibound(n) <= 0) cycle + ! + ! -- calculate new and old water volumes + vcell = this%dis%area(n) * (this%dis%top(n) - this%dis%bot(n)) + swtpdt = this%fmi%gwfsat(n) + ! + ! -- calculate decay gains and losses + rate = DZERO + hhcof = DZERO + rrhs = DZERO + if (this%idcy == 1) then ! Important note: do we need/want first-order decay for temperature??? + hhcof = -this%decay(n) * vcell * swtpdt * this%porosity(n) & + * this%eqnsclfac + elseif (this%idcy == 2) then + decay_rate = get_zero_order_decay(this%decay(n), this%decaylast(n), & + 0, cold(n), cnew(n), delt) + rrhs = decay_rate * vcell * swtpdt * this%porosity(n) ! Important note: this term does NOT get multiplied by eqnsclfac for cq purposes because it should already be a rate of energy + end if + rate = hhcof * cnew(n) - rrhs + this%ratedcy(n) = rate + idiag = this%dis%con%ia(n) + flowja(idiag) = flowja(idiag) + rate + ! + end do + ! + ! -- Return + return + end subroutine est_cq_dcy + + !> @ brief Calculate budget terms for package + !! + !! Method to calculate budget terms for the package. + !< + subroutine est_bd(this, isuppress_output, model_budget) + ! -- modules + use TdisModule, only: delt + use BudgetModule, only: BudgetType, rate_accumulator + ! -- dummy + class(GweEstType) :: this !< GweEstType object + integer(I4B), intent(in) :: isuppress_output !< flag to supress output + type(BudgetType), intent(inout) :: model_budget !< model budget object + ! -- local + real(DP) :: rin + real(DP) :: rout + ! + ! -- sto + call rate_accumulator(this%ratesto, rin, rout) + call model_budget%addentry(rin, rout, delt, budtxt(1), & + isuppress_output, rowlabel=this%packName) + ! + ! -- dcy + if (this%idcy /= 0) then + call rate_accumulator(this%ratedcy, rin, rout) + call model_budget%addentry(rin, rout, delt, budtxt(2), & + isuppress_output, rowlabel=this%packName) + end if + ! + ! -- Return + return + end subroutine est_bd + + !> @ brief Output flow terms for package + !! + !! Method to output terms for the package. + !< + subroutine est_ot_flow(this, icbcfl, icbcun) + ! -- dummy + class(GweEstType) :: this !< GweEstType object + integer(I4B), intent(in) :: icbcfl !< flag and unit number for cell-by-cell output + integer(I4B), intent(in) :: icbcun !< flag indication if cell-by-cell data should be saved + ! -- local + integer(I4B) :: ibinun + !character(len=16), dimension(2) :: aname + integer(I4B) :: iprint, nvaluesp, nwidthp + character(len=1) :: cdatafmp = ' ', editdesc = ' ' + real(DP) :: dinact + ! + ! -- Set unit number for binary output + if (this%ipakcb < 0) then + ibinun = icbcun + elseif (this%ipakcb == 0) then + ibinun = 0 + else + ibinun = this%ipakcb + end if + if (icbcfl == 0) ibinun = 0 + ! + ! -- Record the storage rate if requested + if (ibinun /= 0) then + iprint = 0 + dinact = DZERO + ! + ! -- sto + call this%dis%record_array(this%ratesto, this%iout, iprint, -ibinun, & + budtxt(1), cdatafmp, nvaluesp, & + nwidthp, editdesc, dinact) + ! + ! -- dcy + if (this%idcy /= 0) & + call this%dis%record_array(this%ratedcy, this%iout, iprint, -ibinun, & + budtxt(2), cdatafmp, nvaluesp, & + nwidthp, editdesc, dinact) + end if + ! + ! -- Return + return + end subroutine est_ot_flow + + !> @brief Deallocate memory + !! + !! Method to deallocate memory for the package. + !< + subroutine est_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + ! -- dummy + class(GweEstType) :: this !< GweEstType object + ! + ! -- Deallocate arrays if package was active + if (this%inunit > 0) then + call mem_deallocate(this%porosity) + call mem_deallocate(this%ratesto) + call mem_deallocate(this%idcy) + call mem_deallocate(this%ilhv) + call mem_deallocate(this%decay) + call mem_deallocate(this%ratedcy) + call mem_deallocate(this%decaylast) + call mem_deallocate(this%cpw) + call mem_deallocate(this%cps) + call mem_deallocate(this%rhow) + call mem_deallocate(this%rhos) + call mem_deallocate(this%latheatvap) + this%ibound => null() + this%fmi => null() + end if + ! + ! -- Scalars + ! + ! -- deallocate parent + call this%NumericalPackageType%da() + ! + ! -- Return + return + end subroutine est_da + + !> @ brief Allocate scalar variables for package + !! + !! Method to allocate scalar variables for the package. + !< + subroutine allocate_scalars(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate, mem_setptr + ! -- dummy + class(GweEstType) :: this !< GweEstType object + ! -- local + ! + ! -- Allocate scalars in NumericalPackageType + call this%NumericalPackageType%allocate_scalars() + ! + ! -- Allocate + call mem_allocate(this%cpw, 'CPW', this%memoryPath) + call mem_allocate(this%rhow, 'RHOW', this%memoryPath) + call mem_allocate(this%latheatvap, 'LATHEATVAP', this%memoryPath) + call mem_allocate(this%idcy, 'IDCY', this%memoryPath) + call mem_allocate(this%ilhv, 'ILHV', this%memoryPath) + ! + ! -- Initialize + this%cpw = DZERO + this%rhow = DZERO + this%latheatvap = DZERO + this%idcy = 0 + this%ilhv = 0 + ! + ! -- Return + return + end subroutine allocate_scalars + + !> @ brief Allocate arrays for package + !! + !! Method to allocate arrays for the package. + !< + subroutine allocate_arrays(this, nodes) + ! -- modules + use MemoryManagerModule, only: mem_allocate + use ConstantsModule, only: DZERO + ! -- dummy + class(GweEstType) :: this !< GweEstType object + integer(I4B), intent(in) :: nodes !< number of nodes + ! -- local + integer(I4B) :: n + ! + ! -- Allocate + ! -- sto + call mem_allocate(this%porosity, nodes, 'POROSITY', this%memoryPath) + call mem_allocate(this%ratesto, nodes, 'RATESTO', this%memoryPath) + call mem_allocate(this%cps, nodes, 'CPS', this%memoryPath) + call mem_allocate(this%rhos, nodes, 'RHOS', this%memoryPath) + ! + ! -- dcy + if (this%idcy == 0) then + call mem_allocate(this%ratedcy, 1, 'RATEDCY', this%memoryPath) + call mem_allocate(this%decay, 1, 'DECAY', this%memoryPath) + call mem_allocate(this%decaylast, 1, 'DECAYLAST', this%memoryPath) + else + call mem_allocate(this%ratedcy, this%dis%nodes, 'RATEDCY', this%memoryPath) + call mem_allocate(this%decay, nodes, 'DECAY', this%memoryPath) + call mem_allocate(this%decaylast, nodes, 'DECAYLAST', this%memoryPath) + end if + ! + ! -- Initialize + do n = 1, nodes + this%porosity(n) = DZERO + this%ratesto(n) = DZERO + this%cps(n) = DZERO + this%rhos(n) = DZERO + end do + do n = 1, size(this%decay) + this%decay(n) = DZERO + this%ratedcy(n) = DZERO + this%decaylast(n) = DZERO + end do + ! + ! -- Return + return + end subroutine allocate_arrays + + !> @ brief Read options for package + !! + !! Method to read options for the package. + !< + subroutine read_options(this) + ! -- modules + use ConstantsModule, only: LINELENGTH + ! -- dummy + class(GweEstType) :: this !< GweEstType object + ! -- local + character(len=LINELENGTH) :: keyword + integer(I4B) :: ierr + logical :: isfound, endOfBlock + ! -- formats + character(len=*), parameter :: fmtisvflow = & + &"(4x,'CELL-BY-CELL FLOW INFORMATION WILL BE SAVED TO BINARY "// & + &"FILE WHENEVER ICBCFL IS NOT ZERO.')" + character(len=*), parameter :: fmtidcy1 = & + "(4x,'FIRST-ORDER DECAY IS ACTIVE. ')" + character(len=*), parameter :: fmtidcy2 = & + "(4x,'ZERO-ORDER DECAY IS ACTIVE. ')" + character(len=*), parameter :: fmtilhv = & + "(4x,'LATENT HEAT OF VAPORIZATION WILL BE & + &USED IN EVAPORATION CALCULATIONS.')" + ! + ! -- get options block + call this%parser%GetBlock('OPTIONS', isfound, ierr, blockRequired=.false., & + supportOpenClose=.true.) + ! + ! -- parse options block if detected + if (isfound) then + write (this%iout, '(1x,a)') 'PROCESSING ENERGY STORAGE AND TRANSFER OPTIONS' + do + call this%parser%GetNextLine(endOfBlock) + if (endOfBlock) exit + call this%parser%GetStringCaps(keyword) + select case (keyword) + case ('SAVE_FLOWS') + this%ipakcb = -1 + write (this%iout, fmtisvflow) + case ('FIRST_ORDER_DECAY') + this%idcy = 1 + write (this%iout, fmtidcy1) + case ('ZERO_ORDER_DECAY') + this%idcy = 2 + write (this%iout, fmtidcy2) + case ('LATENT_HEAT_VAPORIZATION') + this%ilhv = 1 + write (this%iout, fmtilhv) + case default + write (errmsg, '(a,a)') 'UNKNOWN EST OPTION: ', trim(keyword) + call store_error(errmsg) + call this%parser%StoreErrorUnit() + end select + end do + write (this%iout, '(1x,a)') 'END OF ENERGY STORAGE AND TRANSFER OPTIONS' + end if + ! + ! -- Return + return + end subroutine read_options + + !> @ brief Read data for package + !! + !! Method to read data for the package. + !< + subroutine read_data(this) + ! -- modules + use ConstantsModule, only: LINELENGTH + use MemoryManagerModule, only: mem_reallocate, mem_reassignptr + ! -- dummy + class(GweEstType) :: this !< GweEstType object + ! -- local + character(len=LINELENGTH) :: keyword + character(len=:), allocatable :: line + integer(I4B) :: istart, istop, lloc, ierr + logical :: isfound, endOfBlock + logical, dimension(4) :: lname + character(len=24), dimension(4) :: aname + ! -- formats + ! -- data + data aname(1)/' MOBILE DOMAIN POROSITY'/ + data aname(2)/' DECAY RATE'/ + data aname(3)/' HEAT CAPACITY OF SOLIDS'/ + data aname(4)/' DENSITY OF SOLIDS'/ + ! + ! -- initialize + isfound = .false. + lname(:) = .false. + ! + ! -- get griddata block + call this%parser%GetBlock('GRIDDATA', isfound, ierr) + if (isfound) then + write (this%iout, '(1x,a)') 'PROCESSING GRIDDATA' + do + call this%parser%GetNextLine(endOfBlock) + if (endOfBlock) exit + call this%parser%GetStringCaps(keyword) + call this%parser%GetRemainingLine(line) + lloc = 1 + select case (keyword) + case ('POROSITY') + call this%dis%read_grid_array(line, lloc, istart, istop, this%iout, & + this%parser%iuactive, this%porosity, & + aname(1)) + lname(1) = .true. + case ('DECAY') + if (this%idcy == 0) & + call mem_reallocate(this%decay, this%dis%nodes, 'DECAY', & + trim(this%memoryPath)) + call this%dis%read_grid_array(line, lloc, istart, istop, this%iout, & + this%parser%iuactive, this%decay, & + aname(2)) + lname(2) = .true. + case ('CPS') + call this%dis%read_grid_array(line, lloc, istart, istop, this%iout, & + this%parser%iuactive, this%cps, & + aname(3)) + lname(3) = .true. + case ('RHOS') + call this%dis%read_grid_array(line, lloc, istart, istop, this%iout, & + this%parser%iuactive, this%rhos, & + aname(4)) + lname(4) = .true. + case default + write (errmsg, '(a,a)') 'UNKNOWN GRIDDATA TAG: ', trim(keyword) + call store_error(errmsg) + call this%parser%StoreErrorUnit() + end select + end do + write (this%iout, '(1x,a)') 'END PROCESSING GRIDDATA' + else + write (errmsg, '(a)') 'REQUIRED GRIDDATA BLOCK NOT FOUND.' + call store_error(errmsg) + call this%parser%StoreErrorUnit() + end if + ! + ! -- Check for required porosity + if (.not. lname(1)) then + write (errmsg, '(a)') 'POROSITY NOT SPECIFIED IN GRIDDATA BLOCK.' + call store_error(errmsg) + end if + if (.not. lname(3)) then + write (errmsg, '(a)') 'CPS NOT SPECIFIED IN GRIDDATA BLOCK.' + call store_error(errmsg) + end if + if (.not. lname(4)) then + write (errmsg, '(a)') 'RHOS NOT SPECIFIED IN GRIDDATA BLOCK.' + call store_error(errmsg) + end if + ! + ! -- Check for required decay/production rate coefficients + if (this%idcy > 0) then + if (.not. lname(2)) then + write (errmsg, '(a)') 'FIRST OR ZERO ORDER DECAY IS & + &ACTIVE BUT THE FIRST RATE COEFFICIENT IS NOT SPECIFIED. DECAY & + &MUST BE SPECIFIED IN GRIDDATA BLOCK.' + call store_error(errmsg) + end if + else + if (lname(2)) then + write (warnmsg, '(a)') 'FIRST OR ZERO ORER DECAY & + &IS NOT ACTIVE BUT DECAY WAS SPECIFIED. DECAY WILL & + &HAVE NO AFFECT ON SIMULATION RESULTS.' + call store_warning(warnmsg) + write (this%iout, '(1x,a)') 'WARNING. '//warnmsg + end if + end if + ! + ! -- terminate if errors + if (count_errors() > 0) then + call this%parser%StoreErrorUnit() + end if + ! + ! -- Return + return + end subroutine read_data + + !> @ brief Read data for package + !! + !! Method to read data for the package. + !< + subroutine read_packagedata(this) + ! -- modules + ! -- dummy + class(GweEstType) :: this !< GweEstType object + ! -- local + logical :: isfound + logical :: endOfBlock + integer(I4B) :: ierr + ! + call this%parser%GetBlock('PACKAGEDATA', isfound, ierr, & + supportopenclose=.true.) + ! + ! -- parse locations block if detected + if (isfound) then + write (this%iout, '(/1x,a)') 'PROCESSING '//trim(adjustl(this%packName))// & + ' PACKAGEDATA' + do + call this%parser%GetNextLine(endOfBlock) + if (endOfBlock) then + exit + end if + ! + ! -- get fluid constants + this%cpw = this%parser%GetDouble() + this%rhow = this%parser%GetDouble() + end do + end if + ! + ! -- Return + return + end subroutine read_packagedata + + !> @ brief Calculate zero-order decay rate and constrain if necessary + !! + !! Function to calculate the zero-order decay rate from the user specified + !! decay rate. If the decay rate is positive, then the decay rate must + !! be constrained so that more energy is not removed than is available. + !! Without this constraint, negative temperatures could result from + !! zero-order decay (no freezing). + !< + function get_zero_order_decay(decay_rate_usr, decay_rate_last, kiter, & + cold, cnew, delt) result(decay_rate) + ! -- dummy + real(DP), intent(in) :: decay_rate_usr !< user-entered decay rate + real(DP), intent(in) :: decay_rate_last !< decay rate used for last iteration + integer(I4B), intent(in) :: kiter !< Picard iteration counter + real(DP), intent(in) :: cold !< temperature at end of last time step + real(DP), intent(in) :: cnew !< temperature at end of this time step + real(DP), intent(in) :: delt !< length of time step + ! -- Return + real(DP) :: decay_rate !< returned value for decay rate + ! + ! -- Return user rate if production, otherwise constrain, if necessary + if (decay_rate_usr < DZERO) then + ! + ! -- Production, no need to limit rate + decay_rate = decay_rate_usr + else + ! + ! -- Need to ensure decay does not result in negative + ! temperature, so reduce the rate if it would result in + ! removing more energy than is in the cell. ! kluge note: think through + if (kiter == 1) then + decay_rate = min(decay_rate_usr, cold / delt) ! kluge note: actually want to use rhow*cpw*cold and rhow*cpw*cnew for rates here and below + else + decay_rate = decay_rate_last + if (cnew < DZERO) then + decay_rate = decay_rate_last + cnew / delt + else if (cnew > cold) then + decay_rate = decay_rate_last + cnew / delt + end if + decay_rate = min(decay_rate_usr, decay_rate) + end if + decay_rate = max(decay_rate, DZERO) + end if + return + end function get_zero_order_decay + +end module GweEstModule diff --git a/src/Model/GroundWaterEnergy/gwe1ic1idm.f90 b/src/Model/GroundWaterEnergy/gwe1ic1idm.f90 new file mode 100644 index 00000000000..95dd79e256d --- /dev/null +++ b/src/Model/GroundWaterEnergy/gwe1ic1idm.f90 @@ -0,0 +1,79 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module GweIcInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public gwe_ic_param_definitions + public gwe_ic_aggregate_definitions + public gwe_ic_block_definitions + public GweIcParamFoundType + public gwe_ic_multi_package + + type GweIcParamFoundType + logical :: strt = .false. + end type GweIcParamFoundType + + logical :: gwe_ic_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + gweic_strt = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'IC', & ! subcomponent + 'GRIDDATA', & ! block + 'STRT', & ! tag name + 'STRT', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwe_ic_param_definitions(*) = & + [ & + gweic_strt & + ] + + type(InputParamDefinitionType), parameter :: & + gwe_ic_aggregate_definitions(*) = & + [ & + InputParamDefinitionType & + ( & + '', & ! component + '', & ! subcomponent + '', & ! block + '', & ! tag name + '', & ! fortran variable + '', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) & + ] + + type(InputBlockDefinitionType), parameter :: & + gwe_ic_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'GRIDDATA', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module GweIcInputModule diff --git a/src/Model/GroundWaterEnergy/gwe1idm.f90 b/src/Model/GroundWaterEnergy/gwe1idm.f90 new file mode 100644 index 00000000000..14d85843018 --- /dev/null +++ b/src/Model/GroundWaterEnergy/gwe1idm.f90 @@ -0,0 +1,196 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module GweNamInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public gwe_nam_param_definitions + public gwe_nam_aggregate_definitions + public gwe_nam_block_definitions + public GweNamParamFoundType + public gwe_nam_multi_package + + type GweNamParamFoundType + logical :: list = .false. + logical :: print_input = .false. + logical :: print_flows = .false. + logical :: save_flows = .false. + logical :: ftype = .false. + logical :: fname = .false. + logical :: pname = .false. + end type GweNamParamFoundType + + logical :: gwe_nam_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + gwenam_list = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'LIST', & ! tag name + 'LIST', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwenam_print_input = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_INPUT', & ! tag name + 'PRINT_INPUT', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwenam_print_flows = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_FLOWS', & ! tag name + 'PRINT_FLOWS', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwenam_save_flows = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'SAVE_FLOWS', & ! tag name + 'SAVE_FLOWS', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwenam_ftype = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'NAM', & ! subcomponent + 'PACKAGES', & ! block + 'FTYPE', & ! tag name + 'FTYPE', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwenam_fname = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'NAM', & ! subcomponent + 'PACKAGES', & ! block + 'FNAME', & ! tag name + 'FNAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwenam_pname = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'NAM', & ! subcomponent + 'PACKAGES', & ! block + 'PNAME', & ! tag name + 'PNAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwe_nam_param_definitions(*) = & + [ & + gwenam_list, & + gwenam_print_input, & + gwenam_print_flows, & + gwenam_save_flows, & + gwenam_ftype, & + gwenam_fname, & + gwenam_pname & + ] + + type(InputParamDefinitionType), parameter :: & + gwenam_packages = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'NAM', & ! subcomponent + 'PACKAGES', & ! block + 'PACKAGES', & ! tag name + 'PACKAGES', & ! fortran variable + 'RECARRAY FTYPE FNAME PNAME', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + gwe_nam_aggregate_definitions(*) = & + [ & + gwenam_packages & + ] + + type(InputBlockDefinitionType), parameter :: & + gwe_nam_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'PACKAGES', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module GweNamInputModule diff --git a/src/Model/GroundWaterEnergy/gwe1lke1.f90 b/src/Model/GroundWaterEnergy/gwe1lke1.f90 new file mode 100644 index 00000000000..46c932ffad8 --- /dev/null +++ b/src/Model/GroundWaterEnergy/gwe1lke1.f90 @@ -0,0 +1,1241 @@ +! -- Lake Energy Transport Module +! -- todo: what to do about reactions in lake? Decay? +! -- todo: save the lke temperatures into the lak aux variable? +! +! LAK flows (lakbudptr) index var LKT term Transport Type +!--------------------------------------------------------------------------------- + +! -- terms from LAK that will be handled by parent APT Package +! FLOW-JA-FACE idxbudfjf FLOW-JA-FACE cv2cv +! GWF (aux FLOW-AREA) idxbudgwf GWF cv2gwf +! STORAGE (aux VOLUME) idxbudsto none used for cv volumes +! FROM-MVR idxbudfmvr FROM-MVR q * cext = this%qfrommvr(:) +! TO-MVR idxbudtmvr TO-MVR q * cfeat + +! -- LAK terms +! RAINFALL idxbudrain RAINFALL q * crain +! EVAPORATION idxbudevap EVAPORATION cfeat null() !< pointer to shared gwe data used by multiple packages but set in mst + + integer(I4B), pointer :: idxbudrain => null() ! index of rainfall terms in flowbudptr + integer(I4B), pointer :: idxbudevap => null() ! index of evaporation terms in flowbudptr + integer(I4B), pointer :: idxbudroff => null() ! index of runoff terms in flowbudptr + integer(I4B), pointer :: idxbudiflw => null() ! index of inflow terms in flowbudptr + integer(I4B), pointer :: idxbudwdrl => null() ! index of withdrawal terms in flowbudptr + integer(I4B), pointer :: idxbudoutf => null() ! index of outflow terms in flowbudptr + integer(I4B), pointer :: idxbudlbcd => null() ! index of lakebed conduction terms in flowbudptr + + real(DP), dimension(:), pointer, contiguous :: temprain => null() ! rainfall temperature + real(DP), dimension(:), pointer, contiguous :: tempevap => null() ! evaporation temperature + real(DP), dimension(:), pointer, contiguous :: temproff => null() ! runoff temperature + real(DP), dimension(:), pointer, contiguous :: tempiflw => null() ! inflow temperature + + contains + + procedure :: bnd_da => lke_da + procedure :: allocate_scalars + procedure :: apt_allocate_arrays => lke_allocate_arrays + procedure :: find_apt_package => find_lke_package + procedure :: pak_fc_expanded => lke_fc_expanded + procedure :: pak_solve => lke_solve + procedure :: pak_get_nbudterms => lke_get_nbudterms + procedure :: pak_setup_budobj => lke_setup_budobj + procedure :: pak_fill_budobj => lke_fill_budobj + procedure :: lke_rain_term + procedure :: lke_evap_term + procedure :: lke_roff_term + procedure :: lke_iflw_term + procedure :: lke_wdrl_term + procedure :: lke_outf_term + procedure :: pak_df_obs => lke_df_obs + procedure :: pak_rp_obs => lke_rp_obs + procedure :: pak_bd_obs => lke_bd_obs + procedure :: pak_set_stressperiod => lke_set_stressperiod + + end type GweLkeType + +contains + + !> @brief Create a new lke package + !< + subroutine lke_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, & + fmi, eqnsclfac, gwecommon, dvt, dvu, dvua) + ! -- dummy + class(BndType), pointer :: packobj + integer(I4B), intent(in) :: id + integer(I4B), intent(in) :: ibcnum + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + character(len=*), intent(in) :: namemodel + character(len=*), intent(in) :: pakname + type(TspFmiType), pointer :: fmi + real(DP), intent(in), pointer :: eqnsclfac !< governing equation scale factor + type(GweInputDataType), intent(in), target :: gwecommon !< shared data container for use by multiple GWE packages + character(len=*), intent(in) :: dvt !< For GWE, set to "TEMPERATURE" in TspAptType + character(len=*), intent(in) :: dvu !< For GWE, set to "energy" in TspAptType + character(len=*), intent(in) :: dvua !< For GWE, set to "E" in TspAptType + ! -- local + type(GweLkeType), pointer :: lkeobj + ! + ! -- Allocate the object and assign values to object variables + allocate (lkeobj) + packobj => lkeobj + ! + ! -- Create name and memory path + call packobj%set_names(ibcnum, namemodel, pakname, ftype) + packobj%text = text + ! + ! -- Allocate scalars + call lkeobj%allocate_scalars() + ! + ! -- Initialize package + call packobj%pack_initialize() + ! + packobj%inunit = inunit + packobj%iout = iout + packobj%id = id + packobj%ibcnum = ibcnum + packobj%ncolbnd = 1 + packobj%iscloc = 1 + ! + ! -- Store pointer to flow model interface. When the GwfGwe exchange is + ! created, it sets fmi%bndlist so that the GWE model has access to all + ! the flow packages + lkeobj%fmi => fmi + ! + ! -- Store pointer to governing equation scale factor + lkeobj%eqnsclfac => eqnsclfac + ! + ! -- Store pointer to shared data module for accessing cpw, rhow + ! for the budget calculations, and for accessing the latent heat of + ! vaporization for evaporative cooling. + lkeobj%gwecommon => gwecommon + ! + ! -- Set labels that will be used in generalized APT class + lkeobj%depvartype = dvt + lkeobj%depvarunit = dvu + lkeobj%depvarunitabbrev = dvua + ! + ! -- Return + return + end subroutine lke_create + + !> @brief Find corresponding lke package + !< + subroutine find_lke_package(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweLkeType) :: this + ! -- local + character(len=LINELENGTH) :: errmsg + class(BndType), pointer :: packobj + integer(I4B) :: ip, icount + integer(I4B) :: nbudterm + logical :: found + ! + ! -- Initialize found to false, and error later if flow package cannot + ! be found + found = .false. + ! + ! -- If user is specifying flows in a binary budget file, then set up + ! the budget file reader, otherwise set a pointer to the flow package + ! budobj + if (this%fmi%flows_from_file) then + call this%fmi%set_aptbudobj_pointer(this%flowpackagename, this%flowbudptr) + if (associated(this%flowbudptr)) found = .true. + ! + else + if (associated(this%fmi%gwfbndlist)) then + ! -- Look through gwfbndlist for a flow package with the same name as + ! this transport package name + do ip = 1, this%fmi%gwfbndlist%Count() + packobj => GetBndFromList(this%fmi%gwfbndlist, ip) + if (packobj%packName == this%flowpackagename) then + found = .true. + ! + ! -- Store BndType pointer to packobj, and then + ! use the select type to point to the budobj in flow package + this%flowpackagebnd => packobj + select type (packobj) + type is (LakType) + this%flowbudptr => packobj%budobj + end select + end if + if (found) exit + end do + end if + end if + ! + ! -- Error if flow package not found + if (.not. found) then + write (errmsg, '(a)') 'COULD NOT FIND FLOW PACKAGE WITH NAME '& + &//trim(adjustl(this%flowpackagename))//'.' + call store_error(errmsg) + call this%parser%StoreErrorUnit() + end if + ! + ! -- Allocate space for idxbudssm, which indicates whether this is a + ! special budget term or one that is a general source and sink + nbudterm = this%flowbudptr%nbudterm + call mem_allocate(this%idxbudssm, nbudterm, 'IDXBUDSSM', this%memoryPath) + ! + ! -- Process budget terms and identify special budget terms + write (this%iout, '(/, a, a)') & + 'PROCESSING '//ftype//' INFORMATION FOR ', this%packName + write (this%iout, '(a)') ' IDENTIFYING FLOW TERMS IN '//flowtype//' PACKAGE' + write (this%iout, '(a, i0)') & + ' NUMBER OF '//flowtype//' = ', this%flowbudptr%ncv + icount = 1 + do ip = 1, this%flowbudptr%nbudterm + select case (trim(adjustl(this%flowbudptr%budterm(ip)%flowtype))) + case ('FLOW-JA-FACE') + this%idxbudfjf = ip + this%idxbudssm(ip) = 0 + case ('GWF') + this%idxbudgwf = ip + this%idxbudlbcd = ip + this%idxbudssm(ip) = 0 + case ('STORAGE') + this%idxbudsto = ip + this%idxbudssm(ip) = 0 + case ('RAINFALL') + this%idxbudrain = ip + this%idxbudssm(ip) = 0 + case ('EVAPORATION') + this%idxbudevap = ip + this%idxbudssm(ip) = 0 + case ('RUNOFF') + this%idxbudroff = ip + this%idxbudssm(ip) = 0 + case ('EXT-INFLOW') + this%idxbudiflw = ip + this%idxbudssm(ip) = 0 + case ('WITHDRAWAL') + this%idxbudwdrl = ip + this%idxbudssm(ip) = 0 + case ('EXT-OUTFLOW') + this%idxbudoutf = ip + this%idxbudssm(ip) = 0 + case ('TO-MVR') + this%idxbudtmvr = ip + this%idxbudssm(ip) = 0 + case ('FROM-MVR') + this%idxbudfmvr = ip + this%idxbudssm(ip) = 0 + case ('AUXILIARY') + this%idxbudaux = ip + this%idxbudssm(ip) = 0 + case default + ! + ! -- Set idxbudssm equal to a column index for where the temperatures + ! are stored in the tempbud(nbudssm, ncv) array + this%idxbudssm(ip) = icount + icount = icount + 1 + end select + write (this%iout, '(a, i0, " = ", a,/, a, i0)') & + ' TERM ', ip, trim(adjustl(this%flowbudptr%budterm(ip)%flowtype)), & + ' MAX NO. OF ENTRIES = ', this%flowbudptr%budterm(ip)%maxlist + end do + write (this%iout, '(a, //)') 'DONE PROCESSING '//ftype//' INFORMATION' + ! + ! -- Return + return + end subroutine find_lke_package + + !> @brief Add matrix terms related to LKE + !! + !! This will be called from TspAptType%apt_fc_expanded() + !! in order to add matrix terms specifically for LKE + !< + subroutine lke_fc_expanded(this, rhs, ia, idxglo, matrix_sln) + ! -- dummy + class(GweLkeType) :: this + real(DP), dimension(:), intent(inout) :: rhs + integer(I4B), dimension(:), intent(in) :: ia + integer(I4B), dimension(:), intent(in) :: idxglo + class(MatrixBaseType), pointer :: matrix_sln + ! -- local + integer(I4B) :: j, n, n1, n2 + integer(I4B) :: iloc + integer(I4B) :: iposd, iposoffd + integer(I4B) :: ipossymd, ipossymoffd + integer(I4B) :: auxpos + real(DP) :: rrate + real(DP) :: rhsval + real(DP) :: hcofval + real(DP) :: ctherm !< thermal conductance + real(DP) :: wa !< wetted area + real(DP) :: ktf !< thermal conductivity of streambed material + real(DP) :: s !< thickness of conductive streambed material + ! + ! -- Add rainfall contribution + if (this%idxbudrain /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudrain)%nlist + call this%lke_rain_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) + iposd = this%idxpakdiag(n1) + call matrix_sln%add_value_pos(iposd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add evaporation contribution + if (this%idxbudevap /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudevap)%nlist + call this%lke_evap_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) + iposd = this%idxpakdiag(n1) + call matrix_sln%add_value_pos(iposd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add runoff contribution + if (this%idxbudroff /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudroff)%nlist + call this%lke_roff_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) + iposd = this%idxpakdiag(n1) + call matrix_sln%add_value_pos(iposd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add inflow contribution + if (this%idxbudiflw /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudiflw)%nlist + call this%lke_iflw_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) + iposd = this%idxpakdiag(n1) + call matrix_sln%add_value_pos(iposd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add withdrawal contribution + if (this%idxbudwdrl /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudwdrl)%nlist + call this%lke_wdrl_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) + iposd = this%idxpakdiag(n1) + call matrix_sln%add_value_pos(iposd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add outflow contribution + if (this%idxbudoutf /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudoutf)%nlist + call this%lke_outf_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) + iposd = this%idxpakdiag(n1) + call matrix_sln%add_value_pos(iposd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add lakebed conduction contribution + do j = 1, this%flowbudptr%budterm(this%idxbudgwf)%nlist + ! + ! -- Set n to feature number and process if active feature + n = this%flowbudptr%budterm(this%idxbudgwf)%id1(j) + if (this%iboundpak(n) /= 0) then + ! + ! -- Set acoef and rhs to negative so they are relative to sfe and not gwe + auxpos = this%flowbudptr%budterm(this%idxbudgwf)%naux + wa = this%flowbudptr%budterm(this%idxbudgwf)%auxvar(auxpos, j) + ktf = this%ktf(n) + s = this%rfeatthk(n) + ctherm = ktf * wa / s + ! + ! -- Add to sfe row + iposd = this%idxdglo(j) + iposoffd = this%idxoffdglo(j) + call matrix_sln%add_value_pos(iposd, -ctherm) ! kluge note: make sure the signs on ctherm are correct here and below + call matrix_sln%add_value_pos(iposoffd, ctherm) + ! + ! -- Add to gwe row for sfe connection + ipossymd = this%idxsymdglo(j) + ipossymoffd = this%idxsymoffdglo(j) + call matrix_sln%add_value_pos(ipossymd, -ctherm) + call matrix_sln%add_value_pos(ipossymoffd, ctherm) + end if + end do + ! + ! -- Return + return + end subroutine lke_fc_expanded + + !> @brief Add terms specific to lakes to the explicit lake solve + !< + subroutine lke_solve(this) + ! -- dummy + class(GweLkeType) :: this + ! -- local + integer(I4B) :: j + integer(I4B) :: n1, n2 + real(DP) :: rrate + ! + ! -- Add rainfall contribution + if (this%idxbudrain /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudrain)%nlist + call this%lke_rain_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Add evaporation contribution + if (this%idxbudevap /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudevap)%nlist + call this%lke_evap_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Add runoff contribution + if (this%idxbudroff /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudroff)%nlist + call this%lke_roff_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Add inflow contribution + if (this%idxbudiflw /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudiflw)%nlist + call this%lke_iflw_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Add withdrawal contribution + if (this%idxbudwdrl /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudwdrl)%nlist + call this%lke_wdrl_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Add outflow contribution + if (this%idxbudoutf /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudoutf)%nlist + call this%lke_outf_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Return + return + end subroutine lke_solve + + !> @brief Function to return the number of budget terms just for this package. + !! + !! This overrides a function in the parent class. + !< + function lke_get_nbudterms(this) result(nbudterms) + ! -- dummy + class(GweLkeType) :: this + ! -- Return + integer(I4B) :: nbudterms + ! + ! -- Number of budget terms is 7 + ! 1) rainfall + ! 2) evap + ! 3) runoff + ! 4) ext-inflow + ! 5) withdrawl + ! 6) ext-outflow + ! 7) lakebed-cond + ! + nbudterms = 7 + ! + ! -- Return + return + end function lke_get_nbudterms + + !> @brief Set up the budget object that stores all the lake flows + !< + subroutine lke_setup_budobj(this, idx) + ! -- modules + use ConstantsModule, only: LENBUDTXT + ! -- dummy + class(GweLkeType) :: this + integer(I4B), intent(inout) :: idx + ! -- local + integer(I4B) :: n, n1, n2 + integer(I4B) :: maxlist, naux + real(DP) :: q + character(len=LENBUDTXT) :: text + ! + ! -- Addition of heat associated with rainfall directly on the lake surface + text = ' RAINFALL' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudrain)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + ! + ! -- Evaporative cooling from lake surface + text = ' EVAPORATION' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudevap)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + ! + ! -- Addition of heat associated with runoff that flows to the lake + text = ' RUNOFF' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudroff)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + ! + ! -- Addition of heat associated with user-specified inflow to the lake + text = ' EXT-INFLOW' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudiflw)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + ! + ! -- Removal of heat associated with user-specified withdrawal from lake + text = ' WITHDRAWAL' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudwdrl)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + ! + ! -- Removal of heat associated with outflow from lake that leaves + ! model domain + text = ' EXT-OUTFLOW' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudoutf)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + ! + ! -- Conductive exchange of heat through the wetted lakebed + text = ' LAKEBED-COND' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudlbcd)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + call this%budobj%budterm(idx)%reset(maxlist) + q = DZERO + do n = 1, maxlist + n1 = this%flowbudptr%budterm(this%idxbudgwf)%id1(n) + n2 = this%flowbudptr%budterm(this%idxbudgwf)%id2(n) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + end do + ! + ! -- Return + return + end subroutine lke_setup_budobj + + !> @brief Copy flow terms into this%budobj + !< + subroutine lke_fill_budobj(this, idx, x, flowja, ccratin, ccratout) + ! -- dummy + class(GweLkeType) :: this + integer(I4B), intent(inout) :: idx + real(DP), dimension(:), intent(in) :: x + real(DP), dimension(:), contiguous, intent(inout) :: flowja + real(DP), intent(inout) :: ccratin + real(DP), intent(inout) :: ccratout + ! -- local + integer(I4B) :: j, n1, n2 + integer(I4B) :: nlist + integer(I4B) :: igwfnode + integer(I4B) :: idiag + integer(I4B) :: auxpos + real(DP) :: q + real(DP) :: ctherm !< thermal conductance + real(DP) :: wa !< wetted area + real(DP) :: ktf !< thermal conductivity of streambed material + real(DP) :: s !< thickness of conductive streambed materia + ! + ! -- Rain + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudrain)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%lke_rain_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + end do + ! + ! -- Evaporation + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudevap)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%lke_evap_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + end do + ! + ! -- Runoff + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudroff)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%lke_roff_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + end do + ! + ! -- Est-Inflow + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudiflw)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%lke_iflw_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + end do + ! + ! -- Withdrawal + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudwdrl)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%lke_wdrl_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + end do + ! + ! -- Ext-Outflow + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudoutf)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%lke_outf_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + end do + ! + ! -- Lakebed-Cond + idx = idx + 1 + call this%budobj%budterm(idx)%reset(this%maxbound) + do j = 1, this%flowbudptr%budterm(this%idxbudlbcd)%nlist + q = DZERO + n1 = this%flowbudptr%budterm(this%idxbudlbcd)%id1(j) + if (this%iboundpak(n1) /= 0) then + igwfnode = this%flowbudptr%budterm(this%idxbudlbcd)%id2(j) + auxpos = this%flowbudptr%budterm(this%idxbudgwf)%naux ! for now there is only 1 aux variable under 'GWF' + wa = this%flowbudptr%budterm(this%idxbudgwf)%auxvar(auxpos, j) + ktf = this%ktf(n1) + s = this%rfeatthk(n1) + ctherm = ktf * wa / s + q = ctherm * (x(igwfnode) - this%xnewpak(n1)) + end if + call this%budobj%budterm(idx)%update_term(n1, igwfnode, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + if (this%iboundpak(n1) /= 0) then + ! -- Contribution to gwe cell budget + this%simvals(n1) = this%simvals(n1) - q + idiag = this%dis%con%ia(igwfnode) + flowja(idiag) = flowja(idiag) - q + end if + end do + ! + ! -- Return + return + end subroutine lke_fill_budobj + + !> @brief Allocate scalars specific to the lake energy transport (LKE) + !! package. + !< + subroutine allocate_scalars(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweLkeType) :: this + ! + ! -- Allocate scalars in TspAptType + call this%TspAptType%allocate_scalars() + ! + ! -- Allocate + call mem_allocate(this%idxbudrain, 'IDXBUDRAIN', this%memoryPath) + call mem_allocate(this%idxbudevap, 'IDXBUDEVAP', this%memoryPath) + call mem_allocate(this%idxbudroff, 'IDXBUDROFF', this%memoryPath) + call mem_allocate(this%idxbudiflw, 'IDXBUDIFLW', this%memoryPath) + call mem_allocate(this%idxbudwdrl, 'IDXBUDWDRL', this%memoryPath) + call mem_allocate(this%idxbudoutf, 'IDXBUDOUTF', this%memoryPath) + call mem_allocate(this%idxbudlbcd, 'IDXBUDLBCD', this%memoryPath) + ! + ! -- Initialize + this%idxbudrain = 0 + this%idxbudevap = 0 + this%idxbudroff = 0 + this%idxbudiflw = 0 + this%idxbudwdrl = 0 + this%idxbudoutf = 0 + this%idxbudlbcd = 0 + ! + ! -- Return + return + end subroutine allocate_scalars + + !> @brief Allocate arrays specific to the lake energy transport (LKE) + !! package. + !< + subroutine lke_allocate_arrays(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweLkeType), intent(inout) :: this + ! -- local + integer(I4B) :: n + ! + ! -- Time series + call mem_allocate(this%temprain, this%ncv, 'TEMPRAIN', this%memoryPath) + call mem_allocate(this%tempevap, this%ncv, 'TEMPEVAP', this%memoryPath) + call mem_allocate(this%temproff, this%ncv, 'TEMPROFF', this%memoryPath) + call mem_allocate(this%tempiflw, this%ncv, 'TEMPIFLW', this%memoryPath) + ! + ! -- Call standard TspAptType allocate arrays + call this%TspAptType%apt_allocate_arrays() + ! + ! -- Initialize + do n = 1, this%ncv + this%temprain(n) = DZERO + this%tempevap(n) = DZERO + this%temproff(n) = DZERO + this%tempiflw(n) = DZERO + end do + ! + ! + ! -- Return + return + end subroutine lke_allocate_arrays + + !> @brief Deallocate memory + !< + subroutine lke_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + ! -- dummy + class(GweLkeType) :: this + ! + ! -- Deallocate scalars + call mem_deallocate(this%idxbudrain) + call mem_deallocate(this%idxbudevap) + call mem_deallocate(this%idxbudroff) + call mem_deallocate(this%idxbudiflw) + call mem_deallocate(this%idxbudwdrl) + call mem_deallocate(this%idxbudoutf) + call mem_deallocate(this%idxbudlbcd) + ! + ! -- Deallocate time series + call mem_deallocate(this%temprain) + call mem_deallocate(this%tempevap) + call mem_deallocate(this%temproff) + call mem_deallocate(this%tempiflw) + ! + ! -- Deallocate scalars in TspAptType + call this%TspAptType%bnd_da() + ! + ! -- Return + return + end subroutine lke_da + + !> @brief Rain term + !< + subroutine lke_rain_term(this, ientry, n1, n2, rrate, & + rhsval, hcofval) + ! -- dummy + class(GweLkeType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + ! + n1 = this%flowbudptr%budterm(this%idxbudrain)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudrain)%id2(ientry) + qbnd = this%flowbudptr%budterm(this%idxbudrain)%flow(ientry) + ctmp = this%temprain(n1) + if (present(rrate)) rrate = ctmp * qbnd * this%eqnsclfac + if (present(rhsval)) rhsval = -rrate + if (present(hcofval)) hcofval = DZERO + ! + ! -- Return + return + end subroutine lke_rain_term + + !> @brief Evaporative term + !< + subroutine lke_evap_term(this, ientry, n1, n2, rrate, & + rhsval, hcofval) + ! -- dummy + class(GweLkeType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: heatlat + ! + n1 = this%flowbudptr%budterm(this%idxbudevap)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudevap)%id2(ientry) + ! -- Note that qbnd is negative for evap + qbnd = this%flowbudptr%budterm(this%idxbudevap)%flow(ientry) + heatlat = this%gwecommon%gwerhow * this%gwecommon%gwelatheatvap + if (present(rrate)) rrate = qbnd * heatlat + if (present(rhsval)) rhsval = -rrate + if (present(hcofval)) hcofval = DZERO + ! + ! -- Return + return + end subroutine lke_evap_term + + !> @brief Runoff term + !< + subroutine lke_roff_term(this, ientry, n1, n2, rrate, & + rhsval, hcofval) + ! -- dummy + class(GweLkeType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + ! + n1 = this%flowbudptr%budterm(this%idxbudroff)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudroff)%id2(ientry) + qbnd = this%flowbudptr%budterm(this%idxbudroff)%flow(ientry) + ctmp = this%temproff(n1) + if (present(rrate)) rrate = ctmp * qbnd * this%eqnsclfac + if (present(rhsval)) rhsval = -rrate + if (present(hcofval)) hcofval = DZERO + ! + ! -- Return + return + end subroutine lke_roff_term + + !> @brief Inflow Term + !! + !! Accounts for energy flowing into a lake from a connected stream, for + !! example. + !< + subroutine lke_iflw_term(this, ientry, n1, n2, rrate, & + rhsval, hcofval) + ! -- dummy + class(GweLkeType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + ! + n1 = this%flowbudptr%budterm(this%idxbudiflw)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudiflw)%id2(ientry) + qbnd = this%flowbudptr%budterm(this%idxbudiflw)%flow(ientry) + ctmp = this%tempiflw(n1) + if (present(rrate)) rrate = ctmp * qbnd * this%eqnsclfac + if (present(rhsval)) rhsval = -rrate + if (present(hcofval)) hcofval = DZERO + ! + ! -- Return + return + end subroutine lke_iflw_term + + !> @brief Specified withdrawal term + !! + !! Accounts for energy associated with a withdrawal of water from a lake + !! or group of lakes. + !< + subroutine lke_wdrl_term(this, ientry, n1, n2, rrate, & + rhsval, hcofval) + ! -- dummy + class(GweLkeType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + ! + n1 = this%flowbudptr%budterm(this%idxbudwdrl)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudwdrl)%id2(ientry) + qbnd = this%flowbudptr%budterm(this%idxbudwdrl)%flow(ientry) + ctmp = this%xnewpak(n1) + if (present(rrate)) rrate = ctmp * qbnd * this%eqnsclfac + if (present(rhsval)) rhsval = DZERO + if (present(hcofval)) hcofval = qbnd * this%eqnsclfac + ! + ! -- Return + return + end subroutine lke_wdrl_term + + !> @brief Outflow term + !! + !! Accounts for the energy leaving a lake, for example, energy exiting a + !! lake via a flow into a draining stream channel. + !< + subroutine lke_outf_term(this, ientry, n1, n2, rrate, & + rhsval, hcofval) + ! -- dummy + class(GweLkeType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + ! + n1 = this%flowbudptr%budterm(this%idxbudoutf)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudoutf)%id2(ientry) + qbnd = this%flowbudptr%budterm(this%idxbudoutf)%flow(ientry) + ctmp = this%xnewpak(n1) + if (present(rrate)) rrate = ctmp * qbnd * this%eqnsclfac + if (present(rhsval)) rhsval = DZERO + if (present(hcofval)) hcofval = qbnd * this%eqnsclfac + ! + ! -- Return + return + end subroutine lke_outf_term + + !> @brief Defined observation types + !! + !! Store the observation type supported by the APT package and overide + !! BndType%bnd_df_obs + !< + subroutine lke_df_obs(this) + ! -- dummy + class(GweLkeType) :: this + ! -- local + integer(I4B) :: indx + ! + ! -- Store obs type and assign procedure pointer + ! for temperature observation type. + call this%obs%StoreObsType('temperature', .false., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for flow between features, such as lake to lake. + call this%obs%StoreObsType('flow-ja-face', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID12 + ! + ! -- Store obs type and assign procedure pointer + ! for from-mvr observation type. + call this%obs%StoreObsType('from-mvr', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for to-mvr observation type. + call this%obs%StoreObsType('to-mvr', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for storage observation type. + call this%obs%StoreObsType('storage', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for constant observation type. + call this%obs%StoreObsType('constant', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for observation type: lke + call this%obs%StoreObsType('lke', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for rainfall observation type. + call this%obs%StoreObsType('rainfall', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for evaporation observation type. + call this%obs%StoreObsType('evaporation', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for runoff observation type. + call this%obs%StoreObsType('runoff', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for inflow observation type. + call this%obs%StoreObsType('ext-inflow', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for withdrawal observation type. + call this%obs%StoreObsType('withdrawal', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for ext-outflow observation type. + call this%obs%StoreObsType('ext-outflow', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Return + return + end subroutine lke_df_obs + + !> @brief Process package specific obs + !! + !! Method to process specific observations for this package. + !< + subroutine lke_rp_obs(this, obsrv, found) + ! -- dummy + class(GweLkeType), intent(inout) :: this !< package class + type(ObserveType), intent(inout) :: obsrv !< observation object + logical, intent(inout) :: found !< indicate whether observation was found + ! + found = .true. + select case (obsrv%ObsTypeId) + case ('RAINFALL') + call this%rp_obs_byfeature(obsrv) + case ('EVAPORATION') + call this%rp_obs_byfeature(obsrv) + case ('RUNOFF') + call this%rp_obs_byfeature(obsrv) + case ('EXT-INFLOW') + call this%rp_obs_byfeature(obsrv) + case ('WITHDRAWAL') + call this%rp_obs_byfeature(obsrv) + case ('EXT-OUTFLOW') + call this%rp_obs_byfeature(obsrv) + case ('TO-MVR') + call this%rp_obs_budterm(obsrv, & + this%flowbudptr%budterm(this%idxbudtmvr)) + case default + found = .false. + end select + ! + ! -- Return + return + end subroutine lke_rp_obs + + !> @brief Calculate observation value and pass it back to APT + !< + subroutine lke_bd_obs(this, obstypeid, jj, v, found) + ! -- dummy + class(GweLkeType), intent(inout) :: this + character(len=*), intent(in) :: obstypeid + real(DP), intent(inout) :: v + integer(I4B), intent(in) :: jj + logical, intent(inout) :: found + ! -- local + integer(I4B) :: n1, n2 + ! + found = .true. + select case (obstypeid) + case ('RAINFALL') + if (this%iboundpak(jj) /= 0) then + call this%lke_rain_term(jj, n1, n2, v) + end if + case ('EVAPORATION') + if (this%iboundpak(jj) /= 0) then + call this%lke_evap_term(jj, n1, n2, v) + end if + case ('RUNOFF') + if (this%iboundpak(jj) /= 0) then + call this%lke_roff_term(jj, n1, n2, v) + end if + case ('EXT-INFLOW') + if (this%iboundpak(jj) /= 0) then + call this%lke_iflw_term(jj, n1, n2, v) + end if + case ('WITHDRAWAL') + if (this%iboundpak(jj) /= 0) then + call this%lke_wdrl_term(jj, n1, n2, v) + end if + case ('EXT-OUTFLOW') + if (this%iboundpak(jj) /= 0) then + call this%lke_outf_term(jj, n1, n2, v) + end if + case default + found = .false. + end select + ! + ! -- Return + return + end subroutine lke_bd_obs + + !> @brief Sets the stress period attributes for keyword use. + !< + subroutine lke_set_stressperiod(this, itemno, keyword, found) + ! -- modules + use TimeSeriesManagerModule, only: read_value_or_time_series_adv + ! -- dummy + class(GweLkeType), intent(inout) :: this + integer(I4B), intent(in) :: itemno + character(len=*), intent(in) :: keyword + logical, intent(inout) :: found + ! -- local + character(len=LINELENGTH) :: text + integer(I4B) :: ierr + integer(I4B) :: jj + real(DP), pointer :: bndElem => null() + ! + ! RAINFALL + ! EVAPORATION + ! RUNOFF + ! EXT-INFLOW + ! WITHDRAWAL + ! + found = .true. + select case (keyword) + case ('RAINFALL') + ierr = this%apt_check_valid(itemno) + if (ierr /= 0) then + goto 999 + end if + call this%parser%GetString(text) + jj = 1 + bndElem => this%temprain(itemno) + call read_value_or_time_series_adv(text, itemno, jj, bndElem, & + this%packName, 'BND', this%tsManager, & + this%iprpak, 'RAINFALL') + case ('EVAPORATION') + ierr = this%apt_check_valid(itemno) + if (ierr /= 0) then + goto 999 + end if + call this%parser%GetString(text) + jj = 1 + bndElem => this%tempevap(itemno) + call read_value_or_time_series_adv(text, itemno, jj, bndElem, & + this%packName, 'BND', this%tsManager, & + this%iprpak, 'EVAPORATION') + case ('RUNOFF') + ierr = this%apt_check_valid(itemno) + if (ierr /= 0) then + goto 999 + end if + call this%parser%GetString(text) + jj = 1 + bndElem => this%temproff(itemno) + call read_value_or_time_series_adv(text, itemno, jj, bndElem, & + this%packName, 'BND', this%tsManager, & + this%iprpak, 'RUNOFF') + case ('EXT-INFLOW') + ierr = this%apt_check_valid(itemno) + if (ierr /= 0) then + goto 999 + end if + call this%parser%GetString(text) + jj = 1 + bndElem => this%tempiflw(itemno) + call read_value_or_time_series_adv(text, itemno, jj, bndElem, & + this%packName, 'BND', this%tsManager, & + this%iprpak, 'EXT-INFLOW') + case default + ! + ! -- Keyword not recognized so return to caller with found = .false. + found = .false. + end select + ! +999 continue + ! + ! -- Return + return + end subroutine lke_set_stressperiod + +end module GweLkeModule diff --git a/src/Model/GroundWaterEnergy/gwe1mwe1.f90 b/src/Model/GroundWaterEnergy/gwe1mwe1.f90 new file mode 100644 index 00000000000..4b6bb76a38d --- /dev/null +++ b/src/Model/GroundWaterEnergy/gwe1mwe1.f90 @@ -0,0 +1,1018 @@ +! -- Multi-Aquifer Well Energy Transport Module +! -- todo: save the mwe temperature into the mwe aux variable? +! -- todo: calculate the maw DENSE aux variable using temperature? +! +! MAW flows (flowbudptr) index var MWE term Transport Type +!--------------------------------------------------------------------------------- + +! -- terms from MAW that will be handled by parent APT Package +! FLOW-JA-FACE idxbudfjf FLOW-JA-FACE cv2cv (note that this doesn't exist for MAW) +! GWF (aux FLOW-AREA) idxbudgwf GWF cv2gwf +! STORAGE (aux VOLUME) idxbudsto none used for cv volumes +! FROM-MVR idxbudfmvr FROM-MVR q * text = this%qfrommvr(:) +! TO-MVR idxbudtmvr TO-MVR q * tfeat + +! -- MAW terms +! RATE idxbudrate RATE q < 0: q * twell, else q * tuser +! FW-RATE idxbudfwrt FW-RATE q * twell +! RATE-TO-MVR idxbudrtmv RATE-TO-MVR q * twell +! FW-RATE-TO-MVR idxbudfrtm FW-RATE-TO-MVR q * twell +! WELL-AQUIFER CONDUCTION idxbudmwcd MW-CONDUCTION K_t_f * WetArea / thickness + +! -- terms from MAW that should be skipped +! CONSTANT-TO-MVR ? CONSTANT-TO-MVR q * twell + +! -- terms from a flow file that should be skipped +! CONSTANT none none none +! AUXILIARY none none none + +! -- terms that are written to the energy transport budget file +! none none STORAGE (aux ENER) dE/dt +! none none AUXILIARY none +! none none CONSTANT accumulate +! +! +module GweMweModule + + use KindModule, only: DP, I4B + use ConstantsModule, only: DZERO, LINELENGTH + use SimModule, only: store_error + use BndModule, only: BndType, GetBndFromList + use TspFmiModule, only: TspFmiType + use MawModule, only: MawType + use ObserveModule, only: ObserveType + use TspAptModule, only: TspAptType, apt_process_obsID, & + apt_process_obsID12 + use GweInputDataModule, only: GweInputDataType + use MatrixBaseModule + + implicit none + + public mwe_create + + character(len=*), parameter :: ftype = 'MWE' + character(len=*), parameter :: flowtype = 'MAW' + character(len=16) :: text = ' MWE' + + type, extends(TspAptType) :: GweMweType + + type(GweInputDataType), pointer :: gwecommon => null() !< pointer to shared gwe data used by multiple packages but set in mst + + integer(I4B), pointer :: idxbudrate => null() ! index of well rate terms in flowbudptr + integer(I4B), pointer :: idxbudfwrt => null() ! index of flowing well rate terms in flowbudptr + integer(I4B), pointer :: idxbudrtmv => null() ! index of rate to mover terms in flowbudptr + integer(I4B), pointer :: idxbudfrtm => null() ! index of flowing well rate to mover terms in flowbudptr + integer(I4B), pointer :: idxbudmwcd => null() ! index of well bore conduction terms in flowbudptr + real(DP), dimension(:), pointer, contiguous :: temprate => null() ! well rate temperature + + contains + + procedure :: bnd_da => mwe_da + procedure :: allocate_scalars + procedure :: apt_allocate_arrays => mwe_allocate_arrays + procedure :: find_apt_package => find_mwe_package + procedure :: pak_fc_expanded => mwe_fc_expanded + procedure :: pak_solve => mwe_solve + procedure :: pak_get_nbudterms => mwe_get_nbudterms + procedure :: pak_setup_budobj => mwe_setup_budobj + procedure :: pak_fill_budobj => mwe_fill_budobj + procedure :: mwe_rate_term + procedure :: mwe_fwrt_term + procedure :: mwe_rtmv_term + procedure :: mwe_frtm_term + procedure :: pak_df_obs => mwe_df_obs + procedure :: pak_rp_obs => mwe_rp_obs + procedure :: pak_bd_obs => mwe_bd_obs + procedure :: pak_set_stressperiod => mwe_set_stressperiod + + end type GweMweType + +contains + + !> Create new MWE package + !< + subroutine mwe_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, & + fmi, eqnsclfac, gwecommon, dvt, dvu, dvua) + ! -- dummy + class(BndType), pointer :: packobj + integer(I4B), intent(in) :: id + integer(I4B), intent(in) :: ibcnum + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + character(len=*), intent(in) :: namemodel + character(len=*), intent(in) :: pakname + type(TspFmiType), pointer :: fmi + real(DP), intent(in), pointer :: eqnsclfac !< governing equation scale factor + type(GweInputDataType), intent(in), target :: gwecommon !< shared data container for use by multiple GWE packages + character(len=*), intent(in) :: dvt !< For GWE, set to "TEMPERATURE" in TspAptType + character(len=*), intent(in) :: dvu !< For GWE, set to "energy" in TspAptType + character(len=*), intent(in) :: dvua !< For GWE, set to "E" in TspAptType + ! -- local + type(GweMweType), pointer :: mweobj + ! + ! -- Allocate the object and assign values to object variables + allocate (mweobj) + packobj => mweobj + ! + ! -- Create name and memory path + call packobj%set_names(ibcnum, namemodel, pakname, ftype) + packobj%text = text + ! + ! -- Allocate scalars + call mweobj%allocate_scalars() + ! + ! -- Initialize package + call packobj%pack_initialize() + ! + packobj%inunit = inunit + packobj%iout = iout + packobj%id = id + packobj%ibcnum = ibcnum + packobj%ncolbnd = 1 + packobj%iscloc = 1 + ! + ! -- Store pointer to flow model interface. When the GwfGwe exchange is + ! created, it sets fmi%bndlist so that the GWE model has access to all + ! the flow packages + mweobj%fmi => fmi + ! + ! -- Store pointer to governing equation scale factor + mweobj%eqnsclfac => eqnsclfac + ! + ! -- Store pointer to shared data module for accessing cpw, rhow + ! for the budget calculations, and for accessing the latent heat of + ! vaporization for evaporative cooling. + mweobj%gwecommon => gwecommon + ! + ! -- Set labels that will be used in generalized APT class + mweobj%depvartype = dvt + mweobj%depvarunit = dvu + mweobj%depvarunitabbrev = dvua + ! + ! -- Return + return + end subroutine mwe_create + + !> @brief Find corresponding mwe package + !< + subroutine find_mwe_package(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweMweType) :: this + ! -- local + character(len=LINELENGTH) :: errmsg + class(BndType), pointer :: packobj + integer(I4B) :: ip, icount + integer(I4B) :: nbudterm + logical :: found + ! + ! -- Initialize found to false, and error later if flow package cannot + ! be found + found = .false. + ! + ! -- If user is specifying flows in a binary budget file, then set up + ! the budget file reader, otherwise set a pointer to the flow package + ! budobj + if (this%fmi%flows_from_file) then + call this%fmi%set_aptbudobj_pointer(this%flowpackagename, this%flowbudptr) + if (associated(this%flowbudptr)) found = .true. + ! + else + if (associated(this%fmi%gwfbndlist)) then + ! -- Look through gwfbndlist for a flow package with the same name as + ! this transport package name + do ip = 1, this%fmi%gwfbndlist%Count() + packobj => GetBndFromList(this%fmi%gwfbndlist, ip) + if (packobj%packName == this%flowpackagename) then + found = .true. + ! + ! -- Store BndType pointer to packobj, and then + ! use the select type to point to the budobj in flow package + this%flowpackagebnd => packobj + select type (packobj) + type is (MawType) + this%flowbudptr => packobj%budobj + end select + end if + if (found) exit + end do + end if + end if + ! + ! -- Error if flow package not found + if (.not. found) then + write (errmsg, '(a)') 'COULD NOT FIND FLOW PACKAGE WITH NAME '& + &//trim(adjustl(this%flowpackagename))//'.' + call store_error(errmsg) + call this%parser%StoreErrorUnit() + end if + ! + ! -- Allocate space for idxbudssm, which indicates whether this is a + ! special budget term or one that is a general source and sink + nbudterm = this%flowbudptr%nbudterm + call mem_allocate(this%idxbudssm, nbudterm, 'IDXBUDSSM', this%memoryPath) + ! + ! -- Process budget terms and identify special budget terms + write (this%iout, '(/, a, a)') & + 'PROCESSING '//ftype//' INFORMATION FOR ', this%packName + write (this%iout, '(a)') ' IDENTIFYING FLOW TERMS IN '//flowtype//' PACKAGE' + write (this%iout, '(a, i0)') & + ' NUMBER OF '//flowtype//' = ', this%flowbudptr%ncv + icount = 1 + do ip = 1, this%flowbudptr%nbudterm + select case (trim(adjustl(this%flowbudptr%budterm(ip)%flowtype))) + case ('FLOW-JA-FACE') + this%idxbudfjf = ip + this%idxbudssm(ip) = 0 + case ('GWF') + this%idxbudgwf = ip + this%idxbudssm(ip) = 0 + case ('STORAGE') + this%idxbudsto = ip + this%idxbudssm(ip) = 0 + case ('RATE') + this%idxbudrate = ip + this%idxbudssm(ip) = 0 + case ('FW-RATE') + this%idxbudfwrt = ip + this%idxbudssm(ip) = 0 + case ('RATE-TO-MVR') + this%idxbudrtmv = ip + this%idxbudssm(ip) = 0 + case ('FW-RATE-TO-MVR') + this%idxbudfrtm = ip + this%idxbudssm(ip) = 0 + case ('TO-MVR') + this%idxbudtmvr = ip + this%idxbudssm(ip) = 0 + case ('FROM-MVR') + this%idxbudfmvr = ip + this%idxbudssm(ip) = 0 + case ('AUXILIARY') + this%idxbudaux = ip + this%idxbudssm(ip) = 0 + case default + ! + ! -- Set idxbudssm equal to a column index for where the tempeartures + ! are stored in the tempbud(nbudssm, ncv) array + this%idxbudssm(ip) = icount + icount = icount + 1 + end select + write (this%iout, '(a, i0, " = ", a,/, a, i0)') & + ' TERM ', ip, trim(adjustl(this%flowbudptr%budterm(ip)%flowtype)), & + ' MAX NO. OF ENTRIES = ', this%flowbudptr%budterm(ip)%maxlist + end do + write (this%iout, '(a, //)') 'DONE PROCESSING '//ftype//' INFORMATION' + ! + ! -- Streambed conduction term + this%idxbudmwcd = this%idxbudgwf + ! + ! -- Return + return + end subroutine find_mwe_package + + !> @brief Add matrix terms related to MWE + !! + !! This routine is called from TspAptType%apt_fc_expanded() in + !! order to add matrix terms specifically for MWE + !< + subroutine mwe_fc_expanded(this, rhs, ia, idxglo, matrix_sln) + ! -- dummy + class(GweMweType) :: this + real(DP), dimension(:), intent(inout) :: rhs + integer(I4B), dimension(:), intent(in) :: ia + integer(I4B), dimension(:), intent(in) :: idxglo + class(MatrixBaseType), pointer :: matrix_sln + ! -- local + integer(I4B) :: j, n, n1, n2 + integer(I4B) :: iloc + integer(I4B) :: iposd, iposoffd + integer(I4B) :: ipossymd, ipossymoffd + integer(I4B) :: auxpos + real(DP) :: rrate + real(DP) :: rhsval + real(DP) :: hcofval + real(DP) :: ctherm ! kluge? + real(DP) :: wa !< wetted area + real(DP) :: ktf !< thermal conductivity of streambed material + real(DP) :: s !< thickness of conductive wellbore material + ! + ! -- Add puping rate contribution + if (this%idxbudrate /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudrate)%nlist + call this%mwe_rate_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) + iposd = this%idxpakdiag(n1) + call matrix_sln%add_value_pos(iposd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add flowing well rate contribution + if (this%idxbudfwrt /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudfwrt)%nlist + call this%mwe_fwrt_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) + iposd = this%idxpakdiag(n1) + call matrix_sln%add_value_pos(iposd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add rate to mover contribution + if (this%idxbudrtmv /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudrtmv)%nlist + call this%mwe_rtmv_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) + iposd = this%idxpakdiag(n1) + call matrix_sln%add_value_pos(iposd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add puping rate contribution + if (this%idxbudfrtm /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudfrtm)%nlist + call this%mwe_frtm_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) + iposd = this%idxpakdiag(n1) + call matrix_sln%add_value_pos(iposd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add wellbore conduction contribution + do j = 1, this%flowbudptr%budterm(this%idxbudgwf)%nlist + ! + ! -- Set n to feature number and process if active features + n = this%flowbudptr%budterm(this%idxbudgwf)%id1(j) + if (this%iboundpak(n) /= 0) then + ! + ! -- Set acoef and rhs to negative so they are relative to mwe and not gwe + auxpos = this%flowbudptr%budterm(this%idxbudgwf)%naux + wa = this%flowbudptr%budterm(this%idxbudgwf)%auxvar(auxpos, j) + ktf = this%ktf(n) + s = this%rfeatthk(n) + ctherm = ktf * wa / s + ! + ! -- Add to mwe row + iposd = this%idxdglo(j) + iposoffd = this%idxoffdglo(j) + call matrix_sln%add_value_pos(iposd, -ctherm) ! kluge note: make sure the signs on ctherm are correct here and below + call matrix_sln%add_value_pos(iposoffd, ctherm) + ! + ! -- Add to gwe row for mwe connection + ipossymd = this%idxsymdglo(j) + ipossymoffd = this%idxsymoffdglo(j) + call matrix_sln%add_value_pos(ipossymd, -ctherm) + call matrix_sln%add_value_pos(ipossymoffd, ctherm) + end if + end do + ! + ! -- Return + return + end subroutine mwe_fc_expanded + + !> @brief Add terms specific to multi-aquifer wells to the explicit multi- + !! aquifer well energy transport solve + !< + subroutine mwe_solve(this) + ! -- dummy + class(GweMweType) :: this + ! -- local + integer(I4B) :: j + integer(I4B) :: n1, n2 + real(DP) :: rrate + ! + ! -- Add well pumping contribution + if (this%idxbudrate /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudrate)%nlist + call this%mwe_rate_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Add flowing well rate contribution + if (this%idxbudfwrt /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudfwrt)%nlist + call this%mwe_fwrt_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Add well pumping rate to mover contribution + if (this%idxbudrtmv /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudrtmv)%nlist + call this%mwe_rtmv_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Add flowing well rate to mover contribution + if (this%idxbudfrtm /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudfrtm)%nlist + call this%mwe_frtm_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Return + return + end subroutine mwe_solve + + !> @brief Function to return the number of budget terms just for this package + !! + !! This overrides a function in the parent class. + !< + function mwe_get_nbudterms(this) result(nbudterms) + ! -- dummy + class(GweMweType) :: this + ! -- return + integer(I4B) :: nbudterms + ! + ! -- Number of potential budget terms is 5 + nbudterms = 1 ! RATE + if (this%idxbudfwrt /= 0) nbudterms = nbudterms + 1 + if (this%idxbudrtmv /= 0) nbudterms = nbudterms + 1 + if (this%idxbudfrtm /= 0) nbudterms = nbudterms + 1 + if (this%idxbudmwcd /= 0) nbudterms = nbudterms + 1 + ! + ! -- Return + return + end function mwe_get_nbudterms + + !> @brief Set up the budget object that stores all the mwe flows + !< + subroutine mwe_setup_budobj(this, idx) + ! -- modules + use ConstantsModule, only: LENBUDTXT + ! -- dummy + class(GweMweType) :: this + integer(I4B), intent(inout) :: idx + ! -- local + integer(I4B) :: n, n1, n2 + integer(I4B) :: maxlist, naux + real(DP) :: q + character(len=LENBUDTXT) :: text + ! + ! -- User-specified rate + text = ' RATE' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudrate)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + ! + ! -- Flowing well rate + if (this%idxbudfwrt /= 0) then + text = ' FW-RATE' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudfwrt)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + end if + ! + ! -- User-specified flow rate to mover + if (this%idxbudrtmv /= 0) then + text = ' RATE-TO-MVR' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudrtmv)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + end if + ! + ! -- Fflowing well rate to mover + if (this%idxbudfrtm /= 0) then + text = ' FW-RATE-TO-MVR' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudfrtm)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + end if + ! + ! -- Conduction through wellbore (and/or filter pack) + text = ' WELLBORE-COND' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudmwcd)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + call this%budobj%budterm(idx)%reset(maxlist) + q = DZERO + do n = 1, maxlist + n1 = this%flowbudptr%budterm(this%idxbudgwf)%id1(n) + n2 = this%flowbudptr%budterm(this%idxbudgwf)%id2(n) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + end do + ! + ! -- Return + return + end subroutine mwe_setup_budobj + + !> @brief Copy flow terms into this%budobj + !< + subroutine mwe_fill_budobj(this, idx, x, flowja, ccratin, ccratout) + ! -- dummy + class(GweMweType) :: this + integer(I4B), intent(inout) :: idx + real(DP), dimension(:), intent(in) :: x + real(DP), dimension(:), contiguous, intent(inout) :: flowja + real(DP), intent(inout) :: ccratin + real(DP), intent(inout) :: ccratout + ! -- local + integer(I4B) :: j, n1, n2 + integer(I4B) :: nlist + integer(I4B) :: igwfnode + integer(I4B) :: idiag + integer(I4B) :: auxpos + real(DP) :: q + real(DP) :: ctherm + real(DP) :: wa !< wetted area + real(DP) :: ktf !< thermal conductivity of streambed material + real(DP) :: s !< thickness of conductive streambed materia + ! + ! -- Rate + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudrate)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%mwe_rate_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + end do + ! + ! -- FW-Rate + if (this%idxbudfwrt /= 0) then + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudfwrt)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%mwe_fwrt_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + end do + end if + ! + ! -- Rate-To-MVR + if (this%idxbudrtmv /= 0) then + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudrtmv)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%mwe_rtmv_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + end do + end if + ! + ! -- FW-Rate-To-MVR + if (this%idxbudfrtm /= 0) then + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudfrtm)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%mwe_frtm_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + end do + end if + ! + ! -- Wellbore-Cond + idx = idx + 1 + call this%budobj%budterm(idx)%reset(this%maxbound) + do j = 1, this%flowbudptr%budterm(this%idxbudmwcd)%nlist + q = DZERO + n1 = this%flowbudptr%budterm(this%idxbudmwcd)%id1(j) + if (this%iboundpak(n1) /= 0) then + igwfnode = this%flowbudptr%budterm(this%idxbudmwcd)%id2(j) + auxpos = this%flowbudptr%budterm(this%idxbudgwf)%naux + wa = this%flowbudptr%budterm(this%idxbudgwf)%auxvar(auxpos, j) + ktf = this%ktf(n1) + s = this%rfeatthk(n1) + ctherm = ktf * wa / s + q = ctherm * (x(igwfnode) - this%xnewpak(n1)) + end if + call this%budobj%budterm(idx)%update_term(n1, igwfnode, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + if (this%iboundpak(n1) /= 0) then + ! -- Contribution to gwe cell budget + this%simvals(j) = this%simvals(j) - q + idiag = this%dis%con%ia(igwfnode) + flowja(idiag) = flowja(idiag) - q + end if + end do + ! + ! -- Return + return + end subroutine mwe_fill_budobj + + !> @brief Allocate scalars specific to the multi-aquifer well energy + !! transport (MWE) package. + !< + subroutine allocate_scalars(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweMweType) :: this + ! + ! -- Allocate scalars in TspAptType + call this%TspAptType%allocate_scalars() + ! + ! -- Allocate + call mem_allocate(this%idxbudrate, 'IDXBUDRATE', this%memoryPath) + call mem_allocate(this%idxbudfwrt, 'IDXBUDFWRT', this%memoryPath) + call mem_allocate(this%idxbudrtmv, 'IDXBUDRTMV', this%memoryPath) + call mem_allocate(this%idxbudfrtm, 'IDXBUDFRTM', this%memoryPath) + call mem_allocate(this%idxbudmwcd, 'IDXBUDMWCD', this%memoryPath) + ! + ! -- Initialize + this%idxbudrate = 0 + this%idxbudfwrt = 0 + this%idxbudrtmv = 0 + this%idxbudfrtm = 0 + this%idxbudmwcd = 0 + ! + ! -- Return + return + end subroutine allocate_scalars + + !> @brief Allocate arrays specific to the streamflow mass transport (SFT) + !! package + !< + subroutine mwe_allocate_arrays(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweMweType), intent(inout) :: this + ! -- local + integer(I4B) :: n + ! + ! -- Time series + call mem_allocate(this%temprate, this%ncv, 'TEMPRATE', this%memoryPath) + ! + ! -- Call standard TspAptType allocate arrays + call this%TspAptType%apt_allocate_arrays() + ! + ! -- Initialize + do n = 1, this%ncv + this%temprate(n) = DZERO + end do + ! + ! -- Return + return + end subroutine mwe_allocate_arrays + + !> @brief Deallocate memory associated with MWE package + !< + subroutine mwe_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + ! -- dummy + class(GweMweType) :: this + ! + ! -- Deallocate scalars + call mem_deallocate(this%idxbudrate) + call mem_deallocate(this%idxbudfwrt) + call mem_deallocate(this%idxbudrtmv) + call mem_deallocate(this%idxbudfrtm) + call mem_deallocate(this%idxbudmwcd) + ! + ! -- Deallocate time series + call mem_deallocate(this%temprate) + ! + ! -- Deallocate scalars in TspAptType + call this%TspAptType%bnd_da() + ! + ! -- Return + return + end subroutine mwe_da + + !> @brief Thermal transport matrix term(s) associcated with a user-specified + !! flow rate (mwe_rate_term) + !< + subroutine mwe_rate_term(this, ientry, n1, n2, rrate, rhsval, hcofval) + ! -- dummy + class(GweMweType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + real(DP) :: h, r + ! + n1 = this%flowbudptr%budterm(this%idxbudrate)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudrate)%id2(ientry) + ! -- Note that qbnd is negative for an extracting well + qbnd = this%flowbudptr%budterm(this%idxbudrate)%flow(ientry) + if (qbnd < DZERO) then + ctmp = this%xnewpak(n1) + h = qbnd + r = DZERO + else + ctmp = this%temprate(n1) + h = DZERO + r = -qbnd * ctmp + end if + if (present(rrate)) rrate = qbnd * ctmp * this%eqnsclfac + if (present(rhsval)) rhsval = r * this%eqnsclfac + if (present(hcofval)) hcofval = h * this%eqnsclfac + ! + ! -- Return + return + end subroutine mwe_rate_term + + !> @brief Thermal transport matrix term(s) associcated with a flowing- + !! well rate term associated with pumping (or injection) + !< + subroutine mwe_fwrt_term(this, ientry, n1, n2, rrate, rhsval, hcofval) + ! -- dummy + class(GweMweType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + ! + n1 = this%flowbudptr%budterm(this%idxbudfwrt)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudfwrt)%id2(ientry) + qbnd = this%flowbudptr%budterm(this%idxbudfwrt)%flow(ientry) + ctmp = this%xnewpak(n1) + if (present(rrate)) rrate = ctmp * qbnd * this%eqnsclfac + if (present(rhsval)) rhsval = DZERO + if (present(hcofval)) hcofval = qbnd * this%eqnsclfac + ! + ! -- Return + return + end subroutine mwe_fwrt_term + + !> @brief Thermal transport matrix term(s) associcated with pumped-water- + !! to-mover term (mwe_rtmv_term) + !< + subroutine mwe_rtmv_term(this, ientry, n1, n2, rrate, rhsval, hcofval) + ! -- dummy + class(GweMweType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + ! + n1 = this%flowbudptr%budterm(this%idxbudrtmv)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudrtmv)%id2(ientry) + qbnd = this%flowbudptr%budterm(this%idxbudrtmv)%flow(ientry) + ctmp = this%xnewpak(n1) + if (present(rrate)) rrate = ctmp * qbnd * this%eqnsclfac + if (present(rhsval)) rhsval = DZERO + if (present(hcofval)) hcofval = qbnd * this%eqnsclfac + ! + ! -- Return + return + end subroutine mwe_rtmv_term + + !> @brief Thermal transport matrix term(s) associcated with the flowing- + !! well-rate-to-mover term (mwe_frtm_term) + !< + subroutine mwe_frtm_term(this, ientry, n1, n2, rrate, rhsval, hcofval) + ! -- dummy + class(GweMweType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + ! + n1 = this%flowbudptr%budterm(this%idxbudfrtm)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudfrtm)%id2(ientry) + qbnd = this%flowbudptr%budterm(this%idxbudfrtm)%flow(ientry) + ctmp = this%xnewpak(n1) + if (present(rrate)) rrate = ctmp * qbnd * this%eqnsclfac + if (present(rhsval)) rhsval = DZERO + if (present(hcofval)) hcofval = qbnd * this%eqnsclfac + ! + ! -- Return + return + end subroutine mwe_frtm_term + + !> @brief Observations + !! + !! Store the observation type supported by the APT package and overide + !! BndType%bnd_df_obs + !< + subroutine mwe_df_obs(this) + ! -- dummy + class(GweMweType) :: this + ! -- local + integer(I4B) :: indx + ! + ! -- Store obs type and assign procedure pointer + ! for temperature observation type. + call this%obs%StoreObsType('temperature', .false., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Flow-ja-face not supported for MWE + !call this%obs%StoreObsType('flow-ja-face', .true., indx) + !this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for from-mvr observation type. + call this%obs%StoreObsType('from-mvr', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- To-mvr not supported for mwe + !call this%obs%StoreObsType('to-mvr', .true., indx) + !this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for storage observation type. + call this%obs%StoreObsType('storage', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for constant observation type. + call this%obs%StoreObsType('constant', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for observation type: mwe + call this%obs%StoreObsType('mwe', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID12 + ! + ! -- Store obs type and assign procedure pointer + ! for rate observation type. + call this%obs%StoreObsType('rate', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for observation type. + call this%obs%StoreObsType('fw-rate', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for observation type. + call this%obs%StoreObsType('rate-to-mvr', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for observation type. + call this%obs%StoreObsType('fw-rate-to-mvr', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Return + return + end subroutine mwe_df_obs + + !> @brief Process package specific obs + !! + !! Method to process specific observations for this package. + !< + subroutine mwe_rp_obs(this, obsrv, found) + ! -- dummy + class(GweMweType), intent(inout) :: this !< package class + type(ObserveType), intent(inout) :: obsrv !< observation object + logical, intent(inout) :: found !< indicate whether observation was found + ! + found = .true. + select case (obsrv%ObsTypeId) + case ('RATE') + call this%rp_obs_byfeature(obsrv) + case ('FW-RATE') + call this%rp_obs_byfeature(obsrv) + case ('RATE-TO-MVR') + call this%rp_obs_byfeature(obsrv) + case ('FW-RATE-TO-MVR') + call this%rp_obs_byfeature(obsrv) + case default + found = .false. + end select + ! + ! -- Return + return + end subroutine mwe_rp_obs + + !> @brief Calculate observation value and pass it back to APT + !< + subroutine mwe_bd_obs(this, obstypeid, jj, v, found) + ! -- dummy + class(GweMweType), intent(inout) :: this + character(len=*), intent(in) :: obstypeid + real(DP), intent(inout) :: v + integer(I4B), intent(in) :: jj + logical, intent(inout) :: found + ! -- local + integer(I4B) :: n1, n2 + ! + found = .true. + select case (obstypeid) + case ('RATE') + if (this%iboundpak(jj) /= 0) then + call this%mwe_rate_term(jj, n1, n2, v) + end if + case ('FW-RATE') + if (this%iboundpak(jj) /= 0 .and. this%idxbudfwrt > 0) then + call this%mwe_fwrt_term(jj, n1, n2, v) + end if + case ('RATE-TO-MVR') + if (this%iboundpak(jj) /= 0 .and. this%idxbudrtmv > 0) then + call this%mwe_rtmv_term(jj, n1, n2, v) + end if + case ('FW-RATE-TO-MVR') + if (this%iboundpak(jj) /= 0 .and. this%idxbudfrtm > 0) then + call this%mwe_frtm_term(jj, n1, n2, v) + end if + case default + found = .false. + end select + ! + ! -- Return + return + end subroutine mwe_bd_obs + + !> @brief Sets the stress period attributes for keyword use. + !< + subroutine mwe_set_stressperiod(this, itemno, keyword, found) + ! -- modules + use TimeSeriesManagerModule, only: read_value_or_time_series_adv + ! -- dummy + class(GweMweType), intent(inout) :: this + integer(I4B), intent(in) :: itemno + character(len=*), intent(in) :: keyword + logical, intent(inout) :: found + ! -- local + character(len=LINELENGTH) :: text + integer(I4B) :: ierr + integer(I4B) :: jj + real(DP), pointer :: bndElem => null() + ! + ! RATE + ! + found = .true. + select case (keyword) + case ('RATE') + ierr = this%apt_check_valid(itemno) + if (ierr /= 0) then + goto 999 + end if + call this%parser%GetString(text) + jj = 1 + bndElem => this%temprate(itemno) + call read_value_or_time_series_adv(text, itemno, jj, bndElem, & + this%packName, 'BND', this%tsManager, & + this%iprpak, 'RATE') + case default + ! + ! -- Keyword not recognized so return to caller with found = .false. + found = .false. + end select + ! +999 continue + ! + ! -- Return + return + end subroutine mwe_set_stressperiod + +end module GweMweModule diff --git a/src/Model/GroundWaterEnergy/gwe1sfe1.f90 b/src/Model/GroundWaterEnergy/gwe1sfe1.f90 new file mode 100644 index 00000000000..e2e514d1d11 --- /dev/null +++ b/src/Model/GroundWaterEnergy/gwe1sfe1.f90 @@ -0,0 +1,1149 @@ +! -- Stream Energy Transport Module +! -- todo: Temperature decay? +! -- todo: save the sfe temperature into the sfr aux variable? (perhaps needed for GWT-GWE exchanges) +! -- todo: calculate the sfr VISC aux variable using temperature? +! +! SFR flows (sfrbudptr) index var SFE term Transport Type +!--------------------------------------------------------------------------------- + +! -- terms from SFR that will be handled by parent APT Package +! FLOW-JA-FACE idxbudfjf FLOW-JA-FACE cv2cv +! GWF (aux FLOW-AREA) idxbudgwf GWF cv2gwf +! STORAGE (aux VOLUME) idxbudsto none used for cv volumes +! FROM-MVR idxbudfmvr FROM-MVR q * tmpext = this%qfrommvr(:) ! kluge note: include rhow*cpw in comments for various terms +! TO-MVR idxbudtmvr TO-MVR q * tfeat + +! -- SFR terms +! RAINFALL idxbudrain RAINFALL q * train +! EVAPORATION idxbudevap EVAPORATION tfeat null() !< pointer to shared gwe data used by multiple packages but set in mst + + integer(I4B), pointer :: idxbudrain => null() !< index of rainfall terms in flowbudptr + integer(I4B), pointer :: idxbudevap => null() !< index of evaporation terms in flowbudptr + integer(I4B), pointer :: idxbudroff => null() !< index of runoff terms in flowbudptr + integer(I4B), pointer :: idxbudiflw => null() !< index of inflow terms in flowbudptr + integer(I4B), pointer :: idxbudoutf => null() !< index of outflow terms in flowbudptr + integer(I4B), pointer :: idxbudsbcd => null() !< index of streambed conduction terms in flowbudptr + + real(DP), dimension(:), pointer, contiguous :: temprain => null() !< rainfall temperature + real(DP), dimension(:), pointer, contiguous :: tempevap => null() !< evaporation temperature + real(DP), dimension(:), pointer, contiguous :: temproff => null() !< runoff temperature + real(DP), dimension(:), pointer, contiguous :: tempiflw => null() !< inflow temperature + + contains + + procedure :: bnd_da => sfe_da + procedure :: allocate_scalars + procedure :: apt_allocate_arrays => sfe_allocate_arrays + procedure :: find_apt_package => find_sfe_package + procedure :: pak_fc_expanded => sfe_fc_expanded + procedure :: pak_solve => sfe_solve + procedure :: pak_get_nbudterms => sfe_get_nbudterms + procedure :: pak_setup_budobj => sfe_setup_budobj + procedure :: pak_fill_budobj => sfe_fill_budobj + procedure :: sfe_rain_term + procedure :: sfe_evap_term + procedure :: sfe_roff_term + procedure :: sfe_iflw_term + procedure :: sfe_outf_term + procedure :: pak_df_obs => sfe_df_obs + procedure :: pak_rp_obs => sfe_rp_obs + procedure :: pak_bd_obs => sfe_bd_obs + procedure :: pak_set_stressperiod => sfe_set_stressperiod + + end type GweSfeType + +contains + + !> @brief Create a new sfe package + !< + subroutine sfe_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, & + fmi, eqnsclfac, gwecommon, dvt, dvu, dvua) + ! -- dummy + class(BndType), pointer :: packobj + integer(I4B), intent(in) :: id + integer(I4B), intent(in) :: ibcnum + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + character(len=*), intent(in) :: namemodel + character(len=*), intent(in) :: pakname + type(TspFmiType), pointer :: fmi + real(DP), intent(in), pointer :: eqnsclfac !< Governing equation scale factor + type(GweInputDataType), intent(in), target :: gwecommon !< Shared data container for use by multiple GWE packages + character(len=*), intent(in) :: dvt !< For GWE, set to "TEMPERATURE" in TspAptType + character(len=*), intent(in) :: dvu !< For GWE, set to "energy" in TspAptType + character(len=*), intent(in) :: dvua !< For GWE, set to "E" in TspAptType + ! -- local + type(GweSfeType), pointer :: sfeobj + ! + ! -- Allocate the object and assign values to object variables + allocate (sfeobj) + packobj => sfeobj + ! + ! -- Create name and memory path + call packobj%set_names(ibcnum, namemodel, pakname, ftype) + packobj%text = text + ! + ! -- Allocate scalars + call sfeobj%allocate_scalars() + ! + ! -- Initialize package + call packobj%pack_initialize() + ! + packobj%inunit = inunit + packobj%iout = iout + packobj%id = id + packobj%ibcnum = ibcnum + packobj%ncolbnd = 1 + packobj%iscloc = 1 + ! + ! -- Store pointer to flow model interface. When the GwfGwt exchange is + ! created, it sets fmi%bndlist so that the GWT model has access to all + ! the flow packages + sfeobj%fmi => fmi + ! + ! -- Store pointer to governing equation scale factor + sfeobj%eqnsclfac => eqnsclfac + ! + ! -- Store pointer to shared data module for accessing cpw, rhow + ! for the budget calculations, and for accessing the latent heat of + ! vaporization for evaporative cooling. + sfeobj%gwecommon => gwecommon + ! + ! -- Set labels that will be used in generalized APT class + sfeobj%depvartype = dvt + sfeobj%depvarunit = dvu + sfeobj%depvarunitabbrev = dvua + ! + ! -- Return + return + end subroutine sfe_create + + !> @brief Find corresponding sfe package + !< + subroutine find_sfe_package(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweSfeType) :: this + ! -- local + character(len=LINELENGTH) :: errmsg + class(BndType), pointer :: packobj + integer(I4B) :: ip, icount + integer(I4B) :: nbudterm + logical :: found + ! + ! -- Initialize found to false, and error later if flow package cannot + ! be found + found = .false. + ! + ! -- If user is specifying flows in a binary budget file, then set up + ! the budget file reader, otherwise set a pointer to the flow package + ! budobj + if (this%fmi%flows_from_file) then + call this%fmi%set_aptbudobj_pointer(this%flowpackagename, this%flowbudptr) + if (associated(this%flowbudptr)) found = .true. + ! + else + if (associated(this%fmi%gwfbndlist)) then + ! -- Look through gwfbndlist for a flow package with the same name as + ! this transport package name + do ip = 1, this%fmi%gwfbndlist%Count() + packobj => GetBndFromList(this%fmi%gwfbndlist, ip) + if (packobj%packName == this%flowpackagename) then + found = .true. + ! + ! -- Store BndType pointer to packobj, and then + ! use the select type to point to the budobj in flow package + this%flowpackagebnd => packobj + select type (packobj) + type is (SfrType) + this%flowbudptr => packobj%budobj + end select + end if + if (found) exit + end do + end if + end if + ! + ! -- Error if flow package not found + if (.not. found) then + write (errmsg, '(a)') 'COULD NOT FIND FLOW PACKAGE WITH NAME '& + &//trim(adjustl(this%flowpackagename))//'.' + call store_error(errmsg) + call this%parser%StoreErrorUnit() + end if + ! + ! -- Allocate space for idxbudssm, which indicates whether this is a + ! special budget term or one that is a general source and sink + nbudterm = this%flowbudptr%nbudterm + call mem_allocate(this%idxbudssm, nbudterm, 'IDXBUDSSM', this%memoryPath) + ! + ! -- Process budget terms and identify special budget terms + write (this%iout, '(/, a, a)') & + 'PROCESSING '//ftype//' INFORMATION FOR ', this%packName + write (this%iout, '(a)') ' IDENTIFYING FLOW TERMS IN '//flowtype//' PACKAGE' + write (this%iout, '(a, i0)') & + ' NUMBER OF '//flowtype//' = ', this%flowbudptr%ncv + icount = 1 + do ip = 1, this%flowbudptr%nbudterm + select case (trim(adjustl(this%flowbudptr%budterm(ip)%flowtype))) + case ('FLOW-JA-FACE') + this%idxbudfjf = ip + this%idxbudssm(ip) = 0 + case ('GWF') + this%idxbudgwf = ip + this%idxbudssm(ip) = 0 + case ('STORAGE') + this%idxbudsto = ip + this%idxbudssm(ip) = 0 + case ('RAINFALL') + this%idxbudrain = ip + this%idxbudssm(ip) = 0 + case ('EVAPORATION') + this%idxbudevap = ip + this%idxbudssm(ip) = 0 + case ('RUNOFF') + this%idxbudroff = ip + this%idxbudssm(ip) = 0 + case ('EXT-INFLOW') + this%idxbudiflw = ip + this%idxbudssm(ip) = 0 + case ('EXT-OUTFLOW') + this%idxbudoutf = ip + this%idxbudssm(ip) = 0 + case ('TO-MVR') + this%idxbudtmvr = ip + this%idxbudssm(ip) = 0 + case ('FROM-MVR') + this%idxbudfmvr = ip + this%idxbudssm(ip) = 0 + case ('AUXILIARY') + this%idxbudaux = ip + this%idxbudssm(ip) = 0 + case default + ! + ! -- Set idxbudssm equal to a column index for where the temperatures + ! are stored in the concbud(nbudssm, ncv) array + this%idxbudssm(ip) = icount + icount = icount + 1 + end select + write (this%iout, '(a, i0, " = ", a,/, a, i0)') & + ' TERM ', ip, trim(adjustl(this%flowbudptr%budterm(ip)%flowtype)), & + ' MAX NO. OF ENTRIES = ', this%flowbudptr%budterm(ip)%maxlist + end do + write (this%iout, '(a, //)') 'DONE PROCESSING '//ftype//' INFORMATION' + ! + ! -- Streambed conduction term + this%idxbudsbcd = this%idxbudgwf + ! + ! -- Return + return + end subroutine find_sfe_package + + !> @brief Add matrix terms related to SFE + !! + !! This will be called from TspAptType%apt_fc_expanded() + !! in order to add matrix terms specifically for SFE + !< + subroutine sfe_fc_expanded(this, rhs, ia, idxglo, matrix_sln) + ! -- dummy + class(GweSfeType) :: this + real(DP), dimension(:), intent(inout) :: rhs + integer(I4B), dimension(:), intent(in) :: ia + integer(I4B), dimension(:), intent(in) :: idxglo + class(MatrixBaseType), pointer :: matrix_sln + ! -- local + integer(I4B) :: j, n, n1, n2 + integer(I4B) :: iloc + integer(I4B) :: iposd, iposoffd + integer(I4B) :: ipossymd, ipossymoffd + integer(I4B) :: auxpos + real(DP) :: rrate + real(DP) :: rhsval + real(DP) :: hcofval + real(DP) :: ctherm + real(DP) :: wa !< wetted area + real(DP) :: ktf !< thermal conductivity of streambed material + real(DP) :: s !< thickness of conductive streambed material + ! + ! -- Add rainfall contribution + if (this%idxbudrain /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudrain)%nlist + call this%sfe_rain_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) + iposd = this%idxpakdiag(n1) + call matrix_sln%add_value_pos(iposd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add evaporation contribution + if (this%idxbudevap /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudevap)%nlist + call this%sfe_evap_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) + iposd = this%idxpakdiag(n1) + call matrix_sln%add_value_pos(iposd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add runoff contribution + if (this%idxbudroff /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudroff)%nlist + call this%sfe_roff_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) + iposd = this%idxpakdiag(n1) + call matrix_sln%add_value_pos(iposd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add inflow contribution + if (this%idxbudiflw /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudiflw)%nlist + call this%sfe_iflw_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) + iposd = this%idxpakdiag(n1) + call matrix_sln%add_value_pos(iposd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add outflow contribution + if (this%idxbudoutf /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudoutf)%nlist + call this%sfe_outf_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) + iposd = this%idxpakdiag(n1) + call matrix_sln%add_value_pos(iposd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add streambed conduction contribution + do j = 1, this%flowbudptr%budterm(this%idxbudgwf)%nlist + ! + ! -- Set n to feature number and process if active feature + n = this%flowbudptr%budterm(this%idxbudgwf)%id1(j) + if (this%iboundpak(n) /= 0) then + ! + ! -- Set acoef and rhs to negative so they are relative to sfe and not gwe + auxpos = this%flowbudptr%budterm(this%idxbudgwf)%naux + wa = this%flowbudptr%budterm(this%idxbudgwf)%auxvar(auxpos, j) + ktf = this%ktf(n) + s = this%rfeatthk(n) + ctherm = ktf * wa / s + ! + ! -- Add to sfe row + iposd = this%idxdglo(j) + iposoffd = this%idxoffdglo(j) + call matrix_sln%add_value_pos(iposd, -ctherm) + call matrix_sln%add_value_pos(iposoffd, ctherm) + ! + ! -- Add to gwe row for sfe connection + ipossymd = this%idxsymdglo(j) + ipossymoffd = this%idxsymoffdglo(j) + call matrix_sln%add_value_pos(ipossymd, -ctherm) + call matrix_sln%add_value_pos(ipossymoffd, ctherm) + end if + end do + ! + ! -- Return + return + end subroutine sfe_fc_expanded + + !> @ brief Add terms specific to sfr to the explicit sfe solve + !< + subroutine sfe_solve(this) + ! -- dummy + class(GweSfeType) :: this + ! -- local + integer(I4B) :: j + integer(I4B) :: n1, n2 + real(DP) :: rrate + ! + ! -- Add rainfall contribution + if (this%idxbudrain /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudrain)%nlist + call this%sfe_rain_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Add evaporation contribution + if (this%idxbudevap /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudevap)%nlist + call this%sfe_evap_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Add runoff contribution + if (this%idxbudroff /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudroff)%nlist + call this%sfe_roff_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Add inflow contribution + if (this%idxbudiflw /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudiflw)%nlist + call this%sfe_iflw_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Add outflow contribution + if (this%idxbudoutf /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudoutf)%nlist + call this%sfe_outf_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! Note: explicit streambed conduction terms??? + ! + ! -- Return + return + end subroutine sfe_solve + + !> @brief Function to return the number of budget terms just for this package. + !! + !! This overrides a function in the parent class. + !< + function sfe_get_nbudterms(this) result(nbudterms) + ! -- dummy + class(GweSfeType) :: this + ! -- return + integer(I4B) :: nbudterms + ! + ! -- Number of budget terms is 6: + ! 1. rainfall + ! 2. evaporation + ! 3. runoff + ! 4. ext-inflow + ! 5. ext-outflow + ! 6. streambed-cond + nbudterms = 6 + ! + ! -- Return + return + end function sfe_get_nbudterms + + !> @brief Set up the budget object that stores all the sfe flows + !< + subroutine sfe_setup_budobj(this, idx) + ! -- modules + use ConstantsModule, only: LENBUDTXT + ! -- dummy + class(GweSfeType) :: this + integer(I4B), intent(inout) :: idx + ! -- local + integer(I4B) :: n, n1, n2 + integer(I4B) :: maxlist, naux + real(DP) :: q + character(len=LENBUDTXT) :: text + ! + ! -- + text = ' RAINFALL' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudrain)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + ! + ! -- + text = ' EVAPORATION' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudevap)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + ! + ! -- + text = ' RUNOFF' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudroff)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + ! + ! -- + text = ' EXT-INFLOW' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudiflw)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + ! + ! -- + text = ' EXT-OUTFLOW' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudoutf)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + ! + ! -- Conduction through the wetted streambed + text = ' STREAMBED-COND' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudsbcd)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + call this%budobj%budterm(idx)%reset(maxlist) + q = DZERO + do n = 1, maxlist + n1 = this%flowbudptr%budterm(this%idxbudgwf)%id1(n) + n2 = this%flowbudptr%budterm(this%idxbudgwf)%id2(n) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + end do + ! + ! -- Return + return + end subroutine sfe_setup_budobj + + !> @brief Copy flow terms into this%budobj + !< + subroutine sfe_fill_budobj(this, idx, x, flowja, ccratin, ccratout) + ! -- dummy + class(GweSfeType) :: this + integer(I4B), intent(inout) :: idx + real(DP), dimension(:), intent(in) :: x + real(DP), dimension(:), contiguous, intent(inout) :: flowja + real(DP), intent(inout) :: ccratin + real(DP), intent(inout) :: ccratout + ! -- local + integer(I4B) :: j, n1, n2 + integer(I4B) :: nlist + integer(I4B) :: igwfnode + integer(I4B) :: idiag + integer(I4B) :: auxpos + real(DP) :: q + real(DP) :: ctherm + real(DP) :: wa !< wetted area + real(DP) :: ktf !< thermal conductivity of streambed material + real(DP) :: s !< thickness of conductive streambed materia + ! + ! -- Rain + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudrain)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%sfe_rain_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + end do + ! + ! -- Evaporation + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudevap)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%sfe_evap_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + end do + ! + ! -- Runoff + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudroff)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%sfe_roff_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + end do + ! + ! -- Ext-inflow + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudiflw)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%sfe_iflw_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + end do + ! + ! -- Ext-outflow + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudoutf)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%sfe_outf_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + end do + ! + ! -- Strmbd-cond + idx = idx + 1 + call this%budobj%budterm(idx)%reset(this%maxbound) + do j = 1, this%flowbudptr%budterm(this%idxbudsbcd)%nlist + q = DZERO + n1 = this%flowbudptr%budterm(this%idxbudsbcd)%id1(j) + if (this%iboundpak(n1) /= 0) then + igwfnode = this%flowbudptr%budterm(this%idxbudsbcd)%id2(j) + ! -- For now, there is only 1 aux variable under 'GWF' + auxpos = this%flowbudptr%budterm(this%idxbudgwf)%naux + wa = this%flowbudptr%budterm(this%idxbudgwf)%auxvar(auxpos, j) + ktf = this%ktf(n1) + s = this%rfeatthk(n1) + ctherm = ktf * wa / s + q = ctherm * (x(igwfnode) - this%xnewpak(n1)) + end if + call this%budobj%budterm(idx)%update_term(n1, igwfnode, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + if (this%iboundpak(n1) /= 0) then + ! -- Contribution to gwe cell budget + this%simvals(n1) = this%simvals(n1) - q + idiag = this%dis%con%ia(igwfnode) + flowja(idiag) = flowja(idiag) - q + end if + end do + ! + ! -- Return + return + end subroutine sfe_fill_budobj + + !> @brief Allocate scalars specific to the streamflow energy transport (SFE) + !! package. + !< + subroutine allocate_scalars(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweSfeType) :: this + ! + ! -- Allocate scalars in TspAptType + call this%TspAptType%allocate_scalars() + ! + ! -- Allocate + call mem_allocate(this%idxbudrain, 'IDXBUDRAIN', this%memoryPath) + call mem_allocate(this%idxbudevap, 'IDXBUDEVAP', this%memoryPath) + call mem_allocate(this%idxbudroff, 'IDXBUDROFF', this%memoryPath) + call mem_allocate(this%idxbudiflw, 'IDXBUDIFLW', this%memoryPath) + call mem_allocate(this%idxbudoutf, 'IDXBUDOUTF', this%memoryPath) + call mem_allocate(this%idxbudsbcd, 'IDXBUDSBCD', this%memoryPath) + ! + ! -- Initialize + this%idxbudrain = 0 + this%idxbudevap = 0 + this%idxbudroff = 0 + this%idxbudiflw = 0 + this%idxbudoutf = 0 + this%idxbudsbcd = 0 + ! + ! -- Return + return + end subroutine allocate_scalars + + !> @brief Allocate arrays specific to the streamflow energy transport (SFE) + !! package. + !< + subroutine sfe_allocate_arrays(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweSfeType), intent(inout) :: this + ! -- local + integer(I4B) :: n + ! + ! -- Time series + call mem_allocate(this%temprain, this%ncv, 'TEMPRAIN', this%memoryPath) + call mem_allocate(this%tempevap, this%ncv, 'TEMPEVAP', this%memoryPath) + call mem_allocate(this%temproff, this%ncv, 'TEMPROFF', this%memoryPath) + call mem_allocate(this%tempiflw, this%ncv, 'TEMPIFLW', this%memoryPath) + ! + ! -- Call standard TspAptType allocate arrays + call this%TspAptType%apt_allocate_arrays() + ! + ! -- Initialize + do n = 1, this%ncv + this%temprain(n) = DZERO + this%tempevap(n) = DZERO + this%temproff(n) = DZERO + this%tempiflw(n) = DZERO + end do + ! + ! -- Return + return + end subroutine sfe_allocate_arrays + + !> @brief Deallocate memory + !< + subroutine sfe_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + ! -- dummy + class(GweSfeType) :: this + ! + ! -- Deallocate scalars + call mem_deallocate(this%idxbudrain) + call mem_deallocate(this%idxbudevap) + call mem_deallocate(this%idxbudroff) + call mem_deallocate(this%idxbudiflw) + call mem_deallocate(this%idxbudoutf) + call mem_deallocate(this%idxbudsbcd) + ! + ! -- Deallocate time series + call mem_deallocate(this%temprain) + call mem_deallocate(this%tempevap) + call mem_deallocate(this%temproff) + call mem_deallocate(this%tempiflw) + ! + ! -- Deallocate scalars in TspAptType + call this%TspAptType%bnd_da() + ! + ! -- Return + return + end subroutine sfe_da + + !> @brief Rain term + !< + subroutine sfe_rain_term(this, ientry, n1, n2, rrate, rhsval, hcofval) + ! -- dummy + class(GweSfeType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + ! + n1 = this%flowbudptr%budterm(this%idxbudrain)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudrain)%id2(ientry) + qbnd = this%flowbudptr%budterm(this%idxbudrain)%flow(ientry) + ctmp = this%temprain(n1) + if (present(rrate)) rrate = ctmp * qbnd * this%eqnsclfac ! kluge note: think about budget / sensible heat issue + if (present(rhsval)) rhsval = -rrate + if (present(hcofval)) hcofval = DZERO + ! + ! -- Return + return + end subroutine sfe_rain_term + + !> @brief Evaporative term + !< + subroutine sfe_evap_term(this, ientry, n1, n2, rrate, rhsval, hcofval) + ! -- dummy + class(GweSfeType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: heatlat + ! + n1 = this%flowbudptr%budterm(this%idxbudevap)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudevap)%id2(ientry) + ! -- note that qbnd is negative for evap + qbnd = this%flowbudptr%budterm(this%idxbudevap)%flow(ientry) + heatlat = this%gwecommon%gwerhow * this%gwecommon%gwelatheatvap + if (present(rrate)) rrate = qbnd * heatlat + !!if (present(rhsval)) rhsval = -rrate / this%eqnsclfac ! kluge note: divided by eqnsclfac for fc purposes because rrate is in terms of energy + if (present(rhsval)) rhsval = -rrate + if (present(hcofval)) hcofval = DZERO + ! + ! -- Return + return + end subroutine sfe_evap_term + + !> @brief Runoff term + !< + subroutine sfe_roff_term(this, ientry, n1, n2, rrate, rhsval, hcofval) + ! -- dummy + class(GweSfeType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + ! + n1 = this%flowbudptr%budterm(this%idxbudroff)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudroff)%id2(ientry) + qbnd = this%flowbudptr%budterm(this%idxbudroff)%flow(ientry) + ctmp = this%temproff(n1) + if (present(rrate)) rrate = ctmp * qbnd * this%eqnsclfac + if (present(rhsval)) rhsval = -rrate + if (present(hcofval)) hcofval = DZERO + ! + ! -- Return + return + end subroutine sfe_roff_term + + !> @brief Inflow Term + !! + !! Accounts for energy added via streamflow entering into a stream channel; + !! for example, energy entering the model domain via a specified flow in a + !! stream channel. + !< + subroutine sfe_iflw_term(this, ientry, n1, n2, rrate, rhsval, hcofval) + ! -- dummy + class(GweSfeType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + ! + n1 = this%flowbudptr%budterm(this%idxbudiflw)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudiflw)%id2(ientry) + qbnd = this%flowbudptr%budterm(this%idxbudiflw)%flow(ientry) + ctmp = this%tempiflw(n1) + if (present(rrate)) rrate = ctmp * qbnd * this%eqnsclfac + if (present(rhsval)) rhsval = -rrate + if (present(hcofval)) hcofval = DZERO + ! + ! -- Return + return + end subroutine sfe_iflw_term + + !> @brief Outflow term + !! + !! Accounts for the energy leaving a stream channel, for example, energy exiting the + !! model domain via a flow in a stream channel flowing out of the active domain. + !< + subroutine sfe_outf_term(this, ientry, n1, n2, rrate, rhsval, hcofval) + ! -- dummy + class(GweSfeType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + ! + n1 = this%flowbudptr%budterm(this%idxbudoutf)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudoutf)%id2(ientry) + qbnd = this%flowbudptr%budterm(this%idxbudoutf)%flow(ientry) + ctmp = this%xnewpak(n1) + if (present(rrate)) rrate = ctmp * qbnd * this%eqnsclfac + if (present(rhsval)) rhsval = DZERO + if (present(hcofval)) hcofval = qbnd * this%eqnsclfac + ! + ! -- Return + return + end subroutine sfe_outf_term + + !> @brief Observations + !! + !! Store the observation type supported by the APT package and overide + !! BndType%bnd_df_obs + !< + subroutine sfe_df_obs(this) + ! -- modules + ! -- dummy + class(GweSfeType) :: this + ! -- local + integer(I4B) :: indx + ! + ! -- Store obs type and assign procedure pointer + ! for temperature observation type. + call this%obs%StoreObsType('temperature', .false., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for flow between reaches. + call this%obs%StoreObsType('flow-ja-face', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID12 + ! + ! -- Store obs type and assign procedure pointer + ! for from-mvr observation type. + call this%obs%StoreObsType('from-mvr', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for to-mvr observation type. + call this%obs%StoreObsType('to-mvr', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for storage observation type. + call this%obs%StoreObsType('storage', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for constant observation type. + call this%obs%StoreObsType('constant', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for observation type: sfe + call this%obs%StoreObsType('sfe', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for rainfall observation type. + call this%obs%StoreObsType('rainfall', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for evaporation observation type. + call this%obs%StoreObsType('evaporation', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for runoff observation type. + call this%obs%StoreObsType('runoff', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for inflow observation type. + call this%obs%StoreObsType('ext-inflow', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for ext-outflow observation type. + call this%obs%StoreObsType('ext-outflow', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Return + return + end subroutine sfe_df_obs + + !> @brief Process package specific obs + !! + !! Method to process specific observations for this package. + !< + subroutine sfe_rp_obs(this, obsrv, found) + ! -- dummy + class(GweSfeType), intent(inout) :: this !< package class + type(ObserveType), intent(inout) :: obsrv !< observation object + logical, intent(inout) :: found !< indicate whether observation was found + ! -- local + ! + found = .true. + select case (obsrv%ObsTypeId) + case ('RAINFALL') + call this%rp_obs_byfeature(obsrv) + case ('EVAPORATION') + call this%rp_obs_byfeature(obsrv) + case ('RUNOFF') + call this%rp_obs_byfeature(obsrv) + case ('EXT-INFLOW') + call this%rp_obs_byfeature(obsrv) + case ('EXT-OUTFLOW') + call this%rp_obs_byfeature(obsrv) + case ('TO-MVR') + call this%rp_obs_byfeature(obsrv) + case default + found = .false. + end select + ! + ! -- Return + return + end subroutine sfe_rp_obs + + !> @brief Calculate observation value and pass it back to APT + !< + subroutine sfe_bd_obs(this, obstypeid, jj, v, found) + ! -- dummy + class(GweSfeType), intent(inout) :: this + character(len=*), intent(in) :: obstypeid + real(DP), intent(inout) :: v + integer(I4B), intent(in) :: jj + logical, intent(inout) :: found + ! -- local + integer(I4B) :: n1, n2 + ! + found = .true. + select case (obstypeid) + case ('RAINFALL') + if (this%iboundpak(jj) /= 0) then + call this%sfe_rain_term(jj, n1, n2, v) + end if + case ('EVAPORATION') + if (this%iboundpak(jj) /= 0) then + call this%sfe_evap_term(jj, n1, n2, v) + end if + case ('RUNOFF') + if (this%iboundpak(jj) /= 0) then + call this%sfe_roff_term(jj, n1, n2, v) + end if + case ('EXT-INFLOW') + if (this%iboundpak(jj) /= 0) then + call this%sfe_iflw_term(jj, n1, n2, v) + end if + case ('EXT-OUTFLOW') + if (this%iboundpak(jj) /= 0) then + call this%sfe_outf_term(jj, n1, n2, v) + end if + case default + found = .false. + end select + ! + ! -- Return + return + end subroutine sfe_bd_obs + + !> @brief Sets the stress period attributes for keyword use. + !< + subroutine sfe_set_stressperiod(this, itemno, keyword, found) + ! -- modules + use TimeSeriesManagerModule, only: read_value_or_time_series_adv + ! -- dummy + class(GweSfeType), intent(inout) :: this + integer(I4B), intent(in) :: itemno + character(len=*), intent(in) :: keyword + logical, intent(inout) :: found + ! -- local + character(len=LINELENGTH) :: text + integer(I4B) :: ierr + integer(I4B) :: jj + real(DP), pointer :: bndElem => null() + ! + ! RAINFALL + ! EVAPORATION + ! RUNOFF + ! INFLOW + ! WITHDRAWAL + ! + found = .true. + select case (keyword) + case ('RAINFALL') + ierr = this%apt_check_valid(itemno) + if (ierr /= 0) then + goto 999 + end if + call this%parser%GetString(text) + jj = 1 + bndElem => this%temprain(itemno) + call read_value_or_time_series_adv(text, itemno, jj, bndElem, & + this%packName, 'BND', this%tsManager, & + this%iprpak, 'RAINFALL') + case ('EVAPORATION') + ierr = this%apt_check_valid(itemno) + if (ierr /= 0) then + goto 999 + end if + call this%parser%GetString(text) + jj = 1 + bndElem => this%tempevap(itemno) + call read_value_or_time_series_adv(text, itemno, jj, bndElem, & + this%packName, 'BND', this%tsManager, & + this%iprpak, 'EVAPORATION') + case ('RUNOFF') + ierr = this%apt_check_valid(itemno) + if (ierr /= 0) then + goto 999 + end if + call this%parser%GetString(text) + jj = 1 + bndElem => this%temproff(itemno) + call read_value_or_time_series_adv(text, itemno, jj, bndElem, & + this%packName, 'BND', this%tsManager, & + this%iprpak, 'RUNOFF') + case ('INFLOW') + ierr = this%apt_check_valid(itemno) + if (ierr /= 0) then + goto 999 + end if + call this%parser%GetString(text) + jj = 1 + bndElem => this%tempiflw(itemno) + call read_value_or_time_series_adv(text, itemno, jj, bndElem, & + this%packName, 'BND', this%tsManager, & + this%iprpak, 'INFLOW') + case default + ! + ! -- Keyword not recognized so return to caller with found = .false. + found = .false. + end select + ! +999 continue + ! + ! -- Return + return + end subroutine sfe_set_stressperiod + +end module GweSfeModule diff --git a/src/Model/GroundWaterEnergy/gwe1uze1.f90 b/src/Model/GroundWaterEnergy/gwe1uze1.f90 new file mode 100644 index 00000000000..64231abc2ff --- /dev/null +++ b/src/Model/GroundWaterEnergy/gwe1uze1.f90 @@ -0,0 +1,1395 @@ +! -- Unsaturated Zone Flow Energy Transport Module +! -- todo: save the uze temperature into the uze aux variable? +! -- todo: calculate the uzf DENSE aux variable using temperature? +! -- todo: GWD and GWD-TO-MVR do not seem to be included; prob in UZF? +! +! UZF flows (flowbudptr) index var UZE term Transport Type +!--------------------------------------------------------------------------------- + +! -- terms from UZF that will be handled by parent APT Package +! FLOW-JA-FACE idxbudfjf FLOW-JA-FACE cv2cv +! GWF (aux FLOW-AREA) idxbudgwf GWF uzf2gwf +! STORAGE (aux VOLUME) idxbudsto none used for water volumes +! FROM-MVR idxbudfmvr FROM-MVR q * cext = this%qfrommvr(:) +! AUXILIARY none none none +! none none STORAGE (aux MASS) +! none none AUXILIARY none + +! -- terms from UZF that need to be handled here +! INFILTRATION idxbudinfl INFILTRATION q < 0: q * cwell, else q * cuser +! REJ-INF idxbudrinf REJ-INF q * cuze +! UZET idxbuduzet UZET q * cet +! REJ-INF-TO-MVR idxbudritm REJ-INF-TO-MVR q * cinfil? +! THERMAL-EQUIL idxbudtheq THERMAL-EQUIL residual + +! -- terms from UZF that should be skipped + +module GweUzeModule + + use KindModule, only: DP, I4B + use ConstantsModule, only: DZERO, DONE, LINELENGTH + use SimModule, only: store_error + use BndModule, only: BndType, GetBndFromList + use TspFmiModule, only: TspFmiType + use UzfModule, only: UzfType + use ObserveModule, only: ObserveType + use TspAptModule, only: TspAptType, apt_process_obsID, & + apt_process_obsID12 + use GweInputDataModule, only: GweInputDataType + use MatrixBaseModule + + implicit none + + public uze_create + + character(len=*), parameter :: ftype = 'UZE' + character(len=*), parameter :: flowtype = 'UZF' + character(len=16) :: text = ' UZE' + + type, extends(TspAptType) :: GweUzeType + + type(GweInputDataType), pointer :: gwecommon => null() !< pointer to shared gwe data used by multiple packages but set in mst + + integer(I4B), pointer :: idxbudinfl => null() !< index of uzf infiltration terms in flowbudptr + integer(I4B), pointer :: idxbudrinf => null() !< index of rejected infiltration terms in flowbudptr + integer(I4B), pointer :: idxbuduzet => null() !< index of unsat et terms in flowbudptr + integer(I4B), pointer :: idxbudritm => null() !< index of rej infil to mover rate to mover terms in flowbudptr + integer(I4B), pointer :: idxbudtheq => null() !< index of thermal equilibration terms in flowbudptr + + real(DP), dimension(:), pointer, contiguous :: tempinfl => null() !< infiltration temperature + real(DP), dimension(:), pointer, contiguous :: tempuzet => null() !< unsat et temperature + + contains + + procedure :: bnd_da => uze_da + procedure :: allocate_scalars + procedure :: apt_allocate_arrays => uze_allocate_arrays + procedure :: find_apt_package => find_uze_package + procedure :: apt_fc_expanded => uze_fc_expanded + procedure :: pak_solve => uze_solve + procedure :: pak_get_nbudterms => uze_get_nbudterms + procedure :: pak_setup_budobj => uze_setup_budobj + procedure :: pak_fill_budobj => uze_fill_budobj + procedure :: uze_infl_term + procedure :: uze_rinf_term + procedure :: uze_uzet_term + procedure :: uze_ritm_term + procedure :: uze_theq_term + procedure :: pak_df_obs => uze_df_obs + procedure :: pak_rp_obs => uze_rp_obs + procedure :: pak_bd_obs => uze_bd_obs + procedure :: pak_set_stressperiod => uze_set_stressperiod + procedure :: bnd_ac => uze_ac + procedure :: bnd_mc => uze_mc + + end type GweUzeType + +contains + + !> @breif Create a new UZE package + !< + subroutine uze_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, & + fmi, eqnsclfac, gwecommon, dvt, dvu, dvua) + ! -- dummy + class(BndType), pointer :: packobj + integer(I4B), intent(in) :: id + integer(I4B), intent(in) :: ibcnum + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + character(len=*), intent(in) :: namemodel + character(len=*), intent(in) :: pakname + type(TspFmiType), pointer :: fmi + real(DP), intent(in), pointer :: eqnsclfac !< governing equation scale factor + type(GweInputDataType), intent(in), target :: gwecommon !< shared data container for use by multiple GWE packages + character(len=*), intent(in) :: dvt !< For GWE, set to "TEMPERATURE" in TspAptType + character(len=*), intent(in) :: dvu !< For GWE, set to "energy" in TspAptType + character(len=*), intent(in) :: dvua !< For GWE, set to "E" in TspAptType + ! -- local + type(GweUzeType), pointer :: uzeobj + ! + ! -- Allocate the object and assign values to object variables + allocate (uzeobj) + packobj => uzeobj + ! + ! -- Create name and memory path + call packobj%set_names(ibcnum, namemodel, pakname, ftype) + packobj%text = text + ! + ! -- Allocate scalars + call uzeobj%allocate_scalars() + ! + ! -- Initialize package + call packobj%pack_initialize() + ! + packobj%inunit = inunit + packobj%iout = iout + packobj%id = id + packobj%ibcnum = ibcnum + packobj%ncolbnd = 1 + packobj%iscloc = 1 + + ! -- Store pointer to flow model interface. When the GwfGwt exchange is + ! created, it sets fmi%bndlist so that the GWT model has access to all + ! the flow packages + uzeobj%fmi => fmi + ! + ! -- Store pointer to governing equation scale factor + uzeobj%eqnsclfac => eqnsclfac + ! + ! -- Store pointer to shared data module for accessing cpw, rhow + ! for the budget calculations, and for accessing the latent heat of + ! vaporization + uzeobj%gwecommon => gwecommon + ! + ! -- Set labels that will be used in generalized APT class + uzeobj%depvartype = dvt + uzeobj%depvarunit = dvu + uzeobj%depvarunitabbrev = dvua + ! + ! -- Return + return + end subroutine uze_create + + !> @brief Find corresponding uze package + !< + subroutine find_uze_package(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweUzeType) :: this + ! -- local + character(len=LINELENGTH) :: errmsg + class(BndType), pointer :: packobj + integer(I4B) :: ip, icount + integer(I4B) :: nbudterm + logical :: found + ! + ! -- Initialize found to false, and error later if flow package cannot + ! be found + found = .false. + ! + ! -- If user is specifying flows in a binary budget file, then set up + ! the budget file reader, otherwise set a pointer to the flow package + ! budobj + if (this%fmi%flows_from_file) then + call this%fmi%set_aptbudobj_pointer(this%flowpackagename, this%flowbudptr) + if (associated(this%flowbudptr)) found = .true. + ! + else + if (associated(this%fmi%gwfbndlist)) then + ! -- Look through gwfbndlist for a flow package with the same name as + ! this transport package name + do ip = 1, this%fmi%gwfbndlist%Count() + packobj => GetBndFromList(this%fmi%gwfbndlist, ip) + if (packobj%packName == this%flowpackagename) then + found = .true. + ! + ! -- Store BndType pointer to packobj, and then + ! use the select type to point to the budobj in flow package + this%flowpackagebnd => packobj + select type (packobj) + type is (UzfType) + this%flowbudptr => packobj%budobj + end select + end if + if (found) exit + end do + end if + end if + ! + ! -- Error if flow package not found + if (.not. found) then + write (errmsg, '(a)') 'COULD NOT FIND FLOW PACKAGE WITH NAME '& + &//trim(adjustl(this%flowpackagename))//'.' + call store_error(errmsg) + call this%parser%StoreErrorUnit() + end if + ! + ! -- Allocate space for idxbudssm, which indicates whether this is a + ! special budget term or one that is a general source and sink + nbudterm = this%flowbudptr%nbudterm + call mem_allocate(this%idxbudssm, nbudterm, 'IDXBUDSSM', this%memoryPath) + ! + ! -- Process budget terms and identify special budget terms + write (this%iout, '(/, a, a)') & + 'PROCESSING '//ftype//' INFORMATION FOR ', this%packName + write (this%iout, '(a)') ' IDENTIFYING FLOW TERMS IN '//flowtype//' PACKAGE' + write (this%iout, '(a, i0)') & + ' NUMBER OF '//flowtype//' = ', this%flowbudptr%ncv + icount = 1 + do ip = 1, this%flowbudptr%nbudterm + select case (trim(adjustl(this%flowbudptr%budterm(ip)%flowtype))) + case ('FLOW-JA-FACE') + this%idxbudfjf = ip + this%idxbudssm(ip) = 0 + case ('GWF') + this%idxbudgwf = ip + this%idxbudssm(ip) = 0 + case ('STORAGE') + this%idxbudsto = ip + this%idxbudssm(ip) = 0 + case ('INFILTRATION') + this%idxbudinfl = ip + this%idxbudssm(ip) = 0 + case ('REJ-INF') + this%idxbudrinf = ip + this%idxbudssm(ip) = 0 + case ('UZET') + this%idxbuduzet = ip + this%idxbudssm(ip) = 0 + case ('REJ-INF-TO-MVR') + this%idxbudritm = ip + this%idxbudssm(ip) = 0 + case ('TO-MVR') + this%idxbudtmvr = ip + this%idxbudssm(ip) = 0 + case ('FROM-MVR') + this%idxbudfmvr = ip + this%idxbudssm(ip) = 0 + case ('AUXILIARY') + this%idxbudaux = ip + this%idxbudssm(ip) = 0 + case default + ! + ! -- Set idxbudssm equal to a column index for where the temperatures + ! are stored in the tempbud(nbudssm, ncv) array + this%idxbudssm(ip) = icount + icount = icount + 1 + end select + ! + write (this%iout, '(a, i0, " = ", a,/, a, i0)') & + ' TERM ', ip, trim(adjustl(this%flowbudptr%budterm(ip)%flowtype)), & + ' MAX NO. OF ENTRIES = ', this%flowbudptr%budterm(ip)%maxlist + end do + write (this%iout, '(a, //)') 'DONE PROCESSING '//ftype//' INFORMATION' + ! + ! -- Thermal equilibration term + this%idxbudtheq = this%flowbudptr%nbudterm + 1 + ! + ! -- Return + return + end subroutine find_uze_package + + !> @brief Add package connection to matrix. + !! + !! Overrides apt_ac to fold the UZE heat balance terms into the row + !! corresponding to the host cell and enforce thermal equilibrium between + !! UZE and the GWE cell. + !< + subroutine uze_ac(this, moffset, sparse) + use MemoryManagerModule, only: mem_setptr + use SparseModule, only: sparsematrix + ! -- dummy + class(GweUzeType), intent(inout) :: this + integer(I4B), intent(in) :: moffset !< current models starting position in global matrix + type(sparsematrix), intent(inout) :: sparse + ! -- local + integer(I4B) :: i, ii + integer(I4B) :: n !< index of a uze object within the complete list of uze objects + integer(I4B) :: jj !< + integer(I4B) :: nglo !< index of uze object in global matrix + integer(I4B) :: jglo !< host cell's position in global matrix for a uze object + integer(I4B) :: idxn !< used for cross-check + integer(I4B) :: idxjj !< used for cross-check + integer(I4B) :: idxnglo !< used for cross-check + integer(I4B) :: idxjglo !< used for cross-check + ! + ! -- Add package rows to sparse + if (this%imatrows /= 0) then + ! + ! -- Diagonal on the row assoc. with the uze feature + do n = 1, this%ncv + nglo = moffset + this%dis%nodes + this%ioffset + n + call sparse%addconnection(nglo, nglo, 1) + end do + ! + ! -- Add uze-to-gwe connections. For uze, this particular do loop + ! is the same as its counterpart in apt_ac. + ! nlist: number of gwe cells with a connection to at least one uze object + do i = 1, this%flowbudptr%budterm(this%idxbudgwf)%nlist + n = this%flowbudptr%budterm(this%idxbudgwf)%id1(i) !< uze object position within uze object list + jj = this%flowbudptr%budterm(this%idxbudgwf)%id2(i) !< position of gwe cell to which uze feature is connected + nglo = moffset + this%dis%nodes + this%ioffset + n !< uze feature position + jglo = moffset + jj !< gwe cell position + call sparse%addconnection(nglo, jglo, 1) + call sparse%addconnection(jglo, nglo, 1) + end do + ! + ! -- For uze, add feature-to-feature connections (i.e., + ! vertically stacked UZ objects) to row corresponding + ! to the host cell. Terms added to the row associated with host + ! cell are added to columns associated with other uze features. + ! This approach deviates from the approach taken in apt_ac. + if (this%idxbudfjf /= 0) then + do i = 1, this%flowbudptr%budterm(this%idxbudfjf)%maxlist + n = this%flowbudptr%budterm(this%idxbudfjf)%id1(i) !< position of currently considered uze feature + jj = this%flowbudptr%budterm(this%idxbudfjf)%id2(i) !< position of connected uze feature + nglo = moffset + this%dis%nodes + this%ioffset + n !< global position of currently considered uze feature + jglo = moffset + this%dis%nodes + this%ioffset + jj !< global position of connected uze feature + ! -- If connected uze feature is upstream, find cell that hosts currently + ! considered uze feature and add connection to that cell's row + do ii = 1, this%flowbudptr%budterm(this%idxbudgwf)%nlist !< uze object id among uze objects + idxn = this%flowbudptr%budterm(this%idxbudgwf)%id1(ii) !< uze object position within uze object list + idxjj = this%flowbudptr%budterm(this%idxbudgwf)%id2(ii) !< position of gwe cell to which uze feature is connected + idxnglo = moffset + this%dis%nodes + this%ioffset + idxn !< uze feature global position + idxjglo = moffset + idxjj !< gwe cell global position + if (nglo == idxnglo) exit + end do + call sparse%addconnection(idxjglo, jglo, 1) + end do + end if + end if + ! + ! -- Return + return + end subroutine uze_ac + + !> @brief Map package connection to matrix + !< + subroutine uze_mc(this, moffset, matrix_sln) + use SparseModule, only: sparsematrix + ! -- dummy + class(GweUzeType), intent(inout) :: this + integer(I4B), intent(in) :: moffset + class(MatrixBaseType), pointer :: matrix_sln + ! -- local + integer(I4B) :: n, j, iglo, jglo + integer(I4B) :: idxn, idxj, idxiglo, idxjglo + integer(I4B) :: ipos, idxpos + ! + ! -- Allocate memory for index arrays + call this%apt_allocate_index_arrays() + ! + ! -- Store index positions + if (this%imatrows /= 0) then + ! + ! -- Find the position of each connection in the global ia, ja structure + ! and store them in idxglo. idxglo allows this model to insert or + ! retrieve values into or from the global A matrix + ! apt rows + ! + ! -- Feature diagonal in global matrix + do n = 1, this%ncv + iglo = moffset + this%dis%nodes + this%ioffset + n + this%idxpakdiag(n) = matrix_sln%get_position_diag(iglo) + end do + ! + ! -- Cell to feature connection in global matrix + do ipos = 1, this%flowbudptr%budterm(this%idxbudgwf)%nlist + n = this%flowbudptr%budterm(this%idxbudgwf)%id1(ipos) !< feature number + j = this%flowbudptr%budterm(this%idxbudgwf)%id2(ipos) !< cell number + iglo = moffset + this%dis%nodes + this%ioffset + n !< feature row index + jglo = j + moffset !< cell row index + ! -- Note that this is where idxlocnode is set for uze; it is set + ! to the host cell local row index rather than the feature local + ! row index + this%idxlocnode(n) = j ! kluge note: do we want to introduce a new array instead of co-opting idxlocnode??? + ! -- For connection ipos in list of feature-cell connections, + ! global positions of feature-row diagonal and off-diagonal + ! corresponding to the cell + this%idxdglo(ipos) = matrix_sln%get_position_diag(iglo) + this%idxoffdglo(ipos) = matrix_sln%get_position(iglo, jglo) + end do + ! + ! -- Feature to cell connection in global matrix + do ipos = 1, this%flowbudptr%budterm(this%idxbudgwf)%nlist + n = this%flowbudptr%budterm(this%idxbudgwf)%id1(ipos) !< feature number + j = this%flowbudptr%budterm(this%idxbudgwf)%id2(ipos) !< cell number + iglo = j + moffset !< cell row index + jglo = moffset + this%dis%nodes + this%ioffset + n !< feature row index + ! -- For connection ipos in list of feature-cell connections, + ! global positions of cell-row diagonal and off-diagonal + ! corresponding to the feature + this%idxsymdglo(ipos) = matrix_sln%get_position_diag(iglo) + this%idxsymoffdglo(ipos) = matrix_sln%get_position(iglo, jglo) + end do + ! + ! -- Feature to feature connection in global matrix + if (this%idxbudfjf /= 0) then + do ipos = 1, this%flowbudptr%budterm(this%idxbudfjf)%nlist + n = this%flowbudptr%budterm(this%idxbudfjf)%id1(ipos) !< number of currently considered uze feature + j = this%flowbudptr%budterm(this%idxbudfjf)%id2(ipos) !< number of connected uze feature + iglo = moffset + this%dis%nodes + this%ioffset + n !< global position of currently considered uze feature + jglo = moffset + this%dis%nodes + this%ioffset + j !< global position of connected uze feature + ! -- If connected uze feature is upstream, find cell that hosts currently + ! considered uze feature and map connection to that cell's row + do idxpos = 1, this%flowbudptr%budterm(this%idxbudgwf)%nlist + idxn = this%flowbudptr%budterm(this%idxbudgwf)%id1(idxpos) !< feature number + idxj = this%flowbudptr%budterm(this%idxbudgwf)%id2(idxpos) !< cell number) + idxjglo = moffset + this%dis%nodes + this%ioffset + idxn !< feature row index + idxiglo = moffset + idxj !< cell row index + if (idxjglo == iglo) exit + end do + ! -- For connection ipos in list of feature-feature connections, + ! global positions of host-cell-row entries corresponding to + ! (in the same columns as) the feature-id1-row diagonal and the + ! feature-id1-row off-diagonal corresponding to feature id2 + this%idxfjfdglo(ipos) = matrix_sln%get_position_diag(idxiglo) + this%idxfjfoffdglo(ipos) = matrix_sln%get_position(idxiglo, jglo) + end do + end if + end if + ! + ! -- Return + return + end subroutine uze_mc + + !> @brief Add matrix terms related to UZE + !! + !! This will be called from TspAptType%apt_fc_expanded() + !! in order to add matrix terms specifically for this package + !< + subroutine uze_fc_expanded(this, rhs, ia, idxglo, matrix_sln) + ! -- dummy + class(GweUzeType) :: this + real(DP), dimension(:), intent(inout) :: rhs + integer(I4B), dimension(:), intent(in) :: ia + integer(I4B), dimension(:), intent(in) :: idxglo + class(MatrixBaseType), pointer :: matrix_sln + ! -- local + integer(I4B) :: j, n, n1, n2 + integer(I4B) :: iloc + integer(I4B) :: iposd, iposoffd + integer(I4B) :: ipossymoffd + real(DP) :: cold + real(DP) :: qbnd + real(DP) :: omega + real(DP) :: rrate + real(DP) :: rhsval + real(DP) :: hcofval + ! + ! -- Add infiltration contribution + ! uze does not put feature balance coefficients in the row + ! associated with the feature. Instead, these coefficients are + ! moved into the row associated with cell hosting the uze feature + if (this%idxbudinfl /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudinfl)%nlist + call this%uze_infl_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) !< for uze idxlocnode stores the host cell local row index + ipossymoffd = this%idxsymoffdglo(j) + call matrix_sln%add_value_pos(ipossymoffd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add rejected infiltration contribution + if (this%idxbudrinf /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudrinf)%nlist + call this%uze_rinf_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) ! for uze idxlocnode stores the host cell local row index + ipossymoffd = this%idxsymoffdglo(j) + call matrix_sln%add_value_pos(ipossymoffd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add unsaturated et contribution + if (this%idxbuduzet /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbuduzet)%nlist + call this%uze_uzet_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) ! for uze idxlocnode stores the host cell local row index + ipossymoffd = this%idxsymoffdglo(j) + call matrix_sln%add_value_pos(ipossymoffd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add rejected infiltration to mover contribution + if (this%idxbudritm /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudritm)%nlist + call this%uze_ritm_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) ! for uze idxlocnode stores the host cell local row index + ipossymoffd = this%idxsymoffdglo(j) + call matrix_sln%add_value_pos(ipossymoffd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- For UZE, content of apt_fc_expanded placed here as the approach is to + ! completely override apt_fc_expanded() with what follows + ! + ! -- Mass (or energy) storage in features + do n = 1, this%ncv + cold = this%xoldpak(n) + iloc = this%idxlocnode(n) ! for uze idxlocnode stores the host cell local row index + ipossymoffd = this%idxsymoffdglo(n) + call this%apt_stor_term(n, n1, n2, rrate, rhsval, hcofval) + call matrix_sln%add_value_pos(ipossymoffd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + ! + ! -- Add to mover contribution + if (this%idxbudtmvr /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudtmvr)%nlist + call this%apt_tmvr_term(j, n1, n2, rrate, rhsval, hcofval) + iloc = this%idxlocnode(n1) ! for uze, idxlocnode stores the host cell local row index + ipossymoffd = this%idxsymoffdglo(j) + call matrix_sln%add_value_pos(ipossymoffd, hcofval) + rhs(iloc) = rhs(iloc) + rhsval + end do + end if + ! + ! -- Add from mover contribution + if (this%idxbudfmvr /= 0) then + do n = 1, this%ncv + rhsval = this%qmfrommvr(n) ! kluge note: presumably already in terms of energy + iloc = this%idxlocnode(n) ! for uze idxlocnode stores the host cell local row index + rhs(iloc) = rhs(iloc) - rhsval + end do + end if + ! + ! -- Go through each apt-gwf connection + do j = 1, this%flowbudptr%budterm(this%idxbudgwf)%nlist + ! + ! -- Set n to feature number and process if active feature + n = this%flowbudptr%budterm(this%idxbudgwf)%id1(j) + if (this%iboundpak(n) /= 0) then + ! + ! -- This code altered from its counterpart appearing in apt; this equates + ! uze temperature to cell temperature using the feature's row + iposd = this%idxdglo(j) + iposoffd = this%idxoffdglo(j) + call matrix_sln%add_value_pos(iposd, DONE) + call matrix_sln%add_value_pos(iposoffd, -DONE) + end if + end do + ! + ! -- Go through each apt-apt connection + if (this%idxbudfjf /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudfjf)%nlist + n1 = this%flowbudptr%budterm(this%idxbudfjf)%id1(j) + n2 = this%flowbudptr%budterm(this%idxbudfjf)%id2(j) + qbnd = this%flowbudptr%budterm(this%idxbudfjf)%flow(j) + if (qbnd <= DZERO) then + omega = DONE + else + omega = DZERO + end if + iposd = this%idxfjfdglo(j) !< position of feature-id1 column in feature id1's host-cell row + iposoffd = this%idxfjfoffdglo(j) !< position of feature-id2 column in feature id1's host-cell row + call matrix_sln%add_value_pos(iposd, omega * qbnd * this%eqnsclfac) + call matrix_sln%add_value_pos(iposoffd, & + (DONE - omega) * qbnd * this%eqnsclfac) + end do + end if + ! + ! -- Return + return + end subroutine uze_fc_expanded + + !> @brief Explicit solve + !! + !! There should be no explicit solve for uze. However, if there were, then + !! this subroutine would add terms specific to the unsaturated zone to the + !! explicit unsaturated-zone solve + subroutine uze_solve(this) + ! -- dummy + class(GweUzeType) :: this + ! -- local + integer(I4B) :: j + integer(I4B) :: n1, n2 + real(DP) :: rrate + ! + ! -- Add infiltration contribution + if (this%idxbudinfl /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudinfl)%nlist + call this%uze_infl_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Add rejected infiltration contribution + if (this%idxbudrinf /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudrinf)%nlist + call this%uze_rinf_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Add unsaturated et contribution + if (this%idxbuduzet /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbuduzet)%nlist + call this%uze_uzet_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Add rejected infiltration to mover contribution + if (this%idxbudritm /= 0) then + do j = 1, this%flowbudptr%budterm(this%idxbudritm)%nlist + call this%uze_ritm_term(j, n1, n2, rrate) + this%dbuff(n1) = this%dbuff(n1) + rrate + end do + end if + ! + ! -- Return + return + end subroutine uze_solve + + !> @brief Return the number of UZE-specific budget terms + !! + !! Function to return the number of budget terms just for this package. + !! This overrides function in parent. + !< + function uze_get_nbudterms(this) result(nbudterms) + ! -- dummy + class(GweUzeType) :: this + ! -- Return + integer(I4B) :: nbudterms + ! + ! -- Number of budget terms is 5 + nbudterms = 0 + if (this%idxbudinfl /= 0) nbudterms = nbudterms + 1 + if (this%idxbudrinf /= 0) nbudterms = nbudterms + 1 + if (this%idxbuduzet /= 0) nbudterms = nbudterms + 1 + if (this%idxbudritm /= 0) nbudterms = nbudterms + 1 + if (this%idxbudtheq /= 0) nbudterms = nbudterms + 1 + ! + ! -- Return + return + end function uze_get_nbudterms + + !> @brief Setup budget object + !! + !! Set up the budget object that stores all the unsaturated-zone + !! flows + !< + subroutine uze_setup_budobj(this, idx) + ! -- modules + use ConstantsModule, only: LENBUDTXT + ! -- dummy + class(GweUzeType) :: this + integer(I4B), intent(inout) :: idx + ! -- local + integer(I4B) :: maxlist, naux + character(len=LENBUDTXT) :: text + ! + ! -- Infiltration + text = ' INFILTRATION' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudinfl)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + ! + ! -- Rejected infiltration (Hortonian flow) + if (this%idxbudrinf /= 0) then + text = ' REJ-INF' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudrinf)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + end if + ! + ! -- Evapotranspiration from the unsaturated zone + if (this%idxbuduzet /= 0) then + text = ' UZET' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbuduzet)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + end if + ! + ! -- Rejected infiltration that is subsequently transferred by MVR + if (this%idxbudritm /= 0) then + text = ' INF-REJ-TO-MVR' + idx = idx + 1 + maxlist = this%flowbudptr%budterm(this%idxbudritm)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + end if + ! + ! -- Energy transferred to solid phase by the thermal equilibrium assumption + text = ' THERMAL-EQUIL' + idx = idx + 1 + ! -- use dimension of GWF term + maxlist = this%flowbudptr%budterm(this%idxbudgwf)%maxlist + naux = 0 + call this%budobj%budterm(idx)%initialize(text, & + this%name_model, & + this%packName, & + this%name_model, & + this%packName, & + maxlist, .false., .false., & + naux) + ! + ! -- Return + return + end subroutine uze_setup_budobj + + !> @brief Fill UZE budget object + !! + !! Copy flow terms into this%budobj + !< + subroutine uze_fill_budobj(this, idx, x, flowja, ccratin, ccratout) + ! -- modules + ! -- dummy + class(GweUzeType) :: this + integer(I4B), intent(inout) :: idx + real(DP), dimension(:), intent(in) :: x + real(DP), dimension(:), contiguous, intent(inout) :: flowja + real(DP), intent(inout) :: ccratin + real(DP), intent(inout) :: ccratout + ! -- local + integer(I4B) :: j, n1, n2, indx + integer(I4B) :: nlist, nlen + integer(I4B) :: igwfnode + integer(I4B) :: idiag + real(DP) :: q + real(DP), dimension(:), allocatable :: budresid + ! + allocate (budresid(this%ncv)) + do n1 = 1, this%ncv + budresid(n1) = DZERO + end do + ! + indx = 0 + ! + ! -- FLOW JA FACE into budresid + nlen = 0 + if (this%idxbudfjf /= 0) then + nlen = this%flowbudptr%budterm(this%idxbudfjf)%maxlist + end if + if (nlen > 0) then + indx = indx + 1 + nlist = this%budobj%budterm(indx)%nlist + do j = 1, nlist + n1 = this%budobj%budterm(indx)%id1(j) + n2 = this%budobj%budterm(indx)%id2(j) + if (n1 < n2) then + q = this%budobj%budterm(indx)%flow(j) + budresid(n1) = budresid(n1) + q + budresid(n2) = budresid(n2) - q + end if + end do + end if + ! + ! -- GWF (LEAKAGE) into budresid + indx = indx + 1 + nlist = this%budobj%budterm(indx)%nlist + do j = 1, nlist + n1 = this%budobj%budterm(indx)%id1(j) + q = this%budobj%budterm(indx)%flow(j) + budresid(n1) = budresid(n1) + q + end do + ! + ! -- Skip individual package terms + indx = this%idxlastpak + ! + ! -- STORAGE into budresid + indx = indx + 1 + do n1 = 1, this%ncv + q = this%budobj%budterm(indx)%flow(n1) + budresid(n1) = budresid(n1) + q + end do + ! + ! -- TO MOVER into budresid + if (this%idxbudtmvr /= 0) then + indx = indx + 1 + nlist = this%budobj%budterm(indx)%nlist + do j = 1, nlist + n1 = this%budobj%budterm(indx)%id1(j) + q = this%budobj%budterm(indx)%flow(j) + budresid(n1) = budresid(n1) + q + end do + end if + ! + ! -- FROM MOVER into budresid + if (this%idxbudfmvr /= 0) then + indx = indx + 1 + nlist = this%budobj%budterm(indx)%nlist + do j = 1, nlist + n1 = this%budobj%budterm(indx)%id1(j) + q = this%budobj%budterm(indx)%flow(j) + budresid(n1) = budresid(n1) + q + end do + end if + ! + ! -- CONSTANT FLOW into budresid + indx = indx + 1 + do n1 = 1, this%ncv + q = this%budobj%budterm(indx)%flow(n1) + budresid(n1) = budresid(n1) + q + end do + ! + ! -- AUXILIARY VARIABLES into budresid + ! -- (No flows associated with these) + ! + ! -- Individual package terms processed last + ! + ! -- Infiltration + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudinfl)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%uze_infl_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + budresid(n1) = budresid(n1) + q + end do + ! + ! -- Rej-Inf + if (this%idxbudrinf /= 0) then + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudrinf)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%uze_rinf_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + budresid(n1) = budresid(n1) + q + end do + end if + ! + ! -- UZET + if (this%idxbuduzet /= 0) then + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbuduzet)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%uze_uzet_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + budresid(n1) = budresid(n1) + q + end do + end if + ! + ! -- Rej-Inf-To-MVR + if (this%idxbudritm /= 0) then + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudritm)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + call this%uze_ritm_term(j, n1, n2, q) + call this%budobj%budterm(idx)%update_term(n1, n2, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + budresid(n1) = budresid(n1) + q + end do + end if + ! + ! -- Thermal-Equil + ! -- processed last because it is calculated from the residual + idx = idx + 1 + nlist = this%flowbudptr%budterm(this%idxbudgwf)%nlist + call this%budobj%budterm(idx)%reset(nlist) + do j = 1, nlist + n1 = this%flowbudptr%budterm(this%idxbudgwf)%id1(j) + igwfnode = this%flowbudptr%budterm(this%idxbudgwf)%id2(j) + q = -budresid(n1) + call this%uze_theq_term(j, n1, igwfnode, q) + call this%budobj%budterm(idx)%update_term(n1, igwfnode, q) + call this%apt_accumulate_ccterm(n1, q, ccratin, ccratout) + if (this%iboundpak(n1) /= 0) then + ! -- Contribution to gwe cell budget + this%simvals(n1) = this%simvals(n1) - q + idiag = this%dis%con%ia(igwfnode) + flowja(idiag) = flowja(idiag) - q + end if + end do + ! + deallocate (budresid) + ! + ! -- Return + return + end subroutine uze_fill_budobj + + !> @brief Allocate scalars + !! + !! Allocate scalars specific to UZE package + !< + subroutine allocate_scalars(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweUzeType) :: this + ! -- local + ! + ! -- Allocate scalars in TspAptType + call this%TspAptType%allocate_scalars() + ! + ! -- Allocate + call mem_allocate(this%idxbudinfl, 'IDXBUDINFL', this%memoryPath) + call mem_allocate(this%idxbudrinf, 'IDXBUDRINF', this%memoryPath) + call mem_allocate(this%idxbuduzet, 'IDXBUDUZET', this%memoryPath) + call mem_allocate(this%idxbudritm, 'IDXBUDRITM', this%memoryPath) + call mem_allocate(this%idxbudtheq, 'IDXBUDTHEQ', this%memoryPath) + ! + ! -- Initialize + this%idxbudinfl = 0 + this%idxbudrinf = 0 + this%idxbuduzet = 0 + this%idxbudritm = 0 + this%idxbudtheq = 0 + ! + ! -- Return + return + end subroutine allocate_scalars + + !> @brief Allocate arrays + !! + !! Allocate arrays used by the UZE package + !< + subroutine uze_allocate_arrays(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(GweUzeType), intent(inout) :: this + ! -- local + integer(I4B) :: n + ! + ! -- Time series + call mem_allocate(this%tempinfl, this%ncv, 'TEMPINFL', this%memoryPath) + call mem_allocate(this%tempuzet, this%ncv, 'TEMPUZET', this%memoryPath) + ! + ! -- Call standard TspAptType allocate arrays + call this%TspAptType%apt_allocate_arrays() + ! + ! -- Initialize + do n = 1, this%ncv + this%tempinfl(n) = DZERO + this%tempuzet(n) = DZERO + end do + ! + ! -- Return + return + end subroutine uze_allocate_arrays + + !> @brief Deallocate memory + !< + subroutine uze_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + ! -- dummy + class(GweUzeType) :: this + ! + ! -- Deallocate scalars + call mem_deallocate(this%idxbudinfl) + call mem_deallocate(this%idxbudrinf) + call mem_deallocate(this%idxbuduzet) + call mem_deallocate(this%idxbudritm) + call mem_deallocate(this%idxbudtheq) + ! + ! -- Deallocate time series + call mem_deallocate(this%tempinfl) + call mem_deallocate(this%tempuzet) + ! + ! -- Deallocate scalars in TspAptType + call this%TspAptType%bnd_da() + ! + ! -- Return + return + end subroutine uze_da + + !> @brief Infiltration term + !! + !! Accounts for energy added to the subsurface via infiltration, for example, + !! energy entering the model domain via rainfall or irrigation. + !< + subroutine uze_infl_term(this, ientry, n1, n2, rrate, & + rhsval, hcofval) + ! -- dummy + class(GweUzeType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + real(DP) :: h, r + ! + n1 = this%flowbudptr%budterm(this%idxbudinfl)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudinfl)%id2(ientry) + ! + ! -- Note that qbnd is negative for negative infiltration + qbnd = this%flowbudptr%budterm(this%idxbudinfl)%flow(ientry) + if (qbnd < DZERO) then + ctmp = this%xnewpak(n1) + h = qbnd + r = DZERO + else + ctmp = this%tempinfl(n1) + h = DZERO + r = -qbnd * ctmp + end if + if (present(rrate)) rrate = qbnd * ctmp * this%eqnsclfac + if (present(rhsval)) rhsval = r * this%eqnsclfac + if (present(hcofval)) hcofval = h * this%eqnsclfac + ! + ! -- Return + return + end subroutine uze_infl_term + + !> @brief Rejected infiltration term + !! + !! Accounts for energy that is added to the model from specifying an + !! infiltration rate and temperature, but is subsequently removed from + !! the model as that portion of the infiltration that is rejected (and + !! NOT transferred to another advanced package via the MVR/MVT packages). + !< + subroutine uze_rinf_term(this, ientry, n1, n2, rrate, & + rhsval, hcofval) + ! -- dummy + class(GweUzeType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + ! + n1 = this%flowbudptr%budterm(this%idxbudrinf)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudrinf)%id2(ientry) + qbnd = this%flowbudptr%budterm(this%idxbudrinf)%flow(ientry) + ctmp = this%tempinfl(n1) + if (present(rrate)) rrate = ctmp * qbnd * this%eqnsclfac + if (present(rhsval)) rhsval = DZERO + if (present(hcofval)) hcofval = qbnd * this%eqnsclfac + ! + ! -- Return + return + end subroutine uze_rinf_term + + !> @brief Evapotranspiration from the unsaturated-zone term + !! + !! Accounts for thermal cooling in the unsaturated zone as a result of + !! evapotranspiration from the unsaturated zone. Amount of water converted + !! to vapor phase (UZET) determined by GWF model + !< + subroutine uze_uzet_term(this, ientry, n1, n2, rrate, rhsval, hcofval) + ! -- dummy + class(GweUzeType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + real(DP) :: omega + ! + n1 = this%flowbudptr%budterm(this%idxbuduzet)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbuduzet)%id2(ientry) + ! -- Note that qbnd is negative for uzet + qbnd = this%flowbudptr%budterm(this%idxbuduzet)%flow(ientry) + ctmp = this%tempuzet(n1) + if (this%xnewpak(n1) < ctmp) then + omega = DONE + else + omega = DZERO + end if + if (present(rrate)) & + rrate = (omega * qbnd * this%xnewpak(n1) + & + (DONE - omega) * qbnd * ctmp) * this%eqnsclfac + if (present(rhsval)) rhsval = -(DONE - omega) * qbnd * ctmp * this%eqnsclfac + if (present(hcofval)) hcofval = omega * qbnd * this%eqnsclfac + ! + ! -- Return + return + end subroutine uze_uzet_term + + !> @brief Rejected infiltration to MVR/MVT term + !! + !! Accounts for energy that is added to the model from specifying an + !! infiltration rate and temperature, but does not infiltrate into the + !! subsurface. This subroutine is called when the rejected infiltration + !! is transferred to another advanced package via the MVR/MVT packages. + !< + subroutine uze_ritm_term(this, ientry, n1, n2, rrate, & + rhsval, hcofval) + ! -- dummy + class(GweUzeType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout), optional :: rrate + real(DP), intent(inout), optional :: rhsval + real(DP), intent(inout), optional :: hcofval + ! -- local + real(DP) :: qbnd + real(DP) :: ctmp + ! + n1 = this%flowbudptr%budterm(this%idxbudritm)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudritm)%id2(ientry) + qbnd = this%flowbudptr%budterm(this%idxbudritm)%flow(ientry) + ctmp = this%tempinfl(n1) + if (present(rrate)) rrate = ctmp * qbnd * this%eqnsclfac + if (present(rhsval)) rhsval = DZERO + if (present(hcofval)) hcofval = qbnd * this%eqnsclfac + ! + ! -- Return + return + end subroutine uze_ritm_term + + !> @brief Heat transferred through thermal equilibrium with the solid phase + !! + !! Accounts for the transfer of energy from the liquid phase to the solid + !! phase as a result of the instantaneous thermal equilibrium assumption. + !< + subroutine uze_theq_term(this, ientry, n1, n2, rrate) + ! -- modules + use ConstantsModule, only: LENBUDTXT + ! -- dummy + class(GweUzeType) :: this + integer(I4B), intent(in) :: ientry + integer(I4B), intent(inout) :: n1 + integer(I4B), intent(inout) :: n2 + real(DP), intent(inout) :: rrate + ! -- local + real(DP) :: r + integer(I4B) :: i + character(len=LENBUDTXT) :: flowtype + ! + r = DZERO + n1 = this%flowbudptr%budterm(this%idxbudgwf)%id1(ientry) + n2 = this%flowbudptr%budterm(this%idxbudgwf)%id2(ientry) + if (this%iboundpak(n1) /= 0) then + do i = 1, this%budobj%nbudterm + flowtype = this%budobj%budterm(i)%flowtype + select case (trim(adjustl(flowtype))) + case ('THERMAL-EQUIL') + ! -- Skip + continue + case default + r = r - this%budobj%budterm(i)%flow(ientry) + end select + end do + end if + rrate = r + ! + ! -- Return + return + end subroutine uze_theq_term + + !> @brief Define UZE Observation + !! + !! This subroutine: + !! - Stores observation types supported by the parent APT package. + !! - Overrides BndType%bnd_df_obs + !< + subroutine uze_df_obs(this) + ! -- dummy + class(GweUzeType) :: this + ! -- local + integer(I4B) :: indx + ! + ! -- Store obs type and assign procedure pointer + ! for temperature observation type. + call this%obs%StoreObsType('temperature', .false., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for flow between uze cells. + call this%obs%StoreObsType('flow-ja-face', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID12 + ! + ! -- Store obs type and assign procedure pointer + ! for from-mvr observation type. + call this%obs%StoreObsType('from-mvr', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- to-mvr not supported for uze + !call this%obs%StoreObsType('to-mvr', .true., indx) + !this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for storage observation type. + call this%obs%StoreObsType('storage', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for constant observation type. + call this%obs%StoreObsType('constant', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for observation type: uze + call this%obs%StoreObsType('uze', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for observation type. + call this%obs%StoreObsType('infiltration', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for observation type. + call this%obs%StoreObsType('rej-inf', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for observation type. + call this%obs%StoreObsType('uzet', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for observation type. + call this%obs%StoreObsType('rej-inf-to-mvr', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Store obs type and assign procedure pointer + ! for observation type. + call this%obs%StoreObsType('thermal-equil', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => apt_process_obsID + ! + ! -- Return + return + end subroutine uze_df_obs + + !> @brief Process package specific obs + !! + !! Method to process specific observations for this package. + !< + subroutine uze_rp_obs(this, obsrv, found) + ! -- dummy + class(GweUzeType), intent(inout) :: this !< package class + type(ObserveType), intent(inout) :: obsrv !< observation object + logical, intent(inout) :: found !< indicate whether observation was found + ! + found = .true. + select case (obsrv%ObsTypeId) + case ('INFILTRATION') + call this%rp_obs_byfeature(obsrv) + case ('REJ-INF') + call this%rp_obs_byfeature(obsrv) + case ('UZET') + call this%rp_obs_byfeature(obsrv) + case ('REJ-INF-TO-MVR') + call this%rp_obs_byfeature(obsrv) + case ('THERMAL-EQUIL') + call this%rp_obs_byfeature(obsrv) + case default + found = .false. + end select + ! + return + end subroutine uze_rp_obs + + !> @brief Calculate observation value and pass it back to APT + !< + subroutine uze_bd_obs(this, obstypeid, jj, v, found) + ! -- dummy + class(GweUzeType), intent(inout) :: this + character(len=*), intent(in) :: obstypeid + real(DP), intent(inout) :: v + integer(I4B), intent(in) :: jj + logical, intent(inout) :: found + ! -- local + integer(I4B) :: n1, n2 + ! + found = .true. + select case (obstypeid) + case ('INFILTRATION') + if (this%iboundpak(jj) /= 0 .and. this%idxbudinfl > 0) then + call this%uze_infl_term(jj, n1, n2, v) + end if + case ('REJ-INF') + if (this%iboundpak(jj) /= 0 .and. this%idxbudrinf > 0) then + call this%uze_rinf_term(jj, n1, n2, v) + end if + case ('UZET') + if (this%iboundpak(jj) /= 0 .and. this%idxbuduzet > 0) then + call this%uze_uzet_term(jj, n1, n2, v) + end if + case ('REJ-INF-TO-MVR') + if (this%iboundpak(jj) /= 0 .and. this%idxbudritm > 0) then + call this%uze_ritm_term(jj, n1, n2, v) + end if + case ('THERMAL-EQUIL') + if (this%iboundpak(jj) /= 0 .and. this%idxbudtheq > 0) then + call this%uze_theq_term(jj, n1, n2, v) + end if + case default + found = .false. + end select + ! + ! -- Return + return + end subroutine uze_bd_obs + + !> @brief Sets the stress period attributes for keyword use. + !< + subroutine uze_set_stressperiod(this, itemno, keyword, found) + ! -- modules + use TimeSeriesManagerModule, only: read_value_or_time_series_adv + ! -- dummy + class(GweUzeType), intent(inout) :: this + integer(I4B), intent(in) :: itemno + character(len=*), intent(in) :: keyword + logical, intent(inout) :: found + ! -- local + character(len=LINELENGTH) :: temp_text + integer(I4B) :: ierr + integer(I4B) :: jj + real(DP), pointer :: bndElem => null() + ! + ! INFILTRATION + ! UZET + ! + found = .true. + select case (keyword) + case ('INFILTRATION') + ierr = this%apt_check_valid(itemno) + if (ierr /= 0) then + goto 999 + end if + call this%parser%GetString(temp_text) + jj = 1 + bndElem => this%tempinfl(itemno) + call read_value_or_time_series_adv(temp_text, itemno, jj, bndElem, & + this%packName, 'BND', this%tsManager, & + this%iprpak, 'INFILTRATION') + case ('UZET') + ierr = this%apt_check_valid(itemno) + if (ierr /= 0) then + goto 999 + end if + call this%parser%GetString(temp_text) + jj = 1 + bndElem => this%tempuzet(itemno) + call read_value_or_time_series_adv(temp_text, itemno, jj, bndElem, & + this%packName, 'BND', this%tsManager, & + this%iprpak, 'UZET') + case default + ! + ! -- Keyword not recognized so return to caller with found = .false. + found = .false. + end select + ! +999 continue + ! + ! -- Return + return + end subroutine uze_set_stressperiod + +end module GweUzeModule diff --git a/src/Model/GroundWaterTransport/gwt1.f90 b/src/Model/GroundWaterTransport/gwt1.f90 index 8f32e270e72..ad8dd762bba 100644 --- a/src/Model/GroundWaterTransport/gwt1.f90 +++ b/src/Model/GroundWaterTransport/gwt1.f90 @@ -155,7 +155,7 @@ subroutine gwt_df(this) ! ! -- Define packages and utility objects call this%dis%dis_df() - call this%fmi%fmi_df(this%dis) + call this%fmi%fmi_df(this%dis, 1) if (this%inmvt > 0) call this%mvt%mvt_df(this%dis) if (this%inadv > 0) call this%adv%adv_df() if (this%indsp > 0) call this%dsp%dsp_df(this%dis) @@ -377,7 +377,6 @@ subroutine gwt_ad(this) call this%fmi%fmi_ad(this%x) ! ! -- Advance - !if(this%inmst > 0) call this%mst%mst_ad() if (this%indsp > 0) call this%dsp%dsp_ad() if (this%inssm > 0) call this%ssm%ssm_ad() do ip = 1, this%bndlist%Count() diff --git a/src/Model/GroundWaterTransport/gwt1cnc1.f90 b/src/Model/GroundWaterTransport/gwt1cnc1.f90 index 366a094c2a1..39b00d2abbd 100644 --- a/src/Model/GroundWaterTransport/gwt1cnc1.f90 +++ b/src/Model/GroundWaterTransport/gwt1cnc1.f90 @@ -134,10 +134,13 @@ end subroutine cnc_allocate_arrays !> @brief Constant concentration/temperature read and prepare (rp) routine !< subroutine cnc_rp(this) + ! -- modules use SimModule, only: store_error use InputOutputModule, only: lowcase implicit none + ! -- dummy class(GwtCncType), intent(inout) :: this + ! -- local integer(I4B) :: i, node, ibd, ierr character(len=30) :: nodestr character(len=LENVARNAME) :: dvtype diff --git a/src/Model/GroundWaterTransport/gwt1dsp1.f90 b/src/Model/GroundWaterTransport/gwt1dsp1.f90 index 427c7701e86..0cd1f598b55 100644 --- a/src/Model/GroundWaterTransport/gwt1dsp1.f90 +++ b/src/Model/GroundWaterTransport/gwt1dsp1.f90 @@ -806,7 +806,7 @@ subroutine calcdispcoef(this) ! -- set iavgmeth = 1 to use arithmetic averaging for effective dispersion iavgmeth = 1 ! - ! -- Proces connections + ! -- Process connections nodes = size(this%d11) do n = 1, nodes if (this%fmi%ibdgwfsat0(n) == 0) cycle diff --git a/src/Model/GroundWaterTransport/gwt1lkt1.f90 b/src/Model/GroundWaterTransport/gwt1lkt1.f90 index e8775deec83..9e441516268 100644 --- a/src/Model/GroundWaterTransport/gwt1lkt1.f90 +++ b/src/Model/GroundWaterTransport/gwt1lkt1.f90 @@ -542,12 +542,13 @@ end subroutine lkt_setup_budobj !> @brief Copy flow terms into this%budobj !< - subroutine lkt_fill_budobj(this, idx, x, ccratin, ccratout) + subroutine lkt_fill_budobj(this, idx, x, flowja, ccratin, ccratout) ! -- modules ! -- dummy class(GwtLktType) :: this integer(I4B), intent(inout) :: idx real(DP), dimension(:), intent(in) :: x + real(DP), dimension(:), contiguous, intent(inout) :: flowja real(DP), intent(inout) :: ccratin real(DP), intent(inout) :: ccratout ! -- local diff --git a/src/Model/GroundWaterTransport/gwt1mwt1.f90 b/src/Model/GroundWaterTransport/gwt1mwt1.f90 index 842a051235f..1cd782c9917 100644 --- a/src/Model/GroundWaterTransport/gwt1mwt1.f90 +++ b/src/Model/GroundWaterTransport/gwt1mwt1.f90 @@ -473,12 +473,13 @@ end subroutine mwt_setup_budobj !> @brief Copy flow terms into this%budobj !< - subroutine mwt_fill_budobj(this, idx, x, ccratin, ccratout) + subroutine mwt_fill_budobj(this, idx, x, flowja, ccratin, ccratout) ! -- modules ! -- dummy class(GwtMwtType) :: this integer(I4B), intent(inout) :: idx real(DP), dimension(:), intent(in) :: x + real(DP), dimension(:), contiguous, intent(inout) :: flowja real(DP), intent(inout) :: ccratin real(DP), intent(inout) :: ccratout ! -- local diff --git a/src/Model/GroundWaterTransport/gwt1sft1.f90 b/src/Model/GroundWaterTransport/gwt1sft1.f90 index fc6ffafc171..ef36c177631 100644 --- a/src/Model/GroundWaterTransport/gwt1sft1.f90 +++ b/src/Model/GroundWaterTransport/gwt1sft1.f90 @@ -502,12 +502,13 @@ end subroutine sft_setup_budobj !> @brief Copy flow terms into this%budobj !< - subroutine sft_fill_budobj(this, idx, x, ccratin, ccratout) + subroutine sft_fill_budobj(this, idx, x, flowja, ccratin, ccratout) ! -- modules ! -- dummy class(GwtSftType) :: this integer(I4B), intent(inout) :: idx real(DP), dimension(:), intent(in) :: x + real(DP), dimension(:), contiguous, intent(inout) :: flowja real(DP), intent(inout) :: ccratin real(DP), intent(inout) :: ccratout ! -- local diff --git a/src/Model/GroundWaterTransport/gwt1uzt1.f90 b/src/Model/GroundWaterTransport/gwt1uzt1.f90 index 4006062fb28..bd67facdf71 100644 --- a/src/Model/GroundWaterTransport/gwt1uzt1.f90 +++ b/src/Model/GroundWaterTransport/gwt1uzt1.f90 @@ -466,12 +466,13 @@ subroutine uzt_setup_budobj(this, idx) end subroutine uzt_setup_budobj !> @brief Copy flow terms into this%budobj - subroutine uzt_fill_budobj(this, idx, x, ccratin, ccratout) + subroutine uzt_fill_budobj(this, idx, x, flowja, ccratin, ccratout) ! -- modules ! -- dummy class(GwtUztType) :: this integer(I4B), intent(inout) :: idx real(DP), dimension(:), intent(in) :: x + real(DP), dimension(:), contiguous, intent(inout) :: flowja real(DP), intent(inout) :: ccratin real(DP), intent(inout) :: ccratout ! -- local diff --git a/src/Model/ModelUtilities/FlowModelInterface.f90 b/src/Model/ModelUtilities/FlowModelInterface.f90 index 73b539a40af..993a70f34c4 100644 --- a/src/Model/ModelUtilities/FlowModelInterface.f90 +++ b/src/Model/ModelUtilities/FlowModelInterface.f90 @@ -29,6 +29,7 @@ module FlowModelInterfaceModule real(DP), dimension(:), pointer, contiguous :: gwfhead => null() !< pointer to the GWF head array real(DP), dimension(:), pointer, contiguous :: gwfsat => null() !< pointer to the GWF saturation array integer(I4B), dimension(:), pointer, contiguous :: ibdgwfsat0 => null() !< mark cells with saturation = 0 to exclude from dispersion + integer(I4B), pointer :: idryinactive => null() !< mark cells with an additional flag to exclude from deactivation (gwe will simulate conduction through dry cells) real(DP), dimension(:), pointer, contiguous :: gwfstrgss => null() !< pointer to flow model QSTOSS real(DP), dimension(:), pointer, contiguous :: gwfstrgsy => null() !< pointer to flow model QSTOSY integer(I4B), pointer :: igwfstrgss => null() !< indicates if gwfstrgss is available @@ -72,12 +73,13 @@ module FlowModelInterfaceModule !> @brief Define the flow model interface !< - subroutine fmi_df(this, dis) + subroutine fmi_df(this, dis, idryinactive) ! -- modules use SimModule, only: store_error ! -- dummy class(FlowModelInterfaceType) :: this class(DisBaseType), pointer, intent(in) :: dis + integer(I4B), intent(in) :: idryinactive ! -- formats character(len=*), parameter :: fmtfmi = & "(1x,/1x,'FMI -- FLOW MODEL INTERFACE, VERSION 2, 8/17/2023', & @@ -85,7 +87,7 @@ subroutine fmi_df(this, dis) character(len=*), parameter :: fmtfmi0 = & "(1x,/1x,'FMI -- FLOW MODEL INTERFACE,'& &' VERSION 2, 8/17/2023')" - + ! ! --print a message identifying the FMI package. if (this%iout > 0) then if (this%inunit /= 0) then @@ -120,6 +122,11 @@ subroutine fmi_df(this, dis) call this%initialize_gwfterms_from_gwfbndlist() end if ! + ! -- Set flag that stops dry flows from being deactivated in a GWE + ! transport model since conduction will still be simulated. + ! 0: GWE (skip deactivation step); 1: GWT (default: use existing code) + this%idryinactive = idryinactive + ! ! -- Return return end subroutine fmi_df @@ -181,6 +188,7 @@ subroutine fmi_da(this) call mem_deallocate(this%iuhds) call mem_deallocate(this%iumvr) call mem_deallocate(this%nflowpack) + call mem_deallocate(this%idryinactive) ! ! -- deallocate parent call this%NumericalPackageType%da() @@ -210,6 +218,7 @@ subroutine allocate_scalars(this) call mem_allocate(this%iuhds, 'IUHDS', this%memoryPath) call mem_allocate(this%iumvr, 'IUMVR', this%memoryPath) call mem_allocate(this%nflowpack, 'NFLOWPACK', this%memoryPath) + call mem_allocate(this%idryinactive, "IDRYINACTIVE", this%memoryPath) ! ! ! ! -- Initialize @@ -221,6 +230,7 @@ subroutine allocate_scalars(this) this%iuhds = 0 this%iumvr = 0 this%nflowpack = 0 + this%idryinactive = 1 ! ! -- Return return diff --git a/src/Model/ModelUtilities/GweCndOptions.f90 b/src/Model/ModelUtilities/GweCndOptions.f90 new file mode 100644 index 00000000000..86c5f1a7630 --- /dev/null +++ b/src/Model/ModelUtilities/GweCndOptions.f90 @@ -0,0 +1,12 @@ +module GweCndOptionsModule + use KindModule, only: I4B + implicit none + private + + !> @brief data structure (and helpers) for passing cnd option data + !< into the package, as opposed to reading it from file + type, public :: GweCndOptionsType + integer(I4B) :: ixt3d !< flag indicating xt3d is active: 1 = enabled, 2 = rhs + end type GweCndOptionsType + +end module GweCndOptionsModule diff --git a/src/Model/ModelUtilities/GweInputData.f90 b/src/Model/ModelUtilities/GweInputData.f90 new file mode 100644 index 00000000000..fb3493f2888 --- /dev/null +++ b/src/Model/ModelUtilities/GweInputData.f90 @@ -0,0 +1,211 @@ +module GweInputDataModule + + use KindModule, only: I4B, DP + use ConstantsModule, only: DZERO, LENMEMPATH + + implicit none + private + public :: GweInputDataType + public :: gweshared_dat_cr + public :: gweshared_dat_df + public :: set_gwe_dat_ptrs + + !> Data for sharing among multiple packages. Originally read in from + !< the EST package + + type GweInputDataType + + ! dim + integer(I4B) :: nnodes !< number of cells + + ! strings + character(len=LENMEMPATH) :: memoryPath = '' !< the location in the memory manager where the variables are stored + + ! est data to be share across multiple packages + real(DP), pointer :: gwerhow => null() !< Density of water (for GWE purposes, a constant scalar) + real(DP), pointer :: gwecpw => null() !< Heat capacity of water (non-spatially varying) + real(DP), pointer :: gwelatheatvap => null() !< latent heat of vaporization + real(DP), dimension(:), pointer, contiguous :: gwerhos => null() !< Density of the aquifer material + real(DP), dimension(:), pointer, contiguous :: gwecps => null() !< Heat capacity of solids (spatially varying) + + contains + + ! -- public + procedure, public :: gweshared_dat_df + procedure, public :: set_gwe_dat_ptrs + procedure, public :: gweshared_dat_da + ! -- private + procedure, private :: allocate_shared_vars + procedure, private :: set_gwe_shared_scalars + procedure, private :: set_gwe_shared_arrays + + end type GweInputDataType + +contains + +!> @brief Allocate the shared data +!< + subroutine gweshared_dat_cr(gwe_dat) + ! -- modules + ! -- dummy + type(GweInputDataType), pointer :: gwe_dat !< the input data block + ! + ! -- Create the object + allocate (gwe_dat) + ! + ! -- Return + return + end subroutine gweshared_dat_cr + +!> @brief Define the shared data +!< + subroutine gweshared_dat_df(this, nodes) + ! -- dummy + class(GweInputDataType) :: this !< the input data block + integer(I4B), intent(in) :: nodes + ! -- local + ! + ! -- Allocate variables + call this%allocate_shared_vars(nodes) + ! + ! -- Return + return + end subroutine gweshared_dat_df + + !> @brief Define the information this object holds + !! + !! Allocate strings for storing label names + !! Intended to be analogous to allocate_scalars() + !< + subroutine allocate_shared_vars(this, nodes) + ! -- dummy + class(GweInputDataType) :: this !< TspLabelsType object + integer(I4B), intent(in) :: nodes + ! -- local + integer(I4B) :: i + ! + allocate (this%gwecpw) + allocate (this%gwerhow) + allocate (this%gwelatheatvap) + allocate (this%gwerhos(nodes)) + allocate (this%gwecps(nodes)) + ! + ! -- Initialize values + this%gwecpw = DZERO + this%gwerhow = DZERO + this%gwelatheatvap = DZERO + do i = 1, nodes + this%gwecps(i) = DZERO + this%gwerhos(i) = DZERO + end do + ! + ! -- Return + return + end subroutine allocate_shared_vars + + !> @brief Allocate and read data from EST + !! + !! EST data, including heat capacity of water (cpw), density of water + !! (rhow), latent heat of vaporization (latheatvap), heat capacity of + !! the aquifer material (cps), and density of the aquifer material + !! (rhow) is used among other packages and is therefore stored in a + !! separate class + subroutine set_gwe_dat_ptrs(this, gwerhow, gwecpw, gwerhos, gwecps, & + gwelatheatvap) + ! -- dummy + class(GweInputDataType) :: this !< the input data block + real(DP), intent(in) :: gwerhow !< ptr to density of water specified in EST + real(DP), intent(in) :: gwecpw !< ptr to heat capacity of water specified in EST + real(DP), intent(in) :: gwerhos !< ptr to sptially-variably density of aquifer material specified in EST + real(DP), intent(in) :: gwecps !< ptr to sptially-variably heat capacity of aquifer material specified in EST + real(DP), intent(in), optional :: gwelatheatvap !< ptr to latent heat of vaporization specified in EST + ! + ! -- Allocate scalars + if (present(gwelatheatvap)) then + call this%set_gwe_shared_scalars(gwerhow, gwecpw, gwelatheatvap) + else + call this%set_gwe_shared_scalars(gwerhow, gwecpw) + end if + ! + ! -- Allocate arrays + call this%set_gwe_shared_arrays(gwerhos, gwecps) + ! + ! -- Return + return + end subroutine set_gwe_dat_ptrs + + !> @brief Set pointers to scalars read by the EST package + !! for use by other packages + !! + !! Set pointers to GWE-related scalars and arrays for use + !! by multiple packages. For example, a package capable of + !! simulating evaporation will need access to latent heat of + !! of vaporization. + !< + subroutine set_gwe_shared_scalars(this, gwerhow, gwecpw, gwelatheatvap) + ! -- dummy + class(GweInputDataType) :: this !< GweInputDataType object + real(DP), intent(in) :: gwerhow + real(DP), intent(in) :: gwecpw + real(DP), intent(in), optional :: gwelatheatvap + ! -- local + ! + ! -- Set the pointers + ! -- Fixed density of water to be used by GWE + this%gwerhow = gwerhow + ! -- Spatially constant heat capacity of water ! kluge note: "specific heat" (which is heat capacity per unit mass) is probably the more correct term + this%gwecpw = gwecpw + ! -- Latent heat of vaporization + if (present(gwelatheatvap)) then + this%gwelatheatvap = gwelatheatvap + end if + ! + ! -- Return + return + end subroutine set_gwe_shared_scalars + + !> @brief Set pointers to data arrays read by the EST package + !! for use by other packages + !! + !! Set pointers to GWE-related arrays for use + !! by multiple packages. + !< + subroutine set_gwe_shared_arrays(this, gwerhos, gwecps) + ! -- dummy + class(GweInputDataType) :: this !< GweInputDataType object + real(DP), intent(in) :: gwerhos + real(DP), intent(in) :: gwecps + ! -- local + ! + ! -- Set the pointers + ! -- Spatially-variable density of aquifer solid material + this%gwerhos = gwerhos + ! -- Spatially-variable heat capacity of aquifer solid material + this%gwecps = gwecps + ! + ! -- Return + return + end subroutine set_gwe_shared_arrays + + !> @ breif Deallocate memory + !! + !! Deallocate GWE shared data array memory + !< + subroutine gweshared_dat_da(this) + ! -- dummy + class(GweInputDataType) :: this !< the input data block + ! + ! -- Scalars + deallocate (this%gwelatheatvap) + deallocate (this%gwerhow) + deallocate (this%gwecpw) + ! + ! -- Arrays + deallocate (this%gwerhos) + deallocate (this%gwecps) + ! + ! -- Return + return + end subroutine gweshared_dat_da + +end module GweInputDataModule diff --git a/src/Model/ModelUtilities/ModelPackageInput.f90 b/src/Model/ModelUtilities/ModelPackageInput.f90 index 09782fd08d8..c60486c2569 100644 --- a/src/Model/ModelUtilities/ModelPackageInput.f90 +++ b/src/Model/ModelUtilities/ModelPackageInput.f90 @@ -14,8 +14,11 @@ module ModelPackageInputModule GWF_BASEPKG, GWF_MULTIPKG use GwtModule, only: GWT_NBASEPKG, GWT_NMULTIPKG, & GWT_BASEPKG, GWT_MULTIPKG + use GweModule, only: GWE_NBASEPKG, GWE_NMULTIPKG, & + GWE_BASEPKG, GWE_MULTIPKG implicit none + private public :: supported_model_packages public :: multi_package_type @@ -49,6 +52,11 @@ subroutine supported_model_packages(mtype, pkgtypes, numpkgs) allocate (pkgtypes(numpkgs)) pkgtypes = [GWT_BASEPKG, GWT_MULTIPKG] ! + case ('GWE6') + numpkgs = GWE_NBASEPKG + GWE_NMULTIPKG + allocate (pkgtypes(numpkgs)) + pkgtypes = [GWE_BASEPKG, GWE_MULTIPKG] + ! case default end select ! @@ -89,6 +97,14 @@ function multi_package_type(mtype_component, ptype_component, pkgtype) & end if end do ! + case ('GWE') + do n = 1, GWE_NMULTIPKG + if (GWE_MULTIPKG(n) == pkgtype) then + multi_package = .true. + exit + end if + end do + ! case default end select ! diff --git a/src/Model/ModelUtilities/Xt3dInterface.f90 b/src/Model/ModelUtilities/Xt3dInterface.f90 index f7ca17e1e81..d72f8a3e798 100644 --- a/src/Model/ModelUtilities/Xt3dInterface.f90 +++ b/src/Model/ModelUtilities/Xt3dInterface.f90 @@ -520,7 +520,7 @@ subroutine xt3d_fcpc(this, nodes, lsat) ! -- dummy class(Xt3dType) :: this integer(I4B), intent(in) :: nodes - logical, intent(in) :: lsat !< if true, then calculations made with saturated areas (should be false for dispersion) + logical, intent(in) :: lsat !< if true, then calculations made with saturated areas (should be false for solute dispersion; should be true for heat) ! -- local integer(I4B) :: n, m, ipos ! diff --git a/src/Model/TransportModel/tsp1.f90 b/src/Model/TransportModel/tsp1.f90 index f1de33b333a..31d1f928b64 100644 --- a/src/Model/TransportModel/tsp1.f90 +++ b/src/Model/TransportModel/tsp1.f90 @@ -157,7 +157,7 @@ end subroutine tsp_cr !! pointers. !< subroutine tsp_df(this) - ! -- dummy variables + ! -- dummy class(TransportModelType) :: this ! ! -- Return @@ -172,10 +172,9 @@ end subroutine tsp_df subroutine tsp_ac(this, sparse) ! -- modules use SparseModule, only: sparsematrix - ! -- dummy variables + ! -- dummy class(TransportModelType) :: this type(sparsematrix), intent(inout) :: sparse - ! -- local ! ! -- Return return @@ -191,7 +190,6 @@ subroutine tsp_mc(this, matrix_sln) ! -- dummy class(TransportModelType) :: this class(MatrixBaseType), pointer :: matrix_sln !< global system matrix - ! -- local ! ! -- Return return @@ -204,7 +202,7 @@ end subroutine tsp_mc !! memory for arrays required by the model object. !< subroutine tsp_ar(this) - ! -- dummy variables + ! -- dummy class(TransportModelType) :: this ! ! -- Return @@ -217,7 +215,7 @@ end subroutine tsp_ar !! the read and prepare (rp) routines of attached packages. !< subroutine tsp_rp(this) - ! -- dummy variables + ! -- dummy class(TransportModelType) :: this ! ! -- Return @@ -230,7 +228,7 @@ end subroutine tsp_rp !! the advance time step (ad) routines of attached packages. !< subroutine tsp_ad(this) - ! -- dummy variables + ! -- dummy class(TransportModelType) :: this ! ! -- Return @@ -243,7 +241,7 @@ end subroutine tsp_ad !! the fill coefficients (fc) routines of attached packages. !< subroutine tsp_fc(this, kiter, matrix_sln, inwtflag) - ! -- dummy variables + ! -- dummy class(TransportModelType) :: this integer(I4B), intent(in) :: kiter class(MatrixBaseType), pointer :: matrix_sln @@ -268,7 +266,6 @@ subroutine tsp_cc(this, innertot, kiter, iend, icnvgmod, cpak, ipak, dpak) character(len=LENPAKLOC), intent(inout) :: cpak integer(I4B), intent(inout) :: ipak real(DP), intent(inout) :: dpak - ! -- local ! ! -- Return return @@ -280,11 +277,10 @@ end subroutine tsp_cc !! intercell flows (flowja) !< subroutine tsp_cq(this, icnvg, isuppress_output) - ! -- dummy variables + ! -- dummy class(TransportModelType) :: this integer(I4B), intent(in) :: icnvg integer(I4B), intent(in) :: isuppress_output - ! -- local ! ! -- Return return @@ -344,16 +340,16 @@ subroutine tsp_ot(this, inmst) idvprint = this%oc%set_print_flag(trim(this%depvartype), & this%icnvg, endofperiod) ! - ! Calculate and save observations + ! -- Calculate and save observations call this%tsp_ot_obs() ! - ! Save and print flows + ! -- Save and print flows call this%tsp_ot_flow(icbcfl, ibudfl, icbcun, inmst) ! - ! Save and print dependent variables + ! -- Save and print dependent variables call this%tsp_ot_dv(idvsave, idvprint, ipflag) ! - ! Print budget summaries + ! -- Print budget summaries call this%tsp_ot_bdsummary(ibudfl, ipflag) ! ! -- Timing Output; if any dependendent variables or budgets @@ -380,14 +376,14 @@ subroutine tsp_ot_obs(this) ! -- Calculate and save observations call this%obs%obs_bd() call this%obs%obs_ot() - + ! ! -- Calculate and save package obserations do ip = 1, this%bndlist%Count() packobj => GetBndFromList(this%bndlist, ip) call packobj%bnd_bd_obs() call packobj%bnd_ot_obs() end do - + ! end subroutine tsp_ot_obs !> @brief Generalized transport model output routine @@ -411,11 +407,12 @@ subroutine tsp_ot_flow(this, icbcfl, ibudfl, icbcun, inmst) if (this%inssm > 0) then call this%ssm%ssm_ot_flow(icbcfl=icbcfl, ibudfl=0, icbcun=icbcun) end if + ! do ip = 1, this%bndlist%Count() packobj => GetBndFromList(this%bndlist, ip) call packobj%bnd_ot_model_flows(icbcfl=icbcfl, ibudfl=0, icbcun=icbcun) end do - + ! ! -- Save advanced package flows do ip = 1, this%bndlist%Count() packobj => GetBndFromList(this%bndlist, ip) @@ -424,11 +421,11 @@ subroutine tsp_ot_flow(this, icbcfl, ibudfl, icbcun, inmst) if (this%inmvt > 0) then call this%mvt%mvt_ot_saveflow(icbcfl, ibudfl) end if - + ! ! -- Print Model (GWT or GWE) flows - ! no need to print flowja - ! no need to print mst - ! no need to print fmi + ! no need to print flowja + ! no need to print mst + ! no need to print fmi if (this%inssm > 0) then call this%ssm%ssm_ot_flow(icbcfl=icbcfl, ibudfl=ibudfl, icbcun=0) end if @@ -436,16 +433,17 @@ subroutine tsp_ot_flow(this, icbcfl, ibudfl, icbcun, inmst) packobj => GetBndFromList(this%bndlist, ip) call packobj%bnd_ot_model_flows(icbcfl=icbcfl, ibudfl=ibudfl, icbcun=0) end do - + ! ! -- Print advanced package flows do ip = 1, this%bndlist%Count() packobj => GetBndFromList(this%bndlist, ip) call packobj%bnd_ot_package_flows(icbcfl=0, ibudfl=ibudfl) end do + ! if (this%inmvt > 0) then call this%mvt%mvt_ot_printflow(icbcfl, ibudfl) end if - + ! end subroutine tsp_ot_flow !> @brief Generalized transport model output routine @@ -499,8 +497,8 @@ subroutine tsp_ot_dv(this, idvsave, idvprint, ipflag) packobj => GetBndFromList(this%bndlist, ip) call packobj%bnd_ot_dv(idvsave, idvprint) end do - - ! -- save head and print head + ! + ! -- Save head and print head call this%oc%oc_ot(ipflag) ! ! -- Return @@ -524,18 +522,18 @@ subroutine tsp_ot_bdsummary(this, ibudfl, ipflag) packobj => GetBndFromList(this%bndlist, ip) call packobj%bnd_ot_bdsummary(kstp, kper, this%iout, ibudfl) end do - - ! -- mover budget summary + ! + ! -- Mover budget summary if (this%inmvt > 0) then call this%mvt%mvt_ot_bdsummary(ibudfl) end if - - ! -- model budget summary + ! + ! -- Model budget summary if (ibudfl /= 0) then ipflag = 1 call this%budget%budget_ot(kstp, kper, this%iout) end if - + ! ! -- Write to budget csv call this%budget%writecsv(totim) ! @@ -645,10 +643,9 @@ subroutine ftype_check(this, indis, inmst) ! -- dummy class(TransportModelType) :: this integer(I4B), intent(in) :: indis - integer(I4B), intent(in) :: inmst + integer(I4B), intent(in) :: inmst !< representative of both inmst and inest depending on model type ! -- local character(len=LINELENGTH) :: errmsg -! ------------------------------------------------------------------------------ ! ! -- Check for IC6, DIS(u), and MST. Stop if not present. if (this%inic == 0) then @@ -691,15 +688,15 @@ subroutine create_lstfile(this, lst_fname, model_fname, defined) ! -- local integer(I4B) :: i, istart, istop ! - ! -- set list file name if not provided + ! -- Set list file name if not provided if (.not. defined) then ! - ! -- initialize + ! -- Initialize lst_fname = ' ' istart = 0 istop = len_trim(model_fname) ! - ! -- identify '.' character position from back of string + ! -- Identify '.' character position from back of string do i = istop, 1, -1 if (model_fname(i:i) == '.') then istart = i @@ -707,20 +704,20 @@ subroutine create_lstfile(this, lst_fname, model_fname, defined) end if end do ! - ! -- if not found start from string end + ! -- If not found start from string end if (istart == 0) istart = istop + 1 ! - ! -- set list file name + ! -- Set list file name lst_fname = model_fname(1:istart) istop = istart + 3 lst_fname(istart:istop) = '.lst' end if ! - ! -- create the list file + ! -- Create the list file this%iout = getunit() call openfile(this%iout, 0, lst_fname, 'LIST', filstat_opt='REPLACE') ! - ! -- write list file header + ! -- Write list file header call write_listfile_header(this%iout, 'GROUNDWATER TRANSPORT MODEL (GWT)') ! ! -- Return @@ -730,7 +727,9 @@ end subroutine create_lstfile !> @brief Write model name file options to list file !< subroutine log_namfile_options(this, found) + ! -- modules use GwfNamInputModule, only: GwfNamParamFoundType + ! -- dummy class(TransportModelType) :: this type(GwfNamParamFoundType), intent(in) :: found ! @@ -810,10 +809,10 @@ subroutine create_tsp_packages(this, indis) ! -- Initialize indis = 0 ! - ! -- set input memory paths, input/model and input/model/namfile + ! -- Set input memory paths, input/model and input/model/namfile model_mempath = create_mem_path(component=this%name, context=idm_context) ! - ! -- set pointers to model path package info + ! -- Set pointers to model path package info call mem_setptr(pkgtypes, 'PKGTYPES', model_mempath) call mem_setptr(pkgnames, 'PKGNAMES', model_mempath) call mem_setptr(mempaths, 'MEMPATHS', model_mempath) @@ -821,13 +820,13 @@ subroutine create_tsp_packages(this, indis) ! do n = 1, size(pkgtypes) ! - ! attributes for this input package + ! -- Attributes for this input package pkgtype = pkgtypes(n) pkgname = pkgnames(n) mempath = mempaths(n) inunit => inunits(n) ! - ! -- create dis package as it is a prerequisite for other packages + ! -- Create dis package as it is a prerequisite for other packages select case (pkgtype) case ('DIS6') indis = 1 diff --git a/src/Model/TransportModel/tsp1apt1.f90 b/src/Model/TransportModel/tsp1apt1.f90 index 4d2bb855b0d..b63a3b70569 100644 --- a/src/Model/TransportModel/tsp1apt1.f90 +++ b/src/Model/TransportModel/tsp1apt1.f90 @@ -61,7 +61,6 @@ module TspAptModule character(len=LENFTYPE) :: ftype = 'APT' character(len=LENVARNAME) :: text = ' APT' - character(len=LENVARNAME) :: tsptype = 'GWT' !< to be removed once TSP refactor is further sorted out type, extends(BndType) :: TspAptType @@ -80,6 +79,7 @@ module TspAptModule integer(I4B), pointer :: idxprepak => null() !< budget-object index that precedes package-specific budget objects integer(I4B), pointer :: idxlastpak => null() !< budget-object index of last package-specific budget object real(DP), dimension(:), pointer, contiguous :: strt => null() !< starting feature concentration (or temperature) + real(DP), dimension(:), pointer, contiguous :: ktf => null() !< thermal conductivity between the apt and groundwater cell real(DP), dimension(:), pointer, contiguous :: rfeatthk => null() !< thickness of streambed/lakebed/filter-pack material through which thermal conduction occurs integer(I4B), dimension(:), pointer, contiguous :: idxlocnode => null() !< map position in global rhs and x array of pack entry integer(I4B), dimension(:), pointer, contiguous :: idxpakdiag => null() !< map diag position of feature in global amat @@ -1274,6 +1274,8 @@ subroutine apt_da(this) call mem_deallocate(this%qsto) call mem_deallocate(this%ccterm) call mem_deallocate(this%strt) + call mem_deallocate(this%ktf) + call mem_deallocate(this%rfeatthk) call mem_deallocate(this%lauxvar) call mem_deallocate(this%xoldpak) if (this%imatrows == 0) then @@ -1546,6 +1548,8 @@ subroutine apt_read_cvs(this) ! ! -- allocate apt data call mem_allocate(this%strt, this%ncv, 'STRT', this%memoryPath) + call mem_allocate(this%ktf, this%ncv, 'KTF', this%memoryPath) + call mem_allocate(this%rfeatthk, this%ncv, 'RFEATTHK', this%memoryPath) call mem_allocate(this%lauxvar, this%naux, this%ncv, 'LAUXVAR', & this%memoryPath) ! @@ -1562,6 +1566,8 @@ subroutine apt_read_cvs(this) ! do n = 1, this%ncv this%strt(n) = DEP20 + this%ktf(n) = DZERO + this%rfeatthk(n) = DZERO this%lauxvar(:, n) = DZERO this%xoldpak(n) = DEP20 if (this%imatrows == 0) then @@ -1609,6 +1615,22 @@ subroutine apt_read_cvs(this) ! -- strt this%strt(n) = this%parser%GetDouble() ! + ! -- If GWE model, read additional thermal conductivity terms + if (this%depvartype == 'TEMPERATURE') then + ! -- Skip for UZE + if (trim(adjustl(this%text)) /= 'UZE') then + this%ktf(n) = this%parser%GetDouble() + this%rfeatthk(n) = this%parser%GetDouble() + if (this%rfeatthk(n) <= DZERO) then + write (errmsg, '(4x,a)') & + '****ERROR. Specified thickness used for thermal & + &conduction MUST BE > 0 else divide by zero error occurs' + call store_error(errmsg) + cycle + end if + end if + end if + ! ! -- get aux data do iaux = 1, this%naux call this%parser%GetString(caux(iaux)) @@ -2311,7 +2333,7 @@ subroutine apt_fill_budobj(this, x, flowja) ! ! -- individual package terms processed last idx = this%idxprepak - call this%pak_fill_budobj(idx, x, ccratin, ccratout) + call this%pak_fill_budobj(idx, x, flowja, ccratin, ccratout) ! ! --Terms are filled, now accumulate them for this time step call this%budobj%accumulate_terms() @@ -2322,12 +2344,13 @@ end subroutine apt_fill_budobj !> @brief Copy flow terms into this%budobj, must be overridden !< - subroutine pak_fill_budobj(this, idx, x, ccratin, ccratout) + subroutine pak_fill_budobj(this, idx, x, flowja, ccratin, ccratout) ! -- modules ! -- dummy class(TspAptType) :: this integer(I4B), intent(inout) :: idx real(DP), dimension(:), intent(in) :: x + real(DP), dimension(:), contiguous, intent(inout) :: flowja real(DP), intent(inout) :: ccratin real(DP), intent(inout) :: ccratout ! -- local @@ -2790,7 +2813,7 @@ subroutine apt_rp_obs(this) ' must be assigned to a feature with a unique boundname.' call store_error(errmsg) end if - case ('LKT', 'SFT', 'MWT', 'UZT') + case ('LKT', 'SFT', 'MWT', 'UZT', 'LKE', 'SFE', 'MWE', 'UZE') call this%rp_obs_budterm(obsrv, & this%flowbudptr%budterm(this%idxbudgwf)) case ('FLOW-JA-FACE') @@ -2875,7 +2898,7 @@ subroutine apt_bd_obs(this) if (this%iboundpak(jj) /= 0) then v = this%xnewpak(jj) end if - case ('LKT', 'SFT', 'MWT', 'UZT') + case ('LKT', 'SFT', 'MWT', 'UZT', 'LKE', 'SFE', 'MWE', 'UZE') n = this%flowbudptr%budterm(this%idxbudgwf)%id1(jj) if (this%iboundpak(n) /= 0) then igwfnode = this%flowbudptr%budterm(this%idxbudgwf)%id2(jj) diff --git a/src/Model/TransportModel/tsp1fmi1.f90 b/src/Model/TransportModel/tsp1fmi1.f90 index fe92e15fdcf..3a282bc501d 100644 --- a/src/Model/TransportModel/tsp1fmi1.f90 +++ b/src/Model/TransportModel/tsp1fmi1.f90 @@ -63,6 +63,7 @@ module TspFmiModule procedure :: read_options => gwtfmi_read_options procedure :: set_aptbudobj_pointer procedure :: read_packagedata => gwtfmi_read_packagedata + procedure :: set_active_status end type TspFmiType @@ -148,10 +149,6 @@ subroutine fmi_ad(this, cnew) real(DP), intent(inout), dimension(:) :: cnew ! -- local integer(I4B) :: n - integer(I4B) :: m - integer(I4B) :: ipos - real(DP) :: crewet, tflow, flownm - character(len=15) :: nodestr character(len=*), parameter :: fmtdry = & &"(/1X,'WARNING: DRY CELL ENCOUNTERED AT ',a,'; RESET AS INACTIVE & &WITH DRY CONCENTRATION = ', G13.5)" @@ -186,59 +183,10 @@ subroutine fmi_ad(this, cnew) end do end if ! - ! -- if flow cell is dry, then set gwt%ibound = 0 and conc to dry - do n = 1, this%dis%nodes - ! - ! -- Calculate the ibound-like array that has 0 if saturation - ! is zero and 1 otherwise - if (this%gwfsat(n) > DZERO) then - this%ibdgwfsat0(n) = 1 - else - this%ibdgwfsat0(n) = 0 - end if - ! - ! -- Check if active transport cell is inactive for flow - if (this%ibound(n) > 0) then - if (this%gwfhead(n) == DHDRY) then - ! -- transport cell should be made inactive - this%ibound(n) = 0 - cnew(n) = DHDRY - call this%dis%noder_to_string(n, nodestr) - write (this%iout, fmtdry) trim(nodestr), DHDRY - end if - end if - ! - ! -- Convert dry transport cell to active if flow has rewet - if (cnew(n) == DHDRY) then - if (this%gwfhead(n) /= DHDRY) then - ! - ! -- obtain weighted concentration - crewet = DZERO - tflow = DZERO - do ipos = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1 - m = this%dis%con%ja(ipos) - flownm = this%gwfflowja(ipos) - if (flownm > 0) then - if (this%ibound(m) /= 0) then - crewet = crewet + cnew(m) * flownm - tflow = tflow + this%gwfflowja(ipos) - end if - end if - end do - if (tflow > DZERO) then - crewet = crewet / tflow - else - crewet = DZERO - end if - ! - ! -- cell is now wet - this%ibound(n) = 1 - cnew(n) = crewet - call this%dis%noder_to_string(n, nodestr) - write (this%iout, fmtrewet) trim(nodestr), crewet - end if - end if - end do + ! -- set inactive transport cell status + if (this%idryinactive /= 0) then + call this%set_active_status(cnew) + end if ! ! -- Return return @@ -258,6 +206,7 @@ subroutine fmi_fc(this, nodes, cold, nja, matrix_sln, idxglo, rhs) real(DP), intent(inout), dimension(nodes) :: rhs ! -- local integer(I4B) :: n, idiag, idiag_sln + real(DP) :: qcorr ! ! -- Calculate the flow imbalance error and make a correction for it if (this%iflowerr /= 0) then @@ -267,7 +216,9 @@ subroutine fmi_fc(this, nodes, cold, nja, matrix_sln, idxglo, rhs) do n = 1, nodes idiag = this%dis%con%ia(n) idiag_sln = idxglo(idiag) - call matrix_sln%add_value_pos(idiag_sln, -this%gwfflowja(idiag)) + !call matrix_sln%add_value_pos(idiag_sln, -this%gwfflowja(idiag)) + qcorr = -this%gwfflowja(idiag) * this%eqnsclfac + call matrix_sln%add_value_pos(idiag_sln, qcorr) end do end if ! @@ -422,6 +373,7 @@ subroutine gwtfmi_da(this) call mem_deallocate(this%iuhds) call mem_deallocate(this%iumvr) call mem_deallocate(this%nflowpack) + call mem_deallocate(this%idryinactive) ! ! -- deallocate parent call this%NumericalPackageType%da() @@ -489,6 +441,93 @@ subroutine gwtfmi_allocate_arrays(this, nodes) return end subroutine gwtfmi_allocate_arrays + !> @brief Set gwt transport cell status + !! + !! Dry GWF cells are treated differently by GWT and GWE. Transport does not + !! occur in deactivated GWF cells; however, GWE still simulates conduction + !! through dry cells. + !< + subroutine set_active_status(this, cnew) + ! -- modules + use ConstantsModule, only: DHDRY + ! -- dummy + class(TspFmiType) :: this + real(DP), intent(inout), dimension(:) :: cnew + ! -- local + integer(I4B) :: n + integer(I4B) :: m + integer(I4B) :: ipos + real(DP) :: crewet, tflow, flownm + character(len=15) :: nodestr + ! -- formats + character(len=*), parameter :: fmtoutmsg1 = & + "(1x,'WARNING: DRY CELL ENCOUNTERED AT ', a,'; RESET AS INACTIVE WITH & + &DRY ', a, '=', G13.5)" + character(len=*), parameter :: fmtoutmsg2 = & + &"(1x,'DRY CELL REACTIVATED AT', a, 'WITH STARTING', a, '=', G13.5)" + ! + do n = 1, this%dis%nodes + ! -- Calculate the ibound-like array that has 0 if saturation + ! is zero and 1 otherwise + if (this%gwfsat(n) > DZERO) then + this%ibdgwfsat0(n) = 1 + else + this%ibdgwfsat0(n) = 0 + end if + ! + ! -- Check if active transport cell is inactive for flow + if (this%ibound(n) > 0) then + if (this%gwfhead(n) == DHDRY) then + ! -- transport cell should be made inactive + this%ibound(n) = 0 + cnew(n) = DHDRY + call this%dis%noder_to_string(n, nodestr) + write (this%iout, fmtoutmsg1) & + trim(nodestr), trim(adjustl(this%depvartype)), DHDRY + end if + end if + end do + ! + ! -- if flow cell is dry, then set gwt%ibound = 0 and conc to dry + do n = 1, this%dis%nodes + ! + ! -- Convert dry transport cell to active if flow has rewet + if (cnew(n) == DHDRY) then + if (this%gwfhead(n) /= DHDRY) then + ! + ! -- obtain weighted concentration/temperature + crewet = DZERO + tflow = DZERO + do ipos = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1 + m = this%dis%con%ja(ipos) + flownm = this%gwfflowja(ipos) + if (flownm > 0) then + if (this%ibound(m) /= 0) then + crewet = crewet + cnew(m) * flownm ! kluge note: apparently no need to multiply flows by eqnsclfac + tflow = tflow + this%gwfflowja(ipos) ! since it will divide out below anyway + end if + end if + end do + if (tflow > DZERO) then + crewet = crewet / tflow + else + crewet = DZERO + end if + ! + ! -- cell is now wet + this%ibound(n) = 1 + cnew(n) = crewet + call this%dis%noder_to_string(n, nodestr) + write (this%iout, fmtoutmsg2) & + trim(nodestr), trim(adjustl(this%depvartype)), crewet + end if + end if + end do + ! + ! -- Return + return + end subroutine set_active_status + !> @brief Calculate the previous saturation level !! !! Calculate the groundwater cell head saturation for the end of diff --git a/src/Model/TransportModel/tsp1ic1.f90 b/src/Model/TransportModel/tsp1ic1.f90 index e36ca15a88e..1a82f0230a7 100644 --- a/src/Model/TransportModel/tsp1ic1.f90 +++ b/src/Model/TransportModel/tsp1ic1.f90 @@ -48,6 +48,9 @@ subroutine ic_cr(ic, name_model, input_mempath, inunit, iout, dis, depvartype) ! ! -- Give package access to the assigned labelsd based on dependent variable ic%depvartype = depvartype + ! + ! -- Return + return end subroutine ic_cr end module TspIcModule diff --git a/src/Model/TransportModel/tsp1ssm1.f90 b/src/Model/TransportModel/tsp1ssm1.f90 index ef1e806da4d..d190a7fdc92 100644 --- a/src/Model/TransportModel/tsp1ssm1.f90 +++ b/src/Model/TransportModel/tsp1ssm1.f90 @@ -16,6 +16,7 @@ module TspSsmModule use NumericalPackageModule, only: NumericalPackageType use BaseDisModule, only: DisBaseType use TspFmiModule, only: TspFmiType + use GweInputDataModule, only: GweInputDataType use TableModule, only: TableType, table_cr use GwtSpcModule, only: GwtSpcType use MatrixBaseModule @@ -87,7 +88,7 @@ subroutine ssm_cr(ssmobj, name_model, inunit, iout, fmi, eqnsclfac, & integer(I4B), intent(in) :: iout !< fortran unit for output type(TspFmiType), intent(in), target :: fmi !< Transport FMI package real(DP), intent(in), pointer :: eqnsclfac !< governing equation scale factor - character(len=LENVARNAME), intent(in) :: depvartype + character(len=LENVARNAME), intent(in) :: depvartype !< dependent variable type ('concentration' or 'temperature') ! ! -- Create the object allocate (ssmobj) diff --git a/src/SimulationCreate.f90 b/src/SimulationCreate.f90 index 8aebdb1742a..fbf37202459 100644 --- a/src/SimulationCreate.f90 +++ b/src/SimulationCreate.f90 @@ -213,9 +213,11 @@ subroutine models_create() use SimVariablesModule, only: idm_context use GwfModule, only: gwf_cr use GwtModule, only: gwt_cr + use GweModule, only: gwe_cr use NumericalModelModule, only: NumericalModelType, GetNumericalModelFromList use VirtualGwfModelModule, only: add_virtual_gwf_model use VirtualGwtModelModule, only: add_virtual_gwt_model + use VirtualGweModelModule, only: add_virtual_gwe_model use ConstantsModule, only: LENMODELNAME ! -- dummy ! -- locals @@ -292,6 +294,16 @@ subroutine models_create() model_loc_idx(n) = im end if call add_virtual_gwt_model(n, model_names(n), num_model) + case ('GWE6') + if (model_ranks(n) == proc_id) then + im = im + 1 + write (iout, '(4x,2a,i0,a)') trim(model_type), ' model ', & + n, ' will be created' + call gwe_cr(fname, n, model_names(n)) + num_model => GetNumericalModelFromList(basemodellist, im) + model_loc_idx(n) = im + end if + call add_virtual_gwe_model(n, model_names(n), num_model) case default write (errmsg, '(a,a)') & 'Unknown simulation model type: ', trim(model_type) @@ -322,9 +334,12 @@ subroutine exchanges_create() use SimVariablesModule, only: idm_context use GwfGwfExchangeModule, only: gwfexchange_create use GwfGwtExchangeModule, only: gwfgwt_cr + use GwfGweExchangeModule, only: gwfgwe_cr use GwtGwtExchangeModule, only: gwtexchange_create + use GweGweExchangeModule, only: gweexchange_create use VirtualGwfExchangeModule, only: add_virtual_gwf_exchange use VirtualGwtExchangeModule, only: add_virtual_gwt_exchange + use VirtualGweExchangeModule, only: add_virtual_gwe_exchange ! -- dummy ! -- locals character(len=LENMEMPATH) :: input_mempath @@ -415,6 +430,10 @@ subroutine exchanges_create() if (both_local) then call gwfgwt_cr(fname, exg_id, m1_id, m2_id) end if + case ('GWF6-GWE6') + if (both_local) then + call gwfgwe_cr(fname, exg_id, m1_id, m2_id) + end if case ('GWT6-GWT6') write (exg_name, '(a,i0)') 'GWT-GWT_', exg_id if (.not. both_remote) then @@ -422,6 +441,13 @@ subroutine exchanges_create() exg_mempath) end if call add_virtual_gwt_exchange(exg_name, exg_id, m1_id, m2_id) + case ('GWE6-GWE6') + write (exg_name, '(a,i0)') 'GWE-GWE_', exg_id + if (.not. both_remote) then + call gweexchange_create(fname, exg_name, exg_id, m1_id, m2_id, & + exg_mempath) + end if + call add_virtual_gwe_exchange(exg_name, exg_id, m1_id, m2_id) case default write (errmsg, '(a,a)') & 'Unknown simulation exchange type: ', trim(exgtype) diff --git a/src/Utilities/Idm/selector/IdmDfnSelector.f90 b/src/Utilities/Idm/selector/IdmDfnSelector.f90 index a7b6190f6ff..57c272f4c31 100644 --- a/src/Utilities/Idm/selector/IdmDfnSelector.f90 +++ b/src/Utilities/Idm/selector/IdmDfnSelector.f90 @@ -7,6 +7,7 @@ module IdmDfnSelectorModule InputBlockDefinitionType use IdmGwfDfnSelectorModule use IdmGwtDfnSelectorModule + use IdmGweDfnSelectorModule use IdmExgDfnSelectorModule use IdmSimDfnSelectorModule @@ -31,6 +32,8 @@ function param_definitions(component, subcomponent) result(input_definition) input_definition => gwf_param_definitions(subcomponent) case ('GWT') input_definition => gwt_param_definitions(subcomponent) + case ('GWE') + input_definition => gwe_param_definitions(subcomponent) case ('EXG') input_definition => exg_param_definitions(subcomponent) case ('SIM') @@ -50,6 +53,8 @@ function aggregate_definitions(component, subcomponent) result(input_definition) input_definition => gwf_aggregate_definitions(subcomponent) case ('GWT') input_definition => gwt_aggregate_definitions(subcomponent) + case ('GWE') + input_definition => gwe_aggregate_definitions(subcomponent) case ('EXG') input_definition => exg_aggregate_definitions(subcomponent) case ('SIM') @@ -69,6 +74,8 @@ function block_definitions(component, subcomponent) result(input_definition) input_definition => gwf_block_definitions(subcomponent) case ('GWT') input_definition => gwt_block_definitions(subcomponent) + case ('GWE') + input_definition => gwe_block_definitions(subcomponent) case ('EXG') input_definition => exg_block_definitions(subcomponent) case ('SIM') @@ -87,6 +94,8 @@ function idm_multi_package(component, subcomponent) result(multi_package) multi_package = gwf_idm_multi_package(subcomponent) case ('GWT') multi_package = gwt_idm_multi_package(subcomponent) + case ('GWE') + multi_package = gwe_idm_multi_package(subcomponent) case ('EXG') multi_package = exg_idm_multi_package(subcomponent) case ('SIM') @@ -109,6 +118,8 @@ function idm_integrated(component, subcomponent) result(integrated) integrated = gwf_idm_integrated(subcomponent) case ('GWT') integrated = gwt_idm_integrated(subcomponent) + case ('GWE') + integrated = gwe_idm_integrated(subcomponent) case ('EXG') integrated = exg_idm_integrated(subcomponent) case ('SIM') @@ -127,6 +138,8 @@ function idm_component(component) result(integrated) integrated = .true. case ('GWT') integrated = .true. + case ('GWE') + integrated = .true. case ('EXG') integrated = .true. case ('SIM') diff --git a/src/Utilities/Idm/selector/IdmExgDfnSelector.f90 b/src/Utilities/Idm/selector/IdmExgDfnSelector.f90 index fa6aea90bc6..558a9decc27 100644 --- a/src/Utilities/Idm/selector/IdmExgDfnSelector.f90 +++ b/src/Utilities/Idm/selector/IdmExgDfnSelector.f90 @@ -7,7 +7,9 @@ module IdmExgDfnSelectorModule InputBlockDefinitionType use ExgGwfgwfInputModule use ExgGwfgwtInputModule + use ExgGwfgweInputModule use ExgGwtgwtInputModule + use ExgGwegweInputModule implicit none private @@ -40,8 +42,12 @@ function exg_param_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, exg_gwfgwf_param_definitions) case ('GWFGWT') call set_param_pointer(input_definition, exg_gwfgwt_param_definitions) + case ('GWFGWE') + call set_param_pointer(input_definition, exg_gwfgwe_param_definitions) case ('GWTGWT') call set_param_pointer(input_definition, exg_gwtgwt_param_definitions) + case ('GWEGWE') + call set_param_pointer(input_definition, exg_gwegwe_param_definitions) case default end select return @@ -56,8 +62,12 @@ function exg_aggregate_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, exg_gwfgwf_aggregate_definitions) case ('GWFGWT') call set_param_pointer(input_definition, exg_gwfgwt_aggregate_definitions) + case ('GWFGWE') + call set_param_pointer(input_definition, exg_gwfgwe_aggregate_definitions) case ('GWTGWT') call set_param_pointer(input_definition, exg_gwtgwt_aggregate_definitions) + case ('GWEGWE') + call set_param_pointer(input_definition, exg_gwegwe_aggregate_definitions) case default end select return @@ -72,8 +82,12 @@ function exg_block_definitions(subcomponent) result(input_definition) call set_block_pointer(input_definition, exg_gwfgwf_block_definitions) case ('GWFGWT') call set_block_pointer(input_definition, exg_gwfgwt_block_definitions) + case ('GWFGWE') + call set_block_pointer(input_definition, exg_gwfgwe_block_definitions) case ('GWTGWT') call set_block_pointer(input_definition, exg_gwtgwt_block_definitions) + case ('GWEGWE') + call set_block_pointer(input_definition, exg_gwegwe_block_definitions) case default end select return @@ -87,8 +101,12 @@ function exg_idm_multi_package(subcomponent) result(multi_package) multi_package = exg_gwfgwf_multi_package case ('GWFGWT') multi_package = exg_gwfgwt_multi_package + case ('GWFGWE') + multi_package = exg_gwfgwe_multi_package case ('GWTGWT') multi_package = exg_gwtgwt_multi_package + case ('GWEGWE') + multi_package = exg_gwegwe_multi_package case default call store_error('Idm selector subcomponent not found; '//& &'component="EXG"'//& @@ -106,8 +124,12 @@ function exg_idm_integrated(subcomponent) result(integrated) integrated = .true. case ('GWFGWT') integrated = .true. + case ('GWFGWE') + integrated = .true. case ('GWTGWT') integrated = .true. + case ('GWEGWE') + integrated = .true. case default end select return diff --git a/src/Utilities/Idm/selector/IdmGweDfnSelector.f90 b/src/Utilities/Idm/selector/IdmGweDfnSelector.f90 new file mode 100644 index 00000000000..bbf704b441a --- /dev/null +++ b/src/Utilities/Idm/selector/IdmGweDfnSelector.f90 @@ -0,0 +1,160 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module IdmGweDfnSelectorModule + + use ConstantsModule, only: LENVARNAME + use SimModule, only: store_error + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + use GweDisInputModule + use GweDisuInputModule + use GweDisvInputModule + use GweCndInputModule + use GweCtpInputModule + use GweIcInputModule + use GweNamInputModule + + implicit none + private + public :: gwe_param_definitions + public :: gwe_aggregate_definitions + public :: gwe_block_definitions + public :: gwe_idm_multi_package + public :: gwe_idm_integrated + +contains + + subroutine set_param_pointer(input_dfn, input_dfn_target) + type(InputParamDefinitionType), dimension(:), pointer :: input_dfn + type(InputParamDefinitionType), dimension(:), target :: input_dfn_target + input_dfn => input_dfn_target + end subroutine set_param_pointer + + subroutine set_block_pointer(input_dfn, input_dfn_target) + type(InputBlockDefinitionType), dimension(:), pointer :: input_dfn + type(InputBlockDefinitionType), dimension(:), target :: input_dfn_target + input_dfn => input_dfn_target + end subroutine set_block_pointer + + function gwe_param_definitions(subcomponent) result(input_definition) + character(len=*), intent(in) :: subcomponent + type(InputParamDefinitionType), dimension(:), pointer :: input_definition + nullify (input_definition) + select case (subcomponent) + case ('DIS') + call set_param_pointer(input_definition, gwe_dis_param_definitions) + case ('DISU') + call set_param_pointer(input_definition, gwe_disu_param_definitions) + case ('DISV') + call set_param_pointer(input_definition, gwe_disv_param_definitions) + case ('CND') + call set_param_pointer(input_definition, gwe_cnd_param_definitions) + case ('CTP') + call set_param_pointer(input_definition, gwe_ctp_param_definitions) + case ('IC') + call set_param_pointer(input_definition, gwe_ic_param_definitions) + case ('NAM') + call set_param_pointer(input_definition, gwe_nam_param_definitions) + case default + end select + return + end function gwe_param_definitions + + function gwe_aggregate_definitions(subcomponent) result(input_definition) + character(len=*), intent(in) :: subcomponent + type(InputParamDefinitionType), dimension(:), pointer :: input_definition + nullify (input_definition) + select case (subcomponent) + case ('DIS') + call set_param_pointer(input_definition, gwe_dis_aggregate_definitions) + case ('DISU') + call set_param_pointer(input_definition, gwe_disu_aggregate_definitions) + case ('DISV') + call set_param_pointer(input_definition, gwe_disv_aggregate_definitions) + case ('CND') + call set_param_pointer(input_definition, gwe_cnd_aggregate_definitions) + case ('CTP') + call set_param_pointer(input_definition, gwe_ctp_aggregate_definitions) + case ('IC') + call set_param_pointer(input_definition, gwe_ic_aggregate_definitions) + case ('NAM') + call set_param_pointer(input_definition, gwe_nam_aggregate_definitions) + case default + end select + return + end function gwe_aggregate_definitions + + function gwe_block_definitions(subcomponent) result(input_definition) + character(len=*), intent(in) :: subcomponent + type(InputBlockDefinitionType), dimension(:), pointer :: input_definition + nullify (input_definition) + select case (subcomponent) + case ('DIS') + call set_block_pointer(input_definition, gwe_dis_block_definitions) + case ('DISU') + call set_block_pointer(input_definition, gwe_disu_block_definitions) + case ('DISV') + call set_block_pointer(input_definition, gwe_disv_block_definitions) + case ('CND') + call set_block_pointer(input_definition, gwe_cnd_block_definitions) + case ('CTP') + call set_block_pointer(input_definition, gwe_ctp_block_definitions) + case ('IC') + call set_block_pointer(input_definition, gwe_ic_block_definitions) + case ('NAM') + call set_block_pointer(input_definition, gwe_nam_block_definitions) + case default + end select + return + end function gwe_block_definitions + + function gwe_idm_multi_package(subcomponent) result(multi_package) + character(len=*), intent(in) :: subcomponent + logical :: multi_package + select case (subcomponent) + case ('DIS') + multi_package = gwe_dis_multi_package + case ('DISU') + multi_package = gwe_disu_multi_package + case ('DISV') + multi_package = gwe_disv_multi_package + case ('CND') + multi_package = gwe_cnd_multi_package + case ('CTP') + multi_package = gwe_ctp_multi_package + case ('IC') + multi_package = gwe_ic_multi_package + case ('NAM') + multi_package = gwe_nam_multi_package + case default + call store_error('Idm selector subcomponent not found; '//& + &'component="GWE"'//& + &', subcomponent="'//trim(subcomponent)//'".', .true.) + end select + return + end function gwe_idm_multi_package + + function gwe_idm_integrated(subcomponent) result(integrated) + character(len=*), intent(in) :: subcomponent + logical :: integrated + integrated = .false. + select case (subcomponent) + case ('DIS') + integrated = .true. + case ('DISU') + integrated = .true. + case ('DISV') + integrated = .true. + case ('CND') + integrated = .true. + case ('CTP') + integrated = .true. + case ('IC') + integrated = .true. + case ('NAM') + integrated = .true. + case default + end select + return + end function gwe_idm_integrated + +end module IdmGweDfnSelectorModule diff --git a/src/meson.build b/src/meson.build index 51cc3f51d56..24ef7691927 100644 --- a/src/meson.build +++ b/src/meson.build @@ -19,28 +19,36 @@ modflow_sources = files( 'Distributed' / 'VirtualDataLists.f90', 'Distributed' / 'VirtualDataManager.f90', 'Distributed' / 'VirtualExchange.f90', + 'Distributed' / 'VirtualGweExchange.f90', 'Distributed' / 'VirtualGwfExchange.f90', 'Distributed' / 'VirtualGwtExchange.f90', 'Distributed' / 'VirtualModel.f90', + 'Distributed' / 'VirtualGweModel.f90', 'Distributed' / 'VirtualGwfModel.f90', 'Distributed' / 'VirtualGwtModel.f90', 'Distributed' / 'VirtualSolution.f90', 'Exchange' / 'BaseExchange.f90', 'Exchange' / 'DisConnExchange.f90', 'Exchange' / 'GhostNode.f90', + 'Exchange' / 'GweGweExchange.f90', 'Exchange' / 'GwfExchangeMover.f90', + 'Exchange' / 'GwfGweExchange.f90', 'Exchange' / 'GwfGwfExchange.f90', 'Exchange' / 'GwfGwtExchange.f90', 'Exchange' / 'GwtGwtExchange.f90', 'Exchange' / 'NumericalExchange.f90', 'Exchange' / 'gwfgwfidm.f90', 'Exchange' / 'gwfgwtidm.f90', + 'Exchange' / 'gwfgweidm.f90', 'Exchange' / 'gwtgwtidm.f90', + 'Exchange' / 'gwegweidm.f90', 'Model' / 'Connection' / 'ConnectionBuilder.f90', 'Model' / 'Connection' / 'CellWithNbrs.f90', 'Model' / 'Connection' / 'CsrUtils.f90', 'Model' / 'Connection' / 'GridConnection.f90', 'Model' / 'Connection' / 'GridSorting.f90', + 'Model' / 'Connection' / 'GweGweConnection.f90', + 'Model' / 'Connection' / 'GweInterfaceModel.f90', 'Model' / 'Connection' / 'GwfGwfConnection.f90', 'Model' / 'Connection' / 'GwtGwtConnection.f90', 'Model' / 'Connection' / 'GwfInterfaceModel.f90', @@ -50,6 +58,22 @@ modflow_sources = files( 'Model' / 'Geometry' / 'BaseGeometry.f90', 'Model' / 'Geometry' / 'CircularGeometry.f90', 'Model' / 'Geometry' / 'RectangularGeometry.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe1.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe1cnd1.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe1cnd1idm.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe1ctp1.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe1ctp1idm.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe1dis1idm.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe1disu1idm.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe1disv1idm.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe1esl1.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe1est1.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe1ic1idm.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe1idm.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe1lke1.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe1mwe1.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe1sfe1.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe1uze1.f90', 'Model' / 'GroundWaterFlow' / 'gwf3.f90', 'Model' / 'GroundWaterFlow' / 'gwf3api8.f90', 'Model' / 'GroundWaterFlow' / 'gwf3buy8.f90', @@ -113,10 +137,12 @@ modflow_sources = files( 'Model' / 'GroundWaterTransport' / 'gwt1uzt1.f90', 'Model' / 'ModelUtilities' / 'BoundaryPackage.f90', 'Model' / 'ModelUtilities' / 'BoundaryPackageExt.f90', + 'Model' / 'ModelUtilities' / 'GweCndOptions.f90', 'Model' / 'ModelUtilities' / 'Connections.f90', 'Model' / 'ModelUtilities' / 'DiscretizationBase.f90', 'Model' / 'ModelUtilities' / 'DisvGeom.f90', 'Model' / 'ModelUtilities' / 'FlowModelInterface.f90', + 'Model' / 'ModelUtilities' / 'GweInputData.f90', 'Model' / 'ModelUtilities' / 'GwfBuyInputData.f90', 'Model' / 'ModelUtilities' / 'GwfMvrPeriodData.f90', 'Model' / 'ModelUtilities' / 'GwfNpfOptions.f90', @@ -188,6 +214,7 @@ modflow_sources = files( 'Utilities' / 'Idm' / 'mf6blockfile' / 'StructVector.f90', 'Utilities' / 'Idm' / 'selector' / 'IdmDfnSelector.f90', 'Utilities' / 'Idm' / 'selector' / 'IdmExgDfnSelector.f90', + 'Utilities' / 'Idm' / 'selector' / 'IdmGweDfnSelector.f90', 'Utilities' / 'Idm' / 'selector' / 'IdmGwfDfnSelector.f90', 'Utilities' / 'Idm' / 'selector' / 'IdmGwtDfnSelector.f90', 'Utilities' / 'Idm' / 'selector' / 'IdmSimDfnSelector.f90', diff --git a/utils/idmloader/scripts/dfn2f90.py b/utils/idmloader/scripts/dfn2f90.py index de1ab63a976..f53fa3e1150 100644 --- a/utils/idmloader/scripts/dfn2f90.py +++ b/utils/idmloader/scripts/dfn2f90.py @@ -29,7 +29,9 @@ def __init__( self._warnings = [] self._multi_package = False - self.component, self.subcomponent = self._dfnfspec.stem.upper().split("-") + self.component, self.subcomponent = self._dfnfspec.stem.upper().split( + "-" + ) print(f"\nprocessing dfn => {self._dfnfspec}") self._set_var_d() @@ -47,7 +49,9 @@ def add_dfn_entry(self, dfn_d=None): def write_f90(self, ofspec=None): with open(ofspec, "w") as f: # file header - f.write(self._source_file_header(self.component, self.subcomponent)) + f.write( + self._source_file_header(self.component, self.subcomponent) + ) # found type f.write( @@ -76,44 +80,73 @@ def write_f90(self, ofspec=None): # params if len(self._param_varnames): f.write(self._param_str) - f.write(self._source_params_header(self.component, self.subcomponent)) - f.write(" " + ", &\n ".join(self._param_varnames) + " &\n") f.write( - self._source_list_footer(self.component, self.subcomponent) + "\n" + self._source_params_header( + self.component, self.subcomponent + ) + ) + f.write( + " " + ", &\n ".join(self._param_varnames) + " &\n" + ) + f.write( + self._source_list_footer(self.component, self.subcomponent) + + "\n" ) else: - f.write(self._source_params_header(self.component, self.subcomponent)) + f.write( + self._source_params_header( + self.component, self.subcomponent + ) + ) f.write(self._param_str.rsplit(",", 1)[0] + " &\n") f.write( - self._source_list_footer(self.component, self.subcomponent) + "\n" + self._source_list_footer(self.component, self.subcomponent) + + "\n" ) # aggregate types if len(self._aggregate_varnames): f.write(self._aggregate_str) f.write( - self._source_aggregates_header(self.component, self.subcomponent) + self._source_aggregates_header( + self.component, self.subcomponent + ) + ) + f.write( + " " + + ", &\n ".join(self._aggregate_varnames) + + " &\n" ) - f.write(" " + ", &\n ".join(self._aggregate_varnames) + " &\n") f.write( - self._source_list_footer(self.component, self.subcomponent) + "\n" + self._source_list_footer(self.component, self.subcomponent) + + "\n" ) else: f.write( - self._source_aggregates_header(self.component, self.subcomponent) + self._source_aggregates_header( + self.component, self.subcomponent + ) ) f.write(self._aggregate_str.rsplit(",", 1)[0] + " &\n") f.write( - self._source_list_footer(self.component, self.subcomponent) + "\n" + self._source_list_footer(self.component, self.subcomponent) + + "\n" ) # blocks - f.write(self._source_blocks_header(self.component, self.subcomponent)) + f.write( + self._source_blocks_header(self.component, self.subcomponent) + ) f.write(self._block_str.rsplit(",", 1)[0] + " &\n") - f.write(self._source_list_footer(self.component, self.subcomponent) + "\n") + f.write( + self._source_list_footer(self.component, self.subcomponent) + + "\n" + ) # file footer - f.write(self._source_file_footer(self.component, self.subcomponent)) + f.write( + self._source_file_footer(self.component, self.subcomponent) + ) def get_blocknames(self): blocknames = [] @@ -167,7 +200,9 @@ def _set_var_d(self): istart = line.index(" ") v = line[istart:].strip() if k in vd: - raise Exception("Attribute already exists in dictionary: " + k) + raise Exception( + "Attribute already exists in dictionary: " + k + ) vd[k] = v if len(vd) > 0: @@ -178,7 +213,9 @@ def _set_var_d(self): else: key = name if name in vardict: - raise Exception("Variable already exists in dictionary: " + name) + raise Exception( + "Variable already exists in dictionary: " + name + ) vardict[key] = vd self._var_d = vardict @@ -354,7 +391,11 @@ def _set_blk_param_strs(self, blockname, component, subcomponent): if t == "DOUBLE PRECISION": t = "DOUBLE" - if shape != "" and not aggregate_t and (t == "DOUBLE" or t == "INTEGER"): + if ( + shape != "" + and not aggregate_t + and (t == "DOUBLE" or t == "INTEGER") + ): t = f"{t}{ndim}D" inrec = ".false." @@ -535,7 +576,9 @@ def write(self): self._write_master() def _write_master(self): - ofspec = SRC_PATH / "Utilities" / "Idm" / "selector" / "IdmDfnSelector.f90" + ofspec = ( + SRC_PATH / "Utilities" / "Idm" / "selector" / "IdmDfnSelector.f90" + ) with open(ofspec, "w") as fh: self._write_master_decl(fh) self._write_master_defn(fh, defn="param", dtype="param") @@ -559,16 +602,30 @@ def _write_selectors(self): self._write_selector_decl(fh, component=c, sc_list=self._d[c]) self._write_selector_helpers(fh) self._write_selector_defn( - fh, component=c, sc_list=self._d[c], defn="param", dtype="param" + fh, + component=c, + sc_list=self._d[c], + defn="param", + dtype="param", ) self._write_selector_defn( - fh, component=c, sc_list=self._d[c], defn="aggregate", dtype="param" + fh, + component=c, + sc_list=self._d[c], + defn="aggregate", + dtype="param", ) self._write_selector_defn( - fh, component=c, sc_list=self._d[c], defn="block", dtype="block" + fh, + component=c, + sc_list=self._d[c], + defn="block", + dtype="block", ) self._write_selector_multi(fh, component=c, sc_list=self._d[c]) - self._write_selector_integration(fh, component=c, sc_list=self._d[c]) + self._write_selector_integration( + fh, component=c, sc_list=self._d[c] + ) fh.write(f"end module Idm{c.title()}DfnSelectorModule\n") def _write_selector_decl(self, fh=None, component=None, sc_list=None): @@ -690,7 +747,9 @@ def _write_selector_multi(self, fh=None, component=None, sc_list=None): fh.write(s) - def _write_selector_integration(self, fh=None, component=None, sc_list=None): + def _write_selector_integration( + self, fh=None, component=None, sc_list=None + ): c = component s = ( @@ -938,6 +997,30 @@ def _write_master_component(self, fh=None): DFN_PATH / "gwt-ic.dfn", SRC_PATH / "Model" / "GroundWaterTransport" / "gwt1ic1idm.f90", ], + [ + DFN_PATH / "gwe-dis.dfn", + SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe1dis1idm.f90", + ], + [ + DFN_PATH / "gwe-disu.dfn", + SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe1disu1idm.f90", + ], + [ + DFN_PATH / "gwe-disv.dfn", + SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe1disv1idm.f90", + ], + [ + DFN_PATH / "gwe-cnd.dfn", + SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe1cnd1idm.f90", + ], + [ + DFN_PATH / "gwe-ctp.dfn", + SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe1ctp1idm.f90", + ], + [ + DFN_PATH / "gwe-ic.dfn", + SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe1ic1idm.f90", + ], [ DFN_PATH / "gwf-nam.dfn", SRC_PATH / "Model" / "GroundWaterFlow" / "gwf3idm.f90", @@ -946,6 +1029,10 @@ def _write_master_component(self, fh=None): DFN_PATH / "gwt-nam.dfn", SRC_PATH / "Model" / "GroundWaterTransport" / "gwt1idm.f90", ], + [ + DFN_PATH / "gwe-nam.dfn", + SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe1idm.f90", + ], [ DFN_PATH / "exg-gwfgwf.dfn", SRC_PATH / "Exchange" / "gwfgwfidm.f90", @@ -954,10 +1041,18 @@ def _write_master_component(self, fh=None): DFN_PATH / "exg-gwfgwt.dfn", SRC_PATH / "Exchange" / "gwfgwtidm.f90", ], + [ + DFN_PATH / "exg-gwfgwe.dfn", + SRC_PATH / "Exchange" / "gwfgweidm.f90", + ], [ DFN_PATH / "exg-gwtgwt.dfn", SRC_PATH / "Exchange" / "gwtgwtidm.f90", ], + [ + DFN_PATH / "exg-gwegwe.dfn", + SRC_PATH / "Exchange" / "gwegweidm.f90", + ], [ DFN_PATH / "sim-nam.dfn", SRC_PATH / "simnamidm.f90", From 26a447ee51194d41182c063b5e09aaab69c572b6 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 12 Feb 2024 12:07:52 -0500 Subject: [PATCH 010/199] docs(DEVELOPER.MD): update Windows compiler install recommendations (#1611) * suggest Chocolatey and winlibs distributions * mention conda distribution's incompatibility --- DEVELOPER.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/DEVELOPER.md b/DEVELOPER.md index ce6d7a47783..7bdd5cdcca3 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -92,8 +92,8 @@ GNU Fortran can be installed on all three major platforms. ##### Linux -- fedora-based: `dnf install gcc-gfortran` -- debian-based: `apt install gfortran` +- Fedora-based: `dnf install gcc-gfortran` +- Debian-based: `apt install gfortran` ##### macOS @@ -110,7 +110,13 @@ See [this ticket](https://github.com/mesonbuild/meson/issues/12282) on the Meson ##### Windows -- Download the Minimalist GNU for Windows (MinGW) installer from Source Forge: +[Minimalist GNU for Windows](https://www.mingw-w64.org/) is the recommended way to obtain the GCC toolchain on Windows. Several MinGW distributions are available. + +To install with Chocolatey: `choco install mingw` + +To install from SourceForge: + +- Download the MinGW installer: https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe - Run the installer. Make sure to change `Architecture` to `x86_64`. Leave the other settings on default. @@ -120,6 +126,10 @@ See [this ticket](https://github.com/mesonbuild/meson/issues/12282) on the Meson `Path` variable in the User Variables (the top table). Click the `New` button and enter the location of the `mingw64/bin` directory. +Binaries may also be downloaded and installed from the [releases here](https://github.com/brechtsanders/winlibs_mingw/releases). + +**Note:** the MinGW distribution [available on conda-forge](https://anaconda.org/conda-forge/m2w64-toolchain_win-64) includes an outdated version of GCC and is not compatible with MODFLOW 6. + #### Intel Fortran Intel Fortran can also be used to compile MODFLOW 6 and associated utilities. The `ifort` and `ifx` compilers are available in the [Intel oneAPI HPC Toolkit](https://software.intel.com/content/www/us/en/develop/tools/oneapi/hpc-toolkit/download.html). From 07f2a9a2a2f174554b183a9b2bf3a1c2c30c5f34 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 12 Feb 2024 12:09:01 -0500 Subject: [PATCH 011/199] ci: upload test artifacts on failure (#1602) * if CI tests fail it can be helpful to inspect their outputs * add workflow_dispatch trigger to `large.yml` * miscellaneous cleanup --- .github/workflows/ci.yml | 84 +++++++++++++++++++++++------------ .github/workflows/docs.yml | 8 ++-- .github/workflows/large.yml | 25 ++++++----- .github/workflows/release.yml | 11 +++-- 4 files changed, 81 insertions(+), 47 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7b3bd375a51..36d47d7bfce 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -71,17 +71,17 @@ jobs: shell: bash -l {0} env: FC: gfortran - GCC_V: 13 + FC_V: 13 steps: - name: Checkout modflow6 uses: actions/checkout@v4 - - name: Setup gfortran ${{ env.GCC_V }} + - name: Setup ${{ env.FC }} ${{ env.FC_V }} uses: fortran-lang/setup-fortran@v1 with: compiler: gcc - version: ${{ env.GCC_V }} + version: ${{ env.FC_V }} - name: Setup Micromamba uses: mamba-org/setup-micromamba@v1 @@ -111,7 +111,7 @@ jobs: shell: bash -l {0} env: FC: gfortran - GCC: 13 + FC_V: 13 steps: - name: Checkout modflow6 uses: actions/checkout@v4 @@ -124,11 +124,11 @@ jobs: repository: fortran-lang/test-drive path: test-drive - - name: Setup GNU Fortran ${{ env.GCC }} + - name: Setup ${{ env.FC }} ${{ env.FC_V }} uses: fortran-lang/setup-fortran@v1 with: compiler: gcc - version: ${{ env.GCC }} + version: ${{ env.FC_V }} - name: Setup Micromamba uses: mamba-org/setup-micromamba@v1 @@ -173,11 +173,18 @@ jobs: working-directory: modflow6/autotest run: | if [ "${{ github.ref_name }}" == "master" ]; then - pytest -v -n auto --durations 0 -m "not slow and not regression and not developmode" + pytest -v -n auto --durations 0 -m "not slow and not regression and not developmode" --keep-failed .failed else - pytest -v -n auto --durations 0 -S + pytest -v -n auto --durations 0 -S --keep-failed .failed fi + - name: Upload failed test output + if: failure() + uses: actions/upload-artifact@v4 + with: + name: failed-smoke-${{ runner.os }}-${{ env.FC }}-${{ env.FC_V }} + path: modflow6/autotest/.failed + test_gfortran: name: Test gnu fortran needs: @@ -194,7 +201,7 @@ jobs: shell: bash -l {0} env: FC: gfortran - GCC: 13 + FC_V: 13 steps: - name: Checkout modflow6 uses: actions/checkout@v4 @@ -213,11 +220,11 @@ jobs: repository: MODFLOW-USGS/modflow6-examples path: modflow6-examples - - name: Setup GNU Fortran ${{ env.GCC }} + - name: Setup ${{ env.FC }} ${{ env.FC_V }} uses: fortran-lang/setup-fortran@v1 with: compiler: gcc - version: ${{ env.GCC }} + version: ${{ env.FC_V }} - name: Setup Micromamba uses: mamba-org/setup-micromamba@v1 @@ -252,8 +259,7 @@ jobs: working-directory: modflow6/autotest env: GITHUB_TOKEN: ${{ github.token }} - run: | - pytest -v --durations 0 get_exes.py + run: pytest -v --durations 0 get_exes.py - name: Test modflow6 working-directory: modflow6/autotest @@ -261,11 +267,18 @@ jobs: REPOS_PATH: ${{ github.workspace }} run: | if [ "${{ github.ref_name }}" == "master" ]; then - pytest -v -n auto --durations 0 -m "not large and not developmode" + pytest -v -n auto --durations 0 -m "not large and not developmode" --keep-failed .failed else - pytest -v -n auto --durations 0 -m "not large" + pytest -v -n auto --durations 0 -m "not large" --keep-failed .failed fi + - name: Upload failed test output + if: failure() + uses: actions/upload-artifact@v4 + with: + name: failed-${{ matrix.os }}-${{ env.FC }}-${{ env.FC_V }} + path: modflow6/autotest/.failed + - name: Checkout usgslatex if: runner.os == 'Linux' uses: actions/checkout@v4 @@ -301,14 +314,13 @@ jobs: - build - smoke_test runs-on: ${{ matrix.os }} + env: + FC: intel-classic + FC_V: "2021.7" strategy: fail-fast: false matrix: - include: - - {os: ubuntu-22.04, compiler: intel-classic, version: 2021.7} - - {os: macos-12, compiler: intel-classic, version: 2021.7} - - {os: windows-2022, compiler: intel-classic, version: 2021.7} - + os: [ubuntu-22.04, macos-12, windows-2022] defaults: run: shell: bash -l {0} @@ -335,11 +347,11 @@ jobs: cache-environment: true cache-downloads: true - - name: Setup Intel Fortran + - name: Setup ${{ env.FC }} ${{ env.FC_V }} uses: fortran-lang/setup-fortran@v1 with: - compiler: ${{ matrix.compiler }} - version: ${{ matrix.version }} + compiler: ${{ env.FC }} + version: ${{ env.FC_V }} - name: Update version files working-directory: modflow6/distribution @@ -376,10 +388,17 @@ jobs: REPOS_PATH: ${{ github.workspace }} run: | if [ "${{ github.ref_name }}" == "master" ]; then - pytest -v -n auto --durations 0 -m "not large and not developmode" + pytest -v -n auto --durations 0 -m "not large and not developmode" --keep-failed .failed else - pytest -v -n auto --durations 0 -m "not large" + pytest -v -n auto --durations 0 -m "not large" --keep-failed .failed fi + + - name: Upload failed test output + if: failure() + uses: actions/upload-artifact@v4 + with: + name: failed-${{ matrix.os }}-${{ env.FC }}-${{ env.FC_V }} + path: modflow6/autotest/.failed - name: Test scripts working-directory: modflow6/distribution @@ -403,7 +422,7 @@ jobs: shell: bash -l {0} env: FC: gfortran - GCC_V: 12 + FC_V: 12 steps: - name: Checkout modflow6 @@ -430,11 +449,11 @@ jobs: with: mpi: msmpi - - name: Setup GNU Fortran ${{ env.GCC_V }} + - name: Setup ${{ env.FC }} ${{ env.FC_V }} uses: fortran-lang/setup-fortran@v1 with: compiler: gcc - version: ${{ env.GCC_V }} + version: ${{ env.FC_V }} - name: Cache PETSc id: cache-petsc @@ -533,5 +552,12 @@ jobs: branch="${{ github.ref_name }}" marker="not large" markers=$([ "$branch" == "master" ] && echo "$marker and not developmode" || echo "$marker") - pytest -v -n auto --parallel --durations 0 -m "$markers" + pytest -v -n auto --parallel --durations 0 -m "$markers" --keep-failed .failed + + - name: Upload failed test output + if: failure() + uses: actions/upload-artifact@v4 + with: + name: failed-${{ matrix.os }}-${{ env.FC }}-${{ env.FC_V }} + path: modflow6/autotest/.failed diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 35f630e6bc5..6e3e129bdb4 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -19,8 +19,8 @@ jobs: run: shell: bash -l {0} env: - GCC_V: 12 - + FC: gfortran + FC_V: 12 steps: - name: Checkout modflow6 uses: actions/checkout@v4 @@ -66,11 +66,11 @@ jobs: working-directory: modflow6/autotest run: pytest -v build_mfio_tex.py - - name: Setup GNU Fortran ${{ env.GCC_V }} + - name: Setup ${{ env.FC }} ${{ env.FC_V }} uses: fortran-lang/setup-fortran@v1 with: compiler: gcc - version: ${{ env.GCC_V }} + version: ${{ env.FC_V }} - name: Cache modflow6 examples id: cache-examples diff --git a/.github/workflows/large.yml b/.github/workflows/large.yml index e9cf36c98c5..578a07559f4 100644 --- a/.github/workflows/large.yml +++ b/.github/workflows/large.yml @@ -1,7 +1,11 @@ name: MODFLOW 6 large models on: + # run at 6 AM UTC every day schedule: - - cron: '0 6 * * *' # run at 6 AM UTC every day + - cron: '0 6 * * *' + # workflow_dispatch trigger to run tests via GitHub UI or CLI, + # see https://docs.github.com/en/actions/managing-workflow-runs/manually-running-a-workflow + workflow_dispatch: jobs: # caching only necessary on Windows cache_ifort: @@ -61,7 +65,7 @@ jobs: cache-downloads: true cache-environment: true - - name: Setup compilers (${{ matrix.compiler }} ${{ matrix.version }}) + - name: Setup ${{ matrix.compiler }} ${{ matrix.version }} uses: fortran-lang/setup-fortran@v1 with: compiler: ${{ matrix.compiler }} @@ -87,14 +91,6 @@ jobs: pytest -v -n auto test_scripts.py --init ls -lh ../examples/ - - name: Add Micromamba Scripts dir to path (Windows) - if: runner.os == 'Windows' - shell: pwsh - run: | - # add micromamba scripts dir to system path - $mamba_bin = "C:\Users\runneradmin\micromamba-root\envs\modflow6\Scripts" - echo $mamba_bin | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - - name: Build modflow6 working-directory: modflow6 run: | @@ -113,4 +109,11 @@ jobs: - name: Run tests working-directory: modflow6/autotest - run: pytest -v -n auto --durations 0 test_${{ matrix.repo }}.py \ No newline at end of file + run: pytest -v -n auto --durations 0 test_${{ matrix.repo }}.py --keep-failed .failed + + - name: Upload failed test output + if: failure() + uses: actions/upload-artifact@v4 + with: + name: failed-${{ runner.os }}-${{ matrix.compiler }}-${{ matrix.version }} + path: modflow6/autotest/.failed \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 527952f547c..21cf847db20 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -54,8 +54,6 @@ on: distname: description: 'Distribution name used for release' value: ${{ jobs.build.outputs.distname }} -env: - FC: ifort jobs: build: name: Build binaries (${{ matrix.os }}) @@ -199,7 +197,14 @@ jobs: if ("${{ inputs.developmode }}" -eq "false") { $markers="$markers and not developmode" } - pytest -v -n auto --durations 0 -m "$markers" + pytest -v -n auto --durations 0 -m "$markers" --keep-failed .failed + + - name: Upload failed test output + if: failure() + uses: actions/upload-artifact@v4 + with: + name: failed-${{ matrix.os }}-${{ inputs.compiler_toolchain }}-${{ inputs.compiler_version }} + path: modflow6/autotest/.failed # steps below run only on Linux to test distribution procedures, e.g. # compiling binaries, building documentation From e4703cfcd68328129634936a7f06faaf4994ef6a Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Mon, 12 Feb 2024 12:33:33 -0800 Subject: [PATCH 012/199] doc: update HPC documents (#1613) add python script that can poll memory usage on HPC system --- .hpc/BUILD.md | 30 ---- .hpc/README.md | 68 ++++++++ .hpc/cray-hovenweep-meson-build.slurm.batch | 2 +- .hpc/cray-meson-build.slurm.batch | 2 +- .hpc/sstat_poll.py | 167 ++++++++++++++++++++ 5 files changed, 237 insertions(+), 32 deletions(-) delete mode 100644 .hpc/BUILD.md create mode 100644 .hpc/README.md create mode 100644 .hpc/sstat_poll.py diff --git a/.hpc/BUILD.md b/.hpc/BUILD.md deleted file mode 100644 index 9f9b0ac8374..00000000000 --- a/.hpc/BUILD.md +++ /dev/null @@ -1,30 +0,0 @@ - -# Building MODFLOW 6 on HPC systems - -_On Denali_ - -``` -sbatch --reservation=dev cray-meson-build.slurm.batch -``` - -_Hovenweep_ - -``` -sbatch cray-hovenweep-meson-build.slurm.batch -``` - - -## Create a module file for a new version of MODFLOW 6 - -On _Denali_ make a copy of an existing module file using -``` -rsync /home/software/denali/contrib/impd/modulefiles/modflow/6.5.0.dev0 /home/software/denali/contrib/impd/modulefiles/modflow/6.x.x -``` -On _Hovenweep_ make a copy of an existing module file using -``` -rsync /home/software/hovenweep/contrib/impd/modulefiles/modflow/6.5.0.dev0 /home/software/denali/contrib/impd/modulefiles/modflow/6.x.x -``` - -Edit `product_version` in the new module file from `6.5.0.dev0` to `6.x.x` on both systems. - - diff --git a/.hpc/README.md b/.hpc/README.md new file mode 100644 index 00000000000..391ae7e64e4 --- /dev/null +++ b/.hpc/README.md @@ -0,0 +1,68 @@ + +# Building MODFLOW 6 on HPC systems + +_On Denali_ + +``` +sbatch --reservation=dev cray-meson-build.slurm.batch +``` + +_Hovenweep_ + +``` +sbatch --reservation=dev cray-hovenweep-meson-build.slurm.batch +``` + + +## Create a module file for a new version of MODFLOW 6 + +On _Denali_ make a copy of an existing module file using +``` +rsync /home/software/denali/contrib/impd/modulefiles/modflow/6.5.0.dev0 /home/software/denali/contrib/impd/modulefiles/modflow/6.x.x +``` +On _Hovenweep_ make a copy of an existing module file using +``` +rsync /home/software/hovenweep/contrib/impd/modulefiles/modflow/6.5.0.dev0 /home/software/denali/contrib/impd/modulefiles/modflow/6.x.x +``` + +Edit `product_version` in the new module file from `6.5.0.dev0` to `6.x.x` on both systems. + + +## Profiling memory usage + +The `sstat_poll.py` script can be used profile the memory usage of a job while it running. It uses the SLURM utility `sstat` to profile a job at a fixed interval (default is 30 sec.). The script can not be run with python 2.7. On both Denali and Hovenweep load the cray-python using module + +``` +module load cray-python +``` + +After loading cray-python run the script from any location on Denali or Hovenweep using + +``` +python sstat_poll.py JobID +``` + +where `JobID` is the SLURM JobID of the job you want to profile. Additional user controls can be specified and can be identified using + +``` +python sstat_poll.py -h +``` + +Currently available options include + +``` +usage: sstat_poll [-h] [--format FORMAT] [--output OUTPUT] [--prefix PREFIX] [--command COMMAND] [--interval INTERVAL] jobid + +python script for polling a SLURM job while it is running on a fixed interval. The python uses the SLURM command 'sstat' to return information on the job. By default, the script returns JobID, AveCPU, AveRSS, and MaxRSS but other data can be returned by specifying the format argument (--format=JobID,AveCPU,AveRSS,MaxRSS,...). + +positional arguments: + jobid SLURM JobID + +options: + -h, --help show this help message and exit + --format FORMAT SLURM sstat format string (default is JobID,AveCPU,AveRSS,MaxRSS) + --output OUTPUT Output file (default is None) + --prefix PREFIX Output file prefix (default is None) + --command COMMAND SLURM function (default is sstat) + --interval INTERVAL polling interval in sec. (default is 30.0 sec.) +``` diff --git a/.hpc/cray-hovenweep-meson-build.slurm.batch b/.hpc/cray-hovenweep-meson-build.slurm.batch index a1020f54cf0..56ca5d7645a 100644 --- a/.hpc/cray-hovenweep-meson-build.slurm.batch +++ b/.hpc/cray-hovenweep-meson-build.slurm.batch @@ -12,7 +12,7 @@ set -euxo pipefail # load appropriate modules module switch PrgEnv-${PE_ENV,,} PrgEnv-intel -module load petsc/3.15.5 +module load petsc/3.15.5 meson/1.2.1 ninja/1.11.1 export PKG_CONFIG_PATH=$CRAY_MPICH_DIR/lib/pkgconfig:$PKG_CONFIG_PATH # list loaded modules diff --git a/.hpc/cray-meson-build.slurm.batch b/.hpc/cray-meson-build.slurm.batch index 1f62d43f6f3..d6633b078b5 100644 --- a/.hpc/cray-meson-build.slurm.batch +++ b/.hpc/cray-meson-build.slurm.batch @@ -34,7 +34,7 @@ TESTDIR=$MODFLOW6ROOT/.mf6minsim PREFIX=/home/software/denali/contrib/impd/apps/modflow/$VERSION/$PE_ENV/19.1.0.166 # build MODFLOW 6 -CC=cc CXX=CC F77=ftn F90=ftn FC=ftn meson setup $BUILDDIR --prefix=$PREFIX --bindir=bin --libdir=lib -Dcray=true -Ddebug=false +CC=cc CXX=CC F77=ftn F90=ftn FC=ftn meson setup $BUILDDIR --prefix=$PREFIX --bindir=bin --libdir=lib -Dcray=true -Ddebug=false --wipe meson compile -C $BUILDDIR # install MODFLOW 6 diff --git a/.hpc/sstat_poll.py b/.hpc/sstat_poll.py new file mode 100644 index 00000000000..12e60f101a0 --- /dev/null +++ b/.hpc/sstat_poll.py @@ -0,0 +1,167 @@ +import argparse +import pathlib as pl +import sys +import time +from subprocess import PIPE, STDOUT, Popen + + +def _build_command( + cmd: str, + jobid: int, + fmt: str, + with_header: bool = True, +) -> list: + cmd_args = [cmd] + cmd_args.append(f"-j {jobid}") + cmd_args.append(f"--format={fmt}") + if not with_header: + cmd_args.append("--noheader") + return cmd_args + + +def _run_command( + cmd: str, + jobid: int, + end_msg: str, + fmt: str, + with_header: bool = True, + silent: bool = False, +) -> list: + cmd_args = _build_command(cmd, jobid, fmt, with_header=with_header) + try: + result = [] + proc = Popen(cmd_args, stdout=PIPE, stderr=STDOUT, cwd=".") + + while True: + line = proc.stdout.readline().decode("utf-8") + if line == "" and proc.poll() is not None: + break + line = line.rstrip("\r\n") + if line: + if end_msg in line or ".ext+" in line: + result = None + break + else: + if not silent: + print(line) + if "-----" not in line: + result.append( + ",".join(line.split()) + + "," + + time.strftime("%Y-%m-%d %H:%M:%S") + ) + else: + break + except: + result = None + return result + + +if __name__ == "__main__": + description = ( + "python script for polling a SLURM job " + + "while it is running on a fixed interval. " + + "The python uses the SLURM command 'sstat' " + + "to return information on the job. By default, " + + "the script returns JobID, AveCPU, AveRSS, " + + "and MaxRSS but other data can be returned " + + "by specifying the format argument " + + "(--format=JobID,AveCPU,AveRSS,MaxRSS,...)." + ) + parser = argparse.ArgumentParser( + "sstat_poll", + description=description, + ) + parser.add_argument("jobid", help="SLURM JobID", type=int) + parser.add_argument( + "--format", + help="SLURM sstat format string (default is JobID,AveCPU,AveRSS,MaxRSS)", + type=str, + default="JobID,AveCPU,AveRSS,MaxRSS", + required=False, + ) + parser.add_argument( + "--output", + help="Output file (default is None)", + type=str, + required=False, + default=None, + ) + parser.add_argument( + "--prefix", + help="Output file prefix (default is None)", + type=str, + required=False, + default=None, + ) + parser.add_argument( + "--command", + help="SLURM function (default is sstat)", + type=str, + required=False, + default="sstat", + ) + parser.add_argument( + "--interval", + help="polling interval in sec. (default is 30.0 sec.) ", + type=float, + required=False, + default=30.0, + ) + slurm_args = parser.parse_args() + + if sys.version_info < (3, 8): + sys.exit("Python version must be 3.8 or higher.") + + print(f"SLURM command: {slurm_args.command}") + print(f"JobID: {slurm_args.jobid}") + + if slurm_args.output is None: + output_path = f"{slurm_args.jobid}.{slurm_args.command}.csv" + if slurm_args.prefix is not None: + output_path = f"{slurm_args.prefix}.{output_path}" + output_path = pl.Path(output_path) + else: + output_path = pl.Path(slurm_args.output) + print(f"output path: {output_path}") + + end_msg = ( + f"{slurm_args.command}: error: no steps " + + f"running for job {slurm_args.jobid}" + ) + + # test if exe exists + if ( + _run_command( + slurm_args.command, + slurm_args.jobid, + end_msg, + slurm_args.format, + silent=True, + ) + is None + ): + raise ValueError( + f"SLURM command '{slurm_args.command}' does not exist" + ) + + end_tag = f"sstat:,error:,no,steps,running,for,job,{slurm_args.jobid}" + # open file + with open(output_path, "w") as f: + with_header = True + job_complete = False + while job_complete is False: + result = _run_command( + slurm_args.command, + slurm_args.jobid, + end_msg, + slurm_args.format, + with_header=with_header, + ) + if result is None: + job_complete = True + if not job_complete: + with_header = False + for line in result: + f.write(f"{line}\n") + time.sleep(slurm_args.interval) From 7bc29b7d3d79b5c0ef162b7bbe2b1efe3e420cbc Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 13 Feb 2024 08:34:02 -0500 Subject: [PATCH 013/199] test: use v14 of executables distribution (#1614) * v15 of exes distribution doesn't have double-precision program versions * temporary workaround until double-prec mf2005/mfnwt/etc restored to dist --- autotest/get_exes.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/autotest/get_exes.py b/autotest/get_exes.py index d5c789ceb11..2345ea4f59c 100644 --- a/autotest/get_exes.py +++ b/autotest/get_exes.py @@ -97,7 +97,9 @@ def rebuild(): def test_get_executables(downloaded_bin_path: Path): print(f"Installing MODFLOW-related executables to: {downloaded_bin_path}") downloaded_bin_path.mkdir(exist_ok=True, parents=True) - flopy.utils.get_modflow(str(downloaded_bin_path)) + # todo: remove release_id workaround when double-precision comparison issues fixed + # https://github.com/MODFLOW-USGS/modflow6/pull/1612 + flopy.utils.get_modflow(str(downloaded_bin_path), release_id="14.0") if __name__ == "__main__": From d1116068036af83baf7fca28b8b895dac3af3af4 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 13 Feb 2024 13:21:19 -0500 Subject: [PATCH 014/199] ci: don't trigger compiler checks on push or PR (#1615) * previously triggered on push/PR to master or release branch --- .github/workflows/compilers.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index e3fcd7dd85b..e2fad0dab35 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -1,12 +1,5 @@ name: MODFLOW 6 compiler checks on: - push: - branches: - - v[0-9]+.[0-9]+.[0-9]+* - - master - pull_request: - branches: - - master schedule: - cron: 0 0 * * 0 # 12am utc every sunday # workflow_dispatch trigger to start release via GitHub UI or CLI, see From 1bbf0a6879b4c29ebb8d001c543e34652d1a0dba Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 19:37:08 +0000 Subject: [PATCH 015/199] ci(release): update version to 6.4.4, reset IDEVELOPMODE to 1 --- DISCLAIMER.md | 17 ++++++++--------- README.md | 19 +++++++++---------- code.json | 2 +- doc/version.py | 2 +- src/Utilities/version.f90 | 24 +++++++++++------------- 5 files changed, 30 insertions(+), 34 deletions(-) diff --git a/DISCLAIMER.md b/DISCLAIMER.md index 9226475a939..f32778cb5e4 100644 --- a/DISCLAIMER.md +++ b/DISCLAIMER.md @@ -1,12 +1,11 @@ Disclaimer ---------- -This software has been approved for release by the U.S. Geological Survey -(USGS). Although the software has been subjected to rigorous review, the USGS -reserves the right to update the software as needed pursuant to further analysis -and review. No warranty, expressed or implied, is made by the USGS or the U.S. -Government as to the functionality of the software and related material nor -shall the fact of release constitute any such warranty. Furthermore, the -software is released on condition that neither the USGS nor the U.S. Government -shall be held liable for any damages resulting from its authorized or -unauthorized use. +This software is preliminary or provisional and is subject to revision. It is +being provided to meet the need for timely best science. The software has not +received final approval by the U.S. Geological Survey (USGS). No warranty, +expressed or implied, is made by the USGS or the U.S. Government as to the +functionality of the software and related material nor shall the fact of release +constitute any such warranty. The software is provided on the condition that +neither the USGS nor the U.S. Government shall be held liable for any damages +resulting from the authorized or unauthorized use of the software. diff --git a/README.md b/README.md index 2c8c5782f82..612294cb32a 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ This is the development repository for the USGS MODFLOW 6 Hydrologic Model. The official USGS distribution is available at [USGS Release Page](https://water.usgs.gov/ogw/modflow/MODFLOW.html). -### Version 6.4.4 +### Version 6.4.4 (preliminary) [![GitHub release](https://img.shields.io/github/release/MODFLOW-USGS/modflow6.svg)](https://github.com/MODFLOW-USGS/modflow6/releases/latest) [![MODFLOW 6 continuous integration](https://github.com/MODFLOW-USGS/modflow6/actions/workflows/ci.yml/badge.svg)](https://github.com/MODFLOW-USGS/modflow6/actions/workflows/ci.yml) @@ -108,13 +108,12 @@ Citations for specific versions are included with the [releases](https://github. Disclaimer ---------- -This software has been approved for release by the U.S. Geological Survey -(USGS). Although the software has been subjected to rigorous review, the USGS -reserves the right to update the software as needed pursuant to further analysis -and review. No warranty, expressed or implied, is made by the USGS or the U.S. -Government as to the functionality of the software and related material nor -shall the fact of release constitute any such warranty. Furthermore, the -software is released on condition that neither the USGS nor the U.S. Government -shall be held liable for any damages resulting from its authorized or -unauthorized use. +This software is preliminary or provisional and is subject to revision. It is +being provided to meet the need for timely best science. The software has not +received final approval by the U.S. Geological Survey (USGS). No warranty, +expressed or implied, is made by the USGS or the U.S. Government as to the +functionality of the software and related material nor shall the fact of release +constitute any such warranty. The software is provided on the condition that +neither the USGS nor the U.S. Government shall be held liable for any damages +resulting from the authorized or unauthorized use of the software. diff --git a/code.json b/code.json index 171ccdeb1a4..e2b3c0fcdb2 100644 --- a/code.json +++ b/code.json @@ -1,6 +1,6 @@ [ { - "status": "Release", + "status": "Preliminary", "languages": [ "Fortran2008" ], diff --git a/doc/version.py b/doc/version.py index b370e02776c..27a44b505f2 100644 --- a/doc/version.py +++ b/doc/version.py @@ -1,3 +1,3 @@ # MODFLOW 6 version file automatically created using...update_version.py -# created on...February 13, 2024 18:47:21 +# created on...February 13, 2024 19:37:08 __version__ = "6.4.4" diff --git a/src/Utilities/version.f90 b/src/Utilities/version.f90 index 809c8f5e3f4..161ee0d8f56 100644 --- a/src/Utilities/version.f90 +++ b/src/Utilities/version.f90 @@ -18,7 +18,7 @@ module VersionModule ! -- modflow 6 version integer(I4B), parameter :: IDEVELOPMODE = 1 character(len=*), parameter :: VERSIONNUMBER = '6.4.4' - character(len=*), parameter :: VERSIONTAG = ' 02/13/2024' + character(len=*), parameter :: VERSIONTAG = ' (preliminary) 02/13/2024' character(len=40), parameter :: VERSION = VERSIONNUMBER//VERSIONTAG character(len=2), parameter :: MFVNAM = ' 6' character(len=*), parameter :: MFTITLE = & @@ -75,18 +75,16 @@ module VersionModule ! -- disclaimer must be appropriate for version (release or release candidate) character(len=*), parameter :: FMTDISCLAIMER = & "(/,& - &'This software has been approved for release by the U.S. Geological ',/,& - &'Survey (USGS). Although the software has been subjected to rigorous ',/,& - &'review, the USGS reserves the right to update the software as needed ',/,& - &'pursuant to further analysis and review. No warranty, expressed or ',/,& - &'implied, is made by the USGS or the U.S. Government as to the ',/,& - &'functionality of the software and related material nor shall the ',/,& - &'fact of release constitute any such warranty. Furthermore, the ',/,& - &'software is released on condition that neither the USGS nor the U.S. ',/,& - &'Government shall be held liable for any damages resulting from its ',/,& - &'authorized or unauthorized use. Also refer to the USGS Water ',/,& - &'Resources Software User Rights Notice for complete use, copyright, ',/,& - &'and distribution information.',/)" + &'This software is preliminary or provisional and is subject to ',/,& + &'revision. It is being provided to meet the need for timely best ',/,& + &'science. The software has not received final approval by the U.S. ',/,& + &'Geological Survey (USGS). No warranty, expressed or implied, is made ',/,& + &'by the USGS or the U.S. Government as to the functionality of the ',/,& + &'software and related material nor shall the fact of release ',/,& + &'constitute any such warranty. The software is provided on the ',/,& + &'condition that neither the USGS nor the U.S. Government shall be held ',/,& + &'liable for any damages resulting from the authorized or unauthorized ',/,& + &'use of the software.',/)" contains From ebf84ac0553062df3a8aa1878a5c7192752a3b41 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 13 Feb 2024 14:37:32 -0500 Subject: [PATCH 016/199] ci(release): fix wording in release PR description (#1618) * reset PR step was removed from release procedure, remove mention of it --- .github/workflows/release_dispatch.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/release_dispatch.yml b/.github/workflows/release_dispatch.yml index efa9cc52295..2f1f04ff9dc 100644 --- a/.github/workflows/release_dispatch.yml +++ b/.github/workflows/release_dispatch.yml @@ -203,9 +203,7 @@ jobs: The release can be approved by merging this PR into `master`. Merging rather than squashing is necessary to preserve the commit history. - When this PR is merged, a final job will be triggered to: - 1) create and tag a draft GitHub release, then upload assets (OS distributions and release notes) - 2) open a PR to update `develop` from `master`, resetting version files and setting `IDEVELOPMODE=1` + When this PR is merged, a final job will be triggered to draft a tagged GitHub release, then upload assets (OS distributions and release notes). ' gh pr create -B "master" -H "${{ github.ref }}" --title "Release $ver" --draft --body "$body" From b06026b92e8e742cc43ec906063a95f9a37e79b2 Mon Sep 17 00:00:00 2001 From: "Langevin, Christian D" Date: Tue, 13 Feb 2024 14:38:50 -0600 Subject: [PATCH 017/199] update readme.md from dev1 to dev2 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 303b0f49002..15ec9fb662f 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ This is the development repository for the USGS MODFLOW 6 Hydrologic Model. The official USGS distribution is available at [USGS Release Page](https://water.usgs.gov/ogw/modflow/MODFLOW.html). -### Version 6.5.0.dev1 (preliminary) +### Version 6.5.0.dev2 (preliminary) [![GitHub release](https://img.shields.io/github/release/MODFLOW-USGS/modflow6.svg)](https://github.com/MODFLOW-USGS/modflow6/releases/latest) [![MODFLOW 6 continuous integration](https://github.com/MODFLOW-USGS/modflow6/actions/workflows/ci.yml/badge.svg)](https://github.com/MODFLOW-USGS/modflow6/actions/workflows/ci.yml) From e31e79b887f8a7bb4bb3331352d8e47de9921b8b Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 14 Feb 2024 10:00:33 -0500 Subject: [PATCH 018/199] docs(release): improve release procedure documentation (#1620) * correct inaccuracies from earlier versions of release automation * remove water mover performance entry from develop.tex * rename vx.x.x-template.tex -> vx.y.z-template.tex * describe release notes maintenance procedure * remove unused function from build_dist.py * reformat python scripts in distribution/ --- distribution/README.md | 226 +++++++++--------- distribution/benchmark.py | 6 +- distribution/build_dist.py | 33 --- distribution/build_docs.py | 16 +- doc/ReleaseNotes/develop.tex | 8 +- ...x.x.x-template.tex => vx.y.z-template.tex} | 0 6 files changed, 136 insertions(+), 153 deletions(-) rename doc/ReleaseNotes/{vx.x.x-template.tex => vx.y.z-template.tex} (100%) diff --git a/distribution/README.md b/distribution/README.md index f0ca205f37d..66d74f805fb 100644 --- a/distribution/README.md +++ b/distribution/README.md @@ -1,81 +1,43 @@ # Distributing MODFLOW 6 -This folder contains scripts to automate MODFLOW 6 distribution tasks. +This document describes release procedures for MODFLOW 6. This folder contains scripts to automate MODFLOW 6 distribution tasks. - - [Overview](#overview) - [Requirements](#requirements) +- [Steps](#steps) + - [Update release notes](#update-release-notes) + - [Update version info](#update-version-info) + - [Build makefiles](#build-makefiles) + - [Build example models](#build-example-models) + - [Benchmark example models](#benchmark-example-models) + - [Build documentation](#build-documentation) + - [Build the distribution archive](#build-the-distribution-archive) + - [Verify the distribution archive](#verify-the-distribution-archive) +- [Procedure](#procedure) - [Testing](#testing) -- [Release procedures](#release-procedures) - - [Preparing a minimal development release](#preparing-a-minimal-development-release) - - [Preparing an official release](#preparing-an-official-release) - - [Updating version info](#updating-version-info) - - [Building makefiles](#building-makefiles) - - [Building example models](#building-example-models) - - [Benchmarking example models](#benchmarking-example-models) - - [Building documentation](#building-documentation) - - [Building the distribution archive](#building-the-distribution-archive) - - [Verifying the distribution archive](#verifying-the-distribution-archive) -- [Release automation](#release-automation) - - [Nightly builds](#nightly-builds) - - [Official releases](#official-releases) - - [Triggering with a release branch](#triggering-with-a-release-branch) - - [Triggering a release manually](#triggering-a-release-manually) - - [Release versioning](#release-versioning) + - [Testing release scripts](#testing-release-scripts) + - [Testing the release workflow](#testing-the-release-workflow) ## Overview -This document describes release procedures for MODFLOW 6. Manually preparing a release involves running scripts in the `distribution` directory in a particular order: - -1. Update version info: `update_version.py` -2. Run benchmarks: `benchmark.py` -3. Build documentation: `build_docs.py` -4. Build distribution: `build_dist.py` - -This process is automated in the `.github/workflows/release.yml` workflow. - -The `build_dist.py` script is lazy — benchmarks, example models and documentation artifacts are downloaded via the GitHub API if available, and only re-created if none exist or the `--force` (`-f`) flag is provided. This allows the release workflow to consume artifacts previously created by other workflow runs, reducing the time needed to create and publish a release. - -## Requirements - -This document assumes a MODFLOW 6 development environment has been configured as per the [developer documentation](../DEVELOPER.md), including a Fortran compiler (either `ifort` or `gfortran`) as well as a Conda environment as specified in `environment.yml`. Official distributions are currently prepared with Intel Fortran (`ifort`). - -## Testing - -Each script in `distribution/` contains its own tests. To run them, run `pytest` from the `distribution/` folder. The tests will not be discovered if `pytest` is run from a different location, as the scripts in this folder are not named `test_*.py` and are only discoverable by virtue of the patterns provided in `distribution/pytest.ini`. The tests use temporary directories where possible and revert modifications to tracked files on teardown. - -**Note:** the tests clean up by reverting changes to files in the following locations: - -- `doc/` -- `make` -- `utils/**/make/` - -Make sure you don't have any uncommitted changes in these locations before running the tests. - -**Note:** to avoid contested file access, the tests **should not be run in parallel** with `pytest-xdist`. - -There is a small additional suite of tests that can be used to validate a release distribution folder after it is built: `check_dist.py`. These tests are run as part of the release workflow. - -## Release procedures - -MODFLOW 6 release come in two flavors: +MODFLOW 6 releases come in two flavors: - nightly development builds - full/approved distributions -Development builds are created nightly from the tip of the `develop` branch and released from the [`MODFLOW-USGS/modflow6-nightly-build` repository](https://github.com/MODFLOW-USGS/modflow6-nightly-build). Development distributions contain only MODFLOW 6 input/output documentation and core executables and libraries: +Development builds are created nightly from the tip of the `develop` branch and released from the [`MODFLOW-USGS/modflow6-nightly-build` repository](https://github.com/MODFLOW-USGS/modflow6-nightly-build). Development distributions contain only MODFLOW 6 input/output documentation, release notes, `code.json` metadata, and core executables and libraries: - `mf6`: MODFLOW 6 executable - `zbud6`: Zonebudget executable - `mf5to6`: MODFLOW 5 to 6 converter executable - `libmf6`: MODFLOW 6 dynamic library -Full distributions, on the other hand, contain the items listed above, as well as: +Full distributions contain the items listed above, as well as: - Meson build files - Fortran source code @@ -90,32 +52,49 @@ Full distributions, on the other hand, contain the items listed above, as well a - docs for various MODFLOW 6 features and packages - docs for `mf5to6` and `zbud6` +Official releases can be classified further into two types: patch and minor releases. Patch releases should typically branch from `master` and cherry-pick relevant commits, since `develop` may contain broader changes not yet ready for release. Minor releases typically branch from `develop`. MODFLOW 6 does not currently increment the major version number. -### Preparing a minimal development release +Both nightly builds and official distributions are created automatically with GitHub Actions. -Development releases are built and [posted nightly on the `MODFLOW-USGS/modflow6-nightly-build` repository](https://github.com/MODFLOW-USGS/modflow6-nightly-build/releases). For a minimal release, distribution contents include: +## Requirements -- platform-specific distributions containing only executables `mf6`, `zbud6`, `mf5to6` and library `libmf6` -- MODFLOW 6 input/output documentation -- release notes -- `code.json` metadata +This document assumes a MODFLOW 6 development environment has been configured as per the [developer documentation](../DEVELOPER.md), including a Fortran compiler (either `ifort` or `gfortran`) as well as a Conda environment as specified in `environment.yml`. Official distributions are currently prepared with Intel Fortran (`ifort`). -The `build_dist.py` script can be used to create both minimal and full distributions. By default, a minimal distribution is created. To create a full distribution, run the script with the `--full` flag: +## Steps -The script has several other arguments: +Broadly, steps to prepare an official release for distribution include: -- `--build-path`: path to the build workspace, defaults to `/builddir` -- `--output-path (-o)`: path to create a distribution zipfile, defaults to `/distribution/` -- `--examples-repo-path (-e)`: path to the [`MODFLOW-USGS/modflow6-examples`](https://github.com/MODFLOW-USGS/modflow6-examples) repository, defaults to `modflow6-examples` side-by-side with project root -- `--force (-f)`: whether to recreate and overwrite preexisting components of the distribution, if they already exist +- update release notes for the release (and reset them after) +- update version information with `update_version.py` +- (re)build makefiles with `build_makefiles.py` +- benchmark example models with `benchmark.py` +- build the MF6IO documentation with `build_docs.py` +- build the distribution archive with `build_dist.py` +- verify the distribution archive with `check_dist.py` + +These should occur roughly in the order presented above. The procedure is automated in the `.github/workflows/release.yml` and `release_dispatch.yml` workflows. + +**Note**: `git`- and/or GitHub-related steps are omitted from this section. See the [Procedure](#procedure) section below for a step-by-step recipe for creating and distributing release with the help of GitHub Actions. + +### Update release notes + +The release notes document is constructed from the `doc/ReleaseNotes/ReleaseNotes.tex` LaTeX file. During each development cycle, release notes should be maintained in `doc/ReleaseNotes/develop.tex` — this file is referenced from `doc/ReleaseNotes/ReleaseNotes.tex`. + +Before making a release, add a line to the Release History section of `ReleaseNotes.tex` providing the version number, date and DOI of the current release, e.g. `6.4.4 & February 13, 2024 & \url{https://doi.org/10.5066/P9FL1JCC}`. -Default paths are resolved relative to the script's location on the filesystem, *not* the current working directory, so the script can be run from `distribution/`, from the project root, or from anywhere else. (This is true of all scripts in the `distribution/` directory.) +After each release is made, several steps are required to reset the release notes for the next development cycle: -### Preparing an official release +- copy `develop.tex` into a new file `doc/ReleaseNotes/previous/vx.y.z.tex` (where `x.y.z` is the semantic version just released) +- add a new entry like `\input{./previous/vx.y.z.tex}` to line 3 of `doc/ReleaseNotes/appendixA.tex` +- overwrite `develop.tex` with the contents of `doc/ReleaseNotes/vx.y.z-template.tex` -To prepare an official release for distribution, the steps are as follows: +Now new changes can be added to `develop.tex` as development proceeds. -#### Updating version info +**Note**: Newly deprecated MF6IO options are included in the release notes. See the [developer docs](../DEVELOPER.md#deprecation-policy) for more info on MF6's deprecation policy, searching for deprecations among DFNs, and generating a deprecations table for insertion into the release notes. + +### Update version info + +MODFLOW 6 version numbers follow the [semantic versioning](https://semver.org/) convention `major.minor.patch`. Release tags do *not* include an initial `v`, as is common in many other projects. Version information is stored primarily in `version.txt` in the project root, as well as in several other files in the repository. @@ -137,11 +116,17 @@ python update_version.py -v 6.4.2rc The label must start immediately following the patch version number, with no space in between. The label may contain numeric characters or symbols, but *must not* start with a number (otherwise there is no way to distinguish it from the patch version number). -The `--approved` (short `-a`) flag can be used to approve an official release. If the `--approved` flag is provided, disclaimer language is altered to reflect approval. If the flag is not provided, the language reflects preliminary/provisional status and `(preliminary)` is appended to version numbers. +The `update_version.py` script has a few other flags: + +- `--approved` (short `-a`): approve an official release. If the `--approved` flag is provided, disclaimer language is altered to reflect approval. If the flag is not provided, the language reflects preliminary/provisional status and `(preliminary)` is appended to version numbers. + +- `--releasemode` (short `-r`): toggle whether binaries are built in development or release mode by editing the contents of `src/Utilities/version.f90`. If the `--releasemode` flag is provided, `IDEVELOPMODE` is set to 0. If `--releasemode` is not provided, `IDEVELOPMODE` is set to 1. -The `--releasemode` flag can be used to control whether binaries are built in development or release mode by editing the contents of `src/Utilities/version.f90`. If the `--releasemode` flag is provided, `IDEVELOPMODE` is set to 0. If `--releasemode` is not provided, `IDEVELOPMODE` is set to 1. +- `--get` (short `-g`): print the current version number to `stdout` without making any updates. -#### Building makefiles +- `--citation` (short `-c`): generate a citation from the contents of `CITATION.cff` and print it to `stdout`, again without making any updates. + +### Build makefiles The `build_makefiles.py` script is used to rewrite makefiles after Fortran source files have been added, removed, or renamed. Up-to-date makefiles must be generated for inclusion in a distribution. To build makefiles, run: @@ -149,11 +134,11 @@ The `build_makefiles.py` script is used to rewrite makefiles after Fortran sourc python build_makefiles.py ``` -#### Building example models +### Build example models MODFLOW 6 [example models](https://github.com/MODFLOW-USGS/modflow6-examples) are bundled with official releases. Example models must be built and run to generate plots and tables before documentation can be generated. The `release.yml` workflow attempts to download the latest release from the examples repository, only re-building and re-running example models if no such release is available. See the examples repository for more information on preparing example models. -#### Benchmarking example models +### Benchmark example models MODFLOW 6 documentation includes a performance evaluation comparing the current version against the last official release. Benchmarks must run before a release can be prepared. Benchmarks run as a component of the `docs.yml` CI workflow — `release.yml` attempts to download benchmark results if available, only re-running them if necessary. @@ -172,68 +157,89 @@ python benchmark.py -e ../modflow6-examples -o .benchmarks The above will write results to a markdown file `.benchmarks/run-time-comparison.md` relative to the project root. -#### Building documentation +### Build documentation -Extensive documentation is bundled with official MODFLOW 6 releases. MODFLOW 6 documentation is written in LaTeX. Some LaTeX files (in particular for MODFLOW 6 input/output documentation) is automatically generated from DFN files. The `release.yml` workflow first runs `update_version.py` to update version strings to be substituted into the docs, then runs `build_docs.py` to regenerate LaTeX files where necessary, download benchmark results (and convert the Markdown results file to LaTeX), download publications hosted on the USGS website, and finally convert LaTeX to PDFs. +Extensive documentation is bundled with official MODFLOW 6 releases. MODFLOW 6 documentation is written in LaTeX. Some LaTeX files (in particular for MODFLOW 6 input/output documentation) are automatically generated from DFN files. The `release.yml` workflow first runs `update_version.py` to update version strings to be substituted into the docs, then runs `build_docs.py` to regenerate LaTeX files where necessary, download benchmark results (and convert the Markdown results file to LaTeX), download publications hosted on the USGS website, and finally convert LaTeX to PDFs. Manually building MODFLOW 6 documentation requires additional Python dependencies specified in `build_rtd_docs/requirements.rtd.txt`. Styles defined in the [`MODFLOW-USGS/usgslatex`](https://github.com/MODFLOW-USGS/usgslatex) are also required. (See that repository's `README` for installation instructions or this repo's [`../.github/workflows/docs.yml](../.github/workflows/docs.yml) CI workflow for an example.) -#### Building the distribution archive +### Build the distribution archive -After each step above is complete, the `build_dist.py` script can be used to construct the MODFLOW 6 distribution. See [the `release.yml` workflow](../.github/workflows/release.yml) for a complete example of how to build a distribution archive. +After each step above is complete, the `build_dist.py` script can be used to construct the MODFLOW 6 distribution. The `build_dist.py` script can be used to create both minimal and full distributions. By default, a minimal distribution is created. To create a full distribution, run the script with the `--full` flag. -#### Verifying the distribution archive +The `build_dist.py` script is lazy — benchmarks, example models and documentation artifacts are downloaded via the GitHub API if available, and only re-created if none exist or the `--force` (`-f`) flag is provided. This allows the release workflow to consume artifacts previously created by other workflow runs, reducing the time needed to create and publish a release. -The `check_dist.py` script can be used to check the release distribution folder. The `--path` argument is the path to the dist folder. The `--approved` flag can be used to signal that the release is approved/official. By default the release is assumed preliminary. The script checks the version string emitted by `mf6 -v` for the presence or absence of "preliminary" depending on this flag. +The script has several other arguments: -## Release automation +- `--build-path`: path to the build workspace, defaults to `/builddir` +- `--output-path (-o)`: path to create a distribution zipfile, defaults to `/distribution/` +- `--examples-repo-path (-e)`: path to the [`MODFLOW-USGS/modflow6-examples`](https://github.com/MODFLOW-USGS/modflow6-examples) repository, defaults to `modflow6-examples` side-by-side with project root +- `--force (-f)`: whether to recreate and overwrite preexisting components of the distribution, if they already exist -Both nightly builds and official distributions are built automatically with GitHub Actions. +Default paths are resolved relative to the script's location on the filesystem, *not* the current working directory, so the script can be run from `distribution/`, from the project root, or from anywhere else. This is true of all scripts in the `distribution/` directory. -### Nightly builds +See [the `release.yml` workflow](../.github/workflows/release.yml) for a complete example of how to build a distribution archive. -As mentioned, development releases are automatically built and posted nightly on the [`MODFLOW-USGS/modflow6-nightly-build`](https://github.com/MODFLOW-USGS/modflow6-nightly-build) repository. +### Verify the distribution archive + +The `check_dist.py` script can be used to check the release distribution folder. The `--path` argument is the path to the dist folder. The `--approved` flag can be used to signal that the release is approved/official. By default the release is assumed preliminary. The script checks the version string emitted by `mf6 -v` for the presence or absence of "preliminary" depending on this flag. -### Official releases +## Procedure -The procedure above to prepare an official release is reproduced in `.github/workflows/release.yml`. This workflow has no triggers of its own, and must be dispatched by `.github/workflows/release_dispatch.yml`. A release can be dispatched in two ways: +The steps above are automated in the `.github/workflows/release.yml` and `release_dispatch.yml` workflows. The `.github/workflows/release.yml` workflow is used for both nightly builds and official releases. It should not be necessary to prepare a release manually. -- Push a release branch to the `MODFLOW-USGS/modflow6` repository. -- Manually trigger the workflow via GitHub CLI or web UI. +The `release.yml` workflow has no triggers of its own, and must be dispatched by `.github/workflows/release_dispatch.yml`, in one of two ways: -#### Triggering with a release branch +- Push a release branch to the `MODFLOW-USGS/modflow6` repository. This method should be used for proper releases. +- Manually trigger the workflow via GitHub CLI or web UI. Useful for testing release candidates or verifying the release automation before a final release is made — see the [Testing](#testing) section below for more detail. -To release a new version of MODFLOW 6: +To release an official version of MODFLOW 6 via the release branch method: 1. Create a release candidate branch from the tip of `develop` or `master`. The branch's name must begin with `v` followed by the version number. For an officially approved release, include *only* the version number. For a preliminary release candidate, append `rc` after the version number, e.g. `v6.4.0rc`. If the branch name does not end in `rc`, the release is assumed to be approved. 2. Push the branch to the `MODFLOW-USGS/modflow6` repository. This triggers the release workflow. If the release is still an unapproved candidate (i.e. the branch name ends with `rc`) binaries are built with `IDEVELOPMODE` set to 1, and the workflow ends after uploading binaries and documentation artifacts for inspection. If the release is approved/official, the workflow drafts a pull request against the `master` branch. -3. To continue with the release, merge the PR into `master`. This triggers another job to tag the new tip of `master` with the release number, draft a release post, upload binaries and documentation as release assets, and create another PR updating the `develop` branch from `master`, resetting version files, and setting `IDEVELOPMODE` back to 1. -4. To finalize the release, publish the release post and merge the PR into `develop`. +3. To continue with the release, merge (**do not squash**) the PR into `master`. This triggers another job to tag the new tip of `master` with the release number, draft a release, and upload binaries and documentation as release assets. +4. If the release assets pass inspection, publish the release. The following format convention is used for the GitHub release post: -#### Triggering a release manually + ``` + This is the approved USGS MODFLOW release. + + , , MODFLOW 6 Modular Hydrologic Model version : U.S. Geological Survey Software Release, , + + Visit the USGS "MODFLOW and Related Programs" site for information on MODFLOW 6 and related software: https://doi.org/10.5066/F76Q1VQV + ``` -The `workflow_dispatch` event is GitHub's mechanism for manually triggering workflows. This can be accomplished from the Actions tab in the GitHub UI. +5. Create a branch from `master`, naming it something like `post-release-x.y.z-reset`. Run `distribution/update_version.py -v x.y.z.devN`, substituting `x`, `y`, `z` and `N` as appropriate for the next development cycle's version number. This will substitute the version number into all necessary files and will also set `IDEVELOPMODE` back to 1. Reset release notes as described [above](#update-release-notes). Open a pull request into `master` from the reset branch. Merge (**do not squash**) the PR. -Navigate to the Actions tab of this repository. Select the release dispatch workflow. A `Run workflow` button should be visible in an alert at the top of the list of workflow runs. Click the `Run workflow` button, selecting values for the various inputs: +**Note**: Squashing the release PR into `master` or the post-release reset PR into `develop` causes `develop` and `master` to diverge, leading to conflicts at the next release time. Both pull requests should be **merged with a merge commit**, *not* squashed. -- `approve`: whether the release is officially approved, or just a release candidate -- `branch`: the branch to release from -- `development`: whether to build a minimal development distribution or a full distribution -- `run_tests`: whether to run autotests after building binaries -- `version`: the version number of the release +## Testing -### Release versioning +Each script used in the release procedure can be tested separately. The procedure can also be tested end-to-end by manually dispatching the release workflow. -MODFLOW 6 version numbers follow the [semantic versioning](https://semver.org/) convention `major.minor.patch`. Release tags do *not* include an initial `v`, as is common in many other projects. +### Testing release scripts -Patch releases should typically branch from `master`, since `develop` may contain broader changes not yet ready for release. Minor releases typically branch from `develop`. MODFLOW 6 release procedures do not currently increment the major version number. +Each script in `distribution/` contains its own tests. To run them, run `pytest` from the `distribution/` folder. The tests will not be discovered if `pytest` is run from a different location, as the scripts in this folder are not named `test_*.py` and are only discoverable by virtue of the patterns provided in `distribution/pytest.ini`. The tests use temporary directories where possible and revert modifications to tracked files on teardown. -Release notes use the following format convention: +**Note:** the tests clean up by reverting changes to files in the following locations: -``` -This is the approved USGS MODFLOW release. +- `doc/` +- `make` +- `utils/**/make/` + +Make sure you don't have any uncommitted changes in these locations before running the tests. + +**Note:** to avoid contested file access, the tests will refuse to run in parallel with `pytest-xdist`. + +There is a small additional suite of tests that can be used to validate a release distribution folder after it is built: `check_dist.py`. These tests are run as part of the release workflow — see below for more detail. + +### Testing the release workflow + +The `workflow_dispatch` event is GitHub's mechanism for manually triggering workflows. This can be accomplished from the Actions tab in the GitHub UI. This is a convenient way to test the release procedure and evaluate release candidate distributions. -, , MODFLOW 6 Modular Hydrologic Model version : U.S. Geological Survey Software Release, , +To dispatch the release workflow, navigate to the Actions tab of this repository. Select the release dispatch workflow. A `Run workflow` button should be visible in an alert at the top of the list of workflow runs. Click the `Run workflow` button, selecting values for the various inputs: -Visit the USGS "MODFLOW and Related Programs" site for information on MODFLOW 6 and related software: https://doi.org/10.5066/F76Q1VQV -``` \ No newline at end of file +- `approve`: whether the release is officially approved, or just a release candidate +- `branch`: the branch to release from +- `development`: whether to build a minimal development distribution or a full distribution +- `run_tests`: whether to run autotests after building binaries +- `version`: the version number of the release \ No newline at end of file diff --git a/distribution/benchmark.py b/distribution/benchmark.py index b92d533fec3..4c56ce49481 100644 --- a/distribution/benchmark.py +++ b/distribution/benchmark.py @@ -27,7 +27,11 @@ _is_windows = sys.platform.lower() == "win32" _app_ext = ".exe" if _is_windows else "" _soext = ".dll" if _is_windows else ".so" -_ostag = "win64" if _is_windows else "linux" if sys.platform.lower().startswith("linux") else "mac" +_ostag = ( + "win64" + if _is_windows + else "linux" if sys.platform.lower().startswith("linux") else "mac" +) def download_previous_version(output_path: PathLike) -> Tuple[str, Path]: diff --git a/distribution/build_dist.py b/distribution/build_dist.py index 4d8efdfc8f6..3014ebbc381 100644 --- a/distribution/build_dist.py +++ b/distribution/build_dist.py @@ -103,39 +103,6 @@ def test_copy_sources(tmp_path): assert (tmp_path / "utils" / "mf5to6" / "pymake").is_dir() assert (tmp_path / "utils" / "zonebudget" / "pymake").is_dir() assert not (tmp_path / "utils" / "idmloader").is_dir() - - - -def build_examples(examples_repo_path: PathLike, overwrite: bool = False): - examples_repo_path = Path(examples_repo_path).expanduser().absolute() - - # create examples, but don't run them - examples_path = examples_repo_path / "examples" - examples_path.mkdir(parents=True, exist_ok=True) - if not overwrite and any(get_model_paths(examples_path)): - print(f"Examples already built") - else: - print(f"Building examples") - scripts_folder = examples_repo_path / "scripts" - exclude_list = ["ex-gwf-capture.py"] - scripts = [ - fname - for fname in scripts_folder.glob("*") - if fname.suffix == ".py" - and fname.stem.startswith("ex-") - and fname.stem not in exclude_list - ] - for script in scripts: - argv = [ - sys.executable, - script, - "--no_run", - "--no_plot", - "--destination", - examples_path, - ] - print(f"running {argv} in {scripts_folder}") - run_command(argv, scripts_folder) def setup_examples( diff --git a/distribution/build_docs.py b/distribution/build_docs.py index 3c74f642f13..0135753816c 100644 --- a/distribution/build_docs.py +++ b/distribution/build_docs.py @@ -117,7 +117,9 @@ def download_benchmarks( reverse=True, ) artifacts = [ - a for a in artifacts if a["workflow_run"]["head_branch"] == "develop" # todo make configurable + a + for a in artifacts + if a["workflow_run"]["head_branch"] == "develop" # todo make configurable ] most_recent = next(iter(artifacts), None) print(f"Found most recent benchmarks (artifact {most_recent['id']})") @@ -158,7 +160,9 @@ def build_benchmark_tex( # download benchmark artifacts if any exist on GitHub if not benchmarks_path.is_file(): - benchmarks_path = download_benchmarks(_benchmarks_dir_path, repo_owner=repo_owner) + benchmarks_path = download_benchmarks( + _benchmarks_dir_path, repo_owner=repo_owner + ) # run benchmarks again if no benchmarks found on GitHub or overwrite requested if overwrite or not benchmarks_path.is_file(): @@ -179,7 +183,7 @@ def build_benchmark_tex( ) assert not ret, out + err assert tex_path.is_file() - + if (_distribution_path / f"{benchmarks_path.stem}.md").is_file(): assert (_docs_path / "ReleaseNotes" / f"{benchmarks_path.stem}.tex").is_file() @@ -209,7 +213,7 @@ def build_deprecations_tex(): ) assert not ret, out + err assert tex_path.is_file() - + assert (_docs_path / "ReleaseNotes" / f"{deprecations_path.stem}.tex").is_file() @@ -489,7 +493,9 @@ def build_documentation( if not full: # convert LaTeX to PDF - build_pdfs_from_tex(tex_paths=_dev_dist_tex_paths, output_path=output_path, overwrite=overwrite) + build_pdfs_from_tex( + tex_paths=_dev_dist_tex_paths, output_path=output_path, overwrite=overwrite + ) else: # convert benchmarks to LaTex, running them first if necessary build_benchmark_tex( diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index 11ac03ea128..cbef622e93b 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -39,12 +39,12 @@ % \item xxx %\end{itemize} - \underline{ADVANCED STRESS PACKAGES} - \begin{itemize} - \item Refactoring of the Water Mover package in version 6.4.3 introduced a reduction in performance for GWF models with a large number of movers. The program was corrected so that performance is similar to previous versions. + %\underline{ADVANCED STRESS PACKAGES} + %\begin{itemize} + % \item % \item xxx % \item xxx - \end{itemize} + %\end{itemize} %\underline{SOLUTION} %\begin{itemize} diff --git a/doc/ReleaseNotes/vx.x.x-template.tex b/doc/ReleaseNotes/vx.y.z-template.tex similarity index 100% rename from doc/ReleaseNotes/vx.x.x-template.tex rename to doc/ReleaseNotes/vx.y.z-template.tex From b77cd262bb982d30fe22352a41ca06e01f53c2b0 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 14 Feb 2024 23:53:29 -0500 Subject: [PATCH 019/199] test: make downloaded/rebuilt programs optional (#1621) * skip, don't crash/fail if downloaded programs or rebuilt regression mf6 programs not found * only require dev build to gracefully run autotests --- autotest/conftest.py | 12 +++++++++--- autotest/framework.py | 22 +++++++++++++--------- autotest/test_gwf_csub_zdisp01.py | 6 +++++- autotest/test_gwf_npf01_75x75.py | 5 ++++- autotest/test_gwf_sto01.py | 6 +++++- 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/autotest/conftest.py b/autotest/conftest.py index f278abff0bb..0fac4e4d98d 100644 --- a/autotest/conftest.py +++ b/autotest/conftest.py @@ -66,12 +66,18 @@ def targets() -> Dict[str, Path]: # require development binaries assert v.is_file(), f"Couldn't find binary '{k}' expected at: {v}" d[k] = v - for k, v in _binaries["downloaded"] + _binaries["rebuilt"]: - # downloaded/rebuilt binaries are optional + for k, v in _binaries["downloaded"]: + # downloaded binaries are optional if v.is_file(): d[k] = v else: - warn(f"Couldn't find binary '{k}' expected at: {v}") + warn(f"Couldn't find downloaded binary '{k}' expected at: {v}") + for k, v in _binaries["rebuilt"]: + # rebuilt binaries are optional + if v.is_file(): + d[k] = v + else: + warn(f"Couldn't find rebuilt binary '{k}' expected at: {v}") return d diff --git a/autotest/framework.py b/autotest/framework.py index 8bfd0855169..e0828f70d12 100644 --- a/autotest/framework.py +++ b/autotest/framework.py @@ -10,6 +10,7 @@ import flopy import numpy as np +import pytest from common_regression import ( COMPARE_PROGRAMS, adjust_htol, @@ -777,17 +778,20 @@ def run(self): # run comparison simulation if libmf6 or mf6 regression if self.compare in ["mf6_regression", "libmf6"]: - # todo: don't hardcode workspace or assume agreement with test case - # simulation workspace, set & access simulation workspaces directly - workspace = self.workspace / self.compare - success, _ = self.run_sim_or_model( - workspace, - self.targets.get(self.compare, self.targets["mf6"]), - ) - assert success, f"Comparison model failed: {workspace}" + if self.compare not in self.targets: + warn(f"Couldn't find comparison program '{self.compare}', skipping comparison") + else: + # todo: don't hardcode workspace or assume agreement with test case + # simulation workspace, set & access simulation workspaces directly + workspace = self.workspace / self.compare + success, _ = self.run_sim_or_model( + workspace, + self.targets.get(self.compare, self.targets["mf6"]), + ) + assert success, f"Comparison model failed: {workspace}" # compare model results, if enabled - if self.verbose: + if self.verbose and self.compare in self.targets: print("Comparing outputs") self.compare_output(self.compare) diff --git a/autotest/test_gwf_csub_zdisp01.py b/autotest/test_gwf_csub_zdisp01.py index 5b2f6091b3e..c2b91fe9164 100644 --- a/autotest/test_gwf_csub_zdisp01.py +++ b/autotest/test_gwf_csub_zdisp01.py @@ -6,6 +6,7 @@ from flopy.utils.compare import compare_heads from framework import TestFramework +from conftest import try_get_target cases = ["csub_zdisp01"] cmppth = "mfnwt" @@ -330,7 +331,10 @@ def build_models(idx, test): cpth = cmppth ws = os.path.join(test.workspace, cpth) mc = flopy.modflow.Modflow( - name, model_ws=ws, version=cpth, exe_name=test.targets["mfnwt"] + name, + model_ws=ws, + version=cpth, + exe_name=try_get_target(test.targets, "mfnwt"), ) dis = flopy.modflow.ModflowDis( mc, diff --git a/autotest/test_gwf_npf01_75x75.py b/autotest/test_gwf_npf01_75x75.py index 505059079ed..e787036849a 100644 --- a/autotest/test_gwf_npf01_75x75.py +++ b/autotest/test_gwf_npf01_75x75.py @@ -5,6 +5,7 @@ import pytest from framework import TestFramework +from conftest import try_get_target cases = ["npf01a_75x75", "npf01b_75x75"] top = [100.0, 0.0] @@ -149,7 +150,9 @@ def build_models(idx, test): # build MODFLOW-2005 files ws = os.path.join(test.workspace, "mf2005") - mc = flopy.modflow.Modflow(name, model_ws=ws, exe_name=test.targets["mf2005"]) + mc = flopy.modflow.Modflow( + name, model_ws=ws, exe_name=try_get_target(test.targets, "mf2005") + ) dis = flopy.modflow.ModflowDis( mc, nlay=nlay, diff --git a/autotest/test_gwf_sto01.py b/autotest/test_gwf_sto01.py index b52f551aced..e9fb464a882 100644 --- a/autotest/test_gwf_sto01.py +++ b/autotest/test_gwf_sto01.py @@ -5,6 +5,7 @@ import pytest from framework import TestFramework +from conftest import try_get_target cases = ["gwf_sto01"] cmppth = "mfnwt" @@ -203,7 +204,10 @@ def build_models(idx, test): cpth = cmppth ws = os.path.join(test.workspace, cpth) mc = flopy.modflow.Modflow( - name, model_ws=ws, version=cpth, exe_name=test.targets["mfnwt"] + name, + model_ws=ws, + version=cpth, + exe_name=try_get_target(test.targets, "mfnwt"), ) dis = flopy.modflow.ModflowDis( mc, From c39c811c62659a248266d5de7524e8312d4a3009 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Thu, 15 Feb 2024 09:51:13 -0600 Subject: [PATCH 020/199] doc: update .hpc/README.md (#1622) --- .hpc/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.hpc/README.md b/.hpc/README.md index 391ae7e64e4..23b670230f5 100644 --- a/.hpc/README.md +++ b/.hpc/README.md @@ -22,7 +22,7 @@ rsync /home/software/denali/contrib/impd/modulefiles/modflow/6.5.0.dev0 /home/so ``` On _Hovenweep_ make a copy of an existing module file using ``` -rsync /home/software/hovenweep/contrib/impd/modulefiles/modflow/6.5.0.dev0 /home/software/denali/contrib/impd/modulefiles/modflow/6.x.x +rsync /home/software/hovenweep/contrib/impd/modulefiles/modflow/6.5.0.dev0 /home/software/hovenweep/contrib/impd/modulefiles/modflow/6.x.x ``` Edit `product_version` in the new module file from `6.5.0.dev0` to `6.x.x` on both systems. From 886e394b331af988a080ea725ccccf7e329d7a8e Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 15 Feb 2024 13:06:44 -0500 Subject: [PATCH 021/199] test(framework): remove setup() method (#1623) * move logic into external model repo tests where used * simplifies framework state management --- autotest/framework.py | 29 ++++++---------------- autotest/test_examples.py | 7 +++++- autotest/test_largetestmodels.py | 25 ++++++++++++++++--- autotest/test_testmodels_mf5to6.py | 39 +++++++++++++++++++++--------- autotest/test_testmodels_mf6.py | 25 ++++++++++++++++--- 5 files changed, 85 insertions(+), 40 deletions(-) diff --git a/autotest/framework.py b/autotest/framework.py index e0828f70d12..62ba2cb2623 100644 --- a/autotest/framework.py +++ b/autotest/framework.py @@ -512,23 +512,6 @@ def _compare_budget_files( # public - def setup(self, src, dst): - print("Setting up MF6 test", self.name) - print(" Source:", src) - print(" Destination:", dst) - self.workspace = dst - - # setup workspace and expected output files - _, self.outp = setup_mf6(src=src, dst=dst) - print("waiting...") - time.sleep(0.5) - - if self.compare == "mf6_regression": - shutil.copytree(self.workspace, self.workspace / self.compare) - else: - self.compare = get_mf6_comparison(src) # detect comparison - setup_mf6_comparison(src, dst, self.compare, overwrite=True) - def run_sim_or_model( self, workspace: Union[str, os.PathLike], @@ -568,9 +551,7 @@ def run_sim_or_model( self.cmp_namefile = ( None if "mf6" in target.name or "libmf6" in target.name - else os.path.basename(nf) - if nf - else None + else os.path.basename(nf) if nf else None ) # run the model @@ -779,14 +760,18 @@ def run(self): # run comparison simulation if libmf6 or mf6 regression if self.compare in ["mf6_regression", "libmf6"]: if self.compare not in self.targets: - warn(f"Couldn't find comparison program '{self.compare}', skipping comparison") + warn( + f"Couldn't find comparison program '{self.compare}', skipping comparison" + ) else: # todo: don't hardcode workspace or assume agreement with test case # simulation workspace, set & access simulation workspaces directly workspace = self.workspace / self.compare success, _ = self.run_sim_or_model( workspace, - self.targets.get(self.compare, self.targets["mf6"]), + self.targets.get( + self.compare, self.targets["mf6"] + ), ) assert success, f"Comparison model failed: {workspace}" diff --git a/autotest/test_examples.py b/autotest/test_examples.py index 5262f6ed7cf..be7b0d8cdc5 100644 --- a/autotest/test_examples.py +++ b/autotest/test_examples.py @@ -1,6 +1,9 @@ +from shutil import copytree + import pytest from framework import TestFramework +from common_regression import setup_mf6 # skip nested models # ex-gwf-csub-p02c has subdirs like 'es-001', 'hb-100' @@ -49,12 +52,14 @@ def test_scenario( for model_path in model_paths: model_name = f"{name}_{model_path.name}" workspace = function_tmpdir / model_name + setup_mf6(src=model_path, dst=workspace) test = TestFramework( name=model_name, - workspace=model_path, + workspace=workspace, targets=targets, compare="mf6_regression", verbose=False, ) + copytree(workspace, workspace / "mf6_regression") test.setup(model_path, workspace) test.run() diff --git a/autotest/test_largetestmodels.py b/autotest/test_largetestmodels.py index 1de7748a062..a694c7d2796 100644 --- a/autotest/test_largetestmodels.py +++ b/autotest/test_largetestmodels.py @@ -1,6 +1,13 @@ +from shutil import copytree + import pytest from framework import TestFramework +from common_regression import ( + setup_mf6, + setup_mf6_comparison, + get_mf6_comparison, +) excluded_models = [] @@ -20,17 +27,29 @@ def test_model( model_path = large_test_model.parent model_name = model_path.name excluded = model_name in excluded_models + compare = get_mf6_comparison(model_path) if original_regression else "mf6_regression" dev_only = "dev" in model_name and "not developmode" in markers if excluded or dev_only: reason = "excluded" if excluded else "developmode only" pytest.skip(f"Skipping: {model_name} ({reason})") + # setup test workspace and framework + setup_mf6(src=model_path, dst=function_tmpdir) test = TestFramework( name=model_name, - workspace=model_path, + workspace=function_tmpdir, targets=targets, - compare="auto" if original_regression else "mf6_regression", + compare=compare, verbose=False, ) - test.setup(model_path, function_tmpdir) + + # setup comparison workspace + if compare == "mf6_regression": + copytree(function_tmpdir, function_tmpdir / compare) + else: + setup_mf6_comparison( + model_path, function_tmpdir, compare, overwrite=True + ) + + # run the test test.run() diff --git a/autotest/test_testmodels_mf5to6.py b/autotest/test_testmodels_mf5to6.py index c9948681c75..328354081b1 100644 --- a/autotest/test_testmodels_mf5to6.py +++ b/autotest/test_testmodels_mf5to6.py @@ -1,10 +1,17 @@ import os from pathlib import Path +from shutil import copytree import flopy import pytest -from common_regression import get_namefiles, setup_model +from common_regression import ( + get_namefiles, + setup_model, + setup_mf6, + setup_mf6_comparison, + get_mf6_comparison, +) from framework import TestFramework excluded_models = ["alt_model", "mf2005"] @@ -56,14 +63,6 @@ def test_model( if model_name in excluded_models: pytest.skip(f"Skipping: {model_name} (excluded)") - test = TestFramework( - name=model_path.name, - workspace=model_path, - targets=targets, - compare="auto" if original_regression else "mf6_regression", - verbose=False, - ) - # run the mf5to6 converter mf5to6_workspace = function_tmpdir / "mf5to6" npth = setup_mf5to6(model_path, mf5to6_workspace) @@ -79,7 +78,25 @@ def test_model( ) assert success - # run mf6 + # setup mf6 workspace and framework mf6_workspace = function_tmpdir / "mf6" - test.setup(mf5to6_workspace, mf6_workspace) + setup_mf6(src=mf5to6_workspace, dst=mf6_workspace) + compare = get_mf6_comparison(mf5to6_workspace) if original_regression else "mf6_regression" + test = TestFramework( + name=model_path.name, + workspace=mf6_workspace, + targets=targets, + compare=compare, + verbose=False, + ) + + # setup comparison workspace + if compare == "mf6_regression": + copytree(mf5to6_workspace, mf6_workspace / compare) + else: + setup_mf6_comparison( + mf5to6_workspace, mf6_workspace, compare, overwrite=True + ) + + # run the test test.run() diff --git a/autotest/test_testmodels_mf6.py b/autotest/test_testmodels_mf6.py index 22382d55b9c..862170df23a 100644 --- a/autotest/test_testmodels_mf6.py +++ b/autotest/test_testmodels_mf6.py @@ -1,6 +1,13 @@ +from shutil import copytree + import pytest from framework import TestFramework +from common_regression import ( + setup_mf6, + setup_mf6_comparison, + get_mf6_comparison, +) excluded_models = [ "alt_model", @@ -26,17 +33,29 @@ def test_model( model_path = test_model_mf6.parent model_name = model_path.name excluded = model_name in excluded_models + compare = get_mf6_comparison(model_path) if original_regression else "mf6_regression" dev_only = "dev" in model_name and "not developmode" in markers if excluded or dev_only: reason = "excluded" if excluded else "developmode only" pytest.skip(f"Skipping: {model_name} ({reason})") + # setup test workspace and framework + setup_mf6(src=model_path, dst=function_tmpdir) test = TestFramework( name=model_name, - workspace=model_path, + workspace=function_tmpdir, targets=targets, - compare="auto" if original_regression else "mf6_regression", + compare=compare, verbose=False, ) - test.setup(model_path, function_tmpdir) + + # setup comparison workspace + if compare == "mf6_regression": + copytree(function_tmpdir, function_tmpdir / compare) + else: + setup_mf6_comparison( + model_path, function_tmpdir, compare, overwrite=True + ) + + # run the test test.run() From 74a6cd88b3306e3c5a9d5199ecfbd14245d66494 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 15 Feb 2024 14:12:42 -0500 Subject: [PATCH 022/199] test(framework): make functions private (rename with leading _) (#1624) * compare_output and run_sim_or_model --- autotest/framework.py | 82 +++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/autotest/framework.py b/autotest/framework.py index 62ba2cb2623..23de078b6ad 100644 --- a/autotest/framework.py +++ b/autotest/framework.py @@ -510,9 +510,44 @@ def _compare_budget_files( fcmp.close() return success - # public + def _compare_output(self, compare): + """ + Compare the main simulation's output with that of another simulation or model. + + compare : str + The comparison executable name: mf6, mf6_regression, libmf6, mf2005, + mfnwt, mflgr, or mfusg. + """ + + if compare not in COMPARE_PROGRAMS: + raise ValueError(f"Unsupported comparison program: {compare}") + + if self.verbose: + print("Comparison test", self.name) + + # adjust htol if < IMS outer_dvclose, and rclose for budget comparisons + htol = adjust_htol(self.workspace, self.htol) + rclose = get_rclose(self.workspace) + cmp_path = self.workspace / compare + if "mf6_regression" in compare: + assert self._compare_heads( + extensions=HDS_EXT, htol=htol + ), "head comparison failed" + assert self._compare_budgets( + extensions=CBC_EXT, rclose=rclose + ), "budget comparison failed" + assert self._compare_concentrations( + htol=htol + ), "concentration comparison failed" + else: + assert self._compare_heads( + cpth=cmp_path, + extensions=HDS_EXT, + mf6="mf6" in compare, + htol=htol, + ), "head comparison failed" - def run_sim_or_model( + def _run_sim_or_model( self, workspace: Union[str, os.PathLike], target: Union[str, os.PathLike], @@ -626,42 +661,7 @@ def run_sim_or_model( return success, buff - def compare_output(self, compare): - """ - Compare the main simulation's output with that of another simulation or model. - - compare : str - The comparison executable name: mf6, mf6_regression, libmf6, mf2005, - mfnwt, mflgr, or mfusg. - """ - - if compare not in COMPARE_PROGRAMS: - raise ValueError(f"Unsupported comparison program: {compare}") - - if self.verbose: - print("Comparison test", self.name) - - # adjust htol if < IMS outer_dvclose, and rclose for budget comparisons - htol = adjust_htol(self.workspace, self.htol) - rclose = get_rclose(self.workspace) - cmp_path = self.workspace / compare - if "mf6_regression" in compare: - assert self._compare_heads( - extensions=HDS_EXT, htol=htol - ), "head comparison failed" - assert self._compare_budgets( - extensions=CBC_EXT, rclose=rclose - ), "budget comparison failed" - assert self._compare_concentrations( - htol=htol - ), "concentration comparison failed" - else: - assert self._compare_heads( - cpth=cmp_path, - extensions=HDS_EXT, - mf6="mf6" in compare, - htol=htol, - ), "head comparison failed" + # public def run(self): """ @@ -719,7 +719,7 @@ def run(self): ) xfail = self.xfail[i] ncpus = self.ncpus[i] - success, buff = self.run_sim_or_model( + success, buff = self._run_sim_or_model( workspace, target, xfail, ncpus ) self.buffs[i] = buff # store model output for assertions later @@ -767,7 +767,7 @@ def run(self): # todo: don't hardcode workspace or assume agreement with test case # simulation workspace, set & access simulation workspaces directly workspace = self.workspace / self.compare - success, _ = self.run_sim_or_model( + success, _ = self._run_sim_or_model( workspace, self.targets.get( self.compare, self.targets["mf6"] @@ -778,7 +778,7 @@ def run(self): # compare model results, if enabled if self.verbose and self.compare in self.targets: print("Comparing outputs") - self.compare_output(self.compare) + self._compare_output(self.compare) # check results, if enabled if self.check: From 9253449d26b17c929fcf7df4ada53fab65965bb3 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 15 Feb 2024 19:56:15 -0500 Subject: [PATCH 023/199] test: remove executables v14 workaround from 7bc29b7 (#1626) * double precision mf2005, mfnwt, mflgr and mfusg are back in exes dist v16 --- autotest/get_exes.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/autotest/get_exes.py b/autotest/get_exes.py index 2345ea4f59c..d5c789ceb11 100644 --- a/autotest/get_exes.py +++ b/autotest/get_exes.py @@ -97,9 +97,7 @@ def rebuild(): def test_get_executables(downloaded_bin_path: Path): print(f"Installing MODFLOW-related executables to: {downloaded_bin_path}") downloaded_bin_path.mkdir(exist_ok=True, parents=True) - # todo: remove release_id workaround when double-precision comparison issues fixed - # https://github.com/MODFLOW-USGS/modflow6/pull/1612 - flopy.utils.get_modflow(str(downloaded_bin_path), release_id="14.0") + flopy.utils.get_modflow(str(downloaded_bin_path)) if __name__ == "__main__": From c05c9a17d0d2c03a0baec3a18bbf87ef71834672 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 16 Feb 2024 15:59:50 -0500 Subject: [PATCH 024/199] test: remove unused test script, fix test_examples.py (#1629) * test_mf6_tmp_simulations.py was unused/skipped, remove it * test_examples.py still had a reference to TestFramework.setup(), neglected in 886e394 --- autotest/test_examples.py | 1 - autotest/test_mf6_tmp_simulations.py | 118 --------------------------- 2 files changed, 119 deletions(-) delete mode 100644 autotest/test_mf6_tmp_simulations.py diff --git a/autotest/test_examples.py b/autotest/test_examples.py index be7b0d8cdc5..4e8c6de357a 100644 --- a/autotest/test_examples.py +++ b/autotest/test_examples.py @@ -61,5 +61,4 @@ def test_scenario( verbose=False, ) copytree(workspace, workspace / "mf6_regression") - test.setup(model_path, workspace) test.run() diff --git a/autotest/test_mf6_tmp_simulations.py b/autotest/test_mf6_tmp_simulations.py deleted file mode 100644 index 693680758d8..00000000000 --- a/autotest/test_mf6_tmp_simulations.py +++ /dev/null @@ -1,118 +0,0 @@ -import os -import sys - -import pytest - -from common_regression import get_mf6_ftypes, get_namefiles -from framework import TestFramework - -exdir = os.path.join("..", "tmp_simulations") -testpaths = os.path.join("..", exdir) - - -def dir_avail(): - avail = os.path.isdir(exdir) - if not avail: - print(f'"{exdir}" does not exist') - print(f"no need to run {os.path.basename(__file__)}") - return avail - - -def get_mf6_models(): - """ - Get a list of test models - """ - - # determine if test directory exists - dirtest = dir_avail() - if not dirtest: - return [] - - # tuple of example files to exclude - exclude = ("test006_03models", "test018_NAC", "test051_uzf1d_a") - - exclude_continuous_integration = ( - "test006_gwf3_transport", - "test006_Gwf1-Lnf1", - ) - - # build list of directories with valid example files - exclude = list(exclude + exclude_continuous_integration) - dirs = [d for d in os.listdir(exdir) if "test" in d and d not in exclude] - # sort in numerical order for case sensitive os - dirs = sorted(dirs, key=lambda v: (v.upper(), v[0].islower())) - - # determine if only a selection of models should be run - select_dirs = None - select_packages = None - for idx, arg in enumerate(sys.argv): - if arg.lower() == "--sim": - if len(sys.argv) > idx + 1: - select_dirs = sys.argv[idx + 1 :] - break - elif arg.lower() == "--pak": - if len(sys.argv) > idx + 1: - select_packages = sys.argv[idx + 1 :] - select_packages = [item.upper() for item in select_packages] - break - - # determine if the selection of model is in the test models to evaluate - if select_dirs is not None: - found_dirs = [] - for d in select_dirs: - if d in dirs: - found_dirs.append(d) - dirs = found_dirs - if len(dirs) < 1: - msg = "Selected models not available in test" - print(msg) - - # determine if the specified package(s) is in the test models to evaluate - if select_packages is not None: - found_dirs = [] - for d in dirs: - pth = os.path.join(exdir, d) - namefiles = get_namefiles(pth) - ftypes = [] - for namefile in namefiles: - ftype = get_mf6_ftypes(namefile, select_packages) - if ftype not in ftypes: - ftypes += ftype - if len(ftypes) > 0: - ftypes = [item.upper() for item in ftypes] - for pak in select_packages: - if pak in ftypes: - found_dirs.append(d) - break - dirs = found_dirs - if len(dirs) < 1: - msg = "Selected packages not available [" - for pak in select_packages: - msg += f" {pak}" - msg += "]" - print(msg) - - return dirs - - -def run_mf6(sim, ws): - """ - Run the MODFLOW 6 simulation and compare to existing head file or - appropriate MODFLOW-2005, MODFLOW-NWT, MODFLOW-USG, or MODFLOW-LGR run. - - """ - src = os.path.join(exdir, sim.name) - dst = os.path.join(ws, sim.name) - sim.setup(src, dst) - sim.run() - sim.compare() - - -@pytest.mark.parametrize("idx, name", enumerate(get_mf6_models())) -def test_mf6model(idx, name, function_tmpdir, targets): - test = TestFramework( - name=name, - workspace=function_tmpdir, - targets=targets, - ) - run_mf6(test, function_tmpdir) From 27d3565a9ec107a50fc7f94712a037cd0c626c52 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Fri, 16 Feb 2024 17:53:07 -0600 Subject: [PATCH 025/199] feat(SWF): Introduce Surface Water Flow (SWF) Model (#1630) * Introduce SWF Model --- autotest/data/beg2022/hecras0125.csv.cmp | 146 + autotest/data/beg2022/hecras035.csv.cmp | 146 + autotest/data/beg2022/mfswr0125.csv.cmp | 6049 +++++++++++++++++ autotest/data/swr04/SWRFlows.csv.cmp | 337 + autotest/data/swr04/SWRSample04_Stage.csv.cmp | 337 + autotest/test_swf_dfw.py | 199 + autotest/test_swf_dfw_beg2022.py | 331 + autotest/test_swf_dfw_bowl.py | 262 + autotest/test_swf_dfw_gwf.py | 283 + autotest/test_swf_dfw_loop.py | 491 ++ autotest/test_swf_dfw_swrt2.py | 237 + autotest/test_swf_dfw_swrt2b.py | 249 + doc/Common/swf-obs.tex | 2 + doc/Common/swf-obstypetable.tex | 83 + doc/Common/swf-swfobs.tex | 1 + doc/mf6io/body.tex | 5 + doc/mf6io/mf6io.bbl | 95 +- doc/mf6io/mf6ivar/dfn/exg-swfgwf.dfn | 118 + doc/mf6io/mf6ivar/dfn/sim-nam.dfn | 2 +- doc/mf6io/mf6ivar/dfn/swf-chd.dfn | 208 + doc/mf6io/mf6ivar/dfn/swf-cxs.dfn | 100 + doc/mf6io/mf6ivar/dfn/swf-dfw.dfn | 136 + doc/mf6io/mf6ivar/dfn/swf-disl.dfn | 229 + doc/mf6io/mf6ivar/dfn/swf-flw.dfn | 207 + doc/mf6io/mf6ivar/dfn/swf-ic.dfn | 11 + doc/mf6io/mf6ivar/dfn/swf-nam.dfn | 99 + doc/mf6io/mf6ivar/dfn/swf-oc.dfn | 345 + doc/mf6io/mf6ivar/dfn/swf-sto.dfn | 49 + doc/mf6io/mf6ivar/dfn/swf-zdg.dfn | 237 + .../mf6ivar/examples/swf-chd-example.dat | 12 + .../mf6ivar/examples/swf-cxs-example.dat | 57 + .../mf6ivar/examples/swf-dfw-example.dat | 16 + .../mf6ivar/examples/swf-disl-example.dat | 33 + .../mf6ivar/examples/swf-flw-example.dat | 12 + doc/mf6io/mf6ivar/examples/swf-ic-example.dat | 4 + .../mf6ivar/examples/swf-nam-example.dat | 14 + doc/mf6io/mf6ivar/examples/swf-oc-example.dat | 12 + .../mf6ivar/examples/swf-sto-example.dat | 12 + .../mf6ivar/examples/swf-zdg-example.dat | 13 + .../mf6ivar/examples/utl-obs-swf-example.dat | 16 + doc/mf6io/mf6ivar/md/mf6ivar.md | 141 + doc/mf6io/mf6ivar/mf6ivar.py | 11 + doc/mf6io/mf6ivar/tex/appendixA.tex | 41 + doc/mf6io/mf6ivar/tex/exg-swfgwf-desc.tex | 33 + .../mf6ivar/tex/exg-swfgwf-dimensions.dat | 3 + .../mf6ivar/tex/exg-swfgwf-exchangedata.dat | 5 + doc/mf6io/mf6ivar/tex/exg-swfgwf-options.dat | 5 + doc/mf6io/mf6ivar/tex/swf-chd-desc.tex | 49 + doc/mf6io/mf6ivar/tex/swf-chd-dimensions.dat | 3 + doc/mf6io/mf6ivar/tex/swf-chd-options.dat | 10 + doc/mf6io/mf6ivar/tex/swf-chd-period.dat | 5 + .../mf6ivar/tex/swf-cxs-crosssectiondata.dat | 5 + doc/mf6io/mf6ivar/tex/swf-cxs-desc.tex | 35 + doc/mf6io/mf6ivar/tex/swf-cxs-dimensions.dat | 4 + doc/mf6io/mf6ivar/tex/swf-cxs-options.dat | 3 + doc/mf6io/mf6ivar/tex/swf-cxs-packagedata.dat | 5 + doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex | 35 + doc/mf6io/mf6ivar/tex/swf-dfw-griddata.dat | 10 + doc/mf6io/mf6ivar/tex/swf-dfw-options.dat | 8 + doc/mf6io/mf6ivar/tex/swf-disl-cell2d.dat | 5 + doc/mf6io/mf6ivar/tex/swf-disl-desc.tex | 65 + doc/mf6io/mf6ivar/tex/swf-disl-dimensions.dat | 4 + doc/mf6io/mf6ivar/tex/swf-disl-griddata.dat | 10 + doc/mf6io/mf6ivar/tex/swf-disl-options.dat | 9 + doc/mf6io/mf6ivar/tex/swf-disl-vertices.dat | 5 + doc/mf6io/mf6ivar/tex/swf-flw-desc.tex | 49 + doc/mf6io/mf6ivar/tex/swf-flw-dimensions.dat | 3 + doc/mf6io/mf6ivar/tex/swf-flw-options.dat | 10 + doc/mf6io/mf6ivar/tex/swf-flw-period.dat | 5 + doc/mf6io/mf6ivar/tex/swf-ic-desc.tex | 9 + doc/mf6io/mf6ivar/tex/swf-ic-griddata.dat | 4 + doc/mf6io/mf6ivar/tex/swf-nam-desc.tex | 29 + doc/mf6io/mf6ivar/tex/swf-nam-options.dat | 7 + doc/mf6io/mf6ivar/tex/swf-nam-packages.dat | 5 + doc/mf6io/mf6ivar/tex/swf-oc-desc.tex | 67 + doc/mf6io/mf6ivar/tex/swf-oc-options.dat | 7 + doc/mf6io/mf6ivar/tex/swf-oc-period.dat | 4 + doc/mf6io/mf6ivar/tex/swf-sto-desc.tex | 19 + doc/mf6io/mf6ivar/tex/swf-sto-options.dat | 3 + doc/mf6io/mf6ivar/tex/swf-sto-period.dat | 4 + doc/mf6io/mf6ivar/tex/swf-zdg-desc.tex | 53 + doc/mf6io/mf6ivar/tex/swf-zdg-dimensions.dat | 3 + doc/mf6io/mf6ivar/tex/swf-zdg-options.dat | 9 + doc/mf6io/mf6ivar/tex/swf-zdg-period.dat | 5 + doc/mf6io/obs/obs-swf.tex | 7 + doc/mf6io/obs/obs.tex | 3 + doc/mf6io/swf/chd.tex | 49 + doc/mf6io/swf/cxs.tex | 19 + doc/mf6io/swf/dfw.tex | 17 + doc/mf6io/swf/disl.tex | 22 + doc/mf6io/swf/flw.tex | 47 + doc/mf6io/swf/ic.tex | 17 + doc/mf6io/swf/namefile.tex | 45 + doc/mf6io/swf/oc.tex | 21 + doc/mf6io/swf/sto.tex | 22 + doc/mf6io/swf/swf-obs.tex | 39 + doc/mf6io/swf/swf.tex | 61 + doc/mf6io/swf/zdg.tex | 47 + make/makefile | 39 +- msvs/mf6core.vfproj | 154 +- src/Exchange/SwfGwfExchange.f90 | 3381 +++++++++ src/Exchange/swfgwfidm.f90 | 259 + src/Model/ModelUtilities/Connections.f90 | 270 + src/Model/ModelUtilities/DislGeom.f90 | 417 ++ .../ModelUtilities/ModelPackageInput.f90 | 7 + src/Model/ModelUtilities/SwfCxsUtils.f90 | 988 +++ src/Model/SurfaceWaterFlow/swf1.f90 | 1380 ++++ src/Model/SurfaceWaterFlow/swf1chd1idm.f90 | 411 ++ src/Model/SurfaceWaterFlow/swf1cxs1.f90 | 620 ++ src/Model/SurfaceWaterFlow/swf1cxs1idm.f90 | 245 + src/Model/SurfaceWaterFlow/swf1dfw1.f90 | 1078 +++ src/Model/SurfaceWaterFlow/swf1dfw1idm.f90 | 307 + src/Model/SurfaceWaterFlow/swf1disl1.f90 | 1164 ++++ src/Model/SurfaceWaterFlow/swf1disl1idm.f90 | 498 ++ src/Model/SurfaceWaterFlow/swf1flw1.f90 | 533 ++ src/Model/SurfaceWaterFlow/swf1flw1idm.f90 | 411 ++ src/Model/SurfaceWaterFlow/swf1ic1.f90 | 224 + src/Model/SurfaceWaterFlow/swf1ic1idm.f90 | 79 + src/Model/SurfaceWaterFlow/swf1idm.f90 | 253 + src/Model/SurfaceWaterFlow/swf1obs1.f90 | 310 + src/Model/SurfaceWaterFlow/swf1oc1.f90 | 101 + src/Model/SurfaceWaterFlow/swf1sto1.f90 | 642 ++ src/Model/SurfaceWaterFlow/swf1zdg1.f90 | 630 ++ src/Model/SurfaceWaterFlow/swf1zdg1idm.f90 | 449 ++ src/SimulationCreate.f90 | 17 + src/Solution/NumericalSolution.f90 | 2 +- src/Utilities/Idm/SourceCommon.f90 | 2 +- src/Utilities/Idm/SourceLoad.F90 | 4 + .../Idm/mf6blockfile/LoadMf6File.f90 | 14 +- src/Utilities/Idm/selector/IdmDfnSelector.f90 | 13 + .../Idm/selector/IdmExgDfnSelector.f90 | 11 + .../Idm/selector/IdmSwfDfnSelector.f90 | 171 + src/meson.build | 23 + utils/idmloader/scripts/dfn2f90.py | 36 + 134 files changed, 27448 insertions(+), 110 deletions(-) create mode 100644 autotest/data/beg2022/hecras0125.csv.cmp create mode 100644 autotest/data/beg2022/hecras035.csv.cmp create mode 100644 autotest/data/beg2022/mfswr0125.csv.cmp create mode 100644 autotest/data/swr04/SWRFlows.csv.cmp create mode 100644 autotest/data/swr04/SWRSample04_Stage.csv.cmp create mode 100644 autotest/test_swf_dfw.py create mode 100644 autotest/test_swf_dfw_beg2022.py create mode 100644 autotest/test_swf_dfw_bowl.py create mode 100644 autotest/test_swf_dfw_gwf.py create mode 100644 autotest/test_swf_dfw_loop.py create mode 100644 autotest/test_swf_dfw_swrt2.py create mode 100644 autotest/test_swf_dfw_swrt2b.py create mode 100644 doc/Common/swf-obs.tex create mode 100644 doc/Common/swf-obstypetable.tex create mode 100644 doc/Common/swf-swfobs.tex create mode 100644 doc/mf6io/mf6ivar/dfn/exg-swfgwf.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/swf-chd.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/swf-cxs.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/swf-dfw.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/swf-disl.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/swf-flw.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/swf-ic.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/swf-nam.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/swf-oc.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/swf-sto.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/swf-zdg.dfn create mode 100644 doc/mf6io/mf6ivar/examples/swf-chd-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/swf-cxs-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/swf-dfw-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/swf-disl-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/swf-flw-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/swf-ic-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/swf-nam-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/swf-oc-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/swf-sto-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/swf-zdg-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/utl-obs-swf-example.dat create mode 100644 doc/mf6io/mf6ivar/tex/exg-swfgwf-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/exg-swfgwf-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/exg-swfgwf-exchangedata.dat create mode 100644 doc/mf6io/mf6ivar/tex/exg-swfgwf-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-chd-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/swf-chd-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-chd-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-chd-period.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-cxs-crosssectiondata.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-cxs-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/swf-cxs-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-cxs-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-cxs-packagedata.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/swf-dfw-griddata.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-dfw-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-disl-cell2d.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-disl-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/swf-disl-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-disl-griddata.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-disl-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-disl-vertices.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-flw-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/swf-flw-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-flw-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-flw-period.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-ic-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/swf-ic-griddata.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-nam-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/swf-nam-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-nam-packages.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-oc-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/swf-oc-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-oc-period.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-sto-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/swf-sto-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-sto-period.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-zdg-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/swf-zdg-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-zdg-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-zdg-period.dat create mode 100644 doc/mf6io/obs/obs-swf.tex create mode 100644 doc/mf6io/swf/chd.tex create mode 100644 doc/mf6io/swf/cxs.tex create mode 100644 doc/mf6io/swf/dfw.tex create mode 100644 doc/mf6io/swf/disl.tex create mode 100644 doc/mf6io/swf/flw.tex create mode 100644 doc/mf6io/swf/ic.tex create mode 100644 doc/mf6io/swf/namefile.tex create mode 100644 doc/mf6io/swf/oc.tex create mode 100644 doc/mf6io/swf/sto.tex create mode 100644 doc/mf6io/swf/swf-obs.tex create mode 100644 doc/mf6io/swf/swf.tex create mode 100644 doc/mf6io/swf/zdg.tex create mode 100644 src/Exchange/SwfGwfExchange.f90 create mode 100644 src/Exchange/swfgwfidm.f90 create mode 100644 src/Model/ModelUtilities/DislGeom.f90 create mode 100644 src/Model/ModelUtilities/SwfCxsUtils.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1chd1idm.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1cxs1.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1cxs1idm.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1dfw1.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1dfw1idm.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1disl1.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1disl1idm.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1flw1.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1flw1idm.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1ic1.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1ic1idm.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1idm.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1obs1.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1oc1.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1sto1.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1zdg1.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf1zdg1idm.f90 create mode 100644 src/Utilities/Idm/selector/IdmSwfDfnSelector.f90 diff --git a/autotest/data/beg2022/hecras0125.csv.cmp b/autotest/data/beg2022/hecras0125.csv.cmp new file mode 100644 index 00000000000..ac3bf0bf9d9 --- /dev/null +++ b/autotest/data/beg2022/hecras0125.csv.cmp @@ -0,0 +1,146 @@ +Ordinate,Time and Date,Stage Elevation (m),Flow Flow (CMS) +0,31Dec1999 2400,4.00,20.04 +1,01Jan2000 0010,4.00,20.03 +2,01Jan2000 0020,4.00,20.02 +3,01Jan2000 0030,4.00,20.01 +4,01Jan2000 0040,4.00,20.00 +5,01Jan2000 0050,4.00,20.00 +6,01Jan2000 0100,4.00,19.99 +7,01Jan2000 0110,4.00,19.99 +8,01Jan2000 0120,4.00,19.99 +9,01Jan2000 0130,4.00,19.99 +10,01Jan2000 0140,4.00,19.99 +11,01Jan2000 0150,4.00,19.99 +12,01Jan2000 0200,4.00,19.99 +13,01Jan2000 0210,4.00,19.99 +14,01Jan2000 0220,4.00,20.00 +15,01Jan2000 0230,4.00,20.00 +16,01Jan2000 0240,4.00,20.00 +17,01Jan2000 0250,4.00,20.03 +18,01Jan2000 0300,4.00,20.27 +19,01Jan2000 0310,4.00,20.85 +20,01Jan2000 0320,4.00,21.60 +21,01Jan2000 0330,4.00,22.39 +22,01Jan2000 0340,4.00,23.21 +23,01Jan2000 0350,4.00,23.98 +24,01Jan2000 0400,4.00,24.30 +25,01Jan2000 0410,4.00,24.04 +26,01Jan2000 0420,4.00,23.50 +27,01Jan2000 0430,4.00,22.86 +28,01Jan2000 0440,4.00,22.14 +29,01Jan2000 0450,4.00,21.38 +30,01Jan2000 0500,4.00,20.78 +31,01Jan2000 0510,4.00,20.46 +32,01Jan2000 0520,4.00,20.26 +33,01Jan2000 0530,4.00,20.10 +34,01Jan2000 0540,4.00,19.96 +35,01Jan2000 0550,4.00,19.85 +36,01Jan2000 0600,4.00,19.76 +37,01Jan2000 0610,4.00,19.71 +38,01Jan2000 0620,4.00,19.69 +39,01Jan2000 0630,4.00,19.70 +40,01Jan2000 0640,4.00,19.73 +41,01Jan2000 0650,4.00,19.77 +42,01Jan2000 0700,4.00,19.82 +43,01Jan2000 0710,4.00,19.87 +44,01Jan2000 0720,4.00,19.91 +45,01Jan2000 0730,4.00,19.94 +46,01Jan2000 0740,4.00,19.97 +47,01Jan2000 0750,4.00,19.99 +48,01Jan2000 0800,4.00,20.00 +49,01Jan2000 0810,4.00,20.01 +50,01Jan2000 0820,4.00,20.02 +51,01Jan2000 0830,4.00,20.02 +52,01Jan2000 0840,4.00,20.03 +53,01Jan2000 0850,4.00,20.03 +54,01Jan2000 0900,4.00,20.02 +55,01Jan2000 0910,4.00,20.02 +56,01Jan2000 0920,4.00,20.02 +57,01Jan2000 0930,4.00,20.01 +58,01Jan2000 0940,4.00,20.01 +59,01Jan2000 0950,4.00,20.01 +60,01Jan2000 1000,4.00,20.00 +61,01Jan2000 1010,4.00,20.00 +62,01Jan2000 1020,4.00,20.00 +63,01Jan2000 1030,4.00,20.00 +64,01Jan2000 1040,4.00,20.00 +65,01Jan2000 1050,4.00,20.00 +66,01Jan2000 1100,4.00,20.00 +67,01Jan2000 1110,4.00,20.00 +68,01Jan2000 1120,4.00,20.00 +69,01Jan2000 1130,4.00,20.00 +70,01Jan2000 1140,4.00,20.00 +71,01Jan2000 1150,4.00,20.00 +72,01Jan2000 1200,4.00,20.00 +73,01Jan2000 1210,4.00,20.00 +74,01Jan2000 1220,4.00,20.00 +75,01Jan2000 1230,4.00,20.00 +76,01Jan2000 1240,4.00,20.00 +77,01Jan2000 1250,4.00,20.00 +78,01Jan2000 1300,4.00,20.00 +79,01Jan2000 1310,4.00,20.00 +80,01Jan2000 1320,4.00,20.00 +81,01Jan2000 1330,4.00,20.00 +82,01Jan2000 1340,4.00,20.00 +83,01Jan2000 1350,4.00,20.00 +84,01Jan2000 1400,4.00,20.00 +85,01Jan2000 1410,4.00,20.00 +86,01Jan2000 1420,4.00,20.00 +87,01Jan2000 1430,4.00,20.00 +88,01Jan2000 1440,4.00,20.00 +89,01Jan2000 1450,4.00,20.00 +90,01Jan2000 1500,4.00,20.00 +91,01Jan2000 1510,4.00,20.00 +92,01Jan2000 1520,4.00,20.00 +93,01Jan2000 1530,4.00,20.00 +94,01Jan2000 1540,4.00,20.00 +95,01Jan2000 1550,4.00,20.00 +96,01Jan2000 1600,4.00,20.00 +97,01Jan2000 1610,4.00,20.00 +98,01Jan2000 1620,4.00,20.00 +99,01Jan2000 1630,4.00,20.00 +100,01Jan2000 1640,4.00,20.00 +101,01Jan2000 1650,4.00,20.00 +102,01Jan2000 1700,4.00,20.00 +103,01Jan2000 1710,4.00,20.00 +104,01Jan2000 1720,4.00,20.00 +105,01Jan2000 1730,4.00,20.00 +106,01Jan2000 1740,4.00,20.00 +107,01Jan2000 1750,4.00,20.00 +108,01Jan2000 1800,4.00,20.00 +109,01Jan2000 1810,4.00,20.00 +110,01Jan2000 1820,4.00,20.00 +111,01Jan2000 1830,4.00,20.00 +112,01Jan2000 1840,4.00,20.00 +113,01Jan2000 1850,4.00,20.00 +114,01Jan2000 1900,4.00,20.00 +115,01Jan2000 1910,4.00,20.00 +116,01Jan2000 1920,4.00,20.00 +117,01Jan2000 1930,4.00,20.00 +118,01Jan2000 1940,4.00,20.00 +119,01Jan2000 1950,4.00,20.00 +120,01Jan2000 2000,4.00,20.00 +121,01Jan2000 2010,4.00,20.00 +122,01Jan2000 2020,4.00,20.00 +123,01Jan2000 2030,4.00,20.00 +124,01Jan2000 2040,4.00,20.00 +125,01Jan2000 2050,4.00,20.00 +126,01Jan2000 2100,4.00,20.00 +127,01Jan2000 2110,4.00,20.00 +128,01Jan2000 2120,4.00,20.00 +129,01Jan2000 2130,4.00,20.00 +130,01Jan2000 2140,4.00,20.00 +131,01Jan2000 2150,4.00,20.00 +132,01Jan2000 2200,4.00,20.00 +133,01Jan2000 2210,4.00,20.00 +134,01Jan2000 2220,4.00,20.00 +135,01Jan2000 2230,4.00,20.00 +136,01Jan2000 2240,4.00,20.00 +137,01Jan2000 2250,4.00,20.00 +138,01Jan2000 2300,4.00,20.00 +139,01Jan2000 2310,4.00,20.00 +140,01Jan2000 2320,4.00,20.00 +141,01Jan2000 2330,4.00,20.00 +142,01Jan2000 2340,4.00,20.00 +143,01Jan2000 2350,4.00,20.00 +144,01Jan2000 2400,4.00,20.00 \ No newline at end of file diff --git a/autotest/data/beg2022/hecras035.csv.cmp b/autotest/data/beg2022/hecras035.csv.cmp new file mode 100644 index 00000000000..50b57c55a84 --- /dev/null +++ b/autotest/data/beg2022/hecras035.csv.cmp @@ -0,0 +1,146 @@ +Ordinate,Time and Date,Stage Elevation (m),Flow Flow (CMS) +0,31Dec1999 2400,4.00,20.01 +1,01Jan2000 0010,4.00,20.01 +2,01Jan2000 0020,4.00,20.01 +3,01Jan2000 0030,4.00,20.01 +4,01Jan2000 0040,4.00,20.01 +5,01Jan2000 0050,4.00,20.01 +6,01Jan2000 0100,4.00,20.01 +7,01Jan2000 0110,4.00,20.01 +8,01Jan2000 0120,4.00,20.01 +9,01Jan2000 0130,4.00,20.01 +10,01Jan2000 0140,4.00,20.01 +11,01Jan2000 0150,4.00,20.01 +12,01Jan2000 0200,4.00,20.01 +13,01Jan2000 0210,4.00,20.01 +14,01Jan2000 0220,4.00,20.01 +15,01Jan2000 0230,4.00,20.01 +16,01Jan2000 0240,4.00,20.00 +17,01Jan2000 0250,4.00,20.01 +18,01Jan2000 0300,4.00,20.02 +19,01Jan2000 0310,4.00,20.06 +20,01Jan2000 0320,4.00,20.13 +21,01Jan2000 0330,4.00,20.24 +22,01Jan2000 0340,4.00,20.38 +23,01Jan2000 0350,4.00,20.56 +24,01Jan2000 0400,4.00,20.75 +25,01Jan2000 0410,4.00,20.93 +26,01Jan2000 0420,4.00,21.08 +27,01Jan2000 0430,4.00,21.18 +28,01Jan2000 0440,4.00,21.24 +29,01Jan2000 0450,4.00,21.26 +30,01Jan2000 0500,4.00,21.24 +31,01Jan2000 0510,4.00,21.20 +32,01Jan2000 0520,4.00,21.15 +33,01Jan2000 0530,4.00,21.10 +34,01Jan2000 0540,4.00,21.04 +35,01Jan2000 0550,4.00,20.99 +36,01Jan2000 0600,4.00,20.93 +37,01Jan2000 0610,4.00,20.88 +38,01Jan2000 0620,4.00,20.83 +39,01Jan2000 0630,4.00,20.78 +40,01Jan2000 0640,4.00,20.73 +41,01Jan2000 0650,4.00,20.69 +42,01Jan2000 0700,4.00,20.65 +43,01Jan2000 0710,4.00,20.61 +44,01Jan2000 0720,4.00,20.57 +45,01Jan2000 0730,4.00,20.54 +46,01Jan2000 0740,4.00,20.50 +47,01Jan2000 0750,4.00,20.47 +48,01Jan2000 0800,4.00,20.45 +49,01Jan2000 0810,4.00,20.42 +50,01Jan2000 0820,4.00,20.39 +51,01Jan2000 0830,4.00,20.37 +52,01Jan2000 0840,4.00,20.35 +53,01Jan2000 0850,4.00,20.33 +54,01Jan2000 0900,4.00,20.31 +55,01Jan2000 0910,4.00,20.29 +56,01Jan2000 0920,4.00,20.27 +57,01Jan2000 0930,4.00,20.25 +58,01Jan2000 0940,4.00,20.24 +59,01Jan2000 0950,4.00,20.22 +60,01Jan2000 1000,4.00,20.21 +61,01Jan2000 1010,4.00,20.20 +62,01Jan2000 1020,4.00,20.18 +63,01Jan2000 1030,4.00,20.17 +64,01Jan2000 1040,4.00,20.16 +65,01Jan2000 1050,4.00,20.15 +66,01Jan2000 1100,4.00,20.14 +67,01Jan2000 1110,4.00,20.14 +68,01Jan2000 1120,4.00,20.13 +69,01Jan2000 1130,4.00,20.12 +70,01Jan2000 1140,4.00,20.11 +71,01Jan2000 1150,4.00,20.11 +72,01Jan2000 1200,4.00,20.10 +73,01Jan2000 1210,4.00,20.09 +74,01Jan2000 1220,4.00,20.09 +75,01Jan2000 1230,4.00,20.08 +76,01Jan2000 1240,4.00,20.08 +77,01Jan2000 1250,4.00,20.07 +78,01Jan2000 1300,4.00,20.07 +79,01Jan2000 1310,4.00,20.06 +80,01Jan2000 1320,4.00,20.06 +81,01Jan2000 1330,4.00,20.06 +82,01Jan2000 1340,4.00,20.05 +83,01Jan2000 1350,4.00,20.05 +84,01Jan2000 1400,4.00,20.05 +85,01Jan2000 1410,4.00,20.04 +86,01Jan2000 1420,4.00,20.04 +87,01Jan2000 1430,4.00,20.04 +88,01Jan2000 1440,4.00,20.04 +89,01Jan2000 1450,4.00,20.03 +90,01Jan2000 1500,4.00,20.03 +91,01Jan2000 1510,4.00,20.03 +92,01Jan2000 1520,4.00,20.03 +93,01Jan2000 1530,4.00,20.03 +94,01Jan2000 1540,4.00,20.02 +95,01Jan2000 1550,4.00,20.02 +96,01Jan2000 1600,4.00,20.02 +97,01Jan2000 1610,4.00,20.02 +98,01Jan2000 1620,4.00,20.02 +99,01Jan2000 1630,4.00,20.02 +100,01Jan2000 1640,4.00,20.02 +101,01Jan2000 1650,4.00,20.02 +102,01Jan2000 1700,4.00,20.01 +103,01Jan2000 1710,4.00,20.01 +104,01Jan2000 1720,4.00,20.01 +105,01Jan2000 1730,4.00,20.01 +106,01Jan2000 1740,4.00,20.01 +107,01Jan2000 1750,4.00,20.01 +108,01Jan2000 1800,4.00,20.01 +109,01Jan2000 1810,4.00,20.01 +110,01Jan2000 1820,4.00,20.01 +111,01Jan2000 1830,4.00,20.01 +112,01Jan2000 1840,4.00,20.01 +113,01Jan2000 1850,4.00,20.01 +114,01Jan2000 1900,4.00,20.01 +115,01Jan2000 1910,4.00,20.01 +116,01Jan2000 1920,4.00,20.01 +117,01Jan2000 1930,4.00,20.01 +118,01Jan2000 1940,4.00,20.01 +119,01Jan2000 1950,4.00,20.01 +120,01Jan2000 2000,4.00,20.00 +121,01Jan2000 2010,4.00,20.00 +122,01Jan2000 2020,4.00,20.00 +123,01Jan2000 2030,4.00,20.00 +124,01Jan2000 2040,4.00,20.00 +125,01Jan2000 2050,4.00,20.00 +126,01Jan2000 2100,4.00,20.00 +127,01Jan2000 2110,4.00,20.00 +128,01Jan2000 2120,4.00,20.00 +129,01Jan2000 2130,4.00,20.00 +130,01Jan2000 2140,4.00,20.00 +131,01Jan2000 2150,4.00,20.00 +132,01Jan2000 2200,4.00,20.00 +133,01Jan2000 2210,4.00,20.00 +134,01Jan2000 2220,4.00,20.00 +135,01Jan2000 2230,4.00,20.00 +136,01Jan2000 2240,4.00,20.00 +137,01Jan2000 2250,4.00,20.00 +138,01Jan2000 2300,4.00,20.00 +139,01Jan2000 2310,4.00,20.00 +140,01Jan2000 2320,4.00,20.00 +141,01Jan2000 2330,4.00,20.00 +142,01Jan2000 2340,4.00,20.00 +143,01Jan2000 2350,4.00,20.00 +144,01Jan2000 2400,4.00,20.00 \ No newline at end of file diff --git a/autotest/data/beg2022/mfswr0125.csv.cmp b/autotest/data/beg2022/mfswr0125.csv.cmp new file mode 100644 index 00000000000..2f8ca33193d --- /dev/null +++ b/autotest/data/beg2022/mfswr0125.csv.cmp @@ -0,0 +1,6049 @@ +TOTTIME,SWRDT,KPER,KSTP,KSWR,RCHGRP,STAGE,QPFLOW,QLATFLOW,QUZFLOW,RAIN,EVAP,QAQFLOW,QNFLOW,QEXTFLOW,QBCFLOW,QCRFLOW,DV,INF-OUT,VOLUME + 0.600E+03, 0.600E+03, 1, 1, 1, 1, 0.44479927E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70238054E-05, 0.26859993E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 2, 0.44084916E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16286216E-04, 0.27609656E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 3, 0.43720671E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13832219E-04, 0.28401405E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 4, 0.43385471E+01, 0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10269427E-04, 0.29237555E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 5, 0.43077500E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000040E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70550751E-05, 0.30112797E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 6, 0.42794826E+01, 0.20000040E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42611422E-05, 0.31024662E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 7, 0.42535529E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19855623E-05, 0.31971289E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 8, 0.42297748E+01, 0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25473703E-06, 0.32950832E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 9, 0.42079703E+01, 0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98405512E-06, 0.33961494E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 10, 0.41879712E+01, 0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000044E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18157836E-05, 0.35001554E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 11, 0.41696204E+01, 0.20000044E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23303309E-05, 0.36069379E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 12, 0.41527719E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000039E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26088695E-05, 0.37163439E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 13, 0.41372912E+01, 0.20000039E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000036E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27186576E-05, 0.38282306E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 14, 0.41230551E+01, 0.20000036E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000034E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27124153E-05, 0.39424664E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 15, 0.41099508E+01, 0.20000034E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000031E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26298599E-05, 0.40589298E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 16, 0.40978760E+01, 0.20000031E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24999953E-05, 0.41775097E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 17, 0.40867376E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22814053E-05, 0.42981044E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 18, 0.40764525E+01, 0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21774579E-05, 0.44209228E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 19, 0.40669459E+01, 0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000022E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20827704E-05, 0.45457878E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 20, 0.40581493E+01, 0.20000022E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19103539E-05, 0.46724738E+05, + 0.600E+03, 0.600E+03, 1, 1, 1, 21, 0.40500000E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.61348025E-06, 0.26859982E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 2, 0.44084907E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18263623E-06, 0.27609644E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17046393E-07, 0.28401393E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91073545E-07, 0.29237543E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14556014E-06, 0.30112786E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17604903E-06, 0.31024652E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18412360E-06, 0.31971280E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17779110E-06, 0.32950824E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16322217E-06, 0.33961488E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14475664E-06, 0.35001549E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12523887E-06, 0.36069375E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10633152E-06, 0.37163435E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 13, 0.41372910E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88992486E-07, 0.38282303E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 14, 0.41230549E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73584967E-07, 0.39424661E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 15, 0.41099507E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60221904E-07, 0.40589296E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 16, 0.40978759E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48811899E-07, 0.41775095E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 17, 0.40867375E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44514376E-07, 0.42981042E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 18, 0.40764524E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37427458E-07, 0.44209227E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 19, 0.40669459E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25542434E-07, 0.45457878E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 20, 0.40581493E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10062946E-05, 0.46724738E+05, + 0.120E+04, 0.600E+03, 1, 2, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.52112733E-06, 0.26859982E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 2, 0.44084907E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20152403E-06, 0.27609644E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38984393E-07, 0.28401393E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.68919093E-07, 0.29237543E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12524873E-06, 0.30112786E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15668130E-06, 0.31024652E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16593547E-06, 0.31971280E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16082982E-06, 0.32950824E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14741904E-06, 0.33961488E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12996606E-06, 0.35001549E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11131491E-06, 0.36069375E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.93090136E-07, 0.37163435E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76302513E-07, 0.38282303E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61301801E-07, 0.39424661E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 15, 0.41099507E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48237382E-07, 0.40589296E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 16, 0.40978759E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37039126E-07, 0.41775095E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 17, 0.40867375E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34000738E-07, 0.42981042E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 18, 0.40764524E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26997032E-07, 0.44209227E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 19, 0.40669459E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14025794E-07, 0.45457878E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 20, 0.40581493E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14716911E-06, 0.46724738E+05, + 0.180E+04, 0.600E+03, 1, 3, 1, 21, 0.40500000E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40329492E-06, 0.26859982E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21205891E-06, 0.27609644E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.53782117E-07, 0.28401393E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53260468E-07, 0.29237543E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11120174E-06, 0.30112786E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14331255E-06, 0.31024652E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15362630E-06, 0.31971280E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14971248E-06, 0.32950824E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13750897E-06, 0.33961488E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12116976E-06, 0.35001549E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10351900E-06, 0.36069375E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86144574E-07, 0.37163435E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70089701E-07, 0.38282303E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55678022E-07, 0.39424661E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 15, 0.41099507E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43122473E-07, 0.40589296E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 16, 0.40978759E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32318383E-07, 0.41775095E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 17, 0.40867375E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30617155E-07, 0.42981042E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 18, 0.40764524E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23812699E-07, 0.44209227E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 19, 0.40669459E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10065669E-07, 0.45457878E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 20, 0.40581493E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13700654E-06, 0.46724738E+05, + 0.240E+04, 0.600E+03, 1, 4, 1, 21, 0.40500000E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28597463E-06, 0.26859982E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30137867E-06, 0.27609644E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14965273E-06, 0.28401393E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42297767E-07, 0.29237543E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20583929E-07, 0.30112786E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56240307E-07, 0.31024652E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70464331E-07, 0.31971280E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70258526E-07, 0.32950824E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61181701E-07, 0.33961488E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47279517E-07, 0.35001549E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31304804E-07, 0.36069375E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14924510E-07, 0.37163435E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.74893691E-09, 0.38282303E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15299719E-07, 0.39424661E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28421812E-07, 0.40589296E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40122309E-07, 0.41775095E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39865768E-07, 0.42981042E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.47693430E-07, 0.44209227E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.65842222E-07, 0.45457878E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.37408296E-06, 0.46724738E+05, + 0.300E+04, 0.600E+03, 1, 5, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.45203616E-06, 0.26859982E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28032821E-06, 0.27609644E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13885407E-06, 0.28401393E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39860240E-07, 0.29237543E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16212717E-07, 0.30112786E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49480303E-07, 0.31024652E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62731587E-07, 0.31971280E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62400893E-07, 0.32950824E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53659516E-07, 0.33961488E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40279513E-07, 0.35001549E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24880013E-07, 0.36069375E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90353183E-08, 0.37163435E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.61919074E-08, 0.38282303E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20390470E-07, 0.39424661E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33233736E-07, 0.40589296E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44754412E-07, 0.41775095E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.46740585E-07, 0.42981042E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.54388906E-07, 0.44209227E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70171787E-07, 0.45457878E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84032880E-07, 0.46724738E+05, + 0.360E+04, 0.600E+03, 1, 6, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11582295E-05, 0.26859982E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 2, 0.44084907E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27507579E-06, 0.27609643E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25871607E-06, 0.28401392E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 4, 0.43385461E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24568726E-06, 0.29237543E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22564621E-06, 0.30112786E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 6, 0.42794817E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22844261E-06, 0.31024652E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23182527E-06, 0.31971280E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23472301E-06, 0.32950824E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 9, 0.42079697E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23699524E-06, 0.33961487E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 10, 0.41879708E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23893449E-06, 0.35001548E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 11, 0.41696200E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24094427E-06, 0.36069374E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 12, 0.41527715E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24334456E-06, 0.37163434E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 13, 0.41372909E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24643073E-06, 0.38282303E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 14, 0.41230548E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25029041E-06, 0.39424661E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 15, 0.41099506E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25505068E-06, 0.40589296E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 16, 0.40978759E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26066567E-06, 0.41775095E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 17, 0.40867375E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24492378E-06, 0.42981042E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 18, 0.40764524E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25185194E-06, 0.44209227E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 19, 0.40669459E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28129300E-06, 0.45457877E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 20, 0.40581493E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57763500E-05, 0.46724738E+05, + 0.420E+04, 0.600E+03, 1, 7, 1, 21, 0.40500000E+01, 0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.85884848E-06, 0.26859982E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 2, 0.44084906E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26312522E-06, 0.27609643E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24639139E-06, 0.28401392E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 4, 0.43385461E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23659465E-06, 0.29237543E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22237539E-06, 0.30112786E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 6, 0.42794817E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22696186E-06, 0.31024652E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23197128E-06, 0.31971280E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 8, 0.42297742E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23635755E-06, 0.32950824E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 9, 0.42079697E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24000354E-06, 0.33961487E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 10, 0.41879708E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24319656E-06, 0.35001548E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 11, 0.41696200E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24635474E-06, 0.36069374E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 12, 0.41527715E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24981430E-06, 0.37163434E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 13, 0.41372909E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25385781E-06, 0.38282303E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 14, 0.41230548E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25858082E-06, 0.39424661E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 15, 0.41099506E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26414973E-06, 0.40589296E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 16, 0.40978759E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27048420E-06, 0.41775095E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 17, 0.40867375E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25761770E-06, 0.42981042E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 18, 0.40764524E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26485380E-06, 0.44209227E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 19, 0.40669459E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29255058E-06, 0.45457877E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 20, 0.40581493E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33860614E-06, 0.46724738E+05, + 0.480E+04, 0.600E+03, 1, 8, 1, 21, 0.40500000E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.88373774E-07, 0.26859982E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78122813E-07, 0.27609644E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.43575671E-07, 0.28401393E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17676179E-07, 0.29237543E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78967943E-09, 0.30112786E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13425502E-07, 0.31024652E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24590346E-07, 0.31971280E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33221365E-07, 0.32950824E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39719655E-07, 0.33961488E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44467509E-07, 0.35001549E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47786287E-07, 0.36069375E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49961706E-07, 0.37163435E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51253902E-07, 0.38282303E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51840509E-07, 0.39424661E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51916832E-07, 0.40589296E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51587683E-07, 0.41775095E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52347023E-07, 0.42981042E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52448311E-07, 0.44209227E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50248346E-07, 0.45457878E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11532426E-06, 0.46724738E+05, + 0.540E+04, 0.600E+03, 1, 9, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97284278E-08, 0.26859982E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.73048739E-07, 0.27609644E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40370111E-07, 0.28401393E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14687149E-07, 0.29237543E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32406184E-08, 0.30112786E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17492951E-07, 0.31024652E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28824875E-07, 0.31971280E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37682305E-07, 0.32950824E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44484192E-07, 0.33961488E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49581292E-07, 0.35001549E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53272402E-07, 0.36069375E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55828981E-07, 0.37163435E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57522506E-07, 0.38282303E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58495164E-07, 0.39424661E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58980351E-07, 0.40589296E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59038996E-07, 0.41775095E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60702209E-07, 0.42981042E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61051143E-07, 0.44209227E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 19, 0.40669459E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58643959E-07, 0.45457878E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 20, 0.40581493E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15392324E-06, 0.46724738E+05, + 0.600E+04, 0.600E+03, 1, 10, 1, 21, 0.40500000E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.47392939E-06, 0.26859983E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38011277E-06, 0.27609644E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 3, 0.43720662E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31446095E-06, 0.28401394E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26876251E-06, 0.29237544E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24218351E-06, 0.30112787E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 6, 0.42794818E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22381607E-06, 0.31024653E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21396995E-06, 0.31971281E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 8, 0.42297743E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21119726E-06, 0.32950825E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 9, 0.42079698E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21428279E-06, 0.33961489E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 10, 0.41879708E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22218214E-06, 0.35001549E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 11, 0.41696201E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23405891E-06, 0.36069375E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 12, 0.41527716E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24918383E-06, 0.37163435E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 13, 0.41372910E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26690309E-06, 0.38282304E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 14, 0.41230549E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28676430E-06, 0.39424662E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 15, 0.41099507E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30829095E-06, 0.40589296E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 16, 0.40978759E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33116967E-06, 0.41775095E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 17, 0.40867375E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34618746E-06, 0.42981043E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 18, 0.40764524E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36780463E-06, 0.44209227E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 19, 0.40669459E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40111491E-06, 0.45457878E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 20, 0.40581493E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16439793E-05, 0.46724738E+05, + 0.660E+04, 0.600E+03, 1, 11, 1, 21, 0.40500000E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.46775438E-06, 0.26859983E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38019510E-06, 0.27609644E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 3, 0.43720662E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31464547E-06, 0.28401394E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26895514E-06, 0.29237544E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24229399E-06, 0.30112787E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 6, 0.42794818E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22393740E-06, 0.31024653E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21409999E-06, 0.31971281E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 8, 0.42297743E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21132623E-06, 0.32950825E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 9, 0.42079698E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21442087E-06, 0.33961489E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 10, 0.41879708E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22232312E-06, 0.35001549E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 11, 0.41696201E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23419770E-06, 0.36069375E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 12, 0.41527716E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24933146E-06, 0.37163435E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 13, 0.41372910E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26705728E-06, 0.38282304E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 14, 0.41230549E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28691841E-06, 0.39424662E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 15, 0.41099507E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30844170E-06, 0.40589296E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 16, 0.40978759E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33132698E-06, 0.41775095E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 17, 0.40867375E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34625797E-06, 0.42981043E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 18, 0.40764524E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36787703E-06, 0.44209227E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 19, 0.40669459E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40127480E-06, 0.45457878E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 20, 0.40581493E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89803633E-06, 0.46724738E+05, + 0.720E+04, 0.600E+03, 1, 12, 1, 21, 0.40500000E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.37424494E-06, 0.26859983E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35277980E-06, 0.27609644E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 3, 0.43720662E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29096253E-06, 0.28401394E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24720670E-06, 0.29237544E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22101761E-06, 0.30112787E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20350054E-06, 0.31024653E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19411682E-06, 0.31971281E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 8, 0.42297742E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19149965E-06, 0.32950825E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 9, 0.42079698E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19453083E-06, 0.33961488E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 10, 0.41879708E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20218727E-06, 0.35001549E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 11, 0.41696201E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21369636E-06, 0.36069375E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 12, 0.41527716E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22834553E-06, 0.37163435E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 13, 0.41372910E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24553524E-06, 0.38282303E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 14, 0.41230549E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26480776E-06, 0.39424662E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 15, 0.41099507E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28570111E-06, 0.40589296E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 16, 0.40978759E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30794868E-06, 0.41775095E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 17, 0.40867375E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32240871E-06, 0.42981043E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 18, 0.40764524E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34360259E-06, 0.44209227E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 19, 0.40669459E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.37620510E-06, 0.45457878E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 20, 0.40581493E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54197350E-06, 0.46724738E+05, + 0.780E+04, 0.600E+03, 1, 13, 1, 21, 0.40500000E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12391351E-05, 0.26859981E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 2, 0.44084906E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77963818E-06, 0.27609643E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 3, 0.43720660E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66604156E-06, 0.28401392E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 4, 0.43385461E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56139843E-06, 0.29237542E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 5, 0.43077490E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46814532E-06, 0.30112785E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 6, 0.42794817E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41918577E-06, 0.31024651E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 7, 0.42535521E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38578569E-06, 0.31971279E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 8, 0.42297741E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36442817E-06, 0.32950823E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 9, 0.42079697E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35233703E-06, 0.33961487E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 10, 0.41879707E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34737177E-06, 0.35001548E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 11, 0.41696200E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34786482E-06, 0.36069374E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 12, 0.41527715E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35253091E-06, 0.37163434E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 13, 0.41372909E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36037423E-06, 0.38282302E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 14, 0.41230548E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37062000E-06, 0.39424661E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 15, 0.41099506E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38268209E-06, 0.40589296E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 16, 0.40978759E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39608057E-06, 0.41775095E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 17, 0.40867375E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37553390E-06, 0.42981042E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 18, 0.40764524E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38802444E-06, 0.44209227E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 19, 0.40669459E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43699351E-06, 0.45457877E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 20, 0.40581493E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.80259335E-06, 0.46724738E+05, + 0.840E+04, 0.600E+03, 1, 14, 1, 21, 0.40500000E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13741338E-05, 0.26859982E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 2, 0.44084907E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.55241932E-06, 0.27609644E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 3, 0.43720661E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.45768145E-06, 0.28401393E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36533593E-06, 0.29237544E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28089060E-06, 0.30112786E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23474931E-06, 0.31024652E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20097508E-06, 0.31971280E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17677442E-06, 0.32950824E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15995684E-06, 0.33961488E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14881595E-06, 0.35001549E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14201596E-06, 0.36069375E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13854189E-06, 0.37163435E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13759903E-06, 0.38282303E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 14, 0.41230549E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13857037E-06, 0.39424661E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 15, 0.41099507E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14098753E-06, 0.40589296E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 16, 0.40978759E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14448718E-06, 0.41775095E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 17, 0.40867375E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12120720E-06, 0.42981043E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 18, 0.40764524E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12468540E-06, 0.44209227E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 19, 0.40669459E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15671828E-06, 0.45457878E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 20, 0.40581493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32162214E-05, 0.46724738E+05, + 0.900E+04, 0.600E+03, 1, 15, 1, 21, 0.40500000E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10240631E-05, 0.26859982E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 2, 0.44084907E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.51115907E-06, 0.27609644E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 3, 0.43720661E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42144609E-06, 0.28401393E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33712654E-06, 0.29237544E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26255319E-06, 0.30112786E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22044209E-06, 0.31024652E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18984039E-06, 0.31971280E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16816280E-06, 0.32950824E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15339065E-06, 0.33961488E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14389821E-06, 0.35001549E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13845534E-06, 0.36069375E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 12, 0.41527716E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13611657E-06, 0.37163435E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 13, 0.41372910E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13610202E-06, 0.38282303E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 14, 0.41230549E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13787387E-06, 0.39424661E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 15, 0.41099507E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14094545E-06, 0.40589296E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 16, 0.40978759E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14501629E-06, 0.41775095E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 17, 0.40867375E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12573316E-06, 0.42981042E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 18, 0.40764524E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12939647E-06, 0.44209227E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 19, 0.40669459E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15825809E-06, 0.45457878E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 20, 0.40581493E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16908670E-05, 0.46724738E+05, + 0.960E+04, 0.600E+03, 1, 16, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81731154E-06, 0.26859982E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 2, 0.44084907E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50519983E-06, 0.27609644E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.41525916E-06, 0.28401393E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33314241E-06, 0.29237544E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26260059E-06, 0.30112786E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22165550E-06, 0.31024652E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19206792E-06, 0.31971280E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17125934E-06, 0.32950824E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15727662E-06, 0.33961488E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14849045E-06, 0.35001549E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 11, 0.41696200E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14368753E-06, 0.36069375E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 12, 0.41527716E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14194076E-06, 0.37163435E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 13, 0.41372910E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14247973E-06, 0.38282303E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 14, 0.41230549E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14475008E-06, 0.39424662E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 15, 0.41099507E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14829757E-06, 0.40589296E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 16, 0.40978759E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15280444E-06, 0.41775095E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 17, 0.40867375E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13574892E-06, 0.42981043E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 18, 0.40764524E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13961203E-06, 0.44209227E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 19, 0.40669459E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16699390E-06, 0.45457878E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 20, 0.40581493E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.71504822E-06, 0.46724738E+05, + 0.102E+05, 0.600E+03, 1, 17, 1, 21, 0.40500000E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77167966E-06, 0.26859982E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 2, 0.44084907E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50244675E-06, 0.27609644E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.41232754E-06, 0.28401393E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33058084E-06, 0.29237544E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26090677E-06, 0.30112786E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22013581E-06, 0.31024653E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19068206E-06, 0.31971280E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16996870E-06, 0.32950825E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15606258E-06, 0.33961488E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14733136E-06, 0.35001549E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 11, 0.41696200E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14257451E-06, 0.36069375E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 12, 0.41527716E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14086623E-06, 0.37163435E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 13, 0.41372910E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14141962E-06, 0.38282303E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 14, 0.41230549E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14372446E-06, 0.39424662E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 15, 0.41099507E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14728595E-06, 0.40589296E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 16, 0.40978759E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15179882E-06, 0.41775095E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 17, 0.40867375E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13540267E-06, 0.42981043E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 18, 0.40764524E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13925458E-06, 0.44209227E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 19, 0.40669459E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16600633E-06, 0.45457878E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 20, 0.40581493E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44345803E-05, 0.46724738E+05, + 0.108E+05, 0.600E+03, 1, 18, 1, 21, 0.40500000E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70344175E-06, 0.26859982E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 2, 0.44084907E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50109078E-06, 0.27609644E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.41136319E-06, 0.28401393E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33074490E-06, 0.29237544E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26258571E-06, 0.30112786E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22243723E-06, 0.31024653E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19352566E-06, 0.31971280E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17330528E-06, 0.32950824E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15984656E-06, 0.33961488E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 10, 0.41879708E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15152578E-06, 0.35001549E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 11, 0.41696200E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14713787E-06, 0.36069375E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 12, 0.41527716E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14577959E-06, 0.37163435E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 13, 0.41372910E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14663807E-06, 0.38282303E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 14, 0.41230549E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14925238E-06, 0.39424662E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 15, 0.41099507E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15308913E-06, 0.40589296E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 16, 0.40978759E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15784470E-06, 0.41775095E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 17, 0.40867375E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14193592E-06, 0.42981043E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 18, 0.40764524E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14589921E-06, 0.44209227E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 19, 0.40669459E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17258471E-06, 0.45457878E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 20, 0.40581493E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.83077790E-06, 0.46724738E+05, + 0.114E+05, 0.600E+03, 1, 19, 1, 21, 0.40500000E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12736878E-06, 0.26859983E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.52501723E-06, 0.27609644E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 3, 0.43720662E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42944569E-06, 0.28401393E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35098224E-06, 0.29237544E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29112628E-06, 0.30112787E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25268951E-06, 0.31024653E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22571861E-06, 0.31971281E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 8, 0.42297742E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20761635E-06, 0.32950825E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 9, 0.42079698E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19639474E-06, 0.33961488E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 10, 0.41879708E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19039605E-06, 0.35001549E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 11, 0.41696201E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18838232E-06, 0.36069375E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 12, 0.41527716E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18940353E-06, 0.37163435E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 13, 0.41372910E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19264455E-06, 0.38282303E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 14, 0.41230549E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19760522E-06, 0.39424662E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 15, 0.41099507E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20374482E-06, 0.40589296E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 16, 0.40978759E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21075983E-06, 0.41775095E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 17, 0.40867375E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20051898E-06, 0.42981043E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 18, 0.40764524E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20588539E-06, 0.44209227E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 19, 0.40669459E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23101184E-06, 0.45457878E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 20, 0.40581493E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17005338E-05, 0.46724738E+05, + 0.120E+05, 0.600E+03, 1, 20, 1, 21, 0.40500000E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16775960E-06, 0.26859982E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.48554678E-06, 0.27609644E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 3, 0.43720662E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39500652E-06, 0.28401393E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32011117E-06, 0.29237544E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26260291E-06, 0.30112787E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22577752E-06, 0.31024653E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 7, 0.42535522E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19981631E-06, 0.31971281E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 8, 0.42297742E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18228042E-06, 0.32950825E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 9, 0.42079698E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17126757E-06, 0.33961488E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 10, 0.41879708E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16522329E-06, 0.35001549E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 11, 0.41696201E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16296300E-06, 0.36069375E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 12, 0.41527716E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16359659E-06, 0.37163435E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 13, 0.41372910E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16633841E-06, 0.38282303E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 14, 0.41230549E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17072913E-06, 0.39424662E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 15, 0.41099507E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17624533E-06, 0.40589296E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 16, 0.40978759E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18259659E-06, 0.41775095E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 17, 0.40867375E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17281094E-06, 0.42981043E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 18, 0.40764524E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17770156E-06, 0.44209227E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 19, 0.40669459E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20111955E-06, 0.45457878E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 20, 0.40581493E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20010053E-05, 0.46724738E+05, + 0.126E+05, 0.600E+03, 1, 21, 1, 21, 0.40500000E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80926881E-07, 0.26859982E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26681950E-06, 0.27609644E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20408558E-06, 0.28401393E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15218828E-06, 0.29237543E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11327503E-06, 0.30112786E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.86703835E-07, 0.31024652E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.67393056E-07, 0.31971280E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.53764623E-07, 0.32950824E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44543309E-07, 0.33961488E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38701138E-07, 0.35001549E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35434102E-07, 0.36069375E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34141177E-07, 0.37163435E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34276823E-07, 0.38282303E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35565360E-07, 0.39424661E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.37619667E-07, 0.40589296E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40263785E-07, 0.41775095E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34848608E-07, 0.42981042E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36708073E-07, 0.44209227E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.48238462E-07, 0.45457878E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.53228749E-06, 0.46724738E+05, + 0.132E+05, 0.600E+03, 1, 22, 1, 21, 0.40500000E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23493759E-06, 0.26859982E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27693661E-06, 0.27609644E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21207113E-06, 0.28401393E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16218118E-06, 0.29237544E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12839591E-06, 0.30112786E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10318946E-06, 0.31024652E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.85265075E-07, 0.31971280E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.73048415E-07, 0.32950824E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.65265485E-07, 0.33961488E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.60855125E-07, 0.35001549E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.59029723E-07, 0.36069375E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.59158769E-07, 0.37163435E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 13, 0.41372910E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.60705734E-07, 0.38282303E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 14, 0.41230549E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.63366315E-07, 0.39424661E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 15, 0.41099507E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.66768646E-07, 0.40589296E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 16, 0.40978759E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70720262E-07, 0.41775095E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 17, 0.40867375E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.68471071E-07, 0.42981042E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 18, 0.40764524E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.71164870E-07, 0.44209227E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 19, 0.40669459E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.81894356E-07, 0.45457878E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 20, 0.40581493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59875361E-06, 0.46724738E+05, + 0.138E+05, 0.600E+03, 1, 23, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.54297271E-07, 0.26859981E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 2, 0.44084906E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25558702E-06, 0.27609643E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 3, 0.43720660E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24849097E-06, 0.28401392E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 4, 0.43385461E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24634345E-06, 0.29237542E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 5, 0.43077490E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24467229E-06, 0.30112785E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 6, 0.42794817E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25149517E-06, 0.31024651E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 7, 0.42535521E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26091530E-06, 0.31971279E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 8, 0.42297741E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27218195E-06, 0.32950823E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 9, 0.42079697E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28482820E-06, 0.33961487E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 10, 0.41879707E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29854419E-06, 0.35001548E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 11, 0.41696200E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31310588E-06, 0.36069374E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 12, 0.41527715E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32834543E-06, 0.37163434E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 13, 0.41372909E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34414894E-06, 0.38282303E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 14, 0.41230548E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36036949E-06, 0.39424661E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 15, 0.41099506E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37696417E-06, 0.40589296E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 16, 0.40978759E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39384986E-06, 0.41775095E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 17, 0.40867375E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39910855E-06, 0.42981042E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 18, 0.40764524E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41508719E-06, 0.44209227E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 19, 0.40669459E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44350480E-06, 0.45457877E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 20, 0.40581493E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24432432E-06, 0.46724738E+05, + 0.144E+05, 0.600E+03, 1, 24, 1, 21, 0.40500000E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26640336E-06, 0.26859983E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15907210E-05, 0.27609644E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 3, 0.43720662E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.95609765E-06, 0.28401393E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 4, 0.43385462E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50458155E-06, 0.29237544E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 5, 0.43077491E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22445187E-06, 0.30112786E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 6, 0.42794818E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34890373E-07, 0.31024653E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 7, 0.42535522E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.94047785E-07, 0.31971280E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 8, 0.42297742E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18008019E-06, 0.32950824E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 9, 0.42079698E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23575042E-06, 0.33961488E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 10, 0.41879708E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26994126E-06, 0.35001549E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 11, 0.41696200E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28902161E-06, 0.36069375E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 12, 0.41527716E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29749452E-06, 0.37163435E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 13, 0.41372910E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29859239E-06, 0.38282303E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29462380E-06, 0.39424661E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28725249E-06, 0.40589296E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27768944E-06, 0.41775095E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27176086E-06, 0.42981042E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26619878E-06, 0.44209227E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25116952E-06, 0.45457878E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54081275E-06, 0.46724738E+05, + 0.150E+05, 0.600E+03, 1, 25, 1, 21, 0.40500000E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61562630E-05, 0.26859981E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 2, 0.44084906E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13619200E-05, 0.27609643E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 3, 0.43720661E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11860770E-05, 0.28401392E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 4, 0.43385461E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.93941562E-06, 0.29237543E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 5, 0.43077491E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.67594931E-06, 0.30112786E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 6, 0.42794818E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.52810014E-06, 0.31024652E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 7, 0.42535522E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40841967E-06, 0.31971280E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 8, 0.42297742E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31325255E-06, 0.32950824E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 9, 0.42079698E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23874283E-06, 0.33961488E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 10, 0.41879708E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18127499E-06, 0.35001549E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13763456E-06, 0.36069375E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10508429E-06, 0.37163435E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.81376712E-07, 0.38282303E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64637206E-07, 0.39424661E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.53352711E-07, 0.40589296E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.46338151E-07, 0.41775095E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23294202E-07, 0.42981042E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25280855E-07, 0.44209227E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39244721E-07, 0.45457878E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.72359514E-05, 0.46724738E+05, + 0.156E+05, 0.600E+03, 1, 26, 1, 21, 0.40500000E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10969641E-05, 0.26859982E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 2, 0.44084907E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13976343E-06, 0.27609643E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 3, 0.43720661E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19608104E-06, 0.28401393E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 4, 0.43385462E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19233361E-06, 0.29237543E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 5, 0.43077491E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15717941E-06, 0.30112786E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12800341E-06, 0.31024652E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.97035372E-07, 0.31971280E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.67894565E-07, 0.32950824E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42323393E-07, 0.33961488E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20974596E-07, 0.35001549E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38673811E-08, 0.36069375E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.93335260E-08, 0.37163435E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19071134E-07, 0.38282303E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25884173E-07, 0.39424661E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30270805E-07, 0.40589296E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32657962E-07, 0.41775095E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46913698E-07, 0.42981042E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48754064E-07, 0.44209227E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35661163E-07, 0.45457878E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24716033E-05, 0.46724738E+05, + 0.162E+05, 0.600E+03, 1, 27, 1, 21, 0.40500000E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56435115E-06, 0.26859982E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 2, 0.44084907E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12648776E-07, 0.27609643E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 3, 0.43720661E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24794829E-07, 0.28401393E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 4, 0.43385462E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40435232E-07, 0.29237543E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 5, 0.43077491E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38812992E-07, 0.30112786E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38986890E-07, 0.31024652E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35743572E-07, 0.31971280E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30732888E-07, 0.32950824E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25095428E-07, 0.33961488E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19519547E-07, 0.35001549E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14428387E-07, 0.36069375E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10030238E-07, 0.37163435E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64107120E-08, 0.38282303E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35315004E-08, 0.39424661E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13545538E-08, 0.40589296E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20174795E-09, 0.41775095E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.89065608E-08, 0.42981042E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10072871E-07, 0.44209227E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32590286E-08, 0.45457878E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72118174E-06, 0.46724738E+05, + 0.168E+05, 0.600E+03, 1, 28, 1, 21, 0.40500000E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39220356E-06, 0.26859982E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22923455E-07, 0.27609643E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37442405E-09, 0.28401393E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11540116E-07, 0.29237543E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12930311E-07, 0.30112786E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16480449E-07, 0.31024652E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17768102E-07, 0.31971280E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17556314E-07, 0.32950824E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16453605E-07, 0.33961488E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14917713E-07, 0.35001549E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13219896E-07, 0.36069375E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11599994E-07, 0.37163435E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10132805E-07, 0.38282303E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.88943395E-08, 0.39424661E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78900584E-08, 0.40589296E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.71227078E-08, 0.41775095E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.52902038E-09, 0.42981042E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.71718631E-10, 0.44209227E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.54073297E-08, 0.45457878E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33397556E-06, 0.46724738E+05, + 0.174E+05, 0.600E+03, 1, 29, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46018327E-06, 0.26859983E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52171853E-06, 0.27609644E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 3, 0.43720662E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15434054E-06, 0.28401394E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 4, 0.43385462E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.54824068E-06, 0.29237544E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 5, 0.43077492E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.72013591E-06, 0.30112787E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 6, 0.42794819E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.77758167E-06, 0.31024653E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 7, 0.42535523E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.76057511E-06, 0.31971281E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 8, 0.42297743E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70282060E-06, 0.32950825E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 9, 0.42079698E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.62878945E-06, 0.33961489E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 10, 0.41879709E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.55417288E-06, 0.35001550E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 11, 0.41696201E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.48629370E-06, 0.36069376E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 12, 0.41527716E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.43149030E-06, 0.37163435E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 13, 0.41372910E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39061882E-06, 0.38282304E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 14, 0.41230549E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36346950E-06, 0.39424662E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 15, 0.41099507E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34945389E-06, 0.40589297E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 16, 0.40978759E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34614078E-06, 0.41775096E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 17, 0.40867375E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32787035E-06, 0.42981043E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 18, 0.40764524E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32492692E-06, 0.44209227E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 19, 0.40669459E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36323117E-06, 0.45457878E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 20, 0.40581493E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18889617E-05, 0.46724738E+05, + 0.180E+05, 0.600E+03, 1, 30, 1, 21, 0.40500000E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27071827E-06, 0.26859983E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51455807E-06, 0.27609644E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 3, 0.43720662E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15736824E-06, 0.28401394E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 4, 0.43385462E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.55076554E-06, 0.29237544E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 5, 0.43077492E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.72488686E-06, 0.30112787E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 6, 0.42794819E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78268037E-06, 0.31024653E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 7, 0.42535523E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.76626537E-06, 0.31971281E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 8, 0.42297743E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70923524E-06, 0.32950825E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 9, 0.42079698E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.63597506E-06, 0.33961489E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 10, 0.41879709E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.56213392E-06, 0.35001550E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 11, 0.41696201E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.49501028E-06, 0.36069376E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 12, 0.41527716E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44091471E-06, 0.37163435E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 13, 0.41372910E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40071118E-06, 0.38282304E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 14, 0.41230549E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.37417849E-06, 0.39424662E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 15, 0.41099507E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36073231E-06, 0.40589297E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 16, 0.40978759E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35794693E-06, 0.41775096E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 17, 0.40867375E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34151001E-06, 0.42981043E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 18, 0.40764524E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33886142E-06, 0.44209227E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 19, 0.40669459E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.37618286E-06, 0.45457878E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 20, 0.40581493E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44298402E-06, 0.46724738E+05, + 0.186E+05, 0.600E+03, 1, 31, 1, 21, 0.40500000E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97532411E-06, 0.26859982E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 2, 0.44084907E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77612432E-06, 0.27609644E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 3, 0.43720661E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90158697E-07, 0.28401393E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 4, 0.43385462E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31231122E-06, 0.29237543E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 5, 0.43077491E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.48988786E-06, 0.30112786E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 6, 0.42794818E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.55474837E-06, 0.31024652E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.54309306E-06, 0.31971280E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.48839567E-06, 0.32950824E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.41512077E-06, 0.33961488E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33915842E-06, 0.35001549E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26811140E-06, 0.36069375E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 12, 0.41527716E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20859288E-06, 0.37163435E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 13, 0.41372910E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16175828E-06, 0.38282303E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 14, 0.41230549E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12763925E-06, 0.39424661E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 15, 0.41099507E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10592587E-06, 0.40589296E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 16, 0.40978759E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.94367756E-07, 0.41775095E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 17, 0.40867375E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.73675722E-07, 0.42981042E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 18, 0.40764524E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64267823E-07, 0.44209227E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 19, 0.40669459E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.88092523E-07, 0.45457878E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 20, 0.40581493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11388789E-05, 0.46724738E+05, + 0.192E+05, 0.600E+03, 1, 32, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70801207E-07, 0.26859981E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 2, 0.44084906E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13886957E-05, 0.27609642E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 3, 0.43720660E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78468918E-06, 0.28401391E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 4, 0.43385461E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38706919E-06, 0.29237542E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 5, 0.43077490E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16789479E-06, 0.30112785E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 6, 0.42794817E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69823390E-07, 0.31024651E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 7, 0.42535521E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46653099E-07, 0.31971279E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 8, 0.42297741E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70233408E-07, 0.32950823E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 9, 0.42079697E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11899646E-06, 0.33961487E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 10, 0.41879707E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17812543E-06, 0.35001548E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 11, 0.41696200E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23962713E-06, 0.36069374E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 12, 0.41527715E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29663441E-06, 0.37163434E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 13, 0.41372909E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34692610E-06, 0.38282302E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 14, 0.41230548E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38947590E-06, 0.39424661E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 15, 0.41099506E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42378993E-06, 0.40589296E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 16, 0.40978759E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45109431E-06, 0.41775095E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 17, 0.40867375E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45664959E-06, 0.42981042E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 18, 0.40764524E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48032771E-06, 0.44209227E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 19, 0.40669459E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50900426E-06, 0.45457877E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 20, 0.40581493E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72318339E-05, 0.46724738E+05, + 0.198E+05, 0.600E+03, 1, 33, 1, 21, 0.40500000E+01, 0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.63249503E-06, 0.26859981E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 2, 0.44084906E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13956668E-05, 0.27609643E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 3, 0.43720661E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79567142E-06, 0.28401392E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 4, 0.43385461E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39503471E-06, 0.29237543E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 5, 0.43077491E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16545131E-06, 0.30112786E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 6, 0.42794817E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67668836E-07, 0.31024652E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 7, 0.42535522E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45452861E-07, 0.31971280E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 8, 0.42297742E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70285260E-07, 0.32950824E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 9, 0.42079698E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12033896E-06, 0.33961488E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 10, 0.41879708E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18063066E-06, 0.35001549E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 11, 0.41696200E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24309687E-06, 0.36069375E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 12, 0.41527716E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30085262E-06, 0.37163435E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 13, 0.41372910E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35163260E-06, 0.38282303E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 14, 0.41230549E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39448404E-06, 0.39424662E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 15, 0.41099507E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42890177E-06, 0.40589296E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 16, 0.40978759E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45614167E-06, 0.41775096E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 17, 0.40867376E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45198252E-06, 0.42981043E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 18, 0.40764525E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47586167E-06, 0.44209228E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 19, 0.40669459E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51362471E-06, 0.45457878E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 20, 0.40581493E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.72133779E-04, 0.46724739E+05, + 0.204E+05, 0.600E+03, 1, 34, 1, 21, 0.40500000E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24129620E-06, 0.26859981E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 2, 0.44084906E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13413731E-05, 0.27609642E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 3, 0.43720660E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74643495E-06, 0.28401391E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 4, 0.43385461E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35673014E-06, 0.29237542E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 5, 0.43077490E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14463932E-06, 0.30112785E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 6, 0.42794817E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49215497E-07, 0.31024651E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 7, 0.42535521E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27505500E-07, 0.31971279E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 8, 0.42297741E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51791051E-07, 0.32950823E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 9, 0.42079697E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10081001E-06, 0.33961487E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 10, 0.41879707E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15993141E-06, 0.35001548E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 11, 0.41696200E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22127245E-06, 0.36069374E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 12, 0.41527715E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27808239E-06, 0.37163434E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 13, 0.41372909E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32812851E-06, 0.38282302E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 14, 0.41230548E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37046203E-06, 0.39424661E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 15, 0.41099506E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40457347E-06, 0.40589296E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 16, 0.40978759E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43167499E-06, 0.41775095E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 17, 0.40867375E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43982091E-06, 0.42981042E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 18, 0.40764524E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46322510E-06, 0.44209227E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 19, 0.40669459E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48908156E-06, 0.45457877E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 20, 0.40581493E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90090880E-05, 0.46724738E+05, + 0.210E+05, 0.600E+03, 1, 35, 1, 21, 0.40500000E+01, 0.19999984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999984E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52098887E-06, 0.26859981E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 2, 0.44084906E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11675903E-05, 0.27609643E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 3, 0.43720660E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60682926E-06, 0.28401392E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 4, 0.43385461E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24359074E-06, 0.29237542E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 5, 0.43077490E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51893686E-07, 0.30112785E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 6, 0.42794817E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34558106E-07, 0.31024651E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 7, 0.42535521E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.51349371E-07, 0.31971279E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 8, 0.42297741E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24791650E-07, 0.32950823E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 9, 0.42079697E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24852433E-07, 0.33961487E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 10, 0.41879707E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.83631996E-07, 0.35001548E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 11, 0.41696200E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14403132E-06, 0.36069374E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 12, 0.41527715E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19963801E-06, 0.37163434E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 13, 0.41372909E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24834380E-06, 0.38282303E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 14, 0.41230548E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28929383E-06, 0.39424661E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 15, 0.41099506E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32206231E-06, 0.40589296E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 16, 0.40978759E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34784509E-06, 0.41775095E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 17, 0.40867375E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36157659E-06, 0.42981042E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 18, 0.40764524E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38375855E-06, 0.44209227E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 19, 0.40669459E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40174183E-06, 0.45457877E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 20, 0.40581493E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46190663E-06, 0.46724738E+05, + 0.216E+05, 0.600E+03, 1, 36, 1, 21, 0.40500000E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34882622E-06, 0.26859981E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 2, 0.44084906E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10923456E-05, 0.27609643E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 3, 0.43720660E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54613571E-06, 0.28401392E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 4, 0.43385461E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19114041E-06, 0.29237542E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 5, 0.43077491E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28244784E-08, 0.30112785E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 6, 0.42794817E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.81217351E-07, 0.31024651E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 7, 0.42535522E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.97126915E-07, 0.31971279E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 8, 0.42297742E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70725413E-07, 0.32950824E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 9, 0.42079697E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21898025E-07, 0.33961487E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 10, 0.41879707E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35643609E-07, 0.35001548E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 11, 0.41696200E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.94546397E-07, 0.36069374E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 12, 0.41527715E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14852829E-06, 0.37163434E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 13, 0.41372909E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19553857E-06, 0.38282303E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 14, 0.41230548E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23477599E-06, 0.39424661E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 15, 0.41099506E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26583477E-06, 0.40589296E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 16, 0.40978759E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28994562E-06, 0.41775095E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 17, 0.40867375E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30305786E-06, 0.42981042E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 18, 0.40764524E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32402284E-06, 0.44209227E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 19, 0.40669459E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33955414E-06, 0.45457877E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 20, 0.40581493E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12542635E-05, 0.46724738E+05, + 0.222E+05, 0.600E+03, 1, 37, 1, 21, 0.40500000E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34591364E-06, 0.26859981E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 2, 0.44084906E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10922996E-05, 0.27609643E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 3, 0.43720660E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54613151E-06, 0.28401392E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 4, 0.43385461E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19114759E-06, 0.29237542E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 5, 0.43077491E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27996272E-08, 0.30112785E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 6, 0.42794817E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.81230475E-07, 0.31024651E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 7, 0.42535522E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.97125945E-07, 0.31971279E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 8, 0.42297742E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70708094E-07, 0.32950824E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 9, 0.42079697E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21867191E-07, 0.33961487E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 10, 0.41879707E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35692167E-07, 0.35001548E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 11, 0.41696200E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.94593887E-07, 0.36069374E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 12, 0.41527715E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14859776E-06, 0.37163434E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 13, 0.41372909E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19560979E-06, 0.38282303E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 14, 0.41230548E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23484879E-06, 0.39424661E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 15, 0.41099506E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26592364E-06, 0.40589296E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 16, 0.40978759E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29003244E-06, 0.41775095E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 17, 0.40867375E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30309769E-06, 0.42981042E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 18, 0.40764524E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32405854E-06, 0.44209227E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 19, 0.40669459E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33965070E-06, 0.45457877E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 20, 0.40581493E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18207078E-05, 0.46724738E+05, + 0.228E+05, 0.600E+03, 1, 38, 1, 21, 0.40500000E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84132239E-06, 0.26859981E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 2, 0.44084906E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10396761E-05, 0.27609642E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 3, 0.43720660E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50484010E-06, 0.28401391E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 4, 0.43385461E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16126105E-06, 0.29237542E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 5, 0.43077490E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14398239E-07, 0.30112785E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 6, 0.42794817E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.96087216E-07, 0.31024651E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 7, 0.42535521E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11165855E-06, 0.31971279E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 8, 0.42297741E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.86079414E-07, 0.32950823E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 9, 0.42079697E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38630077E-07, 0.33961487E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 10, 0.41879707E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17372379E-07, 0.35001548E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 11, 0.41696200E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74741909E-07, 0.36069374E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 12, 0.41527715E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12739187E-06, 0.37163434E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 13, 0.41372909E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17328859E-06, 0.38282302E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 14, 0.41230548E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21162305E-06, 0.39424660E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 15, 0.41099506E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24203004E-06, 0.40589295E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 16, 0.40978758E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26564971E-06, 0.41775094E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 17, 0.40867375E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28592595E-06, 0.42981042E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 18, 0.40764524E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30629350E-06, 0.44209226E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 19, 0.40669458E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31435792E-06, 0.45457877E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 20, 0.40581492E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999949E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46553815E-04, 0.46724737E+05, + 0.234E+05, 0.600E+03, 1, 39, 1, 21, 0.40500000E+01, 0.19999949E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999949E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29049557E-06, 0.26859981E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 2, 0.44084906E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10784596E-05, 0.27609643E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 3, 0.43720660E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53558053E-06, 0.28401392E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 4, 0.43385461E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18235582E-06, 0.29237543E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 5, 0.43077491E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.55429759E-08, 0.30112785E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 6, 0.42794817E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.88946500E-07, 0.31024652E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 7, 0.42535522E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10449211E-06, 0.31971280E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 8, 0.42297742E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.77911039E-07, 0.32950824E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 9, 0.42079697E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29031650E-07, 0.33961487E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 10, 0.41879708E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28484695E-07, 0.35001548E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 11, 0.41696200E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.87284789E-07, 0.36069374E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 12, 0.41527716E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14114900E-06, 0.37163434E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 13, 0.41372909E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18801394E-06, 0.38282303E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 14, 0.41230548E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22707648E-06, 0.39424661E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 15, 0.41099507E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25797571E-06, 0.40589296E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 16, 0.40978759E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28189372E-06, 0.41775095E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 17, 0.40867375E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29446523E-06, 0.42981042E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 18, 0.40764524E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31530765E-06, 0.44209227E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 19, 0.40669459E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33103247E-06, 0.45457878E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 20, 0.40581493E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.81496352E-05, 0.46724738E+05, + 0.240E+05, 0.600E+03, 1, 40, 1, 21, 0.40500000E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 1, 0.44479915E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81477222E-05, 0.26859978E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 2, 0.44084904E+01, 0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.85904373E-06, 0.27609640E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 3, 0.43720658E+01, 0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39533947E-06, 0.28401389E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 4, 0.43385459E+01, 0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17043886E-06, 0.29237540E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 5, 0.43077489E+01, 0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15026407E-06, 0.30112783E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 6, 0.42794816E+01, 0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11072892E-06, 0.31024649E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 7, 0.42535520E+01, 0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12446233E-06, 0.31971277E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 8, 0.42297740E+01, 0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17221346E-06, 0.32950822E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 9, 0.42079696E+01, 0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23850708E-06, 0.33961486E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 10, 0.41879706E+01, 0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999989E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31230345E-06, 0.35001547E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 11, 0.41696199E+01, 0.19999989E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999989E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38739767E-06, 0.36069373E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 12, 0.41527715E+01, 0.19999989E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999988E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45847577E-06, 0.37163433E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 13, 0.41372909E+01, 0.19999988E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999988E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52354492E-06, 0.38282302E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 14, 0.41230548E+01, 0.19999988E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58170222E-06, 0.39424660E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 15, 0.41099506E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63249085E-06, 0.40589295E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 16, 0.40978758E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67668544E-06, 0.41775095E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 17, 0.40867375E+01, 0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77020228E-06, 0.42981042E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 18, 0.40764524E+01, 0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80102849E-06, 0.44209227E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 19, 0.40669459E+01, 0.19999984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77494158E-06, 0.45457878E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 20, 0.40581493E+01, 0.19999984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30048649E-04, 0.46724738E+05, + 0.246E+05, 0.600E+03, 1, 41, 1, 21, 0.40500000E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 1, 0.44479913E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999988E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12153380E-04, 0.26859976E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 2, 0.44084902E+01, 0.19999988E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66642764E-06, 0.27609638E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 3, 0.43720657E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19723662E-06, 0.28401388E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 4, 0.43385458E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11626675E-07, 0.29237538E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 5, 0.43077487E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67883668E-07, 0.30112781E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 6, 0.42794814E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44989800E-07, 0.31024648E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 7, 0.42535519E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.71014227E-07, 0.31971276E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 8, 0.42297739E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12818584E-06, 0.32950820E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 9, 0.42079695E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20212112E-06, 0.33961484E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 10, 0.41879705E+01, 0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28252095E-06, 0.35001546E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 11, 0.41696198E+01, 0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36353682E-06, 0.36069372E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 12, 0.41527714E+01, 0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44020243E-06, 0.37163432E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 13, 0.41372908E+01, 0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51060777E-06, 0.38282301E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 14, 0.41230547E+01, 0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57394976E-06, 0.39424659E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 15, 0.41099505E+01, 0.19999984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62977650E-06, 0.40589294E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 16, 0.40978758E+01, 0.19999984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999983E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67886449E-06, 0.41775094E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 17, 0.40867374E+01, 0.19999983E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999982E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.82115813E-06, 0.42981041E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 18, 0.40764523E+01, 0.19999982E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999981E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.85337171E-06, 0.44209226E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 19, 0.40669458E+01, 0.19999981E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999981E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78778138E-06, 0.45457877E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 20, 0.40581492E+01, 0.19999981E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999934E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46598274E-04, 0.46724737E+05, + 0.252E+05, 0.600E+03, 1, 42, 1, 21, 0.40500000E+01, 0.19999934E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999934E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 1, 0.44479913E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12796693E-04, 0.26859976E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 2, 0.44084903E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52372616E-06, 0.27609638E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 3, 0.43720657E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69404987E-07, 0.28401388E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 4, 0.43385458E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.97287728E-07, 0.29237539E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 5, 0.43077488E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19565359E-07, 0.30112782E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 6, 0.42794815E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34155910E-07, 0.31024648E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 7, 0.42535519E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23721469E-08, 0.31971276E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 8, 0.42297739E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58740380E-07, 0.32950821E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 9, 0.42079695E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13534885E-06, 0.33961485E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 10, 0.41879706E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21755455E-06, 0.35001546E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 11, 0.41696198E+01, 0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29973702E-06, 0.36069372E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 12, 0.41527714E+01, 0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37715920E-06, 0.37163432E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 13, 0.41372908E+01, 0.19999986E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44802020E-06, 0.38282301E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 14, 0.41230547E+01, 0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51160622E-06, 0.39424660E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 15, 0.41099506E+01, 0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56753352E-06, 0.40589295E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 16, 0.40978758E+01, 0.19999984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61659041E-06, 0.41775094E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 17, 0.40867374E+01, 0.19999984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999983E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76826002E-06, 0.42981041E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 18, 0.40764524E+01, 0.19999983E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999982E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80005528E-06, 0.44209226E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 19, 0.40669459E+01, 0.19999982E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999981E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72487834E-06, 0.45457877E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 20, 0.40581493E+01, 0.19999981E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999970E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11303264E-04, 0.46724737E+05, + 0.258E+05, 0.600E+03, 1, 43, 1, 21, 0.40500000E+01, 0.19999970E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999970E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42399956E-05, 0.26859982E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 2, 0.44084907E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11604841E-05, 0.27609643E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 3, 0.43720661E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10800889E-05, 0.28401392E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 4, 0.43385461E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.92552112E-06, 0.29237543E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75659860E-06, 0.30112786E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 6, 0.42794817E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65584577E-06, 0.31024652E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56936263E-06, 0.31971280E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 8, 0.42297742E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49690491E-06, 0.32950824E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 9, 0.42079697E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43702233E-06, 0.33961487E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 10, 0.41879708E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38779442E-06, 0.35001548E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 11, 0.41696200E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34726184E-06, 0.36069374E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 12, 0.41527716E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31366040E-06, 0.37163434E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 13, 0.41372909E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28547733E-06, 0.38282303E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 14, 0.41230548E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26155972E-06, 0.39424661E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 15, 0.41099507E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24092132E-06, 0.40589296E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 16, 0.40978759E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22287908E-06, 0.41775095E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 17, 0.40867375E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21040083E-06, 0.42981042E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 18, 0.40764524E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20363019E-06, 0.44209227E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 19, 0.40669459E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19001904E-06, 0.45457878E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 20, 0.40581493E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21095236E-04, 0.46724738E+05, + 0.264E+05, 0.600E+03, 1, 44, 1, 21, 0.40500000E+01, 0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49446364E-06, 0.26859980E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 2, 0.44084906E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69924114E-06, 0.27609642E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 3, 0.43720660E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65085989E-06, 0.28401391E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 4, 0.43385460E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58327173E-06, 0.29237542E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 5, 0.43077490E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53424208E-06, 0.30112785E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 6, 0.42794817E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48142256E-06, 0.31024651E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 7, 0.42535521E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43451439E-06, 0.31971279E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 8, 0.42297741E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39482282E-06, 0.32950823E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 9, 0.42079697E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36222652E-06, 0.33961487E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 10, 0.41879707E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33592466E-06, 0.35001548E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 11, 0.41696199E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31485146E-06, 0.36069374E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 12, 0.41527715E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29799279E-06, 0.37163434E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 13, 0.41372909E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28434326E-06, 0.38282302E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 14, 0.41230548E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27321505E-06, 0.39424661E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 15, 0.41099506E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26394792E-06, 0.40589296E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 16, 0.40978759E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25608708E-06, 0.41775095E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 17, 0.40867375E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29055118E-06, 0.42981042E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 18, 0.40764524E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28795730E-06, 0.44209227E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 19, 0.40669459E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24387981E-06, 0.45457877E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 20, 0.40581493E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60565750E-06, 0.46724738E+05, + 0.270E+05, 0.600E+03, 1, 45, 1, 21, 0.40500000E+01, 0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41869290E-05, 0.26859980E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 2, 0.44084906E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31536799E-06, 0.27609642E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 3, 0.43720660E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25561083E-06, 0.28401392E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 4, 0.43385461E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15548438E-06, 0.29237542E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 5, 0.43077490E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31939038E-07, 0.30112785E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 6, 0.42794817E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24108243E-07, 0.31024651E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 7, 0.42535521E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69310286E-07, 0.31971279E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 8, 0.42297741E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10592591E-06, 0.32950823E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 9, 0.42079697E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13586548E-06, 0.33961487E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 10, 0.41879707E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16066215E-06, 0.35001548E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 11, 0.41696200E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18154012E-06, 0.36069374E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 12, 0.41527715E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19941791E-06, 0.37163434E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 13, 0.41372909E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21501778E-06, 0.38282303E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 14, 0.41230548E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22885541E-06, 0.39424661E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 15, 0.41099506E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24134012E-06, 0.40589296E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 16, 0.40978759E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25276958E-06, 0.41775095E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 17, 0.40867375E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30359028E-06, 0.42981042E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 18, 0.40764524E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31109854E-06, 0.44209227E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 19, 0.40669459E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28070571E-06, 0.45457878E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 20, 0.40581493E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22680948E-04, 0.46724738E+05, + 0.276E+05, 0.600E+03, 1, 46, 1, 21, 0.40500000E+01, 0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11789926E-05, 0.26859982E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 2, 0.44084907E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55469933E-06, 0.27609643E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44246008E-06, 0.28401392E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 4, 0.43385461E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33961362E-06, 0.29237543E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25896238E-06, 0.30112786E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 6, 0.42794817E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20961711E-06, 0.31024652E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 7, 0.42535522E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17169567E-06, 0.31971280E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 8, 0.42297742E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14229119E-06, 0.32950824E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 9, 0.42079697E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11927179E-06, 0.33961488E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 10, 0.41879708E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10106690E-06, 0.35001548E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 11, 0.41696200E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86497696E-07, 0.36069375E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 12, 0.41527716E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74714702E-07, 0.37163434E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 13, 0.41372909E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65084564E-07, 0.38282303E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 14, 0.41230548E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57117305E-07, 0.39424661E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 15, 0.41099507E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50471673E-07, 0.40589296E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 16, 0.40978759E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44865182E-07, 0.41775095E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 17, 0.40867375E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43780140E-07, 0.42981042E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 18, 0.40764524E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41945675E-07, 0.44209227E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 19, 0.40669459E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35996912E-07, 0.45457877E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 20, 0.40581493E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70027536E-05, 0.46724738E+05, + 0.282E+05, 0.600E+03, 1, 47, 1, 21, 0.40500000E+01, 0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39204413E-06, 0.26859982E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 2, 0.44084906E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44467596E-06, 0.27609643E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35023561E-06, 0.28401392E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 4, 0.43385461E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26981342E-06, 0.29237543E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 5, 0.43077491E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21346667E-06, 0.30112786E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 6, 0.42794817E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17473186E-06, 0.31024652E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 7, 0.42535522E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14503454E-06, 0.31971280E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 8, 0.42297742E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12210866E-06, 0.32950824E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 9, 0.42079697E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10429467E-06, 0.33961488E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 10, 0.41879708E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90315570E-07, 0.35001548E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 11, 0.41696200E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79259820E-07, 0.36069375E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 12, 0.41527716E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70413929E-07, 0.37163434E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 13, 0.41372909E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63296437E-07, 0.38282303E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 14, 0.41230548E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57479063E-07, 0.39424661E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 15, 0.41099507E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52727806E-07, 0.40589296E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 16, 0.40978759E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48769984E-07, 0.41775095E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 17, 0.40867375E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55241021E-07, 0.42981042E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 18, 0.40764524E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54009728E-07, 0.44209227E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 19, 0.40669459E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43038664E-07, 0.45457878E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 20, 0.40581493E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24835493E-06, 0.46724738E+05, + 0.288E+05, 0.600E+03, 1, 48, 1, 21, 0.40500000E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.49425498E-06, 0.26859982E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26720869E-06, 0.27609644E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19996827E-06, 0.28401393E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13901935E-06, 0.29237543E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.95126179E-07, 0.30112786E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64164567E-07, 0.31024652E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39125819E-07, 0.31971280E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18518897E-07, 0.32950824E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12852688E-08, 0.33961488E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13407021E-07, 0.35001549E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26150410E-07, 0.36069375E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.37372988E-07, 0.37163435E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.47410641E-07, 0.38282303E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.56481845E-07, 0.39424661E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64776177E-07, 0.40589296E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.72420750E-07, 0.41775095E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.66384654E-07, 0.42981042E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70739443E-07, 0.44209227E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.88678647E-07, 0.45457878E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34433839E-06, 0.46724738E+05, + 0.294E+05, 0.600E+03, 1, 49, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23336387E-05, 0.26859984E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 2, 0.44084909E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12206926E-05, 0.27609646E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 3, 0.43720663E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12794105E-05, 0.28401395E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 4, 0.43385464E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12551839E-05, 0.29237546E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 5, 0.43077493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11743592E-05, 0.30112789E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 6, 0.42794820E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11451817E-05, 0.31024655E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 7, 0.42535524E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11244885E-05, 0.31971283E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 8, 0.42297744E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11149782E-05, 0.32950827E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 9, 0.42079699E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11175670E-05, 0.33961490E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 10, 0.41879710E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11321978E-05, 0.35001551E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 11, 0.41696202E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11582040E-05, 0.36069377E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 12, 0.41527717E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11946707E-05, 0.37163437E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 13, 0.41372911E+01, 0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12405791E-05, 0.38282305E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 14, 0.41230550E+01, 0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12948740E-05, 0.39424663E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 15, 0.41099508E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13565772E-05, 0.40589297E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 16, 0.40978760E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14247799E-05, 0.41775096E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 17, 0.40867376E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14237931E-05, 0.42981043E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 18, 0.40764525E+01, 0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000019E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14967611E-05, 0.44209228E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 19, 0.40669459E+01, 0.20000019E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16505907E-05, 0.45457878E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 20, 0.40581493E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000027E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.65056733E-05, 0.46724738E+05, + 0.300E+05, 0.600E+03, 1, 50, 1, 21, 0.40500000E+01, 0.20000027E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000027E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24966933E-05, 0.26859983E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 2, 0.44084908E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10003391E-05, 0.27609645E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 3, 0.43720663E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10817134E-05, 0.28401395E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10749524E-05, 0.29237545E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 5, 0.43077493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10068912E-05, 0.30112788E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.98616499E-06, 0.31024654E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 7, 0.42535524E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.97097443E-06, 0.31971282E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 8, 0.42297744E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.96461923E-06, 0.32950826E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 9, 0.42079699E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.96849684E-06, 0.33961490E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 10, 0.41879709E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.98294986E-06, 0.35001551E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 11, 0.41696202E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10076392E-05, 0.36069377E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 12, 0.41527717E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10419167E-05, 0.37163436E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 13, 0.41372911E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10849688E-05, 0.38282305E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 14, 0.41230550E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11359194E-05, 0.39424663E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 15, 0.41099508E+01, 0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11938959E-05, 0.40589297E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 16, 0.40978760E+01, 0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12581353E-05, 0.41775096E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 17, 0.40867376E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12595274E-05, 0.42981043E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 18, 0.40764525E+01, 0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13294393E-05, 0.44209228E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 19, 0.40669459E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14728816E-05, 0.45457878E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 20, 0.40581493E+01, 0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000025E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78171985E-05, 0.46724738E+05, + 0.306E+05, 0.600E+03, 1, 51, 1, 21, 0.40500000E+01, 0.20000025E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000025E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23918417E-05, 0.26859983E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 2, 0.44084908E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10137464E-05, 0.27609645E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 3, 0.43720662E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10955456E-05, 0.28401395E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10905589E-05, 0.29237545E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 5, 0.43077493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10244676E-05, 0.30112788E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10049580E-05, 0.31024654E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 7, 0.42535524E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.99103126E-06, 0.31971282E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 8, 0.42297743E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.98595572E-06, 0.32950826E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 9, 0.42079699E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.99113921E-06, 0.33961490E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 10, 0.41879709E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10068617E-05, 0.35001550E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 11, 0.41696201E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10328008E-05, 0.36069376E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 12, 0.41527717E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10683029E-05, 0.37163436E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 13, 0.41372911E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11125270E-05, 0.38282304E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 14, 0.41230549E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11646147E-05, 0.39424662E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 15, 0.41099507E+01, 0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12236573E-05, 0.40589297E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 16, 0.40978760E+01, 0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12889562E-05, 0.41775096E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 17, 0.40867376E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12899302E-05, 0.42981043E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 18, 0.40764524E+01, 0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13604588E-05, 0.44209227E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 19, 0.40669459E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15060302E-05, 0.45457878E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 20, 0.40581493E+01, 0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21199150E-04, 0.46724738E+05, + 0.312E+05, 0.600E+03, 1, 52, 1, 21, 0.40500000E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15482026E-05, 0.26859984E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 2, 0.44084908E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.86519951E-06, 0.27609646E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 3, 0.43720663E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.94923173E-06, 0.28401395E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.95738416E-06, 0.29237545E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 5, 0.43077493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.91333050E-06, 0.30112788E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 6, 0.42794820E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.90105142E-06, 0.31024654E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 7, 0.42535524E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89262672E-06, 0.31971282E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 8, 0.42297744E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89162187E-06, 0.32950826E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 9, 0.42079699E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89968374E-06, 0.33961490E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 10, 0.41879709E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.91733840E-06, 0.35001551E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 11, 0.41696202E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.94440348E-06, 0.36069377E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 12, 0.41527717E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.98042749E-06, 0.37163437E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 13, 0.41372911E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10246353E-05, 0.38282305E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 14, 0.41230550E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10763099E-05, 0.39424663E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 15, 0.41099508E+01, 0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11346097E-05, 0.40589297E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 16, 0.40978760E+01, 0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11988989E-05, 0.41775096E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 17, 0.40867376E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12128963E-05, 0.42981043E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 18, 0.40764525E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12821239E-05, 0.44209228E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 19, 0.40669459E+01, 0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14122779E-05, 0.45457878E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 20, 0.40581493E+01, 0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28556633E-04, 0.46724738E+05, + 0.318E+05, 0.600E+03, 1, 53, 1, 21, 0.40500000E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17376500E-05, 0.26859983E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 2, 0.44084908E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.86288637E-06, 0.27609645E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 3, 0.43720662E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.95357592E-06, 0.28401394E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.96510035E-06, 0.29237545E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 5, 0.43077493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.92039565E-06, 0.30112788E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.91001950E-06, 0.31024654E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 7, 0.42535523E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.90325768E-06, 0.31971282E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 8, 0.42297743E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.90370454E-06, 0.32950826E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 9, 0.42079699E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.91304396E-06, 0.33961490E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 10, 0.41879709E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.93182364E-06, 0.35001550E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 11, 0.41696201E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.95989955E-06, 0.36069376E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 12, 0.41527717E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.99681668E-06, 0.37163436E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 13, 0.41372910E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10418234E-05, 0.38282304E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 14, 0.41230549E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10942294E-05, 0.39424662E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 15, 0.41099507E+01, 0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11531738E-05, 0.40589297E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 16, 0.40978759E+01, 0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12180800E-05, 0.41775096E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 17, 0.40867376E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12281301E-05, 0.42981043E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 18, 0.40764524E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12977881E-05, 0.44209227E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 19, 0.40669459E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14327052E-05, 0.45457878E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 20, 0.40581493E+01, 0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26063549E-04, 0.46724738E+05, + 0.324E+05, 0.600E+03, 1, 54, 1, 21, 0.40500000E+01, 0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.87800004E-06, 0.26859984E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 2, 0.44084908E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78574434E-06, 0.27609646E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 3, 0.43720663E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.87252896E-06, 0.28401395E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 4, 0.43385463E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89204162E-06, 0.29237545E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 5, 0.43077493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.86492790E-06, 0.30112788E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 6, 0.42794819E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.85921199E-06, 0.31024654E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 7, 0.42535524E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.85626573E-06, 0.31971282E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 8, 0.42297744E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.85980725E-06, 0.32950826E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 9, 0.42079699E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.87161125E-06, 0.33961490E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 10, 0.41879709E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89233193E-06, 0.35001551E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 11, 0.41696202E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.92189421E-06, 0.36069377E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 12, 0.41527717E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.95992387E-06, 0.37163436E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 13, 0.41372911E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10057211E-05, 0.38282305E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 14, 0.41230550E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10586538E-05, 0.39424663E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 15, 0.41099508E+01, 0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11178924E-05, 0.40589297E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 16, 0.40978760E+01, 0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11828903E-05, 0.41775096E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 17, 0.40867376E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12041392E-05, 0.42981043E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 18, 0.40764525E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12732530E-05, 0.44209228E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 19, 0.40669459E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13968024E-05, 0.45457878E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 20, 0.40581493E+01, 0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11689468E-04, 0.46724738E+05, + 0.330E+05, 0.600E+03, 1, 55, 1, 21, 0.40500000E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88253572E-06, 0.26859983E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 2, 0.44084908E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.72493442E-06, 0.27609645E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 3, 0.43720662E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.81968406E-06, 0.28401395E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 4, 0.43385463E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.84618828E-06, 0.29237545E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 5, 0.43077493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.82433764E-06, 0.30112788E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.82239437E-06, 0.31024654E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 7, 0.42535523E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.82232038E-06, 0.31971282E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 8, 0.42297743E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.82801448E-06, 0.32950826E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 9, 0.42079699E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.84137920E-06, 0.33961490E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 10, 0.41879709E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.86317598E-06, 0.35001550E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 11, 0.41696201E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89342713E-06, 0.36069376E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 12, 0.41527717E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.93184599E-06, 0.37163436E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 13, 0.41372911E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.97777161E-06, 0.38282304E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 14, 0.41230549E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10306369E-05, 0.39424662E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 15, 0.41099507E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10896561E-05, 0.40589297E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 16, 0.40978760E+01, 0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11543103E-05, 0.41775096E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 17, 0.40867376E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11757114E-05, 0.42981043E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 18, 0.40764525E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12444529E-05, 0.44209227E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 19, 0.40669459E+01, 0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13668718E-05, 0.45457878E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 20, 0.40581493E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14478950E-04, 0.46724738E+05, + 0.336E+05, 0.600E+03, 1, 56, 1, 21, 0.40500000E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16436747E-05, 0.26859981E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 2, 0.44084906E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81913996E-07, 0.27609643E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 3, 0.43720661E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21931641E-07, 0.28401392E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 4, 0.43385461E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.87474952E-07, 0.29237543E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 5, 0.43077491E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11419699E-06, 0.30112786E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 6, 0.42794818E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14931000E-06, 0.31024652E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 7, 0.42535522E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17402644E-06, 0.31971280E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 8, 0.42297742E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19058835E-06, 0.32950824E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 9, 0.42079698E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20096759E-06, 0.33961488E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 10, 0.41879708E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20676386E-06, 0.35001549E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 11, 0.41696200E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20921558E-06, 0.36069375E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20929303E-06, 0.37163435E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20768429E-06, 0.38282303E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20493121E-06, 0.39424661E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20138884E-06, 0.40589296E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19734485E-06, 0.41775095E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19342474E-06, 0.42981042E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19427148E-06, 0.44209227E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19035122E-06, 0.45457878E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24028513E-06, 0.46724738E+05, + 0.342E+05, 0.600E+03, 1, 57, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11933566E-05, 0.26859982E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 2, 0.44084907E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86156806E-07, 0.27609643E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 3, 0.43720661E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11603859E-07, 0.28401393E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 4, 0.43385462E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78003715E-07, 0.29237543E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 5, 0.43077491E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11098749E-06, 0.30112786E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 6, 0.42794818E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14702881E-06, 0.31024652E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 7, 0.42535522E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17291017E-06, 0.31971280E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 8, 0.42297742E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19077416E-06, 0.32950824E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 9, 0.42079698E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20252152E-06, 0.33961488E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20970691E-06, 0.35001549E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21354114E-06, 0.36069375E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21497172E-06, 0.37163435E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21465053E-06, 0.38282303E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21315150E-06, 0.39424661E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21078952E-06, 0.40589296E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20787938E-06, 0.41775095E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20833069E-06, 0.42981043E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20967791E-06, 0.44209227E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 19, 0.40669459E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20339797E-06, 0.45457878E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 20, 0.40581493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.82048020E-05, 0.46724738E+05, + 0.348E+05, 0.600E+03, 1, 58, 1, 21, 0.40500000E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10581756E-05, 0.26859982E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 2, 0.44084907E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98194459E-07, 0.27609643E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 3, 0.43720661E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51676352E-09, 0.28401393E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 4, 0.43385462E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.67751920E-07, 0.29237543E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 5, 0.43077491E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10373325E-06, 0.30112786E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 6, 0.42794818E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14097221E-06, 0.31024652E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 7, 0.42535522E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16797041E-06, 0.31971280E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 8, 0.42297742E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18684981E-06, 0.32950824E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19952046E-06, 0.33961488E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20752544E-06, 0.35001549E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21210634E-06, 0.36069375E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21419461E-06, 0.37163435E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21445063E-06, 0.38282303E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21348669E-06, 0.39424661E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21157710E-06, 0.40589296E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20909460E-06, 0.41775095E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21058176E-06, 0.42981042E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21210388E-06, 0.44209227E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 19, 0.40669459E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20541659E-06, 0.45457878E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 20, 0.40581493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31435214E-07, 0.46724738E+05, + 0.354E+05, 0.600E+03, 1, 59, 1, 21, 0.40500000E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80789480E-06, 0.26859982E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 2, 0.44084907E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12359168E-06, 0.27609643E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 3, 0.43720661E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27403921E-07, 0.28401393E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 4, 0.43385462E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.43119144E-07, 0.29237543E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 5, 0.43077491E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.84109598E-07, 0.30112786E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 6, 0.42794818E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12286401E-06, 0.31024652E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 7, 0.42535522E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15127943E-06, 0.31971280E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 8, 0.42297742E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17144686E-06, 0.32950824E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18527426E-06, 0.33961488E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19431191E-06, 0.35001549E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19979394E-06, 0.36069375E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20268534E-06, 0.37163435E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20362722E-06, 0.38282303E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20327540E-06, 0.39424661E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20189744E-06, 0.40589296E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19987434E-06, 0.41775095E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20405350E-06, 0.42981042E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20572179E-06, 0.44209227E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 19, 0.40669459E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19707087E-06, 0.45457878E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 20, 0.40581493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.60035634E-06, 0.46724738E+05, + 0.360E+05, 0.600E+03, 1, 60, 1, 21, 0.40500000E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69826331E-06, 0.26859982E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 2, 0.44084907E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12824187E-06, 0.27609644E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 3, 0.43720661E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34009691E-07, 0.28401393E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 4, 0.43385462E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36311633E-07, 0.29237543E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 5, 0.43077491E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78680589E-07, 0.30112786E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 6, 0.42794818E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11739953E-06, 0.31024652E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 7, 0.42535522E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14583819E-06, 0.31971280E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16607485E-06, 0.32950824E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17998874E-06, 0.33961488E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18913152E-06, 0.35001549E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19472087E-06, 0.36069375E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19771499E-06, 0.37163435E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19876360E-06, 0.38282303E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19850768E-06, 0.39424661E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19722984E-06, 0.40589296E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19528706E-06, 0.41775095E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20086268E-06, 0.42981043E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20253061E-06, 0.44209227E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 19, 0.40669459E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19265241E-06, 0.45457878E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 20, 0.40581493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89779610E-05, 0.46724738E+05, + 0.366E+05, 0.600E+03, 1, 61, 1, 21, 0.40500000E+01, 0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61890229E-06, 0.26859982E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 2, 0.44084907E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15239444E-06, 0.27609643E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 3, 0.43720661E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56631460E-07, 0.28401393E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 4, 0.43385462E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16316566E-07, 0.29237543E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 5, 0.43077491E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.61685807E-07, 0.30112786E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 6, 0.42794818E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10203398E-06, 0.31024652E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 7, 0.42535522E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13188381E-06, 0.31971280E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 8, 0.42297742E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15332000E-06, 0.32950824E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16824738E-06, 0.33961488E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17824234E-06, 0.35001549E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18452799E-06, 0.36069375E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18810764E-06, 0.37163435E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18961518E-06, 0.38282303E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18974303E-06, 0.39424661E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18877413E-06, 0.40589296E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18706855E-06, 0.41775095E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19327487E-06, 0.42981042E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19501049E-06, 0.44209227E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18480362E-06, 0.45457878E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 20, 0.40581493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33826164E-05, 0.46724738E+05, + 0.372E+05, 0.600E+03, 1, 62, 1, 21, 0.40500000E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49260499E-06, 0.26859982E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16887429E-06, 0.27609643E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 3, 0.43720661E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74057539E-07, 0.28401393E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 4, 0.43385462E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81325169E-10, 0.29237543E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 5, 0.43077491E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.47829946E-07, 0.30112786E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 6, 0.42794818E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.88903683E-07, 0.31024652E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 7, 0.42535522E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11943996E-06, 0.31971280E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14149333E-06, 0.32950824E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15696464E-06, 0.33961488E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16744065E-06, 0.35001549E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17413786E-06, 0.36069375E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17806058E-06, 0.37163435E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17986187E-06, 0.38282303E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18023600E-06, 0.39424661E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17946681E-06, 0.40589296E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17793841E-06, 0.41775095E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18557811E-06, 0.42981042E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18734628E-06, 0.44209227E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17592976E-06, 0.45457878E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 20, 0.40581493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22569768E-05, 0.46724738E+05, + 0.378E+05, 0.600E+03, 1, 63, 1, 21, 0.40500000E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37732555E-07, 0.26859982E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16687499E-06, 0.27609644E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78782783E-07, 0.28401393E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43271164E-08, 0.29237543E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.49585161E-07, 0.30112786E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.91497466E-07, 0.31024652E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12320056E-06, 0.31971280E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14662966E-06, 0.32950824E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16358079E-06, 0.33961488E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17560592E-06, 0.35001549E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18384620E-06, 0.36069375E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18930639E-06, 0.37163435E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19259525E-06, 0.38282303E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19440682E-06, 0.39424661E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19501595E-06, 0.40589296E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19480334E-06, 0.41775095E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 17, 0.40867375E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20665505E-06, 0.42981042E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 18, 0.40764524E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20906629E-06, 0.44209227E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 19, 0.40669459E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19575267E-06, 0.45457878E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 20, 0.40581493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26162179E-06, 0.46724738E+05, + 0.384E+05, 0.600E+03, 1, 64, 1, 21, 0.40500000E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11757914E-06, 0.26859982E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15442865E-07, 0.27609644E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23929026E-07, 0.28401393E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24198016E-07, 0.29237543E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21572664E-07, 0.30112786E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14786448E-07, 0.31024652E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72453794E-08, 0.31971280E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.63746342E-10, 0.32950824E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.66092944E-08, 0.33961488E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12157983E-07, 0.35001549E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16655878E-07, 0.36069375E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20153287E-07, 0.37163435E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22750854E-07, 0.38282303E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24570141E-07, 0.39424661E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25735773E-07, 0.40589296E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26367001E-07, 0.41775095E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25766589E-07, 0.42981042E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26684294E-07, 0.44209227E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27557849E-07, 0.45457878E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74726959E-06, 0.46724738E+05, + 0.390E+05, 0.600E+03, 1, 65, 1, 21, 0.40500000E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 1, 0.44479920E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24599706E-05, 0.26859985E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 2, 0.44084909E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.67217574E-06, 0.27609646E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 3, 0.43720663E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.55050304E-06, 0.28401395E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 4, 0.43385464E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50788476E-06, 0.29237546E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 5, 0.43077493E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.52374254E-06, 0.30112789E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 6, 0.42794820E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.54465213E-06, 0.31024655E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 7, 0.42535524E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.58476576E-06, 0.31971282E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 8, 0.42297744E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.63861395E-06, 0.32950826E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 9, 0.42079699E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70230097E-06, 0.33961490E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 10, 0.41879709E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.77312501E-06, 0.35001551E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 11, 0.41696202E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.84923230E-06, 0.36069377E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 12, 0.41527717E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.92930438E-06, 0.37163436E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 13, 0.41372911E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10124985E-05, 0.38282305E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 14, 0.41230550E+01, 0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10981388E-05, 0.39424663E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 15, 0.41099508E+01, 0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11857916E-05, 0.40589297E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 16, 0.40978760E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12751469E-05, 0.41775096E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 17, 0.40867376E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13559232E-05, 0.42981043E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 18, 0.40764525E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14413302E-05, 0.44209228E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 19, 0.40669459E+01, 0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000019E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15421602E-05, 0.45457878E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 20, 0.40581493E+01, 0.20000019E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.49856388E-05, 0.46724738E+05, + 0.396E+05, 0.600E+03, 1, 66, 1, 21, 0.40500000E+01, 0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 1, 0.44479920E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35683250E-05, 0.26859985E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 2, 0.44084909E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.75310254E-06, 0.27609647E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 3, 0.43720664E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.61507464E-06, 0.28401396E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 4, 0.43385464E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.57256605E-06, 0.29237546E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 5, 0.43077494E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.60112255E-06, 0.30112789E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 6, 0.42794820E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.62327873E-06, 0.31024655E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 7, 0.42535524E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.66565716E-06, 0.31971283E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 8, 0.42297744E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.72252910E-06, 0.32950827E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 9, 0.42079700E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78981956E-06, 0.33961490E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 10, 0.41879710E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.86463309E-06, 0.35001551E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 11, 0.41696202E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.94497768E-06, 0.36069377E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 12, 0.41527717E+01, 0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10294585E-05, 0.37163437E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 13, 0.41372911E+01, 0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11171203E-05, 0.38282305E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 14, 0.41230550E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12072370E-05, 0.39424663E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 15, 0.41099508E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12993130E-05, 0.40589298E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 16, 0.40978760E+01, 0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13930301E-05, 0.41775096E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 17, 0.40867376E+01, 0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14832788E-05, 0.42981043E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 18, 0.40764525E+01, 0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15712336E-05, 0.44209228E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 19, 0.40669459E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16705300E-05, 0.45457878E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 20, 0.40581493E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24213104E-05, 0.46724738E+05, + 0.402E+05, 0.600E+03, 1, 67, 1, 21, 0.40500000E+01, 0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 1, 0.44479920E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32449982E-05, 0.26859985E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 2, 0.44084909E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64223134E-06, 0.27609646E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 3, 0.43720663E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.51825089E-06, 0.28401396E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 4, 0.43385464E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.48346614E-06, 0.29237546E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 5, 0.43077493E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.51453934E-06, 0.30112789E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 6, 0.42794820E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.54003364E-06, 0.31024655E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 7, 0.42535524E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.58426761E-06, 0.31971282E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 8, 0.42297744E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64183407E-06, 0.32950826E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 9, 0.42079699E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70891789E-06, 0.33961490E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 10, 0.41879709E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78284074E-06, 0.35001551E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 11, 0.41696202E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.86175730E-06, 0.36069377E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 12, 0.41527717E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.94442568E-06, 0.37163436E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 13, 0.41372911E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10300063E-05, 0.38282305E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 14, 0.41230550E+01, 0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11177912E-05, 0.39424663E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 15, 0.41099508E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12074422E-05, 0.40589297E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 16, 0.40978760E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12986169E-05, 0.41775096E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 17, 0.40867376E+01, 0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13875067E-05, 0.42981043E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 18, 0.40764525E+01, 0.20000017E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14736696E-05, 0.44209228E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 19, 0.40669459E+01, 0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15694155E-05, 0.45457878E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 20, 0.40581493E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43035542E-05, 0.46724738E+05, + 0.408E+05, 0.600E+03, 1, 68, 1, 21, 0.40500000E+01, 0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34600006E-05, 0.26859981E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 2, 0.44084906E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42463304E-06, 0.27609643E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 3, 0.43720661E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.46629411E-06, 0.28401393E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 4, 0.43385462E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44432914E-06, 0.29237543E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 5, 0.43077491E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38389831E-06, 0.30112786E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 6, 0.42794818E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36824948E-06, 0.31024652E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 7, 0.42535522E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35319925E-06, 0.31971280E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 8, 0.42297742E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33943205E-06, 0.32950824E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 9, 0.42079698E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32712215E-06, 0.33961488E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31617917E-06, 0.35001549E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30640981E-06, 0.36069375E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29759473E-06, 0.37163435E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28952941E-06, 0.38282303E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28203776E-06, 0.39424661E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27497026E-06, 0.40589296E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26822712E-06, 0.41775095E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 17, 0.40867375E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25430809E-06, 0.42981042E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 18, 0.40764524E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25573252E-06, 0.44209227E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 19, 0.40669459E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25898779E-06, 0.45457878E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 20, 0.40581493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.87195964E-07, 0.46724738E+05, + 0.414E+05, 0.600E+03, 1, 69, 1, 21, 0.40500000E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15199696E-07, 0.26859982E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21106639E-06, 0.27609643E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15396511E-06, 0.28401393E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10510234E-06, 0.29237543E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.71057656E-07, 0.30112786E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 6, 0.42794818E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43719414E-07, 0.31024652E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 7, 0.42535522E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22203682E-07, 0.31971280E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 8, 0.42297742E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55168385E-08, 0.32950824E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 9, 0.42079698E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.72468360E-08, 0.33961488E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 10, 0.41879708E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16833674E-07, 0.35001549E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 11, 0.41696200E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23900217E-07, 0.36069375E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 12, 0.41527716E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28951899E-07, 0.37163435E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 13, 0.41372910E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32416448E-07, 0.38282303E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 14, 0.41230549E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34635114E-07, 0.39424661E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35885495E-07, 0.40589296E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36378601E-07, 0.41775095E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34490810E-07, 0.42981042E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35073782E-07, 0.44209227E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36402216E-07, 0.45457878E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14753290E-05, 0.46724738E+05, + 0.420E+05, 0.600E+03, 1, 70, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70751785E-07, 0.26859982E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16413646E-06, 0.27609643E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12287054E-06, 0.28401393E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86615838E-07, 0.29237543E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61420945E-07, 0.30112786E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 6, 0.42794818E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39942883E-07, 0.31024652E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 7, 0.42535522E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22613058E-07, 0.31971280E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 8, 0.42297742E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88846015E-08, 0.32950824E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 9, 0.42079698E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18223112E-08, 0.33961488E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 10, 0.41879708E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10025328E-07, 0.35001549E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 11, 0.41696200E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16187474E-07, 0.36069375E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 12, 0.41527716E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20680844E-07, 0.37163435E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 13, 0.41372910E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23842414E-07, 0.38282303E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 14, 0.41230549E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25951696E-07, 0.39424661E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27213201E-07, 0.40589296E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27815904E-07, 0.41775095E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25477057E-07, 0.42981042E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26099510E-07, 0.44209227E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28252124E-07, 0.45457878E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31818776E-05, 0.46724738E+05, + 0.426E+05, 0.600E+03, 1, 71, 1, 21, 0.40500000E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22757398E-06, 0.26859982E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.92585601E-07, 0.27609643E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70704498E-07, 0.28401393E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51587026E-07, 0.29237543E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39904215E-07, 0.30112786E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26905578E-07, 0.31024652E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 7, 0.42535522E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15829716E-07, 0.31971280E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 8, 0.42297742E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66576291E-08, 0.32950824E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 9, 0.42079698E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78676266E-09, 0.33961488E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 10, 0.41879708E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.67050259E-08, 0.35001549E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 11, 0.41696200E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11294329E-07, 0.36069375E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 12, 0.41527716E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14771665E-07, 0.37163435E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17334841E-07, 0.38282303E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19111805E-07, 0.39424661E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20298966E-07, 0.40589296E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20962499E-07, 0.41775095E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16799309E-07, 0.42981042E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17470438E-07, 0.44209227E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21806137E-07, 0.45457878E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67857076E-07, 0.46724738E+05, + 0.432E+05, 0.600E+03, 1, 72, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 1, 0.44479913E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56611909E-05, 0.26859976E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 2, 0.44084902E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29732713E-05, 0.27609638E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 3, 0.43720657E+01, 0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12623908E-05, 0.28401387E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 4, 0.43385457E+01, 0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35628770E-06, 0.29237538E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 5, 0.43077487E+01, 0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55198289E-07, 0.30112781E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 6, 0.42794814E+01, 0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16246268E-07, 0.31024647E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 7, 0.42535518E+01, 0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999989E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18802424E-06, 0.31971275E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 8, 0.42297738E+01, 0.19999989E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999989E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49993350E-06, 0.32950820E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 9, 0.42079694E+01, 0.19999989E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999988E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90659492E-06, 0.33961483E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 10, 0.41879705E+01, 0.19999988E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13804467E-05, 0.35001545E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 11, 0.41696197E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19058573E-05, 0.36069371E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 12, 0.41527713E+01, 0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999982E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24750504E-05, 0.37163431E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 13, 0.41372907E+01, 0.19999982E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999979E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30852787E-05, 0.38282300E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 14, 0.41230546E+01, 0.19999979E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999975E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37366060E-05, 0.39424658E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 15, 0.41099505E+01, 0.19999975E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999971E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44308791E-05, 0.40589293E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 16, 0.40978757E+01, 0.19999971E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999966E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51707457E-05, 0.41775093E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 17, 0.40867374E+01, 0.19999966E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999960E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59402056E-05, 0.42981041E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 18, 0.40764523E+01, 0.19999960E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999953E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67641386E-05, 0.44209226E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 19, 0.40669458E+01, 0.19999953E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999946E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76725670E-05, 0.45457877E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 20, 0.40581493E+01, 0.19999946E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50499581E-04, 0.46724738E+05, + 0.438E+05, 0.600E+03, 1, 73, 1, 21, 0.40500000E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11434583E-06, 0.26859982E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.58929515E-06, 0.27609644E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.41418193E-06, 0.28401393E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26849247E-06, 0.29237544E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17112867E-06, 0.30112786E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10127381E-06, 0.31024652E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.51048332E-07, 0.31971280E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15068501E-07, 0.32950824E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10834267E-07, 0.33961488E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29683829E-07, 0.35001549E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43586883E-07, 0.36069375E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53973533E-07, 0.37163435E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61810766E-07, 0.38282303E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67743880E-07, 0.39424661E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72218942E-07, 0.40589296E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75536001E-07, 0.41775095E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74026648E-07, 0.42981043E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77979898E-07, 0.44209227E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.83684728E-07, 0.45457878E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.91201002E-05, 0.46724738E+05, + 0.444E+05, 0.600E+03, 1, 74, 1, 21, 0.40500000E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.53663407E-06, 0.26859982E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 2, 0.44084907E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24119557E-06, 0.27609644E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18253573E-06, 0.28401393E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13053385E-06, 0.29237544E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.99330904E-07, 0.30112786E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.68155238E-07, 0.31024652E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.43616840E-07, 0.31971280E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24566933E-07, 0.32950824E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.98099271E-08, 0.33961488E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16367032E-08, 0.35001549E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10542280E-07, 0.36069375E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17502241E-07, 0.37163435E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22917352E-07, 0.38282303E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27128785E-07, 0.39424661E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30344246E-07, 0.40589296E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32757960E-07, 0.41775095E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24038140E-07, 0.42981042E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26826577E-07, 0.44209227E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38366988E-07, 0.45457878E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42686864E-06, 0.46724738E+05, + 0.450E+05, 0.600E+03, 1, 75, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.57951035E-06, 0.26859982E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 2, 0.44084907E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23076139E-06, 0.27609644E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17361441E-06, 0.28401393E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12345729E-06, 0.29237544E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.94133103E-07, 0.30112786E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.63865784E-07, 0.31024652E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39966270E-07, 0.31971280E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21354971E-07, 0.32950824E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.69113035E-08, 0.33961488E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43457327E-08, 0.35001549E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13120111E-07, 0.36069375E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19998350E-07, 0.37163435E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25374675E-07, 0.38282303E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29558276E-07, 0.39424661E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32767201E-07, 0.40589296E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35201584E-07, 0.41775095E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25763573E-07, 0.42981042E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28561825E-07, 0.44209227E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40799993E-07, 0.45457878E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.43758308E-05, 0.46724738E+05, + 0.456E+05, 0.600E+03, 1, 76, 1, 21, 0.40500000E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.76495636E-06, 0.26859982E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 2, 0.44084907E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62268995E-07, 0.27609644E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48012041E-07, 0.28401393E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29573410E-07, 0.29237543E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80810594E-08, 0.30112786E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46955861E-09, 0.31024652E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44964850E-08, 0.31971280E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.76111526E-08, 0.32950824E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.94708099E-08, 0.33961488E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10510760E-07, 0.35001549E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11008122E-07, 0.36069375E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11193503E-07, 0.37163435E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11199838E-07, 0.38282303E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11114562E-07, 0.39424661E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10999862E-07, 0.40589296E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10896656E-07, 0.41775095E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20415936E-07, 0.42981042E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20017726E-07, 0.44209227E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10552956E-07, 0.45457878E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34689923E-06, 0.46724738E+05, + 0.462E+05, 0.600E+03, 1, 77, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.84060106E-06, 0.26859982E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 2, 0.44084907E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10155684E-06, 0.27609644E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98759052E-07, 0.28401393E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.85898680E-07, 0.29237543E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64985102E-07, 0.30112786E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58449871E-07, 0.31024652E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53816553E-07, 0.31971280E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50690325E-07, 0.32950824E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48718892E-07, 0.33961488E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47629985E-07, 0.35001549E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47196067E-07, 0.36069375E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47230046E-07, 0.37163435E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47605251E-07, 0.38282303E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48211113E-07, 0.39424661E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48998604E-07, 0.40589296E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49858425E-07, 0.41775095E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37612384E-07, 0.42981042E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38655244E-07, 0.44209227E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52494499E-07, 0.45457878E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42773272E-05, 0.46724738E+05, + 0.468E+05, 0.600E+03, 1, 78, 1, 21, 0.40500000E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39362227E-06, 0.26859982E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39990979E-07, 0.27609644E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43523343E-07, 0.28401393E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41164313E-07, 0.29237543E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33207538E-07, 0.30112786E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32049183E-07, 0.31024652E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31651048E-07, 0.31971280E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31871515E-07, 0.32950824E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32567240E-07, 0.33961488E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33601417E-07, 0.35001549E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34882373E-07, 0.36069375E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36299184E-07, 0.37163435E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37789949E-07, 0.38282303E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39305963E-07, 0.39424661E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40848015E-07, 0.40589296E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42320334E-07, 0.41775095E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35198198E-07, 0.42981042E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36403510E-07, 0.44209227E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45950479E-07, 0.45457878E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19244879E-06, 0.46724738E+05, + 0.474E+05, 0.600E+03, 1, 79, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29544167E-06, 0.26859982E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32944286E-07, 0.27609644E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35915722E-07, 0.28401393E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34310961E-07, 0.29237543E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28239640E-07, 0.30112786E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27485338E-07, 0.31024652E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27402645E-07, 0.31971280E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27861326E-07, 0.32950824E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28740068E-07, 0.33961488E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29903074E-07, 0.35001549E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31304737E-07, 0.36069375E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32776740E-07, 0.37163435E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34337369E-07, 0.38282303E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35881637E-07, 0.39424661E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37458825E-07, 0.40589296E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38949167E-07, 0.41775095E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33224314E-07, 0.42981042E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34399111E-07, 0.44209227E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42596376E-07, 0.45457877E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60667232E-05, 0.46724738E+05, + 0.480E+05, 0.600E+03, 1, 80, 1, 21, 0.40500000E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23613620E-06, 0.26859982E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19200833E-07, 0.27609644E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23764148E-07, 0.28401393E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24292660E-07, 0.29237543E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20496344E-07, 0.30112786E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20900270E-07, 0.31024652E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21739606E-07, 0.31971280E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22936455E-07, 0.32950824E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24411566E-07, 0.33961488E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26036759E-07, 0.35001549E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27811524E-07, 0.36069375E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29581368E-07, 0.37163435E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31370988E-07, 0.38282303E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33097308E-07, 0.39424661E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34812690E-07, 0.40589296E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36416541E-07, 0.41775095E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31325449E-07, 0.42981042E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32534697E-07, 0.44209227E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40208320E-07, 0.45457878E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.58526454E-06, 0.46724738E+05, + 0.486E+05, 0.600E+03, 1, 81, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22576699E-06, 0.26859982E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18668548E-07, 0.27609644E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23141222E-07, 0.28401393E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23722045E-07, 0.29237543E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20103172E-07, 0.30112786E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20543041E-07, 0.31024652E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21402816E-07, 0.31971280E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22623407E-07, 0.32950824E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24109845E-07, 0.33961488E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25750179E-07, 0.35001549E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27529747E-07, 0.36069375E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29308641E-07, 0.37163435E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31111323E-07, 0.38282303E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32835132E-07, 0.39424661E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34555395E-07, 0.40589296E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36168643E-07, 0.41775095E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31216825E-07, 0.42981042E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32419859E-07, 0.44209227E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39958675E-07, 0.45457878E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27595348E-09, 0.46724738E+05, + 0.492E+05, 0.600E+03, 1, 82, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 1, 0.44479914E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18005918E-05, 0.26859977E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 2, 0.44084903E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14733464E-05, 0.27609639E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 3, 0.43720657E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11748154E-05, 0.28401388E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 4, 0.43385458E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10248873E-05, 0.29237538E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 5, 0.43077487E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.99591853E-06, 0.30112781E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 6, 0.42794814E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10424324E-05, 0.31024647E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 7, 0.42535518E+01, 0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11546679E-05, 0.31971275E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 8, 0.42297738E+01, 0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13243028E-05, 0.32950819E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 9, 0.42079694E+01, 0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999988E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15463969E-05, 0.33961483E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 10, 0.41879704E+01, 0.19999988E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18182320E-05, 0.35001544E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 11, 0.41696197E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21384032E-05, 0.36069370E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 12, 0.41527713E+01, 0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999982E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25064781E-05, 0.37163431E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 13, 0.41372907E+01, 0.19999982E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999979E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29224663E-05, 0.38282299E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 14, 0.41230546E+01, 0.19999979E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999976E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33867418E-05, 0.39424658E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 15, 0.41099504E+01, 0.19999976E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999972E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38996924E-05, 0.40589293E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 16, 0.40978757E+01, 0.19999972E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999967E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44618958E-05, 0.41775092E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 17, 0.40867374E+01, 0.19999967E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999962E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50355278E-05, 0.42981040E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 18, 0.40764523E+01, 0.19999962E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999957E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56784673E-05, 0.44209225E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 19, 0.40669458E+01, 0.19999957E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999950E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64189128E-05, 0.45457876E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 20, 0.40581492E+01, 0.19999950E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999945E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47123643E-05, 0.46724737E+05, + 0.498E+05, 0.600E+03, 1, 83, 1, 21, 0.40500000E+01, 0.19999945E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999945E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25939287E-06, 0.26859982E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44428781E-06, 0.27609644E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35421805E-06, 0.28401393E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26672678E-06, 0.29237544E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20028710E-06, 0.30112786E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14750400E-06, 0.31024652E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10399969E-06, 0.31971280E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.68510452E-07, 0.32950824E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39752351E-07, 0.33961488E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16594548E-07, 0.35001549E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19890543E-08, 0.36069375E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16820401E-07, 0.37163435E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28576522E-07, 0.38282303E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37846458E-07, 0.39424661E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45065701E-07, 0.40589296E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50607664E-07, 0.41775095E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49645273E-07, 0.42981042E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54465932E-07, 0.44209227E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62379073E-07, 0.45457878E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.58373486E-06, 0.46724738E+05, + 0.504E+05, 0.600E+03, 1, 84, 1, 21, 0.40500000E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24425085E-06, 0.26859982E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44198070E-06, 0.27609644E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35226978E-06, 0.28401393E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26525856E-06, 0.29237544E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19934317E-06, 0.30112786E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14680133E-06, 0.31024652E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10348170E-06, 0.31971280E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.68141322E-07, 0.32950824E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39485624E-07, 0.33961488E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16420845E-07, 0.35001549E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21018103E-08, 0.36069375E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16879696E-07, 0.37163435E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28606017E-07, 0.38282303E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37833768E-07, 0.39424661E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45034355E-07, 0.40589296E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50549239E-07, 0.41775095E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49402171E-07, 0.42981042E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54195777E-07, 0.44209227E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62293257E-07, 0.45457878E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16516448E-05, 0.46724738E+05, + 0.510E+05, 0.600E+03, 1, 85, 1, 21, 0.40500000E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13839343E-06, 0.26859982E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39621584E-06, 0.27609644E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31696588E-06, 0.28401393E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24278228E-06, 0.29237544E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19010848E-06, 0.30112786E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14414627E-06, 0.31024652E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10601719E-06, 0.31971280E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 8, 0.42297742E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.74815958E-07, 0.32950824E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 9, 0.42079698E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.49503555E-07, 0.33961488E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 10, 0.41879708E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29187316E-07, 0.35001549E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 11, 0.41696200E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12954434E-07, 0.36069375E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 12, 0.41527716E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11050361E-09, 0.37163435E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 13, 0.41372910E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.99515844E-08, 0.38282303E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 14, 0.41230549E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17723327E-07, 0.39424661E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 15, 0.41099507E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23666509E-07, 0.40589296E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 16, 0.40978759E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28048103E-07, 0.41775095E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 17, 0.40867375E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23146985E-07, 0.42981042E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 18, 0.40764524E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27259830E-07, 0.44209227E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 19, 0.40669459E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37271619E-07, 0.45457878E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 20, 0.40581493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.68782838E-06, 0.46724738E+05, + 0.516E+05, 0.600E+03, 1, 86, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10686146E-06, 0.26859982E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39805703E-06, 0.27609644E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31888291E-06, 0.28401393E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24436813E-06, 0.29237544E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19104935E-06, 0.30112786E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14490516E-06, 0.31024652E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10663203E-06, 0.31971280E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 8, 0.42297742E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.75323801E-07, 0.32950824E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 9, 0.42079698E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.49916071E-07, 0.33961488E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 10, 0.41879708E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29532792E-07, 0.35001549E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 11, 0.41696200E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13236072E-07, 0.36069375E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 12, 0.41527716E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34994940E-09, 0.37163435E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 13, 0.41372910E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97589954E-08, 0.38282303E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 14, 0.41230549E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17564435E-07, 0.39424661E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 15, 0.41099507E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23530276E-07, 0.40589296E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 16, 0.40978759E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27947209E-07, 0.41775095E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 17, 0.40867375E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23469191E-07, 0.42981042E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 18, 0.40764524E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27601242E-07, 0.44209227E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 19, 0.40669459E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37237122E-07, 0.45457878E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 20, 0.40581493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39632424E-05, 0.46724738E+05, + 0.522E+05, 0.600E+03, 1, 87, 1, 21, 0.40500000E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23682697E-05, 0.26859982E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 2, 0.44084907E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23719997E-06, 0.27609644E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 3, 0.43720661E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20592465E-06, 0.28401393E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 4, 0.43385462E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16332929E-06, 0.29237544E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 5, 0.43077491E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10666928E-06, 0.30112786E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 6, 0.42794818E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.93495242E-07, 0.31024652E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 7, 0.42535522E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86852172E-07, 0.31971280E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84351296E-07, 0.32950824E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84372669E-07, 0.33961488E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.85835410E-07, 0.35001549E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88041826E-07, 0.36069375E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90548269E-07, 0.37163435E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.93073243E-07, 0.38282303E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.95453856E-07, 0.39424661E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97615665E-07, 0.40589296E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.99507194E-07, 0.41775095E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66254476E-07, 0.42981042E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.68857730E-07, 0.44209227E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10447372E-06, 0.45457878E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30591299E-05, 0.46724738E+05, + 0.528E+05, 0.600E+03, 1, 88, 1, 21, 0.40500000E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15671552E-06, 0.26859982E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21402004E-06, 0.27609644E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16594963E-06, 0.28401393E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12673414E-06, 0.29237543E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.99644488E-07, 0.30112786E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.80321637E-07, 0.31024652E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64853918E-07, 0.31971280E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.52276839E-07, 0.32950824E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.41952173E-07, 0.33961488E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33411034E-07, 0.35001549E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26369101E-07, 0.36069375E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20543936E-07, 0.37163435E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15753191E-07, 0.38282303E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11837582E-07, 0.39424661E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.86757090E-08, 0.40589296E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.61157834E-08, 0.41775095E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.76808533E-08, 0.42981042E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64046333E-08, 0.44209227E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20488322E-08, 0.45457878E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64793207E-06, 0.46724738E+05, + 0.534E+05, 0.600E+03, 1, 89, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15353953E-06, 0.26859982E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21359586E-06, 0.27609644E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16557082E-06, 0.28401393E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12642033E-06, 0.29237543E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.99418596E-07, 0.30112786E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.80125702E-07, 0.31024652E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64683935E-07, 0.31971280E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.52119276E-07, 0.32950824E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.41814232E-07, 0.33961488E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33279818E-07, 0.35001549E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26248497E-07, 0.36069375E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20434776E-07, 0.37163435E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15642943E-07, 0.38282303E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11733810E-07, 0.39424661E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.85715754E-08, 0.40589296E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.60192029E-08, 0.41775095E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.76237079E-08, 0.42981042E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.63526251E-08, 0.44209227E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19573818E-08, 0.45457878E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42888781E-06, 0.46724738E+05, + 0.540E+05, 0.600E+03, 1, 90, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10482283E-06, 0.26859982E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21272746E-06, 0.27609644E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16472951E-06, 0.28401393E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12613431E-06, 0.29237543E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10006987E-06, 0.30112786E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.81065060E-07, 0.31024652E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.65875586E-07, 0.31971280E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.53531842E-07, 0.32950824E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.43440462E-07, 0.33961488E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35101582E-07, 0.35001549E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28251709E-07, 0.36069375E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22609289E-07, 0.37163435E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17981261E-07, 0.38282303E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14223684E-07, 0.39424661E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11200296E-07, 0.40589296E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.87906891E-08, 0.41775095E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10863317E-07, 0.42981042E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.96547126E-08, 0.44209227E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50344902E-08, 0.45457878E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15673328E-06, 0.46724738E+05, + 0.546E+05, 0.600E+03, 1, 91, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36092839E-07, 0.26859982E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91193996E-07, 0.27609643E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.89317968E-07, 0.28401392E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 4, 0.43385461E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90045056E-07, 0.29237543E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.89048694E-07, 0.30112786E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 6, 0.42794817E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.93753329E-07, 0.31024652E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10052571E-06, 0.31971280E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 8, 0.42297742E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10883410E-06, 0.32950824E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 9, 0.42079697E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11820349E-06, 0.33961488E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 10, 0.41879708E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12831734E-06, 0.35001548E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 11, 0.41696200E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13886036E-06, 0.36069375E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 12, 0.41527716E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14967171E-06, 0.37163434E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 13, 0.41372909E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16057709E-06, 0.38282303E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 14, 0.41230548E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17147755E-06, 0.39424661E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 15, 0.41099507E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18228554E-06, 0.40589296E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 16, 0.40978759E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19296390E-06, 0.41775095E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 17, 0.40867375E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19155563E-06, 0.42981042E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 18, 0.40764524E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20059487E-06, 0.44209227E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 19, 0.40669459E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22178502E-06, 0.45457877E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 20, 0.40581493E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22123953E-05, 0.46724738E+05, + 0.552E+05, 0.600E+03, 1, 92, 1, 21, 0.40500000E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18952055E-05, 0.26859984E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 2, 0.44084908E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14401690E-05, 0.27609646E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 3, 0.43720663E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12893158E-05, 0.28401395E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 4, 0.43385463E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11427077E-05, 0.29237545E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 5, 0.43077493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10061453E-05, 0.30112788E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 6, 0.42794819E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.93825227E-06, 0.31024654E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 7, 0.42535524E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89269350E-06, 0.31971282E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 8, 0.42297744E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.86492676E-06, 0.32950826E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 9, 0.42079699E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.85139095E-06, 0.33961490E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 10, 0.41879709E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.84922339E-06, 0.35001551E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 11, 0.41696201E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.85619897E-06, 0.36069376E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 12, 0.41527717E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.87045663E-06, 0.37163436E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 13, 0.41372911E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89056221E-06, 0.38282304E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 14, 0.41230550E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.91532026E-06, 0.39424663E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 15, 0.41099507E+01, 0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.94375824E-06, 0.40589297E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 16, 0.40978760E+01, 0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.97510228E-06, 0.41775096E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 17, 0.40867376E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.95107415E-06, 0.42981043E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 18, 0.40764525E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.98209026E-06, 0.44209228E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 19, 0.40669459E+01, 0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10737799E-05, 0.45457878E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 20, 0.40581493E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81781615E-06, 0.46724738E+05, + 0.558E+05, 0.600E+03, 1, 93, 1, 21, 0.40500000E+01, 0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000015E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96894196E-06, 0.26859982E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 2, 0.44084907E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11737816E-06, 0.27609644E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 3, 0.43720661E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38628880E-07, 0.28401393E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 4, 0.43385462E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13676528E-06, 0.29237543E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 5, 0.43077491E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18584191E-06, 0.30112786E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 6, 0.42794818E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22751941E-06, 0.31024652E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25473486E-06, 0.31971280E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27169495E-06, 0.32950824E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28143458E-06, 0.33961488E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28610738E-06, 0.35001549E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28725951E-06, 0.36069375E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28596858E-06, 0.37163435E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28302793E-06, 0.38282303E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27898430E-06, 0.39424661E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 15, 0.41099507E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27422550E-06, 0.40589296E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 16, 0.40978759E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26903031E-06, 0.41775095E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 17, 0.40867375E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26882419E-06, 0.42981043E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 18, 0.40764524E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26734637E-06, 0.44209227E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 19, 0.40669459E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25730291E-06, 0.45457878E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 20, 0.40581493E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19335351E-06, 0.46724738E+05, + 0.564E+05, 0.600E+03, 1, 94, 1, 21, 0.40500000E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36450789E-06, 0.26859982E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84176015E-07, 0.27609644E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.62130649E-07, 0.28401393E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16015988E-06, 0.29237544E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21641597E-06, 0.30112786E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25897392E-06, 0.31024653E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28766436E-06, 0.31971280E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30652544E-06, 0.32950825E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31845057E-06, 0.33961488E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32549434E-06, 0.35001549E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 11, 0.41696201E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32914625E-06, 0.36069375E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 12, 0.41527716E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33040797E-06, 0.37163435E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 13, 0.41372910E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33003509E-06, 0.38282303E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 14, 0.41230549E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32856240E-06, 0.39424662E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 15, 0.41099507E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32633083E-06, 0.40589296E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 16, 0.40978759E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32360062E-06, 0.41775095E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 17, 0.40867375E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32901763E-06, 0.42981043E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 18, 0.40764524E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32904706E-06, 0.44209227E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 19, 0.40669459E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31795646E-06, 0.45457878E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 20, 0.40581493E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18256440E-05, 0.46724738E+05, + 0.570E+05, 0.600E+03, 1, 95, 1, 21, 0.40500000E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42923254E-07, 0.26859982E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62716282E-07, 0.27609644E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78628755E-07, 0.28401393E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17669480E-06, 0.29237544E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 5, 0.43077492E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23667835E-06, 0.30112787E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27970216E-06, 0.31024653E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30916728E-06, 0.31971281E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32903675E-06, 0.32950825E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34211369E-06, 0.33961488E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 10, 0.41879708E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35042056E-06, 0.35001549E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 11, 0.41696201E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35539003E-06, 0.36069375E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 12, 0.41527716E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35799205E-06, 0.37163435E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 13, 0.41372910E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35898403E-06, 0.38282303E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 14, 0.41230549E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35885371E-06, 0.39424662E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 15, 0.41099507E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35793548E-06, 0.40589296E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 16, 0.40978759E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35649967E-06, 0.41775095E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 17, 0.40867375E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36452071E-06, 0.42981043E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 18, 0.40764524E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36528274E-06, 0.44209227E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 19, 0.40669459E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35391939E-06, 0.45457878E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 20, 0.40581493E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18467755E-05, 0.46724738E+05, + 0.576E+05, 0.600E+03, 1, 96, 1, 21, 0.40500000E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.93198427E-07, 0.26859982E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62420902E-07, 0.27609644E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.79928430E-07, 0.28401393E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17818189E-06, 0.29237544E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23759501E-06, 0.30112786E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28069330E-06, 0.31024653E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31018329E-06, 0.31971281E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33006312E-06, 0.32950825E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34313969E-06, 0.33961488E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 10, 0.41879708E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35141624E-06, 0.35001549E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 11, 0.41696201E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35636727E-06, 0.36069375E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 12, 0.41527716E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35893144E-06, 0.37163435E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 13, 0.41372910E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35989365E-06, 0.38282303E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 14, 0.41230549E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35973015E-06, 0.39424662E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 15, 0.41099507E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35876014E-06, 0.40589296E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 16, 0.40978759E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35730099E-06, 0.41775095E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 17, 0.40867375E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36464279E-06, 0.42981043E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 18, 0.40764524E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36539235E-06, 0.44209227E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 19, 0.40669459E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35461005E-06, 0.45457878E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 20, 0.40581493E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65393173E-05, 0.46724738E+05, + 0.582E+05, 0.600E+03, 1, 97, 1, 21, 0.40500000E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48872615E-06, 0.26859982E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14385229E-07, 0.27609643E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 3, 0.43720661E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22758577E-08, 0.28401393E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 4, 0.43385462E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10817306E-07, 0.29237543E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18911152E-07, 0.30112786E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33063756E-07, 0.31024652E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.45422208E-07, 0.31971280E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.55488709E-07, 0.32950824E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.63211310E-07, 0.33961488E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.68747013E-07, 0.35001549E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.72390609E-07, 0.36069375E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.74419788E-07, 0.37163435E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.75153686E-07, 0.38282303E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.74847485E-07, 0.39424661E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.73735016E-07, 0.40589296E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.72015894E-07, 0.41775095E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.69876485E-07, 0.42981042E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.69594147E-07, 0.44209227E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.67627354E-07, 0.45457878E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18079510E-06, 0.46724738E+05, + 0.588E+05, 0.600E+03, 1, 98, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48009595E-06, 0.26859982E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15447618E-07, 0.27609643E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33478464E-08, 0.28401393E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.98165032E-08, 0.29237543E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18077753E-07, 0.30112786E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32259393E-07, 0.31024652E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44636895E-07, 0.31971280E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.54729561E-07, 0.32950824E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.62464228E-07, 0.33961488E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.68012092E-07, 0.35001549E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.71684795E-07, 0.36069375E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.73712940E-07, 0.37163435E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.74466300E-07, 0.38282303E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.74173201E-07, 0.39424661E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.73065593E-07, 0.40589296E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.71363992E-07, 0.41775095E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.69326600E-07, 0.42981042E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.69063393E-07, 0.44209227E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.66992758E-07, 0.45457878E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.58125791E-06, 0.46724738E+05, + 0.594E+05, 0.600E+03, 1, 99, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.43888644E-07, 0.26859982E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20243974E-07, 0.27609644E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12093636E-07, 0.28401393E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38572523E-08, 0.29237543E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20165093E-07, 0.30112786E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35938619E-07, 0.31024652E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50005831E-07, 0.31971280E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.61907716E-07, 0.32950824E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.71513881E-07, 0.33961488E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.79001207E-07, 0.35001549E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.84613575E-07, 0.36069375E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.88588326E-07, 0.37163435E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.91249138E-07, 0.38282303E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.92827889E-07, 0.39424661E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.93536439E-07, 0.40589296E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.93600320E-07, 0.41775095E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.96563912E-07, 0.42981042E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.97267481E-07, 0.44209227E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.93318032E-07, 0.45457878E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20299676E-06, 0.46724738E+05, + 0.600E+05, 0.600E+03, 1, 100, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31369791E-06, 0.26859982E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16694912E-09, 0.27609644E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39528594E-08, 0.28401393E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19937406E-07, 0.29237543E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39433878E-07, 0.30112786E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.55657427E-07, 0.31024652E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70481619E-07, 0.31971280E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.83355559E-07, 0.32950824E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.94133938E-07, 0.33961488E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10289414E-06, 0.35001549E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10989071E-06, 0.36069375E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11530155E-06, 0.37163435E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11943013E-06, 0.38282303E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12250203E-06, 0.39424661E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12468593E-06, 0.40589296E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12623528E-06, 0.41775095E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 17, 0.40867375E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13188822E-06, 0.42981042E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 18, 0.40764524E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13360797E-06, 0.44209227E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 19, 0.40669459E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12974806E-06, 0.45457878E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 20, 0.40581493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20746755E-06, 0.46724738E+05, + 0.606E+05, 0.600E+03, 1, 101, 1, 21, 0.40500000E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26392706E-06, 0.26859982E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39535006E-07, 0.27609644E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38977998E-07, 0.28401393E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35699404E-07, 0.29237543E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31007072E-07, 0.30112786E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30781727E-07, 0.31024652E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31108438E-07, 0.31971280E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31671718E-07, 0.32950824E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32285129E-07, 0.33961488E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32784129E-07, 0.35001549E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33093212E-07, 0.36069375E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33199118E-07, 0.37163435E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33065390E-07, 0.38282303E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32742602E-07, 0.39424661E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32237029E-07, 0.40589296E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31584147E-07, 0.41775095E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30595345E-07, 0.42981042E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30577073E-07, 0.44209227E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30159804E-07, 0.45457878E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23531836E-06, 0.46724738E+05, + 0.612E+05, 0.600E+03, 1, 102, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15363994E-06, 0.26859982E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63742469E-08, 0.27609644E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19908448E-08, 0.28401393E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14069812E-09, 0.29237543E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.87893781E-09, 0.30112786E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33503404E-08, 0.31024652E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.56799152E-08, 0.31971280E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.77050721E-08, 0.32950824E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.93573433E-08, 0.33961488E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10551478E-07, 0.35001549E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11304497E-07, 0.36069375E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11648972E-07, 0.37163435E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11571856E-07, 0.38282303E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11217125E-07, 0.39424661E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10559802E-07, 0.40589296E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.96881507E-08, 0.41775095E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10281340E-07, 0.42981042E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10018276E-07, 0.44209227E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.74269764E-08, 0.45457878E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90064773E-08, 0.46724738E+05, + 0.618E+05, 0.600E+03, 1, 103, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21185756E-05, 0.26859984E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 2, 0.44084909E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15106519E-05, 0.27609646E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 3, 0.43720663E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13309584E-05, 0.28401395E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 4, 0.43385464E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11414281E-05, 0.29237546E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 5, 0.43077493E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.97924276E-06, 0.30112789E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 6, 0.42794820E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89365074E-06, 0.31024655E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 7, 0.42535524E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.84753023E-06, 0.31971283E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 8, 0.42297744E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.84013610E-06, 0.32950827E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 9, 0.42079699E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.86915959E-06, 0.33961490E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 10, 0.41879710E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.93259175E-06, 0.35001551E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 11, 0.41696202E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10277066E-05, 0.36069377E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 12, 0.41527717E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11520107E-05, 0.37163437E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 13, 0.41372911E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13036871E-05, 0.38282305E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 14, 0.41230550E+01, 0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14798697E-05, 0.39424663E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 15, 0.41099508E+01, 0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16796894E-05, 0.40589298E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 16, 0.40978760E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19009695E-05, 0.41775097E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 17, 0.40867376E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20697408E-05, 0.42981044E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 18, 0.40764525E+01, 0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23153358E-05, 0.44209228E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 19, 0.40669459E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26616440E-05, 0.45457878E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 20, 0.40581493E+01, 0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13702735E-04, 0.46724738E+05, + 0.624E+05, 0.600E+03, 1, 104, 1, 21, 0.40500000E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24440088E-06, 0.26859982E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23668251E-06, 0.27609643E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20622851E-06, 0.28401392E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 4, 0.43385461E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16478116E-06, 0.29237543E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12788572E-06, 0.30112786E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 6, 0.42794817E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97126449E-07, 0.31024652E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 7, 0.42535522E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70500739E-07, 0.31971280E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 8, 0.42297742E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48195513E-07, 0.32950824E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 9, 0.42079697E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29928291E-07, 0.33961488E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 10, 0.41879708E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15219356E-07, 0.35001549E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 11, 0.41696200E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35263312E-08, 0.36069375E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 12, 0.41527716E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.56613523E-08, 0.37163434E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 13, 0.41372909E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12806357E-07, 0.38282303E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 14, 0.41230548E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18300085E-07, 0.39424661E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 15, 0.41099507E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22459353E-07, 0.40589296E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 16, 0.40978759E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25558560E-07, 0.41775095E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 17, 0.40867375E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25441011E-07, 0.42981042E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 18, 0.40764524E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27890337E-07, 0.44209227E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 19, 0.40669459E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31585557E-07, 0.45457877E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 20, 0.40581493E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98371696E-05, 0.46724738E+05, + 0.630E+05, 0.600E+03, 1, 105, 1, 21, 0.40500000E+01, 0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18279409E-05, 0.26859982E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 2, 0.44084907E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35361892E-06, 0.27609644E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41358193E-06, 0.28401393E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37268715E-06, 0.29237543E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29140310E-06, 0.30112786E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22305368E-06, 0.31024652E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15601541E-06, 0.31971280E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.95309652E-07, 0.32950824E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43003645E-07, 0.33961488E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.77855944E-09, 0.35001549E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36717744E-07, 0.36069375E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.65758631E-07, 0.37163435E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89036352E-07, 0.38282303E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10736573E-06, 0.39424661E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12191053E-06, 0.40589296E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13320641E-06, 0.41775095E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15067767E-06, 0.42981042E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15986911E-06, 0.44209227E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15791339E-06, 0.45457878E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35652000E-06, 0.46724738E+05, + 0.636E+05, 0.600E+03, 1, 106, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29317854E-05, 0.26859982E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 2, 0.44084907E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28322505E-06, 0.27609644E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 3, 0.43720661E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34602634E-06, 0.28401393E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 4, 0.43385462E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35761467E-06, 0.29237543E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 5, 0.43077491E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31926627E-06, 0.30112786E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 6, 0.42794818E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31818678E-06, 0.31024652E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31289120E-06, 0.31971280E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30513770E-06, 0.32950824E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 9, 0.42079697E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29639744E-06, 0.33961488E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28771496E-06, 0.35001549E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27979132E-06, 0.36069375E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27302392E-06, 0.37163434E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 13, 0.41372909E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26758346E-06, 0.38282303E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 14, 0.41230548E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26353943E-06, 0.39424661E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 15, 0.41099507E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26081316E-06, 0.40589296E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 16, 0.40978759E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25932297E-06, 0.41775095E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 17, 0.40867375E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21310284E-06, 0.42981042E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 18, 0.40764524E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21381026E-06, 0.44209227E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 19, 0.40669459E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25976676E-06, 0.45457877E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 20, 0.40581493E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47497063E-05, 0.46724738E+05, + 0.642E+05, 0.600E+03, 1, 107, 1, 21, 0.40500000E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84856566E-08, 0.26859982E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20071289E-06, 0.27609644E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15314591E-06, 0.28401393E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10975785E-06, 0.29237543E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78211666E-07, 0.30112786E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.52324616E-07, 0.31024652E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31390893E-07, 0.31971280E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14799060E-07, 0.32950824E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19019168E-08, 0.33961488E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79546680E-08, 0.35001549E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15344359E-07, 0.36069375E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20754243E-07, 0.37163435E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24618799E-07, 0.38282303E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27279174E-07, 0.39424661E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28988929E-07, 0.40589296E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29996929E-07, 0.41775095E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27909397E-07, 0.42981042E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28338480E-07, 0.44209227E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30372899E-07, 0.45457878E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26262357E-06, 0.46724738E+05, + 0.648E+05, 0.600E+03, 1, 108, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78006970E-08, 0.26859982E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20012992E-06, 0.27609644E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15272937E-06, 0.28401393E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10947785E-06, 0.29237543E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78027117E-07, 0.30112786E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.52209177E-07, 0.31024652E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31320258E-07, 0.31971280E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14767657E-07, 0.32950824E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18882567E-08, 0.33961488E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79458857E-08, 0.35001549E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15329604E-07, 0.36069375E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20725832E-07, 0.37163435E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24597181E-07, 0.38282303E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27241921E-07, 0.39424661E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28965864E-07, 0.40589296E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29967346E-07, 0.41775095E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27865607E-07, 0.42981042E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28310801E-07, 0.44209227E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30352972E-07, 0.45457878E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21302430E-06, 0.46724738E+05, + 0.654E+05, 0.600E+03, 1, 109, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.87243791E-07, 0.26859982E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18725846E-06, 0.27609644E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14373964E-06, 0.28401393E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10461087E-06, 0.29237543E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.77059749E-07, 0.30112786E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.53308472E-07, 0.31024652E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34011098E-07, 0.31971280E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18680261E-07, 0.32950824E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.67504224E-08, 0.33961488E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23427376E-08, 0.35001549E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91426422E-08, 0.36069375E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14060635E-07, 0.37163435E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17539978E-07, 0.38282303E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19864146E-07, 0.39424661E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21300959E-07, 0.40589296E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22066590E-07, 0.41775095E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19037738E-07, 0.42981042E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19372830E-07, 0.44209227E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21979229E-07, 0.45457878E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18038748E-06, 0.46724738E+05, + 0.660E+05, 0.600E+03, 1, 110, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25107808E-06, 0.26859982E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17867827E-06, 0.27609644E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13728610E-06, 0.28401393E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10178433E-06, 0.29237543E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78700332E-07, 0.30112786E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.56916328E-07, 0.31024652E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39235232E-07, 0.31971280E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25245981E-07, 0.32950824E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14450624E-07, 0.33961488E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.63247363E-08, 0.35001549E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.37481129E-09, 0.36069375E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37973749E-08, 0.37163435E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65938366E-08, 0.38282303E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.83027345E-08, 0.39424661E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91820134E-08, 0.40589296E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.94160910E-08, 0.41775095E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46877453E-08, 0.42981042E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47317776E-08, 0.44209227E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81405815E-08, 0.45457878E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17984044E-06, 0.46724738E+05, + 0.666E+05, 0.600E+03, 1, 111, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42380637E-06, 0.26859982E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17803733E-06, 0.27609644E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13639717E-06, 0.28401393E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 4, 0.43385462E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10279520E-06, 0.29237544E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 5, 0.43077491E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.83113989E-07, 0.30112786E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 6, 0.42794818E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.62479096E-07, 0.31024652E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 7, 0.42535522E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.45839098E-07, 0.31971280E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32804088E-07, 0.32950824E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 9, 0.42079698E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22886930E-07, 0.33961488E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15574926E-07, 0.35001549E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10403621E-07, 0.36069375E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.69435977E-08, 0.37163435E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 13, 0.41372910E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.48411870E-08, 0.38282303E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 14, 0.41230549E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.37782399E-08, 0.39424661E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 15, 0.41099507E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35145469E-08, 0.40589296E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 16, 0.40978759E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38787391E-08, 0.41775095E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 17, 0.40867375E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10359134E-07, 0.42981042E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 18, 0.40764524E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10661907E-07, 0.44209227E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 19, 0.40669459E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.65338810E-08, 0.45457878E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 20, 0.40581493E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.45767571E-07, 0.46724738E+05, + 0.672E+05, 0.600E+03, 1, 112, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 1, 0.44479920E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42999627E-05, 0.26859984E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 2, 0.44084909E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36584470E-06, 0.27609646E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 3, 0.43720663E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28780996E-06, 0.28401395E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 4, 0.43385463E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27504380E-06, 0.29237545E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 5, 0.43077493E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32104559E-06, 0.30112788E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 6, 0.42794819E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32351972E-06, 0.31024654E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 7, 0.42535524E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33311103E-06, 0.31971282E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 8, 0.42297743E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34882156E-06, 0.32950826E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 9, 0.42079699E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36963116E-06, 0.33961490E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 10, 0.41879709E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39461011E-06, 0.35001550E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 11, 0.41696201E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42290903E-06, 0.36069376E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 12, 0.41527717E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.45379698E-06, 0.37163436E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 13, 0.41372910E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.48664815E-06, 0.38282304E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 14, 0.41230549E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.52095631E-06, 0.39424662E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 15, 0.41099507E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.55625726E-06, 0.40589297E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 16, 0.40978760E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.59225763E-06, 0.41775096E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 17, 0.40867376E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.65509293E-06, 0.42981043E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 18, 0.40764525E+01, 0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.68480711E-06, 0.44209227E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 19, 0.40669459E+01, 0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.69381569E-06, 0.45457878E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 20, 0.40581493E+01, 0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39504885E-06, 0.46724738E+05, + 0.678E+05, 0.600E+03, 1, 113, 1, 21, 0.40500000E+01, 0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54607273E-07, 0.26859982E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11462228E-06, 0.27609643E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86226862E-07, 0.28401393E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60820746E-07, 0.29237543E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42977597E-07, 0.30112786E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27565015E-07, 0.31024652E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15120481E-07, 0.31971280E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53202065E-08, 0.32950824E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22291822E-08, 0.33961488E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78889784E-08, 0.35001549E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12013569E-07, 0.36069375E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14906593E-07, 0.37163435E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16823655E-07, 0.38282303E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17979509E-07, 0.39424661E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18559920E-07, 0.40589296E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18691647E-07, 0.41775095E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16547684E-07, 0.42981042E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16688791E-07, 0.44209227E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18183147E-07, 0.45457878E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17058598E-06, 0.46724738E+05, + 0.684E+05, 0.600E+03, 1, 114, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59716221E-07, 0.26859982E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11188839E-06, 0.27609643E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84311342E-07, 0.28401393E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59610556E-07, 0.29237543E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42297760E-07, 0.30112786E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27234861E-07, 0.31024652E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15043874E-07, 0.31971280E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54291895E-08, 0.32950824E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19907347E-08, 0.33961488E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.75712983E-08, 0.35001549E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11620450E-07, 0.36069375E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14496703E-07, 0.37163435E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16375171E-07, 0.38282303E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17537239E-07, 0.39424661E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18109422E-07, 0.40589296E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18248457E-07, 0.41775095E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16063485E-07, 0.42981042E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16219445E-07, 0.44209227E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17752431E-07, 0.45457878E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12559145E-07, 0.46724738E+05, + 0.690E+05, 0.600E+03, 1, 115, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98411613E-06, 0.26859981E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 2, 0.44084906E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13895296E-06, 0.27609643E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 3, 0.43720661E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10896192E-06, 0.28401392E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 4, 0.43385461E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.79535315E-07, 0.29237543E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 5, 0.43077491E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.49040210E-07, 0.30112785E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 6, 0.42794817E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39364963E-07, 0.31024651E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 7, 0.42535522E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34281328E-07, 0.31971279E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 8, 0.42297741E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32227177E-07, 0.32950823E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 9, 0.42079697E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32074720E-07, 0.33961487E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 10, 0.41879707E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33103010E-07, 0.35001548E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34819454E-07, 0.36069374E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 12, 0.41527715E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36841676E-07, 0.37163434E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 13, 0.41372909E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39045108E-07, 0.38282302E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 14, 0.41230548E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.41222897E-07, 0.39424661E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 15, 0.41099506E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.43350106E-07, 0.40589295E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.45374673E-07, 0.41775095E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31297077E-07, 0.42981042E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33075576E-07, 0.44209226E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 19, 0.40669458E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50302145E-07, 0.45457877E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 20, 0.40581492E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999944E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56383062E-04, 0.46724737E+05, + 0.696E+05, 0.600E+03, 1, 116, 1, 21, 0.40500000E+01, 0.19999944E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999944E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28571131E-06, 0.26859982E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61053314E-08, 0.27609644E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14814681E-07, 0.28401393E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16994370E-07, 0.29237543E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14232779E-07, 0.30112786E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13712782E-07, 0.31024652E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12218518E-07, 0.31971280E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10096802E-07, 0.32950824E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76353999E-08, 0.33961488E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50240594E-08, 0.35001549E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23992435E-08, 0.36069375E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12661872E-09, 0.37163435E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25336675E-08, 0.38282303E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.47626827E-08, 0.39424661E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.68186807E-08, 0.40589296E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.87051717E-08, 0.41775095E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11608286E-07, 0.42981042E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12743968E-07, 0.44209227E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12841234E-07, 0.45457878E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20560714E-06, 0.46724738E+05, + 0.702E+05, 0.600E+03, 1, 117, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23257072E-05, 0.26859981E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 2, 0.44084906E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73297518E-06, 0.27609643E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 3, 0.43720660E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67572210E-06, 0.28401392E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 4, 0.43385461E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60688039E-06, 0.29237542E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 5, 0.43077490E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52429225E-06, 0.30112785E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 6, 0.42794817E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49897103E-06, 0.31024651E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 7, 0.42535521E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48643016E-06, 0.31971279E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 8, 0.42297741E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48374967E-06, 0.32950823E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 9, 0.42079697E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48878681E-06, 0.33961487E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 10, 0.41879707E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49996073E-06, 0.35001548E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 11, 0.41696200E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51612701E-06, 0.36069374E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 12, 0.41527715E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53630458E-06, 0.37163434E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 13, 0.41372909E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55986833E-06, 0.38282302E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 14, 0.41230548E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58620193E-06, 0.39424661E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 15, 0.41099506E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61487692E-06, 0.40589295E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 16, 0.40978759E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64554848E-06, 0.41775095E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 17, 0.40867375E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62251989E-06, 0.42981042E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 18, 0.40764524E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65390057E-06, 0.44209227E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 19, 0.40669459E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74166506E-06, 0.45457877E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 20, 0.40581493E+01, 0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52462426E-05, 0.46724738E+05, + 0.708E+05, 0.600E+03, 1, 118, 1, 21, 0.40500000E+01, 0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999987E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16988350E-05, 0.26859981E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 2, 0.44084906E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75607500E-06, 0.27609643E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 3, 0.43720660E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69263355E-06, 0.28401392E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 4, 0.43385461E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62634736E-06, 0.29237542E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 5, 0.43077490E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55274966E-06, 0.30112785E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 6, 0.42794817E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52928089E-06, 0.31024651E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 7, 0.42535521E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51881177E-06, 0.31971279E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 8, 0.42297741E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51835633E-06, 0.32950823E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 9, 0.42079697E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52570760E-06, 0.33961487E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 10, 0.41879707E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53924268E-06, 0.35001548E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 11, 0.41696199E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55776967E-06, 0.36069374E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 12, 0.41527715E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58030860E-06, 0.37163434E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 13, 0.41372909E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60615516E-06, 0.38282302E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 14, 0.41230548E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63473871E-06, 0.39424661E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 15, 0.41099506E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66556090E-06, 0.40589295E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 16, 0.40978759E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69832091E-06, 0.41775095E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 17, 0.40867375E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.68065074E-06, 0.42981042E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 18, 0.40764524E+01, 0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.71311156E-06, 0.44209227E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 19, 0.40669459E+01, 0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79917334E-06, 0.45457877E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 20, 0.40581493E+01, 0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15185014E-05, 0.46724738E+05, + 0.714E+05, 0.600E+03, 1, 119, 1, 21, 0.40500000E+01, 0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64439071E-06, 0.26859980E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 2, 0.44084906E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81682071E-06, 0.27609642E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 3, 0.43720660E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73921069E-06, 0.28401391E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 4, 0.43385460E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67421589E-06, 0.29237542E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 5, 0.43077490E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61383466E-06, 0.30112784E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 6, 0.42794816E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59219584E-06, 0.31024650E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 7, 0.42535521E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58435034E-06, 0.31971278E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 8, 0.42297741E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58709167E-06, 0.32950823E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 9, 0.42079696E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59806870E-06, 0.33961486E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 10, 0.41879707E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61553114E-06, 0.35001547E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 11, 0.41696199E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63816551E-06, 0.36069373E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 12, 0.41527715E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66492566E-06, 0.37163433E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 13, 0.41372909E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69501628E-06, 0.38282302E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 14, 0.41230548E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72784229E-06, 0.39424660E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 15, 0.41099506E+01, 0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76285836E-06, 0.40589295E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 16, 0.40978758E+01, 0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79970583E-06, 0.41775094E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 17, 0.40867375E+01, 0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79194075E-06, 0.42981042E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 18, 0.40764524E+01, 0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999989E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.82687725E-06, 0.44209227E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 19, 0.40669459E+01, 0.19999989E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999988E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91057995E-06, 0.45457877E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 20, 0.40581493E+01, 0.19999988E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33929353E-05, 0.46724738E+05, + 0.720E+05, 0.600E+03, 1, 120, 1, 21, 0.40500000E+01, 0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999985E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 1, 0.44479916E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38355591E-06, 0.26859980E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 2, 0.44084905E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78501257E-06, 0.27609642E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 3, 0.43720660E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70666275E-06, 0.28401391E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 4, 0.43385460E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64414571E-06, 0.29237541E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 5, 0.43077490E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58928043E-06, 0.30112784E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 6, 0.42794816E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56883272E-06, 0.31024650E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 7, 0.42535521E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56180833E-06, 0.31971278E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 8, 0.42297741E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56509321E-06, 0.32950822E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 9, 0.42079696E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57640078E-06, 0.33961486E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 10, 0.41879707E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59402143E-06, 0.35001547E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 11, 0.41696199E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61669080E-06, 0.36069373E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 12, 0.41527715E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64337864E-06, 0.37163433E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 13, 0.41372909E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67332515E-06, 0.38282302E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 14, 0.41230548E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70594468E-06, 0.39424660E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 15, 0.41099506E+01, 0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74070473E-06, 0.40589295E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 16, 0.40978758E+01, 0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77726676E-06, 0.41775094E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 17, 0.40867375E+01, 0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77364090E-06, 0.42981042E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 18, 0.40764524E+01, 0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999989E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80826935E-06, 0.44209226E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 19, 0.40669459E+01, 0.19999989E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999988E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88726336E-06, 0.45457877E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 20, 0.40581492E+01, 0.19999988E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999961E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27452709E-04, 0.46724737E+05, + 0.726E+05, 0.600E+03, 1, 121, 1, 21, 0.40500000E+01, 0.19999961E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999961E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13225640E-06, 0.26859982E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17323145E-06, 0.27609644E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14200111E-06, 0.28401393E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10837998E-06, 0.29237543E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.81117200E-07, 0.30112786E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.58983822E-07, 0.31024652E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40418982E-07, 0.31971280E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25211190E-07, 0.32950824E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12997454E-07, 0.33961488E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 10, 0.41879708E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33636276E-08, 0.35001549E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 11, 0.41696200E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41020805E-08, 0.36069375E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 12, 0.41527716E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97725561E-08, 0.37163435E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13982316E-07, 0.38282303E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17012798E-07, 0.39424661E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19098749E-07, 0.40589296E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20444379E-07, 0.41775095E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19721472E-07, 0.42981042E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20642766E-07, 0.44209227E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22256856E-07, 0.45457878E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.55863109E-05, 0.46724738E+05, + 0.732E+05, 0.600E+03, 1, 122, 1, 21, 0.40500000E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81190986E-07, 0.26859982E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15055645E-06, 0.27609644E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12452539E-06, 0.28401393E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.95878885E-07, 0.29237543E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.72671074E-07, 0.30112786E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.53141079E-07, 0.31024652E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36569940E-07, 0.31971280E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22861858E-07, 0.32950824E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11780958E-07, 0.33961488E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29683953E-08, 0.35001549E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38781138E-08, 0.36069375E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91253760E-08, 0.37163435E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13013498E-07, 0.38282303E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15844613E-07, 0.39424661E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17797579E-07, 0.40589296E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19052507E-07, 0.41775095E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17949539E-07, 0.42981042E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18840375E-07, 0.44209227E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20820206E-07, 0.45457878E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11924087E-05, 0.46724738E+05, + 0.738E+05, 0.600E+03, 1, 123, 1, 21, 0.40500000E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31517104E-06, 0.26859982E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70412405E-08, 0.27609644E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.90444274E-08, 0.28401393E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.96162367E-08, 0.29237543E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12195922E-07, 0.30112786E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.86301277E-08, 0.31024652E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.43879780E-08, 0.31971280E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.53912430E-10, 0.32950824E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40140620E-08, 0.33961488E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76569719E-08, 0.35001549E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10769448E-07, 0.36069375E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13376187E-07, 0.37163435E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15474516E-07, 0.38282303E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17142806E-07, 0.39424661E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18420241E-07, 0.40589296E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19355120E-07, 0.41775095E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14159419E-07, 0.42981042E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14964574E-07, 0.44209227E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21081345E-07, 0.45457878E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.74939241E-07, 0.46724738E+05, + 0.744E+05, 0.600E+03, 1, 124, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.62334261E-06, 0.26859982E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 2, 0.44084907E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.99235343E-07, 0.27609644E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 3, 0.43720661E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10694824E-06, 0.28401393E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98397376E-07, 0.29237543E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80320984E-07, 0.30112786E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70907827E-07, 0.31024652E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62278893E-07, 0.31971280E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54916935E-07, 0.32950824E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48971465E-07, 0.33961488E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44333827E-07, 0.35001549E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40916138E-07, 0.36069375E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38501149E-07, 0.37163435E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36947938E-07, 0.38282303E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36060079E-07, 0.39424661E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35706275E-07, 0.40589296E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35826872E-07, 0.41775095E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27325360E-07, 0.42981042E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27597373E-07, 0.44209227E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36885492E-07, 0.45457878E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19519631E-05, 0.46724738E+05, + 0.750E+05, 0.600E+03, 1, 125, 1, 21, 0.40500000E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.71292519E-08, 0.26859982E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.46316980E-07, 0.27609644E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31152986E-07, 0.28401393E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18960556E-07, 0.29237543E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10976965E-07, 0.30112786E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.51306905E-08, 0.31024652E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.98435393E-09, 0.31971280E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18826505E-08, 0.32950824E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38162469E-08, 0.33961488E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50836029E-08, 0.35001549E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58783201E-08, 0.36069375E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63474488E-08, 0.37163435E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65892003E-08, 0.38282303E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66792936E-08, 0.39424661E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66628587E-08, 0.40589296E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65770465E-08, 0.41775095E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61005814E-08, 0.42981042E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59997447E-08, 0.44209227E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60976753E-08, 0.45457878E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70997332E-06, 0.46724738E+05, + 0.756E+05, 0.600E+03, 1, 126, 1, 21, 0.40500000E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32954070E-07, 0.26859982E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21297062E-08, 0.27609644E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22326461E-08, 0.28401393E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44697472E-08, 0.29237543E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.56475038E-08, 0.30112786E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.55783467E-08, 0.31024652E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50943285E-08, 0.31971280E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44405191E-08, 0.32950824E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.37670418E-08, 0.33961488E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31145255E-08, 0.35001549E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25469085E-08, 0.36069375E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20539765E-08, 0.37163435E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16577424E-08, 0.38282303E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13257591E-08, 0.39424661E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10692496E-08, 0.40589296E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.86366114E-09, 0.41775095E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14461179E-08, 0.42981042E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12968648E-08, 0.44209227E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.48372328E-09, 0.45457878E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26005360E-07, 0.46724738E+05, + 0.762E+05, 0.600E+03, 1, 127, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33245122E-07, 0.26859982E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25460487E-08, 0.27609644E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17761401E-08, 0.28401393E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40240025E-08, 0.29237543E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.52288200E-08, 0.30112786E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.51732982E-08, 0.31024652E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.47113886E-08, 0.31971280E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40708237E-08, 0.32950824E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34054253E-08, 0.33961488E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27627500E-08, 0.35001549E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21999043E-08, 0.36069375E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17095694E-08, 0.37163435E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13052137E-08, 0.38282303E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.98071951E-09, 0.39424661E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70792083E-09, 0.40589296E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.51016258E-09, 0.41775095E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11003642E-08, 0.42981042E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.94856389E-09, 0.44209227E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11335288E-09, 0.45457878E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.67240641E-07, 0.46724738E+05, + 0.768E+05, 0.600E+03, 1, 128, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33001569E-07, 0.26859982E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26309905E-08, 0.27609644E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16950317E-08, 0.28401393E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39485819E-08, 0.29237543E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.51574531E-08, 0.30112786E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.51122946E-08, 0.31024652E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.46503494E-08, 0.31971280E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40216435E-08, 0.32950824E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33558116E-08, 0.33961488E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27165328E-08, 0.35001549E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21592115E-08, 0.36069375E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16645316E-08, 0.37163435E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12684893E-08, 0.38282303E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.94423669E-09, 0.39424661E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.66275518E-09, 0.40589296E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.47758775E-09, 0.41775095E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10549925E-08, 0.42981042E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.90673780E-09, 0.44209227E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.67920780E-10, 0.45457878E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48277187E-08, 0.46724738E+05, + 0.774E+05, 0.600E+03, 1, 129, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34540211E-07, 0.26859982E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30796521E-08, 0.27609644E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11760264E-08, 0.28401393E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34342982E-08, 0.29237543E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.46985598E-08, 0.30112786E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.46819792E-08, 0.31024652E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42519908E-08, 0.31971280E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36502392E-08, 0.32950824E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30081857E-08, 0.33961488E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23938043E-08, 0.35001549E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18427073E-08, 0.36069375E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13605046E-08, 0.37163435E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.97522701E-09, 0.38282303E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.65167782E-09, 0.39424661E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36864023E-09, 0.40589296E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19085888E-09, 0.41775095E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78352613E-09, 0.42981042E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64490990E-09, 0.44209227E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23211300E-09, 0.45457878E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14193969E-07, 0.46724738E+05, + 0.780E+05, 0.600E+03, 1, 130, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34237800E-07, 0.26859982E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30784619E-08, 0.27609644E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11880026E-08, 0.28401393E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34521328E-08, 0.29237543E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.47116124E-08, 0.30112786E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.46969362E-08, 0.31024652E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42664148E-08, 0.31971280E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36669014E-08, 0.32950824E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30225742E-08, 0.33961488E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24060363E-08, 0.35001549E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18625350E-08, 0.36069375E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13755077E-08, 0.37163435E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.98717123E-09, 0.38282303E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.66506445E-09, 0.39424661E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38608405E-09, 0.40589296E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20780888E-09, 0.41775095E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.79484863E-09, 0.42981042E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.65429973E-09, 0.44209227E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22213698E-09, 0.45457878E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67585233E-07, 0.46724738E+05, + 0.786E+05, 0.600E+03, 1, 131, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.46429715E-07, 0.26859982E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32860221E-08, 0.27609644E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.61103833E-09, 0.28401393E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28302374E-08, 0.29237543E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42634802E-08, 0.30112786E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.43120245E-08, 0.31024652E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39483936E-08, 0.31971280E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34268304E-08, 0.32950824E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28452725E-08, 0.33961488E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22992310E-08, 0.35001549E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18075426E-08, 0.36069375E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13758878E-08, 0.37163435E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10244712E-08, 0.38282303E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.73705309E-09, 0.39424661E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50681592E-09, 0.40589296E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34000891E-09, 0.41775095E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10697327E-08, 0.42981042E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.95244346E-09, 0.44209227E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27874592E-10, 0.45457878E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28972940E-06, 0.46724738E+05, + 0.792E+05, 0.600E+03, 1, 132, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50642740E-07, 0.26859982E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41193147E-08, 0.27609644E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42678394E-09, 0.28401393E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17978614E-08, 0.29237543E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33415404E-08, 0.30112786E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34723335E-08, 0.31024652E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31894842E-08, 0.31971280E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27437004E-08, 0.32950824E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22335556E-08, 0.33961488E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17372308E-08, 0.35001549E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13036612E-08, 0.36069375E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89205443E-09, 0.37163435E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.58768634E-09, 0.38282303E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30388136E-09, 0.39424661E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10868106E-09, 0.40589296E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65799810E-10, 0.41775095E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.72942186E-09, 0.42981042E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.61488592E-09, 0.44209227E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40068571E-09, 0.45457878E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18836616E-07, 0.46724738E+05, + 0.798E+05, 0.600E+03, 1, 133, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50431993E-07, 0.26859982E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 2, 0.44084907E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41210804E-08, 0.27609644E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41860559E-09, 0.28401393E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18088855E-08, 0.29237543E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33505643E-08, 0.30112786E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34888430E-08, 0.31024652E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32052228E-08, 0.31971280E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27571403E-08, 0.32950824E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 9, 0.42079698E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22503102E-08, 0.33961488E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17578223E-08, 0.35001549E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 11, 0.41696200E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13214425E-08, 0.36069375E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 12, 0.41527716E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.91289110E-09, 0.37163435E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 13, 0.41372910E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.60660810E-09, 0.38282303E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 14, 0.41230549E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32159164E-09, 0.39424661E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 15, 0.41099507E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13579182E-09, 0.40589296E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 16, 0.40978759E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48423487E-10, 0.41775095E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 17, 0.40867375E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.75381834E-09, 0.42981042E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 18, 0.40764524E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.62339822E-09, 0.44209227E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 19, 0.40669459E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38132697E-09, 0.45457878E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 20, 0.40581493E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.83779497E-07, 0.46724738E+05, + 0.804E+05, 0.600E+03, 1, 134, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.63701178E-06, 0.26859982E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 2, 0.44084907E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16726707E-06, 0.27609643E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 3, 0.43720661E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16270821E-06, 0.28401393E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 4, 0.43385462E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14777170E-06, 0.29237543E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 5, 0.43077491E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12609831E-06, 0.30112786E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11726710E-06, 0.31024652E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11083464E-06, 0.31971280E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 8, 0.42297742E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10666886E-06, 0.32950824E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 9, 0.42079697E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10443840E-06, 0.33961488E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 10, 0.41879708E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10384223E-06, 0.35001549E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 11, 0.41696200E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10462925E-06, 0.36069375E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 12, 0.41527716E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10645316E-06, 0.37163435E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 13, 0.41372909E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10924207E-06, 0.38282303E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 14, 0.41230548E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11268628E-06, 0.39424661E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 15, 0.41099507E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11678236E-06, 0.40589296E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 16, 0.40978759E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12125748E-06, 0.41775095E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 17, 0.40867375E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11446519E-06, 0.42981042E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 18, 0.40764524E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11929625E-06, 0.44209227E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 19, 0.40669459E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13591370E-06, 0.45457878E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 20, 0.40581493E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.90663651E-06, 0.46724738E+05, + 0.810E+05, 0.600E+03, 1, 135, 1, 21, 0.40500000E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 1, 0.44479916E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10171041E-04, 0.26859979E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 2, 0.44084905E+01, 0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11602494E-05, 0.27609641E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 3, 0.43720659E+01, 0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10588164E-05, 0.28401391E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 4, 0.43385460E+01, 0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.85073834E-06, 0.29237541E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 5, 0.43077490E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.56396899E-06, 0.30112784E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 6, 0.42794817E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44374171E-06, 0.31024651E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 7, 0.42535521E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34275916E-06, 0.31971279E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 8, 0.42297741E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25648793E-06, 0.32950823E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 9, 0.42079697E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18159712E-06, 0.33961487E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 10, 0.41879707E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11559655E-06, 0.35001548E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 11, 0.41696200E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.56561863E-07, 0.36069374E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 12, 0.41527715E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31403715E-08, 0.37163434E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 13, 0.41372909E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45868500E-07, 0.38282302E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 14, 0.41230548E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91197883E-07, 0.39424661E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 15, 0.41099506E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13363681E-06, 0.40589296E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 16, 0.40978759E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17353939E-06, 0.41775095E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 17, 0.40867375E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31974010E-06, 0.42981042E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 18, 0.40764524E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34809191E-06, 0.44209227E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 19, 0.40669459E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27472325E-06, 0.45457877E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 20, 0.40581493E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.48493726E-05, 0.46724738E+05, + 0.816E+05, 0.600E+03, 1, 136, 1, 21, 0.40500000E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 1, 0.44479915E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10284988E-04, 0.26859979E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 2, 0.44084905E+01, 0.19999990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10701967E-05, 0.27609641E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 3, 0.43720659E+01, 0.19999991E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10133603E-05, 0.28401390E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 4, 0.43385460E+01, 0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.83729693E-06, 0.29237541E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 5, 0.43077489E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.56906246E-06, 0.30112784E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 6, 0.42794816E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.46415282E-06, 0.31024650E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 7, 0.42535521E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.37492458E-06, 0.31971278E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 8, 0.42297741E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29789670E-06, 0.32950823E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 9, 0.42079697E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23046515E-06, 0.33961486E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 10, 0.41879707E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17066102E-06, 0.35001547E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 11, 0.41696199E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11692183E-06, 0.36069374E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 12, 0.41527715E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.68157764E-07, 0.37163434E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 13, 0.41372909E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23336746E-07, 0.38282302E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 14, 0.41230548E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18134294E-07, 0.39424660E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 15, 0.41099506E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56968929E-07, 0.40589295E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 16, 0.40978758E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.93438121E-07, 0.41775094E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 17, 0.40867375E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24352524E-06, 0.42981042E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 18, 0.40764524E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26930026E-06, 0.44209226E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 19, 0.40669458E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18610857E-06, 0.45457877E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 20, 0.40581492E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999950E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44423773E-04, 0.46724737E+05, + 0.822E+05, 0.600E+03, 1, 137, 1, 21, 0.40500000E+01, 0.19999950E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999950E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37094594E-07, 0.26859981E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 2, 0.44084906E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52055893E-06, 0.27609643E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 3, 0.43720661E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38995022E-06, 0.28401392E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 4, 0.43385461E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28487045E-06, 0.29237543E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 5, 0.43077491E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21827551E-06, 0.30112785E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 6, 0.42794817E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16691186E-06, 0.31024652E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 7, 0.42535522E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12766317E-06, 0.31971280E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 8, 0.42297742E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97717862E-07, 0.32950824E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 9, 0.42079697E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74915736E-07, 0.33961487E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 10, 0.41879708E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57573821E-07, 0.35001548E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 11, 0.41696200E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44400771E-07, 0.36069374E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 12, 0.41527716E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34410323E-07, 0.37163434E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 13, 0.41372909E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26837057E-07, 0.38282303E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 14, 0.41230548E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21099851E-07, 0.39424661E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 15, 0.41099507E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16761071E-07, 0.40589296E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 16, 0.40978759E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13466973E-07, 0.41775095E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 17, 0.40867375E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30351664E-07, 0.42981042E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 18, 0.40764524E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30183845E-07, 0.44209227E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 19, 0.40669459E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10976535E-07, 0.45457878E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 20, 0.40581493E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22230806E-05, 0.46724738E+05, + 0.828E+05, 0.600E+03, 1, 138, 1, 21, 0.40500000E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38828561E-06, 0.26859981E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 2, 0.44084906E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50002076E-06, 0.27609643E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 3, 0.43720660E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37275811E-06, 0.28401392E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 4, 0.43385461E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27413228E-06, 0.29237543E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 5, 0.43077491E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21594821E-06, 0.30112785E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 6, 0.42794817E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16773423E-06, 0.31024651E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 7, 0.42535522E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13105629E-06, 0.31971279E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 8, 0.42297742E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10323954E-06, 0.32950824E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 9, 0.42079697E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.82267185E-07, 0.33961487E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 10, 0.41879708E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66506157E-07, 0.35001548E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 11, 0.41696200E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54758498E-07, 0.36069374E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 12, 0.41527715E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46030799E-07, 0.37163434E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 13, 0.41372909E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39623156E-07, 0.38282303E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 14, 0.41230548E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34946378E-07, 0.39424661E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 15, 0.41099507E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31616846E-07, 0.40589296E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 16, 0.40978759E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29222736E-07, 0.41775095E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 17, 0.40867375E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49373842E-07, 0.42981042E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 18, 0.40764524E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49623257E-07, 0.44209227E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 19, 0.40669459E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28730835E-07, 0.45457878E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 20, 0.40581493E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14348319E-05, 0.46724738E+05, + 0.834E+05, 0.600E+03, 1, 139, 1, 21, 0.40500000E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 1, 0.44479916E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32513541E-05, 0.26859980E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 2, 0.44084905E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49578237E-06, 0.27609642E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 3, 0.43720660E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36327720E-06, 0.28401391E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 4, 0.43385460E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29449925E-06, 0.29237541E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 5, 0.43077490E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29217392E-06, 0.30112784E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 6, 0.42794816E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26298990E-06, 0.31024650E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 7, 0.42535521E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24435385E-06, 0.31971279E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 8, 0.42297741E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23388615E-06, 0.32950823E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 9, 0.42079697E+01, 0.19999995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22974974E-06, 0.33961487E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 10, 0.41879707E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23040559E-06, 0.35001548E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 11, 0.41696199E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23470192E-06, 0.36069374E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 12, 0.41527715E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24164813E-06, 0.37163434E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 13, 0.41372909E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25057890E-06, 0.38282302E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 14, 0.41230548E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26085235E-06, 0.39424661E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 15, 0.41099506E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27212553E-06, 0.40589296E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 16, 0.40978759E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28393595E-06, 0.41775095E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 17, 0.40867375E+01, 0.19999993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33621561E-06, 0.42981042E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 18, 0.40764524E+01, 0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34627007E-06, 0.44209227E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 19, 0.40669459E+01, 0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31947204E-06, 0.45457877E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 20, 0.40581493E+01, 0.19999992E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.73444756E-05, 0.46724738E+05, + 0.840E+05, 0.600E+03, 1, 140, 1, 21, 0.40500000E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 1, 0.44479917E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15004762E-05, 0.26859981E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 2, 0.44084906E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16422248E-07, 0.27609643E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 3, 0.43720660E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43303405E-07, 0.28401392E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 4, 0.43385461E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73560432E-07, 0.29237542E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 5, 0.43077490E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11129712E-06, 0.30112785E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 6, 0.42794817E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12228717E-06, 0.31024651E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 7, 0.42535521E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12845578E-06, 0.31971279E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 8, 0.42297741E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13145038E-06, 0.32950823E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 9, 0.42079697E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13241884E-06, 0.33961487E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 10, 0.41879707E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13212897E-06, 0.35001548E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 11, 0.41696200E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13110218E-06, 0.36069374E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 12, 0.41527715E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12970290E-06, 0.37163434E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 13, 0.41372909E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12811938E-06, 0.38282303E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 14, 0.41230548E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12651511E-06, 0.39424661E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 15, 0.41099506E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12495841E-06, 0.40589296E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 16, 0.40978759E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12351351E-06, 0.41775095E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 17, 0.40867375E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14897802E-06, 0.42981042E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 18, 0.40764524E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14837902E-06, 0.44209227E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 19, 0.40669459E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12149840E-06, 0.45457877E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 20, 0.40581493E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25225459E-05, 0.46724738E+05, + 0.846E+05, 0.600E+03, 1, 141, 1, 21, 0.40500000E+01, 0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999994E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39532767E-05, 0.26859983E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 2, 0.44084908E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13243464E-05, 0.27609645E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 3, 0.43720662E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12102021E-05, 0.28401394E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 4, 0.43385463E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10692520E-05, 0.29237545E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 5, 0.43077492E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.90850926E-06, 0.30112787E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 6, 0.42794819E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.84231059E-06, 0.31024654E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 7, 0.42535523E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.79823253E-06, 0.31971281E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 8, 0.42297743E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.77177347E-06, 0.32950826E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 9, 0.42079699E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.75925239E-06, 0.33961489E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 10, 0.41879709E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.75772156E-06, 0.35001550E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 11, 0.41696201E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.76477880E-06, 0.36069376E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 12, 0.41527717E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.77851979E-06, 0.37163436E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 13, 0.41372910E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.79743419E-06, 0.38282304E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 14, 0.41230549E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.82030543E-06, 0.39424662E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 15, 0.41099507E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.84616066E-06, 0.40589297E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 16, 0.40978760E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.87423445E-06, 0.41775096E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 17, 0.40867376E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.81469610E-06, 0.42981043E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 18, 0.40764525E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.84150173E-06, 0.44209228E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 19, 0.40669459E+01, 0.20000011E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.95884589E-06, 0.45457878E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 20, 0.40581493E+01, 0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.81372752E-05, 0.46724738E+05, + 0.852E+05, 0.600E+03, 1, 142, 1, 21, 0.40500000E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 1, 0.44479918E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42411719E-05, 0.26859982E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 2, 0.44084907E+01, 0.19999996E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10964155E-05, 0.27609644E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 3, 0.43720661E+01, 0.19999997E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10153013E-05, 0.28401393E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 4, 0.43385462E+01, 0.19999998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89830041E-06, 0.29237544E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 5, 0.43077491E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.75229670E-06, 0.30112786E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 6, 0.42794818E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.69781634E-06, 0.31024653E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 7, 0.42535522E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.66197943E-06, 0.31971281E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 8, 0.42297742E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64104219E-06, 0.32950825E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 9, 0.42079698E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.63190802E-06, 0.33961488E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 10, 0.41879708E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.63210980E-06, 0.35001549E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 11, 0.41696201E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.63961692E-06, 0.36069375E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 12, 0.41527716E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.65283301E-06, 0.37163435E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 13, 0.41372910E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.67046728E-06, 0.38282303E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 14, 0.41230549E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.69149668E-06, 0.39424661E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 15, 0.41099507E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.71510781E-06, 0.40589296E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 16, 0.40978759E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.74061607E-06, 0.41775095E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 17, 0.40867375E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.68058974E-06, 0.42981042E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 18, 0.40764524E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70550677E-06, 0.44209227E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 19, 0.40669459E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.81785339E-06, 0.45457877E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 20, 0.40581492E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999960E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48951060E-04, 0.46724737E+05, + 0.858E+05, 0.600E+03, 1, 143, 1, 21, 0.40500000E+01, 0.19999960E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999960E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10978777E-05, 0.26859983E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 2, 0.44084908E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.76259254E-06, 0.27609645E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 3, 0.43720662E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.69297260E-06, 0.28401394E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.62366908E-06, 0.29237544E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.55245262E-06, 0.30112787E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.52310268E-06, 0.31024653E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50736961E-06, 0.31971281E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 8, 0.42297743E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50255249E-06, 0.32950825E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 9, 0.42079698E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50637711E-06, 0.33961489E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 10, 0.41879709E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.51698343E-06, 0.35001550E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 11, 0.41696201E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.53285341E-06, 0.36069376E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 12, 0.41527716E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.55278671E-06, 0.37163436E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 13, 0.41372910E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.57576960E-06, 0.38282304E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 14, 0.41230549E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.60105000E-06, 0.39424662E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 15, 0.41099507E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.62800505E-06, 0.40589297E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 16, 0.40978759E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.65611673E-06, 0.41775096E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 17, 0.40867375E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.63521273E-06, 0.42981043E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 18, 0.40764524E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.66007385E-06, 0.44209227E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 19, 0.40669459E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.73671965E-06, 0.45457878E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 20, 0.40581493E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33758073E-05, 0.46724738E+05, + 0.864E+05, 0.600E+03, 1, 144, 1, 21, 0.40500000E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14551915E-10, 0.10978711E-05, 0.26859983E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 2, 0.44084908E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17219766E-10,-0.76260441E-06, 0.27609645E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 3, 0.43720662E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22179544E-10,-0.69298794E-06, 0.28401394E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29055324E-10,-0.62369024E-06, 0.29237544E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39520576E-10,-0.55248097E-06, 0.30112787E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53769327E-10,-0.52314324E-06, 0.31024653E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72735323E-10,-0.50742442E-06, 0.31971281E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 8, 0.42297743E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97425072E-10,-0.50262716E-06, 0.32950825E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 9, 0.42079698E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12917250E-09,-0.50647939E-06, 0.33961489E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 10, 0.41879709E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16943280E-09,-0.51711759E-06, 0.35001550E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 11, 0.41696201E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21992795E-09,-0.53303199E-06, 0.36069376E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 12, 0.41527716E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28264670E-09,-0.55301997E-06, 0.37163436E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 13, 0.41372910E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35974760E-09,-0.57606709E-06, 0.38282304E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 14, 0.41230549E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45360745E-09,-0.60143187E-06, 0.39424662E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 15, 0.41099507E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56684560E-09,-0.62848698E-06, 0.40589297E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 16, 0.40978759E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70246945E-09,-0.65671801E-06, 0.41775096E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 17, 0.40867375E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86353490E-09,-0.63595609E-06, 0.42981043E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 18, 0.40764524E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10899870E-08,-0.66101678E-06, 0.44209227E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 19, 0.40669459E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13225508E-08,-0.73787974E-06, 0.45457878E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 20, 0.40581493E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15948171E-08, 0.34713897E-05, 0.46724738E+05, + 0.870E+05, 0.300E+03, 2, 1, 2, 21, 0.40500000E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15594802E-10, 0.10978524E-05, 0.26859983E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 2, 0.44084908E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18202021E-10,-0.76263583E-06, 0.27609645E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 3, 0.43720662E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23380077E-10,-0.69302907E-06, 0.28401394E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30753048E-10,-0.62374308E-06, 0.29237544E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42042908E-10,-0.55255163E-06, 0.30112787E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57395179E-10,-0.52324110E-06, 0.31024653E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77828493E-10,-0.50755663E-06, 0.31971281E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 8, 0.42297743E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10440999E-09,-0.50280596E-06, 0.32950825E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 9, 0.42079698E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13860699E-09,-0.50671720E-06, 0.33961489E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 10, 0.41879709E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18194745E-09,-0.51743462E-06, 0.35001550E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 11, 0.41696201E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23644437E-09,-0.53344180E-06, 0.36069376E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 12, 0.41527716E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30391675E-09,-0.55355284E-06, 0.37163436E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 13, 0.41372910E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38688692E-09,-0.57674851E-06, 0.38282304E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 14, 0.41230549E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48790146E-09,-0.60229450E-06, 0.39424662E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 15, 0.41099507E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60977375E-09,-0.62957251E-06, 0.40589297E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 16, 0.40978759E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75572946E-09,-0.65806569E-06, 0.41775096E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 17, 0.40867375E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.92906703E-09,-0.63761764E-06, 0.42981043E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 18, 0.40764524E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11726903E-08,-0.66311919E-06, 0.44209227E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 19, 0.40669459E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14229590E-08,-0.74044895E-06, 0.45457878E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 20, 0.40581493E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17158891E-08, 0.35725665E-05, 0.46724738E+05, + 0.876E+05, 0.300E+03, 2, 2, 2, 21, 0.40500000E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16771082E-10, 0.10978353E-05, 0.26859983E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 2, 0.44084908E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19317667E-10,-0.76267141E-06, 0.27609645E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 3, 0.43720662E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24811015E-10,-0.69307375E-06, 0.28401394E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32705429E-10,-0.62380088E-06, 0.29237544E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44856279E-10,-0.55262894E-06, 0.30112787E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61493968E-10,-0.52334545E-06, 0.31024653E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.83527993E-10,-0.50769962E-06, 0.31971281E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 8, 0.42297743E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11229228E-09,-0.50299786E-06, 0.32950825E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 9, 0.42079698E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14922989E-09,-0.50697483E-06, 0.33961489E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 10, 0.41879709E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19608706E-09,-0.51777331E-06, 0.35001550E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 11, 0.41696201E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25482829E-09,-0.53388545E-06, 0.36069376E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 12, 0.41527716E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32770913E-09,-0.55412429E-06, 0.37163436E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 13, 0.41372910E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41725192E-09,-0.57748436E-06, 0.38282304E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 14, 0.41230549E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52629427E-09,-0.60322317E-06, 0.39424662E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 15, 0.41099507E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65789209E-09,-0.63073880E-06, 0.40589297E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 16, 0.40978759E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81536806E-09,-0.65951914E-06, 0.41775096E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 17, 0.40867375E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10024572E-08,-0.63940254E-06, 0.42981043E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 18, 0.40764524E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12652890E-08,-0.66538284E-06, 0.44209227E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 19, 0.40669459E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15352513E-08,-0.74321279E-06, 0.45457878E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 20, 0.40581493E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18512704E-08, 0.36816489E-05, 0.46724738E+05, + 0.882E+05, 0.300E+03, 2, 3, 2, 21, 0.40500000E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18105008E-10, 0.10978207E-05, 0.26859983E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 2, 0.44084908E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20542454E-10,-0.76271255E-06, 0.27609645E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 3, 0.43720662E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26351093E-10,-0.69312295E-06, 0.28401394E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34876090E-10,-0.62386404E-06, 0.29237544E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48045573E-10,-0.55271194E-06, 0.30112787E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66029315E-10,-0.52345979E-06, 0.31024653E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.89942963E-10,-0.50785394E-06, 0.31971281E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 8, 0.42297743E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12112044E-09,-0.50320515E-06, 0.32950825E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 9, 0.42079698E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16113821E-09,-0.50725228E-06, 0.33961489E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 10, 0.41879709E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21187589E-09,-0.51813997E-06, 0.35001550E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 11, 0.41696201E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27549201E-09,-0.53436358E-06, 0.36069376E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 12, 0.41527716E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35446040E-09,-0.55474415E-06, 0.37163436E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 13, 0.41372910E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45144892E-09,-0.57827540E-06, 0.38282304E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 14, 0.41230549E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56946495E-09,-0.60422733E-06, 0.39424662E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 15, 0.41099507E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.71195245E-09,-0.63199748E-06, 0.40589297E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 16, 0.40978759E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88240389E-09,-0.66108754E-06, 0.41775096E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 17, 0.40867375E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10849423E-08,-0.64133045E-06, 0.42981043E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 18, 0.40764524E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13693837E-08,-0.66782529E-06, 0.44209227E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 19, 0.40669459E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16615377E-08,-0.74619489E-06, 0.45457878E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 20, 0.40581493E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20035077E-08, 0.37996160E-05, 0.46724738E+05, + 0.888E+05, 0.300E+03, 2, 4, 2, 21, 0.40500000E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19669339E-10, 0.10978089E-05, 0.26859983E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 2, 0.44084908E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21949139E-10,-0.76275966E-06, 0.27609645E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 3, 0.43720662E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28145829E-10,-0.69317731E-06, 0.28401394E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37349916E-10,-0.62393309E-06, 0.29237544E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51671426E-10,-0.55280225E-06, 0.30112787E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.71219498E-10,-0.52358344E-06, 0.31024653E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97243174E-10,-0.50802148E-06, 0.31971281E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 8, 0.42297743E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13116126E-09,-0.50342958E-06, 0.32950825E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 9, 0.42079698E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17464724E-09,-0.50755326E-06, 0.33961489E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 10, 0.41879709E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22979899E-09,-0.51853689E-06, 0.35001550E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 11, 0.41696201E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29899335E-09,-0.53488194E-06, 0.36069376E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 12, 0.41527716E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38475264E-09,-0.55541457E-06, 0.37163436E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 13, 0.41372910E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49015701E-09,-0.57913204E-06, 0.38282304E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 14, 0.41230549E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61838364E-09,-0.60531484E-06, 0.39424662E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 15, 0.41099507E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77314326E-09,-0.63336174E-06, 0.40589297E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 16, 0.40978759E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.95836488E-09,-0.66278578E-06, 0.41775096E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 17, 0.40867375E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11782928E-08,-0.64341729E-06, 0.42981043E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 18, 0.40764524E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14872300E-08,-0.67046989E-06, 0.44209227E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 19, 0.40669459E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18045345E-08,-0.74942265E-06, 0.45457878E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 20, 0.40581493E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21758751E-08, 0.39276233E-05, 0.46724738E+05, + 0.894E+05, 0.300E+03, 2, 5, 2, 21, 0.40500000E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21367062E-10, 0.10977993E-05, 0.26859983E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 2, 0.44084908E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23598356E-10,-0.76281224E-06, 0.27609645E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 3, 0.43720662E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30146718E-10,-0.69323844E-06, 0.28401394E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40211792E-10,-0.62400860E-06, 0.29237544E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55818721E-10,-0.55290115E-06, 0.30112787E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77185784E-10,-0.52371751E-06, 0.31024653E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10556202E-09,-0.50820355E-06, 0.31971281E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 8, 0.42297743E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14256026E-09,-0.50367422E-06, 0.32950825E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 9, 0.42079698E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19004801E-09,-0.50788043E-06, 0.33961489E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 10, 0.41879709E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25024444E-09,-0.51896892E-06, 0.35001550E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 11, 0.41696201E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32572037E-09,-0.53544414E-06, 0.36069376E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 12, 0.41527716E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41928918E-09,-0.55614398E-06, 0.37163436E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 13, 0.41372910E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53424931E-09,-0.58006392E-06, 0.38282304E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 14, 0.41230549E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67409322E-09,-0.60649662E-06, 0.39424662E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 15, 0.41099507E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84289544E-09,-0.63484460E-06, 0.40589297E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 16, 0.40978759E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10448760E-08,-0.66463180E-06, 0.41775096E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 17, 0.40867375E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12847401E-08,-0.64568302E-06, 0.42981043E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 18, 0.40764524E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16215684E-08,-0.67334464E-06, 0.44209227E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 19, 0.40669459E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19674917E-08,-0.75293280E-06, 0.45457878E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 20, 0.40581493E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23723987E-08, 0.40670655E-05, 0.46724738E+05, + 0.900E+05, 0.300E+03, 2, 6, 2, 21, 0.40500000E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23331571E-10, 0.10977924E-05, 0.26859983E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 2, 0.44084908E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25453725E-10,-0.76287173E-06, 0.27609645E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 3, 0.43720662E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32535657E-10,-0.69330596E-06, 0.28401394E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43485973E-10,-0.62409146E-06, 0.29237544E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60572347E-10,-0.55300992E-06, 0.30112787E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84000931E-10,-0.52386419E-06, 0.31024653E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11508140E-09,-0.50840294E-06, 0.31971281E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 8, 0.42297743E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15568124E-09,-0.50394140E-06, 0.32950825E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 9, 0.42079698E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20777710E-09,-0.50823720E-06, 0.33961489E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 10, 0.41879709E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27377003E-09,-0.51943910E-06, 0.35001550E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 11, 0.41696201E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35644916E-09,-0.53606028E-06, 0.36069376E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 12, 0.41527716E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45901591E-09,-0.55693826E-06, 0.37163436E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 13, 0.41372910E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58491423E-09,-0.58108080E-06, 0.38282304E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 14, 0.41230549E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73814590E-09,-0.60778637E-06, 0.39424662E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 15, 0.41099507E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.92300373E-09,-0.63646311E-06, 0.40589297E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 16, 0.40978759E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11442656E-08,-0.66664483E-06, 0.41775096E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 17, 0.40867375E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14068792E-08,-0.64815792E-06, 0.42981043E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 18, 0.40764524E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17758672E-08,-0.67647790E-06, 0.44209227E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 19, 0.40669459E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21546536E-08,-0.75676318E-06, 0.45457878E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 20, 0.40581493E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25980262E-08, 0.42196062E-05, 0.46724738E+05, + 0.906E+05, 0.300E+03, 2, 7, 2, 21, 0.40500000E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25635624E-10, 0.10977887E-05, 0.26859983E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 2, 0.44084908E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27660766E-10,-0.76293895E-06, 0.27609645E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 3, 0.43720662E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35239888E-10,-0.69338154E-06, 0.28401394E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47281598E-10,-0.62418337E-06, 0.29237544E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66077822E-10,-0.55312925E-06, 0.30112787E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91871091E-10,-0.52402625E-06, 0.31024653E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12618936E-09,-0.50862051E-06, 0.31971281E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 8, 0.42297743E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17091224E-09,-0.50423458E-06, 0.32950825E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 9, 0.42079698E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22824679E-09,-0.50862857E-06, 0.33961489E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 10, 0.41879709E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30093361E-09,-0.51995544E-06, 0.35001550E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 11, 0.41696201E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39200434E-09,-0.53673420E-06, 0.36069376E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 12, 0.41527716E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50492721E-09,-0.55781034E-06, 0.37163436E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 13, 0.41372910E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64358270E-09,-0.58219659E-06, 0.38282304E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 14, 0.41230549E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81228791E-09,-0.60919723E-06, 0.39424662E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 15, 0.41099507E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10157237E-08,-0.63823856E-06, 0.40589297E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 16, 0.40978759E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12592257E-08,-0.66885218E-06, 0.41775096E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 17, 0.40867375E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15483723E-08,-0.65086886E-06, 0.42981043E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 18, 0.40764524E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19543950E-08,-0.67991394E-06, 0.44209227E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 19, 0.40669459E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23712588E-08,-0.76095877E-06, 0.45457878E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 20, 0.40581493E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28591118E-08, 0.43872797E-05, 0.46724738E+05, + 0.912E+05, 0.300E+03, 2, 8, 2, 21, 0.40500000E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28327728E-10, 0.10977888E-05, 0.26859983E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 2, 0.44084908E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30195224E-10,-0.76301533E-06, 0.27609645E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 3, 0.43720662E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38429183E-10,-0.69346663E-06, 0.28401394E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51695679E-10,-0.62428497E-06, 0.29237544E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72504918E-10,-0.55326226E-06, 0.30112787E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10113581E-09,-0.52420348E-06, 0.31024653E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13911631E-09,-0.50886168E-06, 0.31971281E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 8, 0.42297743E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18866558E-09,-0.50455785E-06, 0.32950825E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 9, 0.42079698E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25220894E-09,-0.50905899E-06, 0.33961489E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 10, 0.41879709E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33270529E-09,-0.52052493E-06, 0.35001550E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 11, 0.41696201E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43355006E-09,-0.53747703E-06, 0.36069376E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 12, 0.41527716E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55855101E-09,-0.55877168E-06, 0.37163436E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 13, 0.41372910E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.71209797E-09,-0.58342439E-06, 0.38282304E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 14, 0.41230549E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.89884755E-09,-0.61075401E-06, 0.39424662E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 15, 0.41099507E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11240627E-08,-0.64019321E-06, 0.40589297E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 16, 0.40978759E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13935884E-08,-0.67128424E-06, 0.41775096E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 17, 0.40867375E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17136093E-08,-0.65385370E-06, 0.42981043E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 18, 0.40764524E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21629239E-08,-0.68370132E-06, 0.44209227E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 19, 0.40669459E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26242681E-08,-0.76557742E-06, 0.45457878E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 20, 0.40581493E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31640714E-08, 0.45725920E-05, 0.46724738E+05, + 0.918E+05, 0.300E+03, 2, 9, 2, 21, 0.40500000E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31468517E-10, 0.10977935E-05, 0.26859983E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 2, 0.44084908E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33178367E-10,-0.76310313E-06, 0.27609645E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 3, 0.43720662E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42224807E-10,-0.69356194E-06, 0.28401394E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56958622E-10,-0.62439842E-06, 0.29237544E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80120420E-10,-0.55341027E-06, 0.30112787E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11202549E-09,-0.52440079E-06, 0.31024653E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15442007E-09,-0.50912816E-06, 0.31971281E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 8, 0.42297743E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20964459E-09,-0.50491718E-06, 0.32950825E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 9, 0.42079698E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28051242E-09,-0.50953577E-06, 0.33961489E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 10, 0.41879709E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37024923E-09,-0.52115574E-06, 0.35001550E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 11, 0.41696201E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48261427E-09,-0.53830124E-06, 0.36069376E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 12, 0.41527716E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62199736E-09,-0.55983513E-06, 0.37163436E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 13, 0.41372910E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79300662E-09,-0.58478677E-06, 0.38282304E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 14, 0.41230549E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10010505E-08,-0.61247898E-06, 0.39424662E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 15, 0.41099507E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12520468E-08,-0.64235868E-06, 0.40589297E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 16, 0.40978759E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15522771E-08,-0.67398077E-06, 0.41775096E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 17, 0.40867375E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19087747E-08,-0.65716094E-06, 0.42981043E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 18, 0.40764524E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24093121E-08,-0.68789443E-06, 0.44209227E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 19, 0.40669459E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29231402E-08,-0.77069828E-06, 0.45457878E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 20, 0.40581493E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35244739E-08, 0.47786945E-05, 0.46724738E+05, + 0.924E+05, 0.300E+03, 2, 10, 2, 21, 0.40500000E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35252015E-10, 0.10978032E-05, 0.26859983E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 2, 0.44084908E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36828472E-10,-0.76320288E-06, 0.27609645E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 3, 0.43720662E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46760154E-10,-0.69367056E-06, 0.28401394E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63264451E-10,-0.62452602E-06, 0.29237544E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.89276000E-10,-0.55357573E-06, 0.30112787E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12509796E-09,-0.52462094E-06, 0.31024653E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17270698E-09,-0.50942576E-06, 0.31971281E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 8, 0.42297743E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23469814E-09,-0.50531834E-06, 0.32950825E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 9, 0.42079698E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31429712E-09,-0.51006800E-06, 0.33961489E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 10, 0.41879709E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41504488E-09,-0.52185977E-06, 0.35001550E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 11, 0.41696201E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54120998E-09,-0.53922062E-06, 0.36069376E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 12, 0.41527716E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69764307E-09,-0.56102215E-06, 0.37163436E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 13, 0.41372910E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88960708E-09,-0.58630546E-06, 0.38282304E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 14, 0.41230549E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11231653E-08,-0.61440522E-06, 0.39424662E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 15, 0.41099507E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14048661E-08,-0.64477245E-06, 0.40589297E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 16, 0.40978759E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17417672E-08,-0.67698860E-06, 0.41775096E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 17, 0.40867375E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21418479E-08,-0.66085072E-06, 0.42981043E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 18, 0.40764524E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27035033E-08,-0.69257260E-06, 0.44209227E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 19, 0.40669459E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32801230E-08,-0.77640767E-06, 0.45457878E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 20, 0.40581493E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39547497E-08, 0.50095548E-05, 0.46724738E+05, + 0.930E+05, 0.300E+03, 2, 11, 2, 21, 0.40500000E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 1, 0.44479919E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39835868E-10, 0.10978189E-05, 0.26859983E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 2, 0.44084908E+01, 0.19999999E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41230426E-10,-0.76331755E-06, 0.27609645E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 3, 0.43720662E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52289882E-10,-0.69379439E-06, 0.28401394E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 4, 0.43385463E+01, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70879954E-10,-0.62467090E-06, 0.29237544E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 5, 0.43077492E+01, 0.20000001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10034758E-09,-0.55376216E-06, 0.30112787E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 6, 0.42794819E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14094743E-09,-0.52486915E-06, 0.31024653E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 7, 0.42535523E+01, 0.20000002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19489865E-09,-0.50976069E-06, 0.31971281E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 8, 0.42297743E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26513590E-09,-0.50576823E-06, 0.32950825E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 9, 0.42079698E+01, 0.20000003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35523650E-09,-0.51066752E-06, 0.33961489E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 10, 0.41879709E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46937203E-09,-0.52265119E-06, 0.35001550E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 11, 0.41696201E+01, 0.20000004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61227183E-09,-0.54025389E-06, 0.36069376E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 12, 0.41527716E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78936864E-09,-0.56235611E-06, 0.37163436E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 13, 0.41372910E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10067500E-08,-0.58801421E-06, 0.38282304E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 14, 0.41230549E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12711098E-08,-0.61656767E-06, 0.39424662E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 15, 0.41099507E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15899908E-08,-0.64748904E-06, 0.40589297E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 16, 0.40978759E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19713722E-08,-0.68036755E-06, 0.41775096E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 17, 0.40867375E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24242278E-08,-0.66499833E-06, 0.42981043E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 18, 0.40764524E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30599040E-08,-0.69782914E-06, 0.44209227E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 19, 0.40669459E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37124846E-08,-0.78282769E-06, 0.45457878E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 20, 0.40581493E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44760236E-08, 0.52703175E-05, 0.46724738E+05, + 0.936E+05, 0.300E+03, 2, 12, 2, 21, 0.40500000E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 1, 0.44557982E+01, 0.00000000E+00, 0.20833334E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20635541E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19779605E+00,-0.29447105E-05, 0.26957621E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 2, 0.44141237E+01, 0.20635541E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20485209E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15033002E+00, 0.16446446E-05, 0.27680577E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 3, 0.43761528E+01, 0.20485209E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20371363E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11384354E+00, 0.24245684E-05, 0.28453202E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 4, 0.43415316E+01, 0.20371363E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20287341E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.84020301E-01, 0.19370268E-05, 0.29274674E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 5, 0.43099425E+01, 0.20287341E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20223696E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.63644157E-01, 0.11464156E-05, 0.30140231E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 6, 0.42811044E+01, 0.20223696E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20175338E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.48357301E-01, 0.50759588E-06, 0.31045077E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 7, 0.42547611E+01, 0.20175338E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20138445E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36892655E-01, 0.95139349E-07, 0.31986588E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 8, 0.42306814E+01, 0.20138445E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20110168E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28277649E-01,-0.12409011E-06, 0.32962379E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 9, 0.42086552E+01, 0.20110168E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20088388E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21779542E-01,-0.21466705E-06, 0.33970270E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 10, 0.41884920E+01, 0.20088388E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20071536E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16852169E-01,-0.23194180E-06, 0.35008266E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 11, 0.41700185E+01, 0.20071536E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20058446E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13090725E-01,-0.21334227E-06, 0.36074541E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 12, 0.41530775E+01, 0.20058446E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20048250E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10195804E-01,-0.18095626E-06, 0.37167423E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 13, 0.41375262E+01, 0.20048250E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20040304E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.79458635E-02,-0.14640536E-06, 0.38285388E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 14, 0.41232355E+01, 0.20040304E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20034128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.61765906E-02,-0.11501072E-06, 0.39427044E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 15, 0.41100885E+01, 0.20034128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20029362E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.47656427E-02,-0.88635409E-07, 0.40591125E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 16, 0.40979796E+01, 0.20029362E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20025741E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36214590E-02,-0.67417846E-07, 0.41776479E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 17, 0.40868134E+01, 0.20025741E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20023066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26750871E-02,-0.50089702E-07, 0.42982061E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 18, 0.40765052E+01, 0.20023066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20021127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19392943E-02,-0.38348792E-07, 0.44209963E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 19, 0.40669789E+01, 0.20021127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20019903E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12235882E-02,-0.29029142E-07, 0.45458341E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 20, 0.40581650E+01, 0.20019903E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20019318E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.58563128E-03,-0.20752687E-07, 0.46724960E+05, + 0.942E+05, 0.300E+03, 2, 13, 2, 21, 0.40500000E+01, 0.20019318E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20019318E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 1, 0.44685929E+01, 0.00000000E+00, 0.21666666E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21380550E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28612175E+00,-0.58062422E-05, 0.27117651E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 2, 0.44245421E+01, 0.21380550E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21142297E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23825146E+00, 0.17316351E-05, 0.27811771E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 3, 0.43845911E+01, 0.21142297E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20945023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19727053E+00, 0.38228392E-05, 0.28560178E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 4, 0.43483424E+01, 0.20945023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20786503E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15851604E+00, 0.34948847E-05, 0.29359383E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 5, 0.43154254E+01, 0.20786503E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20656319E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13018215E+00, 0.23327863E-05, 0.30208836E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 6, 0.42855153E+01, 0.20656319E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20549567E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10675061E+00, 0.12658052E-05, 0.31100599E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 7, 0.42583105E+01, 0.20549567E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20462089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.87476872E-01, 0.50578087E-06, 0.32031532E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 8, 0.42335396E+01, 0.20462089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20390420E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.71669379E-01, 0.51947556E-07, 0.32998786E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 9, 0.42109590E+01, 0.20390420E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20331705E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.58714673E-01,-0.17863686E-06, 0.33999787E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 10, 0.41903500E+01, 0.20331705E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20283620E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.48085222E-01,-0.27014802E-06, 0.35032211E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 11, 0.41715168E+01, 0.20283620E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20244284E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39337085E-01,-0.28479583E-06, 0.36093961E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 12, 0.41542839E+01, 0.20244284E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20212182E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32102317E-01,-0.26225078E-06, 0.37183151E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 13, 0.41384941E+01, 0.20212182E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20186103E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26079188E-01,-0.22538623E-06, 0.38298079E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 14, 0.41240068E+01, 0.20186103E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20165081E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21022077E-01,-0.18619736E-06, 0.39437215E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 15, 0.41106959E+01, 0.20165081E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20148349E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16732001E-01,-0.15024782E-06, 0.40599180E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 16, 0.40984487E+01, 0.20148349E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20135301E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13048233E-01,-0.11956989E-06, 0.41782735E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 17, 0.40871641E+01, 0.20135301E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20125460E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.98411490E-02,-0.92861152E-07, 0.42986764E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 18, 0.40767529E+01, 0.20125460E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20118210E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.72495060E-02,-0.74925988E-07, 0.44213419E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 19, 0.40671357E+01, 0.20118210E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20113585E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.46248335E-02,-0.60538073E-07, 0.45460542E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 20, 0.40582400E+01, 0.20113585E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20111358E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22276322E-02,-0.47062010E-07, 0.46726019E+05, + 0.948E+05, 0.300E+03, 2, 14, 2, 21, 0.40500000E+01, 0.20111358E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20111358E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 1, 0.44844866E+01, 0.00000000E+00, 0.22500000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22155232E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34477699E+00,-0.87303930E-05, 0.27316441E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 2, 0.44380998E+01, 0.22155232E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21856800E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29843058E+00, 0.15493384E-05, 0.27982497E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 3, 0.43960921E+01, 0.21856800E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21599916E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25687898E+00, 0.50883913E-05, 0.28705982E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 4, 0.43580562E+01, 0.21599916E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21379753E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22015710E+00, 0.51863703E-05, 0.29482817E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 5, 0.43236123E+01, 0.21379753E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21196449E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18330080E+00, 0.36248055E-05, 0.30311274E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 6, 0.42923954E+01, 0.21196449E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21040351E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15609528E+00, 0.20545686E-05, 0.31187203E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 7, 0.42640818E+01, 0.21040351E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20907712E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13263891E+00, 0.93928247E-06, 0.32104612E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 8, 0.42383732E+01, 0.20907712E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20795230E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11248179E+00, 0.24663126E-06, 0.33060353E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 9, 0.42150003E+01, 0.20795230E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20700046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.95183415E-01,-0.12624396E-06, 0.34051566E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 10, 0.41937217E+01, 0.20700046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20619715E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.80331934E-01,-0.29374853E-06, 0.35075664E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 11, 0.41743212E+01, 0.20619715E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20552161E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.67554499E-01,-0.34347957E-06, 0.36130314E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 12, 0.41566060E+01, 0.20552161E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20495640E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.56521288E-01,-0.33277957E-06, 0.37213426E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 13, 0.41404039E+01, 0.20495640E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20448694E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.46945491E-01,-0.29564065E-06, 0.38323122E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 14, 0.41255618E+01, 0.20448694E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20410114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38580879E-01,-0.25058976E-06, 0.39457722E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 15, 0.41119433E+01, 0.20410114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20378896E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31218092E-01,-0.20678379E-06, 0.40615723E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 16, 0.40994269E+01, 0.20378896E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20354216E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24680428E-01,-0.16809427E-06, 0.41795781E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 17, 0.40879043E+01, 0.20354216E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20335396E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18819576E-01,-0.13319775E-06, 0.42996692E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 18, 0.40772807E+01, 0.20335396E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20321415E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13980763E-01,-0.10995256E-06, 0.44220784E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 19, 0.40674720E+01, 0.20321415E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20312444E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89710948E-02,-0.91234385E-07, 0.45465263E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 20, 0.40584014E+01, 0.20312444E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20308109E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.43357041E-02,-0.73157642E-07, 0.46728299E+05, + 0.954E+05, 0.300E+03, 2, 15, 2, 21, 0.40500000E+01, 0.20308109E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20308109E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 1, 0.45026373E+01, 0.00000000E+00, 0.23333334E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22944831E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38851415E+00,-0.11635696E-04, 0.27543461E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 2, 0.44539861E+01, 0.22944831E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22600832E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34399859E+00, 0.11318347E-05, 0.28182545E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 3, 0.44099224E+01, 0.22600832E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22297914E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30291132E+00, 0.62164677E-05, 0.28881316E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 4, 0.43700446E+01, 0.22297914E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22032417E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26549054E+00, 0.67362132E-05, 0.29635819E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 5, 0.43339631E+01, 0.22032417E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21802324E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23008823E+00, 0.50108430E-05, 0.30442116E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 6, 0.43013092E+01, 0.21802324E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21605856E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19646503E+00, 0.29231169E-05, 0.31299405E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 7, 0.42717347E+01, 0.21605856E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21435424E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17043044E+00, 0.14101184E-05, 0.32201516E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 8, 0.42449250E+01, 0.21435424E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21288041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14738210E+00, 0.47781395E-06, 0.33143808E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 9, 0.42205924E+01, 0.21288041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21161026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12701561E+00,-0.43884931E-07, 0.34123215E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 10, 0.41984771E+01, 0.21161026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21052004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10902185E+00,-0.29510036E-06, 0.35136949E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 11, 0.41783461E+01, 0.21052004E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20958901E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.93103099E-01,-0.38666328E-06, 0.36182487E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 12, 0.41599913E+01, 0.20958901E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20879919E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78982559E-01,-0.39299282E-06, 0.37257561E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 13, 0.41432271E+01, 0.20879919E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20813510E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.66409260E-01,-0.35931191E-06, 0.38360140E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 14, 0.41278884E+01, 0.20813510E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20758351E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.55159770E-01,-0.31098475E-06, 0.39488404E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 15, 0.41138288E+01, 0.20758351E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20713313E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.45037887E-01,-0.26108475E-06, 0.40640730E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 16, 0.41009180E+01, 0.20713313E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20677440E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35873109E-01,-0.21557643E-06, 0.41815670E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 17, 0.40890405E+01, 0.20677440E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20649922E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27518453E-01,-0.17325895E-06, 0.43011931E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 18, 0.40780951E+01, 0.20649922E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20629385E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20537396E-01,-0.14525139E-06, 0.44232146E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 19, 0.40679927E+01, 0.20629385E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20616164E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13220743E-01,-0.12262350E-06, 0.45472572E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 20, 0.40586520E+01, 0.20616164E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20609763E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64017860E-02,-0.10022289E-06, 0.46731837E+05, + 0.960E+05, 0.300E+03, 2, 16, 2, 21, 0.40500000E+01, 0.20609763E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20609763E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 1, 0.45225160E+01, 0.00000000E+00, 0.24166668E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23744337E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42234617E+00,-0.15059851E-04, 0.27792094E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 2, 0.44716752E+01, 0.23744337E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23364674E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.37966238E+00, 0.85658776E-06, 0.28405294E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 3, 0.44255772E+01, 0.23364674E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23025262E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33940367E+00, 0.76967695E-05, 0.29079780E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 4, 0.43838342E+01, 0.23025262E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22723298E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30195593E+00, 0.86515208E-05, 0.29811808E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 5, 0.43460604E+01, 0.22723298E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22455785E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26750609E+00, 0.66109425E-05, 0.30597536E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 6, 0.43118835E+01, 0.22455785E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22223928E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23185321E+00, 0.40243517E-05, 0.31433158E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 7, 0.42809443E+01, 0.22223928E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22022105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20182044E+00, 0.19379885E-05, 0.32318132E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 8, 0.42529162E+01, 0.22022105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21845491E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17661326E+00, 0.67856223E-06, 0.33245596E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 9, 0.42274986E+01, 0.21845491E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21691593E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15389806E+00,-0.13723287E-07, 0.34211701E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 10, 0.42044176E+01, 0.21691593E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21558152E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13344152E+00,-0.35057671E-06, 0.35213508E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 11, 0.41834266E+01, 0.21558152E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21443146E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11500657E+00,-0.47747956E-06, 0.36248342E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 12, 0.41643042E+01, 0.21443146E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21344783E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.98363489E-01,-0.49189661E-06, 0.37313791E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 13, 0.41468531E+01, 0.21344783E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21261487E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.83296716E-01,-0.45299503E-06, 0.38407687E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 14, 0.41308977E+01, 0.21261487E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21191879E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.69608614E-01,-0.39398768E-06, 0.39528089E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 15, 0.41162819E+01, 0.21191879E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21134758E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.57121036E-01,-0.33204609E-06, 0.40673265E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 16, 0.41028673E+01, 0.21134758E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21089083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.45675441E-01,-0.26871740E-06, 0.41841667E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 17, 0.40905310E+01, 0.21089083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21053143E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35939943E-01,-0.22627179E-06, 0.43032163E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 18, 0.40791668E+01, 0.21053143E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21026842E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26301452E-01,-0.19247586E-06, 0.44247100E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 19, 0.40686796E+01, 0.21026842E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21009876E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16965542E-01,-0.15769749E-06, 0.45482214E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 20, 0.40589829E+01, 0.21009876E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21001651E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.82254432E-02,-0.12925388E-06, 0.46736510E+05, + 0.966E+05, 0.300E+03, 2, 17, 2, 21, 0.40500000E+01, 0.21001651E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21001651E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 1, 0.45437537E+01, 0.00000000E+00, 0.25000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24550998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44902042E+00,-0.18629324E-04, 0.28057725E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 2, 0.44907973E+01, 0.24550998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24142933E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40806435E+00, 0.43455980E-06, 0.28646090E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 3, 0.44426967E+01, 0.24142933E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23774219E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36870508E+00, 0.91562069E-05, 0.29296812E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 4, 0.43990826E+01, 0.23774219E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23442793E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33141593E+00, 0.10627358E-04, 0.30006417E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 5, 0.43595794E+01, 0.23442793E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23146289E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29649564E+00, 0.82699774E-05, 0.30771221E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 6, 0.43238169E+01, 0.23146289E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22882187E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26409618E+00, 0.51842942E-05, 0.31587487E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 7, 0.42914400E+01, 0.22882187E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22652715E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22946945E+00, 0.26221718E-05, 0.32451545E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 8, 0.42621059E+01, 0.22652715E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22451754E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20096064E+00, 0.92120074E-06, 0.33362649E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 9, 0.42355062E+01, 0.22451754E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22275335E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17641892E+00, 0.33627233E-07, 0.34314298E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 10, 0.42113572E+01, 0.22275335E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22121329E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15400618E+00,-0.40253633E-06, 0.35302942E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 11, 0.41894013E+01, 0.22121329E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21987790E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13354002E+00,-0.57192367E-06, 0.36325790E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 12, 0.41694065E+01, 0.21987790E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21872955E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11483482E+00,-0.59751838E-06, 0.37380313E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 13, 0.41511653E+01, 0.21872955E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21775246E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.97709634E-01,-0.55421858E-06, 0.38464230E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 14, 0.41344924E+01, 0.21775246E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21693253E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.81993321E-01,-0.48422830E-06, 0.39575494E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 15, 0.41192233E+01, 0.21693253E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21625726E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.67527477E-01,-0.40949397E-06, 0.40712274E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 16, 0.41052117E+01, 0.21625726E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21571559E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.54167847E-01,-0.33229611E-06, 0.41872937E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 17, 0.40923286E+01, 0.21571559E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21528347E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.43212446E-01,-0.28059812E-06, 0.43057091E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 18, 0.40804621E+01, 0.21528347E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21497006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31340430E-01,-0.23941506E-06, 0.44265173E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 19, 0.40695109E+01, 0.21497006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21476765E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20241560E-01,-0.19674637E-06, 0.45493883E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 20, 0.40593837E+01, 0.21476765E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21466943E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.98221534E-02,-0.16166677E-06, 0.46742171E+05, + 0.972E+05, 0.300E+03, 2, 18, 2, 21, 0.40500000E+01, 0.21466943E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21466943E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 1, 0.45501605E+01, 0.00000000E+00, 0.24166666E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24098650E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.68021541E-01,-0.55664637E-05, 0.28137858E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 2, 0.44996342E+01, 0.24098650E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23973163E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12549506E+00,-0.78352320E-05, 0.28757368E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 3, 0.44527701E+01, 0.23973163E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23810691E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16247411E+00,-0.27541770E-05, 0.29424517E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 4, 0.44095759E+01, 0.23810691E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23627757E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18293304E+00, 0.12985438E-05, 0.30140338E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 5, 0.43699524E+01, 0.23627757E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23436814E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19094039E+00, 0.32190988E-05, 0.30904488E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 6, 0.43337265E+01, 0.23436814E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23246780E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19003012E+00, 0.35310956E-05, 0.31715643E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 7, 0.43006803E+01, 0.23246780E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23063750E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18302655E+00, 0.30160231E-05, 0.32571830E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 8, 0.42705728E+01, 0.23063750E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22895851E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16789659E+00, 0.22375778E-05, 0.33470704E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 9, 0.42431495E+01, 0.22895851E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22741751E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15409861E+00, 0.14482168E-05, 0.34412229E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 10, 0.42181691E+01, 0.22741751E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22601982E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13976885E+00, 0.85784117E-06, 0.35390730E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 11, 0.41953988E+01, 0.22601982E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22477045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12493613E+00, 0.46568363E-06, 0.36403532E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 12, 0.41746211E+01, 0.22477045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22366968E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11007684E+00, 0.20791154E-06, 0.37448298E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 13, 0.41556365E+01, 0.22366968E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22271469E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.95498881E-01, 0.48300369E-07, 0.38522859E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 14, 0.41382634E+01, 0.22271469E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22190077E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.81391878E-01,-0.44555440E-07, 0.39625223E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 15, 0.41223378E+01, 0.22190077E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22122213E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.67863994E-01,-0.94403815E-07, 0.40753581E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 16, 0.41077128E+01, 0.22122213E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22067245E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.54968398E-01,-0.11239452E-06, 0.41906294E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 17, 0.40942576E+01, 0.22067245E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22023063E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44182723E-01,-0.12366267E-06, 0.43083841E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 18, 0.40818580E+01, 0.22023063E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21990840E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32222390E-01,-0.12962082E-06, 0.44284648E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 19, 0.40704093E+01, 0.21990840E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21969950E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20890679E-01,-0.12538412E-06, 0.45506495E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 20, 0.40598178E+01, 0.21969950E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21959789E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10160419E-01,-0.11883819E-06, 0.46748301E+05, + 0.978E+05, 0.300E+03, 2, 19, 2, 21, 0.40500000E+01, 0.21959789E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21959789E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 1, 0.45475492E+01, 0.00000000E+00, 0.23333334E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23421478E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88145760E-01, 0.16684725E-05, 0.28105197E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 2, 0.44997465E+01, 0.23421478E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23453747E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32262557E-01,-0.59197487E-05, 0.28758782E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 3, 0.44549562E+01, 0.23453747E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23441342E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12409891E-01,-0.49353944E-05, 0.29452232E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 4, 0.44132429E+01, 0.23441342E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23394994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.46350391E-01,-0.26430640E-05, 0.30187137E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 5, 0.43745912E+01, 0.23394994E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23324381E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70613714E-01,-0.56567292E-06, 0.30964085E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 6, 0.43389208E+01, 0.23324381E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23237818E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.86561894E-01, 0.74148825E-06, 0.31782818E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 7, 0.43061030E+01, 0.23237818E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23142169E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.95647953E-01, 0.13196355E-05, 0.32642420E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 8, 0.42759761E+01, 0.23142169E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23042899E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.99268686E-01, 0.14301259E-05, 0.33541502E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 9, 0.42483600E+01, 0.23042899E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22947072E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.95825216E-01, 0.12226340E-05, 0.34478988E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 10, 0.42230609E+01, 0.22947072E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22854954E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.92117269E-01, 0.92789130E-06, 0.35453772E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 11, 0.41998894E+01, 0.22854954E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22768705E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.86248247E-01, 0.67594595E-06, 0.36461742E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 12, 0.41786596E+01, 0.22768705E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22689827E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78877288E-01, 0.46436886E-06, 0.37500950E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 13, 0.41591951E+01, 0.22689827E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22619306E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.70521179E-01, 0.30103073E-06, 0.38569521E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 14, 0.41413314E+01, 0.22619306E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22557728E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.61577461E-01, 0.18167399E-06, 0.39665684E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 15, 0.41249169E+01, 0.22557728E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22505381E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.52346869E-01, 0.97833063E-07, 0.40787785E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 16, 0.41098128E+01, 0.22505381E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22462328E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.43053366E-01, 0.42721398E-07, 0.41934304E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 17, 0.40958949E+01, 0.22462328E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22427308E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35019447E-01, 0.52913324E-08, 0.43106547E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 18, 0.40830523E+01, 0.22427308E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22401545E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25763584E-01,-0.22140078E-07, 0.44301311E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 19, 0.40711822E+01, 0.22401545E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22384742E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16802971E-01,-0.39447758E-07, 0.45517345E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 20, 0.40601924E+01, 0.22384742E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22376541E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.82009329E-02,-0.50334582E-07, 0.46753591E+05, + 0.984E+05, 0.300E+03, 2, 20, 2, 21, 0.40500000E+01, 0.22376541E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22376541E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 1, 0.45396155E+01, 0.00000000E+00, 0.22500000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22688236E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18819899E+00,-0.36894751E-04, 0.28005965E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 2, 0.44943748E+01, 0.22688236E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22824883E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13660765E+00,-0.39416103E-04, 0.28691139E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 3, 0.44517240E+01, 0.22824883E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22917342E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.92447938E-01,-0.10943927E-04, 0.29411256E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 4, 0.44117381E+01, 0.22917342E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22973089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55757270E-01, 0.10088906E-04, 0.30167933E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 5, 0.43744305E+01, 0.22973089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22999294E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26224037E-01, 0.19399853E-04, 0.30962020E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 6, 0.43397615E+01, 0.22999294E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23002554E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32805027E-02, 0.20517045E-04, 0.31793690E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 7, 0.43076493E+01, 0.23002554E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22988736E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13800103E-01, 0.17522898E-04, 0.32662550E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 8, 0.42779805E+01, 0.22988736E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22962906E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25817186E-01, 0.13217427E-04, 0.33567764E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 9, 0.42506197E+01, 0.22962906E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22929507E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33389459E-01, 0.90142468E-05, 0.34508173E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 10, 0.42254206E+01, 0.22929507E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22892623E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36878724E-01, 0.54090591E-05, 0.35484183E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 11, 0.42022284E+01, 0.22892623E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22854142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38478546E-01, 0.29179052E-05, 0.36492061E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 12, 0.41808876E+01, 0.22854142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22816126E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38013805E-01, 0.12852323E-05, 0.37529998E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 13, 0.41612468E+01, 0.22816126E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22780143E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35983225E-01, 0.23569133E-06, 0.38596424E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 14, 0.41431615E+01, 0.22780143E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22747340E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32803289E-01,-0.39525078E-06, 0.39689818E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 15, 0.41264962E+01, 0.22747340E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22718525E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28816227E-01,-0.68794261E-06, 0.40808731E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 16, 0.41111251E+01, 0.22718525E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22693408E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25117193E-01,-0.87292248E-06, 0.41952306E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 17, 0.40969347E+01, 0.22693408E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22673257E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20152580E-01,-0.98903076E-06, 0.43120966E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 18, 0.40838194E+01, 0.22673257E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22658229E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15028333E-01,-0.98830048E-06, 0.44312015E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 19, 0.40716825E+01, 0.22658229E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22648340E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.98901815E-02,-0.94955985E-06, 0.45524368E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 20, 0.40604359E+01, 0.22648340E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22643479E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.48512678E-02, 0.96194942E-05, 0.46757031E+05, + 0.990E+05, 0.300E+03, 2, 21, 2, 21, 0.40500000E+01, 0.22643479E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22643479E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 1, 0.45278916E+01, 0.00000000E+00, 0.21666666E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21928098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26143826E+00, 0.59472549E-05, 0.27859329E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 2, 0.44850551E+01, 0.21928098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22141603E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21350310E+00,-0.19815187E-05, 0.28573782E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 3, 0.44444984E+01, 0.22141603E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22312621E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17101352E+00,-0.40759548E-05, 0.29319653E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 4, 0.44062968E+01, 0.22312621E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22446728E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13410241E+00,-0.40699325E-05, 0.30098488E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 5, 0.43704759E+01, 0.22446728E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22549410E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10267992E+00,-0.29758685E-05, 0.30911215E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 6, 0.43370175E+01, 0.22549410E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22625885E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76473026E-01,-0.17010996E-05, 0.31758203E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 7, 0.43058668E+01, 0.22625885E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22680960E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55073955E-01,-0.67842871E-06, 0.32639346E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 8, 0.42769409E+01, 0.22680960E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22718949E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37989375E-01,-0.10414898E-07, 0.33554142E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 9, 0.42501358E+01, 0.22718949E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22743633E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24684550E-01, 0.37859028E-06, 0.34501790E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 10, 0.42253359E+01, 0.22743633E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22757822E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14189438E-01, 0.51513450E-06, 0.35483092E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 11, 0.42024173E+01, 0.22757822E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22764803E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69814428E-02, 0.50222332E-06, 0.36494510E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 12, 0.41812489E+01, 0.22764803E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22766710E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19073357E-02, 0.45262020E-06, 0.37534708E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 13, 0.41617008E+01, 0.22766710E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22765263E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14467188E-02, 0.38026059E-06, 0.38602377E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 14, 0.41436472E+01, 0.22765263E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22761819E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34433415E-02, 0.30521259E-06, 0.39696223E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 15, 0.41269680E+01, 0.22761819E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22757425E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.43944616E-02, 0.23326131E-06, 0.40814989E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 16, 0.41115506E+01, 0.22757425E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22752707E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.47178141E-02, 0.18150455E-06, 0.41958171E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 17, 0.40972910E+01, 0.22752707E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22748407E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42993178E-02, 0.13918172E-06, 0.43125908E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 18, 0.40840925E+01, 0.22748407E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22744932E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34749885E-02, 0.10007076E-06, 0.44315825E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 19, 0.40718649E+01, 0.22744932E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22742529E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24027800E-02, 0.69021544E-07, 0.45526929E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 20, 0.40605259E+01, 0.22742529E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22741319E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12104250E-02, 0.44231276E-07, 0.46758302E+05, + 0.996E+05, 0.300E+03, 2, 22, 2, 21, 0.40500000E+01, 0.22741319E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22741319E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 1, 0.45132691E+01, 0.00000000E+00, 0.20833332E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21151479E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31815268E+00, 0.61978268E-05, 0.27676439E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 2, 0.44727109E+01, 0.21151479E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21424555E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27307573E+00,-0.85576545E-06, 0.28418337E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 3, 0.44341889E+01, 0.21424555E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21656784E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23222551E+00,-0.33398002E-05, 0.29188955E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 4, 0.43977770E+01, 0.21656784E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21852528E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19574006E+00,-0.38447870E-05, 0.29989753E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 5, 0.43635066E+01, 0.21852528E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22016138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16360678E+00,-0.31369412E-05, 0.30821675E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 6, 0.43313720E+01, 0.22016138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22151822E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13568230E+00,-0.20637556E-05, 0.31685194E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 7, 0.43013361E+01, 0.22151822E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22263543E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11171946E+00,-0.10924497E-05, 0.32580367E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 8, 0.42733361E+01, 0.22263543E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22354940E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91396808E-01,-0.35446456E-06, 0.33506911E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 9, 0.42472915E+01, 0.22354940E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22427138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72198145E-01, 0.90504760E-07, 0.34465297E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 10, 0.42231129E+01, 0.22427138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22485402E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58264766E-01, 0.28794689E-06, 0.35454443E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 11, 0.42006946E+01, 0.22485402E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22532136E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46733876E-01, 0.37012800E-06, 0.36472179E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 12, 0.41799251E+01, 0.22532136E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22569383E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37246995E-01, 0.37688270E-06, 0.37517449E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 13, 0.41606926E+01, 0.22569383E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22598854E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29472077E-01, 0.34493361E-06, 0.38589158E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 14, 0.41428871E+01, 0.22598854E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22621963E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23108969E-01, 0.29708050E-06, 0.39686199E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 15, 0.41264021E+01, 0.22621963E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22639854E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17891710E-01, 0.24080813E-06, 0.40807484E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 16, 0.41111368E+01, 0.22639854E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22653900E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14045915E-01, 0.19952834E-06, 0.41952467E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 17, 0.40969962E+01, 0.22653900E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22664268E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10367615E-01, 0.16436068E-06, 0.43121819E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 18, 0.40838921E+01, 0.22664268E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22671528E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72610512E-02, 0.12785765E-06, 0.44313030E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 19, 0.40717417E+01, 0.22671528E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22676105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45767066E-02, 0.97163500E-07, 0.45525198E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 20, 0.40604679E+01, 0.22676105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22678295E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21903694E-02, 0.71294653E-07, 0.46757483E+05, + 0.100E+06, 0.300E+03, 2, 23, 2, 21, 0.40500000E+01, 0.22678295E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22678295E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 1, 0.44963551E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20363238E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36324394E+00, 0.60151058E-05, 0.27464886E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 2, 0.44579793E+01, 0.20363238E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20683584E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32034598E+00,-0.13570410E-06, 0.28232829E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 3, 0.44214406E+01, 0.20683584E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20964437E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28085053E+00,-0.26923302E-05, 0.29027339E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 4, 0.43868109E+01, 0.20964437E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21209323E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24488213E+00,-0.34717764E-05, 0.29849799E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 5, 0.43541251E+01, 0.21209323E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21421786E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21246004E+00,-0.30513830E-05, 0.30701147E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 6, 0.43233856E+01, 0.21421786E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21605298E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18350958E+00,-0.21807919E-05, 0.31581909E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 7, 0.42945669E+01, 0.21605298E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21763178E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15787875E+00,-0.12808525E-05, 0.32492249E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 8, 0.42676219E+01, 0.21763178E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21895588E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13240942E+00,-0.56713310E-06, 0.33432909E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 9, 0.42424936E+01, 0.21895588E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22007552E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11196413E+00,-0.12871151E-06, 0.34403824E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 10, 0.42191036E+01, 0.22007552E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22102418E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.94865777E-01, 0.12916777E-06, 0.35402772E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 11, 0.41973609E+01, 0.22102418E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22182380E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79962391E-01, 0.25831619E-06, 0.36428966E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 12, 0.41771700E+01, 0.22182380E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22249351E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66971560E-01, 0.30456171E-06, 0.37481530E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 13, 0.41584334E+01, 0.22249351E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22304978E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55627532E-01, 0.30291009E-06, 0.38559534E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 14, 0.41410542E+01, 0.22304978E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22350664E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45685787E-01, 0.27690476E-06, 0.39662028E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 15, 0.41249377E+01, 0.22350664E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22387589E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36925554E-01, 0.24099638E-06, 0.40788062E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 16, 0.41099927E+01, 0.22387589E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22417707E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30117890E-01, 0.19894886E-06, 0.41936703E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 17, 0.40961326E+01, 0.22417707E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22440684E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22977713E-01, 0.16876378E-06, 0.43109844E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 18, 0.40832774E+01, 0.22440684E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22457196E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16511446E-01, 0.14226946E-06, 0.44304452E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 19, 0.40713503E+01, 0.22457196E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22467794E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10598948E-01, 0.11334882E-06, 0.45519704E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 20, 0.40602800E+01, 0.22467794E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22472921E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51268746E-02, 0.87862202E-07, 0.46754828E+05, + 0.101E+06, 0.300E+03, 2, 24, 2, 21, 0.40500000E+01, 0.22472921E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22472921E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 1, 0.44852548E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20205866E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20586968E+00, 0.37524323E-05, 0.27326049E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 2, 0.44469156E+01, 0.20205866E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20415527E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20966264E+00, 0.13824916E-05, 0.28093510E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 3, 0.44108188E+01, 0.20415527E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20621959E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20643127E+00,-0.61087477E-06, 0.28892680E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 4, 0.43768763E+01, 0.20621959E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20819952E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19799125E+00,-0.16643778E-05, 0.29723008E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 5, 0.43450097E+01, 0.20819952E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21005998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18604442E+00,-0.18783541E-05, 0.30584037E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 6, 0.43151432E+01, 0.21005998E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21178001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17200067E+00,-0.16273028E-05, 0.31475314E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 7, 0.42872009E+01, 0.21178001E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21331567E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15356567E+00,-0.11665547E-05, 0.32397357E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 8, 0.42611128E+01, 0.21331567E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21468740E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13717220E+00,-0.74080801E-06, 0.33350000E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 9, 0.42367954E+01, 0.21468740E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21590788E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12204762E+00,-0.41806557E-06, 0.34330816E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 10, 0.42141567E+01, 0.21590788E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21698343E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10755441E+00,-0.18772494E-06, 0.35339019E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 11, 0.41931027E+01, 0.21698343E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21792212E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.93868691E-01,-0.37860542E-07, 0.36373770E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 12, 0.41735389E+01, 0.21792212E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21873282E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81070492E-01, 0.51358793E-07, 0.37434189E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 13, 0.41553712E+01, 0.21873282E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21942456E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69173841E-01, 0.98757273E-07, 0.38519380E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 14, 0.41385074E+01, 0.21942456E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22000606E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58149750E-01, 0.11921316E-06, 0.39628442E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 15, 0.41228583E+01, 0.22000606E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22048549E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47943146E-01, 0.12338654E-06, 0.40760483E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 16, 0.41083380E+01, 0.22048549E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22087033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38484949E-01, 0.11479446E-06, 0.41914633E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 17, 0.40948661E+01, 0.22087033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22117750E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30716304E-01, 0.10838301E-06, 0.43092281E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 18, 0.40823660E+01, 0.22117750E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22140036E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22286983E-01, 0.10121420E-06, 0.44291736E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 19, 0.40707658E+01, 0.22140036E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22154437E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14400688E-01, 0.88946392E-07, 0.45511500E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 20, 0.40599981E+01, 0.22154437E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22161428E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69914791E-02, 0.76617606E-07, 0.46750848E+05, + 0.101E+06, 0.300E+03, 2, 25, 2, 21, 0.40500000E+01, 0.22161428E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22161428E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 1, 0.44775062E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20149710E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14971301E+00, 0.26142350E-05, 0.27229134E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 2, 0.44389832E+01, 0.20149710E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20304420E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15471125E+00, 0.12750481E-05, 0.27993621E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 3, 0.44029115E+01, 0.20304420E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20460363E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15594267E+00,-0.23228393E-06, 0.28792435E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 4, 0.43691684E+01, 0.20460363E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20614240E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15387580E+00,-0.10754291E-05, 0.29624637E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 5, 0.43376372E+01, 0.20614240E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20763323E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14908111E+00,-0.13009911E-05, 0.30489319E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 6, 0.43082059E+01, 0.20763323E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20903368E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14004448E+00,-0.11258968E-05, 0.31386217E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 7, 0.42807736E+01, 0.20903368E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21032993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12962435E+00,-0.83297773E-06, 0.32315972E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 8, 0.42552374E+01, 0.21032993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21152893E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11989883E+00,-0.56615867E-06, 0.33275161E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 9, 0.42314872E+01, 0.21152893E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21262461E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10956834E+00,-0.34689280E-06, 0.34262805E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 10, 0.42094153E+01, 0.21262461E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21361411E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98949762E-01,-0.18537839E-06, 0.35277915E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 11, 0.41889165E+01, 0.21361411E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21449698E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88286851E-01,-0.75055742E-07, 0.36319505E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 12, 0.41698884E+01, 0.21449698E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21527458E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77759559E-01,-0.44511906E-08, 0.37386595E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 13, 0.41522322E+01, 0.21527458E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21594953E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67494893E-01, 0.37652530E-07, 0.38478220E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 14, 0.41358533E+01, 0.21594953E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21652530E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57577624E-01, 0.60422761E-07, 0.39593440E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 15, 0.41206612E+01, 0.21652530E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21700590E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48059987E-01, 0.70674374E-07, 0.40731345E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 16, 0.41065703E+01, 0.21700590E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21739560E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38969953E-01, 0.70548149E-07, 0.41891057E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 17, 0.40935006E+01, 0.21739560E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21770915E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31354529E-01, 0.70542657E-07, 0.43073345E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 18, 0.40813766E+01, 0.21770915E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21793800E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22885569E-01, 0.69236064E-07, 0.44277932E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 19, 0.40701284E+01, 0.21793800E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21808646E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14846469E-01, 0.63485444E-07, 0.45502552E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 20, 0.40596900E+01, 0.21808646E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21815870E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72235649E-02, 0.56911354E-07, 0.46746497E+05, + 0.102E+06, 0.300E+03, 2, 26, 2, 21, 0.40500000E+01, 0.21815870E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21815870E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 1, 0.44715772E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20115974E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11597545E+00, 0.19477066E-05, 0.27154976E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 2, 0.44328757E+01, 0.20115974E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20236356E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12038318E+00, 0.10754095E-05, 0.27916712E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 3, 0.43967600E+01, 0.20236356E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20358600E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12224379E+00,-0.10389560E-06, 0.28714449E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 4, 0.43630925E+01, 0.20358600E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20480372E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12177168E+00,-0.77171451E-06, 0.29547092E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 5, 0.43317385E+01, 0.20480372E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20599618E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11924505E+00,-0.95871623E-06, 0.30413536E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 6, 0.43025706E+01, 0.20599618E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20711463E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11184454E+00,-0.83810333E-06, 0.31315282E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 7, 0.42754714E+01, 0.20711463E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20817622E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10615795E+00,-0.62718736E-06, 0.32248832E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 8, 0.42503130E+01, 0.20817622E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20917069E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.99446322E-01,-0.43561382E-06, 0.33212437E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 9, 0.42269705E+01, 0.20917069E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21009057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91987843E-01,-0.27652080E-06, 0.34204934E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 10, 0.42053235E+01, 0.21009057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21093081E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84023974E-01,-0.15727050E-06, 0.35225182E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 11, 0.41852566E+01, 0.21093081E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21168839E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75758247E-01,-0.73906961E-07, 0.36272065E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 12, 0.41666595E+01, 0.21168839E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21236197E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67357749E-01,-0.18899658E-07, 0.37344498E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 13, 0.41494272E+01, 0.21236197E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21295153E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58956275E-01, 0.15346200E-07, 0.38441439E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 14, 0.41334604E+01, 0.21295153E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21345812E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50658348E-01, 0.35176763E-07, 0.39561884E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 15, 0.41186655E+01, 0.21345812E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21388355E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42543511E-01, 0.45407749E-07, 0.40704877E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 16, 0.41049548E+01, 0.21388355E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21423026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34670509E-01, 0.47531893E-07, 0.41869510E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 17, 0.40922465E+01, 0.21423026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21451032E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28006618E-01, 0.49222021E-07, 0.43055953E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 18, 0.40804647E+01, 0.21451032E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21471534E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20501533E-01, 0.49711125E-07, 0.44265209E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 19, 0.40695395E+01, 0.21471534E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21484859E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13325390E-01, 0.46669827E-07, 0.45494286E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 20, 0.40594050E+01, 0.21484859E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21491349E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64899268E-02, 0.42769638E-07, 0.46742472E+05, + 0.103E+06, 0.300E+03, 2, 27, 2, 21, 0.40500000E+01, 0.21491349E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21491349E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 1, 0.44668962E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20092041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.92053178E-01, 0.11923958E-04, 0.27096430E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 2, 0.44280421E+01, 0.20092041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20187802E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.95746382E-01,-0.14848316E-04, 0.27855845E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 3, 0.43918719E+01, 0.20187802E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20285368E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97551541E-01,-0.14215900E-04, 0.28652480E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 4, 0.43582391E+01, 0.20285368E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20382984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97606352E-01,-0.92501807E-05, 0.29485151E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 5, 0.43269995E+01, 0.20382984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20476523E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.93534182E-01,-0.45456670E-05, 0.30353656E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 6, 0.42980209E+01, 0.20476523E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20566907E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90382448E-01,-0.15190501E-05, 0.31258014E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 7, 0.42711633E+01, 0.20566907E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20653072E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86165932E-01, 0.27175661E-06, 0.32194281E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 8, 0.42462860E+01, 0.20653072E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20734163E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81092406E-01, 0.12165677E-05, 0.33161143E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 9, 0.42232534E+01, 0.20734163E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20809520E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75358077E-01, 0.16224761E-05, 0.34157310E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 10, 0.42019359E+01, 0.20809520E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20878660E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69141648E-01, 0.17100956E-05, 0.35181524E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 11, 0.41822097E+01, 0.20878660E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20941259E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62601077E-01, 0.16242480E-05, 0.36232568E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 12, 0.41639577E+01, 0.20941259E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20997130E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55872418E-01, 0.14544001E-05, 0.37309274E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 13, 0.41470694E+01, 0.20997130E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21046199E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49070148E-01, 0.12528451E-05, 0.38410523E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 14, 0.41314412E+01, 0.21046199E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21088487E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42288478E-01, 0.10481555E-05, 0.39535256E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 15, 0.41169760E+01, 0.21088487E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21124089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35603240E-01, 0.85437561E-06, 0.40682469E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 16, 0.41035834E+01, 0.21124089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21153162E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29074041E-01, 0.66944417E-06, 0.41851219E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 17, 0.40911797E+01, 0.21153162E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21176685E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23523558E-01, 0.52982743E-06, 0.43041159E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 18, 0.40796878E+01, 0.21176685E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21193924E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17239512E-01, 0.39856144E-06, 0.44254369E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 19, 0.40690373E+01, 0.21193924E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21205137E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11213208E-01, 0.26139505E-06, 0.45487236E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 20, 0.40591618E+01, 0.21205137E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21210600E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54629777E-02, 0.13302080E-06, 0.46739037E+05, + 0.103E+06, 0.300E+03, 2, 28, 2, 21, 0.40500000E+01, 0.21210600E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21210600E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 1, 0.44631560E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20073630E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73639331E-01, 0.96090364E-05, 0.27049649E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 2, 0.44241762E+01, 0.20073630E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20150283E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76641221E-01,-0.11949459E-04, 0.27807164E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 3, 0.43879575E+01, 0.20150283E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20228434E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78139738E-01,-0.11413942E-04, 0.28602856E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 4, 0.43543470E+01, 0.20228434E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20306673E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78232009E-01,-0.73815713E-05, 0.29435478E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 5, 0.43231947E+01, 0.20306673E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20381675E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74997497E-01,-0.35960137E-05, 0.30306049E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 6, 0.42943580E+01, 0.20381675E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20454338E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72662163E-01,-0.11829845E-05, 0.31211906E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 7, 0.42676848E+01, 0.20454338E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20523779E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69441513E-01, 0.23032965E-06, 0.32150234E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 8, 0.42430256E+01, 0.20523779E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20589278E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65500071E-01, 0.96855387E-06, 0.33119613E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 9, 0.42202363E+01, 0.20589278E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20650271E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60994347E-01, 0.12815116E-05, 0.34118652E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 10, 0.41991795E+01, 0.20650271E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20706338E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56068189E-01, 0.13454889E-05, 0.35146002E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 11, 0.41797251E+01, 0.20706338E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20757187E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50850137E-01, 0.12749113E-05, 0.36200362E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 12, 0.41617503E+01, 0.20757187E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20802638E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45452295E-01, 0.11398670E-05, 0.37280495E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 13, 0.41451399E+01, 0.20802638E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20842607E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39970289E-01, 0.98103604E-06, 0.38385222E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 14, 0.41297863E+01, 0.20842607E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20877091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34483996E-01, 0.82050085E-06, 0.39513432E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 15, 0.41155896E+01, 0.20877091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20906149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29058740E-01, 0.66902494E-06, 0.40664082E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 16, 0.41024570E+01, 0.20906149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20929895E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23746755E-01, 0.52460550E-06, 0.41836195E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 17, 0.40903027E+01, 0.20929895E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20949118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19223620E-01, 0.41610124E-06, 0.43028998E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 18, 0.40790489E+01, 0.20949118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20963211E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14093180E-01, 0.31460221E-06, 0.44245454E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 19, 0.40686242E+01, 0.20963211E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20972379E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91684025E-02, 0.20863427E-06, 0.45481437E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 20, 0.40589617E+01, 0.20972379E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20976846E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44669056E-02, 0.10983123E-06, 0.46736212E+05, + 0.104E+06, 0.300E+03, 2, 29, 2, 21, 0.40500000E+01, 0.20976846E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20976846E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 1, 0.44601577E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20059060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59067468E-01, 0.77361936E-05, 0.27012148E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 2, 0.44210759E+01, 0.20059060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20120567E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61497624E-01,-0.96529070E-05, 0.27768122E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 3, 0.43848167E+01, 0.20120567E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20183301E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62724938E-01,-0.91944856E-05, 0.28563039E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 4, 0.43512223E+01, 0.20183301E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20246134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62826495E-01,-0.59151469E-05, 0.29395600E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 5, 0.43201382E+01, 0.20246134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20306395E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60258205E-01,-0.28583701E-05, 0.30267804E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 6, 0.42914130E+01, 0.20306395E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20364809E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58413227E-01,-0.92200410E-06, 0.31174836E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 7, 0.42648857E+01, 0.20364809E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20420664E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55855831E-01, 0.20399435E-06, 0.32114790E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 8, 0.42403996E+01, 0.20420664E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20473379E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52715821E-01, 0.78638895E-06, 0.33086165E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 9, 0.42178041E+01, 0.20473379E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20522496E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49117289E-01, 0.10288212E-05, 0.34087491E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 10, 0.41969559E+01, 0.20522496E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20567670E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45174973E-01, 0.10738546E-05, 0.35117344E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 11, 0.41777192E+01, 0.20567670E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20608661E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40992030E-01, 0.10133552E-05, 0.36174361E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 12, 0.41599669E+01, 0.20608661E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20645319E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36658963E-01, 0.90317950E-06, 0.37257244E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 13, 0.41435800E+01, 0.20645319E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20677571E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32253426E-01, 0.77548595E-06, 0.38364768E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 14, 0.41284477E+01, 0.20677571E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20705411E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27840644E-01, 0.64755159E-06, 0.39495779E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 15, 0.41144675E+01, 0.20705411E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20728885E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23474253E-01, 0.52768286E-06, 0.40649200E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 16, 0.41015447E+01, 0.20728885E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20748082E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19197380E-01, 0.41898013E-06, 0.41824028E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 17, 0.40895921E+01, 0.20748082E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20763126E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15043831E-01, 0.31911449E-06, 0.43019329E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 18, 0.40785311E+01, 0.20763126E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20774525E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11399851E-01, 0.24089545E-06, 0.44238230E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 19, 0.40682894E+01, 0.20774525E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20781940E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74154746E-02, 0.16582939E-06, 0.45476737E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 20, 0.40587996E+01, 0.20781940E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20785553E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36124411E-02, 0.89331469E-07, 0.46733922E+05, + 0.104E+06, 0.300E+03, 2, 30, 2, 21, 0.40500000E+01, 0.20785553E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20785553E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 1, 0.44577475E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20047545E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47551441E-01, 0.61721901E-05, 0.26982001E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 2, 0.44185824E+01, 0.20047545E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20097092E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49538999E-01,-0.78222087E-05, 0.27736724E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 3, 0.43822892E+01, 0.20097092E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20147679E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50579264E-01,-0.73350647E-05, 0.28530996E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 4, 0.43487063E+01, 0.20147679E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20197098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49414475E-01,-0.45769048E-05, 0.29363910E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 5, 0.43176788E+01, 0.20197098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20245652E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48552197E-01,-0.22672200E-05, 0.30237032E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 6, 0.42890440E+01, 0.20245652E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20292683E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47029783E-01,-0.74231188E-06, 0.31145016E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 7, 0.42626344E+01, 0.20292683E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20337629E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44946236E-01, 0.16004445E-06, 0.32086284E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 8, 0.42382878E+01, 0.20337629E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20380030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42402147E-01, 0.62735009E-06, 0.33059267E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 9, 0.42158483E+01, 0.20380030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20419524E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39494759E-01, 0.82112077E-06, 0.34062432E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 10, 0.41951677E+01, 0.20419524E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20455838E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36314604E-01, 0.85607552E-06, 0.35094300E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 11, 0.41761063E+01, 0.20455838E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20488781E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32943436E-01, 0.80645748E-06, 0.36153453E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 12, 0.41585330E+01, 0.20488781E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20518233E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29453184E-01, 0.71738704E-06, 0.37238550E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 13, 0.41423258E+01, 0.20518233E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20544138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25905673E-01, 0.61475563E-06, 0.38348323E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 14, 0.41273716E+01, 0.20544138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20566491E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22352891E-01, 0.51238887E-06, 0.39481588E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 15, 0.41135656E+01, 0.20566491E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20585328E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18837615E-01, 0.41685988E-06, 0.40637240E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 16, 0.41008118E+01, 0.20585328E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20600722E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15394246E-01, 0.33057269E-06, 0.41814252E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 17, 0.40890215E+01, 0.20600722E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20612771E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12049756E-01, 0.25157629E-06, 0.43011677E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 18, 0.40781155E+01, 0.20612771E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20621902E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91311783E-02, 0.18995637E-06, 0.44232431E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 19, 0.40680207E+01, 0.20621902E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20627842E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59395558E-02, 0.13112259E-06, 0.45472965E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 20, 0.40586695E+01, 0.20627842E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20630735E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28932596E-02, 0.71401056E-07, 0.46732085E+05, + 0.105E+06, 0.300E+03, 2, 31, 2, 21, 0.40500000E+01, 0.20630735E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20630735E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 1, 0.44558089E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20038187E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38191804E-01, 0.49337566E-05, 0.26957755E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 2, 0.44165771E+01, 0.20038187E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20077966E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39773284E-01,-0.63066479E-05, 0.27711472E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 3, 0.43802573E+01, 0.20077966E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20118541E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40569134E-01,-0.58877248E-05, 0.28505236E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 4, 0.43466860E+01, 0.20118541E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20158114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39568779E-01,-0.36518273E-05, 0.29338783E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 5, 0.43157035E+01, 0.20158114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20197037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38921563E-01,-0.17945091E-05, 0.30212316E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 6, 0.42871409E+01, 0.20197037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20234763E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37724712E-01,-0.57637650E-06, 0.31121061E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 7, 0.42608259E+01, 0.20234763E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20270827E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36064446E-01, 0.14025394E-06, 0.32063383E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 8, 0.42365916E+01, 0.20270827E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20304853E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34026420E-01, 0.50894315E-06, 0.33037660E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 9, 0.42142776E+01, 0.20304853E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20336544E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31692155E-01, 0.65983993E-06, 0.34042308E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 10, 0.41937321E+01, 0.20336544E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20365680E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29136694E-01, 0.68481867E-06, 0.35075797E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 11, 0.41748116E+01, 0.20365680E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20392107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26427230E-01, 0.64313415E-06, 0.36136671E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 12, 0.41573823E+01, 0.20392107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20415729E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23622495E-01, 0.57068781E-06, 0.37223548E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 13, 0.41413197E+01, 0.20415729E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20436501E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20772703E-01, 0.48800524E-06, 0.38335130E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 14, 0.41265085E+01, 0.20436501E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20454420E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17919883E-01, 0.40599259E-06, 0.39470206E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 15, 0.41128426E+01, 0.20454420E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20469519E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15098477E-01, 0.32978390E-06, 0.40627650E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 16, 0.41002243E+01, 0.20469519E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20481854E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12336068E-01, 0.26120666E-06, 0.41806417E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 17, 0.40885643E+01, 0.20481854E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20491508E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96541818E-02, 0.19863391E-06, 0.43005544E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 18, 0.40777824E+01, 0.20491508E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20498823E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73146050E-02, 0.14999979E-06, 0.44227784E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 19, 0.40678054E+01, 0.20498823E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20503580E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47572226E-02, 0.10376585E-06, 0.45469943E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 20, 0.40585653E+01, 0.20503580E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20505897E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23170376E-02, 0.56982335E-07, 0.46730613E+05, + 0.106E+06, 0.300E+03, 2, 32, 2, 21, 0.40500000E+01, 0.20505897E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20505897E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 1, 0.44542536E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20030631E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30635293E-01, 0.39539835E-05, 0.26938302E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 2, 0.44149683E+01, 0.20030631E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20062541E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31904640E-01,-0.50819331E-05, 0.27691214E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 3, 0.43786274E+01, 0.20062541E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20095086E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32540502E-01,-0.47321323E-05, 0.28484573E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 4, 0.43450659E+01, 0.20095086E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20126823E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31733955E-01,-0.29241140E-05, 0.29318632E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 5, 0.43141196E+01, 0.20126823E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20158035E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31210414E-01,-0.14283763E-05, 0.30192496E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 6, 0.42856149E+01, 0.20158035E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20188282E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30246095E-01,-0.45101854E-06, 0.31101853E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 7, 0.42593759E+01, 0.20188282E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20217192E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28910261E-01, 0.12129570E-06, 0.32045023E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 8, 0.42352317E+01, 0.20217192E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20244463E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27271760E-01, 0.41373821E-06, 0.33020339E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 9, 0.42130187E+01, 0.20244463E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20269859E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25396173E-01, 0.53173996E-06, 0.34026177E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 10, 0.41925815E+01, 0.20269859E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20293202E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23343896E-01, 0.54940212E-06, 0.35060969E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 11, 0.41737742E+01, 0.20293202E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20314371E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21168988E-01, 0.51432204E-06, 0.36123224E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 12, 0.41564605E+01, 0.20314371E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20333289E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18918660E-01, 0.45521530E-06, 0.37211529E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 13, 0.41405138E+01, 0.20333289E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20349922E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16633218E-01, 0.38841109E-06, 0.38324563E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 14, 0.41258174E+01, 0.20349922E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20364268E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14346342E-01, 0.32252740E-06, 0.39461092E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 15, 0.41122636E+01, 0.20364268E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20376353E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12085569E-01, 0.26156908E-06, 0.40619971E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 16, 0.40997539E+01, 0.20376353E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20386226E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98729002E-02, 0.20691978E-06, 0.41800144E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 17, 0.40881983E+01, 0.20386226E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20393951E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77254595E-02, 0.15721768E-06, 0.43000635E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 18, 0.40775159E+01, 0.20393951E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20399803E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58525655E-02, 0.11870967E-06, 0.44224065E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 19, 0.40676331E+01, 0.20399803E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20403609E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38059316E-02, 0.82241398E-07, 0.45467524E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 20, 0.40584819E+01, 0.20403609E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20405463E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18535305E-02, 0.45440858E-07, 0.46729435E+05, + 0.106E+06, 0.300E+03, 2, 33, 2, 21, 0.40500000E+01, 0.20405463E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20405463E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 1, 0.44530064E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20024560E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24563600E-01, 0.31676560E-05, 0.26922703E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 2, 0.44136782E+01, 0.20024560E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20050147E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25582218E-01,-0.40903847E-05, 0.27674968E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 3, 0.43773204E+01, 0.20050147E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20076241E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26090733E-01,-0.38007079E-05, 0.28468004E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 4, 0.43437668E+01, 0.20076241E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20101685E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25441086E-01,-0.23414129E-05, 0.29302475E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 5, 0.43128498E+01, 0.20101685E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20126703E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25017319E-01,-0.11381102E-05, 0.30176608E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 6, 0.42843918E+01, 0.20126703E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20150943E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24239676E-01,-0.35414228E-06, 0.31086458E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 7, 0.42582140E+01, 0.20150943E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20174107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23164187E-01, 0.10320259E-06, 0.32030309E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 8, 0.42341423E+01, 0.20174107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20195953E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21846456E-01, 0.33557579E-06, 0.33006462E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 9, 0.42120102E+01, 0.20195953E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20216292E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20339365E-01, 0.42819875E-06, 0.34013256E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 10, 0.41916601E+01, 0.20216292E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20234983E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18691525E-01, 0.44077628E-06, 0.35049095E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 11, 0.41729437E+01, 0.20234983E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20251929E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16946379E-01, 0.41152925E-06, 0.36112457E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 12, 0.41557226E+01, 0.20251929E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20267071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15141793E-01, 0.36344395E-06, 0.37201909E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 13, 0.41398689E+01, 0.20267071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20280381E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13310036E-01, 0.30952910E-06, 0.38316106E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 14, 0.41252643E+01, 0.20280381E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20291858E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11478016E-01, 0.25660802E-06, 0.39453798E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 15, 0.41118004E+01, 0.20291858E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20301526E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96676908E-02, 0.20782193E-06, 0.40613828E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 16, 0.40993777E+01, 0.20301526E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20309422E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78965612E-02, 0.16422094E-06, 0.41795126E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 17, 0.40879056E+01, 0.20309422E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20315600E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61782134E-02, 0.12467767E-06, 0.42996709E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 18, 0.40773028E+01, 0.20315600E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20320280E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46799014E-02, 0.94120726E-07, 0.44221091E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 19, 0.40674953E+01, 0.20320280E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20323323E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30430528E-02, 0.65271169E-07, 0.45465590E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 20, 0.40584152E+01, 0.20323323E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20324805E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14818818E-02, 0.36230955E-07, 0.46728493E+05, + 0.107E+06, 0.300E+03, 2, 34, 2, 21, 0.40500000E+01, 0.20324805E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20324805E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 1, 0.44520067E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20019685E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19687485E-01, 0.25367453E-05, 0.26910199E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 2, 0.44126441E+01, 0.20019685E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20040193E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20504310E-01,-0.32886639E-05, 0.27661945E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 3, 0.43762728E+01, 0.20040193E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20061106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20910763E-01,-0.30503520E-05, 0.28454724E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 4, 0.43427257E+01, 0.20061106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20081496E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20387816E-01,-0.18744627E-05, 0.29289526E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 5, 0.43118322E+01, 0.20081496E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20101542E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20045154E-01,-0.90742754E-06, 0.30163876E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 6, 0.42834119E+01, 0.20101542E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20120961E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19418538E-01,-0.27888847E-06, 0.31074123E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 7, 0.42572832E+01, 0.20120961E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20139514E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18553245E-01, 0.86656156E-07, 0.32018524E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 8, 0.42332698E+01, 0.20139514E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20157008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17494145E-01, 0.27151744E-06, 0.32995349E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 9, 0.42112028E+01, 0.20157008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20173291E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16283843E-01, 0.34444898E-06, 0.34002911E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 10, 0.41909225E+01, 0.20173291E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20188253E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14961445E-01, 0.35348704E-06, 0.35039590E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 11, 0.41722789E+01, 0.20188253E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20201814E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13561833E-01, 0.32931149E-06, 0.36103841E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 12, 0.41551322E+01, 0.20201814E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20213929E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12115360E-01, 0.29031136E-06, 0.37194211E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 13, 0.41393529E+01, 0.20213929E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20224577E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10647846E-01, 0.24686615E-06, 0.38309340E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 14, 0.41248219E+01, 0.20224577E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20233757E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91807789E-02, 0.20438450E-06, 0.39447965E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 15, 0.41114299E+01, 0.20233757E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20241489E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77316591E-02, 0.16533648E-06, 0.40608915E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 16, 0.40990768E+01, 0.20241489E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20247803E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63144061E-02, 0.13053108E-06, 0.41791113E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 17, 0.40876715E+01, 0.20247803E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20252743E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49397994E-02, 0.99032361E-07, 0.42993570E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 18, 0.40771323E+01, 0.20252743E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20256484E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37414615E-02, 0.74745375E-07, 0.44218713E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 19, 0.40673852E+01, 0.20256484E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20258917E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24326426E-02, 0.51872764E-07, 0.45464044E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 20, 0.40583619E+01, 0.20258917E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20260101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11845499E-02, 0.28894920E-07, 0.46727740E+05, + 0.107E+06, 0.300E+03, 2, 35, 2, 21, 0.40500000E+01, 0.20260101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20260101E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 1, 0.44512057E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20015772E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15773532E-01, 0.20309201E-05, 0.26900180E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 2, 0.44118154E+01, 0.20015772E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20032202E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16428170E-01,-0.26415225E-05, 0.27651511E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 3, 0.43754335E+01, 0.20032202E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20048958E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16752981E-01,-0.24465505E-05, 0.28444082E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 4, 0.43418916E+01, 0.20048958E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20065292E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16332393E-01,-0.15003629E-05, 0.29279152E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 5, 0.43110171E+01, 0.20065292E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20081348E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16055741E-01,-0.72390449E-06, 0.30153677E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 6, 0.42826271E+01, 0.20081348E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20096900E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15551374E-01,-0.22020615E-06, 0.31064244E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 7, 0.42565379E+01, 0.20096900E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20111755E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14855825E-01, 0.72001649E-07, 0.32009087E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 8, 0.42325712E+01, 0.20111755E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20125760E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14005250E-01, 0.21921000E-06, 0.32986451E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 9, 0.42105565E+01, 0.20125760E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20138794E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13033936E-01, 0.27679274E-06, 0.33994631E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 10, 0.41903323E+01, 0.20138794E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20150767E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11973309E-01, 0.28335722E-06, 0.35031982E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 11, 0.41717470E+01, 0.20150767E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20161618E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10851359E-01, 0.26350935E-06, 0.36096946E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 12, 0.41546598E+01, 0.20161618E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20171310E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96924041E-02, 0.23196650E-06, 0.37188052E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 13, 0.41389402E+01, 0.20171310E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20179827E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.85170983E-02, 0.19700432E-06, 0.38303928E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 14, 0.41244681E+01, 0.20179827E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20187170E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73426028E-02, 0.16292610E-06, 0.39443299E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 15, 0.41111337E+01, 0.20187170E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20193353E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61828688E-02, 0.13167678E-06, 0.40604986E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 16, 0.40988363E+01, 0.20193353E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20198401E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50489729E-02, 0.10387738E-06, 0.41787904E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 17, 0.40874844E+01, 0.20198401E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20202351E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39494755E-02, 0.78769077E-07, 0.42991060E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 18, 0.40769961E+01, 0.20202351E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20205342E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29911381E-02, 0.59438358E-07, 0.44216813E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 19, 0.40672972E+01, 0.20205342E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20207286E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19446609E-02, 0.41275055E-07, 0.45462809E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 20, 0.40583193E+01, 0.20207286E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20208233E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.94688049E-03, 0.23052939E-07, 0.46727138E+05, + 0.108E+06, 0.300E+03, 2, 36, 2, 21, 0.40500000E+01, 0.20208233E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20208233E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 1, 0.44505643E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20012657E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12631322E-01,-0.25556982E-04, 0.26892158E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 2, 0.44111519E+01, 0.20012657E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20025825E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13156155E-01,-0.12460258E-04, 0.27643155E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 3, 0.43747612E+01, 0.20025825E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20039239E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13416503E-01, 0.29627551E-05, 0.28435560E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 4, 0.43412235E+01, 0.20039239E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20052311E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13079452E-01, 0.79042095E-05, 0.29270842E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 5, 0.43103643E+01, 0.20052311E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20065159E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12857222E-01, 0.83073591E-05, 0.30145509E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 6, 0.42819986E+01, 0.20065159E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20077604E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12452276E-01, 0.75177201E-05, 0.31056333E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 7, 0.42559411E+01, 0.20077604E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20089492E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11894030E-01, 0.62876872E-05, 0.32001530E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 8, 0.42320120E+01, 0.20089492E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20100699E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11211611E-01, 0.50269795E-05, 0.32979328E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 9, 0.42100391E+01, 0.20100699E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20111127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10432625E-01, 0.38947702E-05, 0.33988002E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 10, 0.41898598E+01, 0.20111127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20120707E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.95823427E-02, 0.29380438E-05, 0.35025894E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 11, 0.41713214E+01, 0.20120707E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20129388E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86832462E-02, 0.21553606E-05, 0.36091428E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 12, 0.41542818E+01, 0.20129388E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20137141E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77548370E-02, 0.15262296E-05, 0.37183124E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 13, 0.41386100E+01, 0.20137141E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20143954E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.68136515E-02, 0.10245617E-05, 0.38299598E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 14, 0.41241851E+01, 0.20143954E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20149827E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58734087E-02, 0.62461661E-06, 0.39439566E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 15, 0.41108967E+01, 0.20149827E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20154771E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49452414E-02, 0.30341539E-06, 0.40601843E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 16, 0.40986439E+01, 0.20154771E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20158809E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40379727E-02, 0.41514794E-07, 0.41785338E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 17, 0.40873348E+01, 0.20158809E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20161968E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31584067E-02,-0.14834075E-06, 0.42989053E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 18, 0.40768871E+01, 0.20161968E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20164360E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23918686E-02,-0.33883107E-06, 0.44215292E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 19, 0.40672268E+01, 0.20164360E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20165916E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15549546E-02,-0.53836896E-06, 0.45461820E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 20, 0.40582852E+01, 0.20165916E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20166648E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75705352E-03, 0.24406161E-04, 0.46726657E+05, + 0.109E+06, 0.300E+03, 2, 37, 2, 21, 0.40500000E+01, 0.20166648E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20166648E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 1, 0.44500505E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20010137E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10116666E-01,-0.20488951E-04, 0.26885731E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 2, 0.44106203E+01, 0.20010137E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20020684E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10536387E-01,-0.99648866E-05, 0.27636461E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 3, 0.43742229E+01, 0.20020684E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20031425E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10743535E-01, 0.23983057E-05, 0.28428735E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 4, 0.43406886E+01, 0.20031425E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20041890E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10472043E-01, 0.63499041E-05, 0.29264190E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 5, 0.43098417E+01, 0.20041890E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20052176E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10292511E-01, 0.66640105E-05, 0.30138970E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 6, 0.42814956E+01, 0.20052176E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20062137E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.99668345E-02, 0.60240716E-05, 0.31050001E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 7, 0.42554635E+01, 0.20062137E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20071651E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.95186425E-02, 0.50335334E-05, 0.31995482E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 8, 0.42315645E+01, 0.20071651E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20080618E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.89712911E-02, 0.40205021E-05, 0.32973628E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 9, 0.42096252E+01, 0.20080618E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20088962E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.83468944E-02, 0.31120473E-05, 0.33982698E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 10, 0.41894819E+01, 0.20088962E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20096625E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76656845E-02, 0.23453480E-05, 0.35021023E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 11, 0.41709809E+01, 0.20096625E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20103569E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69456476E-02, 0.17188420E-05, 0.36087015E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 12, 0.41539795E+01, 0.20103569E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20109770E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62023775E-02, 0.12158173E-05, 0.37179183E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 13, 0.41383459E+01, 0.20109770E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20115218E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54490880E-02, 0.81515353E-06, 0.38296136E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 14, 0.41239588E+01, 0.20115218E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20119915E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46967334E-02, 0.49608717E-06, 0.39436582E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 15, 0.41107072E+01, 0.20119915E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20123869E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39541963E-02, 0.24012423E-06, 0.40599330E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 16, 0.40984900E+01, 0.20123869E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20127097E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32285103E-02, 0.31646498E-07, 0.41783286E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 17, 0.40872151E+01, 0.20127097E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20129622E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25250947E-02,-0.11928467E-06, 0.42987448E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 18, 0.40768000E+01, 0.20129622E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20131535E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19121395E-02,-0.27067286E-06, 0.44214077E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 19, 0.40671705E+01, 0.20131535E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20132778E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12430082E-02,-0.42918599E-06, 0.45461030E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 20, 0.40582580E+01, 0.20132778E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20133364E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60514328E-03, 0.19617565E-04, 0.46726273E+05, + 0.109E+06, 0.300E+03, 2, 38, 2, 21, 0.40500000E+01, 0.20133364E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20133364E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 1, 0.44496391E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20008116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80993075E-02,-0.16731683E-04, 0.26880586E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 2, 0.44101948E+01, 0.20008116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20016559E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84353164E-02,-0.80910342E-05, 0.27631102E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 3, 0.43737918E+01, 0.20016559E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20025158E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86007971E-02, 0.19902560E-05, 0.28423271E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 4, 0.43402604E+01, 0.20025158E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20033536E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.83828418E-02, 0.51986265E-05, 0.29258864E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 5, 0.43094234E+01, 0.20033536E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20041769E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.82383568E-02, 0.54420225E-05, 0.30133736E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 6, 0.42810929E+01, 0.20041769E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20049741E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79768293E-02, 0.49108766E-05, 0.31044933E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 7, 0.42550813E+01, 0.20049741E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20057354E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76172626E-02, 0.40969143E-05, 0.31990642E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 8, 0.42312064E+01, 0.20057354E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20064529E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.71784182E-02, 0.32669461E-05, 0.32969067E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 9, 0.42092940E+01, 0.20064529E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20071205E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66780412E-02, 0.25238395E-05, 0.33978455E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 10, 0.41891795E+01, 0.20071205E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20077335E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61323503E-02, 0.18972925E-05, 0.35017126E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 11, 0.41707085E+01, 0.20077335E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20082889E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55557499E-02, 0.13855852E-05, 0.36083485E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 12, 0.41537377E+01, 0.20082889E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20087849E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49607171E-02, 0.97476825E-06, 0.37176031E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 13, 0.41381347E+01, 0.20087849E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20092206E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43578146E-02, 0.64740875E-06, 0.38293366E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 14, 0.41237778E+01, 0.20092206E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20095962E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37557909E-02, 0.38644317E-06, 0.39434195E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 15, 0.41105557E+01, 0.20095962E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20099123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31617329E-02, 0.17671218E-06, 0.40597321E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 16, 0.40983671E+01, 0.20099123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20101704E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25812464E-02, 0.54371033E-08, 0.41781646E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 17, 0.40871195E+01, 0.20101704E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20103723E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20186453E-02,-0.12067693E-06, 0.42986165E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 18, 0.40767304E+01, 0.20103723E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20105252E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15284160E-02,-0.24684652E-06, 0.44213106E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 19, 0.40671255E+01, 0.20105252E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20106246E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.99332434E-03,-0.37732110E-06, 0.45460399E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 20, 0.40582362E+01, 0.20106246E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20106729E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48325929E-03,-0.48927520E-06, 0.46725965E+05, + 0.110E+06, 0.300E+03, 2, 39, 2, 21, 0.40500000E+01, 0.20106729E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20106729E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 1, 0.44493098E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20006496E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64829221E-02,-0.13401530E-04, 0.26876467E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 2, 0.44098541E+01, 0.20006496E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20013255E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67518422E-02,-0.64727259E-05, 0.27626813E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 3, 0.43734468E+01, 0.20013255E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20020137E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.68840575E-02, 0.16022177E-05, 0.28418897E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 4, 0.43399177E+01, 0.20020137E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20026842E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67092319E-02, 0.41686479E-05, 0.29254601E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 5, 0.43090886E+01, 0.20026842E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20033431E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65931312E-02, 0.43604258E-05, 0.30129547E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 6, 0.42807707E+01, 0.20033431E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20039810E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63833240E-02, 0.39325418E-05, 0.31040877E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 7, 0.42547755E+01, 0.20039810E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20045902E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60950683E-02, 0.32789526E-05, 0.31986769E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 8, 0.42309199E+01, 0.20045902E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20051643E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57434195E-02, 0.26132589E-05, 0.32965417E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 9, 0.42090291E+01, 0.20051643E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20056984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53426082E-02, 0.20176940E-05, 0.33975060E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 10, 0.41889376E+01, 0.20056984E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20061888E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49056326E-02, 0.15158908E-05, 0.35014009E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 11, 0.41704907E+01, 0.20061888E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20066331E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44440290E-02, 0.11063370E-05, 0.36080661E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 12, 0.41535443E+01, 0.20066331E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20070298E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39677829E-02, 0.77775702E-06, 0.37173510E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 13, 0.41379658E+01, 0.20070298E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20073782E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34853419E-02, 0.51611244E-06, 0.38291152E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 14, 0.41236330E+01, 0.20073782E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20076786E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30036972E-02, 0.30768542E-06, 0.39432286E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 15, 0.41104346E+01, 0.20076786E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20079314E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25285080E-02, 0.14030002E-06, 0.40595714E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 16, 0.40982687E+01, 0.20079314E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20081378E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20642471E-02, 0.37043021E-08, 0.41780334E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 17, 0.40870430E+01, 0.20081378E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20082993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16143531E-02,-0.96791782E-07, 0.42985139E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 18, 0.40766747E+01, 0.20082993E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20084215E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12223907E-02,-0.19730355E-06, 0.44212329E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 19, 0.40670895E+01, 0.20084215E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20085010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79459464E-03,-0.30120809E-06, 0.45459894E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 20, 0.40582188E+01, 0.20085010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20085398E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38684775E-03,-0.39030580E-06, 0.46725719E+05, + 0.110E+06, 0.300E+03, 2, 40, 2, 21, 0.40500000E+01, 0.20085398E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20085398E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 1, 0.44490462E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005199E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51882498E-02,-0.10730956E-04, 0.26873171E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 2, 0.44095815E+01, 0.20005199E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20010608E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54034693E-02,-0.51780497E-05, 0.27623380E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 3, 0.43731707E+01, 0.20010608E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20016115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55091580E-02, 0.12879486E-05, 0.28415397E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 4, 0.43396434E+01, 0.20016115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20021481E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53690346E-02, 0.33408743E-05, 0.29251190E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 5, 0.43088207E+01, 0.20021481E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20026754E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52758500E-02, 0.34924577E-05, 0.30126194E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 6, 0.42805129E+01, 0.20026754E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20031858E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51076525E-02, 0.31483047E-05, 0.31037632E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 7, 0.42545307E+01, 0.20031858E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20036732E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48766843E-02, 0.26239380E-05, 0.31983671E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 8, 0.42306907E+01, 0.20036732E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20041325E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45950189E-02, 0.20903265E-05, 0.32962498E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 9, 0.42088171E+01, 0.20041325E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20045597E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42740626E-02, 0.16132197E-05, 0.33972344E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 10, 0.41887441E+01, 0.20045597E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20049521E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39242280E-02, 0.12114417E-05, 0.35011515E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 11, 0.41703164E+01, 0.20049521E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20053074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35547515E-02, 0.88369790E-06, 0.36078402E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 12, 0.41533897E+01, 0.20053074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20056247E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31736230E-02, 0.62089575E-06, 0.37171493E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 13, 0.41378307E+01, 0.20056247E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20059035E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27875977E-02, 0.41174583E-06, 0.38289380E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 14, 0.41235173E+01, 0.20059035E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20061437E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24022630E-02, 0.24522849E-06, 0.39430760E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 15, 0.41103377E+01, 0.20061437E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20063459E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20221385E-02, 0.11157951E-06, 0.40594429E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 16, 0.40981900E+01, 0.20063459E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20065109E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16507940E-02, 0.25740129E-08, 0.41779285E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 17, 0.40869818E+01, 0.20065109E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20066400E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12909718E-02,-0.77573226E-07, 0.42984319E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 18, 0.40766302E+01, 0.20066400E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20067378E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97750121E-03,-0.15771808E-06, 0.44211708E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 19, 0.40670608E+01, 0.20067378E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20068014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63539499E-03,-0.24054252E-06, 0.45459490E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 20, 0.40582049E+01, 0.20068014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20068323E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30933634E-03,-0.31153115E-06, 0.46725523E+05, + 0.111E+06, 0.300E+03, 2, 41, 2, 21, 0.40500000E+01, 0.20068323E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20068323E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 1, 0.44488353E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41516208E-02,-0.85905716E-05, 0.26870533E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 2, 0.44093633E+01, 0.20004160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20008488E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43238440E-02,-0.41421920E-05, 0.27620632E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 3, 0.43729498E+01, 0.20008488E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20012896E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44083420E-02, 0.10342357E-05, 0.28412596E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 4, 0.43394239E+01, 0.20012896E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20017189E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42960852E-02, 0.26763635E-05, 0.29248460E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 5, 0.43086064E+01, 0.20017189E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20021407E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42213514E-02, 0.27964532E-05, 0.30123512E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 6, 0.42803066E+01, 0.20021407E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20025492E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40865788E-02, 0.25199701E-05, 0.31035035E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 7, 0.42543350E+01, 0.20025492E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20029391E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39015830E-02, 0.20995454E-05, 0.31981192E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 8, 0.42305073E+01, 0.20029391E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20033065E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36760411E-02, 0.16720061E-05, 0.32960162E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 9, 0.42086475E+01, 0.20033065E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20036483E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34190916E-02, 0.12899220E-05, 0.33970172E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 10, 0.41885894E+01, 0.20036483E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20039621E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31390732E-02, 0.96830183E-06, 0.35009521E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 11, 0.41701770E+01, 0.20039621E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20042464E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28433797E-02, 0.70605601E-06, 0.36076595E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 12, 0.41532659E+01, 0.20042464E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20045002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25384039E-02, 0.49586314E-06, 0.37169880E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 13, 0.41377226E+01, 0.20045002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20047231E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22295483E-02, 0.32865497E-06, 0.38287964E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 14, 0.41234247E+01, 0.20047231E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20049152E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19212793E-02, 0.19559089E-06, 0.39429539E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 15, 0.41102602E+01, 0.20049152E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20050769E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16172080E-02, 0.88839538E-07, 0.40593401E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 16, 0.40981271E+01, 0.20050769E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20052089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13201849E-02, 0.18117139E-08, 0.41778446E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 17, 0.40869329E+01, 0.20052089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20053122E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10323986E-02,-0.62143473E-07, 0.42983663E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 18, 0.40765946E+01, 0.20053122E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20053904E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78169680E-03,-0.12608936E-06, 0.44211211E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 19, 0.40670378E+01, 0.20053904E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20054412E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50810883E-03,-0.19215361E-06, 0.45459167E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 20, 0.40581937E+01, 0.20054412E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20054660E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24736457E-03,-0.24875772E-06, 0.46725366E+05, + 0.112E+06, 0.300E+03, 2, 42, 2, 21, 0.40500000E+01, 0.20054660E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20054660E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 1, 0.44486666E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003329E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33217957E-02,-0.68758523E-05, 0.26868422E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 2, 0.44091888E+01, 0.20003329E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20006792E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34595990E-02,-0.33134477E-05, 0.27618434E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 3, 0.43727730E+01, 0.20006792E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20010318E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35271612E-02, 0.82982688E-06, 0.28410355E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 4, 0.43392483E+01, 0.20010318E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20013753E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34372598E-02, 0.21433320E-05, 0.29246276E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 5, 0.43084349E+01, 0.20013753E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20017128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33773574E-02, 0.22386463E-05, 0.30121366E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 6, 0.42801416E+01, 0.20017128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20020396E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32694078E-02, 0.20167292E-05, 0.31032958E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 7, 0.42541783E+01, 0.20020396E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20023515E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31212772E-02, 0.16798104E-05, 0.31979208E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 8, 0.42303606E+01, 0.20023515E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20026455E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29407183E-02, 0.13373790E-05, 0.32958293E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 9, 0.42085119E+01, 0.20026455E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20029189E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27350502E-02, 0.10314717E-05, 0.33968434E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 10, 0.41884656E+01, 0.20029189E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20031699E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25109493E-02, 0.77406252E-06, 0.35007925E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 11, 0.41700655E+01, 0.20031699E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20033972E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22743332E-02, 0.56424311E-06, 0.36075150E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 12, 0.41531670E+01, 0.20033972E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20036002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20303166E-02, 0.39612711E-06, 0.37168590E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 13, 0.41376362E+01, 0.20036002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20037785E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17832205E-02, 0.26243906E-06, 0.38286830E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 14, 0.41233507E+01, 0.20037785E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20039322E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15366153E-02, 0.15608808E-06, 0.39428562E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 15, 0.41101982E+01, 0.20039322E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20040615E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12933871E-02, 0.70799126E-07, 0.40592579E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 16, 0.40980768E+01, 0.20040615E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20041671E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10558127E-02, 0.12915249E-08, 0.41777775E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 17, 0.40868938E+01, 0.20041671E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20042497E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.82563959E-03,-0.49766197E-07, 0.42983138E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 18, 0.40765661E+01, 0.20042497E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20043122E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62513481E-03,-0.10081035E-06, 0.44210814E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 19, 0.40670194E+01, 0.20043122E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20043528E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40633629E-03,-0.15353920E-06, 0.45458909E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 20, 0.40581848E+01, 0.20043528E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20043726E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19781591E-03,-0.19869735E-06, 0.46725240E+05, + 0.112E+06, 0.300E+03, 2, 43, 2, 21, 0.40500000E+01, 0.20043726E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20043726E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 1, 0.44485316E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002663E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26576343E-02,-0.55026019E-05, 0.26866734E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 2, 0.44090491E+01, 0.20002663E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005434E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27678878E-02,-0.26504436E-05, 0.27616675E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 3, 0.43726316E+01, 0.20005434E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20008255E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28219120E-02, 0.66539116E-06, 0.28408562E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 4, 0.43391078E+01, 0.20008255E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20011003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27499330E-02, 0.17160198E-05, 0.29244529E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 5, 0.43082976E+01, 0.20011003E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20013703E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27019397E-02, 0.17917838E-05, 0.30119649E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 6, 0.42800096E+01, 0.20013703E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20016317E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26155000E-02, 0.16137903E-05, 0.31031296E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 7, 0.42540530E+01, 0.20016317E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20018813E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24969154E-02, 0.13438967E-05, 0.31977622E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 8, 0.42302432E+01, 0.20018813E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20021164E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23523948E-02, 0.10697099E-05, 0.32956798E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 9, 0.42084034E+01, 0.20021164E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20023351E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21877986E-02, 0.82484186E-06, 0.33967044E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 10, 0.41883665E+01, 0.20023351E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20025359E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20084709E-02, 0.61885069E-06, 0.35006649E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 11, 0.41699764E+01, 0.20025359E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20027178E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18191475E-02, 0.45098884E-06, 0.36073994E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 12, 0.41530878E+01, 0.20027178E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20028801E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16239201E-02, 0.31652740E-06, 0.37167558E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 13, 0.41375671E+01, 0.20028801E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20030227E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14262447E-02, 0.20963185E-06, 0.38285924E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 14, 0.41232914E+01, 0.20030227E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20031456E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12289759E-02, 0.12461965E-06, 0.39427781E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 15, 0.41101487E+01, 0.20031456E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20032490E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10344205E-02, 0.56461257E-07, 0.40591922E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 16, 0.40980366E+01, 0.20032490E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20033335E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84439780E-03, 0.93453840E-09, 0.41777239E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 17, 0.40868625E+01, 0.20033335E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20033995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66030333E-03,-0.39845860E-07, 0.42982719E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 18, 0.40765434E+01, 0.20033995E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20034495E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49994298E-03,-0.80605155E-07, 0.44210496E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 19, 0.40670047E+01, 0.20034495E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20034820E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32495799E-03,-0.12270589E-06, 0.45458702E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 20, 0.40581777E+01, 0.20034820E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20034979E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15819717E-03,-0.15875484E-06, 0.46725139E+05, + 0.113E+06, 0.300E+03, 2, 44, 2, 21, 0.40500000E+01, 0.20034979E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20034979E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 1, 0.44484236E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002131E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21261370E-02,-0.44031093E-05, 0.26865383E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 2, 0.44089374E+01, 0.20002131E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004347E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22143428E-02,-0.21200564E-05, 0.27615268E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 3, 0.43725184E+01, 0.20004347E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20006604E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22575439E-02, 0.53326693E-06, 0.28407127E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 4, 0.43389954E+01, 0.20006604E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20008803E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21999263E-02, 0.13736205E-05, 0.29243131E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 5, 0.43081879E+01, 0.20008803E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20010963E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21614878E-02, 0.14339160E-05, 0.30118276E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 6, 0.42799039E+01, 0.20010963E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20013054E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20922881E-02, 0.12912332E-05, 0.31029966E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 7, 0.42539528E+01, 0.20013054E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20015050E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19973735E-02, 0.10750992E-05, 0.31976353E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 8, 0.42301494E+01, 0.20015050E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20016931E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18817153E-02, 0.85560451E-06, 0.32955603E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 9, 0.42083166E+01, 0.20016931E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20018680E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17500048E-02, 0.65962852E-06, 0.33965932E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 10, 0.41882873E+01, 0.20018680E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20020286E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16065193E-02, 0.49480290E-06, 0.35005628E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 11, 0.41699050E+01, 0.20020286E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20021741E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14550478E-02, 0.36051465E-06, 0.36073069E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 12, 0.41530245E+01, 0.20021741E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20023039E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12988641E-02, 0.25297189E-06, 0.37166732E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 13, 0.41375118E+01, 0.20023039E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20024180E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11407318E-02, 0.16749361E-06, 0.38285199E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 14, 0.41232441E+01, 0.20024180E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20025163E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98293382E-03, 0.99530270E-07, 0.39427157E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 15, 0.41101090E+01, 0.20025163E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20025990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.82731398E-03, 0.45054440E-07, 0.40591396E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 16, 0.40980044E+01, 0.20025990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20026665E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67532620E-03, 0.68253807E-09, 0.41776810E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 17, 0.40868375E+01, 0.20026665E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20027194E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52808548E-03,-0.31893936E-07, 0.42982383E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 18, 0.40765252E+01, 0.20027194E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20027593E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39983082E-03,-0.64454313E-07, 0.44210242E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 19, 0.40669929E+01, 0.20027593E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20027853E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25988359E-03,-0.98080959E-07, 0.45458537E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 20, 0.40581720E+01, 0.20027853E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20027980E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12651648E-03,-0.12686782E-06, 0.46725059E+05, + 0.113E+06, 0.300E+03, 2, 45, 2, 21, 0.40500000E+01, 0.20027980E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20027980E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 1, 0.44483372E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001704E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17008511E-02,-0.35229850E-05, 0.26864302E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 2, 0.44088480E+01, 0.20001704E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003477E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17714144E-02,-0.16957766E-05, 0.27614143E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 3, 0.43724279E+01, 0.20003477E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005283E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18059621E-02, 0.42720487E-06, 0.28405980E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 4, 0.43389055E+01, 0.20005283E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20007042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17598481E-02, 0.10993608E-05, 0.29242013E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 5, 0.43081001E+01, 0.20007042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20008770E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17290706E-02, 0.11473936E-05, 0.30117177E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 6, 0.42798195E+01, 0.20008770E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20010442E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16736827E-02, 0.10330677E-05, 0.31028903E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 7, 0.42538726E+01, 0.20010442E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20012039E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15977244E-02, 0.86002848E-06, 0.31975337E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 8, 0.42300743E+01, 0.20012039E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20013544E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15051754E-02, 0.68434773E-06, 0.32954646E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 9, 0.42082472E+01, 0.20013544E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20014943E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13997904E-02, 0.52752161E-06, 0.33965042E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 10, 0.41882240E+01, 0.20014943E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20016228E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12849922E-02, 0.39564597E-06, 0.35004812E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 11, 0.41698480E+01, 0.20016228E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20017391E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11638125E-02, 0.28822298E-06, 0.36072330E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 12, 0.41529739E+01, 0.20017391E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20018430E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10388700E-02, 0.20220739E-06, 0.37166072E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 13, 0.41374676E+01, 0.20018430E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20019342E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91237511E-03, 0.13385268E-06, 0.38284619E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 14, 0.41232062E+01, 0.20019342E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20020128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78615335E-03, 0.79516053E-07, 0.39426657E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 15, 0.41100773E+01, 0.20020128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20020790E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66167879E-03, 0.35967523E-07, 0.40590976E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 16, 0.40979787E+01, 0.20020790E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20021330E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54011356E-03, 0.50601931E-09, 0.41776466E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 17, 0.40868175E+01, 0.20021330E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20021752E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42234864E-03,-0.25525682E-07, 0.42982115E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 18, 0.40765106E+01, 0.20021752E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20022072E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31977108E-03,-0.51542403E-07, 0.44210039E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 19, 0.40669835E+01, 0.20022072E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20022280E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20784446E-03,-0.78406778E-07, 0.45458405E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 20, 0.40581675E+01, 0.20022280E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20022381E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10118219E-03,-0.10140282E-06, 0.46724995E+05, + 0.114E+06, 0.300E+03, 2, 46, 2, 21, 0.40500000E+01, 0.20022381E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20022381E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 1, 0.44482680E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001363E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13605815E-02,-0.28185781E-05, 0.26863437E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 2, 0.44087765E+01, 0.20001363E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002782E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14170287E-02,-0.13563878E-05, 0.27613242E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 3, 0.43723555E+01, 0.20002782E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004226E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14446571E-02, 0.34212685E-06, 0.28405062E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 4, 0.43388336E+01, 0.20004226E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005633E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14077549E-02, 0.87974596E-06, 0.29241118E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 5, 0.43080298E+01, 0.20005633E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20007015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13831169E-02, 0.91803919E-06, 0.30116298E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 6, 0.42797519E+01, 0.20007015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20008353E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13387906E-02, 0.82646924E-06, 0.31028052E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 7, 0.42538085E+01, 0.20008353E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20009630E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12780098E-02, 0.68795836E-06, 0.31974525E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 8, 0.42300142E+01, 0.20009630E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20010834E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12039596E-02, 0.54736638E-06, 0.32953881E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 9, 0.42081917E+01, 0.20010834E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20011953E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11196448E-02, 0.42188237E-06, 0.33964331E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 10, 0.41881733E+01, 0.20011953E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20012981E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10278041E-02, 0.31637716E-06, 0.35004158E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 11, 0.41698024E+01, 0.20012981E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20013911E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.93086316E-03, 0.23044636E-06, 0.36071738E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 12, 0.41529334E+01, 0.20013911E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20014742E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.83091655E-03, 0.16165047E-06, 0.37165544E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 13, 0.41374323E+01, 0.20014742E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20015472E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72973230E-03, 0.10698706E-06, 0.38284156E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 14, 0.41231759E+01, 0.20015472E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20016100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62877013E-03, 0.63539123E-07, 0.39426258E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 15, 0.41100520E+01, 0.20016100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20016629E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52920865E-03, 0.28725665E-07, 0.40590640E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 16, 0.40979581E+01, 0.20016629E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20017061E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43197688E-03, 0.37791944E-09, 0.41776192E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 17, 0.40868015E+01, 0.20017061E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20017399E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33778692E-03,-0.20426470E-07, 0.42981900E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 18, 0.40764990E+01, 0.20017399E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20017655E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25574536E-03,-0.41217595E-07, 0.44209876E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 19, 0.40669760E+01, 0.20017655E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20017821E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16622808E-03,-0.62686505E-07, 0.45458300E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 20, 0.40581638E+01, 0.20017821E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20017902E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80922237E-04,-0.81058927E-07, 0.46724943E+05, + 0.115E+06, 0.300E+03, 2, 47, 2, 21, 0.40500000E+01, 0.20017902E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20017902E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 1, 0.44482128E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10883520E-02,-0.22548818E-05, 0.26862746E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 2, 0.44087193E+01, 0.20001091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002225E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11335055E-02,-0.10849107E-05, 0.27612522E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 3, 0.43722976E+01, 0.20002225E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003381E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11556010E-02, 0.27392131E-06, 0.28404327E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 4, 0.43387761E+01, 0.20003381E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004506E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11260735E-02, 0.70392935E-06, 0.29240403E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 5, 0.43079736E+01, 0.20004506E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005612E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11063539E-02, 0.73447786E-06, 0.30115595E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 6, 0.42796978E+01, 0.20005612E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20006682E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10708842E-02, 0.66115403E-06, 0.31027371E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 7, 0.42537572E+01, 0.20006682E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20007703E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10222526E-02, 0.55030104E-06, 0.31973876E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 8, 0.42299662E+01, 0.20007703E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20008666E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96300814E-03, 0.43780152E-06, 0.32953269E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 9, 0.42081472E+01, 0.20008666E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20009561E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.89555502E-03, 0.33740376E-06, 0.33963762E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 10, 0.41881328E+01, 0.20009561E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20010383E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.82208454E-03, 0.25300115E-06, 0.35003636E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 11, 0.41697659E+01, 0.20010383E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20011127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74453707E-03, 0.18426476E-06, 0.36071265E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 12, 0.41529010E+01, 0.20011127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20011792E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66458818E-03, 0.12923949E-06, 0.37165122E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 13, 0.41374040E+01, 0.20011792E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20012375E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58365190E-03, 0.85525092E-07, 0.38283785E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 14, 0.41231517E+01, 0.20012375E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20012878E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50289559E-03, 0.50782580E-07, 0.39425938E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 15, 0.41100317E+01, 0.20012878E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20013302E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42326167E-03, 0.22947255E-07, 0.40590371E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 16, 0.40979417E+01, 0.20013302E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20013647E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34549286E-03, 0.28646985E-09, 0.41775972E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 17, 0.40867887E+01, 0.20013647E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20013917E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27015839E-03,-0.16343992E-07, 0.42981728E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 18, 0.40764896E+01, 0.20013917E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20014122E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20454122E-03,-0.32963475E-07, 0.44209746E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 19, 0.40669699E+01, 0.20014122E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20014255E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13294602E-03,-0.50120471E-07, 0.45458215E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 20, 0.40581609E+01, 0.20014255E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20014320E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64719801E-04,-0.64805344E-07, 0.46724902E+05, + 0.115E+06, 0.300E+03, 2, 48, 2, 21, 0.40500000E+01, 0.20014320E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20014320E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 1, 0.44481684E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000888E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.87432792E-03,-0.13312829E-04, 0.26862190E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 2, 0.44086733E+01, 0.20000888E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001778E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91049841E-03, 0.19721184E-04, 0.27611943E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 3, 0.43722510E+01, 0.20001778E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002694E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.92820894E-03, 0.12572982E-04, 0.28403737E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 4, 0.43387298E+01, 0.20002694E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003591E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90433849E-03, 0.78168906E-05, 0.29239828E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 5, 0.43079285E+01, 0.20003591E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004474E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88824666E-03, 0.49399066E-05, 0.30115031E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 6, 0.42796544E+01, 0.20004474E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005330E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.85946297E-03, 0.31423845E-05, 0.31026825E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 7, 0.42537160E+01, 0.20005330E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20006148E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.82011970E-03, 0.18749138E-05, 0.31973355E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 8, 0.42299277E+01, 0.20006148E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20006920E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77229936E-03, 0.96518557E-06, 0.32952779E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 9, 0.42081116E+01, 0.20006920E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20007637E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.71795158E-03, 0.30740958E-06, 0.33963306E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 10, 0.41881003E+01, 0.20007637E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20008296E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65884243E-03,-0.16778450E-06, 0.35003218E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 11, 0.41697366E+01, 0.20008296E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20008893E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59652833E-03,-0.50868663E-06, 0.36070886E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 12, 0.41528751E+01, 0.20008893E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20009427E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53234804E-03,-0.75050774E-06, 0.37164784E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 13, 0.41373813E+01, 0.20009427E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20009895E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46742757E-03,-0.91972823E-06, 0.38283488E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 14, 0.41231323E+01, 0.20009895E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20010299E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40269349E-03,-0.10365946E-05, 0.39425682E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 15, 0.41100155E+01, 0.20010299E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20010639E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33889125E-03,-0.11166922E-05, 0.40590155E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 16, 0.40979285E+01, 0.20010639E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20010916E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27660581E-03,-0.11719943E-05, 0.41775797E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 17, 0.40867784E+01, 0.20010916E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20011134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21628284E-03,-0.11623580E-05, 0.42981591E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 18, 0.40764822E+01, 0.20011134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20011299E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16374251E-03,-0.12238181E-05, 0.44209642E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 19, 0.40669651E+01, 0.20011299E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20011407E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10640856E-03,-0.13096624E-05, 0.45458147E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 20, 0.40581586E+01, 0.20011407E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20011434E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51751786E-04, 0.24129024E-04, 0.46724869E+05, + 0.116E+06, 0.300E+03, 2, 49, 2, 21, 0.40500000E+01, 0.20011434E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20011434E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 1, 0.44481329E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000709E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69830753E-03,-0.10636897E-04, 0.26861747E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 2, 0.44086366E+01, 0.20000709E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001420E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72698965E-03, 0.15741368E-04, 0.27611481E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 3, 0.43722138E+01, 0.20001420E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002151E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74108966E-03, 0.10029892E-04, 0.28403266E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 4, 0.43386929E+01, 0.20002151E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002867E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72215930E-03, 0.62356268E-05, 0.29239369E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 5, 0.43078925E+01, 0.20002867E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003573E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70953197E-03, 0.39435265E-05, 0.30114580E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 6, 0.42796197E+01, 0.20003573E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004257E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.68679439E-03, 0.25126381E-05, 0.31026389E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 7, 0.42536831E+01, 0.20004257E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004911E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65560234E-03, 0.15031998E-05, 0.31972938E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 8, 0.42298968E+01, 0.20004911E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005528E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61759331E-03, 0.77775700E-06, 0.32952386E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 9, 0.42080832E+01, 0.20005528E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20006102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57431417E-03, 0.25231317E-06, 0.33962941E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 10, 0.41880743E+01, 0.20006102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20006629E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52717489E-03,-0.12803940E-06, 0.35002883E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 11, 0.41697132E+01, 0.20006629E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20007107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47742328E-03,-0.40148493E-06, 0.36070583E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 12, 0.41528543E+01, 0.20007107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20007534E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42613587E-03,-0.59589375E-06, 0.37164513E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 13, 0.41373632E+01, 0.20007534E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20007909E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37422020E-03,-0.73226728E-06, 0.38283250E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 14, 0.41231168E+01, 0.20007909E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20008232E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32242463E-03,-0.82669156E-06, 0.39425477E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 15, 0.41100025E+01, 0.20008232E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20008504E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27135261E-03,-0.89158553E-06, 0.40589983E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 16, 0.40979179E+01, 0.20008504E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20008727E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22147921E-03,-0.93650271E-06, 0.41775656E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 17, 0.40867702E+01, 0.20008727E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20008901E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17316813E-03,-0.92932936E-06, 0.42981481E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 18, 0.40764762E+01, 0.20008901E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20009033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13108594E-03,-0.97887962E-06, 0.44209559E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 19, 0.40669613E+01, 0.20009033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20009119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.85171805E-04,-0.10477958E-05, 0.45458093E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 20, 0.40581567E+01, 0.20009119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20009141E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41415943E-04, 0.19204642E-04, 0.46724843E+05, + 0.116E+06, 0.300E+03, 2, 50, 2, 21, 0.40500000E+01, 0.20009141E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20009141E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 1, 0.44481045E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000566E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55782158E-03,-0.85029818E-05, 0.26861392E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 2, 0.44086073E+01, 0.20000566E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001135E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58075111E-03, 0.12574514E-04, 0.27611112E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 3, 0.43721842E+01, 0.20001135E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001719E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59204922E-03, 0.80119523E-05, 0.28402889E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 4, 0.43386634E+01, 0.20001719E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002291E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57697475E-03, 0.49814662E-05, 0.29239002E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 5, 0.43078637E+01, 0.20002291E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002854E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56694592E-03, 0.31510646E-05, 0.30114219E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 6, 0.42795920E+01, 0.20002854E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003401E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54884333E-03, 0.20086291E-05, 0.31026040E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 7, 0.42536568E+01, 0.20003401E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003924E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52398290E-03, 0.12026389E-05, 0.31972605E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 8, 0.42298722E+01, 0.20003924E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004417E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49366729E-03, 0.62326880E-06, 0.32952072E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 9, 0.42080604E+01, 0.20004417E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004876E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45912869E-03, 0.20345567E-06, 0.33962649E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 10, 0.41880535E+01, 0.20004876E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005298E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42149177E-03,-0.10060252E-06, 0.35002615E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 11, 0.41696945E+01, 0.20005298E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005680E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38175329E-03,-0.31934605E-06, 0.36070340E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 12, 0.41528377E+01, 0.20005680E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20006021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34077429E-03,-0.47498861E-06, 0.37164297E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 13, 0.41373487E+01, 0.20006021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20006321E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29928157E-03,-0.58426536E-06, 0.38283060E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 14, 0.41231043E+01, 0.20006321E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20006579E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25787515E-03,-0.66000592E-06, 0.39425314E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 15, 0.41099921E+01, 0.20006579E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20006797E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21703943E-03,-0.71211752E-06, 0.40589845E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 16, 0.40979095E+01, 0.20006797E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20006975E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17715612E-03,-0.74822673E-06, 0.41775543E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 17, 0.40867636E+01, 0.20006975E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20007114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13851778E-03,-0.74266074E-06, 0.42981393E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 18, 0.40764714E+01, 0.20007114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20007220E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10485872E-03,-0.78240082E-06, 0.44209492E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 19, 0.40669582E+01, 0.20007220E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20007289E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.68132199E-04,-0.83759899E-06, 0.45458050E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 20, 0.40581552E+01, 0.20007289E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20007307E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33130832E-04, 0.15332399E-04, 0.46724822E+05, + 0.117E+06, 0.300E+03, 2, 51, 2, 21, 0.40500000E+01, 0.20007307E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20007307E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 1, 0.44480819E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000452E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44567033E-03,-0.67479098E-05, 0.26861109E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 2, 0.44085838E+01, 0.20000452E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000906E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46399714E-03, 0.99578578E-05, 0.27610817E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 3, 0.43721604E+01, 0.20000906E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001373E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47303549E-03, 0.63475179E-05, 0.28402589E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 4, 0.43386399E+01, 0.20001373E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001830E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46100610E-03, 0.39477047E-05, 0.29238709E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 5, 0.43078407E+01, 0.20001830E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002281E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45300958E-03, 0.24972312E-05, 0.30113931E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 6, 0.42795699E+01, 0.20002281E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002718E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43856150E-03, 0.15914380E-05, 0.31025761E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 7, 0.42536358E+01, 0.20002718E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003135E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41871125E-03, 0.95194613E-06, 0.31972339E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 8, 0.42298525E+01, 0.20003135E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003529E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39449819E-03, 0.49184491E-06, 0.32951822E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 9, 0.42080422E+01, 0.20003529E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003896E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36690597E-03, 0.15804120E-06, 0.33962416E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 10, 0.41880369E+01, 0.20003896E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004233E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33683298E-03,-0.84145313E-07, 0.35002401E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 11, 0.41696796E+01, 0.20004233E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004538E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30507594E-03,-0.25882870E-06, 0.36070146E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 12, 0.41528244E+01, 0.20004538E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004811E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27232365E-03,-0.38360012E-06, 0.37164124E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 13, 0.41373371E+01, 0.20004811E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23915802E-03,-0.47172329E-06, 0.38282908E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 14, 0.41230944E+01, 0.20005051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005257E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20605999E-03,-0.53336531E-06, 0.39425183E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 15, 0.41099838E+01, 0.20005257E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005431E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17341838E-03,-0.57637841E-06, 0.40589735E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 16, 0.40979028E+01, 0.20005431E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005574E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14154018E-03,-0.60681241E-06, 0.41775453E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 17, 0.40867584E+01, 0.20005574E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005685E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11066133E-03,-0.60541842E-06, 0.42981323E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 18, 0.40764676E+01, 0.20005685E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005769E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.83767439E-04,-0.63955420E-06, 0.44209439E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 19, 0.40669557E+01, 0.20005769E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005824E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54433367E-04,-0.68476061E-06, 0.45458015E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 20, 0.40581540E+01, 0.20005824E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005852E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26490958E-04,-0.70612795E-06, 0.46724805E+05, + 0.118E+06, 0.300E+03, 2, 52, 2, 21, 0.40500000E+01, 0.20005852E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20005852E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 1, 0.44480638E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000362E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35611795E-03,-0.53929461E-05, 0.26860882E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 2, 0.44085651E+01, 0.20000362E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000724E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37076613E-03, 0.79571331E-05, 0.27610581E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 3, 0.43721415E+01, 0.20000724E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001097E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37799360E-03, 0.50720932E-05, 0.28402349E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 4, 0.43386211E+01, 0.20001097E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001462E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36838712E-03, 0.31544398E-05, 0.29238475E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 5, 0.43078223E+01, 0.20001462E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001822E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36200405E-03, 0.19954113E-05, 0.30113701E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 6, 0.42795522E+01, 0.20001822E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002172E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35046636E-03, 0.12716525E-05, 0.31025538E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 7, 0.42536190E+01, 0.20002172E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002506E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33461244E-03, 0.76069336E-06, 0.31972126E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 8, 0.42298368E+01, 0.20002506E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002820E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31527269E-03, 0.39308064E-06, 0.32951621E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 9, 0.42080276E+01, 0.20002820E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29323299E-03, 0.12638914E-06, 0.33962229E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 10, 0.41880236E+01, 0.20003114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003383E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26921110E-03,-0.67098771E-07, 0.35002230E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 11, 0.41696676E+01, 0.20003383E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003627E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24384347E-03,-0.20665005E-06, 0.36069991E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 12, 0.41528138E+01, 0.20003627E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003845E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21768027E-03,-0.30632375E-06, 0.37163985E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 13, 0.41373278E+01, 0.20003845E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004036E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19118611E-03,-0.37672199E-06, 0.38282787E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 14, 0.41230865E+01, 0.20004036E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004202E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16474475E-03,-0.42597017E-06, 0.39425078E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 15, 0.41099771E+01, 0.20004202E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004341E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13866611E-03,-0.46034722E-06, 0.40589647E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 16, 0.40978974E+01, 0.20004341E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004454E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11319450E-03,-0.48468645E-06, 0.41775381E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 17, 0.40867542E+01, 0.20004454E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004543E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88517195E-04,-0.48361187E-06, 0.42981266E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 18, 0.40764646E+01, 0.20004543E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004611E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67021207E-04,-0.51094409E-06, 0.44209397E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 19, 0.40669537E+01, 0.20004611E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004655E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43564113E-04,-0.54716320E-06, 0.45457988E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 20, 0.40581531E+01, 0.20004655E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004677E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21208644E-04,-0.56435801E-06, 0.46724791E+05, + 0.118E+06, 0.300E+03, 2, 53, 2, 21, 0.40500000E+01, 0.20004677E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20004677E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 1, 0.44480493E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000289E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28457614E-03,-0.43099576E-05, 0.26860701E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 2, 0.44085502E+01, 0.20000289E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000579E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29628311E-03, 0.63587218E-05, 0.27610393E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 3, 0.43721264E+01, 0.20000579E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000877E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30206108E-03, 0.40531681E-05, 0.28402157E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 4, 0.43386060E+01, 0.20000877E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001169E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29438746E-03, 0.25207349E-05, 0.29238288E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 5, 0.43078076E+01, 0.20001169E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001456E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28929023E-03, 0.15945552E-05, 0.30113517E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 6, 0.42795380E+01, 0.20001456E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001735E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28007412E-03, 0.10162185E-05, 0.31025360E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 7, 0.42536056E+01, 0.20001735E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26740888E-03, 0.60793080E-06, 0.31971956E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 8, 0.42298242E+01, 0.20002002E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002254E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25195783E-03, 0.31418859E-06, 0.32951461E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 9, 0.42080160E+01, 0.20002254E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002488E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23434879E-03, 0.10108555E-06, 0.33962080E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 10, 0.41880130E+01, 0.20002488E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002703E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21515513E-03,-0.53525923E-07, 0.35002093E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 11, 0.41696580E+01, 0.20002703E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002898E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19488532E-03,-0.16504331E-06, 0.36069868E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 12, 0.41528053E+01, 0.20002898E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17397886E-03,-0.24470100E-06, 0.37163875E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 13, 0.41373204E+01, 0.20003073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003226E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15280697E-03,-0.30096714E-06, 0.38282689E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 14, 0.41230801E+01, 0.20003226E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003358E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13167629E-03,-0.34033584E-06, 0.39424994E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 15, 0.41099718E+01, 0.20003358E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003469E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11083451E-03,-0.36782280E-06, 0.40589576E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 16, 0.40978931E+01, 0.20003469E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003560E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90476947E-04,-0.38728927E-06, 0.41775324E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 17, 0.40867509E+01, 0.20003560E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003631E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70753378E-04,-0.38644523E-06, 0.42981221E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 18, 0.40764621E+01, 0.20003631E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003685E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53571955E-04,-0.40830110E-06, 0.44209362E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 19, 0.40669522E+01, 0.20003685E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003720E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34822363E-04,-0.43725778E-06, 0.45457966E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 20, 0.40581523E+01, 0.20003720E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003738E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16952926E-04,-0.45101000E-06, 0.46724781E+05, + 0.119E+06, 0.300E+03, 2, 54, 2, 21, 0.40500000E+01, 0.20003738E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20003738E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 1, 0.44480377E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000231E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22741334E-03,-0.34443706E-05, 0.26860557E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 2, 0.44085382E+01, 0.20000231E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000463E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23676939E-03, 0.50815381E-05, 0.27610242E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 3, 0.43721143E+01, 0.20000463E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000701E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24138773E-03, 0.32390350E-05, 0.28402003E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 4, 0.43385940E+01, 0.20000701E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000934E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23525664E-03, 0.20143989E-05, 0.29238138E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 5, 0.43077958E+01, 0.20000934E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001164E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23118458E-03, 0.12742572E-05, 0.30113371E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 6, 0.42795267E+01, 0.20001164E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001387E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22382101E-03, 0.81209627E-06, 0.31025218E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 7, 0.42535949E+01, 0.20001387E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001600E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21370102E-03, 0.48582841E-06, 0.31971820E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 8, 0.42298142E+01, 0.20001600E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001801E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20135465E-03, 0.25109527E-06, 0.32951333E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 9, 0.42080067E+01, 0.20001801E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001988E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18728352E-03, 0.80801430E-07, 0.33961961E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 10, 0.41880045E+01, 0.20001988E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17194579E-03,-0.42751618E-07, 0.35001984E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 11, 0.41696504E+01, 0.20002160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002316E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15574777E-03,-0.13186891E-06, 0.36069769E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 12, 0.41527985E+01, 0.20002316E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002455E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13904068E-03,-0.19552699E-06, 0.37163786E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 13, 0.41373145E+01, 0.20002455E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002578E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12212119E-03,-0.24049367E-06, 0.38282612E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 14, 0.41230750E+01, 0.20002578E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002683E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10523438E-03,-0.27195673E-06, 0.39424927E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 15, 0.41099676E+01, 0.20002683E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002772E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88578231E-04,-0.29392515E-06, 0.40589520E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 16, 0.40978896E+01, 0.20002772E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002845E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72308862E-04,-0.30948362E-06, 0.41775278E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 17, 0.40867482E+01, 0.20002845E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002902E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56546018E-04,-0.30881156E-06, 0.42981185E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 18, 0.40764602E+01, 0.20002902E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002945E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42814734E-04,-0.32627866E-06, 0.44209335E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 19, 0.40669509E+01, 0.20002945E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002973E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27830087E-04,-0.34941894E-06, 0.45457948E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 20, 0.40581517E+01, 0.20002973E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13548812E-04,-0.36041068E-06, 0.46724772E+05, + 0.119E+06, 0.300E+03, 2, 55, 2, 21, 0.40500000E+01, 0.20002987E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002987E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 1, 0.44480285E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000184E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18173513E-03,-0.27525807E-05, 0.26860441E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 2, 0.44085287E+01, 0.20000184E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000370E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18921219E-03, 0.40609250E-05, 0.27610122E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 3, 0.43721046E+01, 0.20000370E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000560E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19290321E-03, 0.25884617E-05, 0.28401881E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 4, 0.43385844E+01, 0.20000560E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000746E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18800394E-03, 0.16097867E-05, 0.29238019E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 5, 0.43077864E+01, 0.20000746E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000930E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18475014E-03, 0.10183026E-05, 0.30113253E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 6, 0.42795177E+01, 0.20000930E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001108E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17886594E-03, 0.64896990E-06, 0.31025104E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 7, 0.42535863E+01, 0.20001108E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001279E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17077893E-03, 0.38823781E-06, 0.31971712E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 8, 0.42298061E+01, 0.20001279E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001439E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16091266E-03, 0.20065412E-06, 0.32951231E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 9, 0.42079993E+01, 0.20001439E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001589E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14966800E-03, 0.64568964E-07, 0.33961866E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 10, 0.41879977E+01, 0.20001589E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001726E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13741107E-03,-0.34166445E-07, 0.35001896E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 11, 0.41696443E+01, 0.20001726E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001851E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12446657E-03,-0.10538066E-06, 0.36069690E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 12, 0.41527931E+01, 0.20001851E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001962E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11111519E-03,-0.15625102E-06, 0.37163716E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 13, 0.41373098E+01, 0.20001962E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97594001E-04,-0.19218318E-06, 0.38282550E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 14, 0.41230710E+01, 0.20002060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002144E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84098878E-04,-0.21732682E-06, 0.39424874E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 15, 0.41099642E+01, 0.20002144E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002215E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70788043E-04,-0.23488097E-06, 0.40589475E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 16, 0.40978869E+01, 0.20002215E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002273E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57786275E-04,-0.24731383E-06, 0.41775241E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 17, 0.40867460E+01, 0.20002273E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002319E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45189276E-04,-0.24677498E-06, 0.42981157E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 18, 0.40764586E+01, 0.20002319E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002353E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34215801E-04,-0.26073364E-06, 0.44209314E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 19, 0.40669499E+01, 0.20002353E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002376E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22240678E-04,-0.27922340E-06, 0.45457934E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 20, 0.40581512E+01, 0.20002376E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002387E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10827659E-04,-0.28800785E-06, 0.46724765E+05, + 0.120E+06, 0.300E+03, 2, 56, 2, 21, 0.40500000E+01, 0.20002387E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20002387E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 1, 0.44480211E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000147E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14523244E-03,-0.21997157E-05, 0.26860349E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 2, 0.44085210E+01, 0.20000147E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000295E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15120777E-03, 0.32453033E-05, 0.27610026E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 3, 0.43720969E+01, 0.20000295E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000447E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15415751E-03, 0.20685643E-05, 0.28401783E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 4, 0.43385767E+01, 0.20000447E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000596E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15024234E-03, 0.12864477E-05, 0.29237923E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 5, 0.43077789E+01, 0.20000596E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000743E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14764212E-03, 0.81376140E-06, 0.30113159E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 6, 0.42795105E+01, 0.20000743E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000886E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14293982E-03, 0.51860899E-06, 0.31025013E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 7, 0.42535795E+01, 0.20000886E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001022E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13647714E-03, 0.31024636E-06, 0.31971625E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 8, 0.42297997E+01, 0.20001022E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001150E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12859257E-03, 0.16034104E-06, 0.32951149E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 9, 0.42079934E+01, 0.20001150E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001270E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11960645E-03, 0.51591337E-07, 0.33961790E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 10, 0.41879923E+01, 0.20001270E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001380E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10981138E-03,-0.27309884E-07, 0.35001826E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 11, 0.41696394E+01, 0.20001380E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001479E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.99466831E-04,-0.84218753E-07, 0.36069626E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 12, 0.41527888E+01, 0.20001479E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001568E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88797127E-04,-0.12486855E-06, 0.37163659E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 13, 0.41373060E+01, 0.20001568E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001646E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77991727E-04,-0.15358285E-06, 0.38282500E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 14, 0.41230677E+01, 0.20001646E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001714E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67207157E-04,-0.17367250E-06, 0.39424831E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 15, 0.41099615E+01, 0.20001714E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001770E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56569863E-04,-0.18769985E-06, 0.40589439E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 16, 0.40978847E+01, 0.20001770E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001817E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46179562E-04,-0.19763397E-06, 0.41775212E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 17, 0.40867443E+01, 0.20001817E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001853E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36112734E-04,-0.19720302E-06, 0.42981134E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 18, 0.40764574E+01, 0.20001853E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001881E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27343340E-04,-0.20835429E-06, 0.44209296E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 19, 0.40669491E+01, 0.20001881E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001899E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17773491E-04,-0.22313195E-06, 0.45457923E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 20, 0.40581508E+01, 0.20001899E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001908E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86528495E-05,-0.23014861E-06, 0.46724760E+05, + 0.121E+06, 0.300E+03, 2, 57, 2, 21, 0.40500000E+01, 0.20001908E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001908E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 1, 0.44480150E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000086E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12638835E-03, 0.40524890E-04, 0.26860272E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 2, 0.44085148E+01, 0.20000086E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000214E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12635699E-03,-0.17249537E-05, 0.27609947E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 3, 0.43720906E+01, 0.20000214E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000342E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12553570E-03,-0.28739485E-05, 0.28401704E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 4, 0.43385706E+01, 0.20000342E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000466E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12029753E-03,-0.35228952E-05, 0.29237847E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 5, 0.43077730E+01, 0.20000466E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000587E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11685988E-03,-0.36053836E-05, 0.30113085E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 6, 0.42795048E+01, 0.20000587E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000703E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11217164E-03,-0.41060116E-05, 0.31024942E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 7, 0.42535740E+01, 0.20000703E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000814E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10639035E-03,-0.44601521E-05, 0.31971557E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 8, 0.42297947E+01, 0.20000814E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000918E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.99710128E-04,-0.46709710E-05, 0.32951085E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 9, 0.42079887E+01, 0.20000918E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.92333625E-04,-0.47537102E-05, 0.33961731E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 10, 0.41879881E+01, 0.20001015E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84455783E-04,-0.47287280E-05, 0.35001772E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 11, 0.41696356E+01, 0.20001104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001185E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76254908E-04,-0.46174768E-05, 0.36069577E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 12, 0.41527854E+01, 0.20001185E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001258E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67888370E-04,-0.44402932E-05, 0.37163615E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 13, 0.41373030E+01, 0.20001258E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001321E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59491237E-04,-0.42152670E-05, 0.38282461E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 14, 0.41230652E+01, 0.20001321E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001376E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51176728E-04,-0.39577905E-05, 0.39424798E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 15, 0.41099593E+01, 0.20001376E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001423E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43037717E-04,-0.36805100E-05, 0.40589411E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 16, 0.40978829E+01, 0.20001423E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001462E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35148808E-04,-0.33935027E-05, 0.41775189E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 17, 0.40867430E+01, 0.20001462E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001492E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27568628E-04,-0.30238657E-05, 0.42981116E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 18, 0.40764564E+01, 0.20001492E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001516E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21044666E-04,-0.28246516E-05, 0.44209282E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 19, 0.40669485E+01, 0.20001516E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001533E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13977595E-04,-0.26464372E-05, 0.45457914E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 20, 0.40581505E+01, 0.20001533E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001514E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73302199E-05, 0.26596348E-04, 0.46724755E+05, + 0.121E+06, 0.300E+03, 2, 58, 2, 21, 0.40500000E+01, 0.20001514E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001514E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 1, 0.44480102E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000062E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.93771708E-04, 0.31423638E-04, 0.26860212E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 2, 0.44085098E+01, 0.20000062E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98000561E-04, 0.82395953E-06, 0.27609885E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 3, 0.43720856E+01, 0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000260E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.99896833E-04,-0.10638517E-05, 0.28401640E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 4, 0.43385656E+01, 0.20000260E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000360E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97116123E-04,-0.21905366E-05, 0.29237785E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 5, 0.43077682E+01, 0.20000360E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000457E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.95092695E-04,-0.25849918E-05, 0.30113024E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 6, 0.42795002E+01, 0.20000457E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000552E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91706740E-04,-0.31610051E-05, 0.31024883E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 7, 0.42535697E+01, 0.20000552E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000643E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.87229417E-04,-0.35437740E-05, 0.31971501E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 8, 0.42297906E+01, 0.20000643E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000729E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81903382E-04,-0.37677545E-05, 0.32951033E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 9, 0.42079850E+01, 0.20000729E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000809E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75942755E-04,-0.38640518E-05, 0.33961683E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 10, 0.41879847E+01, 0.20000809E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000882E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69533801E-04,-0.38601284E-05, 0.35001728E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 11, 0.41696325E+01, 0.20000882E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000949E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62836052E-04,-0.37797860E-05, 0.36069537E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 12, 0.41527827E+01, 0.20000949E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55983836E-04,-0.36432436E-05, 0.37163580E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 13, 0.41373007E+01, 0.20001008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001061E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49088213E-04,-0.34673257E-05, 0.38282430E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 14, 0.41230632E+01, 0.20001061E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42239199E-04,-0.32657314E-05, 0.39424771E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 15, 0.41099576E+01, 0.20001106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001145E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35508172E-04,-0.30493500E-05, 0.40589389E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 16, 0.40978816E+01, 0.20001145E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001177E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28950316E-04,-0.28266514E-05, 0.41775171E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 17, 0.40867419E+01, 0.20001177E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001202E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22607028E-04,-0.25379230E-05, 0.42981101E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 18, 0.40764556E+01, 0.20001202E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001221E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17081540E-04,-0.23919256E-05, 0.44209272E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 19, 0.40669480E+01, 0.20001221E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001235E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11057191E-04,-0.22640404E-05, 0.45457907E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 20, 0.40581503E+01, 0.20001235E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001220E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53121559E-05, 0.20078934E-04, 0.46724752E+05, + 0.122E+06, 0.300E+03, 2, 59, 2, 21, 0.40500000E+01, 0.20001220E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20001220E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 1, 0.44480064E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000049E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73601564E-04, 0.24713218E-04, 0.26860165E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 2, 0.44085059E+01, 0.20000049E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77085855E-04, 0.80327204E-06, 0.27609836E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 3, 0.43720816E+01, 0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000205E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78912611E-04,-0.61757679E-06, 0.28401590E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 4, 0.43385617E+01, 0.20000205E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000283E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77108060E-04,-0.15064749E-05, 0.29237736E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 5, 0.43077643E+01, 0.20000283E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000361E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75884752E-04,-0.18525036E-05, 0.30112976E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 6, 0.42794964E+01, 0.20000361E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000437E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73519866E-04,-0.23582556E-05, 0.31024837E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 7, 0.42535662E+01, 0.20000437E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000510E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70208865E-04,-0.27129060E-05, 0.31971457E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 8, 0.42297873E+01, 0.20000510E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000579E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66142586E-04,-0.29361934E-05, 0.32950991E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 9, 0.42079819E+01, 0.20000579E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000643E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61498494E-04,-0.30498608E-05, 0.33961644E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 10, 0.41879819E+01, 0.20000643E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000703E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56435758E-04,-0.30753221E-05, 0.35001692E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 11, 0.41696300E+01, 0.20000703E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000757E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51093093E-04,-0.30322922E-05, 0.36069505E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 12, 0.41527805E+01, 0.20000757E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000806E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45588491E-04,-0.29380564E-05, 0.37163551E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 13, 0.41372987E+01, 0.20000806E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000848E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40020152E-04,-0.28072611E-05, 0.38282405E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 14, 0.41230615E+01, 0.20000848E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000886E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34468118E-04,-0.26519303E-05, 0.39424749E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 15, 0.41099563E+01, 0.20000886E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000917E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28996250E-04,-0.24816910E-05, 0.40589370E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 16, 0.40978804E+01, 0.20000917E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000943E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23654331E-04,-0.23040622E-05, 0.41775156E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 17, 0.40867411E+01, 0.20000943E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000964E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18480113E-04,-0.20707219E-05, 0.42981090E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 18, 0.40764550E+01, 0.20000964E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000980E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13970155E-04,-0.19527250E-05, 0.44209263E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 19, 0.40669476E+01, 0.20000980E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90503514E-05,-0.18487021E-05, 0.45457901E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 20, 0.40581501E+01, 0.20000990E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000980E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43587847E-05, 0.14921860E-04, 0.46724749E+05, + 0.122E+06, 0.300E+03, 2, 60, 2, 21, 0.40500000E+01, 0.20000980E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000980E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 1, 0.44480034E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000039E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58373562E-04, 0.19607799E-04, 0.26860128E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 2, 0.44085028E+01, 0.20000039E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61165768E-04, 0.66698803E-06, 0.27609797E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 3, 0.43720785E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000162E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62682086E-04,-0.44185549E-06, 0.28401550E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 4, 0.43385585E+01, 0.20000162E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000225E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61341166E-04,-0.11387657E-05, 0.29237697E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 5, 0.43077612E+01, 0.20000225E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000287E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60475199E-04,-0.14129872E-05, 0.30112938E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 6, 0.42794935E+01, 0.20000287E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000347E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58701334E-04,-0.18213242E-05, 0.31024799E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 7, 0.42535633E+01, 0.20000347E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000406E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56163658E-04,-0.21141571E-05, 0.31971421E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 8, 0.42297847E+01, 0.20000406E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000461E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53006557E-04,-0.23046167E-05, 0.32950957E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 9, 0.42079795E+01, 0.20000461E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000513E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49367497E-04,-0.24080296E-05, 0.33961612E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 10, 0.41879797E+01, 0.20000513E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000560E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45372315E-04,-0.24401517E-05, 0.35001663E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 11, 0.41696280E+01, 0.20000560E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000604E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41132611E-04,-0.24159638E-05, 0.36069479E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 12, 0.41527787E+01, 0.20000604E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000643E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36744736E-04,-0.23489633E-05, 0.37163528E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 13, 0.41372972E+01, 0.20000643E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000678E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32289908E-04,-0.22508194E-05, 0.38282385E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 14, 0.41230602E+01, 0.20000678E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000708E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27835075E-04,-0.21312910E-05, 0.39424732E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 15, 0.41099551E+01, 0.20000708E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000733E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23434207E-04,-0.19983019E-05, 0.40589355E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 16, 0.40978795E+01, 0.20000733E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000754E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19129796E-04,-0.18581322E-05, 0.41775144E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 17, 0.40867403E+01, 0.20000754E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000771E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14954402E-04,-0.16718524E-05, 0.42981080E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 18, 0.40764545E+01, 0.20000771E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000784E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11311857E-04,-0.15780899E-05, 0.44209256E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 19, 0.40669472E+01, 0.20000784E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000792E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73340177E-05,-0.14951152E-05, 0.45457896E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 20, 0.40581499E+01, 0.20000792E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000784E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35385329E-05, 0.11483377E-04, 0.46724747E+05, + 0.123E+06, 0.300E+03, 2, 61, 2, 21, 0.40500000E+01, 0.20000784E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000784E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 1, 0.44480011E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000031E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46459524E-04, 0.15607954E-04, 0.26860098E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 2, 0.44085004E+01, 0.20000031E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000079E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48690116E-04, 0.53952603E-06, 0.27609766E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 3, 0.43720760E+01, 0.20000079E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000129E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49916626E-04,-0.33745045E-06, 0.28401518E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 4, 0.43385560E+01, 0.20000129E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000179E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48876529E-04,-0.88909348E-06, 0.29237666E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 5, 0.43077588E+01, 0.20000179E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000228E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48220019E-04,-0.11064009E-05, 0.30112907E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 6, 0.42794911E+01, 0.20000228E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000277E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46841930E-04,-0.14327026E-05, 0.31024770E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 7, 0.42535611E+01, 0.20000277E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000323E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44853469E-04,-0.16686611E-05, 0.31971393E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 8, 0.42297826E+01, 0.20000323E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000367E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42366856E-04,-0.18240938E-05, 0.32950931E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 9, 0.42079775E+01, 0.20000367E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000409E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39489732E-04,-0.19106194E-05, 0.33961587E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 10, 0.41879779E+01, 0.20000409E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000447E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36321383E-04,-0.19403109E-05, 0.35001640E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 11, 0.41696264E+01, 0.20000447E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000482E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32950523E-04,-0.19247758E-05, 0.36069458E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 12, 0.41527773E+01, 0.20000482E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000513E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29454294E-04,-0.18745694E-05, 0.37163509E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 13, 0.41372959E+01, 0.20000513E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000541E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25898177E-04,-0.17989016E-05, 0.38282368E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 14, 0.41230591E+01, 0.20000541E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000565E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22336510E-04,-0.17055403E-05, 0.39424718E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 15, 0.41099542E+01, 0.20000565E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000585E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18813392E-04,-0.16008471E-05, 0.40589343E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 16, 0.40978788E+01, 0.20000585E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000602E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15363774E-04,-0.14898959E-05, 0.41775134E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 17, 0.40867398E+01, 0.20000602E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000616E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12014634E-04,-0.13414509E-05, 0.42981073E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 18, 0.40764541E+01, 0.20000616E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000626E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90912982E-05,-0.12669665E-05, 0.44209250E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 19, 0.40669470E+01, 0.20000626E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000633E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58967635E-05,-0.12009002E-05, 0.45457892E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 20, 0.40581498E+01, 0.20000633E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000627E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28475550E-05, 0.90088059E-05, 0.46724745E+05, + 0.124E+06, 0.300E+03, 2, 62, 2, 21, 0.40500000E+01, 0.20000627E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000627E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 1, 0.44479992E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000025E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37029885E-04, 0.12440776E-04, 0.26860075E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 2, 0.44084984E+01, 0.20000025E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000063E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38810471E-04, 0.43287692E-06, 0.27609741E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 3, 0.43720740E+01, 0.20000063E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000103E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39794535E-04,-0.26424623E-06, 0.28401493E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 4, 0.43385540E+01, 0.20000103E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000143E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38974570E-04,-0.70286457E-06, 0.29237641E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 5, 0.43077568E+01, 0.20000143E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000182E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38462319E-04,-0.87566171E-06, 0.30112882E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 6, 0.42794892E+01, 0.20000182E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000221E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37375477E-04,-0.11360662E-05, 0.31024746E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 7, 0.42535593E+01, 0.20000221E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000258E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35801535E-04,-0.13250083E-05, 0.31971370E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 8, 0.42297809E+01, 0.20000258E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000293E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33828995E-04,-0.14501259E-05, 0.32950909E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 9, 0.42079759E+01, 0.20000293E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000326E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31542986E-04,-0.15204919E-05, 0.33961567E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 10, 0.41879764E+01, 0.20000326E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000357E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29022256E-04,-0.15455781E-05, 0.35001622E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 11, 0.41696251E+01, 0.20000357E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000384E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26337385E-04,-0.15345119E-05, 0.36069441E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 12, 0.41527761E+01, 0.20000384E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000410E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23549940E-04,-0.14956367E-05, 0.37163494E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 13, 0.41372949E+01, 0.20000410E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000432E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20712345E-04,-0.14362468E-05, 0.38282355E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 14, 0.41230583E+01, 0.20000432E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000451E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17868245E-04,-0.13625262E-05, 0.39424706E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 15, 0.41099535E+01, 0.20000451E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000467E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15053174E-04,-0.12795528E-05, 0.40589334E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 16, 0.40978782E+01, 0.20000467E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000481E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12295390E-04,-0.11913866E-05, 0.41775126E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 17, 0.40867393E+01, 0.20000481E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000491E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96167874E-05,-0.10730511E-05, 0.42981067E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 18, 0.40764537E+01, 0.20000491E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000500E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72780986E-05,-0.10137660E-05, 0.44209245E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 19, 0.40669467E+01, 0.20000500E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000505E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47216117E-05,-0.96112029E-06, 0.45457889E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 20, 0.40581497E+01, 0.20000505E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000501E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22809751E-05, 0.71334513E-05, 0.46724744E+05, + 0.124E+06, 0.300E+03, 2, 63, 2, 21, 0.40500000E+01, 0.20000501E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000501E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 1, 0.44479977E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29532139E-04, 0.99220253E-05, 0.26860056E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 2, 0.44084968E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000050E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30953133E-04, 0.34621015E-06, 0.27609721E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 3, 0.43720724E+01, 0.20000050E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000082E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31740179E-04,-0.20912146E-06, 0.28401472E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 4, 0.43385524E+01, 0.20000082E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31089350E-04,-0.55855751E-06, 0.29237621E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 5, 0.43077553E+01, 0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000145E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30684629E-04,-0.69621657E-06, 0.30112863E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 6, 0.42794877E+01, 0.20000145E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000176E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29821864E-04,-0.90399744E-06, 0.31024727E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 7, 0.42535579E+01, 0.20000176E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000206E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28570440E-04,-0.10549711E-05, 0.31971352E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 8, 0.42297795E+01, 0.20000206E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000234E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27000613E-04,-0.11551725E-05, 0.32950892E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 9, 0.42079747E+01, 0.20000234E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000260E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25180034E-04,-0.12117732E-05, 0.33961551E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 10, 0.41879753E+01, 0.20000260E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000284E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23171364E-04,-0.12322730E-05, 0.35001607E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 11, 0.41696241E+01, 0.20000284E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000307E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21030837E-04,-0.12239105E-05, 0.36069428E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 12, 0.41527752E+01, 0.20000307E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000327E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18807570E-04,-0.11933118E-05, 0.37163482E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 13, 0.41372941E+01, 0.20000327E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000344E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16543448E-04,-0.11462790E-05, 0.38282345E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 14, 0.41230576E+01, 0.20000344E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000360E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14273389E-04,-0.10877356E-05, 0.39424697E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 15, 0.41099529E+01, 0.20000360E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000373E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12025865E-04,-0.10217362E-05, 0.40589326E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 16, 0.40978777E+01, 0.20000373E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000384E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98235560E-05,-0.95152748E-06, 0.41775120E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 17, 0.40867390E+01, 0.20000384E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000392E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76840595E-05,-0.85714399E-06, 0.42981062E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 18, 0.40764535E+01, 0.20000392E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000399E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58158293E-05,-0.80990174E-06, 0.44209242E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 19, 0.40669466E+01, 0.20000399E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000403E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37733065E-05,-0.76792067E-06, 0.45457887E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 20, 0.40581496E+01, 0.20000403E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000399E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18231772E-05, 0.56725407E-05, 0.46724742E+05, + 0.125E+06, 0.300E+03, 2, 64, 2, 21, 0.40500000E+01, 0.20000399E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000399E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 1, 0.44479965E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23558789E-04, 0.79152199E-05, 0.26860041E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 2, 0.44084956E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000040E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24692691E-04, 0.27652441E-06, 0.27609706E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 3, 0.43720711E+01, 0.20000040E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25321323E-04,-0.16625932E-06, 0.28401456E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 4, 0.43385512E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24803221E-04,-0.44488581E-06, 0.29237605E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 5, 0.43077540E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24481691E-04,-0.55464739E-06, 0.30112847E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 6, 0.42794865E+01, 0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23794839E-04,-0.72043429E-06, 0.31024712E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 7, 0.42535567E+01, 0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000164E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22797877E-04,-0.84097275E-06, 0.31971337E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 8, 0.42297784E+01, 0.20000164E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000186E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21546739E-04,-0.92105034E-06, 0.32950878E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 9, 0.42079737E+01, 0.20000186E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000208E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20095307E-04,-0.96637036E-06, 0.33961538E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 10, 0.41879744E+01, 0.20000208E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000227E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18493517E-04,-0.98289530E-06, 0.35001595E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 11, 0.41696233E+01, 0.20000227E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000245E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16786206E-04,-0.97638706E-06, 0.36069417E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 12, 0.41527745E+01, 0.20000245E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000261E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15012563E-04,-0.95211972E-06, 0.37163472E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 13, 0.41372935E+01, 0.20000261E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000275E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13206025E-04,-0.91471622E-06, 0.38282336E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 14, 0.41230570E+01, 0.20000275E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000287E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11394486E-04,-0.86810559E-06, 0.39424690E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 15, 0.41099525E+01, 0.20000287E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000298E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96007057E-05,-0.81551594E-06, 0.40589320E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 16, 0.40978774E+01, 0.20000298E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000306E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78428252E-05,-0.75954493E-06, 0.41775115E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 17, 0.40867387E+01, 0.20000306E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000313E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61349327E-05,-0.68425321E-06, 0.42981058E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 18, 0.40764533E+01, 0.20000313E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000318E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46434997E-05,-0.64657746E-06, 0.44209239E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 19, 0.40669464E+01, 0.20000318E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000322E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30128170E-05,-0.61309227E-06, 0.45457885E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 20, 0.40581495E+01, 0.20000322E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000319E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14558389E-05, 0.45193875E-05, 0.46724741E+05, + 0.125E+06, 0.300E+03, 2, 65, 2, 21, 0.40500000E+01, 0.20000319E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000319E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 1, 0.44479955E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18795836E-04, 0.63150058E-05, 0.26860029E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 2, 0.44084946E+01, 0.20000012E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000032E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19700609E-04, 0.22073755E-06, 0.27609693E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 3, 0.43720701E+01, 0.20000032E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20202421E-04,-0.13244835E-06, 0.28401443E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 4, 0.43385502E+01, 0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000072E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19789445E-04,-0.35469977E-06, 0.29237593E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 5, 0.43077530E+01, 0.20000072E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000092E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19533385E-04,-0.44225216E-06, 0.30112835E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 6, 0.42794856E+01, 0.20000092E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18985888E-04,-0.57453246E-06, 0.31024700E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 7, 0.42535558E+01, 0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000131E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18190956E-04,-0.67073474E-06, 0.31971326E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 8, 0.42297776E+01, 0.20000131E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17193173E-04,-0.73467413E-06, 0.32950867E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 9, 0.42079729E+01, 0.20000149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000166E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16035499E-04,-0.77089050E-06, 0.33961528E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 10, 0.41879737E+01, 0.20000166E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000181E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14757756E-04,-0.78413310E-06, 0.35001586E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 11, 0.41696226E+01, 0.20000181E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000195E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13395710E-04,-0.77899940E-06, 0.36069408E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 12, 0.41527739E+01, 0.20000195E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000208E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11980627E-04,-0.75968657E-06, 0.37163465E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 13, 0.41372930E+01, 0.20000208E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000219E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10539193E-04,-0.72988707E-06, 0.38282329E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 14, 0.41230566E+01, 0.20000219E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000229E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90936762E-05,-0.69273043E-06, 0.39424684E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 15, 0.41099521E+01, 0.20000229E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000237E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76622505E-05,-0.65079489E-06, 0.40589315E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 16, 0.40978771E+01, 0.20000237E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000244E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62594074E-05,-0.60615324E-06, 0.41775111E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 17, 0.40867384E+01, 0.20000244E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000250E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48964037E-05,-0.54608414E-06, 0.42981055E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 18, 0.40764531E+01, 0.20000250E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000254E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37061186E-05,-0.51602794E-06, 0.44209236E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 19, 0.40669463E+01, 0.20000254E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000257E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24046621E-05,-0.48931490E-06, 0.45457884E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 20, 0.40581495E+01, 0.20000257E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000254E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11620089E-05, 0.36036675E-05, 0.46724741E+05, + 0.126E+06, 0.300E+03, 2, 66, 2, 21, 0.40500000E+01, 0.20000254E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000254E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 1, 0.44479948E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15105826E-04, 0.53480499E-05, 0.26860019E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 2, 0.44084938E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000025E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15800379E-04, 0.17215777E-06, 0.27609683E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 3, 0.43720693E+01, 0.20000025E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16187401E-04,-0.11728932E-06, 0.28401433E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 4, 0.43385493E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000058E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15854769E-04,-0.29774362E-06, 0.29237583E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 5, 0.43077522E+01, 0.20000058E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15659494E-04,-0.36549269E-06, 0.30112825E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 6, 0.42794848E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15241778E-04,-0.47157044E-06, 0.31024690E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 7, 0.42535551E+01, 0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14637589E-04,-0.54710008E-06, 0.31971316E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 8, 0.42297769E+01, 0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13883915E-04,-0.59506739E-06, 0.32950858E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 9, 0.42079723E+01, 0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13016936E-04,-0.61913186E-06, 0.33961520E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 10, 0.41879731E+01, 0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000146E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12070789E-04,-0.62316064E-06, 0.35001578E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 11, 0.41696221E+01, 0.20000146E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000157E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11076823E-04,-0.61091205E-06, 0.36069401E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 12, 0.41527734E+01, 0.20000157E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000168E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10063252E-04,-0.58583580E-06, 0.37163459E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 13, 0.41372926E+01, 0.20000168E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000178E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90550906E-05,-0.55096346E-06, 0.38282324E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 14, 0.41230562E+01, 0.20000178E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000186E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80742886E-05,-0.50886306E-06, 0.39424679E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 15, 0.41099518E+01, 0.20000186E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000194E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.71399933E-05,-0.46166197E-06, 0.40589311E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 16, 0.40978768E+01, 0.20000194E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000200E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62688795E-05,-0.41105100E-06, 0.41775107E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 17, 0.40867382E+01, 0.20000200E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000206E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54755065E-05,-0.33876324E-06, 0.42981052E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 18, 0.40764529E+01, 0.20000206E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000211E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49378862E-05,-0.29354993E-06, 0.44209234E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 19, 0.40669462E+01, 0.20000211E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000216E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43219309E-05,-0.25882067E-06, 0.45457882E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 20, 0.40581494E+01, 0.20000216E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38240501E-05, 0.92624450E-04, 0.46724739E+05, + 0.127E+06, 0.300E+03, 2, 67, 2, 21, 0.40500000E+01, 0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 1, 0.44479948E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13075987E-08,-0.97344757E-05, 0.26860019E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 2, 0.44084938E+01, 0.20000010E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000025E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12204449E-08,-0.15589822E-04, 0.27609683E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 3, 0.43720693E+01, 0.20000025E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86998625E-09,-0.16259270E-04, 0.28401433E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 4, 0.43385493E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000058E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23080550E-09,-0.16097102E-04, 0.29237583E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 5, 0.43077522E+01, 0.20000058E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.68784478E-09,-0.15953539E-04, 0.30112825E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 6, 0.42794848E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19550862E-08,-0.15619451E-04, 0.31024690E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 7, 0.42535551E+01, 0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36351533E-08,-0.15060693E-04, 0.31971316E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 8, 0.42297769E+01, 0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.58073056E-08,-0.14315408E-04, 0.32950858E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 9, 0.42079723E+01, 0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000132E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.85667610E-08,-0.13421246E-04, 0.33961520E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 10, 0.41879731E+01, 0.20000132E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000144E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12025387E-07,-0.12413646E-04, 0.35001578E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 11, 0.41696221E+01, 0.20000144E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000156E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16312527E-07,-0.11324772E-04, 0.36069402E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 12, 0.41527734E+01, 0.20000156E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000166E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21575785E-07,-0.10182938E-04, 0.37163459E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 13, 0.41372926E+01, 0.20000166E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000175E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27981611E-07,-0.90124254E-05, 0.38282324E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 14, 0.41230562E+01, 0.20000175E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000183E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35715881E-07,-0.78335663E-05, 0.39424679E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 15, 0.41099518E+01, 0.20000183E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000189E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44984166E-07,-0.66630110E-05, 0.40589311E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 16, 0.40978768E+01, 0.20000189E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000195E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.56011995E-07,-0.55140567E-05, 0.41775108E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 17, 0.40867383E+01, 0.20000195E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000199E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.69044860E-07,-0.43852767E-05, 0.42981052E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 18, 0.40764530E+01, 0.20000199E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000202E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.87254545E-07,-0.34214590E-05, 0.44209234E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 19, 0.40669462E+01, 0.20000202E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000205E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10590251E-06,-0.23722699E-05, 0.45457882E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 20, 0.40581494E+01, 0.20000205E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000205E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12766182E-06,-0.73657955E-07, 0.46724740E+05, + 0.127E+06, 0.300E+03, 2, 68, 2, 21, 0.40500000E+01, 0.20000205E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000205E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 1, 0.44479945E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53988818E-09,-0.86788235E-05, 0.26860015E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 2, 0.44084935E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61633424E-09,-0.13922545E-04, 0.27609679E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 3, 0.43720689E+01, 0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76549137E-09,-0.14548522E-04, 0.28401429E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 4, 0.43385490E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97151011E-09,-0.14423177E-04, 0.29237579E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 5, 0.43077519E+01, 0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12899909E-08,-0.14313575E-04, 0.30112821E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 6, 0.42794845E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17239048E-08,-0.14036496E-04, 0.31024686E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 7, 0.42535548E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23008639E-08,-0.13564083E-04, 0.31971312E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 8, 0.42297766E+01, 0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30544470E-08,-0.12932673E-04, 0.32950855E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 9, 0.42079720E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40244534E-08,-0.12178173E-04, 0.33961516E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 10, 0.41879728E+01, 0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000130E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52570249E-08,-0.11334702E-04, 0.35001575E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 11, 0.41696219E+01, 0.20000130E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.68050091E-08,-0.10433713E-04, 0.36069399E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 12, 0.41527732E+01, 0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000150E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.87281902E-08,-0.95035557E-05, 0.37163456E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 13, 0.41372924E+01, 0.20000150E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000158E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11093628E-07,-0.85693311E-05, 0.38282322E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 14, 0.41230561E+01, 0.20000158E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000166E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13975781E-07,-0.76530059E-05, 0.39424677E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 15, 0.41099517E+01, 0.20000166E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000173E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17456672E-07,-0.67736481E-05, 0.40589309E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 16, 0.40978767E+01, 0.20000173E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000179E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21626086E-07,-0.59477626E-05, 0.41775106E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 17, 0.40867381E+01, 0.20000179E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000184E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26581547E-07,-0.51721433E-05, 0.42981051E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 18, 0.40764529E+01, 0.20000184E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000189E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33547670E-07,-0.46486835E-05, 0.44209233E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 19, 0.40669462E+01, 0.20000189E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000193E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40705806E-07,-0.40658675E-05, 0.45457881E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 20, 0.40581494E+01, 0.20000193E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49087369E-07, 0.78331892E-04, 0.46724739E+05, + 0.128E+06, 0.300E+03, 2, 69, 2, 21, 0.40500000E+01, 0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 1, 0.44479945E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53166635E-09,-0.86793938E-05, 0.26860015E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 2, 0.44084935E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61398168E-09,-0.13923589E-04, 0.27609679E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 3, 0.43720689E+01, 0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77907316E-09,-0.14549820E-04, 0.28401429E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 4, 0.43385490E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10109579E-08,-0.14424841E-04, 0.29237579E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 5, 0.43077519E+01, 0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13676496E-08,-0.14315815E-04, 0.30112821E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 6, 0.42794845E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18538534E-08,-0.14039543E-04, 0.31024686E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 7, 0.42535548E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25002252E-08,-0.13568215E-04, 0.31971312E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 8, 0.42297766E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33438603E-08,-0.12938235E-04, 0.32950855E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 9, 0.42079720E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44288269E-08,-0.12185587E-04, 0.33961516E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 10, 0.41879728E+01, 0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000130E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58061899E-08,-0.11344486E-04, 0.35001575E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 11, 0.41696219E+01, 0.20000130E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75344481E-08,-0.10446491E-04, 0.36069399E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 12, 0.41527732E+01, 0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000150E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96800553E-08,-0.95200688E-05, 0.37163456E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 13, 0.41372924E+01, 0.20000150E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000159E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12317299E-07,-0.85904615E-05, 0.38282322E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 14, 0.41230561E+01, 0.20000159E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000166E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15528761E-07,-0.76797860E-05, 0.39424677E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 15, 0.41099517E+01, 0.20000166E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000173E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19405537E-07,-0.68072765E-05, 0.40589309E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 16, 0.40978767E+01, 0.20000173E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000179E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24047307E-07,-0.59896209E-05, 0.41775106E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 17, 0.40867381E+01, 0.20000179E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000184E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29562264E-07,-0.52236219E-05, 0.42981051E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 18, 0.40764529E+01, 0.20000184E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000189E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37312105E-07,-0.47139492E-05, 0.44209233E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 19, 0.40669462E+01, 0.20000189E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000193E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45273894E-07,-0.41455129E-05, 0.45457881E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 20, 0.40581494E+01, 0.20000193E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54594614E-07, 0.81525918E-04, 0.46724739E+05, + 0.128E+06, 0.300E+03, 2, 70, 2, 21, 0.40500000E+01, 0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 1, 0.44479945E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52268054E-09,-0.86800503E-05, 0.26860015E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 2, 0.44084935E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61204143E-09,-0.13924780E-04, 0.27609679E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 3, 0.43720689E+01, 0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79614741E-09,-0.14551293E-04, 0.28401429E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 4, 0.43385490E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10588580E-08,-0.14426720E-04, 0.29237579E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 5, 0.43077519E+01, 0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14609880E-08,-0.14318336E-04, 0.30112821E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 6, 0.42794845E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20094861E-08,-0.14042962E-04, 0.31024686E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 7, 0.42535548E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27385007E-08,-0.13572840E-04, 0.31971312E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 8, 0.42297766E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36893471E-08,-0.12944451E-04, 0.32950855E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 9, 0.42079720E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49111016E-08,-0.12193864E-04, 0.33961516E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 10, 0.41879728E+01, 0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000130E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64608078E-08,-0.11355399E-04, 0.35001575E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 11, 0.41696219E+01, 0.20000130E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000141E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84038523E-08,-0.10460734E-04, 0.36069399E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 12, 0.41527732E+01, 0.20000141E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000150E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10814304E-07,-0.95384670E-05, 0.37163456E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 13, 0.41372924E+01, 0.20000150E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000159E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13775134E-07,-0.86139979E-05, 0.38282322E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 14, 0.41230561E+01, 0.20000159E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000166E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17378819E-07,-0.77096061E-05, 0.39424677E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 15, 0.41099517E+01, 0.20000166E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000173E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21727149E-07,-0.68447133E-05, 0.40589309E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 16, 0.40978767E+01, 0.20000173E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000179E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26931399E-07,-0.60362182E-05, 0.41775106E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 17, 0.40867381E+01, 0.20000179E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000185E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33112713E-07,-0.52809110E-05, 0.42981051E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 18, 0.40764529E+01, 0.20000185E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000189E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41796011E-07,-0.47865815E-05, 0.44209233E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 19, 0.40669462E+01, 0.20000189E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000194E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50715074E-07,-0.42341471E-05, 0.45457881E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 20, 0.40581494E+01, 0.20000194E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000109E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61154497E-07, 0.85097644E-04, 0.46724739E+05, + 0.129E+06, 0.300E+03, 2, 71, 2, 21, 0.40500000E+01, 0.20000109E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000109E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 1, 0.44479945E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17240115E-07,-0.86430514E-05, 0.26860015E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 2, 0.44084935E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14786844E-07,-0.13876308E-04, 0.27609679E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 3, 0.43720689E+01, 0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.68474280E-08,-0.14504062E-04, 0.28401429E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 4, 0.43385490E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.68451118E-08,-0.14383587E-04, 0.29237579E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 5, 0.43077519E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26744722E-07,-0.14279811E-04, 0.30112821E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 6, 0.42794845E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.54100249E-07,-0.14010395E-04, 0.31024686E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 7, 0.42535548E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.90350331E-07,-0.13547842E-04, 0.31971313E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 8, 0.42297766E+01, 0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13726688E-06,-0.12928682E-04, 0.32950855E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 9, 0.42079720E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19697043E-06,-0.12189033E-04, 0.33961517E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 10, 0.41879728E+01, 0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000129E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27194820E-06,-0.11363287E-04, 0.35001575E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 11, 0.41696219E+01, 0.20000129E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36507205E-06,-0.10483207E-04, 0.36069399E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 12, 0.41527732E+01, 0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000148E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.47961507E-06,-0.95775016E-05, 0.37163456E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 13, 0.41372924E+01, 0.20000148E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000156E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.61926546E-06,-0.86717001E-05, 0.38282322E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 14, 0.41230561E+01, 0.20000156E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000163E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78813845E-06,-0.77882465E-05, 0.39424678E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 15, 0.41099517E+01, 0.20000163E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000169E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.99078415E-06,-0.69467273E-05, 0.40589310E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 16, 0.40978767E+01, 0.20000169E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000174E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12321939E-05,-0.61642511E-05, 0.41775106E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 17, 0.40867382E+01, 0.20000174E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000178E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15178027E-05,-0.54450838E-05, 0.42981051E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 18, 0.40764529E+01, 0.20000178E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000181E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19173492E-05,-0.49893583E-05, 0.44209234E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 19, 0.40669462E+01, 0.20000181E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000183E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23267466E-05,-0.44689192E-05, 0.45457882E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 20, 0.40581494E+01, 0.20000183E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000180E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28048135E-05, 0.82092223E-07, 0.46724740E+05, + 0.130E+06, 0.300E+03, 2, 72, 2, 21, 0.40500000E+01, 0.20000180E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000180E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 1, 0.44479945E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.41987975E-08,-0.86688999E-05, 0.26860015E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 2, 0.44084935E+01, 0.20000009E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38868287E-08,-0.13902499E-04, 0.27609679E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 3, 0.43720689E+01, 0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26757213E-08,-0.14522575E-04, 0.28401429E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 4, 0.43385490E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.48347526E-09,-0.14388305E-04, 0.29237579E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 5, 0.43077519E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26760123E-08,-0.14264796E-04, 0.30112821E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 6, 0.42794845E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70340927E-08,-0.13968317E-04, 0.31024686E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 7, 0.42535548E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12812937E-07,-0.13469965E-04, 0.31971312E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 8, 0.42297766E+01, 0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20287116E-07,-0.12804593E-04, 0.32950855E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 9, 0.42079720E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29785660E-07,-0.12006322E-04, 0.33961516E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 10, 0.41879728E+01, 0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000129E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41695506E-07,-0.11107189E-04, 0.35001575E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 11, 0.41696219E+01, 0.20000129E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56463784E-07,-0.10136240E-04, 0.36069399E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 12, 0.41527732E+01, 0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74600636E-07,-0.91190857E-05, 0.37163456E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 13, 0.41372924E+01, 0.20000149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000157E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96681591E-07,-0.80777561E-05, 0.38282322E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 14, 0.41230561E+01, 0.20000157E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000164E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12334878E-06,-0.70307892E-05, 0.39424677E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 15, 0.41099517E+01, 0.20000164E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000170E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15531254E-06,-0.59934587E-05, 0.40589310E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 16, 0.40978767E+01, 0.20000170E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000175E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19335222E-06,-0.49781276E-05, 0.41775106E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 17, 0.40867382E+01, 0.20000175E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000179E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23831630E-06,-0.39823864E-05, 0.42981051E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 18, 0.40764529E+01, 0.20000179E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000183E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30115315E-06,-0.31423279E-05, 0.44209233E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 19, 0.40669462E+01, 0.20000183E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000186E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36550870E-06,-0.22296547E-05, 0.45457882E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 20, 0.40581494E+01, 0.20000186E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000165E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44061109E-06, 0.20736083E-04, 0.46724740E+05, + 0.130E+06, 0.300E+03, 2, 73, 2, 21, 0.40500000E+01, 0.20000165E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000165E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 1, 0.44479942E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11984482E-04, 0.42435807E-05, 0.26860012E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 2, 0.44084932E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12566981E-04, 0.15303883E-06, 0.27609675E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 3, 0.43720686E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12893905E-04,-0.83678978E-07, 0.28401425E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 4, 0.43385487E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12639490E-04,-0.23170294E-06, 0.29237575E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 5, 0.43077516E+01, 0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12489317E-04,-0.28825951E-06, 0.30112817E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 6, 0.42794842E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12158825E-04,-0.37417358E-06, 0.31024682E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 7, 0.42535545E+01, 0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11677682E-04,-0.43520582E-06, 0.31971309E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 8, 0.42297763E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11076018E-04,-0.47394586E-06, 0.32950851E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 9, 0.42079718E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10383094E-04,-0.49343999E-06, 0.33961513E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 10, 0.41879726E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96263961E-05,-0.49684533E-06, 0.35001572E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 11, 0.41696217E+01, 0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88310990E-05,-0.48720766E-06, 0.36069396E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 12, 0.41527730E+01, 0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80198163E-05,-0.46730053E-06, 0.37163454E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 13, 0.41372922E+01, 0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000141E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72125711E-05,-0.43955952E-06, 0.38282320E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 14, 0.41230559E+01, 0.20000141E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000148E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64269154E-05,-0.40603977E-06, 0.39424676E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 15, 0.41099516E+01, 0.20000148E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000154E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56781450E-05,-0.36844781E-06, 0.40589308E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 16, 0.40978766E+01, 0.20000154E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49795665E-05,-0.32813677E-06, 0.41775105E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 17, 0.40867381E+01, 0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000164E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43427828E-05,-0.27065857E-06, 0.42981050E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 18, 0.40764528E+01, 0.20000164E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000168E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39087671E-05,-0.23467850E-06, 0.44209232E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 19, 0.40669461E+01, 0.20000168E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000172E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34127990E-05,-0.20694322E-06, 0.45457881E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 20, 0.40581494E+01, 0.20000172E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30106175E-05, 0.70066937E-04, 0.46724739E+05, + 0.131E+06, 0.300E+03, 2, 74, 2, 21, 0.40500000E+01, 0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 1, 0.44479942E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48031022E-09,-0.77408526E-05, 0.26860012E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 2, 0.44084932E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54791599E-09,-0.12414205E-04, 0.27609675E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 3, 0.43720686E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67973209E-09,-0.12977928E-04, 0.28401425E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 4, 0.43385487E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86142488E-09,-0.12871667E-04, 0.29237575E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 5, 0.43077516E+01, 0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11424102E-08,-0.12778260E-04, 0.30112817E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 6, 0.42794842E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15252469E-08,-0.12533981E-04, 0.31024682E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 7, 0.42535545E+01, 0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20342001E-08,-0.12114282E-04, 0.31971309E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 8, 0.42297763E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26991620E-08,-0.11551901E-04, 0.32950851E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 9, 0.42079718E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35550329E-08,-0.10879182E-04, 0.33961513E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 10, 0.41879726E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46426673E-08,-0.10126804E-04, 0.35001572E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 11, 0.41696217E+01, 0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60086798E-08,-0.93230275E-05, 0.36069396E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 12, 0.41527730E+01, 0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77058697E-08,-0.84932941E-05, 0.37163454E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 13, 0.41372922E+01, 0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97934389E-08,-0.76601115E-05, 0.38282320E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 14, 0.41230559E+01, 0.20000142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000148E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12337186E-07,-0.68431516E-05, 0.39424676E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 15, 0.41099516E+01, 0.20000148E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000154E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15409460E-07,-0.60594832E-05, 0.40589308E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 16, 0.40978766E+01, 0.20000154E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19089518E-07,-0.53238440E-05, 0.41775105E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 17, 0.40867381E+01, 0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000164E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23463532E-07,-0.46333151E-05, 0.42981050E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 18, 0.40764528E+01, 0.20000164E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000169E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29612347E-07,-0.41687740E-05, 0.44209232E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 19, 0.40669461E+01, 0.20000169E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000172E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35930813E-07,-0.36508339E-05, 0.45457881E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 20, 0.40581494E+01, 0.20000172E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000103E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43329273E-07, 0.69634664E-04, 0.46724739E+05, + 0.131E+06, 0.300E+03, 2, 75, 2, 21, 0.40500000E+01, 0.20000103E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000103E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 1, 0.44479942E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47316765E-09,-0.77413548E-05, 0.26860012E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 2, 0.44084932E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54598786E-09,-0.12415125E-04, 0.27609675E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 3, 0.43720686E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69170104E-09,-0.12979071E-04, 0.28401425E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 4, 0.43385487E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.89608269E-09,-0.12873134E-04, 0.29237575E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 5, 0.43077516E+01, 0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12105374E-08,-0.12780235E-04, 0.30112817E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 6, 0.42794842E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16391277E-08,-0.12536669E-04, 0.31024682E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 7, 0.42535545E+01, 0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22089322E-08,-0.12117927E-04, 0.31971309E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 8, 0.42297763E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29527049E-08,-0.11556808E-04, 0.32950851E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 9, 0.42079718E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39092508E-08,-0.10885726E-04, 0.33961513E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 10, 0.41879726E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51237294E-08,-0.10135437E-04, 0.35001572E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 11, 0.41696217E+01, 0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66476544E-08,-0.93343040E-05, 0.36069396E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 12, 0.41527730E+01, 0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.85396702E-08,-0.85078680E-05, 0.37163454E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 13, 0.41372922E+01, 0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10865333E-07,-0.76787609E-05, 0.38282320E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 14, 0.41230559E+01, 0.20000142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000148E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13697524E-07,-0.68667868E-05, 0.39424676E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 15, 0.41099516E+01, 0.20000148E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17116593E-07,-0.60891625E-05, 0.40589308E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 16, 0.40978766E+01, 0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21210362E-07,-0.53607886E-05, 0.41775105E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 17, 0.40867381E+01, 0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000165E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26074461E-07,-0.46787490E-05, 0.42981050E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 18, 0.40764528E+01, 0.20000165E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000169E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32909763E-07,-0.42263816E-05, 0.44209232E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 19, 0.40669461E+01, 0.20000169E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000173E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39932226E-07,-0.37211280E-05, 0.45457881E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 20, 0.40581494E+01, 0.20000173E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48153355E-07, 0.72452363E-04, 0.46724739E+05, + 0.132E+06, 0.300E+03, 2, 76, 2, 21, 0.40500000E+01, 0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 1, 0.44479942E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46546726E-09,-0.77419325E-05, 0.26860012E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 2, 0.44084932E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54441140E-09,-0.12416173E-04, 0.27609675E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 3, 0.43720686E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70675014E-09,-0.12980368E-04, 0.28401425E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 4, 0.43385487E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.93805284E-09,-0.12874789E-04, 0.29237575E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 5, 0.43077516E+01, 0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12922222E-08,-0.12782456E-04, 0.30112817E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 6, 0.42794842E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17753458E-08,-0.12539682E-04, 0.31024682E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 7, 0.42535545E+01, 0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24174127E-08,-0.12122003E-04, 0.31971309E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 8, 0.42297763E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32549481E-08,-0.11562288E-04, 0.32950851E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 9, 0.42079718E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43311835E-08,-0.10893023E-04, 0.33961513E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 10, 0.41879726E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56963472E-08,-0.10145059E-04, 0.35001572E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 11, 0.41696217E+01, 0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74081375E-08,-0.93468634E-05, 0.36069396E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 12, 0.41527730E+01, 0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.95317955E-08,-0.85240921E-05, 0.37163454E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 13, 0.41372922E+01, 0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12140566E-07,-0.76995160E-05, 0.38282320E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 14, 0.41230559E+01, 0.20000142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15315794E-07,-0.68930844E-05, 0.39424676E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 15, 0.41099516E+01, 0.20000149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19147265E-07,-0.61221782E-05, 0.40589308E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 16, 0.40978766E+01, 0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23733107E-07,-0.54018814E-05, 0.41775105E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 17, 0.40867381E+01, 0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000165E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29180034E-07,-0.47292721E-05, 0.42981050E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 18, 0.40764528E+01, 0.20000165E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000169E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36831795E-07,-0.42904404E-05, 0.44209232E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 19, 0.40669461E+01, 0.20000169E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000173E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44691600E-07,-0.37992929E-05, 0.45457881E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 20, 0.40581494E+01, 0.20000173E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53891199E-07, 0.75600547E-04, 0.46724739E+05, + 0.133E+06, 0.300E+03, 2, 77, 2, 21, 0.40500000E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 1, 0.44479942E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45686951E-09,-0.77426010E-05, 0.26860012E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 2, 0.44084932E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54333213E-09,-0.12417374E-04, 0.27609675E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 3, 0.43720686E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72574039E-09,-0.12981846E-04, 0.28401425E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 4, 0.43385487E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98942110E-09,-0.12876670E-04, 0.29237575E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 5, 0.43077516E+01, 0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13915026E-08,-0.12784969E-04, 0.30112817E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 6, 0.42794842E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19402432E-08,-0.12543083E-04, 0.31024682E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 7, 0.42535545E+01, 0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26693669E-08,-0.12126595E-04, 0.31971309E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 8, 0.42297763E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36197889E-08,-0.11568451E-04, 0.32950851E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 9, 0.42079718E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48401610E-08,-0.10901222E-04, 0.33961513E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 10, 0.41879726E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63869811E-08,-0.10155861E-04, 0.35001572E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 11, 0.41696217E+01, 0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.83249809E-08,-0.93609529E-05, 0.36069396E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 12, 0.41527730E+01, 0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10727696E-07,-0.85422844E-05, 0.37163454E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 13, 0.41372922E+01, 0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13677491E-07,-0.77227842E-05, 0.38282320E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 14, 0.41230559E+01, 0.20000142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17266066E-07,-0.69225568E-05, 0.39424676E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 15, 0.41099516E+01, 0.20000149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21594436E-07,-0.61591721E-05, 0.40589308E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 16, 0.40978766E+01, 0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26773050E-07,-0.54479236E-05, 0.41775105E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 17, 0.40867381E+01, 0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000165E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32922277E-07,-0.47858683E-05, 0.42981050E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 18, 0.40764528E+01, 0.20000165E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000170E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41557942E-07,-0.43621885E-05, 0.44209232E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 19, 0.40669461E+01, 0.20000170E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000174E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50426606E-07,-0.38868502E-05, 0.45457881E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 20, 0.40581494E+01, 0.20000174E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60805275E-07, 0.79145761E-04, 0.46724739E+05, + 0.133E+06, 0.300E+03, 2, 78, 2, 21, 0.40500000E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 1, 0.44479942E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44713185E-09,-0.77433801E-05, 0.26860012E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 2, 0.44084932E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54281069E-09,-0.12418761E-04, 0.27609675E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 3, 0.43720686E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74971467E-09,-0.12983549E-04, 0.28401425E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 4, 0.43385487E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10531221E-08,-0.12878824E-04, 0.29237575E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 5, 0.43077516E+01, 0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15137387E-08,-0.12787838E-04, 0.30112817E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 6, 0.42794842E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21427089E-08,-0.12546955E-04, 0.31024682E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 7, 0.42535545E+01, 0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29782677E-08,-0.12131812E-04, 0.31971309E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 8, 0.42297763E+01, 0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40668237E-08,-0.11575441E-04, 0.32950851E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 9, 0.42079718E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54634196E-08,-0.10910512E-04, 0.33961513E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 10, 0.41879726E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72323261E-08,-0.10168087E-04, 0.35001572E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 11, 0.41696217E+01, 0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000126E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.94470064E-08,-0.93768934E-05, 0.36069396E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 12, 0.41527730E+01, 0.20000126E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12191013E-07,-0.85628585E-05, 0.37163454E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 13, 0.41372922E+01, 0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15557889E-07,-0.77490873E-05, 0.38282320E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 14, 0.41230559E+01, 0.20000142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19651973E-07,-0.69558680E-05, 0.39424676E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 15, 0.41099516E+01, 0.20000149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24588032E-07,-0.62009790E-05, 0.40589308E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 16, 0.40978766E+01, 0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000161E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30491792E-07,-0.54999467E-05, 0.41775105E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 17, 0.40867381E+01, 0.20000161E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000166E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37500019E-07,-0.48498020E-05, 0.42981050E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 18, 0.40764528E+01, 0.20000166E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000170E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47339029E-07,-0.44432391E-05, 0.44209232E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 19, 0.40669461E+01, 0.20000170E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000174E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57441745E-07,-0.39857616E-05, 0.45457881E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 20, 0.40581494E+01, 0.20000174E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69262654E-07, 0.83174945E-04, 0.46724739E+05, + 0.134E+06, 0.300E+03, 2, 79, 2, 21, 0.40500000E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 1, 0.44479942E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43580561E-09,-0.77442968E-05, 0.26860012E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 2, 0.44084932E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54300472E-09,-0.12420380E-04, 0.27609675E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 3, 0.43720686E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78054048E-09,-0.12985525E-04, 0.28401425E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 4, 0.43385487E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11332789E-08,-0.12881316E-04, 0.29237575E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 5, 0.43077516E+01, 0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16667400E-08,-0.12791146E-04, 0.30112817E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 6, 0.42794842E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23956454E-08,-0.12551404E-04, 0.31024682E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 7, 0.42535545E+01, 0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33636631E-08,-0.12137797E-04, 0.31971309E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 8, 0.42297763E+01, 0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46240651E-08,-0.11583447E-04, 0.32950851E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 9, 0.42079718E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62401038E-08,-0.10921138E-04, 0.33961513E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 10, 0.41879726E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.82853755E-08,-0.10182066E-04, 0.35001572E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 11, 0.41696217E+01, 0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000126E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10844427E-07,-0.93951045E-05, 0.36069396E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 12, 0.41527730E+01, 0.20000126E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14013203E-07,-0.85863559E-05, 0.37163454E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 13, 0.41372922E+01, 0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17899268E-07,-0.77791178E-05, 0.38282320E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 14, 0.41230559E+01, 0.20000142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22622529E-07,-0.69938920E-05, 0.39424676E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 15, 0.41099516E+01, 0.20000149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28314971E-07,-0.62486970E-05, 0.40589308E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 16, 0.40978766E+01, 0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000161E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35121338E-07,-0.55593133E-05, 0.41775105E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 17, 0.40867381E+01, 0.20000161E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000166E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43198864E-07,-0.49227468E-05, 0.42981050E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 18, 0.40764528E+01, 0.20000166E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000170E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54535897E-07,-0.45357118E-05, 0.44209232E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 19, 0.40669461E+01, 0.20000170E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000175E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66174883E-07,-0.40986161E-05, 0.45457881E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 20, 0.40581494E+01, 0.20000175E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79791159E-07, 0.87804173E-04, 0.46724739E+05, + 0.134E+06, 0.300E+03, 2, 80, 2, 21, 0.40500000E+01, 0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 1, 0.44479942E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14991238E-07,-0.77106773E-05, 0.26860012E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 2, 0.44084932E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12580579E-07,-0.12376147E-04, 0.27609675E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 3, 0.43720686E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49766095E-08,-0.12942622E-04, 0.28401425E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 4, 0.43385487E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.80395815E-08,-0.12842449E-04, 0.29237575E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 5, 0.43077516E+01, 0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26986066E-07,-0.12756918E-04, 0.30112817E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 6, 0.42794842E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.53021043E-07,-0.12523188E-04, 0.31024682E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 7, 0.42535545E+01, 0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.87521184E-07,-0.12117245E-04, 0.31971309E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 8, 0.42297763E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13218072E-06,-0.11572283E-04, 0.32950851E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 9, 0.42079718E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18902640E-06,-0.10921175E-04, 0.33961513E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 10, 0.41879726E+01, 0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26043468E-06,-0.10195223E-04, 0.35001572E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 11, 0.41696217E+01, 0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34914924E-06,-0.94234330E-05, 0.36069396E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 12, 0.41527730E+01, 0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000132E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.45829632E-06,-0.86320690E-05, 0.37163454E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 13, 0.41372922E+01, 0.20000132E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.59139857E-06,-0.78446121E-05, 0.38282320E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 14, 0.41230560E+01, 0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000146E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.75238602E-06,-0.70817830E-05, 0.39424676E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 15, 0.41099516E+01, 0.20000146E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000151E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.94560414E-06,-0.63618424E-05, 0.40589308E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 16, 0.40978766E+01, 0.20000151E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000156E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11758194E-05,-0.57008403E-05, 0.41775105E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 17, 0.40867381E+01, 0.20000156E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14482224E-05,-0.51029524E-05, 0.42981050E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 18, 0.40764528E+01, 0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000163E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18293562E-05,-0.47587821E-05, 0.44209233E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 19, 0.40669462E+01, 0.20000163E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000165E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22199159E-05,-0.43584569E-05, 0.45457881E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 20, 0.40581494E+01, 0.20000165E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26760302E-05, 0.73939460E-05, 0.46724740E+05, + 0.135E+06, 0.300E+03, 2, 81, 2, 21, 0.40500000E+01, 0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 1, 0.44479942E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14098259E-08,-0.77167213E-05, 0.26860012E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 2, 0.44084932E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14837860E-08,-0.12374529E-04, 0.27609675E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 3, 0.43720686E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15523619E-08,-0.12930872E-04, 0.28401425E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 4, 0.43385487E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15791253E-08,-0.12814179E-04, 0.29237575E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 5, 0.43077516E+01, 0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16523700E-08,-0.12704087E-04, 0.30112817E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 6, 0.42794842E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17451869E-08,-0.12436492E-04, 0.31024682E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 7, 0.42535545E+01, 0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18709034E-08,-0.11985565E-04, 0.31971309E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 8, 0.42297763E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20449806E-08,-0.11382169E-04, 0.32950852E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 9, 0.42079718E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22850872E-08,-0.10656389E-04, 0.33961513E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 10, 0.41879726E+01, 0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26112927E-08,-0.98362600E-05, 0.35001572E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 11, 0.41696217E+01, 0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30459584E-08,-0.89470234E-05, 0.36069396E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 12, 0.41527730E+01, 0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000132E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36138469E-08,-0.80106548E-05, 0.37163454E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 13, 0.41372922E+01, 0.20000132E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43423158E-08,-0.70458159E-05, 0.38282320E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 14, 0.41230560E+01, 0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000145E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52612935E-08,-0.60678435E-05, 0.39424676E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 15, 0.41099516E+01, 0.20000145E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000150E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64034975E-08,-0.50890582E-05, 0.40589308E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 16, 0.40978767E+01, 0.20000150E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000154E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78044589E-08,-0.41189942E-05, 0.41775105E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 17, 0.40867381E+01, 0.20000154E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000157E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.95024006E-08,-0.31573224E-05, 0.42981050E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 18, 0.40764529E+01, 0.20000157E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11938998E-07,-0.22998487E-05, 0.44209233E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 19, 0.40669462E+01, 0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000161E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14470885E-07,-0.13708995E-05, 0.45457882E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 20, 0.40581494E+01, 0.20000161E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000180E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17469647E-07,-0.18888835E-04, 0.46724740E+05, + 0.136E+06, 0.300E+03, 2, 82, 2, 21, 0.40500000E+01, 0.20000180E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000180E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 1, 0.44479942E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15126716E-08,-0.77164537E-05, 0.26860012E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 2, 0.44084932E+01, 0.20000008E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15915066E-08,-0.12374378E-04, 0.27609675E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 3, 0.43720686E+01, 0.20000020E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16637205E-08,-0.12930803E-04, 0.28401425E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 4, 0.43385487E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16902898E-08,-0.12814250E-04, 0.29237575E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 5, 0.43077516E+01, 0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17656081E-08,-0.12704368E-04, 0.30112817E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 6, 0.42794842E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18607534E-08,-0.12437071E-04, 0.31024682E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 7, 0.42535545E+01, 0.20000071E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19897440E-08,-0.11986549E-04, 0.31971309E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 8, 0.42297763E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21688660E-08,-0.11383689E-04, 0.32950852E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 9, 0.42079718E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24167578E-08,-0.10658608E-04, 0.33961513E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 10, 0.41879726E+01, 0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27545078E-08,-0.98393717E-05, 0.35001572E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 11, 0.41696217E+01, 0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32055201E-08,-0.89512659E-05, 0.36069396E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 12, 0.41527730E+01, 0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000132E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37959641E-08,-0.80163076E-05, 0.37163454E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 13, 0.41372922E+01, 0.20000132E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45544584E-08,-0.70532101E-05, 0.38282320E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 14, 0.41230560E+01, 0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000145E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55124838E-08,-0.60773723E-05, 0.39424676E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 15, 0.41099516E+01, 0.20000145E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000150E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67044069E-08,-0.51011709E-05, 0.40589308E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 16, 0.40978767E+01, 0.20000150E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000154E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81673109E-08,-0.41342160E-05, 0.41775105E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 17, 0.40867381E+01, 0.20000154E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000157E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.99415289E-08,-0.31762840E-05, 0.42981050E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 18, 0.40764529E+01, 0.20000157E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12489181E-07,-0.23240041E-05, 0.44209233E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 19, 0.40669462E+01, 0.20000160E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000161E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15137412E-07,-0.14004276E-05, 0.45457882E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 20, 0.40581494E+01, 0.20000161E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000179E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18274950E-07,-0.17803581E-04, 0.46724740E+05, + 0.136E+06, 0.300E+03, 2, 83, 2, 21, 0.40500000E+01, 0.20000179E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000179E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 1, 0.44479939E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10693200E-04, 0.37877951E-05, 0.26860009E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 2, 0.44084929E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11213328E-04, 0.13730873E-06, 0.27609672E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 3, 0.43720684E+01, 0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11506787E-04,-0.73391571E-07, 0.28401421E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 4, 0.43385484E+01, 0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11282064E-04,-0.20539270E-06, 0.29237571E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 5, 0.43077513E+01, 0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11150474E-04,-0.25598147E-06, 0.30112814E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 6, 0.42794839E+01, 0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10857782E-04,-0.33288495E-06, 0.31024679E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 7, 0.42535542E+01, 0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10430370E-04,-0.38759060E-06, 0.31971306E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 8, 0.42297761E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98951250E-05,-0.42237102E-06, 0.32950849E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 9, 0.42079715E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.92781932E-05,-0.43993955E-06, 0.33961511E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 10, 0.41879724E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86041341E-05,-0.44312409E-06, 0.35001570E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 11, 0.41696215E+01, 0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78954231E-05,-0.43465797E-06, 0.36069394E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 12, 0.41527729E+01, 0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.71722176E-05,-0.41703409E-06, 0.37163452E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 13, 0.41372921E+01, 0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000126E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64523262E-05,-0.39244202E-06, 0.38282318E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 14, 0.41230558E+01, 0.20000126E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000132E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57513124E-05,-0.36273729E-06, 0.39424674E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 15, 0.41099515E+01, 0.20000132E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50826867E-05,-0.32944471E-06, 0.40589307E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 16, 0.40978765E+01, 0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000143E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44581445E-05,-0.29379171E-06, 0.41775104E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 17, 0.40867380E+01, 0.20000143E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000147E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38878217E-05,-0.24285532E-06, 0.42981049E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 18, 0.40764528E+01, 0.20000147E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000150E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34975672E-05,-0.21129353E-06, 0.44209232E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 19, 0.40669461E+01, 0.20000150E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000154E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30500105E-05,-0.18719892E-06, 0.45457881E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 20, 0.40581494E+01, 0.20000154E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26842110E-05, 0.63291042E-04, 0.46724739E+05, + 0.137E+06, 0.300E+03, 2, 84, 2, 21, 0.40500000E+01, 0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 1, 0.44479939E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42702595E-09,-0.69053810E-05, 0.26860009E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 2, 0.44084929E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48883521E-09,-0.11076285E-04, 0.27609672E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 3, 0.43720684E+01, 0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61042859E-09,-0.11580519E-04, 0.28401421E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 4, 0.43385484E+01, 0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77908529E-09,-0.11487918E-04, 0.29237571E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 5, 0.43077513E+01, 0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10394191E-08,-0.11407108E-04, 0.30112814E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 6, 0.42794839E+01, 0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13941826E-08,-0.11191595E-04, 0.31024679E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 7, 0.42535542E+01, 0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18658102E-08,-0.10819266E-04, 0.31971306E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 8, 0.42297761E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24817321E-08,-0.10319302E-04, 0.32950849E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 9, 0.42079715E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32743022E-08,-0.97205933E-05, 0.33961511E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 10, 0.41879724E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42811735E-08,-0.90505612E-05, 0.35001570E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 11, 0.41696215E+01, 0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55454681E-08,-0.83344490E-05, 0.36069394E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 12, 0.41527729E+01, 0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.71157895E-08,-0.75949633E-05, 0.37163452E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 13, 0.41372921E+01, 0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000126E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90469500E-08,-0.68521412E-05, 0.38282318E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 14, 0.41230558E+01, 0.20000126E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11399582E-07,-0.61234652E-05, 0.39424674E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 15, 0.41099515E+01, 0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14240577E-07,-0.54240312E-05, 0.40589307E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 16, 0.40978765E+01, 0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000143E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17643154E-07,-0.47668329E-05, 0.41775104E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 17, 0.40867380E+01, 0.20000143E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000147E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21686938E-07,-0.41490148E-05, 0.42981049E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 18, 0.40764528E+01, 0.20000147E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000151E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27370794E-07,-0.37322301E-05, 0.44209232E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 19, 0.40669461E+01, 0.20000151E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000154E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33211060E-07,-0.32658980E-05, 0.45457880E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 20, 0.40581494E+01, 0.20000154E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40049248E-07, 0.62988831E-04, 0.46724739E+05, + 0.137E+06, 0.300E+03, 2, 85, 2, 21, 0.40500000E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 1, 0.44479939E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42051397E-09,-0.69058505E-05, 0.26860009E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 2, 0.44084929E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48723450E-09,-0.11077142E-04, 0.27609672E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 3, 0.43720684E+01, 0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62203374E-09,-0.11581583E-04, 0.28401421E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 4, 0.43385484E+01, 0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81208176E-09,-0.11489281E-04, 0.29237571E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 5, 0.43077513E+01, 0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11040053E-08,-0.11408940E-04, 0.30112814E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 6, 0.42794839E+01, 0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15019881E-08,-0.11194087E-04, 0.31024679E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 7, 0.42535542E+01, 0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20310593E-08,-0.10822642E-04, 0.31971306E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 8, 0.42297761E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27214992E-08,-0.10323845E-04, 0.32950849E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 9, 0.42079715E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36091903E-08,-0.97266487E-05, 0.33961511E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 10, 0.41879724E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47358723E-08,-0.90585491E-05, 0.35001570E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 11, 0.41696215E+01, 0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61493726E-08,-0.83448778E-05, 0.36069394E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 12, 0.41527729E+01, 0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79037515E-08,-0.76084417E-05, 0.37163452E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 13, 0.41372921E+01, 0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000126E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10059836E-07,-0.68693876E-05, 0.38282318E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 14, 0.41230558E+01, 0.20000126E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12685074E-07,-0.61453177E-05, 0.39424674E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 15, 0.41099515E+01, 0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15853705E-07,-0.54514729E-05, 0.40589307E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 16, 0.40978765E+01, 0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000143E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19647244E-07,-0.48009896E-05, 0.41775104E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 17, 0.40867380E+01, 0.20000143E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000147E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24154069E-07,-0.41910180E-05, 0.42981049E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 18, 0.40764528E+01, 0.20000147E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000151E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30486650E-07,-0.37854852E-05, 0.44209232E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 19, 0.40669461E+01, 0.20000151E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000154E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36992181E-07,-0.33308832E-05, 0.45457880E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 20, 0.40581494E+01, 0.20000154E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44607708E-07, 0.65597665E-04, 0.46724739E+05, + 0.138E+06, 0.300E+03, 2, 86, 2, 21, 0.40500000E+01, 0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 1, 0.44479939E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41337141E-09,-0.69063919E-05, 0.26860009E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 2, 0.44084929E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48599759E-09,-0.11078121E-04, 0.27609672E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 3, 0.43720684E+01, 0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63656141E-09,-0.11582791E-04, 0.28401421E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 4, 0.43385484E+01, 0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.85209952E-09,-0.11490822E-04, 0.29237571E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 5, 0.43077513E+01, 0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11817125E-08,-0.11411004E-04, 0.30112814E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 6, 0.42794839E+01, 0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16314152E-08,-0.11196886E-04, 0.31024679E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 7, 0.42535542E+01, 0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22290745E-08,-0.10826426E-04, 0.31971306E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 8, 0.42297761E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30084387E-08,-0.10328929E-04, 0.32950849E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 9, 0.42079715E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40096347E-08,-0.97334174E-05, 0.33961511E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 10, 0.41879724E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52793621E-08,-0.90674731E-05, 0.35001570E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 11, 0.41696215E+01, 0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.68710506E-08,-0.83565200E-05, 0.36069394E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 12, 0.41527729E+01, 0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88452604E-08,-0.76234817E-05, 0.37163452E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 13, 0.41372921E+01, 0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11269949E-07,-0.68886243E-05, 0.38282318E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 14, 0.41230558E+01, 0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14220617E-07,-0.61696892E-05, 0.39424674E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 15, 0.41099515E+01, 0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17780621E-07,-0.54820699E-05, 0.40589307E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 16, 0.40978765E+01, 0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000143E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22041010E-07,-0.48390701E-05, 0.41775104E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 17, 0.40867380E+01, 0.20000143E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000147E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27100905E-07,-0.42378356E-05, 0.42981049E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 18, 0.40764528E+01, 0.20000147E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000151E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34208279E-07,-0.38448377E-05, 0.44209232E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 19, 0.40669461E+01, 0.20000151E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41508295E-07,-0.34033140E-05, 0.45457880E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 20, 0.40581494E+01, 0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000086E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50052258E-07, 0.68519785E-04, 0.46724739E+05, + 0.139E+06, 0.300E+03, 2, 87, 2, 21, 0.40500000E+01, 0.20000086E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000086E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 1, 0.44479939E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40540423E-09,-0.69070198E-05, 0.26860009E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 2, 0.44084929E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48522149E-09,-0.11079244E-04, 0.27609672E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 3, 0.43720684E+01, 0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65483619E-09,-0.11584174E-04, 0.28401421E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 4, 0.43385484E+01, 0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90133350E-09,-0.11492578E-04, 0.29237571E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 5, 0.43077513E+01, 0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12765910E-08,-0.11413348E-04, 0.30112814E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 6, 0.42794839E+01, 0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17888669E-08,-0.11200053E-04, 0.31024679E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 7, 0.42535542E+01, 0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24693994E-08,-0.10830702E-04, 0.31971306E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 8, 0.42297761E+01, 0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33564235E-08,-0.10334663E-04, 0.32950849E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 9, 0.42079715E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44950866E-08,-0.97410421E-05, 0.33961511E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 10, 0.41879724E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59379333E-08,-0.90775163E-05, 0.35001570E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 11, 0.41696215E+01, 0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77453054E-08,-0.83696159E-05, 0.36069394E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 12, 0.41527729E+01, 0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.99855000E-08,-0.76403924E-05, 0.37163452E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 13, 0.41372921E+01, 0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12735327E-07,-0.69102476E-05, 0.38282318E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 14, 0.41230558E+01, 0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16080109E-07,-0.61970756E-05, 0.39424674E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 15, 0.41099515E+01, 0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20113778E-07,-0.55164489E-05, 0.40589307E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 16, 0.40978765E+01, 0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000143E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24939388E-07,-0.48818482E-05, 0.41775104E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 17, 0.40867380E+01, 0.20000143E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000148E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30668840E-07,-0.42904204E-05, 0.42981049E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 18, 0.40764528E+01, 0.20000148E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000152E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38714158E-07,-0.39114984E-05, 0.44209232E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 19, 0.40669461E+01, 0.20000152E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46976032E-07,-0.34846655E-05, 0.45457880E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 20, 0.40581493E+01, 0.20000155E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56644130E-07, 0.71820020E-04, 0.46724739E+05, + 0.139E+06, 0.300E+03, 2, 88, 2, 21, 0.40500000E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 1, 0.44479939E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39633354E-09,-0.69077535E-05, 0.26860009E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 2, 0.44084929E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48495470E-09,-0.11080546E-04, 0.27609672E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 3, 0.43720684E+01, 0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67814350E-09,-0.11585769E-04, 0.28401421E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 4, 0.43385484E+01, 0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96264557E-09,-0.11494594E-04, 0.29237571E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 5, 0.43077513E+01, 0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13940128E-08,-0.11416032E-04, 0.30112814E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 6, 0.42794839E+01, 0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19832078E-08,-0.11203670E-04, 0.31024679E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 7, 0.42535542E+01, 0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27657855E-08,-0.10835572E-04, 0.31971306E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 8, 0.42297761E+01, 0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37851472E-08,-0.10341187E-04, 0.32950849E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 9, 0.42079715E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50928065E-08,-0.97497067E-05, 0.33961511E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 10, 0.41879724E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67485234E-08,-0.90889207E-05, 0.35001570E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 11, 0.41696215E+01, 0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88211042E-08,-0.83844782E-05, 0.36069394E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 12, 0.41527729E+01, 0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11388523E-07,-0.76595763E-05, 0.37163452E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 13, 0.41372921E+01, 0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14538285E-07,-0.69347674E-05, 0.38282318E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 14, 0.41230558E+01, 0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18367621E-07,-0.62281280E-05, 0.39424674E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 15, 0.41099515E+01, 0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22983950E-07,-0.55554207E-05, 0.40589307E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 16, 0.40978765E+01, 0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000144E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28504752E-07,-0.49303361E-05, 0.41775104E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 17, 0.40867380E+01, 0.20000144E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000148E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35057722E-07,-0.43500115E-05, 0.42981049E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 18, 0.40764528E+01, 0.20000148E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000152E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44256764E-07,-0.39870375E-05, 0.44209232E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 19, 0.40669461E+01, 0.20000152E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000156E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53701830E-07,-0.35768565E-05, 0.45457880E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 20, 0.40581493E+01, 0.20000156E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64752700E-07, 0.75583666E-04, 0.46724739E+05, + 0.140E+06, 0.300E+03, 2, 89, 2, 21, 0.40500000E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 1, 0.44479939E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38566213E-09,-0.69086198E-05, 0.26860009E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 2, 0.44084929E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48543977E-09,-0.11082070E-04, 0.27609672E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 3, 0.43720684E+01, 0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70816895E-09,-0.11587629E-04, 0.28401421E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 4, 0.43385484E+01, 0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10402679E-08,-0.11496936E-04, 0.29237571E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 5, 0.43077513E+01, 0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15419331E-08,-0.11419136E-04, 0.30112814E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 6, 0.42794839E+01, 0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22274859E-08,-0.11207843E-04, 0.31024679E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 7, 0.42535542E+01, 0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31379022E-08,-0.10841181E-04, 0.31971306E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 8, 0.42297761E+01, 0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43231315E-08,-0.10348687E-04, 0.32950849E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 9, 0.42079715E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58424242E-08,-0.97596571E-05, 0.33961511E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 10, 0.41879724E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77648535E-08,-0.91020068E-05, 0.35001570E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 11, 0.41696215E+01, 0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10169751E-07,-0.84015223E-05, 0.36069394E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 12, 0.41527729E+01, 0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13147049E-07,-0.76815652E-05, 0.37163452E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 13, 0.41372921E+01, 0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16797712E-07,-0.69628682E-05, 0.38282318E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 14, 0.41230558E+01, 0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21234227E-07,-0.62637058E-05, 0.39424674E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 15, 0.41099515E+01, 0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26580504E-07,-0.56000633E-05, 0.40589307E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 16, 0.40978765E+01, 0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000144E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32972312E-07,-0.49858783E-05, 0.41775104E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 17, 0.40867380E+01, 0.20000144E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000148E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40557085E-07,-0.44182518E-05, 0.42981049E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 18, 0.40764528E+01, 0.20000148E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000152E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51201714E-07,-0.40735447E-05, 0.44209232E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 19, 0.40669461E+01, 0.20000152E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000156E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62129232E-07,-0.36824337E-05, 0.45457880E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 20, 0.40581493E+01, 0.20000156E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74912629E-07, 0.79925480E-04, 0.46724739E+05, + 0.140E+06, 0.300E+03, 2, 90, 2, 21, 0.40500000E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 1, 0.44479939E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37284432E-09,-0.69096549E-05, 0.26860009E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 2, 0.44084929E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48693134E-09,-0.11083878E-04, 0.27609672E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 3, 0.43720684E+01, 0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74750763E-09,-0.11589825E-04, 0.28401421E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 4, 0.43385484E+01, 0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11406034E-08,-0.11499689E-04, 0.29237571E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 5, 0.43077513E+01, 0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17323813E-08,-0.11422774E-04, 0.30112814E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 6, 0.42794839E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25413829E-08,-0.11212717E-04, 0.31024679E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 7, 0.42535542E+01, 0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36155082E-08,-0.10847720E-04, 0.31971306E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 8, 0.42297761E+01, 0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50131105E-08,-0.10357415E-04, 0.32950849E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 9, 0.42079715E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.68035054E-08,-0.97712288E-05, 0.33961511E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 10, 0.41879724E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90674924E-08,-0.91172079E-05, 0.35001570E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 11, 0.41696215E+01, 0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11897937E-07,-0.84213151E-05, 0.36069394E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 12, 0.41527729E+01, 0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15400146E-07,-0.77070871E-05, 0.37163452E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 13, 0.41372921E+01, 0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19692525E-07,-0.69954746E-05, 0.38282318E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 14, 0.41230558E+01, 0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24906597E-07,-0.63049805E-05, 0.39424674E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 15, 0.41099515E+01, 0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31187786E-07,-0.56518494E-05, 0.40589307E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 16, 0.40978765E+01, 0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000144E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38695143E-07,-0.50502977E-05, 0.41775104E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 17, 0.40867380E+01, 0.20000144E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47601570E-07,-0.44973853E-05, 0.42981049E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 18, 0.40764528E+01, 0.20000149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000153E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60097809E-07,-0.41738564E-05, 0.44209232E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 19, 0.40669461E+01, 0.20000153E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000157E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72924110E-07,-0.38048695E-05, 0.45457880E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 20, 0.40581493E+01, 0.20000157E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000072E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.87926698E-07, 0.85004130E-04, 0.46724739E+05, + 0.141E+06, 0.300E+03, 2, 91, 2, 21, 0.40500000E+01, 0.20000072E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000072E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 1, 0.44479939E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35707975E-09,-0.69109109E-05, 0.26860009E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 2, 0.44084929E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49006000E-09,-0.11086054E-04, 0.27609672E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 3, 0.43720684E+01, 0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80046448E-09,-0.11592459E-04, 0.28401421E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 4, 0.43385484E+01, 0.20000030E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12738019E-08,-0.11502978E-04, 0.29237571E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 5, 0.43077513E+01, 0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19841051E-08,-0.11427101E-04, 0.30112814E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 6, 0.42794839E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29554940E-08,-0.11218501E-04, 0.31024679E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 7, 0.42535542E+01, 0.20000064E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42449392E-08,-0.10855459E-04, 0.31971306E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 8, 0.42297761E+01, 0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59218291E-08,-0.10367732E-04, 0.32950849E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 9, 0.42079715E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80687945E-08,-0.97848874E-05, 0.33961511E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 10, 0.41879724E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10782048E-07,-0.91351399E-05, 0.35001570E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 11, 0.41696215E+01, 0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14172207E-07,-0.84446456E-05, 0.36069394E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 12, 0.41527729E+01, 0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18364857E-07,-0.77371633E-05, 0.37163452E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 13, 0.41372921E+01, 0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23501173E-07,-0.70338865E-05, 0.38282318E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 14, 0.41230558E+01, 0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29738148E-07,-0.63535928E-05, 0.39424674E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 15, 0.41099515E+01, 0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37249071E-07,-0.57128353E-05, 0.40589307E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 16, 0.40978765E+01, 0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000144E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46223722E-07,-0.51261573E-05, 0.41775104E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 17, 0.40867380E+01, 0.20000144E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56868618E-07,-0.45905505E-05, 0.42981049E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 18, 0.40764528E+01, 0.20000149E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000154E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.71800484E-07,-0.42919558E-05, 0.44209232E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 19, 0.40669461E+01, 0.20000154E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000158E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.87124572E-07,-0.39490243E-05, 0.45457880E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 20, 0.40581493E+01, 0.20000158E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10504635E-06, 0.91046138E-04, 0.46724739E+05, + 0.142E+06, 0.300E+03, 2, 92, 2, 21, 0.40500000E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 1, 0.44479939E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12050562E-08,-0.68879557E-05, 0.26860009E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 2, 0.44084929E+01, 0.20000007E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11186664E-08,-0.11048041E-04, 0.27609672E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 3, 0.43720684E+01, 0.20000018E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77944909E-09,-0.11547471E-04, 0.28401421E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 4, 0.43385484E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16338163E-09,-0.11448140E-04, 0.29237571E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 5, 0.43077513E+01, 0.20000041E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.72417606E-09,-0.11356473E-04, 0.30112814E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 6, 0.42794839E+01, 0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000063E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19489623E-08,-0.11125760E-04, 0.31024679E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 7, 0.42535542E+01, 0.20000063E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35733683E-08,-0.10733060E-04, 0.31971306E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 8, 0.42297761E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.56744466E-08,-0.10206315E-04, 0.32950849E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 9, 0.42079715E+01, 0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.83445775E-08,-0.95729168E-05, 0.33961511E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 10, 0.41879724E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000103E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11692270E-07,-0.88585465E-05, 0.35001570E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 11, 0.41696215E+01, 0.20000103E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15843058E-07,-0.80864328E-05, 0.36069394E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 12, 0.41527729E+01, 0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20940133E-07,-0.72770148E-05, 0.37163452E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 13, 0.41372921E+01, 0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27145094E-07,-0.64477594E-05, 0.38282318E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 14, 0.41230558E+01, 0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000130E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34638142E-07,-0.56132811E-05, 0.39424674E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 15, 0.41099515E+01, 0.20000130E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000135E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.43618760E-07,-0.47855524E-05, 0.40589307E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 16, 0.40978766E+01, 0.20000135E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.54305710E-07,-0.39740826E-05, 0.41775104E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 17, 0.40867380E+01, 0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.66937185E-07,-0.31783736E-05, 0.42981049E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 18, 0.40764528E+01, 0.20000142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000144E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.84588246E-07,-0.25027538E-05, 0.44209232E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 19, 0.40669461E+01, 0.20000144E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000146E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10266519E-06,-0.17651023E-05, 0.45457881E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 20, 0.40581494E+01, 0.20000146E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000146E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12375979E-06,-0.11176379E-06, 0.46724740E+05, + 0.142E+06, 0.300E+03, 2, 93, 2, 21, 0.40500000E+01, 0.20000146E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000146E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 1, 0.44479937E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38414631E-09,-0.61626598E-05, 0.26860006E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 2, 0.44084927E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43709103E-09,-0.98842828E-05, 0.27609669E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 3, 0.43720681E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53939099E-09,-0.10334852E-04, 0.28401418E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 4, 0.43385482E+01, 0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67988973E-09,-0.10253080E-04, 0.29237568E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 5, 0.43077511E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.89744087E-09,-0.10181973E-04, 0.30112811E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 6, 0.42794837E+01, 0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11936815E-08,-0.99905708E-05, 0.31024676E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 7, 0.42535540E+01, 0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15876746E-08,-0.96589775E-05, 0.31971303E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 8, 0.42297759E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21024365E-08,-0.92131227E-05, 0.32950846E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 9, 0.42079714E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27652034E-08,-0.86787058E-05, 0.33961508E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 10, 0.41879722E+01, 0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000092E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36076138E-08,-0.80801500E-05, 0.35001567E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 11, 0.41696213E+01, 0.20000092E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46658776E-08,-0.74399468E-05, 0.36069392E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 12, 0.41527727E+01, 0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59810312E-08,-0.67783216E-05, 0.37163450E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 13, 0.41372920E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75989616E-08,-0.61131452E-05, 0.38282316E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 14, 0.41230557E+01, 0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.95707219E-08,-0.54599998E-05, 0.39424673E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 15, 0.41099514E+01, 0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11952555E-07,-0.48323594E-05, 0.40589306E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 16, 0.40978765E+01, 0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14805870E-07,-0.42418424E-05, 0.41775103E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 17, 0.40867380E+01, 0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000131E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18197534E-07,-0.36860149E-05, 0.42981048E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 18, 0.40764527E+01, 0.20000131E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22965833E-07,-0.33083349E-05, 0.44209231E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 19, 0.40669461E+01, 0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000137E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27866142E-07,-0.28865955E-05, 0.45457880E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 20, 0.40581493E+01, 0.20000137E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000082E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33604253E-07, 0.54944636E-04, 0.46724739E+05, + 0.143E+06, 0.300E+03, 2, 94, 2, 21, 0.40500000E+01, 0.20000082E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000082E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 1, 0.44479937E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37862871E-09,-0.61630454E-05, 0.26860006E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 2, 0.44084927E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43544181E-09,-0.98849925E-05, 0.27609669E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 3, 0.43720681E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54843743E-09,-0.10335734E-04, 0.28401418E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 4, 0.43385482E+01, 0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70618019E-09,-0.10254213E-04, 0.29237568E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 5, 0.43077511E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.94918505E-09,-0.10183500E-04, 0.30112811E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 6, 0.42794837E+01, 0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12803745E-08,-0.99926503E-05, 0.31024676E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 7, 0.42535540E+01, 0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17206791E-08,-0.96618005E-05, 0.31971303E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 8, 0.42297759E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22955404E-08,-0.92169227E-05, 0.32950846E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 9, 0.42079714E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30350202E-08,-0.86837756E-05, 0.33961508E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 10, 0.41879722E+01, 0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000092E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39740795E-08,-0.80868408E-05, 0.35001567E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 11, 0.41696213E+01, 0.20000092E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51527362E-08,-0.74486870E-05, 0.36069392E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 12, 0.41527727E+01, 0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66163193E-08,-0.67896201E-05, 0.37163450E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 13, 0.41372920E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84157121E-08,-0.61276028E-05, 0.38282316E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 14, 0.41230557E+01, 0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10607303E-07,-0.54783261E-05, 0.39424673E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 15, 0.41099514E+01, 0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13253424E-07,-0.48553707E-05, 0.40589306E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 16, 0.40978765E+01, 0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16422030E-07,-0.42704920E-05, 0.41775103E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 17, 0.40867380E+01, 0.20000128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000131E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20187217E-07,-0.37212454E-05, 0.42981048E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 18, 0.40764527E+01, 0.20000131E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000135E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25478706E-07,-0.33530096E-05, 0.44209231E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 19, 0.40669461E+01, 0.20000135E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30915471E-07,-0.29411062E-05, 0.45457880E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 20, 0.40581493E+01, 0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000081E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37280552E-07, 0.57127024E-04, 0.46724739E+05, + 0.143E+06, 0.300E+03, 2, 95, 2, 21, 0.40500000E+01, 0.20000081E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000081E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 1, 0.44479937E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37262604E-09,-0.61634889E-05, 0.26860006E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 2, 0.44084927E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43418064E-09,-0.98857982E-05, 0.27609669E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 3, 0.43720681E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55976367E-09,-0.10336732E-04, 0.28401418E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 4, 0.43385482E+01, 0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73795187E-09,-0.10255489E-04, 0.29237568E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 5, 0.43077511E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10111277E-08,-0.10185214E-04, 0.30112811E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 6, 0.42794837E+01, 0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13837416E-08,-0.99949770E-05, 0.31024676E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 7, 0.42535540E+01, 0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18789312E-08,-0.96649513E-05, 0.31971303E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 8, 0.42297759E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25249998E-08,-0.92211599E-05, 0.32950846E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 9, 0.42079714E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33553564E-08,-0.86894195E-05, 0.33961508E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 10, 0.41879722E+01, 0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44089150E-08,-0.80942854E-05, 0.35001567E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 11, 0.41696213E+01, 0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57302532E-08,-0.74584048E-05, 0.36069392E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 12, 0.41527727E+01, 0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73698660E-08,-0.68021741E-05, 0.37163450E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 13, 0.41372920E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.93842633E-08,-0.61436658E-05, 0.38282316E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 14, 0.41230557E+01, 0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11836504E-07,-0.54986778E-05, 0.39424673E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 15, 0.41099514E+01, 0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14795830E-07,-0.48809249E-05, 0.40589306E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 16, 0.40978765E+01, 0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18338227E-07,-0.43022977E-05, 0.41775103E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 17, 0.40867380E+01, 0.20000128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000131E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22546083E-07,-0.37603556E-05, 0.42981048E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 18, 0.40764527E+01, 0.20000131E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000135E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28457871E-07,-0.34025921E-05, 0.44209231E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 19, 0.40669461E+01, 0.20000135E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34530579E-07,-0.30016123E-05, 0.45457880E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 20, 0.40581493E+01, 0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41638899E-07, 0.59560631E-04, 0.46724739E+05, + 0.144E+06, 0.300E+03, 2, 96, 2, 21, 0.40500000E+01, 0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 1, 0.44479937E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36607768E-09,-0.61640009E-05, 0.26860006E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 2, 0.44084927E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43328328E-09,-0.98867199E-05, 0.27609669E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 3, 0.43720681E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57403668E-09,-0.10337868E-04, 0.28401418E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 4, 0.43385482E+01, 0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77673273E-09,-0.10256937E-04, 0.29237568E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 5, 0.43077511E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10861428E-08,-0.10187150E-04, 0.30112811E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 6, 0.42794837E+01, 0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15083666E-08,-0.99975987E-05, 0.31024676E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 7, 0.42535540E+01, 0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20694521E-08,-0.96684935E-05, 0.31971303E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 8, 0.42297759E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28009526E-08,-0.92259151E-05, 0.32950846E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 9, 0.42079714E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37404243E-08,-0.86957479E-05, 0.33961508E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 10, 0.41879722E+01, 0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49314500E-08,-0.81026243E-05, 0.35001567E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 11, 0.41696213E+01, 0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64239915E-08,-0.74692838E-05, 0.36069392E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 12, 0.41527727E+01, 0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.82747768E-08,-0.68162233E-05, 0.37163450E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 13, 0.41372920E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10547301E-07,-0.61616345E-05, 0.38282316E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 14, 0.41230557E+01, 0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13312335E-07,-0.55214411E-05, 0.39424673E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 15, 0.41099514E+01, 0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16647731E-07,-0.49094989E-05, 0.40589306E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 16, 0.40978765E+01, 0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20638812E-07,-0.43378592E-05, 0.41775103E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 17, 0.40867380E+01, 0.20000128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000132E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25378152E-07,-0.38040710E-05, 0.42981048E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 18, 0.40764527E+01, 0.20000132E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000135E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32034513E-07,-0.34580151E-05, 0.44209231E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 19, 0.40669461E+01, 0.20000135E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38870761E-07,-0.30692464E-05, 0.45457880E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 20, 0.40581493E+01, 0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46871355E-07, 0.62294965E-04, 0.46724739E+05, + 0.145E+06, 0.300E+03, 2, 97, 2, 21, 0.40500000E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 1, 0.44479937E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35863195E-09,-0.61645962E-05, 0.26860006E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 2, 0.44084927E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43276183E-09,-0.98877827E-05, 0.27609669E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 3, 0.43720681E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59199616E-09,-0.10339172E-04, 0.28401418E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 4, 0.43385482E+01, 0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.82460853E-09,-0.10258591E-04, 0.29237568E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 5, 0.43077511E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11781231E-08,-0.10189354E-04, 0.30112811E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 6, 0.42794837E+01, 0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16608222E-08,-0.10000576E-04, 0.31024676E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 7, 0.42535540E+01, 0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23020887E-08,-0.96725073E-05, 0.31971303E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 8, 0.42297759E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31376840E-08,-0.92312948E-05, 0.32950846E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 9, 0.42079714E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42099176E-08,-0.87029011E-05, 0.33961508E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 10, 0.41879722E+01, 0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55682904E-08,-0.81120398E-05, 0.35001567E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 11, 0.41696213E+01, 0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72693122E-08,-0.74815628E-05, 0.36069392E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 12, 0.41527727E+01, 0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.93772542E-08,-0.68320724E-05, 0.37163450E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 13, 0.41372920E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11964148E-07,-0.61818980E-05, 0.38282316E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 14, 0.41230557E+01, 0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15110030E-07,-0.55471061E-05, 0.39424673E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 15, 0.41099514E+01, 0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18903374E-07,-0.49417127E-05, 0.40589306E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 16, 0.40978765E+01, 0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23440831E-07,-0.43779420E-05, 0.41775103E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 17, 0.40867380E+01, 0.20000128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000132E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28827490E-07,-0.38533356E-05, 0.42981048E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 18, 0.40764527E+01, 0.20000132E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000135E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36390556E-07,-0.35204717E-05, 0.44209231E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 19, 0.40669461E+01, 0.20000135E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44156744E-07,-0.31454615E-05, 0.45457880E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 20, 0.40581493E+01, 0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53244100E-07, 0.65394333E-04, 0.46724739E+05, + 0.145E+06, 0.300E+03, 2, 98, 2, 21, 0.40500000E+01, 0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 1, 0.44479937E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35011908E-09,-0.61652945E-05, 0.26860006E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 2, 0.44084927E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43287097E-09,-0.98890183E-05, 0.27609669E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 3, 0.43720681E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61501244E-09,-0.10340683E-04, 0.28401418E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 4, 0.43385482E+01, 0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88458667E-09,-0.10260499E-04, 0.29237568E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 5, 0.43077511E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12927436E-08,-0.10191888E-04, 0.30112811E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 6, 0.42794837E+01, 0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18502760E-08,-0.10003988E-04, 0.31024676E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 7, 0.42535540E+01, 0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25908715E-08,-0.96770978E-05, 0.31971303E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 8, 0.42297759E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35552754E-08,-0.92374404E-05, 0.32950846E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 9, 0.42079714E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47920427E-08,-0.87110605E-05, 0.33961508E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 10, 0.41879722E+01, 0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63576348E-08,-0.81227745E-05, 0.35001567E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 11, 0.41696213E+01, 0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.83168319E-08,-0.74955505E-05, 0.36069392E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 12, 0.41527727E+01, 0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10743218E-07,-0.68501220E-05, 0.37163450E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 13, 0.41372920E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13719352E-07,-0.62049679E-05, 0.38282316E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 14, 0.41230557E+01, 0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17336982E-07,-0.55763200E-05, 0.39424673E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 15, 0.41099514E+01, 0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21697463E-07,-0.49783722E-05, 0.40589306E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 16, 0.40978765E+01, 0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26911609E-07,-0.44235537E-05, 0.41775103E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 17, 0.40867380E+01, 0.20000128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000132E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33099932E-07,-0.39093838E-05, 0.42981048E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 18, 0.40764527E+01, 0.20000132E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000136E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41786116E-07,-0.35915228E-05, 0.44209231E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 19, 0.40669461E+01, 0.20000136E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50704039E-07,-0.32321744E-05, 0.45457880E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 20, 0.40581493E+01, 0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000070E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61137471E-07, 0.68944090E-04, 0.46724739E+05, + 0.146E+06, 0.300E+03, 2, 99, 2, 21, 0.40500000E+01, 0.20000070E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000070E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 1, 0.44479937E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33996912E-09,-0.61661227E-05, 0.26860006E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 2, 0.44084927E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43369558E-09,-0.98904714E-05, 0.27609669E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 3, 0.43720681E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64481962E-09,-0.10342453E-04, 0.28401418E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 4, 0.43385482E+01, 0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96114187E-09,-0.10262723E-04, 0.29237568E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 5, 0.43077511E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14382507E-08,-0.10194835E-04, 0.30112811E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 6, 0.42794837E+01, 0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20904311E-08,-0.10007943E-04, 0.31024676E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 7, 0.42535540E+01, 0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29564277E-08,-0.96824083E-05, 0.31971303E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 8, 0.42297759E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40835827E-08,-0.92445380E-05, 0.32950846E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 9, 0.42079714E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55280786E-08,-0.87204727E-05, 0.33961508E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 10, 0.41879722E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73553383E-08,-0.81351501E-05, 0.35001567E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 11, 0.41696213E+01, 0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96406438E-08,-0.75116656E-05, 0.36069392E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 12, 0.41527727E+01, 0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12469294E-07,-0.68709095E-05, 0.37163450E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 13, 0.41372920E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15937088E-07,-0.62315281E-05, 0.38282316E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 14, 0.41230557E+01, 0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20150595E-07,-0.56099446E-05, 0.39424673E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 15, 0.41099514E+01, 0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25227419E-07,-0.50205665E-05, 0.40589306E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 16, 0.40978765E+01, 0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000129E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31296416E-07,-0.44760422E-05, 0.41775103E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 17, 0.40867380E+01, 0.20000129E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38497407E-07,-0.39738681E-05, 0.42981048E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 18, 0.40764527E+01, 0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000136E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48602354E-07,-0.36732677E-05, 0.44209231E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 19, 0.40669461E+01, 0.20000136E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58975177E-07,-0.33319436E-05, 0.45457880E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 20, 0.40581493E+01, 0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.71108977E-07, 0.73060226E-04, 0.46724739E+05, + 0.146E+06, 0.300E+03, 2, 100, 2, 21, 0.40500000E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 1, 0.44479937E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32772126E-09,-0.61671179E-05, 0.26860006E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 2, 0.44084927E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43563584E-09,-0.98922036E-05, 0.27609669E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 3, 0.43720681E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.68430381E-09,-0.10344555E-04, 0.28401418E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 4, 0.43385482E+01, 0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10610650E-08,-0.10265353E-04, 0.29237568E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 5, 0.43077511E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16274377E-08,-0.10198306E-04, 0.30112811E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 6, 0.42794837E+01, 0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24019634E-08,-0.10012589E-04, 0.31024676E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 7, 0.42535540E+01, 0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34301653E-08,-0.96886354E-05, 0.31971303E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 8, 0.42297759E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47677895E-08,-0.92528453E-05, 0.32950846E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 9, 0.42079714E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64809380E-08,-0.87314806E-05, 0.33961508E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 10, 0.41879722E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86468208E-08,-0.81496072E-05, 0.35001567E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 11, 0.41696213E+01, 0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11353865E-07,-0.75304834E-05, 0.36069392E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 12, 0.41527727E+01, 0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14702794E-07,-0.68951715E-05, 0.37163450E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 13, 0.41372920E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18806507E-07,-0.62625208E-05, 0.38282316E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 14, 0.41230557E+01, 0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23790756E-07,-0.56491730E-05, 0.39424673E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 15, 0.41099514E+01, 0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29794246E-07,-0.50697822E-05, 0.40589306E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 16, 0.40978765E+01, 0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000129E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36968825E-07,-0.45372656E-05, 0.41775103E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 17, 0.40867380E+01, 0.20000129E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45479780E-07,-0.40490660E-05, 0.42981048E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 18, 0.40764527E+01, 0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000137E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57419941E-07,-0.37685927E-05, 0.44209231E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 19, 0.40669461E+01, 0.20000137E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69674837E-07,-0.34482932E-05, 0.45457880E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 20, 0.40581493E+01, 0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000062E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84008255E-07, 0.77905044E-04, 0.46724739E+05, + 0.147E+06, 0.300E+03, 2, 101, 2, 21, 0.40500000E+01, 0.20000062E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000062E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 1, 0.44479937E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31238111E-09,-0.61683345E-05, 0.26860006E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 2, 0.44084927E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43932232E-09,-0.98943047E-05, 0.27609669E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 3, 0.43720681E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73804889E-09,-0.10347094E-04, 0.28401418E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 4, 0.43385482E+01, 0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11952458E-08,-0.10268517E-04, 0.29237568E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 5, 0.43077511E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18805925E-08,-0.10202464E-04, 0.30112811E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 6, 0.42794837E+01, 0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28179784E-08,-0.10018140E-04, 0.31024676E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 7, 0.42535540E+01, 0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40621793E-08,-0.96960579E-05, 0.31971303E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 8, 0.42297759E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56800248E-08,-0.92627312E-05, 0.32950846E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 9, 0.42079714E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77508109E-08,-0.87445633E-05, 0.33961508E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 10, 0.41879722E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10367269E-07,-0.81667778E-05, 0.35001567E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 11, 0.41696213E+01, 0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13635824E-07,-0.75528189E-05, 0.36069392E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 12, 0.41527727E+01, 0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17677327E-07,-0.69239581E-05, 0.37163450E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 13, 0.41372920E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22627646E-07,-0.62992827E-05, 0.38282316E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 14, 0.41230557E+01, 0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28637927E-07,-0.56956936E-05, 0.39424673E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 15, 0.41099514E+01, 0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35874958E-07,-0.51281421E-05, 0.40589306E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 16, 0.40978765E+01, 0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000129E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44521585E-07,-0.46098562E-05, 0.41775103E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 17, 0.40867380E+01, 0.20000129E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54776465E-07,-0.41382067E-05, 0.42981048E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 18, 0.40764527E+01, 0.20000133E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000137E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69159917E-07,-0.38815953E-05, 0.44209231E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 19, 0.40669461E+01, 0.20000137E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000141E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.83920531E-07,-0.35862278E-05, 0.45457880E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 20, 0.40581493E+01, 0.20000141E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10118238E-06, 0.83713617E-04, 0.46724739E+05, + 0.148E+06, 0.300E+03, 2, 102, 2, 21, 0.40500000E+01, 0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 1, 0.44479937E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29294218E-09,-0.61698535E-05, 0.26860006E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 2, 0.44084927E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44618597E-09,-0.98969102E-05, 0.27609669E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 3, 0.43720681E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81413115E-09,-0.10350226E-04, 0.28401418E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 4, 0.43385482E+01, 0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13824198E-08,-0.10272405E-04, 0.29237568E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 5, 0.43077511E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22318879E-08,-0.10207551E-04, 0.30112811E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 6, 0.42794837E+01, 0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33940523E-08,-0.10024910E-04, 0.31024676E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 7, 0.42535540E+01, 0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49363007E-08,-0.97050884E-05, 0.31971303E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 8, 0.42297759E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69407542E-08,-0.92747394E-05, 0.32950846E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 9, 0.42079713E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.95050442E-08,-0.87604361E-05, 0.33961508E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 10, 0.41879722E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12743355E-07,-0.81875891E-05, 0.35001567E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 11, 0.41696213E+01, 0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16786580E-07,-0.75798761E-05, 0.36069392E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 12, 0.41527727E+01, 0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21783829E-07,-0.69588146E-05, 0.37163450E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 13, 0.41372920E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27902303E-07,-0.63437854E-05, 0.38282316E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 14, 0.41230557E+01, 0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35328436E-07,-0.57519984E-05, 0.39424673E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 15, 0.41099514E+01, 0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44267702E-07,-0.51987676E-05, 0.40589306E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 16, 0.40978765E+01, 0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000130E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54945607E-07,-0.46976984E-05, 0.41775103E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 17, 0.40867379E+01, 0.20000130E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67607058E-07,-0.42460574E-05, 0.42981048E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 18, 0.40764527E+01, 0.20000134E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.85362287E-07,-0.40183142E-05, 0.44209231E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 19, 0.40669461E+01, 0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10358070E-06,-0.37531378E-05, 0.45457880E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 20, 0.40581493E+01, 0.20000142E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12488408E-06, 0.90841338E-04, 0.46724738E+05, + 0.148E+06, 0.300E+03, 2, 103, 2, 21, 0.40500000E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 1, 0.44479937E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.93339622E-09,-0.61472808E-05, 0.26860006E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 2, 0.44084927E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86745179E-09,-0.98594294E-05, 0.27609669E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 3, 0.43720681E+01, 0.20000016E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60716654E-09,-0.10305780E-04, 0.28401418E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 4, 0.43385482E+01, 0.20000026E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13396251E-09,-0.10218089E-04, 0.29237568E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 5, 0.43077511E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.54774622E-09,-0.10137427E-04, 0.30112811E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 6, 0.42794837E+01, 0.20000047E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14885275E-08,-0.99326499E-05, 0.31024676E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 7, 0.42535540E+01, 0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27363300E-08,-0.95831349E-05, 0.31971303E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 8, 0.42297759E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.43502466E-08,-0.91137247E-05, 0.32950846E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 9, 0.42079714E+01, 0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64012662E-08,-0.85488167E-05, 0.33961508E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 10, 0.41879722E+01, 0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000092E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89726382E-08,-0.79112858E-05, 0.35001568E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 11, 0.41696213E+01, 0.20000092E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12160793E-07,-0.72218815E-05, 0.36069392E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 12, 0.41527727E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16075574E-07,-0.64987993E-05, 0.37163450E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 13, 0.41372920E+01, 0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20841107E-07,-0.57576911E-05, 0.38282316E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 14, 0.41230557E+01, 0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.26595759E-07,-0.50116044E-05, 0.39424673E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 15, 0.41099514E+01, 0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33492567E-07,-0.42712598E-05, 0.40589306E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 16, 0.40978765E+01, 0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.41699507E-07,-0.35452301E-05, 0.41775103E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 17, 0.40867380E+01, 0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.51399572E-07,-0.28332677E-05, 0.42981049E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 18, 0.40764528E+01, 0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000129E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64953856E-07,-0.22282259E-05, 0.44209232E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 19, 0.40669461E+01, 0.20000129E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000130E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.78835025E-07,-0.15680452E-05, 0.45457881E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 20, 0.40581494E+01, 0.20000130E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000130E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.95033053E-07,-0.37550547E-07, 0.46724739E+05, + 0.149E+06, 0.300E+03, 2, 104, 2, 21, 0.40500000E+01, 0.20000130E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000130E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 1, 0.44479935E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34285525E-09,-0.55006543E-05, 0.26860003E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 2, 0.44084924E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39003983E-09,-0.88222853E-05, 0.27609666E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 3, 0.43720679E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48129247E-09,-0.92247214E-05, 0.28401416E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 4, 0.43385480E+01, 0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60657233E-09,-0.91522437E-05, 0.29237566E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 5, 0.43077509E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80052511E-09,-0.90894409E-05, 0.30112808E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 6, 0.42794835E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10647515E-08,-0.89193170E-05, 0.31024674E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 7, 0.42535538E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14159862E-08,-0.86240286E-05, 0.31971301E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 8, 0.42297757E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18749658E-08,-0.82266528E-05, 0.32950844E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 9, 0.42079712E+01, 0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24659433E-08,-0.77500862E-05, 0.33961506E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 10, 0.41879721E+01, 0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32170889E-08,-0.72161084E-05, 0.35001565E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 11, 0.41696212E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41607321E-08,-0.66447864E-05, 0.36069390E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 12, 0.41527726E+01, 0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.53333739E-08,-0.60541846E-05, 0.37163448E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 13, 0.41372919E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67760993E-08,-0.54602584E-05, 0.38282315E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 14, 0.41230556E+01, 0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.85342617E-08,-0.48769401E-05, 0.39424671E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 15, 0.41099513E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10658089E-07,-0.43162709E-05, 0.40589305E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 16, 0.40978764E+01, 0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13202371E-07,-0.37886399E-05, 0.41775102E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 17, 0.40867379E+01, 0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000117E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16226671E-07,-0.32918848E-05, 0.42981048E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 18, 0.40764527E+01, 0.20000117E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20478619E-07,-0.29540815E-05, 0.44209231E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 19, 0.40669461E+01, 0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24848171E-07,-0.25767956E-05, 0.45457880E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 20, 0.40581493E+01, 0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29964867E-07, 0.49032619E-04, 0.46724739E+05, + 0.149E+06, 0.300E+03, 2, 105, 2, 21, 0.40500000E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 1, 0.44479935E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33793185E-09,-0.55009984E-05, 0.26860003E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 2, 0.44084924E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38865740E-09,-0.88229171E-05, 0.27609666E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 3, 0.43720679E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48935666E-09,-0.92255078E-05, 0.28401416E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 4, 0.43385480E+01, 0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63000092E-09,-0.91532538E-05, 0.29237566E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 5, 0.43077509E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84665468E-09,-0.90908029E-05, 0.30112808E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 6, 0.42794835E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11419615E-08,-0.89211707E-05, 0.31024674E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 7, 0.42535538E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15345116E-08,-0.86265454E-05, 0.31971301E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 8, 0.42297757E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20470422E-08,-0.82300414E-05, 0.32950844E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 9, 0.42079712E+01, 0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27063409E-08,-0.77546065E-05, 0.33961506E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 10, 0.41879721E+01, 0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35435611E-08,-0.72220749E-05, 0.35001565E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 11, 0.41696212E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45944519E-08,-0.66525803E-05, 0.36069390E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 12, 0.41527726E+01, 0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58994434E-08,-0.60642580E-05, 0.37163448E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 13, 0.41372919E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75037436E-08,-0.54731509E-05, 0.38282315E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 14, 0.41230556E+01, 0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.94578233E-08,-0.48932804E-05, 0.39424671E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 15, 0.41099513E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11817125E-07,-0.43367905E-05, 0.40589305E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 16, 0.40978764E+01, 0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14642258E-07,-0.38141857E-05, 0.41775102E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 17, 0.40867379E+01, 0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000117E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17999361E-07,-0.33233009E-05, 0.42981048E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 18, 0.40764527E+01, 0.20000117E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22717407E-07,-0.29939166E-05, 0.44209231E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 19, 0.40669461E+01, 0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27564965E-07,-0.26254035E-05, 0.45457880E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 20, 0.40581493E+01, 0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000072E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33240212E-07, 0.50978528E-04, 0.46724739E+05, + 0.150E+06, 0.300E+03, 2, 106, 2, 21, 0.40500000E+01, 0.20000072E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000072E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 1, 0.44479935E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33259615E-09,-0.55013935E-05, 0.26860003E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 2, 0.44084924E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38750538E-09,-0.88236356E-05, 0.27609666E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 3, 0.43720679E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49948236E-09,-0.92263973E-05, 0.28401416E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 4, 0.43385480E+01, 0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65830439E-09,-0.91543915E-05, 0.29237566E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 5, 0.43077509E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90184282E-09,-0.90923311E-05, 0.30112808E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 6, 0.42794835E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12340024E-08,-0.89232449E-05, 0.31024674E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 7, 0.42535538E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16754348E-08,-0.86293547E-05, 0.31971301E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 8, 0.42297757E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22513996E-08,-0.82338192E-05, 0.32950844E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 9, 0.42079712E+01, 0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29917283E-08,-0.77596389E-05, 0.33961506E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 10, 0.41879721E+01, 0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39309574E-08,-0.72287123E-05, 0.35001565E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 11, 0.41696212E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51089592E-08,-0.66612435E-05, 0.36069390E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 12, 0.41527726E+01, 0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65706263E-08,-0.60754526E-05, 0.37163448E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 13, 0.41372919E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.83665266E-08,-0.54874710E-05, 0.38282315E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 14, 0.41230556E+01, 0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10552734E-07,-0.49114284E-05, 0.39424671E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 15, 0.41099513E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13191093E-07,-0.43595747E-05, 0.40589305E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 16, 0.40978764E+01, 0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16349271E-07,-0.38425429E-05, 0.41775102E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 17, 0.40867379E+01, 0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000117E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20100730E-07,-0.33581716E-05, 0.42981048E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 18, 0.40764527E+01, 0.20000117E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25371288E-07,-0.30381267E-05, 0.44209231E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 19, 0.40669461E+01, 0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30785329E-07,-0.26793523E-05, 0.45457880E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 20, 0.40581493E+01, 0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000070E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37122736E-07, 0.53148234E-04, 0.46724739E+05, + 0.151E+06, 0.300E+03, 2, 107, 2, 21, 0.40500000E+01, 0.20000070E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000070E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 1, 0.44479935E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32678751E-09,-0.55018495E-05, 0.26860003E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 2, 0.44084924E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38669289E-09,-0.88244577E-05, 0.27609666E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 3, 0.43720679E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51216678E-09,-0.92274103E-05, 0.28401416E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 4, 0.43385480E+01, 0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69285306E-09,-0.91556814E-05, 0.29237566E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 5, 0.43077509E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96867249E-09,-0.90940566E-05, 0.30112808E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 6, 0.42794835E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13450214E-08,-0.89255823E-05, 0.31024674E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 7, 0.42535538E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18451465E-08,-0.86325126E-05, 0.31971301E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 8, 0.42297757E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24972299E-08,-0.82380586E-05, 0.32950844E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 9, 0.42079712E+01, 0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33346684E-08,-0.77652796E-05, 0.33961506E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 10, 0.41879721E+01, 0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43963034E-08,-0.72361474E-05, 0.35001565E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 11, 0.41696212E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57268092E-08,-0.66709418E-05, 0.36069390E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 12, 0.41527726E+01, 0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73766084E-08,-0.60879779E-05, 0.37163448E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 13, 0.41372919E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.94024047E-08,-0.55034898E-05, 0.38282315E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 14, 0.41230556E+01, 0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11867208E-07,-0.49317227E-05, 0.39424671E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 15, 0.41099513E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14840480E-07,-0.43850488E-05, 0.40589305E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 16, 0.40978764E+01, 0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18398229E-07,-0.38742471E-05, 0.41775102E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 17, 0.40867379E+01, 0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22623087E-07,-0.33971450E-05, 0.42981048E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 18, 0.40764527E+01, 0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000121E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28556751E-07,-0.30875383E-05, 0.44209231E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 19, 0.40669461E+01, 0.20000121E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34650899E-07,-0.27396491E-05, 0.45457880E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 20, 0.40581493E+01, 0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41783011E-07, 0.55585787E-04, 0.46724739E+05, + 0.151E+06, 0.300E+03, 2, 108, 2, 21, 0.40500000E+01, 0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 1, 0.44479935E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32019064E-09,-0.55023804E-05, 0.26860003E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 2, 0.44084924E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38630484E-09,-0.88254041E-05, 0.27609666E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 3, 0.43720679E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52819814E-09,-0.92285730E-05, 0.28401416E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 4, 0.43385480E+01, 0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73552656E-09,-0.91571550E-05, 0.29237566E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 5, 0.43077509E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10505876E-08,-0.90960216E-05, 0.30112808E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 6, 0.42794835E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14807908E-08,-0.89282360E-05, 0.31024674E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 7, 0.42535538E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20523172E-08,-0.86360904E-05, 0.31971301E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 8, 0.42297757E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27970236E-08,-0.82428550E-05, 0.32950844E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 9, 0.42079712E+01, 0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37527449E-08,-0.77716538E-05, 0.33961506E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 10, 0.41879721E+01, 0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49633915E-08,-0.72445421E-05, 0.35001565E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 11, 0.41696212E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.64795070E-08,-0.66818874E-05, 0.36069390E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 12, 0.41527726E+01, 0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.83583776E-08,-0.61021052E-05, 0.37163448E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 13, 0.41372919E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10664056E-07,-0.55215547E-05, 0.38282315E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 14, 0.41230556E+01, 0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13468064E-07,-0.49545989E-05, 0.39424671E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 15, 0.41099513E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16849081E-07,-0.44137656E-05, 0.40589305E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 16, 0.40978764E+01, 0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20893373E-07,-0.39099774E-05, 0.41775102E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 17, 0.40867379E+01, 0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25694584E-07,-0.34410624E-05, 0.42981048E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 18, 0.40764527E+01, 0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000121E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32435758E-07,-0.31432108E-05, 0.44209231E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 19, 0.40669461E+01, 0.20000121E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39357935E-07,-0.28075933E-05, 0.45457880E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 20, 0.40581493E+01, 0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000065E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47457749E-07, 0.58348417E-04, 0.46724739E+05, + 0.152E+06, 0.300E+03, 2, 109, 2, 21, 0.40500000E+01, 0.20000065E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000065E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 1, 0.44479935E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31264790E-09,-0.55030026E-05, 0.26860003E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 2, 0.44084924E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38637760E-09,-0.88265051E-05, 0.27609666E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 3, 0.43720679E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54872847E-09,-0.92299194E-05, 0.28401416E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 4, 0.43385480E+01, 0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78891996E-09,-0.91588546E-05, 0.29237566E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 5, 0.43077509E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11526451E-08,-0.90982804E-05, 0.30112808E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 6, 0.42794835E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16494960E-08,-0.89312765E-05, 0.31024674E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 7, 0.42535538E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23094375E-08,-0.86401828E-05, 0.31971301E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 8, 0.42297757E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31688493E-08,-0.82483308E-05, 0.32950844E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 9, 0.42079712E+01, 0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42709629E-08,-0.77789266E-05, 0.33961506E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 10, 0.41879721E+01, 0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56661035E-08,-0.72541096E-05, 0.35001565E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 11, 0.41696212E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74120423E-08,-0.66943547E-05, 0.36069390E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 12, 0.41527726E+01, 0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.95743356E-08,-0.61181932E-05, 0.37163448E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 13, 0.41372919E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12226568E-07,-0.55421181E-05, 0.38282315E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 14, 0.41230556E+01, 0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15450545E-07,-0.49806344E-05, 0.39424671E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 15, 0.41099513E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19336464E-07,-0.44464403E-05, 0.40589305E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 16, 0.40978764E+01, 0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23983157E-07,-0.39506329E-05, 0.41775102E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 17, 0.40867379E+01, 0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29498066E-07,-0.34910178E-05, 0.42981048E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 18, 0.40764527E+01, 0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000121E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37239054E-07,-0.32065394E-05, 0.44209231E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 19, 0.40669461E+01, 0.20000121E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45186510E-07,-0.28848788E-05, 0.45457880E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 20, 0.40581493E+01, 0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000063E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54484626E-07, 0.61512015E-04, 0.46724739E+05, + 0.152E+06, 0.300E+03, 2, 110, 2, 21, 0.40500000E+01, 0.20000063E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000063E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 1, 0.44479935E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30363784E-09,-0.55037405E-05, 0.26860003E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 2, 0.44084924E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38716583E-09,-0.88277991E-05, 0.27609666E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 3, 0.43720679E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57526146E-09,-0.92314967E-05, 0.28401416E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 4, 0.43385480E+01, 0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.85707143E-09,-0.91608364E-05, 0.29237566E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 5, 0.43077509E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12821814E-08,-0.91009054E-05, 0.30112808E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 6, 0.42794835E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18632515E-08,-0.89347998E-05, 0.31024674E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 7, 0.42535538E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26347698E-08,-0.86449160E-05, 0.31971301E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 8, 0.42297757E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36389974E-08,-0.82546547E-05, 0.32950844E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 9, 0.42079712E+01, 0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49259688E-08,-0.77873157E-05, 0.33961506E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 10, 0.41879721E+01, 0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65540614E-08,-0.72651372E-05, 0.35001565E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 11, 0.41696212E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.85902381E-08,-0.67087160E-05, 0.36069390E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 12, 0.41527726E+01, 0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11110581E-07,-0.61367177E-05, 0.37163448E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 13, 0.41372919E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14200389E-07,-0.55657861E-05, 0.38282315E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 14, 0.41230556E+01, 0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17954590E-07,-0.50106007E-05, 0.39424671E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 15, 0.41099513E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22478077E-07,-0.44840408E-05, 0.40589305E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 16, 0.40978764E+01, 0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27885593E-07,-0.39974084E-05, 0.41775102E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 17, 0.40867379E+01, 0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34301775E-07,-0.35484837E-05, 0.42981048E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 18, 0.40764527E+01, 0.20000118E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000122E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43305433E-07,-0.32793874E-05, 0.44209231E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 19, 0.40669461E+01, 0.20000122E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52547766E-07,-0.29737880E-05, 0.45457880E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 20, 0.40581493E+01, 0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63359184E-07, 0.65179725E-04, 0.46724739E+05, + 0.153E+06, 0.300E+03, 2, 111, 2, 21, 0.40500000E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 1, 0.44479935E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29279666E-09,-0.55046265E-05, 0.26860003E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 2, 0.44084924E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38894844E-09,-0.88293423E-05, 0.27609666E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 3, 0.43720679E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61047710E-09,-0.92333681E-05, 0.28401416E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 4, 0.43385480E+01, 0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.94599576E-09,-0.91631809E-05, 0.29237566E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 5, 0.43077509E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14505470E-08,-0.91039968E-05, 0.30112808E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 6, 0.42794835E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21404412E-08,-0.89389389E-05, 0.31024674E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 7, 0.42535538E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30562902E-08,-0.86504645E-05, 0.31971301E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 8, 0.42297757E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42478011E-08,-0.82620559E-05, 0.32950844E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 9, 0.42079712E+01, 0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57738119E-08,-0.77971220E-05, 0.33961506E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 10, 0.41879721E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77030321E-08,-0.72780184E-05, 0.35001565E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 11, 0.41696212E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10114454E-07,-0.67254821E-05, 0.36069390E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 12, 0.41527726E+01, 0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13097621E-07,-0.61583348E-05, 0.37163448E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 13, 0.41372919E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16753183E-07,-0.55934005E-05, 0.38282315E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 14, 0.41230556E+01, 0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21193143E-07,-0.50455527E-05, 0.39424671E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 15, 0.41099513E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26541068E-07,-0.45278912E-05, 0.40589305E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 16, 0.40978764E+01, 0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32932270E-07,-0.40519558E-05, 0.41775102E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 17, 0.40867379E+01, 0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40513842E-07,-0.36154840E-05, 0.42981048E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 18, 0.40764527E+01, 0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000122E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51150273E-07,-0.33643204E-05, 0.44209231E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 19, 0.40669460E+01, 0.20000122E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62067071E-07,-0.30774528E-05, 0.45457880E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 20, 0.40581493E+01, 0.20000125E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000056E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74835407E-07, 0.69495781E-04, 0.46724738E+05, + 0.154E+06, 0.300E+03, 2, 112, 2, 21, 0.40500000E+01, 0.20000056E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000056E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 1, 0.44479935E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27920275E-09,-0.55057094E-05, 0.26860003E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 2, 0.44084924E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39227113E-09,-0.88312134E-05, 0.27609666E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 3, 0.43720679E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.65829227E-09,-0.92356290E-05, 0.28401416E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 4, 0.43385480E+01, 0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10654549E-08,-0.91659984E-05, 0.29237566E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 5, 0.43077509E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16757137E-08,-0.91076999E-05, 0.30112808E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 6, 0.42794835E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25104115E-08,-0.89438830E-05, 0.31024674E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 7, 0.42535538E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36183458E-08,-0.86570745E-05, 0.31971301E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 8, 0.42297757E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50589976E-08,-0.82708629E-05, 0.32950844E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 9, 0.42079712E+01, 0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69030648E-08,-0.78087752E-05, 0.33961506E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 10, 0.41879721E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.92330689E-08,-0.72933133E-05, 0.35001565E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 11, 0.41696212E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12143816E-07,-0.67453766E-05, 0.36069390E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 12, 0.41527726E+01, 0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15742917E-07,-0.61839774E-05, 0.37163448E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 13, 0.41372919E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20151371E-07,-0.56261463E-05, 0.38282315E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 14, 0.41230556E+01, 0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25503808E-07,-0.50869919E-05, 0.39424671E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 15, 0.41099513E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31948754E-07,-0.45798763E-05, 0.40589305E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 16, 0.40978764E+01, 0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39648997E-07,-0.41166142E-05, 0.41775102E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 17, 0.40867379E+01, 0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48781512E-07,-0.36948900E-05, 0.42981048E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 18, 0.40764527E+01, 0.20000119E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61590763E-07,-0.34649777E-05, 0.44209231E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 19, 0.40669460E+01, 0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000126E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74735896E-07,-0.32003212E-05, 0.45457880E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 20, 0.40581493E+01, 0.20000126E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90108612E-07, 0.74668991E-04, 0.46724738E+05, + 0.154E+06, 0.300E+03, 2, 113, 2, 21, 0.40500000E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 1, 0.44479935E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26194660E-09,-0.55070616E-05, 0.26860003E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 2, 0.44084924E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39846782E-09,-0.88335320E-05, 0.27609666E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 3, 0.43720679E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72595867E-09,-0.92384184E-05, 0.28401416E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 4, 0.43385480E+01, 0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12318560E-08,-0.91694586E-05, 0.29237566E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 5, 0.43077509E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19879493E-08,-0.91122299E-05, 0.30112808E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 6, 0.42794835E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30225056E-08,-0.89499104E-05, 0.31024674E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 7, 0.42535538E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43952605E-08,-0.86651159E-05, 0.31971301E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 8, 0.42297757E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61795921E-08,-0.82815563E-05, 0.32950844E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 9, 0.42079712E+01, 0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84623025E-08,-0.78229076E-05, 0.33961506E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 10, 0.41879721E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11344940E-07,-0.73118469E-05, 0.35001565E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 11, 0.41696212E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14944259E-07,-0.67694697E-05, 0.36069390E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 12, 0.41527726E+01, 0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19392828E-07,-0.62150173E-05, 0.37163448E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 13, 0.41372919E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24839561E-07,-0.56657746E-05, 0.38282315E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 14, 0.41230556E+01, 0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31450400E-07,-0.51371326E-05, 0.39424671E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 15, 0.41099513E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39408308E-07,-0.46427668E-05, 0.40589304E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 16, 0.40978764E+01, 0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48913983E-07,-0.41948386E-05, 0.41775102E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 17, 0.40867379E+01, 0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60185509E-07,-0.37909281E-05, 0.42981048E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 18, 0.40764527E+01, 0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75991702E-07,-0.35867273E-05, 0.44209231E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 19, 0.40669460E+01, 0.20000123E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.92210248E-07,-0.33489503E-05, 0.45457880E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 20, 0.40581493E+01, 0.20000127E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11117506E-06, 0.81014830E-04, 0.46724738E+05, + 0.155E+06, 0.300E+03, 2, 114, 2, 21, 0.40500000E+01, 0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000046E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 1, 0.44479935E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23980344E-09,-0.55087981E-05, 0.26860003E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 2, 0.44084924E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41031550E-09,-0.88364880E-05, 0.27609666E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 3, 0.43720679E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.82673068E-09,-0.92419568E-05, 0.28401416E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 4, 0.43385480E+01, 0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14752125E-08,-0.91738264E-05, 0.29237566E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 5, 0.43077509E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24419326E-08,-0.91179215E-05, 0.30112808E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 6, 0.42794835E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37649321E-08,-0.89574575E-05, 0.31024674E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 7, 0.42535538E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55201235E-08,-0.86751584E-05, 0.31971301E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 8, 0.42297757E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78004329E-08,-0.82948840E-05, 0.32950844E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 9, 0.42079712E+01, 0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10716273E-07,-0.78405001E-05, 0.33961506E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 10, 0.41879721E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14396671E-07,-0.73348941E-05, 0.35001565E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 11, 0.41696212E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18989934E-07,-0.67994125E-05, 0.36069390E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 12, 0.41527726E+01, 0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24664696E-07,-0.62535769E-05, 0.37163448E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 13, 0.41372919E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31610277E-07,-0.57149871E-05, 0.38282315E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 14, 0.41230556E+01, 0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40037606E-07,-0.51993918E-05, 0.39424671E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 15, 0.41099513E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50179757E-07,-0.47208505E-05, 0.40589304E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 16, 0.40978764E+01, 0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.62291753E-07,-0.42919519E-05, 0.41775102E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 17, 0.40867379E+01, 0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76651243E-07,-0.39101394E-05, 0.42981047E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 18, 0.40764527E+01, 0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96784109E-07,-0.37378556E-05, 0.44209231E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 19, 0.40669460E+01, 0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11743980E-06,-0.35334722E-05, 0.45457880E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 20, 0.40581493E+01, 0.20000128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000039E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14159067E-06, 0.89036118E-04, 0.46724738E+05, + 0.155E+06, 0.300E+03, 2, 115, 2, 21, 0.40500000E+01, 0.20000039E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000039E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 1, 0.44479935E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12517315E-07,-0.54756332E-05, 0.26860003E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 2, 0.44084924E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.95513678E-08,-0.87921331E-05, 0.27609666E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 3, 0.43720679E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78586406E-09,-0.91995483E-05, 0.28401416E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 4, 0.43385480E+01, 0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13907969E-07,-0.91363467E-05, 0.29237566E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 5, 0.43077509E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35382157E-07,-0.90863289E-05, 0.30112808E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 6, 0.42794835E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64850659E-07,-0.89335116E-05, 0.31024674E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 7, 0.42535538E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10389494E-06,-0.86609953E-05, 0.31971301E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 8, 0.42297757E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15445847E-06,-0.82928074E-05, 0.32950844E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 9, 0.42079712E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21886345E-06,-0.78530128E-05, 0.33961506E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 10, 0.41879721E+01, 0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000082E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29983043E-06,-0.73647306E-05, 0.35001566E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 11, 0.41696212E+01, 0.20000082E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000088E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40049781E-06,-0.68495853E-05, 0.36069390E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 12, 0.41527726E+01, 0.20000088E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.52444026E-06,-0.63274153E-05, 0.37163448E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 13, 0.41372919E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.67568411E-06,-0.58161959E-05, 0.38282315E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 14, 0.41230556E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.85872016E-06,-0.53320829E-05, 0.39424672E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 15, 0.41099513E+01, 0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000108E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10785132E-05,-0.48896077E-05, 0.40589305E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 16, 0.40978764E+01, 0.20000108E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13405088E-05,-0.45018634E-05, 0.41775102E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 17, 0.40867379E+01, 0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16506368E-05,-0.41745151E-05, 0.42981048E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 18, 0.40764527E+01, 0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20847462E-05,-0.40660853E-05, 0.44209231E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 19, 0.40669461E+01, 0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000117E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25296837E-05,-0.39191598E-05, 0.45457880E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 20, 0.40581494E+01, 0.20000117E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30494426E-05,-0.72155498E-06, 0.46724739E+05, + 0.156E+06, 0.300E+03, 2, 116, 2, 21, 0.40500000E+01, 0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 1, 0.44479935E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24409625E-09,-0.55092773E-05, 0.26860003E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 2, 0.44084924E+01, 0.20000006E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40740512E-09,-0.88377102E-05, 0.27609666E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 3, 0.43720679E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80503620E-09,-0.92431711E-05, 0.28401416E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 4, 0.43385480E+01, 0.20000024E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14234077E-08,-0.91748920E-05, 0.29237566E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 5, 0.43077509E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23457324E-08,-0.91187466E-05, 0.30112808E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 6, 0.42794835E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36079170E-08,-0.89579220E-05, 0.31024674E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 7, 0.42535538E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52825029E-08,-0.86751099E-05, 0.31971301E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 8, 0.42297757E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74581961E-08,-0.82941342E-05, 0.32950844E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 9, 0.42079712E+01, 0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10240619E-07,-0.78388148E-05, 0.33961506E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 10, 0.41879721E+01, 0.20000076E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13752894E-07,-0.73319847E-05, 0.35001565E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 11, 0.41696212E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18136658E-07,-0.67949234E-05, 0.36069390E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 12, 0.41527726E+01, 0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23552978E-07,-0.62470685E-05, 0.37163448E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 13, 0.41372919E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30182637E-07,-0.57059333E-05, 0.38282315E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 14, 0.41230556E+01, 0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38227129E-07,-0.51871475E-05, 0.39424671E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 15, 0.41099513E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47908931E-07,-0.47046506E-05, 0.40589304E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 16, 0.40978764E+01, 0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59471543E-07,-0.42708913E-05, 0.41775102E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 17, 0.40867379E+01, 0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73180199E-07,-0.38834337E-05, 0.42981047E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 18, 0.40764527E+01, 0.20000120E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.92401096E-07,-0.37028084E-05, 0.44209231E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 19, 0.40669460E+01, 0.20000124E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11212144E-06,-0.34892694E-05, 0.45457880E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 20, 0.40581493E+01, 0.20000128E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000040E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13517917E-06, 0.87445097E-04, 0.46724738E+05, + 0.157E+06, 0.300E+03, 2, 117, 2, 21, 0.40500000E+01, 0.20000040E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000040E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 1, 0.44479935E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12465280E-07,-0.54766768E-05, 0.26860003E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 2, 0.44084924E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.95919556E-08,-0.87941620E-05, 0.27609666E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 3, 0.43720679E+01, 0.20000014E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10661218E-08,-0.92014927E-05, 0.28401416E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 4, 0.43385480E+01, 0.20000023E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13245153E-07,-0.91379918E-05, 0.29237566E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 5, 0.43077509E+01, 0.20000033E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34155273E-07,-0.90875448E-05, 0.30112808E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 6, 0.42794835E+01, 0.20000042E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.62852584E-07,-0.89341184E-05, 0.31024674E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 7, 0.42535538E+01, 0.20000051E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10087591E-06,-0.86607722E-05, 0.31971301E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 8, 0.42297757E+01, 0.20000059E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15011644E-06,-0.82914884E-05, 0.32950844E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 9, 0.42079712E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21283394E-06,-0.78502708E-05, 0.33961506E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 10, 0.41879721E+01, 0.20000075E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000082E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29167604E-06,-0.73601774E-05, 0.35001566E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 11, 0.41696212E+01, 0.20000082E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000088E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.38969719E-06,-0.68427475E-05, 0.36069390E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 12, 0.41527726E+01, 0.20000088E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.51037641E-06,-0.63177232E-05, 0.37163448E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 13, 0.41372919E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.65763234E-06,-0.58029705E-05, 0.38282315E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 14, 0.41230556E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.83583574E-06,-0.53145102E-05, 0.39424672E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 15, 0.41099513E+01, 0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000108E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10498188E-05,-0.48667251E-05, 0.40589305E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 16, 0.40978764E+01, 0.20000108E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13048818E-05,-0.44725573E-05, 0.41775102E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 17, 0.40867379E+01, 0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16067956E-05,-0.41375507E-05, 0.42981048E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 18, 0.40764527E+01, 0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20293946E-05,-0.40182762E-05, 0.44209231E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 19, 0.40669461E+01, 0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000117E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24625286E-05,-0.38598279E-05, 0.45457880E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 20, 0.40581494E+01, 0.20000117E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29684895E-05,-0.36969133E-07, 0.46724739E+05, + 0.157E+06, 0.300E+03, 2, 118, 2, 21, 0.40500000E+01, 0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76043409E-05, 0.26931463E-05, 0.26860001E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79748947E-05, 0.98267677E-07, 0.27609664E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.81849057E-05,-0.51215866E-07, 0.28401413E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80267894E-05,-0.14493032E-06, 0.29237563E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79351313E-05,-0.18090733E-06, 0.30112806E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77288349E-05,-0.23573567E-06, 0.31024671E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74264666E-05,-0.27486076E-06, 0.31971298E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70470150E-05,-0.29986254E-06, 0.32950841E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.66089983E-05,-0.31263164E-06, 0.33961504E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 10, 0.41879719E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61298509E-05,-0.31516091E-06, 0.35001564E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 11, 0.41696211E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56255580E-05,-0.30937458E-06, 0.36069388E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 12, 0.41527725E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51104842E-05,-0.29704136E-06, 0.37163447E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 13, 0.41372918E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45973475E-05,-0.27970512E-06, 0.38282314E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 14, 0.41230555E+01, 0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40972924E-05,-0.25868062E-06, 0.39424670E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 15, 0.41099512E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36200286E-05,-0.23504657E-06, 0.40589304E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 16, 0.40978764E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31740031E-05,-0.20966870E-06, 0.41775101E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 17, 0.40867379E+01, 0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27665853E-05,-0.17335511E-06, 0.42981047E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 18, 0.40764527E+01, 0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24874539E-05,-0.15075231E-06, 0.44209230E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 19, 0.40669460E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000109E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21680016E-05,-0.13335184E-06, 0.45457880E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 20, 0.40581493E+01, 0.20000109E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19074900E-05, 0.44831893E-04, 0.46724739E+05, + 0.158E+06, 0.300E+03, 2, 119, 2, 21, 0.40500000E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30401376E-09,-0.49111725E-05, 0.26860001E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34757250E-09,-0.78768074E-05, 0.27609664E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43298011E-09,-0.82363550E-05, 0.28401413E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55112954E-09,-0.81720373E-05, 0.29237563E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73370757E-09,-0.81164904E-05, 0.30112806E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98235129E-09,-0.79652174E-05, 0.31024671E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13129951E-08,-0.77022380E-05, 0.31971298E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17448231E-08,-0.73481412E-05, 0.32950841E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23006578E-08,-0.69233531E-05, 0.33961504E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 10, 0.41879719E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30067410E-08,-0.64473253E-05, 0.35001564E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 11, 0.41696211E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38933892E-08,-0.59379984E-05, 0.36069388E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 12, 0.41527725E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49948721E-08,-0.54115324E-05, 0.37163447E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 13, 0.41372918E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63494857E-08,-0.48822279E-05, 0.38282314E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 14, 0.41230555E+01, 0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79999639E-08,-0.43625816E-05, 0.39424670E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 15, 0.41099512E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.99931155E-08,-0.38634298E-05, 0.40589304E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 16, 0.40978764E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12380381E-07,-0.33941328E-05, 0.41775101E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 17, 0.40867379E+01, 0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15217665E-07,-0.29528164E-05, 0.42981047E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 18, 0.40764527E+01, 0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19205836E-07,-0.26546172E-05, 0.44209230E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 19, 0.40669460E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23303946E-07,-0.23214983E-05, 0.45457880E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 20, 0.40581493E+01, 0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000065E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28102368E-07, 0.44596191E-04, 0.46724739E+05, + 0.158E+06, 0.300E+03, 2, 120, 2, 21, 0.40500000E+01, 0.20000065E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000065E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29946629E-09,-0.49115006E-05, 0.26860001E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34645685E-09,-0.78774072E-05, 0.27609664E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.44100792E-09,-0.82370996E-05, 0.28401413E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57402455E-09,-0.81729915E-05, 0.29237563E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77852746E-09,-0.81177745E-05, 0.30112806E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10572815E-08,-0.79669640E-05, 0.31024671E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14278703E-08,-0.77046045E-05, 0.31971298E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19115153E-08,-0.73513273E-05, 0.32950841E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25333672E-08,-0.69275995E-05, 0.33961504E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 10, 0.41879719E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33227843E-08,-0.64529287E-05, 0.35001564E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 11, 0.41696211E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43131877E-08,-0.59453136E-05, 0.36069388E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 12, 0.41527725E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55426305E-08,-0.54209895E-05, 0.37163447E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 13, 0.41372918E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70536529E-08,-0.48943248E-05, 0.38282314E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 14, 0.41230555E+01, 0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88935728E-08,-0.43779140E-05, 0.39424670E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 15, 0.41099512E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11114510E-07,-0.38826841E-05, 0.40589304E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 16, 0.40978764E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13773606E-07,-0.34180973E-05, 0.41775101E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 17, 0.40867379E+01, 0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16932778E-07,-0.29822859E-05, 0.42981047E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 18, 0.40764527E+01, 0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21371937E-07,-0.26919849E-05, 0.44209230E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 19, 0.40669460E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25932483E-07,-0.23670939E-05, 0.45457880E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 20, 0.40581493E+01, 0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000063E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31271290E-07, 0.46425477E-04, 0.46724739E+05, + 0.159E+06, 0.300E+03, 2, 121, 2, 21, 0.40500000E+01, 0.20000063E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000063E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29449438E-09,-0.49118786E-05, 0.26860001E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34559586E-09,-0.78780906E-05, 0.27609664E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45107299E-09,-0.82379443E-05, 0.28401413E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60183083E-09,-0.81740700E-05, 0.29237563E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.83245444E-09,-0.81192193E-05, 0.30112806E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11470911E-08,-0.79689241E-05, 0.31024671E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15652161E-08,-0.77072558E-05, 0.31971298E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21105855E-08,-0.73548890E-05, 0.32950841E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28112602E-08,-0.69323422E-05, 0.33961504E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 10, 0.41879719E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36998972E-08,-0.64591812E-05, 0.35001564E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 11, 0.41696211E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48139676E-08,-0.59534741E-05, 0.36069388E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 12, 0.41527725E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61959630E-08,-0.54315289E-05, 0.37163447E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 13, 0.41372918E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.78933711E-08,-0.49078077E-05, 0.38282314E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 14, 0.41230555E+01, 0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.99591610E-08,-0.43949969E-05, 0.39424670E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 15, 0.41099512E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12451734E-07,-0.39041288E-05, 0.40589304E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 16, 0.40978764E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15434780E-07,-0.34447898E-05, 0.41775101E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 17, 0.40867379E+01, 0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18977759E-07,-0.30151001E-05, 0.42981047E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 18, 0.40764527E+01, 0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000108E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23954538E-07,-0.27335898E-05, 0.44209230E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 19, 0.40669460E+01, 0.20000108E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29066408E-07,-0.24178654E-05, 0.45457880E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 20, 0.40581493E+01, 0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000062E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35049525E-07, 0.48472260E-04, 0.46724739E+05, + 0.160E+06, 0.300E+03, 2, 122, 2, 21, 0.40500000E+01, 0.20000062E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000062E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28902529E-09,-0.49123164E-05, 0.26860001E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34508654E-09,-0.78788750E-05, 0.27609664E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.46379379E-09,-0.82389095E-05, 0.28401413E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63591870E-09,-0.81752972E-05, 0.29237563E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.89814421E-09,-0.81208576E-05, 0.30112806E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12560971E-08,-0.79711399E-05, 0.31024671E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17317022E-08,-0.77102466E-05, 0.31971298E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23515895E-08,-0.73589009E-05, 0.32950841E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31473852E-08,-0.69376790E-05, 0.33961504E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 10, 0.41879719E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41559785E-08,-0.64662107E-05, 0.35001564E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 11, 0.41696211E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54194243E-08,-0.59626425E-05, 0.36069388E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 12, 0.41527725E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69855984E-08,-0.54433662E-05, 0.37163447E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 13, 0.41372918E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.89082217E-08,-0.49229467E-05, 0.38282314E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 14, 0.41230555E+01, 0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11246957E-07,-0.44141695E-05, 0.39424670E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 15, 0.41099512E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14067555E-07,-0.39281986E-05, 0.40589304E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 16, 0.40978764E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17442047E-07,-0.34747398E-05, 0.41775101E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 17, 0.40867379E+01, 0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21448723E-07,-0.30519169E-05, 0.42981047E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 18, 0.40764527E+01, 0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000108E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27075172E-07,-0.27802626E-05, 0.44209230E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 19, 0.40669460E+01, 0.20000108E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32853253E-07,-0.24748248E-05, 0.45457880E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 20, 0.40581493E+01, 0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39614897E-07, 0.50781039E-04, 0.46724739E+05, + 0.160E+06, 0.300E+03, 2, 123, 2, 21, 0.40500000E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28279222E-09,-0.49128273E-05, 0.26860001E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34492890E-09,-0.78797823E-05, 0.27609664E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47986153E-09,-0.82400224E-05, 0.28401413E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67826477E-09,-0.81767048E-05, 0.29237563E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97927114E-09,-0.81227308E-05, 0.30112806E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13903385E-08,-0.79736669E-05, 0.31024671E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19364234E-08,-0.77136495E-05, 0.31971298E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26477695E-08,-0.73634600E-05, 0.32950841E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35603201E-08,-0.69437355E-05, 0.33961504E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 10, 0.41879719E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47159604E-08,-0.64741824E-05, 0.35001564E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 11, 0.41696211E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61626391E-08,-0.59730337E-05, 0.36069388E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 12, 0.41527725E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79549257E-08,-0.54567770E-05, 0.37163447E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 13, 0.41372918E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10153866E-07,-0.49400898E-05, 0.38282314E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 14, 0.41230555E+01, 0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12827392E-07,-0.44358803E-05, 0.39424670E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 15, 0.41099512E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16050520E-07,-0.39554463E-05, 0.40589304E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 16, 0.40978764E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19905298E-07,-0.35086438E-05, 0.41775101E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 17, 0.40867379E+01, 0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24481002E-07,-0.30935833E-05, 0.42981047E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 18, 0.40764527E+01, 0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000108E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30904557E-07,-0.28330810E-05, 0.44209230E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 19, 0.40669460E+01, 0.20000108E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37500043E-07,-0.25392845E-05, 0.45457880E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 20, 0.40581493E+01, 0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.45217021E-07, 0.53410156E-04, 0.46724739E+05, + 0.161E+06, 0.300E+03, 2, 124, 2, 21, 0.40500000E+01, 0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000057E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.27546776E-09,-0.49134294E-05, 0.26860001E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34526844E-09,-0.78808432E-05, 0.27609664E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50057376E-09,-0.82413176E-05, 0.28401413E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73176731E-09,-0.81783362E-05, 0.29237563E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10812194E-08,-0.81248948E-05, 0.30112806E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15586678E-08,-0.79765775E-05, 0.31024671E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21928281E-08,-0.77175611E-05, 0.31971298E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30183583E-08,-0.73686936E-05, 0.32950841E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40767676E-08,-0.69506792E-05, 0.33961504E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 10, 0.41879719E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.54161743E-08,-0.64833151E-05, 0.35001564E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 11, 0.41696211E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.70918274E-08,-0.59849308E-05, 0.36069388E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 12, 0.41527725E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91664697E-08,-0.54721260E-05, 0.37163447E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 13, 0.41372918E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11710581E-07,-0.49597045E-05, 0.38282314E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 14, 0.41230555E+01, 0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14802426E-07,-0.44607155E-05, 0.39424670E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 15, 0.41099512E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18528469E-07,-0.39866130E-05, 0.40589304E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 16, 0.40978764E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22983416E-07,-0.35474150E-05, 0.41775101E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 17, 0.40867379E+01, 0.20000102E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28270006E-07,-0.31412236E-05, 0.42981047E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 18, 0.40764527E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000108E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35689615E-07,-0.28934721E-05, 0.44209230E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 19, 0.40669460E+01, 0.20000108E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43306524E-07,-0.26129873E-05, 0.45457880E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 20, 0.40581493E+01, 0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000055E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52217171E-07, 0.56437885E-04, 0.46724738E+05, + 0.161E+06, 0.300E+03, 2, 125, 2, 21, 0.40500000E+01, 0.20000055E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000055E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26676086E-09,-0.49141475E-05, 0.26860001E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34638409E-09,-0.78820977E-05, 0.27609664E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.52764032E-09,-0.82428441E-05, 0.28401413E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.80069488E-09,-0.81802511E-05, 0.29237563E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12119805E-08,-0.81274252E-05, 0.30112806E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17742180E-08,-0.79799711E-05, 0.31024671E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25207313E-08,-0.77221136E-05, 0.31971298E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34921686E-08,-0.73747728E-05, 0.32950841E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.47366969E-08,-0.69587386E-05, 0.33961504E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 10, 0.41879719E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63105836E-08,-0.64939053E-05, 0.35001564E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 11, 0.41696211E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.82784633E-08,-0.59987206E-05, 0.36069388E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 12, 0.41527725E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10713629E-07,-0.54899064E-05, 0.37163447E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 13, 0.41372918E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13698348E-07,-0.49824227E-05, 0.38282314E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 14, 0.41230555E+01, 0.20000090E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17324152E-07,-0.44894729E-05, 0.39424670E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 15, 0.41099512E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21692249E-07,-0.40226957E-05, 0.40589304E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 16, 0.40978764E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000103E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26913234E-07,-0.35923000E-05, 0.41775101E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 17, 0.40867379E+01, 0.20000103E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33107402E-07,-0.31963626E-05, 0.42981047E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 18, 0.40764527E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000109E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41798460E-07,-0.29633697E-05, 0.44209230E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 19, 0.40669460E+01, 0.20000109E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50719294E-07,-0.26982963E-05, 0.45457880E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 20, 0.40581493E+01, 0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61153842E-07, 0.59971987E-04, 0.46724738E+05, + 0.162E+06, 0.300E+03, 2, 126, 2, 21, 0.40500000E+01, 0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25602882E-09,-0.49150166E-05, 0.26860001E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34854262E-09,-0.78836054E-05, 0.27609664E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56393522E-09,-0.82446699E-05, 0.28401413E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.89183838E-09,-0.81825323E-05, 0.29237563E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13841297E-08,-0.81304289E-05, 0.30112806E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20574468E-08,-0.79839868E-05, 0.31024671E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29511769E-08,-0.77274902E-05, 0.31971298E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41136324E-08,-0.73819411E-05, 0.32950841E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56020023E-08,-0.69682302E-05, 0.33961504E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 10, 0.41879719E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.74831769E-08,-0.65063694E-05, 0.35001564E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 11, 0.41696211E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98338690E-08,-0.60149357E-05, 0.36069388E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 12, 0.41527725E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12741172E-07,-0.55108131E-05, 0.37163447E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 13, 0.41372918E+01, 0.20000085E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16303117E-07,-0.50091231E-05, 0.38282314E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 14, 0.41230555E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20628504E-07,-0.45232674E-05, 0.39424670E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 15, 0.41099512E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25837677E-07,-0.40650883E-05, 0.40589304E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 16, 0.40978764E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000103E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32062162E-07,-0.36450339E-05, 0.41775101E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 17, 0.40867379E+01, 0.20000103E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39445319E-07,-0.32611310E-05, 0.42981047E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 18, 0.40764527E+01, 0.20000106E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000109E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49802184E-07,-0.30454688E-05, 0.44209230E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 19, 0.40669460E+01, 0.20000109E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60431291E-07,-0.27985096E-05, 0.45457879E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 20, 0.40581493E+01, 0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000048E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.72862458E-07, 0.64165576E-04, 0.46724738E+05, + 0.163E+06, 0.300E+03, 2, 127, 2, 21, 0.40500000E+01, 0.20000048E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000048E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24250767E-09,-0.49160887E-05, 0.26860001E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35256865E-09,-0.78854524E-05, 0.27609664E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61418784E-09,-0.82468953E-05, 0.28401413E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10162936E-08,-0.81853012E-05, 0.29237563E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16182457E-08,-0.81340600E-05, 0.30112806E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24416537E-08,-0.79888290E-05, 0.31024671E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35345268E-08,-0.77339568E-05, 0.31971298E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.49552667E-08,-0.73905487E-05, 0.32950841E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.67734315E-08,-0.69796135E-05, 0.33961504E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 10, 0.41879719E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90700875E-08,-0.65213034E-05, 0.35001564E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 11, 0.41696211E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11938416E-07,-0.60343579E-05, 0.36069388E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 12, 0.41527725E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000086E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.15484353E-07,-0.55358388E-05, 0.37163447E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 13, 0.41372918E+01, 0.20000086E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19826839E-07,-0.50410769E-05, 0.38282314E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 14, 0.41230555E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25098222E-07,-0.45637032E-05, 0.39424670E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 15, 0.41099512E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31444773E-07,-0.41158097E-05, 0.40589304E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 16, 0.40978764E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000103E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39026563E-07,-0.37081212E-05, 0.41775101E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 17, 0.40867379E+01, 0.20000103E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48017658E-07,-0.33385958E-05, 0.42981047E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 18, 0.40764527E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60627353E-07,-0.31436696E-05, 0.44209230E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 19, 0.40669460E+01, 0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.73566819E-07,-0.29183858E-05, 0.45457879E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 20, 0.40581493E+01, 0.20000113E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000044E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88698240E-07, 0.69244607E-04, 0.46724738E+05, + 0.163E+06, 0.300E+03, 2, 128, 2, 21, 0.40500000E+01, 0.20000044E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000044E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.22517876E-09,-0.49174446E-05, 0.26860001E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36013565E-09,-0.78877696E-05, 0.27609664E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.68681402E-09,-0.82496758E-05, 0.28401413E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11934511E-08,-0.81887437E-05, 0.29237563E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19497262E-08,-0.81385558E-05, 0.30112806E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.29845978E-08,-0.79948025E-05, 0.31024671E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43577529E-08,-0.77419162E-05, 0.31971298E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000061E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.61420966E-08,-0.74011230E-05, 0.32950841E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 9, 0.42079710E+01, 0.20000061E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84243705E-08,-0.69935813E-05, 0.33961504E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 10, 0.41879719E+01, 0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11305795E-07,-0.65396121E-05, 0.35001564E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 11, 0.41696211E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14902762E-07,-0.60581507E-05, 0.36069388E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 12, 0.41527725E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000086E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19347475E-07,-0.55664880E-05, 0.37163447E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 13, 0.41372918E+01, 0.20000086E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24788678E-07,-0.50801970E-05, 0.38282314E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 14, 0.41230555E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.31391658E-07,-0.46131991E-05, 0.39424670E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 15, 0.41099512E+01, 0.20000095E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39339163E-07,-0.41778902E-05, 0.40589304E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 16, 0.40978763E+01, 0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.48831401E-07,-0.37853332E-05, 0.41775101E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 17, 0.40867379E+01, 0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60085998E-07,-0.34333828E-05, 0.42981047E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 18, 0.40764527E+01, 0.20000107E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75867065E-07,-0.32638373E-05, 0.44209230E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 19, 0.40669460E+01, 0.20000110E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.92058835E-07,-0.30650909E-05, 0.45457879E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 20, 0.40581493E+01, 0.20000114E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000038E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11099146E-06, 0.75558769E-04, 0.46724738E+05, + 0.164E+06, 0.300E+03, 2, 129, 2, 21, 0.40500000E+01, 0.20000038E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000038E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20295071E-09,-0.49192156E-05, 0.26860001E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37505136E-09,-0.78907728E-05, 0.27609664E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79843934E-09,-0.82532621E-05, 0.28401413E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14600422E-08,-0.81931597E-05, 0.29237563E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.24453038E-08,-0.81442946E-05, 0.30112806E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.37936964E-08,-0.80023986E-05, 0.31024671E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55824178E-08,-0.77520105E-05, 0.31971298E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000061E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.79058373E-08,-0.74145060E-05, 0.32950841E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 9, 0.42079710E+01, 0.20000061E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10876198E-07,-0.70112326E-05, 0.33961504E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 10, 0.41879719E+01, 0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14624529E-07,-0.65627284E-05, 0.35001564E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 11, 0.41696211E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19301757E-07,-0.60881692E-05, 0.36069388E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 12, 0.41527725E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000086E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.25079086E-07,-0.56051390E-05, 0.37163447E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 13, 0.41372918E+01, 0.20000086E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32149183E-07,-0.51295208E-05, 0.38282314E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 14, 0.41230555E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40726518E-07,-0.46755916E-05, 0.39424670E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 15, 0.41099512E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.51047973E-07,-0.42561378E-05, 0.40589304E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 16, 0.40978763E+01, 0.20000100E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63372936E-07,-0.38826509E-05, 0.41775101E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 17, 0.40867379E+01, 0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000108E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77983883E-07,-0.35528310E-05, 0.42981047E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 18, 0.40764527E+01, 0.20000108E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98467596E-07,-0.34152735E-05, 0.44209230E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 19, 0.40669460E+01, 0.20000111E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11948219E-06,-0.32500058E-05, 0.45457879E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 20, 0.40581493E+01, 0.20000115E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000031E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14405179E-06, 0.83682978E-04, 0.46724738E+05, + 0.164E+06, 0.300E+03, 2, 130, 2, 21, 0.40500000E+01, 0.20000031E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000031E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.17570225E-09,-0.49216335E-05, 0.26860001E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40736874E-09,-0.78948427E-05, 0.27609664E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98509190E-09,-0.82580930E-05, 0.28401413E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18932284E-08,-0.81990677E-05, 0.29237563E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32426397E-08,-0.81519323E-05, 0.30112806E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.50896294E-08,-0.80124609E-05, 0.31024671E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75391290E-08,-0.77653366E-05, 0.31971298E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000061E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10719644E-07,-0.74321323E-05, 0.32950841E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 9, 0.42079710E+01, 0.20000061E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14784043E-07,-0.70344418E-05, 0.33961504E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 10, 0.41879719E+01, 0.20000068E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19910901E-07,-0.65930852E-05, 0.35001564E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 11, 0.41696211E+01, 0.20000074E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.26305740E-07,-0.61275643E-05, 0.36069388E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 12, 0.41527725E+01, 0.20000080E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000086E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.34202094E-07,-0.56558360E-05, 0.37163447E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 13, 0.41372918E+01, 0.20000086E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43862528E-07,-0.51941984E-05, 0.38282314E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 14, 0.41230555E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55579658E-07,-0.47573946E-05, 0.39424670E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 15, 0.41099512E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.69676341E-07,-0.43587214E-05, 0.40589304E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 16, 0.40978763E+01, 0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.86506625E-07,-0.40102340E-05, 0.41775101E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 17, 0.40867379E+01, 0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000109E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10645570E-06,-0.37093960E-05, 0.42981047E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 18, 0.40764526E+01, 0.20000109E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13441944E-06,-0.36137897E-05, 0.44209230E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 19, 0.40669460E+01, 0.20000112E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16310512E-06,-0.34924597E-05, 0.45457879E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 20, 0.40581493E+01, 0.20000116E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000022E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.19664107E-06, 0.94641060E-04, 0.46724738E+05, + 0.165E+06, 0.300E+03, 2, 131, 2, 21, 0.40500000E+01, 0.20000022E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000022E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.14019800E-08,-0.48974742E-05, 0.26860001E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12988433E-08,-0.78552634E-05, 0.27609664E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.89730747E-09,-0.82114871E-05, 0.28401413E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16957832E-09,-0.81425666E-05, 0.29237563E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.87948138E-09,-0.80795061E-05, 0.30112806E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.23271059E-08,-0.79177107E-05, 0.31024671E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42472554E-08,-0.76406204E-05, 0.31971298E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.67311339E-08,-0.72679599E-05, 0.32950841E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.98881719E-08,-0.68191109E-05, 0.33961504E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 10, 0.41879719E+01, 0.20000067E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13846826E-07,-0.63123050E-05, 0.35001564E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 11, 0.41696211E+01, 0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000079E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18755648E-07,-0.57640627E-05, 0.36069388E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 12, 0.41527725E+01, 0.20000079E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24784240E-07,-0.51889538E-05, 0.37163447E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 13, 0.41372918E+01, 0.20000084E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32123595E-07,-0.45994719E-05, 0.38282314E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 14, 0.41230556E+01, 0.20000089E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40987215E-07,-0.40061198E-05, 0.39424671E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 15, 0.41099513E+01, 0.20000093E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.51610938E-07,-0.34175063E-05, 0.40589304E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 16, 0.40978764E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.64253860E-07,-0.28405602E-05, 0.41775102E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 17, 0.40867379E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.79197659E-07,-0.22755574E-05, 0.42981047E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 18, 0.40764527E+01, 0.20000101E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000103E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10008075E-06,-0.17965463E-05, 0.44209231E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 19, 0.40669461E+01, 0.20000103E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12146809E-06,-0.12733960E-05, 0.45457880E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 20, 0.40581494E+01, 0.20000104E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14642632E-06,-0.14996981E-05, 0.46724739E+05, + 0.166E+06, 0.300E+03, 2, 132, 2, 21, 0.40500000E+01, 0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000105E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10386429E-08,-0.48881267E-05, 0.26860001E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10749379E-08,-0.78390317E-05, 0.27609664E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10777633E-08,-0.81916572E-05, 0.28401413E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10207562E-08,-0.81175506E-05, 0.29237563E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96030514E-09,-0.80463144E-05, 0.30112806E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.87117466E-09,-0.78731266E-05, 0.31024671E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75400749E-09,-0.75808056E-05, 0.31971298E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60909467E-09,-0.71881774E-05, 0.32950842E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.43629067E-09,-0.67135519E-05, 0.33961504E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 10, 0.41879719E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.23491642E-09,-0.61739053E-05, 0.35001564E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 11, 0.41696211E+01, 0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36379788E-11,-0.55843196E-05, 0.36069388E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 12, 0.41527725E+01, 0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25921812E-09,-0.49577194E-05, 0.37163447E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 13, 0.41372918E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.55639248E-09,-0.43047728E-05, 0.38282314E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 14, 0.41230556E+01, 0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.89072273E-09,-0.36339234E-05, 0.39424671E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 15, 0.41099513E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12659681E-08,-0.29515300E-05, 0.40589304E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 16, 0.40978764E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16863972E-08,-0.22620451E-05, 0.41775102E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 17, 0.40867379E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21567151E-08,-0.15663756E-05, 0.42981048E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 18, 0.40764527E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27731100E-08,-0.89907354E-06, 0.44209231E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 19, 0.40669461E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33817196E-08,-0.17964932E-06, 0.45457880E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 20, 0.40581494E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40634040E-08,-0.38897960E-04, 0.46724739E+05, + 0.166E+06, 0.300E+03, 2, 133, 2, 21, 0.40500000E+01, 0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10497873E-08,-0.48877854E-05, 0.26860001E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10862762E-08,-0.78386112E-05, 0.27609664E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10886045E-08,-0.81912086E-05, 0.28401413E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10301786E-08,-0.81170758E-05, 0.29237563E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.96775087E-09,-0.80457943E-05, 0.30112806E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.87591616E-09,-0.78725449E-05, 0.31024671E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75508675E-09,-0.75801488E-05, 0.31971298E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60557795E-09,-0.71874219E-05, 0.32950842E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.42697745E-09,-0.67126751E-05, 0.33961504E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 10, 0.41879719E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.21844850E-09,-0.61728766E-05, 0.35001564E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 11, 0.41696211E+01, 0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21488328E-10,-0.55831001E-05, 0.36069388E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 12, 0.41527725E+01, 0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29489456E-09,-0.49562664E-05, 0.37163447E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 13, 0.41372918E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.60451081E-09,-0.43030321E-05, 0.38282314E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 14, 0.41230556E+01, 0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.95385379E-09,-0.36318396E-05, 0.39424671E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 15, 0.41099513E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13468040E-08,-0.29490297E-05, 0.40589304E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 16, 0.40978764E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17880181E-08,-0.22590534E-05, 0.41775102E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 17, 0.40867379E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22826619E-08,-0.15628843E-05, 0.42981048E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 18, 0.40764527E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29328172E-08,-0.89475837E-06, 0.44209231E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 19, 0.40669461E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35757209E-08,-0.17445251E-06, 0.45457880E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 20, 0.40581494E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42972048E-08,-0.39151777E-04, 0.46724739E+05, + 0.167E+06, 0.300E+03, 2, 134, 2, 21, 0.40500000E+01, 0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10618169E-08,-0.48874370E-05, 0.26860001E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10984877E-08,-0.78381810E-05, 0.27609664E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11002824E-08,-0.81907485E-05, 0.28401413E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10402679E-08,-0.81165884E-05, 0.29237563E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.97579080E-09,-0.80452582E-05, 0.30112806E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88098507E-09,-0.78719448E-05, 0.31024671E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75633579E-09,-0.75794662E-05, 0.31971298E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.60184296E-09,-0.71866366E-05, 0.32950842E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.41698513E-09,-0.67117590E-05, 0.33961504E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 10, 0.41879719E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.20081643E-09,-0.61717985E-05, 0.35001564E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 11, 0.41696211E+01, 0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.48385118E-10,-0.55818168E-05, 0.36069388E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 12, 0.41527725E+01, 0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33302058E-09,-0.49547333E-05, 0.37163447E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 13, 0.41372918E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.65619436E-09,-0.43011928E-05, 0.38282314E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 14, 0.41230556E+01, 0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10215202E-08,-0.36296292E-05, 0.39424671E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 15, 0.41099513E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14334364E-08,-0.29463740E-05, 0.40589304E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 16, 0.40978764E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18969877E-08,-0.22558688E-05, 0.41775102E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 17, 0.40867379E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24178007E-08,-0.15591600E-05, 0.42981048E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 18, 0.40764527E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31040205E-08,-0.89014755E-06, 0.44209231E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 19, 0.40669461E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.37837890E-08,-0.16889504E-06, 0.45457880E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 20, 0.40581494E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.45479101E-08,-0.39420387E-04, 0.46724739E+05, + 0.167E+06, 0.300E+03, 2, 135, 2, 21, 0.40500000E+01, 0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000138E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10747196E-08,-0.48870817E-05, 0.26860001E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11116936E-08,-0.78377390E-05, 0.27609664E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11128577E-08,-0.81902760E-05, 0.28401413E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10511333E-08,-0.81160878E-05, 0.29237563E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.98442494E-09,-0.80447052E-05, 0.30112806E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.88649055E-09,-0.78713232E-05, 0.31024671E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75760909E-09,-0.75787584E-05, 0.31971298E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59779268E-09,-0.71858187E-05, 0.32950842E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.40633798E-09,-0.67108003E-05, 0.33961504E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 10, 0.41879719E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.18192319E-09,-0.61706669E-05, 0.35001564E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 11, 0.41696211E+01, 0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.77294923E-10,-0.55804666E-05, 0.36069388E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 12, 0.41527725E+01, 0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.37400847E-09,-0.49531142E-05, 0.37163447E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 13, 0.41372918E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.71158865E-09,-0.42992455E-05, 0.38282314E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 14, 0.41230556E+01, 0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10941828E-08,-0.36272847E-05, 0.39424671E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 15, 0.41099513E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15264717E-08,-0.29435513E-05, 0.40589304E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 16, 0.40978764E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20139851E-08,-0.22524775E-05, 0.41775102E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 17, 0.40867379E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25629076E-08,-0.15551850E-05, 0.42981048E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 18, 0.40764527E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32879082E-08,-0.88522057E-06, 0.44209231E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 19, 0.40669461E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40071851E-08,-0.16295350E-06, 0.45457880E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 20, 0.40581494E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.48171448E-08,-0.39704869E-04, 0.46724739E+05, + 0.168E+06, 0.300E+03, 2, 136, 2, 21, 0.40500000E+01, 0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10887015E-08,-0.48867180E-05, 0.26860001E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11258574E-08,-0.78372862E-05, 0.27609664E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11264759E-08,-0.81897900E-05, 0.28401413E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10628719E-08,-0.81155723E-05, 0.29237563E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.99378667E-09,-0.80441340E-05, 0.30112806E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.89245683E-09,-0.78706793E-05, 0.31024671E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.75911278E-09,-0.75780218E-05, 0.31971298E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.59349986E-09,-0.71849656E-05, 0.32950842E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.39484197E-09,-0.67097974E-05, 0.33961504E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 10, 0.41879719E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.16162327E-09,-0.61694776E-05, 0.35001564E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 11, 0.41696211E+01, 0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10833901E-09,-0.55790422E-05, 0.36069388E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 12, 0.41527725E+01, 0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.41810078E-09,-0.49514047E-05, 0.37163447E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 13, 0.41372918E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.77125151E-09,-0.42971817E-05, 0.38282314E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 14, 0.41230556E+01, 0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11723508E-08,-0.36247961E-05, 0.39424671E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 15, 0.41099513E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16265888E-08,-0.29405488E-05, 0.40589304E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 16, 0.40978764E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21399561E-08,-0.22488661E-05, 0.41775102E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 17, 0.40867379E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27190496E-08,-0.15509381E-05, 0.42981048E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 18, 0.40764527E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34858870E-08,-0.87995543E-06, 0.44209231E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 19, 0.40669461E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42476555E-08,-0.15659712E-06, 0.45457880E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 20, 0.40581494E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.51069219E-08,-0.40006430E-04, 0.46724739E+05, + 0.169E+06, 0.300E+03, 2, 137, 2, 21, 0.40500000E+01, 0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11037749E-08,-0.48863457E-05, 0.26860001E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11412582E-08,-0.78368205E-05, 0.27609664E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11411491E-08,-0.81892904E-05, 0.28401413E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10756169E-08,-0.81150398E-05, 0.29237563E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10039003E-08,-0.80435438E-05, 0.30112806E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.89889606E-09,-0.78700113E-05, 0.31024671E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76074987E-09,-0.75772550E-05, 0.31971298E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58896452E-09,-0.71840736E-05, 0.32950842E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.38254560E-09,-0.67087461E-05, 0.33961504E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 10, 0.41879719E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.13979540E-09,-0.61682263E-05, 0.35001564E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 11, 0.41696211E+01, 0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14180841E-09,-0.55775397E-05, 0.36069388E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 12, 0.41527725E+01, 0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.46556427E-09,-0.49495975E-05, 0.37163447E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 13, 0.41372918E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.83544971E-09,-0.42949922E-05, 0.38282314E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 14, 0.41230556E+01, 0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12565579E-08,-0.36221525E-05, 0.39424671E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 15, 0.41099513E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17344185E-08,-0.29373523E-05, 0.40589304E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 16, 0.40978764E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22756043E-08,-0.22450155E-05, 0.41775102E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 17, 0.40867379E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.28872698E-08,-0.15464026E-05, 0.42981048E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 18, 0.40764527E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.36990483E-08,-0.87432280E-06, 0.44209231E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 19, 0.40669461E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.45066554E-08,-0.14979780E-06, 0.45457880E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 20, 0.40581494E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.54190120E-08,-0.40326381E-04, 0.46724739E+05, + 0.169E+06, 0.300E+03, 2, 138, 2, 21, 0.40500000E+01, 0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11201458E-08,-0.48859635E-05, 0.26860001E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11578838E-08,-0.78363417E-05, 0.27609664E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11570592E-08,-0.81887752E-05, 0.28401413E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10894291E-08,-0.81144897E-05, 0.29237563E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10148627E-08,-0.80429328E-05, 0.30112806E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90594161E-09,-0.78693172E-05, 0.31024671E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76255674E-09,-0.75764558E-05, 0.31971298E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.58408962E-09,-0.71831392E-05, 0.32950842E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.36927910E-09,-0.67076429E-05, 0.33961504E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 10, 0.41879719E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11622130E-09,-0.61669086E-05, 0.35001564E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 11, 0.41696211E+01, 0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17789716E-09,-0.55759540E-05, 0.36069388E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 12, 0.41527725E+01, 0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.51676276E-09,-0.49476806E-05, 0.37163447E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 13, 0.41372918E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.90481384E-09,-0.42926723E-05, 0.38282314E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 14, 0.41230556E+01, 0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13474346E-08,-0.36193376E-05, 0.39424671E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 15, 0.41099513E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.18508581E-08,-0.29339488E-05, 0.40589304E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 16, 0.40978764E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24221178E-08,-0.22409091E-05, 0.41775102E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 17, 0.40867379E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30689019E-08,-0.15415538E-05, 0.42981048E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 18, 0.40764527E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39292596E-08,-0.86829408E-06, 0.44209231E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 19, 0.40669461E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.47863917E-08,-0.14252110E-06, 0.45457880E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 20, 0.40581494E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.57560828E-08,-0.40666180E-04, 0.46724739E+05, + 0.170E+06, 0.300E+03, 2, 139, 2, 21, 0.40500000E+01, 0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000139E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11378749E-08,-0.48855716E-05, 0.26860001E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11759645E-08,-0.78358470E-05, 0.27609664E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11743396E-08,-0.81882438E-05, 0.28401413E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11043812E-08,-0.81139211E-05, 0.29237563E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10268438E-08,-0.80422983E-05, 0.30112806E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.91362987E-09,-0.78685947E-05, 0.31024671E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76454550E-09,-0.75756211E-05, 0.31971298E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57882668E-09,-0.71821611E-05, 0.32950842E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.35496972E-09,-0.67064827E-05, 0.33961504E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 10, 0.41879719E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.90803951E-10,-0.61655184E-05, 0.35001564E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 11, 0.41696211E+01, 0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21689630E-09,-0.55742767E-05, 0.36069388E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 12, 0.41527725E+01, 0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.57213280E-09,-0.49456491E-05, 0.37163447E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 13, 0.41372918E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.97985321E-09,-0.42902052E-05, 0.38282314E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 14, 0.41230556E+01, 0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.14458298E-08,-0.36163447E-05, 0.39424671E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 15, 0.41099513E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19768534E-08,-0.29303205E-05, 0.40589304E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 16, 0.40978764E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25805396E-08,-0.22365219E-05, 0.41775102E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 17, 0.40867379E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.32654255E-08,-0.15363692E-05, 0.42981048E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 18, 0.40764527E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.41783642E-08,-0.86183957E-06, 0.44209231E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 19, 0.40669461E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50890230E-08,-0.13472644E-06, 0.45457880E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 20, 0.40581494E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.61207538E-08,-0.41027443E-04, 0.46724739E+05, + 0.170E+06, 0.300E+03, 2, 140, 2, 21, 0.40500000E+01, 0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11571804E-08,-0.48851679E-05, 0.26860001E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11955732E-08,-0.78353372E-05, 0.27609664E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11931358E-08,-0.81876943E-05, 0.28401413E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11206551E-08,-0.81133314E-05, 0.29237563E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10397950E-08,-0.80416396E-05, 0.30112806E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.92197297E-09,-0.78678416E-05, 0.31024671E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76678892E-09,-0.75747478E-05, 0.31971298E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.57319994E-09,-0.71811341E-05, 0.32950842E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33954469E-09,-0.67052617E-05, 0.33961504E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 10, 0.41879719E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.63228072E-10,-0.61640499E-05, 0.35001564E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 11, 0.41696211E+01, 0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25919386E-09,-0.55725011E-05, 0.36069388E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 12, 0.41527725E+01, 0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.63215945E-09,-0.49434924E-05, 0.37163447E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 13, 0.41372918E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.10611257E-08,-0.42875837E-05, 0.38282314E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 14, 0.41230556E+01, 0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.15523741E-08,-0.36131527E-05, 0.39424671E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 15, 0.41099513E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.21133989E-08,-0.29264488E-05, 0.40589304E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 16, 0.40978764E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.27523735E-08,-0.22318360E-05, 0.41775102E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 17, 0.40867379E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34784656E-08,-0.15308179E-05, 0.42981048E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 18, 0.40764527E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.44484235E-08,-0.85492593E-06, 0.44209231E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 19, 0.40669461E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.54170475E-08,-0.12636808E-06, 0.45457880E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 20, 0.40581494E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.65160809E-08,-0.41411965E-04, 0.46724739E+05, + 0.171E+06, 0.300E+03, 2, 141, 2, 21, 0.40500000E+01, 0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11782079E-08,-0.48847518E-05, 0.26860001E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12169767E-08,-0.78348102E-05, 0.27609664E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12136297E-08,-0.81871245E-05, 0.28401413E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11383963E-08,-0.81127197E-05, 0.29237563E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10539831E-08,-0.80409531E-05, 0.30112806E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.93110430E-09,-0.78670557E-05, 0.31024671E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.76922637E-09,-0.75738334E-05, 0.31971298E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56713664E-09,-0.71800541E-05, 0.32950842E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.32276148E-09,-0.67039733E-05, 0.33961504E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 10, 0.41879719E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.33348139E-10,-0.61624976E-05, 0.35001564E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 11, 0.41696211E+01, 0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.30510516E-09,-0.55706190E-05, 0.36069388E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 12, 0.41527725E+01, 0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.69732778E-09,-0.49411989E-05, 0.37163447E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 13, 0.41372918E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.11494073E-08,-0.42847909E-05, 0.38282314E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 14, 0.41230556E+01, 0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.16682316E-08,-0.36097506E-05, 0.39424671E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 15, 0.41099513E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.22617314E-08,-0.29223116E-05, 0.40589304E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 16, 0.40978764E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.29389776E-08,-0.22268241E-05, 0.41775102E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 17, 0.40867379E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.37098895E-08,-0.15248699E-05, 0.42981048E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 18, 0.40764527E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.47417901E-08,-0.84751235E-06, 0.44209231E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 19, 0.40669461E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.57734724E-08,-0.11740205E-06, 0.45457880E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 20, 0.40581494E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.69456049E-08,-0.41821744E-04, 0.46724739E+05, + 0.172E+06, 0.300E+03, 2, 142, 2, 21, 0.40500000E+01, 0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000140E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12011393E-08,-0.48843227E-05, 0.26860001E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12403567E-08,-0.78342636E-05, 0.27609664E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12359912E-08,-0.81865336E-05, 0.28401413E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11577989E-08,-0.81120835E-05, 0.29237563E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10695415E-08,-0.80402370E-05, 0.30112806E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.94116937E-09,-0.78662333E-05, 0.31024671E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77200336E-09,-0.75728723E-05, 0.31971298E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 8, 0.42297756E+01, 0.20000053E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.56053977E-09,-0.71789190E-05, 0.32950842E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.30459584E-09,-0.67026114E-05, 0.33961504E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 10, 0.41879719E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.84886172E-12,-0.61608533E-05, 0.35001564E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 11, 0.41696211E+01, 0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.35496972E-09,-0.55686189E-05, 0.36069388E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 12, 0.41527725E+01, 0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.76829262E-09,-0.49387607E-05, 0.37163447E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 13, 0.41372918E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.12455227E-08,-0.42818113E-05, 0.38282314E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 14, 0.41230556E+01, 0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.17942997E-08,-0.36061178E-05, 0.39424671E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 15, 0.41099513E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.24232334E-08,-0.29178865E-05, 0.40589304E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 16, 0.40978764E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.31422193E-08,-0.22214591E-05, 0.41775102E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 17, 0.40867379E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.39619287E-08,-0.15184908E-05, 0.42981048E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 18, 0.40764527E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.50612531E-08,-0.83955602E-06, 0.44209231E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 19, 0.40669461E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.61616205E-08,-0.10777388E-06, 0.45457880E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 20, 0.40581494E+01, 0.20000099E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000141E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.74133034E-08,-0.42259018E-04, 0.46724739E+05, + 0.172E+06, 0.300E+03, 2, 143, 2, 21, 0.40500000E+01, 0.20000141E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000141E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 1, 0.44479933E+01, 0.00000000E+00, 0.20000000E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12262656E-08,-0.48838786E-05, 0.26860001E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 2, 0.44084923E+01, 0.20000005E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12659196E-08,-0.78336967E-05, 0.27609664E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 3, 0.43720677E+01, 0.20000013E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.12605475E-08,-0.81859184E-05, 0.28401413E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 4, 0.43385478E+01, 0.20000021E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.11790932E-08,-0.81114207E-05, 0.29237563E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 5, 0.43077507E+01, 0.20000029E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.10865188E-08,-0.80394890E-05, 0.30112806E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 6, 0.42794833E+01, 0.20000037E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.95215607E-09,-0.78653710E-05, 0.31024671E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 7, 0.42535537E+01, 0.20000045E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.77503501E-09,-0.75718629E-05, 0.31971298E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 8, 0.42297756E+01, 0.20000052E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.55348210E-09,-0.71777198E-05, 0.32950842E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 9, 0.42079710E+01, 0.20000060E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.28475673E-09,-0.67011712E-05, 0.33961504E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 10, 0.41879719E+01, 0.20000066E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.34657811E-10,-0.61591081E-05, 0.35001564E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 11, 0.41696211E+01, 0.20000073E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.40953940E-09,-0.55664933E-05, 0.36069388E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 12, 0.41527725E+01, 0.20000078E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.84573306E-09,-0.49361595E-05, 0.37163447E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 13, 0.41372918E+01, 0.20000083E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.13505390E-08,-0.42786314E-05, 0.38282314E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 14, 0.41230556E+01, 0.20000087E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.19320335E-08,-0.36022327E-05, 0.39424671E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 15, 0.41099513E+01, 0.20000091E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.25996997E-08,-0.29131495E-05, 0.40589304E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 16, 0.40978764E+01, 0.20000094E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.33642573E-08,-0.22157077E-05, 0.41775102E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 17, 0.40867379E+01, 0.20000096E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.42372267E-08,-0.15116404E-05, 0.42981048E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 18, 0.40764527E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.54102566E-08,-0.83100926E-06, 0.44209231E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 19, 0.40669461E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.65856148E-08,-0.97425686E-07, 0.45457880E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 20, 0.40581494E+01, 0.20000098E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000141E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.79242697E-08,-0.42726302E-04, 0.46724739E+05, + 0.173E+06, 0.300E+03, 2, 144, 2, 21, 0.40500000E+01, 0.20000141E+02, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00, 0.00000000E+00,-0.20000141E+02, 0.00000000E+00, 0.00000000E+00, 0.48009100E+05, diff --git a/autotest/data/swr04/SWRFlows.csv.cmp b/autotest/data/swr04/SWRFlows.csv.cmp new file mode 100644 index 00000000000..48e38b2cc17 --- /dev/null +++ b/autotest/data/swr04/SWRFlows.csv.cmp @@ -0,0 +1,337 @@ +TOTIME,FLOW45,FLOW56 +1800.0,-3.609224,-5.794163 +3600.0,-3.270777,-5.093715 +5400.0,-2.720494,-4.230203 +7200.0,-2.280721,-3.52272 +9000.0,-1.923835,-2.981271 +10800.0,-1.631591,-2.536274 +12600.0,-1.380889,-2.154433 +14400.0,-1.175163,-1.823488 +16200.0,-1.000114,-1.533531 +18000.0,-0.8401062,-1.278804 +19800.0,-0.7037586,-1.054733 +21600.0,-0.5871789,-0.8562196 +23400.0,-0.4971838,-0.687138 +25200.0,-0.4413314,-0.5598467 +27000.0,-0.455645,-0.5087827 +28800.0,-0.5595114,-0.5574778 +30600.0,-0.8059244,-0.7386259 +32400.0,-1.2163,-1.056273 +34200.0,-1.883396,-1.562335 +36000.0,-2.851211,-2.299056 +37800.0,-4.147379,-3.321582 +39600.0,-5.682958,-4.604792 +41400.0,-7.274438,-6.055452 +43200.0,-8.817017,-7.560001 +45000.0,-9.9934,-8.852783 +46800.0,-10.88998,-9.893935 +48600.0,-11.17564,-10.47368 +50400.0,-11.069,-10.65769 +52200.0,-10.33468,-10.66428 +54000.0,-9.29106,-10.40289 +55800.0,-7.181822,-11.41897 +57600.0,-4.691872,-12.44163 +59400.0,0.4205484,-15.52409 +61200.0,5.331748,-19.27606 +63000.0,8.268412,-22.60887 +64800.0,11.03089,-25.99593 +66600.0,8.396265,-24.13299 +68400.0,5.809124,-21.22579 +70200.0,2.069182,-16.79924 +72000.0,-1.650626,-12.06476 +73800.0,-2.408756,-9.132305 +75600.0,-3.204681,-6.434847 +77400.0,-2.851345,-5.146614 +79200.0,-2.558158,-4.11239 +81000.0,-2.190283,-3.434672 +82800.0,-1.867294,-2.904755 +84600.0,-1.58679,-2.471844 +86400.0,-1.344979,-2.100364 +88200.0,-1.144777,-1.774738 +90000.0,-0.9699009,-1.48957 +91800.0,-0.8080313,-1.235578 +93600.0,-0.6656935,-1.00857 +95400.0,-0.5363277,-0.800114 +97200.0,-0.4154841,-0.6062939 +99000.0,-0.3022444,-0.4285173 +100800.0,-0.1989079,-0.2713672 +102600.0,-0.1128655,-0.1454724 +104400.0,-0.05645474,-0.06612751 +106200.0,-0.03184119,-0.0335196 +108000.0,-0.02360056,-0.0238509 +109800.0,-0.01966701,-0.01974089 +111600.0,-0.01683383,-0.01687618 +113400.0,-0.01452761,-0.01455701 +115200.0,-0.01259277,-0.01261411 +117000.0,-0.01094446,-0.01096027 +118800.0,-0.009522378,-0.009534266 +120600.0,-0.008281131,-0.008290178 +122400.0,-0.00701691,-0.007021922 +124200.0,-0.00541913,-0.005428048 +126000.0,-0.003552676,-0.003559569 +127800.0,-0.002229722,-0.002232692 +129600.0,-0.001486523,-0.001487608 +131400.0,-0.001067844,-0.001068341 +133200.0,-0.0008126174,-0.0008145895 +135000.0,-0.0006499748,-0.0006524445 +136800.0,-0.0005326947,-0.0004432691 +138600.0,-0.0004281649,-0.0003521512 +140400.0,-0.000335671,-0.0003493212 +142200.0,-0.0003069084,-0.0002780313 +144000.0,-0.0002911921,-0.0002714715 +145800.0,-0.0002431415,-0.0002388277 +147600.0,-0.0002442178,-0.0002423362 +149400.0,-0.0002262701,-0.0002276437 +151200.0,-0.0002201356,-0.0002148554 +153000.0,-0.0001936102,-0.0001811618 +154800.0,-0.0001823924,-0.0001745225 +156600.0,-0.0001728191,-0.0001684334 +158400.0,-0.0001608781,-0.0001622774 +160200.0,-0.0001625811,-0.0001631416 +162000.0,-0.0001599617,-0.000158609 +163800.0,-0.0001571417,-0.0001554112 +165600.0,-0.0001546543,-0.0001528737 +167400.0,-0.0001464867,-0.0001466889 +169200.0,-0.0001465258,-0.000146458 +171000.0,-0.0001448541,-0.0001436257 +172800.0,-0.0001431605,-0.0001415126 +174600.0,-0.0001414782,-0.0001397606 +176400.0,-0.0001399384,-0.0001382931 +178200.0,-0.000138622,-0.0001370757 +180000.0,-0.0001316277,-0.000131543 +181800.0,-0.0001316477,-0.0001315726 +183600.0,-0.0001313758,-0.0001310726 +185400.0,-0.0001257712,-0.0001221995 +187200.0,-0.0001251789,-0.0001221696 +189000.0,-0.0001246177,-0.000122042 +190800.0,-0.0001241308,-0.0001219039 +192600.0,-0.0001236818,-0.000121731 +194400.0,-0.000123272,-0.0001215419 +196200.0,-0.0001228883,-0.000121333 +198000.0,-0.0001225278,-0.0001211116 +199800.0,-0.0001221845,-0.0001208783 +201600.0,-0.0001218557,-0.0001206371 +203400.0,-0.000121538,-0.000120389 +205200.0,-0.0001212296,-0.0001201363 +207000.0,-0.0001209286,-0.0001198799 +208800.0,-0.0001206341,-0.0001196215 +210600.0,-0.0001203444,-0.0001193611 +212400.0,-0.0001200596,-0.0001191003 +214200.0,-0.000119778,-0.0001188385 +216000.0,-0.0001195002,-0.0001185775 +217800.0,-0.0001192249,-0.000118316 +219600.0,-0.0001189526,-0.000118056 +221400.0,-0.0001186825,-0.0001177962 +223200.0,-0.0001184147,-0.0001175379 +225000.0,-0.0001181487,-0.0001172805 +226800.0,-0.0001178852,-0.0001170251 +228600.0,-0.0001176229,-0.0001167696 +230400.0,-0.0001173633,-0.0001165172 +232200.0,-0.0001171042,-0.0001162639 +234000.0,-0.0001168488,-0.0001160153 +235800.0,-0.0001165751,-0.0001157328 +237600.0,-0.0001163349,-0.0001155086 +239400.0,-0.0001161124,-0.0001153079 +241200.0,-0.0001158142,-0.0001149887 +243000.0,-0.0001155859,-0.0001147796 +244800.0,-0.000115355,-0.0001145621 +246600.0,-0.0001148324,-0.0001139924 +248400.0,-0.0001145232,-0.0001136998 +250200.0,-0.0001142122,-0.0001133985 +252000.0,-0.0001139027,-0.0001130969 +253800.0,-0.0001135944,-0.0001127953 +255600.0,-0.0001132871,-0.0001124939 +257400.0,-0.0001129808,-0.0001121932 +259200.0,-0.0001126757,-0.0001118935 +261000.0,-0.0001123717,-0.0001115943 +262800.0,-0.0001120688,-0.0001112963 +264600.0,-0.000111767,-0.0001109996 +266400.0,-0.0001114664,-0.000110704 +268200.0,-0.000111167,-0.0001104095 +270000.0,-0.0001108688,-0.000110116 +271800.0,-0.0001105717,-0.000109824 +273600.0,-0.000110276,-0.000109533 +275400.0,-0.0001099814,-0.0001092433 +277200.0,-0.000109688,-0.0001089549 +279000.0,-0.0001093959,-0.0001086679 +280800.0,-0.0001091051,-0.0001083818 +282600.0,-0.0001088154,-0.0001080971 +284400.0,-0.000108527,-0.0001078135 +286200.0,-0.0001082399,-0.000107531 +288000.0,-0.0001079539,-0.0001072498 +289800.0,-0.0001076692,-0.00010697 +291600.0,-0.0001073857,-0.0001066911 +293400.0,-0.0001071035,-0.0001064135 +295200.0,-0.0001068224,-0.000106137 +297000.0,-0.0001065426,-0.0001058617 +298800.0,-0.000106264,-0.0001055875 +300600.0,-0.0001059865,-0.0001053147 +302400.0,-0.0001057103,-0.0001050429 +304200.0,-0.0001054353,-0.0001047723 +306000.0,-0.0001051614,-0.0001045028 +307800.0,-0.0001048887,-0.0001042344 +309600.0,-0.0001046172,-0.0001039671 +311400.0,-0.0001043469,-0.000103701 +313200.0,-0.0001040777,-0.0001034361 +315000.0,-0.0001038097,-0.0001031723 +316800.0,-0.0001035428,-0.0001029098 +318600.0,-0.0001032772,-0.000102648 +320400.0,-0.0001030126,-0.0001023875 +322200.0,-0.0001027491,-0.0001021281 +324000.0,-0.0001024868,-0.0001018696 +325800.0,-0.0001022256,-0.0001016125 +327600.0,-0.0001019655,-0.0001013563 +329400.0,-0.0001017066,-0.0001011013 +331200.0,-0.0001014488,-0.0001008472 +333000.0,-0.000101192,-0.0001005944 +334800.0,-0.0001009365,-0.0001003423 +336600.0,-0.0001006819,-0.0001000915 +338400.0,-0.0001004285,-9.984167e-05 +340200.0,-0.0001001761,-9.959304e-05 +342000.0,-9.992478e-05,-9.934545e-05 +343800.0,-9.967456e-05,-9.909891e-05 +345600.0,-9.942541e-05,-9.885342e-05 +347400.0,-9.917733e-05,-9.860883e-05 +349200.0,-9.893029e-05,-9.836531e-05 +351000.0,-9.868427e-05,-9.81227e-05 +352800.0,-9.843931e-05,-9.788117e-05 +354600.0,-9.819539e-05,-9.764074e-05 +356400.0,-9.795248e-05,-9.740123e-05 +358200.0,-9.771064e-05,-9.716267e-05 +360000.0,-9.746987e-05,-9.692505e-05 +361800.0,-9.723008e-05,-9.668856e-05 +363600.0,-9.699127e-05,-9.645319e-05 +365400.0,-9.675345e-05,-9.621863e-05 +367200.0,-9.651668e-05,-9.598486e-05 +369000.0,-9.628092e-05,-9.575225e-05 +370800.0,-9.604611e-05,-9.552063e-05 +372600.0,-9.581233e-05,-9.529e-05 +374400.0,-9.557951e-05,-9.506021e-05 +376200.0,-9.534767e-05,-9.483142e-05 +378000.0,-9.511682e-05,-9.460365e-05 +379800.0,-9.488691e-05,-9.437673e-05 +381600.0,-9.465799e-05,-9.415066e-05 +383400.0,-9.443003e-05,-9.392546e-05 +385200.0,-9.420297e-05,-9.370148e-05 +387000.0,-9.397693e-05,-9.347819e-05 +388800.0,-9.375181e-05,-9.325597e-05 +390600.0,-9.352761e-05,-9.303446e-05 +392400.0,-9.330439e-05,-9.281401e-05 +394200.0,-9.308206e-05,-9.259447e-05 +396000.0,-9.286067e-05,-9.237584e-05 +397800.0,-9.264017e-05,-9.21583e-05 +399600.0,-9.242057e-05,-9.194132e-05 +401400.0,-9.220193e-05,-9.172527e-05 +403200.0,-9.198415e-05,-9.151015e-05 +405000.0,-9.176728e-05,-9.129598e-05 +406800.0,-9.155134e-05,-9.108256e-05 +408600.0,-9.133628e-05,-9.08701e-05 +410400.0,-9.112209e-05,-9.065842e-05 +412200.0,-9.090879e-05,-9.04477e-05 +414000.0,-9.069638e-05,-9.023758e-05 +415800.0,-9.048482e-05,-9.002863e-05 +417600.0,-9.02741e-05,-8.982047e-05 +419400.0,-9.006429e-05,-8.961312e-05 +421200.0,-8.985534e-05,-8.940659e-05 +423000.0,-8.964719e-05,-8.920087e-05 +424800.0,-8.943997e-05,-8.899578e-05 +426600.0,-8.923358e-05,-8.879171e-05 +428400.0,-8.9028e-05,-8.858848e-05 +430200.0,-8.882331e-05,-8.83859e-05 +432000.0,-8.861934e-05,-8.818435e-05 +433800.0,-8.841627e-05,-8.798346e-05 +435600.0,-8.821405e-05,-8.778343e-05 +437400.0,-8.801262e-05,-8.758426e-05 +439200.0,-8.781205e-05,-8.738578e-05 +441000.0,-8.761228e-05,-8.718797e-05 +442800.0,-8.741331e-05,-8.699124e-05 +444600.0,-8.721511e-05,-8.67952e-05 +446400.0,-8.701772e-05,-8.659986e-05 +448200.0,-8.682104e-05,-8.640541e-05 +450000.0,-8.662519e-05,-8.621168e-05 +451800.0,-8.643017e-05,-8.601866e-05 +453600.0,-8.623594e-05,-8.582636e-05 +455400.0,-8.604249e-05,-8.563498e-05 +457200.0,-8.584977e-05,-8.544452e-05 +459000.0,-8.565785e-05,-8.52546e-05 +460800.0,-8.546672e-05,-8.506523e-05 +462600.0,-8.527635e-05,-8.48768e-05 +464400.0,-8.508672e-05,-8.468912e-05 +466200.0,-8.489786e-05,-8.450219e-05 +468000.0,-8.470975e-05,-8.431583e-05 +469800.0,-8.452234e-05,-8.413024e-05 +471600.0,-8.433564e-05,-8.394541e-05 +473400.0,-8.414972e-05,-8.376136e-05 +475200.0,-8.396458e-05,-8.357788e-05 +477000.0,-8.378016e-05,-8.33954e-05 +478800.0,-8.359641e-05,-8.32137e-05 +480600.0,-8.341339e-05,-8.30324e-05 +482400.0,-8.32311e-05,-8.285209e-05 +484200.0,-8.304956e-05,-8.267199e-05 +486000.0,-8.286876e-05,-8.24929e-05 +487800.0,-8.268865e-05,-8.231443e-05 +489600.0,-8.250923e-05,-8.213657e-05 +491400.0,-8.233051e-05,-8.195953e-05 +493200.0,-8.21525e-05,-8.178332e-05 +495000.0,-8.197518e-05,-8.160774e-05 +496800.0,-8.179852e-05,-8.143259e-05 +498600.0,-8.162256e-05,-8.125808e-05 +500400.0,-8.144733e-05,-8.108442e-05 +502200.0,-8.127269e-05,-8.091141e-05 +504000.0,-8.109885e-05,-8.073884e-05 +505800.0,-8.092561e-05,-8.056713e-05 +507600.0,-8.075297e-05,-8.039608e-05 +509400.0,-8.058108e-05,-8.022569e-05 +511200.0,-8.04098e-05,-8.005618e-05 +513000.0,-8.023921e-05,-7.988714e-05 +514800.0,-8.006931e-05,-7.971857e-05 +516600.0,-7.990003e-05,-7.955067e-05 +518400.0,-7.973139e-05,-7.938346e-05 +520200.0,-7.956338e-05,-7.921694e-05 +522000.0,-7.939608e-05,-7.905091e-05 +523800.0,-7.922935e-05,-7.888557e-05 +525600.0,-7.906321e-05,-7.872093e-05 +527400.0,-7.889779e-05,-7.8557e-05 +529200.0,-7.873295e-05,-7.839335e-05 +531000.0,-7.856884e-05,-7.823042e-05 +532800.0,-7.840527e-05,-7.806821e-05 +534600.0,-7.824235e-05,-7.790651e-05 +536400.0,-7.807998e-05,-7.774553e-05 +538200.0,-7.791828e-05,-7.758506e-05 +540000.0,-7.775713e-05,-7.742534e-05 +541800.0,-7.759666e-05,-7.726613e-05 +543600.0,-7.743681e-05,-7.710746e-05 +545400.0,-7.727752e-05,-7.694931e-05 +547200.0,-7.711879e-05,-7.679191e-05 +549000.0,-7.696061e-05,-7.663506e-05 +550800.0,-7.680308e-05,-7.647874e-05 +552600.0,-7.664611e-05,-7.632297e-05 +554400.0,-7.648979e-05,-7.616774e-05 +556200.0,-7.633404e-05,-7.601329e-05 +558000.0,-7.617887e-05,-7.585939e-05 +559800.0,-7.602429e-05,-7.570583e-05 +561600.0,-7.587029e-05,-7.555284e-05 +563400.0,-7.571675e-05,-7.540063e-05 +565200.0,-7.556387e-05,-7.524876e-05 +567000.0,-7.541159e-05,-7.509748e-05 +568800.0,-7.525977e-05,-7.494676e-05 +570600.0,-7.510855e-05,-7.479663e-05 +572400.0,-7.495788e-05,-7.464708e-05 +574200.0,-7.480781e-05,-7.449789e-05 +576000.0,-7.465829e-05,-7.434951e-05 +577800.0,-7.450925e-05,-7.420173e-05 +579600.0,-7.436076e-05,-7.405432e-05 +581400.0,-7.42129e-05,-7.390728e-05 +583200.0,-7.406552e-05,-7.376085e-05 +585000.0,-7.391864e-05,-7.361525e-05 +586800.0,-7.377231e-05,-7.346981e-05 +588600.0,-7.362656e-05,-7.332475e-05 +590400.0,-7.348138e-05,-7.318031e-05 +592200.0,-7.33367e-05,-7.303672e-05 +594000.0,-7.319245e-05,-7.289352e-05 +595800.0,-7.304878e-05,-7.275072e-05 +597600.0,-7.290563e-05,-7.260855e-05 +599400.0,-7.276299e-05,-7.246701e-05 +601200.0,-7.262087e-05,-7.232565e-05 +603000.0,-7.247927e-05,-7.218493e-05 +604800.0,-7.233819e-05,-7.204462e-05 diff --git a/autotest/data/swr04/SWRSample04_Stage.csv.cmp b/autotest/data/swr04/SWRSample04_Stage.csv.cmp new file mode 100644 index 00000000000..23a12e6bd53 --- /dev/null +++ b/autotest/data/swr04/SWRSample04_Stage.csv.cmp @@ -0,0 +1,337 @@ +TOTIME ,SWRDT ,KPER ,KSTP ,KSWR ,STAGE0000000001,STAGE0000000002,STAGE0000000003,STAGE0000000004,STAGE0000000005,STAGE0000000006,STAGE0000000007,STAGE0000000008,STAGE0000000009,STAGE0000000010,STAGE0000000011,STAGE0000000012,STAGE0000000013,STAGE0000000014,STAGE0000000015,STAGE0000000016,STAGE0000000017,STAGE0000000018 + 0.1800000E+04, 0.1800000E+04, 1, 1, 1, 0.2855273E+01, 0.2846687E+01, 0.2845203E+01, 0.2842022E+01, 0.2827934E+01, 0.2803019E+01, 0.2764853E+01, 0.2721851E+01, 0.2845138E+01, 0.2836876E+01, 0.2808662E+01, 0.2765963E+01, 0.2721188E+01, 0.2686936E+01, 0.2434432E+01, 0.2226909E+01, 0.2092472E+01, 0.2000000E+01 + 0.3600000E+04, 0.1800000E+04, 1, 2, 1, 0.2717835E+01, 0.2705353E+01, 0.2703329E+01, 0.2699192E+01, 0.2681773E+01, 0.2653945E+01, 0.2616685E+01, 0.2581300E+01, 0.2703245E+01, 0.2692765E+01, 0.2659406E+01, 0.2617132E+01, 0.2580780E+01, 0.2556315E+01, 0.2412801E+01, 0.2244016E+01, 0.2106936E+01, 0.2000000E+01 + 0.5400000E+04, 0.1800000E+04, 2, 1, 1, 0.2601031E+01, 0.2585290E+01, 0.2582945E+01, 0.2578452E+01, 0.2560727E+01, 0.2533804E+01, 0.2499785E+01, 0.2469209E+01, 0.2582845E+01, 0.2571501E+01, 0.2538538E+01, 0.2499733E+01, 0.2468752E+01, 0.2448502E+01, 0.2336530E+01, 0.2201212E+01, 0.2088462E+01, 0.2000000E+01 + 0.7200000E+04, 0.1800000E+04, 2, 2, 1, 0.2501415E+01, 0.2483558E+01, 0.2480976E+01, 0.2476187E+01, 0.2458287E+01, 0.2432742E+01, 0.2401519E+01, 0.2374230E+01, 0.2480863E+01, 0.2468935E+01, 0.2436603E+01, 0.2401172E+01, 0.2373819E+01, 0.2356201E+01, 0.2262744E+01, 0.2153648E+01, 0.2066214E+01, 0.2000000E+01 + 0.9000000E+04, 0.1800000E+04, 3, 1, 1, 0.2418210E+01, 0.2396620E+01, 0.2393772E+01, 0.2388797E+01, 0.2370776E+01, 0.2346312E+01, 0.2317881E+01, 0.2293583E+01, 0.2393642E+01, 0.2381398E+01, 0.2349675E+01, 0.2317408E+01, 0.2293217E+01, 0.2277921E+01, 0.2200094E+01, 0.2113542E+01, 0.2047793E+01, 0.2000000E+01 + 0.1080000E+05, 0.1800000E+04, 3, 2, 1, 0.2348672E+01, 0.2322434E+01, 0.2319237E+01, 0.2313936E+01, 0.2295906E+01, 0.2272668E+01, 0.2246820E+01, 0.2225653E+01, 0.2319096E+01, 0.2306337E+01, 0.2275438E+01, 0.2246016E+01, 0.2225328E+01, 0.2212338E+01, 0.2149009E+01, 0.2082083E+01, 0.2033835E+01, 0.2000000E+01 + 0.1260000E+05, 0.1800000E+04, 4, 1, 1, 0.2290618E+01, 0.2258745E+01, 0.2255119E+01, 0.2249500E+01, 0.2231887E+01, 0.2210315E+01, 0.2187445E+01, 0.2169385E+01, 0.2254952E+01, 0.2241493E+01, 0.2212453E+01, 0.2186510E+01, 0.2169104E+01, 0.2158412E+01, 0.2108483E+01, 0.2058189E+01, 0.2023580E+01, 0.2000000E+01 + 0.1440000E+05, 0.1800000E+04, 4, 2, 1, 0.2241369E+01, 0.2204353E+01, 0.2200354E+01, 0.2194533E+01, 0.2177508E+01, 0.2158095E+01, 0.2138548E+01, 0.2123727E+01, 0.2200179E+01, 0.2186706E+01, 0.2159834E+01, 0.2137627E+01, 0.2123495E+01, 0.2115042E+01, 0.2077035E+01, 0.2040394E+01, 0.2016150E+01, 0.2000000E+01 + 0.1620000E+05, 0.1800000E+04, 5, 1, 1, 0.2203170E+01, 0.2158471E+01, 0.2153946E+01, 0.2147938E+01, 0.2131895E+01, 0.2115106E+01, 0.2099110E+01, 0.2087502E+01, 0.2153776E+01, 0.2140545E+01, 0.2116392E+01, 0.2098257E+01, 0.2087321E+01, 0.2080921E+01, 0.2053122E+01, 0.2027341E+01, 0.2010819E+01, 0.2000000E+01 + 0.1800000E+05, 0.1800000E+04, 5, 2, 1, 0.2173940E+01, 0.2119555E+01, 0.2114546E+01, 0.2108730E+01, 0.2094381E+01, 0.2080490E+01, 0.2068031E+01, 0.2059389E+01, 0.2114360E+01, 0.2101869E+01, 0.2081085E+01, 0.2067219E+01, 0.2059252E+01, 0.2054656E+01, 0.2035282E+01, 0.2017892E+01, 0.2007026E+01, 0.2000000E+01 + 0.1980000E+05, 0.1800000E+04, 6, 1, 1, 0.2159064E+01, 0.2088529E+01, 0.2082513E+01, 0.2076735E+01, 0.2064369E+01, 0.2053459E+01, 0.2044355E+01, 0.2038324E+01, 0.2082357E+01, 0.2070715E+01, 0.2053847E+01, 0.2043728E+01, 0.2038228E+01, 0.2035119E+01, 0.2022350E+01, 0.2011204E+01, 0.2004374E+01, 0.2000000E+01 + 0.2160000E+05, 0.1800000E+04, 6, 2, 1, 0.2155832E+01, 0.2065055E+01, 0.2057379E+01, 0.2051561E+01, 0.2041363E+01, 0.2033321E+01, 0.2027139E+01, 0.2023232E+01, 0.2057285E+01, 0.2046610E+01, 0.2033667E+01, 0.2026728E+01, 0.2023171E+01, 0.2021208E+01, 0.2013330E+01, 0.2006625E+01, 0.2002575E+01, 0.2000000E+01 + 0.2340000E+05, 0.1800000E+04, 7, 1, 1, 0.2181196E+01, 0.2052625E+01, 0.2040051E+01, 0.2033419E+01, 0.2025120E+01, 0.2019506E+01, 0.2015562E+01, 0.2013209E+01, 0.2040037E+01, 0.2029521E+01, 0.2019852E+01, 0.2015333E+01, 0.2013173E+01, 0.2012020E+01, 0.2007480E+01, 0.2003691E+01, 0.2001430E+01, 0.2000000E+01 + 0.2520000E+05, 0.1800000E+04, 7, 2, 1, 0.2224831E+01, 0.2053371E+01, 0.2030808E+01, 0.2022081E+01, 0.2014985E+01, 0.2011065E+01, 0.2008610E+01, 0.2007250E+01, 0.2030839E+01, 0.2019029E+01, 0.2011489E+01, 0.2008524E+01, 0.2007231E+01, 0.2006577E+01, 0.2004053E+01, 0.2001987E+01, 0.2000767E+01, 0.2000000E+01 + 0.2700000E+05, 0.1800000E+04, 8, 1, 1, 0.2313563E+01, 0.2081929E+01, 0.2033956E+01, 0.2018254E+01, 0.2010441E+01, 0.2007126E+01, 0.2005357E+01, 0.2004477E+01, 0.2034385E+01, 0.2015549E+01, 0.2007827E+01, 0.2005398E+01, 0.2004467E+01, 0.2004046E+01, 0.2002463E+01, 0.2001198E+01, 0.2000461E+01, 0.2000000E+01 + 0.2880000E+05, 0.1800000E+04, 8, 2, 1, 0.2413114E+01, 0.2135833E+01, 0.2053124E+01, 0.2022208E+01, 0.2010615E+01, 0.2006631E+01, 0.2004804E+01, 0.2003993E+01, 0.2054548E+01, 0.2019095E+01, 0.2007931E+01, 0.2004987E+01, 0.2003988E+01, 0.2003596E+01, 0.2002160E+01, 0.2001042E+01, 0.2000400E+01, 0.2000000E+01 + 0.3060000E+05, 0.1800000E+04, 9, 1, 1, 0.2556275E+01, 0.2223727E+01, 0.2101777E+01, 0.2038480E+01, 0.2016369E+01, 0.2009542E+01, 0.2006713E+01, 0.2005563E+01, 0.2104813E+01, 0.2033390E+01, 0.2012272E+01, 0.2007160E+01, 0.2005559E+01, 0.2004996E+01, 0.2002970E+01, 0.2001425E+01, 0.2000546E+01, 0.2000000E+01 + 0.3240000E+05, 0.1800000E+04, 9, 2, 1, 0.2696432E+01, 0.2321467E+01, 0.2178489E+01, 0.2072351E+01, 0.2030054E+01, 0.2016870E+01, 0.2011645E+01, 0.2009627E+01, 0.2182194E+01, 0.2062666E+01, 0.2022409E+01, 0.2012584E+01, 0.2009622E+01, 0.2008633E+01, 0.2005105E+01, 0.2002442E+01, 0.2000934E+01, 0.2000000E+01 + 0.3420000E+05, 0.1800000E+04, 10, 1, 1, 0.2864424E+01, 0.2438916E+01, 0.2283388E+01, 0.2132709E+01, 0.2057508E+01, 0.2031736E+01, 0.2021598E+01, 0.2017822E+01, 0.2287102E+01, 0.2115097E+01, 0.2042574E+01, 0.2023474E+01, 0.2017814E+01, 0.2015974E+01, 0.2009415E+01, 0.2004496E+01, 0.2001719E+01, 0.2000000E+01 + 0.3600000E+05, 0.1800000E+04, 10, 2, 1, 0.3020356E+01, 0.2556309E+01, 0.2398322E+01, 0.2219367E+01, 0.2104724E+01, 0.2058448E+01, 0.2039549E+01, 0.2032641E+01, 0.2401743E+01, 0.2192345E+01, 0.2077669E+01, 0.2042988E+01, 0.2032627E+01, 0.2029278E+01, 0.2017253E+01, 0.2008245E+01, 0.2003154E+01, 0.2000000E+01 + 0.3780000E+05, 0.1800000E+04, 11, 1, 1, 0.3181235E+01, 0.2678573E+01, 0.2518099E+01, 0.2326752E+01, 0.2175338E+01, 0.2101695E+01, 0.2069368E+01, 0.2057491E+01, 0.2521202E+01, 0.2291975E+01, 0.2132366E+01, 0.2075181E+01, 0.2057467E+01, 0.2051694E+01, 0.2030575E+01, 0.2014670E+01, 0.2005625E+01, 0.2000000E+01 + 0.3960000E+05, 0.1800000E+04, 11, 2, 1, 0.3327884E+01, 0.2795122E+01, 0.2633625E+01, 0.2441504E+01, 0.2265356E+01, 0.2164124E+01, 0.2114552E+01, 0.2095753E+01, 0.2636370E+01, 0.2401557E+01, 0.2205642E+01, 0.2123076E+01, 0.2095709E+01, 0.2086494E+01, 0.2051670E+01, 0.2025020E+01, 0.2009638E+01, 0.2000000E+01 + 0.4140000E+05, 0.1800000E+04, 12, 1, 1, 0.3450484E+01, 0.2897446E+01, 0.2738931E+01, 0.2553567E+01, 0.2366238E+01, 0.2243687E+01, 0.2176396E+01, 0.2149520E+01, 0.2741333E+01, 0.2511675E+01, 0.2294174E+01, 0.2187655E+01, 0.2149448E+01, 0.2135995E+01, 0.2082760E+01, 0.2040700E+01, 0.2015804E+01, 0.2000000E+01 + 0.4320000E+05, 0.1800000E+04, 12, 2, 1, 0.3560054E+01, 0.2991592E+01, 0.2836485E+01, 0.2659592E+01, 0.2470266E+01, 0.2334879E+01, 0.2252820E+01, 0.2217945E+01, 0.2838606E+01, 0.2617922E+01, 0.2390915E+01, 0.2266191E+01, 0.2217836E+01, 0.2199913E+01, 0.2124855E+01, 0.2062795E+01, 0.2024683E+01, 0.2000000E+01 + 0.4500000E+05, 0.1800000E+04, 13, 1, 1, 0.3621245E+01, 0.3055556E+01, 0.2908885E+01, 0.2745820E+01, 0.2564290E+01, 0.2426045E+01, 0.2335105E+01, 0.2293777E+01, 0.2910693E+01, 0.2705816E+01, 0.2482759E+01, 0.2348970E+01, 0.2293613E+01, 0.2271903E+01, 0.2175352E+01, 0.2090724E+01, 0.2036252E+01, 0.2000000E+01 + 0.4680000E+05, 0.1800000E+04, 13, 2, 1, 0.3669487E+01, 0.3106820E+01, 0.2967130E+01, 0.2816021E+01, 0.2644317E+01, 0.2509157E+01, 0.2415217E+01, 0.2369922E+01, 0.2968697E+01, 0.2777390E+01, 0.2563156E+01, 0.2428528E+01, 0.2369704E+01, 0.2345190E+01, 0.2229930E+01, 0.2122683E+01, 0.2049980E+01, 0.2000000E+01 + 0.4860000E+05, 0.1800000E+04, 14, 1, 1, 0.3660456E+01, 0.3121493E+01, 0.2994408E+01, 0.2859922E+01, 0.2703850E+01, 0.2577178E+01, 0.2484988E+01, 0.2437751E+01, 0.2995693E+01, 0.2823754E+01, 0.2626021E+01, 0.2497000E+01, 0.2437478E+01, 0.2411220E+01, 0.2282101E+01, 0.2155091E+01, 0.2064479E+01, 0.2000000E+01 + 0.5040000E+05, 0.1800000E+04, 14, 2, 1, 0.3635818E+01, 0.3119900E+01, 0.3003562E+01, 0.2883611E+01, 0.2743161E+01, 0.2626646E+01, 0.2538647E+01, 0.2491009E+01, 0.3004634E+01, 0.2849892E+01, 0.2669787E+01, 0.2549088E+01, 0.2490687E+01, 0.2463592E+01, 0.2325863E+01, 0.2183868E+01, 0.2077892E+01, 0.2000000E+01 + 0.5220000E+05, 0.1800000E+04, 15, 1, 1, 0.3564630E+01, 0.3088338E+01, 0.2986893E+01, 0.2886007E+01, 0.2767970E+01, 0.2659713E+01, 0.2575501E+01, 0.2527702E+01, 0.2987647E+01, 0.2852235E+01, 0.2692000E+01, 0.2582374E+01, 0.2527283E+01, 0.2500004E+01, 0.2357975E+01, 0.2206128E+01, 0.2088674E+01, 0.2000000E+01 + 0.5400000E+05, 0.1800000E+04, 15, 2, 1, 0.3475671E+01, 0.3040985E+01, 0.2953914E+01, 0.2871335E+01, 0.2774957E+01, 0.2674789E+01, 0.2594523E+01, 0.2546965E+01, 0.2954369E+01, 0.2836250E+01, 0.2695093E+01, 0.2597183E+01, 0.2546422E+01, 0.2519462E+01, 0.2376732E+01, 0.2220038E+01, 0.2095698E+01, 0.2000000E+01 + 0.5580000E+05, 0.1800000E+04, 16, 1, 1, 0.3366498E+01, 0.2991369E+01, 0.2923850E+01, 0.2871066E+01, 0.2816558E+01, 0.2706362E+01, 0.2618838E+01, 0.2566654E+01, 0.2923852E+01, 0.2817322E+01, 0.2692953E+01, 0.2608670E+01, 0.2565584E+01, 0.2538588E+01, 0.2393181E+01, 0.2231629E+01, 0.2101481E+01, 0.2000000E+01 + 0.5760000E+05, 0.1800000E+04, 16, 2, 1, 0.3251253E+01, 0.2952417E+01, 0.2907164E+01, 0.2883310E+01, 0.2861718E+01, 0.2743202E+01, 0.2647319E+01, 0.2589426E+01, 0.2906288E+01, 0.2806293E+01, 0.2695184E+01, 0.2623265E+01, 0.2587587E+01, 0.2560473E+01, 0.2411205E+01, 0.2243952E+01, 0.2107570E+01, 0.2000000E+01 + 0.5940000E+05, 0.1800000E+04, 17, 1, 1, 0.3178401E+01, 0.2993351E+01, 0.2976289E+01, 0.2975862E+01, 0.2975997E+01, 0.2829802E+01, 0.2712422E+01, 0.2642888E+01, 0.2968053E+01, 0.2849892E+01, 0.2735475E+01, 0.2669320E+01, 0.2639695E+01, 0.2611326E+01, 0.2450089E+01, 0.2269170E+01, 0.2119780E+01, 0.2000000E+01 + 0.6120000E+05, 0.1800000E+04, 17, 2, 1, 0.3170013E+01, 0.3099706E+01, 0.3098443E+01, 0.3106324E+01, 0.3122037E+01, 0.2953451E+01, 0.2815012E+01, 0.2733202E+01, 0.3082824E+01, 0.2945817E+01, 0.2821464E+01, 0.2755283E+01, 0.2728599E+01, 0.2698108E+01, 0.2518695E+01, 0.2315374E+01, 0.2142853E+01, 0.2000000E+01 + 0.6300000E+05, 0.1800000E+04, 18, 1, 1, 0.3236919E+01, 0.3216664E+01, 0.3217312E+01, 0.3236335E+01, 0.3264793E+01, 0.3088077E+01, 0.2938239E+01, 0.2848075E+01, 0.3200930E+01, 0.3061368E+01, 0.2934376E+01, 0.2868301E+01, 0.2842527E+01, 0.2809927E+01, 0.2611783E+01, 0.2381369E+01, 0.2177620E+01, 0.2000000E+01 + 0.6480000E+05, 0.1800000E+04, 18, 2, 1, 0.3342016E+01, 0.3339204E+01, 0.3342970E+01, 0.3371435E+01, 0.3410096E+01, 0.3230480E+01, 0.3074907E+01, 0.2979378E+01, 0.3325750E+01, 0.3189958E+01, 0.3065217E+01, 0.2999379E+01, 0.2973289E+01, 0.2938726E+01, 0.2723282E+01, 0.2464702E+01, 0.2224243E+01, 0.2000000E+01 + 0.6660000E+05, 0.1800000E+04, 19, 1, 1, 0.3382658E+01, 0.3380714E+01, 0.3383346E+01, 0.3402944E+01, 0.3424416E+01, 0.3277743E+01, 0.3144414E+01, 0.3058365E+01, 0.3369838E+01, 0.3259812E+01, 0.3149249E+01, 0.3083706E+01, 0.3053598E+01, 0.3018917E+01, 0.2802049E+01, 0.2530323E+01, 0.2264460E+01, 0.2000000E+01 + 0.6840000E+05, 0.1800000E+04, 19, 2, 1, 0.3359220E+01, 0.3357734E+01, 0.3359406E+01, 0.3371998E+01, 0.3382990E+01, 0.3263939E+01, 0.3152777E+01, 0.3077702E+01, 0.3349276E+01, 0.3264312E+01, 0.3170200E+01, 0.3107236E+01, 0.3074189E+01, 0.3040554E+01, 0.2831245E+01, 0.2559957E+01, 0.2284980E+01, 0.2000000E+01 + 0.7020000E+05, 0.1800000E+04, 20, 1, 1, 0.3268599E+01, 0.3265528E+01, 0.3265842E+01, 0.3270418E+01, 0.3272129E+01, 0.3183445E+01, 0.3096046E+01, 0.3033162E+01, 0.3259391E+01, 0.3199868E+01, 0.3124032E+01, 0.3065890E+01, 0.3030802E+01, 0.2999166E+01, 0.2804454E+01, 0.2545855E+01, 0.2279085E+01, 0.2000000E+01 + 0.7200000E+05, 0.1800000E+04, 20, 2, 1, 0.3117248E+01, 0.3111083E+01, 0.3110861E+01, 0.3110947E+01, 0.3109428E+01, 0.3048703E+01, 0.2983377E+01, 0.2932265E+01, 0.3107743E+01, 0.3073323E+01, 0.3017142E+01, 0.2966043E+01, 0.2930769E+01, 0.2901999E+01, 0.2727337E+01, 0.2491443E+01, 0.2248400E+01, 0.2000000E+01 + 0.7380000E+05, 0.1800000E+04, 21, 1, 1, 0.2969780E+01, 0.2961950E+01, 0.2961250E+01, 0.2961033E+01, 0.2956444E+01, 0.2909146E+01, 0.2855953E+01, 0.2812185E+01, 0.2959505E+01, 0.2936179E+01, 0.2891036E+01, 0.2845205E+01, 0.2811109E+01, 0.2784920E+01, 0.2628527E+01, 0.2417933E+01, 0.2206112E+01, 0.2000000E+01 + 0.7560000E+05, 0.1800000E+04, 21, 2, 1, 0.2822259E+01, 0.2811311E+01, 0.2809700E+01, 0.2807504E+01, 0.2795349E+01, 0.2761791E+01, 0.2719987E+01, 0.2683134E+01, 0.2809162E+01, 0.2793925E+01, 0.2756855E+01, 0.2715444E+01, 0.2682418E+01, 0.2658818E+01, 0.2520956E+01, 0.2337988E+01, 0.2161313E+01, 0.2000000E+01 + 0.7740000E+05, 0.1800000E+04, 22, 1, 1, 0.2694428E+01, 0.2681561E+01, 0.2679671E+01, 0.2676663E+01, 0.2662552E+01, 0.2632555E+01, 0.2595535E+01, 0.2562702E+01, 0.2679368E+01, 0.2666447E+01, 0.2631996E+01, 0.2593065E+01, 0.2562127E+01, 0.2540725E+01, 0.2419278E+01, 0.2263290E+01, 0.2121142E+01, 0.2000000E+01 + 0.7920000E+05, 0.1800000E+04, 22, 2, 1, 0.2583012E+01, 0.2567116E+01, 0.2564809E+01, 0.2560702E+01, 0.2544086E+01, 0.2517357E+01, 0.2484043E+01, 0.2454446E+01, 0.2564645E+01, 0.2552531E+01, 0.2519922E+01, 0.2482975E+01, 0.2453971E+01, 0.2434695E+01, 0.2329032E+01, 0.2199409E+01, 0.2088618E+01, 0.2000000E+01 + 0.8100000E+05, 0.1800000E+04, 23, 1, 1, 0.2487395E+01, 0.2469103E+01, 0.2466506E+01, 0.2461867E+01, 0.2444454E+01, 0.2419072E+01, 0.2388333E+01, 0.2361572E+01, 0.2466367E+01, 0.2454104E+01, 0.2421956E+01, 0.2387568E+01, 0.2361155E+01, 0.2344023E+01, 0.2253680E+01, 0.2148366E+01, 0.2063932E+01, 0.2000000E+01 + 0.8280000E+05, 0.1800000E+04, 23, 2, 1, 0.2406646E+01, 0.2384430E+01, 0.2381556E+01, 0.2376631E+01, 0.2358761E+01, 0.2334542E+01, 0.2306539E+01, 0.2282726E+01, 0.2381415E+01, 0.2369072E+01, 0.2337546E+01, 0.2305889E+01, 0.2282362E+01, 0.2267446E+01, 0.2192001E+01, 0.2108589E+01, 0.2045595E+01, 0.2000000E+01 + 0.8460000E+05, 0.1800000E+04, 24, 1, 1, 0.2338977E+01, 0.2312053E+01, 0.2308809E+01, 0.2303492E+01, 0.2285598E+01, 0.2262645E+01, 0.2237268E+01, 0.2216581E+01, 0.2308662E+01, 0.2295784E+01, 0.2265223E+01, 0.2236404E+01, 0.2216261E+01, 0.2203621E+01, 0.2142387E+01, 0.2078132E+01, 0.2032123E+01, 0.2000000E+01 + 0.8640000E+05, 0.1800000E+04, 24, 2, 1, 0.2281815E+01, 0.2249801E+01, 0.2246172E+01, 0.2240567E+01, 0.2223083E+01, 0.2201825E+01, 0.2179445E+01, 0.2161862E+01, 0.2246000E+01, 0.2232563E+01, 0.2203862E+01, 0.2178492E+01, 0.2161587E+01, 0.2151242E+01, 0.2103225E+01, 0.2055174E+01, 0.2022309E+01, 0.2000000E+01 + 0.8820000E+05, 0.1800000E+04, 25, 1, 1, 0.2233316E+01, 0.2196578E+01, 0.2192614E+01, 0.2186830E+01, 0.2169981E+01, 0.2150988E+01, 0.2131993E+01, 0.2117674E+01, 0.2192437E+01, 0.2179091E+01, 0.2152672E+01, 0.2131082E+01, 0.2117450E+01, 0.2109322E+01, 0.2072978E+01, 0.2038152E+01, 0.2015227E+01, 0.2000000E+01 + 0.9000000E+05, 0.1800000E+04, 25, 2, 1, 0.2193567E+01, 0.2151366E+01, 0.2147068E+01, 0.2141235E+01, 0.2125545E+01, 0.2109242E+01, 0.2093819E+01, 0.2082690E+01, 0.2146888E+01, 0.2133941E+01, 0.2110377E+01, 0.2092959E+01, 0.2082516E+01, 0.2076413E+01, 0.2050030E+01, 0.2025687E+01, 0.2010152E+01, 0.2000000E+01 + 0.9180000E+05, 0.1800000E+04, 25, 3, 1, 0.2160798E+01, 0.2112567E+01, 0.2108155E+01, 0.2102756E+01, 0.2088985E+01, 0.2075684E+01, 0.2063817E+01, 0.2055626E+01, 0.2107947E+01, 0.2096102E+01, 0.2076188E+01, 0.2063020E+01, 0.2055495E+01, 0.2051159E+01, 0.2032954E+01, 0.2016680E+01, 0.2006543E+01, 0.2000000E+01 + 0.9360000E+05, 0.1800000E+04, 25, 4, 1, 0.2133935E+01, 0.2080475E+01, 0.2076054E+01, 0.2071131E+01, 0.2059666E+01, 0.2049466E+01, 0.2040979E+01, 0.2035364E+01, 0.2075861E+01, 0.2065463E+01, 0.2049777E+01, 0.2040377E+01, 0.2035274E+01, 0.2032389E+01, 0.2020577E+01, 0.2010303E+01, 0.2004019E+01, 0.2000000E+01 + 0.9540000E+05, 0.1800000E+04, 25, 5, 1, 0.2111957E+01, 0.2054390E+01, 0.2050152E+01, 0.2045929E+01, 0.2037110E+01, 0.2029944E+01, 0.2024385E+01, 0.2020859E+01, 0.2049992E+01, 0.2041507E+01, 0.2030160E+01, 0.2023987E+01, 0.2020802E+01, 0.2019036E+01, 0.2011956E+01, 0.2005938E+01, 0.2002307E+01, 0.2000000E+01 + 0.9720000E+05, 0.1800000E+04, 25, 6, 1, 0.2093959E+01, 0.2033897E+01, 0.2030116E+01, 0.2026833E+01, 0.2020794E+01, 0.2016333E+01, 0.2013085E+01, 0.2011108E+01, 0.2030003E+01, 0.2023769E+01, 0.2016464E+01, 0.2012851E+01, 0.2011077E+01, 0.2010110E+01, 0.2006297E+01, 0.2003108E+01, 0.2001204E+01, 0.2000000E+01 + 0.9900000E+05, 0.1800000E+04, 25, 7, 1, 0.2079170E+01, 0.2018771E+01, 0.2015724E+01, 0.2013504E+01, 0.2009996E+01, 0.2007645E+01, 0.2006033E+01, 0.2005090E+01, 0.2015663E+01, 0.2011717E+01, 0.2007722E+01, 0.2005919E+01, 0.2005075E+01, 0.2004622E+01, 0.2002861E+01, 0.2001406E+01, 0.2000543E+01, 0.2000000E+01 + 0.1008000E+06, 0.1800000E+04, 25, 8, 1, 0.2066950E+01, 0.2008796E+01, 0.2006649E+01, 0.2005408E+01, 0.2003800E+01, 0.2002828E+01, 0.2002200E+01, 0.2001847E+01, 0.2006630E+01, 0.2004601E+01, 0.2002872E+01, 0.2002160E+01, 0.2001841E+01, 0.2001674E+01, 0.2001031E+01, 0.2000505E+01, 0.2000195E+01, 0.2000000E+01 + 0.1026000E+06, 0.1800000E+04, 25, 9, 1, 0.2056786E+01, 0.2003417E+01, 0.2002101E+01, 0.2001543E+01, 0.2001012E+01, 0.2000728E+01, 0.2000558E+01, 0.2000467E+01, 0.2002099E+01, 0.2001295E+01, 0.2000752E+01, 0.2000550E+01, 0.2000465E+01, 0.2000422E+01, 0.2000259E+01, 0.2000126E+01, 0.2000049E+01, 0.2000000E+01 + 0.1044000E+06, 0.1800000E+04, 25, 10, 1, 0.2048276E+01, 0.2001295E+01, 0.2000539E+01, 0.2000319E+01, 0.2000185E+01, 0.2000126E+01, 0.2000094E+01, 0.2000078E+01, 0.2000540E+01, 0.2000266E+01, 0.2000136E+01, 0.2000094E+01, 0.2000078E+01, 0.2000071E+01, 0.2000043E+01, 0.2000021E+01, 0.2000008E+01, 0.2000000E+01 + 0.1062000E+06, 0.1800000E+04, 25, 11, 1, 0.2041096E+01, 0.2000656E+01, 0.2000187E+01, 0.2000084E+01, 0.2000041E+01, 0.2000026E+01, 0.2000019E+01, 0.2000016E+01, 0.2000189E+01, 0.2000071E+01, 0.2000030E+01, 0.2000019E+01, 0.2000016E+01, 0.2000014E+01, 0.2000008E+01, 0.2000004E+01, 0.2000002E+01, 0.2000000E+01 + 0.1080000E+06, 0.1800000E+04, 25, 12, 1, 0.2034988E+01, 0.2000432E+01, 0.2000108E+01, 0.2000043E+01, 0.2000020E+01, 0.2000012E+01, 0.2000009E+01, 0.2000007E+01, 0.2000110E+01, 0.2000037E+01, 0.2000015E+01, 0.2000009E+01, 0.2000007E+01, 0.2000006E+01, 0.2000004E+01, 0.2000002E+01, 0.2000001E+01, 0.2000000E+01 + 0.1098000E+06, 0.1800000E+04, 25, 13, 1, 0.2029755E+01, 0.2000311E+01, 0.2000076E+01, 0.2000030E+01, 0.2000013E+01, 0.2000008E+01, 0.2000006E+01, 0.2000005E+01, 0.2000077E+01, 0.2000025E+01, 0.2000010E+01, 0.2000006E+01, 0.2000005E+01, 0.2000004E+01, 0.2000003E+01, 0.2000001E+01, 0.2000000E+01, 0.2000000E+01 + 0.1116000E+06, 0.1800000E+04, 25, 14, 1, 0.2025243E+01, 0.2000229E+01, 0.2000056E+01, 0.2000022E+01, 0.2000010E+01, 0.2000006E+01, 0.2000004E+01, 0.2000004E+01, 0.2000057E+01, 0.2000018E+01, 0.2000007E+01, 0.2000004E+01, 0.2000004E+01, 0.2000003E+01, 0.2000002E+01, 0.2000001E+01, 0.2000000E+01, 0.2000000E+01 + 0.1134000E+06, 0.1800000E+04, 25, 15, 1, 0.2021334E+01, 0.2000172E+01, 0.2000042E+01, 0.2000016E+01, 0.2000007E+01, 0.2000004E+01, 0.2000003E+01, 0.2000003E+01, 0.2000042E+01, 0.2000014E+01, 0.2000005E+01, 0.2000003E+01, 0.2000003E+01, 0.2000002E+01, 0.2000001E+01, 0.2000001E+01, 0.2000000E+01, 0.2000000E+01 + 0.1152000E+06, 0.1800000E+04, 25, 16, 1, 0.2017937E+01, 0.2000129E+01, 0.2000031E+01, 0.2000012E+01, 0.2000005E+01, 0.2000003E+01, 0.2000002E+01, 0.2000002E+01, 0.2000032E+01, 0.2000010E+01, 0.2000004E+01, 0.2000002E+01, 0.2000002E+01, 0.2000002E+01, 0.2000001E+01, 0.2000001E+01, 0.2000000E+01, 0.2000000E+01 + 0.1170000E+06, 0.1800000E+04, 25, 17, 1, 0.2014978E+01, 0.2000098E+01, 0.2000024E+01, 0.2000009E+01, 0.2000004E+01, 0.2000003E+01, 0.2000002E+01, 0.2000001E+01, 0.2000024E+01, 0.2000008E+01, 0.2000003E+01, 0.2000002E+01, 0.2000001E+01, 0.2000001E+01, 0.2000001E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1188000E+06, 0.1800000E+04, 25, 18, 1, 0.2012399E+01, 0.2000074E+01, 0.2000018E+01, 0.2000007E+01, 0.2000003E+01, 0.2000002E+01, 0.2000001E+01, 0.2000001E+01, 0.2000018E+01, 0.2000006E+01, 0.2000002E+01, 0.2000001E+01, 0.2000001E+01, 0.2000001E+01, 0.2000001E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1206000E+06, 0.1800000E+04, 25, 19, 1, 0.2010154E+01, 0.2000056E+01, 0.2000014E+01, 0.2000005E+01, 0.2000002E+01, 0.2000001E+01, 0.2000001E+01, 0.2000001E+01, 0.2000014E+01, 0.2000004E+01, 0.2000002E+01, 0.2000001E+01, 0.2000001E+01, 0.2000001E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1224000E+06, 0.1800000E+04, 25, 20, 1, 0.2008245E+01, 0.2000040E+01, 0.2000010E+01, 0.2000004E+01, 0.2000002E+01, 0.2000001E+01, 0.2000001E+01, 0.2000001E+01, 0.2000010E+01, 0.2000003E+01, 0.2000001E+01, 0.2000001E+01, 0.2000001E+01, 0.2000001E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1242000E+06, 0.1800000E+04, 25, 21, 1, 0.2006781E+01, 0.2000024E+01, 0.2000006E+01, 0.2000002E+01, 0.2000001E+01, 0.2000001E+01, 0.2000000E+01, 0.2000000E+01, 0.2000006E+01, 0.2000002E+01, 0.2000001E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1260000E+06, 0.1800000E+04, 25, 22, 1, 0.2005824E+01, 0.2000010E+01, 0.2000002E+01, 0.2000001E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000003E+01, 0.2000001E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1278000E+06, 0.1800000E+04, 25, 23, 1, 0.2005221E+01, 0.2000004E+01, 0.2000001E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000001E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1296000E+06, 0.1800000E+04, 25, 24, 1, 0.2004817E+01, 0.2000002E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1314000E+06, 0.1800000E+04, 25, 25, 1, 0.2004526E+01, 0.2000001E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1332000E+06, 0.1800000E+04, 25, 26, 1, 0.2004303E+01, 0.2000001E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1350000E+06, 0.1800000E+04, 25, 27, 1, 0.2004126E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1368000E+06, 0.1800000E+04, 25, 28, 1, 0.2003984E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1386000E+06, 0.1800000E+04, 25, 29, 1, 0.2003860E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1404000E+06, 0.1800000E+04, 25, 30, 1, 0.2003752E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1422000E+06, 0.1800000E+04, 25, 31, 1, 0.2003657E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1440000E+06, 0.1800000E+04, 25, 32, 1, 0.2003576E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1458000E+06, 0.1800000E+04, 25, 33, 1, 0.2003500E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1476000E+06, 0.1800000E+04, 25, 34, 1, 0.2003462E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1494000E+06, 0.1800000E+04, 25, 35, 1, 0.2003397E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1512000E+06, 0.1800000E+04, 25, 36, 1, 0.2003368E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1530000E+06, 0.1800000E+04, 25, 37, 1, 0.2003310E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1548000E+06, 0.1800000E+04, 25, 38, 1, 0.2003287E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1566000E+06, 0.1800000E+04, 25, 39, 1, 0.2003267E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1584000E+06, 0.1800000E+04, 25, 40, 1, 0.2003216E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1602000E+06, 0.1800000E+04, 25, 41, 1, 0.2003202E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1620000E+06, 0.1800000E+04, 25, 42, 1, 0.2003187E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1638000E+06, 0.1800000E+04, 25, 43, 1, 0.2003173E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1656000E+06, 0.1800000E+04, 25, 44, 1, 0.2003161E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1674000E+06, 0.1800000E+04, 25, 45, 1, 0.2003117E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1692000E+06, 0.1800000E+04, 25, 46, 1, 0.2003108E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1710000E+06, 0.1800000E+04, 25, 47, 1, 0.2003099E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1728000E+06, 0.1800000E+04, 25, 48, 1, 0.2003092E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1746000E+06, 0.1800000E+04, 25, 49, 1, 0.2003084E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1764000E+06, 0.1800000E+04, 25, 50, 1, 0.2003077E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1782000E+06, 0.1800000E+04, 25, 51, 1, 0.2003070E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1800000E+06, 0.1800000E+04, 25, 52, 1, 0.2003031E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1818000E+06, 0.1800000E+04, 25, 53, 1, 0.2003027E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1836000E+06, 0.1800000E+04, 25, 54, 1, 0.2003023E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1854000E+06, 0.1800000E+04, 25, 55, 1, 0.2002987E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1872000E+06, 0.1800000E+04, 25, 56, 1, 0.2002985E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1890000E+06, 0.1800000E+04, 25, 57, 1, 0.2002983E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1908000E+06, 0.1800000E+04, 25, 58, 1, 0.2002981E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1926000E+06, 0.1800000E+04, 25, 59, 1, 0.2002979E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1944000E+06, 0.1800000E+04, 25, 60, 1, 0.2002977E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1962000E+06, 0.1800000E+04, 25, 61, 1, 0.2002975E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1980000E+06, 0.1800000E+04, 25, 62, 1, 0.2002973E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.1998000E+06, 0.1800000E+04, 25, 63, 1, 0.2002971E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2016000E+06, 0.1800000E+04, 25, 64, 1, 0.2002969E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2034000E+06, 0.1800000E+04, 25, 65, 1, 0.2002967E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2052000E+06, 0.1800000E+04, 25, 66, 1, 0.2002965E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2070000E+06, 0.1800000E+04, 25, 67, 1, 0.2002963E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2088000E+06, 0.1800000E+04, 25, 68, 1, 0.2002961E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2106000E+06, 0.1800000E+04, 25, 69, 1, 0.2002960E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2124000E+06, 0.1800000E+04, 25, 70, 1, 0.2002958E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2142000E+06, 0.1800000E+04, 25, 71, 1, 0.2002956E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2160000E+06, 0.1800000E+04, 25, 72, 1, 0.2002954E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2178000E+06, 0.1800000E+04, 25, 73, 1, 0.2002952E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2196000E+06, 0.1800000E+04, 25, 74, 1, 0.2002950E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2214000E+06, 0.1800000E+04, 25, 75, 1, 0.2002949E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2232000E+06, 0.1800000E+04, 25, 76, 1, 0.2002947E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2250000E+06, 0.1800000E+04, 25, 77, 1, 0.2002945E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2268000E+06, 0.1800000E+04, 25, 78, 1, 0.2002943E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2286000E+06, 0.1800000E+04, 25, 79, 1, 0.2002942E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2304000E+06, 0.1800000E+04, 25, 80, 1, 0.2002940E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2322000E+06, 0.1800000E+04, 25, 81, 1, 0.2002938E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2340000E+06, 0.1800000E+04, 25, 82, 1, 0.2002936E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2358000E+06, 0.1800000E+04, 25, 83, 1, 0.2002935E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2376000E+06, 0.1800000E+04, 25, 84, 1, 0.2002933E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2394000E+06, 0.1800000E+04, 25, 85, 1, 0.2002931E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2412000E+06, 0.1800000E+04, 25, 86, 1, 0.2002930E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2430000E+06, 0.1800000E+04, 25, 87, 1, 0.2002928E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2448000E+06, 0.1800000E+04, 25, 88, 1, 0.2002926E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2466000E+06, 0.1800000E+04, 25, 89, 1, 0.2002923E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2484000E+06, 0.1800000E+04, 25, 90, 1, 0.2002921E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2502000E+06, 0.1800000E+04, 25, 91, 1, 0.2002919E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2520000E+06, 0.1800000E+04, 25, 92, 1, 0.2002917E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2538000E+06, 0.1800000E+04, 25, 93, 1, 0.2002915E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2556000E+06, 0.1800000E+04, 25, 94, 1, 0.2002912E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2574000E+06, 0.1800000E+04, 25, 95, 1, 0.2002910E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2592000E+06, 0.1800000E+04, 25, 96, 1, 0.2002908E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2610000E+06, 0.1800000E+04, 25, 97, 1, 0.2002906E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2628000E+06, 0.1800000E+04, 25, 98, 1, 0.2002904E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2646000E+06, 0.1800000E+04, 25, 99, 1, 0.2002902E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2664000E+06, 0.1800000E+04, 25, 100, 1, 0.2002900E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2682000E+06, 0.1800000E+04, 25, 101, 1, 0.2002898E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2700000E+06, 0.1800000E+04, 25, 102, 1, 0.2002896E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2718000E+06, 0.1800000E+04, 25, 103, 1, 0.2002894E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2736000E+06, 0.1800000E+04, 25, 104, 1, 0.2002892E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2754000E+06, 0.1800000E+04, 25, 105, 1, 0.2002890E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2772000E+06, 0.1800000E+04, 25, 106, 1, 0.2002888E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2790000E+06, 0.1800000E+04, 25, 107, 1, 0.2002886E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2808000E+06, 0.1800000E+04, 25, 108, 1, 0.2002883E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2826000E+06, 0.1800000E+04, 25, 109, 1, 0.2002881E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2844000E+06, 0.1800000E+04, 25, 110, 1, 0.2002879E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2862000E+06, 0.1800000E+04, 25, 111, 1, 0.2002877E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2880000E+06, 0.1800000E+04, 25, 112, 1, 0.2002875E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2898000E+06, 0.1800000E+04, 25, 113, 1, 0.2002873E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2916000E+06, 0.1800000E+04, 25, 114, 1, 0.2002871E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2934000E+06, 0.1800000E+04, 25, 115, 1, 0.2002869E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2952000E+06, 0.1800000E+04, 25, 116, 1, 0.2002867E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2970000E+06, 0.1800000E+04, 25, 117, 1, 0.2002865E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.2988000E+06, 0.1800000E+04, 25, 118, 1, 0.2002864E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3006000E+06, 0.1800000E+04, 25, 119, 1, 0.2002862E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3024000E+06, 0.1800000E+04, 25, 120, 1, 0.2002860E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3042000E+06, 0.1800000E+04, 25, 121, 1, 0.2002858E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3060000E+06, 0.1800000E+04, 25, 122, 1, 0.2002856E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3078000E+06, 0.1800000E+04, 25, 123, 1, 0.2002854E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3096000E+06, 0.1800000E+04, 25, 124, 1, 0.2002852E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3114000E+06, 0.1800000E+04, 25, 125, 1, 0.2002850E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3132000E+06, 0.1800000E+04, 25, 126, 1, 0.2002848E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3150000E+06, 0.1800000E+04, 25, 127, 1, 0.2002846E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3168000E+06, 0.1800000E+04, 25, 128, 1, 0.2002844E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3186000E+06, 0.1800000E+04, 25, 129, 1, 0.2002842E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3204000E+06, 0.1800000E+04, 25, 130, 1, 0.2002840E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3222000E+06, 0.1800000E+04, 25, 131, 1, 0.2002838E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3240000E+06, 0.1800000E+04, 25, 132, 1, 0.2002836E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3258000E+06, 0.1800000E+04, 25, 133, 1, 0.2002835E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3276000E+06, 0.1800000E+04, 25, 134, 1, 0.2002833E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3294000E+06, 0.1800000E+04, 25, 135, 1, 0.2002831E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3312000E+06, 0.1800000E+04, 25, 136, 1, 0.2002829E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3330000E+06, 0.1800000E+04, 25, 137, 1, 0.2002827E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3348000E+06, 0.1800000E+04, 25, 138, 1, 0.2002825E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3366000E+06, 0.1800000E+04, 25, 139, 1, 0.2002823E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3384000E+06, 0.1800000E+04, 25, 140, 1, 0.2002822E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3402000E+06, 0.1800000E+04, 25, 141, 1, 0.2002820E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3420000E+06, 0.1800000E+04, 25, 142, 1, 0.2002818E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3438000E+06, 0.1800000E+04, 25, 143, 1, 0.2002816E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3456000E+06, 0.1800000E+04, 25, 144, 1, 0.2002814E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3474000E+06, 0.1800000E+04, 25, 145, 1, 0.2002812E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3492000E+06, 0.1800000E+04, 25, 146, 1, 0.2002810E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3510000E+06, 0.1800000E+04, 25, 147, 1, 0.2002809E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3528000E+06, 0.1800000E+04, 25, 148, 1, 0.2002807E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3546000E+06, 0.1800000E+04, 25, 149, 1, 0.2002805E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3564000E+06, 0.1800000E+04, 25, 150, 1, 0.2002803E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3582000E+06, 0.1800000E+04, 25, 151, 1, 0.2002801E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3600000E+06, 0.1800000E+04, 25, 152, 1, 0.2002800E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3618000E+06, 0.1800000E+04, 25, 153, 1, 0.2002798E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3636000E+06, 0.1800000E+04, 25, 154, 1, 0.2002796E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3654000E+06, 0.1800000E+04, 25, 155, 1, 0.2002794E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3672000E+06, 0.1800000E+04, 25, 156, 1, 0.2002792E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3690000E+06, 0.1800000E+04, 25, 157, 1, 0.2002791E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3708000E+06, 0.1800000E+04, 25, 158, 1, 0.2002789E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3726000E+06, 0.1800000E+04, 25, 159, 1, 0.2002787E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3744000E+06, 0.1800000E+04, 25, 160, 1, 0.2002785E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3762000E+06, 0.1800000E+04, 25, 161, 1, 0.2002784E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3780000E+06, 0.1800000E+04, 25, 162, 1, 0.2002782E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3798000E+06, 0.1800000E+04, 25, 163, 1, 0.2002780E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3816000E+06, 0.1800000E+04, 25, 164, 1, 0.2002778E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3834000E+06, 0.1800000E+04, 25, 165, 1, 0.2002777E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3852000E+06, 0.1800000E+04, 25, 166, 1, 0.2002775E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3870000E+06, 0.1800000E+04, 25, 167, 1, 0.2002773E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3888000E+06, 0.1800000E+04, 25, 168, 1, 0.2002771E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3906000E+06, 0.1800000E+04, 25, 169, 1, 0.2002770E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3924000E+06, 0.1800000E+04, 25, 170, 1, 0.2002768E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3942000E+06, 0.1800000E+04, 25, 171, 1, 0.2002766E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3960000E+06, 0.1800000E+04, 25, 172, 1, 0.2002765E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3978000E+06, 0.1800000E+04, 25, 173, 1, 0.2002763E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.3996000E+06, 0.1800000E+04, 25, 174, 1, 0.2002761E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4014000E+06, 0.1800000E+04, 25, 175, 1, 0.2002759E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4032000E+06, 0.1800000E+04, 25, 176, 1, 0.2002758E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4050000E+06, 0.1800000E+04, 25, 177, 1, 0.2002756E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4068000E+06, 0.1800000E+04, 25, 178, 1, 0.2002754E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4086000E+06, 0.1800000E+04, 25, 179, 1, 0.2002753E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4104000E+06, 0.1800000E+04, 25, 180, 1, 0.2002751E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4122000E+06, 0.1800000E+04, 25, 181, 1, 0.2002749E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4140000E+06, 0.1800000E+04, 25, 182, 1, 0.2002748E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4158000E+06, 0.1800000E+04, 25, 183, 1, 0.2002746E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4176000E+06, 0.1800000E+04, 25, 184, 1, 0.2002744E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4194000E+06, 0.1800000E+04, 25, 185, 1, 0.2002743E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4212000E+06, 0.1800000E+04, 25, 186, 1, 0.2002741E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4230000E+06, 0.1800000E+04, 25, 187, 1, 0.2002739E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4248000E+06, 0.1800000E+04, 25, 188, 1, 0.2002738E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4266000E+06, 0.1800000E+04, 25, 189, 1, 0.2002736E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4284000E+06, 0.1800000E+04, 25, 190, 1, 0.2002735E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4302000E+06, 0.1800000E+04, 25, 191, 1, 0.2002733E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4320000E+06, 0.1800000E+04, 25, 192, 1, 0.2002731E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4338000E+06, 0.1800000E+04, 25, 193, 1, 0.2002730E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4356000E+06, 0.1800000E+04, 25, 194, 1, 0.2002728E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4374000E+06, 0.1800000E+04, 25, 195, 1, 0.2002726E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4392000E+06, 0.1800000E+04, 25, 196, 1, 0.2002725E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4410000E+06, 0.1800000E+04, 25, 197, 1, 0.2002723E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4428000E+06, 0.1800000E+04, 25, 198, 1, 0.2002722E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4446000E+06, 0.1800000E+04, 25, 199, 1, 0.2002720E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4464000E+06, 0.1800000E+04, 25, 200, 1, 0.2002718E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4482000E+06, 0.1800000E+04, 25, 201, 1, 0.2002717E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4500000E+06, 0.1800000E+04, 25, 202, 1, 0.2002715E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4518000E+06, 0.1800000E+04, 25, 203, 1, 0.2002714E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4536000E+06, 0.1800000E+04, 25, 204, 1, 0.2002712E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4554000E+06, 0.1800000E+04, 25, 205, 1, 0.2002710E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4572000E+06, 0.1800000E+04, 25, 206, 1, 0.2002709E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4590000E+06, 0.1800000E+04, 25, 207, 1, 0.2002707E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4608000E+06, 0.1800000E+04, 25, 208, 1, 0.2002706E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4626000E+06, 0.1800000E+04, 25, 209, 1, 0.2002704E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4644000E+06, 0.1800000E+04, 25, 210, 1, 0.2002703E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4662000E+06, 0.1800000E+04, 25, 211, 1, 0.2002701E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4680000E+06, 0.1800000E+04, 25, 212, 1, 0.2002699E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4698000E+06, 0.1800000E+04, 25, 213, 1, 0.2002698E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4716000E+06, 0.1800000E+04, 25, 214, 1, 0.2002696E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4734000E+06, 0.1800000E+04, 25, 215, 1, 0.2002695E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4752000E+06, 0.1800000E+04, 25, 216, 1, 0.2002693E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4770000E+06, 0.1800000E+04, 25, 217, 1, 0.2002692E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4788000E+06, 0.1800000E+04, 25, 218, 1, 0.2002690E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4806000E+06, 0.1800000E+04, 25, 219, 1, 0.2002689E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4824000E+06, 0.1800000E+04, 25, 220, 1, 0.2002687E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4842000E+06, 0.1800000E+04, 25, 221, 1, 0.2002686E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4860000E+06, 0.1800000E+04, 25, 222, 1, 0.2002684E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4878000E+06, 0.1800000E+04, 25, 223, 1, 0.2002683E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4896000E+06, 0.1800000E+04, 25, 224, 1, 0.2002681E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4914000E+06, 0.1800000E+04, 25, 225, 1, 0.2002680E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4932000E+06, 0.1800000E+04, 25, 226, 1, 0.2002678E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4950000E+06, 0.1800000E+04, 25, 227, 1, 0.2002677E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4968000E+06, 0.1800000E+04, 25, 228, 1, 0.2002675E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.4986000E+06, 0.1800000E+04, 25, 229, 1, 0.2002674E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5004000E+06, 0.1800000E+04, 25, 230, 1, 0.2002672E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5022000E+06, 0.1800000E+04, 25, 231, 1, 0.2002671E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5040000E+06, 0.1800000E+04, 25, 232, 1, 0.2002669E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5058000E+06, 0.1800000E+04, 25, 233, 1, 0.2002668E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5076000E+06, 0.1800000E+04, 25, 234, 1, 0.2002666E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5094000E+06, 0.1800000E+04, 25, 235, 1, 0.2002665E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5112000E+06, 0.1800000E+04, 25, 236, 1, 0.2002663E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5130000E+06, 0.1800000E+04, 25, 237, 1, 0.2002662E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5148000E+06, 0.1800000E+04, 25, 238, 1, 0.2002660E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5166000E+06, 0.1800000E+04, 25, 239, 1, 0.2002659E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5184000E+06, 0.1800000E+04, 25, 240, 1, 0.2002657E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5202000E+06, 0.1800000E+04, 25, 241, 1, 0.2002656E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5220000E+06, 0.1800000E+04, 25, 242, 1, 0.2002654E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5238000E+06, 0.1800000E+04, 25, 243, 1, 0.2002653E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5256000E+06, 0.1800000E+04, 25, 244, 1, 0.2002652E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5274000E+06, 0.1800000E+04, 25, 245, 1, 0.2002650E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5292000E+06, 0.1800000E+04, 25, 246, 1, 0.2002649E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5310000E+06, 0.1800000E+04, 25, 247, 1, 0.2002647E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5328000E+06, 0.1800000E+04, 25, 248, 1, 0.2002646E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5346000E+06, 0.1800000E+04, 25, 249, 1, 0.2002644E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5364000E+06, 0.1800000E+04, 25, 250, 1, 0.2002643E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5382000E+06, 0.1800000E+04, 25, 251, 1, 0.2002641E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5400000E+06, 0.1800000E+04, 25, 252, 1, 0.2002640E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5418000E+06, 0.1800000E+04, 25, 253, 1, 0.2002639E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5436000E+06, 0.1800000E+04, 25, 254, 1, 0.2002637E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5454000E+06, 0.1800000E+04, 25, 255, 1, 0.2002636E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5472000E+06, 0.1800000E+04, 25, 256, 1, 0.2002634E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5490000E+06, 0.1800000E+04, 25, 257, 1, 0.2002633E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5508000E+06, 0.1800000E+04, 25, 258, 1, 0.2002632E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5526000E+06, 0.1800000E+04, 25, 259, 1, 0.2002630E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5544000E+06, 0.1800000E+04, 25, 260, 1, 0.2002629E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5562000E+06, 0.1800000E+04, 25, 261, 1, 0.2002627E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5580000E+06, 0.1800000E+04, 25, 262, 1, 0.2002626E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5598000E+06, 0.1800000E+04, 25, 263, 1, 0.2002625E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5616000E+06, 0.1800000E+04, 25, 264, 1, 0.2002623E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5634000E+06, 0.1800000E+04, 25, 265, 1, 0.2002622E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5652000E+06, 0.1800000E+04, 25, 266, 1, 0.2002620E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5670000E+06, 0.1800000E+04, 25, 267, 1, 0.2002619E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5688000E+06, 0.1800000E+04, 25, 268, 1, 0.2002618E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5706000E+06, 0.1800000E+04, 25, 269, 1, 0.2002616E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5724000E+06, 0.1800000E+04, 25, 270, 1, 0.2002615E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5742000E+06, 0.1800000E+04, 25, 271, 1, 0.2002613E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5760000E+06, 0.1800000E+04, 25, 272, 1, 0.2002612E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5778000E+06, 0.1800000E+04, 25, 273, 1, 0.2002611E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5796000E+06, 0.1800000E+04, 25, 274, 1, 0.2002609E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5814000E+06, 0.1800000E+04, 25, 275, 1, 0.2002608E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5832000E+06, 0.1800000E+04, 25, 276, 1, 0.2002607E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5850000E+06, 0.1800000E+04, 25, 277, 1, 0.2002605E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5868000E+06, 0.1800000E+04, 25, 278, 1, 0.2002604E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5886000E+06, 0.1800000E+04, 25, 279, 1, 0.2002603E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5904000E+06, 0.1800000E+04, 25, 280, 1, 0.2002601E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5922000E+06, 0.1800000E+04, 25, 281, 1, 0.2002600E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5940000E+06, 0.1800000E+04, 25, 282, 1, 0.2002599E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5958000E+06, 0.1800000E+04, 25, 283, 1, 0.2002597E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5976000E+06, 0.1800000E+04, 25, 284, 1, 0.2002596E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.5994000E+06, 0.1800000E+04, 25, 285, 1, 0.2002595E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.6012000E+06, 0.1800000E+04, 25, 286, 1, 0.2002593E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.6030000E+06, 0.1800000E+04, 25, 287, 1, 0.2002592E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 + 0.6048000E+06, 0.1800000E+04, 25, 288, 1, 0.2002591E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01, 0.2000000E+01 diff --git a/autotest/test_swf_dfw.py b/autotest/test_swf_dfw.py new file mode 100644 index 00000000000..7ab2b98621e --- /dev/null +++ b/autotest/test_swf_dfw.py @@ -0,0 +1,199 @@ +""" + +Simple 3 reach network with 4 vertices + + +zero-based diagram below + +o------o------o------o +v0 v1 v2 v3 + r0 r1 r2 + +ia ja +0 0 1 +2 1 0 2 +5 2 1 +7 + +""" + +import os + +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +cases = [ + "swf-dfw01", +] + + +def build_models(idx, test): + + sim_ws = test.workspace + name = cases[idx] + sim = flopy.mf6.MFSimulation( + sim_name=name, + version="mf6", + exe_name="mf6", + sim_ws=sim_ws, + memory_print_option="all", + ) + + tdis = flopy.mf6.ModflowTdis(sim) + ims = flopy.mf6.ModflowIms( + sim, + print_option="all", + linear_acceleration="BICGSTAB", + outer_dvclose=1.0e-7, + inner_dvclose=1.0e-8, + ) + swf = flopy.mf6.ModflowSwf(sim, modelname=name, save_flows=True) + + dx = 1000.0 + nreach = 3 + total_length = dx * nreach + vertices = [] + vertices = [[j, j * dx, 0.0, 0.0] for j in range(nreach + 1)] + cell2d = [] + for j in range(nreach): + cell2d.append([j, 0.5, 2, j, j + 1]) + toreach = [j + 1 for j in range(nreach - 1)] + [-1] + nodes = len(cell2d) + nvert = len(vertices) + + disl = flopy.mf6.ModflowSwfdisl( + swf, + nodes=nodes, + nvert=nvert, + reach_length=dx, + reach_bottom=0.0, + toreach=toreach, # -1 gives 0 in one-based, which means outflow cell + idomain=1, + vertices=vertices, + cell2d=cell2d, + ) + + dfw = flopy.mf6.ModflowSwfdfw( + swf, + print_flows=True, + save_flows=True, + width=50.0, + manningsn=0.035, + slope=0.001, + idcxs=0, + ) + + sto = flopy.mf6.ModflowSwfsto( + swf, + save_flows=True, + ) + + ic = flopy.mf6.ModflowSwfic(swf, strt=1.0) + + xfraction = [0.0, 0.0, 1.0, 1.0] + height = [100.0, 0.0, 0.0, 100.0] + mannfraction = [1.0, 1.0, 1.0, 1.0] + cxsdata = list(zip(xfraction, height, mannfraction)) + cxs = flopy.mf6.ModflowSwfcxs( + swf, + nsections=1, + npoints=4, + packagedata=[(0, 4)], + crosssectiondata=cxsdata, + ) + + # output control + oc = flopy.mf6.ModflowSwfoc( + swf, + budget_filerecord=f"{name}.bud", + stage_filerecord=f"{name}.stage", + saverecord=[ + ("STAGE", "ALL"), + ("BUDGET", "ALL"), + ], + printrecord=[ + ("STAGE", "LAST"), + ("BUDGET", "ALL"), + ], + ) + + # Save to external binary file or into flw package depending on binary keyword + binary = True + flw_list = [ + (1, 100), + ] # one-based cell numbers here + maxbound = len(flw_list) + if binary: + ra = np.array(flw_list, dtype=[("irch", " 86400] + print(df_mfswr) + + fpth = test.workspace / f"swfmodel.bud" + budobj = flopy.utils.binaryfile.CellBudgetFile(fpth, precision="double") + flowja = budobj.get_data(text="FLOW-JA-FACE") + qstorage = budobj.get_data(text="STORAGE") + qflw = budobj.get_data(text="FLW") + qchd = budobj.get_data(text="CHD") + + qoutflow = [] + times = np.array(budobj.times) + for ra in qchd: + q = -ra[0]["q"] + qoutflow.append(q) + + qinflow = [] + for ra in qflw: + q = ra[0]["q"] + qinflow.append(q) + + # plot upstream and downstream flow + fig = plt.figure(figsize=(8, 6)) + ax = fig.add_subplot(1, 1, 1) + ax.plot(times / 60.0 / 60.0, qinflow, "r-", label="Inflow") + ax.plot( + times / 60.0 / 60.0, + df_hecras["Flow Flow (CMS)"], + "b-", + label="HEC-RAS", + ) + x = df_mfswr["TOTTIME"] - 86400.0 + x = x / 60.0 / 60.0 + ax.plot(x, -df_mfswr["QCRFLOW"], "go", mfc="none", label="MODFLOW-SWR") + ax.plot(times / 60.0 / 60.0, qoutflow, "bo", mfc="none", label="MODFLOW 6") + ax.set_xlim(0, 24.0) + ax.set_ylim(19, 26) + plt.xlabel("time, in hours") + plt.ylabel("flow, in meters cubed per second") + plt.legend() + fname = test.workspace / "swfmodel.flow.png" + plt.savefig(fname) + + # read and plot stages + fpth = test.workspace / "swfmodel.stage" + qobj = flopy.utils.HeadFile(fpth, precision="double", text="STAGE") + stage = qobj.get_alldata() + + fig = plt.figure(figsize=(10, 10)) + ax = fig.add_subplot(1, 1, 1) + ax.plot(times / 60.0 / 60.0, stage[:, 0, 0, 0], "r-", label="Upstream") + ax.plot( + times / 60.0 / 60.0, + stage[:, 0, 0, -1], + "bo", + mfc="none", + label="Downstream", + ) + # ax.set_xlim(0, 24.) + # ax.set_ylim(19, 26) + plt.xlabel("time, in hours") + plt.ylabel("stage, in meters") + plt.legend() + fname = test.workspace / "swfmodel.stage.png" + plt.savefig(fname) + + return + + +def check_output(idx, test): + print("evaluating model...") + + # get MFSimulation from test + sim = test.sims[0] + + makeplot = False + if makeplot: + make_plot(test, sim) + + # assign name + name = "swfmodel" + + # read the binary grid file + fpth = test.workspace / f"{name}.disl.grb" + grb = flopy.mf6.utils.MfGrdFile(fpth) + ia = grb.ia + ja = grb.ja + assert ia.shape[0] == grb.nodes + 1, "ia in grb file is not correct size" + + # check to make sure stage file can be read + fpth = test.workspace / f"{name}.stage" + qobj = flopy.utils.HeadFile(fpth, precision="double", text="STAGE") + stage = qobj.get_alldata() + + # check to make sure budget file can be read + fpth = test.workspace / f"{name}.bud" + budobj = flopy.utils.binaryfile.CellBudgetFile(fpth, precision="double") + flowja = budobj.get_data(text="FLOW-JA-FACE") + qstorage = budobj.get_data(text="STORAGE") + qflw = budobj.get_data(text="FLW") + qchd = budobj.get_data(text="CHD") + qresidual = np.zeros(grb.nodes) + + # compare the mf6 swr outflow to the mf2005 swr outflow + swrdata = data_path / "mfswr0125.csv.cmp" + df_mfswr = pd.read_csv(swrdata, index_col=False) + df_mfswr = df_mfswr.loc[df_mfswr["RCHGRP"] == 21] + df_mfswr = df_mfswr.loc[df_mfswr["TOTTIME"] >= 86400] + qoutflow_mf2005 = -df_mfswr["QCRFLOW"].to_numpy() + + # create a list of outflows from mf6 simulation + qoutflow_mf6 = [] + for ra in qchd: + q = -ra[0]["q"] + qoutflow_mf6.append(q) + + # check to make sure the difference in outflow bewteen mf6 and + # mf2005 is less than atol + diff = np.abs(qoutflow_mf6 - qoutflow_mf2005) + print(diff) + print(f"max difference is: {diff.max()}") + assert np.allclose(qoutflow_mf6, qoutflow_mf2005, atol=0.15) + + return + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + ) + test.run() diff --git a/autotest/test_swf_dfw_bowl.py b/autotest/test_swf_dfw_bowl.py new file mode 100644 index 00000000000..05d2e72d0bf --- /dev/null +++ b/autotest/test_swf_dfw_bowl.py @@ -0,0 +1,262 @@ +""" + +Test problem designed specifically for the DFW Package. + +The following shows the stream bottom elevations for the +9-cell diffusive wave model. + + _ _ __ bottom elevation = 2. + _| |_ _| |_ __ bottom elevation = 1. +_| |_| |_ __ bottom elevation = 0. +1 2 3 4 5 6 7 8 9 + +""" + +import os + +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +cases = [ + "swf-bowl01", + "swf-bowl02", +] + +inflow_location = ["middle", "left"] + +strt = [0.0, 1, 2, 1, 0, 1, 2, 1, 0.0] # start with dry bowl +# strt = [0.0, 1, 2, 2, 2, 2, 2, 1, 0.] # start bowl filled +reach_bottom = [0.0, 1, 2, 1, 0, 1, 2, 1, 0.0] + + +def build_models(idx, test): + dx = 100.0 + nreach = 9 + nper = 1 + perlen = [86400.0 * 10] # 10 days + nstp = [100] + tsmult = [1.0] + + tdis_rc = [] + for i in range(nper): + tdis_rc.append((perlen[i], nstp[i], tsmult[i])) + + name = "swf" + + # build MODFLOW 6 files + ws = test.workspace + sim = flopy.mf6.MFSimulation( + sim_name=f"{name}_sim", version="mf6", exe_name="mf6", sim_ws=ws + ) + # create tdis package + tdis = flopy.mf6.ModflowTdis( + sim, time_units="SECONDS", nper=nper, perioddata=tdis_rc + ) + + # surface water model + swfname = f"{name}_model" + swf = flopy.mf6.ModflowSwf( + sim, + modelname=swfname, + save_flows=True, + ) + + nouter, ninner = 100, 50 + hclose, rclose, relax = 1e-8, 1e-8, 1.0 + imsswf = flopy.mf6.ModflowIms( + sim, + print_option="SUMMARY", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="DBD", + under_relaxation_theta=0.9, + under_relaxation_kappa=0.0001, + under_relaxation_gamma=0.0, + inner_maximum=ninner, + inner_dvclose=hclose, + linear_acceleration="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + backtracking_number=5, + backtracking_tolerance=1.0, + backtracking_reduction_factor=0.3, + backtracking_residual_limit=100.0, + filename=f"{swfname}.ims", + ) + sim.register_ims_package(imsswf, [swf.name]) + + vertices = [] + vertices = [[j, j * dx, 0.0, 0.0] for j in range(nreach + 1)] + cell2d = [] + for j in range(nreach): + cell2d.append([j, 0.5, 2, j, j + 1]) + nodes = len(cell2d) + nvert = len(vertices) + + disl = flopy.mf6.ModflowSwfdisl( + swf, + nodes=nodes, + nvert=nvert, + reach_length=dx, + reach_bottom=reach_bottom, + idomain=1, + vertices=vertices, + cell2d=cell2d, + ) + + dfw = flopy.mf6.ModflowSwfdfw( + swf, + print_flows=True, + save_flows=True, + width=1.0, + manningsn=0.035, + slope=1 / dx, + idcxs=0, + ) + + # note: for specifying zero-based reach number, put reach number in tuple + fname = f"{swfname}.zdg.obs.csv" + zdg_obs = { + fname: [ + ("OUTFLOW1", "ZDG", (0,)), + ("OUTFLOW9", "ZDG", (nodes - 1,)), + ], + "digits": 10, + } + + idcxs = 0 # use cross section 0 + width = 1.0 + slope = 1.0 / dx + rough = 0.035 + spd = [((nreach - 1,), idcxs, width, slope, rough)] + if inflow_location[idx] == "middle": + spd.append((0, idcxs, width, slope, rough)) + zdg = flopy.mf6.ModflowSwfzdg( + swf, + observations=zdg_obs, + print_input=True, + maxbound=len(spd), + stress_period_data=spd, + ) + + sto = flopy.mf6.ModflowSwfsto( + swf, + save_flows=True, + ) + + ic = flopy.mf6.ModflowSwfic( + swf, + strt=strt, + ) + + xfraction = [0.0, 0.0, 1.0, 1.0] + height = [100.0, 0.0, 0.0, 100.0] + mannfraction = [1.0, 1.0, 1.0, 1.0] + cxsdata = list(zip(xfraction, height, mannfraction)) + cxs = flopy.mf6.ModflowSwfcxs( + swf, + nsections=1, + npoints=4, + packagedata=[(0, 4)], + crosssectiondata=cxsdata, + ) + + # output control + oc = flopy.mf6.ModflowSwfoc( + swf, + budget_filerecord=f"{swfname}.bud", + stage_filerecord=f"{swfname}.stage", + saverecord=[ + ("STAGE", "ALL"), + ("BUDGET", "ALL"), + ], + printrecord=[ + ("STAGE", "ALL"), + ("BUDGET", "ALL"), + ], + ) + + # flw + if inflow_location[idx] == "middle": + inflow_cell = 4 + elif inflow_location[idx] == "left": + inflow_cell = 0 # first cell + else: + raise Exception(f"invalid inflow location {inflow_location[idx]}") + qinflow = dx * 1.0 / 86400.0 + flw = flopy.mf6.ModflowSwfflw( + swf, + maxbound=1, + print_input=True, + print_flows=True, + stress_period_data=[(inflow_cell, qinflow)], + ) + + return sim, None + + +def check_output(idx, test): + print(f"evaluating model for case {idx}...") + + swfname = "swf_model" + + # ensure outflow on left and right is the same + fpth = test.workspace / f"{swfname}.zdg.obs.csv" + obsvals = np.genfromtxt(fpth, names=True, delimiter=",") + diff = obsvals["OUTFLOW1"] - obsvals["OUTFLOW9"] + atol = 1.0e-6 + # This isn't working right now because the obs file is missing an E + # when the numbers are very small. + # if inflow_location[sim.idxsim] == "middle": + # assert np.allclose(diff, 0., atol=atol), f"{diff}" + + # read binary stage file + fpth = test.workspace / f"{swfname}.stage" + sobj = flopy.utils.HeadFile(fpth, precision="double", text="STAGE") + stage_all = sobj.get_alldata() + for kstp, stage in enumerate(stage_all): + print(kstp, stage.flatten()) + + # burned in answer + if inflow_location[idx] == "middle": + stage_answer = [ + 0.00610977, + 1.00848343, + 2.00848545, + 2.00848563, + 2.00848566, + 2.00848563, + 2.00848545, + 1.00848343, + 0.00610977, + ] + elif inflow_location[idx] == "left": + stage_answer = [ + 2.03027679, + 2.03027665, + 2.03027599, + 2.00975688, + 2.00975619, + 2.00975605, + 2.00975535, + 1.00975489, + 0.00928387, + ] + + assert np.allclose(stage_all[-1].flatten(), stage_answer, atol=1.0e-5) + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + ) + test.run() diff --git a/autotest/test_swf_dfw_gwf.py b/autotest/test_swf_dfw_gwf.py new file mode 100644 index 00000000000..2225eec5a46 --- /dev/null +++ b/autotest/test_swf_dfw_gwf.py @@ -0,0 +1,283 @@ +""" + +Simple 3-reach SWF model connected to a simple +3-cell GWF model + + +SWF zero-based diagram below + +o------o------o------o +v0 v1 v2 v3 + r0 r1 r2 + +ia ja +0 0 1 +2 1 0 2 +5 2 1 +7 + +""" + +import os + +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +cases = [ + "swf-gwf01", +] + + +def build_models(idx, test): + + sim_ws = test.workspace + name = cases[idx] + sim = flopy.mf6.MFSimulation( + sim_name=name, + version="mf6", + exe_name="mf6", + sim_ws=sim_ws, + memory_print_option="all", + ) + + tdis = flopy.mf6.ModflowTdis(sim) + ims = flopy.mf6.ModflowIms( + sim, + print_option="all", + linear_acceleration="BICGSTAB", + outer_dvclose=1.0e-12, + inner_dvclose=1.0e-12, + outer_maximum=500, + under_relaxation="simple", + under_relaxation_gamma=0.1, + ) + + add_swf_model(sim) + add_gwf_model(sim) + + swfgwf_data = [ + ((0,), (0, 0, 0), 1.0), + ((1,), (0, 0, 1), 1.0), + ((2,), (0, 0, 2), 1.0), + ] + swfgwf = flopy.mf6.ModflowSwfgwf( + sim, + print_input=True, + print_flows=True, + exgtype="SWF6-GWF6", + nexg=len(swfgwf_data), + exgmnamea="swfmodel", + exgmnameb="gwfmodel", + exchangedata=swfgwf_data, + ) + + return sim, None + + +def add_swf_model(sim): + + name = "swfmodel" + swf = flopy.mf6.ModflowSwf(sim, modelname=name, save_flows=True) + + dx = 1000.0 + nreach = 3 + total_length = dx * nreach + vertices = [] + vertices = [[j, j * dx, 0.0, 0.0] for j in range(nreach + 1)] + cell2d = [] + for j in range(nreach): + cell2d.append([j, 0.5, 2, j, j + 1]) + toreach = [j + 1 for j in range(nreach - 1)] + [-1] + nodes = len(cell2d) + nvert = len(vertices) + + disl = flopy.mf6.ModflowSwfdisl( + swf, + nodes=nodes, + nvert=nvert, + reach_length=dx, + reach_bottom=0.0, + toreach=toreach, # -1 gives 0 in one-based, which means outflow cell + idomain=1, + vertices=vertices, + cell2d=cell2d, + ) + + dfw = flopy.mf6.ModflowSwfdfw( + swf, + print_flows=True, + save_flows=True, + length_conversion=1.0, + time_conversion=86400.0, + width=50.0, + manningsn=0.035, + slope=0.001, + idcxs=0, + ) + + sto = flopy.mf6.ModflowSwfsto( + swf, + save_flows=True, + ) + + ic = flopy.mf6.ModflowSwfic(swf, strt=1.0) + + xfraction = [0.0, 0.0, 1.0, 1.0] + height = [100.0, 0.0, 0.0, 100.0] + mannfraction = [1.0, 1.0, 1.0, 1.0] + cxsdata = list(zip(xfraction, height, mannfraction)) + cxs = flopy.mf6.ModflowSwfcxs( + swf, + nsections=1, + npoints=4, + packagedata=[(0, 4)], + crosssectiondata=cxsdata, + ) + + # output control + oc = flopy.mf6.ModflowSwfoc( + swf, + budget_filerecord=f"{name}.bud", + stage_filerecord=f"{name}.stage", + saverecord=[ + ("STAGE", "ALL"), + ("BUDGET", "ALL"), + ], + printrecord=[ + ("STAGE", "LAST"), + ("BUDGET", "ALL"), + ], + ) + + flw_spd = [ + (0, 100), + ] + maxbound = len(flw_spd) + flw = flopy.mf6.ModflowSwfflw( + swf, + maxbound=maxbound, + print_input=True, + print_flows=True, + stress_period_data=flw_spd, + ) + + chd = flopy.mf6.ModflowSwfchd( + swf, + maxbound=1, + print_input=True, + print_flows=True, + stress_period_data=[(2, 1.0)], + ) + + return + + +def add_gwf_model(sim): + + # create gwf model + name = "gwfmodel" + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=name, + save_flows=True, + ) + + dis = flopy.mf6.ModflowGwfdis( + gwf, + nlay=1, + nrow=1, + ncol=3, + delr=1000.0, + delc=50.0, + top=0.0, + botm=-10.0, + ) + + # initial conditions + ic = flopy.mf6.ModflowGwfic(gwf, strt=-5.0) + + # node property flow + npf = flopy.mf6.ModflowGwfnpf( + gwf, + save_flows=False, + icelltype=1, + k=1.0, + ) + + sto = flopy.mf6.ModflowGwfsto(gwf, sy=0.1, ss=1.0e-5, iconvert=1) + + # chd files + # chd_spd = [(0, 0, 0, 1.0), (0, 0, 2, 1.0)] + # chd = flopy.mf6.modflow.mfgwfchd.ModflowGwfchd( + # gwf, + # maxbound=len(chd_spd), + # stress_period_data=chd_spd, + # pname="CHD-1", + # ) + + # output control + oc = flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord=f"{name}.cbc", + head_filerecord=f"{name}.hds", + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + printrecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + ) + + +def check_output(idx, test): + print("evaluating model...") + + # assign name + name = "swfmodel" + + # read the binary grid file + fpth = test.workspace / f"{name}.disl.grb" + grb = flopy.mf6.utils.MfGrdFile(fpth) + ia = grb.ia + ja = grb.ja + assert ia.shape[0] == grb.nodes + 1, "ia in grb file is not correct size" + + # read stage file + fpth = test.workspace / f"{name}.stage" + qobj = flopy.utils.HeadFile(fpth, precision="double", text="STAGE") + stage = qobj.get_alldata() + + # read the budget file + fpth = test.workspace / f"{name}.bud" + budobj = flopy.utils.binaryfile.CellBudgetFile(fpth) + flowja = budobj.get_data(text="FLOW-JA-FACE")[0].flatten() + qstorage = budobj.get_data(text="STORAGE") + qflw = budobj.get_data(text="FLW") + qchd = budobj.get_data(text="CHD") + qresidual = np.zeros(grb.nodes) + nodes = ia.shape[0] - 1 + for n in range(nodes): + qresidual[n] = flowja[ia[n]] + + print(budobj.list_records()) + print(f"flowja: {flowja}") + print(f"qstorage: {qstorage}") + print(f"qchd: {qchd}") + print(f"qflw: {qflw}") + print(f"qresidual: {qresidual}") + + assert np.allclose(qresidual, 0.0, atol=1.0e-3), "Flowja residual > 1.e-3" + + return + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + ) + test.run() diff --git a/autotest/test_swf_dfw_loop.py b/autotest/test_swf_dfw_loop.py new file mode 100644 index 00000000000..08c08bf4c6f --- /dev/null +++ b/autotest/test_swf_dfw_loop.py @@ -0,0 +1,491 @@ +""" + +Loop network problem from SWR Manual (Problem 4) + +""" + +import os + +import flopy +import numpy as np +import pytest + +from conftest import project_root_path +from framework import TestFramework + +cases = [ + "swf-dfw-loop", +] + +data_path = project_root_path / "autotest/data/swr04/" +fpth = data_path / "SWRSample04_Stage.csv.cmp" +answer = np.genfromtxt(fpth, names=True, delimiter=",") +print(answer) + +fpth = data_path / "SWRFlows.csv.cmp" +answer_flow = np.genfromtxt(fpth, names=True, delimiter=",") +print(answer_flow) + + +def build_models(idx, test): + + sim_ws = test.workspace + name = cases[idx] + sim = flopy.mf6.MFSimulation( + sim_name=name, + version="mf6", + exe_name="mf6", + sim_ws=sim_ws, + memory_print_option="all", + ) + + tdis = flopy.mf6.ModflowTdis( + sim, nper=1, perioddata=[(604800.0, 336, 1.0)], time_units="SECONDS" + ) + ims = flopy.mf6.ModflowIms( + sim, + outer_maximum=100, + inner_maximum=50, + print_option="all", + outer_dvclose=1.0e-6, + inner_dvclose=1.0e-6, + linear_acceleration="BICGSTAB", + backtracking_number=5, + backtracking_tolerance=1.0, + backtracking_reduction_factor=0.3, + backtracking_residual_limit=100.0, + ) + swf = flopy.mf6.ModflowSwf( + sim, + modelname=name, + save_flows=True, + ) + + vertices = [ + [0, 500.0, 6000.0, 0.0], + [1, 500.0, 5000.0, 0.0], + [2, 500.0, 4500.0, 0.0], + [3, 1000.0, 4500.0, 0.0], + [4, 2000.0, 4500.0, 0.0], + [5, 3000.0, 4500.0, 0.0], + [6, 3500.0, 4500.0, 0.0], + [7, 3500.0, 4000.0, 0.0], + [8, 3500.0, 3000.0, 0.0], + [9, 3500.0, 2500.0, 0.0], + [10, 3500.0, 2000.0, 0.0], + [11, 3500.0, 1000.0, 0.0], + [12, 3500.0, 500.0, 0.0], + [13, 4000.0, 500.0, 0.0], + [14, 5000.0, 500.0, 0.0], + [15, 6000.0, 500.0, 0.0], + [16, 500.0, 4000.0, 0.0], + [17, 1000.0, 3000.0, 0.0], + [18, 2000.0, 2500.0, 0.0], + [19, 3000.0, 2500.0, 0.0], + ] + + cell2d = [ + [0, 0.5, 2, 0, 1], + [1, 0.5, 2, 1, 2], + [2, 0.5, 2, 2, 3], + [3, 0.5, 2, 3, 4], + [4, 0.5, 2, 4, 5], + [5, 0.5, 3, 5, 6, 7], + [6, 0.5, 2, 7, 8], + [7, 0.5, 2, 8, 9], + [8, 0.5, 2, 2, 16], + [9, 0.5, 2, 16, 17], + [10, 0.5, 2, 17, 18], + [11, 0.5, 2, 18, 19], + [12, 0.5, 2, 19, 9], + [13, 0.5, 2, 9, 10], + [14, 0.5, 2, 10, 11], + [15, 0.5, 3, 11, 12, 13], + [16, 0.5, 2, 13, 14], + [17, 0.5, 2, 14, 15], + ] + + toreach = [1, 2, 3, 4, 5, 6, 7, 13, 9, 10, 11, 12, 13, 14, 15, 16, 17, -1] + + reach_length = [ + 1000.0, + 500.0, + 500.0, + 1000.0, + 1000.0, + 1000.0, + 1000.0, + 500.0, + 500.0, + 1118.0, + 1118.0, + 1000.0, + 500.0, + 500.0, + 1000.0, + 1000.0, + 1000.0, + 1000.0, + ] + + width = [ + 10.0, + 10.0, + 20.0, + 20.0, + 20.0, + 20.0, + 20.0, + 20.0, + 10.0, + 10.0, + 10.0, + 10.0, + 10.0, + 15.0, + 15.0, + 15.0, + 15.0, + 15.0, + ] + + reach_bottom = [ + 2.0, + 1.83, + 1.83, + 1.67, + 1.50, + 1.33, + 1.17, + 1.0, + 1.83, + 1.65, + 1.41, + 1.17, + 1.0, + 1.0, + 0.75, + 0.50, + 0.25, + 0.0, + ] + + idcxs = [ + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 2, + 2, + 2, + 2, + 2, + ] + + # time, reach1, reach5 (cms) + reach_inflow = [ + (0, 0, 0), + (3600, 0, 0), + (7200, 0, 0), + (10800, 0.002, 0), + (14400, 0.01, 0), + (18000, 0.05, 0), + (21600, 0.2, 0), + (25200, 0.671, 0), + (28800, 1.868, 0), + (32400, 4.315, 0), + (36000, 8.277, 0), + (39600, 13.183, 0), + (43200, 17.4232, 0), + (46800, 19.1223, 0.002), + (50400, 17.423, 0.079), + (54000, 13.18, 1.199), + (57600, 8.277, 8.313), + (61200, 4.315, 26.486), + (64800, 1.868, 38.952), + (68400, 0.671, 26.486), + (72000, 0.2, 8.313), + (75600, 0.05, 1.199), + (79200, 0.01, 0.079), + (82800, 0.002, 0.002), + (86400, 0, 0), + (604800, 0, 0), + (608400, 0, 0), + ] + + nodes = len(cell2d) + nvert = len(vertices) + + disl = flopy.mf6.ModflowSwfdisl( + swf, + nodes=nodes, + nvert=nvert, + reach_length=reach_length, + reach_bottom=reach_bottom, + # toreach=toreach, # -1 gives 0 in one-based, which means outflow cell + idomain=1, + vertices=vertices, + cell2d=cell2d, + ) + + stage0 = np.array(14 * [3] + 4 * [2]) + ic = flopy.mf6.ModflowSwfic(swf, strt=stage0) + + dfw = flopy.mf6.ModflowSwfdfw( + swf, + central_in_space=True, + print_flows=True, + save_flows=True, + width=1.0, # cross sections defined explicitly (not fractions) + manningsn=0.03, + slope=0.001, + idcxs=idcxs, + ) + + sto = flopy.mf6.ModflowSwfsto( + swf, + save_flows=True, + ) + + xfraction = ( + [0.0, 10.0, 20.0, 30.0] + + [0, 20.0, 40.0, 60.0] + + [0.0, 15.0, 30.0, 45.0] + ) + height = ( + [10.0, 0.0, 0.0, 10.0] + + [20.0, 0.0, 0.0, 20.0] + + [15.0, 0.0, 0.0, 15.0] + ) + mannfraction = ( + [1.0, 1.0, 1.0, 1.0] + [1.0, 1.0, 1.0, 1.0] + [1.0, 1.0, 1.0, 1.0] + ) + + cxsdata = list(zip(xfraction, height, mannfraction)) + cxs = flopy.mf6.ModflowSwfcxs( + swf, + nsections=3, + npoints=4 * 3, + packagedata=[(0, 4), (1, 4), (2, 4)], + crosssectiondata=cxsdata, + ) + + # output control + oc = flopy.mf6.ModflowSwfoc( + swf, + budget_filerecord=f"{name}.bud", + stage_filerecord=f"{name}.stage", + saverecord=[ + ("STAGE", "ALL"), + ("BUDGET", "ALL"), + ], + printrecord=[ + ("STAGE", "LAST"), + ("BUDGET", "ALL"), + ], + ) + + flwlist = [ + [(0,), "reach1"], + [(4,), "reach5"], + ] + flw = flopy.mf6.ModflowSwfflw( + swf, + maxbound=len(flwlist), + print_input=True, + print_flows=True, + stress_period_data=flwlist, + ) + + filename = name + ".flw.ts" + time_series_namerecord = [("reach1", "reach5")] + interpolation_methodrecord = [("linearend", "linearend")] + flw.ts.initialize( + filename=filename, + timeseries=reach_inflow, + time_series_namerecord=time_series_namerecord, + interpolation_methodrecord=interpolation_methodrecord, + ) + + chd = flopy.mf6.ModflowSwfchd( + swf, + maxbound=1, + print_input=True, + print_flows=True, + stress_period_data=[(17, 2.0)], + ) + + obs_data = { + f"{name}.obs.csv": [ + ("REACH1", "STAGE", (0,)), + ("REACH4", "STAGE", (3,)), + ("REACH5", "STAGE", (4,)), + ("REACH14", "STAGE", (13,)), + ("REACH15", "STAGE", (14,)), + ("REACH18", "STAGE", (17,)), + ("FLOW45", "FLOW-JA-FACE", (3,), (4,)), + ("FLOW56", "FLOW-JA-FACE", (4,), (5,)), + ], + } + obs_package = flopy.mf6.ModflowUtlobs( + swf, + filename=f"{name}.obs", + digits=10, + print_input=True, + continuous=obs_data, + ) + + return sim, None + + +def make_plot(test): + print("making plots...") + import matplotlib.pyplot as plt + + name = test.name + ws = test.workspace + mfsim = flopy.mf6.MFSimulation.load(sim_ws=ws) + swf = mfsim.get_model(name) + + fpth = test.workspace / f"{name}.obs.csv" + obsvals = np.genfromtxt(fpth, names=True, delimiter=",") + + fig = plt.figure(figsize=(10, 10)) + ax = fig.add_subplot(1, 1, 1) + for irch in [1, 4, 15, 18]: + ax.plot( + obsvals["time"], + obsvals[f"REACH{irch}"], + marker="o", + mfc="none", + mec="k", + lw=0.0, + label=f"MF6 reach {irch}", + ) + ax.plot( + obsvals["time"], + answer[f"STAGE00000000{irch:02d}"], + "k-", + label=f"SWR Reach {irch}", + ) + ax.set_xscale("log") + plt.xlabel("time, in seconds") + plt.ylabel("stage, in meters") + plt.legend() + fname = ws / f"{name}.obs.1.png" + plt.savefig(fname) + + fig = plt.figure(figsize=(10, 10)) + ax = fig.add_subplot(1, 1, 1) + ax.plot( + obsvals["time"], + obsvals["FLOW45"], + marker="o", + mfc="none", + mec="b", + lw=0.0, + label="MF6 Gauge 4", + ) + ax.plot( + obsvals["time"], + obsvals["FLOW56"], + marker="o", + mfc="none", + mec="g", + lw=0.0, + label="MF6 Gauge 5", + ) + ax.plot( + answer_flow["TOTIME"], answer_flow["FLOW45"], "b-", label="SWR Gauge 4" + ) + ax.plot( + answer_flow["TOTIME"], answer_flow["FLOW56"], "g-", label="SWR Gauge 5" + ) + # ax.plot(obsvals["time"], answer["STAGE0000000014"], marker="o", mfc="none", mec="k", lw=0., label="swr") + ax.set_xscale("log") + plt.xlabel("time, in seconds") + plt.ylabel("flow, in cubic meters per second") + plt.legend() + fname = ws / f"{name}.obs.2.png" + plt.savefig(fname) + + return + + +def check_output(idx, test): + print("evaluating model...") + + makeplot = False + if makeplot: + make_plot(test) + + # read the observation output + name = cases[idx] + fpth = test.workspace / f"{name}.obs.csv" + obsvals = np.genfromtxt(fpth, names=True, delimiter=",") + + diff = obsvals["REACH14"] - answer["STAGE0000000014"] + print(diff) + print(diff.max(), diff.min()) + assert np.allclose( + diff, 0.0, atol=0.0035 + ), f"Max diff with sfr is {diff.min(), diff.max()}" + + # read the binary grid file + fpth = test.workspace / f"{name}.disl.grb" + grb = flopy.mf6.utils.MfGrdFile(fpth) + ia = grb.ia + assert ia.shape[0] == grb.nodes + 1, "ia in grb file is not correct size" + + # read stage file + fpth = test.workspace / f"{name}.stage" + qobj = flopy.utils.HeadFile(fpth, precision="double", text="STAGE") + stage = qobj.get_alldata() + + # read the budget file + fpth = test.workspace / f"{name}.bud" + budobj = flopy.utils.binaryfile.CellBudgetFile(fpth) + flowja = budobj.get_data(text="FLOW-JA-FACE") + qstorage = budobj.get_data(text="STORAGE") + qflw = budobj.get_data(text="FLW") + qextoutflow = budobj.get_data(text="CHD") + + # check budget terms + for itime in range(len(flowja)): + print(f"evaluating timestep {itime}") + + fja = flowja[itime].flatten() + qresidual = fja[ia[:-1]] + atol = 0.03 + for n in range(grb.nodes): + passfail = "FAIL" if abs(qresidual[n]) > atol else "" + print( + f"residual for cell {n + 1} is {qresidual[n]} " + f"in position {ia[n] + 1} {passfail}" + ) + assert np.allclose( + qresidual, 0.0, atol=atol + ), f"residual in flowja diagonal is not zero" + + return + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + ) + test.run() diff --git a/autotest/test_swf_dfw_swrt2.py b/autotest/test_swf_dfw_swrt2.py new file mode 100644 index 00000000000..965aa066107 --- /dev/null +++ b/autotest/test_swf_dfw_swrt2.py @@ -0,0 +1,237 @@ +""" + +SWR Test Problem 2 simulates two-dimensional overland flow using +a grid of rows and columns. The SWR code was compared with results +from SWIFT2D, a USGS 2D overland flow simulator. Because the DFW +Package in MF6 presently works only with the DISL Package, it cannot +represent flow on a grid, so it is used here to simulate a one- +dimensional version of this same problem. The problem is set up +so that once steady conditions are achieved, the depth in each reach +should be 1.0 m. + +""" + +import os + +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +cases = [ + "swf-swr-t2", +] + + +def build_models(idx, test): + dx = 500.0 + nreach = 11 + nper = 1 + perlen = [5040 * 2 * 60.0] # 7 days (in seconds) + nstp = [50] # In SWR report nstp = [5040] and tsmult is 1. + tsmult = [1.2] + + tdis_rc = [] + for i in range(nper): + tdis_rc.append((perlen[i], nstp[i], tsmult[i])) + + name = "swf" + + # build MODFLOW 6 files + ws = test.workspace + sim = flopy.mf6.MFSimulation( + sim_name=f"{name}_sim", version="mf6", exe_name="mf6", sim_ws=ws + ) + # create tdis package + tdis = flopy.mf6.ModflowTdis( + sim, time_units="SECONDS", nper=nper, perioddata=tdis_rc + ) + + # surface water model + swfname = f"{name}_model" + swf = flopy.mf6.ModflowSwf(sim, modelname=swfname, save_flows=True) + + nouter, ninner = 100, 50 + hclose, rclose, relax = 1e-8, 1e-8, 1.0 + imsswf = flopy.mf6.ModflowIms( + sim, + print_option="SUMMARY", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="DBD", + under_relaxation_theta=0.9, + under_relaxation_kappa=0.0001, + under_relaxation_gamma=0.0, + inner_maximum=ninner, + inner_dvclose=hclose, + linear_acceleration="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + backtracking_number=5, + backtracking_tolerance=1.0, + backtracking_reduction_factor=0.3, + backtracking_residual_limit=100.0, + filename=f"{swfname}.ims", + ) + sim.register_ims_package(imsswf, [swf.name]) + + vertices = [] + vertices = [[j, j * dx, 0.0, 0.0] for j in range(nreach + 1)] + cell2d = [] + for j in range(nreach): + cell2d.append([j, 0.5, 2, j, j + 1]) + nodes = len(cell2d) + nvert = len(vertices) + + reach_bottom = np.linspace(1.05, 0.05, nreach) + + disl = flopy.mf6.ModflowSwfdisl( + swf, + nodes=nodes, + nvert=nvert, + reach_length=dx, + reach_bottom=reach_bottom, + idomain=1, + vertices=vertices, + cell2d=cell2d, + ) + + dfw = flopy.mf6.ModflowSwfdfw( + swf, + print_flows=True, + save_flows=True, + width=dx, + manningsn=0.30, + slope=0.05 / 500.0, + idcxs=None, + ) + + sto = flopy.mf6.ModflowSwfsto( + swf, + save_flows=True, + ) + + ic = flopy.mf6.ModflowSwfic( + swf, + strt=2.05, + ) + + # output control + oc = flopy.mf6.ModflowSwfoc( + swf, + budget_filerecord=f"{swfname}.bud", + stage_filerecord=f"{swfname}.stage", + saverecord=[ + ("STAGE", "ALL"), + ("BUDGET", "ALL"), + ], + printrecord=[ + ("STAGE", "ALL"), + ("BUDGET", "ALL"), + ], + ) + + # flw + inflow_reach = 0 + qinflow = 23.570 + flw = flopy.mf6.ModflowSwfflw( + swf, + maxbound=1, + print_input=True, + print_flows=True, + stress_period_data=[(inflow_reach, qinflow)], + ) + + chd = flopy.mf6.ModflowSwfchd( + swf, + maxbound=1, + print_input=True, + print_flows=True, + stress_period_data=[(nreach - 1, 1.05)], + ) + + obs_data = { + f"{swfname}.obs.csv": [ + ("OBS1", "STAGE", (1,)), + ("OBS2", "STAGE", (5,)), + ("OBS3", "STAGE", (8,)), + ], + } + obs_package = flopy.mf6.ModflowUtlobs( + swf, + filename=f"{swfname}.obs", + digits=10, + print_input=True, + continuous=obs_data, + ) + + return sim, None + + +def make_plot(test, mfsim): + print("making plots...") + import matplotlib.pyplot as plt + + fpth = test.workspace / f"swf_model.obs.csv" + obsvals = np.genfromtxt(fpth, names=True, delimiter=",") + + fig = plt.figure(figsize=(10, 10)) + ax = fig.add_subplot(1, 1, 1) + for irch in [1, 2, 3]: + ax.plot( + obsvals["time"] / 3600.0, + obsvals[f"OBS{irch}"], + marker="o", + mfc="none", + mec="k", + lw=0.0, + label=f"MF6 reach {irch}", + ) + # ax.plot(obsvals["time"], answer[f"STAGE00000000{irch:02d}"], "k-", label=f"SWR Reach {irch}") + ax.set_xlim(0, 30.0) + ax.set_ylim(1.2, 2.4) + plt.xlabel("time, in hours") + plt.ylabel("stage, in meters") + plt.legend() + fname = test.workspace / "swf_model.obs.1.png" + plt.savefig(fname) + + return + + +def check_output(idx, test): + print(f"evaluating model for case {idx}...") + + swfname = "swf_model" + ws = test.workspace + mfsim = flopy.mf6.MFSimulation.load(sim_ws=ws) + + makeplot = False + if makeplot: + make_plot(test, mfsim) + + # read binary stage file + fpth = test.workspace / f"{swfname}.stage" + sobj = flopy.utils.HeadFile(fpth, precision="double", text="STAGE") + stage_all = sobj.get_alldata() + + # at end of simulation, water depth should be 1.0 for all reaches + swf = mfsim.get_model(swfname) + depth = stage_all[-1] - swf.disl.reach_bottom.array + np.allclose( + depth, 1.0 + ), f"Simulated depth at end should be 1, but found {depth}" + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + ) + test.run() diff --git a/autotest/test_swf_dfw_swrt2b.py b/autotest/test_swf_dfw_swrt2b.py new file mode 100644 index 00000000000..47550a30d0f --- /dev/null +++ b/autotest/test_swf_dfw_swrt2b.py @@ -0,0 +1,249 @@ +""" + +Same as test_swf_dfw_swr2.py except this one uses +the adaptive time stepping (ATS). + +""" + +import os + +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +cases = [ + "swf-swr-t2b", +] + + +def build_models(idx, test): + dx = 500.0 + nreach = 11 + nper = 1 + perlen = [5040 * 2 * 60.0] # 7 days (in seconds) + nstp = [50] # In SWR report nstp = [5040] and tsmult is 1. + tsmult = [1.2] + + tdis_rc = [] + for i in range(nper): + tdis_rc.append((perlen[i], nstp[i], tsmult[i])) + + name = "swf" + + # build MODFLOW 6 files + ws = test.workspace + sim = flopy.mf6.MFSimulation( + sim_name=f"{name}_sim", version="mf6", exe_name="mf6", sim_ws=ws + ) + # create tdis package + tdis = flopy.mf6.ModflowTdis( + sim, time_units="SECONDS", nper=nper, perioddata=tdis_rc + ) + + # set dt0, dtmin, dtmax, dtadj, dtfailadj + dt0 = 60 * 60.0 * 24.0 # 24 hours + dtmin = 1.0 * 60.0 # 1 minute + dtmax = 60 * 60.0 * 24.0 # 24 hours + dtadj = 2.0 + dtfailadj = 5.0 + ats_filerecord = name + ".ats" + atsperiod = [ + (0, dt0, dtmin, dtmax, dtadj, dtfailadj), + ] + tdis.ats.initialize( + maxats=len(atsperiod), + perioddata=atsperiod, + filename=ats_filerecord, + ) + + # surface water model + swfname = f"{name}_model" + swf = flopy.mf6.ModflowSwf(sim, modelname=swfname, save_flows=True) + + nouter, ninner = 10, 50 + hclose, rclose, relax = 1e-8, 1e-8, 1.0 + imsswf = flopy.mf6.ModflowIms( + sim, + print_option="SUMMARY", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="DBD", + under_relaxation_theta=0.9, + under_relaxation_kappa=0.0001, + under_relaxation_gamma=0.0, + inner_maximum=ninner, + inner_dvclose=hclose, + linear_acceleration="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + # backtracking_number=5, + # backtracking_tolerance=1.0, + # backtracking_reduction_factor=0.3, + # backtracking_residual_limit=100.0, + filename=f"{swfname}.ims", + ) + sim.register_ims_package(imsswf, [swf.name]) + + vertices = [] + vertices = [[j, j * dx, 0.0, 0.0] for j in range(nreach + 1)] + cell2d = [] + for j in range(nreach): + cell2d.append([j, 0.5, 2, j, j + 1]) + nodes = len(cell2d) + nvert = len(vertices) + + reach_bottom = np.linspace(1.05, 0.05, nreach) + + disl = flopy.mf6.ModflowSwfdisl( + swf, + nodes=nodes, + nvert=nvert, + reach_length=dx, + reach_bottom=reach_bottom, + idomain=1, + vertices=vertices, + cell2d=cell2d, + ) + + dfw = flopy.mf6.ModflowSwfdfw( + swf, + print_flows=True, + save_flows=True, + width=dx, + manningsn=0.30, + slope=0.05 / 500.0, + idcxs=None, + ) + + sto = flopy.mf6.ModflowSwfsto( + swf, + save_flows=True, + ) + + ic = flopy.mf6.ModflowSwfic( + swf, + strt=2.05, + ) + + # output control + oc = flopy.mf6.ModflowSwfoc( + swf, + budget_filerecord=f"{swfname}.bud", + stage_filerecord=f"{swfname}.stage", + saverecord=[ + ("STAGE", "ALL"), + ("BUDGET", "ALL"), + ], + printrecord=[ + ("STAGE", "ALL"), + ("BUDGET", "ALL"), + ], + ) + + # flw + inflow_reach = 0 + qinflow = 23.570 + flw = flopy.mf6.ModflowSwfflw( + swf, + maxbound=1, + print_input=True, + print_flows=True, + stress_period_data=[(inflow_reach, qinflow)], + ) + + chd = flopy.mf6.ModflowSwfchd( + swf, + maxbound=1, + print_input=True, + print_flows=True, + stress_period_data=[(nreach - 1, 1.05)], + ) + + obs_data = { + f"{swfname}.obs.csv": [ + ("OBS1", "STAGE", (1,)), + ("OBS2", "STAGE", (5,)), + ("OBS3", "STAGE", (8,)), + ], + } + obs_package = flopy.mf6.ModflowUtlobs( + swf, + filename=f"{swfname}.obs", + digits=10, + print_input=True, + continuous=obs_data, + ) + + return sim, None + + +def make_plot(test, mfsim): + print("making plots...") + import matplotlib.pyplot as plt + + fpth = test.workspace / f"swf_model.obs.csv" + obsvals = np.genfromtxt(fpth, names=True, delimiter=",") + + fig = plt.figure(figsize=(10, 10)) + ax = fig.add_subplot(1, 1, 1) + for irch in [1, 2, 3]: + ax.plot( + obsvals["time"] / 3600.0, + obsvals[f"OBS{irch}"], + marker="o", + mfc="none", + mec="k", + lw=0.0, + label=f"MF6 reach {irch}", + ) + # ax.plot(obsvals["time"], answer[f"STAGE00000000{irch:02d}"], "k-", label=f"SWR Reach {irch}") + ax.set_xlim(0, 30.0) + ax.set_ylim(1.2, 2.4) + plt.xlabel("time, in hours") + plt.ylabel("stage, in meters") + plt.legend() + fname = test.workspace / "swf_model.obs.1.png" + plt.savefig(fname) + + return + + +def check_output(idx, test): + print(f"evaluating model for case {idx}...") + + swfname = "swf_model" + ws = test.workspace + mfsim = flopy.mf6.MFSimulation.load(sim_ws=ws) + + makeplot = False + if makeplot: + make_plot(test, mfsim) + + # read binary stage file + fpth = test.workspace / f"{swfname}.stage" + sobj = flopy.utils.HeadFile(fpth, precision="double", text="STAGE") + stage_all = sobj.get_alldata() + # for kstp, stage in enumerate(stage_all): + # print(kstp, stage.flatten()) + + # at end of simulation, water depth should be 1.0 for all reaches + swf = mfsim.get_model(swfname) + depth = stage_all[-1] - swf.disl.reach_bottom.array + np.allclose( + depth, 1.0 + ), f"Simulated depth at end should be 1, but found {depth}" + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + ) + test.run() diff --git a/doc/Common/swf-obs.tex b/doc/Common/swf-obs.tex new file mode 100644 index 00000000000..de8d60d160b --- /dev/null +++ b/doc/Common/swf-obs.tex @@ -0,0 +1,2 @@ +SWF & stage & cellid & -- & Stage at a specified cell. \\ +SWF & flow-ja-face & cellid & cellid & Surface water flow in dimensions of length cubed per time between two adjacent cells. \ No newline at end of file diff --git a/doc/Common/swf-obstypetable.tex b/doc/Common/swf-obstypetable.tex new file mode 100644 index 00000000000..a2db6bd81aa --- /dev/null +++ b/doc/Common/swf-obstypetable.tex @@ -0,0 +1,83 @@ + +\begingroup +\makeatletter +\ifx\LT@ii\@undefined\else +\def\LT@entry#1#2{\noexpand\LT@entry{-#1}{#2}} +\xdef\LT@i{\LT@ii} +\fi +\endgroup + +% model observations +\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +\caption{Available observation types for the SWF Model} \tabularnewline + +\hline +\hline +\textbf{Model} & \textbf{Observation types} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endfirsthead + +\captionsetup{textformat=simple} +\caption*{\textbf{Table \arabic{table}.}{\quad}List of symbols used in this report.---Continued} \\ + +\hline +\hline +\textbf{Model} & \textbf{Observation types} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endhead + +\hline +\endfoot + +\input{../Common/swf-obs.tex} +\end{longtable} +\addtocounter{table}{-1} + +% stress packages +\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +\hline +\hline +\textbf{Stress Package} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endfirsthead + +\captionsetup{textformat=simple} +\caption*{\textbf{Table \arabic{table}.}{\quad}Available SWF observation types.---Continued} \\ + +\hline +\hline +\textbf{Stress Package} & \textbf{Observation types} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endhead + +\hline +\endfoot + +\label{table:swf-obstypetable} +\end{longtable} +\addtocounter{table}{-1} + +% exchange +\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +\hline +\hline +\textbf{Exchange} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endfirsthead + +\captionsetup{textformat=simple} +\caption*{\textbf{Table \arabic{table}.}{\quad}Available SWF observation types.---Continued} \\ + +\hline +\hline +\textbf{Exchange} & \textbf{Observation types} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endhead + +\hline +\endfoot + +\input{../Common/swf-swfobs.tex} +\end{longtable} + +\normalsize diff --git a/doc/Common/swf-swfobs.tex b/doc/Common/swf-swfobs.tex new file mode 100644 index 00000000000..e9bc35f9495 --- /dev/null +++ b/doc/Common/swf-swfobs.tex @@ -0,0 +1 @@ +SWF-SWF & flow-ja-face & exchange number or boundname & -- & Flow between model 1 and model 2 for a specified exchange (which is the consecutive exchange number listed in the EXCHANGEDATA block), or the sum of these exchange flows by boundname if boundname is specified. \ No newline at end of file diff --git a/doc/mf6io/body.tex b/doc/mf6io/body.tex index b3da3ed0042..0c3f69808d1 100644 --- a/doc/mf6io/body.tex +++ b/doc/mf6io/body.tex @@ -50,6 +50,11 @@ \SECTION{Groundwater Energy Transport (GWE) Model Input} \input{gwe/gwe.tex} +%SWF Model Input Instructions +\newpage +\SECTION{Surface Water Flow (SWF) Model Input} +\input{swf/swf.tex} + %Sparse Matrix Solution (IMS) \newpage \SECTION{Iterative Model Solution} diff --git a/doc/mf6io/mf6io.bbl b/doc/mf6io/mf6io.bbl index 9fb5b05f2a4..9a3a5427419 100644 --- a/doc/mf6io/mf6io.bbl +++ b/doc/mf6io/mf6io.bbl @@ -1,8 +1,8 @@ -\begin{thebibliography}{35} +\begin{thebibliography}{41} \providecommand{\natexlab}[1]{#1} \expandafter\ifx\csname urlstyle\endcsname\relax - \providecommand{\doiagency}[1]{doi:\discretionary{}{}{}#1}\else - \providecommand{\doiagency}{doi:\discretionary{}{}{}\begingroup + \providecommand{\doi}[1]{doi:\discretionary{}{}{}#1}\else + \providecommand{\doi}{doi:\discretionary{}{}{}\begingroup \urlstyle{rm}\Url}\fi \bibitem[{Anderman and Hill(2000)}]{anderman2000modflow} @@ -19,10 +19,10 @@ Anderman, E.R., and Hill, M.C., 2003, MODFLOW-2000, the U.S. Geological Survey \bibitem[{Bakker and others(2013)Bakker, Schaars, Hughes, Langevin, and Dausman}]{bakker2013documentation} -Bakker, M., Schaars, F., Hughes, J.D., Langevin, C.D., and Dausman, A.M., 2013, - Documentation of the seawater intrusion (SWI2) package for MODFLOW: {U.S. - Geological Survey Techniques and Methods, book 6, chap. A46, 47 p.}, accessed - June 27, 2017, at \url{https://pubs.er.usgs.gov/publication/tm6A46}. +Bakker, Mark, Schaars, Frans, Hughes, J.D., Langevin, C.D., and Dausman, A.M., + 2013, Documentation of the seawater intrusion (SWI2) package for MODFLOW: + {U.S. Geological Survey Techniques and Methods, book 6, chap. A46, 47 p.}, + accessed June 27, 2017, at \url{https://pubs.er.usgs.gov/publication/tm6A46}. \bibitem[{Banta(2000)}]{modflowdrtpack} Banta, E.R., 2000, MODFLOW-2000, the U.S. Geological Survey Modular @@ -36,6 +36,14 @@ Banta, E.R., 2011, MODFLOW-CDSS, a version of MODFLOW-2005 with modifications Report 2011--1213, 19 p.}, accessed June 27, 2017, at \url{https://pubs.er.usgs.gov/publication/ofr20111213}. +\bibitem[{Bedekar and others(2016)Bedekar, Morway, Langevin, and + Tonkin}]{mt3dusgs} +Bedekar, Vivek, Morway, E.D., Langevin, C.D., and Tonkin, M.J., 2016, MT3D-USGS + version 1: A U.S. Geological Survey release of MT3DMS updated with new and + expanded transport capabilities for use with MODFLOW: {U.S. Geological Survey + Techniques and Methods, book 6, chap. A53, 69 p.}, + \url{https://doi.org/10.3133/tm6a53}, \url{http://dx.doi.org/10.3133/tm6A53}. + \bibitem[{Fenske and others(1996)Fenske, Leake, and Prudic}]{fenske1996documentation} Fenske, J.P., Leake, S.A., and Prudic, D.E., 1996, Documentation of a computer @@ -64,6 +72,14 @@ Harbaugh, A.W., 2005, MODFLOW-2005, the U.S. Geological Survey modular Techniques and Methods, book 6, chap. A16, variously paged}, accessed June 27, 2017, at \url{https://pubs.usgs.gov/tm/2005/tm6A16/}. +\bibitem[{Healy and Ronan(1996)}]{healy1996} +Healy, R.W., and Ronan, A.D., 1996, Documentation of Computer Program VS2DH for + Simulation of Energy Transport in Variably Saturated Porous Media: + Modification of the U.S. Geological Survey's Computer Program VS2DT: {U.S. + Geological Survey Water-Resources Investigation Report 96-4230, 36 p.}, + accessed September 27, 2022, at \url{https://doi.org/10.3133/wri964230}, at + \url{https://pubs.usgs.gov/wri/1996/4230/report.pdf}. + \bibitem[{Hecht-Mendez and others(2010)Hecht-Mendez, Molina-Giraldo, Blum, and Bayer}]{hechtmendez} Hecht-Mendez, J., Molina-Giraldo, N., Blum, P., and Bayer, P., 2010, Evaluating @@ -87,10 +103,10 @@ Hill, M.C., Banta, E.R., Harbaugh, A.W., and Anderman, E.R., 2000, \bibitem[{Hoffmann and others(2003)Hoffmann, Leake, Galloway, and Wilson}]{hoffmann2003modflow} -Hoffmann, J., Leake, S.A., Galloway, D.L., and Wilson, A.M., 2003, MODFLOW-2000 - Ground-Water Model---User Guide to the Subsidence and Aquifer-System - Compaction (SUB) Package: {U.S. Geological Survey Open-File Report 03--233, - 44 p.}, accessed June 27, 2017, at +Hoffmann, J{\"o}rn, Leake, S.A., Galloway, D.L., and Wilson, A.M., 2003, + MODFLOW-2000 Ground-Water Model---User Guide to the Subsidence and + Aquifer-System Compaction (SUB) Package: {U.S. Geological Survey Open-File + Report 03--233, 44 p.}, accessed June 27, 2017, at \url{https://pubs.usgs.gov/of/2003/ofr03-233/}. \bibitem[{Hsieh and Freckleton(1993)}]{hsieh1993hfb} @@ -120,7 +136,7 @@ Hughes, J.D., Langevin, C.D., and Banta, E.R., 2017, Documentation for the Hughes, J.D., Russcher, M.J., Langevin, C.D., Morway, E.D., and McDonald, R.R., 2022{\natexlab{a}}, The {MODFLOW Application Programming Interface} for simulation control and software interoperability: Environmental Modelling \& - Software, v. 148, article 105257, + Software, v. 148, 105257, \url{https://doi.org/10.1016/j.envsoft.2021.105257}. \bibitem[{Hughes and others(2022{\natexlab{b}})Hughes, Leake, Galloway, and @@ -130,6 +146,12 @@ Hughes, J.D., Leake, S.A., Galloway, D.L., and White, J.T., 2022{\natexlab{b}}, Package of MODFLOW 6: {U.S. Geological Survey Techniques and Methods, book 6, chap. A62, 57 p.}, \url{https://doi.org/10.3133/tm6A62}. +\bibitem[{Kipp(1987)}]{kipp1987} +Kipp, K.L., 1987, HST3D: A Computer Code for Simulation of Heat and Solute + Transport in Three-Dimensional Ground-Water Flow Systems: {U.S. Geological + Survey Water-Resources Investigation Report 86-4095, 517 p.}, accessed + September 27, 2022, at \url{https://pubs.usgs.gov/wri/1986/4095/report.pdf}. + \bibitem[{Konikow and others(2009)Konikow, Hornberger, Halford, and Hanson}]{konikow2009} Konikow, L.F., Hornberger, G.Z., Halford, K.J., and Hanson, R.T., 2009, Revised @@ -139,8 +161,8 @@ Konikow, L.F., Hornberger, G.Z., Halford, K.J., and Hanson, R.T., 2009, Revised \bibitem[{Langevin and others(2008)Langevin, Thorne~Jr, Dausman, Sukop, and Guo}]{langevin2008seawat} -Langevin, C.D., Thorne~Jr, D.T., Dausman, A.M., Sukop, M.C., and Guo, W., 2008, - {SEAWAT} Version 4---A computer program for simulation of multi-species +Langevin, C.D., Thorne~Jr, D.T., Dausman, A.M., Sukop, M.C., and Guo, Weixing, + 2008, {SEAWAT} Version 4---A computer program for simulation of multi-species solute and heat transport: {U.S. Geological Survey Techniques and Methods, book 6, chap. A22, 39 p.}, accessed June 27, 2017, at \url{https://pubs.er.usgs.gov/publication/tm6A22}. @@ -148,19 +170,19 @@ Langevin, C.D., Thorne~Jr, D.T., Dausman, A.M., Sukop, M.C., and Guo, W., 2008, \bibitem[{Langevin and others(2017)Langevin, Hughes, Provost, Banta, Niswonger, and Panday}]{modflow6gwf} Langevin, C.D., Hughes, J.D., Provost, A.M., Banta, E.R., Niswonger, R.G., and - Panday, S., 2017, Documentation for the MODFLOW 6 Groundwater Flow (GWF) + Panday, Sorab, 2017, Documentation for the MODFLOW 6 Groundwater Flow (GWF) Model: {U.S. Geological Survey Techniques and Methods, book 6, chap. A55, 197 p.}, \url{https://doi.org/10.3133/tm6A55}. \bibitem[{Langevin and others(2020)Langevin, Panday, and Provost}]{langevin2020hydraulic} -Langevin, C.D., Panday, S., and Provost, A.M., 2020, Hydraulic-head formulation - for density-dependent flow and transport: Groundwater, v.~58, no.~3, - p.~349--362. +Langevin, C.D., Panday, Sorab, and Provost, A.M., 2020, Hydraulic-head + formulation for density-dependent flow and transport: Groundwater, v.~58, + no.~3, p.~349--362. \bibitem[{Langevin and others(2022)Langevin, Provost, Panday, and Hughes}]{modflow6gwt} -Langevin, C.D., Provost, A.M., Panday, S., and Hughes, J.D., 2022, +Langevin, C.D., Provost, A.M., Panday, Sorab, and Hughes, J.D., 2022, Documentation for the MODFLOW 6 Groundwater Transport (GWT) Model: {U.S. Geological Survey Techniques and Methods, book 6, chap. A61, 56 p.}, \url{https://doi.org/10.3133/tm6A61}. @@ -186,10 +208,10 @@ Ma, Rui, and Zheng, Chunmiao, 2010, Effects of density and viscosity in \bibitem[{Maddock and others(2012)Maddock, Baird, Hanson, Schmid, and Ajami}]{modflowripetpack} -Maddock, Thomas, I., Baird, K.J., Hanson, R.T., Schmid, W., and Ajami, H., - 2012, RIP-ET---A Riparian Evapotranspiration Package for MODFLOW-2005: {U.S. - Geological Survey Techniques and Methods, book 6, chap. A39, 76 p.}, accessed - June 27, 2017, at \url{https://pubs.usgs.gov/tm/tm6a39/}. +Maddock, Thomas, III, Baird, K.J., Hanson, R.T., Schmid, Wolfgang, and Ajami, + Hoori, 2012, RIP-ET---A Riparian Evapotranspiration Package for MODFLOW-2005: + {U.S. Geological Survey Techniques and Methods, book 6, chap. A39, 76 p.}, + accessed June 27, 2017, at \url{https://pubs.usgs.gov/tm/tm6a39/}. \bibitem[{Merritt and Konikow(2000)}]{modflowlak3pack} Merritt, M.L., and Konikow, L.F., 2000, Documentation of a computer program to @@ -214,9 +236,9 @@ Niswonger, R.G., Prudic, D.E., and Regan, R.S., 2006, Documentation of the \bibitem[{Panday and others(2013)Panday, Langevin, Niswonger, Ibaraki, and Hughes}]{modflowusg} -Panday, S., Langevin, C.D., Niswonger, R.G., Ibaraki, M., and Hughes, J.D., - 2013, MODFLOW-USG version 1---An unstructured grid version of MODFLOW for - simulating groundwater flow and tightly coupled processes using a control +Panday, Sorab, Langevin, C.D., Niswonger, R.G., Ibaraki, Motomu, and Hughes, + J.D., 2013, MODFLOW-USG version 1---An unstructured grid version of MODFLOW + for simulating groundwater flow and tightly coupled processes using a control volume finite-difference formulation: {U.S. Geological Survey Techniques and Methods, book 6, chap. A45, 66 p.}, accessed June 27, 2017, at \url{https://pubs.usgs.gov/tm/06/a45/}. @@ -247,14 +269,21 @@ Voss, C.I., 1984, SUTRA---A finite-element simulation model for Geological Survey Water-Resources Investigations Report 84--4369, 409 p.} \bibitem[{Zheng(2010)}]{zheng2010supplemental} -Zheng, C., 2010, MT3DMS v5.3, Supplemental User's Guide: {Technical Report - Prepared for the U.S. Army Corps of Engineers, 51 p.} +Zheng, Chunmiao, 2010, MT3DMS v5.3, Supplemental User's Guide: {Technical + Report Prepared for the U.S. Army Corps of Engineers, 51 p.} + +\bibitem[{Zheng and Wang(1999)}]{zheng1999mt3dms} +Zheng, Chunmiao, and Wang, P.P., 1999, MT3DMS---A modular three-dimensional + multi-species transport model for simulation of advection, dispersion and + chemical reactions of contaminants in groundwater systems; Documentation and + user's guide: {Contract report SERDP--99--1: Vicksburg, Miss., U.S. Army + Engineer Research and Development Center, 169 p.} \bibitem[{Zheng and others(2001)Zheng, Hill, and Hsieh}]{zheng2001modflow} -Zheng, C., Hill, M.C., and Hsieh, P.A., 2001, MODFLOW-2000, the U.S. Geological - Survey Modular Ground-Water Model---User guide to the LMT6 package, the - linkage with MT3DMS for multi-species mass transport modeling: {U.S. - Geological Survey Open-File Report 01--82, 43 p.}, accessed June 27, 2017, at - \url{https://pubs.er.usgs.gov/publication/ofr0182}. +Zheng, Chunmiao, Hill, M.C., and Hsieh, P.A., 2001, MODFLOW-2000, the U.S. + Geological Survey Modular Ground-Water Model---User guide to the LMT6 + package, the linkage with MT3DMS for multi-species mass transport modeling: + {U.S. Geological Survey Open-File Report 01--82, 43 p.}, accessed June 27, + 2017, at \url{https://pubs.er.usgs.gov/publication/ofr0182}. \end{thebibliography} diff --git a/doc/mf6io/mf6ivar/dfn/exg-swfgwf.dfn b/doc/mf6io/mf6ivar/dfn/exg-swfgwf.dfn new file mode 100644 index 00000000000..575493ab0d2 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/exg-swfgwf.dfn @@ -0,0 +1,118 @@ +# --------------------- exg swfgwf options --------------------- +# flopy multi-package + +block options +name print_input +type keyword +reader urword +optional true +longname keyword to print input to list file +description keyword to indicate that the list of exchange entries will be echoed to the listing file immediately after it is read. +mf6internal ipr_input + +block options +name print_flows +type keyword +reader urword +optional true +longname keyword to print swfgwf flows to list file +description keyword to indicate that the list of exchange flow rates will be printed to the listing file for every stress period in which ``SAVE BUDGET'' is specified in Output Control. +mf6internal ipr_flow + +block options +name obs_filerecord +type record obs6 filein obs6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name obs6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname obs keyword +description keyword to specify that record corresponds to an observations file. + +block options +name filein +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an input filename is expected next. + +block options +name obs6_filename +type string +preserve_case true +in_record true +tagged false +reader urword +optional false +longname obs6 input filename +description is the file name of the observations input file for this exchange. See the ``Observation utility'' section for instructions for preparing observation input files. Table \ref{table:gwf-obstypetable} lists observation type(s) supported by the SWF-GWF package. + +# --------------------- exg swfgwf dimensions --------------------- + +block dimensions +name nexg +type integer +reader urword +optional false +longname number of exchanges +description keyword and integer value specifying the number of SWF-GWF exchanges. + + +# --------------------- exg swfgwf exchangedata --------------------- + +block exchangedata +name exchangedata +type recarray cellidm1 cellidm2 cond +shape (nexg) +reader urword +optional false +longname exchange data +description + +block exchangedata +name cellidm1 +type integer +in_record true +tagged false +reader urword +optional false +longname cellid of first cell +description is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. +numeric_index true + +block exchangedata +name cellidm2 +type integer +in_record true +tagged false +reader urword +optional false +longname cellid of second cell +description is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. +numeric_index true + +block exchangedata +name cond +type double precision +in_record true +tagged false +reader urword +optional false +longname conductance +description is the conductance between the surface water cell and the groundwater cell. + diff --git a/doc/mf6io/mf6ivar/dfn/sim-nam.dfn b/doc/mf6io/mf6ivar/dfn/sim-nam.dfn index 293a092b0d9..da749a8eea0 100644 --- a/doc/mf6io/mf6ivar/dfn/sim-nam.dfn +++ b/doc/mf6io/mf6ivar/dfn/sim-nam.dfn @@ -171,7 +171,7 @@ description is the list of solution types and models in the solution. block solutiongroup name slntype type string -valid ims6 +valid ims6 ems6 in_record true tagged false reader urword diff --git a/doc/mf6io/mf6ivar/dfn/swf-chd.dfn b/doc/mf6io/mf6ivar/dfn/swf-chd.dfn new file mode 100644 index 00000000000..a20bd6c4e0e --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/swf-chd.dfn @@ -0,0 +1,208 @@ +# --------------------- swf chd options --------------------- +# flopy multi-package + +block options +name auxiliary +type string +shape (naux) +reader urword +optional true +longname keyword to specify aux variables +description REPLACE auxnames {'{#1}': 'Surface Water Flow'} + +block options +name auxmultname +type string +shape +reader urword +optional true +longname name of auxiliary variable for multiplier +description REPLACE auxmultname {'{#1}': 'CHD head value'} + +block options +name boundnames +type keyword +shape +reader urword +optional true +longname +description REPLACE boundnames {'{#1}': 'constant-head'} + +block options +name print_input +type keyword +reader urword +optional true +longname print input to listing file +description REPLACE print_input {'{#1}': 'constant-head'} + +block options +name print_flows +type keyword +reader urword +optional true +longname print CHD flows to listing file +description REPLACE print_flows {'{#1}': 'constant-head'} + +block options +name save_flows +type keyword +reader urword +optional true +longname save CHD flows to budget file +description REPLACE save_flows {'{#1}': 'constant-head'} + +block options +name ts_filerecord +type record ts6 filein ts6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name ts6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname head keyword +description keyword to specify that record corresponds to a time-series file. + +block options +name filein +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an input filename is expected next. + +block options +name ts6_filename +type string +preserve_case true +in_record true +reader urword +optional false +tagged false +longname file name of time series information +description REPLACE timeseriesfile {} + +block options +name obs_filerecord +type record obs6 filein obs6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name obs6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname obs keyword +description keyword to specify that record corresponds to an observations file. + +block options +name obs6_filename +type string +preserve_case true +in_record true +tagged false +reader urword +optional false +longname obs6 input filename +description REPLACE obs6_filename {'{#1}': 'constant-head'} + + +# --------------------- swf chd dimensions --------------------- + +block dimensions +name maxbound +type integer +reader urword +optional false +longname maximum number of constant heads +description REPLACE maxbound {'{#1}': 'constant-head'} + + +# --------------------- swf chd period --------------------- + +block period +name iper +type integer +block_variable True +in_record true +tagged false +shape +valid +reader urword +optional false +longname stress period number +description REPLACE iper {} + +block period +name stress_period_data +type recarray cellid head aux boundname +shape (maxbound) +reader urword +longname +description +mf6internal spd + +block period +name cellid +type integer +shape (ncelldim) +tagged false +in_record true +reader urword +longname cell identifier +description REPLACE cellid {} + +block period +name head +type double precision +shape +tagged false +in_record true +reader urword +time_series true +longname head value assigned to constant head +description is the head at the boundary. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. + +block period +name aux +type double precision +in_record true +tagged false +shape (naux) +reader urword +optional true +time_series true +longname auxiliary variables +description REPLACE aux {'{#1}': 'constant head'} + +block period +name boundname +type string +shape +tagged false +in_record true +reader urword +optional true +longname constant head boundary name +description REPLACE boundname {'{#1}': 'constant head boundary'} diff --git a/doc/mf6io/mf6ivar/dfn/swf-cxs.dfn b/doc/mf6io/mf6ivar/dfn/swf-cxs.dfn new file mode 100644 index 00000000000..a1d28f962fe --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/swf-cxs.dfn @@ -0,0 +1,100 @@ +# --------------------- swf cxs options --------------------- + +block options +name print_input +type keyword +reader urword +optional true +longname print input to listing file +description REPLACE print_input {'{#1}': 'stream reach'} +mf6internal iprpak + +# --------------------- swf cxs dimensions --------------------- + +block dimensions +name nsections +type integer +reader urword +optional false +longname number of reaches +description integer value specifying the number of cross sections that will be defined. There must be NSECTIONS entries in the PACKAGEDATA block. + +block dimensions +name npoints +type integer +reader urword +optional false +longname total number of points defined for all reaches +description integer value specifying the total number of cross-section points defined for all reaches. There must be NPOINTS entries in the CROSSSECTIONDATA block. + +# --------------------- swf cxs packagedata --------------------- + +block packagedata +name packagedata +type recarray idcxs nxspoints +shape (nsections) +reader urword +longname +description + +block packagedata +name idcxs +type integer +shape +tagged false +in_record true +reader urword +longname reach number for this entry +description integer value that defines the cross section number associated with the specified PACKAGEDATA data on the line. IDCXS must be greater than zero and less than or equal to NSECTIONS. Information must be specified for every section or the program will terminate with an error. The program will also terminate with an error if information for a section is specified more than once. +numeric_index true + +block packagedata +name nxspoints +type integer +shape +tagged false +in_record true +reader urword +longname number of points used to define cross section +description integer value that defines the number of points used to define the define the shape of a section. NXSPOINTS must be greater than zero or the program will terminate with an error. NXSPOINTS defines the number of points that must be entered for the reach in the CROSSSECTIONDATA block. The sum of NXSPOINTS for all sections must equal the NPOINTS dimension. + +# --------------------- swf cxs crosssectiondata --------------------- + +block crosssectiondata +name crosssectiondata +type recarray xfraction height manfraction +shape (npoints) +reader urword +longname +description + +block crosssectiondata +name xfraction +type double precision +shape +tagged false +in_record true +reader urword +longname fractional width +description real value that defines the station (x) data for the cross-section as a fraction of the width (WIDTH) of the reach. XFRACTION must be greater than or equal to zero but can be greater than one. XFRACTION values can be used to decrease or increase the width of a reach from the specified reach width (WIDTH). + +block crosssectiondata +name height +type double precision +shape +tagged false +in_record true +reader urword +longname depth +description real value that is the height relative to the top of the lowest elevation of the streambed (ELEVATION) and corresponding to the station data on the same line. HEIGHT must be greater than or equal to zero and at least one cross-section height must be equal to zero. + +block crosssectiondata +name manfraction +type double precision +shape +tagged false +in_record true +reader urword +optional false +longname Manning's roughness coefficient +description real value that defines the Manning's roughness coefficient data for the cross-section as a fraction of the Manning's roughness coefficient for the reach (MANNINGSN) and corresponding to the station data on the same line. MANFRACTION must be greater than zero. MANFRACTION is applied from the XFRACTION value on the same line to the XFRACTION value on the next line. diff --git a/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn b/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn new file mode 100644 index 00000000000..b0008c6699b --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn @@ -0,0 +1,136 @@ +# --------------------- swf dfw options --------------------- + +block options +name central_in_space +type keyword +reader urword +optional true +longname use central in space weighting +description keyword to indicate conductance should be calculated using central-in-space weighting instead of the default upstream weighting approach. +mf6internal icentral + +block options +name length_conversion +type double precision +reader urword +optional true +longname length conversion factor +description real value that is used to convert user-specified Manning's roughness coefficients from meters to model length units. LENGTH\_CONVERSION should be set to 3.28081, 1.0, and 100.0 when using length units (LENGTH\_UNITS) of feet, meters, or centimeters in the simulation, respectively. LENGTH\_CONVERSION does not need to be specified if LENGTH\_UNITS are meters. +mf6internal lengthconv + +block options +name time_conversion +type double precision +reader urword +optional true +longname time conversion factor +description real value that is used to convert user-specified Manning's roughness coefficients from seconds to model time units. TIME\_CONVERSION should be set to 1.0, 60.0, 3,600.0, 86,400.0, and 31,557,600.0 when using time units (TIME\_UNITS) of seconds, minutes, hours, days, or years in the simulation, respectively. TIME\_CONVERSION does not need to be specified if TIME\_UNITS are seconds. +mf6internal timeconv + +block options +name save_flows +type keyword +reader urword +optional true +longname keyword to save DFW flows +description keyword to indicate that budget flow terms will be written to the file specified with ``BUDGET SAVE FILE'' in Output Control. +mf6internal ipakcb + +block options +name print_flows +type keyword +reader urword +optional true +longname keyword to print DFW flows to listing file +description keyword to indicate that calculated flows between cells will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. This option can produce extremely large list files because all cell-by-cell flows are printed. It should only be used with the DFW Package for models that have a small number of cells. +mf6internal iprflow + +block options +name obs_filerecord +type record obs6 filein obs6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name obs6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname obs keyword +description keyword to specify that record corresponds to an observations file. + +block options +name filein +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an input filename is expected next. + +block options +name obs6_filename +type string +preserve_case true +in_record true +tagged false +reader urword +optional false +longname obs6 input filename +description REPLACE obs6_filename {'{#1}': 'DFW'} + +# --------------------- swf dfw griddata --------------------- + +block griddata +name width +type double precision +shape (nodes) +valid +reader readarray +layered false +optional +longname stream width +description real value that defines the reach width. WIDTH must be greater than zero. + +block griddata +name manningsn +type double precision +shape (nodes) +valid +reader readarray +layered false +optional +longname mannings roughness coefficient +description mannings roughness coefficient + +block griddata +name slope +type double precision +shape (nodes) +valid +reader readarray +layered false +optional +longname bottom slope +description bottom slope of the river bed + +block griddata +name idcxs +type integer +shape (nodes) +valid +reader readarray +layered false +optional true +longname cross section number +description integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide. +numeric_index true diff --git a/doc/mf6io/mf6ivar/dfn/swf-disl.dfn b/doc/mf6io/mf6ivar/dfn/swf-disl.dfn new file mode 100644 index 00000000000..d0ba0de2a9c --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/swf-disl.dfn @@ -0,0 +1,229 @@ +# --------------------- swf disl options --------------------- + +block options +name length_units +type string +reader urword +optional true +longname model length units +description is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. + +block options +name length_convert +type double precision +reader urword +optional true +longname length conversion factor +description conversion factor that is used in converting constants used by MODFLOW into model length units. All constants are by default in units of ``meters''. Constants that use length\_conversion include GRAVITY and STORAGE COEFFICIENT values. + +block options +name time_convert +type double precision +reader urword +optional true +longname time conversion factor +description conversion factor that is used in converting constants used by MODFLOW into model time units. All constants are by default in units of ``seconds''. TIME\_CONVERSION is used to convert the GRAVITY constant from seconds to the model's units. + +block options +name nogrb +type keyword +reader urword +optional true +longname do not write binary grid file +description keyword to deactivate writing of the binary grid file. + +block options +name xorigin +type double precision +reader urword +optional true +longname x-position origin of the model grid coordinate system +description x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name yorigin +type double precision +reader urword +optional true +longname y-position origin of the model grid coordinate system +description y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name angrot +type double precision +reader urword +optional true +longname rotation angle +description counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +# --------------------- swf disl dimensions --------------------- + +block dimensions +name nodes +type integer +reader urword +optional false +longname number of linear features +description is the number of linear cells. + +block dimensions +name nvert +type integer +reader urword +optional true +longname number of columns +description is the total number of (x, y, z) vertex pairs used to characterize the model grid. + +# --------------------- swf disl griddata --------------------- + +block griddata +name reach_length +type double precision +shape (nodes) +valid +reader readarray +layered false +optional +longname reach length +description length for each reach + +block griddata +name reach_bottom +type double precision +shape (nodes) +valid +reader readarray +layered false +optional +longname reach bottom +description bottom elevation of surface water channel + +block griddata +name toreach +type integer +shape (nodes) +valid +reader readarray +layered false +optional true +longname index of the downstream reach +description index of the downstream reach. Flow from this reach is passed into the dowstream reach. For reaches that do not flow to another reach enter a 0 to toreach. +numeric_index true + +block griddata +name idomain +type integer +shape (nodes) +reader readarray +layered false +optional true +longname idomain existence array +description is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. + + +# --------------------- swf disl vertices --------------------- + +block vertices +name vertices +type recarray iv xv yv zv +shape (nvert) +reader urword +optional false +longname vertices data +description + +block vertices +name iv +type integer +in_record true +tagged false +reader urword +optional false +longname vertex number +description is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. +numeric_index true + +block vertices +name xv +type double precision +in_record true +tagged false +reader urword +optional false +longname x-coordinate for vertex +description is the x-coordinate for the vertex. + +block vertices +name yv +type double precision +in_record true +tagged false +reader urword +optional false +longname y-coordinate for vertex +description is the y-coordinate for the vertex. + +block vertices +name zv +type double precision +in_record true +tagged false +reader urword +optional false +longname z-coordinate for vertex +description is the z-coordinate for the vertex. + + +# --------------------- swf disl cell2d --------------------- + +block cell2d +name cell2d +type recarray icell2d fdc ncvert icvert +shape (nodes) +reader urword +optional false +longname cell2d data +description + +block cell2d +name icell2d +type integer +in_record true +tagged false +reader urword +optional false +longname cell2d number +description is the cell2d number. Records in the cell2d block must be listed in consecutive order from the first to the last. +numeric_index true + +block cell2d +name fdc +type double precision +in_record true +tagged false +reader urword +optional false +longname fractional distance to the cell center +description is the fractional distance to the cell center. FDC is relative to the first vertex in the ICVERT array. In most cases FDC should be 0.5, which would place the center of the line segment that defines the cell. If the value of FDC is 1, the cell center would located at the last vertex. FDC values of 0 and 1 can be used to place the node at either end of the cell which can be useful for cells with boundary conditions. + +block cell2d +name ncvert +type integer +in_record true +tagged false +reader urword +optional false +longname number of cell vertices +description is the number of vertices required to define the cell. There may be a different number of vertices for each cell. + +block cell2d +name icvert +type integer +shape (ncvert) +in_record true +tagged false +reader urword +optional false +longname number of cell vertices +description is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC. +numeric_index true \ No newline at end of file diff --git a/doc/mf6io/mf6ivar/dfn/swf-flw.dfn b/doc/mf6io/mf6ivar/dfn/swf-flw.dfn new file mode 100644 index 00000000000..dbacb0588c7 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/swf-flw.dfn @@ -0,0 +1,207 @@ +# --------------------- swf flw options --------------------- +# flopy multi-package + +block options +name auxiliary +type string +shape (naux) +reader urword +optional true +longname keyword to specify aux variables +description REPLACE auxnames {'{#1}': 'Stream Network Flow'} + +block options +name auxmultname +type string +shape +reader urword +optional true +longname name of auxiliary variable for multiplier +description REPLACE auxmultname {'{#1}': 'flow rate'} + +block options +name boundnames +type keyword +shape +reader urword +optional true +longname +description REPLACE boundnames {'{#1}': 'inflow'} + +block options +name print_input +type keyword +reader urword +optional true +longname print input to listing file +description REPLACE print_input {'{#1}': 'inflow'} + +block options +name print_flows +type keyword +reader urword +optional true +longname print calculated flows to listing file +description REPLACE print_flows {'{#1}': 'inflow'} + +block options +name save_flows +type keyword +reader urword +optional true +longname save well flows to budget file +description REPLACE save_flows {'{#1}': 'inflow'} + +block options +name ts_filerecord +type record ts6 filein ts6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name ts6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname head keyword +description keyword to specify that record corresponds to a time-series file. + +block options +name filein +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an input filename is expected next. + +block options +name ts6_filename +type string +preserve_case true +in_record true +reader urword +optional false +tagged false +longname file name of time series information +description REPLACE timeseriesfile {} + +block options +name obs_filerecord +type record obs6 filein obs6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name obs6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname obs keyword +description keyword to specify that record corresponds to an observations file. + +block options +name obs6_filename +type string +preserve_case true +in_record true +tagged false +reader urword +optional false +longname obs6 input filename +description REPLACE obs6_filename {'{#1}': 'inflow'} + +# --------------------- swf flw dimensions --------------------- + +block dimensions +name maxbound +type integer +reader urword +optional false +longname maximum number of inflow +description REPLACE maxbound {'{#1}': 'inflow'} + + +# --------------------- swf flw period --------------------- + +block period +name iper +type integer +block_variable True +in_record true +tagged false +shape +valid +reader urword +optional false +longname stress period number +description REPLACE iper {} + +block period +name stress_period_data +type recarray cellid q aux boundname +shape (maxbound) +reader urword +longname +description +mf6internal spd + +block period +name cellid +type integer +shape (ncelldim) +tagged false +in_record true +reader urword +longname cell identifier +description REPLACE cellid {} + +block period +name q +type double precision +shape +tagged false +in_record true +reader urword +time_series true +longname well rate +description is the volumetric inflow rate. A positive value indicates inflow to the stream. Negative values are not allows. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. + +block period +name aux +type double precision +in_record true +tagged false +shape (naux) +reader urword +optional true +time_series true +longname auxiliary variables +description REPLACE aux {'{#1}': 'inflow'} + +block period +name boundname +type string +shape +tagged false +in_record true +reader urword +optional true +longname inflow name +description REPLACE boundname {'{#1}': 'inflow'} diff --git a/doc/mf6io/mf6ivar/dfn/swf-ic.dfn b/doc/mf6io/mf6ivar/dfn/swf-ic.dfn new file mode 100644 index 00000000000..9cff10a3247 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/swf-ic.dfn @@ -0,0 +1,11 @@ +# --------------------- gwt ic griddata --------------------- + +block griddata +name strt +type double precision +shape (nodes) +reader readarray +layered true +longname starting concentration +description is the initial (starting) stage---that is, stage at the beginning of the SWF Model simulation. STRT must be specified for all SWF Model simulations. One value is read for every model reach. +default_value 0.0 diff --git a/doc/mf6io/mf6ivar/dfn/swf-nam.dfn b/doc/mf6io/mf6ivar/dfn/swf-nam.dfn new file mode 100644 index 00000000000..386b00cb261 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/swf-nam.dfn @@ -0,0 +1,99 @@ +# --------------------- swf nam options --------------------- + +block options +name list +type string +reader urword +optional true +preserve_case true +longname name of listing file +description is name of the listing file to create for this SWF model. If not specified, then the name of the list file will be the basename of the SWF model name file and the '.lst' extension. For example, if the SWF name file is called ``my.model.nam'' then the list file will be called ``my.model.lst''. + +block options +name print_input +type keyword +reader urword +optional true +longname print input to listing file +description REPLACE print_input {'{#1}': 'all model stress package'} + +block options +name print_flows +type keyword +reader urword +optional true +longname print calculated flows to listing file +description REPLACE print_flows {'{#1}': 'all model package'} + +block options +name save_flows +type keyword +reader urword +optional true +longname save flows for all packages to budget file +description REPLACE save_flows {'{#1}': 'all model package'} + +block options +name newtonoptions +type record newton under_relaxation +reader urword +optional true +longname newton keyword and options +description none + +block options +name newton +in_record true +type keyword +reader urword +longname keyword to activate Newton-Raphson formulation +description keyword that activates the Newton-Raphson formulation for surface water flow between connected reaches and stress packages that support calculation of Newton-Raphson terms. + +block options +name under_relaxation +in_record true +type keyword +reader urword +optional true +longname keyword to activate Newton-Raphson UNDER_RELAXATION option +description keyword that indicates whether the surface water stage in a reach will be under-relaxed when water levels fall below the bottom of the model below any given cell. By default, Newton-Raphson UNDER\_RELAXATION is not applied. + +# --------------------- swf nam packages --------------------- + +block packages +name packages +type recarray ftype fname pname +reader urword +optional false +longname package list +description + +block packages +name ftype +in_record true +type string +tagged false +reader urword +longname package type +description is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. + +block packages +name fname +in_record true +type string +preserve_case true +tagged false +reader urword +longname file name +description is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. + +block packages +name pname +in_record true +type string +tagged false +reader urword +optional true +longname user name for package +description is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single SWF Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. + diff --git a/doc/mf6io/mf6ivar/dfn/swf-oc.dfn b/doc/mf6io/mf6ivar/dfn/swf-oc.dfn new file mode 100644 index 00000000000..645942857a6 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/swf-oc.dfn @@ -0,0 +1,345 @@ +# --------------------- swf oc options --------------------- + +block options +name budget_filerecord +type record budget fileout budgetfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name budget +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname budget keyword +description keyword to specify that record corresponds to the budget. + +block options +name fileout +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an output filename is expected next. + +block options +name budgetfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the output file to write budget information. + +block options +name budgetcsv_filerecord +type record budgetcsv fileout budgetcsvfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name budgetcsv +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname budget keyword +description keyword to specify that record corresponds to the budget CSV. + +block options +name budgetcsvfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. + +block options +name qoutflow_filerecord +type record qoutflow fileout qoutflowfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name qoutflow +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname qoutflow keyword +description keyword to specify that record corresponds to qoutflow. + +block options +name qoutflowfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the output file to write conc information. + +block options +name stage_filerecord +type record stage fileout stagefile +shape +reader urword +tagged true +optional true +longname +description + +block options +name stage +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname stage keyword +description keyword to specify that record corresponds to stage. + +block options +name stagefile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the output file to write stage information. + +block options +name qoutflowprintrecord +type record qoutflow print_format formatrecord +shape +reader urword +optional true +longname +description + +block options +name print_format +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname keyword to indicate that a print format follows +description keyword to specify format for printing to the listing file. + +block options +name formatrecord +type record columns width digits format +shape +in_record true +reader urword +tagged +optional false +longname +description + +block options +name columns +type integer +shape +in_record true +reader urword +tagged true +optional +longname number of columns +description number of columns for writing data. + +block options +name width +type integer +shape +in_record true +reader urword +tagged true +optional +longname width for each number +description width for writing each number. + +block options +name digits +type integer +shape +in_record true +reader urword +tagged true +optional +longname number of digits +description number of digits to use for writing a number. + +block options +name format +type string +shape +in_record true +reader urword +tagged false +optional false +longname write format +description write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + +# --------------------- swf oc period --------------------- + +block period +name iper +type integer +block_variable True +in_record true +tagged false +shape +valid +reader urword +optional false +longname stress period number +description REPLACE iper {} + +block period +name saverecord +type record save rtype ocsetting +shape +reader urword +tagged false +optional true +longname +description + +block period +name save +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname keyword to save +description keyword to indicate that information will be saved this stress period. + +block period +name printrecord +type record print rtype ocsetting +shape +reader urword +tagged false +optional true +longname +description + +block period +name print +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname keyword to save +description keyword to indicate that information will be printed this stress period. + +block period +name rtype +type string +shape +in_record true +reader urword +tagged false +optional false +longname record type +description type of information to save or print. Can be BUDGET. + +block period +name ocsetting +type keystring all first last frequency steps +shape +tagged false +in_record true +reader urword +longname +description specifies the steps for which the data will be saved. + +block period +name all +type keyword +shape +in_record true +reader urword +longname +description keyword to indicate save for all time steps in period. + +block period +name first +type keyword +shape +in_record true +reader urword +longname +description keyword to indicate save for first step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +block period +name last +type keyword +shape +in_record true +reader urword +longname +description keyword to indicate save for last step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +block period +name frequency +type integer +shape +tagged true +in_record true +reader urword +longname +description save at the specified time step frequency. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +block period +name steps +type integer +shape ($ 0, or it is the area perpendicular to flow of the vertical connection between cell 1 and cell 2 if IHC = 0. | | EXG | GWEGWE | EXCHANGEDATA | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each GWEGWE Exchange. The values of auxiliary variables must be present for each exchange. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. | | EXG | GWEGWE | EXCHANGEDATA | BOUNDNAME | STRING | name of the GWE Exchange cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | +| EXG | SWFGWF | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of exchange entries will be echoed to the listing file immediately after it is read. | +| EXG | SWFGWF | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of exchange flow rates will be printed to the listing file for every stress period in which ``SAVE BUDGET'' is specified in Output Control. | +| EXG | SWFGWF | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | +| EXG | SWFGWF | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| EXG | SWFGWF | OPTIONS | OBS6_FILENAME | STRING | is the file name of the observations input file for this exchange. See the ``Observation utility'' section for instructions for preparing observation input files. Table \ref{table:gwf-obstypetable} lists observation type(s) supported by the SWF-GWF package. | +| EXG | SWFGWF | DIMENSIONS | NEXG | INTEGER | keyword and integer value specifying the number of SWF-GWF exchanges. | +| EXG | SWFGWF | EXCHANGEDATA | CELLIDM1 | INTEGER | is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. | +| EXG | SWFGWF | EXCHANGEDATA | CELLIDM2 | INTEGER | is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. | +| EXG | SWFGWF | EXCHANGEDATA | COND | DOUBLE PRECISION | is the conductance between the surface water cell and the groundwater cell. | | SLN | IMS | OPTIONS | PRINT_OPTION | STRING | is a flag that controls printing of convergence information from the solver. NONE means print nothing. SUMMARY means print only the total number of iterations and nonlinear residual reduction summaries. ALL means print linear matrix solver convergence information to the solution listing file and model specific linear matrix solver convergence information to each model listing file in addition to SUMMARY information. NONE is default if PRINT\_OPTION is not specified. | | SLN | IMS | OPTIONS | COMPLEXITY | STRING | is an optional keyword that defines default non-linear and linear solver parameters. SIMPLE - indicates that default solver input values will be defined that work well for nearly linear models. This would be used for models that do not include nonlinear stress packages and models that are either confined or consist of a single unconfined layer that is thick enough to contain the water table within a single layer. MODERATE - indicates that default solver input values will be defined that work well for moderately nonlinear models. This would be used for models that include nonlinear stress packages and models that consist of one or more unconfined layers. The MODERATE option should be used when the SIMPLE option does not result in successful convergence. COMPLEX - indicates that default solver input values will be defined that work well for highly nonlinear models. This would be used for models that include nonlinear stress packages and models that consist of one or more unconfined layers representing complex geology and surface-water/groundwater interaction. The COMPLEX option should be used when the MODERATE option does not result in successful convergence. Non-linear and linear solver parameters assigned using a specified complexity can be modified in the NONLINEAR and LINEAR blocks. If the COMPLEXITY option is not specified, NONLINEAR and LINEAR variables will be assigned the simple complexity values. | | SLN | IMS | OPTIONS | CSV_OUTPUT | KEYWORD | keyword to specify that the record corresponds to the comma separated values solver convergence output. The CSV\_OUTPUT option has been deprecated and split into the CSV_OUTER_OUTPUT and CSV_INNER_OUTPUT options. Starting with MODFLOW 6 version 6.1.1 if the CSV_OUTPUT option is specified, then it is treated as the CSV_OUTER_OUTPUT option. | @@ -1487,6 +1496,138 @@ | GWE | FMI | PACKAGEDATA | FLOWTYPE | STRING | is the word GWFBUDGET, GWFHEAD, GWFMOVER or the name of an advanced GWF stress package. If GWFBUDGET is specified, then the corresponding file must be a budget file from a previous GWF Model run. If an advanced GWF stress package name appears then the corresponding file must be the budget file saved by a LAK, SFR, MAW or UZF Package. | | GWE | FMI | PACKAGEDATA | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | | GWE | FMI | PACKAGEDATA | FNAME | STRING | is the name of the file containing flows. The path to the file should be included if the file is not located in the folder where the program was run. | +| SWF | NAM | OPTIONS | LIST | STRING | is name of the listing file to create for this SWF model. If not specified, then the name of the list file will be the basename of the SWF model name file and the '.lst' extension. For example, if the SWF name file is called ``my.model.nam'' then the list file will be called ``my.model.lst''. | +| SWF | NAM | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of all model stress package information will be written to the listing file immediately after it is read. | +| SWF | NAM | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of all model package flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| SWF | NAM | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that all model package flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| SWF | NAM | OPTIONS | NEWTON | KEYWORD | keyword that activates the Newton-Raphson formulation for surface water flow between connected reaches and stress packages that support calculation of Newton-Raphson terms. | +| SWF | NAM | OPTIONS | UNDER_RELAXATION | KEYWORD | keyword that indicates whether the surface water stage in a reach will be under-relaxed when water levels fall below the bottom of the model below any given cell. By default, Newton-Raphson UNDER\_RELAXATION is not applied. | +| SWF | NAM | PACKAGES | FTYPE | STRING | is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. | +| SWF | NAM | PACKAGES | FNAME | STRING | is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. | +| SWF | NAM | PACKAGES | PNAME | STRING | is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single SWF Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. | +| SWF | DISL | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | +| SWF | DISL | OPTIONS | LENGTH_CONVERT | DOUBLE PRECISION | conversion factor that is used in converting constants used by MODFLOW into model length units. All constants are by default in units of ``meters''. Constants that use length\_conversion include GRAVITY and STORAGE COEFFICIENT values. | +| SWF | DISL | OPTIONS | TIME_CONVERT | DOUBLE PRECISION | conversion factor that is used in converting constants used by MODFLOW into model time units. All constants are by default in units of ``seconds''. TIME\_CONVERSION is used to convert the GRAVITY constant from seconds to the model's units. | +| SWF | DISL | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | +| SWF | DISL | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DISL | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DISL | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DISL | DIMENSIONS | NODES | INTEGER | is the number of linear cells. | +| SWF | DISL | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y, z) vertex pairs used to characterize the model grid. | +| SWF | DISL | GRIDDATA | REACH_LENGTH | DOUBLE PRECISION (NODES) | length for each reach | +| SWF | DISL | GRIDDATA | REACH_BOTTOM | DOUBLE PRECISION (NODES) | bottom elevation of surface water channel | +| SWF | DISL | GRIDDATA | TOREACH | INTEGER (NODES) | index of the downstream reach. Flow from this reach is passed into the dowstream reach. For reaches that do not flow to another reach enter a 0 to toreach. | +| SWF | DISL | GRIDDATA | IDOMAIN | INTEGER (NODES) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. | +| SWF | DISL | VERTICES | IV | INTEGER | is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. | +| SWF | DISL | VERTICES | XV | DOUBLE PRECISION | is the x-coordinate for the vertex. | +| SWF | DISL | VERTICES | YV | DOUBLE PRECISION | is the y-coordinate for the vertex. | +| SWF | DISL | VERTICES | ZV | DOUBLE PRECISION | is the z-coordinate for the vertex. | +| SWF | DISL | CELL2D | ICELL2D | INTEGER | is the cell2d number. Records in the cell2d block must be listed in consecutive order from the first to the last. | +| SWF | DISL | CELL2D | FDC | DOUBLE PRECISION | is the fractional distance to the cell center. FDC is relative to the first vertex in the ICVERT array. In most cases FDC should be 0.5, which would place the center of the line segment that defines the cell. If the value of FDC is 1, the cell center would located at the last vertex. FDC values of 0 and 1 can be used to place the node at either end of the cell which can be useful for cells with boundary conditions. | +| SWF | DISL | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | +| SWF | DISL | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC. | +| SWF | DFW | OPTIONS | CENTRAL_IN_SPACE | KEYWORD | keyword to indicate conductance should be calculated using central-in-space weighting instead of the default upstream weighting approach. | +| SWF | DFW | OPTIONS | LENGTH_CONVERSION | DOUBLE PRECISION | real value that is used to convert user-specified Manning's roughness coefficients from meters to model length units. LENGTH\_CONVERSION should be set to 3.28081, 1.0, and 100.0 when using length units (LENGTH\_UNITS) of feet, meters, or centimeters in the simulation, respectively. LENGTH\_CONVERSION does not need to be specified if LENGTH\_UNITS are meters. | +| SWF | DFW | OPTIONS | TIME_CONVERSION | DOUBLE PRECISION | real value that is used to convert user-specified Manning's roughness coefficients from seconds to model time units. TIME\_CONVERSION should be set to 1.0, 60.0, 3,600.0, 86,400.0, and 31,557,600.0 when using time units (TIME\_UNITS) of seconds, minutes, hours, days, or years in the simulation, respectively. TIME\_CONVERSION does not need to be specified if TIME\_UNITS are seconds. | +| SWF | DFW | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that budget flow terms will be written to the file specified with ``BUDGET SAVE FILE'' in Output Control. | +| SWF | DFW | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that calculated flows between cells will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. This option can produce extremely large list files because all cell-by-cell flows are printed. It should only be used with the DFW Package for models that have a small number of cells. | +| SWF | DFW | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | +| SWF | DFW | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| SWF | DFW | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the DFW package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the DFW package. | +| SWF | DFW | GRIDDATA | WIDTH | DOUBLE PRECISION (NODES) | real value that defines the reach width. WIDTH must be greater than zero. | +| SWF | DFW | GRIDDATA | MANNINGSN | DOUBLE PRECISION (NODES) | mannings roughness coefficient | +| SWF | DFW | GRIDDATA | SLOPE | DOUBLE PRECISION (NODES) | bottom slope of the river bed | +| SWF | DFW | GRIDDATA | IDCXS | INTEGER (NODES) | integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide. | +| SWF | CXS | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of stream reach information will be written to the listing file immediately after it is read. | +| SWF | CXS | DIMENSIONS | NSECTIONS | INTEGER | integer value specifying the number of cross sections that will be defined. There must be NSECTIONS entries in the PACKAGEDATA block. | +| SWF | CXS | DIMENSIONS | NPOINTS | INTEGER | integer value specifying the total number of cross-section points defined for all reaches. There must be NPOINTS entries in the CROSSSECTIONDATA block. | +| SWF | CXS | PACKAGEDATA | IDCXS | INTEGER | integer value that defines the cross section number associated with the specified PACKAGEDATA data on the line. IDCXS must be greater than zero and less than or equal to NSECTIONS. Information must be specified for every section or the program will terminate with an error. The program will also terminate with an error if information for a section is specified more than once. | +| SWF | CXS | PACKAGEDATA | NXSPOINTS | INTEGER | integer value that defines the number of points used to define the define the shape of a section. NXSPOINTS must be greater than zero or the program will terminate with an error. NXSPOINTS defines the number of points that must be entered for the reach in the CROSSSECTIONDATA block. The sum of NXSPOINTS for all sections must equal the NPOINTS dimension. | +| SWF | CXS | CROSSSECTIONDATA | XFRACTION | DOUBLE PRECISION | real value that defines the station (x) data for the cross-section as a fraction of the width (WIDTH) of the reach. XFRACTION must be greater than or equal to zero but can be greater than one. XFRACTION values can be used to decrease or increase the width of a reach from the specified reach width (WIDTH). | +| SWF | CXS | CROSSSECTIONDATA | HEIGHT | DOUBLE PRECISION | real value that is the height relative to the top of the lowest elevation of the streambed (ELEVATION) and corresponding to the station data on the same line. HEIGHT must be greater than or equal to zero and at least one cross-section height must be equal to zero. | +| SWF | CXS | CROSSSECTIONDATA | MANFRACTION | DOUBLE PRECISION | real value that defines the Manning's roughness coefficient data for the cross-section as a fraction of the Manning's roughness coefficient for the reach (MANNINGSN) and corresponding to the station data on the same line. MANFRACTION must be greater than zero. MANFRACTION is applied from the XFRACTION value on the same line to the XFRACTION value on the next line. | +| SWF | IC | GRIDDATA | STRT | DOUBLE PRECISION (NODES) | is the initial (starting) stage---that is, stage at the beginning of the SWF Model simulation. STRT must be specified for all SWF Model simulations. One value is read for every model reach. | +| SWF | STO | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that cell-by-cell flow terms will be written to the file specified with ``BUDGET SAVE FILE'' in Output Control. | +| SWF | STO | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| SWF | STO | PERIOD | STEADY-STATE | KEYWORD | keyword to indicate that stress period IPER is steady-state. Steady-state conditions will apply until the TRANSIENT keyword is specified in a subsequent BEGIN PERIOD block. | +| SWF | STO | PERIOD | TRANSIENT | KEYWORD | keyword to indicate that stress period IPER is transient. Transient conditions will apply until the STEADY-STATE keyword is specified in a subsequent BEGIN PERIOD block. | +| SWF | OC | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | +| SWF | OC | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | +| SWF | OC | OPTIONS | BUDGETFILE | STRING | name of the output file to write budget information. | +| SWF | OC | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | +| SWF | OC | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | +| SWF | OC | OPTIONS | QOUTFLOW | KEYWORD | keyword to specify that record corresponds to qoutflow. | +| SWF | OC | OPTIONS | QOUTFLOWFILE | STRING | name of the output file to write conc information. | +| SWF | OC | OPTIONS | STAGE | KEYWORD | keyword to specify that record corresponds to stage. | +| SWF | OC | OPTIONS | STAGEFILE | STRING | name of the output file to write stage information. | +| SWF | OC | OPTIONS | PRINT_FORMAT | KEYWORD | keyword to specify format for printing to the listing file. | +| SWF | OC | OPTIONS | COLUMNS | INTEGER | number of columns for writing data. | +| SWF | OC | OPTIONS | WIDTH | INTEGER | width for writing each number. | +| SWF | OC | OPTIONS | DIGITS | INTEGER | number of digits to use for writing a number. | +| SWF | OC | OPTIONS | FORMAT | STRING | write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. | +| SWF | OC | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| SWF | OC | PERIOD | SAVE | KEYWORD | keyword to indicate that information will be saved this stress period. | +| SWF | OC | PERIOD | PRINT | KEYWORD | keyword to indicate that information will be printed this stress period. | +| SWF | OC | PERIOD | RTYPE | STRING | type of information to save or print. Can be BUDGET. | +| SWF | OC | PERIOD | OCSETTING | KEYSTRING | specifies the steps for which the data will be saved. | +| SWF | OC | PERIOD | ALL | KEYWORD | keyword to indicate save for all time steps in period. | +| SWF | OC | PERIOD | FIRST | KEYWORD | keyword to indicate save for first step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | +| SWF | OC | PERIOD | LAST | KEYWORD | keyword to indicate save for last step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | +| SWF | OC | PERIOD | FREQUENCY | INTEGER | save at the specified time step frequency. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | +| SWF | OC | PERIOD | STEPS | INTEGER ( +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/exg-swfgwf-exchangedata.dat b/doc/mf6io/mf6ivar/tex/exg-swfgwf-exchangedata.dat new file mode 100644 index 00000000000..16d98aa8047 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/exg-swfgwf-exchangedata.dat @@ -0,0 +1,5 @@ +BEGIN EXCHANGEDATA + + + ... +END EXCHANGEDATA diff --git a/doc/mf6io/mf6ivar/tex/exg-swfgwf-options.dat b/doc/mf6io/mf6ivar/tex/exg-swfgwf-options.dat new file mode 100644 index 00000000000..106a21ad8dc --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/exg-swfgwf-options.dat @@ -0,0 +1,5 @@ +BEGIN OPTIONS + [PRINT_INPUT] + [PRINT_FLOWS] + [OBS6 FILEIN ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-chd-desc.tex b/doc/mf6io/mf6ivar/tex/swf-chd-desc.tex new file mode 100644 index 00000000000..eb5be079cd5 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-chd-desc.tex @@ -0,0 +1,49 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{auxiliary}---defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. + +\item \texttt{auxmultname}---name of auxiliary variable to be used as multiplier of CHD head value. + +\item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of constant-head cells. + +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of constant-head information will be written to the listing file immediately after it is read. + +\item \texttt{PRINT\_FLOWS}---keyword to indicate that the list of constant-head flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that constant-head flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\item \texttt{TS6}---keyword to specify that record corresponds to a time-series file. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{ts6\_filename}---defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. + +\item \texttt{OBS6}---keyword to specify that record corresponds to an observations file. + +\item \texttt{obs6\_filename}---name of input file to define observations for the constant-head package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the constant-head package. + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{maxbound}---integer value specifying the maximum number of constant-head cells that will be specified for use during any stress period. + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. + +\item \texttt{cellid}---is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. + +\item \textcolor{blue}{\texttt{head}---is the head at the boundary. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{aux}---represents the values of the auxiliary variables for each constant head. The values of auxiliary variables must be present for each constant head. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \texttt{boundname}---name of the constant head boundary cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/swf-chd-dimensions.dat b/doc/mf6io/mf6ivar/tex/swf-chd-dimensions.dat new file mode 100644 index 00000000000..7b4c7bf6ec7 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-chd-dimensions.dat @@ -0,0 +1,3 @@ +BEGIN DIMENSIONS + MAXBOUND +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-chd-options.dat b/doc/mf6io/mf6ivar/tex/swf-chd-options.dat new file mode 100644 index 00000000000..0985bd51e40 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-chd-options.dat @@ -0,0 +1,10 @@ +BEGIN OPTIONS + [AUXILIARY ] + [AUXMULTNAME ] + [BOUNDNAMES] + [PRINT_INPUT] + [PRINT_FLOWS] + [SAVE_FLOWS] + [TS6 FILEIN ] + [OBS6 FILEIN ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-chd-period.dat b/doc/mf6io/mf6ivar/tex/swf-chd-period.dat new file mode 100644 index 00000000000..a24c7694352 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-chd-period.dat @@ -0,0 +1,5 @@ +BEGIN PERIOD + <@head@> [<@aux(naux)@>] [] + <@head@> [<@aux(naux)@>] [] + ... +END PERIOD diff --git a/doc/mf6io/mf6ivar/tex/swf-cxs-crosssectiondata.dat b/doc/mf6io/mf6ivar/tex/swf-cxs-crosssectiondata.dat new file mode 100644 index 00000000000..d084669a0b3 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-cxs-crosssectiondata.dat @@ -0,0 +1,5 @@ +BEGIN CROSSSECTIONDATA + + + ... +END CROSSSECTIONDATA diff --git a/doc/mf6io/mf6ivar/tex/swf-cxs-desc.tex b/doc/mf6io/mf6ivar/tex/swf-cxs-desc.tex new file mode 100644 index 00000000000..f804fbeea01 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-cxs-desc.tex @@ -0,0 +1,35 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of stream reach information will be written to the listing file immediately after it is read. + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{nsections}---integer value specifying the number of cross sections that will be defined. There must be NSECTIONS entries in the PACKAGEDATA block. + +\item \texttt{npoints}---integer value specifying the total number of cross-section points defined for all reaches. There must be NPOINTS entries in the CROSSSECTIONDATA block. + +\end{description} +\item \textbf{Block: PACKAGEDATA} + +\begin{description} +\item \texttt{idcxs}---integer value that defines the cross section number associated with the specified PACKAGEDATA data on the line. IDCXS must be greater than zero and less than or equal to NSECTIONS. Information must be specified for every section or the program will terminate with an error. The program will also terminate with an error if information for a section is specified more than once. + +\item \texttt{nxspoints}---integer value that defines the number of points used to define the define the shape of a section. NXSPOINTS must be greater than zero or the program will terminate with an error. NXSPOINTS defines the number of points that must be entered for the reach in the CROSSSECTIONDATA block. The sum of NXSPOINTS for all sections must equal the NPOINTS dimension. + +\end{description} +\item \textbf{Block: CROSSSECTIONDATA} + +\begin{description} +\item \texttt{xfraction}---real value that defines the station (x) data for the cross-section as a fraction of the width (WIDTH) of the reach. XFRACTION must be greater than or equal to zero but can be greater than one. XFRACTION values can be used to decrease or increase the width of a reach from the specified reach width (WIDTH). + +\item \texttt{height}---real value that is the height relative to the top of the lowest elevation of the streambed (ELEVATION) and corresponding to the station data on the same line. HEIGHT must be greater than or equal to zero and at least one cross-section height must be equal to zero. + +\item \texttt{manfraction}---real value that defines the Manning's roughness coefficient data for the cross-section as a fraction of the Manning's roughness coefficient for the reach (MANNINGSN) and corresponding to the station data on the same line. MANFRACTION must be greater than zero. MANFRACTION is applied from the XFRACTION value on the same line to the XFRACTION value on the next line. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/swf-cxs-dimensions.dat b/doc/mf6io/mf6ivar/tex/swf-cxs-dimensions.dat new file mode 100644 index 00000000000..53a408acdda --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-cxs-dimensions.dat @@ -0,0 +1,4 @@ +BEGIN DIMENSIONS + NSECTIONS + NPOINTS +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-cxs-options.dat b/doc/mf6io/mf6ivar/tex/swf-cxs-options.dat new file mode 100644 index 00000000000..fa89f1b61d2 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-cxs-options.dat @@ -0,0 +1,3 @@ +BEGIN OPTIONS + [PRINT_INPUT] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-cxs-packagedata.dat b/doc/mf6io/mf6ivar/tex/swf-cxs-packagedata.dat new file mode 100644 index 00000000000..552a51db584 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-cxs-packagedata.dat @@ -0,0 +1,5 @@ +BEGIN PACKAGEDATA + + + ... +END PACKAGEDATA diff --git a/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex b/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex new file mode 100644 index 00000000000..37aad56efcf --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex @@ -0,0 +1,35 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{CENTRAL\_IN\_SPACE}---keyword to indicate conductance should be calculated using central-in-space weighting instead of the default upstream weighting approach. + +\item \texttt{length\_conversion}---real value that is used to convert user-specified Manning's roughness coefficients from meters to model length units. LENGTH\_CONVERSION should be set to 3.28081, 1.0, and 100.0 when using length units (LENGTH\_UNITS) of feet, meters, or centimeters in the simulation, respectively. LENGTH\_CONVERSION does not need to be specified if LENGTH\_UNITS are meters. + +\item \texttt{time\_conversion}---real value that is used to convert user-specified Manning's roughness coefficients from seconds to model time units. TIME\_CONVERSION should be set to 1.0, 60.0, 3,600.0, 86,400.0, and 31,557,600.0 when using time units (TIME\_UNITS) of seconds, minutes, hours, days, or years in the simulation, respectively. TIME\_CONVERSION does not need to be specified if TIME\_UNITS are seconds. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that budget flow terms will be written to the file specified with ``BUDGET SAVE FILE'' in Output Control. + +\item \texttt{PRINT\_FLOWS}---keyword to indicate that calculated flows between cells will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. This option can produce extremely large list files because all cell-by-cell flows are printed. It should only be used with the DFW Package for models that have a small number of cells. + +\item \texttt{OBS6}---keyword to specify that record corresponds to an observations file. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{obs6\_filename}---name of input file to define observations for the DFW package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the DFW package. + +\end{description} +\item \textbf{Block: GRIDDATA} + +\begin{description} +\item \texttt{width}---real value that defines the reach width. WIDTH must be greater than zero. + +\item \texttt{manningsn}---mannings roughness coefficient + +\item \texttt{slope}---bottom slope of the river bed + +\item \texttt{idcxs}---integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/swf-dfw-griddata.dat b/doc/mf6io/mf6ivar/tex/swf-dfw-griddata.dat new file mode 100644 index 00000000000..8357702fb8f --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-dfw-griddata.dat @@ -0,0 +1,10 @@ +BEGIN GRIDDATA + WIDTH + -- READARRAY + MANNINGSN + -- READARRAY + SLOPE + -- READARRAY + [IDCXS + -- READARRAY] +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/swf-dfw-options.dat b/doc/mf6io/mf6ivar/tex/swf-dfw-options.dat new file mode 100644 index 00000000000..fb2a386b7c5 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-dfw-options.dat @@ -0,0 +1,8 @@ +BEGIN OPTIONS + [CENTRAL_IN_SPACE] + [LENGTH_CONVERSION ] + [TIME_CONVERSION ] + [SAVE_FLOWS] + [PRINT_FLOWS] + [OBS6 FILEIN ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-disl-cell2d.dat b/doc/mf6io/mf6ivar/tex/swf-disl-cell2d.dat new file mode 100644 index 00000000000..f8ad1f65f50 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-disl-cell2d.dat @@ -0,0 +1,5 @@ +BEGIN CELL2D + + + ... +END CELL2D diff --git a/doc/mf6io/mf6ivar/tex/swf-disl-desc.tex b/doc/mf6io/mf6ivar/tex/swf-disl-desc.tex new file mode 100644 index 00000000000..f9a3460ea30 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-disl-desc.tex @@ -0,0 +1,65 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{length\_units}---is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. + +\item \texttt{length\_convert}---conversion factor that is used in converting constants used by MODFLOW into model length units. All constants are by default in units of ``meters''. Constants that use length\_conversion include GRAVITY and STORAGE COEFFICIENT values. + +\item \texttt{time\_convert}---conversion factor that is used in converting constants used by MODFLOW into model time units. All constants are by default in units of ``seconds''. TIME\_CONVERSION is used to convert the GRAVITY constant from seconds to the model's units. + +\item \texttt{NOGRB}---keyword to deactivate writing of the binary grid file. + +\item \texttt{xorigin}---x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\item \texttt{yorigin}---y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{nodes}---is the number of linear cells. + +\item \texttt{nvert}---is the total number of (x, y, z) vertex pairs used to characterize the model grid. + +\end{description} +\item \textbf{Block: GRIDDATA} + +\begin{description} +\item \texttt{reach\_length}---length for each reach + +\item \texttt{reach\_bottom}---bottom elevation of surface water channel + +\item \texttt{toreach}---index of the downstream reach. Flow from this reach is passed into the dowstream reach. For reaches that do not flow to another reach enter a 0 to toreach. + +\item \texttt{idomain}---is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. + +\end{description} +\item \textbf{Block: VERTICES} + +\begin{description} +\item \texttt{iv}---is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. + +\item \texttt{xv}---is the x-coordinate for the vertex. + +\item \texttt{yv}---is the y-coordinate for the vertex. + +\item \texttt{zv}---is the z-coordinate for the vertex. + +\end{description} +\item \textbf{Block: CELL2D} + +\begin{description} +\item \texttt{icell2d}---is the cell2d number. Records in the cell2d block must be listed in consecutive order from the first to the last. + +\item \texttt{fdc}---is the fractional distance to the cell center. FDC is relative to the first vertex in the ICVERT array. In most cases FDC should be 0.5, which would place the center of the line segment that defines the cell. If the value of FDC is 1, the cell center would located at the last vertex. FDC values of 0 and 1 can be used to place the node at either end of the cell which can be useful for cells with boundary conditions. + +\item \texttt{ncvert}---is the number of vertices required to define the cell. There may be a different number of vertices for each cell. + +\item \texttt{icvert}---is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/swf-disl-dimensions.dat b/doc/mf6io/mf6ivar/tex/swf-disl-dimensions.dat new file mode 100644 index 00000000000..f823db64bc0 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-disl-dimensions.dat @@ -0,0 +1,4 @@ +BEGIN DIMENSIONS + NODES + [NVERT ] +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-disl-griddata.dat b/doc/mf6io/mf6ivar/tex/swf-disl-griddata.dat new file mode 100644 index 00000000000..cc95929f605 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-disl-griddata.dat @@ -0,0 +1,10 @@ +BEGIN GRIDDATA + REACH_LENGTH + -- READARRAY + REACH_BOTTOM + -- READARRAY + [TOREACH + -- READARRAY] + [IDOMAIN + -- READARRAY] +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/swf-disl-options.dat b/doc/mf6io/mf6ivar/tex/swf-disl-options.dat new file mode 100644 index 00000000000..7293142029f --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-disl-options.dat @@ -0,0 +1,9 @@ +BEGIN OPTIONS + [LENGTH_UNITS ] + [LENGTH_CONVERT ] + [TIME_CONVERT ] + [NOGRB] + [XORIGIN ] + [YORIGIN ] + [ANGROT ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-disl-vertices.dat b/doc/mf6io/mf6ivar/tex/swf-disl-vertices.dat new file mode 100644 index 00000000000..76c179add38 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-disl-vertices.dat @@ -0,0 +1,5 @@ +BEGIN VERTICES + + + ... +END VERTICES diff --git a/doc/mf6io/mf6ivar/tex/swf-flw-desc.tex b/doc/mf6io/mf6ivar/tex/swf-flw-desc.tex new file mode 100644 index 00000000000..8010a176bfd --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-flw-desc.tex @@ -0,0 +1,49 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{auxiliary}---defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. + +\item \texttt{auxmultname}---name of auxiliary variable to be used as multiplier of flow rate. + +\item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of inflow cells. + +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of inflow information will be written to the listing file immediately after it is read. + +\item \texttt{PRINT\_FLOWS}---keyword to indicate that the list of inflow flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that inflow flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\item \texttt{TS6}---keyword to specify that record corresponds to a time-series file. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{ts6\_filename}---defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. + +\item \texttt{OBS6}---keyword to specify that record corresponds to an observations file. + +\item \texttt{obs6\_filename}---name of input file to define observations for the inflow package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the inflow package. + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{maxbound}---integer value specifying the maximum number of inflow cells that will be specified for use during any stress period. + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. + +\item \texttt{cellid}---is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. + +\item \textcolor{blue}{\texttt{q}---is the volumetric inflow rate. A positive value indicates inflow to the stream. Negative values are not allows. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{aux}---represents the values of the auxiliary variables for each inflow. The values of auxiliary variables must be present for each inflow. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \texttt{boundname}---name of the inflow cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/swf-flw-dimensions.dat b/doc/mf6io/mf6ivar/tex/swf-flw-dimensions.dat new file mode 100644 index 00000000000..7b4c7bf6ec7 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-flw-dimensions.dat @@ -0,0 +1,3 @@ +BEGIN DIMENSIONS + MAXBOUND +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-flw-options.dat b/doc/mf6io/mf6ivar/tex/swf-flw-options.dat new file mode 100644 index 00000000000..0985bd51e40 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-flw-options.dat @@ -0,0 +1,10 @@ +BEGIN OPTIONS + [AUXILIARY ] + [AUXMULTNAME ] + [BOUNDNAMES] + [PRINT_INPUT] + [PRINT_FLOWS] + [SAVE_FLOWS] + [TS6 FILEIN ] + [OBS6 FILEIN ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-flw-period.dat b/doc/mf6io/mf6ivar/tex/swf-flw-period.dat new file mode 100644 index 00000000000..8ba81439e8c --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-flw-period.dat @@ -0,0 +1,5 @@ +BEGIN PERIOD + <@q@> [<@aux(naux)@>] [] + <@q@> [<@aux(naux)@>] [] + ... +END PERIOD diff --git a/doc/mf6io/mf6ivar/tex/swf-ic-desc.tex b/doc/mf6io/mf6ivar/tex/swf-ic-desc.tex new file mode 100644 index 00000000000..861ed3a4d65 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-ic-desc.tex @@ -0,0 +1,9 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: GRIDDATA} + +\begin{description} +\item \texttt{strt}---is the initial (starting) stage---that is, stage at the beginning of the SWF Model simulation. STRT must be specified for all SWF Model simulations. One value is read for every model reach. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/swf-ic-griddata.dat b/doc/mf6io/mf6ivar/tex/swf-ic-griddata.dat new file mode 100644 index 00000000000..260626850a7 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-ic-griddata.dat @@ -0,0 +1,4 @@ +BEGIN GRIDDATA + STRT [LAYERED] + -- READARRAY +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/swf-nam-desc.tex b/doc/mf6io/mf6ivar/tex/swf-nam-desc.tex new file mode 100644 index 00000000000..fdc7325d2d0 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-nam-desc.tex @@ -0,0 +1,29 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{list}---is name of the listing file to create for this SWF model. If not specified, then the name of the list file will be the basename of the SWF model name file and the '.lst' extension. For example, if the SWF name file is called ``my.model.nam'' then the list file will be called ``my.model.lst''. + +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of all model stress package information will be written to the listing file immediately after it is read. + +\item \texttt{PRINT\_FLOWS}---keyword to indicate that the list of all model package flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that all model package flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\item \texttt{NEWTON}---keyword that activates the Newton-Raphson formulation for surface water flow between connected reaches and stress packages that support calculation of Newton-Raphson terms. + +\item \texttt{UNDER\_RELAXATION}---keyword that indicates whether the surface water stage in a reach will be under-relaxed when water levels fall below the bottom of the model below any given cell. By default, Newton-Raphson UNDER\_RELAXATION is not applied. + +\end{description} +\item \textbf{Block: PACKAGES} + +\begin{description} +\item \texttt{ftype}---is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. + +\item \texttt{fname}---is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. + +\item \texttt{pname}---is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single SWF Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/swf-nam-options.dat b/doc/mf6io/mf6ivar/tex/swf-nam-options.dat new file mode 100644 index 00000000000..6b14ff01860 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-nam-options.dat @@ -0,0 +1,7 @@ +BEGIN OPTIONS + [LIST ] + [PRINT_INPUT] + [PRINT_FLOWS] + [SAVE_FLOWS] + [NEWTON [UNDER_RELAXATION]] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-nam-packages.dat b/doc/mf6io/mf6ivar/tex/swf-nam-packages.dat new file mode 100644 index 00000000000..ee5dc814ee7 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-nam-packages.dat @@ -0,0 +1,5 @@ +BEGIN PACKAGES + [] + [] + ... +END PACKAGES diff --git a/doc/mf6io/mf6ivar/tex/swf-oc-desc.tex b/doc/mf6io/mf6ivar/tex/swf-oc-desc.tex new file mode 100644 index 00000000000..f51943daac6 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-oc-desc.tex @@ -0,0 +1,67 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{BUDGET}---keyword to specify that record corresponds to the budget. + +\item \texttt{FILEOUT}---keyword to specify that an output filename is expected next. + +\item \texttt{budgetfile}---name of the output file to write budget information. + +\item \texttt{BUDGETCSV}---keyword to specify that record corresponds to the budget CSV. + +\item \texttt{budgetcsvfile}---name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. + +\item \texttt{QOUTFLOW}---keyword to specify that record corresponds to qoutflow. + +\item \texttt{qoutflowfile}---name of the output file to write conc information. + +\item \texttt{STAGE}---keyword to specify that record corresponds to stage. + +\item \texttt{stagefile}---name of the output file to write stage information. + +\item \texttt{PRINT\_FORMAT}---keyword to specify format for printing to the listing file. + +\item \texttt{columns}---number of columns for writing data. + +\item \texttt{width}---width for writing each number. + +\item \texttt{digits}---number of digits to use for writing a number. + +\item \texttt{format}---write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. + +\item \texttt{SAVE}---keyword to indicate that information will be saved this stress period. + +\item \texttt{PRINT}---keyword to indicate that information will be printed this stress period. + +\item \texttt{rtype}---type of information to save or print. Can be BUDGET. + +\item \texttt{ocsetting}---specifies the steps for which the data will be saved. + +\begin{lstlisting}[style=blockdefinition] +ALL +FIRST +LAST +FREQUENCY +STEPS +\end{lstlisting} + +\item \texttt{ALL}---keyword to indicate save for all time steps in period. + +\item \texttt{FIRST}---keyword to indicate save for first step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +\item \texttt{LAST}---keyword to indicate save for last step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +\item \texttt{frequency}---save at the specified time step frequency. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +\item \texttt{steps}---save for each step specified in STEPS. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/swf-oc-options.dat b/doc/mf6io/mf6ivar/tex/swf-oc-options.dat new file mode 100644 index 00000000000..1d4158b95ef --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-oc-options.dat @@ -0,0 +1,7 @@ +BEGIN OPTIONS + [BUDGET FILEOUT ] + [BUDGETCSV FILEOUT ] + [QOUTFLOW FILEOUT ] + [STAGE FILEOUT ] + [QOUTFLOW PRINT_FORMAT COLUMNS WIDTH DIGITS ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-oc-period.dat b/doc/mf6io/mf6ivar/tex/swf-oc-period.dat new file mode 100644 index 00000000000..abcceee3794 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-oc-period.dat @@ -0,0 +1,4 @@ +BEGIN PERIOD + [SAVE ] + [PRINT ] +END PERIOD diff --git a/doc/mf6io/mf6ivar/tex/swf-sto-desc.tex b/doc/mf6io/mf6ivar/tex/swf-sto-desc.tex new file mode 100644 index 00000000000..6dcc4848721 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-sto-desc.tex @@ -0,0 +1,19 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{SAVE\_FLOWS}---keyword to indicate that cell-by-cell flow terms will be written to the file specified with ``BUDGET SAVE FILE'' in Output Control. + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. + +\item \texttt{STEADY-STATE}---keyword to indicate that stress period IPER is steady-state. Steady-state conditions will apply until the TRANSIENT keyword is specified in a subsequent BEGIN PERIOD block. + +\item \texttt{TRANSIENT}---keyword to indicate that stress period IPER is transient. Transient conditions will apply until the STEADY-STATE keyword is specified in a subsequent BEGIN PERIOD block. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/swf-sto-options.dat b/doc/mf6io/mf6ivar/tex/swf-sto-options.dat new file mode 100644 index 00000000000..f8518b490f4 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-sto-options.dat @@ -0,0 +1,3 @@ +BEGIN OPTIONS + [SAVE_FLOWS] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-sto-period.dat b/doc/mf6io/mf6ivar/tex/swf-sto-period.dat new file mode 100644 index 00000000000..79facd4fd1d --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-sto-period.dat @@ -0,0 +1,4 @@ +BEGIN PERIOD + [STEADY-STATE] + [TRANSIENT] +END PERIOD diff --git a/doc/mf6io/mf6ivar/tex/swf-zdg-desc.tex b/doc/mf6io/mf6ivar/tex/swf-zdg-desc.tex new file mode 100644 index 00000000000..4a80dcfebd6 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-zdg-desc.tex @@ -0,0 +1,53 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{auxiliary}---defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. + +\item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of zero-depth-gradient boundary cells. + +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of zero-depth-gradient boundary information will be written to the listing file immediately after it is read. + +\item \texttt{PRINT\_FLOWS}---keyword to indicate that the list of zero-depth-gradient boundary flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that zero-depth-gradient boundary flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\item \texttt{TS6}---keyword to specify that record corresponds to a time-series file. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{ts6\_filename}---defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. + +\item \texttt{OBS6}---keyword to specify that record corresponds to an observations file. + +\item \texttt{obs6\_filename}---name of input file to define observations for the Zero-Depth-Gradient Boundary package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the Zero-Depth-Gradient Boundary package. + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{maxbound}---integer value specifying the maximum number of zero-depth-gradient boundary cells that will be specified for use during any stress period. + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. + +\item \texttt{cellid}---is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. + +\item \texttt{idcxs}---is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel. + +\item \textcolor{blue}{\texttt{width}---is the channel width of the zero-depth gradient boundary. If a cross section is associated with this boundary, the width will be scaled by the cross section information. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{slope}---is the channel slope used to calculate flow to the zero-depth-gradient boundary. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{rough}---is the Manning channel roughness value used to calculate flow to the zero-depth-gradient boundary. If a cross section is associated with this boundary, the roughness value will be multiplied by the roughness fraction for each part of the cross section. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{aux}---represents the values of the auxiliary variables for each zero-depth-gradient boundary. The values of auxiliary variables must be present for each zero-depth-gradient boundary. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \texttt{boundname}---name of the zero-depth-gradient boundary cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/swf-zdg-dimensions.dat b/doc/mf6io/mf6ivar/tex/swf-zdg-dimensions.dat new file mode 100644 index 00000000000..7b4c7bf6ec7 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-zdg-dimensions.dat @@ -0,0 +1,3 @@ +BEGIN DIMENSIONS + MAXBOUND +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-zdg-options.dat b/doc/mf6io/mf6ivar/tex/swf-zdg-options.dat new file mode 100644 index 00000000000..81fbb8ec572 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-zdg-options.dat @@ -0,0 +1,9 @@ +BEGIN OPTIONS + [AUXILIARY ] + [BOUNDNAMES] + [PRINT_INPUT] + [PRINT_FLOWS] + [SAVE_FLOWS] + [TS6 FILEIN ] + [OBS6 FILEIN ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-zdg-period.dat b/doc/mf6io/mf6ivar/tex/swf-zdg-period.dat new file mode 100644 index 00000000000..42047f6e47e --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-zdg-period.dat @@ -0,0 +1,5 @@ +BEGIN PERIOD + <@width@> <@slope@> <@rough@> [<@aux(naux)@>] [] + <@width@> <@slope@> <@rough@> [<@aux(naux)@>] [] + ... +END PERIOD diff --git a/doc/mf6io/obs/obs-swf.tex b/doc/mf6io/obs/obs-swf.tex new file mode 100644 index 00000000000..033a2a670a9 --- /dev/null +++ b/doc/mf6io/obs/obs-swf.tex @@ -0,0 +1,7 @@ +Observations are available for SWF models and SWF stress packages. Available observation types have been listed for each package that supports observations (tables~\ref{table:swfobstype}. All available observation types are repeated in Table~\ref{table:swf-obstypetable} for convenience. + +The sign convention adopted for transport observations are identical to the conventions used in budgets contained in listing files and used in the cell-by-cell budget output. For flow-ja-face observation types, negative and positive values represent a loss from and gain to the cellid specified for ID, respectively. For standard stress packages, negative and positive values represent a loss from and gain to the GWT model, respectively. + +\FloatBarrier +\input{../Common/swf-obstypetable} +\FloatBarrier diff --git a/doc/mf6io/obs/obs.tex b/doc/mf6io/obs/obs.tex index 618f6cdff95..089d5840099 100644 --- a/doc/mf6io/obs/obs.tex +++ b/doc/mf6io/obs/obs.tex @@ -35,3 +35,6 @@ \subsubsection{GWT Observations} \subsubsection{GWE Observations} \input{./obs/obs-gwe.tex} + +\subsubsection{SWF Observations} +\input{./obs/obs-swf.tex} diff --git a/doc/mf6io/swf/chd.tex b/doc/mf6io/swf/chd.tex new file mode 100644 index 00000000000..3be8fc09c13 --- /dev/null +++ b/doc/mf6io/swf/chd.tex @@ -0,0 +1,49 @@ + +Input to the Constant-Head (CHD) Package is read from the file that has type ``CHD6'' in the Name File. Any number of CHD Packages can be specified for a single model; however, an error will occur if a CHD Package attempts to make a SWF cell a constant-head cell when that cell has already been designated as a constant-head cell either within the present CHD Package or within another CHD Package. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\vspace{5mm} + +\noindent \textit{FOR EACH SIMULATION} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-chd-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-chd-dimensions.dat} +\vspace{5mm} +\noindent \textit{FOR ANY STRESS PERIOD} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-chd-period.dat} +\packageperioddescription + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/swf-chd-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/swf-chd-example.dat} + +%\vspace{5mm} +%\subsubsection{Available observation types} +%CHD Package observations are limited to the simulated constant head flow rate (\texttt{chd}). The data required for the CHD Package observation type is defined in table~\ref{table:swf-chdobstype}. Negative and positive values for an observation represent a loss from and gain to the GWF model, respectively. + +%\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +%\caption{Available CHD Package observation types} \tabularnewline +% +%\hline +%\hline +%\textbf{Model} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +%\hline +%\endhead +% +%\hline +%\endfoot +% +%\input{../Common/gwf-chdobs.tex} +%\label{table:gwf-chdobstype} +%\end{longtable} +% +%\vspace{5mm} +%\subsubsection{Example Observation Input File} +%\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwf-chd-example-obs.dat} + diff --git a/doc/mf6io/swf/cxs.tex b/doc/mf6io/swf/cxs.tex new file mode 100644 index 00000000000..a7a938ef044 --- /dev/null +++ b/doc/mf6io/swf/cxs.tex @@ -0,0 +1,19 @@ +Input to the Cross Section (CXS) Package is read from the file that has type ``CXS6'' in the Name File. One CXS Package can be specified for each SWF model. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-cxs-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-cxs-dimensions.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-cxs-packagedata.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-cxs-crosssectiondata.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/swf-cxs-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/swf-cxs-example.dat} + diff --git a/doc/mf6io/swf/dfw.tex b/doc/mf6io/swf/dfw.tex new file mode 100644 index 00000000000..84b7193dc71 --- /dev/null +++ b/doc/mf6io/swf/dfw.tex @@ -0,0 +1,17 @@ +Input to the Diffusive Wave (DFW) Package is read from the file that has type ``DFW6'' in the Name File. The DWF Package is required for each SWF model. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-dfw-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-dfw-griddata.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/swf-dfw-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/swf-dfw-example.dat} + diff --git a/doc/mf6io/swf/disl.tex b/doc/mf6io/swf/disl.tex new file mode 100644 index 00000000000..605c779ff04 --- /dev/null +++ b/doc/mf6io/swf/disl.tex @@ -0,0 +1,22 @@ +Input to the Line Discretization (DISL) Package is read from the file that has type ``DISL6'' in the Name File. Only one DISL Package can be specified for a SWF Model. + +The DISL VERTICES and CELL2D blocks are not required. In general, it is recommended to include the VERTICES and CELL2D blocks so that external programs can plot the line network. + + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disl-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disl-dimensions.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disl-griddata.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disl-vertices.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disl-cell2d.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/swf-disl-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/swf-disl-example.dat} diff --git a/doc/mf6io/swf/flw.tex b/doc/mf6io/swf/flw.tex new file mode 100644 index 00000000000..9187e133868 --- /dev/null +++ b/doc/mf6io/swf/flw.tex @@ -0,0 +1,47 @@ +Input to the Inflow (FLW) Package is read from the file that has type ``FLW6'' in the Name File. Any number of FLW Packages can be specified for a single surface water flow model. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\vspace{5mm} + +\noindent \textit{FOR EACH SIMULATION} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-flw-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-flw-dimensions.dat} +\vspace{5mm} +\noindent \textit{FOR ANY STRESS PERIOD} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-flw-period.dat} +\packageperioddescription + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/swf-flw-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/swf-flw-example.dat} + +%\vspace{5mm} +%\subsubsection{Available observation types} +%Well Package observations include the simulated well rates (\texttt{wel}), the well discharge that is available for the MVR package (\texttt{to-mvr}), and the reduction in the specified \texttt{q} when the \texttt{AUTO\_FLOW\_REDUCE} option is enabled. The data required for each WEL Package observation type is defined in table~\ref{table:gwf-welobstype}. The sum of \texttt{wel} and \texttt{to-mvr} is equal to the simulated well discharge rate, which may be less than the specified \texttt{q} if the \texttt{AUTO\_FLOW\_REDUCE} option is enabled. The \texttt{DNODATA} value is returned if the \texttt{wel-reduction} observation is specified but the \texttt{AUTO\_FLOW\_REDUCE} option is not enabled. Negative and positive values for an observation represent a loss from and gain to the GWF model, respectively. + +%\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +%\caption{Available WEL Package observation types} \tabularnewline + +%\hline +%\hline +%\textbf{Stress Package} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +%\hline +%\endhead + +%\hline +%\endfoot + +%\input{../Common/gwf-welobs.tex} +%\label{table:gwf-welobstype} +%\end{longtable} + +%\vspace{5mm} +%\subsubsection{Example Observation Input File} +%\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwf-wel-example-obs.dat} diff --git a/doc/mf6io/swf/ic.tex b/doc/mf6io/swf/ic.tex new file mode 100644 index 00000000000..267097966c3 --- /dev/null +++ b/doc/mf6io/swf/ic.tex @@ -0,0 +1,17 @@ +Initial Conditions (IC) Package information is read from the file that is specified by ``IC6'' as the file type. Only one IC Package can be specified for a SWF model. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +%\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-ic-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-ic-griddata.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/swf-ic-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/swf-ic-example.dat} + diff --git a/doc/mf6io/swf/namefile.tex b/doc/mf6io/swf/namefile.tex new file mode 100644 index 00000000000..a49780ef249 --- /dev/null +++ b/doc/mf6io/swf/namefile.tex @@ -0,0 +1,45 @@ +The SWF Model Name File specifies the options and packages that are active for a SWF model. The Name File contains two blocks: OPTIONS and PACKAGES. The lines in each block can be in any order. Files listed in the PACKAGES block must exist when the program starts. + +Comment lines are indicated when the first character in a line is one of the valid comment characters. Commented lines can be located anywhere in the file. Any text characters can follow the comment character. Comment lines have no effect on the simulation; their purpose is to allow users to provide documentation about a particular simulation. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-nam-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-nam-packages.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/swf-nam-desc.tex} +\end{description} + +\begin{table}[H] +\caption{Ftype values described in this report. The \texttt{Pname} column indicates whether or not a package name can be provided in the name file. The capability to provide a package name also indicates that the SWF Model can have more than one package of that Ftype} +\small +\begin{center} +\begin{tabular*}{\columnwidth}{l l l} +\hline +\hline +Ftype & Input File Description & \texttt{Pname}\\ +\hline +DISL6 & Line Network Discretization Input File \\ +DFW6 & Diffusive Wave Package \\ +CXS6 & Cross Section Package \\ +OC6 & Output Control Option \\ +IC6 & Initial Conditions Package \\ +STO6 & Storage Package \\ +CHD6 & Constant Head Package & * \\ +FLW6 & Inflow Package & * \\ +ZDG6 & Zero-Depth Gradient Package & * \\ +OBS6 & Observations Option \\ +\hline +\end{tabular*} +\label{table:ftype} +\end{center} +\normalsize +\end{table} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/swf-nam-example.dat} + diff --git a/doc/mf6io/swf/oc.tex b/doc/mf6io/swf/oc.tex new file mode 100644 index 00000000000..4bd077a215a --- /dev/null +++ b/doc/mf6io/swf/oc.tex @@ -0,0 +1,21 @@ +Input to the Output Control Option of the Surface Water Flow Model is read from the file that is specified as type ``OC6'' in the Name File. If no ``OC6'' file is specified, default output control is used. The Output Control Option determines how and when outflows are printed to the listing file and/or written to a separate binary output file. Under the default, outflow and overall flow budget are written to the Listing File at the end of every stress period. The default printout format for concentrations is 10G11.4. The outflow and overall flow budget are also written to the list file if the simulation terminates prematurely due to failed convergence. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\vspace{5mm} + +\noindent \textit{FOR EACH SIMULATION} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-oc-options.dat} +\vspace{5mm} +\noindent \textit{FOR ANY STRESS PERIOD} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-oc-period.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/swf-oc-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/swf-oc-example.dat} diff --git a/doc/mf6io/swf/sto.tex b/doc/mf6io/swf/sto.tex new file mode 100644 index 00000000000..31df3df987f --- /dev/null +++ b/doc/mf6io/swf/sto.tex @@ -0,0 +1,22 @@ +Input to the Storage (STO) Package is read from the file that has type ``STO6'' in the Name File. If the STO Package is not included for a model, then storage changes will not be calculated, and thus, the model will be steady state. Only one STO Package can be specified for a SWF model. + +\vspace{5mm} +\subsubsection{Structure of Blocks} + +\vspace{5mm} +\noindent \textit{FOR EACH SIMULATION} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-sto-options.dat} +\vspace{5mm} +\noindent \textit{FOR ANY STRESS PERIOD} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-sto-period.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/swf-sto-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/swf-sto-example.dat} + diff --git a/doc/mf6io/swf/swf-obs.tex b/doc/mf6io/swf/swf-obs.tex new file mode 100644 index 00000000000..6a8c70d8d62 --- /dev/null +++ b/doc/mf6io/swf/swf-obs.tex @@ -0,0 +1,39 @@ + +SWF Model observations include the simulated stage (\texttt{stage}) at a cell, and the flow between two connected cells (\texttt{flow-ja-face}). The data required for each SWF Model observation type is defined in table~\ref{table:swfobstype}. For \texttt{flow-ja-face} observation types, negative and positive values represent a loss from and gain to the \texttt{cellid} specified for ID, respectively. + +\subsubsection{Structure of Blocks} +\vspace{5mm} + +\noindent \textit{FOR EACH SIMULATION} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/utl-obs-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/utl-obs-continuous.dat} + +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/utl-obs-desc.tex} +\end{description} + + +\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +\caption{Available SWF model observation types} \tabularnewline + +\hline +\hline +\textbf{Model} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endhead + +\hline +\endfoot + +\input{../Common/swf-obs.tex} +\label{table:swfobstype} +\end{longtable} + +\vspace{5mm} +\subsubsection{Example Observation Input File} + +An example GWF Model observation file is shown below. + +\lstinputlisting[style=inputfile]{./mf6ivar/examples/utl-obs-swf-example.dat} + diff --git a/doc/mf6io/swf/swf.tex b/doc/mf6io/swf/swf.tex new file mode 100644 index 00000000000..0dd100074e7 --- /dev/null +++ b/doc/mf6io/swf/swf.tex @@ -0,0 +1,61 @@ +The SWF Model simulates one-dimensional routing of surface water using the diffusive wave approach. + +\subsection{Units of Length and Time} +The SWF Model simulates surface water routing without using prescribed length and time units. Any consistent units of length and time can be used when specifying the input data for a simulation. This capability gives a certain amount of freedom to the user, but care must be exercised to avoid mixing units. The program cannot detect the use of inconsistent units. + +\subsection{Flow Budget} +A summary of all inflow (sources) and outflow (sinks) is called a flow budget. \mf calculates a flow budget for the overall model as a check on the acceptability of the solution, and to provide a summary of the sources and sinks to the flow system. The flow budget is printed to theSWF Model Listing File for selected time steps. + +\subsection{Time Stepping} + +For the present implementation of the SWF Model, all terms are solved implicitly using the Iterative Model Solution (IMS). In \mf time step lengths are controlled by the user and specified in the Temporal Discretization (TDIS) input file. Instructions for specifying time steps are described in the TDIS section of this user guide. + +\newpage +\subsection{SWF Model Name File} +\input{swf/namefile.tex} + +\newpage +\subsection{Discretization by Lines (DISL) Package} +\input{swf/disl} + +\newpage +\subsection{Diffusive Wave (DFW) Package} +\input{swf/dfw} + +\newpage +\subsection{Cross Section (CXS) Package} +\input{swf/cxs} + +\newpage +\subsection{Output Control (OC) Option} +\input{swf/oc} + +\newpage +\subsection{Initial Conditions (IC) Package} +\input{swf/ic} + +\newpage +\subsection{Storage (STO) Package} +\input{swf/sto} + +\newpage +\subsection{Constant Head (CHD) Package} +\input{swf/chd} + +\newpage +\subsection{Inflow (FLW) Package} +\input{swf/flw} + +\newpage +\subsection{Zero-Depth Gradient (ZDG) Package} +\input{swf/zdg} + +\newpage +\subsection{Observation (OBS) Utility for a SWF Model} +\input{swf/swf-obs} + +\newpage +\subsection{Inflow (FLW) Package} +\input{swf/flw} + + diff --git a/doc/mf6io/swf/zdg.tex b/doc/mf6io/swf/zdg.tex new file mode 100644 index 00000000000..785626d57a6 --- /dev/null +++ b/doc/mf6io/swf/zdg.tex @@ -0,0 +1,47 @@ +Input to the Zero-Depth-Gradient (ZDG) Package is read from the file that has type ``ZDG6'' in the Name File. Any number of ZDG Packages can be specified for a single surface water flow model. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\vspace{5mm} + +\noindent \textit{FOR EACH SIMULATION} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-zdg-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-zdg-dimensions.dat} +\vspace{5mm} +\noindent \textit{FOR ANY STRESS PERIOD} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-zdg-period.dat} +\packageperioddescription + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/swf-zdg-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/swf-zdg-example.dat} + +%\vspace{5mm} +%\subsubsection{Available observation types} +%Well Package observations include the simulated well rates (\texttt{wel}), the well discharge that is available for the MVR package (\texttt{to-mvr}), and the reduction in the specified \texttt{q} when the \texttt{AUTO\_FLOW\_REDUCE} option is enabled. The data required for each WEL Package observation type is defined in table~\ref{table:gwf-welobstype}. The sum of \texttt{wel} and \texttt{to-mvr} is equal to the simulated well discharge rate, which may be less than the specified \texttt{q} if the \texttt{AUTO\_FLOW\_REDUCE} option is enabled. The \texttt{DNODATA} value is returned if the \texttt{wel-reduction} observation is specified but the \texttt{AUTO\_FLOW\_REDUCE} option is not enabled. Negative and positive values for an observation represent a loss from and gain to the GWF model, respectively. + +%\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +%\caption{Available WEL Package observation types} \tabularnewline + +%\hline +%\hline +%\textbf{Stress Package} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +%\hline +%\endhead + +%\hline +%\endfoot + +%\input{../Common/gwf-welobs.tex} +%\label{table:gwf-welobstype} +%\end{longtable} + +%\vspace{5mm} +%\subsubsection{Example Observation Input File} +%\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwf-wel-example-obs.dat} diff --git a/make/makefile b/make/makefile index ef6f84526e1..bc7f1d45cdc 100644 --- a/make/makefile +++ b/make/makefile @@ -30,12 +30,13 @@ SOURCEDIR23=../src/Utilities/Matrix SOURCEDIR24=../src/Utilities/Observation SOURCEDIR25=../src/Model SOURCEDIR26=../src/Model/Connection -SOURCEDIR27=../src/Model/GroundWaterTransport -SOURCEDIR28=../src/Model/ModelUtilities -SOURCEDIR29=../src/Model/GroundWaterFlow -SOURCEDIR30=../src/Model/TransportModel -SOURCEDIR31=../src/Model/Geometry -SOURCEDIR32=../src/Model/GroundWaterEnergy +SOURCEDIR27=../src/Model/SurfaceWaterFlow +SOURCEDIR28=../src/Model/GroundWaterTransport +SOURCEDIR29=../src/Model/ModelUtilities +SOURCEDIR30=../src/Model/GroundWaterFlow +SOURCEDIR31=../src/Model/TransportModel +SOURCEDIR32=../src/Model/Geometry +SOURCEDIR33=../src/Model/GroundWaterEnergy VPATH = \ ${SOURCEDIR1} \ @@ -69,7 +70,8 @@ ${SOURCEDIR28} \ ${SOURCEDIR29} \ ${SOURCEDIR30} \ ${SOURCEDIR31} \ -${SOURCEDIR32} +${SOURCEDIR32} \ +${SOURCEDIR33} .SUFFIXES: .f90 .F90 .o @@ -93,6 +95,14 @@ $(OBJDIR)/CharString.o \ $(OBJDIR)/InputDefinition.o \ $(OBJDIR)/Memory.o \ $(OBJDIR)/List.o \ +$(OBJDIR)/swf1zdg1idm.o \ +$(OBJDIR)/swf1idm.o \ +$(OBJDIR)/swf1ic1idm.o \ +$(OBJDIR)/swf1flw1idm.o \ +$(OBJDIR)/swf1disl1idm.o \ +$(OBJDIR)/swf1dfw1idm.o \ +$(OBJDIR)/swf1cxs1idm.o \ +$(OBJDIR)/swf1chd1idm.o \ $(OBJDIR)/simtdisidm.o \ $(OBJDIR)/simnamidm.o \ $(OBJDIR)/gwt1idm.o \ @@ -124,6 +134,7 @@ $(OBJDIR)/gwe1disu1idm.o \ $(OBJDIR)/gwe1dis1idm.o \ $(OBJDIR)/gwe1ctp1idm.o \ $(OBJDIR)/gwe1cnd1idm.o \ +$(OBJDIR)/swfgwfidm.o \ $(OBJDIR)/gwtgwtidm.o \ $(OBJDIR)/gwfgwtidm.o \ $(OBJDIR)/gwfgwfidm.o \ @@ -132,6 +143,7 @@ $(OBJDIR)/gwegweidm.o \ $(OBJDIR)/LongLineReader.o \ $(OBJDIR)/DevFeature.o \ $(OBJDIR)/MemoryList.o \ +$(OBJDIR)/IdmSwfDfnSelector.o \ $(OBJDIR)/IdmSimDfnSelector.o \ $(OBJDIR)/IdmGwtDfnSelector.o \ $(OBJDIR)/IdmGwfDfnSelector.o \ @@ -154,6 +166,7 @@ $(OBJDIR)/HashTable.o \ $(OBJDIR)/VectorBase.o \ $(OBJDIR)/Sparse.o \ $(OBJDIR)/DisvGeom.o \ +$(OBJDIR)/DislGeom.o \ $(OBJDIR)/ArrayReaders.o \ $(OBJDIR)/TimeSeriesManager.o \ $(OBJDIR)/SmoothingFunctions.o \ @@ -254,6 +267,7 @@ $(OBJDIR)/ims8reordering.o \ $(OBJDIR)/ModflowInput.o \ $(OBJDIR)/IdmLogger.o \ $(OBJDIR)/Integer2dReader.o \ +$(OBJDIR)/SwfCxsUtils.o \ $(OBJDIR)/VirtualExchange.o \ $(OBJDIR)/GridSorting.o \ $(OBJDIR)/DisConnExchange.o \ @@ -297,6 +311,9 @@ $(OBJDIR)/InputLoadType.o \ $(OBJDIR)/Integer1dReader.o \ $(OBJDIR)/Double2dReader.o \ $(OBJDIR)/Double1dReader.o \ +$(OBJDIR)/swf1disl1.o \ +$(OBJDIR)/swf1cxs1.o \ +$(OBJDIR)/swf1ic1.o \ $(OBJDIR)/GridConnection.o \ $(OBJDIR)/DistributedVariable.o \ $(OBJDIR)/gwt1.o \ @@ -312,6 +329,12 @@ $(OBJDIR)/StructArray.o \ $(OBJDIR)/BoundInputContext.o \ $(OBJDIR)/AsciiInputLoadType.o \ $(OBJDIR)/LayeredArrayReader.o \ +$(OBJDIR)/swf1zdg1.o \ +$(OBJDIR)/swf1sto1.o \ +$(OBJDIR)/swf1oc1.o \ +$(OBJDIR)/swf1obs1.o \ +$(OBJDIR)/swf1flw1.o \ +$(OBJDIR)/swf1dfw1.o \ $(OBJDIR)/ExplicitModel.o \ $(OBJDIR)/SpatialModelConnection.o \ $(OBJDIR)/GwtInterfaceModel.o \ @@ -326,6 +349,7 @@ $(OBJDIR)/MappedMemory.o \ $(OBJDIR)/StressListInput.o \ $(OBJDIR)/StressGridInput.o \ $(OBJDIR)/LoadMf6File.o \ +$(OBJDIR)/swf1.o \ $(OBJDIR)/ExplicitSolution.o \ $(OBJDIR)/GwtGwtConnection.o \ $(OBJDIR)/GwfGwfConnection.o \ @@ -340,6 +364,7 @@ $(OBJDIR)/VirtualGwfModel.o \ $(OBJDIR)/VirtualGwfExchange.o \ $(OBJDIR)/VirtualGweModel.o \ $(OBJDIR)/VirtualGweExchange.o \ +$(OBJDIR)/SwfGwfExchange.o \ $(OBJDIR)/SolutionGroup.o \ $(OBJDIR)/SolutionFactory.o \ $(OBJDIR)/GwfGwtExchange.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index b9cbf1a7366..9a4d1a89eb6 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -2,44 +2,50 @@ - + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + + @@ -82,13 +88,13 @@ - + - + - + - + @@ -118,7 +124,9 @@ - + + + @@ -224,6 +232,7 @@ + @@ -240,10 +249,30 @@ + + + + + + + + + + + + + + + + + + + + @@ -288,13 +317,13 @@ - + - + - + - + @@ -303,13 +332,13 @@ - + - + - + - + @@ -338,7 +367,8 @@ - + + @@ -410,23 +440,23 @@ - + - + - + - + - + - + - + - + @@ -459,13 +489,15 @@ - + - + - + - + - - + + + + diff --git a/src/Exchange/SwfGwfExchange.f90 b/src/Exchange/SwfGwfExchange.f90 new file mode 100644 index 00000000000..96bfdc42c72 --- /dev/null +++ b/src/Exchange/SwfGwfExchange.f90 @@ -0,0 +1,3381 @@ +!> @brief This module contains the SwfGwfExchangeModule Module +!! +!! This module contains the code for connecting a SWF model with +!! a GWF model. +!! +!< +module SwfGwfExchangeModule + + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: LINELENGTH, DZERO + use SimVariablesModule, only: errmsg, iout, model_loc_idx + use SimModule, only: count_errors, store_error, store_error_unit, & + store_error_filename + use InputOutputModule, only: getunit, openfile + use MemoryManagerModule, only: mem_allocate + use BaseModelModule, only: BaseModelType, GetBaseModelFromList + use NumericalModelModule, only: NumericalModelType + use BaseExchangeModule, only: BaseExchangeType, AddBaseExchangeToList + use ListsModule, only: basemodellist, baseexchangelist + use BlockParserModule, only: BlockParserType + use ObsModule, only: obs_cr, ObsType + use MemoryHelperModule, only: create_mem_path + use NumericalExchangeModule, only: NumericalExchangeType + use GwfModule, only: GwfModelType + use SwfModule, only: SwfModelType + use MatrixBaseModule + use TableModule, only: TableType, table_cr + + private + public :: swfgwf_cr + + type, extends(NumericalExchangeType) :: SwfGwfExchangeType + + class(NumericalModelType), pointer :: model1 => null() !< model 1 + class(NumericalModelType), pointer :: model2 => null() !< model 2 + class(SwfModelType), pointer :: swfmodel1 => null() !< pointer to SWF Model 1 + class(GwfModelType), pointer :: gwfmodel2 => null() !< pointer to GWF Model 2 + + character(len=LINELENGTH), pointer :: filename => null() !< name of the input file + integer(I4B), pointer :: ipr_input => null() !< flag to print input + integer(I4B), pointer :: ipr_flow => null() !< print flag for cell by cell flows + + integer(I4B), pointer :: nexg => null() !< number of exchanges + integer(I4B), dimension(:), pointer, contiguous :: nodem1 => null() !< node numbers in model 1 + integer(I4B), dimension(:), pointer, contiguous :: nodem2 => null() !< node numbers in model 2 + real(DP), dimension(:), pointer, contiguous :: cond => null() !< conductance, size: nexg + integer(I4B), dimension(:), pointer, contiguous :: idxglo => null() !< mapping to global (solution) amat + integer(I4B), dimension(:), pointer, contiguous :: idxsymglo => null() !< mapping to global (solution) symmetric amat + real(DP), dimension(:), pointer, contiguous :: simvals => null() !< simulated flow rate for each exchange + + type(BlockParserType) :: parser !< block parser for input file (controlled from derived type) + + integer(I4B), pointer :: inobs => null() !< unit number for GWF-GWF observations + type(ObsType), pointer :: obs => null() !< observation object + + ! -- table objects + type(TableType), pointer :: outputtab1 => null() + type(TableType), pointer :: outputtab2 => null() + + contains + + procedure :: exg_df => swf_gwf_df + procedure :: exg_ac => swf_gwf_ac + procedure :: exg_mc => swf_gwf_mc + procedure :: exg_fc => swf_gwf_fc + procedure :: exg_cq => swf_gwf_cq + procedure :: exg_bd => swf_gwf_bd + procedure :: exg_ot => swf_gwf_ot + procedure :: exg_da => swf_gwf_da + procedure :: allocate_scalars + procedure :: allocate_arrays + procedure :: source_options + !procedure :: parse_option + procedure :: source_dimensions + procedure :: source_data + procedure :: swf_gwf_calc_simvals + procedure :: swf_gwf_save_simvals + procedure :: qcalc + procedure :: swf_gwf_add_to_flowja + procedure, private :: swf_gwf_chd_bd + !todo: procedure :: swf_gwf_bdsav_model + procedure :: swf_gwf_bdsav + procedure :: connects_model => swf_gwf_connects_model + + procedure, pass(this) :: noder + procedure, pass(this) :: cellstr + + end type SwfGwfExchangeType + +contains + + !> @ brief Create SWF GWF exchange + !! + !! Create a new SWF to GWF exchange object. + !< + subroutine swfgwf_cr(filename, name, id, m1_id, m2_id, input_mempath) + ! -- modules + ! -- dummy + character(len=*), intent(in) :: filename !< filename for reading + character(len=*) :: name !< exchange name + integer(I4B), intent(in) :: id !< id for the exchange + integer(I4B), intent(in) :: m1_id !< id for model 1 + integer(I4B), intent(in) :: m2_id !< id for model 2 + character(len=*), intent(in) :: input_mempath + ! -- local + type(SwfGwfExchangeType), pointer :: exchange + class(BaseModelType), pointer :: mb + class(BaseExchangeType), pointer :: baseexchange + integer(I4B) :: m1_index, m2_index + ! + ! -- Create a new exchange and add it to the baseexchangelist container + allocate (exchange) + baseexchange => exchange + call AddBaseExchangeToList(baseexchangelist, baseexchange) + ! + ! -- Assign id and name + exchange%id = id + exchange%name = name + exchange%memoryPath = create_mem_path(exchange%name) + exchange%input_mempath = input_mempath + ! + ! -- allocate scalars and set defaults + call exchange%allocate_scalars() + exchange%filename = filename + exchange%typename = 'SWF-GWF' + ! + ! -- set swfmodel1 + m1_index = model_loc_idx(m1_id) + if (m1_index > 0) then + mb => GetBaseModelFromList(basemodellist, m1_index) + select type (mb) + type is (SwfModelType) + exchange%model1 => mb + exchange%swfmodel1 => mb + end select + end if + ! exchange%v_model1 => get_virtual_model(m1_id) + ! exchange%is_datacopy = .not. exchange%v_model1%is_local + ! + ! -- set gwfmodel2 + m2_index = model_loc_idx(m2_id) + if (m2_index > 0) then + mb => GetBaseModelFromList(basemodellist, m2_index) + select type (mb) + type is (GwfModelType) + exchange%model2 => mb + exchange%gwfmodel2 => mb + end select + end if + ! exchange%v_model2 => get_virtual_model(m2_id) + ! + ! -- Verify that gwf model1 is of the correct type + if (.not. associated(exchange%swfmodel1) .and. m1_index > 0) then + write (errmsg, '(3a)') 'Problem with SWF-GWF exchange ', & + trim(exchange%name), & + '. Specified SWF Model does not appear to be of the correct type.' + call store_error(errmsg, terminate=.true.) + end if + ! + ! -- Verify that gwf model2 is of the correct type + if (.not. associated(exchange%gwfmodel2) .and. m2_index > 0) then + write (errmsg, '(3a)') 'Problem with SWF-GWF exchange ', & + trim(exchange%name), & + '. Specified GWF Model does not appear to be of the correct type.' + call store_error(errmsg, terminate=.true.) + end if + ! + ! -- Create the obs package + call obs_cr(exchange%obs, exchange%inobs) + ! + ! -- Return + return + end subroutine swfgwf_cr + + !> @ brief Define SWF GWF exchange + !! + !! Define SWF to GWF exchange object. + !< + subroutine swf_gwf_df(this) + ! -- modules + ! -- dummy + class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType + ! -- local + ! + ! -- log the exchange + write (iout, '(/a,a)') ' Creating exchange: ', this%name + ! + ! -- Ensure models are in same solution + if (associated(this%swfmodel1) .and. associated(this%gwfmodel2)) then + if (this%swfmodel1%idsoln /= this%gwfmodel2%idsoln) then + call store_error('Two models are connected in a SWF-GWF '// & + 'exchange but they are in different solutions. '// & + 'Models must be in same solution: '// & + trim(this%swfmodel1%name)//' '// & + trim(this%gwfmodel2%name)) + call this%parser%StoreErrorUnit() + end if + end if + ! + ! -- source options + call this%source_options(iout) + ! + ! -- source dimensions + call this%source_dimensions(iout) + ! + ! -- allocate arrays + call this%allocate_arrays() + ! + ! -- source exchange data + call this%source_data(iout) + ! + ! -- Store obs + ! call this%swf_gwf_df_obs() + ! if (associated(this%swfmodel1)) then + ! call this%obs%obs_df(iout, this%name, 'SWF-GWF', this%swfmodel1%dis) + ! end if + ! ! + ! ! -- validate + ! call this%validate_exchange() + ! + ! -- Return + return + end subroutine swf_gwf_df + + !> @ brief Add connections + !! + !! Override parent exg_ac so that gnc can add connections here. + !< + subroutine swf_gwf_ac(this, sparse) + ! -- modules + use SparseModule, only: sparsematrix + ! -- dummy + class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType + type(sparsematrix), intent(inout) :: sparse + ! -- local + integer(I4B) :: n, iglo, jglo + ! + ! -- add exchange connections + do n = 1, this%nexg + iglo = this%nodem1(n) + this%swfmodel1%moffset + jglo = this%nodem2(n) + this%gwfmodel2%moffset + call sparse%addconnection(iglo, jglo, 1) + call sparse%addconnection(jglo, iglo, 1) + end do + ! + ! -- Return + return + end subroutine swf_gwf_ac + + !> @ brief Map connections + !! + !! Map the connections in the global matrix + !< + subroutine swf_gwf_mc(this, matrix_sln) + ! -- modules + use SparseModule, only: sparsematrix + ! -- dummy + class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType + class(MatrixBaseType), pointer :: matrix_sln !< the system matrix + ! -- local + integer(I4B) :: n, iglo, jglo + ! + ! -- map exchange connections + do n = 1, this%nexg + iglo = this%nodem1(n) + this%swfmodel1%moffset + jglo = this%nodem2(n) + this%gwfmodel2%moffset + this%idxglo(n) = matrix_sln%get_position(iglo, jglo) + this%idxsymglo(n) = matrix_sln%get_position(jglo, iglo) + end do + ! + ! -- Return + return + end subroutine swf_gwf_mc + + !> @ brief Fill coefficients + !! + !! Fill conductance into coefficient matrix. For now assume + !! all connections are vertical and no newton correction is + !! needed. + !< + subroutine swf_gwf_fc(this, kiter, matrix_sln, rhs_sln, inwtflag) + ! -- modules + ! -- dummy + class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType + integer(I4B), intent(in) :: kiter + class(MatrixBaseType), pointer :: matrix_sln + real(DP), dimension(:), intent(inout) :: rhs_sln + integer(I4B), optional, intent(in) :: inwtflag + ! -- local + integer(I4B) :: i, nodem1sln, nodem2sln + ! + ! -- Put this%cond into amatsln + do i = 1, this%nexg + call matrix_sln%set_value_pos(this%idxglo(i), this%cond(i)) + call matrix_sln%set_value_pos(this%idxsymglo(i), this%cond(i)) + + nodem1sln = this%nodem1(i) + this%swfmodel1%moffset + nodem2sln = this%nodem2(i) + this%gwfmodel2%moffset + call matrix_sln%add_diag_value(nodem1sln, -this%cond(i)) + call matrix_sln%add_diag_value(nodem2sln, -this%cond(i)) + end do + ! + ! -- Return + return + end subroutine swf_gwf_fc + + !> @ brief Calculate flow + !! + !! Calculate flow between two cells and store in simvals, also set + !! information needed for specific discharge calculation + !< + subroutine swf_gwf_cq(this, icnvg, isuppress_output, isolnid) + ! -- dummy + class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType + integer(I4B), intent(inout) :: icnvg + integer(I4B), intent(in) :: isuppress_output + integer(I4B), intent(in) :: isolnid + ! + ! -- calculate flow and store in simvals + call this%swf_gwf_calc_simvals() + ! + ! -- set flows to model edges in NPF + ! todo: do we add these flows for specific discharge calculation? + !call this%swf_gwf_set_flow_to_npf() + ! + ! -- add exchange flows to model's flowja diagonal + call this%swf_gwf_add_to_flowja() + ! + ! -- Return + return + end subroutine swf_gwf_cq + + !> @ brief Deallocate + !! + !! Deallocate memory associated with this object + !< + subroutine swf_gwf_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + ! -- dummy + class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType + ! + ! -- objects + call this%obs%obs_da() + deallocate (this%obs) + ! + ! -- arrays + call mem_deallocate(this%nodem1) + call mem_deallocate(this%nodem2) + call mem_deallocate(this%cond) + call mem_deallocate(this%idxglo) + call mem_deallocate(this%idxsymglo) + call mem_deallocate(this%simvals) + ! + ! -- scalars + deallocate (this%filename) + call mem_deallocate(this%ipr_input) + call mem_deallocate(this%ipr_flow) + call mem_deallocate(this%nexg) + call mem_deallocate(this%inobs) + ! + ! -- Return + return + end subroutine swf_gwf_da + + !> @ brief Allocate scalars + !! + !! Allocate scalar variables + !< + subroutine allocate_scalars(this) + ! -- modules + ! -- dummy + class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType + ! + allocate (this%filename) + this%filename = '' + ! + call mem_allocate(this%ipr_input, 'IPR_INPUT', this%memoryPath) + call mem_allocate(this%ipr_flow, 'IPR_FLOW', this%memoryPath) + call mem_allocate(this%nexg, 'NEXG', this%memoryPath) + call mem_allocate(this%inobs, 'INOBS', this%memoryPath) + ! + this%ipr_input = 0 + this%ipr_flow = 0 + this%nexg = 0 + this%inobs = 0 + ! + ! -- Return + return + end subroutine allocate_scalars + + !> @brief Allocate array data, using the number of + !! connected nodes @param nexg + !< + subroutine allocate_arrays(this) + ! -- dummy + class(SwfGwfExchangeType) :: this !< instance of exchange object + ! + call mem_allocate(this%nodem1, this%nexg, 'NODEM1', this%memoryPath) + call mem_allocate(this%nodem2, this%nexg, 'NODEM2', this%memoryPath) + call mem_allocate(this%cond, this%nexg, 'COND', this%memoryPath) + call mem_allocate(this%idxglo, this%nexg, 'IDXGLO', this%memoryPath) + call mem_allocate(this%idxsymglo, this%nexg, 'IDXSYMGLO', this%memoryPath) + call mem_allocate(this%simvals, this%nexg, 'SIMVALS', this%memoryPath) + ! + ! -- Return + return + end subroutine allocate_arrays + + !> @ brief Source options + !! + !! Source the options block + !< + subroutine source_options(this, iout) + ! -- modules + use ConstantsModule, only: LENVARNAME, DEM6 + use InputOutputModule, only: getunit, openfile + use MemoryManagerExtModule, only: mem_set_value + use CharacterStringModule, only: CharacterStringType + use ExgSwfgwfInputModule, only: ExgSwfgwfParamFoundType + use SourceCommonModule, only: filein_fname + ! -- dummy + class(SwfGwfExchangeType) :: this !< GwfExchangeType + integer(I4B), intent(in) :: iout + ! -- local + type(ExgSwfgwfParamFoundType) :: found + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%ipr_input, 'IPR_INPUT', & + this%input_mempath, found%ipr_input) + call mem_set_value(this%ipr_flow, 'IPR_FLOW', & + this%input_mempath, found%ipr_flow) + ! + write (iout, '(1x,a)') 'PROCESSING SWF-GWF EXCHANGE OPTIONS' + ! + if (found%ipr_input) then + write (iout, '(4x,a)') & + 'THE LIST OF EXCHANGES WILL BE PRINTED.' + end if + ! + if (found%ipr_flow) then + write (iout, '(4x,a)') & + 'EXCHANGE FLOWS WILL BE PRINTED TO LIST FILES.' + end if + ! + ! -- enforce 0 or 1 OBS6_FILENAME entries in option block + ! if (.not. this%is_datacopy) then + ! if (filein_fname(this%obs%inputFilename, 'OBS6_FILENAME', & + ! this%input_mempath, this%filename)) then + ! this%obs%active = .true. + ! this%obs%inUnitObs = GetUnit() + ! call openfile(this%obs%inUnitObs, iout, this%obs%inputFilename, 'OBS') + ! end if + ! end if + ! + write (iout, '(1x,a)') 'END OF SWF-GWF EXCHANGE OPTIONS' + ! + ! -- Return + return + end subroutine source_options + + !> @brief Source dimension from input context + !< + subroutine source_dimensions(this, iout) + ! -- modules + use MemoryManagerExtModule, only: mem_set_value + use ExgSwfgwfInputModule, only: ExgSwfgwfParamFoundType + ! -- dummy + class(SwfGwfExchangeType) :: this !< instance of exchange object + integer(I4B), intent(in) :: iout !< for logging + ! -- local + type(ExgSwfgwfParamFoundType) :: found + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%nexg, 'NEXG', this%input_mempath, found%nexg) + ! + write (iout, '(1x,a)') 'PROCESSING EXCHANGE DIMENSIONS' + ! + if (found%nexg) then + write (iout, '(4x,a,i0)') 'NEXG = ', this%nexg + end if + ! + write (iout, '(1x,a)') 'END OF EXCHANGE DIMENSIONS' + ! + ! -- return + return + end subroutine source_dimensions + + !> @brief + !< + function noder(this, model, cellid, iout) + ! -- modules + use GeomUtilModule, only: get_node + ! -- dummy + class(SwfGwfExchangeType) :: this !< instance of exchange object + class(NumericalModelType), pointer, intent(in) :: model + integer(I4B), dimension(:), pointer, intent(in) :: cellid + integer(I4B), intent(in) :: iout !< the output file unit + integer(I4B) :: noder, node + ! + if (model%dis%ndim == 1) then + node = cellid(1) + elseif (model%dis%ndim == 2) then + node = get_node(cellid(1), 1, cellid(2), & + model%dis%mshape(1), 1, & + model%dis%mshape(2)) + else + node = get_node(cellid(1), cellid(2), cellid(3), & + model%dis%mshape(1), & + model%dis%mshape(2), & + model%dis%mshape(3)) + end if + noder = model%dis%get_nodenumber(node, 0) + ! + ! -- return + return + end function noder + + !> @brief + !< + function cellstr(this, model, cellid, iout) + ! -- modules + ! -- dummy + class(SwfGwfExchangeType) :: this !< instance of exchange object + class(NumericalModelType), pointer, intent(in) :: model + integer(I4B), dimension(:), pointer, intent(in) :: cellid + integer(I4B), intent(in) :: iout !< the output file unit + character(len=20) :: cellstr + character(len=*), parameter :: fmtndim1 = & + "('(',i0,')')" + character(len=*), parameter :: fmtndim2 = & + "('(',i0,',',i0,')')" + character(len=*), parameter :: fmtndim3 = & + "('(',i0,',',i0,',',i0,')')" + ! + cellstr = '' + ! + select case (model%dis%ndim) + case (1) + write (cellstr, fmtndim1) cellid(1) + case (2) + write (cellstr, fmtndim2) cellid(1), cellid(2) + case (3) + write (cellstr, fmtndim3) cellid(1), cellid(2), cellid(3) + case default + end select + ! + ! -- return + return + end function cellstr + + !> @brief Source exchange data from input context + !< + subroutine source_data(this, iout) + ! -- modules + use MemoryManagerModule, only: mem_setptr + ! -- dummy + class(SwfGwfExchangeType) :: this !< instance of exchange object + integer(I4B), intent(in) :: iout !< the output file unit + ! -- local + integer(I4B), dimension(:, :), contiguous, pointer :: cellidm1 + integer(I4B), dimension(:, :), contiguous, pointer :: cellidm2 + real(DP), dimension(:), contiguous, pointer :: cond + character(len=20) :: cellstr1, cellstr2 + integer(I4B) :: nerr + integer(I4B) :: iexg, nodem1, nodem2 + ! -- format + character(len=*), parameter :: fmtexglabel = "(1x, 3a10, 50(a16))" + character(len=*), parameter :: fmtexgdata = & + "(5x, a, 1x, a ,50(1pg16.6))" + ! + call mem_setptr(cellidm1, 'CELLIDM1', this%input_mempath) + call mem_setptr(cellidm2, 'CELLIDM2', this%input_mempath) + call mem_setptr(cond, 'COND', this%input_mempath) + ! + write (iout, '(1x,a)') 'PROCESSING EXCHANGEDATA' + ! + if (this%ipr_input /= 0) then + write (iout, fmtexglabel) 'NODEM1', 'NODEM2', 'COND' + end if + ! + do iexg = 1, this%nexg + ! + if (associated(this%model1)) then + ! + ! -- Determine user node number + nodem1 = this%noder(this%model1, cellidm1(:, iexg), iout) + this%nodem1(iexg) = nodem1 + ! + else + this%nodem1(iexg) = -1 + end if + ! + if (associated(this%model2)) then + ! + ! -- Determine user node number + nodem2 = this%noder(this%model2, cellidm2(:, iexg), iout) + this%nodem2(iexg) = nodem2 + ! + else + this%nodem2(iexg) = -1 + end if + ! + ! -- Read rest of input line + this%cond(iexg) = cond(iexg) + ! + ! -- Write the data to listing file if requested + if (this%ipr_input /= 0) then + cellstr1 = this%cellstr(this%model1, cellidm1(:, iexg), iout) + cellstr2 = this%cellstr(this%model2, cellidm2(:, iexg), iout) + write (iout, fmtexgdata) trim(cellstr1), trim(cellstr2), & + this%cond(iexg) + end if + ! + ! -- Check to see if nodem1 is outside of active domain + if (associated(this%model1)) then + if (nodem1 <= 0) then + cellstr1 = this%cellstr(this%model1, cellidm1(:, iexg), iout) + write (errmsg, *) & + trim(adjustl(this%model1%name))// & + ' Cell is outside active grid domain ('// & + trim(adjustl(cellstr1))//').' + call store_error(errmsg) + end if + end if + ! + ! -- Check to see if nodem2 is outside of active domain + if (associated(this%model2)) then + if (nodem2 <= 0) then + cellstr2 = this%cellstr(this%model2, cellidm2(:, iexg), iout) + write (errmsg, *) & + trim(adjustl(this%model2%name))// & + ' Cell is outside active grid domain ('// & + trim(adjustl(cellstr2))//').' + call store_error(errmsg) + end if + end if + end do + ! + write (iout, '(1x,a)') 'END OF EXCHANGEDATA' + ! + ! -- Stop if errors + nerr = count_errors() + if (nerr > 0) then + call store_error('Errors encountered in exchange input file.') + call store_error_filename(this%filename) + end if + ! + ! -- Return + return + end subroutine source_data + + !> @brief Calculate flow rates for the exchanges and store them in a member + !! array + !< + subroutine swf_gwf_calc_simvals(this) + ! -- modules + use ConstantsModule, only: DZERO + ! -- dummy + class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType + ! -- local + integer(I4B) :: i + integer(I4B) :: n1, n2 + integer(I4B) :: ibdn1, ibdn2 + real(DP) :: rrate + ! + do i = 1, this%nexg + rrate = DZERO + n1 = this%nodem1(i) + n2 = this%nodem2(i) + ibdn1 = this%swfmodel1%ibound(n1) + ibdn2 = this%gwfmodel2%ibound(n2) + if (ibdn1 /= 0 .and. ibdn2 /= 0) then + rrate = this%qcalc(i, n1, n2) + end if + this%simvals(i) = rrate + end do + ! + ! -- Return + return + end subroutine swf_gwf_calc_simvals + + !> @ brief Calculate flow + !! + !! Calculate the flow for the specified exchange and node numbers + !< + function qcalc(this, iexg, n1, n2) + ! -- return + real(DP) :: qcalc + ! -- dummy + class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType + integer(I4B), intent(in) :: iexg + integer(I4B), intent(in) :: n1 + integer(I4B), intent(in) :: n2 + ! -- local + ! + ! -- Calculate flow between nodes in the two models + qcalc = this%cond(iexg) * (this%gwfmodel2%x(n2) - this%swfmodel1%x(n1)) + ! + ! -- Return + return + end function qcalc + + !> @brief Add exchange flow to each model flowja diagonal position so that + !! residual is calculated correctly. + !< + subroutine swf_gwf_add_to_flowja(this) + ! -- modules + class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType + ! -- local + integer(I4B) :: i + integer(I4B) :: n + integer(I4B) :: idiag + real(DP) :: flow + ! + do i = 1, this%nexg + ! + if (associated(this%swfmodel1)) then + n = this%nodem1(i) + if (this%swfmodel1%ibound(n) > 0) then + flow = this%simvals(i) + idiag = this%swfmodel1%ia(n) + this%swfmodel1%flowja(idiag) = this%swfmodel1%flowja(idiag) + flow + end if + end if + ! + if (associated(this%gwfmodel2)) then + n = this%nodem2(i) + if (this%gwfmodel2%ibound(n) > 0) then + flow = -this%simvals(i) + idiag = this%gwfmodel2%ia(n) + this%gwfmodel2%flowja(idiag) = this%gwfmodel2%flowja(idiag) + flow + end if + end if + ! + end do + ! + ! -- Return + return + end subroutine swf_gwf_add_to_flowja + + !> @ brief Budget + !! + !! Accumulate budget terms + !< + subroutine swf_gwf_bd(this, icnvg, isuppress_output, isolnid) + ! -- modules + use ConstantsModule, only: DZERO, LENBUDTXT, LENPACKAGENAME + use BudgetModule, only: rate_accumulator + ! -- dummy + class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType + integer(I4B), intent(inout) :: icnvg + integer(I4B), intent(in) :: isuppress_output + integer(I4B), intent(in) :: isolnid + ! -- local + character(len=LENBUDTXT), dimension(1) :: budtxt + real(DP), dimension(2, 1) :: budterm + real(DP) :: ratin, ratout + ! + ! -- initialize + budtxt(1) = ' FLOW-JA-FACE' + ! + ! -- Calculate ratin/ratout and pass to model budgets + call rate_accumulator(this%simvals, ratin, ratout) + ! + ! -- Add the budget terms to model 1 + if (associated(this%swfmodel1)) then + budterm(1, 1) = ratin + budterm(2, 1) = ratout + call this%swfmodel1%model_bdentry(budterm, budtxt, this%name) + end if + ! + ! -- Add the budget terms to model 2 + if (associated(this%gwfmodel2)) then + budterm(1, 1) = ratout + budterm(2, 1) = ratin + call this%gwfmodel2%model_bdentry(budterm, budtxt, this%name) + end if + ! + ! -- Add any flows from one model into a constant head in another model + ! as a separate budget term called FLOW-JA-FACE-CHD + call this%swf_gwf_chd_bd() + ! + ! -- Return + return + end subroutine swf_gwf_bd + + !> @ brief swf-gwf-chd-bd + !! + !! Account for flow from an external model into a chd cell + !< + subroutine swf_gwf_chd_bd(this) + ! -- modules + use ConstantsModule, only: DZERO, LENBUDTXT, LENPACKAGENAME + ! -- dummy + class(SwfGwfExchangeType) :: this !< GwfExchangeType + ! -- local + character(len=LENBUDTXT), dimension(1) :: budtxt + integer(I4B) :: n + integer(I4B) :: i + real(DP), dimension(2, 1) :: budterm + real(DP) :: ratin, ratout + real(DP) :: q + ! + ! -- initialize + budtxt(1) = 'FLOW-JA-FACE-CHD' + ! + ! -- Add the constant-head budget terms for flow from model 2 into model 1 + if (associated(this%swfmodel1)) then + ratin = DZERO + ratout = DZERO + do i = 1, this%nexg + n = this%nodem1(i) + if (this%swfmodel1%ibound(n) < 0) then + q = this%simvals(i) + if (q > DZERO) then + ratout = ratout + q + else + ratin = ratin - q + end if + end if + end do + budterm(1, 1) = ratin + budterm(2, 1) = ratout + call this%swfmodel1%model_bdentry(budterm, budtxt, this%name) + end if + ! + ! -- Add the constant-head budget terms for flow from model 1 into model 2 + if (associated(this%gwfmodel2)) then + ratin = DZERO + ratout = DZERO + do i = 1, this%nexg + n = this%nodem2(i) + if (this%gwfmodel2%ibound(n) < 0) then + ! -- flip flow sign as flow is relative to model 1 + q = -this%simvals(i) + if (q > DZERO) then + ratout = ratout + q + else + ratin = ratin - q + end if + end if + end do + budterm(1, 1) = ratin + budterm(2, 1) = ratout + call this%gwfmodel2%model_bdentry(budterm, budtxt, this%name) + end if + ! + ! -- Return + return + end subroutine swf_gwf_chd_bd + + !> @ brief Budget save + !! + !! Output individual flows to listing file and binary budget files + !< + subroutine swf_gwf_bdsav(this) + ! -- dummy + class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType + ! -- local + integer(I4B) :: icbcfl, ibudfl + ! ! + ! ! -- budget for model1 + ! if (associated(this%swfmodel1)) then + ! call this%swf_gwf_bdsav_model(this%swfmodel1, this%gwfmodel2%name) + ! end if + ! ! + ! ! -- budget for model2 + ! if (associated(this%gwfmodel2)) then + ! call this%swf_gwf_bdsav_model(this%gwfmodel2, this%swfmodel1%name) + ! end if + ! + ! -- Set icbcfl, ibudfl to zero so that flows will be printed and + ! saved, if the options were set in the MVR package + icbcfl = 1 + ibudfl = 1 + ! + ! -- Calculate and write simulated values for observations + if (this%inobs /= 0) then + call this%swf_gwf_save_simvals() + end if + ! + ! -- Return + return + end subroutine swf_gwf_bdsav + + ! subroutine swf_gwf_bdsav_model(this, model, neighbor_name) + ! ! -- modules + ! use ConstantsModule, only: DZERO, LENBUDTXT, LENPACKAGENAME + ! use TdisModule, only: kstp, kper + ! ! -- dummy + ! class(SwfGwfExchangeType) :: this !< this exchange + ! class(NumericalModelType), pointer :: model !< the model to save budget for + ! character(len=*), intent(in) :: neighbor_name !< name of the connected neighbor model + ! ! -- local + ! character(len=LENPACKAGENAME + 4) :: packname + ! character(len=LENBUDTXT), dimension(1) :: budtxt + ! type(TableType), pointer :: output_tab + ! character(len=20) :: nodestr + ! character(len=LENBOUNDNAME) :: bname + ! integer(I4B) :: ntabrows + ! integer(I4B) :: nodeu + ! integer(I4B) :: i, n1, n2, n1u, n2u + ! integer(I4B) :: ibinun + ! real(DP) :: ratin, ratout, rrate + ! logical(LGP) :: is_for_model1 + ! ! + ! budtxt(1) = ' FLOW-JA-FACE' + ! packname = 'EXG '//this%name + ! packname = adjustr(packname) + ! if (associated(model, this%swfmodel1)) then + ! output_tab => this%outputtab1 + ! is_for_model1 = .true. + ! else + ! output_tab => this%outputtab2 + ! is_for_model1 = .false. + ! end if + ! ! + ! ! -- update output tables + ! if (this%ipr_flow /= 0) then + ! ! + ! ! -- update titles + ! if (model%oc%oc_save('BUDGET')) then + ! call output_tab%set_title(packname) + ! end if + ! ! + ! ! -- set table kstp and kper + ! call output_tab%set_kstpkper(kstp, kper) + ! ! + ! ! -- update maxbound of tables + ! ntabrows = 0 + ! do i = 1, this%nexg + ! n1 = this%nodem1(i) + ! n2 = this%nodem2(i) + ! ! + ! ! -- If both cells are active then calculate flow rate + ! if (this%swfmodel1%ibound(n1) /= 0 .and. & + ! this%gwfmodel2%ibound(n2) /= 0) then + ! ntabrows = ntabrows + 1 + ! end if + ! end do + ! if (ntabrows > 0) then + ! call output_tab%set_maxbound(ntabrows) + ! end if + ! end if + ! ! + ! ! -- Print and write budget terms + ! ! + ! ! -- Set binary unit numbers for saving flows + ! if (this%ipakcb /= 0) then + ! ibinun = model%oc%oc_save_unit('BUDGET') + ! else + ! ibinun = 0 + ! end if + ! ! + ! ! -- If save budget flag is zero for this stress period, then + ! ! shut off saving + ! if (.not. model%oc%oc_save('BUDGET')) ibinun = 0 + ! ! + ! ! -- If cell-by-cell flows will be saved as a list, write header. + ! if (ibinun /= 0) then + ! call model%dis%record_srcdst_list_header(budtxt(1), & + ! model%name, & + ! this%name, & + ! neighbor_name, & + ! this%name, & + ! this%naux, this%auxname, & + ! ibinun, this%nexg, & + ! model%iout) + ! end if + ! ! + ! ! Initialize accumulators + ! ratin = DZERO + ! ratout = DZERO + ! ! + ! ! -- Loop through all exchanges + ! do i = 1, this%nexg + ! ! + ! ! -- Assign boundary name + ! if (this%inamedbound > 0) then + ! bname = this%boundname(i) + ! else + ! bname = '' + ! end if + ! ! + ! ! -- Calculate the flow rate between n1 and n2 + ! rrate = DZERO + ! n1 = this%nodem1(i) + ! n2 = this%nodem2(i) + ! ! + ! ! -- If both cells are active then calculate flow rate + ! if (this%v_model1%ibound%get(n1) /= 0 .and. & + ! this%v_model2%ibound%get(n2) /= 0) then + ! rrate = this%simvals(i) + ! ! + ! ! -- Print the individual rates to model list files if requested + ! if (this%ipr_flow /= 0) then + ! if (model%oc%oc_save('BUDGET')) then + ! ! + ! ! -- set nodestr and write outputtab table + ! if (is_for_model1) then + ! nodeu = model%dis%get_nodeuser(n1) + ! call model%dis%nodeu_to_string(nodeu, nodestr) + ! call output_tab%print_list_entry(i, trim(adjustl(nodestr)), & + ! rrate, bname) + ! else + ! nodeu = model%dis%get_nodeuser(n2) + ! call model%dis%nodeu_to_string(nodeu, nodestr) + ! call output_tab%print_list_entry(i, trim(adjustl(nodestr)), & + ! -rrate, bname) + ! end if + ! end if + ! end if + ! if (rrate < DZERO) then + ! ratout = ratout - rrate + ! else + ! ratin = ratin + rrate + ! end if + ! end if + ! ! + ! ! -- If saving cell-by-cell flows in list, write flow + ! n1u = this%v_model1%dis_get_nodeuser(n1) + ! n2u = this%v_model2%dis_get_nodeuser(n2) + ! if (ibinun /= 0) then + ! if (is_for_model1) then + ! call model%dis%record_mf6_list_entry(ibinun, n1u, n2u, rrate, & + ! this%naux, this%auxvar(:, i), & + ! .false., .false.) + ! else + ! call model%dis%record_mf6_list_entry(ibinun, n2u, n1u, -rrate, & + ! this%naux, this%auxvar(:, i), & + ! .false., .false.) + ! end if + ! end if + ! ! + ! end do + ! ! + ! ! -- Return + ! return + ! end subroutine swf_gwf_bdsav_model + + !> @ brief Output + !! + !! Write output + !< + subroutine swf_gwf_ot(this) + ! -- modules + use SimVariablesModule, only: iout + use ConstantsModule, only: DZERO, LINELENGTH + ! -- dummy + class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType + ! -- local + integer(I4B) :: iexg, n1, n2 + real(DP) :: flow + character(len=LINELENGTH) :: node1str, node2str + ! -- format + character(len=*), parameter :: fmtheader2 = & + "(/1x, 'SUMMARY OF EXCHANGE RATES FOR EXCHANGE ', a, ' WITH ID ', i0, /, & + &2a16, 4a16, /, 96('-'))" + character(len=*), parameter :: fmtdata = & + "(2a16, 5(1pg16.6))" + ! + ! -- Call bdsave + call this%swf_gwf_bdsav() + ! + ! -- Write a table of exchanges + if (this%ipr_flow /= 0) then + write (iout, fmtheader2) trim(adjustl(this%name)), this%id, 'NODEM1', & + 'NODEM2', 'COND', 'X_M1', 'X_M2', 'FLOW' + do iexg = 1, this%nexg + n1 = this%nodem1(iexg) + n2 = this%nodem2(iexg) + flow = this%simvals(iexg) + call this%swfmodel1%dis%noder_to_string(n1, node1str) + call this%gwfmodel2%dis%noder_to_string(n2, node2str) + write (iout, fmtdata) trim(adjustl(node1str)), & + trim(adjustl(node2str)), & + this%cond(iexg), this%swfmodel1%x(n1), & + this%gwfmodel2%x(n2), flow + end do + end if + ! + ! -- OBS output + call this%obs%obs_ot() + ! + ! -- Return + return + end subroutine swf_gwf_ot + + !> @ brief Save simulated flow observations + !! + !! Save the simulated flows for each exchange + !< + subroutine swf_gwf_save_simvals(this) + ! -- modules + use SimModule, only: store_error, store_error_unit + use SimVariablesModule, only: errmsg + use ConstantsModule, only: DZERO + use ObserveModule, only: ObserveType + ! -- dummy + class(SwfGwfExchangeType), intent(inout) :: this + ! -- local + integer(I4B) :: i + integer(I4B) :: j + integer(I4B) :: n1 + integer(I4B) :: n2 + integer(I4B) :: iexg + real(DP) :: v + type(ObserveType), pointer :: obsrv => null() + ! + ! -- Write simulated values for all gwf-gwf observations + if (this%obs%npakobs > 0) then + call this%obs%obs_bd_clear() + do i = 1, this%obs%npakobs + obsrv => this%obs%pakobs(i)%obsrv + do j = 1, obsrv%indxbnds_count + iexg = obsrv%indxbnds(j) + v = DZERO + select case (obsrv%ObsTypeId) + case ('FLOW-JA-FACE') + n1 = this%nodem1(iexg) + n2 = this%nodem2(iexg) + v = this%simvals(iexg) + case default + errmsg = 'Unrecognized observation type: '// & + trim(obsrv%ObsTypeId) + call store_error(errmsg) + call store_error_unit(this%inobs) + end select + call this%obs%SaveOneSimval(obsrv, v) + end do + end do + end if + ! + ! -- Return + return + end subroutine swf_gwf_save_simvals + + !> @brief Should return true when the exchange should be added to the + !! solution where the model resides + !< + function swf_gwf_connects_model(this, model) result(is_connected) + ! -- dummy + class(SwfGwfExchangeType) :: this !< the instance of the exchange + class(BaseModelType), pointer, intent(in) :: model !< the model to which the exchange might hold a connection + ! -- return + logical(LGP) :: is_connected !< true, when connected + ! + is_connected = .false. + select type (model) + class is (GwfModelType) + if (associated(this%gwfmodel2, model)) then + is_connected = .true. + end if + class is (SwfModelType) + if (associated(this%swfmodel1, model)) then + is_connected = .true. + end if + end select + ! + ! -- Return + return + end function + +end module SwfGwfExchangeModule + +! module SwfGwfExchangeModule + +! use KindModule, only: DP, I4B, LGP +! use SimVariablesModule, only: errmsg +! use SimModule, only: store_error +! use BaseModelModule, only: BaseModelType, GetBaseModelFromList +! use BaseExchangeModule, only: BaseExchangeType, AddBaseExchangeToList +! use ConstantsModule, only: LENBOUNDNAME, NAMEDBOUNDFLAG, LINELENGTH, & +! TABCENTER, TABLEFT, LENAUXNAME, DNODATA +! use ListModule, only: ListType +! use ListsModule, only: basemodellist +! use DisConnExchangeModule, only: DisConnExchangeType +! use GwfModule, only: GwfModelType +! use SwfModule, only: SwfModelType +! use VirtualModelModule, only: VirtualModelType +! use GhostNodeModule, only: GhostNodeType +! use GwfMvrModule, only: GwfMvrType +! use ObserveModule, only: ObserveType +! use ObsModule, only: ObsType +! use SimModule, only: count_errors, store_error, store_error_unit +! use SimVariablesModule, only: errmsg, model_loc_idx +! use BlockParserModule, only: BlockParserType +! use TableModule, only: TableType, table_cr +! use MatrixBaseModule + +! implicit none + +! private +! public :: SwfGwfExchangeType +! public :: swfgwf_cr +! public :: GetSwfGwfExchangeFromList +! public :: CastAsSwfGwfExchange + +! !> @brief Derived type for SwfGwfExchangeType +! !! +! !! This derived type contains information and methods for +! !! connecting a SWF model with a GWF model. +! !< +! type, extends(DisConnExchangeType) :: SwfGwfExchangeType +! class(SwfModelType), pointer :: swfmodel1 => null() !< pointer to SWF Model 1 +! class(GwfModelType), pointer :: gwfmodel2 => null() !< pointer to GWF Model 2 +! ! +! ! -- GWF specific option block: +! integer(I4B), pointer :: iprflow => null() !< print flag for cell by cell flows +! integer(I4B), pointer :: ipakcb => null() !< save flag for cell by cell flows +! integer(I4B), pointer :: inewton => null() !< newton flag (1 newton is on) +! integer(I4B), pointer :: icellavg => null() !< cell averaging +! integer(I4B), pointer :: ivarcv => null() !< variable cv +! integer(I4B), pointer :: idewatcv => null() !< dewatered cv +! integer(I4B), pointer :: ingnc => null() !< unit number for gnc (0 if off) +! type(GhostNodeType), pointer :: gnc => null() !< gnc object +! integer(I4B), pointer :: inmvr => null() !< unit number for mover (0 if off) +! type(GwfMvrType), pointer :: mvr => null() !< water mover object +! integer(I4B), pointer :: inobs => null() !< unit number for GWF-GWF observations +! type(ObsType), pointer :: obs => null() !< observation object +! ! +! ! -- internal data +! real(DP), dimension(:), pointer, contiguous :: cond => null() !< conductance +! real(DP), dimension(:), pointer, contiguous :: condsat => null() !< saturated conductance +! integer(I4B), dimension(:), pointer, contiguous :: idxglo => null() !< mapping to global (solution) amat +! integer(I4B), dimension(:), pointer, contiguous :: idxsymglo => null() !< mapping to global (solution) symmetric amat +! real(DP), pointer :: satomega => null() !< saturation smoothing +! real(DP), dimension(:), pointer, contiguous :: simvals => null() !< simulated flow rate for each exchange +! ! +! ! -- table objects +! type(TableType), pointer :: outputtab1 => null() +! type(TableType), pointer :: outputtab2 => null() + +! contains + +! procedure :: exg_df => swf_gwf_df +! procedure :: exg_ac => swf_gwf_ac +! procedure :: exg_mc => swf_gwf_mc +! procedure :: exg_ar => swf_gwf_ar +! procedure :: exg_rp => swf_gwf_rp +! procedure :: exg_ad => swf_gwf_ad +! procedure :: exg_cf => swf_gwf_cf +! procedure :: exg_fc => swf_gwf_fc +! procedure :: exg_fn => swf_gwf_fn +! procedure :: exg_cq => swf_gwf_cq +! procedure :: exg_bd => swf_gwf_bd +! procedure :: exg_ot => swf_gwf_ot +! procedure :: exg_da => swf_gwf_da +! procedure :: exg_fp => swf_gwf_fp +! procedure :: get_iasym => swf_gwf_get_iasym +! procedure :: connects_model => swf_gwf_connects_model +! procedure :: use_interface_model +! procedure :: allocate_scalars +! procedure :: allocate_arrays +! procedure :: read_options +! procedure :: parse_option +! procedure :: read_gnc +! procedure :: read_mvr +! procedure, private :: calc_cond_sat +! procedure, private :: condcalc +! procedure, private :: rewet +! procedure, private :: qcalc +! procedure :: swf_gwf_bdsav +! procedure, private :: swf_gwf_bdsav_model +! procedure, private :: swf_gwf_df_obs +! procedure, private :: swf_gwf_rp_obs +! procedure, public :: swf_gwf_save_simvals +! procedure, private :: swf_gwf_calc_simvals +! procedure, public :: swf_gwf_set_flow_to_npf +! procedure, private :: validate_exchange +! procedure :: swf_gwf_add_to_flowja +! end type SwfGwfExchangeType + +! contains + +! !> @ brief Create SWF GWF exchange +! !! +! !! Create a new SWF to GWF exchange object. +! !< +! subroutine swfgwf_cr(filename, name, id, m1_id, m2_id) +! ! -- modules +! use ConstantsModule, only: LINELENGTH +! use BaseModelModule, only: BaseModelType +! use VirtualModelModule, only: get_virtual_model +! use ListsModule, only: baseexchangelist +! use ObsModule, only: obs_cr +! use MemoryHelperModule, only: create_mem_path +! ! -- dummy +! character(len=*), intent(in) :: filename !< filename for reading +! character(len=*) :: name !< exchange name +! integer(I4B), intent(in) :: id !< id for the exchange +! integer(I4B), intent(in) :: m1_id !< id for model 1 +! integer(I4B), intent(in) :: m2_id !< id for model 2 +! ! -- local +! type(SwfGwfExchangeType), pointer :: exchange +! class(BaseModelType), pointer :: mb +! class(BaseExchangeType), pointer :: baseexchange +! integer(I4B) :: m1_index, m2_index +! ! +! ! -- Create a new exchange and add it to the baseexchangelist container +! allocate (exchange) +! baseexchange => exchange +! call AddBaseExchangeToList(baseexchangelist, baseexchange) +! ! +! ! -- Assign id and name +! exchange%id = id +! exchange%name = name +! exchange%memoryPath = create_mem_path(exchange%name) +! ! +! ! -- allocate scalars and set defaults +! call exchange%allocate_scalars() +! exchange%filename = filename +! exchange%typename = 'GWF-GWF' +! ! +! ! -- set swfmodel1 +! m1_index = model_loc_idx(m1_id) +! if (m1_index > 0) then +! mb => GetBaseModelFromList(basemodellist, m1_index) +! select type (mb) +! type is (SwfModelType) +! exchange%model1 => mb +! exchange%swfmodel1 => mb +! end select +! end if +! exchange%v_model1 => get_virtual_model(m1_id) +! exchange%is_datacopy = .not. exchange%v_model1%is_local +! ! +! ! -- set gwfmodel2 +! m2_index = model_loc_idx(m2_id) +! if (m2_index > 0) then +! mb => GetBaseModelFromList(basemodellist, m2_index) +! select type (mb) +! type is (GwfModelType) +! exchange%model2 => mb +! exchange%gwfmodel2 => mb +! end select +! end if +! exchange%v_model2 => get_virtual_model(m2_id) +! ! +! ! -- Verify that gwf model1 is of the correct type +! if (.not. associated(exchange%swfmodel1) .and. m1_index > 0) then +! write (errmsg, '(3a)') 'Problem with GWF-GWF exchange ', & +! trim(exchange%name), & +! '. First specified GWF Model does not appear to be of the correct type.' +! call store_error(errmsg, terminate=.true.) +! end if +! ! +! ! -- Verify that gwf model2 is of the correct type +! if (.not. associated(exchange%gwfmodel2) .and. m2_index > 0) then +! write (errmsg, '(3a)') 'Problem with GWF-GWF exchange ', & +! trim(exchange%name), & +! '. Second specified GWF Model does not appear to be of the correct type.' +! call store_error(errmsg, terminate=.true.) +! end if +! ! +! ! -- Create the obs package +! call obs_cr(exchange%obs, exchange%inobs) +! ! +! ! -- Return +! return +! end subroutine swfgwf_cr + +! !> @ brief Define GWF GWF exchange +! !! +! !! Define GWF to GWF exchange object. +! !< +! subroutine swf_gwf_df(this) +! ! -- modules +! use SimVariablesModule, only: iout +! use InputOutputModule, only: getunit, openfile +! use GhostNodeModule, only: gnc_cr +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! -- local +! integer(I4B) :: inunit +! ! +! ! -- open the file +! inunit = getunit() +! write (iout, '(/a,a)') ' Creating exchange: ', this%name +! call openfile(inunit, iout, this%filename, 'GWF-GWF') +! ! +! call this%parser%Initialize(inunit, iout) +! ! +! ! -- Ensure models are in same solution +! if (associated(this%swfmodel1) .and. associated(this%gwfmodel2)) then +! if (this%swfmodel1%idsoln /= this%gwfmodel2%idsoln) then +! call store_error('Two models are connected in a GWF '// & +! 'exchange but they are in different solutions. '// & +! 'GWF models must be in same solution: '// & +! trim(this%swfmodel1%name)//' '// & +! trim(this%gwfmodel2%name)) +! call this%parser%StoreErrorUnit() +! end if +! end if +! ! +! ! -- read options +! call this%read_options(iout) +! ! +! ! -- read dimensions +! call this%read_dimensions(iout) +! ! +! ! -- allocate arrays +! call this%allocate_arrays() +! ! +! ! -- read exchange data +! call this%read_data(iout) +! ! +! ! -- call each model and increase the edge count +! ! TODO: increase edge for gwf so velocity includes vertical leakage component? +! ! if (associated(this%swfmodel1)) then +! ! call this%swfmodel1%npf%increase_edge_count(this%nexg) +! ! end if +! ! if (associated(this%gwfmodel2)) then +! ! call this%gwfmodel2%npf%increase_edge_count(this%nexg) +! ! end if +! ! +! ! -- Create and read ghost node information +! if (this%ingnc > 0) then +! call gnc_cr(this%gnc, this%name, this%ingnc, iout) +! call this%read_gnc() +! end if +! ! +! ! -- Read mover information +! if (this%inmvr > 0) then +! call this%read_mvr(iout) +! end if +! ! +! ! -- close the file +! close (inunit) +! ! +! ! -- Store obs +! call this%swf_gwf_df_obs() +! if (associated(this%swfmodel1)) then +! call this%obs%obs_df(iout, this%name, 'GWF-GWF', this%swfmodel1%dis) +! end if +! ! +! ! -- validate +! call this%validate_exchange() +! ! +! ! -- Return +! return +! end subroutine swf_gwf_df + +! !> @brief validate exchange data after reading +! !< +! subroutine validate_exchange(this) +! ! -- modules +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! -- local +! logical(LGP) :: has_k22, has_spdis, has_vsc +! ! +! ! Periodic boundary condition in exchange don't allow XT3D (=interface model) +! if (associated(this%model1, this%model2)) then +! if (this%ixt3d > 0) then +! write (errmsg, '(3a)') 'GWF-GWF exchange ', trim(this%name), & +! ' is a periodic boundary condition which cannot'// & +! ' be configured with XT3D' +! call store_error(errmsg, terminate=.TRUE.) +! end if +! end if +! ! +! ! XT3D needs angle information +! if (this%ixt3d > 0 .and. this%ianglex == 0) then +! write (errmsg, '(3a)') 'GWF-GWF exchange ', trim(this%name), & +! ' requires that ANGLDEGX be specified as an'// & +! ' auxiliary variable because XT3D is enabled' +! call store_error(errmsg, terminate=.TRUE.) +! end if +! ! +! ! determine if specific functionality is demanded, +! ! in model 1 or model 2 (in parallel, only one of +! ! the models is checked, but the exchange is duplicated) +! has_k22 = .false. +! has_spdis = .false. +! has_vsc = .false. +! ! if (associated(this%swfmodel1)) then +! ! has_k22 = (this%swfmodel1%npf%ik22 /= 0) +! ! has_spdis = (this%swfmodel1%npf%icalcspdis /= 0) +! ! has_vsc = (this%swfmodel1%npf%invsc /= 0) +! ! end if +! if (associated(this%gwfmodel2)) then +! has_k22 = has_k22 .or. (this%gwfmodel2%npf%ik22 /= 0) +! has_spdis = has_spdis .or. (this%gwfmodel2%npf%icalcspdis /= 0) +! has_vsc = has_vsc .or. (this%gwfmodel2%npf%invsc /= 0) +! end if +! ! +! ! If horizontal anisotropy is in either model1 or model2, +! ! ANGLDEGX must be provided as an auxiliary variable for this +! ! GWF-GWF exchange (this%ianglex > 0). +! if (has_k22) then +! if (this%ianglex == 0) then +! write (errmsg, '(3a)') 'GWF-GWF exchange ', trim(this%name), & +! ' requires that ANGLDEGX be specified as an'// & +! ' auxiliary variable because K22 was specified'// & +! ' in one or both groundwater models.' +! call store_error(errmsg, terminate=.TRUE.) +! end if +! end if +! ! +! ! If specific discharge is needed for model1 or model2, +! ! ANGLDEGX must be provided as an auxiliary variable for this +! ! GWF-GWF exchange (this%ianglex > 0). +! if (has_spdis) then +! if (this%ianglex == 0) then +! write (errmsg, '(3a)') 'GWF-GWF exchange ', trim(this%name), & +! ' requires that ANGLDEGX be specified as an'// & +! ' auxiliary variable because specific discharge'// & +! ' is being calculated in one or both'// & +! ' groundwater models.' +! call store_error(errmsg, terminate=.TRUE.) +! end if +! if (this%icdist == 0) then +! write (errmsg, '(3a)') 'GWF-GWF exchange ', trim(this%name), & +! ' requires that CDIST be specified as an'// & +! ' auxiliary variable because specific discharge'// & +! ' is being calculated in one or both'// & +! ' groundwater models.' +! call store_error(errmsg, terminate=.TRUE.) +! end if +! end if +! ! +! ! If viscosity is on in either model, then terminate with an +! ! error as viscosity package doesn't work yet with exchanges. +! if (has_vsc) then +! write (errmsg, '(3a)') 'GWF-GWF exchange ', trim(this%name), & +! ' requires that the Viscosity Package is inactive'// & +! ' in both of the connected models.' +! call store_error(errmsg, terminate=.TRUE.) +! end if +! ! +! ! -- Return +! return +! end subroutine validate_exchange + +! !> @ brief Add connections +! !! +! !! Override parent exg_ac so that gnc can add connections here. +! !< +! subroutine swf_gwf_ac(this, sparse) +! ! -- modules +! use SparseModule, only: sparsematrix +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! type(sparsematrix), intent(inout) :: sparse +! ! -- local +! integer(I4B) :: n, iglo, jglo +! ! +! ! -- add exchange connections +! do n = 1, this%nexg +! iglo = this%nodem1(n) + this%swfmodel1%moffset +! jglo = this%nodem2(n) + this%gwfmodel2%moffset +! call sparse%addconnection(iglo, jglo, 1) +! call sparse%addconnection(jglo, iglo, 1) +! end do +! ! +! ! -- add gnc connections +! if (this%ingnc > 0) then +! call this%gnc%gnc_ac(sparse) +! end if +! ! +! ! -- Return +! return +! end subroutine swf_gwf_ac + +! !> @ brief Map connections +! !! +! !! Map the connections in the global matrix +! !< +! subroutine swf_gwf_mc(this, matrix_sln) +! ! -- modules +! use SparseModule, only: sparsematrix +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! class(MatrixBaseType), pointer :: matrix_sln !< the system matrix +! ! -- local +! integer(I4B) :: n, iglo, jglo +! ! +! ! -- map exchange connections +! do n = 1, this%nexg +! iglo = this%nodem1(n) + this%swfmodel1%moffset +! jglo = this%nodem2(n) + this%gwfmodel2%moffset +! this%idxglo(n) = matrix_sln%get_position(iglo, jglo) +! this%idxsymglo(n) = matrix_sln%get_position(jglo, iglo) +! end do +! ! +! ! -- map gnc connections +! if (this%ingnc > 0) then +! call this%gnc%gnc_mc(matrix_sln) +! end if +! ! +! ! -- Return +! return +! end subroutine swf_gwf_mc + +! !> @ brief Allocate and read +! !! +! !! Allocated and read and calculate saturated conductance +! !< +! subroutine swf_gwf_ar(this) +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! +! ! -- If mover is active, then call ar routine +! if (this%inmvr > 0) call this%mvr%mvr_ar() +! ! +! ! -- Calculate the saturated conductance for all connections +! if (.not. this%use_interface_model()) call this%calc_cond_sat() +! ! +! ! -- Observation AR +! call this%obs%obs_ar() +! ! +! ! -- Return +! return +! end subroutine swf_gwf_ar + +! !> @ brief Read and prepare +! !! +! !! Read new data for mover and obs +! !< +! subroutine swf_gwf_rp(this) +! ! -- modules +! use TdisModule, only: readnewdata +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! +! ! -- Check with TDIS on whether or not it is time to RP +! if (.not. readnewdata) return +! ! +! ! -- Read and prepare for mover +! if (this%inmvr > 0) call this%mvr%mvr_rp() +! ! +! ! -- Read and prepare for observations +! call this%swf_gwf_rp_obs() +! ! +! ! -- Return +! return +! end subroutine swf_gwf_rp + +! !> @ brief Advance +! !! +! !! Advance mover and obs +! !< +! subroutine swf_gwf_ad(this) +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! +! ! -- Advance mover +! if (this%inmvr > 0) call this%mvr%mvr_ad() +! ! +! ! -- Push simulated values to preceding time step +! call this%obs%obs_ad() +! ! +! ! -- Return +! return +! end subroutine swf_gwf_ad + +! !> @ brief Calculate coefficients +! !! +! !! Rewet as necessary +! !< +! subroutine swf_gwf_cf(this, kiter) +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! integer(I4B), intent(in) :: kiter +! ! +! ! -- Rewet cells across models using the wetdry parameters in each model's +! ! npf package, and the head in the connected model. +! call this%rewet(kiter) +! ! +! ! -- Return +! return +! end subroutine swf_gwf_cf + +! !> @ brief Fill coefficients +! !! +! !! Calculate conductance and fill coefficient matrix +! !< +! subroutine swf_gwf_fc(this, kiter, matrix_sln, rhs_sln, inwtflag) +! ! -- modules +! use ConstantsModule, only: DHALF +! use GwfNpfModule, only: hcond, vcond +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! integer(I4B), intent(in) :: kiter +! class(MatrixBaseType), pointer :: matrix_sln +! real(DP), dimension(:), intent(inout) :: rhs_sln +! integer(I4B), optional, intent(in) :: inwtflag +! ! -- local +! integer(I4B) :: inwt, iexg +! integer(I4B) :: i, nodem1sln, nodem2sln +! ! +! ! -- calculate the conductance for each exchange connection +! call this%condcalc() +! ! +! ! -- if gnc is active, then copy cond into gnc cond (might consider a +! ! pointer here in the future) +! if (this%ingnc > 0) then +! do iexg = 1, this%nexg +! this%gnc%cond(iexg) = this%cond(iexg) +! end do +! end if +! ! +! ! -- Put this%cond into amatsln +! do i = 1, this%nexg +! call matrix_sln%set_value_pos(this%idxglo(i), this%cond(i)) +! call matrix_sln%set_value_pos(this%idxsymglo(i), this%cond(i)) + +! nodem1sln = this%nodem1(i) + this%swfmodel1%moffset +! nodem2sln = this%nodem2(i) + this%gwfmodel2%moffset +! call matrix_sln%add_diag_value(nodem1sln, -this%cond(i)) +! call matrix_sln%add_diag_value(nodem2sln, -this%cond(i)) +! end do +! ! +! ! -- Fill the gnc terms in the solution matrix +! if (this%ingnc > 0) then +! call this%gnc%gnc_fc(kiter, matrix_sln) +! end if +! ! +! ! -- Call mvr fc routine +! if (this%inmvr > 0) call this%mvr%mvr_fc() +! ! +! ! -- Set inwt to exchange newton, but shut off if requested by caller +! inwt = this%inewton +! if (present(inwtflag)) then +! if (inwtflag == 0) inwt = 0 +! end if +! if (inwt /= 0) then +! call this%exg_fn(kiter, matrix_sln) +! end if +! ! +! ! -- Ghost node Newton-Raphson +! ! if (this%ingnc > 0) then +! ! if (inwt /= 0) then +! ! call this%gnc%gnc_fn(kiter, matrix_sln, this%condsat, & +! ! ihc_opt=this%ihc, ivarcv_opt=this%ivarcv, & +! ! ictm1_opt=this%swfmodel1%npf%icelltype, & +! ! ictm2_opt=this%gwfmodel2%npf%icelltype) +! ! end if +! ! end if +! ! +! ! -- Return +! return +! end subroutine swf_gwf_fc + +! !> @ brief Fill Newton +! !! +! !! Fill amatsln with Newton terms +! !< +! subroutine swf_gwf_fn(this, kiter, matrix_sln) +! ! -- modules +! use SmoothingModule, only: sQuadraticSaturationDerivative +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! integer(I4B), intent(in) :: kiter +! class(MatrixBaseType), pointer :: matrix_sln +! ! -- local +! logical :: nisup +! integer(I4B) :: iexg +! integer(I4B) :: n, m +! integer(I4B) :: nodensln, nodemsln +! integer(I4B) :: ibdn, ibdm +! real(DP) :: topn, topm +! real(DP) :: botn, botm +! real(DP) :: topup, botup +! real(DP) :: hn, hm +! real(DP) :: hup, hdn +! real(DP) :: cond +! real(DP) :: term +! real(DP) :: consterm +! real(DP) :: derv +! ! +! do iexg = 1, this%nexg +! n = this%nodem1(iexg) +! m = this%nodem2(iexg) +! nodensln = this%nodem1(iexg) + this%swfmodel1%moffset +! nodemsln = this%nodem2(iexg) + this%gwfmodel2%moffset +! ibdn = this%swfmodel1%ibound(n) +! ibdm = this%gwfmodel2%ibound(m) +! topn = this%swfmodel1%dis%top(n) +! topm = this%gwfmodel2%dis%top(m) +! botn = this%swfmodel1%dis%bot(n) +! botm = this%gwfmodel2%dis%bot(m) +! hn = this%swfmodel1%x(n) +! hm = this%gwfmodel2%x(m) +! if (this%ihc(iexg) == 0) then +! ! -- vertical connection, newton not supported +! else +! ! ! -- determine upstream node +! ! nisup = .false. +! ! if (hm < hn) nisup = .true. +! ! ! +! ! ! -- set upstream top and bot +! ! if (nisup) then +! ! topup = topn +! ! botup = botn +! ! hup = hn +! ! hdn = hm +! ! else +! ! topup = topm +! ! botup = botm +! ! hup = hm +! ! hdn = hn +! ! end if +! ! ! +! ! ! -- no newton terms if upstream cell is confined +! ! if (nisup) then +! ! if (this%swfmodel1%npf%icelltype(n) == 0) cycle +! ! else +! ! if (this%gwfmodel2%npf%icelltype(m) == 0) cycle +! ! end if +! ! ! +! ! ! -- set topup and botup +! ! if (this%ihc(iexg) == 2) then +! ! topup = min(topn, topm) +! ! botup = max(botn, botm) +! ! end if +! ! ! +! ! ! get saturated conductivity for derivative +! ! cond = this%condsat(iexg) +! ! ! +! ! ! -- TO DO deal with MODFLOW-NWT upstream weighting option +! ! ! +! ! ! -- compute terms +! ! consterm = -cond * (hup - hdn) +! ! derv = sQuadraticSaturationDerivative(topup, botup, hup) +! ! if (nisup) then +! ! ! +! ! ! -- fill jacobian with n being upstream +! ! term = consterm * derv +! ! this%swfmodel1%rhs(n) = this%swfmodel1%rhs(n) + term * hn +! ! this%gwfmodel2%rhs(m) = this%gwfmodel2%rhs(m) - term * hn +! ! call matrix_sln%add_diag_value(nodensln, term) +! ! if (ibdm > 0) then +! ! call matrix_sln%add_value_pos(this%idxsymglo(iexg), -term) +! ! end if +! ! else +! ! ! +! ! ! -- fill jacobian with m being upstream +! ! term = -consterm * derv +! ! this%swfmodel1%rhs(n) = this%swfmodel1%rhs(n) + term * hm +! ! this%gwfmodel2%rhs(m) = this%gwfmodel2%rhs(m) - term * hm +! ! call matrix_sln%add_diag_value(nodemsln, -term) +! ! if (ibdn > 0) then +! ! call matrix_sln%add_value_pos(this%idxglo(iexg), term) +! ! end if +! ! end if +! end if +! end do +! ! +! ! -- Return +! return +! end subroutine swf_gwf_fn + +! !> @ brief Calculate flow +! !! +! !! Calculate flow between two cells and store in simvals, also set +! !! information needed for specific discharge calculation +! !< +! subroutine swf_gwf_cq(this, icnvg, isuppress_output, isolnid) +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! integer(I4B), intent(inout) :: icnvg +! integer(I4B), intent(in) :: isuppress_output +! integer(I4B), intent(in) :: isolnid +! ! +! ! -- calculate flow and store in simvals +! call this%swf_gwf_calc_simvals() +! ! +! ! -- set flows to model edges in NPF +! call this%swf_gwf_set_flow_to_npf() +! ! +! ! -- add exchange flows to model's flowja diagonal +! call this%swf_gwf_add_to_flowja() +! ! +! ! -- Return +! return +! end subroutine swf_gwf_cq + +! !> @brief Calculate flow rates for the exchanges and store them in a member +! !! array +! !< +! subroutine swf_gwf_calc_simvals(this) +! ! -- modules +! use ConstantsModule, only: DZERO +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! -- local +! integer(I4B) :: i +! integer(I4B) :: n1, n2 +! integer(I4B) :: ibdn1, ibdn2 +! real(DP) :: rrate +! ! +! do i = 1, this%nexg +! rrate = DZERO +! n1 = this%nodem1(i) +! n2 = this%nodem2(i) +! ibdn1 = this%swfmodel1%ibound(n1) +! ibdn2 = this%gwfmodel2%ibound(n2) +! if (ibdn1 /= 0 .and. ibdn2 /= 0) then +! rrate = this%qcalc(i, n1, n2) +! if (this%ingnc > 0) then +! rrate = rrate + this%gnc%deltaqgnc(i) +! end if +! end if +! this%simvals(i) = rrate +! end do +! ! +! ! -- Return +! return +! end subroutine swf_gwf_calc_simvals + +! !> @brief Add exchange flow to each model flowja diagonal position so that +! !! residual is calculated correctly. +! !< +! subroutine swf_gwf_add_to_flowja(this) +! ! -- modules +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! -- local +! integer(I4B) :: i +! integer(I4B) :: n +! integer(I4B) :: idiag +! real(DP) :: flow +! ! +! do i = 1, this%nexg +! ! +! if (associated(this%swfmodel1)) then +! flow = this%simvals(i) +! n = this%nodem1(i) +! idiag = this%swfmodel1%ia(n) +! this%swfmodel1%flowja(idiag) = this%swfmodel1%flowja(idiag) + flow +! end if +! ! +! if (associated(this%gwfmodel2)) then +! flow = -this%simvals(i) +! n = this%nodem2(i) +! idiag = this%gwfmodel2%ia(n) +! this%gwfmodel2%flowja(idiag) = this%gwfmodel2%flowja(idiag) + flow +! end if +! ! +! end do +! ! +! ! -- Return +! return +! end subroutine swf_gwf_add_to_flowja + +! !> @brief Set flow rates to the edges in the models +! !< +! subroutine swf_gwf_set_flow_to_npf(this) +! ! -- modules +! use ConstantsModule, only: DZERO, DPIO180 +! use GwfNpfModule, only: thksatnm +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! -- local +! integer(I4B) :: iusg +! integer(I4B) :: i +! integer(I4B) :: n1, n2 +! integer(I4B) :: ibdn1, ibdn2 +! integer(I4B) :: ictn1, ictn2 +! integer(I4B) :: ihc +! real(DP) :: rrate +! real(DP) :: topn1, topn2 +! real(DP) :: botn1, botn2 +! real(DP) :: satn1, satn2 +! real(DP) :: hn1, hn2 +! real(DP) :: nx, ny +! real(DP) :: distance +! real(DP) :: dltot +! real(DP) :: hwva +! real(DP) :: area +! real(DP) :: thksat +! real(DP) :: angle +! ! +! ! -- Return if neither model needs to calculate specific discharge +! ! if (this%swfmodel1%npf%icalcspdis == 0 .and. & +! ! this%gwfmodel2%npf%icalcspdis == 0) return +! ! ! +! ! ! -- initialize +! ! iusg = 0 +! ! ! +! ! ! -- Loop through all exchanges using the flow rate +! ! ! stored in simvals +! ! do i = 1, this%nexg +! ! rrate = this%simvals(i) +! ! n1 = this%nodem1(i) +! ! n2 = this%nodem2(i) +! ! ihc = this%ihc(i) +! ! hwva = this%hwva(i) +! ! ibdn1 = this%swfmodel1%ibound(n1) +! ! ibdn2 = this%gwfmodel2%ibound(n2) +! ! ictn1 = this%swfmodel1%npf%icelltype(n1) +! ! ictn2 = this%gwfmodel2%npf%icelltype(n2) +! ! topn1 = this%swfmodel1%dis%top(n1) +! ! topn2 = this%gwfmodel2%dis%top(n2) +! ! botn1 = this%swfmodel1%dis%bot(n1) +! ! botn2 = this%gwfmodel2%dis%bot(n2) +! ! satn1 = this%swfmodel1%npf%sat(n1) +! ! satn2 = this%gwfmodel2%npf%sat(n2) +! ! hn1 = this%swfmodel1%x(n1) +! ! hn2 = this%gwfmodel2%x(n2) +! ! ! +! ! ! -- Calculate face normal components +! ! if (ihc == 0) then +! ! nx = DZERO +! ! ny = DZERO +! ! area = hwva +! ! if (botn1 < botn2) then +! ! ! -- n1 is beneath n2, so rate is positive downward. Flip rate +! ! ! upward so that points in positive z direction +! ! rrate = -rrate +! ! end if +! ! else +! ! if (this%ianglex > 0) then +! ! angle = this%auxvar(this%ianglex, i) * DPIO180 +! ! nx = cos(angle) +! ! ny = sin(angle) +! ! else +! ! ! error? +! ! call store_error('error in swf_gwf_cq', terminate=.TRUE.) +! ! end if +! ! ! +! ! ! -- Calculate the saturated thickness at interface between n1 and n2 +! ! thksat = thksatnm(ibdn1, ibdn2, ictn1, ictn2, this%inewton, ihc, & +! ! iusg, hn1, hn2, satn1, satn2, & +! ! topn1, topn2, botn1, botn2, this%satomega) +! ! area = hwva * thksat +! ! end if +! ! ! +! ! ! -- Submit this connection and flow information to the npf +! ! ! package of swfmodel1 +! ! if (this%icdist > 0) then +! ! dltot = this%auxvar(this%icdist, i) +! ! else +! ! call store_error('error in swf_gwf_cq', terminate=.TRUE.) +! ! end if +! ! distance = dltot * this%cl1(i) / (this%cl1(i) + this%cl2(i)) +! ! if (this%swfmodel1%npf%icalcspdis == 1) then +! ! call this%swfmodel1%npf%set_edge_properties(n1, ihc, rrate, area, & +! ! nx, ny, distance) +! ! end if +! ! ! +! ! ! -- Submit this connection and flow information to the npf +! ! ! package of gwfmodel2 +! ! if (this%icdist > 0) then +! ! dltot = this%auxvar(this%icdist, i) +! ! else +! ! call store_error('error in swf_gwf_cq', terminate=.TRUE.) +! ! end if +! ! if (this%gwfmodel2%npf%icalcspdis == 1) then +! ! distance = dltot * this%cl2(i) / (this%cl1(i) + this%cl2(i)) +! ! if (ihc /= 0) rrate = -rrate +! ! call this%gwfmodel2%npf%set_edge_properties(n2, ihc, rrate, area, & +! ! -nx, -ny, distance) +! ! end if +! ! ! +! ! end do +! ! +! ! -- Return +! return +! end subroutine swf_gwf_set_flow_to_npf + +! !> @ brief Budget +! !! +! !! Accumulate budget terms +! !< +! subroutine swf_gwf_bd(this, icnvg, isuppress_output, isolnid) +! ! -- modules +! use ConstantsModule, only: DZERO, LENBUDTXT, LENPACKAGENAME +! use BudgetModule, only: rate_accumulator +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! integer(I4B), intent(inout) :: icnvg +! integer(I4B), intent(in) :: isuppress_output +! integer(I4B), intent(in) :: isolnid +! ! -- local +! character(len=LENBUDTXT), dimension(1) :: budtxt +! real(DP), dimension(2, 1) :: budterm +! real(DP) :: ratin, ratout +! ! +! ! -- initialize +! budtxt(1) = ' FLOW-JA-FACE' +! ! +! ! -- Calculate ratin/ratout and pass to model budgets +! call rate_accumulator(this%simvals, ratin, ratout) +! ! +! ! -- Add the budget terms to model 1 +! if (associated(this%swfmodel1)) then +! budterm(1, 1) = ratin +! budterm(2, 1) = ratout +! call this%swfmodel1%model_bdentry(budterm, budtxt, this%name) +! end if +! ! +! ! -- Add the budget terms to model 2 +! if (associated(this%gwfmodel2)) then +! budterm(1, 1) = ratout +! budterm(2, 1) = ratin +! call this%gwfmodel2%model_bdentry(budterm, budtxt, this%name) +! end if +! ! +! ! -- Call mvr bd routine +! if (this%inmvr > 0) call this%mvr%mvr_bd() +! ! +! ! -- Return +! return +! end subroutine swf_gwf_bd + +! !> @ brief Budget save +! !! +! !! Output individual flows to listing file and binary budget files +! !< +! subroutine swf_gwf_bdsav(this) +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! -- local +! integer(I4B) :: icbcfl, ibudfl +! ! +! ! -- budget for model1 +! if (associated(this%swfmodel1)) then +! ! TODO: NEED WAY TO BDSAV FOR SWF MODEL call this%swf_gwf_bdsav_model(this%swfmodel1) +! end if +! ! +! ! -- budget for model2 +! if (associated(this%gwfmodel2)) then +! call this%swf_gwf_bdsav_model(this%gwfmodel2) +! end if +! ! +! ! -- Set icbcfl, ibudfl to zero so that flows will be printed and +! ! saved, if the options were set in the MVR package +! icbcfl = 1 +! ibudfl = 1 +! ! +! ! -- Call mvr bd routine +! if (this%inmvr > 0) call this%mvr%mvr_bdsav(icbcfl, ibudfl, 0) +! ! +! ! -- Calculate and write simulated values for observations +! if (this%inobs /= 0) then +! call this%swf_gwf_save_simvals() +! end if +! ! +! ! -- Return +! return +! end subroutine swf_gwf_bdsav + +! subroutine swf_gwf_bdsav_model(this, model) +! ! -- modules +! use ConstantsModule, only: DZERO, LENBUDTXT, LENPACKAGENAME +! use TdisModule, only: kstp, kper +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< this exchange +! class(GwfModelType), pointer :: model !< the model to save budget for +! ! -- local +! character(len=LENPACKAGENAME + 4) :: packname +! character(len=LENBUDTXT), dimension(1) :: budtxt +! type(TableType), pointer :: output_tab +! class(VirtualModelType), pointer :: nbr_model +! character(len=20) :: nodestr +! character(len=LENBOUNDNAME) :: bname +! integer(I4B) :: ntabrows +! integer(I4B) :: nodeu +! integer(I4B) :: i, n1, n2, n1u, n2u +! integer(I4B) :: ibinun +! real(DP) :: ratin, ratout, rrate +! logical(LGP) :: is_for_model1 +! ! +! budtxt(1) = ' FLOW-JA-FACE' +! packname = 'EXG '//this%name +! packname = adjustr(packname) +! ! if (associated(model, this%swfmodel1)) then +! ! output_tab => this%outputtab1 +! ! nbr_model => this%v_model2 +! ! is_for_model1 = .true. +! ! else +! output_tab => this%outputtab2 +! nbr_model => this%v_model1 +! is_for_model1 = .false. +! ! end if +! ! +! ! -- update output tables +! if (this%iprflow /= 0) then +! ! +! ! -- update titles +! if (model%oc%oc_save('BUDGET')) then +! call output_tab%set_title(packname) +! end if +! ! +! ! -- set table kstp and kper +! call output_tab%set_kstpkper(kstp, kper) +! ! +! ! -- update maxbound of tables +! ntabrows = 0 +! do i = 1, this%nexg +! n1 = this%nodem1(i) +! n2 = this%nodem2(i) +! ! +! ! -- If both cells are active then calculate flow rate +! if (this%v_model1%ibound%get(n1) /= 0 .and. & +! this%v_model2%ibound%get(n2) /= 0) then +! ntabrows = ntabrows + 1 +! end if +! end do +! if (ntabrows > 0) then +! call output_tab%set_maxbound(ntabrows) +! end if +! end if +! ! +! ! -- Print and write budget terms +! ! +! ! -- Set binary unit numbers for saving flows +! if (this%ipakcb /= 0) then +! ibinun = model%oc%oc_save_unit('BUDGET') +! else +! ibinun = 0 +! end if +! ! +! ! -- If save budget flag is zero for this stress period, then +! ! shut off saving +! if (.not. model%oc%oc_save('BUDGET')) ibinun = 0 +! ! +! ! -- If cell-by-cell flows will be saved as a list, write header. +! if (ibinun /= 0) then +! call model%dis%record_srcdst_list_header(budtxt(1), & +! model%name, & +! this%name, & +! nbr_model%name, & +! this%name, & +! this%naux, this%auxname, & +! ibinun, this%nexg, & +! model%iout) +! end if +! ! +! ! Initialize accumulators +! ratin = DZERO +! ratout = DZERO +! ! +! ! -- Loop through all exchanges +! do i = 1, this%nexg +! ! +! ! -- Assign boundary name +! if (this%inamedbound > 0) then +! bname = this%boundname(i) +! else +! bname = '' +! end if +! ! +! ! -- Calculate the flow rate between n1 and n2 +! rrate = DZERO +! n1 = this%nodem1(i) +! n2 = this%nodem2(i) +! ! +! ! -- If both cells are active then calculate flow rate +! if (this%v_model1%ibound%get(n1) /= 0 .and. & +! this%v_model2%ibound%get(n2) /= 0) then +! rrate = this%simvals(i) +! ! +! ! -- Print the individual rates to model list files if requested +! if (this%iprflow /= 0) then +! if (model%oc%oc_save('BUDGET')) then +! ! +! ! -- set nodestr and write outputtab table +! if (is_for_model1) then +! nodeu = model%dis%get_nodeuser(n1) +! call model%dis%nodeu_to_string(nodeu, nodestr) +! call output_tab%print_list_entry(i, trim(adjustl(nodestr)), & +! rrate, bname) +! else +! nodeu = model%dis%get_nodeuser(n2) +! call model%dis%nodeu_to_string(nodeu, nodestr) +! call output_tab%print_list_entry(i, trim(adjustl(nodestr)), & +! -rrate, bname) +! end if +! end if +! end if +! if (rrate < DZERO) then +! ratout = ratout - rrate +! else +! ratin = ratin + rrate +! end if +! end if +! ! +! ! -- If saving cell-by-cell flows in list, write flow +! n1u = this%v_model1%dis_get_nodeuser(n1) +! n2u = this%v_model2%dis_get_nodeuser(n2) +! if (ibinun /= 0) then +! if (is_for_model1) then +! call model%dis%record_mf6_list_entry(ibinun, n1u, n2u, rrate, & +! this%naux, this%auxvar(:, i), & +! .false., .false.) +! else +! call model%dis%record_mf6_list_entry(ibinun, n2u, n1u, -rrate, & +! this%naux, this%auxvar(:, i), & +! .false., .false.) +! end if +! end if +! ! +! end do +! ! +! ! -- Return +! return +! end subroutine swf_gwf_bdsav_model + +! !> @ brief Output +! !! +! !! Write output +! !< +! subroutine swf_gwf_ot(this) +! ! -- modules +! use SimVariablesModule, only: iout +! use ConstantsModule, only: DZERO, LINELENGTH +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! -- local +! integer(I4B) :: iexg, n1, n2 +! integer(I4B) :: ibudfl +! real(DP) :: flow, deltaqgnc +! character(len=LINELENGTH) :: node1str, node2str +! ! -- format +! character(len=*), parameter :: fmtheader = & +! "(/1x, 'SUMMARY OF EXCHANGE RATES FOR EXCHANGE ', a, ' WITH ID ', i0, /, & +! &2a16, 5a16, /, 112('-'))" +! character(len=*), parameter :: fmtheader2 = & +! "(/1x, 'SUMMARY OF EXCHANGE RATES FOR EXCHANGE ', a, ' WITH ID ', i0, /, & +! &2a16, 4a16, /, 96('-'))" +! character(len=*), parameter :: fmtdata = & +! "(2a16, 5(1pg16.6))" +! ! +! ! -- Call bdsave +! call this%swf_gwf_bdsav() +! ! +! ! -- Initialize +! deltaqgnc = DZERO +! ! +! ! -- Write a table of exchanges +! if (this%iprflow /= 0) then +! if (this%ingnc > 0) then +! write (iout, fmtheader) trim(adjustl(this%name)), this%id, 'NODEM1', & +! 'NODEM2', 'COND', 'X_M1', 'X_M2', 'DELTAQGNC', & +! 'FLOW' +! else +! write (iout, fmtheader2) trim(adjustl(this%name)), this%id, 'NODEM1', & +! 'NODEM2', 'COND', 'X_M1', 'X_M2', 'FLOW' +! end if +! do iexg = 1, this%nexg +! n1 = this%nodem1(iexg) +! n2 = this%nodem2(iexg) +! flow = this%simvals(iexg) +! call this%v_model1%dis_noder_to_string(n1, node1str) +! call this%v_model2%dis_noder_to_string(n2, node2str) + +! if (this%ingnc > 0) then +! deltaqgnc = this%gnc%deltaqgnc(iexg) +! write (iout, fmtdata) trim(adjustl(node1str)), & +! trim(adjustl(node2str)), & +! this%cond(iexg), this%v_model1%x%get(n1), & +! this%v_model2%x%get(n2), deltaqgnc, flow +! else +! write (iout, fmtdata) trim(adjustl(node1str)), & +! trim(adjustl(node2str)), & +! this%cond(iexg), this%v_model1%x%get(n1), & +! this%v_model2%x%get(n2), flow +! end if +! end do +! end if +! ! +! ! -- Mover budget output +! ibudfl = 1 +! if (this%inmvr > 0) call this%mvr%mvr_ot_bdsummary(ibudfl) +! ! +! ! -- OBS output +! call this%obs%obs_ot() +! ! +! ! -- Return +! return +! end subroutine swf_gwf_ot + +! !> @ brief Read options +! !! +! !! Read the options block +! !< +! subroutine read_options(this, iout) +! ! -- modules +! use ConstantsModule, only: LINELENGTH, LENAUXNAME, DEM6 +! use MemoryManagerModule, only: mem_allocate +! use SimModule, only: store_error, store_error_unit +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! integer(I4B), intent(in) :: iout +! ! -- local +! character(len=LINELENGTH) :: keyword +! logical :: isfound +! logical :: endOfBlock +! integer(I4B) :: ierr +! ! +! ! -- get options block +! call this%parser%GetBlock('OPTIONS', isfound, ierr, & +! supportOpenClose=.true., blockRequired=.false.) +! ! +! ! -- parse options block if detected +! if (isfound) then +! write (iout, '(1x,a)') 'PROCESSING GWF-GWF EXCHANGE OPTIONS' +! do +! call this%parser%GetNextLine(endOfBlock) +! if (endOfBlock) then +! exit +! end if +! call this%parser%GetStringCaps(keyword) +! ! +! ! first parse option in base +! if (this%DisConnExchangeType%parse_option(keyword, iout)) then +! cycle +! end if +! ! +! ! it's probably ours +! if (this%parse_option(keyword, iout)) then +! cycle +! end if +! ! +! ! unknown option +! errmsg = "Unknown GWF-GWF exchange option '"//trim(keyword)//"'." +! call store_error(errmsg) +! call this%parser%StoreErrorUnit() +! end do +! ! +! write (iout, '(1x,a)') 'END OF GWF-GWF EXCHANGE OPTIONS' +! end if +! ! +! ! -- set omega value used for saturation calculations +! if (this%inewton > 0) then +! this%satomega = DEM6 +! end if +! ! +! ! -- Return +! return +! end subroutine read_options + +! !> @brief parse option from exchange file +! !< +! function parse_option(this, keyword, iout) result(parsed) +! ! -- modules +! use InputOutputModule, only: getunit, openfile +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! character(len=LINELENGTH), intent(in) :: keyword !< the option name +! integer(I4B), intent(in) :: iout !< for logging +! logical(LGP) :: parsed !< true when parsed +! ! -- local +! character(len=LINELENGTH) :: fname +! integer(I4B) :: inobs +! character(len=LINELENGTH) :: subkey +! character(len=:), allocatable :: line +! ! +! parsed = .true. +! ! +! sel_opt:select case(keyword) +! case ('PRINT_FLOWS') +! this%iprflow = 1 +! write (iout, '(4x,a)') & +! 'EXCHANGE FLOWS WILL BE PRINTED TO LIST FILES.' +! case ('SAVE_FLOWS') +! this%ipakcb = -1 +! write (iout, '(4x,a)') & +! 'EXCHANGE FLOWS WILL BE SAVED TO BINARY BUDGET FILES.' +! case ('ALTERNATIVE_CELL_AVERAGING') +! call this%parser%GetStringCaps(subkey) +! select case (subkey) +! case ('LOGARITHMIC') +! this%icellavg = 1 +! case ('AMT-LMK') +! this%icellavg = 2 +! case default +! errmsg = "Unknown cell averaging method '"//trim(subkey)//"'." +! call store_error(errmsg) +! call this%parser%StoreErrorUnit() +! end select +! write (iout, '(4x,a,a)') & +! 'CELL AVERAGING METHOD HAS BEEN SET TO: ', trim(subkey) +! case ('VARIABLECV') +! this%ivarcv = 1 +! write (iout, '(4x,a)') & +! 'VERTICAL CONDUCTANCE VARIES WITH WATER TABLE.' +! call this%parser%GetStringCaps(subkey) +! if (subkey == 'DEWATERED') then +! this%idewatcv = 1 +! write (iout, '(4x,a)') & +! 'VERTICAL CONDUCTANCE ACCOUNTS FOR DEWATERED PORTION OF '// & +! 'AN UNDERLYING CELL.' +! end if +! case ('NEWTON') +! this%inewton = 1 +! write (iout, '(4x,a)') & +! 'NEWTON-RAPHSON method used for unconfined cells' +! case ('GNC6') +! call this%parser%GetStringCaps(subkey) +! if (subkey /= 'FILEIN') then +! call store_error('GNC6 keyword must be followed by '// & +! '"FILEIN" then by filename.') +! call this%parser%StoreErrorUnit() +! end if +! call this%parser%GetString(fname) +! if (fname == '') then +! call store_error('No GNC6 file specified.') +! call this%parser%StoreErrorUnit() +! end if +! this%ingnc = getunit() +! call openfile(this%ingnc, iout, fname, 'GNC') +! write (iout, '(4x,a)') & +! 'GHOST NODES WILL BE READ FROM ', trim(fname) +! case ('MVR6') +! if (this%is_datacopy) then +! call this%parser%GetRemainingLine(line) +! exit sel_opt +! end if +! call this%parser%GetStringCaps(subkey) +! if (subkey /= 'FILEIN') then +! call store_error('MVR6 keyword must be followed by '// & +! '"FILEIN" then by filename.') +! call this%parser%StoreErrorUnit() +! end if +! call this%parser%GetString(fname) +! if (fname == '') then +! call store_error('No MVR6 file specified.') +! call this%parser%StoreErrorUnit() +! end if +! this%inmvr = getunit() +! call openfile(this%inmvr, iout, fname, 'MVR') +! write (iout, '(4x,a)') & +! 'WATER MOVER INFORMATION WILL BE READ FROM ', trim(fname) +! case ('OBS6') +! if (this%is_datacopy) then +! call this%parser%GetRemainingLine(line) +! exit sel_opt +! end if +! call this%parser%GetStringCaps(subkey) +! if (subkey /= 'FILEIN') then +! call store_error('OBS8 keyword must be followed by '// & +! '"FILEIN" then by filename.') +! call this%parser%StoreErrorUnit() +! end if +! this%obs%active = .true. +! call this%parser%GetString(this%obs%inputFilename) +! inobs = GetUnit() +! call openfile(inobs, iout, this%obs%inputFilename, 'OBS') +! this%obs%inUnitObs = inobs +! case default +! parsed = .false. +! end select sel_opt +! ! +! ! -- Return +! return +! end function parse_option + +! !> @ brief Read ghost nodes +! !! +! !! Read and process ghost nodes +! !< +! subroutine read_gnc(this) +! ! -- modules +! use SimModule, only: store_error, store_error_unit, count_errors +! use ConstantsModule, only: LINELENGTH +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! -- local +! integer(I4B) :: i, nm1, nm2, nmgnc1, nmgnc2 +! character(len=*), parameter :: fmterr = & +! "('EXCHANGE NODES ', i0, ' AND ', i0,"// & +! "' NOT CONSISTENT WITH GNC NODES ', "// & +! "i0, ' AND ', i0)" +! ! +! ! -- If exchange has ghost nodes, then initialize ghost node object +! ! This will read the ghost node blocks from the gnc input file. +! call this%gnc%gnc_df(this%swfmodel1, m2=this%gwfmodel2) +! ! +! ! -- Verify gnc is implicit if exchange has Newton Terms +! if (.not. this%gnc%implicit .and. this%inewton /= 0) then +! call store_error('GNC is explicit, but GWF exchange has active newton.') +! call store_error('Add implicit option to GNC or remove NEWTON from '// & +! 'GWF exchange.') +! call store_error_unit(this%ingnc) +! end if +! ! +! ! -- Perform checks to ensure GNCs match with GWF-GWF nodes +! if (this%nexg /= this%gnc%nexg) then +! call store_error('Number of exchanges does not match number of GNCs') +! call store_error_unit(this%ingnc) +! end if +! ! +! ! -- Go through each entry and confirm +! do i = 1, this%nexg +! if (this%nodem1(i) /= this%gnc%nodem1(i) .or. & +! this%nodem2(i) /= this%gnc%nodem2(i)) then +! nm1 = this%swfmodel1%dis%get_nodeuser(this%nodem1(i)) +! nm2 = this%gwfmodel2%dis%get_nodeuser(this%nodem2(i)) +! nmgnc1 = this%swfmodel1%dis%get_nodeuser(this%gnc%nodem1(i)) +! nmgnc2 = this%gwfmodel2%dis%get_nodeuser(this%gnc%nodem2(i)) +! write (errmsg, fmterr) nm1, nm2, nmgnc1, nmgnc2 +! call store_error(errmsg) +! end if +! end do +! if (count_errors() > 0) then +! call store_error_unit(this%ingnc) +! end if +! ! +! ! -- close the file +! close (this%ingnc) +! ! +! ! -- Return +! return +! end subroutine read_gnc + +! !> @ brief Read mover +! !! +! !! Read and process movers +! !< +! subroutine read_mvr(this, iout) +! ! -- modules +! use GwfMvrModule, only: mvr_cr +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! integer(I4B), intent(in) :: iout +! ! +! ! -- Create and initialize the mover object Here, dis is set to the one +! ! for swfmodel1 so that a call to save flows has an associated dis +! ! object. Because the conversion flags for the mover are both false, +! ! the dis object does not convert from reduced to user node numbers. +! ! So in this case, the dis object is just writing unconverted package +! ! numbers to the binary budget file. +! call mvr_cr(this%mvr, this%name, this%inmvr, iout, this%swfmodel1%dis, & +! iexgmvr=1) +! ! +! ! -- Return +! return +! end subroutine read_mvr + +! !> @ brief Rewet +! !! +! !! Check if rewetting should propagate from one model to another +! !< +! subroutine rewet(this, kiter) +! ! -- modules +! use TdisModule, only: kper, kstp +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! integer(I4B), intent(in) :: kiter +! ! -- local +! integer(I4B) :: iexg +! integer(I4B) :: n, m +! integer(I4B) :: ibdn, ibdm +! integer(I4B) :: ihc +! real(DP) :: hn, hm +! integer(I4B) :: irewet +! character(len=30) :: nodestrn, nodestrm +! character(len=*), parameter :: fmtrwt = & +! "(1x, 'CELL ',A,' REWET FROM GWF MODEL ',A,' CELL ',A, & +! &' FOR ITER. ',I0, ' STEP ',I0, ' PERIOD ', I0)" +! ! +! ! -- Use model 1 to rewet model 2 and vice versa +! ! do iexg = 1, this%nexg +! ! n = this%nodem1(iexg) +! ! m = this%nodem2(iexg) +! ! hn = this%swfmodel1%x(n) +! ! hm = this%gwfmodel2%x(m) +! ! ibdn = this%swfmodel1%ibound(n) +! ! ibdm = this%gwfmodel2%ibound(m) +! ! ihc = this%ihc(iexg) +! ! call this%swfmodel1%npf%rewet_check(kiter, n, hm, ibdm, ihc, & +! ! this%swfmodel1%x, irewet) +! ! if (irewet == 1) then +! ! call this%swfmodel1%dis%noder_to_string(n, nodestrn) +! ! call this%gwfmodel2%dis%noder_to_string(m, nodestrm) +! ! write (this%swfmodel1%iout, fmtrwt) trim(nodestrn), & +! ! trim(this%gwfmodel2%name), trim(nodestrm), kiter, kstp, kper +! ! end if +! ! call this%gwfmodel2%npf%rewet_check(kiter, m, hn, ibdn, ihc, & +! ! this%gwfmodel2%x, irewet) +! ! if (irewet == 1) then +! ! call this%swfmodel1%dis%noder_to_string(n, nodestrm) +! ! call this%gwfmodel2%dis%noder_to_string(m, nodestrn) +! ! write (this%gwfmodel2%iout, fmtrwt) trim(nodestrn), & +! ! trim(this%swfmodel1%name), trim(nodestrm), kiter, kstp, kper +! ! end if +! ! ! +! ! end do +! ! +! ! -- Return +! return +! end subroutine rewet + +! subroutine calc_cond_sat(this) +! ! -- modules +! use ConstantsModule, only: LINELENGTH, DZERO, DHALF, DONE, DPIO180 +! use GwfNpfModule, only: condmean, vcond, hcond +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! -- local +! integer(I4B) :: iexg +! integer(I4B) :: n, m, ihc +! real(DP) :: topn, topm +! real(DP) :: botn, botm +! real(DP) :: satn, satm +! real(DP) :: thickn, thickm +! real(DP) :: angle, hyn, hym +! real(DP) :: csat +! real(DP) :: fawidth +! real(DP), dimension(3) :: vg +! ! +! do iexg = 1, this%nexg +! ! +! ihc = this%ihc(iexg) +! n = this%nodem1(iexg) +! m = this%nodem2(iexg) +! topn = this%swfmodel1%dis%top(n) +! topm = this%gwfmodel2%dis%top(m) +! botn = this%swfmodel1%dis%bot(n) +! botm = this%gwfmodel2%dis%bot(m) +! satn = DONE ! cdl this%swfmodel1%npf%sat(n) +! satm = this%gwfmodel2%npf%sat(m) +! thickn = (topn - botn) * satn +! thickm = (topm - botm) * satm +! ! +! ! -- Calculate conductance depending on connection orientation +! if (ihc == 0) then +! ! +! ! -- Vertical conductance for fully saturated conditions +! vg(1) = DZERO +! vg(2) = DZERO +! vg(3) = DONE +! hyn = DONE ! cdl this%swfmodel1%npf%hy_eff(n, 0, ihc, vg=vg) +! hym = this%gwfmodel2%npf%hy_eff(m, 0, ihc, vg=vg) +! csat = vcond(1, 1, 1, 1, 0, 1, 1, DONE, & +! botn, botm, & +! hyn, hym, & +! satn, satm, & +! topn, topm, & +! botn, botm, & +! this%hwva(iexg)) +! else +! ! +! ! -- Calculate horizontal conductance +! hyn = DONE ! cdl this%swfmodel1%npf%k11(n) +! hym = this%gwfmodel2%npf%k11(m) +! ! +! ! -- Check for anisotropy in models, and recalculate hyn and hym +! if (this%ianglex > 0) then +! angle = this%auxvar(this%ianglex, iexg) * DPIO180 +! vg(1) = abs(cos(angle)) +! vg(2) = abs(sin(angle)) +! vg(3) = DZERO +! ! +! ! -- anisotropy in model 1 +! ! if (this%swfmodel1%npf%ik22 /= 0) then +! ! hyn = this%swfmodel1%npf%hy_eff(n, 0, ihc, vg=vg) +! ! end if +! ! +! ! -- anisotropy in model 2 +! if (this%gwfmodel2%npf%ik22 /= 0) then +! hym = this%gwfmodel2%npf%hy_eff(m, 0, ihc, vg=vg) +! end if +! end if +! ! +! fawidth = this%hwva(iexg) +! csat = hcond(1, 1, 1, 1, this%inewton, 0, ihc, & +! this%icellavg, 0, 0, DONE, & +! topn, topm, satn, satm, hyn, hym, & +! topn, topm, & +! botn, botm, & +! this%cl1(iexg), this%cl2(iexg), & +! fawidth, this%satomega) +! end if +! ! +! ! -- store csat in condsat +! this%condsat(iexg) = csat +! end do +! ! +! ! -- Return +! return +! end subroutine calc_cond_sat + +! !> @ brief Calculate the conductance +! !! +! !! Calculate the conductance based on state +! !< +! subroutine condcalc(this) +! ! -- modules +! use ConstantsModule, only: DHALF, DZERO, DONE +! use GwfNpfModule, only: hcond, vcond +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! -- local +! integer(I4B) :: iexg +! integer(I4B) :: n, m, ihc +! integer(I4B) :: ibdn, ibdm +! integer(I4B) :: ictn, ictm +! real(DP) :: topn, topm +! real(DP) :: botn, botm +! real(DP) :: satn, satm +! real(DP) :: hyn, hym +! real(DP) :: angle +! real(DP) :: hn, hm +! real(DP) :: cond +! real(DP) :: fawidth +! real(DP), dimension(3) :: vg +! ! +! ! -- Calculate conductance and put into amat +! do iexg = 1, this%nexg +! ihc = this%ihc(iexg) +! n = this%nodem1(iexg) +! m = this%nodem2(iexg) +! ibdn = this%swfmodel1%ibound(n) +! ibdm = this%gwfmodel2%ibound(m) +! ictn = 1 ! cdl this%swfmodel1%npf%icelltype(n) +! ictm = this%gwfmodel2%npf%icelltype(m) +! topn = this%swfmodel1%dis%top(n) +! topm = this%gwfmodel2%dis%top(m) +! botn = this%swfmodel1%dis%bot(n) +! botm = this%gwfmodel2%dis%bot(m) +! satn = DONE ! cdl this%swfmodel1%npf%sat(n) +! satm = this%gwfmodel2%npf%sat(m) +! hn = this%swfmodel1%x(n) +! hm = this%gwfmodel2%x(m) +! ! +! ! -- Calculate conductance depending on connection orientation +! if (ihc == 0) then +! ! +! ! -- Vertical connection +! vg(1) = DZERO +! vg(2) = DZERO +! vg(3) = DONE +! hyn = DONE ! cdl this%swfmodel1%npf%hy_eff(n, 0, ihc, vg=vg) +! hym = this%gwfmodel2%npf%hy_eff(m, 0, ihc, vg=vg) +! cond = vcond(ibdn, ibdm, ictn, ictm, this%inewton, this%ivarcv, & +! this%idewatcv, this%condsat(iexg), hn, hm, hyn, hym, & +! satn, satm, topn, topm, botn, botm, this%hwva(iexg)) +! else +! ! ! +! ! ! -- Horizontal Connection +! ! hyn = this%swfmodel1%npf%k11(n) +! ! hym = this%gwfmodel2%npf%k11(m) +! ! ! +! ! ! -- Check for anisotropy in models, and recalculate hyn and hym +! ! if (this%ianglex > 0) then +! ! angle = this%auxvar(this%ianglex, iexg) +! ! vg(1) = abs(cos(angle)) +! ! vg(2) = abs(sin(angle)) +! ! vg(3) = DZERO +! ! ! +! ! ! -- anisotropy in model 1 +! ! if (this%swfmodel1%npf%ik22 /= 0) then +! ! hyn = this%swfmodel1%npf%hy_eff(n, 0, ihc, vg=vg) +! ! end if +! ! ! +! ! ! -- anisotropy in model 2 +! ! if (this%gwfmodel2%npf%ik22 /= 0) then +! ! hym = this%gwfmodel2%npf%hy_eff(m, 0, ihc, vg=vg) +! ! end if +! ! end if +! ! ! +! ! fawidth = this%hwva(iexg) +! ! cond = hcond(ibdn, ibdm, ictn, ictm, this%inewton, this%inewton, & +! ! this%ihc(iexg), this%icellavg, 0, 0, this%condsat(iexg), & +! ! hn, hm, satn, satm, hyn, hym, topn, topm, botn, botm, & +! ! this%cl1(iexg), this%cl2(iexg), fawidth, this%satomega) +! end if +! ! +! this%cond(iexg) = cond +! ! +! end do +! ! +! ! -- Return +! return +! end subroutine condcalc + +! !> @ brief Allocate scalars +! !! +! !! Allocate scalar variables +! !< +! subroutine allocate_scalars(this) +! ! -- modules +! use MemoryManagerModule, only: mem_allocate +! use ConstantsModule, only: DZERO +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! +! call this%DisConnExchangeType%allocate_scalars() +! ! +! call mem_allocate(this%iprflow, 'IPRFLOW', this%memoryPath) +! call mem_allocate(this%ipakcb, 'IPAKCB', this%memoryPath) +! this%iprpak = 0 +! this%iprflow = 0 +! this%ipakcb = 0 +! ! +! call mem_allocate(this%icellavg, 'ICELLAVG', this%memoryPath) +! call mem_allocate(this%ivarcv, 'IVARCV', this%memoryPath) +! call mem_allocate(this%idewatcv, 'IDEWATCV', this%memoryPath) +! call mem_allocate(this%inewton, 'INEWTON', this%memoryPath) +! call mem_allocate(this%ingnc, 'INGNC', this%memoryPath) +! call mem_allocate(this%inmvr, 'INMVR', this%memoryPath) +! call mem_allocate(this%inobs, 'INOBS', this%memoryPath) +! call mem_allocate(this%satomega, 'SATOMEGA', this%memoryPath) +! this%icellavg = 0 +! this%ivarcv = 0 +! this%idewatcv = 0 +! this%inewton = 0 +! this%ingnc = 0 +! this%inmvr = 0 +! this%inobs = 0 +! this%satomega = DZERO +! ! +! ! -- Return +! return +! end subroutine allocate_scalars + +! !> @ brief Deallocate +! !! +! !! Deallocate memory associated with this object +! !< +! subroutine swf_gwf_da(this) +! ! -- modules +! use MemoryManagerModule, only: mem_deallocate +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! +! ! -- objects +! if (this%ingnc > 0) then +! call this%gnc%gnc_da() +! deallocate (this%gnc) +! end if +! if (this%inmvr > 0) then +! call this%mvr%mvr_da() +! deallocate (this%mvr) +! end if +! call this%obs%obs_da() +! deallocate (this%obs) +! ! +! ! -- arrays +! call mem_deallocate(this%cond) +! call mem_deallocate(this%condsat) +! call mem_deallocate(this%idxglo) +! call mem_deallocate(this%idxsymglo) +! call mem_deallocate(this%simvals) +! ! +! ! -- output table objects +! if (associated(this%outputtab1)) then +! call this%outputtab1%table_da() +! deallocate (this%outputtab1) +! nullify (this%outputtab1) +! end if +! if (associated(this%outputtab2)) then +! call this%outputtab2%table_da() +! deallocate (this%outputtab2) +! nullify (this%outputtab2) +! end if +! ! +! ! -- scalars +! deallocate (this%filename) +! call mem_deallocate(this%iprflow) +! call mem_deallocate(this%ipakcb) +! ! +! call mem_deallocate(this%icellavg) +! call mem_deallocate(this%ivarcv) +! call mem_deallocate(this%idewatcv) +! call mem_deallocate(this%inewton) +! call mem_deallocate(this%ingnc) +! call mem_deallocate(this%inmvr) +! call mem_deallocate(this%inobs) +! call mem_deallocate(this%satomega) +! ! +! ! -- deallocate base +! call this%DisConnExchangeType%disconnex_da() +! ! +! ! -- Return +! return +! end subroutine swf_gwf_da + +! !> @ brief Allocate arrays +! !! +! !! Allocate arrays +! !< +! subroutine allocate_arrays(this) +! ! -- modules +! use MemoryManagerModule, only: mem_allocate +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! -- local +! character(len=LINELENGTH) :: text +! integer(I4B) :: ntabcol, i +! ! +! call this%DisConnExchangeType%allocate_arrays() +! ! +! call mem_allocate(this%cond, this%nexg, 'COND', this%memoryPath) +! call mem_allocate(this%idxglo, this%nexg, 'IDXGLO', this%memoryPath) +! call mem_allocate(this%idxsymglo, this%nexg, 'IDXSYMGLO', this%memoryPath) ! +! call mem_allocate(this%condsat, this%nexg, 'CONDSAT', this%memoryPath) +! call mem_allocate(this%simvals, this%nexg, 'SIMVALS', this%memoryPath) +! ! +! ! -- Initialize +! do i = 1, this%nexg +! this%cond(i) = DNODATA +! end do +! ! +! ! -- allocate and initialize the output table +! if (this%iprflow /= 0) then +! ! +! ! -- dimension table +! ntabcol = 3 +! if (this%inamedbound > 0) then +! ntabcol = ntabcol + 1 +! end if +! ! +! ! -- initialize the output table objects +! ! outouttab1 +! if (this%v_model1%is_local) then +! call table_cr(this%outputtab1, this%name, ' ') +! call this%outputtab1%table_df(this%nexg, ntabcol, this%swfmodel1%iout, & +! transient=.TRUE.) +! text = 'NUMBER' +! call this%outputtab1%initialize_column(text, 10, alignment=TABCENTER) +! text = 'CELLID' +! call this%outputtab1%initialize_column(text, 20, alignment=TABLEFT) +! text = 'RATE' +! call this%outputtab1%initialize_column(text, 15, alignment=TABCENTER) +! if (this%inamedbound > 0) then +! text = 'NAME' +! call this%outputtab1%initialize_column(text, 20, alignment=TABLEFT) +! end if +! end if +! ! outouttab2 +! if (this%v_model2%is_local) then +! call table_cr(this%outputtab2, this%name, ' ') +! call this%outputtab2%table_df(this%nexg, ntabcol, this%gwfmodel2%iout, & +! transient=.TRUE.) +! text = 'NUMBER' +! call this%outputtab2%initialize_column(text, 10, alignment=TABCENTER) +! text = 'CELLID' +! call this%outputtab2%initialize_column(text, 20, alignment=TABLEFT) +! text = 'RATE' +! call this%outputtab2%initialize_column(text, 15, alignment=TABCENTER) +! if (this%inamedbound > 0) then +! text = 'NAME' +! call this%outputtab2%initialize_column(text, 20, alignment=TABLEFT) +! end if +! end if +! end if +! ! +! ! -- Return +! return +! end subroutine allocate_arrays + +! !> @ brief Define observations +! !! +! !! Define the observations associated with this object +! !< +! subroutine swf_gwf_df_obs(this) +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! -- local +! integer(I4B) :: indx +! ! +! ! -- Store obs type and assign procedure pointer +! ! for gwf-gwf observation type. +! call this%obs%StoreObsType('flow-ja-face', .true., indx) +! this%obs%obsData(indx)%ProcessIdPtr => swf_gwf_process_obsID +! ! +! ! -- Return +! return +! end subroutine swf_gwf_df_obs + +! !> @ brief Read and prepare observations +! !! +! !! Handle observation exchanges exchange-boundary names. +! !< +! subroutine swf_gwf_rp_obs(this) +! ! -- modules +! use ConstantsModule, only: DZERO +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! -- local +! integer(I4B) :: i +! integer(I4B) :: j +! class(ObserveType), pointer :: obsrv => null() +! character(len=LENBOUNDNAME) :: bname +! logical :: jfound +! ! -- formats +! 10 format('Exchange "', a, '" for observation "', a, & +! '" is invalid in package "', a, '"') +! 20 format('Exchange id "', i0, '" for observation "', a, & +! '" is invalid in package "', a, '"') +! ! +! do i = 1, this%obs%npakobs +! obsrv => this%obs%pakobs(i)%obsrv +! ! +! ! -- indxbnds needs to be reset each stress period because +! ! list of boundaries can change each stress period. +! ! -- Not true for exchanges, but leave this in for now anyway. +! call obsrv%ResetObsIndex() +! obsrv%BndFound = .false. +! ! +! bname = obsrv%FeatureName +! if (bname /= '') then +! ! -- Observation location(s) is(are) based on a boundary name. +! ! Iterate through all boundaries to identify and store +! ! corresponding index(indices) in bound array. +! jfound = .false. +! do j = 1, this%nexg +! if (this%boundname(j) == bname) then +! jfound = .true. +! obsrv%BndFound = .true. +! obsrv%CurrentTimeStepEndValue = DZERO +! call obsrv%AddObsIndex(j) +! end if +! end do +! if (.not. jfound) then +! write (errmsg, 10) trim(bname), trim(obsrv%ObsTypeId), trim(this%name) +! call store_error(errmsg) +! end if +! else +! ! -- Observation location is a single exchange number +! if (obsrv%intPak1 <= this%nexg .and. obsrv%intPak1 > 0) then +! jfound = .true. +! obsrv%BndFound = .true. +! obsrv%CurrentTimeStepEndValue = DZERO +! call obsrv%AddObsIndex(obsrv%intPak1) +! else +! jfound = .false. +! end if +! if (.not. jfound) then +! write (errmsg, 20) obsrv%intPak1, trim(obsrv%ObsTypeId), trim(this%name) +! call store_error(errmsg) +! end if +! end if +! end do +! ! +! ! -- write summary of error messages +! if (count_errors() > 0) then +! call store_error_unit(this%inobs) +! end if +! ! +! ! -- Return +! return +! end subroutine swf_gwf_rp_obs + +! !> @ brief Final processing +! !! +! !! Conduct any final processing +! !< +! subroutine swf_gwf_fp(this) +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! +! ! -- Return +! return +! end subroutine swf_gwf_fp + +! !> @ brief Calculate flow +! !! +! !! Calculate the flow for the specified exchange and node numbers +! !< +! function qcalc(this, iexg, n1, n2) +! ! -- return +! real(DP) :: qcalc +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! integer(I4B), intent(in) :: iexg +! integer(I4B), intent(in) :: n1 +! integer(I4B), intent(in) :: n2 +! ! -- local +! ! +! ! -- Calculate flow between nodes in the two models +! qcalc = this%cond(iexg) * (this%gwfmodel2%x(n2) - this%swfmodel1%x(n1)) +! ! +! ! -- Return +! return +! end function qcalc + +! !> @ brief Set symmetric flag +! !! +! !! Return flag indicating whether or not this exchange will cause the +! !! coefficient matrix to be asymmetric. +! !< +! function swf_gwf_get_iasym(this) result(iasym) +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! -- local +! integer(I4B) :: iasym +! ! +! ! -- Start by setting iasym to zero +! iasym = 0 +! ! +! ! -- Groundwater flow +! if (this%inewton /= 0) iasym = 1 +! ! +! ! -- GNC +! if (this%ingnc > 0) then +! if (this%gnc%iasym /= 0) iasym = 1 +! end if +! ! +! ! -- Return +! return +! end function swf_gwf_get_iasym + +! !> @brief Return true when this exchange provides matrix +! !! coefficients for solving @param model +! !< +! function swf_gwf_connects_model(this, model) result(is_connected) +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! class(BaseModelType), pointer, intent(in) :: model !< the model to which the exchange might hold a connection +! ! -- return +! logical(LGP) :: is_connected !< true, when connected +! ! +! is_connected = .false. +! ! +! ! only connected when model is GwfModelType of course +! select type (model) +! class is (GwfModelType) +! ! if (associated(this%swfmodel1, model)) then +! ! is_connected = .true. +! if (associated(this%gwfmodel2, model)) then +! is_connected = .true. +! end if +! class is (SwfModelType) +! if (associated(this%swfmodel1, model)) then +! is_connected = .true. +! end if +! end select +! ! +! ! -- Return +! return +! end function swf_gwf_connects_model + +! !> @brief Should interface model be used for this exchange +! !< +! function use_interface_model(this) result(use_im) +! ! -- dummy +! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType +! ! -- return +! logical(LGP) :: use_im !< true when interface model should be used +! ! +! use_im = this%DisConnExchangeType%use_interface_model() +! use_im = use_im .or. (this%ixt3d > 0) +! ! +! ! -- Return +! return +! end function + +! !> @ brief Save simulated flow observations +! !! +! !! Save the simulated flows for each exchange +! !< +! subroutine swf_gwf_save_simvals(this) +! ! -- modules +! use SimModule, only: store_error, store_error_unit +! use SimVariablesModule, only: errmsg +! use ConstantsModule, only: DZERO +! use ObserveModule, only: ObserveType +! ! -- dummy +! class(SwfGwfExchangeType), intent(inout) :: this +! ! -- local +! integer(I4B) :: i +! integer(I4B) :: j +! integer(I4B) :: n1 +! integer(I4B) :: n2 +! integer(I4B) :: iexg +! real(DP) :: v +! type(ObserveType), pointer :: obsrv => null() +! ! +! ! -- Write simulated values for all gwf-gwf observations +! if (this%obs%npakobs > 0) then +! call this%obs%obs_bd_clear() +! do i = 1, this%obs%npakobs +! obsrv => this%obs%pakobs(i)%obsrv +! do j = 1, obsrv%indxbnds_count +! iexg = obsrv%indxbnds(j) +! v = DZERO +! select case (obsrv%ObsTypeId) +! case ('FLOW-JA-FACE') +! n1 = this%nodem1(iexg) +! n2 = this%nodem2(iexg) +! v = this%simvals(iexg) +! case default +! errmsg = 'Unrecognized observation type: '// & +! trim(obsrv%ObsTypeId) +! call store_error(errmsg) +! call store_error_unit(this%inobs) +! end select +! call this%obs%SaveOneSimval(obsrv, v) +! end do +! end do +! end if +! ! +! ! -- Return +! return +! end subroutine swf_gwf_save_simvals + +! !> @ brief Obs ID processer +! !! +! !! Process observations for this exchange +! !< +! subroutine swf_gwf_process_obsID(obsrv, dis, inunitobs, iout) +! ! -- modules +! use ConstantsModule, only: LINELENGTH +! use InputOutputModule, only: urword +! use ObserveModule, only: ObserveType +! use BaseDisModule, only: DisBaseType +! ! -- dummy +! type(ObserveType), intent(inout) :: obsrv +! class(DisBaseType), intent(in) :: dis +! integer(I4B), intent(in) :: inunitobs +! integer(I4B), intent(in) :: iout +! ! -- local +! integer(I4B) :: n, iexg, istat +! integer(I4B) :: icol, istart, istop +! real(DP) :: r +! character(len=LINELENGTH) :: strng +! ! +! strng = obsrv%IDstring +! icol = 1 +! ! -- get exchange index +! call urword(strng, icol, istart, istop, 1, n, r, iout, inunitobs) +! read (strng(istart:istop), '(i10)', iostat=istat) iexg +! if (istat == 0) then +! obsrv%intPak1 = iexg +! else +! ! Integer can't be read from strng; it's presumed to be an exchange +! ! boundary name (already converted to uppercase) +! obsrv%FeatureName = trim(adjustl(strng)) +! ! -- Observation may require summing rates from multiple exchange +! ! boundaries, so assign intPak1 as a value that indicates observation +! ! is for a named exchange boundary or group of exchange boundaries. +! obsrv%intPak1 = NAMEDBOUNDFLAG +! end if +! ! +! ! -- Return +! return +! end subroutine swf_gwf_process_obsID + +! !> @ brief Cast polymorphic object as exchange +! !! +! !! Cast polymorphic object as exchange +! !< +! function CastAsSwfGwfExchange(obj) result(res) +! implicit none +! ! -- dummy +! class(*), pointer, intent(inout) :: obj +! ! -- return +! class(SwfGwfExchangeType), pointer :: res +! ! +! res => null() +! if (.not. associated(obj)) return +! ! +! select type (obj) +! class is (SwfGwfExchangeType) +! res => obj +! end select +! ! +! ! -- Return +! return +! end function CastAsSwfGwfExchange + +! !> @ brief Get exchange from list +! !! +! !! Return an exchange from the list for specified index +! !< +! function GetSwfGwfExchangeFromList(list, idx) result(res) +! implicit none +! ! -- dummy +! type(ListType), intent(inout) :: list +! integer(I4B), intent(in) :: idx +! ! -- return +! class(SwfGwfExchangeType), pointer :: res +! ! -- local +! class(*), pointer :: obj +! ! +! obj => list%GetItem(idx) +! res => CastAsSwfGwfExchange(obj) +! ! +! ! -- Return +! return +! end function GetSwfGwfExchangeFromList + +! end module SwfGwfExchangeModule + diff --git a/src/Exchange/swfgwfidm.f90 b/src/Exchange/swfgwfidm.f90 new file mode 100644 index 00000000000..a1abd93f6e8 --- /dev/null +++ b/src/Exchange/swfgwfidm.f90 @@ -0,0 +1,259 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module ExgSwfgwfInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public exg_swfgwf_param_definitions + public exg_swfgwf_aggregate_definitions + public exg_swfgwf_block_definitions + public ExgSwfgwfParamFoundType + public exg_swfgwf_multi_package + + type ExgSwfgwfParamFoundType + logical :: ipr_input = .false. + logical :: ipr_flow = .false. + logical :: obs_filerecord = .false. + logical :: obs6 = .false. + logical :: filein = .false. + logical :: obs6_filename = .false. + logical :: nexg = .false. + logical :: cellidm1 = .false. + logical :: cellidm2 = .false. + logical :: cond = .false. + end type ExgSwfgwfParamFoundType + + logical :: exg_swfgwf_multi_package = .true. + + type(InputParamDefinitionType), parameter :: & + exgswfgwf_ipr_input = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'SWFGWF', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_INPUT', & ! tag name + 'IPR_INPUT', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exgswfgwf_ipr_flow = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'SWFGWF', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_FLOWS', & ! tag name + 'IPR_FLOW', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exgswfgwf_obs_filerecord = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'SWFGWF', & ! subcomponent + 'OPTIONS', & ! block + 'OBS_FILERECORD', & ! tag name + 'OBS_FILERECORD', & ! fortran variable + 'RECORD OBS6 FILEIN OBS6_FILENAME', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exgswfgwf_obs6 = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'SWFGWF', & ! subcomponent + 'OPTIONS', & ! block + 'OBS6', & ! tag name + 'OBS6', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exgswfgwf_filein = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'SWFGWF', & ! subcomponent + 'OPTIONS', & ! block + 'FILEIN', & ! tag name + 'FILEIN', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exgswfgwf_obs6_filename = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'SWFGWF', & ! subcomponent + 'OPTIONS', & ! block + 'OBS6_FILENAME', & ! tag name + 'OBS6_FILENAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exgswfgwf_nexg = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'SWFGWF', & ! subcomponent + 'DIMENSIONS', & ! block + 'NEXG', & ! tag name + 'NEXG', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exgswfgwf_cellidm1 = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'SWFGWF', & ! subcomponent + 'EXCHANGEDATA', & ! block + 'CELLIDM1', & ! tag name + 'CELLIDM1', & ! fortran variable + 'INTEGER1D', & ! type + 'NCELLDIM', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exgswfgwf_cellidm2 = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'SWFGWF', & ! subcomponent + 'EXCHANGEDATA', & ! block + 'CELLIDM2', & ! tag name + 'CELLIDM2', & ! fortran variable + 'INTEGER1D', & ! type + 'NCELLDIM', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exgswfgwf_cond = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'SWFGWF', & ! subcomponent + 'EXCHANGEDATA', & ! block + 'COND', & ! tag name + 'COND', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exg_swfgwf_param_definitions(*) = & + [ & + exgswfgwf_ipr_input, & + exgswfgwf_ipr_flow, & + exgswfgwf_obs_filerecord, & + exgswfgwf_obs6, & + exgswfgwf_filein, & + exgswfgwf_obs6_filename, & + exgswfgwf_nexg, & + exgswfgwf_cellidm1, & + exgswfgwf_cellidm2, & + exgswfgwf_cond & + ] + + type(InputParamDefinitionType), parameter :: & + exgswfgwf_exchangedata = InputParamDefinitionType & + ( & + 'EXG', & ! component + 'SWFGWF', & ! subcomponent + 'EXCHANGEDATA', & ! block + 'EXCHANGEDATA', & ! tag name + 'EXCHANGEDATA', & ! fortran variable + 'RECARRAY CELLIDM1 CELLIDM2 COND', & ! type + 'NEXG', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + exg_swfgwf_aggregate_definitions(*) = & + [ & + exgswfgwf_exchangedata & + ] + + type(InputBlockDefinitionType), parameter :: & + exg_swfgwf_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'EXCHANGEDATA', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module ExgSwfgwfInputModule diff --git a/src/Model/ModelUtilities/Connections.f90 b/src/Model/ModelUtilities/Connections.f90 index 2092b3a6e53..694c2e50625 100644 --- a/src/Model/ModelUtilities/Connections.f90 +++ b/src/Model/ModelUtilities/Connections.f90 @@ -48,6 +48,8 @@ module ConnectionsModule procedure :: disconnections procedure :: disvconnections procedure :: disuconnections + procedure :: dislconnections + procedure :: dislconnections_verts procedure :: iajausr procedure :: getjaindex procedure :: set_mask @@ -951,6 +953,211 @@ subroutine disuconnections(this, name_model, nodes, nodesuser, nrsize, & return end subroutine disuconnections + !> @brief procedure to fill the connections object for a disl package + !! + !! todo: No handling yet of cl1, cl2, hwva, etc. for disl as they are not needed + !! and only unreduced disl grids are allowed at the moment + !! + !< + subroutine dislconnections(this, name_model, toreach) + ! -- modules + use MemoryManagerModule, only: mem_deallocate, mem_setptr + use SparseModule, only: sparsematrix + ! -- dummy + class(ConnectionsType) :: this + character(len=*), intent(in) :: name_model + integer(I4B), dimension(:), intent(in) :: toreach + ! -- local + type(sparsematrix) :: sparse + integer(I4B) :: ierror + ! + ! -- Allocate scalars + call this%allocate_scalars(name_model) + ! + ! -- Set scalars + this%nodes = size(toreach) + this%ianglex = 0 + ! + ! -- create sparse matrix object using toreach + ! and fill ia and ja + call sparse_from_toreach(toreach, sparse) + this%nja = sparse%nnz + this%njas = (this%nja - this%nodes) / 2 + ! + ! -- Allocate index arrays of size nja and symmetric arrays + call this%allocate_arrays() + ! + ! -- Fill the IA and JA arrays from sparse, then destroy sparse + call sparse%sort() + call sparse%filliaja(this%ia, this%ja, ierror) + call sparse%destroy() + ! + ! -- fill the isym and jas arrays + call fillisym(this%nodes, this%nja, this%ia, this%ja, this%isym) + call filljas(this%nodes, this%nja, this%ia, this%ja, this%isym, this%jas) + ! + ! -- If reduced system, then need to build iausr and jausr, otherwise point + ! them to ia and ja. + ! TODO: not handled yet for reduced system + !this%iausr => this%ia + !this%jausr => this%ja + !call this%iajausr(nrsize, nodesuser, nodereduced, nodeuser) + ! -- iausr and jausr will be pointers + call mem_deallocate(this%iausr) + call mem_deallocate(this%jausr) + call mem_setptr(this%iausr, 'IA', this%memoryPath) + call mem_setptr(this%jausr, 'JA', this%memoryPath) + + return + end subroutine dislconnections + + !> @brief Fill the connections object for a disl package from vertices + !! + !! todo: No handling yet of cl1, cl2, hwva, etc. for disl as they are not needed + !! and only unreduced disl grids are allowed at the moment + !! + !< + subroutine dislconnections_verts(this, name_model, nodes, nodesuser, & + nrsize, nvert, & + vertices, iavert, javert, & + cellxyz, cellfdc, nodereduced, nodeuser) + ! -- modules + use ConstantsModule, only: DHALF, DZERO, DTHREE, DTWO, DPI + use SparseModule, only: sparsematrix + use GeomUtilModule, only: get_node + use DislGeom, only: DislGeomType + use MemoryManagerModule, only: mem_reallocate + ! -- dummy + class(ConnectionsType) :: this + character(len=*), intent(in) :: name_model + integer(I4B), intent(in) :: nodes + integer(I4B), intent(in) :: nodesuser + integer(I4B), intent(in) :: nrsize + integer(I4B), intent(in) :: nvert + real(DP), dimension(3, nvert), intent(in) :: vertices + integer(I4B), dimension(:), intent(in) :: iavert + integer(I4B), dimension(:), intent(in) :: javert + real(DP), dimension(3, nodesuser), intent(in) :: cellxyz + !integer(I4B), dimension(2, nodesuser), intent(in) :: centerverts + real(DP), dimension(nodesuser), intent(in) :: cellfdc + integer(I4B), dimension(:), intent(in) :: nodereduced + integer(I4B), dimension(:), intent(in) :: nodeuser + ! -- local + integer(I4B), dimension(:), allocatable :: itemp + integer(I4B), dimension(:), allocatable :: iavertcells + integer(I4B), dimension(:), allocatable :: javertcells + type(sparsematrix) :: sparse, vertcellspm + integer(I4B) :: n, m, i, j, ierror + ! type(DislGeomType) :: geol + ! + ! -- Allocate scalars + call this%allocate_scalars(name_model) + ! + ! -- Set scalars + this%nodes = nodes + this%ianglex = 1 + ! -- Initialize DislGeomType objects + ! call geol%init(nodesuser, nodes, cellfdc, iavert, javert, iavertcells, & + ! javertcells, vertices, cellxyz, centerverts, & + ! nodereduced, nodeuser) + + ! -- Create a sparse matrix array with a row for each vertex. The columns + ! in the sparse matrix contains the cells that include that vertex. + ! This array will be used to determine horizontal cell connectivity. + allocate (itemp(nvert)) + do i = 1, nvert + itemp(i) = 4 + end do + call vertcellspm%init(nvert, nodes, itemp) + deallocate (itemp) + do j = 1, nodes + do i = iavert(j), iavert(j + 1) - 1 + call vertcellspm%addconnection(javert(i), j, 1) + end do + end do + call vertcellspm%sort() + allocate (iavertcells(nvert + 1)) + allocate (javertcells(vertcellspm%nnz)) + call vertcellspm%filliaja(iavertcells, javertcells, ierror) + call vertcellspm%destroy() + ! + ! -- Call routine to build a sparse matrix of the connections + call vertexconnectl(this%nodes, nrsize, 6, nodes, sparse, & + iavertcells, javertcells, nodereduced) + n = sparse%nnz + m = this%nodes + this%nja = sparse%nnz + this%njas = (this%nja - this%nodes) / 2 + ! + ! -- cleanup memory + deallocate (iavertcells) + deallocate (javertcells) + ! + ! -- Allocate index arrays of size nja and symmetric arrays + call this%allocate_arrays() + ! + ! -- Fill the IA and JA arrays from sparse, then destroy sparse + call sparse%sort() + call sparse%filliaja(this%ia, this%ja, ierror) + call sparse%destroy() + ! + ! -- fill the isym and jas arrays + call fillisym(this%nodes, this%nja, this%ia, this%ja, this%isym) + call filljas(this%nodes, this%nja, this%ia, this%ja, this%isym, this%jas) + ! + ! -- Fill symmetric discretization arrays (ihc,cl1,cl2,hwva,anglex) + ! do n = 1, this%nodes + ! do ipos = this%ia(n) + 1, this%ia(n + 1) - 1 + ! m = this%ja(ipos) + ! if(m < n) cycle + ! call geol%cprops(n, m, this%hwva(this%jas(ipos)), & + ! this%cl1(this%jas(ipos)), this%cl2(this%jas(ipos))) + ! enddo + ! enddo + + ! + ! -- If reduced system, then need to build iausr and jausr, otherwise point + ! them to ia and ja. + call this%iajausr(nrsize, nodesuser, nodereduced, nodeuser) + ! + ! -- Return + return + end subroutine dislconnections_verts + + !> @brief Using toreach, fill the sparse object + !< + subroutine sparse_from_toreach(toreach, spm) + ! -- modules + use SparseModule, only: sparsematrix + ! -- dummy + integer(I4B), dimension(:), contiguous :: toreach + type(sparsematrix), intent(inout) :: spm + ! -- local + integer(I4B) :: nodes + integer(I4B) :: n + integer(I4B) :: j + + nodes = size(toreach) + call spm%init(nodes, nodes, 3) + ! + ! -- insert diagonal so it stays in front + do n = 1, size(toreach) + call spm%addconnection(n, n, 1) + end do + ! + ! -- add toreach connections for non-zero + ! reaches (0 indicates no downstream reach) + do n = 1, size(toreach) + j = toreach(n) + if (j > 0) then + call spm%addconnection(n, j, 1) + call spm%addconnection(j, n, 1) + end if + end do + + return + end subroutine sparse_from_toreach + !> @brief Fill iausr and jausr if reduced grid, otherwise point them to ia !! and ja. !< @@ -1218,6 +1425,69 @@ subroutine vertexconnect(nodes, nrsize, maxnnz, nlay, ncpl, sparse, & return end subroutine vertexconnect + !> @brief Routine to make cell connections from vertices + !< + subroutine vertexconnectl(nodes, nrsize, maxnnz, nodeuser, sparse, & + iavertcells, javertcells, & + nodereduced) + ! -- modules + use SparseModule, only: sparsematrix + use GeomUtilModule, only: get_node + ! -- dummy + integer(I4B), intent(in) :: nodes + integer(I4B), intent(in) :: nrsize + integer(I4B), intent(in) :: maxnnz + integer(I4B), intent(in) :: nodeuser + type(SparseMatrix), intent(inout) :: sparse + integer(I4B), dimension(:), intent(in) :: nodereduced + integer(I4B), dimension(:), intent(in) :: iavertcells + integer(I4B), dimension(:), intent(in) :: javertcells + ! -- local + integer(I4B), dimension(:), allocatable :: rowmaxnnz + integer(I4B) :: i, k, nr, mr, nvert + integer(I4B) :: con + ! + ! -- Allocate and fill the ia and ja arrays + allocate (rowmaxnnz(nodes)) + do i = 1, nodes + rowmaxnnz(i) = maxnnz + end do + call sparse%init(nodes, nodes, rowmaxnnz) + deallocate (rowmaxnnz) + do nr = 1, nodes + ! + ! -- Process diagonal + mr = nr + if (nrsize > 0) mr = nodereduced(mr) + if (mr <= 0) cycle + call sparse%addconnection(mr, mr, 1) + end do + ! + ! -- Go through each vertex and connect up all the cells that use + ! this vertex in their definition. + nvert = size(iavertcells) - 1 + + do i = 1, nvert + ! loop through cells that share the vertex + do k = iavertcells(i), iavertcells(i + 1) - 2 + ! loop again through connected cells that share vertex + do con = k + 1, iavertcells(i + 1) - 1 + nr = javertcells(k) + if (nrsize > 0) nr = nodereduced(nr) + if (nr <= 0) cycle + mr = javertcells(con) + if (nrsize > 0) mr = nodereduced(mr) + if (mr <= 0) cycle + call sparse%addconnection(nr, mr, 1) + call sparse%addconnection(mr, nr, 1) + end do + end do + end do + ! + ! -- return + return + end subroutine vertexconnectl + !> @brief routine to set a value in the mask array (which has the same shape !! as this%ja) !< diff --git a/src/Model/ModelUtilities/DislGeom.f90 b/src/Model/ModelUtilities/DislGeom.f90 new file mode 100644 index 00000000000..7b80b59b716 --- /dev/null +++ b/src/Model/ModelUtilities/DislGeom.f90 @@ -0,0 +1,417 @@ +module DislGeom + + use KindModule, only: DP, I4B + use SimModule, only: store_error, store_error_unit, ustop + implicit none + private + public :: DislGeomType + public :: calcdist, partialdist, line_unit_vector + + type DislGeomType + integer(I4B) :: nodesuser + logical :: reduced + integer(I4B) :: nodes ! number of reduced nodes; + real(DP), pointer, dimension(:) :: cellfdc => null() + integer(I4B), pointer, dimension(:) :: iavert => null() + integer(I4B), pointer, dimension(:) :: javert => null() + integer(I4B), pointer, dimension(:) :: iavertcells => null() + integer(I4B), pointer, dimension(:) :: javertcells => null() + real(DP), pointer, dimension(:, :) :: vertices => null() + real(DP), pointer, dimension(:, :) :: cellcenters => null() + integer(I4B), pointer, dimension(:, :) :: centerverts => null() + integer(I4B), pointer, dimension(:) :: nodereduced => null() + integer(I4B), pointer, dimension(:) :: nodeuser => null() + contains + procedure :: init + procedure :: cprops + procedure :: connection_vector + procedure :: shared_vertex + procedure :: disttocenter + procedure :: containscenter + procedure :: vertccdist + end type DislGeomType + +contains + + subroutine init(this, nodesuser, nodes, cellfdc, iavert, javert, & + iavertcells, javertcells, vertices, cellcenters, & + centerverts, nodereduced, nodeuser) + class(DislGeomType) :: this + integer(I4B), intent(in) :: nodesuser + integer(I4B), intent(in) :: nodes + real(DP), dimension(nodes), target :: cellfdc + integer(I4B), dimension(:), target :: iavert + integer(I4B), dimension(:), target :: javert + integer(I4B), dimension(:), target :: iavertcells + integer(I4B), dimension(:), target :: javertcells + real(DP), dimension(:, :), target :: vertices + real(DP), dimension(:, :), target :: cellcenters + integer(I4B), dimension(:, :), target :: centerverts + integer(I4B), dimension(:), target :: nodereduced + integer(I4B), dimension(:), target :: nodeuser + ! -- local + this%nodes = nodes + this%nodesuser = nodesuser + this%cellfdc => cellfdc + this%iavert => iavert + this%javert => javert + this%iavertcells => iavertcells + this%javertcells => javertcells + + this%vertices => vertices + this%cellcenters => cellcenters + this%centerverts => centerverts + this%nodereduced => nodereduced + this%nodeuser => nodeuser + if (nodes < nodesuser) then + this%reduced = .true. + else + this%reduced = .false. + end if + end subroutine init + + subroutine cprops(this, cell1, cell2, hwva, cl1, cl2) + ! -- module + use ConstantsModule, only: DZERO, DHALF, DONE + class(DislGeomType) :: this + integer(I4B), intent(in) :: cell1 + integer(I4B), intent(in) :: cell2 + real(DP), intent(out) :: hwva + real(DP), intent(out) :: cl1 + real(DP), intent(out) :: cl2 + ! -- local + integer(I4B) :: shared_vert + character(len=300) :: ermsg + character(len=*), parameter :: fmtvert = & + "('CELLS ', I0, ' AND ', i0, ' & + &DO NOT SHARE A VERTEX ')" + + ! find shared vertex + call this%shared_vertex(cell1, cell2, shared_vert) + if (shared_vert == 0) then + write (ermsg, fmtvert) cell1, cell2 + call store_error(ermsg) + call ustop() + end if + + ! cl1 - distance from center of pipe 1 to vertex + cl1 = this%disttocenter(cell1, shared_vert) + + ! cl2 - distance from center of pipe 2 to connection + cl2 = this%disttocenter(cell2, shared_vert) + + ! hwva - smallest cross sectional area? + + return + end subroutine cprops + + subroutine shared_vertex(this, cell1, cell2, shared_vert) + ! return the shared vertex of two cells + ! -- module + class(DislGeomType) :: this + integer(I4B), intent(in) :: cell1 + integer(I4B), intent(in) :: cell2 + integer(I4B), intent(out) :: shared_vert + ! -- local + integer(I4B) :: n, v, test1, test3, test4, test5 + ! + ! find shared vertex + shared_vert = 0 + ! loop through all vertices in cell1 + outer: do v = this%iavert(cell1), this%iavert(cell1 + 1) - 1 + ! loop through all cells that share vertex v + test1 = this%javert(v) + test3 = this%iavertcells(this%javert(v)) + test4 = this%iavertcells(this%javert(v) + 1) + do n = this%iavertcells(this%javert(v)), & + this%iavertcells(this%javert(v) + 1) - 1 + ! if cell2 has shared vertex v + test5 = this%javertcells(n) + if (cell2 == this%javertcells(n)) then + ! save shared vertex and exit + shared_vert = this%javert(v) + exit outer + end if + end do + end do outer + return + end subroutine shared_vertex + + subroutine connection_vector(this, cell1, cell2, nozee, xcomp, & + ycomp, zcomp, conlen) + ! return the x y and z components of a unit vector that points + ! from the center of this to the center of cell2, and the + ! straight-line connection length + ! -- module + use ConstantsModule, only: DZERO, DHALF, DONE + ! -- dummy + class(DislGeomType) :: this + integer(I4B), intent(in) :: cell1 + integer(I4B), intent(in) :: cell2 + logical, intent(in) :: nozee + real(DP), intent(out) :: xcomp + real(DP), intent(out) :: ycomp + real(DP), intent(out) :: zcomp + real(DP), intent(out) :: conlen + ! -- local + real(DP) :: x1, y1, z1, x2, y2, z2 + ! + x1 = this%cellcenters(1, cell1) + y1 = this%cellcenters(2, cell1) + x2 = this%cellcenters(1, cell2) + y2 = this%cellcenters(2, cell2) + if (nozee) then + z1 = DZERO + z2 = DZERO + else + z1 = this%cellcenters(3, cell1) + z2 = this%cellcenters(3, cell2) + end if + call line_unit_vector(x1, y1, z1, x2, y2, z2, xcomp, ycomp, zcomp, & + conlen) + return + end subroutine connection_vector + + function disttocenter(this, nodenum, vertnum) result(dist) +! ****************************************************************************** +! disttocenter -- Return distance from cell vertex to cell center +! ****************************************************************************** +! +! SPECIFICATIONS: +! ------------------------------------------------------------------------------ + class(DislGeomType) :: this + integer(I4B), intent(in) :: nodenum + integer(I4B), intent(in) :: vertnum + real(DP) :: dist + integer(I4B) :: j + logical :: cellcenter, vertex + character(len=300) :: ermsg + character(len=*), parameter :: novert = & + "('VERTEX ', I0, ' NOT IN NODE ', i0, '.')" + character(len=*), parameter :: cellcent = & + "('CELL CENTER NOT FOUND FOR & + &NODE ', I0, '.')" +! ------------------------------------------------------------------------------ + ! initialize + j = this%iavert(nodenum) + if (this%javert(j) == vertnum) then + vertex = .true. + if (this%containscenter(nodenum, this%javert(j), & + this%javert(j + 1)) .eqv. .true.) then + cellcenter = .true. + dist = this%vertccdist(nodenum, this%javert(j)) + return + else + cellcenter = .false. + dist = calcdist(this%vertices, this%javert(j), this%javert(j + 1)) + end if + else + vertex = .false. + if (this%containscenter(nodenum, this%javert(j), & + this%javert(j + 1)) .eqv. .true.) then + cellcenter = .true. + dist = this%vertccdist(nodenum, this%javert(j + 1)) + else + cellcenter = .false. + dist = 0.0 + end if + end if + + ! loop through cell's vertices + loop: do j = this%iavert(nodenum) + 1, this%iavert(nodenum + 1) - 1 + if (this%javert(j) == vertnum) then + vertex = .true. + if (cellcenter .eqv. .true.) then + exit loop + else + if (this%containscenter(nodenum, this%javert(j), & + this%javert(j + 1)) .eqv. .true.) then + cellcenter = .true. + ! add the distance from this vertex to the cell center + dist = dist + this%vertccdist(nodenum, this%javert(j)) + exit loop + else + ! add the distance between this vertex and the next + dist = dist + calcdist(this%vertices, this%javert(j), & + this%javert(j + 1)) + end if + end if + else if (this%containscenter(nodenum, this%javert(j), & + this%javert(j + 1)) .eqv. .true.) then + cellcenter = .true. + if (vertex .eqv. .true.) then + ! add the remaining distance from the current vertex to the cell center + dist = dist + this%vertccdist(nodenum, this%javert(j)) + exit loop + else + ! add the distance from the cell center to the next vertex + dist = dist + this%vertccdist(nodenum, this%javert(j + 1)) + end if + else if ((vertex .eqv. .true.) .or. (cellcenter .eqv. .true.)) then + ! add the distance between this vertex and the next + dist = dist + calcdist(this%vertices, this%javert(j), & + this%javert(j + 1)) + end if + end do loop + + if (vertex .eqv. .false.) then + write (ermsg, novert) vertnum, nodenum + call store_error(ermsg) + call ustop() + else if (cellcenter .eqv. .false.) then + write (ermsg, cellcent) nodenum + call store_error(ermsg) + call ustop() + end if + + return + end function disttocenter + + function containscenter(this, nodenum, vert1, vert2) result(l) +! ****************************************************************************** +! containscenter -- check to see if cell center is contained at or +! between vert1 and vert2 + +! ****************************************************************************** +! +! SPECIFICATIONS: +! ------------------------------------------------------------------------------ + class(DislGeomType) :: this + integer(I4B), intent(in) :: nodenum + integer(I4B), intent(in) :: vert1 + integer(I4B), intent(in) :: vert2 + logical :: l +! ------------------------------------------------------------------------------ + if (this%centerverts(2, nodenum) == 0) then + ! cell center is at a vertex + if ((this%centerverts(1, nodenum) == vert1) .or. & + (this%centerverts(1, nodenum) == vert2)) then + l = .true. + else + l = .false. + end if + else + ! cell center is between two vertices + if (((this%centerverts(1, nodenum) == vert1) .or. & + (this%centerverts(1, nodenum) == vert2)) .and. & + ((this%centerverts(2, nodenum) == vert1) .or. & + (this%centerverts(2, nodenum) == vert2))) then + l = .true. + else + l = .false. + end if + end if + + return + end function containscenter + + function vertccdist(this, node, vertex) result(dist) +! ****************************************************************************** +! vertccdist -- Return the distance between a cell vertex and that cell's center. +! ****************************************************************************** +! +! SPECIFICATIONS: +! ------------------------------------------------------------------------------ + ! -- dummy + class(DislGeomType), intent(in) :: this + integer(I4B), intent(in) :: node + integer(I4B), intent(in) :: vertex + real(DP) :: dist + real(DP) :: xdist, ydist, zdist + ! -- local +! ------------------------------------------------------------------------------ + ! + ! -- calc distance + xdist = abs(this%vertices(1, vertex) - this%cellcenters(1, node)) + ydist = abs(this%vertices(2, vertex) - this%cellcenters(2, node)) + zdist = abs(this%vertices(3, vertex) - this%cellcenters(3, node)) + dist = sqrt(xdist * xdist + ydist * ydist + zdist * zdist) + + ! -- return + return + end function vertccdist + + function calcdist(vertices, vert1, vert2) result(dist) +! ****************************************************************************** +! calcdist -- Return the distance between two vertices. +! ****************************************************************************** +! +! SPECIFICATIONS: +! ------------------------------------------------------------------------------ + ! -- dummy + real(DP), dimension(:, :), intent(in) :: vertices + integer(I4B), intent(in) :: vert1 + integer(I4B), intent(in) :: vert2 + real(DP) :: dist, xdist, ydist, zdist + ! -- local +! ------------------------------------------------------------------------------ + ! + ! -- calc distance + xdist = abs(vertices(1, vert1) - vertices(1, vert2)) + ydist = abs(vertices(2, vert1) - vertices(2, vert2)) + zdist = abs(vertices(3, vert1) - vertices(3, vert2)) + dist = sqrt(xdist * xdist + ydist * ydist + zdist * zdist) + + ! -- return + return + end function calcdist + + function partialdist(coord1, coord2, percent) result(dist) +! ****************************************************************************** +! partialdist -- Return the distance between two vertices. +! ****************************************************************************** +! +! SPECIFICATIONS: +! ------------------------------------------------------------------------------ + use ConstantsModule, only: DONE + ! -- dummy + real(DP), intent(in) :: coord1 + real(DP), intent(in) :: coord2 + real(DP) :: percent + real(DP) :: dist + ! -- local +! ------------------------------------------------------------------------------ + ! + ! -- calc distance + if (coord1 > coord2) then + dist = coord2 + (coord1 - coord2) * (DONE - percent) + else + dist = coord1 + (coord2 - coord1) * percent + end if + + ! -- return + return + end function partialdist + + subroutine line_unit_vector(x0, y0, z0, x1, y1, z1, & + xcomp, ycomp, zcomp, vmag) +! ****************************************************************************** +! line_unit_vector -- Calculate the vector components (xcomp, ycomp, and zcomp) +! for a line defined by two points, (x0, y0, z0), (x1, y1, z1). Also return +! the magnitude of the original vector, vmag. +! ****************************************************************************** +! +! SPECIFICATIONS: +! ------------------------------------------------------------------------------ + real(DP), intent(in) :: x0 + real(DP), intent(in) :: y0 + real(DP), intent(in) :: z0 + real(DP), intent(in) :: x1 + real(DP), intent(in) :: y1 + real(DP), intent(in) :: z1 + real(DP), intent(out) :: xcomp + real(DP), intent(out) :: ycomp + real(DP), intent(out) :: zcomp + real(DP) :: dx, dy, dz, vmag +! ------------------------------------------------------------------------------ + dx = x1 - x0 + dy = y1 - y0 + dz = z1 - z0 + vmag = sqrt(dx**2 + dy**2 + dz**2) + xcomp = dx / vmag + ycomp = dy / vmag + zcomp = dz / vmag + return + end subroutine line_unit_vector + +end module DislGeom diff --git a/src/Model/ModelUtilities/ModelPackageInput.f90 b/src/Model/ModelUtilities/ModelPackageInput.f90 index c60486c2569..ae0c6708eb5 100644 --- a/src/Model/ModelUtilities/ModelPackageInput.f90 +++ b/src/Model/ModelUtilities/ModelPackageInput.f90 @@ -16,6 +16,8 @@ module ModelPackageInputModule GWT_BASEPKG, GWT_MULTIPKG use GweModule, only: GWE_NBASEPKG, GWE_NMULTIPKG, & GWE_BASEPKG, GWE_MULTIPKG + use SwfModule, only: SWF_NBASEPKG, SWF_NMULTIPKG, & + SWF_BASEPKG, SWF_MULTIPKG implicit none @@ -57,6 +59,11 @@ subroutine supported_model_packages(mtype, pkgtypes, numpkgs) allocate (pkgtypes(numpkgs)) pkgtypes = [GWE_BASEPKG, GWE_MULTIPKG] ! + case ('SWF6') + numpkgs = SWF_NBASEPKG + SWF_NMULTIPKG + allocate (pkgtypes(numpkgs)) + pkgtypes = [SWF_BASEPKG, SWF_MULTIPKG] + ! case default end select ! diff --git a/src/Model/ModelUtilities/SwfCxsUtils.f90 b/src/Model/ModelUtilities/SwfCxsUtils.f90 new file mode 100644 index 00000000000..277a254fb6e --- /dev/null +++ b/src/Model/ModelUtilities/SwfCxsUtils.f90 @@ -0,0 +1,988 @@ +!> @brief This module contains stateless sfr subroutines and functions +!! +!! This module contains the functions to calculate the wetted perimeter +!! and cross-sectional area for a reach cross-section that are used in +!! the streamflow routing (SFR) package. It also contains subroutines to +!! calculate the wetted perimeter and cross-sectional area for each +!! line segment in the cross-section. This module does not depend on the +!! SFR package. +!! +!< +module SwfCxsUtilsModule + + use KindModule, only: DP, I4B + use ConstantsModule, only: DZERO, DHALF, DTWOTHIRDS, DONE, DTWO, & + DEM5, DP999, DTHREE + use SmoothingModule, only: sChSmooth + + implicit none + private + public :: calc_depth_from_q + public :: calc_qman + public :: get_saturated_topwidth + public :: get_wetted_topwidth + public :: get_wetted_perimeter + public :: get_cross_section_area + public :: get_hydraulic_radius + public :: get_hydraulic_radius_xf + public :: get_mannings_section + public :: calc_composite_roughness + +contains + + !> @brief Calculate the depth at the midpoint of a irregular cross-section + !< + function calc_depth_from_q(qrch, width, rough, slope, & + cxs_xf, cxs_h, cxs_rf, unitconv, & + icalcmeth) result(depth) + ! -- dummy variables + real(DP), intent(in) :: qrch !< streamflow + real(DP), intent(in) :: width !< reach width + real(DP), intent(in) :: rough !< mannings reach roughness coefficent + real(DP), intent(in) :: slope !< reach bottom slope + real(DP), dimension(:), intent(in) :: cxs_xf ! xfraction distances for this cross section + real(DP), dimension(:), intent(in) :: cxs_h ! heights for this cross section + real(DP), dimension(:), intent(in) :: cxs_rf ! mannings fractions for this cross section + real(DP), intent(in) :: unitconv !< conversion unit numerator in mannings equation + integer(I4B), intent(in) :: icalcmeth !< manning calculation method + + ! -- return + real(DP) :: depth !< stream depth at midpoint of reach + + if (icalcmeth == 1) then + ! slower but robust bisection method + depth = calc_depth_from_q_bisect(qrch, width, rough, slope, & + cxs_xf, cxs_h, cxs_rf, unitconv, & + icalcmeth) + else + ! faster but less forgiving newton-raphson method + depth = calc_depth_from_q_nr(qrch, width, rough, slope, & + cxs_xf, cxs_h, cxs_rf, unitconv, & + icalcmeth) + end if + ! + ! -- return + return + end function calc_depth_from_q + + !> @brief Calculate the depth at the midpoint of a irregular cross-section + !! + !! Method to calculate the depth at the midpoint of a reach with a + !! irregular cross-section using bisection. + !! + !< + function calc_depth_from_q_bisect(qrch, width, rough, slope, & + cxs_xf, cxs_h, cxs_rf, unitconv, & + icalcmeth) result(depth) + ! -- dummy variables + !class(SfrType) :: this !< SfrType object + !integer(I4B), intent(in) :: n !< reach number + real(DP), intent(in) :: qrch !< streamflow + real(DP), intent(in) :: width !< reach width + real(DP), intent(in) :: rough !< mannings reach roughness coefficent + real(DP), intent(in) :: slope !< reach bottom slope + real(DP), dimension(:), intent(in) :: cxs_xf ! xfraction distances for this cross section + real(DP), dimension(:), intent(in) :: cxs_h ! heights for this cross section + real(DP), dimension(:), intent(in) :: cxs_rf ! mannings fractions for this cross section + real(DP), intent(in) :: unitconv !< conversion unit numerator in mannings equation + integer(I4B), intent(in) :: icalcmeth !< manning calculation method + + ! -- return + real(DP) :: depth !< stream depth at midpoint of reach + + ! -- local variables + integer(I4B) :: maxiter = 100 + integer(I4B) :: iter + real(DP) :: dmaxchg = DEM5 + real(DP) :: a + real(DP) :: b + real(DP) :: c + real(DP) :: f_a + real(DP) :: f_c + + ! constrain the bisection range + a = DZERO + b = maxval(cxs_h) * DTWO + ! + ! -- bisection iteration + bisectiter: do iter = 1, maxiter + + c = (a + b) / DTWO + f_c = calc_qman(c, width, rough, slope, & + cxs_xf, cxs_h, cxs_rf, unitconv, icalcmeth) - qrch + if (f_c == DZERO .or. (b - a) / DTWO < dmaxchg) then + depth = c + return + end if + + f_a = calc_qman(a, width, rough, slope, & + cxs_xf, cxs_h, cxs_rf, unitconv, icalcmeth) - qrch + if (sign(DONE, f_c) == sign(DONE, f_a)) then + a = c + else + b = c + end if + + end do bisectiter + ! + ! TODO: raise an error + print *, "bisection routine failed" + ! + ! -- return + return + end function calc_depth_from_q_bisect + + !> @brief Calculate the depth at the midpoint of a irregular cross-section + !! + !! Method to calculate the depth at the midpoint of a reach with a + !! irregular cross-section using Newton-Raphson. + !! + !< + function calc_depth_from_q_nr(qrch, width, rough, slope, & + cxs_xf, cxs_h, cxs_rf, unitconv, & + icalcmeth) result(depth) + ! -- dummy variables + !class(SfrType) :: this !< SfrType object + !integer(I4B), intent(in) :: n !< reach number + real(DP), intent(in) :: qrch !< streamflow + real(DP), intent(in) :: width !< reach width + real(DP), intent(in) :: rough !< mannings reach roughness coefficent + real(DP), intent(in) :: slope !< reach bottom slope + real(DP), dimension(:), intent(in) :: cxs_xf ! xfraction distances for this cross section + real(DP), dimension(:), intent(in) :: cxs_h ! heights for this cross section + real(DP), dimension(:), intent(in) :: cxs_rf ! mannings fractions for this cross section + real(DP), intent(in) :: unitconv !< conversion unit numerator in mannings equation + integer(I4B), intent(in) :: icalcmeth !< manning calculation method + + ! -- return + real(DP) :: depth !< stream depth at midpoint of reach + + ! -- local variables + integer(I4B) :: maxiter = 100 + integer(I4B) :: iter + real(DP) :: dmaxchg = DEM5 + real(DP) :: deps = DEM5 * DP999 + real(DP) :: perturbation + real(DP) :: q0 + real(DP) :: q1 + real(DP) :: dq + real(DP) :: derv + real(DP) :: d + real(DP) :: dd + real(DP) :: residual + ! + ! -- initialize variables + perturbation = deps * DTWO + d = DZERO + q0 = DZERO + residual = q0 - qrch + ! + ! -- Newton-Raphson iteration + nriter: do iter = 1, maxiter + !call this%sfr_calc_qman(n, d + perturbation, q1) + q1 = calc_qman(d + perturbation, width, rough, slope, & + cxs_xf, cxs_h, cxs_rf, unitconv, icalcmeth) + dq = (q1 - q0) + if (dq /= DZERO) then + derv = perturbation / (q1 - q0) + else + derv = DZERO + end if + dd = derv * residual + d = d - dd + !call this%sfr_calc_qman(n, d, q0) + q0 = calc_qman(d, width, rough, slope, & + cxs_xf, cxs_h, cxs_rf, unitconv, icalcmeth) + residual = q0 - qrch + ! + ! -- check for convergence + if (abs(dd) < dmaxchg) then + exit nriter + end if + + end do nriter + depth = d + ! + ! -- return + return + end function calc_depth_from_q_nr + + !> @brief Calculate streamflow using Manning's equation + !! + !! Method to calculate the streamflow using Manning's equation for a + !! single reach defined by a cross section. + !! + !< + function calc_qman(depth, width, rough, slope, & + cxs_xf, cxs_h, cxs_rf, unitconv, icalcmeth) result(qman) + + ! -- dummy variables + real(DP), intent(in) :: depth !< reach depth + real(DP), intent(in) :: width !< reach width + real(DP), intent(in) :: rough !< mannings reach roughness coefficent + real(DP), intent(in) :: slope !< reach bottom slope + real(DP), dimension(:), intent(in) :: cxs_xf ! xfraction distances for this cross section + real(DP), dimension(:), intent(in) :: cxs_h ! heights for this cross section + real(DP), dimension(:), intent(in) :: cxs_rf ! mannings fractions for this cross section + real(DP), intent(in) :: unitconv !< conversion unit numerator in mannings equation + integer(I4B), intent(in) :: icalcmeth ! 0 is composite linear, 1 is by section, 2 is composite nonlinear + + ! return value + real(DP) :: qman !< calculated mannings flow + + ! -- local variables + integer(I4B) :: linmeth + + select case (icalcmeth) + case (0) ! composite linear + linmeth = 0 + qman = calc_qman_composite(depth, width, rough, slope, & + cxs_xf, cxs_h, cxs_rf, unitconv, & + linmeth) + case (1) ! by section + qman = calc_qman_by_section(depth, width, rough, slope, & + cxs_xf, cxs_h, cxs_rf, unitconv) + case (2) ! composite nonlinear + linmeth = 1 + qman = calc_qman_composite(depth, width, rough, slope, & + cxs_xf, cxs_h, cxs_rf, unitconv, & + linmeth) + end select + ! + ! -- return + return + end function calc_qman + + function calc_qman_composite(depth, width, rough, slope, & + cxs_xf, cxs_h, cxs_rf, unitconv, & + linmeth) result(qman) + + ! -- dummy variables + real(DP), intent(in) :: depth !< reach depth + real(DP), intent(in) :: width !< reach width + real(DP), intent(in) :: rough !< mannings reach roughness coefficent + real(DP), intent(in) :: slope !< reach bottom slope + real(DP), dimension(:), intent(in) :: cxs_xf ! xfraction distances for this cross section + real(DP), dimension(:), intent(in) :: cxs_h ! heights for this cross section + real(DP), dimension(:), intent(in) :: cxs_rf ! mannings fractions for this cross section + real(DP), intent(in) :: unitconv !< conversion unit numerator in mannings equation + integer(I4B), intent(in) :: linmeth !< method for composite (0) linear (1) nonlinear + + ! return value + real(DP) :: qman !< calculated mannings flow + + ! -- local variables + integer(I4B) :: npts + real(DP) :: sat + real(DP) :: derv + real(DP) :: aw + real(DP) :: wp + real(DP) :: rh + real(DP) :: rough_composite + ! + ! -- initialize variables + qman = DZERO + ! + ! -- calculate Manning's discharge for non-zero depths + if (depth > DZERO) then + + npts = size(cxs_xf) + rough_composite = calc_composite_roughness(npts, depth, width, & + rough, slope, & + cxs_xf, cxs_h, cxs_rf, & + linmeth) + wp = get_wetted_perimeter(npts, cxs_xf, cxs_h, width, depth) + aw = get_cross_section_area(npts, cxs_xf, cxs_h, width, depth) + if (wp > DZERO) then + rh = aw / wp + else + rh = DZERO + end if + qman = unitconv * aw * (rh**DTWOTHIRDS) * sqrt(slope) / rough + call sChSmooth(depth, sat, derv) + qman = sat * qman + end if + ! + ! -- return + return + end function calc_qman_composite + + function calc_composite_roughness(npts, depth, width, rough, slope, & + cxs_xf, cxs_h, cxs_rf, & + linmeth) result(rc) + ! -- dummy variables + integer(I4B), intent(in) :: npts + real(DP), intent(in) :: depth !< reach depth + real(DP), intent(in) :: width !< reach width + real(DP), intent(in) :: rough !< mannings reach roughness coefficent + real(DP), intent(in) :: slope !< reach bottom slope + real(DP), dimension(:), intent(in) :: cxs_xf ! xfraction distances for this cross section + real(DP), dimension(:), intent(in) :: cxs_h ! heights for this cross section + real(DP), dimension(:), intent(in) :: cxs_rf ! mannings fractions for this cross section + integer(I4B), intent(in) :: linmeth !< method for composite calculation; linear 0 or nonlinear 1 + + ! return value + real(DP) :: rc !< composite roughness + + ! -- local variables + integer(I4B) :: n + real(DP) :: wp + real(DP) :: exp1 + real(DP) :: exp2 + real(DP), dimension(npts) :: stations + real(DP), dimension(npts - 1) :: perimeters + ! + ! stations + do n = 1, npts + stations(n) = cxs_xf(n) * width + end do + ! + ! -- select method + select case (linmeth) + case (0) ! linear + exp1 = DONE + exp2 = DONE + case (1) ! nonlinear + exp1 = 1.5D0 + exp2 = DTWO / DTHREE + end select + ! + ! -- initialize variables + rc = rough + ! + ! -- calculate composite roughness + if (depth > DZERO) then + + if (npts > 1) then + call get_wetted_perimeters(npts, stations, cxs_h, depth, perimeters) + wp = DZERO + rc = DZERO + do n = 1, npts - 1 + rc = rc + (rough * cxs_rf(n))**exp1 * perimeters(n) + wp = wp + perimeters(n) + end do + if (wp > DZERO) then + rc = (rc / wp)**exp2 + else + rc = rough + end if + end if + + end if + ! + ! -- return + return + end function calc_composite_roughness + + function calc_qman_by_section(depth, width, rough, slope, & + cxs_xf, cxs_h, cxs_rf, unitconv) result(qman) + + ! -- dummy variables + real(DP), intent(in) :: depth !< reach depth + real(DP), intent(in) :: width !< reach width + real(DP), intent(in) :: rough !< mannings reach roughness coefficent + real(DP), intent(in) :: slope !< reach bottom slope + real(DP), dimension(:), intent(in) :: cxs_xf ! xfraction distances for this cross section + real(DP), dimension(:), intent(in) :: cxs_h ! heights for this cross section + real(DP), dimension(:), intent(in) :: cxs_rf ! mannings fractions for this cross section + real(DP), intent(in) :: unitconv !< conversion unit numerator in mannings equation + + ! return value + real(DP) :: qman !< calculated mannings flow + + ! -- local variables + integer(I4B) :: npts + real(DP) :: sat + real(DP) :: derv + real(DP) :: aw + real(DP) :: wp + real(DP) :: rh + ! + ! -- initialize variables + qman = DZERO + ! + ! -- calculate Manning's discharge for non-zero depths + if (depth > DZERO) then + npts = size(cxs_xf) + ! + ! -- set constant terms for Manning's equation + call sChSmooth(depth, sat, derv) + ! + ! -- calculate the mannings coefficient that is a + ! function of depth + if (npts > 1) then + ! + ! -- call function that calculates flow for an + ! n-point cross section + qman = get_mannings_section(npts, & + cxs_xf, & + cxs_h, & + cxs_rf, & + rough, & + unitconv, & + width, & + slope, & + depth) + else + + ! hydraulically wide channel (only 1 point is defined) + aw = width * depth + wp = width + if (wp > DZERO) then + rh = aw / wp + else + rh = DZERO + end if + qman = unitconv * aw * (rh**DTWOTHIRDS) * sqrt(slope) / rough + end if + ! + ! -- calculate stream flow + qman = sat * qman + end if + ! + ! -- return + return + end function calc_qman_by_section + + !> @brief Calculate the saturated top width for a reach + !! + !! Function to calculate the maximum top width for a reach using the + !! cross-section station data. + !! + !! @return w saturated top width + !< + function get_saturated_topwidth(npts, stations) result(w) + ! -- dummy variables + integer(I4B), intent(in) :: npts !< number of station-height data for a reach + real(DP), dimension(npts), intent(in) :: stations !< cross-section station distances (x-distance) + ! -- local variables + real(DP) :: w + ! + ! -- calculate the saturated top width + if (npts > 1) then + w = stations(npts) - stations(1) + else + w = stations(1) + end if + ! + ! -- return + return + end function get_saturated_topwidth + + !> @brief Calculate the wetted top width for a reach + !! + !! Function to calculate the wetted top width for a reach using the + !! cross-section station-height data given a passed depth. + !! + !! @return w wetted top width + !< + function get_wetted_topwidth(npts, xfraction, heights, width, d) result(w) + ! -- dummy variables + integer(I4B), intent(in) :: npts !< number of station-height data for a reach + real(DP), dimension(npts), intent(in) :: xfraction !< cross-section station distances (x-distance) + real(DP), dimension(npts), intent(in) :: heights !< cross-section height data + real(DP), intent(in) :: width !< reach width + real(DP), intent(in) :: d !< depth to evaluate cross-section + ! -- local variables + integer(I4B) :: n + real(DP) :: w + real(DP), dimension(npts) :: stations + real(DP), dimension(npts - 1) :: widths + ! + ! -- calculate station from xfractions and width + do n = 1, npts + stations(n) = xfraction(n) * width + end do + ! + ! -- intitialize the wetted perimeter for the reach + w = DZERO + ! + ! -- calculate the wetted top width for each line segment + call get_wetted_topwidths(npts, stations, heights, d, widths) + ! + ! -- calculate the wetted top widths + do n = 1, npts - 1 + w = w + widths(n) + end do + ! + ! -- return + return + end function get_wetted_topwidth + + !> @brief Calculate the wetted perimeter for a reach + !! + !! Function to calculate the wetted perimeter for a reach using the + !! cross-section station-height data given a passed depth. + !! + !! @return p wetted perimeter + !< + function get_wetted_perimeter(npts, xfraction, heights, width, d) result(p) + ! -- dummy variables + integer(I4B), intent(in) :: npts !< number of station-height data for a reach + real(DP), dimension(npts), intent(in) :: xfraction !< cross-section x fractions + real(DP), dimension(npts), intent(in) :: heights !< cross-section height data + real(DP), intent(in) :: width !< cross section width + real(DP), intent(in) :: d !< depth to evaluate cross-section + ! -- local variables + integer(I4B) :: n + real(DP) :: p + real(DP), dimension(npts) :: stations + real(DP), dimension(npts - 1) :: perimeters + ! + ! -- initialize stations + do n = 1, npts + stations(n) = xfraction(n) * width + end do + ! + ! -- intitialize the wetted perimeter for the reach + p = DZERO + ! + ! -- calculate the wetted perimeter for each line segment + call get_wetted_perimeters(npts, stations, heights, d, perimeters) + ! + ! -- calculate the wetted perimenter + do n = 1, npts - 1 + p = p + perimeters(n) + end do + ! + ! -- return + return + end function get_wetted_perimeter + + !> @brief Calculate the cross-sectional area for a reach + !! + !! Function to calculate the cross-sectional area for a reach using + !! the cross-section station-height data given a passed depth. + !! + !! @return a cross-sectional area + !< + function get_cross_section_area(npts, xfraction, heights, width, d) result(a) + ! -- dummy variables + integer(I4B), intent(in) :: npts !< number of station-height data for a reach + real(DP), dimension(npts), intent(in) :: xfraction !< cross-section station distances (x-distance) + real(DP), dimension(npts), intent(in) :: heights !< cross-section height data + real(DP), intent(in) :: width !< reach width + real(DP), intent(in) :: d !< depth to evaluate cross-section + ! -- local variables + integer(I4B) :: n + real(DP) :: a + real(DP), dimension(npts) :: stations + real(DP), dimension(npts - 1) :: areas + ! + ! -- calculate station from xfractions and width + do n = 1, npts + stations(n) = xfraction(n) * width + end do + ! + ! -- intitialize the area + a = DZERO + ! + ! -- calculate the cross-sectional area for each line segment + call get_cross_section_areas(npts, stations, heights, d, areas) + ! + ! -- calculate the cross-sectional area + do n = 1, npts - 1 + a = a + areas(n) + end do + ! + ! -- return + return + end function get_cross_section_area + + !> @brief Calculate the hydraulic radius for a reach + !! + !! Function to calculate the hydraulic radius for a reach using + !! the cross-section station-height data given a passed depth. + !! + !! @return r hydraulic radius + !< + function get_hydraulic_radius(npts, stations, heights, d) result(r) + ! -- dummy variables + integer(I4B), intent(in) :: npts !< number of station-height data for a reach + real(DP), dimension(npts), intent(in) :: stations !< cross-section station distances (x-distance) + real(DP), dimension(npts), intent(in) :: heights !< cross-section height data + real(DP), intent(in) :: d !< depth to evaluate cross-section + ! -- local variables + integer(I4B) :: n + real(DP) :: r + real(DP) :: p + real(DP) :: a + real(DP), dimension(npts - 1) :: areas + real(DP), dimension(npts - 1) :: perimeters + ! + ! -- intitialize the hydraulic radius, perimeter, and area + r = DZERO + p = DZERO + a = DZERO + ! + ! -- calculate the wetted perimeter for each line segment + call get_wetted_perimeters(npts, stations, heights, d, perimeters) + ! + ! -- calculate the wetted perimenter + do n = 1, npts - 1 + p = p + perimeters(n) + end do + ! + ! -- calculate the hydraulic radius only if the perimeter is non-zero + if (p > DZERO) then + ! + ! -- calculate the cross-sectional area for each line segment + call get_cross_section_areas(npts, stations, heights, d, areas) + ! + ! -- calculate the cross-sectional area + do n = 1, npts - 1 + a = a + areas(n) + end do + ! + ! -- calculate the hydraulic radius + r = a / p + end if + ! + ! -- return + return + end function get_hydraulic_radius + + !> @brief Calculate the hydraulic radius for a reach + !! + !! Function to calculate the hydraulic radius for a reach using + !! the cross-section xfraction-height data given a passed depth. + !! This is different from get_hydraulic_radius as it requires + !! xfraction and width instead of station. + !! + !! @return r hydraulic radius + !< + function get_hydraulic_radius_xf(npts, xfraction, heights, width, d) result(r) + ! -- dummy variables + integer(I4B), intent(in) :: npts !< number of station-height data for a reach + real(DP), dimension(npts), intent(in) :: xfraction !< cross-section station distances (x-distance) + real(DP), dimension(npts), intent(in) :: heights !< cross-section height data + real(DP), intent(in) :: width !< reach width + real(DP), intent(in) :: d !< depth to evaluate cross-section + ! -- local variables + integer(I4B) :: n + real(DP) :: r + real(DP), dimension(npts) :: stations + ! + ! -- calculate station from xfractions and width + do n = 1, npts + stations(n) = xfraction(n) * width + end do + ! + ! -- calculate hydraulic radius + r = get_hydraulic_radius(npts, stations, heights, d) + ! + ! -- return + return + end function get_hydraulic_radius_xf + + !> @brief Calculate the manning's discharge for a reach + !! + !! Function to calculate the mannings discharge for a reach + !! by calculating the discharge for each section, which can + !! have a unique Manning's coefficient given a passed depth. + !! + !! @return q reach discharge + !< + function get_mannings_section(npts, xfraction, heights, roughfracs, & + roughness, conv_fact, width, slope, d) result(q) + ! -- dummy variables + integer(I4B), intent(in) :: npts !< number of station-height data for a reach + real(DP), dimension(npts), intent(in) :: xfraction !< cross-section station distances (x-distance) + real(DP), dimension(npts), intent(in) :: heights !< cross-section height data + real(DP), dimension(npts), intent(in) :: roughfracs !< cross-section Mannings roughness fraction data + real(DP), intent(in) :: roughness !< base reach roughness + real(DP), intent(in) :: conv_fact !< unit conversion factor + real(DP), intent(in) :: width !< reach width + real(DP), intent(in) :: slope !< reach slope + real(DP), intent(in) :: d !< depth to evaluate cross-section + ! -- local variables + integer(I4B) :: n + real(DP) :: q + real(DP) :: rh + real(DP) :: r + real(DP) :: p + real(DP) :: a + real(DP), dimension(npts) :: stations + real(DP), dimension(npts - 1) :: areas + real(DP), dimension(npts - 1) :: perimeters + ! + ! -- intitialize the hydraulic radius, perimeter, and area + q = DZERO + rh = DZERO + r = DZERO + p = DZERO + a = DZERO + ! + ! -- calculate station from xfractions and width + do n = 1, npts + stations(n) = xfraction(n) * width + end do + ! + ! -- calculate the wetted perimeter for each line segment + call get_wetted_perimeters(npts, stations, heights, d, perimeters) + ! + ! -- calculate the wetted perimenter + do n = 1, npts - 1 + p = p + perimeters(n) + end do + ! + ! -- calculate the hydraulic radius only if the perimeter is non-zero + if (p > DZERO) then + ! + ! -- calculate the cross-sectional area for each line segment + call get_cross_section_areas(npts, stations, heights, d, areas) + ! + ! -- calculate the cross-sectional area + do n = 1, npts - 1 + p = perimeters(n) + r = roughness * roughfracs(n) + if (p * r > DZERO) then + a = areas(n) + rh = a / p + q = q + conv_fact * a * rh**DTWOTHIRDS * sqrt(slope) / r + end if + end do + end if + ! + ! -- return + return + end function get_mannings_section + + ! -- private functions and subroutines + + !> @brief Calculate the wetted perimeters for each line segment + !! + !! Subroutine to calculate the wetted perimeter for each line segment + !! that defines the reach using the cross-section station-height + !! data given a passed depth. + !! + !< + subroutine get_wetted_perimeters(npts, stations, heights, d, p) + ! -- dummy variables + integer(I4B), intent(in) :: npts !< number of station-height data for a reach + real(DP), dimension(npts), intent(in) :: stations !< cross-section station distances (x-distance) + real(DP), dimension(npts), intent(in) :: heights !< cross-section height data + real(DP), intent(in) :: d !< depth to evaluate cross-section + real(DP), dimension(npts - 1), intent(inout) :: p !< wetted perimeter for each line segment + ! -- local variables + integer(I4B) :: n + real(DP) :: x0 + real(DP) :: x1 + real(DP) :: d0 + real(DP) :: d1 + real(DP) :: dmax + real(DP) :: dmin + real(DP) :: xlen + real(DP) :: dlen + ! + ! -- iterate over the station-height data + do n = 1, npts - 1 + ! + ! -- initialize the wetted perimeter + p(n) = DZERO + ! + ! -- initialize station-height data for segment + x0 = stations(n) + x1 = stations(n + 1) + d0 = heights(n) + d1 = heights(n + 1) + ! + ! -- get the start and end station position of the wetted segment + call get_wetted_station(x0, x1, d0, d1, dmax, dmin, d) + ! + ! -- calculate the wetted perimeter for the segment + xlen = x1 - x0 + dlen = DZERO + if (xlen > DZERO) then + if (d > dmax) then + dlen = dmax - dmin + else + dlen = d - dmin + end if + else + if (d > dmin) then + dlen = min(d, dmax) - dmin + else + dlen = DZERO + end if + end if + p(n) = sqrt(xlen**DTWO + dlen**DTWO) + end do + ! + ! -- return + return + end subroutine get_wetted_perimeters + + !> @brief Calculate the cross-sectional areas for each line segment + !! + !! Subroutine to calculate the cross-sectional area for each line segment + !! that defines the reach using the cross-section station-height + !! data given a passed depth. + !! + !< + subroutine get_cross_section_areas(npts, stations, heights, d, a) + ! -- dummy variables + integer(I4B), intent(in) :: npts !< number of station-height data for a reach + real(DP), dimension(npts), intent(in) :: stations !< cross-section station distances (x-distance) + real(DP), dimension(npts), intent(in) :: heights !< cross-section height data + real(DP), intent(in) :: d !< depth to evaluate cross-section + real(DP), dimension(npts - 1), intent(inout) :: a !< cross-sectional area for each line segment + ! -- local variables + integer(I4B) :: n + real(DP) :: x0 + real(DP) :: x1 + real(DP) :: d0 + real(DP) :: d1 + real(DP) :: dmax + real(DP) :: dmin + real(DP) :: xlen + ! + ! -- iterate over the station-height data + do n = 1, npts - 1 + ! + ! -- initialize the cross-sectional area + a(n) = DZERO + ! + ! -- initialize station-height data for segment + x0 = stations(n) + x1 = stations(n + 1) + d0 = heights(n) + d1 = heights(n + 1) + ! + ! -- get the start and end station position of the wetted segment + call get_wetted_station(x0, x1, d0, d1, dmax, dmin, d) + ! + ! -- calculate the cross-sectional area for the segment + xlen = x1 - x0 + if (xlen > DZERO) then + ! + ! -- add the area above dmax + if (d > dmax) then + a(n) = xlen * (d - dmax) + end if + ! + ! -- add the area below dmax + if (dmax /= dmin .and. d > dmin) then + if (d < dmax) then + a(n) = a(n) + DHALF * (d - dmin) * xlen + else + a(n) = a(n) + DHALF * (dmax - dmin) * xlen + end if + end if + end if + end do + ! + ! -- return + return + end subroutine get_cross_section_areas + + !> @brief Calculate the wetted top widths for each line segment + !! + !! Subroutine to calculate the wetted top width for each line segment + !! that defines the reach using the cross-section station-height + !! data given a passed depth. + !! + !< + subroutine get_wetted_topwidths(npts, stations, heights, d, w) + ! -- dummy variables + integer(I4B), intent(in) :: npts !< number of station-height data for a reach + real(DP), dimension(npts), intent(in) :: stations !< cross-section station distances (x-distance) + real(DP), dimension(npts), intent(in) :: heights !< cross-section height data + real(DP), intent(in) :: d !< depth to evaluate cross-section + real(DP), dimension(npts - 1), intent(inout) :: w !< wetted top widths for each line segment + ! -- local variables + integer(I4B) :: n + real(DP) :: x0 + real(DP) :: x1 + real(DP) :: d0 + real(DP) :: d1 + real(DP) :: dmax + real(DP) :: dmin + ! + ! -- iterate over the station-height data + do n = 1, npts - 1 + ! + ! -- initialize station-height data for segment + x0 = stations(n) + x1 = stations(n + 1) + d0 = heights(n) + d1 = heights(n + 1) + ! + ! -- get the start and end station position of the wetted segment + call get_wetted_station(x0, x1, d0, d1, dmax, dmin, d) + ! + ! -- calculate the wetted top width for the segment + w(n) = x1 - x0 + end do + ! + ! -- return + return + end subroutine get_wetted_topwidths + + !> @brief Calculate the station values for the wetted portion of the cross-section + !! + !! Subroutine to calculate the station values that define the extent of the + !! wetted portion of the cross section for a line segment. The left (x0) and + !! right (x1) station positions are altered if the passed depth is less + !! than the maximum line segment depth. If the line segment is dry the left + !! and right station are equal. Otherwise the wetted station values are equal + !! to the full line segment or smaller if the passed depth is less than + !! the maximum line segment depth. + !! + !< + pure subroutine get_wetted_station(x0, x1, d0, d1, dmax, dmin, d) + ! -- dummy variables + real(DP), intent(inout) :: x0 !< left station position + real(DP), intent(inout) :: x1 !< right station position + real(DP), intent(in) :: d0 !< depth at the left station + real(DP), intent(in) :: d1 !< depth at the right station + real(DP), intent(inout) :: dmax !< maximum depth + real(DP), intent(inout) :: dmin !< minimum depth + real(DP), intent(in) :: d !< depth to evaluate cross-section + ! -- local variables + real(DP) :: xlen + real(DP) :: dlen + real(DP) :: slope + real(DP) :: dx + real(DP) :: xt + real(DP) :: xt0 + real(DP) :: xt1 + ! + ! -- calculate the minimum and maximum depth + dmin = min(d0, d1) + dmax = max(d0, d1) + ! + ! -- if d is less than or equal to the minimum value the + ! station length (xlen) is zero + if (d <= dmin) then + x1 = x0 + ! -- if d is between dmin and dmax station length is less + ! than d1 - d0 + else if (d < dmax) then + xlen = x1 - x0 + dlen = d1 - d0 + if (abs(dlen) > DZERO) then + slope = xlen / dlen + else + slope = DZERO + end if + if (d0 > d1) then + dx = (d - d1) * slope + xt = x1 + dx + xt0 = xt + xt1 = x1 + else + dx = (d - d0) * slope + xt = x0 + dx + xt0 = x0 + xt1 = xt + end if + x0 = xt0 + x1 = xt1 + end if + ! + ! -- return + return + end subroutine get_wetted_station + +end module SwfCxsUtilsModule diff --git a/src/Model/SurfaceWaterFlow/swf1.f90 b/src/Model/SurfaceWaterFlow/swf1.f90 new file mode 100644 index 00000000000..5a172e73944 --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1.f90 @@ -0,0 +1,1380 @@ + +!> @brief Stream Network Flow (SWF) Module +!! +!! This module contains the SWF Model +!! +!! Status and remaining tasks +!! ONGOING -- Implement SWF infrastructure +!! DONE -- Implement Explicit Model Solution (EMS6) to handle explicit models +!! DONE -- Implement DISL Package +!! DONE -- Implement FLW Package to handle lateral and point inflows +!! DONE -- Transfer results into the flowja vector +!! DONE -- Implement strategy for storing outflow terms and getting them into budget +!! DONE -- Implement SWF and FLW advance routines to handle transient problems +!! DONE -- Implement storage terms and getting them into budget +!! DONE -- Observations +!! DONE -- Initial conditions? +!! DONE -- Rework the Iterative Model Solution (IMS6) to handle both implicit and explicit models +!! DONE -- Implement output control +!! DONE -- Add outflow as a dependent variable that can be written and printed (qoutflow) +!! DONE -- Revaluate explicit model solution and consider implementing ExplicitModelType? +!! DONE -- Add test of the binary outflow +!! DONE -- Rename Stream Network Flow (SWF) to Surface Water Flow (SWF) Model +!! DONE -- Rename segment to reach +!! Look into mass conservative MC method (https://hess.copernicus.org/articles/11/1645/2007/hess-11-1645-2007.pdf) +!! Implement IDOMAIN support +!! Use dag_module to calculate iseg_order (if iseg_order not specified by user) +!! We may need subcells and subtiming to improve accuracy +!! Add support for nonlinear Muskingum Cunge +!! Deal with the timestep and subtiming issues +!! Flopy support for DISL and DISL binary grid file +!! Flopy support for .output() method for SWF +!! Mover support? +!! SWF-SWF Exchange +!! SWF-SWF Exchange in parallel +!! Create QGW package for leakage into or out of groundwater +!! +!< +module SwfModule + + use KindModule, only: DP, I4B + use ConstantsModule, only: DZERO, LENFTYPE, DNODATA, LINELENGTH, & + LENMEMPATH, LENPACKAGETYPE + use InputOutputModule, only: ParseLine, upcase + use SimModule, only: count_errors, store_error, store_error_filename + use SimVariablesModule, only: errmsg + use MemoryManagerModule, only: mem_allocate + use VersionModule, only: write_listfile_header + use BaseModelModule, only: BaseModelType + use NumericalModelModule, only: NumericalModelType + !use ExplicitModelModule, only: ExplicitModelType + use BndModule, only: BndType, AddBndToList, GetBndFromList + use SwfIcModule, only: SwfIcType + use SwfDfwModule, only: SwfDfwType + use SwfCxsModule, only: SwfCxsType + use SwfStoModule, only: SwfStoType + use SwfObsModule, only: SwfObsType, swf_obs_cr + use SwfOcModule, only: SwfOcType + use BudgetModule, only: BudgetType + use MatrixBaseModule + + implicit none + + private + public :: swf_cr + public :: SwfModelType + public :: SWF_NBASEPKG, SWF_NMULTIPKG + public :: SWF_BASEPKG, SWF_MULTIPKG + + type, extends(NumericalModelType) :: SwfModelType + ! character(len=LINELENGTH), pointer :: filename => null() !< input file name + type(SwfIcType), pointer :: ic => null() ! initial conditions package + type(SwfDfwType), pointer :: dfw => null() !< diffusive wave package + type(SwfCxsType), pointer :: cxs => null() !< cross section package + type(SwfStoType), pointer :: sto => null() !< storage package + type(SwfObsType), pointer :: obs => null() ! observation package + type(SwfOcType), pointer :: oc => null() !< output control package + type(BudgetType), pointer :: budget => null() !< budget object + integer(I4B), pointer :: inic => null() ! unit number IC + integer(I4B), pointer :: indfw => null() !< unit number DFW + integer(I4B), pointer :: incxs => null() !< unit number CXS + integer(I4B), pointer :: insto => null() !< unit number STO + integer(I4B), pointer :: inobs => null() ! unit number OBS + integer(I4B), pointer :: inoc => null() !< unit number OC + integer(I4B), pointer :: iss => null() ! steady state flag + integer(I4B), pointer :: inewtonur => null() ! newton under relaxation flag + + ! integer(I4B), dimension(:), pointer, contiguous :: ia => null() !< csr row pointer + ! integer(I4B), dimension(:), pointer, contiguous :: ja => null() !< csr columns + ! real(DP), dimension(:), pointer, contiguous :: x => null() !< dependent variable (todo: not used) + ! real(DP), dimension(:), pointer, contiguous :: rhs => null() !< right-hand side vector + ! real(DP), dimension(:), pointer, contiguous :: xold => null() !< dependent variable for previous timestep + ! real(DP), dimension(:), pointer, contiguous :: flowja => null() !< intercell flows + ! integer(I4B), dimension(:), pointer, contiguous :: ibound => null() !< ibound array + contains + procedure :: allocate_scalars + procedure :: allocate_arrays + procedure :: model_df => swf_df + procedure :: model_ac => swf_ac + procedure :: model_mc => swf_mc + procedure :: model_ar => swf_ar + procedure :: model_rp => swf_rp + procedure :: model_ad => swf_ad + procedure :: model_nur => swf_nur + procedure :: model_cf => swf_cf + procedure :: model_fc => swf_fc + procedure :: model_cq => swf_cq + procedure :: model_bd => swf_bd + procedure :: model_ot => swf_ot + procedure :: model_da => swf_da + procedure :: model_bdentry => swf_bdentry + procedure :: swf_ot_obs + procedure :: swf_ot_flow + procedure :: swf_ot_dv + procedure :: swf_ot_bdsummary + procedure :: package_create + procedure :: ftype_check + procedure :: get_iasym => swf_get_iasym + procedure, private :: create_packages + procedure, private :: create_bndpkgs + procedure, private :: create_lstfile + procedure, private :: log_namfile_options + procedure, private :: steady_period_check + end type SwfModelType + + !> @brief SWF base package array descriptors + !! + !! SWF model base package types. Only listed packages are candidates + !! for input and these will be loaded in the order specified. + !< + integer(I4B), parameter :: SWF_NBASEPKG = 50 + character(len=LENPACKAGETYPE), dimension(SWF_NBASEPKG) :: SWF_BASEPKG + data SWF_BASEPKG/'DISL6', 'DFW6 ', ' ', ' ', 'CXS6 ', & ! 5 + &'OC6 ', 'IC6 ', 'OBS6 ', 'STO6 ', ' ', & ! 10 + &40*' '/ ! 50 + + !> @brief SWF multi package array descriptors + !! + !! SWF model multi-instance package types. Only listed packages are + !! candidates for input and these will be loaded in the order specified. + !< + integer(I4B), parameter :: SWF_NMULTIPKG = 50 + character(len=LENPACKAGETYPE), dimension(SWF_NMULTIPKG) :: SWF_MULTIPKG + data SWF_MULTIPKG/'FLW6 ', 'CHD6 ', 'ZDG6 ', ' ', ' ', & ! 5 + &45*' '/ ! 50 + + ! -- size of supported model package arrays + integer(I4B), parameter :: NIUNIT_SWF = SWF_NBASEPKG + SWF_NMULTIPKG + +contains + + !> @brief Create a new stream network flow model object + !! + !! (1) creates model object and add to modellist + !! (2) assign values + !! + !< + subroutine swf_cr(filename, id, modelname) + ! -- modules + use ListsModule, only: basemodellist + use BaseModelModule, only: AddBaseModelToList + use ConstantsModule, only: LINELENGTH + use MemoryHelperModule, only: create_mem_path + use MemoryManagerExtModule, only: mem_set_value + use SimVariablesModule, only: idm_context + use SwfNamInputModule, only: SwfNamParamFoundType + use BudgetModule, only: budget_cr + ! -- dummy + character(len=*), intent(in) :: filename + integer(I4B), intent(in) :: id + character(len=*), intent(in) :: modelname + ! -- local + type(SwfModelType), pointer :: this + class(BaseModelType), pointer :: model + character(len=LENMEMPATH) :: input_mempath + character(len=LINELENGTH) :: lst_fname + type(SwfNamParamFoundType) :: found + ! -- format + ! + ! -- Allocate a new model (this) and add it to basemodellist + allocate (this) + ! + ! -- Set memory path before allocation in memory manager can be done + this%memoryPath = create_mem_path(modelname) + ! + call this%allocate_scalars(modelname) + model => this + call AddBaseModelToList(basemodellist, model) + ! + ! -- Assign values + this%filename = filename + this%name = modelname + this%macronym = 'SWF' + this%id = id + ! + ! -- set input model namfile memory path + input_mempath = create_mem_path(modelname, 'NAM', idm_context) + ! + ! -- copy option params from input context + call mem_set_value(lst_fname, 'LIST', input_mempath, found%list) + call mem_set_value(this%inewton, 'NEWTON', input_mempath, found%newton) + call mem_set_value(this%inewtonur, 'UNDER_RELAXATION', input_mempath, & + found%under_relaxation) + call mem_set_value(this%iprpak, 'PRINT_INPUT', input_mempath, & + found%print_input) + call mem_set_value(this%iprflow, 'PRINT_FLOWS', input_mempath, & + found%print_flows) + call mem_set_value(this%ipakcb, 'SAVE_FLOWS', input_mempath, found%save_flows) + ! + ! -- create the list file + call this%create_lstfile(lst_fname, filename, found%list) + ! + ! -- activate save_flows if found + if (found%save_flows) then + this%ipakcb = -1 + end if + ! + ! -- log set options + if (this%iout > 0) then + call this%log_namfile_options(found) + end if + ! + ! -- Create utility objects + call budget_cr(this%budget, this%name) + ! + ! -- create model packages + call this%create_packages() + ! + ! -- return + return + end subroutine swf_cr + + !> @brief Allocate memory for scalar members + subroutine allocate_scalars(this, modelname) + ! -- modules + ! -- dummy + class(SwfModelType) :: this + character(len=*), intent(in) :: modelname + ! + ! -- allocate members from parent class + !call this%ExplicitModelType%allocate_scalars(modelname) + call this%NumericalModelType%allocate_scalars(modelname) + ! + ! -- allocate members that are part of model class + !allocate (this%filename) + call mem_allocate(this%inic, 'INIC', this%memoryPath) + call mem_allocate(this%indfw, 'INDFW', this%memoryPath) + call mem_allocate(this%incxs, 'INCXS', this%memoryPath) + call mem_allocate(this%insto, 'INSTO', this%memoryPath) + call mem_allocate(this%inobs, 'INOBS', this%memoryPath) + call mem_allocate(this%inoc, 'INOC', this%memoryPath) + call mem_allocate(this%iss, 'ISS', this%memoryPath) + call mem_allocate(this%inewtonur, 'INEWTONUR', this%memoryPath) + ! + !this%filename = '' + this%inic = 0 + this%indfw = 0 + this%incxs = 0 + this%insto = 0 + this%inobs = 0 + this%inoc = 0 + this%iss = 1 !default is steady-state (i.e., no STO package) + this%inewtonur = 0 + ! + ! -- return + return + end subroutine allocate_scalars + + !> @brief Allocate memory for scalar members + subroutine allocate_arrays(this) + ! -- modules + ! -- dummy + class(SwfModelType) :: this + integer(I4B) :: i + ! + ! -- allocate members from parent class + call this%NumericalModelType%allocate_arrays() + ! + ! -- This is not a numerical solution, so x, rhs, and active + ! are allocated by a numerical solution, so need to do it + ! here. + if (this%indfw == 0) then + ! -- explicit model, so these must be manually allocated + call mem_allocate(this%x, this%dis%nodes, 'X', this%memoryPath) + call mem_allocate(this%rhs, this%dis%nodes, 'RHS', this%memoryPath) + call mem_allocate(this%ibound, this%dis%nodes, 'IBOUND', this%memoryPath) + do i = 1, this%dis%nodes + this%x(i) = DZERO + this%rhs(i) = DZERO + this%ibound(i) = 1 + end do + end if + ! + ! -- return + return + end subroutine allocate_arrays + + !> @brief Define packages of the model + !< + subroutine swf_df(this) + ! -- modules + ! -- dummy + class(SwfModelType) :: this + ! -- local + integer(I4B) :: ip + class(BndType), pointer :: packobj + ! + ! + call this%oc%oc_df() + call this%budget%budget_df(NIUNIT_SWF, 'VOLUME', 'L**3') + ! + ! -- set model sizes + this%neq = this%dis%nodes + this%nja = this%dis%nja + this%ia => this%dis%con%ia + this%ja => this%dis%con%ja + ! + ! -- Allocate model arrays, now that neq and nja are known + call this%allocate_arrays() + ! + ! -- Define packages and assign iout for time series managers + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_df(this%dis%nodes, this%dis) + end do + ! + ! -- Store information needed for observations + call this%obs%obs_df(this%iout, this%name, 'SWF', this%dis) + ! + ! -- return + return + end subroutine swf_df + + !> @brief Add the internal connections of this model to the sparse matrix + subroutine swf_ac(this, sparse) + ! -- modules + use SparseModule, only: sparsematrix + ! -- dummy + class(SwfModelType) :: this + type(sparsematrix), intent(inout) :: sparse + ! -- local + class(BndType), pointer :: packobj + integer(I4B) :: ip + ! + ! -- Add the primary grid connections of this model to sparse + call this%dis%dis_ac(this%moffset, sparse) + ! + ! -- Add any additional connections + !if (this%indfw > 0) call this%dfw%dfw_ac(this%moffset, sparse) + ! + ! -- Add any package connections + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ac(this%moffset, sparse) + end do + ! + ! -- return + return + end subroutine swf_ac + + !> @brief Map the positions of this models connections in the + !! numerical solution coefficient matrix. + !< + subroutine swf_mc(this, matrix_sln) + ! -- dummy + class(SwfModelType) :: this + class(MatrixBaseType), pointer :: matrix_sln + ! -- local + class(BndType), pointer :: packobj + integer(I4B) :: ip + ! + ! -- Find the position of each connection in the global ia, ja structure + ! and store them in idxglo. + call this%dis%dis_mc(this%moffset, this%idxglo, matrix_sln) + ! + ! -- Map any additional connections + ! if (this%indfw > 0) call this%dfw%dfw_mc(this%moffset, matrix_sln) + ! + ! -- Map any package connections + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_mc(this%moffset, matrix_sln) + end do + ! + ! -- return + return + end subroutine swf_mc + + !> @brief SWF Allocate and Read + !< + subroutine swf_ar(this) + ! -- dummy + class(SwfModelType) :: this + ! -- locals + integer(I4B), dimension(:), allocatable :: itemp + integer(I4B) :: ip + class(BndType), pointer :: packobj + ! + ! -- Allocate and read modules attached to model + if (this%inic > 0) call this%ic%ic_ar(this%x) + + ! -- need temporary integer variable to pass to dis_ar + ! -- TODO: this should be generalized so dis_ar doesn't have to have it + allocate (itemp(this%dis%nodes)) + ! + ! -- Call dis_ar to write binary grid file + call this%dis%dis_ar(itemp) + if (this%indfw > 0) call this%dfw%dfw_ar(this%ibound) + if (this%insto > 0) call this%sto%sto_ar(this%dis, this%ibound) + if (this%inobs > 0) call this%obs%swf_obs_ar(this%ic, this%x, this%flowja) + deallocate (itemp) + ! + ! -- set up output control + if (this%indfw > 0) then + call this%oc%oc_ar('STAGE', this%x, this%dis, DNODATA) + end if + call this%budget%set_ibudcsv(this%oc%ibudcsv) + ! + ! -- Package input files now open, so allocate and read + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%set_pointers(this%dis%nodes, this%ibound, this%x, & + this%xold, this%flowja) + ! -- Read and allocate package + call packobj%bnd_ar() + end do + ! + ! -- return + return + end subroutine swf_ar + + !> @brief Stream Network Flow Model Read and Prepare + !! + !! (1) calls package read and prepare routines + !! + !< + subroutine swf_rp(this) + ! -- modules + use TdisModule, only: readnewdata + ! -- dummy + class(SwfModelType) :: this + ! -- local + class(BndType), pointer :: packobj + integer(I4B) :: ip + ! + ! -- Check with TDIS on whether or not it is time to RP + if (.not. readnewdata) return + ! + ! -- Read and prepare + if (this%indfw > 0) call this%dfw%dfw_rp() + if (this%inoc > 0) call this%oc%oc_rp() + if (this%insto > 0) call this%sto%sto_rp() + !if (this%inmvr > 0) call this%mvr%mvr_rp() + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_rp() + call packobj%bnd_rp_obs() + end do + ! + ! -- Check for steady state period + call this%steady_period_check() + ! + ! -- Return + return + end subroutine swf_rp + + !> @brief Stream Network Flow Model Time Step Advance + !! + !! (1) calls package advance subroutines + !! + !< + subroutine swf_ad(this) + ! -- modules + use SimVariablesModule, only: isimcheck, iFailedStepRetry + ! -- dummy + class(SwfModelType) :: this + class(BndType), pointer :: packobj + ! -- local + integer(I4B) :: irestore + integer(I4B) :: ip, n + ! + ! -- Reset state variable + irestore = 0 + if (iFailedStepRetry > 0) irestore = 1 + if (irestore == 0) then + ! + ! -- copy x into xold + do n = 1, this%dis%nodes + this%xold(n) = this%x(n) + end do + else + ! + ! -- copy xold into x if this time step is a redo + do n = 1, this%dis%nodes + this%x(n) = this%xold(n) + end do + end if + ! + ! -- Advance + if (this%indfw > 0) call this%dfw%dfw_ad(irestore) + if (this%insto > 0) call this%sto%sto_ad() + !if (this%inmvr > 0) call this%mvr%mvr_ad() + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ad() + if (isimcheck > 0) then + call packobj%bnd_ck() + end if + end do + ! + ! -- Push simulated values to preceding time/subtime step + call this%obs%obs_ad() + ! + ! -- return + return + end subroutine swf_ad + + !> @brief Calculate coefficients + subroutine swf_cf(this, kiter) + ! -- dummy + class(SwfModelType) :: this + integer(I4B), intent(in) :: kiter + ! -- local + class(BndType), pointer :: packobj + integer(I4B) :: ip + ! + ! -- Call package cf routines + !if (this%indfw > 0) call this%dfw%dfw_cf(kiter, this%dis%nodes, this%x) + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_cf() + end do + ! + ! -- return + return + end subroutine swf_cf + + !> @brief Fill coefficients + subroutine swf_fc(this, kiter, matrix_sln, inwtflag) + ! -- dummy + class(SwfModelType) :: this + integer(I4B), intent(in) :: kiter + class(MatrixBaseType), pointer :: matrix_sln + integer(I4B), intent(in) :: inwtflag + ! -- local + class(BndType), pointer :: packobj + integer(I4B) :: ip + integer(I4B) :: inwt, inwtpak + ! + ! -- newton flags + inwt = inwtflag + ! if (inwtflag == 1) inwt = this%dfw%inewton + ! inwtsto = inwtflag + ! if (this%insto > 0) then + ! if (inwtflag == 1) inwtsto = this%sto%inewton + ! end if + ! inwtcsub = inwtflag + ! if (this%incsub > 0) then + ! if (inwtflag == 1) inwtcsub = this%csub%inewton + ! end if + ! + ! -- Fill standard conductance terms + if (this%indfw > 0) call this%dfw%dfw_fc(kiter, matrix_sln, this%idxglo, & + this%rhs, this%x, this%xold) + ! -- storage + if (this%insto > 0) then + call this%sto%sto_fc(kiter, this%xold, this%x, matrix_sln, & + this%idxglo, this%rhs) + end if + ! if (this%inmvr > 0) call this%mvr%mvr_fc() + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_fc(this%rhs, this%ia, this%idxglo, matrix_sln) + end do + ! + !--Fill newton terms + if (this%indfw > 0) then + if (inwt /= 0) then + call this%dfw%dfw_fn(kiter, matrix_sln, this%idxglo, this%rhs, this%x) + end if + end if + ! + ! -- Fill newton terms for storage + ! if (this%insto > 0) then + ! if (inwtsto /= 0) then + ! call this%sto%sto_fn(kiter, this%xold, this%x, matrix_sln, & + ! this%idxglo, this%rhs) + ! end if + ! end if + ! + ! -- Fill Newton terms for packages + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + inwtpak = inwtflag + if (inwtflag == 1) inwtpak = packobj%inewton + if (inwtpak /= 0) then + call packobj%bnd_fn(this%rhs, this%ia, this%idxglo, matrix_sln) + end if + end do + ! + ! -- return + return + end subroutine swf_fc + + !> @brief under-relaxation + !! + !! (1) Under-relaxation of Surface water Flow Model stages for current + !! outer iteration using the reach bottoms + !! + !< + subroutine swf_nur(this, neqmod, x, xtemp, dx, inewtonur, dxmax, locmax) + ! modules + use ConstantsModule, only: DONE, DP9 + ! -- dummy + class(SwfModelType) :: this + integer(I4B), intent(in) :: neqmod + real(DP), dimension(neqmod), intent(inout) :: x + real(DP), dimension(neqmod), intent(in) :: xtemp + real(DP), dimension(neqmod), intent(inout) :: dx + integer(I4B), intent(inout) :: inewtonur + real(DP), intent(inout) :: dxmax + integer(I4B), intent(inout) :: locmax + ! -- local + integer(I4B) :: i0 + integer(I4B) :: i1 + class(BndType), pointer :: packobj + integer(I4B) :: ip + ! + ! -- apply Newton-Raphson under-relaxation if model is using + ! the Newton-Raphson formulation and this Newton-Raphson + ! under-relaxation is turned on. + if (this%inewton /= 0 .and. this%inewtonur /= 0) then + if (this%indfw > 0) then + call this%dfw%dfw_nur(neqmod, x, xtemp, dx, inewtonur, dxmax, locmax) + end if + ! + ! -- Call package nur routines + i0 = this%dis%nodes + 1 + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + if (packobj%npakeq > 0) then + i1 = i0 + packobj%npakeq - 1 + call packobj%bnd_nur(packobj%npakeq, x(i0:i1), xtemp(i0:i1), & + dx(i0:i1), inewtonur, dxmax, locmax) + i0 = i1 + 1 + end if + end do + end if + ! + ! -- return + return + end subroutine swf_nur + + !> @brief Calculate flow + !< + subroutine swf_cq(this, icnvg, isuppress_output) + ! -- modules + ! -- dummy + class(SwfModelType) :: this + integer(I4B), intent(in) :: icnvg + integer(I4B), intent(in) :: isuppress_output + ! -- local + integer(I4B) :: i + integer(I4B) :: ip + class(BndType), pointer :: packobj + ! + ! -- Construct the flowja array. Flowja is calculated each time, even if + ! output is suppressed. (flowja is positive into a cell.) The diagonal + ! position of the flowja array will contain the flow residual after + ! these routines are called, so each package is responsible for adding + ! its flow to this diagonal position. + do i = 1, this%dis%nja + this%flowja(i) = DZERO + end do + if (this%indfw > 0) call this%dfw%dfw_cq(this%x, this%xold, this%flowja) + if (this%insto > 0) call this%sto%sto_cq(this%flowja, this%x, this%xold) + ! + ! -- Go through packages and call cq routines. cf() routines are called + ! first to regenerate non-linear terms to be consistent with the final + ! head solution. + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_cf() + call packobj%bnd_cq(this%x, this%flowja) + end do + ! + ! -- Return + return + end subroutine swf_cq + + !> @brief Model Budget + !< + subroutine swf_bd(this, icnvg, isuppress_output) + ! -- modules + use SparseModule, only: csr_diagsum + ! -- dummy + class(SwfModelType) :: this + integer(I4B), intent(in) :: icnvg + integer(I4B), intent(in) :: isuppress_output + ! -- local + integer(I4B) :: ip + class(BndType), pointer :: packobj + ! + ! -- Finalize calculation of flowja by adding face flows to the diagonal. + ! This results in the flow residual being stored in the diagonal + ! position for each cell. + call csr_diagsum(this%dis%con%ia, this%flowja) + ! + ! -- Budget routines (start by resetting). Sole purpose of this section + ! is to add in and outs to model budget. All ins and out for a model + ! should be added here to this%budget. In a subsequent exchange call, + ! exchange flows might also be added. + call this%budget%reset() + if (this%insto > 0) call this%sto%sto_bd(isuppress_output, this%budget) + if (this%indfw > 0) call this%dfw%dfw_bd(isuppress_output, this%budget) + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_bd(this%budget) + end do + ! + ! -- Return + return + end subroutine swf_bd + + !> @brief Stream Network Flow Model Output + subroutine swf_ot(this) + ! -- modules + use TdisModule, only: tdis_ot, endofperiod + ! -- dummy + class(SwfModelType) :: this + ! -- local + integer(I4B) :: idvsave + integer(I4B) :: idvprint + integer(I4B) :: icbcfl + integer(I4B) :: icbcun + integer(I4B) :: ibudfl + integer(I4B) :: ipflag + integer(I4B) :: icnvg = 1 + ! -- formats + ! + ! -- Set write and print flags + idvsave = 0 + idvprint = 0 + icbcfl = 0 + ibudfl = 0 + if (this%oc%oc_save('QOUTFLOW')) idvsave = 1 + if (this%oc%oc_print('QOUTFLOW')) idvprint = 1 + if (this%oc%oc_save('BUDGET')) icbcfl = 1 + if (this%oc%oc_print('BUDGET')) ibudfl = 1 + icbcun = this%oc%oc_save_unit('BUDGET') + ! + ! -- Override ibudfl and idvprint flags for nonconvergence + ! and end of period + ibudfl = this%oc%set_print_flag('BUDGET', icnvg, endofperiod) + idvprint = this%oc%set_print_flag('QOUTFLOW', icnvg, endofperiod) + ! + ! Calculate and save observations + call this%swf_ot_obs() + ! ! + ! Save and print flows + call this%swf_ot_flow(icbcfl, ibudfl, icbcun) + ! + ! Save and print dependent variables + call this%swf_ot_dv(idvsave, idvprint, ipflag) + ! + ! Print budget summaries + call this%swf_ot_bdsummary(ibudfl, ipflag) + ! + ! -- Timing Output; if any dependendent variables or budgets + ! are printed, then ipflag is set to 1. + if (ipflag == 1) call tdis_ot(this%iout) + ! + ! -- Return + return + end subroutine swf_ot + + subroutine swf_ot_obs(this) + class(SwfModelType) :: this + class(BndType), pointer :: packobj + integer(I4B) :: ip + + ! -- Calculate and save SWF observations + call this%obs%obs_bd() + call this%obs%obs_ot() + + ! -- Calculate and save dfw observations + if (this%indfw > 0) then + call this%dfw%dfw_bd_obs() + call this%dfw%obs%obs_ot() + end if + + ! -- Calculate and save package observations + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_bd_obs() + call packobj%bnd_ot_obs() + end do + + end subroutine swf_ot_obs + + subroutine swf_ot_flow(this, icbcfl, ibudfl, icbcun) + class(SwfModelType) :: this + integer(I4B), intent(in) :: icbcfl + integer(I4B), intent(in) :: ibudfl + integer(I4B), intent(in) :: icbcun + class(BndType), pointer :: packobj + integer(I4B) :: ip + + ! -- Save SWF flows + if (this%insto > 0) then + call this%sto%sto_save_model_flows(icbcfl, icbcun) + end if + if (this%indfw > 0) then + call this%dfw%dfw_save_model_flows(this%flowja, icbcfl, icbcun) + end if + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ot_model_flows(icbcfl=icbcfl, ibudfl=0, icbcun=icbcun) + end do + + ! -- Save advanced package flows + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ot_package_flows(icbcfl=icbcfl, ibudfl=0) + end do + ! if (this%inmvr > 0) then + ! call this%mvr%mvr_ot_saveflow(icbcfl, ibudfl) + ! end if + + ! -- Print SWF flows + if (this%indfw > 0) then + call this%dfw%dfw_print_model_flows(ibudfl, this%flowja) + end if + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ot_model_flows(icbcfl=icbcfl, ibudfl=ibudfl, icbcun=0) + end do + + ! -- Print advanced package flows + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ot_package_flows(icbcfl=0, ibudfl=ibudfl) + end do + ! if (this%inmvr > 0) then + ! call this%mvr%mvr_ot_printflow(icbcfl, ibudfl) + ! end if + + end subroutine swf_ot_flow + + subroutine swf_ot_dv(this, idvsave, idvprint, ipflag) + class(SwfModelType) :: this + integer(I4B), intent(in) :: idvsave + integer(I4B), intent(in) :: idvprint + integer(I4B), intent(inout) :: ipflag + class(BndType), pointer :: packobj + integer(I4B) :: ip + ! + ! -- Print advanced package dependent variables + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ot_dv(idvsave, idvprint) + end do + ! + ! -- save stage and print stage (if implemented) + call this%oc%oc_ot(ipflag) + ! + ! -- Return + return + end subroutine swf_ot_dv + + subroutine swf_ot_bdsummary(this, ibudfl, ipflag) + use TdisModule, only: kstp, kper, totim + class(SwfModelType) :: this + integer(I4B), intent(in) :: ibudfl + integer(I4B), intent(inout) :: ipflag + class(BndType), pointer :: packobj + integer(I4B) :: ip + + ! + ! -- Package budget summary + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ot_bdsummary(kstp, kper, this%iout, ibudfl) + end do + + ! ! -- mover budget summary + ! if (this%inmvr > 0) then + ! call this%mvr%mvr_ot_bdsummary(ibudfl) + ! end if + + ! -- model budget summary + if (ibudfl /= 0) then + ipflag = 1 + call this%budget%budget_ot(kstp, kper, this%iout) + end if + + ! -- Write to budget csv every time step + call this%budget%writecsv(totim) + + end subroutine swf_ot_bdsummary + + !> @brief Deallocate + subroutine swf_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + use MemoryManagerExtModule, only: memorylist_remove + use SimVariablesModule, only: idm_context + ! -- dummy + class(SwfModelType) :: this + ! -- local + integer(I4B) :: ip + class(BndType), pointer :: packobj + ! + ! -- Deallocate idm memory + call memorylist_remove(this%name, 'NAM', idm_context) + call memorylist_remove(component=this%name, context=idm_context) + ! + ! -- Internal flow packages deallocate + call this%dis%dis_da() + if (this%insto > 0) call this%sto%sto_da() + if (this%inic > 0) call this%ic%ic_da() + if (this%indfw > 0) call this%dfw%dfw_da() + call this%cxs%cxs_da() + call this%obs%obs_da() + call this%oc%oc_da() + call this%budget%budget_da() + ! + ! -- Internal package objects + deallocate (this%dis) + deallocate (this%budget) + deallocate (this%obs) + deallocate (this%oc) + ! + ! -- Boundary packages + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_da() + deallocate (packobj) + end do + ! + ! -- Scalars + !deallocate (this%filename) + call mem_deallocate(this%inic) + call mem_deallocate(this%indfw) + call mem_deallocate(this%incxs) + call mem_deallocate(this%insto) + call mem_deallocate(this%inobs) + call mem_deallocate(this%inoc) + call mem_deallocate(this%iss) + call mem_deallocate(this%inewtonur) + ! + ! -- Arrays + ! call mem_deallocate(this%x) + ! call mem_deallocate(this%xold) + ! call mem_deallocate(this%rhs) + ! call mem_deallocate(this%ibound) + ! call mem_deallocate(this%flowja) + ! + ! -- NumericalModelType + call this%NumericalModelType%model_da() + ! + ! -- return + return + end subroutine swf_da + + !> @brief Surface Flow Model Budget Entry + !! + !! This subroutine adds a budget entry to the flow budget. It was added as + !! a method for the swf model object so that the exchange object could add its + !! contributions. + !! + !! (1) adds the entry to the budget object + !< + subroutine swf_bdentry(this, budterm, budtxt, rowlabel) + ! -- modules + use ConstantsModule, only: LENBUDTXT + use TdisModule, only: delt + ! -- dummy + class(SwfModelType) :: this + real(DP), dimension(:, :), intent(in) :: budterm + character(len=LENBUDTXT), dimension(:), intent(in) :: budtxt + character(len=*), intent(in) :: rowlabel +! ------------------------------------------------------------------------------ + ! + call this%budget%addentry(budterm, delt, budtxt, rowlabel=rowlabel) + ! + ! -- return + return + end subroutine swf_bdentry + + !> @brief Create boundary condition packages for this model + !< + subroutine package_create(this, filtyp, ipakid, ipaknum, pakname, mempath, & + inunit, iout) + ! -- modules + use ConstantsModule, only: LINELENGTH + use MemoryHelperModule, only: create_mem_path + use SwfFlwModule, only: flw_create + use ChdModule, only: chd_create + use SwfZdgModule, only: zdg_create + ! -- dummy + class(SwfModelType) :: this + character(len=*), intent(in) :: filtyp + integer(I4B), intent(in) :: ipakid + integer(I4B), intent(in) :: ipaknum + character(len=*), intent(in) :: pakname + character(len=*), intent(in) :: mempath + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + ! -- local + class(BndType), pointer :: packobj + class(BndType), pointer :: packobj2 + integer(I4B) :: ip + ! + ! -- This part creates the package object + select case (filtyp) + case ('FLW6') + call flw_create(packobj, ipakid, ipaknum, inunit, iout, this%name, & + pakname, mempath) + packobj%ictMemPath = '' + case ('CHD6') + call chd_create(packobj, ipakid, ipaknum, inunit, iout, this%name, & + pakname, mempath) + packobj%ictMemPath = create_mem_path(this%name, 'DFW') + case ('ZDG6') + call zdg_create(packobj, ipakid, ipaknum, inunit, iout, this%name, & + pakname, mempath, this%dis, this%cxs, this%dfw%unitconv) + case default + write (errmsg, *) 'Invalid package type: ', filtyp + call store_error(errmsg, terminate=.TRUE.) + end select + ! + ! -- Check to make sure that the package name is unique, then store a + ! pointer to the package in the model bndlist + do ip = 1, this%bndlist%Count() + packobj2 => GetBndFromList(this%bndlist, ip) + if (packobj2%packName == pakname) then + write (errmsg, '(a,a)') 'Cannot create package. Package name '// & + 'already exists: ', trim(pakname) + call store_error(errmsg, terminate=.TRUE.) + end if + end do + call AddBndToList(this%bndlist, packobj) + ! + ! -- return + return + end subroutine package_create + + !> @brief Check to make sure required input files have been specified + subroutine ftype_check(this, indis) + ! -- modules + ! -- dummy + class(SwfModelType) :: this + integer(I4B), intent(in) :: indis + ! -- local + ! + ! -- Check for DISL, and DFW. Stop if not present. + if (indis == 0) then + write (errmsg, '(1x,a)') & + 'Discretization (DISL6) Package not specified.' + call store_error(errmsg) + end if + if (this%inic == 0 .and. this%indfw /= 0) then + write (errmsg, '(a)') & + 'Initial Conditions (IC6) must be specified if the Diffusive & + &Wave (DFW) package is used.' + call store_error(errmsg) + end if + if (this%indfw == 0) then + write (errmsg, '(1x,a)') & + 'DFW6 Package must be specified.' + call store_error(errmsg) + end if + if (count_errors() > 0) then + write (errmsg, '(1x,a)') 'One or more required package(s) not specified.' + call store_error(errmsg) + end if + ! + ! -- return + return + end subroutine ftype_check + + !> @brief Source package info and begin to process + !< + subroutine create_bndpkgs(this, bndpkgs, pkgtypes, pkgnames, & + mempaths, inunits) + ! -- modules + use ConstantsModule, only: LINELENGTH, LENPACKAGENAME + use CharacterStringModule, only: CharacterStringType + ! -- dummy + class(SwfModelType) :: this + integer(I4B), dimension(:), allocatable, intent(inout) :: bndpkgs + type(CharacterStringType), dimension(:), contiguous, & + pointer, intent(inout) :: pkgtypes + type(CharacterStringType), dimension(:), contiguous, & + pointer, intent(inout) :: pkgnames + type(CharacterStringType), dimension(:), contiguous, & + pointer, intent(inout) :: mempaths + integer(I4B), dimension(:), contiguous, & + pointer, intent(inout) :: inunits + ! -- local + integer(I4B) :: ipakid, ipaknum + character(len=LENFTYPE) :: pkgtype, bndptype + character(len=LENPACKAGENAME) :: pkgname + character(len=LENMEMPATH) :: mempath + integer(I4B), pointer :: inunit + integer(I4B) :: n + + if (allocated(bndpkgs)) then + ! + ! -- create stress packages + ipakid = 1 + bndptype = '' + do n = 1, size(bndpkgs) + ! + pkgtype = pkgtypes(bndpkgs(n)) + pkgname = pkgnames(bndpkgs(n)) + mempath = mempaths(bndpkgs(n)) + inunit => inunits(bndpkgs(n)) + ! + if (bndptype /= pkgtype) then + ipaknum = 1 + bndptype = pkgtype + end if + ! + call this%package_create(pkgtype, ipakid, ipaknum, pkgname, mempath, & + inunit, this%iout) + ipakid = ipakid + 1 + ipaknum = ipaknum + 1 + end do + ! + ! -- cleanup + deallocate (bndpkgs) + end if + ! + ! -- return + return + end subroutine create_bndpkgs + + !> @brief Source package info and begin to process + !< + subroutine create_packages(this) + ! -- modules + use ConstantsModule, only: LINELENGTH, LENPACKAGENAME + use CharacterStringModule, only: CharacterStringType + use ArrayHandlersModule, only: expandarray + use MemoryManagerModule, only: mem_setptr + use MemoryHelperModule, only: create_mem_path + use SimVariablesModule, only: idm_context + use SwfDislModule, only: disl_cr + use SwfDfWModule, only: dfw_cr + use SwfCxsModule, only: cxs_cr + use SwfStoModule, only: sto_cr + use SwfIcModule, only: ic_cr + use SwfOcModule, only: oc_cr + ! -- dummy + class(SwfModelType) :: this + ! -- local + type(CharacterStringType), dimension(:), contiguous, & + pointer :: pkgtypes => null() + type(CharacterStringType), dimension(:), contiguous, & + pointer :: pkgnames => null() + type(CharacterStringType), dimension(:), contiguous, & + pointer :: mempaths => null() + integer(I4B), dimension(:), contiguous, & + pointer :: inunits => null() + character(len=LENMEMPATH) :: model_mempath + character(len=LENFTYPE) :: pkgtype + character(len=LENPACKAGENAME) :: pkgname + character(len=LENMEMPATH) :: mempath + integer(I4B), pointer :: inunit + integer(I4B), dimension(:), allocatable :: bndpkgs + integer(I4B) :: n + integer(I4B) :: indis = 0 ! DIS enabled flag + character(len=LENMEMPATH) :: mempathic = '' + character(len=LENMEMPATH) :: mempathdfw = '' + character(len=LENMEMPATH) :: mempathcxs = '' + ! + ! -- set input model memory path + model_mempath = create_mem_path(component=this%name, context=idm_context) + ! + ! -- set pointers to model path package info + call mem_setptr(pkgtypes, 'PKGTYPES', model_mempath) + call mem_setptr(pkgnames, 'PKGNAMES', model_mempath) + call mem_setptr(mempaths, 'MEMPATHS', model_mempath) + call mem_setptr(inunits, 'INUNITS', model_mempath) + ! + do n = 1, size(pkgtypes) + ! + ! attributes for this input package + pkgtype = pkgtypes(n) + pkgname = pkgnames(n) + mempath = mempaths(n) + inunit => inunits(n) + ! + ! -- create dis package as it is a prerequisite for other packages + select case (pkgtype) + case ('DISL6') + indis = 1 + call disl_cr(this%dis, this%name, mempath, indis, this%iout) + case ('DFW6') + this%indfw = 1 + mempathdfw = mempath + case ('CXS6') + this%incxs = 1 + mempathcxs = mempath + case ('STO6') + this%insto = inunit + case ('IC6') + this%inic = 1 + mempathic = mempath + case ('OC6') + this%inoc = inunit + case ('OBS6') + this%inobs = inunit + case ('CHD6', 'FLW6', 'ZDG6') + call expandarray(bndpkgs) + bndpkgs(size(bndpkgs)) = n + case default + ! TODO + end select + end do + ! + ! -- Create packages that are tied directly to model + if (this%inic > 0) then + call ic_cr(this%ic, this%name, mempathic, this%inic, this%iout, & + this%dis) + end if + call cxs_cr(this%cxs, this%name, mempathcxs, this%incxs, this%iout, & + this%dis) + if (this%indfw > 0) then + call dfw_cr(this%dfw, this%name, mempathdfw, this%indfw, this%iout, & + this%dis, this%cxs) + end if + if (this%insto > 0) then + call sto_cr(this%sto, this%name, this%insto, this%iout, this%dis, & + this%cxs) + end if + call oc_cr(this%oc, this%name, this%inoc, this%iout) + call swf_obs_cr(this%obs, this%inobs) + ! + ! -- Check to make sure that required ftype's have been specified + call this%ftype_check(indis) + ! + call this%create_bndpkgs(bndpkgs, pkgtypes, pkgnames, mempaths, inunits) + ! + ! -- return + return + end subroutine create_packages + + subroutine create_lstfile(this, lst_fname, model_fname, defined) + ! -- modules + use KindModule, only: LGP + use InputOutputModule, only: openfile, getunit + ! -- dummy + class(SwfModelType) :: this + character(len=*), intent(inout) :: lst_fname + character(len=*), intent(in) :: model_fname + logical(LGP), intent(in) :: defined + ! -- local + integer(I4B) :: i, istart, istop + ! + ! -- set list file name if not provided + if (.not. defined) then + ! + ! -- initialize + lst_fname = ' ' + istart = 0 + istop = len_trim(model_fname) + ! + ! -- identify '.' character position from back of string + do i = istop, 1, -1 + if (model_fname(i:i) == '.') then + istart = i + exit + end if + end do + ! + ! -- if not found start from string end + if (istart == 0) istart = istop + 1 + ! + ! -- set list file name + lst_fname = model_fname(1:istart) + istop = istart + 3 + lst_fname(istart:istop) = '.lst' + end if + ! + ! -- create the list file + this%iout = getunit() + call openfile(this%iout, 0, lst_fname, 'LIST', filstat_opt='REPLACE') + ! + ! -- write list file header + call write_listfile_header(this%iout, 'SURFACE WATER FLOW MODEL (SWF)') + ! + ! -- return + return + end subroutine create_lstfile + + !> @brief Write model namfile options to list file + !< + subroutine log_namfile_options(this, found) + use SwfNamInputModule, only: SwfNamParamFoundType + class(SwfModelType) :: this + type(SwfNamParamFoundType), intent(in) :: found + + write (this%iout, '(1x,a)') 'NAMEFILE OPTIONS:' + + if (found%print_input) then + write (this%iout, '(4x,a)') 'STRESS PACKAGE INPUT WILL BE PRINTED '// & + 'FOR ALL MODEL STRESS PACKAGES' + end if + + if (found%print_flows) then + write (this%iout, '(4x,a)') 'PACKAGE FLOWS WILL BE PRINTED '// & + 'FOR ALL MODEL PACKAGES' + end if + + if (found%save_flows) then + write (this%iout, '(4x,a)') & + 'FLOWS WILL BE SAVED TO BUDGET FILE SPECIFIED IN OUTPUT CONTROL' + end if + + write (this%iout, '(1x,a)') 'END NAMEFILE OPTIONS:' + end subroutine log_namfile_options + + !> @brief Check for steady state period + !! + !! Write warning message if steady state + !! period and adaptive time stepping is + !! active for the period + !! + !< + subroutine steady_period_check(this) + ! -- modules + use TdisModule, only: kper + use AdaptiveTimeStepModule, only: isAdaptivePeriod + use SimVariablesModule, only: warnmsg + use SimModule, only: store_warning + ! -- dummy + class(SwfModelType) :: this + if (this%iss == 1) then + if (isAdaptivePeriod(kper)) then + write (warnmsg, '(a,a,a,i0,a)') & + 'SWF Model (', trim(this%name), ') is steady state for period ', & + kper, ' and adaptive time stepping is active. Adaptive time & + &stepping may not work properly for steady-state conditions.' + call store_warning(warnmsg) + end if + end if + return + end subroutine steady_period_check + + !> @brief return 1 if any package causes the matrix to be asymmetric. + !! Otherwise return 0. + !< + function swf_get_iasym(this) result(iasym) + class(SwfModelType) :: this + ! -- local + integer(I4B) :: iasym + integer(I4B) :: ip + class(BndType), pointer :: packobj + ! + ! -- Start by setting iasym to zero + iasym = 0 + ! + ! -- DFW + if (this%indfw > 0) then + iasym = 1 + end if + ! + ! -- Check for any packages that introduce matrix asymmetry + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + if (packobj%iasym /= 0) iasym = 1 + end do + ! + ! -- return + return + end function swf_get_iasym + +end module SwfModule diff --git a/src/Model/SurfaceWaterFlow/swf1chd1idm.f90 b/src/Model/SurfaceWaterFlow/swf1chd1idm.f90 new file mode 100644 index 00000000000..69b1de85564 --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1chd1idm.f90 @@ -0,0 +1,411 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module SwfChdInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public swf_chd_param_definitions + public swf_chd_aggregate_definitions + public swf_chd_block_definitions + public SwfChdParamFoundType + public swf_chd_multi_package + + type SwfChdParamFoundType + logical :: auxiliary = .false. + logical :: auxmultname = .false. + logical :: boundnames = .false. + logical :: print_input = .false. + logical :: print_flows = .false. + logical :: save_flows = .false. + logical :: ts_filerecord = .false. + logical :: ts6 = .false. + logical :: filein = .false. + logical :: ts6_filename = .false. + logical :: obs_filerecord = .false. + logical :: obs6 = .false. + logical :: obs6_filename = .false. + logical :: maxbound = .false. + logical :: cellid = .false. + logical :: head = .false. + logical :: aux = .false. + logical :: boundname = .false. + end type SwfChdParamFoundType + + logical :: swf_chd_multi_package = .true. + + type(InputParamDefinitionType), parameter :: & + swfchd_auxiliary = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'OPTIONS', & ! block + 'AUXILIARY', & ! tag name + 'AUXILIARY', & ! fortran variable + 'STRING', & ! type + 'NAUX', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_auxmultname = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'OPTIONS', & ! block + 'AUXMULTNAME', & ! tag name + 'AUXMULTNAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_boundnames = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'OPTIONS', & ! block + 'BOUNDNAMES', & ! tag name + 'BOUNDNAMES', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_print_input = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_INPUT', & ! tag name + 'PRINT_INPUT', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_print_flows = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_FLOWS', & ! tag name + 'PRINT_FLOWS', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_save_flows = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'OPTIONS', & ! block + 'SAVE_FLOWS', & ! tag name + 'SAVE_FLOWS', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_ts_filerecord = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'OPTIONS', & ! block + 'TS_FILERECORD', & ! tag name + 'TS_FILERECORD', & ! fortran variable + 'RECORD TS6 FILEIN TS6_FILENAME', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_ts6 = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'OPTIONS', & ! block + 'TS6', & ! tag name + 'TS6', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_filein = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'OPTIONS', & ! block + 'FILEIN', & ! tag name + 'FILEIN', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_ts6_filename = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'OPTIONS', & ! block + 'TS6_FILENAME', & ! tag name + 'TS6_FILENAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_obs_filerecord = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'OPTIONS', & ! block + 'OBS_FILERECORD', & ! tag name + 'OBS_FILERECORD', & ! fortran variable + 'RECORD OBS6 FILEIN OBS6_FILENAME', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_obs6 = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'OPTIONS', & ! block + 'OBS6', & ! tag name + 'OBS6', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_obs6_filename = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'OPTIONS', & ! block + 'OBS6_FILENAME', & ! tag name + 'OBS6_FILENAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_maxbound = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'DIMENSIONS', & ! block + 'MAXBOUND', & ! tag name + 'MAXBOUND', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_cellid = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'PERIOD', & ! block + 'CELLID', & ! tag name + 'CELLID', & ! fortran variable + 'INTEGER1D', & ! type + 'NCELLDIM', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_head = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'PERIOD', & ! block + 'HEAD', & ! tag name + 'HEAD', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .true. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_aux = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'PERIOD', & ! block + 'AUX', & ! tag name + 'AUX', & ! fortran variable + 'DOUBLE1D', & ! type + 'NAUX', & ! shape + .false., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .true. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfchd_boundname = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'PERIOD', & ! block + 'BOUNDNAME', & ! tag name + 'BOUNDNAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_chd_param_definitions(*) = & + [ & + swfchd_auxiliary, & + swfchd_auxmultname, & + swfchd_boundnames, & + swfchd_print_input, & + swfchd_print_flows, & + swfchd_save_flows, & + swfchd_ts_filerecord, & + swfchd_ts6, & + swfchd_filein, & + swfchd_ts6_filename, & + swfchd_obs_filerecord, & + swfchd_obs6, & + swfchd_obs6_filename, & + swfchd_maxbound, & + swfchd_cellid, & + swfchd_head, & + swfchd_aux, & + swfchd_boundname & + ] + + type(InputParamDefinitionType), parameter :: & + swfchd_spd = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CHD', & ! subcomponent + 'PERIOD', & ! block + 'STRESS_PERIOD_DATA', & ! tag name + 'SPD', & ! fortran variable + 'RECARRAY CELLID HEAD AUX BOUNDNAME', & ! type + 'MAXBOUND', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_chd_aggregate_definitions(*) = & + [ & + swfchd_spd & + ] + + type(InputBlockDefinitionType), parameter :: & + swf_chd_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'PERIOD', & ! blockname + .true., & ! required + .true., & ! aggregate + .true. & ! block_variable + ) & + ] + +end module SwfChdInputModule diff --git a/src/Model/SurfaceWaterFlow/swf1cxs1.f90 b/src/Model/SurfaceWaterFlow/swf1cxs1.f90 new file mode 100644 index 00000000000..efbfdfc8e60 --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1cxs1.f90 @@ -0,0 +1,620 @@ +! The SwfCxsType package is assigned for a model +! and can be used to calculate wetted area, wetted +! perimeter, hydraulic radius, composite roughness, etc. +! even if the user doesn't specify a CXS Package. +module SwfCxsModule + + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: LENMEMPATH, DZERO + use MemoryHelperModule, only: create_mem_path + use MemoryManagerModule, only: mem_allocate + use SimVariablesModule, only: errmsg, warnmsg + use SimModule, only: count_errors, store_error, store_error_unit + use NumericalPackageModule, only: NumericalPackageType + use BaseDisModule, only: DisBaseType + + implicit none + private + public :: SwfCxsType, cxs_cr + + type, extends(NumericalPackageType) :: SwfCxsType + + ! provided as input + integer(I4B), pointer :: nsections => null() !< number of cross section + integer(I4B), pointer :: npoints => null() !< total number of cross-section points + integer(I4B), dimension(:), pointer, contiguous :: idcxs => null() !< cross section id number, size nsections + integer(I4B), dimension(:), pointer, contiguous :: nxspoints => null() !< number of cross section points for section, size nsections + real(DP), dimension(:), pointer, contiguous :: xfraction => null() !< cross-section relative x distance, of size npoints + real(DP), dimension(:), pointer, contiguous :: height => null() !< cross-section heights, of size npoints + real(DP), dimension(:), pointer, contiguous :: manfraction => null() !< cross-section roughness data, of size npoints + + ! calculated from input + integer(I4B), dimension(:), pointer, contiguous :: iacross => null() !< pointers to cross-section data for each section, of size nsections + 1 + + contains + + procedure :: allocate_scalars + procedure :: allocate_arrays + procedure :: source_options + procedure :: log_options + procedure :: source_dimensions + procedure :: log_dimensions + procedure :: source_packagedata + procedure :: log_packagedata + procedure :: source_crosssectiondata + procedure :: log_crosssectiondata + procedure :: cxs_da + procedure :: get_cross_section_info + procedure :: get_area + procedure :: get_roughness + procedure :: get_hydraulic_radius + + end type SwfCxsType + +contains + + !> @brief create package + !< + subroutine cxs_cr(pobj, name_model, input_mempath, inunit, iout, dis) + ! -- modules + use MemoryManagerExtModule, only: mem_set_value + ! -- dummy + type(SwfCxsType), pointer :: pobj + character(len=*), intent(in) :: name_model + character(len=*), intent(in) :: input_mempath + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + class(DisBaseType), pointer, intent(inout) :: dis !< the pointer to the discretization + ! -- locals + logical(LGP) :: found_fname + ! -- formats + character(len=*), parameter :: fmtheader = & + "(1x, /1x, 'CXS -- CROSS SECTION PACKAGE, VERSION 1, 5/24/2023', & + &' INPUT READ FROM MEMPATH: ', A, /)" + ! + ! -- Create the object + allocate (pobj) + + ! -- create name and memory path + call pobj%set_names(1, name_model, 'CXS', 'CXS') + + ! -- Allocate scalars + call pobj%allocate_scalars() + + ! -- Set variables + pobj%input_mempath = input_mempath + pobj%inunit = inunit + pobj%iout = iout + pobj%dis => dis + + ! -- set name of input file + call mem_set_value(pobj%input_fname, 'INPUT_FNAME', pobj%input_mempath, & + found_fname) + + ! -- check if package is enabled + if (inunit > 0) then + + ! -- Print a message identifying the package. + write (iout, fmtheader) input_mempath + + ! -- source options + call pobj%source_options() + + ! -- source dimensions + call pobj%source_dimensions() + + ! -- allocate arrays + call pobj%allocate_arrays() + + ! -- source dimensions + call pobj%source_packagedata() + + ! -- source dimensions + call pobj%source_crosssectiondata() + + end if + + ! -- Return + return + end subroutine cxs_cr + + !> @ brief Allocate scalars + !! + !! Allocate and initialize scalars for the package. The base model + !! allocate scalars method is also called. + !! + !< + subroutine allocate_scalars(this) + ! -- modules + ! -- dummy + class(SwfCxsType) :: this + ! + ! -- allocate scalars in NumericalPackageType + call this%NumericalPackageType%allocate_scalars() + ! + ! -- Allocate scalars + call mem_allocate(this%nsections, 'NSECTIONS', this%memoryPath) + call mem_allocate(this%npoints, 'NPOINTS', this%memoryPath) + + ! -- initialize + this%nsections = 0 + this%npoints = 0 + + return + end subroutine allocate_scalars + + !> @brief Copy options from IDM into package + !< + subroutine source_options(this) + ! -- modules + use KindModule, only: LGP + use MemoryManagerExtModule, only: mem_set_value + use SimVariablesModule, only: idm_context + use SwfCxsInputModule, only: SwfCxsParamFoundType + ! -- dummy + class(SwfCxsType) :: this + ! -- locals + character(len=LENMEMPATH) :: idmMemoryPath + type(SwfCxsParamFoundType) :: found + ! + ! -- set memory path + idmMemoryPath = create_mem_path(this%name_model, 'CXS', idm_context) + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%iprpak, 'PRINT_INPUT', idmMemoryPath, & + found%iprpak) + ! + ! -- log values to list file + if (this%iout > 0) then + call this%log_options(found) + end if + ! + ! -- Return + return + end subroutine source_options + + !> @brief Write user options to list file + !< + subroutine log_options(this, found) + use SwfCxsInputModule, only: SwfCxsParamFoundType + class(SwfCxsType) :: this + type(SwfCxsParamFoundType), intent(in) :: found + + write (this%iout, '(1x,a)') 'Setting CXS Options' + + if (found%iprpak) then + write (this%iout, '(4x,a)') 'Package information will be printed.' + end if + + write (this%iout, '(1x,a,/)') 'End Setting CXS Options' + + end subroutine log_options + + !> @brief Copy options from IDM into package + !< + subroutine source_dimensions(this) + ! -- modules + use KindModule, only: LGP + use MemoryManagerExtModule, only: mem_set_value + use SimVariablesModule, only: idm_context + use SwfCxsInputModule, only: SwfCxsParamFoundType + ! -- dummy + class(SwfCxsType) :: this + ! -- locals + character(len=LENMEMPATH) :: idmMemoryPath + type(SwfCxsParamFoundType) :: found + ! + ! -- set memory path + idmMemoryPath = create_mem_path(this%name_model, 'CXS', idm_context) + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%nsections, 'NSECTIONS', idmMemoryPath, & + found%nsections) + call mem_set_value(this%npoints, 'NPOINTS', idmMemoryPath, & + found%npoints) + ! + ! -- ensure nsections was found + if (.not. found%nsections) then + write (errmsg, '(a)') 'Error in DIMENSIONS block: NSECTIONS not found.' + call store_error(errmsg) + end if + ! + ! -- ensure npoints was found + if (.not. found%npoints) then + write (errmsg, '(a)') 'Error in DIMENSIONS block: NPOINTS not found.' + call store_error(errmsg) + end if + ! + ! -- log values to list file + if (this%iout > 0) then + call this%log_dimensions(found) + end if + ! + ! -- Return + return + end subroutine source_dimensions + + !> @brief Write user options to list file + !< + subroutine log_dimensions(this, found) + use SwfCxsInputModule, only: SwfCxsParamFoundType + class(SwfCxsType) :: this + type(SwfCxsParamFoundType), intent(in) :: found + + write (this%iout, '(1x,a)') 'Setting CXS Dimensions' + + if (found%nsections) then + write (this%iout, '(4x,a)') 'NSECTIONS set from input file.' + end if + + if (found%npoints) then + write (this%iout, '(4x,a)') 'NPOINTS set from input file.' + end if + + write (this%iout, '(1x,a,/)') 'End Setting CXS Dimensions' + + end subroutine log_dimensions + + !> @brief allocate memory for arrays + !< + subroutine allocate_arrays(this) + ! -- dummy + class(SwfCxsType) :: this + ! -- locals + integer(I4B) :: n + ! + ! -- arrays allocation + call mem_allocate(this%idcxs, this%nsections, & + 'IDCXS', this%memoryPath) + call mem_allocate(this%nxspoints, this%nsections, & + 'NXSPOINTS', this%memoryPath) + call mem_allocate(this%xfraction, this%npoints, & + 'XFRACTION', this%memoryPath) + call mem_allocate(this%height, this%npoints, & + 'HEIGHT', this%memoryPath) + call mem_allocate(this%manfraction, this%npoints, & + 'MANFRACTION', this%memoryPath) + call mem_allocate(this%iacross, this%nsections + 1, & + 'IACROSS', this%memoryPath) + + ! -- initialization + do n = 1, this%nsections + this%idcxs(n) = 0 + this%nxspoints(n) = 0 + end do + do n = 1, this%npoints + this%xfraction(n) = DZERO + this%height(n) = DZERO + this%manfraction(n) = DZERO + end do + do n = 1, this%nsections + 1 + this%iacross(n) = 0 + end do + + ! -- Return + return + end subroutine allocate_arrays + + !> @brief Copy options from IDM into package + !< + subroutine source_packagedata(this) + ! -- modules + use KindModule, only: LGP + use MemoryManagerExtModule, only: mem_set_value + use SimVariablesModule, only: idm_context + use SwfCxsInputModule, only: SwfCxsParamFoundType + ! -- dummy + class(SwfCxsType) :: this + ! -- locals + character(len=LENMEMPATH) :: idmMemoryPath + type(SwfCxsParamFoundType) :: found + ! + ! -- set memory path + idmMemoryPath = create_mem_path(this%name_model, 'CXS', idm_context) + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%idcxs, 'IDCXS', idmMemoryPath, & + found%idcxs) + call mem_set_value(this%nxspoints, 'NXSPOINTS', idmMemoryPath, & + found%nxspoints) + ! + ! -- ensure idcxs was found + if (.not. found%idcxs) then + write (errmsg, '(a)') 'Error in PACKAGEDATA block: IDCXS not found.' + call store_error(errmsg) + end if + ! + ! -- ensure nxspoints was found + if (.not. found%nxspoints) then + write (errmsg, '(a)') 'Error in PACKAGEDATA block: NXSPOINTS not found.' + call store_error(errmsg) + end if + ! + ! -- log values to list file + if (this%iout > 0) then + call this%log_packagedata(found) + end if + ! + ! -- Calculate the iacross index array using nxspoints + call calc_iacross(this%nxspoints, this%iacross) + ! + ! -- Return + return + end subroutine source_packagedata + + !> @brief Calculate index pointer array iacross from nxspoints + !< + subroutine calc_iacross(nxspoints, iacross) + integer(I4B), dimension(:), intent(in) :: nxspoints + integer(I4B), dimension(:), intent(inout) :: iacross + integer(I4B) :: n + iacross(1) = 1 + do n = 1, size(nxspoints) + iacross(n + 1) = iacross(n) + nxspoints(n) + end do + end subroutine calc_iacross + + !> @brief Write user packagedata to list file + !< + subroutine log_packagedata(this, found) + use SwfCxsInputModule, only: SwfCxsParamFoundType + class(SwfCxsType) :: this + type(SwfCxsParamFoundType), intent(in) :: found + + write (this%iout, '(1x,a)') 'Setting CXS Package Data' + + if (found%idcxs) then + write (this%iout, '(4x,a)') 'IDCXS set from input file.' + end if + + if (found%nxspoints) then + write (this%iout, '(4x,a)') 'NXSPOINTS set from input file.' + end if + + write (this%iout, '(1x,a,/)') 'End Setting CXS Package Data' + + end subroutine log_packagedata + + !> @brief Copy options from IDM into package + !< + subroutine source_crosssectiondata(this) + ! -- modules + use KindModule, only: LGP + use MemoryManagerExtModule, only: mem_set_value + use SimVariablesModule, only: idm_context + use SwfCxsInputModule, only: SwfCxsParamFoundType + ! -- dummy + class(SwfCxsType) :: this + ! -- locals + character(len=LENMEMPATH) :: idmMemoryPath + type(SwfCxsParamFoundType) :: found + ! + ! -- set memory path + idmMemoryPath = create_mem_path(this%name_model, 'CXS', idm_context) + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%xfraction, 'XFRACTION', idmMemoryPath, & + found%xfraction) + call mem_set_value(this%height, 'HEIGHT', idmMemoryPath, & + found%height) + call mem_set_value(this%manfraction, 'MANFRACTION', idmMemoryPath, & + found%manfraction) + ! + ! -- ensure xfraction was found + if (.not. found%xfraction) then + write (errmsg, '(a)') & + 'Error in CROSSSECTIONDATA block: xfraction not found.' + call store_error(errmsg) + end if + ! + ! -- ensure height was found + if (.not. found%height) then + write (errmsg, '(a)') & + 'Error in CROSSSECTIONDATA block: HEIGHT not found.' + call store_error(errmsg) + end if + ! + ! -- ensure manfraction was found + if (.not. found%manfraction) then + write (errmsg, '(a)') & + 'Error in CROSSSECTIONDATA block: MANFRACTION not found.' + call store_error(errmsg) + end if + ! + ! -- log values to list file + if (this%iout > 0) then + call this%log_crosssectiondata(found) + end if + ! + ! -- Return + return + end subroutine source_crosssectiondata + + !> @brief Write user packagedata to list file + !< + subroutine log_crosssectiondata(this, found) + use SwfCxsInputModule, only: SwfCxsParamFoundType + class(SwfCxsType) :: this + type(SwfCxsParamFoundType), intent(in) :: found + + write (this%iout, '(1x,a)') 'Setting CXS Cross Section Data' + + if (found%xfraction) then + write (this%iout, '(4x,a)') 'XFRACTION set from input file.' + end if + + if (found%height) then + write (this%iout, '(4x,a)') 'HEIGHT set from input file.' + end if + + if (found%manfraction) then + write (this%iout, '(4x,a)') 'MANFRACTION set from input file.' + end if + + write (this%iout, '(1x,a,/)') 'End Setting CXS Cross Section Data' + + end subroutine log_crosssectiondata + + !> @brief deallocate memory + !< + subroutine cxs_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + use MemoryManagerExtModule, only: memorylist_remove + use SimVariablesModule, only: idm_context + ! -- dummy + class(SwfCxsType) :: this + ! + ! -- Deallocate input memory + call memorylist_remove(this%name_model, 'CXS', idm_context) + ! + ! -- Scalars + call mem_deallocate(this%nsections) + call mem_deallocate(this%npoints) + ! + ! -- Deallocate arrays if the package was created + ! from an input file + if (this%inunit > 0) then + call mem_deallocate(this%idcxs) + call mem_deallocate(this%nxspoints) + call mem_deallocate(this%xfraction) + call mem_deallocate(this%height) + call mem_deallocate(this%manfraction) + call mem_deallocate(this%iacross) + end if + ! + ! -- deallocate parent + call this%NumericalPackageType%da() + ! + ! -- Return + return + end subroutine cxs_da + + subroutine get_cross_section_info(this, idcxs, i0, i1, npts, icalcmeth) + ! -- dummy + class(SwfCxsType) :: this + integer(I4B), intent(in) :: idcxs !< cross section id number + integer(I4B), intent(inout) :: i0 !< starting cross section point number + integer(I4B), intent(inout) :: i1 !< ending cross section point number + integer(I4B), intent(inout) :: npts !< number of points in cross section + integer(I4B), intent(inout) :: icalcmeth !< calculation method for mannings roughness + ! -- local + ! + ! -- Return npts = 0 if this package does not have input file + if (this%inunit == 0 .or. idcxs == 0) then + npts = 0 + i0 = 1 + i1 = 1 + icalcmeth = 0 + else + ! + ! -- If the cross section id is 0, then it is a hydraulically wide channel, + ! and only width and rough are needed (not xfraction, height, and manfraction) + if (idcxs > 0) then + i0 = this%iacross(idcxs) + i1 = this%iacross(idcxs + 1) - 1 + else + i0 = 1 + i1 = 1 + end if + ! set icalcmeth based on number of cross section points + npts = i1 - i0 + 1 + icalcmeth = 0 ! linear composite mannings resistance + if (npts > 4) then + icalcmeth = 1 ! sum q by cross section segments + end if + end if + return + end subroutine get_cross_section_info + + function get_area(this, idcxs, width, depth) result(area) + ! -- modules + use SwfCxsUtilsModule, only: get_cross_section_area + ! -- dummy + class(SwfCxsType) :: this + integer(I4B), intent(in) :: idcxs !< cross section id + real(DP), intent(in) :: width !< width in reach + real(DP), intent(in) :: depth !< stage in reach + ! -- local + real(DP) :: area + integer(I4B) :: i0 + integer(I4B) :: i1 + integer(I4B) :: npts + integer(I4B) :: icalcmeth + call this%get_cross_section_info(idcxs, i0, i1, npts, icalcmeth) + if (npts == 0) then + area = width * depth + else + area = get_cross_section_area(npts, & + this%xfraction(i0:i1), & + this%height(i0:i1), & + width, depth) + end if + end function get_area + + function get_roughness(this, idcxs, width, depth, rough, & + slope) result(roughc) + ! -- modules + use SwfCxsUtilsModule, only: calc_composite_roughness + ! -- dummy + class(SwfCxsType) :: this + integer(I4B), intent(in) :: idcxs !< cross section id + real(DP), intent(in) :: width !< width in reach + real(DP), intent(in) :: depth !< stage in reach + real(DP), intent(in) :: rough !< mannings value provided for the reach + real(DP), intent(in) :: slope !< slope value provided for the reach + ! -- local + real(DP) :: roughc !< calculated composite roughness + integer(I4B) :: i0 + integer(I4B) :: i1 + integer(I4B) :: npts + integer(I4B) :: icalcmeth + call this%get_cross_section_info(idcxs, i0, i1, npts, icalcmeth) + if (npts == 0) then + roughc = rough + else + roughc = calc_composite_roughness(npts, & + depth, & + width, & + rough, & + slope, & + this%xfraction(i0:i1), & + this%height(i0:i1), & + this%manfraction(i0:i1), & + icalcmeth) + end if + end function get_roughness + + function get_hydraulic_radius(this, idcxs, width, depth, area) result(r) + ! -- modules + use SwfCxsUtilsModule, only: get_hydraulic_radius_xf + ! -- dummy + class(SwfCxsType) :: this + integer(I4B), intent(in) :: idcxs !< cross section id + real(DP), intent(in) :: width !< width in reach + real(DP), intent(in) :: depth !< stage in reach + real(DP), intent(in), optional :: area !< area of the reach + ! -- local + real(DP) :: r !< calculated hydraulic radius + real(DP) :: a + integer(I4B) :: i0 + integer(I4B) :: i1 + integer(I4B) :: npts + integer(I4B) :: icalcmeth + call this%get_cross_section_info(idcxs, i0, i1, npts, icalcmeth) + if (present(area)) then + a = area + else + a = this%get_area(idcxs, width, depth) + end if + if (npts == 0) then + r = a / width + else + r = get_hydraulic_radius_xf(npts, & + this%xfraction(i0:i1), & + this%height(i0:i1), & + width, depth) + end if + end function get_hydraulic_radius + +end module SwfCxsModule diff --git a/src/Model/SurfaceWaterFlow/swf1cxs1idm.f90 b/src/Model/SurfaceWaterFlow/swf1cxs1idm.f90 new file mode 100644 index 00000000000..987e897a8f0 --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1cxs1idm.f90 @@ -0,0 +1,245 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module SwfCxsInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public swf_cxs_param_definitions + public swf_cxs_aggregate_definitions + public swf_cxs_block_definitions + public SwfCxsParamFoundType + public swf_cxs_multi_package + + type SwfCxsParamFoundType + logical :: iprpak = .false. + logical :: nsections = .false. + logical :: npoints = .false. + logical :: idcxs = .false. + logical :: nxspoints = .false. + logical :: xfraction = .false. + logical :: height = .false. + logical :: manfraction = .false. + end type SwfCxsParamFoundType + + logical :: swf_cxs_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + swfcxs_iprpak = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CXS', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_INPUT', & ! tag name + 'IPRPAK', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcxs_nsections = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CXS', & ! subcomponent + 'DIMENSIONS', & ! block + 'NSECTIONS', & ! tag name + 'NSECTIONS', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcxs_npoints = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CXS', & ! subcomponent + 'DIMENSIONS', & ! block + 'NPOINTS', & ! tag name + 'NPOINTS', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcxs_idcxs = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CXS', & ! subcomponent + 'PACKAGEDATA', & ! block + 'IDCXS', & ! tag name + 'IDCXS', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcxs_nxspoints = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CXS', & ! subcomponent + 'PACKAGEDATA', & ! block + 'NXSPOINTS', & ! tag name + 'NXSPOINTS', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcxs_xfraction = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CXS', & ! subcomponent + 'CROSSSECTIONDATA', & ! block + 'XFRACTION', & ! tag name + 'XFRACTION', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcxs_height = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CXS', & ! subcomponent + 'CROSSSECTIONDATA', & ! block + 'HEIGHT', & ! tag name + 'HEIGHT', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcxs_manfraction = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CXS', & ! subcomponent + 'CROSSSECTIONDATA', & ! block + 'MANFRACTION', & ! tag name + 'MANFRACTION', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_cxs_param_definitions(*) = & + [ & + swfcxs_iprpak, & + swfcxs_nsections, & + swfcxs_npoints, & + swfcxs_idcxs, & + swfcxs_nxspoints, & + swfcxs_xfraction, & + swfcxs_height, & + swfcxs_manfraction & + ] + + type(InputParamDefinitionType), parameter :: & + swfcxs_packagedata = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CXS', & ! subcomponent + 'PACKAGEDATA', & ! block + 'PACKAGEDATA', & ! tag name + 'PACKAGEDATA', & ! fortran variable + 'RECARRAY IDCXS NXSPOINTS', & ! type + 'NSECTIONS', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcxs_crosssectiondata = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CXS', & ! subcomponent + 'CROSSSECTIONDATA', & ! block + 'CROSSSECTIONDATA', & ! tag name + 'CROSSSECTIONDATA', & ! fortran variable + 'RECARRAY XFRACTION HEIGHT MANFRACTION', & ! type + 'NPOINTS', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_cxs_aggregate_definitions(*) = & + [ & + swfcxs_packagedata, & + swfcxs_crosssectiondata & + ] + + type(InputBlockDefinitionType), parameter :: & + swf_cxs_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'PACKAGEDATA', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'CROSSSECTIONDATA', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module SwfCxsInputModule diff --git a/src/Model/SurfaceWaterFlow/swf1dfw1.f90 b/src/Model/SurfaceWaterFlow/swf1dfw1.f90 new file mode 100644 index 00000000000..46a74002b88 --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1dfw1.f90 @@ -0,0 +1,1078 @@ +!> @brief Stream Network Flow (SWF) Diffusive Wave (DFW) Module +!! +!! This module solves one-dimensional flow routing using a diffusive +!! wave approach. +!! +!< + +! todo: +! Implement length convert and time convert for mannings +! Use cl1 and cl2 in DFW calculations +! Move Newton to FN routines +! Implement a proper perturbation epsilon +! Is slope input parameter needed? +! Parameterize the smoothing depth? +! test ATS +! +module SwfDfwModule + + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: LENMEMPATH, LENVARNAME, LINELENGTH, & + DZERO, DHALF, DONE, DTWO, DTHREE, & + DNODATA, DEM5, DTWOTHIRDS, DP9, DONETHIRD + use MemoryHelperModule, only: create_mem_path + use MemoryManagerModule, only: mem_allocate, mem_setptr, get_isize + use SimVariablesModule, only: errmsg, warnmsg + use SimModule, only: count_errors, store_error, store_error_unit, & + store_error_filename + use NumericalPackageModule, only: NumericalPackageType + use BaseDisModule, only: DisBaseType + use SwfDislModule, only: SwfDislType + use SwfCxsModule, only: SwfCxsType + use ObsModule, only: ObsType, obs_cr + use ObsModule, only: DefaultObsIdProcessor + use ObserveModule, only: ObserveType + use MatrixBaseModule + + implicit none + private + public :: SwfDfwType, dfw_cr + + type, extends(NumericalPackageType) :: SwfDfwType + + ! -- user-provided input + integer(I4B), pointer :: icentral => null() !< flag to use central in space weighting (default is upstream weighting) + real(DP), pointer :: unitconv !< conversion factor used in mannings equation; calculated from timeconv and lengthconv + real(DP), pointer :: timeconv !< conversion factor from model length units to meters (1.0 if model uses meters for length) + real(DP), pointer :: lengthconv !< conversion factor frommodel time units to seconds (1.0 if model uses seconds for time) + real(DP), dimension(:), pointer, contiguous :: width => null() !< reach width + real(DP), dimension(:), pointer, contiguous :: manningsn => null() !< mannings roughness for each reach + real(DP), dimension(:), pointer, contiguous :: slope => null() !< slope for each reach + integer(I4B), dimension(:), pointer, contiguous :: idcxs => null() !< cross section id for each reach + integer(I4B), dimension(:), pointer, contiguous :: ibound => null() !< pointer to model ibound + integer(I4B), dimension(:), pointer, contiguous :: icelltype => null() !< set to 1 and is accessed by chd for checking + + ! -- pointer to concrete disl subclass of DisBaseType + type(SwfDislType), pointer :: disl + + ! -- observation data + integer(I4B), pointer :: inobspkg => null() !< unit number for obs package + type(ObsType), pointer :: obs => null() !< observation package + + ! -- pointer to cross section data + type(SwfCxsType), pointer :: cxs + + contains + + procedure :: allocate_scalars + procedure :: allocate_arrays + procedure :: dfw_load + procedure :: source_options + procedure :: log_options + procedure :: source_griddata + procedure :: log_griddata + procedure :: dfw_ar + procedure :: dfw_rp + procedure :: dfw_ad + procedure :: dfw_fc + procedure :: dfw_qnm_fc_nr + !procedure :: dfw_qnm_fc + procedure :: dfw_fn + procedure :: dfw_nur + procedure :: dfw_cq + procedure :: dfw_bd + procedure :: dfw_save_model_flows + procedure :: dfw_print_model_flows + procedure :: dfw_da + procedure :: dfw_df_obs + procedure :: dfw_rp_obs + procedure :: dfw_bd_obs + procedure :: qcalc + procedure :: get_cond + !procedure :: get_cond_swr + procedure :: get_cond_n + + end type SwfDfwType + +contains + + !> @brief create package + !< + subroutine dfw_cr(dfwobj, name_model, input_mempath, inunit, iout, & + dis, cxs) + ! -- modules + use MemoryManagerExtModule, only: mem_set_value + ! -- dummy + type(SwfDfwType), pointer :: dfwobj + character(len=*), intent(in) :: name_model + character(len=*), intent(in) :: input_mempath + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + class(DisBaseType), pointer, intent(inout) :: dis !< the pointer to the discretization + type(SwfCxsType), pointer, intent(in) :: cxs !< the pointer to the cxs package + ! -- locals + logical(LGP) :: found_fname + ! -- formats + character(len=*), parameter :: fmtheader = & + "(1x, /1x, 'DFW -- DIFFUSIVE WAVE (DFW) PACKAGE, VERSION 1, 9/25/2023', & + &' INPUT READ FROM MEMPATH: ', A, /)" + ! + ! -- Create the object + allocate (dfwobj) + + ! -- create name and memory path + call dfwobj%set_names(1, name_model, 'DFW', 'DFW') + + ! -- Allocate scalars + call dfwobj%allocate_scalars() + + ! -- Set variables + dfwobj%input_mempath = input_mempath + dfwobj%inunit = inunit + dfwobj%iout = iout + + ! -- set name of input file + call mem_set_value(dfwobj%input_fname, 'INPUT_FNAME', dfwobj%input_mempath, & + found_fname) + + ! -- store pointer to disl + ! Not normally good practice, but since SWF only works with DISL + ! may be okay + dfwobj%dis => dis + select type (dis) + type is (SwfDislType) + dfwobj%disl => dis + end select + + ! -- Set a pointer to the cxs package + dfwobj%cxs => cxs + + ! -- create obs package + call obs_cr(dfwobj%obs, dfwobj%inobspkg) + + ! -- check if dfw is enabled + if (inunit > 0) then + + ! -- Print a message identifying the package. + write (iout, fmtheader) input_mempath + + ! -- allocate arrays + call dfwobj%allocate_arrays() + + ! -- load dfw + call dfwobj%dfw_load() + + end if + + ! -- Return + return + end subroutine dfw_cr + + !> @ brief Allocate scalars + !! + !! Allocate and initialize scalars for the package. The base model + !! allocate scalars method is also called. + !! + !< + subroutine allocate_scalars(this) + ! -- modules + ! -- dummy + class(SwfDfwtype) :: this + ! + ! -- allocate scalars in NumericalPackageType + call this%NumericalPackageType%allocate_scalars() + ! + ! -- Allocate scalars + call mem_allocate(this%icentral, 'ICENTRAL', this%memoryPath) + call mem_allocate(this%unitconv, 'UNITCONV', this%memoryPath) + call mem_allocate(this%lengthconv, 'LENGTHCONV', this%memoryPath) + call mem_allocate(this%timeconv, 'TIMECONV', this%memoryPath) + call mem_allocate(this%inobspkg, 'INOBSPKG', this%memoryPath) + + this%icentral = 0 + this%unitconv = DONE + this%lengthconv = DONE + this%timeconv = DONE + this%inobspkg = 0 + + return + end subroutine allocate_scalars + + !> @brief allocate memory for arrays + !< + subroutine allocate_arrays(this) + ! -- dummy + class(SwfDfwType) :: this + ! -- locals + integer(I4B) :: n + ! + ! -- user-provided input + call mem_allocate(this%width, this%dis%nodes, & + 'WIDTH', this%memoryPath) + call mem_allocate(this%manningsn, this%dis%nodes, & + 'MANNINGSN', this%memoryPath) + call mem_allocate(this%slope, this%dis%nodes, & + 'SLOPE', this%memoryPath) + call mem_allocate(this%idcxs, this%dis%nodes, & + 'IDCXS', this%memoryPath) + call mem_allocate(this%icelltype, this%dis%nodes, & + 'ICELLTYPE', this%memoryPath) + + do n = 1, this%dis%nodes + this%width(n) = DZERO + this%manningsn(n) = DZERO + this%slope(n) = DZERO + this%idcxs(n) = 0 + this%icelltype(n) = 1 + end do + + ! -- Return + return + end subroutine allocate_arrays + + !> @brief load data from IDM to package + !< + subroutine dfw_load(this) + ! -- dummy + class(SwfDfwType) :: this + ! -- locals + ! + ! -- source input data + call this%source_options() + call this%source_griddata() + ! + ! -- Return + return + end subroutine dfw_load + + !> @brief Copy options from IDM into package + !< + subroutine source_options(this) + ! -- modules + use KindModule, only: LGP + use InputOutputModule, only: getunit, openfile + use MemoryManagerExtModule, only: mem_set_value + use CharacterStringModule, only: CharacterStringType + use SwfDfwInputModule, only: SwfDfwParamFoundType + ! -- dummy + class(SwfDfwType) :: this + ! -- locals + integer(I4B) :: isize + type(SwfDfwParamFoundType) :: found + type(CharacterStringType), dimension(:), pointer, & + contiguous :: obs6_fnames + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%icentral, 'ICENTRAL', & + this%input_mempath, found%icentral) + call mem_set_value(this%lengthconv, 'LENGTHCONV', & + this%input_mempath, found%lengthconv) + call mem_set_value(this%timeconv, 'TIMECONV', & + this%input_mempath, found%timeconv) + call mem_set_value(this%iprflow, 'IPRFLOW', & + this%input_mempath, found%iprflow) + call mem_set_value(this%ipakcb, 'IPAKCB', & + this%input_mempath, found%ipakcb) + ! + ! -- save flows option active + if (found%icentral) this%icentral = 1 + if (found%ipakcb) this%ipakcb = -1 + ! + ! -- calculate unit conversion + this%unitconv = this%lengthconv**DONETHIRD + this%unitconv = this%unitconv * this%timeconv + ! + ! -- check for obs6_filename + call get_isize('OBS6_FILENAME', this%input_mempath, isize) + if (isize > 0) then + ! + if (isize /= 1) then + errmsg = 'Multiple OBS6 keywords detected in OPTIONS block.'// & + ' Only one OBS6 entry allowed.' + call store_error(errmsg) + call store_error_filename(this%input_fname) + end if + ! + call mem_setptr(obs6_fnames, 'OBS6_FILENAME', this%input_mempath) + ! + found%obs6_filename = .true. + this%obs%inputFilename = obs6_fnames(1) + this%obs%active = .true. + this%inobspkg = GetUnit() + this%obs%inUnitObs = this%inobspkg + call openfile(this%inobspkg, this%iout, this%obs%inputFilename, 'OBS') + call this%obs%obs_df(this%iout, this%packName, this%filtyp, this%dis) + call this%dfw_df_obs() + end if + ! + ! -- log values to list file + if (this%iout > 0) then + call this%log_options(found) + end if + ! + ! -- Return + return + end subroutine source_options + + !> @brief Write user options to list file + !< + subroutine log_options(this, found) + use SwfDfwInputModule, only: SwfDfwParamFoundType + class(SwfDfwType) :: this + type(SwfDfwParamFoundType), intent(in) :: found + + write (this%iout, '(1x,a)') 'Setting DFW Options' + + if (found%lengthconv) then + write (this%iout, '(4x,a, G0)') 'Mannings length conversion value & + &specified as ', this%lengthconv + end if + + if (found%timeconv) then + write (this%iout, '(4x,a, G0)') 'Mannings time conversion value & + &specified as ', this%timeconv + end if + + if (found%lengthconv .or. found%timeconv) then + write (this%iout, '(4x,a, G0)') 'Mannings conversion value calculated & + &from user-provided length_conversion and & + &time_conversion is ', this%unitconv + end if + + if (found%iprflow) then + write (this%iout, '(4x,a)') 'Cell-by-cell flow information will be printed & + &to listing file whenever ICBCFL is not zero.' + end if + + if (found%ipakcb) then + write (this%iout, '(4x,a)') 'Cell-by-cell flow information will be printed & + &to listing file whenever ICBCFL is not zero.' + end if + + if (found%obs6_filename) then + write (this%iout, '(4x,a)') 'Observation package is active.' + end if + + write (this%iout, '(1x,a,/)') 'End Setting DFW Options' + + end subroutine log_options + + !> @brief copy griddata from IDM to package + !< + subroutine source_griddata(this) + ! -- modules + use SimModule, only: count_errors, store_error + use MemoryHelperModule, only: create_mem_path + use MemoryManagerModule, only: mem_reallocate + use MemoryManagerExtModule, only: mem_set_value + use SimVariablesModule, only: idm_context + use SwfDfwInputModule, only: SwfDfwParamFoundType + ! -- dummy + class(SwfDfwType) :: this + ! -- locals + character(len=LENMEMPATH) :: idmMemoryPath + type(SwfDfwParamFoundType) :: found + integer(I4B), dimension(:), pointer, contiguous :: map + ! -- formats + ! + ! -- set memory path + idmMemoryPath = create_mem_path(this%name_model, 'DFW', idm_context) + ! + ! -- set map to convert user input data into reduced data + map => null() + if (this%dis%nodes < this%dis%nodesuser) map => this%dis%nodeuser + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%width, 'WIDTH', idmMemoryPath, map, found%width) + call mem_set_value(this%manningsn, 'MANNINGSN', & + idmMemoryPath, map, found%manningsn) + call mem_set_value(this%slope, 'SLOPE', idmMemoryPath, map, found%slope) + call mem_set_value(this%idcxs, 'IDCXS', idmMemoryPath, map, found%idcxs) + ! + ! -- ensure WIDTH was found + if (.not. found%width) then + write (errmsg, '(a)') 'Error in GRIDDATA block: WIDTH not found.' + call store_error(errmsg) + end if + ! + ! -- ensure MANNINGSN was found + if (.not. found%manningsn) then + write (errmsg, '(a)') 'Error in GRIDDATA block: MANNINGSN not found.' + call store_error(errmsg) + end if + ! + ! -- ensure SLOPE was found + if (.not. found%slope) then + write (errmsg, '(a)') 'Error in GRIDDATA block: SLOPE not found.' + call store_error(errmsg) + end if + ! + ! -- log griddata + if (this%iout > 0) then + call this%log_griddata(found) + end if + ! + ! -- Return + return + end subroutine source_griddata + + !> @brief log griddata to list file + !< + subroutine log_griddata(this, found) + use SwfDfwInputModule, only: SwfDfwParamFoundType + class(SwfDfwType) :: this + type(SwfDfwParamFoundType), intent(in) :: found + + write (this%iout, '(1x,a)') 'Setting DFW Griddata' + + if (found%width) then + write (this%iout, '(4x,a)') 'WIDTH set from input file' + end if + + if (found%manningsn) then + write (this%iout, '(4x,a)') 'MANNINGSN set from input file' + end if + + if (found%slope) then + write (this%iout, '(4x,a)') 'SLOPE set from input file' + end if + + if (found%idcxs) then + write (this%iout, '(4x,a)') 'IDCXS set from input file' + end if + + write (this%iout, '(1x,a,/)') 'End Setting DFW Griddata' + + end subroutine log_griddata + + !> @brief allocate memory + !< + subroutine dfw_ar(this, ibound) + ! -- modules + ! -- dummy + class(SwfDfwType) :: this !< this instance + integer(I4B), dimension(:), pointer, contiguous :: ibound !< model ibound array + + ! -- store pointer to ibound + this%ibound => ibound + + ! - observation data + call this%obs%obs_ar() + + return + end subroutine dfw_ar + + !> @brief allocate memory + !< + subroutine dfw_rp(this) + ! -- modules + ! -- dummy + class(SwfDfwType) :: this !< this instance + ! + ! -- read observations + call this%dfw_rp_obs() + return + end subroutine dfw_rp + + !> @brief advance + !< + subroutine dfw_ad(this, irestore) + ! + class(SwfDfwType) :: this + integer(I4B), intent(in) :: irestore + + ! -- Push simulated values to preceding time/subtime step + call this%obs%obs_ad() + + ! + ! -- Return + return + end subroutine dfw_ad + + !> @brief fill coefficients + !! + !! Calculate conductance and put into amat + !! + !< + subroutine dfw_fc(this, kiter, matrix_sln, idxglo, rhs, stage, stage_old) + ! -- modules + use ConstantsModule, only: DONE + ! -- dummy + class(SwfDfwType) :: this + integer(I4B) :: kiter + class(MatrixBaseType), pointer :: matrix_sln + integer(I4B), intent(in), dimension(:) :: idxglo + real(DP), intent(inout), dimension(:) :: rhs + real(DP), intent(inout), dimension(:) :: stage + real(DP), intent(inout), dimension(:) :: stage_old + ! -- local + ! + ! -- add qnm contributions to matrix equations + call this%dfw_qnm_fc_nr(kiter, matrix_sln, idxglo, rhs, stage, stage_old) + ! + ! -- Return + return + end subroutine dfw_fc + + !> @brief fill coefficients + !! + !! Add qnm contributions to matrix equations + !! + !< + subroutine dfw_qnm_fc_nr(this, kiter, matrix_sln, idxglo, rhs, stage, stage_old) + ! -- modules + use ConstantsModule, only: DONE + ! -- dummy + class(SwfDfwType) :: this + integer(I4B) :: kiter + class(MatrixBaseType), pointer :: matrix_sln + integer(I4B), intent(in), dimension(:) :: idxglo + real(DP), intent(inout), dimension(:) :: rhs + real(DP), intent(inout), dimension(:) :: stage + real(DP), intent(inout), dimension(:) :: stage_old + ! -- local + integer(I4B) :: n, m, ii, idiag + real(DP) :: qnm + real(DP) :: qeps + real(DP) :: eps + real(DP) :: derv + ! + ! -- set perturbation derivative epsilon + eps = 1.D-8 + ! + ! -- Calculate conductance and put into amat + do n = 1, this%dis%nodes + ! + ! -- Find diagonal position for row n + idiag = this%dis%con%ia(n) + ! + ! -- Loop through connections adding matrix terms + do ii = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1 + ! + ! -- skip for masked cells + if (this%dis%con%mask(ii) == 0) cycle + ! + ! -- connection variables + m = this%dis%con%ja(ii) + ! + ! -- Fill the qnm term on the right hand side + qnm = this%qcalc(n, m, stage(n), stage(m)) + rhs(n) = rhs(n) - qnm + ! + ! -- Derivative calculation and fill of n terms + qeps = this%qcalc(n, m, stage(n) + eps, stage(m)) + derv = (qeps - qnm) / eps + call matrix_sln%add_value_pos(idxglo(idiag), derv) + rhs(n) = rhs(n) + derv * stage(n) + ! + ! -- Derivative calculation and fill of m terms + qeps = this%qcalc(n, m, stage(n), stage(m) + eps) + derv = (qeps - qnm) / eps + call matrix_sln%add_value_pos(idxglo(ii), derv) + rhs(n) = rhs(n) + derv * stage(m) + + end do + end do + ! + ! -- Return + return + end subroutine dfw_qnm_fc_nr + + subroutine dfw_fn(this, kiter, matrix_sln, idxglo, rhs, stage) + ! -- dummy + class(SwfDfwType) :: this + integer(I4B) :: kiter + class(MatrixBaseType), pointer :: matrix_sln + integer(I4B), intent(in), dimension(:) :: idxglo + real(DP), intent(inout), dimension(:) :: rhs + real(DP), intent(inout), dimension(:) :: stage + ! -- local + ! + ! -- add newton terms to solution matrix + ! -- todo: add newton terms here instead? + ! + ! + ! -- Return + return + end subroutine dfw_fn + + function qcalc(this, n, m, stage_n, stage_m) result(qnm) + ! -- dummy + class(SwfDfwType) :: this + integer(I4B), intent(in) :: n + integer(I4B), intent(in) :: m + real(DP), intent(in) :: stage_n + real(DP), intent(in) :: stage_m + ! -- local + real(DP) :: qnm + real(DP) :: cond + ! + cond = this%get_cond(n, m, stage_n, stage_m) + qnm = cond * (stage_m - stage_n) + return + end function qcalc + + function get_cond(this, n, m, stage_n, stage_m) result(cond) + ! -- modules + use SmoothingModule, only: sQuadratic + ! -- dummy + class(SwfDfwType) :: this + integer(I4B), intent(in) :: n + integer(I4B), intent(in) :: m + real(DP), intent(in) :: stage_n + real(DP), intent(in) :: stage_m + ! -- local + real(DP) :: absdhdxsqr + real(DP) :: depth_n + real(DP) :: depth_m + real(DP) :: range = 1.d-2 + real(DP) :: dydx + real(DP) :: smooth_factor + real(DP) :: denom + real(DP) :: cond + real(DP) :: cn + real(DP) :: cm + ! + ! we are using a harmonic conductance approach here; however + ! the SWR Process for MODFLOW-2005/NWT uses length-weighted + ! average areas and hydraulic radius instead. + ! + denom = DHALF * this%disl%reach_length(n) + & + DHALF * this%disl%reach_length(m) + cond = DZERO + if (denom > DZERO) then + absdhdxsqr = abs((stage_n - stage_m) / denom)**DHALF + if (absdhdxsqr == DZERO) then + absdhdxsqr = 1.e-7 + end if + + depth_n = stage_n - this%disl%reach_bottom(n) + depth_m = stage_m - this%disl%reach_bottom(m) + + if (this%icentral == 0) then + ! -- use upstream weighting + if (stage_n > stage_m) then + depth_m = depth_n + else + depth_n = depth_m + end if + end if + + call sQuadratic(depth_n, range, dydx, smooth_factor) + depth_n = depth_n * smooth_factor + call sQuadratic(depth_m, range, dydx, smooth_factor) + depth_m = depth_m * smooth_factor + cn = this%get_cond_n(n, depth_n, absdhdxsqr) + cm = this%get_cond_n(m, depth_m, absdhdxsqr) + + if ((cn + cm) > DZERO) then + cond = cn * cm / (cn + cm) + else + cond = DZERO + end if + + end if + + end function get_cond + + !> @brief Calculate half reach conductance + !! + !! Calculate half reach conductance for reach n + !! using Manning's equation + !! + !< + function get_cond_n(this, n, depth, absdhdx) result(c) + ! -- modules + ! -- dummy + class(SwfDfwType) :: this + integer(I4B), intent(in) :: n !< reach number + real(DP), intent(in) :: depth !< simulated depth (stage - elevation) in reach n for this iteration + real(DP), intent(in) :: absdhdx !< absolute value of simulated hydraulic gradient + ! -- local + real(DP) :: c + real(DP) :: width + real(DP) :: rough + real(DP) :: slope + real(DP) :: dx + real(DP) :: roughc + real(DP) :: a + real(DP) :: r + ! + width = this%width(n) + rough = this%manningsn(n) + slope = this%slope(n) + dx = DHALF * this%disl%reach_length(n) + + roughc = this%cxs%get_roughness(this%idcxs(n), width, depth, rough, & + slope) + a = this%cxs%get_area(this%idcxs(n), width, depth) + r = this%cxs%get_hydraulic_radius(this%idcxs(n), width, depth, area=a) + + ! -- conductance from manning's equation + c = this%unitconv * a * r**DTWOTHIRDS / roughc / absdhdx / dx + + end function get_cond_n + + !> @ brief Newton under relaxation + !! + !! If stage is below the bottom, then pull it up a bit + !! + !< + subroutine dfw_nur(this, neqmod, x, xtemp, dx, inewtonur, dxmax, locmax) + ! -- dummy + class(SwfDfwType) :: this + integer(I4B), intent(in) :: neqmod + real(DP), dimension(neqmod), intent(inout) :: x + real(DP), dimension(neqmod), intent(in) :: xtemp + real(DP), dimension(neqmod), intent(inout) :: dx + integer(I4B), intent(inout) :: inewtonur + real(DP), intent(inout) :: dxmax + integer(I4B), intent(inout) :: locmax + ! -- local + integer(I4B) :: n + real(DP) :: botm + real(DP) :: xx + real(DP) :: dxx + ! + ! -- Newton-Raphson under-relaxation + do n = 1, this%dis%nodes + if (this%ibound(n) < 1) cycle + if (this%icelltype(n) > 0) then + botm = this%disl%reach_bottom(n) + ! -- only apply Newton-Raphson under-relaxation if + ! solution head is below the bottom of the model + if (x(n) < botm) then + inewtonur = 1 + xx = xtemp(n) * (DONE - DP9) + botm * DP9 + dxx = x(n) - xx + if (abs(dxx) > abs(dxmax)) then + locmax = n + dxmax = dxx + end if + x(n) = xx + dx(n) = DZERO + end if + end if + end do + ! + ! -- return + return + end subroutine dfw_nur + + subroutine dfw_cq(this, stage, stage_old, flowja) + ! -- dummy + class(SwfDfwType) :: this + real(DP), intent(inout), dimension(:) :: stage + real(DP), intent(inout), dimension(:) :: stage_old + real(DP), intent(inout), dimension(:) :: flowja + ! -- local + integer(I4B) :: n, ipos, m + real(DP) :: qnm + ! + ! + do n = 1, this%dis%nodes + do ipos = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1 + m = this%dis%con%ja(ipos) + if (m < n) cycle + qnm = this%qcalc(n, m, stage(n), stage(m)) + flowja(ipos) = qnm + flowja(this%dis%con%isym(ipos)) = -qnm + end do + end do + + ! + ! -- Return + return + end subroutine dfw_cq + + !> @ brief Model budget calculation for package + !! + !! Budget calculation for the DFW package components. Components include + !! external outflow + !! + !< + subroutine dfw_bd(this, isuppress_output, model_budget) + ! -- modules + use BudgetModule, only: BudgetType + ! -- dummy variables + class(SwfDfwType) :: this !< SwfDfwType object + integer(I4B), intent(in) :: isuppress_output !< flag to suppress model output + type(BudgetType), intent(inout) :: model_budget !< model budget object + ! -- local variables + ! + ! -- Add any DFW budget terms + ! none + ! + ! -- return + return + end subroutine dfw_bd + + !> @ brief save flows for package + !< + subroutine dfw_save_model_flows(this, flowja, icbcfl, icbcun) + ! -- dummy + class(SwfDfwType) :: this + real(DP), dimension(:), intent(in) :: flowja + integer(I4B), intent(in) :: icbcfl + integer(I4B), intent(in) :: icbcun + ! -- local + integer(I4B) :: ibinun + ! -- formats + ! + ! -- Set unit number for binary output + if (this%ipakcb < 0) then + ibinun = icbcun + elseif (this%ipakcb == 0) then + ibinun = 0 + else + ibinun = this%ipakcb + end if + if (icbcfl == 0) ibinun = 0 + ! + ! -- Write the face flows if requested + if (ibinun /= 0) then + ! + ! -- flowja + call this%dis%record_connection_array(flowja, ibinun, this%iout) + + end if + ! + ! -- Return + return + end subroutine dfw_save_model_flows + + !> @ brief print flows for package + !< + subroutine dfw_print_model_flows(this, ibudfl, flowja) + ! -- modules + use TdisModule, only: kper, kstp + use ConstantsModule, only: LENBIGLINE + ! -- dummy + class(SwfDfwType) :: this + integer(I4B), intent(in) :: ibudfl + real(DP), intent(inout), dimension(:) :: flowja + ! -- local + character(len=LENBIGLINE) :: line + character(len=30) :: tempstr + integer(I4B) :: n, ipos, m + real(DP) :: qnm + ! -- formats + character(len=*), parameter :: fmtiprflow = & + &"(/,4x,'CALCULATED INTERCELL FLOW FOR PERIOD ', i0, ' STEP ', i0)" + ! -- Write flowja to list file if requested + if (ibudfl /= 0 .and. this%iprflow > 0) then + write (this%iout, fmtiprflow) kper, kstp + do n = 1, this%dis%nodes + line = '' + call this%dis%noder_to_string(n, tempstr) + line = trim(tempstr)//':' + do ipos = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1 + m = this%dis%con%ja(ipos) + call this%dis%noder_to_string(m, tempstr) + line = trim(line)//' '//trim(tempstr) + qnm = flowja(ipos) + write (tempstr, '(1pg15.6)') qnm + line = trim(line)//' '//trim(adjustl(tempstr)) + end do + write (this%iout, '(a)') trim(line) + end do + end if + ! + ! -- Return + return + end subroutine dfw_print_model_flows + + !> @brief deallocate memory + !< + subroutine dfw_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + use MemoryManagerExtModule, only: memorylist_remove + use SimVariablesModule, only: idm_context + ! -- dummy + class(SwfDfwType) :: this + ! + ! -- Deallocate input memory + call memorylist_remove(this%name_model, 'DFW', idm_context) + ! + ! -- Scalars + call mem_deallocate(this%icentral) + call mem_deallocate(this%unitconv) + call mem_deallocate(this%lengthconv) + call mem_deallocate(this%timeconv) + ! + ! -- Deallocate arrays + call mem_deallocate(this%width) + call mem_deallocate(this%manningsn) + call mem_deallocate(this%slope) + call mem_deallocate(this%idcxs) + call mem_deallocate(this%icelltype) + + ! -- obs package + call mem_deallocate(this%inobspkg) + call this%obs%obs_da() + deallocate (this%obs) + nullify (this%obs) + nullify (this%disl) + nullify (this%cxs) + + ! -- deallocate parent + call this%NumericalPackageType%da() + ! + ! -- Return + return + end subroutine dfw_da + + !> @brief Define the observation types available in the package + !! + !! Method to define the observation types available in the package. + !! + !< + subroutine dfw_df_obs(this) + ! -- dummy variables + class(SwfDfwType) :: this !< SwfDfwType object + ! -- local variables + integer(I4B) :: indx + ! + ! -- Store obs type and assign procedure pointer + ! for ext-outflow observation type. + call this%obs%StoreObsType('ext-outflow', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => dfwobsidprocessor + ! + ! -- return + return + end subroutine dfw_df_obs + + subroutine dfwobsidprocessor(obsrv, dis, inunitobs, iout) + ! -- dummy + type(ObserveType), intent(inout) :: obsrv + class(DisBaseType), intent(in) :: dis + integer(I4B), intent(in) :: inunitobs + integer(I4B), intent(in) :: iout + ! -- local + integer(I4B) :: n + character(len=LINELENGTH) :: strng + ! + ! -- Initialize variables + strng = obsrv%IDstring + read (strng, *) n + ! + if (n > 0) then + obsrv%NodeNumber = n + else + errmsg = 'Error reading data from ID string' + call store_error(errmsg) + call store_error_unit(inunitobs) + end if + ! + return + end subroutine dfwobsidprocessor + + !> @brief Save observations for the package + !! + !! Method to save simulated values for the package. + !! + !< + subroutine dfw_bd_obs(this) + ! -- dummy variables + class(SwfDfwType) :: this !< SwfDfwType object + ! -- local variables + integer(I4B) :: i + integer(I4B) :: j + integer(I4B) :: n + real(DP) :: v + character(len=100) :: msg + type(ObserveType), pointer :: obsrv => null() + ! + ! Write simulated values for all observations + if (this%obs%npakobs > 0) then + call this%obs%obs_bd_clear() + do i = 1, this%obs%npakobs + obsrv => this%obs%pakobs(i)%obsrv + do j = 1, obsrv%indxbnds_count + n = obsrv%indxbnds(j) + v = DZERO + select case (obsrv%ObsTypeId) + case default + msg = 'Unrecognized observation type: '//trim(obsrv%ObsTypeId) + call store_error(msg) + end select + call this%obs%SaveOneSimval(obsrv, v) + end do + end do + ! + ! -- write summary of package error messages + if (count_errors() > 0) then + call this%parser%StoreErrorUnit() + end if + end if + ! + ! -- return + return + end subroutine dfw_bd_obs + + !> @brief Read and prepare observations for a package + !! + !! Method to read and prepare observations for a package. + !! + !< + subroutine dfw_rp_obs(this) + ! -- modules + use TdisModule, only: kper + ! -- dummy variables + class(SwfDfwType), intent(inout) :: this !< SwfDfwType object + ! -- local variables + integer(I4B) :: i + integer(I4B) :: j + integer(I4B) :: nn1 + class(ObserveType), pointer :: obsrv => null() + ! -- formats + ! + ! -- process each package observation + ! only done the first stress period since boundaries are fixed + ! for the simulation + if (kper == 1) then + do i = 1, this%obs%npakobs + obsrv => this%obs%pakobs(i)%obsrv + ! + ! -- get node number 1 + nn1 = obsrv%NodeNumber + if (nn1 < 1 .or. nn1 > this%disl%nodes) then + write (errmsg, '(a,1x,a,1x,i0,1x,a,1x,i0,a)') & + trim(adjustl(obsrv%ObsTypeId)), & + 'reach must be greater than 0 and less than or equal to', & + this%disl%nodes, '(specified value is ', nn1, ')' + call store_error(errmsg) + else + if (obsrv%indxbnds_count == 0) then + call obsrv%AddObsIndex(nn1) + else + errmsg = 'Programming error in dfw_rp_obs' + call store_error(errmsg) + end if + end if + ! + ! -- check that node number 1 is valid; call store_error if not + do j = 1, obsrv%indxbnds_count + nn1 = obsrv%indxbnds(j) + if (nn1 < 1 .or. nn1 > this%disl%nodes) then + write (errmsg, '(a,1x,a,1x,i0,1x,a,1x,i0,a)') & + trim(adjustl(obsrv%ObsTypeId)), & + 'reach must be greater than 0 and less than or equal to', & + this%disl%nodes, '(specified value is ', nn1, ')' + call store_error(errmsg) + end if + end do + end do + ! + ! -- evaluate if there are any observation errors + if (count_errors() > 0) then + call this%parser%StoreErrorUnit() + end if + end if + ! + ! -- return + return + end subroutine dfw_rp_obs + +end module SwfDfwModule diff --git a/src/Model/SurfaceWaterFlow/swf1dfw1idm.f90 b/src/Model/SurfaceWaterFlow/swf1dfw1idm.f90 new file mode 100644 index 00000000000..57c6a7d55e3 --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1dfw1idm.f90 @@ -0,0 +1,307 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module SwfDfwInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public swf_dfw_param_definitions + public swf_dfw_aggregate_definitions + public swf_dfw_block_definitions + public SwfDfwParamFoundType + public swf_dfw_multi_package + + type SwfDfwParamFoundType + logical :: icentral = .false. + logical :: lengthconv = .false. + logical :: timeconv = .false. + logical :: ipakcb = .false. + logical :: iprflow = .false. + logical :: obs_filerecord = .false. + logical :: obs6 = .false. + logical :: filein = .false. + logical :: obs6_filename = .false. + logical :: width = .false. + logical :: manningsn = .false. + logical :: slope = .false. + logical :: idcxs = .false. + end type SwfDfwParamFoundType + + logical :: swf_dfw_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + swfdfw_icentral = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DFW', & ! subcomponent + 'OPTIONS', & ! block + 'CENTRAL_IN_SPACE', & ! tag name + 'ICENTRAL', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdfw_lengthconv = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DFW', & ! subcomponent + 'OPTIONS', & ! block + 'LENGTH_CONVERSION', & ! tag name + 'LENGTHCONV', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdfw_timeconv = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DFW', & ! subcomponent + 'OPTIONS', & ! block + 'TIME_CONVERSION', & ! tag name + 'TIMECONV', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdfw_ipakcb = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DFW', & ! subcomponent + 'OPTIONS', & ! block + 'SAVE_FLOWS', & ! tag name + 'IPAKCB', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdfw_iprflow = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DFW', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_FLOWS', & ! tag name + 'IPRFLOW', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdfw_obs_filerecord = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DFW', & ! subcomponent + 'OPTIONS', & ! block + 'OBS_FILERECORD', & ! tag name + 'OBS_FILERECORD', & ! fortran variable + 'RECORD OBS6 FILEIN OBS6_FILENAME', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdfw_obs6 = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DFW', & ! subcomponent + 'OPTIONS', & ! block + 'OBS6', & ! tag name + 'OBS6', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdfw_filein = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DFW', & ! subcomponent + 'OPTIONS', & ! block + 'FILEIN', & ! tag name + 'FILEIN', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdfw_obs6_filename = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DFW', & ! subcomponent + 'OPTIONS', & ! block + 'OBS6_FILENAME', & ! tag name + 'OBS6_FILENAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdfw_width = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DFW', & ! subcomponent + 'GRIDDATA', & ! block + 'WIDTH', & ! tag name + 'WIDTH', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdfw_manningsn = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DFW', & ! subcomponent + 'GRIDDATA', & ! block + 'MANNINGSN', & ! tag name + 'MANNINGSN', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdfw_slope = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DFW', & ! subcomponent + 'GRIDDATA', & ! block + 'SLOPE', & ! tag name + 'SLOPE', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdfw_idcxs = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DFW', & ! subcomponent + 'GRIDDATA', & ! block + 'IDCXS', & ! tag name + 'IDCXS', & ! fortran variable + 'INTEGER1D', & ! type + 'NODES', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_dfw_param_definitions(*) = & + [ & + swfdfw_icentral, & + swfdfw_lengthconv, & + swfdfw_timeconv, & + swfdfw_ipakcb, & + swfdfw_iprflow, & + swfdfw_obs_filerecord, & + swfdfw_obs6, & + swfdfw_filein, & + swfdfw_obs6_filename, & + swfdfw_width, & + swfdfw_manningsn, & + swfdfw_slope, & + swfdfw_idcxs & + ] + + type(InputParamDefinitionType), parameter :: & + swf_dfw_aggregate_definitions(*) = & + [ & + InputParamDefinitionType & + ( & + '', & ! component + '', & ! subcomponent + '', & ! block + '', & ! tag name + '', & ! fortran variable + '', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) & + ] + + type(InputBlockDefinitionType), parameter :: & + swf_dfw_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'GRIDDATA', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module SwfDfwInputModule diff --git a/src/Model/SurfaceWaterFlow/swf1disl1.f90 b/src/Model/SurfaceWaterFlow/swf1disl1.f90 new file mode 100644 index 00000000000..614d67e5e79 --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1disl1.f90 @@ -0,0 +1,1164 @@ +module SwfDislModule + + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: LENMEMPATH, LENVARNAME, DZERO, DONE, LINELENGTH + use SimVariablesModule, only: errmsg, warnmsg + use MemoryHelperModule, only: create_mem_path + use MemoryManagerModule, only: mem_allocate + use SimModule, only: count_errors, store_error, store_error_unit, & + store_warning + use InputOutputModule, only: urword + use BaseDisModule, only: DisBaseType + use DislGeom, only: calcdist, partialdist + + implicit none + + private + public :: disl_cr + public :: SwfDislType + + type, extends(DisBaseType) :: SwfDislType + integer(I4B), pointer :: nvert => null() !< number of x,y vertices + real(DP), pointer :: convlength => null() !< conversion factor for length + real(DP), pointer :: convtime => null() !< conversion factor for time + real(DP), dimension(:), pointer, contiguous :: reach_length => null() !< length of each reach + real(DP), dimension(:), pointer, contiguous :: reach_bottom => null() !< reach bottom elevation + integer(I4B), dimension(:), pointer, contiguous :: toreach => null() !< downstream reach index (nodes) + integer(I4B), dimension(:), pointer, contiguous :: idomain => null() !< idomain (nodes) + real(DP), dimension(:, :), pointer, contiguous :: vertices => null() !< cell vertices stored as 2d array with columns of x, y, and z + real(DP), dimension(:, :), pointer, contiguous :: cellxyz => null() !< reach midpoints stored as 2d array with columns of x, y, and z + real(DP), dimension(:), pointer, contiguous :: fdc => null() !< fdc stored as array + integer(I4B), dimension(:), pointer, contiguous :: iavert => null() !< cell vertex pointer ia array + integer(I4B), dimension(:), pointer, contiguous :: javert => null() !< cell vertex pointer ja array + logical(LGP) :: toreachConnectivity = .false. !< flag to indicate build connectivity from toreach instead of vertices + contains + procedure :: disl_load + procedure :: dis_da => disl_da + procedure, public :: record_array + procedure, public :: record_srcdst_list_header + ! -- private + procedure :: allocate_scalars + procedure :: allocate_arrays + procedure :: source_options + procedure :: source_dimensions + procedure :: source_griddata + procedure :: source_vertices + procedure :: source_cell2d + procedure :: log_options + procedure :: log_dimensions + procedure :: log_griddata + procedure :: define_cellverts + procedure :: grid_finalize + !procedure :: connect + procedure :: create_connections + procedure :: write_grb + procedure :: get_nodenumber_idx1 + procedure :: nodeu_to_string + procedure :: nodeu_from_string + + end type SwfDislType + +contains + + subroutine disl_cr(dis, name_model, input_mempath, inunit, iout) + ! -- modules + use KindModule, only: LGP + use MemoryManagerExtModule, only: mem_set_value + ! -- dummy + class(DisBaseType), pointer :: dis + character(len=*), intent(in) :: name_model + character(len=*), intent(in) :: input_mempath + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + ! -- locals + type(SwfDislType), pointer :: disnew + logical(LGP) :: found_fname + character(len=*), parameter :: fmtheader = & + "(1X, /1X, 'DISL -- LINE NETWORK DISCRETIZATION PACKAGE,', & + &' VERSION 1 : 3/30/2023 - INPUT READ FROM MEMPATH: ', A, /)" + allocate (disnew) + dis => disnew + call disnew%allocate_scalars(name_model, input_mempath) + dis%input_mempath = input_mempath + dis%inunit = inunit + dis%iout = iout + ! + ! -- set name of input file + call mem_set_value(dis%input_fname, 'INPUT_FNAME', dis%input_mempath, & + found_fname) + ! + ! -- If dis enabled + if (inunit > 0) then + + ! -- Identify package + if (iout > 0) then + write (iout, fmtheader) dis%input_mempath + end if + + ! -- load disl + call disnew%disl_load() + + end if + ! + ! -- Return + return + end subroutine disl_cr + + !> @brief Allocate scalar variables + !< + subroutine allocate_scalars(this, name_model, input_mempath) + ! -- modules + use MemoryManagerModule, only: mem_allocate + use ConstantsModule, only: DONE + ! -- dummy + class(SwfDislType) :: this + character(len=*), intent(in) :: name_model + character(len=*), intent(in) :: input_mempath + ! + ! -- Allocate parent scalars + call this%DisBaseType%allocate_scalars(name_model, input_mempath) + ! + ! -- Allocate + call mem_allocate(this%nvert, 'NVERT', this%memoryPath) + call mem_allocate(this%convlength, 'CONVLENGTH', this%memoryPath) + call mem_allocate(this%convtime, 'CONVTIME', this%memoryPath) + ! + ! -- Initialize + this%nvert = 0 + this%ndim = 1 + this%convlength = DONE + this%convtime = DONE + ! + ! -- Return + return + end subroutine allocate_scalars + + subroutine disl_load(this) + ! -- dummy + class(SwfDislType) :: this + ! -- locals + ! + ! -- source input data + call this%source_options() + call this%source_dimensions() + call this%source_griddata() + + ! If vertices provided by user, read and store vertices + if (this%nvert > 0) then + call this%source_vertices() + call this%source_cell2d() + end if + + ! create connectivity using toreach or vertices and cell2d + call this%create_connections() + + ! finalize the grid + call this%grid_finalize() + ! + ! -- Return + return + end subroutine disl_load + + !> @brief Copy options from IDM into package + !< + subroutine source_options(this) + ! -- modules + use KindModule, only: LGP + use MemoryManagerExtModule, only: mem_set_value + use SimVariablesModule, only: idm_context + use SwfDislInputModule, only: SwfDislParamFoundType + ! -- dummy + class(SwfDislType) :: this + ! -- locals + character(len=LENMEMPATH) :: idmMemoryPath + character(len=LENVARNAME), dimension(3) :: lenunits = & + &[character(len=LENVARNAME) :: 'FEET', 'METERS', 'CENTIMETERS'] + type(SwfDislParamFoundType) :: found + ! + ! -- set memory path + idmMemoryPath = create_mem_path(this%name_model, 'DISL', idm_context) + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%lenuni, 'LENGTH_UNITS', & + idmMemoryPath, lenunits, found%length_units) + call mem_set_value(this%convlength, 'CONVLENGTH', & + idmMemoryPath, found%length_convert) + call mem_set_value(this%convtime, 'CONVTIME', & + idmMemoryPath, found%time_convert) + call mem_set_value(this%nogrb, 'NOGRB', & + idmMemoryPath, found%nogrb) + call mem_set_value(this%xorigin, 'XORIGIN', & + idmMemoryPath, found%xorigin) + call mem_set_value(this%yorigin, 'YORIGIN', & + idmMemoryPath, found%yorigin) + call mem_set_value(this%angrot, 'ANGROT', & + idmMemoryPath, found%angrot) + ! + ! -- log values to list file + if (this%iout > 0) then + call this%log_options(found) + end if + ! + ! -- Return + return + end subroutine source_options + + !> @brief Write user options to list file + !< + subroutine log_options(this, found) + use SwfDislInputModule, only: SwfDislParamFoundType + class(SwfDislType) :: this + type(SwfDislParamFoundType), intent(in) :: found + + write (this%iout, '(1x,a)') 'Setting Discretization Options' + + if (found%length_units) then + write (this%iout, '(4x,a,i0)') 'Model length unit [0=UND, 1=FEET, & + &2=METERS, 3=CENTIMETERS] set as ', this%lenuni + end if + + if (found%nogrb) then + write (this%iout, '(4x,a,i0)') 'Binary grid file [0=GRB, 1=NOGRB] & + &set as ', this%nogrb + end if + + if (found%xorigin) then + write (this%iout, '(4x,a,G0)') 'XORIGIN = ', this%xorigin + end if + + if (found%yorigin) then + write (this%iout, '(4x,a,G0)') 'YORIGIN = ', this%yorigin + end if + + if (found%angrot) then + write (this%iout, '(4x,a,G0)') 'ANGROT = ', this%angrot + end if + + if (found%length_convert) then + write (this%iout, '(4x,a,G0)') 'LENGTH_CONVERSION = ', this%convlength + end if + + if (found%time_convert) then + write (this%iout, '(4x,a,G0)') 'TIME_CONVERSION = ', this%convtime + end if + + write (this%iout, '(1x,a,/)') 'End Setting Discretization Options' + + end subroutine log_options + + !> @brief Copy dimensions from IDM into package + !< + subroutine source_dimensions(this) + use KindModule, only: LGP + use MemoryManagerExtModule, only: mem_set_value + use SimVariablesModule, only: idm_context + use SwfDislInputModule, only: SwfDislParamFoundType + ! -- dummy + class(SwfDislType) :: this + ! -- locals + character(len=LENMEMPATH) :: idmMemoryPath + integer(I4B) :: n + type(SwfDislParamFoundType) :: found + ! + ! -- set memory path + idmMemoryPath = create_mem_path(this%name_model, 'DISL', idm_context) + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%nodes, 'NODES', idmMemoryPath, found%nodes) + call mem_set_value(this%nvert, 'NVERT', idmMemoryPath, found%nvert) + ! + ! -- for now assume nodes = nodesuser + this%nodesuser = this%nodes + ! + ! -- log simulation values + if (this%iout > 0) then + call this%log_dimensions(found) + end if + ! + ! -- verify dimensions were set + if (this%nodesuser < 1) then + call store_error( & + 'NODES was not specified or was specified incorrectly.') + call store_error_unit(this%inunit) + end if + if (this%nvert < 1) then + call store_warning( & + 'NVERT was not specified or was specified as zero. The & + &VERTICES and CELL2D blocks will not be read for the DISL6 & + &Package in model '//trim(this%memoryPath)//'.') + end if + ! + ! -- Allocate non-reduced vectors for disl + call mem_allocate(this%reach_length, this%nodesuser, & + 'REACH_LENGTH', this%memoryPath) + call mem_allocate(this%reach_bottom, this%nodesuser, & + 'REACH_BOTTOM', this%memoryPath) + call mem_allocate(this%toreach, this%nodesuser, & + 'TOREACH', this%memoryPath) + call mem_allocate(this%idomain, this%nodesuser, & + 'IDOMAIN', this%memoryPath) + ! + ! -- Allocate vertices array + if (this%nvert > 0) then + call mem_allocate(this%vertices, 3, this%nvert, & + 'VERTICES', this%memoryPath) + call mem_allocate(this%fdc, this%nodesuser, & + 'FDC', this%memoryPath) + call mem_allocate(this%cellxyz, 3, this%nodesuser, & + 'CELLXYZ', this%memoryPath) + end if + ! + ! -- initialize all cells to be active (idomain = 1) + do n = 1, this%nodesuser + this%reach_length(n) = DZERO + this%reach_bottom(n) = DZERO + this%toreach(n) = 0 + this%idomain(n) = 1 + end do + ! + ! -- Return + return + end subroutine source_dimensions + + !> @brief Write dimensions to list file + !< + subroutine log_dimensions(this, found) + use SwfDislInputModule, only: SwfDislParamFoundType + class(SwfDislType) :: this + type(SwfDislParamFoundType), intent(in) :: found + + write (this%iout, '(1x,a)') 'Setting Discretization Dimensions' + + if (found%nodes) then + write (this%iout, '(4x,a,i0)') 'NODES = ', this%nodesuser + end if + + if (found%nvert) then + write (this%iout, '(4x,a,i0)') 'NVERT = ', this%nvert + end if + + write (this%iout, '(1x,a,/)') 'End Setting Discretization Dimensions' + + end subroutine log_dimensions + + subroutine source_griddata(this) + ! -- modules + use MemoryManagerExtModule, only: mem_set_value + use SimVariablesModule, only: idm_context + use SwfDislInputModule, only: SwfDislParamFoundType + ! -- dummy + class(SwfDislType) :: this + ! -- locals + character(len=LENMEMPATH) :: idmMemoryPath + type(SwfDislParamFoundType) :: found + ! -- formats + ! + ! -- set memory path + idmMemoryPath = create_mem_path(this%name_model, 'DISL', idm_context) + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%reach_length, 'REACH_LENGTH', idmMemoryPath, & + found%reach_length) + call mem_set_value(this%reach_bottom, 'REACH_BOTTOM', idmMemoryPath, & + found%reach_bottom) + call mem_set_value(this%toreach, 'TOREACH', idmMemoryPath, & + found%toreach) + if (found%toreach) then + this%toreachConnectivity = .true. + end if + call mem_set_value(this%idomain, 'IDOMAIN', idmMemoryPath, found%idomain) + ! + ! -- log simulation values + if (this%iout > 0) then + call this%log_griddata(found) + end if + ! + ! -- Return + return + end subroutine source_griddata + + !> @brief Write griddata found to list file + !< + subroutine log_griddata(this, found) + use SwfDislInputModule, only: SwfDislParamFoundType + class(SwfDislType) :: this + type(SwfDislParamFoundType), intent(in) :: found + + write (this%iout, '(1x,a)') 'Setting Discretization Griddata' + + if (found%reach_length) then + write (this%iout, '(4x,a)') 'REACH_LENGTH set from input file' + end if + + if (found%reach_bottom) then + write (this%iout, '(4x,a)') 'REACH_BOTTOM set from input file' + end if + + if (found%toreach) then + write (this%iout, '(4x,a)') 'TOREACH set from input file' + end if + + if (found%idomain) then + write (this%iout, '(4x,a)') 'IDOMAIN set from input file' + end if + + write (this%iout, '(1x,a,/)') 'End Setting Discretization Griddata' + + end subroutine log_griddata + + !> @brief Copy vertex information from input data context + !! to model context + !< + subroutine source_vertices(this) + ! -- modules + use MemoryManagerModule, only: mem_setptr + use MemoryManagerExtModule, only: mem_set_value + use SimVariablesModule, only: idm_context + ! -- dummy + class(SwfDislType) :: this + ! -- local + integer(I4B) :: i + character(len=LENMEMPATH) :: idmMemoryPath + real(DP), dimension(:), contiguous, pointer :: vert_x => null() + real(DP), dimension(:), contiguous, pointer :: vert_y => null() + real(DP), dimension(:), contiguous, pointer :: vert_z => null() + ! -- formats +! ------------------------------------------------------------------------------ + ! + ! -- set memory path + idmMemoryPath = create_mem_path(this%name_model, 'DISL', idm_context) + ! + ! -- set pointers to memory manager input arrays + call mem_setptr(vert_x, 'XV', idmMemoryPath) + call mem_setptr(vert_y, 'YV', idmMemoryPath) + call mem_setptr(vert_z, 'ZV', idmMemoryPath) + ! + ! -- set vertices 3d array + if (associated(vert_x) .and. associated(vert_y) .and. & + associated(vert_z)) then + do i = 1, this%nvert + this%vertices(1, i) = vert_x(i) + this%vertices(2, i) = vert_y(i) + this%vertices(3, i) = vert_z(i) + end do + else + call store_error('Required Vertex arrays not found.') + end if + ! + ! -- log + if (this%iout > 0) then + write (this%iout, '(1x,a)') 'Setting Discretization Vertices' + write (this%iout, '(1x,a,/)') 'End setting discretization vertices' + end if + ! + ! -- Return + return + end subroutine source_vertices + + !> @brief Copy cell2d information from input data context + !! to model context + !< + subroutine source_cell2d(this) + ! -- modules + use MemoryHelperModule, only: create_mem_path + use MemoryManagerModule, only: mem_setptr + use MemoryManagerExtModule, only: mem_set_value + use SimVariablesModule, only: idm_context + ! -- dummy + class(SwfDislType) :: this + ! -- locals + character(len=LENMEMPATH) :: idmMemoryPath + integer(I4B), dimension(:), contiguous, pointer :: icell2d => null() + integer(I4B), dimension(:), contiguous, pointer :: ncvert => null() + integer(I4B), dimension(:), contiguous, pointer :: icvert => null() + real(DP), dimension(:), contiguous, pointer :: fdc => null() + integer(I4B) :: i + ! -- formats + ! + ! -- set memory path + idmMemoryPath = create_mem_path(this%name_model, 'DISL', idm_context) + ! + ! -- set pointers to input path ncvert and icvert + call mem_setptr(icell2d, 'ICELL2D', idmMemoryPath) + call mem_setptr(ncvert, 'NCVERT', idmMemoryPath) + call mem_setptr(icvert, 'ICVERT', idmMemoryPath) + ! + ! -- + if (associated(icell2d) .and. associated(ncvert) & + .and. associated(icvert)) then + call this%define_cellverts(icell2d, ncvert, icvert) + else + call store_error('Required cell vertex arrays not found.') + end if + ! + ! -- set pointers to cell center arrays + call mem_setptr(fdc, 'FDC', idmMemoryPath) + ! + ! -- set fractional distance to cell center + if (associated(fdc)) then + do i = 1, this%nodesuser + this%fdc(i) = fdc(i) + end do + call calculate_cellxyz(this%vertices, this%fdc, this%iavert, & + this%javert, this%cellxyz) + else + call store_error('Required fdc array not found.') + end if + ! + ! -- log + if (this%iout > 0) then + write (this%iout, '(1x,a)') 'Setting Discretization CELL2D' + write (this%iout, '(1x,a,/)') 'End Setting Discretization CELL2D' + end if + ! + ! -- Return + return + end subroutine source_cell2d + + !> @brief Construct the iavert and javert integer vectors which + !! are compressed sparse row index arrays that relate the vertices + !! to reaches + !< + subroutine define_cellverts(this, icell2d, ncvert, icvert) + ! -- modules + use SparseModule, only: sparsematrix + ! -- dummy + class(SwfDislType) :: this + integer(I4B), dimension(:), contiguous, pointer, intent(in) :: icell2d + integer(I4B), dimension(:), contiguous, pointer, intent(in) :: ncvert + integer(I4B), dimension(:), contiguous, pointer, intent(in) :: icvert + ! -- locals + type(sparsematrix) :: vert_spm + integer(I4B) :: i, j, ierr + integer(I4B) :: icv_idx, startvert, maxnnz = 2 +! ------------------------------------------------------------------------------ + ! + ! -- initialize sparse matrix + call vert_spm%init(this%nodesuser, this%nvert, maxnnz) + ! + ! -- add sparse matrix connections from input memory paths + icv_idx = 1 + do i = 1, this%nodesuser + if (icell2d(i) /= i) call store_error('ICELL2D input sequence violation.') + do j = 1, ncvert(i) + call vert_spm%addconnection(i, icvert(icv_idx), 0) + if (j == 1) then + startvert = icvert(icv_idx) + end if + icv_idx = icv_idx + 1 + end do + end do + ! + ! -- allocate and fill iavert and javert + call mem_allocate(this%iavert, this%nodesuser + 1, 'IAVERT', this%memoryPath) + call mem_allocate(this%javert, vert_spm%nnz, 'JAVERT', this%memoryPath) + call vert_spm%filliaja(this%iavert, this%javert, ierr) + call vert_spm%destroy() + ! + ! -- Return + return + end subroutine define_cellverts + + !> @brief Calculate x, y, z coordinates of reach midpoint + !< + subroutine calculate_cellxyz(vertices, fdc, iavert, javert, cellxyz) + ! -- dummy + real(DP), dimension(:, :), intent(in) :: vertices !< 2d array of vertices with x, y, and z as columns + real(DP), dimension(:), intent(in) :: fdc !< fractional distance to reach midpoint (normally 0.5) + integer(I4B), dimension(:), intent(in) :: iavert !< csr mapping of vertices to cell reaches + integer(I4B), dimension(:), intent(in) :: javert !< csr mapping of vertices to cell reaches + real(DP), dimension(:, :), intent(inout) :: cellxyz !< 2d array of reach midpoint with x, y, and z as columns + ! -- local + integer(I4B) :: nodes !< number of nodes + integer(I4B) :: n !< node index + integer(I4B) :: j !< vertex index + integer(I4B) :: iv0 !< index for line reach start + integer(I4B) :: iv1 !< index for linen reach end + integer(I4B) :: ixyz !< x, y, z column index + real(DP) :: reach_length !< reach length = sum of individual line reaches + real(DP) :: fd0 !< fractional distance to start of this line reach + real(DP) :: fd1 !< fractional distance to end fo this line reach + real(DP) :: fd !< fractional distance where midpoint (defined by fdc) is located + real(DP) :: d !< distance + + nodes = size(iavert) - 1 + do n = 1, nodes + + ! calculate length of this reach + reach_length = DZERO + do j = iavert(n), iavert(n + 1) - 2 + reach_length = reach_length + & + calcdist(vertices, javert(j), javert(j + 1)) + end do + + ! find vertices that span midpoint + iv0 = 0 + iv1 = 0 + fd0 = DZERO + do j = iavert(n), iavert(n + 1) - 2 + d = calcdist(vertices, javert(j), javert(j + 1)) + fd1 = fd0 + d / reach_length + + ! if true, then we know the midpoint is some fractional distance (fd) + ! from vertex j to vertex j + 1 + if (fd1 >= fdc(n)) then + iv0 = javert(j) + iv1 = javert(j + 1) + fd = (fdc(n) - fd0) / (fd1 - fd0) + exit + end if + fd0 = fd1 + end do + + ! find x, y, z position of point on line + do ixyz = 1, 3 + cellxyz(ixyz, n) = (DONE - fd) * vertices(ixyz, iv0) + & + fd * vertices(ixyz, iv1) + end do + + end do + end subroutine calculate_cellxyz + + !> @brief Finalize grid construction + !< + subroutine grid_finalize(this) + ! -- modules + use SimModule, only: ustop, count_errors, store_error + use ConstantsModule, only: LINELENGTH, DZERO, DONE + ! -- dummy + class(SwfDislType) :: this + ! -- locals + integer(I4B) :: node, noder, k + ! -- formats + ! -- data + ! + ! -- count active cells + this%nodes = 0 + do k = 1, this%nodesuser + if (this%idomain(k) > 0) this%nodes = this%nodes + 1 + end do + ! + ! -- Check to make sure nodes is a valid number + if (this%nodes == 0) then + call store_error('MODEL DOES NOT HAVE ANY ACTIVE NODES.') + call store_error('MAKE SURE IDOMAIN ARRAY HAS SOME VALUES GREATER & + &THAN ZERO.') + call this%parser%StoreErrorUnit() + call ustop() + end if + + if (count_errors() > 0) then + call this%parser%StoreErrorUnit() + call ustop() + end if + ! + ! -- Array size is now known, so allocate + call this%allocate_arrays() + ! + ! -- Fill the nodereduced array with the reduced nodenumber, or + ! a negative number to indicate it is a pass-through cell, or + ! a zero to indicate that the cell is excluded from the + ! solution. + if (this%nodes < this%nodesuser) then + node = 1 + noder = 1 + do k = 1, this%nodesuser + if (this%idomain(k) > 0) then + this%nodereduced(node) = noder + noder = noder + 1 + elseif (this%idomain(k) < 0) then + this%nodereduced(node) = -1 + else + this%nodereduced(node) = 0 + end if + node = node + 1 + end do + end if + ! + ! -- allocate and fill nodeuser if a reduced grid + if (this%nodes < this%nodesuser) then + node = 1 + noder = 1 + do k = 1, this%nodesuser + if (this%idomain(k) > 0) then + this%nodeuser(noder) = node + noder = noder + 1 + end if + node = node + 1 + end do + end if + + ! -- Return + return + end subroutine grid_finalize + + subroutine allocate_arrays(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(SwfDislType) :: this + ! + ! -- Allocate arrays in DisBaseType (mshape, top, bot, area) + ! todo: disbasetype will have memory allocated for unneeded arrays + call this%DisBaseType%allocate_arrays() + ! + ! -- Allocate arrays + if (this%nodes < this%nodesuser) then + call mem_allocate(this%nodeuser, this%nodes, 'NODEUSER', this%memoryPath) + call mem_allocate(this%nodereduced, this%nodesuser, 'NODEREDUCED', & + this%memoryPath) + else + call mem_allocate(this%nodeuser, 1, 'NODEUSER', this%memoryPath) + call mem_allocate(this%nodereduced, 1, 'NODEREDUCED', this%memoryPath) + end if + ! + ! -- Initialize + this%mshape(1) = this%nodesuser + ! + ! -- Return + return + end subroutine allocate_arrays + + subroutine create_connections(this) + ! -- modules + ! -- dummy + class(SwfDislType) :: this + ! -- local + integer(I4B) :: nrsize + ! + ! -- create and fill the connections object + nrsize = 0 + if (this%nodes < this%nodesuser) nrsize = this%nodes + ! + ! -- Allocate connections object + allocate (this%con) + ! + ! -- Create connectivity + if (this%toreachConnectivity) then + ! -- build connectivity based on toreach + call this%con%dislconnections(this%name_model, this%toreach) + else + ! -- build connectivity based on vertices + call this%con%dislconnections_verts(this%name_model, this%nodes, & + this%nodesuser, nrsize, this%nvert, & + this%vertices, this%iavert, & + this%javert, this%cellxyz, this%fdc, & + this%nodereduced, this%nodeuser) + end if + + this%nja = this%con%nja + this%njas = this%con%njas + + ! + ! + ! -- return + return + end subroutine create_connections + + !> @brief Write binary grid file + !< + subroutine write_grb(this, icelltype) + ! -- modules + use InputOutputModule, only: getunit, openfile + use OpenSpecModule, only: access, form + ! -- dummy + class(SwfDislType) :: this + integer(I4B), dimension(:), intent(in) :: icelltype + ! -- local + integer(I4B) :: i, iunit, ntxt + integer(I4B), parameter :: lentxt = 100 + character(len=50) :: txthdr + character(len=lentxt) :: txt + character(len=LINELENGTH) :: fname + character(len=*), parameter :: fmtgrdsave = & + "(4X,'BINARY GRID INFORMATION WILL BE WRITTEN TO:', & + &/,6X,'UNIT NUMBER: ', I0,/,6X, 'FILE NAME: ', A)" + ! + ! -- Initialize + ntxt = 9 + if (this%nvert > 0) ntxt = ntxt + 6 + ! + ! -- Open the file + fname = trim(this%input_fname)//'.grb' + iunit = getunit() + write (this%iout, fmtgrdsave) iunit, trim(adjustl(fname)) + call openfile(iunit, this%iout, trim(adjustl(fname)), 'DATA(BINARY)', & + form, access, 'REPLACE') + ! + ! -- write header information + write (txthdr, '(a)') 'GRID DISL' + txthdr(50:50) = new_line('a') + write (iunit) txthdr + write (txthdr, '(a)') 'VERSION 1' + txthdr(50:50) = new_line('a') + write (iunit) txthdr + write (txthdr, '(a, i0)') 'NTXT ', ntxt + txthdr(50:50) = new_line('a') + write (iunit) txthdr + write (txthdr, '(a, i0)') 'LENTXT ', lentxt + txthdr(50:50) = new_line('a') + write (iunit) txthdr + ! + ! -- write variable definitions + write (txt, '(3a, i0)') 'NODES ', 'INTEGER ', 'NDIM 0 # ', this%nodesuser + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'NJA ', 'INTEGER ', 'NDIM 0 # ', this%con%nja + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, 1pg24.15)') 'XORIGIN ', 'DOUBLE ', 'NDIM 0 # ', this%xorigin + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, 1pg24.15)') 'YORIGIN ', 'DOUBLE ', 'NDIM 0 # ', this%yorigin + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, 1pg24.15)') 'ANGROT ', 'DOUBLE ', 'NDIM 0 # ', this%angrot + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'IA ', 'INTEGER ', 'NDIM 1 ', this%nodesuser + 1 + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'JA ', 'INTEGER ', 'NDIM 1 ', this%con%nja + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'ICELLTYPE ', 'INTEGER ', 'NDIM 1 ', this%nodesuser + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'IDOMAIN ', 'INTEGER ', 'NDIM 1 ', this%nodesuser + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + ! + ! -- if vertices have been read then write additional header information + if (this%nvert > 0) then + write (txt, '(3a, i0)') 'VERTICES ', 'DOUBLE ', 'NDIM 2 3 ', this%nvert + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'CELLX ', 'DOUBLE ', 'NDIM 1 ', this%nodesuser + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'CELLY ', 'DOUBLE ', 'NDIM 1 ', this%nodesuser + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'CELLZ ', 'DOUBLE ', 'NDIM 1 ', this%nodesuser + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'IAVERT ', 'INTEGER ', 'NDIM 1 ', this%nodesuser + 1 + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'JAVERT ', 'INTEGER ', 'NDIM 1 ', size(this%javert) + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + end if + ! + ! -- write data + write (iunit) this%nodesuser ! nodes + write (iunit) this%nja ! nja + write (iunit) this%xorigin ! xorigin + write (iunit) this%yorigin ! yorigin + write (iunit) this%angrot ! angrot + write (iunit) this%con%iausr ! ia + write (iunit) this%con%jausr ! ja + write (iunit) icelltype ! icelltype + write (iunit) this%idomain ! idomain + ! + ! -- if vertices have been read then write additional data + if (this%nvert > 0) then + write (iunit) this%vertices ! vertices + write (iunit) (this%cellxyz(1, i), i=1, this%nodesuser) ! cellx + write (iunit) (this%cellxyz(2, i), i=1, this%nodesuser) ! celly + write (iunit) (this%cellxyz(3, i), i=1, this%nodesuser) ! cellz + write (iunit) this%iavert ! iavert + write (iunit) this%javert ! javert + end if + ! + ! -- Close the file + close (iunit) + ! + ! -- return + return + end subroutine write_grb + + !> + !! Return a nodenumber from the user specified node number with an + !! option to perform a check. This subroutine can be overridden by + !! child classes to perform mapping to a model node number + !< + function get_nodenumber_idx1(this, nodeu, icheck) result(nodenumber) + class(SwfDislType), intent(in) :: this + integer(I4B), intent(in) :: nodeu + integer(I4B), intent(in) :: icheck + integer(I4B) :: nodenumber + ! + if (icheck /= 0) then + if (nodeu < 1 .or. nodeu > this%nodes) then + write (errmsg, '(a,i10)') & + 'Nodenumber less than 1 or greater than nodes:', nodeu + call store_error(errmsg) + end if + end if + ! + ! -- set node number based on wheter it is reduced or not + if (this%nodes == this%nodesuser) then + nodenumber = nodeu + else + nodenumber = this%nodereduced(nodeu) + end if + ! + ! -- return + return + end function get_nodenumber_idx1 + + subroutine nodeu_to_string(this, nodeu, str) + ! -- dummy + class(SwfDislType) :: this + integer(I4B), intent(in) :: nodeu + character(len=*), intent(inout) :: str + ! -- local + character(len=10) :: nstr + ! + write (nstr, '(i0)') nodeu + str = '('//trim(adjustl(nstr))//')' + ! + ! -- return + return + end subroutine nodeu_to_string + + !> + !! nodeu_from_string -- Receive a string and convert the string to a user + !! nodenumber. The model is unstructured; just read user nodenumber. + !! If flag_string argument is present and true, the first token in string + !! is allowed to be a string (e.g. boundary name). In this case, if a string + !! is encountered, return value as -2. + !< + function nodeu_from_string(this, lloc, istart, istop, in, iout, line, & + flag_string, allow_zero) result(nodeu) + ! -- dummy + class(SwfDislType) :: this + integer(I4B), intent(inout) :: lloc + integer(I4B), intent(inout) :: istart + integer(I4B), intent(inout) :: istop + integer(I4B), intent(in) :: in + integer(I4B), intent(in) :: iout + character(len=*), intent(inout) :: line + logical, optional, intent(in) :: flag_string + logical, optional, intent(in) :: allow_zero + integer(I4B) :: nodeu + ! -- local + integer(I4B) :: lloclocal, ndum, istat, n + real(DP) :: r + ! + if (present(flag_string)) then + if (flag_string) then + ! Check to see if first token in line can be read as an integer. + lloclocal = lloc + call urword(line, lloclocal, istart, istop, 1, ndum, r, iout, in) + read (line(istart:istop), *, iostat=istat) n + if (istat /= 0) then + ! First token in line is not an integer; return flag to this effect. + nodeu = -2 + return + end if + end if + end if + ! + call urword(line, lloc, istart, istop, 2, nodeu, r, iout, in) + ! + if (nodeu == 0) then + if (present(allow_zero)) then + if (allow_zero) then + return + end if + end if + end if + ! + if (nodeu < 1 .or. nodeu > this%nodesuser) then + write (errmsg, '(a,i0,a)') & + "Node number in list (", nodeu, ") is outside of the grid. "// & + "Cell number cannot be determined in line '"// & + trim(adjustl(line))//"'." + call store_error(errmsg) + call store_error_unit(in) + end if + ! + ! -- return + return + + end function nodeu_from_string + + subroutine disl_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + use MemoryManagerExtModule, only: memorylist_remove + use SimVariablesModule, only: idm_context + ! -- dummy + class(SwfDislType) :: this + ! -- local + logical(LGP) :: deallocate_vertices + ! + ! -- Deallocate idm memory + call memorylist_remove(this%name_model, 'DISL', idm_context) + ! + ! -- scalars + deallocate_vertices = (this%nvert > 0) + call mem_deallocate(this%nvert) + call mem_deallocate(this%convlength) + call mem_deallocate(this%convtime) + ! + ! -- arrays + call mem_deallocate(this%nodeuser) + call mem_deallocate(this%nodereduced) + call mem_deallocate(this%reach_length) + call mem_deallocate(this%reach_bottom) + call mem_deallocate(this%toreach) + call mem_deallocate(this%idomain) + ! + ! -- cdl hack for arrays for vertices and cell2d blocks + if (deallocate_vertices) then + call mem_deallocate(this%vertices) + call mem_deallocate(this%fdc) + call mem_deallocate(this%cellxyz) + call mem_deallocate(this%iavert) + call mem_deallocate(this%javert) + end if + ! + ! -- DisBaseType deallocate + call this%DisBaseType%dis_da() + ! + ! -- Return + return + end subroutine disl_da + + !> @brief Record a double precision array + !! + !! Record a double precision array. The array will be + !! printed to an external file and/or written to an unformatted external file + !! depending on the argument specifications. + !< + subroutine record_array(this, darray, iout, iprint, idataun, aname, & + cdatafmp, nvaluesp, nwidthp, editdesc, dinact) + ! -- modules + use TdisModule, only: kstp, kper, pertim, totim, delt + use InputOutputModule, only: ulasav, ulaprufw, ubdsv1 + ! -- dummy + class(SwfDislType), intent(inout) :: this + real(DP), dimension(:), pointer, contiguous, intent(inout) :: darray !< double precision array to record + integer(I4B), intent(in) :: iout !< unit number for ascii output + integer(I4B), intent(in) :: iprint !< flag indicating whether or not to print the array + integer(I4B), intent(in) :: idataun !< unit number to which the array will be written in binary + character(len=*), intent(in) :: aname !< text descriptor of the array + character(len=*), intent(in) :: cdatafmp ! fortran format for writing the array + integer(I4B), intent(in) :: nvaluesp !< number of values per line for printing + integer(I4B), intent(in) :: nwidthp !< width of the number for printing + character(len=*), intent(in) :: editdesc !< format type (I, G, F, S, E) + real(DP), intent(in) :: dinact !< double precision value to use for cells that are excluded from model domain + ! -- local + integer(I4B) :: k, ifirst + integer(I4B) :: nlay + integer(I4B) :: nrow + integer(I4B) :: ncol + integer(I4B) :: nval + integer(I4B) :: nodeu, noder + integer(I4B) :: istart, istop + real(DP), dimension(:), pointer, contiguous :: dtemp + ! -- formats + character(len=*), parameter :: fmthsv = & + "(1X,/1X,a,' WILL BE SAVED ON UNIT ',I4, & + &' AT END OF TIME STEP',I5,', STRESS PERIOD ',I4)" + ! + ! -- set variables + nlay = 1 + nrow = 1 + ncol = this%mshape(1) + ! + ! -- If this is a reduced model, then copy the values from darray into + ! dtemp. + if (this%nodes < this%nodesuser) then + nval = this%nodes + dtemp => this%dbuff + do nodeu = 1, this%nodesuser + noder = this%get_nodenumber(nodeu, 0) + if (noder <= 0) then + dtemp(nodeu) = dinact + cycle + end if + dtemp(nodeu) = darray(noder) + end do + else + nval = this%nodes + dtemp => darray + end if + ! + ! -- Print to iout if iprint /= 0 + if (iprint /= 0) then + istart = 1 + do k = 1, nlay + istop = istart + nrow * ncol - 1 + call ulaprufw(ncol, nrow, kstp, kper, k, iout, dtemp(istart:istop), & + aname, cdatafmp, nvaluesp, nwidthp, editdesc) + istart = istop + 1 + end do + end if + ! + ! -- Save array to an external file. + if (idataun > 0) then + ! -- write to binary file by layer + ifirst = 1 + istart = 1 + do k = 1, nlay + istop = istart + nrow * ncol - 1 + if (ifirst == 1) write (iout, fmthsv) & + trim(adjustl(aname)), idataun, & + kstp, kper + ifirst = 0 + call ulasav(dtemp(istart:istop), aname, kstp, kper, & + pertim, totim, ncol, nrow, k, idataun) + istart = istop + 1 + end do + elseif (idataun < 0) then + ! + ! -- write entire array as one record + call ubdsv1(kstp, kper, aname, -idataun, dtemp, ncol, nrow, nlay, & + iout, delt, pertim, totim) + end if + ! + ! -- return + return + end subroutine record_array + + !> @brief Record list header using ubdsv06 + !< + subroutine record_srcdst_list_header(this, text, textmodel, textpackage, & + dstmodel, dstpackage, naux, auxtxt, & + ibdchn, nlist, iout) + ! -- module + use TdisModule, only: kstp, kper, pertim, totim, delt + use InputOutputModule, only: ubdsv06 + ! -- dummy + class(SwfDislType) :: this + character(len=16), intent(in) :: text + character(len=16), intent(in) :: textmodel + character(len=16), intent(in) :: textpackage + character(len=16), intent(in) :: dstmodel + character(len=16), intent(in) :: dstpackage + integer(I4B), intent(in) :: naux + character(len=16), dimension(:), intent(in) :: auxtxt + integer(I4B), intent(in) :: ibdchn + integer(I4B), intent(in) :: nlist + integer(I4B), intent(in) :: iout + ! -- local + integer(I4B) :: nlay, nrow, ncol + ! + nlay = 1 + nrow = 1 + ncol = this%mshape(1) + ! + ! -- Use ubdsv06 to write list header + call ubdsv06(kstp, kper, text, textmodel, textpackage, dstmodel, dstpackage, & + ibdchn, naux, auxtxt, ncol, nrow, nlay, & + nlist, iout, delt, pertim, totim) + ! + ! -- return + return + end subroutine record_srcdst_list_header + +end module SwfDislModule diff --git a/src/Model/SurfaceWaterFlow/swf1disl1idm.f90 b/src/Model/SurfaceWaterFlow/swf1disl1idm.f90 new file mode 100644 index 00000000000..6095075646c --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1disl1idm.f90 @@ -0,0 +1,498 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module SwfDislInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public swf_disl_param_definitions + public swf_disl_aggregate_definitions + public swf_disl_block_definitions + public SwfDislParamFoundType + public swf_disl_multi_package + + type SwfDislParamFoundType + logical :: length_units = .false. + logical :: length_convert = .false. + logical :: time_convert = .false. + logical :: nogrb = .false. + logical :: xorigin = .false. + logical :: yorigin = .false. + logical :: angrot = .false. + logical :: nodes = .false. + logical :: nvert = .false. + logical :: reach_length = .false. + logical :: reach_bottom = .false. + logical :: toreach = .false. + logical :: idomain = .false. + logical :: iv = .false. + logical :: xv = .false. + logical :: yv = .false. + logical :: zv = .false. + logical :: icell2d = .false. + logical :: fdc = .false. + logical :: ncvert = .false. + logical :: icvert = .false. + end type SwfDislParamFoundType + + logical :: swf_disl_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + swfdisl_length_units = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'OPTIONS', & ! block + 'LENGTH_UNITS', & ! tag name + 'LENGTH_UNITS', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_length_convert = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'OPTIONS', & ! block + 'LENGTH_CONVERT', & ! tag name + 'LENGTH_CONVERT', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_time_convert = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'OPTIONS', & ! block + 'TIME_CONVERT', & ! tag name + 'TIME_CONVERT', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_nogrb = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'OPTIONS', & ! block + 'NOGRB', & ! tag name + 'NOGRB', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_xorigin = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'OPTIONS', & ! block + 'XORIGIN', & ! tag name + 'XORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_yorigin = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'OPTIONS', & ! block + 'YORIGIN', & ! tag name + 'YORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_angrot = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'OPTIONS', & ! block + 'ANGROT', & ! tag name + 'ANGROT', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_nodes = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'DIMENSIONS', & ! block + 'NODES', & ! tag name + 'NODES', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_nvert = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'DIMENSIONS', & ! block + 'NVERT', & ! tag name + 'NVERT', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_reach_length = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'GRIDDATA', & ! block + 'REACH_LENGTH', & ! tag name + 'REACH_LENGTH', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_reach_bottom = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'GRIDDATA', & ! block + 'REACH_BOTTOM', & ! tag name + 'REACH_BOTTOM', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_toreach = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'GRIDDATA', & ! block + 'TOREACH', & ! tag name + 'TOREACH', & ! fortran variable + 'INTEGER1D', & ! type + 'NODES', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_idomain = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'GRIDDATA', & ! block + 'IDOMAIN', & ! tag name + 'IDOMAIN', & ! fortran variable + 'INTEGER1D', & ! type + 'NODES', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_iv = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'VERTICES', & ! block + 'IV', & ! tag name + 'IV', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_xv = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'VERTICES', & ! block + 'XV', & ! tag name + 'XV', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_yv = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'VERTICES', & ! block + 'YV', & ! tag name + 'YV', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_zv = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'VERTICES', & ! block + 'ZV', & ! tag name + 'ZV', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_icell2d = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'CELL2D', & ! block + 'ICELL2D', & ! tag name + 'ICELL2D', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_fdc = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'CELL2D', & ! block + 'FDC', & ! tag name + 'FDC', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_ncvert = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'CELL2D', & ! block + 'NCVERT', & ! tag name + 'NCVERT', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_icvert = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'CELL2D', & ! block + 'ICVERT', & ! tag name + 'ICVERT', & ! fortran variable + 'INTEGER1D', & ! type + 'NCVERT', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_disl_param_definitions(*) = & + [ & + swfdisl_length_units, & + swfdisl_length_convert, & + swfdisl_time_convert, & + swfdisl_nogrb, & + swfdisl_xorigin, & + swfdisl_yorigin, & + swfdisl_angrot, & + swfdisl_nodes, & + swfdisl_nvert, & + swfdisl_reach_length, & + swfdisl_reach_bottom, & + swfdisl_toreach, & + swfdisl_idomain, & + swfdisl_iv, & + swfdisl_xv, & + swfdisl_yv, & + swfdisl_zv, & + swfdisl_icell2d, & + swfdisl_fdc, & + swfdisl_ncvert, & + swfdisl_icvert & + ] + + type(InputParamDefinitionType), parameter :: & + swfdisl_vertices = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'VERTICES', & ! block + 'VERTICES', & ! tag name + 'VERTICES', & ! fortran variable + 'RECARRAY IV XV YV ZV', & ! type + 'NVERT', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisl_cell2d = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'CELL2D', & ! block + 'CELL2D', & ! tag name + 'CELL2D', & ! fortran variable + 'RECARRAY ICELL2D FDC NCVERT ICVERT', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_disl_aggregate_definitions(*) = & + [ & + swfdisl_vertices, & + swfdisl_cell2d & + ] + + type(InputBlockDefinitionType), parameter :: & + swf_disl_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'GRIDDATA', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'VERTICES', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'CELL2D', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module SwfDislInputModule diff --git a/src/Model/SurfaceWaterFlow/swf1flw1.f90 b/src/Model/SurfaceWaterFlow/swf1flw1.f90 new file mode 100644 index 00000000000..8cd22ebac4f --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1flw1.f90 @@ -0,0 +1,533 @@ +!> @brief This module contains the FLW package methods +!! +!! This module can be used to represent inflow to streams. It is based +!! on the GWF WEL package. +!! +!< +module SwfFlwModule + ! -- modules + use KindModule, only: DP, I4B + use ConstantsModule, only: DZERO, DEM1, DONE, LENFTYPE, DNODATA, & + LINELENGTH + use SimVariablesModule, only: errmsg + use SimModule, only: store_error, store_error_filename + use MemoryHelperModule, only: create_mem_path + use BndModule, only: BndType + use BndExtModule, only: BndExtType + use ObsModule, only: DefaultObsIdProcessor + use SmoothingModule, only: sQSaturation, sQSaturationDerivative + use ObserveModule, only: ObserveType + use TimeSeriesLinkModule, only: TimeSeriesLinkType, & + GetTimeSeriesLinkFromList + use BlockParserModule, only: BlockParserType + use InputOutputModule, only: GetUnit, openfile + use MatrixBaseModule + ! + implicit none + ! + private + public :: flw_create + ! + character(len=LENFTYPE) :: ftype = 'FLW' !< package ftype + character(len=16) :: text = ' FLW' !< package flow text string + ! + type, extends(BndExtType) :: SwfFlwType + real(DP), dimension(:), pointer, contiguous :: q => null() !< volumetric rate + contains + procedure :: allocate_scalars => flw_allocate_scalars + procedure :: allocate_arrays => flw_allocate_arrays + procedure :: source_options => flw_options + procedure :: log_flw_options + procedure :: bnd_rp => flw_rp + procedure :: bnd_cf => flw_cf + procedure :: bnd_fc => flw_fc + procedure :: bnd_da => flw_da + procedure :: define_listlabel + procedure :: bound_value => flw_bound_value + procedure :: q_mult + ! -- methods for observations + procedure, public :: bnd_obs_supported => flw_obs_supported + procedure, public :: bnd_df_obs => flw_df_obs + procedure, public :: bnd_bd_obs => flw_bd_obs + ! -- methods for time series + procedure, public :: bnd_rp_ts => flw_rp_ts + end type SwfFlwType + +contains + + !> @ brief Create a new package object + !! + !! Create a new FLW Package object + !! + !< + subroutine flw_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, & + mempath) + ! -- dummy variables + class(BndType), pointer :: packobj !< pointer to default package type + integer(I4B), intent(in) :: id !< package id + integer(I4B), intent(in) :: ibcnum !< boundary condition number + integer(I4B), intent(in) :: inunit !< unit number of FLW package input file + integer(I4B), intent(in) :: iout !< unit number of model listing file + character(len=*), intent(in) :: namemodel !< model name + character(len=*), intent(in) :: pakname !< package name + character(len=*), intent(in) :: mempath !< input mempath + ! -- local variables + type(SwfFlwType), pointer :: flwobj + ! + ! -- allocate the object and assign values to object variables + allocate (flwobj) + packobj => flwobj + ! + ! -- create name and memory path + call packobj%set_names(ibcnum, namemodel, pakname, ftype, mempath) + packobj%text = text + ! + ! -- allocate scalars + call flwobj%allocate_scalars() + ! + ! -- initialize package + call packobj%pack_initialize() + + packobj%inunit = inunit + packobj%iout = iout + packobj%id = id + packobj%ibcnum = ibcnum + packobj%ncolbnd = 1 + packobj%iscloc = 1 + packobj%ictMemPath = '' + ! + ! -- return + return + end subroutine flw_create + + !> @ brief Allocate scalars + !! + !! Allocate and initialize scalars for the FLW package. The base model + !! allocate scalars method is also called. + !! + !< + subroutine flw_allocate_scalars(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy variables + class(SwfFlwType) :: this !< SwfFlwType object + ! + ! -- call base type allocate scalars + call this%BndExtType%allocate_scalars() + ! + ! -- allocate the object and assign values to object variables + ! none for this package + ! + ! -- Set values + ! none for this package + ! + ! -- return + return + end subroutine flw_allocate_scalars + + !> @ brief Allocate arrays + !! + !! Allocate and initialize arrays for the SWF package + !! + !< + subroutine flw_allocate_arrays(this, nodelist, auxvar) + ! -- modules + use MemoryManagerModule, only: mem_allocate, mem_setptr, mem_checkin + ! -- dummy + class(SwfFlwType) :: this + integer(I4B), dimension(:), pointer, contiguous, optional :: nodelist + real(DP), dimension(:, :), pointer, contiguous, optional :: auxvar + ! -- local + ! + ! -- call BndExtType allocate scalars + call this%BndExtType%allocate_arrays(nodelist, auxvar) + ! + ! -- set q array input context pointer + call mem_setptr(this%q, 'Q', this%input_mempath) + ! + ! -- checkin q array input context pointer + call mem_checkin(this%q, 'Q', this%memoryPath, & + 'Q', this%input_mempath) + ! + ! -- return + return + end subroutine flw_allocate_arrays + + !> @ brief Deallocate package memory + !! + !! Deallocate SWF package scalars and arrays. + !! + !< + subroutine flw_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + ! -- dummy variables + class(SwfFlwType) :: this !< SwfFlwType object + ! + ! -- Deallocate parent package + call this%BndExtType%bnd_da() + ! + ! -- scalars + call mem_deallocate(this%q, 'Q', this%memoryPath) + ! + ! -- return + return + end subroutine flw_da + + !> @ brief Source additional options for package + !! + !! Source additional options for SWF package. + !! + !< + subroutine flw_options(this) + ! -- modules + use InputOutputModule, only: urword + use MemoryManagerExtModule, only: mem_set_value + use SwfFlwInputModule, only: SwfFlwParamFoundType + ! -- dummy variables + class(SwfFlwType), intent(inout) :: this !< SwfFlwType object + ! -- local variables + type(SwfFlwParamFoundType) :: found + ! -- formats + ! + ! -- source base BndExtType options + call this%BndExtType%source_options() + ! + ! -- source options from input context + ! none + ! + ! -- log SWF specific options + call this%log_flw_options(found) + ! + ! -- return + return + end subroutine flw_options + + !> @ brief Log SWF specific package options + !< + subroutine log_flw_options(this, found) + ! -- modules + use SwfFlwInputModule, only: SwfFlwParamFoundType + ! -- dummy variables + class(SwfFlwType), intent(inout) :: this !< BndExtType object + type(SwfFlwParamFoundType), intent(in) :: found + ! -- local variables + ! -- format + ! + ! -- log found options + write (this%iout, '(/1x,a)') 'PROCESSING '//trim(adjustl(this%text)) & + //' OPTIONS' + ! + ! if (found%mover) then + ! write (this%iout, '(4x,A)') 'MOVER OPTION ENABLED' + ! end if + ! + ! -- close logging block + write (this%iout, '(1x,a)') & + 'END OF '//trim(adjustl(this%text))//' OPTIONS' + ! + ! -- return + return + end subroutine log_flw_options + + !> @ brief SWF read and prepare + !! + !< + subroutine flw_rp(this) + use TdisModule, only: kper + ! -- dummy + class(SwfFlwType), intent(inout) :: this + ! -- local + ! + if (this%iper /= kper) return + ! + ! -- Call the parent class read and prepare + call this%BndExtType%bnd_rp() + ! + ! -- Write the list to iout if requested + if (this%iprpak /= 0) then + call this%write_list() + end if + ! + ! -- return + return + end subroutine flw_rp + + !> @ brief Formulate the package hcof and rhs terms. + !! + !! Formulate the hcof and rhs terms for the FLW package that will be + !! added to the coefficient matrix and right-hand side vector. + !! + !< + subroutine flw_cf(this) + ! -- dummy variables + class(SwfFlwType) :: this !< SwfFlwType object + ! -- local variables + integer(I4B) :: i, node + real(DP) :: q + ! + ! -- Return if no inflows + if (this%nbound == 0) return + ! + ! -- Calculate hcof and rhs for each flw entry + do i = 1, this%nbound + node = this%nodelist(i) + this%hcof(i) = DZERO + if (this%ibound(node) <= 0) then + this%rhs(i) = DZERO + cycle + end if + q = this%q_mult(i) + this%rhs(i) = -q + end do + ! + return + end subroutine flw_cf + + !> @ brief Copy hcof and rhs terms into solution. + !! + !! Add the hcof and rhs terms for the FLW package to the + !! coefficient matrix and right-hand side vector. + !! + !< + subroutine flw_fc(this, rhs, ia, idxglo, matrix_sln) + ! -- dummy variables + class(SwfFlwType) :: this !< SwfFlwType object + real(DP), dimension(:), intent(inout) :: rhs !< right-hand side vector for model + integer(I4B), dimension(:), intent(in) :: ia !< solution CRS row pointers + integer(I4B), dimension(:), intent(in) :: idxglo !< mapping vector for model (local) to solution (global) + class(MatrixBaseType), pointer :: matrix_sln !< solution coefficient matrix + ! -- local variables + integer(I4B) :: i + integer(I4B) :: n + integer(I4B) :: ipos + ! + ! -- pakmvrobj fc + if (this%imover == 1) then + call this%pakmvrobj%fc() + end if + ! + ! -- Copy package rhs and hcof into solution rhs and amat + do i = 1, this%nbound + n = this%nodelist(i) + rhs(n) = rhs(n) + this%rhs(i) + ipos = ia(n) + call matrix_sln%add_value_pos(idxglo(ipos), this%hcof(i)) + ! + ! -- If mover is active and this flw item is discharging, + ! store available water (as positive value). + if (this%imover == 1 .and. this%rhs(i) > DZERO) then + call this%pakmvrobj%accumulate_qformvr(i, this%rhs(i)) + end if + end do + ! + ! -- return + return + end subroutine flw_fc + + !> @ brief Define the list label for the package + !! + !! Method defined the list label for the FLW package. The list label is + !! the heading that is written to iout when PRINT_INPUT option is used. + !! + !< + subroutine define_listlabel(this) + ! -- dummy variables + class(SwfFlwType), intent(inout) :: this !< SwfFlwType object + ! + ! -- create the header list label + this%listlabel = trim(this%filtyp)//' NO.' + if (this%dis%ndim == 3) then + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'ROW' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'COL' + elseif (this%dis%ndim == 2) then + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'CELL2D' + else + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'NODE' + end if + write (this%listlabel, '(a, a16)') trim(this%listlabel), 'FLOW RATE' + if (this%inamedbound == 1) then + write (this%listlabel, '(a, a16)') trim(this%listlabel), 'BOUNDARY NAME' + end if + ! + ! -- return + return + end subroutine define_listlabel + + ! -- Procedures related to observations + + !> @brief Determine if observations are supported. + !! + !! Function to determine if observations are supported by the FLW package. + !! Observations are supported by the FLW package. + !! + !! @return flw_obs_supported boolean indicating if observations are supported + !! + !< + logical function flw_obs_supported(this) + ! -- dummy variables + class(SwfFlwType) :: this !< SwfFlwType object + ! + ! -- set boolean + flw_obs_supported = .true. + ! + ! -- return + return + end function flw_obs_supported + + !> @brief Define the observation types available in the package + !! + !! Method to define the observation types available in the FLW package. + !! + !< + subroutine flw_df_obs(this) + ! -- dummy variables + class(SwfFlwType) :: this !< SwfFlwType object + ! -- local variables + integer(I4B) :: indx + ! + ! -- initialize observations + call this%obs%StoreObsType('flw', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => DefaultObsIdProcessor + ! + ! -- Store obs type and assign procedure pointer + ! for to-mvr observation type. + call this%obs%StoreObsType('to-mvr', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => DefaultObsIdProcessor + ! + ! -- return + return + end subroutine flw_df_obs + + !> @brief Save observations for the package + !! + !! Method to save simulated values for the FLW package. + !! + !< + subroutine flw_bd_obs(this) + ! -- dummy variables + class(SwfFlwType) :: this !< SwfFlwType object + ! -- local variables + integer(I4B) :: i + integer(I4B) :: n + integer(I4B) :: jj + real(DP) :: v + type(ObserveType), pointer :: obsrv => null() + ! + ! -- clear the observations + call this%obs%obs_bd_clear() + ! + ! -- Save simulated values for all of package's observations. + do i = 1, this%obs%npakobs + obsrv => this%obs%pakobs(i)%obsrv + if (obsrv%BndFound) then + do n = 1, obsrv%indxbnds_count + v = DNODATA + jj = obsrv%indxbnds(n) + select case (obsrv%ObsTypeId) + case ('TO-MVR') + if (this%imover == 1) then + v = this%pakmvrobj%get_qtomvr(jj) + if (v > DZERO) then + v = -v + end if + end if + case ('FLW') + v = this%simvals(jj) + case default + errmsg = 'Unrecognized observation type: '//trim(obsrv%ObsTypeId) + call store_error(errmsg) + end select + call this%obs%SaveOneSimval(obsrv, v) + end do + else + call this%obs%SaveOneSimval(obsrv, DNODATA) + end if + end do + ! + ! -- return + return + end subroutine flw_bd_obs + + ! -- Procedure related to time series + + !> @brief Assign time series links for the package + !! + !! Assign the time series links for the FLW package. Only + !! the Q variable can be defined with time series. + !! + !< + subroutine flw_rp_ts(this) + ! -- dummy variables + class(SwfFlwType), intent(inout) :: this !< SwfFlwType object + ! -- local variables + integer(I4B) :: i, nlinks + type(TimeSeriesLinkType), pointer :: tslink => null() + ! + ! -- set up the time series links + nlinks = this%TsManager%boundtslinks%Count() + do i = 1, nlinks + tslink => GetTimeSeriesLinkFromList(this%TsManager%boundtslinks, i) + if (associated(tslink)) then + if (tslink%JCol == 1) then + tslink%Text = 'Q' + end if + end if + end do + ! + ! -- return + return + end subroutine flw_rp_ts + + function q_mult(this, row) result(q) + ! -- modules + use ConstantsModule, only: DZERO + ! -- dummy variables + class(SwfFlwType), intent(inout) :: this !< BndExtType object + integer(I4B), intent(in) :: row + ! -- result + real(DP) :: q + ! + if (this%iauxmultcol > 0) then + q = this%q(row) * this%auxvar(this%iauxmultcol, row) + else + q = this%q(row) + end if + ! + ! -- return + return + end function q_mult + + !> @ brief Return a bound value + !! + !! Return a bound value associated with an ncolbnd index + !! and row. + !! + !< + function flw_bound_value(this, col, row) result(bndval) + ! -- modules + use ConstantsModule, only: DZERO + ! -- dummy variables + class(SwfFlwType), intent(inout) :: this !< BndExtType object + integer(I4B), intent(in) :: col + integer(I4B), intent(in) :: row + ! -- result + real(DP) :: bndval + ! + select case (col) + case (1) + bndval = this%q_mult(row) + case default + errmsg = 'Programming error. FLW bound value requested column '& + &'outside range of ncolbnd (1).' + call store_error(errmsg) + call store_error_filename(this%input_fname) + end select + ! + ! -- return + return + end function flw_bound_value + +end module SwfFlwModule diff --git a/src/Model/SurfaceWaterFlow/swf1flw1idm.f90 b/src/Model/SurfaceWaterFlow/swf1flw1idm.f90 new file mode 100644 index 00000000000..a5a624ba8cb --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1flw1idm.f90 @@ -0,0 +1,411 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module SwfFlwInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public swf_flw_param_definitions + public swf_flw_aggregate_definitions + public swf_flw_block_definitions + public SwfFlwParamFoundType + public swf_flw_multi_package + + type SwfFlwParamFoundType + logical :: auxiliary = .false. + logical :: auxmultname = .false. + logical :: boundnames = .false. + logical :: print_input = .false. + logical :: print_flows = .false. + logical :: save_flows = .false. + logical :: ts_filerecord = .false. + logical :: ts6 = .false. + logical :: filein = .false. + logical :: ts6_filename = .false. + logical :: obs_filerecord = .false. + logical :: obs6 = .false. + logical :: obs6_filename = .false. + logical :: maxbound = .false. + logical :: cellid = .false. + logical :: q = .false. + logical :: aux = .false. + logical :: boundname = .false. + end type SwfFlwParamFoundType + + logical :: swf_flw_multi_package = .true. + + type(InputParamDefinitionType), parameter :: & + swfflw_auxiliary = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'OPTIONS', & ! block + 'AUXILIARY', & ! tag name + 'AUXILIARY', & ! fortran variable + 'STRING', & ! type + 'NAUX', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_auxmultname = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'OPTIONS', & ! block + 'AUXMULTNAME', & ! tag name + 'AUXMULTNAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_boundnames = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'OPTIONS', & ! block + 'BOUNDNAMES', & ! tag name + 'BOUNDNAMES', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_print_input = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_INPUT', & ! tag name + 'PRINT_INPUT', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_print_flows = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_FLOWS', & ! tag name + 'PRINT_FLOWS', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_save_flows = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'OPTIONS', & ! block + 'SAVE_FLOWS', & ! tag name + 'SAVE_FLOWS', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_ts_filerecord = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'OPTIONS', & ! block + 'TS_FILERECORD', & ! tag name + 'TS_FILERECORD', & ! fortran variable + 'RECORD TS6 FILEIN TS6_FILENAME', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_ts6 = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'OPTIONS', & ! block + 'TS6', & ! tag name + 'TS6', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_filein = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'OPTIONS', & ! block + 'FILEIN', & ! tag name + 'FILEIN', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_ts6_filename = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'OPTIONS', & ! block + 'TS6_FILENAME', & ! tag name + 'TS6_FILENAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_obs_filerecord = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'OPTIONS', & ! block + 'OBS_FILERECORD', & ! tag name + 'OBS_FILERECORD', & ! fortran variable + 'RECORD OBS6 FILEIN OBS6_FILENAME', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_obs6 = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'OPTIONS', & ! block + 'OBS6', & ! tag name + 'OBS6', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_obs6_filename = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'OPTIONS', & ! block + 'OBS6_FILENAME', & ! tag name + 'OBS6_FILENAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_maxbound = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'DIMENSIONS', & ! block + 'MAXBOUND', & ! tag name + 'MAXBOUND', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_cellid = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'PERIOD', & ! block + 'CELLID', & ! tag name + 'CELLID', & ! fortran variable + 'INTEGER1D', & ! type + 'NCELLDIM', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_q = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'PERIOD', & ! block + 'Q', & ! tag name + 'Q', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .true. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_aux = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'PERIOD', & ! block + 'AUX', & ! tag name + 'AUX', & ! fortran variable + 'DOUBLE1D', & ! type + 'NAUX', & ! shape + .false., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .true. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfflw_boundname = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'PERIOD', & ! block + 'BOUNDNAME', & ! tag name + 'BOUNDNAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_flw_param_definitions(*) = & + [ & + swfflw_auxiliary, & + swfflw_auxmultname, & + swfflw_boundnames, & + swfflw_print_input, & + swfflw_print_flows, & + swfflw_save_flows, & + swfflw_ts_filerecord, & + swfflw_ts6, & + swfflw_filein, & + swfflw_ts6_filename, & + swfflw_obs_filerecord, & + swfflw_obs6, & + swfflw_obs6_filename, & + swfflw_maxbound, & + swfflw_cellid, & + swfflw_q, & + swfflw_aux, & + swfflw_boundname & + ] + + type(InputParamDefinitionType), parameter :: & + swfflw_spd = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'FLW', & ! subcomponent + 'PERIOD', & ! block + 'STRESS_PERIOD_DATA', & ! tag name + 'SPD', & ! fortran variable + 'RECARRAY CELLID Q AUX BOUNDNAME', & ! type + 'MAXBOUND', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_flw_aggregate_definitions(*) = & + [ & + swfflw_spd & + ] + + type(InputBlockDefinitionType), parameter :: & + swf_flw_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'PERIOD', & ! blockname + .true., & ! required + .true., & ! aggregate + .true. & ! block_variable + ) & + ] + +end module SwfFlwInputModule diff --git a/src/Model/SurfaceWaterFlow/swf1ic1.f90 b/src/Model/SurfaceWaterFlow/swf1ic1.f90 new file mode 100644 index 00000000000..add3abb220f --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1ic1.f90 @@ -0,0 +1,224 @@ +! -- SWF Initial Conditions Module +! replicated from GwfIcModule to use IDM + +module SwfIcModule + + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: LENMEMPATH + use SimVariablesModule, only: errmsg + use NumericalPackageModule, only: NumericalPackageType + use BlockParserModule, only: BlockParserType + use BaseDisModule, only: DisBaseType + + implicit none + private + public :: SwfIcType + public :: ic_cr + + ! -- Most of the SwfIcType functionality is replicated from GWF + type, extends(NumericalPackageType) :: SwfIcType + real(DP), dimension(:), pointer, contiguous :: strt => null() ! starting stage + contains + procedure :: ic_ar + procedure :: ic_da + procedure :: ic_load + procedure :: source_griddata + procedure :: log_griddata + procedure, private :: allocate_arrays + end type SwfIcType + +contains + + !> @brief create package + !< + subroutine ic_cr(ic, name_model, input_mempath, inunit, iout, dis) + ! -- modules + use MemoryManagerExtModule, only: mem_set_value + ! -- dummy + type(SwfIcType), pointer :: ic + character(len=*), intent(in) :: name_model + character(len=*), intent(in) :: input_mempath + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + class(DisBaseType), pointer, intent(in) :: dis + ! -- local + logical(LGP) :: found_fname + ! -- formats + character(len=*), parameter :: fmtheader = & + "(1x, /1x, 'IC -- INITIAL CONDITIONS (IC) PACKAGE, VERSION 1, 10/10/2023', & + &' INPUT READ FROM MEMPATH: ', A, /)" + ! + ! -- Create the object + allocate (ic) + ! + ! -- create name and memory path + call ic%set_names(1, name_model, 'IC', 'IC') + ! + ! -- Allocate scalars + call ic%allocate_scalars() + ! + ! -- Set variables + ic%input_mempath = input_mempath + ic%inunit = inunit + ic%iout = iout + ! + ! -- set name of input file + call mem_set_value(ic%input_fname, 'INPUT_FNAME', ic%input_mempath, & + found_fname) + ! + ! -- set pointers + ic%dis => dis + ! + ! -- check if ic is enabled + if (inunit > 0) then + + ! -- Print a message identifying the package. + write (iout, fmtheader) input_mempath + + ! -- allocate arrays + call ic%allocate_arrays() + + ! -- load ic + call ic%ic_load() + + end if + ! + ! -- Return + return + end subroutine ic_cr + + !> @brief allocate and read + !! + !! Set model dependent variable to initial conditions + !! + !< + subroutine ic_ar(this, x) + ! -- modules + use SimModule, only: store_error + ! -- dummy + class(SwfIcType) :: this + real(DP), dimension(:), intent(inout) :: x + ! -- locals + integer(I4B) :: n + ! + ! -- Assign x equal to strt + do n = 1, this%dis%nodes + x(n) = this%strt(n) + end do + ! + ! -- Return + return + end subroutine ic_ar + + subroutine ic_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + use MemoryManagerExtModule, only: memorylist_remove + use SimVariablesModule, only: idm_context + ! -- dummy + class(SwfIcType) :: this + ! + ! -- Deallocate input memory + call memorylist_remove(this%name_model, 'IC', idm_context) + ! + ! -- deallocate parent + call this%NumericalPackageType%da() + ! + ! -- Scalars + ! + ! -- Arrays + call mem_deallocate(this%strt) + ! + ! -- Return + return + end subroutine ic_da + + !> @brief load data from IDM to package + !< + subroutine ic_load(this) + ! -- dummy + class(SwfIcType) :: this + ! -- locals + ! + ! -- source input data + call this%source_griddata() + ! + ! -- Return + return + end subroutine ic_load + + !> @brief copy griddata from IDM to package + !< + subroutine source_griddata(this) + ! -- modules + use SimModule, only: count_errors, store_error + use MemoryHelperModule, only: create_mem_path + use MemoryManagerModule, only: mem_reallocate + use MemoryManagerExtModule, only: mem_set_value + use SimVariablesModule, only: idm_context + use SwfIcInputModule, only: SwfIcParamFoundType + ! -- dummy + class(SwfIcType) :: this + ! -- locals + character(len=LENMEMPATH) :: idmMemoryPath + type(SwfIcParamFoundType) :: found + integer(I4B), dimension(:), pointer, contiguous :: map + ! -- formats + ! + ! -- set memory path + idmMemoryPath = create_mem_path(this%name_model, 'IC', idm_context) + ! + ! -- set map to convert user input data into reduced data + map => null() + if (this%dis%nodes < this%dis%nodesuser) map => this%dis%nodeuser + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%strt, 'STRT', idmMemoryPath, map, found%strt) + ! + ! -- ensure STRT was found + if (.not. found%strt) then + write (errmsg, '(a)') 'Error in GRIDDATA block: STRT not found.' + call store_error(errmsg) + end if + ! + ! -- log griddata + if (this%iout > 0) then + call this%log_griddata(found) + end if + ! + ! -- Return + return + end subroutine source_griddata + + !> @brief log griddata to list file + !< + subroutine log_griddata(this, found) + use SwfIcInputModule, only: SwfIcParamFoundType + class(SwfIcType) :: this + type(SwfIcParamFoundType), intent(in) :: found + + write (this%iout, '(1x,a)') 'Setting IC Griddata' + + if (found%strt) then + write (this%iout, '(4x,a)') 'STRT set from input file' + end if + + write (this%iout, '(1x,a,/)') 'End Setting IC Griddata' + + end subroutine log_griddata + + subroutine allocate_arrays(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(SwfIcType) :: this + ! -- local + ! + ! -- Allocate + call mem_allocate(this%strt, this%dis%nodes, 'STRT', this%memoryPath) + ! + ! -- Return + return + end subroutine allocate_arrays + +end module SwfIcModule diff --git a/src/Model/SurfaceWaterFlow/swf1ic1idm.f90 b/src/Model/SurfaceWaterFlow/swf1ic1idm.f90 new file mode 100644 index 00000000000..3de7dc50ebe --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1ic1idm.f90 @@ -0,0 +1,79 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module SwfIcInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public swf_ic_param_definitions + public swf_ic_aggregate_definitions + public swf_ic_block_definitions + public SwfIcParamFoundType + public swf_ic_multi_package + + type SwfIcParamFoundType + logical :: strt = .false. + end type SwfIcParamFoundType + + logical :: swf_ic_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + swfic_strt = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'IC', & ! subcomponent + 'GRIDDATA', & ! block + 'STRT', & ! tag name + 'STRT', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_ic_param_definitions(*) = & + [ & + swfic_strt & + ] + + type(InputParamDefinitionType), parameter :: & + swf_ic_aggregate_definitions(*) = & + [ & + InputParamDefinitionType & + ( & + '', & ! component + '', & ! subcomponent + '', & ! block + '', & ! tag name + '', & ! fortran variable + '', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) & + ] + + type(InputBlockDefinitionType), parameter :: & + swf_ic_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'GRIDDATA', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module SwfIcInputModule diff --git a/src/Model/SurfaceWaterFlow/swf1idm.f90 b/src/Model/SurfaceWaterFlow/swf1idm.f90 new file mode 100644 index 00000000000..4c2a1879210 --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1idm.f90 @@ -0,0 +1,253 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module SwfNamInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public swf_nam_param_definitions + public swf_nam_aggregate_definitions + public swf_nam_block_definitions + public SwfNamParamFoundType + public swf_nam_multi_package + + type SwfNamParamFoundType + logical :: list = .false. + logical :: print_input = .false. + logical :: print_flows = .false. + logical :: save_flows = .false. + logical :: newtonoptions = .false. + logical :: newton = .false. + logical :: under_relaxation = .false. + logical :: ftype = .false. + logical :: fname = .false. + logical :: pname = .false. + end type SwfNamParamFoundType + + logical :: swf_nam_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + swfnam_list = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'LIST', & ! tag name + 'LIST', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfnam_print_input = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_INPUT', & ! tag name + 'PRINT_INPUT', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfnam_print_flows = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_FLOWS', & ! tag name + 'PRINT_FLOWS', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfnam_save_flows = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'SAVE_FLOWS', & ! tag name + 'SAVE_FLOWS', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfnam_newtonoptions = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'NEWTONOPTIONS', & ! tag name + 'NEWTONOPTIONS', & ! fortran variable + 'RECORD NEWTON UNDER_RELAXATION', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfnam_newton = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'NEWTON', & ! tag name + 'NEWTON', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfnam_under_relaxation = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'UNDER_RELAXATION', & ! tag name + 'UNDER_RELAXATION', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfnam_ftype = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'NAM', & ! subcomponent + 'PACKAGES', & ! block + 'FTYPE', & ! tag name + 'FTYPE', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfnam_fname = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'NAM', & ! subcomponent + 'PACKAGES', & ! block + 'FNAME', & ! tag name + 'FNAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfnam_pname = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'NAM', & ! subcomponent + 'PACKAGES', & ! block + 'PNAME', & ! tag name + 'PNAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_nam_param_definitions(*) = & + [ & + swfnam_list, & + swfnam_print_input, & + swfnam_print_flows, & + swfnam_save_flows, & + swfnam_newtonoptions, & + swfnam_newton, & + swfnam_under_relaxation, & + swfnam_ftype, & + swfnam_fname, & + swfnam_pname & + ] + + type(InputParamDefinitionType), parameter :: & + swfnam_packages = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'NAM', & ! subcomponent + 'PACKAGES', & ! block + 'PACKAGES', & ! tag name + 'PACKAGES', & ! fortran variable + 'RECARRAY FTYPE FNAME PNAME', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_nam_aggregate_definitions(*) = & + [ & + swfnam_packages & + ] + + type(InputBlockDefinitionType), parameter :: & + swf_nam_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'PACKAGES', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module SwfNamInputModule diff --git a/src/Model/SurfaceWaterFlow/swf1obs1.f90 b/src/Model/SurfaceWaterFlow/swf1obs1.f90 new file mode 100644 index 00000000000..4a38cdbdce6 --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1obs1.f90 @@ -0,0 +1,310 @@ +module SwfObsModule + + use KindModule, only: DP, I4B + use ConstantsModule, only: LINELENGTH, MAXOBSTYPES + use BaseDisModule, only: DisBaseType + use SwfIcModule, only: SwfIcType + use ObserveModule, only: ObserveType + use ObsModule, only: ObsType + use SimModule, only: count_errors, store_error, & + store_error_unit + implicit none + + private + public :: SwfObsType, swf_obs_cr + + type, extends(ObsType) :: SwfObsType + ! -- Private members + type(SwfIcType), pointer, private :: ic => null() ! initial conditions + real(DP), dimension(:), pointer, contiguous, private :: x => null() ! stage + real(DP), dimension(:), pointer, contiguous, private :: flowja => null() ! intercell flows + contains + ! -- Public procedures + procedure, public :: swf_obs_ar + procedure, public :: obs_bd => swf_obs_bd + procedure, public :: obs_df => swf_obs_df + procedure, public :: obs_rp => swf_obs_rp + procedure, public :: obs_da => swf_obs_da + ! -- Private procedures + procedure, private :: set_pointers + end type SwfObsType + +contains + + subroutine swf_obs_cr(obs, inobs) +! ****************************************************************************** +! swf_obs_cr -- Create a new SwfObsType object +! Subroutine: (1) creates object +! (2) allocates pointers +! (3) initializes values +! ****************************************************************************** +! +! SPECIFICATIONS: +! ------------------------------------------------------------------------------ + ! -- dummy + type(SwfObsType), pointer, intent(out) :: obs + integer(I4B), pointer, intent(in) :: inobs +! ------------------------------------------------------------------------------ + ! + allocate (obs) + call obs%allocate_scalars() + obs%active = .false. + obs%inputFilename = '' + obs%inUnitObs => inobs + ! + return + end subroutine swf_obs_cr + + subroutine swf_obs_ar(this, ic, x, flowja) +! ****************************************************************************** +! swf_obs_ar -- allocate and read +! ****************************************************************************** +! +! SPECIFICATIONS: +! ------------------------------------------------------------------------------ + ! -- dummy + class(SwfObsType), intent(inout) :: this + type(SwfIcType), pointer, intent(in) :: ic + real(DP), dimension(:), pointer, contiguous, intent(in) :: x + real(DP), dimension(:), pointer, contiguous, intent(in) :: flowja +! ------------------------------------------------------------------------------ + ! + ! Call ar method of parent class + call this%obs_ar() + ! + ! set pointers + call this%set_pointers(ic, x, flowja) + ! + return + end subroutine swf_obs_ar + + subroutine swf_obs_df(this, iout, pkgname, filtyp, dis) +! ****************************************************************************** +! swf_obs_df -- define +! ****************************************************************************** +! +! SPECIFICATIONS: +! ------------------------------------------------------------------------------ + ! -- dummy + class(SwfObsType), intent(inout) :: this + integer(I4B), intent(in) :: iout + character(len=*), intent(in) :: pkgname + character(len=*), intent(in) :: filtyp + class(DisBaseType), pointer :: dis + ! -- local + integer(I4B) :: indx +! ------------------------------------------------------------------------------ + ! + ! Call overridden method of parent class + call this%ObsType%obs_df(iout, pkgname, filtyp, dis) + ! + ! -- StoreObsType arguments are: (ObserveType, cumulative, indx); + ! indx is returned. + ! + ! -- Store obs type and assign procedure pointer for head observation type + call this%StoreObsType('stage', .false., indx) + this%obsData(indx)%ProcessIdPtr => swf_process_stage_obs_id + ! + ! -- Store obs type and assign procedure pointer for flow-ja-face observation type + call this%StoreObsType('flow-ja-face', .true., indx) + this%obsData(indx)%ProcessIdPtr => swf_process_intercell_obs_id + ! + return + end subroutine swf_obs_df + + subroutine swf_obs_bd(this) +! ****************************************************************************** +! swf_obs_bd -- save obs +! ****************************************************************************** +! +! SPECIFICATIONS: +! ------------------------------------------------------------------------------ + ! -- dummy + class(SwfObsType), intent(inout) :: this + ! -- local + integer(I4B) :: i, jaindex, nodenumber + character(len=100) :: msg + class(ObserveType), pointer :: obsrv => null() +! ------------------------------------------------------------------------------ + ! + call this%obs_bd_clear() + ! + ! -- iterate through all SWF observations + if (this%npakobs > 0) then + do i = 1, this%npakobs + obsrv => this%pakobs(i)%obsrv + nodenumber = obsrv%NodeNumber + jaindex = obsrv%JaIndex + select case (obsrv%ObsTypeId) + case ('STAGE') + call this%SaveOneSimval(obsrv, this%x(nodenumber)) + case ('FLOW-JA-FACE') + call this%SaveOneSimval(obsrv, this%flowja(jaindex)) + case default + msg = ' Unrecognized observation type: '//trim(obsrv%ObsTypeId) + call store_error(msg) + call store_error_unit(this%inUnitObs) + end select + end do + end if + ! + return + end subroutine swf_obs_bd + + subroutine swf_obs_rp(this) +! ****************************************************************************** +! swf_obs_rp +! ****************************************************************************** +! +! SPECIFICATIONS: +! ------------------------------------------------------------------------------ + class(SwfObsType), intent(inout) :: this +! ------------------------------------------------------------------------------ + ! + ! Do SWF observations need any checking? If so, add checks here + return + end subroutine swf_obs_rp + + subroutine swf_obs_da(this) +! ****************************************************************************** +! swf_obs_da +! ****************************************************************************** +! +! SPECIFICATIONS: +! ------------------------------------------------------------------------------ + ! -- dummy + class(SwfObsType), intent(inout) :: this +! ------------------------------------------------------------------------------ + ! + nullify (this%ic) + nullify (this%x) + nullify (this%flowja) + call this%ObsType%obs_da() + ! + return + end subroutine swf_obs_da + + subroutine set_pointers(this, ic, x, flowja) +! ****************************************************************************** +! set_pointers +! ****************************************************************************** +! +! SPECIFICATIONS: +! ------------------------------------------------------------------------------ + ! -- dummy + class(SwfObsType), intent(inout) :: this + type(SwfIcType), pointer, intent(in) :: ic + real(DP), dimension(:), pointer, contiguous, intent(in) :: x + real(DP), dimension(:), pointer, contiguous, intent(in) :: flowja +! ------------------------------------------------------------------------------ + ! + this%ic => ic + this%x => x + this%flowja => flowja + ! + return + end subroutine set_pointers + + ! -- Procedures related to SWF observations (NOT type-bound) + + subroutine swf_process_stage_obs_id(obsrv, dis, inunitobs, iout) +! ****************************************************************************** +! swf_process_stage_obs_id +! ****************************************************************************** +! +! SPECIFICATIONS: +! ------------------------------------------------------------------------------ + ! -- dummy + type(ObserveType), intent(inout) :: obsrv + class(DisBaseType), intent(in) :: dis + integer(I4B), intent(in) :: inunitobs + integer(I4B), intent(in) :: iout + ! -- local + integer(I4B) :: nn1 + integer(I4B) :: icol, istart, istop + character(len=LINELENGTH) :: ermsg, strng +! ------------------------------------------------------------------------------ + ! + ! -- Initialize variables + strng = obsrv%IDstring + icol = 1 + ! + ! Get node number, with option for ID string to be either node + ! number or lay, row, column (when dis is structured). + nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & + iout, strng, .false.) + ! + if (nn1 > 0) then + obsrv%NodeNumber = nn1 + else + ermsg = 'Error reading data from ID string' + call store_error(ermsg) + call store_error_unit(inunitobs) + end if + ! + return + end subroutine swf_process_stage_obs_id + + subroutine swf_process_intercell_obs_id(obsrv, dis, inunitobs, iout) +! ****************************************************************************** +! swf_process_intercell_obs_id +! ****************************************************************************** +! +! SPECIFICATIONS: +! ------------------------------------------------------------------------------ + ! -- dummy + type(ObserveType), intent(inout) :: obsrv + class(DisBaseType), intent(in) :: dis + integer(I4B), intent(in) :: inunitobs + integer(I4B), intent(in) :: iout + ! -- local + integer(I4B) :: nn1, nn2 + integer(I4B) :: icol, istart, istop, jaidx + character(len=LINELENGTH) :: ermsg, strng + ! formats +70 format('Error: No connection exists between cells identified in text: ', a) +! ------------------------------------------------------------------------------ + ! + ! -- Initialize variables + strng = obsrv%IDstring + icol = 1 + ! + ! Get node number, with option for ID string to be either node + ! number or lay, row, column (when dis is structured). + nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & + iout, strng, .false.) + ! + if (nn1 > 0) then + obsrv%NodeNumber = nn1 + else + ermsg = 'Error reading data from ID string: '//strng(istart:istop) + call store_error(ermsg) + end if + ! + ! Get node number, with option for ID string to be either node + ! number or lay, row, column (when dis is structured). + nn2 = dis%noder_from_string(icol, istart, istop, inunitobs, & + iout, strng, .false.) + if (nn2 > 0) then + obsrv%NodeNumber2 = nn2 + else + ermsg = 'Error reading data from ID string: '//strng(istart:istop) + call store_error(ermsg) + end if + ! + ! -- store JA index + jaidx = dis%con%getjaindex(nn1, nn2) + if (jaidx == 0) then + write (ermsg, 70) trim(strng) + call store_error(ermsg) + end if + obsrv%JaIndex = jaidx + ! + if (count_errors() > 0) then + call store_error_unit(inunitobs) + end if + ! + return + end subroutine swf_process_intercell_obs_id + +end module SwfObsModule diff --git a/src/Model/SurfaceWaterFlow/swf1oc1.f90 b/src/Model/SurfaceWaterFlow/swf1oc1.f90 new file mode 100644 index 00000000000..ea8f4ac7ae4 --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1oc1.f90 @@ -0,0 +1,101 @@ +module SwfOcModule + + use BaseDisModule, only: DisBaseType + use KindModule, only: DP, I4B + use ConstantsModule, only: LENMODELNAME + use OutputControlModule, only: OutputControlType + use OutputControlDataModule, only: OutputControlDataType, ocd_cr + + implicit none + private + public SwfOcType, oc_cr + + !> @ brief Output control for GWF + !! + !! Concrete implementation of OutputControlType for the + !! GWF Model + !< + type, extends(OutputControlType) :: SwfOcType + contains + procedure :: oc_ar + end type SwfOcType + +contains + + !> @ brief Create SwfOcType + !! + !! Create by allocating a new SwfOcType object and initializing + !! member variables. + !! + !< + subroutine oc_cr(ocobj, name_model, inunit, iout) + ! -- dummy + type(SwfOcType), pointer :: ocobj !< SwfOcType object + character(len=*), intent(in) :: name_model !< name of the model + integer(I4B), intent(in) :: inunit !< unit number for input + integer(I4B), intent(in) :: iout !< unit number for output + ! + ! -- Create the object + allocate (ocobj) + ! + ! -- Allocate scalars + call ocobj%allocate_scalars(name_model) + ! + ! -- Save unit numbers + ocobj%inunit = inunit + ocobj%iout = iout + ! + ! -- Initialize block parser + call ocobj%parser%Initialize(inunit, iout) + ! + ! -- Return + return + end subroutine oc_cr + + !> @ brief Allocate and read SwfOcType + !! + !! Setup head and budget as output control variables. + !! + !< + subroutine oc_ar(this, name, datavec, dis, dnodata) + ! -- dummy + class(SwfOcType) :: this !< SwfOcType object + character(len=*), intent(in) :: name + real(DP), dimension(:), pointer, contiguous, intent(in) :: datavec !< data vector + class(DisBaseType), pointer, intent(in) :: dis !< model discretization package + real(DP), intent(in) :: dnodata !< no data value + ! -- local + integer(I4B) :: i, nocdobj, inodata + type(OutputControlDataType), pointer :: ocdobjptr + real(DP), dimension(:), pointer, contiguous :: nullvec => null() + ! + ! -- Initialize variables + inodata = 0 + nocdobj = 2 + allocate (this%ocdobj(nocdobj)) + do i = 1, nocdobj + call ocd_cr(ocdobjptr) + select case (i) + case (1) + call ocdobjptr%init_dbl('BUDGET', nullvec, dis, 'PRINT LAST ', & + 'COLUMNS 10 WIDTH 11 DIGITS 4 GENERAL ', & + this%iout, dnodata) + case (2) + call ocdobjptr%init_dbl(name, datavec, dis, 'PRINT LAST ', & + 'COLUMNS 10 WIDTH 11 DIGITS 4 GENERAL ', & + this%iout, dnodata) + end select + this%ocdobj(i) = ocdobjptr + deallocate (ocdobjptr) + end do + ! + ! -- Read options or set defaults if this package not on + if (this%inunit > 0) then + call this%read_options() + end if + ! + ! -- Return + return + end subroutine oc_ar + +end module SwfOcModule diff --git a/src/Model/SurfaceWaterFlow/swf1sto1.f90 b/src/Model/SurfaceWaterFlow/swf1sto1.f90 new file mode 100644 index 00000000000..5d541cf5561 --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1sto1.f90 @@ -0,0 +1,642 @@ +!> @brief This module contains the storage package methods +!! +!! This module contains the methods used to add the effects of storage +!! on the surface water flow equation. +!! +!< +module SwfStoModule + + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: DZERO, DEM6, DEM4, DHALF, DONE, DTWO, & + LENBUDTXT, LINELENGTH, LENMEMPATH + use MemoryHelperModule, only: create_mem_path + use SimVariablesModule, only: errmsg + use SimModule, only: store_error, count_errors + use BaseDisModule, only: DisBaseType + use NumericalPackageModule, only: NumericalPackageType + use BlockParserModule, only: BlockParserType + use InputOutputModule, only: GetUnit, openfile + use MatrixBaseModule + use SwfDislModule, only: SwfDislType + use SwfCxsModule, only: SwfCxsType + + implicit none + public :: SwfStoType, sto_cr + + character(len=LENBUDTXT), dimension(1) :: budtxt = & !< text labels for budget terms + &[' STORAGE'] + + type, extends(NumericalPackageType) :: SwfStoType + integer(I4B), pointer :: iss => null() !< steady state flag: 1 = steady, 0 = transient + integer(I4B), dimension(:), pointer, contiguous :: ibound => null() !< pointer to model ibound + real(DP), dimension(:), pointer, contiguous :: qsto => null() !< storage rates + + ! -- pointers to information in dfw package + integer(I4B), dimension(:), pointer, contiguous :: idcxs => null() !< pointer to cross section id vector in dfw + real(DP), dimension(:), pointer, contiguous :: width => null() !< pointer to width vector in dfw + + ! -- pointer to packages needed for calculations + type(SwfDislType), pointer :: disl + type(SwfCxsType), pointer :: cxs + + contains + procedure :: sto_ar + procedure :: sto_rp + procedure :: sto_ad + procedure :: sto_fc + !procedure :: sto_fn + procedure :: sto_cq + procedure :: sto_bd + procedure :: sto_save_model_flows + procedure :: sto_da + procedure :: allocate_scalars + procedure, private :: allocate_arrays + procedure, private :: read_options + procedure, private :: read_data + procedure, private :: set_dfw_pointers + end type + +contains + + !> @ brief Create a new package object + !! + !! Create a new storage (STO) object + !! + !< + subroutine sto_cr(stoobj, name_model, inunit, iout, dis, cxs) + ! -- dummy variables + type(SwfStoType), pointer :: stoobj !< SwfStoType object + character(len=*), intent(in) :: name_model !< name of model + integer(I4B), intent(in) :: inunit !< package input file unit + integer(I4B), intent(in) :: iout !< model listing file unit + class(DisBaseType), pointer, intent(inout) :: dis !< the pointer to the discretization + type(SwfCxsType), pointer, intent(in) :: cxs !< the pointer to the cxs package + ! + ! -- Create the object + allocate (stoobj) + ! + ! -- create name and memory path + call stoobj%set_names(1, name_model, 'STO', 'STO') + ! + ! -- Allocate scalars + call stoobj%allocate_scalars() + ! + ! -- Set variables + stoobj%inunit = inunit + stoobj%iout = iout + + ! -- store pointer to disl + ! Not normally good practice, but since SWF only works with DISL + ! may be okay + stoobj%dis => dis + select type (dis) + type is (SwfDislType) + stoobj%disl => dis + end select + stoobj%cxs => cxs + + ! -- Initialize block parser + call stoobj%parser%Initialize(stoobj%inunit, stoobj%iout) + + ! -- set pointers to data in dfw package + call stoobj%set_dfw_pointers() + + ! + ! -- return + return + end subroutine sto_cr + + !> @ brief Allocate and read method for package + !! + !! Method to allocate and read static data for the STO package. + !! + !< + subroutine sto_ar(this, dis, ibound) + ! -- modules + use MemoryManagerModule, only: mem_setptr + use MemoryHelperModule, only: create_mem_path + ! -- dummy variables + class(SwfStoType) :: this !< SwfStoType object + class(DisBaseType), pointer, intent(in) :: dis !< model discretization object + integer(I4B), dimension(:), pointer, contiguous :: ibound !< model ibound array + ! -- local variables + ! -- formats + character(len=*), parameter :: fmtsto = & + "(1x,/1x,'STO -- STORAGE PACKAGE, VERSION 1, 10/27/2023', & + &' INPUT READ FROM UNIT ', i0, //)" + ! + ! --print a message identifying the storage package. + write (this%iout, fmtsto) this%inunit + ! + ! -- store pointers to arguments that were passed in + this%dis => dis + this%ibound => ibound + ! + ! -- set pointer to gwf iss + call mem_setptr(this%iss, 'ISS', create_mem_path(this%name_model)) + ! + ! -- Allocate arrays + call this%allocate_arrays(dis%nodes) + ! + ! -- Read storage options + call this%read_options() + ! + ! -- read the data block + ! no griddata at the moment for SWF Storage Package + ! call this%read_data() + ! + ! -- return + return + end subroutine sto_ar + + !> @ brief Read and prepare method for package + !! + !! Method to read and prepare stress period data for the STO package. + !! + !< + subroutine sto_rp(this) + ! -- modules + use TdisModule, only: kper, nper + implicit none + ! -- dummy variables + class(SwfStoType) :: this !< SwfStoType object + ! -- local variables + integer(I4B) :: ierr + logical :: isfound, endOfBlock + character(len=16) :: css(0:1) + character(len=LINELENGTH) :: line, keyword + ! -- formats + character(len=*), parameter :: fmtlsp = & + &"(1X,/1X,'REUSING ',A,' FROM LAST STRESS PERIOD')" + character(len=*), parameter :: fmtblkerr = & + &"('Error. Looking for BEGIN PERIOD iper. Found ', a, ' instead.')" + ! -- data + data css(0)/' TRANSIENT'/ + data css(1)/' STEADY-STATE'/ +! ------------------------------------------------------------------------------ + ! + ! -- get stress period data + if (this%ionper < kper) then + ! + ! -- get period block + call this%parser%GetBlock('PERIOD', isfound, ierr, & + supportOpenClose=.true., & + blockRequired=.false.) + if (isfound) then + ! + ! -- read ionper and check for increasing period numbers + call this%read_check_ionper() + else + ! + ! -- PERIOD block not found + if (ierr < 0) then + ! -- End of file found; data applies for remainder of simulation. + this%ionper = nper + 1 + else + ! -- Found invalid block + call this%parser%GetCurrentLine(line) + write (errmsg, fmtblkerr) adjustl(trim(line)) + call store_error(errmsg) + call this%parser%StoreErrorUnit() + end if + end if + end if + + if (this%ionper == kper) then + write (this%iout, '(//,1x,a)') 'PROCESSING STORAGE PERIOD DATA' + do + call this%parser%GetNextLine(endOfBlock) + if (endOfBlock) exit + call this%parser%GetStringCaps(keyword) + select case (keyword) + case ('STEADY-STATE') + this%iss = 1 + case ('TRANSIENT') + this%iss = 0 + case default + write (errmsg, '(a,a)') 'Unknown STORAGE data tag: ', & + trim(keyword) + call store_error(errmsg) + call this%parser%StoreErrorUnit() + end select + end do + write (this%iout, '(1x,a)') 'END PROCESSING STORAGE PERIOD DATA' + end if + + write (this%iout, '(//1X,A,I0,A,A,/)') & + 'STRESS PERIOD ', kper, ' IS ', trim(adjustl(css(this%iss))) + ! + ! -- return + return + end subroutine sto_rp + + !> @ brief Advance the package + !! + !! Advance data in the STO package. + !! + !< + subroutine sto_ad(this) + ! -- modules + ! -- dummy variables + class(SwfStoType) :: this !< SwfStoType object + ! + ! -- return + return + end subroutine sto_ad + + !> @ brief Fill A and right-hand side for the package + !! + !! Fill the coefficient matrix and right-hand side with the STO package terms. + !! + !< + subroutine sto_fc(this, kiter, stage_old, stage_new, matrix_sln, idxglo, rhs) + ! -- modules + use ConstantsModule, only: DONE + use SwfCxsUtilsModule, only: get_cross_section_area + use TdisModule, only: delt + ! -- dummy + class(SwfStoType) :: this + integer(I4B) :: kiter + real(DP), intent(inout), dimension(:) :: stage_old + real(DP), intent(inout), dimension(:) :: stage_new + class(MatrixBaseType), pointer :: matrix_sln + integer(I4B), intent(in), dimension(:) :: idxglo + real(DP), intent(inout), dimension(:) :: rhs + ! -- local + integer(I4B) :: n, idiag + real(DP) :: depth_old + real(DP) :: depth_new + real(DP) :: area_old + real(DP) :: area_new + real(DP) :: area_eps + real(DP) :: volume_old + real(DP) :: volume_new + real(DP) :: dx + real(DP) :: eps + real(DP) :: derv + real(DP) :: qsto + ! -- formats + character(len=*), parameter :: fmtsperror = & + &"('Detected time step length of zero. SWF Storage Package cannot be ', & + &'used unless delt is non-zero.')" + ! + ! -- test if steady-state stress period + if (this%iss /= 0) return + ! + ! -- Ensure time step length is not zero + if (delt == DZERO) then + write (errmsg, fmtsperror) + call store_error(errmsg, terminate=.TRUE.) + end if + ! + ! -- Calculate coefficients and put into amat + eps = 1.D-8 + do n = 1, this%dis%nodes + ! + ! -- skip if constant stage + if (this%ibound(n) < 0) cycle + ! + ! qsto = (v_new - v_old) / dt + ! v_new = a_new * dx + ! a_new = get_area(stage_new - bottom_elev) + dx = this%disl%reach_length(n) + depth_old = stage_old(n) - this%disl%reach_bottom(n) + area_old = this%cxs%get_area(this%idcxs(n), this%width(n), depth_old) + volume_old = area_old * dx + depth_new = stage_new(n) - this%disl%reach_bottom(n) + area_new = this%cxs%get_area(this%idcxs(n), this%width(n), depth_new) + volume_new = area_new * dx + qsto = (volume_new - volume_old) / delt + + area_eps = this%cxs%get_area(this%idcxs(n), this%width(n), depth_new + eps) + derv = (area_eps - area_new) * dx / delt / eps + ! + ! -- Fill amat and rhs + idiag = this%dis%con%ia(n) + call matrix_sln%add_value_pos(idxglo(idiag), -derv) + rhs(n) = rhs(n) + qsto - derv * stage_new(n) + + end do + ! + ! -- Return + return + end subroutine sto_fc + + !> @ brief Calculate flows for package + !! + !! Flow calculation for the STO package components. Components include + !! specific storage and specific yield storage. + !! + !< + subroutine sto_cq(this, flowja, stage_new, stage_old) + use TdisModule, only: delt + ! -- dummy + class(SwfStoType) :: this + real(DP), intent(inout), dimension(:) :: flowja + real(DP), intent(inout), dimension(:) :: stage_new + real(DP), intent(inout), dimension(:) :: stage_old + ! -- local + integer(I4B) :: n + integer(I4B) :: idiag + real(DP) :: dx + real(DP) :: depth_old + real(DP) :: area_old + real(DP) :: volume_old + real(DP) :: depth_new + real(DP) :: area_new + real(DP) :: volume_new + ! + ! -- test if steady-state stress period + if (this%iss /= 0) return + ! + ! -- Calculate storage term + do n = 1, this%dis%nodes + ! + ! -- skip if constant stage + if (this%ibound(n) < 0) cycle + ! + dx = this%disl%reach_length(n) + depth_old = stage_old(n) - this%disl%reach_bottom(n) + area_old = this%cxs%get_area(this%idcxs(n), this%width(n), depth_old) + volume_old = area_old * dx + depth_new = stage_new(n) - this%disl%reach_bottom(n) + area_new = this%cxs%get_area(this%idcxs(n), this%width(n), depth_new) + volume_new = area_new * dx + this%qsto(n) = -(volume_new - volume_old) / delt + + idiag = this%dis%con%ia(n) + flowja(idiag) = flowja(idiag) + this%qsto(n) + + end do + ! + ! -- Return + return + end subroutine sto_cq + + !> @ brief Model budget calculation for package + !! + !! Budget calculation for the STO package components. Components include + !! specific storage and specific yield storage. + !! + !< + subroutine sto_bd(this, isuppress_output, model_budget) + ! -- modules + use TdisModule, only: delt + use BudgetModule, only: BudgetType, rate_accumulator + ! -- dummy variables + class(SwfStoType) :: this !< SwfStoType object + integer(I4B), intent(in) :: isuppress_output !< flag to suppress model output + type(BudgetType), intent(inout) :: model_budget !< model budget object + ! -- local variables + real(DP) :: rin + real(DP) :: rout + ! + ! -- Add storage rates to model budget + call rate_accumulator(this%qsto, rin, rout) + call model_budget%addentry(rin, rout, delt, ' STO', & + isuppress_output, ' STORAGE') + ! + ! -- return + return + end subroutine sto_bd + + !> @ brief Save model flows for package + !! + !! Save cell-by-cell budget terms for the STO package. + !! + !< + subroutine sto_save_model_flows(this, icbcfl, icbcun) + ! -- dummy variables + class(SwfStoType) :: this !< SwfStoType object + integer(I4B), intent(in) :: icbcfl !< flag to output budget data + integer(I4B), intent(in) :: icbcun !< cell-by-cell file unit number + ! -- local variables + integer(I4B) :: ibinun + integer(I4B) :: iprint, nvaluesp, nwidthp + character(len=1) :: cdatafmp = ' ', editdesc = ' ' + real(DP) :: dinact + ! + ! -- Set unit number for binary output + if (this%ipakcb < 0) then + ibinun = icbcun + elseif (this%ipakcb == 0) then + ibinun = 0 + else + ibinun = this%ipakcb + end if + if (icbcfl == 0) ibinun = 0 + ! + ! -- Record the storage rates if requested + if (ibinun /= 0) then + iprint = 0 + dinact = DZERO + ! + ! -- qsto + call this%dis%record_array(this%qsto, this%iout, iprint, -ibinun, & + budtxt(1), cdatafmp, nvaluesp, & + nwidthp, editdesc, dinact) + end if + ! + ! -- return + return + end subroutine sto_save_model_flows + + !> @ brief Deallocate package memory + !! + !! Deallocate STO package scalars and arrays. + !! + !< + subroutine sto_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + ! -- dummy variables + class(SwfStoType) :: this !< SwfStoType object + ! + ! -- Deallocate arrays if package is active + if (this%inunit > 0) then + call mem_deallocate(this%qsto) + nullify (this%idcxs) + nullify (this%width) + end if + ! + ! -- Deallocate scalars + ! + ! -- deallocate parent + call this%NumericalPackageType%da() + ! + ! -- return + return + end subroutine sto_da + + !> @ brief Allocate scalars + !! + !! Allocate and initialize scalars for the STO package. The base numerical + !! package allocate scalars method is also called. + !! + !< + subroutine allocate_scalars(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate, mem_setptr + ! -- dummy variables + class(SwfStoType) :: this !< SwfStoType object + ! + ! -- allocate scalars in NumericalPackageType + call this%NumericalPackageType%allocate_scalars() + ! + ! -- allocate scalars + !call mem_allocate(this%xxx, 'XXX', this%memoryPath) + ! + ! -- initialize scalars + !this%xxx = 0 + ! + ! -- return + return + end subroutine allocate_scalars + + !> @ brief Allocate package arrays + !! + !! Allocate and initialize STO package arrays. + !! + !< + subroutine allocate_arrays(this, nodes) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy variables + class(SwfStoType), target :: this !< SwfStoType object + integer(I4B), intent(in) :: nodes !< active model nodes + ! -- local variables + integer(I4B) :: n + ! + ! -- Allocate arrays + call mem_allocate(this%qsto, nodes, 'STRGSS', this%memoryPath) + ! + ! -- Initialize arrays + this%iss = 0 + do n = 1, nodes + this%qsto(n) = DZERO + end do + ! + ! -- return + return + end subroutine allocate_arrays + + !> @ brief Read options for package + !! + !! Read options block for STO package. + !! + !< + subroutine read_options(this) + ! -- modules + ! -- dummy variables + class(SwfStoType) :: this !< SwfStoType object + ! -- local variables + character(len=LINELENGTH) :: keyword + integer(I4B) :: ierr + logical :: isfound, endOfBlock + ! -- formats + character(len=*), parameter :: fmtisvflow = & + "(4x,'CELL-BY-CELL FLOW INFORMATION WILL BE SAVED TO BINARY FILE & + &WHENEVER ICBCFL IS NOT ZERO.')" + character(len=*), parameter :: fmtflow = & + &"(4x, 'FLOWS WILL BE SAVED TO FILE: ', a, /4x, 'OPENED ON UNIT: ', I7)" + ! + ! -- get options block + call this%parser%GetBlock('OPTIONS', isfound, ierr, & + supportOpenClose=.true., blockRequired=.false.) + ! + ! -- parse options block if detected + if (isfound) then + write (this%iout, '(1x,a)') 'PROCESSING STORAGE OPTIONS' + do + call this%parser%GetNextLine(endOfBlock) + if (endOfBlock) exit + call this%parser%GetStringCaps(keyword) + select case (keyword) + case ('SAVE_FLOWS') + this%ipakcb = -1 + write (this%iout, fmtisvflow) + case default + write (errmsg, '(a,a)') 'Unknown STO option: ', & + trim(keyword) + call store_error(errmsg, terminate=.TRUE.) + end select + end do + write (this%iout, '(1x,a)') 'END OF STORAGE OPTIONS' + end if + ! + ! -- return + return + end subroutine read_options + + !> @ brief Read data for package + !! + !! Read griddata block for STO package. + !! + !< + subroutine read_data(this) + ! -- modules + ! -- dummy variables + class(SwfStotype) :: this !< SwfStoType object + ! -- local variables + character(len=LINELENGTH) :: keyword + character(len=:), allocatable :: line + integer(I4B) :: lloc, ierr + logical :: isfound, endOfBlock + character(len=24), dimension(1) :: aname + ! -- formats + !data + data aname(1)/' XXX'/ + ! + ! -- initialize + isfound = .false. + ! + ! -- get stodata block + call this%parser%GetBlock('GRIDDATA', isfound, ierr) + if (isfound) then + write (this%iout, '(1x,a)') 'PROCESSING GRIDDATA' + do + call this%parser%GetNextLine(endOfBlock) + if (endOfBlock) exit + call this%parser%GetStringCaps(keyword) + call this%parser%GetRemainingLine(line) + lloc = 1 + select case (keyword) + case default + write (errmsg, '(a,a)') 'Unknown GRIDDATA tag: ', & + trim(keyword) + call store_error(errmsg) + call this%parser%StoreErrorUnit() + end select + end do + write (this%iout, '(1x,a)') 'END PROCESSING GRIDDATA' + else + write (errmsg, '(a)') 'Required GRIDDATA block not found.' + call store_error(errmsg) + call this%parser%StoreErrorUnit() + end if + ! + if (count_errors() > 0) then + call this%parser%StoreErrorUnit() + end if + ! + ! -- return + return + end subroutine read_data + + !> @brief Set pointers to channel properties in DFW Package + !< + subroutine set_dfw_pointers(this) + ! -- modules + use MemoryManagerModule, only: mem_setptr, mem_allocate + ! -- dummy + class(SwfStoType) :: this !< this instance + ! -- local + character(len=LENMEMPATH) :: dfw_mem_path + + dfw_mem_path = create_mem_path(this%name_model, 'DFW') + call mem_setptr(this%idcxs, 'IDCXS', dfw_mem_path) + call mem_setptr(this%width, 'WIDTH', dfw_mem_path) + + end subroutine set_dfw_pointers + +end module SwfStoModule diff --git a/src/Model/SurfaceWaterFlow/swf1zdg1.f90 b/src/Model/SurfaceWaterFlow/swf1zdg1.f90 new file mode 100644 index 00000000000..fb29d2049db --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1zdg1.f90 @@ -0,0 +1,630 @@ +!> @brief This module contains the ZDG package methods +!! +!! This module can be used to represent outflow from streams using +!! a zero-depth-gradient boundary. +!! +!< +module SwfZdgModule + ! -- modules + use KindModule, only: DP, I4B + use ConstantsModule, only: DZERO, DEM1, DONE, LENFTYPE, DNODATA, & + LINELENGTH, DHALF, DTWOTHIRDS + use SimVariablesModule, only: errmsg + use SimModule, only: store_error, store_error_filename + use MemoryHelperModule, only: create_mem_path + use BndModule, only: BndType + use BndExtModule, only: BndExtType + use ObsModule, only: DefaultObsIdProcessor + use SmoothingModule, only: sQSaturation, sQSaturationDerivative + use ObserveModule, only: ObserveType + use TimeSeriesLinkModule, only: TimeSeriesLinkType, & + GetTimeSeriesLinkFromList + use BlockParserModule, only: BlockParserType + use InputOutputModule, only: GetUnit, openfile + use MatrixBaseModule + use BaseDisModule, only: DisBaseType + use SwfDislModule, only: SwfDislType + use SwfCxsModule, only: SwfCxsType + ! + implicit none + ! + private + public :: zdg_create + ! + character(len=LENFTYPE) :: ftype = 'ZDG' !< package ftype + character(len=16) :: text = ' ZDG' !< package flow text string + ! + type, extends(BndExtType) :: SwfZdgType + + integer(I4B), dimension(:), pointer, contiguous :: idcxs => null() !< cross section id + real(DP), dimension(:), pointer, contiguous :: width => null() !< channel width + real(DP), dimension(:), pointer, contiguous :: slope => null() !< channel slope + real(DP), dimension(:), pointer, contiguous :: rough => null() !< channel roughness + real(DP), pointer :: unitconv => null() !< conversion factor for roughness to length and time units of meters and seconds + + ! -- pointers other objects + type(SwfDislType), pointer :: disl + type(SwfCxsType), pointer :: cxs + + contains + procedure :: allocate_scalars => zdg_allocate_scalars + procedure :: allocate_arrays => zdg_allocate_arrays + procedure :: source_options => zdg_options + procedure :: log_zdg_options + procedure :: bnd_rp => zdg_rp + procedure :: bnd_cf => zdg_cf + procedure :: bnd_fc => zdg_fc + procedure :: bnd_da => zdg_da + procedure :: define_listlabel + procedure :: bound_value => zdg_bound_value + ! -- methods for observations + procedure, public :: bnd_obs_supported => zdg_obs_supported + procedure, public :: bnd_df_obs => zdg_df_obs + procedure, public :: bnd_bd_obs => zdg_bd_obs + ! -- methods for time series + procedure, public :: bnd_rp_ts => zdg_rp_ts + ! -- private + procedure, private :: get_cond + end type SwfZdgType + +contains + + !> @ brief Create a new package object + !! + !! Create a new ZDG Package object + !! + !< + subroutine zdg_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, & + mempath, dis, cxs, unitconv) + ! -- dummy variables + class(BndType), pointer :: packobj !< pointer to default package type + integer(I4B), intent(in) :: id !< package id + integer(I4B), intent(in) :: ibcnum !< boundary condition number + integer(I4B), intent(in) :: inunit !< unit number of ZDG package input file + integer(I4B), intent(in) :: iout !< unit number of model listing file + character(len=*), intent(in) :: namemodel !< model name + character(len=*), intent(in) :: pakname !< package name + character(len=*), intent(in) :: mempath !< input mempath + class(DisBaseType), pointer, intent(inout) :: dis !< the pointer to the discretization + type(SwfCxsType), pointer, intent(in) :: cxs !< the pointer to the cxs package + real(DP), intent(in) :: unitconv !< unit conversion for roughness + ! -- local variables + type(SwfZdgType), pointer :: zdgobj + ! + ! -- allocate the object and assign values to object variables + allocate (zdgobj) + packobj => zdgobj + ! + ! -- create name and memory path + call packobj%set_names(ibcnum, namemodel, pakname, ftype, mempath) + packobj%text = text + ! + ! -- allocate scalars + call zdgobj%allocate_scalars() + ! + ! -- initialize package + call packobj%pack_initialize() + + packobj%inunit = inunit + packobj%iout = iout + packobj%id = id + packobj%ibcnum = ibcnum + packobj%ncolbnd = 1 + packobj%iscloc = 1 + packobj%ictMemPath = create_mem_path(namemodel, 'DFW') + ! + ! -- store pointer to disl + select type (dis) + type is (SwfDislType) + zdgobj%disl => dis + end select + ! + ! -- store pointer to cxs + zdgobj%cxs => cxs + ! + ! -- store unit conversion + zdgobj%unitconv = unitconv + ! + ! -- return + return + end subroutine zdg_create + + !> @ brief Allocate scalars + !! + !! Allocate and initialize scalars for the ZDG package. The base model + !! allocate scalars method is also called. + !! + !< + subroutine zdg_allocate_scalars(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy variables + class(SwfZdgType) :: this !< SwfZdgType object + ! + ! -- call base type allocate scalars + call this%BndExtType%allocate_scalars() + ! + ! -- allocate the object and assign values to object variables + call mem_allocate(this%unitconv, 'UNITCONV', this%memoryPath) + ! + ! -- Set values + this%unitconv = DZERO + ! + ! -- return + return + end subroutine zdg_allocate_scalars + + !> @ brief Allocate arrays + !! + !! Allocate and initialize arrays for the SWF package + !! + !< + subroutine zdg_allocate_arrays(this, nodelist, auxvar) + ! -- modules + use MemoryManagerModule, only: mem_allocate, mem_setptr, mem_checkin + ! -- dummy + class(SwfZdgType) :: this + integer(I4B), dimension(:), pointer, contiguous, optional :: nodelist + real(DP), dimension(:, :), pointer, contiguous, optional :: auxvar + ! -- local + ! + ! -- call BndExtType allocate scalars + call this%BndExtType%allocate_arrays(nodelist, auxvar) + ! + ! -- set array input context pointer + call mem_setptr(this%idcxs, 'IDCXS', this%input_mempath) + call mem_setptr(this%width, 'WIDTH', this%input_mempath) + call mem_setptr(this%slope, 'SLOPE', this%input_mempath) + call mem_setptr(this%rough, 'ROUGH', this%input_mempath) + ! + ! -- checkin array input context pointer + call mem_checkin(this%idcxs, 'IDCXS', this%memoryPath, & + 'IDCXS', this%input_mempath) + call mem_checkin(this%width, 'WIDTH', this%memoryPath, & + 'WIDTH', this%input_mempath) + call mem_checkin(this%slope, 'SLOPE', this%memoryPath, & + 'SLOPE', this%input_mempath) + call mem_checkin(this%rough, 'ROUGH', this%memoryPath, & + 'ROUGH', this%input_mempath) + ! + ! -- return + return + end subroutine zdg_allocate_arrays + + !> @ brief Deallocate package memory + !! + !! Deallocate SWF package scalars and arrays. + !! + !< + subroutine zdg_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + ! -- dummy variables + class(SwfZdgType) :: this !< SwfZdgType object + ! + ! -- Deallocate parent package + call this%BndExtType%bnd_da() + ! + ! -- arrays + call mem_deallocate(this%idcxs, 'IDCXS', this%memoryPath) + call mem_deallocate(this%width, 'WIDTH', this%memoryPath) + call mem_deallocate(this%slope, 'SLOPE', this%memoryPath) + call mem_deallocate(this%rough, 'ROUGH', this%memoryPath) + ! + ! -- scalars + call mem_deallocate(this%unitconv) + ! + ! -- return + return + end subroutine zdg_da + + !> @ brief Source additional options for package + !! + !! Source additional options for SWF package. + !! + !< + subroutine zdg_options(this) + ! -- modules + use InputOutputModule, only: urword + use MemoryManagerExtModule, only: mem_set_value + use SwfZdgInputModule, only: SwfZdgParamFoundType + ! -- dummy variables + class(SwfZdgType), intent(inout) :: this !< SwfZdgType object + ! -- local variables + type(SwfZdgParamFoundType) :: found + ! -- formats + ! + ! -- source base BndExtType options + call this%BndExtType%source_options() + ! + ! -- source options from input context + ! none + ! + ! -- log SWF specific options + call this%log_zdg_options(found) + ! + ! -- return + return + end subroutine zdg_options + + !> @ brief Log SWF specific package options + !< + subroutine log_zdg_options(this, found) + ! -- modules + use SwfZdgInputModule, only: SwfZdgParamFoundType + ! -- dummy variables + class(SwfZdgType), intent(inout) :: this !< BndExtType object + type(SwfZdgParamFoundType), intent(in) :: found + ! -- local variables + ! -- format + ! + ! -- log found options + write (this%iout, '(/1x,a)') 'PROCESSING '//trim(adjustl(this%text)) & + //' OPTIONS' + ! + ! if (found%mover) then + ! write (this%iout, '(4x,A)') 'MOVER OPTION ENABLED' + ! end if + ! + ! -- close logging block + write (this%iout, '(1x,a)') & + 'END OF '//trim(adjustl(this%text))//' OPTIONS' + ! + ! -- return + return + end subroutine log_zdg_options + + !> @ brief SWF read and prepare + !! + !< + subroutine zdg_rp(this) + use TdisModule, only: kper + ! -- dummy + class(SwfZdgType), intent(inout) :: this + ! -- local + ! + if (this%iper /= kper) return + ! + ! -- Call the parent class read and prepare + call this%BndExtType%bnd_rp() + ! + ! -- Write the list to iout if requested + if (this%iprpak /= 0) then + call this%write_list() + end if + ! + ! -- return + return + end subroutine zdg_rp + + !> @ brief Formulate the package hcof and rhs terms. + !! + !! Formulate the hcof and rhs terms for the ZDG package that will be + !! added to the coefficient matrix and right-hand side vector. + !! + !< + subroutine zdg_cf(this) + ! -- dummy variables + class(SwfZdgType) :: this !< SwfZdgType object + ! -- local variables + integer(I4B) :: i, node + real(DP) :: q + real(DP) :: qeps + real(DP) :: absdhdxsq + real(DP) :: depth + real(DP) :: cond + real(DP) :: derv + real(DP) :: eps + ! + ! -- Return if no inflows + if (this%nbound == 0) return + ! + ! -- Calculate hcof and rhs for each zdg entry + eps = 1.D-8 + do i = 1, this%nbound + + node = this%nodelist(i) + if (this%ibound(node) <= 0) then + this%hcof(i) = DZERO + this%rhs(i) = DZERO + cycle + end if + + ! -- calculate terms and add to hcof and rhs + absdhdxsq = this%slope(i)**DHALF + depth = this%xnew(node) - this%disl%reach_bottom(node) + + ! -- calculate unperturbed q + cond = this%get_cond(i, depth, absdhdxsq, this%unitconv) + q = -cond * this%slope(i) + + ! -- calculate perturbed q + cond = this%get_cond(i, depth + eps, absdhdxsq, this%unitconv) + qeps = -cond * this%slope(i) + + ! -- calculate derivative + derv = (qeps - q) / eps + + ! -- add terms to hcof and rhs + this%hcof(i) = derv + this%rhs(i) = -q + derv * this%xnew(node) + + end do + ! + return + end subroutine zdg_cf + + !> @brief Calculate conductance-like term + !! + !! Conductance normally has a dx term in the denominator + !! but that is not included here, as the flow is calculated + !! using Q = C * slope. The returned c value from this + !! function has dimensions of L3/T. + !! + !< + function get_cond(this, i, depth, absdhdxsq, unitconv) result(c) + ! -- modules + ! -- dummy + class(SwfZdgType) :: this + integer(I4B), intent(in) :: i !< boundary number + real(DP), intent(in) :: depth !< simulated depth (stage - elevation) in reach n for this iteration + real(DP), intent(in) :: absdhdxsq !< absolute value of simulated hydraulic gradient + real(DP), intent(in) :: unitconv !< conversion factor for roughness to length and time units of meters and seconds + ! -- local + integer(I4B) :: idcxs + real(DP) :: c + real(DP) :: width + real(DP) :: rough + real(DP) :: slope + real(DP) :: roughc + real(DP) :: a + real(DP) :: r + ! + idcxs = this%idcxs(i) + width = this%width(i) + rough = this%rough(i) + slope = this%slope(i) + roughc = this%cxs%get_roughness(idcxs, width, depth, rough, & + slope) + a = this%cxs%get_area(idcxs, width, depth) + r = this%cxs%get_hydraulic_radius(idcxs, width, depth, area=a) + + ! todo: unit convert? + c = a * r**DTWOTHIRDS / roughc / absdhdxsq + + end function get_cond + + !> @ brief Copy hcof and rhs terms into solution. + !! + !! Add the hcof and rhs terms for the ZDG package to the + !! coefficient matrix and right-hand side vector. + !! + !< + subroutine zdg_fc(this, rhs, ia, idxglo, matrix_sln) + ! -- dummy variables + class(SwfZdgType) :: this !< SwfZdgType object + real(DP), dimension(:), intent(inout) :: rhs !< right-hand side vector for model + integer(I4B), dimension(:), intent(in) :: ia !< solution CRS row pointers + integer(I4B), dimension(:), intent(in) :: idxglo !< mapping vector for model (local) to solution (global) + class(MatrixBaseType), pointer :: matrix_sln !< solution coefficient matrix + ! -- local variables + integer(I4B) :: i + integer(I4B) :: n + integer(I4B) :: ipos + ! + ! -- pakmvrobj fc + if (this%imover == 1) then + call this%pakmvrobj%fc() + end if + ! + ! -- Copy package rhs and hcof into solution rhs and amat + do i = 1, this%nbound + n = this%nodelist(i) + rhs(n) = rhs(n) + this%rhs(i) + ipos = ia(n) + call matrix_sln%add_value_pos(idxglo(ipos), this%hcof(i)) + ! + ! -- If mover is active and this zdg item is discharging, + ! store available water (as positive value). + if (this%imover == 1 .and. this%rhs(i) > DZERO) then + call this%pakmvrobj%accumulate_qformvr(i, this%rhs(i)) + end if + end do + ! + ! -- return + return + end subroutine zdg_fc + + !> @ brief Define the list label for the package + !! + !! Method defined the list label for the ZDG package. The list label is + !! the heading that is written to iout when PRINT_INPUT option is used. + !! + !< + subroutine define_listlabel(this) + ! -- dummy variables + class(SwfZdgType), intent(inout) :: this !< SwfZdgType object + ! + ! -- create the header list label + this%listlabel = trim(this%filtyp)//' NO.' + if (this%dis%ndim == 3) then + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'ROW' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'COL' + elseif (this%dis%ndim == 2) then + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'CELL2D' + else + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'NODE' + end if + write (this%listlabel, '(a, a16)') trim(this%listlabel), 'FLOW RATE' + if (this%inamedbound == 1) then + write (this%listlabel, '(a, a16)') trim(this%listlabel), 'BOUNDARY NAME' + end if + ! + ! -- return + return + end subroutine define_listlabel + + ! -- Procedures related to observations + + !> @brief Determine if observations are supported. + !! + !! Function to determine if observations are supported by the ZDG package. + !! Observations are supported by the ZDG package. + !! + !! @return zdg_obs_supported boolean indicating if observations are supported + !! + !< + logical function zdg_obs_supported(this) + ! -- dummy variables + class(SwfZdgType) :: this !< SwfZdgType object + ! + ! -- set boolean + zdg_obs_supported = .true. + ! + ! -- return + return + end function zdg_obs_supported + + !> @brief Define the observation types available in the package + !! + !! Method to define the observation types available in the ZDG package. + !! + !< + subroutine zdg_df_obs(this) + ! -- dummy variables + class(SwfZdgType) :: this !< SwfZdgType object + ! -- local variables + integer(I4B) :: indx + ! + ! -- initialize observations + call this%obs%StoreObsType('zdg', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => DefaultObsIdProcessor + ! + ! -- Store obs type and assign procedure pointer + ! for to-mvr observation type. + call this%obs%StoreObsType('to-mvr', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => DefaultObsIdProcessor + ! + ! -- return + return + end subroutine zdg_df_obs + + !> @brief Save observations for the package + !! + !! Method to save simulated values for the ZDG package. + !! + !< + subroutine zdg_bd_obs(this) + ! -- dummy variables + class(SwfZdgType) :: this !< SwfZdgType object + ! -- local variables + integer(I4B) :: i + integer(I4B) :: n + integer(I4B) :: jj + real(DP) :: v + type(ObserveType), pointer :: obsrv => null() + ! + ! -- clear the observations + call this%obs%obs_bd_clear() + ! + ! -- Save simulated values for all of package's observations. + do i = 1, this%obs%npakobs + obsrv => this%obs%pakobs(i)%obsrv + if (obsrv%BndFound) then + do n = 1, obsrv%indxbnds_count + v = DNODATA + jj = obsrv%indxbnds(n) + select case (obsrv%ObsTypeId) + case ('TO-MVR') + if (this%imover == 1) then + v = this%pakmvrobj%get_qtomvr(jj) + if (v > DZERO) then + v = -v + end if + end if + case ('ZDG') + v = this%simvals(jj) + case default + errmsg = 'Unrecognized observation type: '//trim(obsrv%ObsTypeId) + call store_error(errmsg) + end select + call this%obs%SaveOneSimval(obsrv, v) + end do + else + call this%obs%SaveOneSimval(obsrv, DNODATA) + end if + end do + ! + ! -- return + return + end subroutine zdg_bd_obs + + ! -- Procedure related to time series + + !> @brief Assign time series links for the package + !! + !! Assign the time series links for the ZDG package. Only + !! the Q variable can be defined with time series. + !! + !< + subroutine zdg_rp_ts(this) + ! -- dummy variables + class(SwfZdgType), intent(inout) :: this !< SwfZdgType object + ! -- local variables + integer(I4B) :: i, nlinks + type(TimeSeriesLinkType), pointer :: tslink => null() + ! + ! -- set up the time series links + nlinks = this%TsManager%boundtslinks%Count() + do i = 1, nlinks + tslink => GetTimeSeriesLinkFromList(this%TsManager%boundtslinks, i) + if (associated(tslink)) then + if (tslink%JCol == 1) then + tslink%Text = 'Q' + end if + end if + end do + ! + ! -- return + return + end subroutine zdg_rp_ts + + !> @ brief Return a bound value + !! + !! Return a bound value associated with an ncolbnd index + !! and row. + !! + !< + function zdg_bound_value(this, col, row) result(bndval) + ! -- modules + use ConstantsModule, only: DZERO + ! -- dummy variables + class(SwfZdgType), intent(inout) :: this !< BndExtType object + integer(I4B), intent(in) :: col + integer(I4B), intent(in) :: row + ! -- result + real(DP) :: bndval + ! + select case (col) + case (1) + bndval = this%idcxs(row) + case (2) + bndval = this%width(row) + case (3) + bndval = this%slope(row) + case (4) + bndval = this%rough(row) + case default + errmsg = 'Programming error. ZDG bound value requested column '& + &'outside range of ncolbnd (1).' + call store_error(errmsg) + call store_error_filename(this%input_fname) + end select + ! + ! -- return + return + end function zdg_bound_value + +end module SwfZdgModule diff --git a/src/Model/SurfaceWaterFlow/swf1zdg1idm.f90 b/src/Model/SurfaceWaterFlow/swf1zdg1idm.f90 new file mode 100644 index 00000000000..568d242cc91 --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf1zdg1idm.f90 @@ -0,0 +1,449 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module SwfZdgInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public swf_zdg_param_definitions + public swf_zdg_aggregate_definitions + public swf_zdg_block_definitions + public SwfZdgParamFoundType + public swf_zdg_multi_package + + type SwfZdgParamFoundType + logical :: auxiliary = .false. + logical :: boundnames = .false. + logical :: iprpak = .false. + logical :: iprflow = .false. + logical :: ipakcb = .false. + logical :: ts_filerecord = .false. + logical :: ts6 = .false. + logical :: filein = .false. + logical :: ts6_filename = .false. + logical :: obs_filerecord = .false. + logical :: obs6 = .false. + logical :: obs6_filename = .false. + logical :: maxbound = .false. + logical :: cellid = .false. + logical :: idcxs = .false. + logical :: width = .false. + logical :: slope = .false. + logical :: rough = .false. + logical :: auxvar = .false. + logical :: boundname = .false. + end type SwfZdgParamFoundType + + logical :: swf_zdg_multi_package = .true. + + type(InputParamDefinitionType), parameter :: & + swfzdg_auxiliary = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'OPTIONS', & ! block + 'AUXILIARY', & ! tag name + 'AUXILIARY', & ! fortran variable + 'STRING', & ! type + 'NAUX', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_boundnames = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'OPTIONS', & ! block + 'BOUNDNAMES', & ! tag name + 'BOUNDNAMES', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_iprpak = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_INPUT', & ! tag name + 'IPRPAK', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_iprflow = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_FLOWS', & ! tag name + 'IPRFLOW', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_ipakcb = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'OPTIONS', & ! block + 'SAVE_FLOWS', & ! tag name + 'IPAKCB', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_ts_filerecord = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'OPTIONS', & ! block + 'TS_FILERECORD', & ! tag name + 'TS_FILERECORD', & ! fortran variable + 'RECORD TS6 FILEIN TS6_FILENAME', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_ts6 = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'OPTIONS', & ! block + 'TS6', & ! tag name + 'TS6', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_filein = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'OPTIONS', & ! block + 'FILEIN', & ! tag name + 'FILEIN', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_ts6_filename = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'OPTIONS', & ! block + 'TS6_FILENAME', & ! tag name + 'TS6_FILENAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_obs_filerecord = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'OPTIONS', & ! block + 'OBS_FILERECORD', & ! tag name + 'OBS_FILERECORD', & ! fortran variable + 'RECORD OBS6 FILEIN OBS6_FILENAME', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_obs6 = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'OPTIONS', & ! block + 'OBS6', & ! tag name + 'OBS6', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_obs6_filename = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'OPTIONS', & ! block + 'OBS6_FILENAME', & ! tag name + 'OBS6_FILENAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_maxbound = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'DIMENSIONS', & ! block + 'MAXBOUND', & ! tag name + 'MAXBOUND', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_cellid = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'PERIOD', & ! block + 'CELLID', & ! tag name + 'CELLID', & ! fortran variable + 'INTEGER1D', & ! type + 'NCELLDIM', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_idcxs = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'PERIOD', & ! block + 'IDCXS', & ! tag name + 'IDCXS', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_width = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'PERIOD', & ! block + 'WIDTH', & ! tag name + 'WIDTH', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .true. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_slope = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'PERIOD', & ! block + 'SLOPE', & ! tag name + 'SLOPE', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .true. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_rough = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'PERIOD', & ! block + 'ROUGH', & ! tag name + 'ROUGH', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .true. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_auxvar = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'PERIOD', & ! block + 'AUX', & ! tag name + 'AUXVAR', & ! fortran variable + 'DOUBLE1D', & ! type + 'NAUX', & ! shape + .false., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .true. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfzdg_boundname = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'PERIOD', & ! block + 'BOUNDNAME', & ! tag name + 'BOUNDNAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_zdg_param_definitions(*) = & + [ & + swfzdg_auxiliary, & + swfzdg_boundnames, & + swfzdg_iprpak, & + swfzdg_iprflow, & + swfzdg_ipakcb, & + swfzdg_ts_filerecord, & + swfzdg_ts6, & + swfzdg_filein, & + swfzdg_ts6_filename, & + swfzdg_obs_filerecord, & + swfzdg_obs6, & + swfzdg_obs6_filename, & + swfzdg_maxbound, & + swfzdg_cellid, & + swfzdg_idcxs, & + swfzdg_width, & + swfzdg_slope, & + swfzdg_rough, & + swfzdg_auxvar, & + swfzdg_boundname & + ] + + type(InputParamDefinitionType), parameter :: & + swfzdg_spd = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'ZDG', & ! subcomponent + 'PERIOD', & ! block + 'STRESS_PERIOD_DATA', & ! tag name + 'SPD', & ! fortran variable + 'RECARRAY CELLID IDCXS WIDTH SLOPE ROUGH AUX BOUNDNAME', & ! type + 'MAXBOUND', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_zdg_aggregate_definitions(*) = & + [ & + swfzdg_spd & + ] + + type(InputBlockDefinitionType), parameter :: & + swf_zdg_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'PERIOD', & ! blockname + .true., & ! required + .true., & ! aggregate + .true. & ! block_variable + ) & + ] + +end module SwfZdgInputModule diff --git a/src/SimulationCreate.f90 b/src/SimulationCreate.f90 index fbf37202459..81451c187ee 100644 --- a/src/SimulationCreate.f90 +++ b/src/SimulationCreate.f90 @@ -214,6 +214,7 @@ subroutine models_create() use GwfModule, only: gwf_cr use GwtModule, only: gwt_cr use GweModule, only: gwe_cr + use SwfModule, only: swf_cr use NumericalModelModule, only: NumericalModelType, GetNumericalModelFromList use VirtualGwfModelModule, only: add_virtual_gwf_model use VirtualGwtModelModule, only: add_virtual_gwt_model @@ -304,6 +305,16 @@ subroutine models_create() model_loc_idx(n) = im end if call add_virtual_gwe_model(n, model_names(n), num_model) + case ('SWF6') + if (model_ranks(n) == proc_id) then + im = im + 1 + write (iout, '(4x,2a,i0,a)') trim(model_type), " model ", & + n, " will be created" + call swf_cr(fname, n, model_names(n)) + num_model => GetNumericalModelFromList(basemodellist, im) + model_loc_idx(n) = im + end if + !todo call add_virtual_gwt_model(n, model_names(n), num_model) case default write (errmsg, '(a,a)') & 'Unknown simulation model type: ', trim(model_type) @@ -337,6 +348,7 @@ subroutine exchanges_create() use GwfGweExchangeModule, only: gwfgwe_cr use GwtGwtExchangeModule, only: gwtexchange_create use GweGweExchangeModule, only: gweexchange_create + use SwfGwfExchangeModule, only: swfgwf_cr use VirtualGwfExchangeModule, only: add_virtual_gwf_exchange use VirtualGwtExchangeModule, only: add_virtual_gwt_exchange use VirtualGweExchangeModule, only: add_virtual_gwe_exchange @@ -448,6 +460,11 @@ subroutine exchanges_create() exg_mempath) end if call add_virtual_gwe_exchange(exg_name, exg_id, m1_id, m2_id) + case ('SWF6-GWF6') + write (exg_name, '(a,i0)') 'SWF-GWF_', exg_id + if (both_local) then + call swfgwf_cr(fname, exg_name, exg_id, m1_id, m2_id, exg_mempath) + end if case default write (errmsg, '(a,a)') & 'Unknown simulation exchange type: ', trim(exgtype) diff --git a/src/Solution/NumericalSolution.f90 b/src/Solution/NumericalSolution.f90 index 41bc43e576b..94049065069 100644 --- a/src/Solution/NumericalSolution.f90 +++ b/src/Solution/NumericalSolution.f90 @@ -2215,7 +2215,7 @@ end subroutine save !> @ brief Add a model !! - !! Add a model to s solution. + !! Add a model to solution. !! !< subroutine add_model(this, mp) diff --git a/src/Utilities/Idm/SourceCommon.f90 b/src/Utilities/Idm/SourceCommon.f90 index 3ba4640a2bf..7ed0f52d6e8 100644 --- a/src/Utilities/Idm/SourceCommon.f90 +++ b/src/Utilities/Idm/SourceCommon.f90 @@ -313,7 +313,7 @@ subroutine set_model_shape(ftype, fname, model_mempath, dis_mempath, & else call store_error_filename(fname) end if - case ('DISU6') + case ('DISU6', 'DISL6') ! call get_isize('NODES', dis_mempath, dim1_size) ! diff --git a/src/Utilities/Idm/SourceLoad.F90 b/src/Utilities/Idm/SourceLoad.F90 index 4339e21697a..812b6681175 100644 --- a/src/Utilities/Idm/SourceLoad.F90 +++ b/src/Utilities/Idm/SourceLoad.F90 @@ -295,6 +295,10 @@ function remote_model_ndim(mtype, mfname) result(ncelldim) ncelldim = 1 exit case default + write (errmsg, '(a)') & + 'Unknown discretization type "'//trim(ptype)// & + '" not currently supported.' + call store_error(errmsg, .true.) end select end do end if diff --git a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 index bd33599f244..d2664bf18c8 100644 --- a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 +++ b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 @@ -146,12 +146,14 @@ recursive subroutine parse_block(parser, mf6_input, iblock, mshape, filename, & type(MemoryType), pointer :: mt ! ! -- disu vertices/cell2d blocks are contingent on NVERT dimension - if (mf6_input%pkgtype == 'DISU6' .and. & - (mf6_input%block_dfns(iblock)%blockname == 'VERTICES' .or. & - mf6_input%block_dfns(iblock)%blockname == 'CELL2D')) then - call get_from_memorylist('NVERT', mf6_input%mempath, mt, found, .false.) - if (.not. found) return - if (mt%intsclr == 0) return + if (mf6_input%pkgtype == 'DISU6' .or. mf6_input%pkgtype == 'DISL6') then + if (mf6_input%block_dfns(iblock)%blockname == 'VERTICES' .or. & + mf6_input%block_dfns(iblock)%blockname == 'CELL2D') then + call get_from_memorylist('NVERT', mf6_input%mempath, mt, found, & + .false.) + if (.not. found) return + if (mt%intsclr == 0) return + end if end if ! ! -- block open/close support diff --git a/src/Utilities/Idm/selector/IdmDfnSelector.f90 b/src/Utilities/Idm/selector/IdmDfnSelector.f90 index 57c272f4c31..409894f4bb7 100644 --- a/src/Utilities/Idm/selector/IdmDfnSelector.f90 +++ b/src/Utilities/Idm/selector/IdmDfnSelector.f90 @@ -9,6 +9,7 @@ module IdmDfnSelectorModule use IdmGwtDfnSelectorModule use IdmGweDfnSelectorModule use IdmExgDfnSelectorModule + use IdmSwfDfnSelectorModule use IdmSimDfnSelectorModule implicit none @@ -36,6 +37,8 @@ function param_definitions(component, subcomponent) result(input_definition) input_definition => gwe_param_definitions(subcomponent) case ('EXG') input_definition => exg_param_definitions(subcomponent) + case ('SWF') + input_definition => swf_param_definitions(subcomponent) case ('SIM') input_definition => sim_param_definitions(subcomponent) case default @@ -57,6 +60,8 @@ function aggregate_definitions(component, subcomponent) result(input_definition) input_definition => gwe_aggregate_definitions(subcomponent) case ('EXG') input_definition => exg_aggregate_definitions(subcomponent) + case ('SWF') + input_definition => swf_aggregate_definitions(subcomponent) case ('SIM') input_definition => sim_aggregate_definitions(subcomponent) case default @@ -78,6 +83,8 @@ function block_definitions(component, subcomponent) result(input_definition) input_definition => gwe_block_definitions(subcomponent) case ('EXG') input_definition => exg_block_definitions(subcomponent) + case ('SWF') + input_definition => swf_block_definitions(subcomponent) case ('SIM') input_definition => sim_block_definitions(subcomponent) case default @@ -98,6 +105,8 @@ function idm_multi_package(component, subcomponent) result(multi_package) multi_package = gwe_idm_multi_package(subcomponent) case ('EXG') multi_package = exg_idm_multi_package(subcomponent) + case ('SWF') + multi_package = swf_idm_multi_package(subcomponent) case ('SIM') multi_package = sim_idm_multi_package(subcomponent) case default @@ -122,6 +131,8 @@ function idm_integrated(component, subcomponent) result(integrated) integrated = gwe_idm_integrated(subcomponent) case ('EXG') integrated = exg_idm_integrated(subcomponent) + case ('SWF') + integrated = swf_idm_integrated(subcomponent) case ('SIM') integrated = sim_idm_integrated(subcomponent) case default @@ -142,6 +153,8 @@ function idm_component(component) result(integrated) integrated = .true. case ('EXG') integrated = .true. + case ('SWF') + integrated = .true. case ('SIM') integrated = .true. case default diff --git a/src/Utilities/Idm/selector/IdmExgDfnSelector.f90 b/src/Utilities/Idm/selector/IdmExgDfnSelector.f90 index 558a9decc27..ab7c9b75fc6 100644 --- a/src/Utilities/Idm/selector/IdmExgDfnSelector.f90 +++ b/src/Utilities/Idm/selector/IdmExgDfnSelector.f90 @@ -10,6 +10,7 @@ module IdmExgDfnSelectorModule use ExgGwfgweInputModule use ExgGwtgwtInputModule use ExgGwegweInputModule + use ExgSwfgwfInputModule implicit none private @@ -48,6 +49,8 @@ function exg_param_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, exg_gwtgwt_param_definitions) case ('GWEGWE') call set_param_pointer(input_definition, exg_gwegwe_param_definitions) + case ('SWFGWF') + call set_param_pointer(input_definition, exg_swfgwf_param_definitions) case default end select return @@ -68,6 +71,8 @@ function exg_aggregate_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, exg_gwtgwt_aggregate_definitions) case ('GWEGWE') call set_param_pointer(input_definition, exg_gwegwe_aggregate_definitions) + case ('SWFGWF') + call set_param_pointer(input_definition, exg_swfgwf_aggregate_definitions) case default end select return @@ -88,6 +93,8 @@ function exg_block_definitions(subcomponent) result(input_definition) call set_block_pointer(input_definition, exg_gwtgwt_block_definitions) case ('GWEGWE') call set_block_pointer(input_definition, exg_gwegwe_block_definitions) + case ('SWFGWF') + call set_block_pointer(input_definition, exg_swfgwf_block_definitions) case default end select return @@ -107,6 +114,8 @@ function exg_idm_multi_package(subcomponent) result(multi_package) multi_package = exg_gwtgwt_multi_package case ('GWEGWE') multi_package = exg_gwegwe_multi_package + case ('SWFGWF') + multi_package = exg_swfgwf_multi_package case default call store_error('Idm selector subcomponent not found; '//& &'component="EXG"'//& @@ -130,6 +139,8 @@ function exg_idm_integrated(subcomponent) result(integrated) integrated = .true. case ('GWEGWE') integrated = .true. + case ('SWFGWF') + integrated = .true. case default end select return diff --git a/src/Utilities/Idm/selector/IdmSwfDfnSelector.f90 b/src/Utilities/Idm/selector/IdmSwfDfnSelector.f90 new file mode 100644 index 00000000000..fc55ac514c7 --- /dev/null +++ b/src/Utilities/Idm/selector/IdmSwfDfnSelector.f90 @@ -0,0 +1,171 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module IdmSwfDfnSelectorModule + + use ConstantsModule, only: LENVARNAME + use SimModule, only: store_error + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + use SwfNamInputModule + use SwfDislInputModule + use SwfCxsInputModule + use SwfDfwInputModule + use SwfIcInputModule + use SwfChdInputModule + use SwfFlwInputModule + use SwfZdgInputModule + + implicit none + private + public :: swf_param_definitions + public :: swf_aggregate_definitions + public :: swf_block_definitions + public :: swf_idm_multi_package + public :: swf_idm_integrated + +contains + + subroutine set_param_pointer(input_dfn, input_dfn_target) + type(InputParamDefinitionType), dimension(:), pointer :: input_dfn + type(InputParamDefinitionType), dimension(:), target :: input_dfn_target + input_dfn => input_dfn_target + end subroutine set_param_pointer + + subroutine set_block_pointer(input_dfn, input_dfn_target) + type(InputBlockDefinitionType), dimension(:), pointer :: input_dfn + type(InputBlockDefinitionType), dimension(:), target :: input_dfn_target + input_dfn => input_dfn_target + end subroutine set_block_pointer + + function swf_param_definitions(subcomponent) result(input_definition) + character(len=*), intent(in) :: subcomponent + type(InputParamDefinitionType), dimension(:), pointer :: input_definition + nullify (input_definition) + select case (subcomponent) + case ('NAM') + call set_param_pointer(input_definition, swf_nam_param_definitions) + case ('DISL') + call set_param_pointer(input_definition, swf_disl_param_definitions) + case ('CXS') + call set_param_pointer(input_definition, swf_cxs_param_definitions) + case ('DFW') + call set_param_pointer(input_definition, swf_dfw_param_definitions) + case ('IC') + call set_param_pointer(input_definition, swf_ic_param_definitions) + case ('CHD') + call set_param_pointer(input_definition, swf_chd_param_definitions) + case ('FLW') + call set_param_pointer(input_definition, swf_flw_param_definitions) + case ('ZDG') + call set_param_pointer(input_definition, swf_zdg_param_definitions) + case default + end select + return + end function swf_param_definitions + + function swf_aggregate_definitions(subcomponent) result(input_definition) + character(len=*), intent(in) :: subcomponent + type(InputParamDefinitionType), dimension(:), pointer :: input_definition + nullify (input_definition) + select case (subcomponent) + case ('NAM') + call set_param_pointer(input_definition, swf_nam_aggregate_definitions) + case ('DISL') + call set_param_pointer(input_definition, swf_disl_aggregate_definitions) + case ('CXS') + call set_param_pointer(input_definition, swf_cxs_aggregate_definitions) + case ('DFW') + call set_param_pointer(input_definition, swf_dfw_aggregate_definitions) + case ('IC') + call set_param_pointer(input_definition, swf_ic_aggregate_definitions) + case ('CHD') + call set_param_pointer(input_definition, swf_chd_aggregate_definitions) + case ('FLW') + call set_param_pointer(input_definition, swf_flw_aggregate_definitions) + case ('ZDG') + call set_param_pointer(input_definition, swf_zdg_aggregate_definitions) + case default + end select + return + end function swf_aggregate_definitions + + function swf_block_definitions(subcomponent) result(input_definition) + character(len=*), intent(in) :: subcomponent + type(InputBlockDefinitionType), dimension(:), pointer :: input_definition + nullify (input_definition) + select case (subcomponent) + case ('NAM') + call set_block_pointer(input_definition, swf_nam_block_definitions) + case ('DISL') + call set_block_pointer(input_definition, swf_disl_block_definitions) + case ('CXS') + call set_block_pointer(input_definition, swf_cxs_block_definitions) + case ('DFW') + call set_block_pointer(input_definition, swf_dfw_block_definitions) + case ('IC') + call set_block_pointer(input_definition, swf_ic_block_definitions) + case ('CHD') + call set_block_pointer(input_definition, swf_chd_block_definitions) + case ('FLW') + call set_block_pointer(input_definition, swf_flw_block_definitions) + case ('ZDG') + call set_block_pointer(input_definition, swf_zdg_block_definitions) + case default + end select + return + end function swf_block_definitions + + function swf_idm_multi_package(subcomponent) result(multi_package) + character(len=*), intent(in) :: subcomponent + logical :: multi_package + select case (subcomponent) + case ('NAM') + multi_package = swf_nam_multi_package + case ('DISL') + multi_package = swf_disl_multi_package + case ('CXS') + multi_package = swf_cxs_multi_package + case ('DFW') + multi_package = swf_dfw_multi_package + case ('IC') + multi_package = swf_ic_multi_package + case ('CHD') + multi_package = swf_chd_multi_package + case ('FLW') + multi_package = swf_flw_multi_package + case ('ZDG') + multi_package = swf_zdg_multi_package + case default + call store_error('Idm selector subcomponent not found; '//& + &'component="SWF"'//& + &', subcomponent="'//trim(subcomponent)//'".', .true.) + end select + return + end function swf_idm_multi_package + + function swf_idm_integrated(subcomponent) result(integrated) + character(len=*), intent(in) :: subcomponent + logical :: integrated + integrated = .false. + select case (subcomponent) + case ('NAM') + integrated = .true. + case ('DISL') + integrated = .true. + case ('CXS') + integrated = .true. + case ('DFW') + integrated = .true. + case ('IC') + integrated = .true. + case ('CHD') + integrated = .true. + case ('FLW') + integrated = .true. + case ('ZDG') + integrated = .true. + case default + end select + return + end function swf_idm_integrated + +end module IdmSwfDfnSelectorModule diff --git a/src/meson.build b/src/meson.build index 24ef7691927..dd175861e2f 100644 --- a/src/meson.build +++ b/src/meson.build @@ -42,6 +42,8 @@ modflow_sources = files( 'Exchange' / 'gwfgweidm.f90', 'Exchange' / 'gwtgwtidm.f90', 'Exchange' / 'gwegweidm.f90', + 'Exchange' / 'SwfGwfExchange.f90', + 'Exchange' / 'swfgwfidm.f90', 'Model' / 'Connection' / 'ConnectionBuilder.f90', 'Model' / 'Connection' / 'CellWithNbrs.f90', 'Model' / 'Connection' / 'CsrUtils.f90', @@ -135,11 +137,30 @@ modflow_sources = files( 'Model' / 'GroundWaterTransport' / 'gwt1sft1.f90', 'Model' / 'GroundWaterTransport' / 'gwt1src1.f90', 'Model' / 'GroundWaterTransport' / 'gwt1uzt1.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1disl1.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1disl1idm.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1idm.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1cxs1.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1cxs1idm.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1dfw1.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1dfw1idm.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1ic1.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1ic1idm.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1obs1.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1oc1.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1flw1.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1flw1idm.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1chd1idm.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1sto1.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1zdg1.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf1zdg1idm.f90', 'Model' / 'ModelUtilities' / 'BoundaryPackage.f90', 'Model' / 'ModelUtilities' / 'BoundaryPackageExt.f90', 'Model' / 'ModelUtilities' / 'GweCndOptions.f90', 'Model' / 'ModelUtilities' / 'Connections.f90', 'Model' / 'ModelUtilities' / 'DiscretizationBase.f90', + 'Model' / 'ModelUtilities' / 'DislGeom.f90', 'Model' / 'ModelUtilities' / 'DisvGeom.f90', 'Model' / 'ModelUtilities' / 'FlowModelInterface.f90', 'Model' / 'ModelUtilities' / 'GweInputData.f90', @@ -156,6 +177,7 @@ modflow_sources = files( 'Model' / 'ModelUtilities' / 'SfrCrossSectionManager.f90', 'Model' / 'ModelUtilities' / 'SfrCrossSectionUtils.f90', 'Model' / 'ModelUtilities' / 'TspAdvOptions.f90', + 'Model' / 'ModelUtilities' / 'SwfCxsUtils.f90', 'Model' / 'ModelUtilities' / 'UzfCellGroup.f90', 'Model' / 'ModelUtilities' / 'Xt3dAlgorithm.f90', 'Model' / 'ModelUtilities' / 'Xt3dInterface.f90', @@ -218,6 +240,7 @@ modflow_sources = files( 'Utilities' / 'Idm' / 'selector' / 'IdmGwfDfnSelector.f90', 'Utilities' / 'Idm' / 'selector' / 'IdmGwtDfnSelector.f90', 'Utilities' / 'Idm' / 'selector' / 'IdmSimDfnSelector.f90', + 'Utilities' / 'Idm' / 'selector' / 'IdmSwfDfnSelector.f90', 'Utilities' / 'Matrix' / 'MatrixBase.f90', 'Utilities' / 'Matrix' / 'SparseMatrix.f90', 'Utilities' / 'Memory' / 'Memory.f90', diff --git a/utils/idmloader/scripts/dfn2f90.py b/utils/idmloader/scripts/dfn2f90.py index f53fa3e1150..6c09fdb8714 100644 --- a/utils/idmloader/scripts/dfn2f90.py +++ b/utils/idmloader/scripts/dfn2f90.py @@ -1053,6 +1053,42 @@ def _write_master_component(self, fh=None): DFN_PATH / "exg-gwegwe.dfn", SRC_PATH / "Exchange" / "gwegweidm.f90", ], + [ + DFN_PATH / "swf-nam.dfn", + SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf1idm.f90", + ], + [ + DFN_PATH / "swf-disl.dfn", + SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf1disl1idm.f90", + ], + [ + DFN_PATH / "swf-cxs.dfn", + SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf1cxs1idm.f90", + ], + [ + DFN_PATH / "swf-dfw.dfn", + SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf1dfw1idm.f90", + ], + [ + DFN_PATH / "swf-ic.dfn", + SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf1ic1idm.f90", + ], + [ + DFN_PATH / "swf-chd.dfn", + SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf1chd1idm.f90", + ], + [ + DFN_PATH / "swf-flw.dfn", + SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf1flw1idm.f90", + ], + [ + DFN_PATH / "swf-zdg.dfn", + SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf1zdg1idm.f90", + ], + [ + DFN_PATH / "exg-swfgwf.dfn", + SRC_PATH / "Exchange" / "swfgwfidm.f90", + ], [ DFN_PATH / "sim-nam.dfn", SRC_PATH / "simnamidm.f90", From a602d1813161bc26bb1dfc938476e1d23c5a70ca Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Sun, 18 Feb 2024 12:30:04 -0600 Subject: [PATCH 026/199] refactor(swf-disl): remove unused routines (#1631) * refactor(swf-disl): remove unused routines * fprettify * some minor reformatting --- src/Model/GroundWaterFlow/gwf3obs8.f90 | 4 +- src/Model/ModelUtilities/Connections.f90 | 11 +- src/Model/ModelUtilities/DislGeom.f90 | 379 +---------------------- src/Model/SurfaceWaterFlow/swf1.f90 | 1 - src/Model/SurfaceWaterFlow/swf1disl1.f90 | 4 +- src/Model/SurfaceWaterFlow/swf1obs1.f90 | 87 ++---- src/Model/SurfaceWaterFlow/swf1sto1.f90 | 1 - 7 files changed, 37 insertions(+), 450 deletions(-) diff --git a/src/Model/GroundWaterFlow/gwf3obs8.f90 b/src/Model/GroundWaterFlow/gwf3obs8.f90 index e15ec7c8f57..38c6f52cb26 100644 --- a/src/Model/GroundWaterFlow/gwf3obs8.f90 +++ b/src/Model/GroundWaterFlow/gwf3obs8.f90 @@ -35,7 +35,7 @@ module GwfObsModule !> @brief Create a new GwfObsType object !! - !! Create oseration object, allocate pointers, initialize values + !! Create observation object, allocate pointers, initialize values !< subroutine gwf_obs_cr(obs, inobs) ! -- dummy @@ -194,7 +194,7 @@ end subroutine set_pointers ! -- Procedures related to GWF observations (NOT type-bound) - !> @brief Calculate drawdown obseration when requested + !> @brief Calculate drawdown observation when requested !< subroutine gwf_process_head_drawdown_obs_id(obsrv, dis, inunitobs, iout) ! -- dummy diff --git a/src/Model/ModelUtilities/Connections.f90 b/src/Model/ModelUtilities/Connections.f90 index 694c2e50625..ab673bbc912 100644 --- a/src/Model/ModelUtilities/Connections.f90 +++ b/src/Model/ModelUtilities/Connections.f90 @@ -1025,7 +1025,6 @@ subroutine dislconnections_verts(this, name_model, nodes, nodesuser, & use ConstantsModule, only: DHALF, DZERO, DTHREE, DTWO, DPI use SparseModule, only: sparsematrix use GeomUtilModule, only: get_node - use DislGeom, only: DislGeomType use MemoryManagerModule, only: mem_reallocate ! -- dummy class(ConnectionsType) :: this @@ -1048,7 +1047,6 @@ subroutine dislconnections_verts(this, name_model, nodes, nodesuser, & integer(I4B), dimension(:), allocatable :: javertcells type(sparsematrix) :: sparse, vertcellspm integer(I4B) :: n, m, i, j, ierror - ! type(DislGeomType) :: geol ! ! -- Allocate scalars call this%allocate_scalars(name_model) @@ -1056,14 +1054,10 @@ subroutine dislconnections_verts(this, name_model, nodes, nodesuser, & ! -- Set scalars this%nodes = nodes this%ianglex = 1 - ! -- Initialize DislGeomType objects - ! call geol%init(nodesuser, nodes, cellfdc, iavert, javert, iavertcells, & - ! javertcells, vertices, cellxyz, centerverts, & - ! nodereduced, nodeuser) - + ! ! -- Create a sparse matrix array with a row for each vertex. The columns ! in the sparse matrix contains the cells that include that vertex. - ! This array will be used to determine horizontal cell connectivity. + ! This array will be used to determine cell connectivity. allocate (itemp(nvert)) do i = 1, nvert itemp(i) = 4 @@ -1426,6 +1420,7 @@ subroutine vertexconnect(nodes, nrsize, maxnnz, nlay, ncpl, sparse, & end subroutine vertexconnect !> @brief Routine to make cell connections from vertices + !! for a linear network !< subroutine vertexconnectl(nodes, nrsize, maxnnz, nodeuser, sparse, & iavertcells, javertcells, & diff --git a/src/Model/ModelUtilities/DislGeom.f90 b/src/Model/ModelUtilities/DislGeom.f90 index 7b80b59b716..9c5fca3ba46 100644 --- a/src/Model/ModelUtilities/DislGeom.f90 +++ b/src/Model/ModelUtilities/DislGeom.f90 @@ -1,350 +1,21 @@ module DislGeom use KindModule, only: DP, I4B - use SimModule, only: store_error, store_error_unit, ustop implicit none private - public :: DislGeomType - public :: calcdist, partialdist, line_unit_vector - - type DislGeomType - integer(I4B) :: nodesuser - logical :: reduced - integer(I4B) :: nodes ! number of reduced nodes; - real(DP), pointer, dimension(:) :: cellfdc => null() - integer(I4B), pointer, dimension(:) :: iavert => null() - integer(I4B), pointer, dimension(:) :: javert => null() - integer(I4B), pointer, dimension(:) :: iavertcells => null() - integer(I4B), pointer, dimension(:) :: javertcells => null() - real(DP), pointer, dimension(:, :) :: vertices => null() - real(DP), pointer, dimension(:, :) :: cellcenters => null() - integer(I4B), pointer, dimension(:, :) :: centerverts => null() - integer(I4B), pointer, dimension(:) :: nodereduced => null() - integer(I4B), pointer, dimension(:) :: nodeuser => null() - contains - procedure :: init - procedure :: cprops - procedure :: connection_vector - procedure :: shared_vertex - procedure :: disttocenter - procedure :: containscenter - procedure :: vertccdist - end type DislGeomType + public :: calcdist, line_unit_vector contains - subroutine init(this, nodesuser, nodes, cellfdc, iavert, javert, & - iavertcells, javertcells, vertices, cellcenters, & - centerverts, nodereduced, nodeuser) - class(DislGeomType) :: this - integer(I4B), intent(in) :: nodesuser - integer(I4B), intent(in) :: nodes - real(DP), dimension(nodes), target :: cellfdc - integer(I4B), dimension(:), target :: iavert - integer(I4B), dimension(:), target :: javert - integer(I4B), dimension(:), target :: iavertcells - integer(I4B), dimension(:), target :: javertcells - real(DP), dimension(:, :), target :: vertices - real(DP), dimension(:, :), target :: cellcenters - integer(I4B), dimension(:, :), target :: centerverts - integer(I4B), dimension(:), target :: nodereduced - integer(I4B), dimension(:), target :: nodeuser - ! -- local - this%nodes = nodes - this%nodesuser = nodesuser - this%cellfdc => cellfdc - this%iavert => iavert - this%javert => javert - this%iavertcells => iavertcells - this%javertcells => javertcells - - this%vertices => vertices - this%cellcenters => cellcenters - this%centerverts => centerverts - this%nodereduced => nodereduced - this%nodeuser => nodeuser - if (nodes < nodesuser) then - this%reduced = .true. - else - this%reduced = .false. - end if - end subroutine init - - subroutine cprops(this, cell1, cell2, hwva, cl1, cl2) - ! -- module - use ConstantsModule, only: DZERO, DHALF, DONE - class(DislGeomType) :: this - integer(I4B), intent(in) :: cell1 - integer(I4B), intent(in) :: cell2 - real(DP), intent(out) :: hwva - real(DP), intent(out) :: cl1 - real(DP), intent(out) :: cl2 - ! -- local - integer(I4B) :: shared_vert - character(len=300) :: ermsg - character(len=*), parameter :: fmtvert = & - "('CELLS ', I0, ' AND ', i0, ' & - &DO NOT SHARE A VERTEX ')" - - ! find shared vertex - call this%shared_vertex(cell1, cell2, shared_vert) - if (shared_vert == 0) then - write (ermsg, fmtvert) cell1, cell2 - call store_error(ermsg) - call ustop() - end if - - ! cl1 - distance from center of pipe 1 to vertex - cl1 = this%disttocenter(cell1, shared_vert) - - ! cl2 - distance from center of pipe 2 to connection - cl2 = this%disttocenter(cell2, shared_vert) - - ! hwva - smallest cross sectional area? - - return - end subroutine cprops - - subroutine shared_vertex(this, cell1, cell2, shared_vert) - ! return the shared vertex of two cells - ! -- module - class(DislGeomType) :: this - integer(I4B), intent(in) :: cell1 - integer(I4B), intent(in) :: cell2 - integer(I4B), intent(out) :: shared_vert - ! -- local - integer(I4B) :: n, v, test1, test3, test4, test5 - ! - ! find shared vertex - shared_vert = 0 - ! loop through all vertices in cell1 - outer: do v = this%iavert(cell1), this%iavert(cell1 + 1) - 1 - ! loop through all cells that share vertex v - test1 = this%javert(v) - test3 = this%iavertcells(this%javert(v)) - test4 = this%iavertcells(this%javert(v) + 1) - do n = this%iavertcells(this%javert(v)), & - this%iavertcells(this%javert(v) + 1) - 1 - ! if cell2 has shared vertex v - test5 = this%javertcells(n) - if (cell2 == this%javertcells(n)) then - ! save shared vertex and exit - shared_vert = this%javert(v) - exit outer - end if - end do - end do outer - return - end subroutine shared_vertex - - subroutine connection_vector(this, cell1, cell2, nozee, xcomp, & - ycomp, zcomp, conlen) - ! return the x y and z components of a unit vector that points - ! from the center of this to the center of cell2, and the - ! straight-line connection length - ! -- module - use ConstantsModule, only: DZERO, DHALF, DONE - ! -- dummy - class(DislGeomType) :: this - integer(I4B), intent(in) :: cell1 - integer(I4B), intent(in) :: cell2 - logical, intent(in) :: nozee - real(DP), intent(out) :: xcomp - real(DP), intent(out) :: ycomp - real(DP), intent(out) :: zcomp - real(DP), intent(out) :: conlen - ! -- local - real(DP) :: x1, y1, z1, x2, y2, z2 - ! - x1 = this%cellcenters(1, cell1) - y1 = this%cellcenters(2, cell1) - x2 = this%cellcenters(1, cell2) - y2 = this%cellcenters(2, cell2) - if (nozee) then - z1 = DZERO - z2 = DZERO - else - z1 = this%cellcenters(3, cell1) - z2 = this%cellcenters(3, cell2) - end if - call line_unit_vector(x1, y1, z1, x2, y2, z2, xcomp, ycomp, zcomp, & - conlen) - return - end subroutine connection_vector - - function disttocenter(this, nodenum, vertnum) result(dist) -! ****************************************************************************** -! disttocenter -- Return distance from cell vertex to cell center -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ - class(DislGeomType) :: this - integer(I4B), intent(in) :: nodenum - integer(I4B), intent(in) :: vertnum - real(DP) :: dist - integer(I4B) :: j - logical :: cellcenter, vertex - character(len=300) :: ermsg - character(len=*), parameter :: novert = & - "('VERTEX ', I0, ' NOT IN NODE ', i0, '.')" - character(len=*), parameter :: cellcent = & - "('CELL CENTER NOT FOUND FOR & - &NODE ', I0, '.')" -! ------------------------------------------------------------------------------ - ! initialize - j = this%iavert(nodenum) - if (this%javert(j) == vertnum) then - vertex = .true. - if (this%containscenter(nodenum, this%javert(j), & - this%javert(j + 1)) .eqv. .true.) then - cellcenter = .true. - dist = this%vertccdist(nodenum, this%javert(j)) - return - else - cellcenter = .false. - dist = calcdist(this%vertices, this%javert(j), this%javert(j + 1)) - end if - else - vertex = .false. - if (this%containscenter(nodenum, this%javert(j), & - this%javert(j + 1)) .eqv. .true.) then - cellcenter = .true. - dist = this%vertccdist(nodenum, this%javert(j + 1)) - else - cellcenter = .false. - dist = 0.0 - end if - end if - - ! loop through cell's vertices - loop: do j = this%iavert(nodenum) + 1, this%iavert(nodenum + 1) - 1 - if (this%javert(j) == vertnum) then - vertex = .true. - if (cellcenter .eqv. .true.) then - exit loop - else - if (this%containscenter(nodenum, this%javert(j), & - this%javert(j + 1)) .eqv. .true.) then - cellcenter = .true. - ! add the distance from this vertex to the cell center - dist = dist + this%vertccdist(nodenum, this%javert(j)) - exit loop - else - ! add the distance between this vertex and the next - dist = dist + calcdist(this%vertices, this%javert(j), & - this%javert(j + 1)) - end if - end if - else if (this%containscenter(nodenum, this%javert(j), & - this%javert(j + 1)) .eqv. .true.) then - cellcenter = .true. - if (vertex .eqv. .true.) then - ! add the remaining distance from the current vertex to the cell center - dist = dist + this%vertccdist(nodenum, this%javert(j)) - exit loop - else - ! add the distance from the cell center to the next vertex - dist = dist + this%vertccdist(nodenum, this%javert(j + 1)) - end if - else if ((vertex .eqv. .true.) .or. (cellcenter .eqv. .true.)) then - ! add the distance between this vertex and the next - dist = dist + calcdist(this%vertices, this%javert(j), & - this%javert(j + 1)) - end if - end do loop - - if (vertex .eqv. .false.) then - write (ermsg, novert) vertnum, nodenum - call store_error(ermsg) - call ustop() - else if (cellcenter .eqv. .false.) then - write (ermsg, cellcent) nodenum - call store_error(ermsg) - call ustop() - end if - - return - end function disttocenter - - function containscenter(this, nodenum, vert1, vert2) result(l) -! ****************************************************************************** -! containscenter -- check to see if cell center is contained at or -! between vert1 and vert2 - -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ - class(DislGeomType) :: this - integer(I4B), intent(in) :: nodenum - integer(I4B), intent(in) :: vert1 - integer(I4B), intent(in) :: vert2 - logical :: l -! ------------------------------------------------------------------------------ - if (this%centerverts(2, nodenum) == 0) then - ! cell center is at a vertex - if ((this%centerverts(1, nodenum) == vert1) .or. & - (this%centerverts(1, nodenum) == vert2)) then - l = .true. - else - l = .false. - end if - else - ! cell center is between two vertices - if (((this%centerverts(1, nodenum) == vert1) .or. & - (this%centerverts(1, nodenum) == vert2)) .and. & - ((this%centerverts(2, nodenum) == vert1) .or. & - (this%centerverts(2, nodenum) == vert2))) then - l = .true. - else - l = .false. - end if - end if - - return - end function containscenter - - function vertccdist(this, node, vertex) result(dist) -! ****************************************************************************** -! vertccdist -- Return the distance between a cell vertex and that cell's center. -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ - ! -- dummy - class(DislGeomType), intent(in) :: this - integer(I4B), intent(in) :: node - integer(I4B), intent(in) :: vertex - real(DP) :: dist - real(DP) :: xdist, ydist, zdist - ! -- local -! ------------------------------------------------------------------------------ - ! - ! -- calc distance - xdist = abs(this%vertices(1, vertex) - this%cellcenters(1, node)) - ydist = abs(this%vertices(2, vertex) - this%cellcenters(2, node)) - zdist = abs(this%vertices(3, vertex) - this%cellcenters(3, node)) - dist = sqrt(xdist * xdist + ydist * ydist + zdist * zdist) - - ! -- return - return - end function vertccdist - + !> @brief Calculate distance bewteen two vertices + !< function calcdist(vertices, vert1, vert2) result(dist) -! ****************************************************************************** -! calcdist -- Return the distance between two vertices. -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ ! -- dummy real(DP), dimension(:, :), intent(in) :: vertices integer(I4B), intent(in) :: vert1 integer(I4B), intent(in) :: vert2 real(DP) :: dist, xdist, ydist, zdist ! -- local -! ------------------------------------------------------------------------------ ! ! -- calc distance xdist = abs(vertices(1, vert1) - vertices(1, vert2)) @@ -356,43 +27,15 @@ function calcdist(vertices, vert1, vert2) result(dist) return end function calcdist - function partialdist(coord1, coord2, percent) result(dist) -! ****************************************************************************** -! partialdist -- Return the distance between two vertices. -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ - use ConstantsModule, only: DONE - ! -- dummy - real(DP), intent(in) :: coord1 - real(DP), intent(in) :: coord2 - real(DP) :: percent - real(DP) :: dist - ! -- local -! ------------------------------------------------------------------------------ - ! - ! -- calc distance - if (coord1 > coord2) then - dist = coord2 + (coord1 - coord2) * (DONE - percent) - else - dist = coord1 + (coord2 - coord1) * percent - end if - - ! -- return - return - end function partialdist - + !> @brief Calculate distance bewteen two vertices + !! + !! Calculate the vector components (xcomp, ycomp, and zcomp) + !! for a line defined by two points, (x0, y0, z0), (x1, y1, z1). Also + !! return the magnitude of the original vector, vmag. + !! + !< subroutine line_unit_vector(x0, y0, z0, x1, y1, z1, & xcomp, ycomp, zcomp, vmag) -! ****************************************************************************** -! line_unit_vector -- Calculate the vector components (xcomp, ycomp, and zcomp) -! for a line defined by two points, (x0, y0, z0), (x1, y1, z1). Also return -! the magnitude of the original vector, vmag. -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ real(DP), intent(in) :: x0 real(DP), intent(in) :: y0 real(DP), intent(in) :: z0 @@ -403,7 +46,7 @@ subroutine line_unit_vector(x0, y0, z0, x1, y1, z1, & real(DP), intent(out) :: ycomp real(DP), intent(out) :: zcomp real(DP) :: dx, dy, dz, vmag -! ------------------------------------------------------------------------------ + ! dx = x1 - x0 dy = y1 - y0 dz = z1 - z0 diff --git a/src/Model/SurfaceWaterFlow/swf1.f90 b/src/Model/SurfaceWaterFlow/swf1.f90 index 5a172e73944..fa636ba5ad9 100644 --- a/src/Model/SurfaceWaterFlow/swf1.f90 +++ b/src/Model/SurfaceWaterFlow/swf1.f90 @@ -979,7 +979,6 @@ subroutine swf_bdentry(this, budterm, budtxt, rowlabel) real(DP), dimension(:, :), intent(in) :: budterm character(len=LENBUDTXT), dimension(:), intent(in) :: budtxt character(len=*), intent(in) :: rowlabel -! ------------------------------------------------------------------------------ ! call this%budget%addentry(budterm, delt, budtxt, rowlabel=rowlabel) ! diff --git a/src/Model/SurfaceWaterFlow/swf1disl1.f90 b/src/Model/SurfaceWaterFlow/swf1disl1.f90 index 614d67e5e79..304e5b0babb 100644 --- a/src/Model/SurfaceWaterFlow/swf1disl1.f90 +++ b/src/Model/SurfaceWaterFlow/swf1disl1.f90 @@ -9,7 +9,7 @@ module SwfDislModule store_warning use InputOutputModule, only: urword use BaseDisModule, only: DisBaseType - use DislGeom, only: calcdist, partialdist + use DislGeom, only: calcdist implicit none @@ -423,7 +423,6 @@ subroutine source_vertices(this) real(DP), dimension(:), contiguous, pointer :: vert_y => null() real(DP), dimension(:), contiguous, pointer :: vert_z => null() ! -- formats -! ------------------------------------------------------------------------------ ! ! -- set memory path idmMemoryPath = create_mem_path(this%name_model, 'DISL', idm_context) @@ -531,7 +530,6 @@ subroutine define_cellverts(this, icell2d, ncvert, icvert) type(sparsematrix) :: vert_spm integer(I4B) :: i, j, ierr integer(I4B) :: icv_idx, startvert, maxnnz = 2 -! ------------------------------------------------------------------------------ ! ! -- initialize sparse matrix call vert_spm%init(this%nodesuser, this%nvert, maxnnz) diff --git a/src/Model/SurfaceWaterFlow/swf1obs1.f90 b/src/Model/SurfaceWaterFlow/swf1obs1.f90 index 4a38cdbdce6..720ee432d7b 100644 --- a/src/Model/SurfaceWaterFlow/swf1obs1.f90 +++ b/src/Model/SurfaceWaterFlow/swf1obs1.f90 @@ -31,20 +31,14 @@ module SwfObsModule contains + !> @brief Create a new obs object + !! + !! Create observation object, allocate pointers, initialize values + !< subroutine swf_obs_cr(obs, inobs) -! ****************************************************************************** -! swf_obs_cr -- Create a new SwfObsType object -! Subroutine: (1) creates object -! (2) allocates pointers -! (3) initializes values -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ ! -- dummy type(SwfObsType), pointer, intent(out) :: obs integer(I4B), pointer, intent(in) :: inobs -! ------------------------------------------------------------------------------ ! allocate (obs) call obs%allocate_scalars() @@ -55,19 +49,14 @@ subroutine swf_obs_cr(obs, inobs) return end subroutine swf_obs_cr + !> @brief Allocate and read + !< subroutine swf_obs_ar(this, ic, x, flowja) -! ****************************************************************************** -! swf_obs_ar -- allocate and read -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ ! -- dummy class(SwfObsType), intent(inout) :: this type(SwfIcType), pointer, intent(in) :: ic real(DP), dimension(:), pointer, contiguous, intent(in) :: x real(DP), dimension(:), pointer, contiguous, intent(in) :: flowja -! ------------------------------------------------------------------------------ ! ! Call ar method of parent class call this%obs_ar() @@ -78,13 +67,9 @@ subroutine swf_obs_ar(this, ic, x, flowja) return end subroutine swf_obs_ar + !> @brief Define + !< subroutine swf_obs_df(this, iout, pkgname, filtyp, dis) -! ****************************************************************************** -! swf_obs_df -- define -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ ! -- dummy class(SwfObsType), intent(inout) :: this integer(I4B), intent(in) :: iout @@ -93,7 +78,6 @@ subroutine swf_obs_df(this, iout, pkgname, filtyp, dis) class(DisBaseType), pointer :: dis ! -- local integer(I4B) :: indx -! ------------------------------------------------------------------------------ ! ! Call overridden method of parent class call this%ObsType%obs_df(iout, pkgname, filtyp, dis) @@ -112,20 +96,15 @@ subroutine swf_obs_df(this, iout, pkgname, filtyp, dis) return end subroutine swf_obs_df + !> @brief Save obs + !< subroutine swf_obs_bd(this) -! ****************************************************************************** -! swf_obs_bd -- save obs -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ ! -- dummy class(SwfObsType), intent(inout) :: this ! -- local integer(I4B) :: i, jaindex, nodenumber character(len=100) :: msg class(ObserveType), pointer :: obsrv => null() -! ------------------------------------------------------------------------------ ! call this%obs_bd_clear() ! @@ -151,30 +130,19 @@ subroutine swf_obs_bd(this) return end subroutine swf_obs_bd + !> @brief Do GWF observations need any checking? If so, add checks here + !< subroutine swf_obs_rp(this) -! ****************************************************************************** -! swf_obs_rp -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ class(SwfObsType), intent(inout) :: this -! ------------------------------------------------------------------------------ ! ! Do SWF observations need any checking? If so, add checks here return end subroutine swf_obs_rp + !> @brief Deallocate memory + !< subroutine swf_obs_da(this) -! ****************************************************************************** -! swf_obs_da -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ - ! -- dummy class(SwfObsType), intent(inout) :: this -! ------------------------------------------------------------------------------ ! nullify (this%ic) nullify (this%x) @@ -184,19 +152,14 @@ subroutine swf_obs_da(this) return end subroutine swf_obs_da + !> @brief Set pointers + !< subroutine set_pointers(this, ic, x, flowja) -! ****************************************************************************** -! set_pointers -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ ! -- dummy class(SwfObsType), intent(inout) :: this type(SwfIcType), pointer, intent(in) :: ic real(DP), dimension(:), pointer, contiguous, intent(in) :: x real(DP), dimension(:), pointer, contiguous, intent(in) :: flowja -! ------------------------------------------------------------------------------ ! this%ic => ic this%x => x @@ -207,13 +170,9 @@ end subroutine set_pointers ! -- Procedures related to SWF observations (NOT type-bound) + !> @brief Calculate stage observation when requested + !< subroutine swf_process_stage_obs_id(obsrv, dis, inunitobs, iout) -! ****************************************************************************** -! swf_process_stage_obs_id -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ ! -- dummy type(ObserveType), intent(inout) :: obsrv class(DisBaseType), intent(in) :: dis @@ -223,7 +182,6 @@ subroutine swf_process_stage_obs_id(obsrv, dis, inunitobs, iout) integer(I4B) :: nn1 integer(I4B) :: icol, istart, istop character(len=LINELENGTH) :: ermsg, strng -! ------------------------------------------------------------------------------ ! ! -- Initialize variables strng = obsrv%IDstring @@ -245,13 +203,9 @@ subroutine swf_process_stage_obs_id(obsrv, dis, inunitobs, iout) return end subroutine swf_process_stage_obs_id + !> @brief Process flow between two cells when requested + !< subroutine swf_process_intercell_obs_id(obsrv, dis, inunitobs, iout) -! ****************************************************************************** -! swf_process_intercell_obs_id -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ ! -- dummy type(ObserveType), intent(inout) :: obsrv class(DisBaseType), intent(in) :: dis @@ -263,7 +217,6 @@ subroutine swf_process_intercell_obs_id(obsrv, dis, inunitobs, iout) character(len=LINELENGTH) :: ermsg, strng ! formats 70 format('Error: No connection exists between cells identified in text: ', a) -! ------------------------------------------------------------------------------ ! ! -- Initialize variables strng = obsrv%IDstring diff --git a/src/Model/SurfaceWaterFlow/swf1sto1.f90 b/src/Model/SurfaceWaterFlow/swf1sto1.f90 index 5d541cf5561..47b6c6f8d85 100644 --- a/src/Model/SurfaceWaterFlow/swf1sto1.f90 +++ b/src/Model/SurfaceWaterFlow/swf1sto1.f90 @@ -173,7 +173,6 @@ subroutine sto_rp(this) ! -- data data css(0)/' TRANSIENT'/ data css(1)/' STEADY-STATE'/ -! ------------------------------------------------------------------------------ ! ! -- get stress period data if (this%ionper < kper) then From 95aec2748e0622ac079920e449dcc8b2ee29dbd8 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Sun, 18 Feb 2024 15:19:12 -0500 Subject: [PATCH 027/199] ci(release): add distribution for ARM macs (#1625) * add macos-14 (m1 runner) build to release matrix * native support for apple silicon, removes need for rosetta * use devtools os tags to distinguish intel from arm mac artifacts * remove unused inputs from release_dispatch.yml: commit_version, reset --- .github/workflows/release.yml | 54 ++++++++++++++++---------- .github/workflows/release_dispatch.yml | 12 +----- 2 files changed, 35 insertions(+), 31 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 21cf847db20..689c93d8dd8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -63,11 +63,9 @@ jobs: matrix: include: - os: ${{ inputs.linux_version }} - ostag: linux - os: macos-12 - ostag: mac + - os: macos-14 - os: windows-2022 - ostag: win64 defaults: run: shell: bash -l {0} @@ -141,10 +139,16 @@ jobs: meson install -C builddir meson test --verbose --no-rebuild -C builddir + - name: Get OS tag + id: ostag + run: | + ostag=$(python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") + echo "ostag=$ostag" >> $GITHUB_OUTPUT + - name: Upload binaries uses: actions/upload-artifact@v3 with: - name: bin-${{ runner.os }} + name: bin-${{ steps.ostag.outputs.ostag }} path: modflow6/bin # only run steps below if inputs.run_tests is true @@ -309,10 +313,16 @@ jobs: working-directory: modflow6/autotest run: python update_flopy.py + - name: Get OS tag + id: ostag + run: | + ostag=$(python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") + echo "ostag=$ostag" >> $GITHUB_OUTPUT + - name: Download pre-built binaries uses: actions/download-artifact@v3 with: - name: bin-${{ runner.os }} + name: bin-${{ steps.ostag.outputs.ostag }} path: bin # execute permissions may not have survived artifact upload/download @@ -402,11 +412,9 @@ jobs: matrix: include: - os: ubuntu-22.04 - ostag: linux - os: macos-12 - ostag: mac + - os: macos-14 - os: windows-2022 - ostag: win64 defaults: run: shell: bash -l {0} @@ -453,22 +461,28 @@ jobs: cmd="$cmd --releasemode" fi eval "$cmd" + + - name: Get OS tag + id: ostag + run: | + ostag=$(python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") + echo "ostag=$ostag" >> $GITHUB_OUTPUT - name: Download artifacts uses: actions/download-artifact@v3 with: - path: ${{ needs.build.outputs.distname }}_${{ matrix.ostag }} + path: ${{ needs.build.outputs.distname }}_${{ steps.ostag.outputs.ostag }} - name: Select artifacts - working-directory: ${{ needs.build.outputs.distname }}_${{ matrix.ostag }} + working-directory: ${{ needs.build.outputs.distname }}_${{ steps.ostag.outputs.ostag }} run: | - echo "selecting ${{ matrix.ostag }} artifacts" + echo "selecting ${{ steps.ostag.outputs.ostag }} artifacts" # remove dists for other systems rm -rf ${{ needs.build.outputs.distname }}_* # remove release notes rm -rf release_notes # rename dist bin directory - mv bin-${{ runner.os }} bin + mv bin-${{ steps.ostag.outputs.ostag }} bin # remove binaries for other systems rm -rf bin-* @@ -480,7 +494,7 @@ jobs: GITHUB_TOKEN: ${{ github.token }} run: | pip install -r modflow6-examples/etc/requirements.pip.txt - distname="${{ needs.build.outputs.distname }}_${{ matrix.ostag }}" + distname="${{ needs.build.outputs.distname }}_${{ steps.ostag.outputs.ostag }}" echo "$distname/bin" >> $GITHUB_PATH # execute permissions may not have survived artifact upload/download chmod +x "$distname/bin/mf6" @@ -507,7 +521,7 @@ jobs: GITHUB_TOKEN: ${{ github.token }} run: | # build distribution - distname="${{ needs.build.outputs.distname }}_${{ matrix.ostag }}" + distname="${{ needs.build.outputs.distname }}_${{ steps.ostag.outputs.ostag }}" cmd="python modflow6/distribution/build_dist.py -o $distname -e modflow6-examples" if [[ "${{ inputs.full }}" == "true" ]]; then cmd="$cmd --full" @@ -522,7 +536,7 @@ jobs: - name: Zip distribution if: runner.os != 'Windows' run: | - distname="${{ needs.build.outputs.distname }}_${{ matrix.ostag }}" + distname="${{ needs.build.outputs.distname }}_${{ steps.ostag.outputs.ostag }}" if [[ "${{ inputs.full }}" == "true" ]]; then zip -r $distname.zip \ $distname/bin \ @@ -557,7 +571,7 @@ jobs: - name: Zip distribution (Windows) if: runner.os == 'Windows' run: | - distname="${{ needs.build.outputs.distname }}_${{ matrix.ostag }}" + distname="${{ needs.build.outputs.distname }}_${{ steps.ostag.outputs.ostag }}" if [[ "${{ inputs.full }}" == "true" ]]; then 7z a -tzip $distname.zip \ $distname/bin \ @@ -590,20 +604,20 @@ jobs: - name: Upload distribution uses: actions/upload-artifact@v3 with: - name: "${{ needs.build.outputs.distname }}_${{ matrix.ostag }}" - path: "${{ needs.build.outputs.distname }}_${{ matrix.ostag }}.zip" + name: "${{ needs.build.outputs.distname }}_${{ steps.ostag.outputs.ostag }}" + path: "${{ needs.build.outputs.distname }}_${{ steps.ostag.outputs.ostag }}.zip" - name: Upload release notes if: runner.os == 'Linux' uses: actions/upload-artifact@v3 with: name: release_notes - path: "${{ needs.build.outputs.distname }}_${{ matrix.ostag }}/doc/release.pdf" + path: "${{ needs.build.outputs.distname }}_${{ steps.ostag.outputs.ostag }}/doc/release.pdf" - name: Check distribution run: | # unzip and validate the archive - distname="${{ needs.build.outputs.distname }}_${{ matrix.ostag }}" + distname="${{ needs.build.outputs.distname }}_${{ steps.ostag.outputs.ostag }}" distfile="$distname.zip" checkdir="check" mkdir $checkdir diff --git a/.github/workflows/release_dispatch.yml b/.github/workflows/release_dispatch.yml index 2f1f04ff9dc..654d6acd292 100644 --- a/.github/workflows/release_dispatch.yml +++ b/.github/workflows/release_dispatch.yml @@ -34,16 +34,6 @@ on: required: false type: string default: '2021.7' - commit_version: - description: 'Commit version numbers back to the develop branch. Not considered if reset is false.' - required: false - type: boolean - default: false - reset: - description: 'Reset the develop branch from the master branch. Not considered if approve is false.' - required: false - type: boolean - default: false run_tests: description: 'Run tests after building binaries.' required: false @@ -129,8 +119,8 @@ jobs: echo "version=$ver" >> $GITHUB_OUTPUT make_dist: name: Make distribution - needs: set_options uses: MODFLOW-USGS/modflow6/.github/workflows/release.yml@develop + needs: set_options with: # If the workflow is manually triggered, the maintainer must manually set approve=true to approve a release. # If triggered by pushing a release branch, the release is approved if the branch name doesn't contain "rc". From e2497f0b41c62b8fc017315ae80d32b5549296d7 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Sun, 18 Feb 2024 16:06:48 -0600 Subject: [PATCH 028/199] chore(lak): fix format statement to eliminate ifort warning (#1632) --- src/Model/GroundWaterFlow/gwf3lak8.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Model/GroundWaterFlow/gwf3lak8.f90 b/src/Model/GroundWaterFlow/gwf3lak8.f90 index bda281b18a6..4deebd42096 100644 --- a/src/Model/GroundWaterFlow/gwf3lak8.f90 +++ b/src/Model/GroundWaterFlow/gwf3lak8.f90 @@ -821,7 +821,7 @@ subroutine lak_read_lake_connections(this) this%bedleak(ipos) = DNODATA ! ! -- create warning message - write (warnmsg, '(2(a,1x,i0,1x),a,1pe7.1,a)') & + write (warnmsg, '(2(a,1x,i0,1x),a,1pe8.1,a)') & 'BEDLEAK for connection', j, 'in lake', n, 'is specified to '// & 'be NONE. Lake connections where the lake-GWF connection '// & 'conductance is solely a function of aquifer properties '// & From 45744b5631881f58130b0fe7c14ea5dd7fed2008 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 19 Feb 2024 10:34:16 -0500 Subject: [PATCH 029/199] refactor: matching dfn and module filenames (#1607) * refactor: remove filename numbers from ims and tsp * remove filename numbers from gwf * remove filename numbers from gwt * sim, model and exchange file names too * fix msvs proj file * gwe updates * swf updates * update makefile * update mf6memvar * run mf6ivar * restore gwfswf -> swfgwf naming * rebuild makefiles with newer pymake --- doc/mf6io/mf6ivar/md/mf6memvar.md | 2337 +++++++++-------- make/makedefaults | 6 +- make/makefile | 248 +- msvs/mf6core.vfproj | 379 ++- msvs/mf6lib.vfproj | 48 +- pymake/makefile | 112 +- .../{GweGweExchange.f90 => exg-gwegwe.f90} | 0 .../{gwegweidm.f90 => exg-gwegweidm.f90} | 0 .../{GwfGweExchange.f90 => exg-gwfgwe.f90} | 0 .../{gwfgweidm.f90 => exg-gwfgweidm.f90} | 0 .../{GwfGwfExchange.f90 => exg-gwfgwf.f90} | 0 .../{gwfgwfidm.f90 => exg-gwfgwfidm.f90} | 0 .../{GwfGwtExchange.f90 => exg-gwfgwt.f90} | 0 .../{gwfgwtidm.f90 => exg-gwfgwtidm.f90} | 0 .../{GwtGwtExchange.f90 => exg-gwtgwt.f90} | 0 .../{gwtgwtidm.f90 => exg-gwtgwtidm.f90} | 0 .../{SwfGwfExchange.f90 => exg-swfgwf.f90} | 0 .../{swfgwfidm.f90 => exg-swfgwfidm.f90} | 0 .../{gwe1cnd1.f90 => gwe-cnd.f90} | 0 .../{gwe1cnd1idm.f90 => gwe-cndidm.f90} | 0 .../{gwe1ctp1.f90 => gwe-ctp.f90} | 0 .../{gwe1ctp1idm.f90 => gwe-ctpidm.f90} | 0 .../{gwe1dis1idm.f90 => gwe-disidm.f90} | 0 .../{gwe1disu1idm.f90 => gwe-disuidm.f90} | 0 .../{gwe1disv1idm.f90 => gwe-disvidm.f90} | 0 .../{gwe1esl1.f90 => gwe-esl.f90} | 0 .../{gwe1est1.f90 => gwe-est.f90} | 0 .../{gwe1ic1idm.f90 => gwe-icidm.f90} | 0 .../{gwe1lke1.f90 => gwe-lke.f90} | 0 .../{gwe1mwe1.f90 => gwe-mwe.f90} | 0 .../{gwe1idm.f90 => gwe-namidm.f90} | 0 .../{gwe1sfe1.f90 => gwe-sfe.f90} | 0 .../{gwe1uze1.f90 => gwe-uze.f90} | 0 .../GroundWaterEnergy/{gwe1.f90 => gwe.f90} | 0 .../{gwf3tvbase8.f90 => TvBase.f90} | 0 .../{gwf3api8.f90 => gwf-api.f90} | 0 .../{gwf3buy8.f90 => gwf-buy.f90} | 0 .../{gwf3chd8.f90 => gwf-chd.f90} | 0 .../{gwf3chd8idm.f90 => gwf-chdidm.f90} | 0 .../{gwf3csub8.f90 => gwf-csub.f90} | 0 .../{gwf3dis8.f90 => gwf-dis.f90} | 0 .../{gwf3dis8idm.f90 => gwf-disidm.f90} | 0 .../{gwf3disu8.f90 => gwf-disu.f90} | 0 .../{gwf3disu8idm.f90 => gwf-disuidm.f90} | 0 .../{gwf3disv8.f90 => gwf-disv.f90} | 0 .../{gwf3disv8idm.f90 => gwf-disvidm.f90} | 0 .../{gwf3drn8.f90 => gwf-drn.f90} | 0 .../{gwf3drn8idm.f90 => gwf-drnidm.f90} | 0 .../{gwf3evt8.f90 => gwf-evt.f90} | 0 .../{gwf3evta8idm.f90 => gwf-evtaidm.f90} | 0 .../{gwf3evt8idm.f90 => gwf-evtidm.f90} | 0 .../{gwf3ghb8.f90 => gwf-ghb.f90} | 0 .../{gwf3ghb8idm.f90 => gwf-ghbidm.f90} | 0 .../{gwf3hfb8.f90 => gwf-hfb.f90} | 0 .../{gwf3ic8.f90 => gwf-ic.f90} | 0 .../{gwf3ic8idm.f90 => gwf-icidm.f90} | 0 .../{gwf3lak8.f90 => gwf-lak.f90} | 0 .../{gwf3maw8.f90 => gwf-maw.f90} | 0 .../{gwf3mvr8.f90 => gwf-mvr.f90} | 0 .../{gwf3idm.f90 => gwf-namidm.f90} | 0 .../{gwf3npf8.f90 => gwf-npf.f90} | 0 .../{gwf3npf8idm.f90 => gwf-npfidm.f90} | 0 .../{gwf3obs8.f90 => gwf-obs.f90} | 0 .../{gwf3oc8.f90 => gwf-oc.f90} | 0 .../{gwf3rch8.f90 => gwf-rch.f90} | 0 .../{gwf3rcha8idm.f90 => gwf-rchaidm.f90} | 0 .../{gwf3rch8idm.f90 => gwf-rchidm.f90} | 0 .../{gwf3riv8.f90 => gwf-riv.f90} | 0 .../{gwf3riv8idm.f90 => gwf-rividm.f90} | 0 .../{gwf3sfr8.f90 => gwf-sfr.f90} | 0 .../{gwf3sto8.f90 => gwf-sto.f90} | 0 .../{gwf3tvk8.f90 => gwf-tvk.f90} | 0 .../{gwf3tvs8.f90 => gwf-tvs.f90} | 0 .../{gwf3uzf8.f90 => gwf-uzf.f90} | 0 .../{gwf3vsc8.f90 => gwf-vsc.f90} | 0 .../{gwf3wel8.f90 => gwf-wel.f90} | 0 .../{gwf3wel8idm.f90 => gwf-welidm.f90} | 0 .../GroundWaterFlow/{gwf3.f90 => gwf.f90} | 2 +- .../{gwt1cnc1.f90 => gwt-cnc.f90} | 0 .../{gwt1cnc1idm.f90 => gwt-cncidm.f90} | 0 .../{gwt1dis1idm.f90 => gwt-disidm.f90} | 0 .../{gwt1disu1idm.f90 => gwt-disuidm.f90} | 0 .../{gwt1disv1idm.f90 => gwt-disvidm.f90} | 0 .../{gwt1dsp1.f90 => gwt-dsp.f90} | 0 .../{gwt1dsp1idm.f90 => gwt-dspidm.f90} | 0 .../{gwt1ic1idm.f90 => gwt-icidm.f90} | 0 .../{gwt1ist1.f90 => gwt-ist.f90} | 0 .../{gwt1lkt1.f90 => gwt-lkt.f90} | 0 .../{gwt1mst1.f90 => gwt-mst.f90} | 0 .../{gwt1mwt1.f90 => gwt-mwt.f90} | 0 .../{gwt1idm.f90 => gwt-namidm.f90} | 0 .../{gwt1sft1.f90 => gwt-sft.f90} | 0 .../{gwt1src1.f90 => gwt-src.f90} | 0 .../{gwt1uzt1.f90 => gwt-uzt.f90} | 0 .../{gwt1.f90 => gwt.f90} | 0 .../{swf1chd1idm.f90 => swf-chdidm.f90} | 0 .../{swf1cxs1.f90 => swf-cxs.f90} | 0 .../{swf1cxs1idm.f90 => swf-cxsidm.f90} | 0 .../{swf1dfw1.f90 => swf-dfw.f90} | 0 .../{swf1dfw1idm.f90 => swf-dfwidm.f90} | 0 .../{swf1disl1.f90 => swf-disl.f90} | 0 .../{swf1disl1idm.f90 => swf-dislidm.f90} | 0 .../{swf1flw1.f90 => swf-flw.f90} | 0 .../{swf1flw1idm.f90 => swf-flwidm.f90} | 0 .../{swf1ic1.f90 => swf-ic.f90} | 0 .../{swf1ic1idm.f90 => swf-icidm.f90} | 0 .../{swf1idm.f90 => swf-namidm.f90} | 0 .../{swf1obs1.f90 => swf-obs.f90} | 0 .../{swf1oc1.f90 => swf-oc.f90} | 0 .../{swf1sto1.f90 => swf-sto.f90} | 0 .../{swf1zdg1.f90 => swf-zdg.f90} | 0 .../{swf1zdg1idm.f90 => swf-zdgidm.f90} | 0 .../SurfaceWaterFlow/{swf1.f90 => swf.f90} | 0 .../{tsp1adv1.f90 => tsp-adv.f90} | 0 .../{tsp1apt1.f90 => tsp-apt.f90} | 0 .../{tsp1fmi1.f90 => tsp-fmi.f90} | 0 .../{tsp1ic1.f90 => tsp-ic.f90} | 0 .../{tsp1mvt1.f90 => tsp-mvt.f90} | 0 .../{tsp1obs1.f90 => tsp-obs.f90} | 0 .../{tsp1oc1.f90 => tsp-oc.f90} | 0 .../{tsp1ssm1.f90 => tsp-ssm.f90} | 0 .../TransportModel/{tsp1.f90 => tsp.f90} | 0 .../{ims8linear.f90 => ImsLinear.f90} | 0 .../{ims8base.f90 => ImsLinearBase.f90} | 0 .../{ims8misc.f90 => ImsLinearMisc.f90} | 0 .../{ims8reordering.f90 => ImsReordering.f90} | 0 .../Observation/{Obs3.f90 => Obs.f90} | 0 src/meson.build | 250 +- src/{simnamidm.f90 => sim-namidm.f90} | 0 utils/idmloader/scripts/dfn2f90.py | 88 +- utils/mf5to6/make/makedefaults | 6 +- utils/mf5to6/make/makefile | 2 +- utils/zonebudget/make/makedefaults | 6 +- utils/zonebudget/make/makefile | 2 +- 134 files changed, 1791 insertions(+), 1695 deletions(-) rename src/Exchange/{GweGweExchange.f90 => exg-gwegwe.f90} (100%) rename src/Exchange/{gwegweidm.f90 => exg-gwegweidm.f90} (100%) rename src/Exchange/{GwfGweExchange.f90 => exg-gwfgwe.f90} (100%) rename src/Exchange/{gwfgweidm.f90 => exg-gwfgweidm.f90} (100%) rename src/Exchange/{GwfGwfExchange.f90 => exg-gwfgwf.f90} (100%) rename src/Exchange/{gwfgwfidm.f90 => exg-gwfgwfidm.f90} (100%) rename src/Exchange/{GwfGwtExchange.f90 => exg-gwfgwt.f90} (100%) rename src/Exchange/{gwfgwtidm.f90 => exg-gwfgwtidm.f90} (100%) rename src/Exchange/{GwtGwtExchange.f90 => exg-gwtgwt.f90} (100%) rename src/Exchange/{gwtgwtidm.f90 => exg-gwtgwtidm.f90} (100%) rename src/Exchange/{SwfGwfExchange.f90 => exg-swfgwf.f90} (100%) rename src/Exchange/{swfgwfidm.f90 => exg-swfgwfidm.f90} (100%) rename src/Model/GroundWaterEnergy/{gwe1cnd1.f90 => gwe-cnd.f90} (100%) rename src/Model/GroundWaterEnergy/{gwe1cnd1idm.f90 => gwe-cndidm.f90} (100%) rename src/Model/GroundWaterEnergy/{gwe1ctp1.f90 => gwe-ctp.f90} (100%) rename src/Model/GroundWaterEnergy/{gwe1ctp1idm.f90 => gwe-ctpidm.f90} (100%) rename src/Model/GroundWaterEnergy/{gwe1dis1idm.f90 => gwe-disidm.f90} (100%) rename src/Model/GroundWaterEnergy/{gwe1disu1idm.f90 => gwe-disuidm.f90} (100%) rename src/Model/GroundWaterEnergy/{gwe1disv1idm.f90 => gwe-disvidm.f90} (100%) rename src/Model/GroundWaterEnergy/{gwe1esl1.f90 => gwe-esl.f90} (100%) rename src/Model/GroundWaterEnergy/{gwe1est1.f90 => gwe-est.f90} (100%) rename src/Model/GroundWaterEnergy/{gwe1ic1idm.f90 => gwe-icidm.f90} (100%) rename src/Model/GroundWaterEnergy/{gwe1lke1.f90 => gwe-lke.f90} (100%) rename src/Model/GroundWaterEnergy/{gwe1mwe1.f90 => gwe-mwe.f90} (100%) rename src/Model/GroundWaterEnergy/{gwe1idm.f90 => gwe-namidm.f90} (100%) rename src/Model/GroundWaterEnergy/{gwe1sfe1.f90 => gwe-sfe.f90} (100%) rename src/Model/GroundWaterEnergy/{gwe1uze1.f90 => gwe-uze.f90} (100%) rename src/Model/GroundWaterEnergy/{gwe1.f90 => gwe.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3tvbase8.f90 => TvBase.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3api8.f90 => gwf-api.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3buy8.f90 => gwf-buy.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3chd8.f90 => gwf-chd.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3chd8idm.f90 => gwf-chdidm.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3csub8.f90 => gwf-csub.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3dis8.f90 => gwf-dis.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3dis8idm.f90 => gwf-disidm.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3disu8.f90 => gwf-disu.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3disu8idm.f90 => gwf-disuidm.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3disv8.f90 => gwf-disv.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3disv8idm.f90 => gwf-disvidm.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3drn8.f90 => gwf-drn.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3drn8idm.f90 => gwf-drnidm.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3evt8.f90 => gwf-evt.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3evta8idm.f90 => gwf-evtaidm.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3evt8idm.f90 => gwf-evtidm.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3ghb8.f90 => gwf-ghb.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3ghb8idm.f90 => gwf-ghbidm.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3hfb8.f90 => gwf-hfb.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3ic8.f90 => gwf-ic.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3ic8idm.f90 => gwf-icidm.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3lak8.f90 => gwf-lak.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3maw8.f90 => gwf-maw.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3mvr8.f90 => gwf-mvr.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3idm.f90 => gwf-namidm.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3npf8.f90 => gwf-npf.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3npf8idm.f90 => gwf-npfidm.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3obs8.f90 => gwf-obs.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3oc8.f90 => gwf-oc.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3rch8.f90 => gwf-rch.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3rcha8idm.f90 => gwf-rchaidm.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3rch8idm.f90 => gwf-rchidm.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3riv8.f90 => gwf-riv.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3riv8idm.f90 => gwf-rividm.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3sfr8.f90 => gwf-sfr.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3sto8.f90 => gwf-sto.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3tvk8.f90 => gwf-tvk.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3tvs8.f90 => gwf-tvs.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3uzf8.f90 => gwf-uzf.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3vsc8.f90 => gwf-vsc.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3wel8.f90 => gwf-wel.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3wel8idm.f90 => gwf-welidm.f90} (100%) rename src/Model/GroundWaterFlow/{gwf3.f90 => gwf.f90} (99%) rename src/Model/GroundWaterTransport/{gwt1cnc1.f90 => gwt-cnc.f90} (100%) rename src/Model/GroundWaterTransport/{gwt1cnc1idm.f90 => gwt-cncidm.f90} (100%) rename src/Model/GroundWaterTransport/{gwt1dis1idm.f90 => gwt-disidm.f90} (100%) rename src/Model/GroundWaterTransport/{gwt1disu1idm.f90 => gwt-disuidm.f90} (100%) rename src/Model/GroundWaterTransport/{gwt1disv1idm.f90 => gwt-disvidm.f90} (100%) rename src/Model/GroundWaterTransport/{gwt1dsp1.f90 => gwt-dsp.f90} (100%) rename src/Model/GroundWaterTransport/{gwt1dsp1idm.f90 => gwt-dspidm.f90} (100%) rename src/Model/GroundWaterTransport/{gwt1ic1idm.f90 => gwt-icidm.f90} (100%) rename src/Model/GroundWaterTransport/{gwt1ist1.f90 => gwt-ist.f90} (100%) rename src/Model/GroundWaterTransport/{gwt1lkt1.f90 => gwt-lkt.f90} (100%) rename src/Model/GroundWaterTransport/{gwt1mst1.f90 => gwt-mst.f90} (100%) rename src/Model/GroundWaterTransport/{gwt1mwt1.f90 => gwt-mwt.f90} (100%) rename src/Model/GroundWaterTransport/{gwt1idm.f90 => gwt-namidm.f90} (100%) rename src/Model/GroundWaterTransport/{gwt1sft1.f90 => gwt-sft.f90} (100%) rename src/Model/GroundWaterTransport/{gwt1src1.f90 => gwt-src.f90} (100%) rename src/Model/GroundWaterTransport/{gwt1uzt1.f90 => gwt-uzt.f90} (100%) rename src/Model/GroundWaterTransport/{gwt1.f90 => gwt.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1chd1idm.f90 => swf-chdidm.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1cxs1.f90 => swf-cxs.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1cxs1idm.f90 => swf-cxsidm.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1dfw1.f90 => swf-dfw.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1dfw1idm.f90 => swf-dfwidm.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1disl1.f90 => swf-disl.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1disl1idm.f90 => swf-dislidm.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1flw1.f90 => swf-flw.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1flw1idm.f90 => swf-flwidm.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1ic1.f90 => swf-ic.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1ic1idm.f90 => swf-icidm.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1idm.f90 => swf-namidm.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1obs1.f90 => swf-obs.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1oc1.f90 => swf-oc.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1sto1.f90 => swf-sto.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1zdg1.f90 => swf-zdg.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1zdg1idm.f90 => swf-zdgidm.f90} (100%) rename src/Model/SurfaceWaterFlow/{swf1.f90 => swf.f90} (100%) rename src/Model/TransportModel/{tsp1adv1.f90 => tsp-adv.f90} (100%) rename src/Model/TransportModel/{tsp1apt1.f90 => tsp-apt.f90} (100%) rename src/Model/TransportModel/{tsp1fmi1.f90 => tsp-fmi.f90} (100%) rename src/Model/TransportModel/{tsp1ic1.f90 => tsp-ic.f90} (100%) rename src/Model/TransportModel/{tsp1mvt1.f90 => tsp-mvt.f90} (100%) rename src/Model/TransportModel/{tsp1obs1.f90 => tsp-obs.f90} (100%) rename src/Model/TransportModel/{tsp1oc1.f90 => tsp-oc.f90} (100%) rename src/Model/TransportModel/{tsp1ssm1.f90 => tsp-ssm.f90} (100%) rename src/Model/TransportModel/{tsp1.f90 => tsp.f90} (100%) rename src/Solution/LinearMethods/{ims8linear.f90 => ImsLinear.f90} (100%) rename src/Solution/LinearMethods/{ims8base.f90 => ImsLinearBase.f90} (100%) rename src/Solution/LinearMethods/{ims8misc.f90 => ImsLinearMisc.f90} (100%) rename src/Solution/LinearMethods/{ims8reordering.f90 => ImsReordering.f90} (100%) rename src/Utilities/Observation/{Obs3.f90 => Obs.f90} (100%) rename src/{simnamidm.f90 => sim-namidm.f90} (100%) diff --git a/doc/mf6io/mf6ivar/md/mf6memvar.md b/doc/mf6io/mf6ivar/md/mf6memvar.md index 6343f14769b..50d850b9eab 100644 --- a/doc/mf6io/mf6ivar/md/mf6memvar.md +++ b/doc/mf6io/mf6ivar/md/mf6memvar.md @@ -3,11 +3,33 @@ | source file | module | type.variable name | variable name | dimensions | | :---: | :---: | :---: | :---: | :---: | | SimulationCreate.f90 | SimulationCreateModule | None | MRANKS | 1 | -| VirtualBase.f90 | VirtualBaseModule | VirtualIntType | var_name | 0 | -| VirtualBase.f90 | VirtualBaseModule | VirtualInt1dType | var_name | 1 | -| VirtualBase.f90 | VirtualBaseModule | VirtualDblType | var_name | 0 | -| VirtualBase.f90 | VirtualBaseModule | VirtualDbl1dType | var_name | 1 | -| VirtualBase.f90 | VirtualBaseModule | VirtualDbl2dType | var_name | 2 | +| exg-swfgwf.f90 | SwfGwfExchangeModule | SwfGwfExchangeType | IPR_INPUT | 0 | +| exg-swfgwf.f90 | SwfGwfExchangeModule | SwfGwfExchangeType | IPR_FLOW | 0 | +| exg-swfgwf.f90 | SwfGwfExchangeModule | SwfGwfExchangeType | NEXG | 0 | +| exg-swfgwf.f90 | SwfGwfExchangeModule | SwfGwfExchangeType | INOBS | 0 | +| exg-swfgwf.f90 | SwfGwfExchangeModule | SwfGwfExchangeType | NODEM1 | 1 | +| exg-swfgwf.f90 | SwfGwfExchangeModule | SwfGwfExchangeType | NODEM2 | 1 | +| exg-swfgwf.f90 | SwfGwfExchangeModule | SwfGwfExchangeType | COND | 1 | +| exg-swfgwf.f90 | SwfGwfExchangeModule | SwfGwfExchangeType | IDXGLO | 1 | +| exg-swfgwf.f90 | SwfGwfExchangeModule | SwfGwfExchangeType | IDXSYMGLO | 1 | +| exg-swfgwf.f90 | SwfGwfExchangeModule | SwfGwfExchangeType | SIMVALS | 1 | +| exg-gwfgwt.f90 | GwfGwtExchangeModule | GwfGwtExchangeType | M1ID | 0 | +| exg-gwfgwt.f90 | GwfGwtExchangeModule | GwfGwtExchangeType | M2ID | 0 | +| exg-gwfgwf.f90 | GwfGwfExchangeModule | GwfExchangeType | ICELLAVG | 0 | +| exg-gwfgwf.f90 | GwfGwfExchangeModule | GwfExchangeType | IVARCV | 0 | +| exg-gwfgwf.f90 | GwfGwfExchangeModule | GwfExchangeType | IDEWATCV | 0 | +| exg-gwfgwf.f90 | GwfGwfExchangeModule | GwfExchangeType | INEWTON | 0 | +| exg-gwfgwf.f90 | GwfGwfExchangeModule | GwfExchangeType | INGNC | 0 | +| exg-gwfgwf.f90 | GwfGwfExchangeModule | GwfExchangeType | INMVR | 0 | +| exg-gwfgwf.f90 | GwfGwfExchangeModule | GwfExchangeType | INOBS | 0 | +| exg-gwfgwf.f90 | GwfGwfExchangeModule | GwfExchangeType | SATOMEGA | 0 | +| exg-gwfgwf.f90 | GwfGwfExchangeModule | GwfExchangeType | COND | 1 | +| exg-gwfgwf.f90 | GwfGwfExchangeModule | GwfExchangeType | IDXGLO | 1 | +| exg-gwfgwf.f90 | GwfGwfExchangeModule | GwfExchangeType | IDXSYMGLO | 1 | +| exg-gwfgwf.f90 | GwfGwfExchangeModule | GwfExchangeType | CONDSAT | 1 | +| exg-gwfgwf.f90 | GwfGwfExchangeModule | GwfExchangeType | SIMVALS | 1 | +| exg-gwfgwe.f90 | GwfGweExchangeModule | GwfGweExchangeType | M1ID | 0 | +| exg-gwfgwe.f90 | GwfGweExchangeModule | GwfGweExchangeType | M2ID | 0 | | DisConnExchange.f90 | DisConnExchangeModule | DisConnExchangeType | NEXG | 0 | | DisConnExchange.f90 | DisConnExchangeModule | DisConnExchangeType | NAUX | 0 | | DisConnExchange.f90 | DisConnExchangeModule | DisConnExchangeType | IANGLEX | 0 | @@ -27,6 +49,24 @@ | DisConnExchange.f90 | DisConnExchangeModule | DisConnExchangeType | CL2 | 1 | | DisConnExchange.f90 | DisConnExchangeModule | DisConnExchangeType | HWVA | 1 | | DisConnExchange.f90 | DisConnExchangeModule | DisConnExchangeType | AUXVAR | 2 | +| exg-gwtgwt.f90 | GwtGwtExchangeModule | GwtExchangeType | INEWTON | 0 | +| exg-gwtgwt.f90 | GwtGwtExchangeModule | GwtExchangeType | INOBS | 0 | +| exg-gwtgwt.f90 | GwtGwtExchangeModule | GwtExchangeType | IADVSCHEME | 0 | +| exg-gwtgwt.f90 | GwtGwtExchangeModule | GwtExchangeType | INMVT | 0 | +| exg-gwtgwt.f90 | GwtGwtExchangeModule | GwtExchangeType | COND | 1 | +| exg-gwtgwt.f90 | GwtGwtExchangeModule | GwtExchangeType | SIMVALS | 1 | +| exg-gwegwe.f90 | GweGweExchangeModule | GweExchangeType | INEWTON | 0 | +| exg-gwegwe.f90 | GweGweExchangeModule | GweExchangeType | INOBS | 0 | +| exg-gwegwe.f90 | GweGweExchangeModule | GweExchangeType | IADVSCHEME | 0 | +| exg-gwegwe.f90 | GweGweExchangeModule | GweExchangeType | INMVT | 0 | +| exg-gwegwe.f90 | GweGweExchangeModule | GweExchangeType | COND | 1 | +| exg-gwegwe.f90 | GweGweExchangeModule | GweExchangeType | SIMVALS | 1 | +| GwfExchangeMover.f90 | GwfExgMoverModule | GwfExgMoverType | QPACTUAL_M1 | 1 | +| GwfExchangeMover.f90 | GwfExgMoverModule | GwfExgMoverType | QPACTUAL_M2 | 1 | +| GwfExchangeMover.f90 | GwfExgMoverModule | GwfExgMoverType | QAVAILABLE_M1 | 1 | +| GwfExchangeMover.f90 | GwfExgMoverModule | GwfExgMoverType | QAVAILABLE_M2 | 1 | +| GwfExchangeMover.f90 | GwfExgMoverModule | GwfExgMoverType | ID_MAPPED_M1 | 1 | +| GwfExchangeMover.f90 | GwfExgMoverModule | GwfExgMoverType | ID_MAPPED_M2 | 1 | | GhostNode.f90 | GhostNodeModule | GhostNodeType | SMGNC | 0 | | GhostNode.f90 | GhostNodeModule | GhostNodeType | IMPLICIT | 0 | | GhostNode.f90 | GhostNodeModule | GhostNodeType | I2KN | 0 | @@ -43,35 +83,237 @@ | GhostNode.f90 | GhostNodeModule | GhostNodeType | IDXSYMGLO | 1 | | GhostNode.f90 | GhostNodeModule | GhostNodeType | JPOSINROWN | 2 | | GhostNode.f90 | GhostNodeModule | GhostNodeType | JPOSINROWM | 2 | -| GweGweExchange.f90 | GweGweExchangeModule | GweExchangeType | INEWTON | 0 | -| GweGweExchange.f90 | GweGweExchangeModule | GweExchangeType | INOBS | 0 | -| GweGweExchange.f90 | GweGweExchangeModule | GweExchangeType | IADVSCHEME | 0 | -| GweGweExchange.f90 | GweGweExchangeModule | GweExchangeType | INMVT | 0 | -| GweGweExchange.f90 | GweGweExchangeModule | GweExchangeType | COND | 1 | -| GweGweExchange.f90 | GweGweExchangeModule | GweExchangeType | SIMVALS | 1 | -| GwfGweExchange.f90 | GwfGweExchangeModule | GwfGweExchangeType | M1ID | 0 | -| GwfGweExchange.f90 | GwfGweExchangeModule | GwfGweExchangeType | M2ID | 0 | -| GwfGwfExchange.f90 | GwfGwfExchangeModule | GwfExchangeType | ICELLAVG | 0 | -| GwfGwfExchange.f90 | GwfGwfExchangeModule | GwfExchangeType | IVARCV | 0 | -| GwfGwfExchange.f90 | GwfGwfExchangeModule | GwfExchangeType | IDEWATCV | 0 | -| GwfGwfExchange.f90 | GwfGwfExchangeModule | GwfExchangeType | INEWTON | 0 | -| GwfGwfExchange.f90 | GwfGwfExchangeModule | GwfExchangeType | INGNC | 0 | -| GwfGwfExchange.f90 | GwfGwfExchangeModule | GwfExchangeType | INMVR | 0 | -| GwfGwfExchange.f90 | GwfGwfExchangeModule | GwfExchangeType | INOBS | 0 | -| GwfGwfExchange.f90 | GwfGwfExchangeModule | GwfExchangeType | SATOMEGA | 0 | -| GwfGwfExchange.f90 | GwfGwfExchangeModule | GwfExchangeType | COND | 1 | -| GwfGwfExchange.f90 | GwfGwfExchangeModule | GwfExchangeType | IDXGLO | 1 | -| GwfGwfExchange.f90 | GwfGwfExchangeModule | GwfExchangeType | IDXSYMGLO | 1 | -| GwfGwfExchange.f90 | GwfGwfExchangeModule | GwfExchangeType | CONDSAT | 1 | -| GwfGwfExchange.f90 | GwfGwfExchangeModule | GwfExchangeType | SIMVALS | 1 | -| GwfGwtExchange.f90 | GwfGwtExchangeModule | GwfGwtExchangeType | M1ID | 0 | -| GwfGwtExchange.f90 | GwfGwtExchangeModule | GwfGwtExchangeType | M2ID | 0 | -| GwtGwtExchange.f90 | GwtGwtExchangeModule | GwtExchangeType | INEWTON | 0 | -| GwtGwtExchange.f90 | GwtGwtExchangeModule | GwtExchangeType | INOBS | 0 | -| GwtGwtExchange.f90 | GwtGwtExchangeModule | GwtExchangeType | IADVSCHEME | 0 | -| GwtGwtExchange.f90 | GwtGwtExchangeModule | GwtExchangeType | INMVT | 0 | -| GwtGwtExchange.f90 | GwtGwtExchangeModule | GwtExchangeType | COND | 1 | -| GwtGwtExchange.f90 | GwtGwtExchangeModule | GwtExchangeType | SIMVALS | 1 | +| VirtualBase.f90 | VirtualBaseModule | VirtualIntType | var_name | 0 | +| VirtualBase.f90 | VirtualBaseModule | VirtualInt1dType | var_name | 1 | +| VirtualBase.f90 | VirtualBaseModule | VirtualDblType | var_name | 0 | +| VirtualBase.f90 | VirtualBaseModule | VirtualDbl1dType | var_name | 1 | +| VirtualBase.f90 | VirtualBaseModule | VirtualDbl2dType | var_name | 2 | +| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | CONVNMOD | 0 | +| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | NITERMAX | 0 | +| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | ITINNER | 1 | +| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | LOCDV | 1 | +| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | DVMAX | 1 | +| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | LOCDR | 1 | +| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | DRMAX | 1 | +| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | CONVDVMAX | 2 | +| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | CONVLOCDV | 2 | +| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | CONVDRMAX | 2 | +| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | CONVLOCDR | 2 | +| ExplicitSolution.f90 | ExplicitSolutionModule | ExplicitSolutionType | ID | 0 | +| ExplicitSolution.f90 | ExplicitSolutionModule | ExplicitSolutionType | IU | 0 | +| ExplicitSolution.f90 | ExplicitSolutionModule | ExplicitSolutionType | TTSOLN | 0 | +| ExplicitSolution.f90 | ExplicitSolutionModule | ExplicitSolutionType | ICNVG | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | ID | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | IU | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | TTFORM | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | TTSOLN | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | ISYMMETRIC | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | NEQ | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | MATRIX_OFFSET | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | DVCLOSE | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | BIGCHOLD | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | BIGCH | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | RELAXOLD | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | RES_PREV | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | RES_NEW | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | ICNVG | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | ITERTOT_TIMESTEP | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | IOUTTOT_TIMESTEP | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | INNERTOT_SIM | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | MXITER | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | LINSOLVER | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | NONMETH | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | IPRIMS | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | THETA | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | AKAPPA | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | GAMMA | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | AMOMENTUM | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | BREDUC | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | BTOL | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | RES_LIM | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | NUMTRACK | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | IBFLAG | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | ICSVOUTEROUT | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | ICSVINNEROUT | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | NITERMAX | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | CONVNMOD | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | IALLOWPTC | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | IPTCOPT | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | IPTCOUT | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | L2NORM0 | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | PTCDEL | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | PTCDEL0 | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | PTCEXP | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | ATSFRAC | 0 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | IACTIVE | 1 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | XTEMP | 1 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | DXOLD | 1 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | HNCG | 1 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | LRCH | 2 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | WSAVE | 1 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | HCHOLD | 1 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | DEOLD | 1 | +| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | CONVMODSTART | 1 | +| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | DVCLOSE | 0 | +| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | RCLOSE | 0 | +| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | ICNVGOPT | 0 | +| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | ITER1 | 0 | +| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | ILINMETH | 0 | +| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | ISCL | 0 | +| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | IORD | 0 | +| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | NORTH | 0 | +| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | RELAX | 0 | +| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | LEVEL | 0 | +| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | DROPTOL | 0 | +| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | IDFPARAM | 0 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | NJA | 0 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | DSCALE | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | DSCALE2 | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | IAPC | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | JAPC | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | APC | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | IW | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | W | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | JLU | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | JW | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | WLU | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | LORDER | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | IORDER | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | IARO | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | JARO | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | ARO | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | ID | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | D | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | P | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | Q | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | Z | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | T | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | V | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | DHAT | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | PHAT | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | QHAT | 1 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | IOUT | 0 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | IPC | 0 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | IACPC | 0 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | NITERC | 0 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | NIABCGS | 0 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | NIAPC | 0 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | NJAPC | 0 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | EPFACT | 0 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | L2NORM0 | 0 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | NJLU | 0 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | NJW | 0 | +| ImsLinear.f90 | IMSLinearModule | ImsLinearDataType | NWLU | 0 | +| ats.f90 | AdaptiveTimeStepModule | None | NPER | 0 | +| ats.f90 | AdaptiveTimeStepModule | None | MAXATS | 0 | +| ats.f90 | AdaptiveTimeStepModule | None | DTSTABLE | 0 | +| ats.f90 | AdaptiveTimeStepModule | None | KPERATS | 1 | +| ats.f90 | AdaptiveTimeStepModule | None | IPERATS | 1 | +| ats.f90 | AdaptiveTimeStepModule | None | DT0 | 1 | +| ats.f90 | AdaptiveTimeStepModule | None | DTMIN | 1 | +| ats.f90 | AdaptiveTimeStepModule | None | DTMAX | 1 | +| ats.f90 | AdaptiveTimeStepModule | None | DTADJ | 1 | +| ats.f90 | AdaptiveTimeStepModule | None | DTFAILADJ | 1 | +| tdis.f90 | TdisModule | None | NPER | 0 | +| tdis.f90 | TdisModule | None | ITMUNI | 0 | +| tdis.f90 | TdisModule | None | KPER | 0 | +| tdis.f90 | TdisModule | None | KSTP | 0 | +| tdis.f90 | TdisModule | None | INATS | 0 | +| tdis.f90 | TdisModule | None | READNEWDATA | 0 | +| tdis.f90 | TdisModule | None | ENDOFPERIOD | 0 | +| tdis.f90 | TdisModule | None | ENDOFSIMULATION | 0 | +| tdis.f90 | TdisModule | None | DELT | 0 | +| tdis.f90 | TdisModule | None | PERTIM | 0 | +| tdis.f90 | TdisModule | None | TOPERTIM | 0 | +| tdis.f90 | TdisModule | None | TOTIM | 0 | +| tdis.f90 | TdisModule | None | TOTIMC | 0 | +| tdis.f90 | TdisModule | None | DELTSAV | 0 | +| tdis.f90 | TdisModule | None | TOTIMSAV | 0 | +| tdis.f90 | TdisModule | None | PERTIMSAV | 0 | +| tdis.f90 | TdisModule | None | TOTALSIMTIME | 0 | +| tdis.f90 | TdisModule | None | PERLEN | 1 | +| tdis.f90 | TdisModule | None | NSTP | 1 | +| tdis.f90 | TdisModule | None | TSMULT | 1 | +| PackageBudget.f90 | PackageBudgetModule | PackageBudgetType | NAME | 1 | +| PackageBudget.f90 | PackageBudgetModule | PackageBudgetType | BUDTXT | 1 | +| PackageBudget.f90 | PackageBudgetModule | PackageBudgetType | NAUX | 0 | +| PackageBudget.f90 | PackageBudgetModule | PackageBudgetType | AUXNAME | 2 | +| PackageBudget.f90 | PackageBudgetModule | PackageBudgetType | NBOUND | 0 | +| PackageBudget.f90 | PackageBudgetModule | PackageBudgetType | NODELIST | 1 | +| PackageBudget.f90 | PackageBudgetModule | PackageBudgetType | FLOW | 1 | +| PackageBudget.f90 | PackageBudgetModule | PackageBudgetType | AUXVAR | 2 | +| ModelPackageInputs.f90 | ModelPackageInputsModule | LoadablePackageType | INPUT_FNAME | 1 | +| ModelPackageInputs.f90 | ModelPackageInputsModule | ModelPackageInputsType | PKGTYPES | 2 | +| ModelPackageInputs.f90 | ModelPackageInputsModule | ModelPackageInputsType | PKGNAMES | 2 | +| ModelPackageInputs.f90 | ModelPackageInputsModule | ModelPackageInputsType | MEMPATHS | 2 | +| ModelPackageInputs.f90 | ModelPackageInputsModule | ModelPackageInputsType | INUNITS | 1 | +| SourceCommon.f90 | SourceCommonModule | None | MODEL_SHAPE | 1 | +| SourceCommon.f90 | SourceCommonModule | None | NCELLDIM | 0 | +| SourceCommon.f90 | SourceCommonModule | None | NAUX | 0 | +| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | NBOUND | 0 | +| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | NCPL | 0 | +| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | AUXILIARY | 2 | +| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | CELLID | 2 | +| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | BOUNDNAME | 2 | +| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | AUXVAR | 2 | +| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | varname | 0 | +| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | idt%mf6varname | 1 | +| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | idt%mf6varname | 1 | +| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | idt%mf6varname | 2 | +| IdmLoad.f90 | IdmLoadModule | None | EXGMEMPATHS | 2 | +| IdmLoad.f90 | IdmLoadModule | None | NCELLDIM | 0 | +| IdmLoad.f90 | IdmLoadModule | None | EXGID | 0 | +| IdmLoad.f90 | IdmLoadModule | None | NUMMODELS | 0 | +| IdmLoad.f90 | IdmLoadModule | None | NUMEXCHANGES | 0 | +| IdmLoad.f90 | IdmLoadModule | None | idt%mf6varname | 0 | +| IdmLoad.f90 | IdmLoadModule | None | idt%mf6varname | 2 | +| IdmLoad.f90 | IdmLoadModule | None | idt%mf6varname | 1 | +| IdmMf6File.f90 | IdmMf6FileModule | Mf6FileDynamicPkgLoadType | IPER | 0 | +| IdmMf6File.f90 | IdmMf6FileModule | Mf6FileDynamicPkgLoadType | IONPER | 0 | +| StressGridInput.f90 | StressGridInputModule | StressGridInputType | AUXTASNAME | 2 | +| StressGridInput.f90 | StressGridInputModule | StressGridInputType | PARAMTASNAME | 2 | +| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 0 | +| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 1 | +| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 2 | +| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 2 | +| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 1 | +| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 2 | +| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 3 | +| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 0 | +| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 1 | +| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 2 | +| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 3 | +| StructArray.f90 | StructArrayModule | StructArrayType | sv%idt%mf6varname | 1 | +| StructArray.f90 | StructArrayModule | StructArrayType | sv%idt%mf6varname | 1 | +| StructArray.f90 | StructArrayModule | StructArrayType | sv%idt%mf6varname | 2 | +| StructArray.f90 | StructArrayModule | StructArrayType | sv%idt%mf6varname | 2 | +| StructArray.f90 | StructArrayModule | StructArrayType | sv%idt%mf6varname | 2 | +| StructArray.f90 | StructArrayModule | StructArrayType | NSEG_1 | 0 | +| StructArray.f90 | StructArrayModule | StructArrayType | varname | 1 | +| StructArray.f90 | StructArrayModule | StructArrayType | varname | 1 | +| StructArray.f90 | StructArrayModule | StructArrayType | varname | 2 | +| StructArray.f90 | StructArrayModule | StructArrayType | varname | 2 | +| StructArray.f90 | StructArrayModule | StructArrayType | varname | 1 | +| OutputControl.f90 | OutputControlModule | OutputControlType | INUNIT | 0 | +| OutputControl.f90 | OutputControlModule | OutputControlType | IOUT | 0 | +| OutputControl.f90 | OutputControlModule | OutputControlType | IBUDCSV | 0 | +| OutputControl.f90 | OutputControlModule | OutputControlType | IPEROC | 0 | +| OutputControl.f90 | OutputControlModule | OutputControlType | IOCREP | 0 | +| SeqVector.f90 | SeqVectorModule | SeqVectorType | name | 1 | +| SparseMatrix.f90 | SparseMatrixModule | SparseMatrixType | NROW | 0 | +| SparseMatrix.f90 | SparseMatrixModule | SparseMatrixType | NCOL | 0 | +| SparseMatrix.f90 | SparseMatrixModule | SparseMatrixType | NJA | 0 | +| SparseMatrix.f90 | SparseMatrixModule | SparseMatrixType | IA | 1 | +| SparseMatrix.f90 | SparseMatrixModule | SparseMatrixType | JA | 1 | +| SparseMatrix.f90 | SparseMatrixModule | SparseMatrixType | AMAT | 1 | +| ExplicitModel.f90 | ExplicitModelModule | ExplicitModelType | IBOUND | 1 | +| NumericalModel.f90 | NumericalModelModule | NumericalModelType | NEQ | 0 | +| NumericalModel.f90 | NumericalModelModule | NumericalModelType | NJA | 0 | +| NumericalModel.f90 | NumericalModelModule | NumericalModelType | ICNVG | 0 | +| NumericalModel.f90 | NumericalModelModule | NumericalModelType | MOFFSET | 0 | +| NumericalModel.f90 | NumericalModelModule | NumericalModelType | XOLD | 1 | +| NumericalModel.f90 | NumericalModelModule | NumericalModelType | FLOWJA | 1 | +| NumericalModel.f90 | NumericalModelModule | NumericalModelType | IDXGLO | 1 | | BaseModel.f90 | BaseModelModule | BaseModelType | NAME | 1 | | BaseModel.f90 | BaseModelModule | BaseModelType | MACRONYM | 1 | | BaseModel.f90 | BaseModelModule | BaseModelType | ID | 0 | @@ -81,14 +323,6 @@ | BaseModel.f90 | BaseModelModule | BaseModelType | IPRFLOW | 0 | | BaseModel.f90 | BaseModelModule | BaseModelType | IPAKCB | 0 | | BaseModel.f90 | BaseModelModule | BaseModelType | IDSOLN | 0 | -| ExplicitModel.f90 | ExplicitModelModule | ExplicitModelType | IBOUND | 1 | -| NumericalModel.f90 | NumericalModelModule | NumericalModelType | NEQ | 0 | -| NumericalModel.f90 | NumericalModelModule | NumericalModelType | NJA | 0 | -| NumericalModel.f90 | NumericalModelModule | NumericalModelType | ICNVG | 0 | -| NumericalModel.f90 | NumericalModelModule | NumericalModelType | MOFFSET | 0 | -| NumericalModel.f90 | NumericalModelModule | NumericalModelType | XOLD | 1 | -| NumericalModel.f90 | NumericalModelModule | NumericalModelType | FLOWJA | 1 | -| NumericalModel.f90 | NumericalModelModule | NumericalModelType | IDXGLO | 1 | | NumericalPackage.f90 | NumericalPackageModule | NumericalPackageType | INPUT_FNAME | 1 | | NumericalPackage.f90 | NumericalPackageModule | NumericalPackageType | PACKAGE_TYPE | 1 | | NumericalPackage.f90 | NumericalPackageModule | NumericalPackageType | ID | 0 | @@ -101,14 +335,23 @@ | NumericalPackage.f90 | NumericalPackageModule | NumericalPackageType | IPAKCB | 0 | | NumericalPackage.f90 | NumericalPackageModule | NumericalPackageType | IONPER | 0 | | NumericalPackage.f90 | NumericalPackageModule | NumericalPackageType | LASTONPER | 0 | +| GwfGwfConnection.f90 | GwfGwfConnectionModule | GwfGwfConnectionType | IXT3DEXG | 0 | +| GwtInterfaceModel.f90 | GwtInterfaceModelModule | GwtInterfaceModelType | ADVSCHEME | 0 | +| GwtInterfaceModel.f90 | GwtInterfaceModelModule | GwtInterfaceModelType | IXT3D | 0 | +| GwtInterfaceModel.f90 | GwtInterfaceModelModule | GwtInterfaceModelType | IEQNSCLFAC | 0 | +| GwtInterfaceModel.f90 | GwtInterfaceModelModule | GwtInterfaceModelType | GWFFLOWJA | 1 | +| GwtInterfaceModel.f90 | GwtInterfaceModelModule | GwtInterfaceModelType | GWFHEAD | 1 | +| GwtInterfaceModel.f90 | GwtInterfaceModelModule | GwtInterfaceModelType | GWFSAT | 1 | +| GwtInterfaceModel.f90 | GwtInterfaceModelModule | GwtInterfaceModelType | GWFSPDIS | 2 | +| GwtInterfaceModel.f90 | GwtInterfaceModelModule | GwtInterfaceModelType | create_mem_path(this%name | 2 | | GridConnection.f90 | GridConnectionModule | GridConnectionType | IDXTOGLOBALIDX | 1 | | GridConnection.f90 | GridConnectionModule | GridConnectionType | NRBNDCELLS | 0 | | GridConnection.f90 | GridConnectionModule | GridConnectionType | IDXCOUNT | 0 | | GridConnection.f90 | GridConnectionModule | GridConnectionType | NRCELLS | 0 | -| GweGweConnection.f90 | GweGweConnectionModule | GweGweConnectionType | IADVSCHEME | 0 | -| GweGweConnection.f90 | GweGweConnectionModule | GweGweConnectionType | IXT3D | 0 | -| GweGweConnection.f90 | GweGweConnectionModule | GweGweConnectionType | EXGFLOWSIGN | 0 | -| GweGweConnection.f90 | GweGweConnectionModule | GweGweConnectionType | EXGFLOWJAGWT | 1 | +| GwtGwtConnection.f90 | GwtGwtConnectionModule | GwtGwtConnectionType | IADVSCHEME | 0 | +| GwtGwtConnection.f90 | GwtGwtConnectionModule | GwtGwtConnectionType | IXT3D | 0 | +| GwtGwtConnection.f90 | GwtGwtConnectionModule | GwtGwtConnectionType | EXGFLOWSIGN | 0 | +| GwtGwtConnection.f90 | GwtGwtConnectionModule | GwtGwtConnectionType | EXGFLOWJAGWT | 1 | | GweInterfaceModel.f90 | GweInterfaceModelModule | GweInterfaceModelType | ADVSCHEME | 0 | | GweInterfaceModel.f90 | GweInterfaceModelModule | GweInterfaceModelType | IXT3D | 0 | | GweInterfaceModel.f90 | GweInterfaceModelModule | GweInterfaceModelType | IEQNSCLFAC | 0 | @@ -117,19 +360,6 @@ | GweInterfaceModel.f90 | GweInterfaceModelModule | GweInterfaceModelType | GWFSAT | 1 | | GweInterfaceModel.f90 | GweInterfaceModelModule | GweInterfaceModelType | GWFSPDIS | 2 | | GweInterfaceModel.f90 | GweInterfaceModelModule | GweInterfaceModelType | create_mem_path(this%name | 2 | -| GwfGwfConnection.f90 | GwfGwfConnectionModule | GwfGwfConnectionType | IXT3DEXG | 0 | -| GwtGwtConnection.f90 | GwtGwtConnectionModule | GwtGwtConnectionType | IADVSCHEME | 0 | -| GwtGwtConnection.f90 | GwtGwtConnectionModule | GwtGwtConnectionType | IXT3D | 0 | -| GwtGwtConnection.f90 | GwtGwtConnectionModule | GwtGwtConnectionType | EXGFLOWSIGN | 0 | -| GwtGwtConnection.f90 | GwtGwtConnectionModule | GwtGwtConnectionType | EXGFLOWJAGWT | 1 | -| GwtInterfaceModel.f90 | GwtInterfaceModelModule | GwtInterfaceModelType | ADVSCHEME | 0 | -| GwtInterfaceModel.f90 | GwtInterfaceModelModule | GwtInterfaceModelType | IXT3D | 0 | -| GwtInterfaceModel.f90 | GwtInterfaceModelModule | GwtInterfaceModelType | IEQNSCLFAC | 0 | -| GwtInterfaceModel.f90 | GwtInterfaceModelModule | GwtInterfaceModelType | GWFFLOWJA | 1 | -| GwtInterfaceModel.f90 | GwtInterfaceModelModule | GwtInterfaceModelType | GWFHEAD | 1 | -| GwtInterfaceModel.f90 | GwtInterfaceModelModule | GwtInterfaceModelType | GWFSAT | 1 | -| GwtInterfaceModel.f90 | GwtInterfaceModelModule | GwtInterfaceModelType | GWFSPDIS | 2 | -| GwtInterfaceModel.f90 | GwtInterfaceModelModule | GwtInterfaceModelType | create_mem_path(this%name | 2 | | SpatialModelConnection.f90 | SpatialModelConnectionModule | SpatialModelConnectionType | NEQ | 0 | | SpatialModelConnection.f90 | SpatialModelConnectionModule | SpatialModelConnectionType | INTSTDEPTH | 0 | | SpatialModelConnection.f90 | SpatialModelConnectionModule | SpatialModelConnectionType | EXGSTDEPTH | 0 | @@ -137,754 +367,170 @@ | SpatialModelConnection.f90 | SpatialModelConnectionModule | SpatialModelConnectionType | X | 1 | | SpatialModelConnection.f90 | SpatialModelConnectionModule | SpatialModelConnectionType | RHS | 1 | | SpatialModelConnection.f90 | SpatialModelConnectionModule | SpatialModelConnectionType | IACTIVE | 1 | -| gwe1.f90 | GweModule | GweModelType | INEST | 0 | -| gwe1.f90 | GweModule | GweModelType | INDSP | 0 | -| gwe1ctp1.f90 | GweCtpModule | GweCtpType | RATECTPIN | 1 | -| gwe1ctp1.f90 | GweCtpModule | GweCtpType | RATECTPOUT | 1 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | IDISP | 0 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | IALH | 0 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | IALV | 0 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | IATH1 | 0 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | IATH2 | 0 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | IATV | 0 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | IXT3DOFF | 0 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | IXT3DRHS | 0 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | IXT3D | 0 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | ID22 | 0 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | ID33 | 0 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | IANGLE1 | 0 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | IANGLE2 | 0 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | IANGLE3 | 0 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | IKTW | 0 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | IKTS | 0 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | ALH | 1 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | ALV | 1 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | ATH1 | 1 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | ATH2 | 1 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | ATV | 1 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | D11 | 1 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | D22 | 1 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | D33 | 1 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | ANGLE1 | 1 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | ANGLE2 | 1 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | ANGLE3 | 1 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | KTW | 1 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | KTS | 1 | -| gwe1dsp1.f90 | GweDspModule | GweDspType | DISPCOEF | 1 | -| gwe1est1.f90 | GweEstModule | GweEstType | CPW | 0 | -| gwe1est1.f90 | GweEstModule | GweEstType | RHOW | 0 | -| gwe1est1.f90 | GweEstModule | GweEstType | LATHEATVAP | 0 | -| gwe1est1.f90 | GweEstModule | GweEstType | IDCY | 0 | -| gwe1est1.f90 | GweEstModule | GweEstType | ILHV | 0 | -| gwe1est1.f90 | GweEstModule | GweEstType | POROSITY | 1 | -| gwe1est1.f90 | GweEstModule | GweEstType | RATESTO | 1 | -| gwe1est1.f90 | GweEstModule | GweEstType | CPS | 1 | -| gwe1est1.f90 | GweEstModule | GweEstType | RHOS | 1 | -| gwe1est1.f90 | GweEstModule | GweEstType | RATEDCY | 1 | -| gwe1est1.f90 | GweEstModule | GweEstType | DECAY | 1 | -| gwe1est1.f90 | GweEstModule | GweEstType | DECAYLAST | 1 | -| gwf3.f90 | GwfModule | GwfModelType | INIC | 0 | -| gwf3.f90 | GwfModule | GwfModelType | INOC | 0 | -| gwf3.f90 | GwfModule | GwfModelType | INNPF | 0 | -| gwf3.f90 | GwfModule | GwfModelType | INBUY | 0 | -| gwf3.f90 | GwfModule | GwfModelType | INVSC | 0 | -| gwf3.f90 | GwfModule | GwfModelType | INSTO | 0 | -| gwf3.f90 | GwfModule | GwfModelType | INCSUB | 0 | -| gwf3.f90 | GwfModule | GwfModelType | INMVR | 0 | -| gwf3.f90 | GwfModule | GwfModelType | INHFB | 0 | -| gwf3.f90 | GwfModule | GwfModelType | INGNC | 0 | -| gwf3.f90 | GwfModule | GwfModelType | INOBS | 0 | -| gwf3.f90 | GwfModule | GwfModelType | ISS | 0 | -| gwf3.f90 | GwfModule | GwfModelType | INEWTONUR | 0 | -| gwf3buy8.f90 | GwfBuyModule | GwfBuyType | IOUTDENSE | 0 | -| gwf3buy8.f90 | GwfBuyModule | GwfBuyType | IFORM | 0 | -| gwf3buy8.f90 | GwfBuyModule | GwfBuyType | IREADELEV | 0 | -| gwf3buy8.f90 | GwfBuyModule | GwfBuyType | IREADCONCBUY | 0 | -| gwf3buy8.f90 | GwfBuyModule | GwfBuyType | ICONCSET | 0 | -| gwf3buy8.f90 | GwfBuyModule | GwfBuyType | DENSEREF | 0 | -| gwf3buy8.f90 | GwfBuyModule | GwfBuyType | NRHOSPECIES | 0 | -| gwf3buy8.f90 | GwfBuyModule | GwfBuyType | DENSE | 1 | -| gwf3buy8.f90 | GwfBuyModule | GwfBuyType | CONCBUY | 1 | -| gwf3buy8.f90 | GwfBuyModule | GwfBuyType | ELEV | 1 | -| gwf3buy8.f90 | GwfBuyModule | GwfBuyType | DRHODC | 1 | -| gwf3buy8.f90 | GwfBuyModule | GwfBuyType | CRHOREF | 1 | -| gwf3buy8.f90 | GwfBuyModule | GwfBuyType | CTEMP | 1 | -| gwf3chd8.f90 | ChdModule | ChdType | RATECHDIN | 1 | -| gwf3chd8.f90 | ChdModule | ChdType | RATECHDOUT | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | LISTLABEL | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | STONAME | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | ISTOUNIT | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | INOBSPKG | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | NINTERBEDS | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | MAXSIG0 | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | NBOUND | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | ISCLOC | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | IAUXMULTCOL | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | NDELAYCELLS | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | NDELAYBEDS | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | INITIALIZED | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | IESLAG | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | IPCH | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | LHEAD_BASED | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | IUPDATESTRESS | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | ISPECIFIED_PCS | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | ISPECIFIED_DBH | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | INAMEDBOUND | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | ICONVCHK | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | NAUX | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | ISTORAGEC | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | ISTRAINIB | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | ISTRAINSK | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | IOUTCOMP | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | IOUTCOMPI | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | IOUTCOMPE | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | IOUTCOMPIB | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | IOUTCOMPS | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | IOUTZDISP | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | IPAKCSV | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | IUPDATEMATPROP | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | EPSILON | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CC_CRIT | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | GAMMAW | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | BETA | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | BRG | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | SATOMEGA | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | ICELLF | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | GWFISS0 | 0 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | AUXNAME | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | BUFF | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | BUFFUSR | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | SGM | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | SGS | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CG_SKE_CR | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CG_ES | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CG_ES0 | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CG_PCS | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CG_COMP | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CG_TCOMP | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CG_STOR | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CG_SKE | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CG_SK | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CG_THICKINI | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CG_THETAINI | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CG_THICK | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CG_THICK0 | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CG_THETA | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CG_THETA0 | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CELL_WCSTOR | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CELL_THICK | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | AUXVAR | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | UNODELIST | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | NODELIST | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CG_GS | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | PCS | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | RNB | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | KV | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | H0 | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | CI | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | RCI | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | IDELAY | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | IELASTIC | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | ICONVERT | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | COMP | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | TCOMP | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | TCOMPI | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | TCOMPE | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | STORAGEE | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | STORAGEI | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | SKE | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | SK | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | THICKINI | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | THETAINI | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | THICK | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | THICK0 | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | THETA | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | THETA0 | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | BOUNDNAME | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | NODELISTSIG0 | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | SIG0 | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | IDB_NCONV_COUNT | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | IDBCONVERT | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBDHMAX | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBZ | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBRELZ | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBH | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBH0 | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBGEO | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBES | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBES0 | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBPCS | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBFLOWTOP | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBFLOWBOT | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBDZINI | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBTHETAINI | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBCOMP | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBTCOMP | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBDZ | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBDZ0 | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBTHETA | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBTHETA0 | 2 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBAL | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBAD | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBAU | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBRHS | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBDH | 1 | -| gwf3csub8.f90 | GwfCsubModule | GwfCsubType | DBAW | 1 | -| gwf3dis8.f90 | GwfDisModule | GwfDisType | DELR | 1 | -| gwf3dis8.f90 | GwfDisModule | GwfDisType | DELC | 1 | -| gwf3dis8.f90 | GwfDisModule | GwfDisType | IDOMAIN | 3 | -| gwf3dis8.f90 | GwfDisModule | GwfDisType | TOP2D | 2 | -| gwf3dis8.f90 | GwfDisModule | GwfDisType | BOT3D | 3 | -| gwf3dis8.f90 | GwfDisModule | GwfDisType | CELLX | 1 | -| gwf3dis8.f90 | GwfDisModule | GwfDisType | CELLY | 1 | -| gwf3dis8.f90 | GwfDisModule | GwfDisType | NLAY | 0 | -| gwf3dis8.f90 | GwfDisModule | GwfDisType | NROW | 0 | -| gwf3dis8.f90 | GwfDisModule | GwfDisType | NCOL | 0 | -| gwf3dis8.f90 | GwfDisModule | GwfDisType | NODEUSER | 1 | -| gwf3dis8.f90 | GwfDisModule | GwfDisType | NODEREDUCED | 1 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | TOP1D | 1 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | BOT1D | 1 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | AREA1D | 1 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | IDOMAIN | 1 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | VERTICES | 2 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | IAINP | 1 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | JAINP | 1 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | IHCINP | 1 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | CL12INP | 1 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | HWVAINP | 1 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | ANGLDEGXINP | 1 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | CELLXY | 2 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | IAVERT | 1 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | JAVERT | 1 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | NJAUSR | 0 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | NVERT | 0 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | VOFFSETTOL | 0 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | IANGLEDEGX | 0 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | NODEUSER | 1 | -| gwf3disu8.f90 | GwfDisuModule | GwfDisuType | NODEREDUCED | 1 | -| gwf3disv8.f90 | GwfDisvModule | GwfDisvType | IDOMAIN | 2 | -| gwf3disv8.f90 | GwfDisvModule | GwfDisvType | TOP1D | 1 | -| gwf3disv8.f90 | GwfDisvModule | GwfDisvType | BOT2D | 2 | -| gwf3disv8.f90 | GwfDisvModule | GwfDisvType | VERTICES | 2 | -| gwf3disv8.f90 | GwfDisvModule | GwfDisvType | CELLXY | 2 | -| gwf3disv8.f90 | GwfDisvModule | GwfDisvType | IAVERT | 1 | -| gwf3disv8.f90 | GwfDisvModule | GwfDisvType | JAVERT | 1 | -| gwf3disv8.f90 | GwfDisvModule | GwfDisvType | NLAY | 0 | -| gwf3disv8.f90 | GwfDisvModule | GwfDisvType | NCPL | 0 | -| gwf3disv8.f90 | GwfDisvModule | GwfDisvType | NVERT | 0 | -| gwf3disv8.f90 | GwfDisvModule | GwfDisvType | NODEUSER | 1 | -| gwf3disv8.f90 | GwfDisvModule | GwfDisvType | NODEREDUCED | 1 | -| gwf3drn8.f90 | DrnModule | DrnType | IAUXDDRNCOL | 0 | -| gwf3drn8.f90 | DrnModule | DrnType | ICUBIC_SCALING | 0 | -| gwf3evt8.f90 | EvtModule | EvtType | NSEG | 0 | -| gwf3hfb8.f90 | GwfHfbModule | GwfHfbType | MAXHFB | 0 | -| gwf3hfb8.f90 | GwfHfbModule | GwfHfbType | NHFB | 0 | -| gwf3hfb8.f90 | GwfHfbModule | GwfHfbType | IVSC | 0 | -| gwf3hfb8.f90 | GwfHfbModule | GwfHfbType | NODEN | 1 | -| gwf3hfb8.f90 | GwfHfbModule | GwfHfbType | NODEM | 1 | -| gwf3hfb8.f90 | GwfHfbModule | GwfHfbType | HYDCHR | 1 | -| gwf3hfb8.f90 | GwfHfbModule | GwfHfbType | IDXLOC | 1 | -| gwf3hfb8.f90 | GwfHfbModule | GwfHfbType | CSATSAV | 1 | -| gwf3hfb8.f90 | GwfHfbModule | GwfHfbType | CONDSAV | 1 | -| gwf3ic8.f90 | GwfIcModule | GwfIcType | STRT | 1 | -| gwf3lak8.f90 | LakModule | LakType | IPRHED | 0 | -| gwf3lak8.f90 | LakModule | LakType | ISTAGEOUT | 0 | -| gwf3lak8.f90 | LakModule | LakType | IBUDGETOUT | 0 | -| gwf3lak8.f90 | LakModule | LakType | IBUDCSV | 0 | -| gwf3lak8.f90 | LakModule | LakType | IPAKCSV | 0 | -| gwf3lak8.f90 | LakModule | LakType | NLAKES | 0 | -| gwf3lak8.f90 | LakModule | LakType | NOUTLETS | 0 | -| gwf3lak8.f90 | LakModule | LakType | NTABLES | 0 | -| gwf3lak8.f90 | LakModule | LakType | CONVLENGTH | 0 | -| gwf3lak8.f90 | LakModule | LakType | CONVTIME | 0 | -| gwf3lak8.f90 | LakModule | LakType | OUTDMAX | 0 | -| gwf3lak8.f90 | LakModule | LakType | IGWHCOPT | 0 | -| gwf3lak8.f90 | LakModule | LakType | ICONVCHK | 0 | -| gwf3lak8.f90 | LakModule | LakType | ICONVRESIDCHK | 0 | -| gwf3lak8.f90 | LakModule | LakType | MAXLAKIT | 0 | -| gwf3lak8.f90 | LakModule | LakType | SURFDEP | 0 | -| gwf3lak8.f90 | LakModule | LakType | DMAXCHG | 0 | -| gwf3lak8.f90 | LakModule | LakType | DELH | 0 | -| gwf3lak8.f90 | LakModule | LakType | PDMAX | 0 | -| gwf3lak8.f90 | LakModule | LakType | CHECK_ATTR | 0 | -| gwf3lak8.f90 | LakModule | LakType | BDITEMS | 0 | -| gwf3lak8.f90 | LakModule | LakType | CBCAUXITEMS | 0 | -| gwf3lak8.f90 | LakModule | LakType | IDENSE | 0 | -| gwf3lak8.f90 | LakModule | LakType | DBUFF | 1 | -| gwf3lak8.f90 | LakModule | LakType | QAUXCBC | 1 | -| gwf3lak8.f90 | LakModule | LakType | QLEAK | 1 | -| gwf3lak8.f90 | LakModule | LakType | QSTO | 1 | -| gwf3lak8.f90 | LakModule | LakType | DENSETERMS | 2 | -| gwf3lak8.f90 | LakModule | LakType | VISCRATIOS | 2 | -| gwf3lak8.f90 | LakModule | LakType | NLAKECONN | 1 | -| gwf3lak8.f90 | LakModule | LakType | IDXLAKECONN | 1 | -| gwf3lak8.f90 | LakModule | LakType | NTABROW | 1 | -| gwf3lak8.f90 | LakModule | LakType | STRT | 1 | -| gwf3lak8.f90 | LakModule | LakType | LAKETOP | 1 | -| gwf3lak8.f90 | LakModule | LakType | LAKEBOT | 1 | -| gwf3lak8.f90 | LakModule | LakType | SAREAMAX | 1 | -| gwf3lak8.f90 | LakModule | LakType | STAGE | 1 | -| gwf3lak8.f90 | LakModule | LakType | RAINFALL | 1 | -| gwf3lak8.f90 | LakModule | LakType | EVAPORATION | 1 | -| gwf3lak8.f90 | LakModule | LakType | RUNOFF | 1 | -| gwf3lak8.f90 | LakModule | LakType | INFLOW | 1 | -| gwf3lak8.f90 | LakModule | LakType | WITHDRAWAL | 1 | -| gwf3lak8.f90 | LakModule | LakType | LAUXVAR | 2 | -| gwf3lak8.f90 | LakModule | LakType | AVAIL | 1 | -| gwf3lak8.f90 | LakModule | LakType | LKGWSINK | 1 | -| gwf3lak8.f90 | LakModule | LakType | NCNCVR | 1 | -| gwf3lak8.f90 | LakModule | LakType | SURFIN | 1 | -| gwf3lak8.f90 | LakModule | LakType | SURFOUT | 1 | -| gwf3lak8.f90 | LakModule | LakType | SURFOUT1 | 1 | -| gwf3lak8.f90 | LakModule | LakType | PRECIP | 1 | -| gwf3lak8.f90 | LakModule | LakType | PRECIP1 | 1 | -| gwf3lak8.f90 | LakModule | LakType | EVAP | 1 | -| gwf3lak8.f90 | LakModule | LakType | EVAP1 | 1 | -| gwf3lak8.f90 | LakModule | LakType | EVAPO | 1 | -| gwf3lak8.f90 | LakModule | LakType | WITHR | 1 | -| gwf3lak8.f90 | LakModule | LakType | WITHR1 | 1 | -| gwf3lak8.f90 | LakModule | LakType | FLWIN | 1 | -| gwf3lak8.f90 | LakModule | LakType | FLWITER | 1 | -| gwf3lak8.f90 | LakModule | LakType | FLWITER1 | 1 | -| gwf3lak8.f90 | LakModule | LakType | SEEP | 1 | -| gwf3lak8.f90 | LakModule | LakType | SEEP1 | 1 | -| gwf3lak8.f90 | LakModule | LakType | SEEP0 | 1 | -| gwf3lak8.f90 | LakModule | LakType | STAGEITER | 1 | -| gwf3lak8.f90 | LakModule | LakType | CHTERM | 1 | -| gwf3lak8.f90 | LakModule | LakType | IBOUND | 1 | -| gwf3lak8.f90 | LakModule | LakType | XNEWPAK | 1 | -| gwf3lak8.f90 | LakModule | LakType | XOLDPAK | 1 | -| gwf3lak8.f90 | LakModule | LakType | ISEEPC | 1 | -| gwf3lak8.f90 | LakModule | LakType | IDHC | 1 | -| gwf3lak8.f90 | LakModule | LakType | EN1 | 1 | -| gwf3lak8.f90 | LakModule | LakType | EN2 | 1 | -| gwf3lak8.f90 | LakModule | LakType | R1 | 1 | -| gwf3lak8.f90 | LakModule | LakType | R2 | 1 | -| gwf3lak8.f90 | LakModule | LakType | DH0 | 1 | -| gwf3lak8.f90 | LakModule | LakType | S0 | 1 | -| gwf3lak8.f90 | LakModule | LakType | QGWF0 | 1 | -| gwf3lak8.f90 | LakModule | LakType | IMAP | 1 | -| gwf3lak8.f90 | LakModule | LakType | CELLID | 1 | -| gwf3lak8.f90 | LakModule | LakType | NODESONTOP | 1 | -| gwf3lak8.f90 | LakModule | LakType | ICTYPE | 1 | -| gwf3lak8.f90 | LakModule | LakType | BEDLEAK | 1 | -| gwf3lak8.f90 | LakModule | LakType | BELEV | 1 | -| gwf3lak8.f90 | LakModule | LakType | TELEV | 1 | -| gwf3lak8.f90 | LakModule | LakType | CONNLENGTH | 1 | -| gwf3lak8.f90 | LakModule | LakType | CONNWIDTH | 1 | -| gwf3lak8.f90 | LakModule | LakType | SAREA | 1 | -| gwf3lak8.f90 | LakModule | LakType | WAREA | 1 | -| gwf3lak8.f90 | LakModule | LakType | SATCOND | 1 | -| gwf3lak8.f90 | LakModule | LakType | SIMCOND | 1 | -| gwf3lak8.f90 | LakModule | LakType | SIMLAKGW | 1 | -| gwf3lak8.f90 | LakModule | LakType | IALAKTAB | 1 | -| gwf3lak8.f90 | LakModule | LakType | TABSTAGE | 1 | -| gwf3lak8.f90 | LakModule | LakType | TABVOLUME | 1 | -| gwf3lak8.f90 | LakModule | LakType | TABSAREA | 1 | -| gwf3lak8.f90 | LakModule | LakType | TABWAREA | 1 | -| gwf3lak8.f90 | LakModule | LakType | LAKEIN | 1 | -| gwf3lak8.f90 | LakModule | LakType | LAKEOUT | 1 | -| gwf3lak8.f90 | LakModule | LakType | IOUTTYPE | 1 | -| gwf3lak8.f90 | LakModule | LakType | OUTRATE | 1 | -| gwf3lak8.f90 | LakModule | LakType | OUTINVERT | 1 | -| gwf3lak8.f90 | LakModule | LakType | OUTWIDTH | 1 | -| gwf3lak8.f90 | LakModule | LakType | OUTROUGH | 1 | -| gwf3lak8.f90 | LakModule | LakType | OUTSLOPE | 1 | -| gwf3lak8.f90 | LakModule | LakType | SIMOUTRATE | 1 | -| gwf3maw8.f90 | MawModule | MawType | CORRECT_FLOW | 0 | -| gwf3maw8.f90 | MawModule | MawType | IPRHED | 0 | -| gwf3maw8.f90 | MawModule | MawType | IHEADOUT | 0 | -| gwf3maw8.f90 | MawModule | MawType | IBUDGETOUT | 0 | -| gwf3maw8.f90 | MawModule | MawType | IBUDCSV | 0 | -| gwf3maw8.f90 | MawModule | MawType | IFLOWINGWELLS | 0 | -| gwf3maw8.f90 | MawModule | MawType | IMAWISS | 0 | -| gwf3maw8.f90 | MawModule | MawType | IMAWISSOPT | 0 | -| gwf3maw8.f90 | MawModule | MawType | NMAWWELLS | 0 | -| gwf3maw8.f90 | MawModule | MawType | CHECK_ATTR | 0 | -| gwf3maw8.f90 | MawModule | MawType | ISHUTOFFCNT | 0 | -| gwf3maw8.f90 | MawModule | MawType | IEFFRADOPT | 0 | -| gwf3maw8.f90 | MawModule | MawType | IOUTREDFLOWCSV | 0 | -| gwf3maw8.f90 | MawModule | MawType | SATOMEGA | 0 | -| gwf3maw8.f90 | MawModule | MawType | BDITEMS | 0 | -| gwf3maw8.f90 | MawModule | MawType | THETA | 0 | -| gwf3maw8.f90 | MawModule | MawType | KAPPA | 0 | -| gwf3maw8.f90 | MawModule | MawType | CBCAUXITEMS | 0 | -| gwf3maw8.f90 | MawModule | MawType | IDENSE | 0 | -| gwf3maw8.f90 | MawModule | MawType | CMAWBUDGET | 2 | -| gwf3maw8.f90 | MawModule | MawType | CMAWNAME | 2 | -| gwf3maw8.f90 | MawModule | MawType | STATUS | 2 | -| gwf3maw8.f90 | MawModule | MawType | NGWFNODES | 1 | -| gwf3maw8.f90 | MawModule | MawType | IEQN | 1 | -| gwf3maw8.f90 | MawModule | MawType | ISHUTOFF | 1 | -| gwf3maw8.f90 | MawModule | MawType | IFWDISCHARGE | 1 | -| gwf3maw8.f90 | MawModule | MawType | STRT | 1 | -| gwf3maw8.f90 | MawModule | MawType | RADIUS | 1 | -| gwf3maw8.f90 | MawModule | MawType | AREA | 1 | -| gwf3maw8.f90 | MawModule | MawType | PUMPELEV | 1 | -| gwf3maw8.f90 | MawModule | MawType | BOT | 1 | -| gwf3maw8.f90 | MawModule | MawType | RATESIM | 1 | -| gwf3maw8.f90 | MawModule | MawType | REDUCTION_LENGTH | 1 | -| gwf3maw8.f90 | MawModule | MawType | FWELEV | 1 | -| gwf3maw8.f90 | MawModule | MawType | FWCONDS | 1 | -| gwf3maw8.f90 | MawModule | MawType | FWRLEN | 1 | -| gwf3maw8.f90 | MawModule | MawType | FWCONDSIM | 1 | -| gwf3maw8.f90 | MawModule | MawType | XSTO | 1 | -| gwf3maw8.f90 | MawModule | MawType | XOLDSTO | 1 | -| gwf3maw8.f90 | MawModule | MawType | SHUTOFFMIN | 1 | -| gwf3maw8.f90 | MawModule | MawType | SHUTOFFMAX | 1 | -| gwf3maw8.f90 | MawModule | MawType | SHUTOFFLEVEL | 1 | -| gwf3maw8.f90 | MawModule | MawType | SHUTOFFWEIGHT | 1 | -| gwf3maw8.f90 | MawModule | MawType | SHUTOFFDQ | 1 | -| gwf3maw8.f90 | MawModule | MawType | SHUTOFFQOLD | 1 | -| gwf3maw8.f90 | MawModule | MawType | RATE | 1 | -| gwf3maw8.f90 | MawModule | MawType | WELL_HEAD | 1 | -| gwf3maw8.f90 | MawModule | MawType | MAUXVAR | 2 | -| gwf3maw8.f90 | MawModule | MawType | DBUFF | 1 | -| gwf3maw8.f90 | MawModule | MawType | IACONN | 1 | -| gwf3maw8.f90 | MawModule | MawType | IMAP | 1 | -| gwf3maw8.f90 | MawModule | MawType | GWFNODES | 1 | -| gwf3maw8.f90 | MawModule | MawType | SRADIUS | 1 | -| gwf3maw8.f90 | MawModule | MawType | HK | 1 | -| gwf3maw8.f90 | MawModule | MawType | SATCOND | 1 | -| gwf3maw8.f90 | MawModule | MawType | SIMCOND | 1 | -| gwf3maw8.f90 | MawModule | MawType | TOPSCRN | 1 | -| gwf3maw8.f90 | MawModule | MawType | BOTSCRN | 1 | -| gwf3maw8.f90 | MawModule | MawType | QLEAK | 1 | -| gwf3maw8.f90 | MawModule | MawType | CAUXCBC | 2 | -| gwf3maw8.f90 | MawModule | MawType | QAUXCBC | 1 | -| gwf3maw8.f90 | MawModule | MawType | QFW | 1 | -| gwf3maw8.f90 | MawModule | MawType | QOUT | 1 | -| gwf3maw8.f90 | MawModule | MawType | QSTO | 1 | -| gwf3maw8.f90 | MawModule | MawType | QCONST | 1 | -| gwf3maw8.f90 | MawModule | MawType | DENSETERMS | 2 | -| gwf3maw8.f90 | MawModule | MawType | VISCRATIOS | 2 | -| gwf3maw8.f90 | MawModule | MawType | IDXLOCNODE | 1 | -| gwf3maw8.f90 | MawModule | MawType | IDXDGLO | 1 | -| gwf3maw8.f90 | MawModule | MawType | IDXOFFDGLO | 1 | -| gwf3maw8.f90 | MawModule | MawType | IDXSYMDGLO | 1 | -| gwf3maw8.f90 | MawModule | MawType | IDXSYMOFFDGLO | 1 | -| gwf3maw8.f90 | MawModule | MawType | XOLDPAK | 1 | -| gwf3mvr8.f90 | GwfMvrModule | GwfMvrType | IBUDGETOUT | 0 | -| gwf3mvr8.f90 | GwfMvrModule | GwfMvrType | IBUDCSV | 0 | -| gwf3mvr8.f90 | GwfMvrModule | GwfMvrType | MAXMVR | 0 | -| gwf3mvr8.f90 | GwfMvrModule | GwfMvrType | MAXPACKAGES | 0 | -| gwf3mvr8.f90 | GwfMvrModule | GwfMvrType | MAXCOMB | 0 | -| gwf3mvr8.f90 | GwfMvrModule | GwfMvrType | NMVR | 0 | -| gwf3mvr8.f90 | GwfMvrModule | GwfMvrType | IEXGMVR | 0 | -| gwf3mvr8.f90 | GwfMvrModule | GwfMvrType | IMODELNAMES | 0 | -| gwf3mvr8.f90 | GwfMvrModule | GwfMvrType | IENTRIES | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | INAME | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IXT3D | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IXT3DRHS | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | SATOMEGA | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | HNOFLO | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | HDRY | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | ICELLAVG | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IAVGKEFF | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IK22 | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IK33 | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IK22OVERK | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IK33OVERK | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IPERCHED | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IVARCV | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IDEWATCV | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | ITHICKSTRT | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IUSGNRHC | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | INWTUPW | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | ICALCSPDIS | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | ISAVSPDIS | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | ISAVSAT | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IREWET | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | WETFCT | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IWETIT | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IHDWET | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | SATMIN | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IANGLE1 | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IANGLE2 | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IANGLE3 | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IWETDRY | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | NEDGES | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | LASTEDGE | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | INTVK | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | INVSC | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | KCHANGEPER | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | KCHANGESTP | 0 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | ITHICKSTARTFLAG | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | ICELLTYPE | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | K11 | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | SAT | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | CONDSAT | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | K22 | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | K33 | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | WETDRY | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | ANGLE1 | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | ANGLE2 | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | ANGLE3 | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IBOTNODE | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | NODEDGE | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | IHCEDGE | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | PROPSEDGE | 2 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | K11INPUT | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | K22INPUT | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | K33INPUT | 1 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | SPDIS | 2 | -| gwf3npf8.f90 | GwfNpfModule | GwfNpftype | NODEKCHANGE | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | IPRHED | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | ISTAGEOUT | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | IBUDGETOUT | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | IBUDCSV | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | IPAKCSV | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | IDIVERSIONS | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | MAXSFRPICARD | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | MAXSFRIT | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | BDITEMS | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | CBCAUXITEMS | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | UNITCONV | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | LENGTHCONV | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | TIMECONV | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | DMAXCHG | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | DEPS | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | NCONN | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | ICHECK | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | ICONVCHK | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | IDENSE | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | IANYNONE | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | NCROSSPTSTOT | 0 | -| gwf3sfr8.f90 | SfrModule | SfrType | SFRNAME | 2 | -| gwf3sfr8.f90 | SfrModule | SfrType | IBOUNDPAK | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | IGWFNODE | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | IGWFTOPNODE | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | LENGTH | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | WIDTH | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | STRTOP | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | BTHICK | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | HK | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | SLOPE | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | NCONNREACH | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | USTRF | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | FTOTND | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | NDIV | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | USFLOW | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | DSFLOW | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | DEPTH | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | STAGE | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | GWFLOW | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | SIMEVAP | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | SIMRUNOFF | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | STAGE0 | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | USFLOW0 | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | ISFRORDER | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | IA | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | JA | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | IDIR | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | IDIV | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | QCONN | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | ROUGH | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | RAIN | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | EVAP | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | INFLOW | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | RUNOFF | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | SSTAGE | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | RAUXVAR | 2 | -| gwf3sfr8.f90 | SfrModule | SfrType | IADIV | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | DIVREACH | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | DIVFLOW | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | DIVQ | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | NCROSSPTS | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | IACROSS | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | STATION | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | XSHEIGHT | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | XSROUGH | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | QOUTFLOW | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | QEXTOUTFLOW | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | DBUFF | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | QAUXCBC | 1 | -| gwf3sfr8.f90 | SfrModule | SfrType | DENSETERMS | 2 | -| gwf3sfr8.f90 | SfrModule | SfrType | VISCRATIOS | 2 | -| gwf3sto8.f90 | GwfStoModule | GwfStoType | ISTOR_COEF | 0 | -| gwf3sto8.f90 | GwfStoModule | GwfStoType | ICONF_SS | 0 | -| gwf3sto8.f90 | GwfStoModule | GwfStoType | IORIG_SS | 0 | -| gwf3sto8.f90 | GwfStoModule | GwfStoType | IUSESY | 0 | -| gwf3sto8.f90 | GwfStoModule | GwfStoType | SATOMEGA | 0 | -| gwf3sto8.f90 | GwfStoModule | GwfStoType | INTEGRATECHANGES | 0 | -| gwf3sto8.f90 | GwfStoModule | GwfStoType | INTVS | 0 | -| gwf3sto8.f90 | GwfStoModule | GwfStoType | ICONVERT | 1 | -| gwf3sto8.f90 | GwfStoModule | GwfStoType | SS | 1 | -| gwf3sto8.f90 | GwfStoModule | GwfStoType | SY | 1 | -| gwf3sto8.f90 | GwfStoModule | GwfStoType | STRGSS | 1 | -| gwf3sto8.f90 | GwfStoModule | GwfStoType | STRGSY | 1 | -| gwf3sto8.f90 | GwfStoModule | GwfStoType | OLDSS | 1 | -| gwf3sto8.f90 | GwfStoModule | GwfStoType | OLDSY | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | IGWFNODE | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | APPLIEDINF | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | REJINF | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | REJINF0 | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | REJINFTOMVR | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | INFILTRATION | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | GWET | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | UZET | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | GWD | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | GWD0 | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | GWDTOMVR | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | RCH | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | RCH0 | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | QSTO | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | DERIV | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | IA | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | JA | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | SINF | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | PET | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | EXDP | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | EXTWC | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | HA | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | HROOT | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | ROOTACT | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | UAUXVAR | 2 | -| gwf3uzf8.f90 | UzfModule | UzfType | WCNEW | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | WCOLD | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | QAUXCBC | 1 | -| gwf3uzf8.f90 | UzfModule | UzfType | IPRWCONT | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | IWCONTOUT | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | IBUDGETOUT | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | IBUDCSV | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | IPAKCSV | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | NTRAIL | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | NSETS | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | NODES | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | ISTOCB | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | NWAV | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | TOTFLUXTOT | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | BDITEMS | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | NBDTXT | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | ISSFLAG | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | ISSFLAGOLD | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | READFLAG | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | ISEEPFLAG | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | IMAXCELLCNT | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | IETFLAG | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | IGWETFLAG | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | IUZF2UZF | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | CBCAUXITEMS | 0 | -| gwf3uzf8.f90 | UzfModule | UzfType | ICONVCHK | 0 | -| gwf3vsc8.f90 | GwfVscModule | GwfVscType | THERMIVISC | 0 | -| gwf3vsc8.f90 | GwfVscModule | GwfVscType | IDXTMPR | 0 | -| gwf3vsc8.f90 | GwfVscModule | GwfVscType | IOUTVISC | 0 | -| gwf3vsc8.f90 | GwfVscModule | GwfVscType | IREADELEV | 0 | -| gwf3vsc8.f90 | GwfVscModule | GwfVscType | ICONCSET | 0 | -| gwf3vsc8.f90 | GwfVscModule | GwfVscType | VISCREF | 0 | -| gwf3vsc8.f90 | GwfVscModule | GwfVscType | A2 | 0 | -| gwf3vsc8.f90 | GwfVscModule | GwfVscType | A3 | 0 | -| gwf3vsc8.f90 | GwfVscModule | GwfVscType | A4 | 0 | -| gwf3vsc8.f90 | GwfVscModule | GwfVscType | NVISCSPECIES | 0 | -| gwf3vsc8.f90 | GwfVscModule | GwfVscType | VISC | 1 | -| gwf3vsc8.f90 | GwfVscModule | GwfVscType | IVISC | 1 | -| gwf3vsc8.f90 | GwfVscModule | GwfVscType | DRHODC | 1 | -| gwf3vsc8.f90 | GwfVscModule | GwfVscType | CRHOREF | 1 | -| gwf3vsc8.f90 | GwfVscModule | GwfVscType | CTEMP | 1 | -| gwf3wel8.f90 | WelModule | WelType | IFLOWRED | 0 | -| gwf3wel8.f90 | WelModule | WelType | FLOWRED | 0 | -| gwf3wel8.f90 | WelModule | WelType | IOUTAFRCSV | 0 | -| gwt1.f90 | GwtModule | GwtModelType | INMST | 0 | -| gwt1.f90 | GwtModule | GwtModelType | INDSP | 0 | -| gwt1cnc1.f90 | GwtCncModule | GwtCncType | RATECNCIN | 1 | -| gwt1cnc1.f90 | GwtCncModule | GwtCncType | RATECNCOUT | 1 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | IDIFFC | 0 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | IDISP | 0 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | IALH | 0 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | IALV | 0 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | IATH1 | 0 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | IATH2 | 0 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | IATV | 0 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | IXT3DOFF | 0 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | IXT3DRHS | 0 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | IXT3D | 0 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | ID22 | 0 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | ID33 | 0 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | IANGLE1 | 0 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | IANGLE2 | 0 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | IANGLE3 | 0 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | ALH | 1 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | ALV | 1 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | ATH1 | 1 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | ATH2 | 1 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | ATV | 1 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | DIFFC | 1 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | D11 | 1 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | D22 | 1 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | D33 | 1 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | ANGLE1 | 1 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | ANGLE2 | 1 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | ANGLE3 | 1 | -| gwt1dsp1.f90 | GwtDspModule | GwtDspType | DISPCOEF | 1 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | ICIMOUT | 0 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | IBUDGETOUT | 0 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | IBUDCSV | 0 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | ISRB | 0 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | IDCY | 0 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | KITER | 0 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | STRG | 1 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | CIM | 1 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | CIMNEW | 1 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | CIMOLD | 1 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | POROSITY | 1 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | ZETAIM | 1 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | VOLFRAC | 1 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | BULK_DENSITY | 1 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | DISTCOEF | 1 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | DECAY | 1 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | DECAYLAST | 1 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | DECAYSLAST | 1 | -| gwt1ist1.f90 | GwtIstModule | GwtIstType | DECAY_SORBED | 1 | -| gwt1lkt1.f90 | GwtLktModule | GwtLktType | IDXBUDSSM | 1 | -| gwt1lkt1.f90 | GwtLktModule | GwtLktType | IDXBUDRAIN | 0 | -| gwt1lkt1.f90 | GwtLktModule | GwtLktType | IDXBUDEVAP | 0 | -| gwt1lkt1.f90 | GwtLktModule | GwtLktType | IDXBUDROFF | 0 | -| gwt1lkt1.f90 | GwtLktModule | GwtLktType | IDXBUDIFLW | 0 | -| gwt1lkt1.f90 | GwtLktModule | GwtLktType | IDXBUDWDRL | 0 | -| gwt1lkt1.f90 | GwtLktModule | GwtLktType | IDXBUDOUTF | 0 | -| gwt1lkt1.f90 | GwtLktModule | GwtLktType | CONCRAIN | 1 | -| gwt1lkt1.f90 | GwtLktModule | GwtLktType | CONCEVAP | 1 | -| gwt1lkt1.f90 | GwtLktModule | GwtLktType | CONCROFF | 1 | -| gwt1lkt1.f90 | GwtLktModule | GwtLktType | CONCIFLW | 1 | -| gwt1mst1.f90 | GwtMstModule | GwtMstType | ISRB | 0 | -| gwt1mst1.f90 | GwtMstModule | GwtMstType | IDCY | 0 | -| gwt1mst1.f90 | GwtMstModule | GwtMstType | POROSITY | 1 | -| gwt1mst1.f90 | GwtMstModule | GwtMstType | THETAM | 1 | -| gwt1mst1.f90 | GwtMstModule | GwtMstType | VOLFRACIM | 1 | -| gwt1mst1.f90 | GwtMstModule | GwtMstType | RATESTO | 1 | -| gwt1mst1.f90 | GwtMstModule | GwtMstType | RATEDCY | 1 | -| gwt1mst1.f90 | GwtMstModule | GwtMstType | DECAY | 1 | -| gwt1mst1.f90 | GwtMstModule | GwtMstType | DECAYLAST | 1 | -| gwt1mst1.f90 | GwtMstModule | GwtMstType | RATEDCYS | 1 | -| gwt1mst1.f90 | GwtMstModule | GwtMstType | DECAYSLAST | 1 | -| gwt1mst1.f90 | GwtMstModule | GwtMstType | DECAY_SORBED | 1 | -| gwt1mst1.f90 | GwtMstModule | GwtMstType | BULK_DENSITY | 1 | -| gwt1mst1.f90 | GwtMstModule | GwtMstType | SP2 | 1 | -| gwt1mst1.f90 | GwtMstModule | GwtMstType | DISTCOEF | 1 | -| gwt1mst1.f90 | GwtMstModule | GwtMstType | RATESRB | 1 | -| gwt1mwt1.f90 | GwtMwtModule | GwtMwtType | IDXBUDSSM | 1 | -| gwt1mwt1.f90 | GwtMwtModule | GwtMwtType | IDXBUDRATE | 0 | -| gwt1mwt1.f90 | GwtMwtModule | GwtMwtType | IDXBUDFWRT | 0 | -| gwt1mwt1.f90 | GwtMwtModule | GwtMwtType | IDXBUDRTMV | 0 | -| gwt1mwt1.f90 | GwtMwtModule | GwtMwtType | IDXBUDFRTM | 0 | -| gwt1mwt1.f90 | GwtMwtModule | GwtMwtType | CONCRATE | 1 | -| gwt1sft1.f90 | GwtSftModule | GwtSftType | IDXBUDSSM | 1 | -| gwt1sft1.f90 | GwtSftModule | GwtSftType | IDXBUDRAIN | 0 | -| gwt1sft1.f90 | GwtSftModule | GwtSftType | IDXBUDEVAP | 0 | -| gwt1sft1.f90 | GwtSftModule | GwtSftType | IDXBUDROFF | 0 | -| gwt1sft1.f90 | GwtSftModule | GwtSftType | IDXBUDIFLW | 0 | -| gwt1sft1.f90 | GwtSftModule | GwtSftType | IDXBUDOUTF | 0 | -| gwt1sft1.f90 | GwtSftModule | GwtSftType | CONCRAIN | 1 | -| gwt1sft1.f90 | GwtSftModule | GwtSftType | CONCEVAP | 1 | -| gwt1sft1.f90 | GwtSftModule | GwtSftType | CONCROFF | 1 | -| gwt1sft1.f90 | GwtSftModule | GwtSftType | CONCIFLW | 1 | -| gwt1uzt1.f90 | GwtUztModule | GwtUztType | IDXBUDSSM | 1 | -| gwt1uzt1.f90 | GwtUztModule | GwtUztType | IDXBUDINFL | 0 | -| gwt1uzt1.f90 | GwtUztModule | GwtUztType | IDXBUDRINF | 0 | -| gwt1uzt1.f90 | GwtUztModule | GwtUztType | IDXBUDUZET | 0 | -| gwt1uzt1.f90 | GwtUztModule | GwtUztType | IDXBUDRITM | 0 | -| gwt1uzt1.f90 | GwtUztModule | GwtUztType | CONCINFL | 1 | -| gwt1uzt1.f90 | GwtUztModule | GwtUztType | CONCUZET | 1 | +| GweGweConnection.f90 | GweGweConnectionModule | GweGweConnectionType | IADVSCHEME | 0 | +| GweGweConnection.f90 | GweGweConnectionModule | GweGweConnectionType | IXT3D | 0 | +| GweGweConnection.f90 | GweGweConnectionModule | GweGweConnectionType | EXGFLOWSIGN | 0 | +| GweGweConnection.f90 | GweGweConnectionModule | GweGweConnectionType | EXGFLOWJAGWT | 1 | +| swf-sto.f90 | SwfStoModule | SwfStoType | STRGSS | 1 | +| swf-ic.f90 | SwfIcModule | SwfIcType | STRT | 1 | +| swf.f90 | SwfModule | SwfModelType | INIC | 0 | +| swf.f90 | SwfModule | SwfModelType | INDFW | 0 | +| swf.f90 | SwfModule | SwfModelType | INCXS | 0 | +| swf.f90 | SwfModule | SwfModelType | INSTO | 0 | +| swf.f90 | SwfModule | SwfModelType | INOBS | 0 | +| swf.f90 | SwfModule | SwfModelType | INOC | 0 | +| swf.f90 | SwfModule | SwfModelType | ISS | 0 | +| swf.f90 | SwfModule | SwfModelType | INEWTONUR | 0 | +| swf.f90 | SwfModule | SwfModelType | X | 1 | +| swf.f90 | SwfModule | SwfModelType | RHS | 1 | +| swf.f90 | SwfModule | SwfModelType | IBOUND | 1 | +| swf-cxs.f90 | SwfCxsModule | SwfCxsType | NSECTIONS | 0 | +| swf-cxs.f90 | SwfCxsModule | SwfCxsType | NPOINTS | 0 | +| swf-cxs.f90 | SwfCxsModule | SwfCxsType | IDCXS | 1 | +| swf-cxs.f90 | SwfCxsModule | SwfCxsType | NXSPOINTS | 1 | +| swf-cxs.f90 | SwfCxsModule | SwfCxsType | XFRACTION | 1 | +| swf-cxs.f90 | SwfCxsModule | SwfCxsType | HEIGHT | 1 | +| swf-cxs.f90 | SwfCxsModule | SwfCxsType | MANFRACTION | 1 | +| swf-cxs.f90 | SwfCxsModule | SwfCxsType | IACROSS | 1 | +| swf-dfw.f90 | SwfDfwModule | SwfDfwtype | ICENTRAL | 0 | +| swf-dfw.f90 | SwfDfwModule | SwfDfwtype | UNITCONV | 0 | +| swf-dfw.f90 | SwfDfwModule | SwfDfwtype | LENGTHCONV | 0 | +| swf-dfw.f90 | SwfDfwModule | SwfDfwtype | TIMECONV | 0 | +| swf-dfw.f90 | SwfDfwModule | SwfDfwtype | INOBSPKG | 0 | +| swf-dfw.f90 | SwfDfwModule | SwfDfwType | WIDTH | 1 | +| swf-dfw.f90 | SwfDfwModule | SwfDfwType | MANNINGSN | 1 | +| swf-dfw.f90 | SwfDfwModule | SwfDfwType | SLOPE | 1 | +| swf-dfw.f90 | SwfDfwModule | SwfDfwType | IDCXS | 1 | +| swf-dfw.f90 | SwfDfwModule | SwfDfwType | ICELLTYPE | 1 | +| swf-disl.f90 | SwfDislModule | SwfDislType | NVERT | 0 | +| swf-disl.f90 | SwfDislModule | SwfDislType | CONVLENGTH | 0 | +| swf-disl.f90 | SwfDislModule | SwfDislType | CONVTIME | 0 | +| swf-disl.f90 | SwfDislModule | SwfDislType | REACH_LENGTH | 1 | +| swf-disl.f90 | SwfDislModule | SwfDislType | REACH_BOTTOM | 1 | +| swf-disl.f90 | SwfDislModule | SwfDislType | TOREACH | 1 | +| swf-disl.f90 | SwfDislModule | SwfDislType | IDOMAIN | 1 | +| swf-disl.f90 | SwfDislModule | SwfDislType | VERTICES | 2 | +| swf-disl.f90 | SwfDislModule | SwfDislType | FDC | 1 | +| swf-disl.f90 | SwfDislModule | SwfDislType | CELLXYZ | 2 | +| swf-disl.f90 | SwfDislModule | SwfDislType | IAVERT | 1 | +| swf-disl.f90 | SwfDislModule | SwfDislType | JAVERT | 1 | +| swf-disl.f90 | SwfDislModule | SwfDislType | NODEUSER | 1 | +| swf-disl.f90 | SwfDislModule | SwfDislType | NODEREDUCED | 1 | +| swf-zdg.f90 | SwfZdgModule | SwfZdgType | UNITCONV | 0 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | ICIMOUT | 0 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | IBUDGETOUT | 0 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | IBUDCSV | 0 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | ISRB | 0 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | IDCY | 0 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | KITER | 0 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | STRG | 1 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | CIM | 1 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | CIMNEW | 1 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | CIMOLD | 1 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | POROSITY | 1 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | ZETAIM | 1 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | VOLFRAC | 1 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | BULK_DENSITY | 1 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | DISTCOEF | 1 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | DECAY | 1 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | DECAYLAST | 1 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | DECAYSLAST | 1 | +| gwt-ist.f90 | GwtIstModule | GwtIstType | DECAY_SORBED | 1 | +| gwt-mst.f90 | GwtMstModule | GwtMstType | ISRB | 0 | +| gwt-mst.f90 | GwtMstModule | GwtMstType | IDCY | 0 | +| gwt-mst.f90 | GwtMstModule | GwtMstType | POROSITY | 1 | +| gwt-mst.f90 | GwtMstModule | GwtMstType | THETAM | 1 | +| gwt-mst.f90 | GwtMstModule | GwtMstType | VOLFRACIM | 1 | +| gwt-mst.f90 | GwtMstModule | GwtMstType | RATESTO | 1 | +| gwt-mst.f90 | GwtMstModule | GwtMstType | RATEDCY | 1 | +| gwt-mst.f90 | GwtMstModule | GwtMstType | DECAY | 1 | +| gwt-mst.f90 | GwtMstModule | GwtMstType | DECAYLAST | 1 | +| gwt-mst.f90 | GwtMstModule | GwtMstType | RATEDCYS | 1 | +| gwt-mst.f90 | GwtMstModule | GwtMstType | DECAYSLAST | 1 | +| gwt-mst.f90 | GwtMstModule | GwtMstType | DECAY_SORBED | 1 | +| gwt-mst.f90 | GwtMstModule | GwtMstType | BULK_DENSITY | 1 | +| gwt-mst.f90 | GwtMstModule | GwtMstType | SP2 | 1 | +| gwt-mst.f90 | GwtMstModule | GwtMstType | DISTCOEF | 1 | +| gwt-mst.f90 | GwtMstModule | GwtMstType | RATESRB | 1 | +| gwt-lkt.f90 | GwtLktModule | GwtLktType | IDXBUDSSM | 1 | +| gwt-lkt.f90 | GwtLktModule | GwtLktType | IDXBUDRAIN | 0 | +| gwt-lkt.f90 | GwtLktModule | GwtLktType | IDXBUDEVAP | 0 | +| gwt-lkt.f90 | GwtLktModule | GwtLktType | IDXBUDROFF | 0 | +| gwt-lkt.f90 | GwtLktModule | GwtLktType | IDXBUDIFLW | 0 | +| gwt-lkt.f90 | GwtLktModule | GwtLktType | IDXBUDWDRL | 0 | +| gwt-lkt.f90 | GwtLktModule | GwtLktType | IDXBUDOUTF | 0 | +| gwt-lkt.f90 | GwtLktModule | GwtLktType | CONCRAIN | 1 | +| gwt-lkt.f90 | GwtLktModule | GwtLktType | CONCEVAP | 1 | +| gwt-lkt.f90 | GwtLktModule | GwtLktType | CONCROFF | 1 | +| gwt-lkt.f90 | GwtLktModule | GwtLktType | CONCIFLW | 1 | +| gwt-sft.f90 | GwtSftModule | GwtSftType | IDXBUDSSM | 1 | +| gwt-sft.f90 | GwtSftModule | GwtSftType | IDXBUDRAIN | 0 | +| gwt-sft.f90 | GwtSftModule | GwtSftType | IDXBUDEVAP | 0 | +| gwt-sft.f90 | GwtSftModule | GwtSftType | IDXBUDROFF | 0 | +| gwt-sft.f90 | GwtSftModule | GwtSftType | IDXBUDIFLW | 0 | +| gwt-sft.f90 | GwtSftModule | GwtSftType | IDXBUDOUTF | 0 | +| gwt-sft.f90 | GwtSftModule | GwtSftType | CONCRAIN | 1 | +| gwt-sft.f90 | GwtSftModule | GwtSftType | CONCEVAP | 1 | +| gwt-sft.f90 | GwtSftModule | GwtSftType | CONCROFF | 1 | +| gwt-sft.f90 | GwtSftModule | GwtSftType | CONCIFLW | 1 | +| gwt-cnc.f90 | GwtCncModule | GwtCncType | RATECNCIN | 1 | +| gwt-cnc.f90 | GwtCncModule | GwtCncType | RATECNCOUT | 1 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | IDIFFC | 0 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | IDISP | 0 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | IALH | 0 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | IALV | 0 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | IATH1 | 0 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | IATH2 | 0 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | IATV | 0 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | IXT3DOFF | 0 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | IXT3DRHS | 0 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | IXT3D | 0 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | ID22 | 0 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | ID33 | 0 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | IANGLE1 | 0 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | IANGLE2 | 0 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | IANGLE3 | 0 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | ALH | 1 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | ALV | 1 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | ATH1 | 1 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | ATH2 | 1 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | ATV | 1 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | DIFFC | 1 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | D11 | 1 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | D22 | 1 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | D33 | 1 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | ANGLE1 | 1 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | ANGLE2 | 1 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | ANGLE3 | 1 | +| gwt-dsp.f90 | GwtDspModule | GwtDspType | DISPCOEF | 1 | +| gwt-mwt.f90 | GwtMwtModule | GwtMwtType | IDXBUDSSM | 1 | +| gwt-mwt.f90 | GwtMwtModule | GwtMwtType | IDXBUDRATE | 0 | +| gwt-mwt.f90 | GwtMwtModule | GwtMwtType | IDXBUDFWRT | 0 | +| gwt-mwt.f90 | GwtMwtModule | GwtMwtType | IDXBUDRTMV | 0 | +| gwt-mwt.f90 | GwtMwtModule | GwtMwtType | IDXBUDFRTM | 0 | +| gwt-mwt.f90 | GwtMwtModule | GwtMwtType | CONCRATE | 1 | +| gwt-uzt.f90 | GwtUztModule | GwtUztType | IDXBUDSSM | 1 | +| gwt-uzt.f90 | GwtUztModule | GwtUztType | IDXBUDINFL | 0 | +| gwt-uzt.f90 | GwtUztModule | GwtUztType | IDXBUDRINF | 0 | +| gwt-uzt.f90 | GwtUztModule | GwtUztType | IDXBUDUZET | 0 | +| gwt-uzt.f90 | GwtUztModule | GwtUztType | IDXBUDRITM | 0 | +| gwt-uzt.f90 | GwtUztModule | GwtUztType | CONCINFL | 1 | +| gwt-uzt.f90 | GwtUztModule | GwtUztType | CONCUZET | 1 | +| gwt.f90 | GwtModule | GwtModelType | INMST | 0 | +| gwt.f90 | GwtModule | GwtModelType | INDSP | 0 | +| GwtSpc.f90 | GwtSpcModule | GwtSpcType | ID | 0 | +| GwtSpc.f90 | GwtSpcModule | GwtSpcType | INUNIT | 0 | +| GwtSpc.f90 | GwtSpcModule | GwtSpcType | IOUT | 0 | +| GwtSpc.f90 | GwtSpcModule | GwtSpcType | MAXBOUND | 0 | +| GwtSpc.f90 | GwtSpcModule | GwtSpcType | IONPER | 0 | +| GwtSpc.f90 | GwtSpcModule | GwtSpcType | LASTONPER | 0 | +| GwtSpc.f90 | GwtSpcModule | GwtSpcType | IPRPAK | 0 | +| GwtSpc.f90 | GwtSpcModule | GwtSpcType | READASARRAYS | 0 | +| GwtSpc.f90 | GwtSpcModule | GwtSpcType | DBLVEC | 1 | +| GwfMvrPeriodData.f90 | GwfMvrPeriodDataModule | GwfMvrPeriodDataType | ID1 | 1 | +| GwfMvrPeriodData.f90 | GwfMvrPeriodDataModule | GwfMvrPeriodDataType | ID2 | 1 | +| GwfMvrPeriodData.f90 | GwfMvrPeriodDataModule | GwfMvrPeriodDataType | IMVRTYPE | 1 | +| GwfMvrPeriodData.f90 | GwfMvrPeriodDataModule | GwfMvrPeriodDataType | VALUE | 1 | | BoundaryPackage.f90 | BndModule | BndType | LISTLABEL | 1 | | BoundaryPackage.f90 | BndModule | BndType | ISADVPAK | 0 | | BoundaryPackage.f90 | BndModule | BndType | IBCNUM | 0 | @@ -913,22 +559,6 @@ | BoundaryPackage.f90 | BndModule | BndType | AUXVAR | 2 | | BoundaryPackage.f90 | BndModule | BndType | BOUNDNAME | 2 | | BoundaryPackage.f90 | BndModule | BndType | BOUNDNAME_CST | 2 | -| Connections.f90 | ConnectionsModule | ConnectionsType | NODES | 0 | -| Connections.f90 | ConnectionsModule | ConnectionsType | NJA | 0 | -| Connections.f90 | ConnectionsModule | ConnectionsType | NJAS | 0 | -| Connections.f90 | ConnectionsModule | ConnectionsType | IANGLEX | 0 | -| Connections.f90 | ConnectionsModule | ConnectionsType | IA | 1 | -| Connections.f90 | ConnectionsModule | ConnectionsType | JA | 1 | -| Connections.f90 | ConnectionsModule | ConnectionsType | ISYM | 1 | -| Connections.f90 | ConnectionsModule | ConnectionsType | JAS | 1 | -| Connections.f90 | ConnectionsModule | ConnectionsType | HWVA | 1 | -| Connections.f90 | ConnectionsModule | ConnectionsType | ANGLEX | 1 | -| Connections.f90 | ConnectionsModule | ConnectionsType | IHC | 1 | -| Connections.f90 | ConnectionsModule | ConnectionsType | CL1 | 1 | -| Connections.f90 | ConnectionsModule | ConnectionsType | CL2 | 1 | -| Connections.f90 | ConnectionsModule | ConnectionsType | IAUSR | 1 | -| Connections.f90 | ConnectionsModule | ConnectionsType | JAUSR | 1 | -| Connections.f90 | ConnectionsModule | ConnectionsType | MASK | 1 | | DiscretizationBase.f90 | BaseDisModule | DisBaseType | INUNIT | 0 | | DiscretizationBase.f90 | BaseDisModule | DisBaseType | IOUT | 0 | | DiscretizationBase.f90 | BaseDisModule | DisBaseType | NODES | 0 | @@ -967,27 +597,6 @@ | FlowModelInterface.f90 | FlowModelInterfaceModule | FlowModelInterfaceType | GWFSTRGSS | 1 | | FlowModelInterface.f90 | FlowModelInterfaceModule | FlowModelInterfaceType | GWFSTRGSY | 1 | | FlowModelInterface.f90 | FlowModelInterfaceModule | FlowModelInterfaceType | IGWFMVRTERM | 1 | -| GwfMvrPeriodData.f90 | GwfMvrPeriodDataModule | GwfMvrPeriodDataType | ID1 | 1 | -| GwfMvrPeriodData.f90 | GwfMvrPeriodDataModule | GwfMvrPeriodDataType | ID2 | 1 | -| GwfMvrPeriodData.f90 | GwfMvrPeriodDataModule | GwfMvrPeriodDataType | IMVRTYPE | 1 | -| GwfMvrPeriodData.f90 | GwfMvrPeriodDataModule | GwfMvrPeriodDataType | VALUE | 1 | -| GwtSpc.f90 | GwtSpcModule | GwtSpcType | ID | 0 | -| GwtSpc.f90 | GwtSpcModule | GwtSpcType | INUNIT | 0 | -| GwtSpc.f90 | GwtSpcModule | GwtSpcType | IOUT | 0 | -| GwtSpc.f90 | GwtSpcModule | GwtSpcType | MAXBOUND | 0 | -| GwtSpc.f90 | GwtSpcModule | GwtSpcType | IONPER | 0 | -| GwtSpc.f90 | GwtSpcModule | GwtSpcType | LASTONPER | 0 | -| GwtSpc.f90 | GwtSpcModule | GwtSpcType | IPRPAK | 0 | -| GwtSpc.f90 | GwtSpcModule | GwtSpcType | READASARRAYS | 0 | -| GwtSpc.f90 | GwtSpcModule | GwtSpcType | DBLVEC | 1 | -| PackageMover.f90 | PackageMoverModule | PackageMoverType | NPROVIDERS | 0 | -| PackageMover.f90 | PackageMoverModule | PackageMoverType | NRECEIVERS | 0 | -| PackageMover.f90 | PackageMoverModule | PackageMoverType | IPRMAP | 1 | -| PackageMover.f90 | PackageMoverModule | PackageMoverType | QTFORMVR | 1 | -| PackageMover.f90 | PackageMoverModule | PackageMoverType | QFORMVR | 1 | -| PackageMover.f90 | PackageMoverModule | PackageMoverType | QTOMVR | 1 | -| PackageMover.f90 | PackageMoverModule | PackageMoverType | QFROMMVR | 1 | -| PackageMover.f90 | PackageMoverModule | PackageMoverType | QFROMMVR0 | 1 | | UzfCellGroup.f90 | UzfCellGroupModule | UzfCellGroupType | UZDPST | 2 | | UzfCellGroup.f90 | UzfCellGroupModule | UzfCellGroupType | UZTHST | 2 | | UzfCellGroup.f90 | UzfCellGroupModule | UzfCellGroupType | UZFLST | 2 | @@ -1048,276 +657,770 @@ | Xt3dInterface.f90 | Xt3dModule | Xt3dType | AMATPC | 1 | | Xt3dInterface.f90 | Xt3dModule | Xt3dType | AMATPCX | 1 | | Xt3dInterface.f90 | Xt3dModule | Xt3dType | RMATCK | 2 | -| tsp1.f90 | TransportModelModule | TransportModelType | INIC | 0 | -| tsp1.f90 | TransportModelModule | TransportModelType | INFMI | 0 | -| tsp1.f90 | TransportModelModule | TransportModelType | INMVT | 0 | -| tsp1.f90 | TransportModelModule | TransportModelType | INADV | 0 | -| tsp1.f90 | TransportModelModule | TransportModelType | INSSM | 0 | -| tsp1.f90 | TransportModelModule | TransportModelType | INOC | 0 | -| tsp1.f90 | TransportModelModule | TransportModelType | INOBS | 0 | -| tsp1.f90 | TransportModelModule | TransportModelType | EQNSCLFAC | 0 | -| tsp1adv1.f90 | TspAdvModule | TspAdvType | IADVWT | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IAUXFPCONC | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IMATROWS | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IPRCONC | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | ICONCOUT | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IBUDGETOUT | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IBUDCSV | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IGWFAPTPAK | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | NCV | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IDXBUDFJF | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IDXBUDGWF | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IDXBUDSTO | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IDXBUDTMVR | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IDXBUDFMVR | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IDXBUDAUX | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | NCONCBUDSSM | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IDXPREPAK | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IDXLASTPAK | 0 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IDXLOCNODE | 1 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IDXPAKDIAG | 1 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IDXGLO | 1 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IDXOFFDGLO | 1 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IDXSYMDGLO | 1 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IDXSYMOFFDGLO | 1 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IDXFJFDGLO | 1 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IDXFJFOFFDGLO | 1 | -| tsp1apt1.f90 | TspAptModule | TspAptType | DBUFF | 1 | -| tsp1apt1.f90 | TspAptModule | TspAptType | CONCFEAT | 1 | -| tsp1apt1.f90 | TspAptModule | TspAptType | QSTO | 1 | -| tsp1apt1.f90 | TspAptModule | TspAptType | CCTERM | 1 | -| tsp1apt1.f90 | TspAptModule | TspAptType | CONCBUDSSM | 2 | -| tsp1apt1.f90 | TspAptModule | TspAptType | QMFROMMVR | 1 | -| tsp1apt1.f90 | TspAptModule | TspAptType | STRT | 1 | -| tsp1apt1.f90 | TspAptModule | TspAptType | LAUXVAR | 2 | -| tsp1apt1.f90 | TspAptModule | TspAptType | IBOUND | 1 | -| tsp1apt1.f90 | TspAptModule | TspAptType | XNEWPAK | 1 | -| tsp1apt1.f90 | TspAptModule | TspAptType | XOLDPAK | 1 | -| tsp1fmi1.f90 | TspFmiModule | TspFmiType | IFLOWERR | 0 | -| tsp1fmi1.f90 | TspFmiModule | TspFmiType | FLOWCORRECT | 1 | -| tsp1fmi1.f90 | TspFmiModule | TspFmiType | IATP | 1 | -| tsp1fmi1.f90 | TspFmiModule | TspFmiType | IGWFMVRTERM | 1 | -| tsp1mvt1.f90 | TspMvtModule | TspMvtType | MAXPACKAGES | 0 | -| tsp1mvt1.f90 | TspMvtModule | TspMvtType | IBUDGETOUT | 0 | -| tsp1mvt1.f90 | TspMvtModule | TspMvtType | IBUDCSV | 0 | -| tsp1ssm1.f90 | TspSsmModule | TspSsmType | NBOUND | 0 | -| tsp1ssm1.f90 | TspSsmModule | TspSsmType | IAUXPAK | 1 | -| tsp1ssm1.f90 | TspSsmModule | TspSsmType | ISRCTYPE | 1 | -| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | CONVNMOD | 0 | -| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | NITERMAX | 0 | -| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | ITINNER | 1 | -| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | LOCDV | 1 | -| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | DVMAX | 1 | -| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | LOCDR | 1 | -| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | DRMAX | 1 | -| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | CONVDVMAX | 2 | -| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | CONVLOCDV | 2 | -| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | CONVDRMAX | 2 | -| ConvergenceSummary.f90 | ConvergenceSummaryModule | ConvergenceSummaryType | CONVLOCDR | 2 | -| ExplicitSolution.f90 | ExplicitSolutionModule | ExplicitSolutionType | ID | 0 | -| ExplicitSolution.f90 | ExplicitSolutionModule | ExplicitSolutionType | IU | 0 | -| ExplicitSolution.f90 | ExplicitSolutionModule | ExplicitSolutionType | TTSOLN | 0 | -| ExplicitSolution.f90 | ExplicitSolutionModule | ExplicitSolutionType | ICNVG | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | ID | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | IU | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | TTFORM | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | TTSOLN | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | ISYMMETRIC | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | NEQ | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | MATRIX_OFFSET | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | DVCLOSE | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | BIGCHOLD | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | BIGCH | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | RELAXOLD | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | RES_PREV | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | RES_NEW | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | ICNVG | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | ITERTOT_TIMESTEP | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | IOUTTOT_TIMESTEP | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | INNERTOT_SIM | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | MXITER | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | LINSOLVER | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | NONMETH | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | IPRIMS | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | THETA | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | AKAPPA | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | GAMMA | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | AMOMENTUM | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | BREDUC | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | BTOL | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | RES_LIM | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | NUMTRACK | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | IBFLAG | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | ICSVOUTEROUT | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | ICSVINNEROUT | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | NITERMAX | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | CONVNMOD | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | IALLOWPTC | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | IPTCOPT | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | IPTCOUT | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | L2NORM0 | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | PTCDEL | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | PTCDEL0 | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | PTCEXP | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | ATSFRAC | 0 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | IACTIVE | 1 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | XTEMP | 1 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | DXOLD | 1 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | HNCG | 1 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | LRCH | 2 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | WSAVE | 1 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | HCHOLD | 1 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | DEOLD | 1 | -| NumericalSolution.f90 | NumericalSolutionModule | NumericalSolutionType | CONVMODSTART | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | NJA | 0 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | DSCALE | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | DSCALE2 | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | IAPC | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | JAPC | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | APC | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | IW | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | W | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | JLU | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | JW | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | WLU | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | LORDER | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | IORDER | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | IARO | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | JARO | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | ARO | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | ID | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | D | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | P | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | Q | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | Z | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | T | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | V | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | DHAT | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | PHAT | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | QHAT | 1 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | IOUT | 0 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | IPC | 0 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | IACPC | 0 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | NITERC | 0 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | NIABCGS | 0 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | NIAPC | 0 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | NJAPC | 0 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | EPFACT | 0 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | L2NORM0 | 0 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | NJLU | 0 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | NJW | 0 | -| ims8linear.f90 | IMSLinearModule | ImsLinearDataType | NWLU | 0 | -| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | DVCLOSE | 0 | -| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | RCLOSE | 0 | -| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | ICNVGOPT | 0 | -| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | ITER1 | 0 | -| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | ILINMETH | 0 | -| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | ISCL | 0 | -| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | IORD | 0 | -| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | NORTH | 0 | -| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | RELAX | 0 | -| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | LEVEL | 0 | -| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | DROPTOL | 0 | -| ImsLinearSettings.f90 | ImsLinearSettingsModule | ImsLinearSettingsType | IDFPARAM | 0 | -| ats.f90 | AdaptiveTimeStepModule | None | NPER | 0 | -| ats.f90 | AdaptiveTimeStepModule | None | MAXATS | 0 | -| ats.f90 | AdaptiveTimeStepModule | None | DTSTABLE | 0 | -| ats.f90 | AdaptiveTimeStepModule | None | KPERATS | 1 | -| ats.f90 | AdaptiveTimeStepModule | None | IPERATS | 1 | -| ats.f90 | AdaptiveTimeStepModule | None | DT0 | 1 | -| ats.f90 | AdaptiveTimeStepModule | None | DTMIN | 1 | -| ats.f90 | AdaptiveTimeStepModule | None | DTMAX | 1 | -| ats.f90 | AdaptiveTimeStepModule | None | DTADJ | 1 | -| ats.f90 | AdaptiveTimeStepModule | None | DTFAILADJ | 1 | -| tdis.f90 | TdisModule | None | NPER | 0 | -| tdis.f90 | TdisModule | None | ITMUNI | 0 | -| tdis.f90 | TdisModule | None | KPER | 0 | -| tdis.f90 | TdisModule | None | KSTP | 0 | -| tdis.f90 | TdisModule | None | INATS | 0 | -| tdis.f90 | TdisModule | None | READNEWDATA | 0 | -| tdis.f90 | TdisModule | None | ENDOFPERIOD | 0 | -| tdis.f90 | TdisModule | None | ENDOFSIMULATION | 0 | -| tdis.f90 | TdisModule | None | DELT | 0 | -| tdis.f90 | TdisModule | None | PERTIM | 0 | -| tdis.f90 | TdisModule | None | TOPERTIM | 0 | -| tdis.f90 | TdisModule | None | TOTIM | 0 | -| tdis.f90 | TdisModule | None | TOTIMC | 0 | -| tdis.f90 | TdisModule | None | DELTSAV | 0 | -| tdis.f90 | TdisModule | None | TOTIMSAV | 0 | -| tdis.f90 | TdisModule | None | PERTIMSAV | 0 | -| tdis.f90 | TdisModule | None | TOTALSIMTIME | 0 | -| tdis.f90 | TdisModule | None | PERLEN | 1 | -| tdis.f90 | TdisModule | None | NSTP | 1 | -| tdis.f90 | TdisModule | None | TSMULT | 1 | -| PackageBudget.f90 | PackageBudgetModule | PackageBudgetType | NAME | 1 | -| PackageBudget.f90 | PackageBudgetModule | PackageBudgetType | BUDTXT | 1 | -| PackageBudget.f90 | PackageBudgetModule | PackageBudgetType | NAUX | 0 | -| PackageBudget.f90 | PackageBudgetModule | PackageBudgetType | AUXNAME | 2 | -| PackageBudget.f90 | PackageBudgetModule | PackageBudgetType | NBOUND | 0 | -| PackageBudget.f90 | PackageBudgetModule | PackageBudgetType | NODELIST | 1 | -| PackageBudget.f90 | PackageBudgetModule | PackageBudgetType | FLOW | 1 | -| PackageBudget.f90 | PackageBudgetModule | PackageBudgetType | AUXVAR | 2 | -| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | NBOUND | 0 | -| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | NCPL | 0 | -| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | AUXILIARY | 2 | -| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | CELLID | 2 | -| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | BOUNDNAME | 2 | -| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | AUXVAR | 2 | -| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | varname | 0 | -| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | idt%mf6varname | 1 | -| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | idt%mf6varname | 1 | -| BoundInputContext.f90 | BoundInputContextModule | BoundInputContextType | idt%mf6varname | 2 | -| IdmLoad.f90 | IdmLoadModule | None | EXGMEMPATHS | 2 | -| IdmLoad.f90 | IdmLoadModule | None | NCELLDIM | 0 | -| IdmLoad.f90 | IdmLoadModule | None | EXGID | 0 | -| IdmLoad.f90 | IdmLoadModule | None | NUMMODELS | 0 | -| IdmLoad.f90 | IdmLoadModule | None | NUMEXCHANGES | 0 | -| IdmLoad.f90 | IdmLoadModule | None | idt%mf6varname | 0 | -| IdmLoad.f90 | IdmLoadModule | None | idt%mf6varname | 2 | -| IdmLoad.f90 | IdmLoadModule | None | idt%mf6varname | 1 | -| ModelPackageInputs.f90 | ModelPackageInputsModule | LoadablePackageType | INPUT_FNAME | 1 | -| ModelPackageInputs.f90 | ModelPackageInputsModule | ModelPackageInputsType | PKGTYPES | 2 | -| ModelPackageInputs.f90 | ModelPackageInputsModule | ModelPackageInputsType | PKGNAMES | 2 | -| ModelPackageInputs.f90 | ModelPackageInputsModule | ModelPackageInputsType | MEMPATHS | 2 | -| ModelPackageInputs.f90 | ModelPackageInputsModule | ModelPackageInputsType | INUNITS | 1 | -| SourceCommon.f90 | SourceCommonModule | None | MODEL_SHAPE | 1 | -| SourceCommon.f90 | SourceCommonModule | None | NCELLDIM | 0 | -| SourceCommon.f90 | SourceCommonModule | None | NAUX | 0 | -| IdmMf6File.f90 | IdmMf6FileModule | Mf6FileDynamicPkgLoadType | IPER | 0 | -| IdmMf6File.f90 | IdmMf6FileModule | Mf6FileDynamicPkgLoadType | IONPER | 0 | -| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 0 | -| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 1 | -| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 2 | -| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 2 | -| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 1 | -| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 2 | -| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 3 | -| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 0 | -| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 1 | -| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 2 | -| LoadMf6File.f90 | LoadMf6FileModule | None | idt%mf6varname | 3 | -| StressGridInput.f90 | StressGridInputModule | StressGridInputType | AUXTASNAME | 2 | -| StressGridInput.f90 | StressGridInputModule | StressGridInputType | PARAMTASNAME | 2 | -| StructArray.f90 | StructArrayModule | StructArrayType | sv%idt%mf6varname | 1 | -| StructArray.f90 | StructArrayModule | StructArrayType | sv%idt%mf6varname | 1 | -| StructArray.f90 | StructArrayModule | StructArrayType | sv%idt%mf6varname | 2 | -| StructArray.f90 | StructArrayModule | StructArrayType | sv%idt%mf6varname | 2 | -| StructArray.f90 | StructArrayModule | StructArrayType | sv%idt%mf6varname | 2 | -| StructArray.f90 | StructArrayModule | StructArrayType | NSEG_1 | 0 | -| StructArray.f90 | StructArrayModule | StructArrayType | varname | 1 | -| StructArray.f90 | StructArrayModule | StructArrayType | varname | 1 | -| StructArray.f90 | StructArrayModule | StructArrayType | varname | 2 | -| StructArray.f90 | StructArrayModule | StructArrayType | varname | 2 | -| StructArray.f90 | StructArrayModule | StructArrayType | varname | 1 | -| SparseMatrix.f90 | SparseMatrixModule | SparseMatrixType | NROW | 0 | -| SparseMatrix.f90 | SparseMatrixModule | SparseMatrixType | NCOL | 0 | -| SparseMatrix.f90 | SparseMatrixModule | SparseMatrixType | NJA | 0 | -| SparseMatrix.f90 | SparseMatrixModule | SparseMatrixType | IA | 1 | -| SparseMatrix.f90 | SparseMatrixModule | SparseMatrixType | JA | 1 | -| SparseMatrix.f90 | SparseMatrixModule | SparseMatrixType | AMAT | 1 | -| OutputControl.f90 | OutputControlModule | OutputControlType | INUNIT | 0 | -| OutputControl.f90 | OutputControlModule | OutputControlType | IOUT | 0 | -| OutputControl.f90 | OutputControlModule | OutputControlType | IBUDCSV | 0 | -| OutputControl.f90 | OutputControlModule | OutputControlType | IPEROC | 0 | -| OutputControl.f90 | OutputControlModule | OutputControlType | IOCREP | 0 | -| SeqVector.f90 | SeqVectorModule | SeqVectorType | name | 1 | +| Connections.f90 | ConnectionsModule | ConnectionsType | NODES | 0 | +| Connections.f90 | ConnectionsModule | ConnectionsType | NJA | 0 | +| Connections.f90 | ConnectionsModule | ConnectionsType | NJAS | 0 | +| Connections.f90 | ConnectionsModule | ConnectionsType | IANGLEX | 0 | +| Connections.f90 | ConnectionsModule | ConnectionsType | IA | 1 | +| Connections.f90 | ConnectionsModule | ConnectionsType | JA | 1 | +| Connections.f90 | ConnectionsModule | ConnectionsType | ISYM | 1 | +| Connections.f90 | ConnectionsModule | ConnectionsType | JAS | 1 | +| Connections.f90 | ConnectionsModule | ConnectionsType | HWVA | 1 | +| Connections.f90 | ConnectionsModule | ConnectionsType | ANGLEX | 1 | +| Connections.f90 | ConnectionsModule | ConnectionsType | IHC | 1 | +| Connections.f90 | ConnectionsModule | ConnectionsType | CL1 | 1 | +| Connections.f90 | ConnectionsModule | ConnectionsType | CL2 | 1 | +| Connections.f90 | ConnectionsModule | ConnectionsType | IAUSR | 1 | +| Connections.f90 | ConnectionsModule | ConnectionsType | JAUSR | 1 | +| Connections.f90 | ConnectionsModule | ConnectionsType | MASK | 1 | +| PackageMover.f90 | PackageMoverModule | PackageMoverType | NPROVIDERS | 0 | +| PackageMover.f90 | PackageMoverModule | PackageMoverType | NRECEIVERS | 0 | +| PackageMover.f90 | PackageMoverModule | PackageMoverType | IPRMAP | 1 | +| PackageMover.f90 | PackageMoverModule | PackageMoverType | QTFORMVR | 1 | +| PackageMover.f90 | PackageMoverModule | PackageMoverType | QFORMVR | 1 | +| PackageMover.f90 | PackageMoverModule | PackageMoverType | QTOMVR | 1 | +| PackageMover.f90 | PackageMoverModule | PackageMoverType | QFROMMVR | 1 | +| PackageMover.f90 | PackageMoverModule | PackageMoverType | QFROMMVR0 | 1 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | TOP1D | 1 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | BOT1D | 1 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | AREA1D | 1 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | IDOMAIN | 1 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | VERTICES | 2 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | IAINP | 1 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | JAINP | 1 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | IHCINP | 1 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | CL12INP | 1 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | HWVAINP | 1 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | ANGLDEGXINP | 1 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | CELLXY | 2 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | IAVERT | 1 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | JAVERT | 1 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | NJAUSR | 0 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | NVERT | 0 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | VOFFSETTOL | 0 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | IANGLEDEGX | 0 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | NODEUSER | 1 | +| gwf-disu.f90 | GwfDisuModule | GwfDisuType | NODEREDUCED | 1 | +| gwf-ic.f90 | GwfIcModule | GwfIcType | STRT | 1 | +| gwf-disv.f90 | GwfDisvModule | GwfDisvType | IDOMAIN | 2 | +| gwf-disv.f90 | GwfDisvModule | GwfDisvType | TOP1D | 1 | +| gwf-disv.f90 | GwfDisvModule | GwfDisvType | BOT2D | 2 | +| gwf-disv.f90 | GwfDisvModule | GwfDisvType | VERTICES | 2 | +| gwf-disv.f90 | GwfDisvModule | GwfDisvType | CELLXY | 2 | +| gwf-disv.f90 | GwfDisvModule | GwfDisvType | IAVERT | 1 | +| gwf-disv.f90 | GwfDisvModule | GwfDisvType | JAVERT | 1 | +| gwf-disv.f90 | GwfDisvModule | GwfDisvType | NLAY | 0 | +| gwf-disv.f90 | GwfDisvModule | GwfDisvType | NCPL | 0 | +| gwf-disv.f90 | GwfDisvModule | GwfDisvType | NVERT | 0 | +| gwf-disv.f90 | GwfDisvModule | GwfDisvType | NODEUSER | 1 | +| gwf-disv.f90 | GwfDisvModule | GwfDisvType | NODEREDUCED | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | INAME | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IXT3D | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IXT3DRHS | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | SATOMEGA | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | HNOFLO | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | HDRY | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | ICELLAVG | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IAVGKEFF | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IK22 | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IK33 | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IK22OVERK | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IK33OVERK | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IPERCHED | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IVARCV | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IDEWATCV | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | ITHICKSTRT | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IUSGNRHC | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | INWTUPW | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | ICALCSPDIS | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | ISAVSPDIS | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | ISAVSAT | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IREWET | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | WETFCT | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IWETIT | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IHDWET | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | SATMIN | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IANGLE1 | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IANGLE2 | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IANGLE3 | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IWETDRY | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | NEDGES | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | LASTEDGE | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | INTVK | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | INVSC | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | KCHANGEPER | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | KCHANGESTP | 0 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | ITHICKSTARTFLAG | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | ICELLTYPE | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | K11 | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | SAT | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | CONDSAT | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | K22 | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | K33 | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | WETDRY | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | ANGLE1 | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | ANGLE2 | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | ANGLE3 | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IBOTNODE | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | NODEDGE | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | IHCEDGE | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | PROPSEDGE | 2 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | K11INPUT | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | K22INPUT | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | K33INPUT | 1 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | SPDIS | 2 | +| gwf-npf.f90 | GwfNpfModule | GwfNpftype | NODEKCHANGE | 1 | +| gwf-mvr.f90 | GwfMvrModule | GwfMvrType | RESET_MAPPED_ID | 0 | +| gwf-mvr.f90 | GwfMvrModule | GwfMvrType | IBUDGETOUT | 0 | +| gwf-mvr.f90 | GwfMvrModule | GwfMvrType | IBUDCSV | 0 | +| gwf-mvr.f90 | GwfMvrModule | GwfMvrType | MAXMVR | 0 | +| gwf-mvr.f90 | GwfMvrModule | GwfMvrType | MAXPACKAGES | 0 | +| gwf-mvr.f90 | GwfMvrModule | GwfMvrType | MAXCOMB | 0 | +| gwf-mvr.f90 | GwfMvrModule | GwfMvrType | NMVR | 0 | +| gwf-mvr.f90 | GwfMvrModule | GwfMvrType | IEXGMVR | 0 | +| gwf-mvr.f90 | GwfMvrModule | GwfMvrType | IMODELNAMES | 0 | +| gwf-mvr.f90 | GwfMvrModule | GwfMvrType | IENTRIES | 1 | +| gwf-lak.f90 | LakModule | LakType | IPRHED | 0 | +| gwf-lak.f90 | LakModule | LakType | ISTAGEOUT | 0 | +| gwf-lak.f90 | LakModule | LakType | IBUDGETOUT | 0 | +| gwf-lak.f90 | LakModule | LakType | IBUDCSV | 0 | +| gwf-lak.f90 | LakModule | LakType | IPAKCSV | 0 | +| gwf-lak.f90 | LakModule | LakType | NLAKES | 0 | +| gwf-lak.f90 | LakModule | LakType | NOUTLETS | 0 | +| gwf-lak.f90 | LakModule | LakType | NTABLES | 0 | +| gwf-lak.f90 | LakModule | LakType | CONVLENGTH | 0 | +| gwf-lak.f90 | LakModule | LakType | CONVTIME | 0 | +| gwf-lak.f90 | LakModule | LakType | OUTDMAX | 0 | +| gwf-lak.f90 | LakModule | LakType | IGWHCOPT | 0 | +| gwf-lak.f90 | LakModule | LakType | ICONVCHK | 0 | +| gwf-lak.f90 | LakModule | LakType | ICONVRESIDCHK | 0 | +| gwf-lak.f90 | LakModule | LakType | MAXLAKIT | 0 | +| gwf-lak.f90 | LakModule | LakType | SURFDEP | 0 | +| gwf-lak.f90 | LakModule | LakType | DMAXCHG | 0 | +| gwf-lak.f90 | LakModule | LakType | DELH | 0 | +| gwf-lak.f90 | LakModule | LakType | PDMAX | 0 | +| gwf-lak.f90 | LakModule | LakType | CHECK_ATTR | 0 | +| gwf-lak.f90 | LakModule | LakType | BDITEMS | 0 | +| gwf-lak.f90 | LakModule | LakType | CBCAUXITEMS | 0 | +| gwf-lak.f90 | LakModule | LakType | IDENSE | 0 | +| gwf-lak.f90 | LakModule | LakType | DBUFF | 1 | +| gwf-lak.f90 | LakModule | LakType | QAUXCBC | 1 | +| gwf-lak.f90 | LakModule | LakType | QLEAK | 1 | +| gwf-lak.f90 | LakModule | LakType | QSTO | 1 | +| gwf-lak.f90 | LakModule | LakType | DENSETERMS | 2 | +| gwf-lak.f90 | LakModule | LakType | VISCRATIOS | 2 | +| gwf-lak.f90 | LakModule | LakType | NLAKECONN | 1 | +| gwf-lak.f90 | LakModule | LakType | IDXLAKECONN | 1 | +| gwf-lak.f90 | LakModule | LakType | NTABROW | 1 | +| gwf-lak.f90 | LakModule | LakType | STRT | 1 | +| gwf-lak.f90 | LakModule | LakType | LAKETOP | 1 | +| gwf-lak.f90 | LakModule | LakType | LAKEBOT | 1 | +| gwf-lak.f90 | LakModule | LakType | SAREAMAX | 1 | +| gwf-lak.f90 | LakModule | LakType | STAGE | 1 | +| gwf-lak.f90 | LakModule | LakType | RAINFALL | 1 | +| gwf-lak.f90 | LakModule | LakType | EVAPORATION | 1 | +| gwf-lak.f90 | LakModule | LakType | RUNOFF | 1 | +| gwf-lak.f90 | LakModule | LakType | INFLOW | 1 | +| gwf-lak.f90 | LakModule | LakType | WITHDRAWAL | 1 | +| gwf-lak.f90 | LakModule | LakType | LAUXVAR | 2 | +| gwf-lak.f90 | LakModule | LakType | AVAIL | 1 | +| gwf-lak.f90 | LakModule | LakType | LKGWSINK | 1 | +| gwf-lak.f90 | LakModule | LakType | NCNCVR | 1 | +| gwf-lak.f90 | LakModule | LakType | SURFIN | 1 | +| gwf-lak.f90 | LakModule | LakType | SURFOUT | 1 | +| gwf-lak.f90 | LakModule | LakType | SURFOUT1 | 1 | +| gwf-lak.f90 | LakModule | LakType | PRECIP | 1 | +| gwf-lak.f90 | LakModule | LakType | PRECIP1 | 1 | +| gwf-lak.f90 | LakModule | LakType | EVAP | 1 | +| gwf-lak.f90 | LakModule | LakType | EVAP1 | 1 | +| gwf-lak.f90 | LakModule | LakType | EVAPO | 1 | +| gwf-lak.f90 | LakModule | LakType | WITHR | 1 | +| gwf-lak.f90 | LakModule | LakType | WITHR1 | 1 | +| gwf-lak.f90 | LakModule | LakType | FLWIN | 1 | +| gwf-lak.f90 | LakModule | LakType | FLWITER | 1 | +| gwf-lak.f90 | LakModule | LakType | FLWITER1 | 1 | +| gwf-lak.f90 | LakModule | LakType | SEEP | 1 | +| gwf-lak.f90 | LakModule | LakType | SEEP1 | 1 | +| gwf-lak.f90 | LakModule | LakType | SEEP0 | 1 | +| gwf-lak.f90 | LakModule | LakType | STAGEITER | 1 | +| gwf-lak.f90 | LakModule | LakType | CHTERM | 1 | +| gwf-lak.f90 | LakModule | LakType | IBOUND | 1 | +| gwf-lak.f90 | LakModule | LakType | XNEWPAK | 1 | +| gwf-lak.f90 | LakModule | LakType | XOLDPAK | 1 | +| gwf-lak.f90 | LakModule | LakType | ISEEPC | 1 | +| gwf-lak.f90 | LakModule | LakType | IDHC | 1 | +| gwf-lak.f90 | LakModule | LakType | EN1 | 1 | +| gwf-lak.f90 | LakModule | LakType | EN2 | 1 | +| gwf-lak.f90 | LakModule | LakType | R1 | 1 | +| gwf-lak.f90 | LakModule | LakType | R2 | 1 | +| gwf-lak.f90 | LakModule | LakType | DH0 | 1 | +| gwf-lak.f90 | LakModule | LakType | S0 | 1 | +| gwf-lak.f90 | LakModule | LakType | QGWF0 | 1 | +| gwf-lak.f90 | LakModule | LakType | IMAP | 1 | +| gwf-lak.f90 | LakModule | LakType | CELLID | 1 | +| gwf-lak.f90 | LakModule | LakType | NODESONTOP | 1 | +| gwf-lak.f90 | LakModule | LakType | ICTYPE | 1 | +| gwf-lak.f90 | LakModule | LakType | BEDLEAK | 1 | +| gwf-lak.f90 | LakModule | LakType | BELEV | 1 | +| gwf-lak.f90 | LakModule | LakType | TELEV | 1 | +| gwf-lak.f90 | LakModule | LakType | CONNLENGTH | 1 | +| gwf-lak.f90 | LakModule | LakType | CONNWIDTH | 1 | +| gwf-lak.f90 | LakModule | LakType | SAREA | 1 | +| gwf-lak.f90 | LakModule | LakType | WAREA | 1 | +| gwf-lak.f90 | LakModule | LakType | SATCOND | 1 | +| gwf-lak.f90 | LakModule | LakType | SIMCOND | 1 | +| gwf-lak.f90 | LakModule | LakType | SIMLAKGW | 1 | +| gwf-lak.f90 | LakModule | LakType | IALAKTAB | 1 | +| gwf-lak.f90 | LakModule | LakType | TABSTAGE | 1 | +| gwf-lak.f90 | LakModule | LakType | TABVOLUME | 1 | +| gwf-lak.f90 | LakModule | LakType | TABSAREA | 1 | +| gwf-lak.f90 | LakModule | LakType | TABWAREA | 1 | +| gwf-lak.f90 | LakModule | LakType | LAKEIN | 1 | +| gwf-lak.f90 | LakModule | LakType | LAKEOUT | 1 | +| gwf-lak.f90 | LakModule | LakType | IOUTTYPE | 1 | +| gwf-lak.f90 | LakModule | LakType | OUTRATE | 1 | +| gwf-lak.f90 | LakModule | LakType | OUTINVERT | 1 | +| gwf-lak.f90 | LakModule | LakType | OUTWIDTH | 1 | +| gwf-lak.f90 | LakModule | LakType | OUTROUGH | 1 | +| gwf-lak.f90 | LakModule | LakType | OUTSLOPE | 1 | +| gwf-lak.f90 | LakModule | LakType | SIMOUTRATE | 1 | +| gwf-sto.f90 | GwfStoModule | GwfStoType | ISTOR_COEF | 0 | +| gwf-sto.f90 | GwfStoModule | GwfStoType | ICONF_SS | 0 | +| gwf-sto.f90 | GwfStoModule | GwfStoType | IORIG_SS | 0 | +| gwf-sto.f90 | GwfStoModule | GwfStoType | IUSESY | 0 | +| gwf-sto.f90 | GwfStoModule | GwfStoType | SATOMEGA | 0 | +| gwf-sto.f90 | GwfStoModule | GwfStoType | INTEGRATECHANGES | 0 | +| gwf-sto.f90 | GwfStoModule | GwfStoType | INTVS | 0 | +| gwf-sto.f90 | GwfStoModule | GwfStoType | ICONVERT | 1 | +| gwf-sto.f90 | GwfStoModule | GwfStoType | SS | 1 | +| gwf-sto.f90 | GwfStoModule | GwfStoType | SY | 1 | +| gwf-sto.f90 | GwfStoModule | GwfStoType | STRGSS | 1 | +| gwf-sto.f90 | GwfStoModule | GwfStoType | STRGSY | 1 | +| gwf-sto.f90 | GwfStoModule | GwfStoType | OLDSS | 1 | +| gwf-sto.f90 | GwfStoModule | GwfStoType | OLDSY | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | IGWFNODE | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | APPLIEDINF | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | REJINF | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | REJINF0 | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | REJINFTOMVR | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | INFILTRATION | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | GWET | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | UZET | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | GWD | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | GWD0 | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | GWDTOMVR | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | RCH | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | RCH0 | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | QSTO | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | DERIV | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | IA | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | JA | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | SINF | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | PET | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | EXDP | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | EXTWC | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | HA | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | HROOT | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | ROOTACT | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | UAUXVAR | 2 | +| gwf-uzf.f90 | UzfModule | UzfType | WCNEW | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | WCOLD | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | QAUXCBC | 1 | +| gwf-uzf.f90 | UzfModule | UzfType | IPRWCONT | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | IWCONTOUT | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | IBUDGETOUT | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | IBUDCSV | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | IPAKCSV | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | NTRAIL | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | NSETS | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | NODES | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | ISTOCB | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | NWAV | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | TOTFLUXTOT | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | BDITEMS | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | NBDTXT | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | ISSFLAG | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | ISSFLAGOLD | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | READFLAG | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | ISEEPFLAG | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | IMAXCELLCNT | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | IETFLAG | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | IGWETFLAG | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | IUZF2UZF | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | CBCAUXITEMS | 0 | +| gwf-uzf.f90 | UzfModule | UzfType | ICONVCHK | 0 | +| gwf-vsc.f90 | GwfVscModule | GwfVscType | THERMIVISC | 0 | +| gwf-vsc.f90 | GwfVscModule | GwfVscType | IDXTMPR | 0 | +| gwf-vsc.f90 | GwfVscModule | GwfVscType | IOUTVISC | 0 | +| gwf-vsc.f90 | GwfVscModule | GwfVscType | IREADELEV | 0 | +| gwf-vsc.f90 | GwfVscModule | GwfVscType | ICONCSET | 0 | +| gwf-vsc.f90 | GwfVscModule | GwfVscType | VISCREF | 0 | +| gwf-vsc.f90 | GwfVscModule | GwfVscType | A2 | 0 | +| gwf-vsc.f90 | GwfVscModule | GwfVscType | A3 | 0 | +| gwf-vsc.f90 | GwfVscModule | GwfVscType | A4 | 0 | +| gwf-vsc.f90 | GwfVscModule | GwfVscType | NVISCSPECIES | 0 | +| gwf-vsc.f90 | GwfVscModule | GwfVscType | VISC | 1 | +| gwf-vsc.f90 | GwfVscModule | GwfVscType | IVISC | 1 | +| gwf-vsc.f90 | GwfVscModule | GwfVscType | DRHODC | 1 | +| gwf-vsc.f90 | GwfVscModule | GwfVscType | CRHOREF | 1 | +| gwf-vsc.f90 | GwfVscModule | GwfVscType | CTEMP | 1 | +| gwf-chd.f90 | ChdModule | ChdType | RATECHDIN | 1 | +| gwf-chd.f90 | ChdModule | ChdType | RATECHDOUT | 1 | +| gwf-buy.f90 | GwfBuyModule | GwfBuyType | IOUTDENSE | 0 | +| gwf-buy.f90 | GwfBuyModule | GwfBuyType | IFORM | 0 | +| gwf-buy.f90 | GwfBuyModule | GwfBuyType | IREADELEV | 0 | +| gwf-buy.f90 | GwfBuyModule | GwfBuyType | IREADCONCBUY | 0 | +| gwf-buy.f90 | GwfBuyModule | GwfBuyType | ICONCSET | 0 | +| gwf-buy.f90 | GwfBuyModule | GwfBuyType | DENSEREF | 0 | +| gwf-buy.f90 | GwfBuyModule | GwfBuyType | NRHOSPECIES | 0 | +| gwf-buy.f90 | GwfBuyModule | GwfBuyType | DENSE | 1 | +| gwf-buy.f90 | GwfBuyModule | GwfBuyType | CONCBUY | 1 | +| gwf-buy.f90 | GwfBuyModule | GwfBuyType | ELEV | 1 | +| gwf-buy.f90 | GwfBuyModule | GwfBuyType | DRHODC | 1 | +| gwf-buy.f90 | GwfBuyModule | GwfBuyType | CRHOREF | 1 | +| gwf-buy.f90 | GwfBuyModule | GwfBuyType | CTEMP | 1 | +| gwf-hfb.f90 | GwfHfbModule | GwfHfbType | MAXHFB | 0 | +| gwf-hfb.f90 | GwfHfbModule | GwfHfbType | NHFB | 0 | +| gwf-hfb.f90 | GwfHfbModule | GwfHfbType | IVSC | 0 | +| gwf-hfb.f90 | GwfHfbModule | GwfHfbType | NODEN | 1 | +| gwf-hfb.f90 | GwfHfbModule | GwfHfbType | NODEM | 1 | +| gwf-hfb.f90 | GwfHfbModule | GwfHfbType | HYDCHR | 1 | +| gwf-hfb.f90 | GwfHfbModule | GwfHfbType | IDXLOC | 1 | +| gwf-hfb.f90 | GwfHfbModule | GwfHfbType | CSATSAV | 1 | +| gwf-hfb.f90 | GwfHfbModule | GwfHfbType | CONDSAV | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | LISTLABEL | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | STONAME | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | ISTOUNIT | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | INOBSPKG | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | NINTERBEDS | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | MAXSIG0 | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | NBOUND | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | ISCLOC | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | IAUXMULTCOL | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | NDELAYCELLS | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | NDELAYBEDS | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | INITIALIZED | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | IESLAG | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | IPCH | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | LHEAD_BASED | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | IUPDATESTRESS | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | ISPECIFIED_PCS | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | ISPECIFIED_DBH | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | INAMEDBOUND | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | ICONVCHK | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | NAUX | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | ISTORAGEC | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | ISTRAINIB | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | ISTRAINSK | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | IOUTCOMP | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | IOUTCOMPI | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | IOUTCOMPE | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | IOUTCOMPIB | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | IOUTCOMPS | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | IOUTZDISP | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | IPAKCSV | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | IUPDATEMATPROP | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | EPSILON | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CC_CRIT | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | GAMMAW | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | BETA | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | BRG | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | SATOMEGA | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | ICELLF | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | GWFISS0 | 0 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | AUXNAME | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | BUFF | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | BUFFUSR | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | SGM | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | SGS | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CG_SKE_CR | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CG_ES | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CG_ES0 | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CG_PCS | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CG_COMP | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CG_TCOMP | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CG_STOR | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CG_SKE | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CG_SK | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CG_THICKINI | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CG_THETAINI | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CG_THICK | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CG_THICK0 | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CG_THETA | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CG_THETA0 | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CELL_WCSTOR | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CELL_THICK | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | AUXVAR | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | UNODELIST | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | NODELIST | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CG_GS | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | PCS | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | RNB | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | KV | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | H0 | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | CI | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | RCI | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | IDELAY | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | IELASTIC | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | ICONVERT | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | COMP | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | TCOMP | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | TCOMPI | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | TCOMPE | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | STORAGEE | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | STORAGEI | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | SKE | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | SK | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | THICKINI | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | THETAINI | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | THICK | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | THICK0 | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | THETA | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | THETA0 | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | BOUNDNAME | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | NODELISTSIG0 | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | SIG0 | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | IDB_NCONV_COUNT | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | IDBCONVERT | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBDHMAX | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBZ | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBRELZ | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBH | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBH0 | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBGEO | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBES | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBES0 | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBPCS | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBFLOWTOP | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBFLOWBOT | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBDZINI | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBTHETAINI | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBCOMP | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBTCOMP | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBDZ | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBDZ0 | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBTHETA | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBTHETA0 | 2 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBAL | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBAD | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBAU | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBRHS | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBDH | 1 | +| gwf-csub.f90 | GwfCsubModule | GwfCsubType | DBAW | 1 | +| gwf-evt.f90 | EvtModule | EvtType | NSEG | 0 | +| gwf-maw.f90 | MawModule | MawType | CORRECT_FLOW | 0 | +| gwf-maw.f90 | MawModule | MawType | IPRHED | 0 | +| gwf-maw.f90 | MawModule | MawType | IHEADOUT | 0 | +| gwf-maw.f90 | MawModule | MawType | IBUDGETOUT | 0 | +| gwf-maw.f90 | MawModule | MawType | IBUDCSV | 0 | +| gwf-maw.f90 | MawModule | MawType | IFLOWINGWELLS | 0 | +| gwf-maw.f90 | MawModule | MawType | IMAWISS | 0 | +| gwf-maw.f90 | MawModule | MawType | IMAWISSOPT | 0 | +| gwf-maw.f90 | MawModule | MawType | NMAWWELLS | 0 | +| gwf-maw.f90 | MawModule | MawType | CHECK_ATTR | 0 | +| gwf-maw.f90 | MawModule | MawType | ISHUTOFFCNT | 0 | +| gwf-maw.f90 | MawModule | MawType | IEFFRADOPT | 0 | +| gwf-maw.f90 | MawModule | MawType | IOUTREDFLOWCSV | 0 | +| gwf-maw.f90 | MawModule | MawType | SATOMEGA | 0 | +| gwf-maw.f90 | MawModule | MawType | BDITEMS | 0 | +| gwf-maw.f90 | MawModule | MawType | THETA | 0 | +| gwf-maw.f90 | MawModule | MawType | KAPPA | 0 | +| gwf-maw.f90 | MawModule | MawType | CBCAUXITEMS | 0 | +| gwf-maw.f90 | MawModule | MawType | IDENSE | 0 | +| gwf-maw.f90 | MawModule | MawType | CMAWBUDGET | 2 | +| gwf-maw.f90 | MawModule | MawType | CMAWNAME | 2 | +| gwf-maw.f90 | MawModule | MawType | STATUS | 2 | +| gwf-maw.f90 | MawModule | MawType | NGWFNODES | 1 | +| gwf-maw.f90 | MawModule | MawType | IEQN | 1 | +| gwf-maw.f90 | MawModule | MawType | ISHUTOFF | 1 | +| gwf-maw.f90 | MawModule | MawType | IFWDISCHARGE | 1 | +| gwf-maw.f90 | MawModule | MawType | STRT | 1 | +| gwf-maw.f90 | MawModule | MawType | RADIUS | 1 | +| gwf-maw.f90 | MawModule | MawType | AREA | 1 | +| gwf-maw.f90 | MawModule | MawType | PUMPELEV | 1 | +| gwf-maw.f90 | MawModule | MawType | BOT | 1 | +| gwf-maw.f90 | MawModule | MawType | RATESIM | 1 | +| gwf-maw.f90 | MawModule | MawType | REDUCTION_LENGTH | 1 | +| gwf-maw.f90 | MawModule | MawType | FWELEV | 1 | +| gwf-maw.f90 | MawModule | MawType | FWCONDS | 1 | +| gwf-maw.f90 | MawModule | MawType | FWRLEN | 1 | +| gwf-maw.f90 | MawModule | MawType | FWCONDSIM | 1 | +| gwf-maw.f90 | MawModule | MawType | XSTO | 1 | +| gwf-maw.f90 | MawModule | MawType | XOLDSTO | 1 | +| gwf-maw.f90 | MawModule | MawType | SHUTOFFMIN | 1 | +| gwf-maw.f90 | MawModule | MawType | SHUTOFFMAX | 1 | +| gwf-maw.f90 | MawModule | MawType | SHUTOFFLEVEL | 1 | +| gwf-maw.f90 | MawModule | MawType | SHUTOFFWEIGHT | 1 | +| gwf-maw.f90 | MawModule | MawType | SHUTOFFDQ | 1 | +| gwf-maw.f90 | MawModule | MawType | SHUTOFFQOLD | 1 | +| gwf-maw.f90 | MawModule | MawType | RATE | 1 | +| gwf-maw.f90 | MawModule | MawType | WELL_HEAD | 1 | +| gwf-maw.f90 | MawModule | MawType | MAUXVAR | 2 | +| gwf-maw.f90 | MawModule | MawType | DBUFF | 1 | +| gwf-maw.f90 | MawModule | MawType | IACONN | 1 | +| gwf-maw.f90 | MawModule | MawType | IMAP | 1 | +| gwf-maw.f90 | MawModule | MawType | GWFNODES | 1 | +| gwf-maw.f90 | MawModule | MawType | SRADIUS | 1 | +| gwf-maw.f90 | MawModule | MawType | HK | 1 | +| gwf-maw.f90 | MawModule | MawType | SATCOND | 1 | +| gwf-maw.f90 | MawModule | MawType | SIMCOND | 1 | +| gwf-maw.f90 | MawModule | MawType | TOPSCRN | 1 | +| gwf-maw.f90 | MawModule | MawType | BOTSCRN | 1 | +| gwf-maw.f90 | MawModule | MawType | QLEAK | 1 | +| gwf-maw.f90 | MawModule | MawType | CAUXCBC | 2 | +| gwf-maw.f90 | MawModule | MawType | QAUXCBC | 1 | +| gwf-maw.f90 | MawModule | MawType | QFW | 1 | +| gwf-maw.f90 | MawModule | MawType | QOUT | 1 | +| gwf-maw.f90 | MawModule | MawType | QSTO | 1 | +| gwf-maw.f90 | MawModule | MawType | QCONST | 1 | +| gwf-maw.f90 | MawModule | MawType | DENSETERMS | 2 | +| gwf-maw.f90 | MawModule | MawType | VISCRATIOS | 2 | +| gwf-maw.f90 | MawModule | MawType | IDXLOCNODE | 1 | +| gwf-maw.f90 | MawModule | MawType | IDXDGLO | 1 | +| gwf-maw.f90 | MawModule | MawType | IDXOFFDGLO | 1 | +| gwf-maw.f90 | MawModule | MawType | IDXSYMDGLO | 1 | +| gwf-maw.f90 | MawModule | MawType | IDXSYMOFFDGLO | 1 | +| gwf-maw.f90 | MawModule | MawType | XOLDPAK | 1 | +| gwf.f90 | GwfModule | GwfModelType | INIC | 0 | +| gwf.f90 | GwfModule | GwfModelType | INOC | 0 | +| gwf.f90 | GwfModule | GwfModelType | INNPF | 0 | +| gwf.f90 | GwfModule | GwfModelType | INBUY | 0 | +| gwf.f90 | GwfModule | GwfModelType | INVSC | 0 | +| gwf.f90 | GwfModule | GwfModelType | INSTO | 0 | +| gwf.f90 | GwfModule | GwfModelType | INCSUB | 0 | +| gwf.f90 | GwfModule | GwfModelType | INMVR | 0 | +| gwf.f90 | GwfModule | GwfModelType | INHFB | 0 | +| gwf.f90 | GwfModule | GwfModelType | INGNC | 0 | +| gwf.f90 | GwfModule | GwfModelType | INOBS | 0 | +| gwf.f90 | GwfModule | GwfModelType | ISS | 0 | +| gwf.f90 | GwfModule | GwfModelType | INEWTONUR | 0 | +| gwf-wel.f90 | WelModule | WelType | IFLOWRED | 0 | +| gwf-wel.f90 | WelModule | WelType | FLOWRED | 0 | +| gwf-wel.f90 | WelModule | WelType | IOUTAFRCSV | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | IPRHED | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | ISTAGEOUT | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | IBUDGETOUT | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | IBUDCSV | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | IPAKCSV | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | IDIVERSIONS | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | MAXSFRPICARD | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | MAXSFRIT | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | BDITEMS | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | CBCAUXITEMS | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | UNITCONV | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | LENGTHCONV | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | TIMECONV | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | DMAXCHG | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | DEPS | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | NCONN | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | ICHECK | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | ICONVCHK | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | IDENSE | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | IANYNONE | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | NCROSSPTSTOT | 0 | +| gwf-sfr.f90 | SfrModule | SfrType | SFRNAME | 2 | +| gwf-sfr.f90 | SfrModule | SfrType | IBOUNDPAK | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | IGWFNODE | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | IGWFTOPNODE | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | LENGTH | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | WIDTH | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | STRTOP | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | BTHICK | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | HK | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | SLOPE | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | NCONNREACH | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | USTRF | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | FTOTND | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | NDIV | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | USFLOW | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | DSFLOW | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | DEPTH | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | STAGE | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | GWFLOW | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | SIMEVAP | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | SIMRUNOFF | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | STAGE0 | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | USFLOW0 | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | ISFRORDER | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | IA | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | JA | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | IDIR | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | IDIV | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | QCONN | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | ROUGH | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | RAIN | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | EVAP | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | INFLOW | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | RUNOFF | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | SSTAGE | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | RAUXVAR | 2 | +| gwf-sfr.f90 | SfrModule | SfrType | IADIV | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | DIVREACH | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | DIVFLOW | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | DIVQ | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | NCROSSPTS | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | IACROSS | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | STATION | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | XSHEIGHT | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | XSROUGH | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | QOUTFLOW | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | QEXTOUTFLOW | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | DBUFF | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | QAUXCBC | 1 | +| gwf-sfr.f90 | SfrModule | SfrType | DENSETERMS | 2 | +| gwf-sfr.f90 | SfrModule | SfrType | VISCRATIOS | 2 | +| gwf-dis.f90 | GwfDisModule | GwfDisType | DELR | 1 | +| gwf-dis.f90 | GwfDisModule | GwfDisType | DELC | 1 | +| gwf-dis.f90 | GwfDisModule | GwfDisType | IDOMAIN | 3 | +| gwf-dis.f90 | GwfDisModule | GwfDisType | TOP2D | 2 | +| gwf-dis.f90 | GwfDisModule | GwfDisType | BOT3D | 3 | +| gwf-dis.f90 | GwfDisModule | GwfDisType | CELLX | 1 | +| gwf-dis.f90 | GwfDisModule | GwfDisType | CELLY | 1 | +| gwf-dis.f90 | GwfDisModule | GwfDisType | NLAY | 0 | +| gwf-dis.f90 | GwfDisModule | GwfDisType | NROW | 0 | +| gwf-dis.f90 | GwfDisModule | GwfDisType | NCOL | 0 | +| gwf-dis.f90 | GwfDisModule | GwfDisType | NODEUSER | 1 | +| gwf-dis.f90 | GwfDisModule | GwfDisType | NODEREDUCED | 1 | +| gwf-drn.f90 | DrnModule | DrnType | IAUXDDRNCOL | 0 | +| gwf-drn.f90 | DrnModule | DrnType | ICUBIC_SCALING | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | IAUXFPCONC | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | IMATROWS | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | IPRCONC | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | ICONCOUT | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | IBUDGETOUT | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | IBUDCSV | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | IGWFAPTPAK | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | NCV | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | IDXBUDFJF | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | IDXBUDGWF | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | IDXBUDSTO | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | IDXBUDTMVR | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | IDXBUDFMVR | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | IDXBUDAUX | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | NCONCBUDSSM | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | IDXPREPAK | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | IDXLASTPAK | 0 | +| tsp-apt.f90 | TspAptModule | TspAptType | IDXLOCNODE | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | IDXPAKDIAG | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | IDXGLO | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | IDXOFFDGLO | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | IDXSYMDGLO | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | IDXSYMOFFDGLO | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | IDXFJFDGLO | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | IDXFJFOFFDGLO | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | DBUFF | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | CONCFEAT | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | QSTO | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | CCTERM | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | CONCBUDSSM | 2 | +| tsp-apt.f90 | TspAptModule | TspAptType | QMFROMMVR | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | STRT | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | KTF | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | RFEATTHK | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | LAUXVAR | 2 | +| tsp-apt.f90 | TspAptModule | TspAptType | IBOUND | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | XNEWPAK | 1 | +| tsp-apt.f90 | TspAptModule | TspAptType | XOLDPAK | 1 | +| tsp-fmi.f90 | TspFmiModule | TspFmiType | IFLOWERR | 0 | +| tsp-fmi.f90 | TspFmiModule | TspFmiType | FLOWCORRECT | 1 | +| tsp-fmi.f90 | TspFmiModule | TspFmiType | IATP | 1 | +| tsp-fmi.f90 | TspFmiModule | TspFmiType | IGWFMVRTERM | 1 | +| tsp-adv.f90 | TspAdvModule | TspAdvType | IADVWT | 0 | +| tsp-ssm.f90 | TspSsmModule | TspSsmType | NBOUND | 0 | +| tsp-ssm.f90 | TspSsmModule | TspSsmType | IAUXPAK | 1 | +| tsp-ssm.f90 | TspSsmModule | TspSsmType | ISRCTYPE | 1 | +| tsp-mvt.f90 | TspMvtModule | TspMvtType | MAXPACKAGES | 0 | +| tsp-mvt.f90 | TspMvtModule | TspMvtType | IBUDGETOUT | 0 | +| tsp-mvt.f90 | TspMvtModule | TspMvtType | IBUDCSV | 0 | +| tsp.f90 | TransportModelModule | TransportModelType | INIC | 0 | +| tsp.f90 | TransportModelModule | TransportModelType | INFMI | 0 | +| tsp.f90 | TransportModelModule | TransportModelType | INMVT | 0 | +| tsp.f90 | TransportModelModule | TransportModelType | INADV | 0 | +| tsp.f90 | TransportModelModule | TransportModelType | INSSM | 0 | +| tsp.f90 | TransportModelModule | TransportModelType | INOC | 0 | +| tsp.f90 | TransportModelModule | TransportModelType | INOBS | 0 | +| tsp.f90 | TransportModelModule | TransportModelType | EQNSCLFAC | 0 | +| gwe-uze.f90 | GweUzeModule | GweUzeType | IDXBUDSSM | 1 | +| gwe-uze.f90 | GweUzeModule | GweUzeType | IDXBUDINFL | 0 | +| gwe-uze.f90 | GweUzeModule | GweUzeType | IDXBUDRINF | 0 | +| gwe-uze.f90 | GweUzeModule | GweUzeType | IDXBUDUZET | 0 | +| gwe-uze.f90 | GweUzeModule | GweUzeType | IDXBUDRITM | 0 | +| gwe-uze.f90 | GweUzeModule | GweUzeType | IDXBUDTHEQ | 0 | +| gwe-uze.f90 | GweUzeModule | GweUzeType | TEMPINFL | 1 | +| gwe-uze.f90 | GweUzeModule | GweUzeType | TEMPUZET | 1 | +| gwe-est.f90 | GweEstModule | GweEstType | CPW | 0 | +| gwe-est.f90 | GweEstModule | GweEstType | RHOW | 0 | +| gwe-est.f90 | GweEstModule | GweEstType | LATHEATVAP | 0 | +| gwe-est.f90 | GweEstModule | GweEstType | IDCY | 0 | +| gwe-est.f90 | GweEstModule | GweEstType | ILHV | 0 | +| gwe-est.f90 | GweEstModule | GweEstType | POROSITY | 1 | +| gwe-est.f90 | GweEstModule | GweEstType | RATESTO | 1 | +| gwe-est.f90 | GweEstModule | GweEstType | CPS | 1 | +| gwe-est.f90 | GweEstModule | GweEstType | RHOS | 1 | +| gwe-est.f90 | GweEstModule | GweEstType | RATEDCY | 1 | +| gwe-est.f90 | GweEstModule | GweEstType | DECAY | 1 | +| gwe-est.f90 | GweEstModule | GweEstType | DECAYLAST | 1 | +| gwe-mwe.f90 | GweMweModule | GweMweType | IDXBUDSSM | 1 | +| gwe-mwe.f90 | GweMweModule | GweMweType | IDXBUDRATE | 0 | +| gwe-mwe.f90 | GweMweModule | GweMweType | IDXBUDFWRT | 0 | +| gwe-mwe.f90 | GweMweModule | GweMweType | IDXBUDRTMV | 0 | +| gwe-mwe.f90 | GweMweModule | GweMweType | IDXBUDFRTM | 0 | +| gwe-mwe.f90 | GweMweModule | GweMweType | IDXBUDMWCD | 0 | +| gwe-mwe.f90 | GweMweModule | GweMweType | TEMPRATE | 1 | +| gwe-ctp.f90 | GweCtpModule | GweCtpType | RATECTPIN | 1 | +| gwe-ctp.f90 | GweCtpModule | GweCtpType | RATECTPOUT | 1 | +| gwe-lke.f90 | GweLkeModule | GweLkeType | IDXBUDSSM | 1 | +| gwe-lke.f90 | GweLkeModule | GweLkeType | IDXBUDRAIN | 0 | +| gwe-lke.f90 | GweLkeModule | GweLkeType | IDXBUDEVAP | 0 | +| gwe-lke.f90 | GweLkeModule | GweLkeType | IDXBUDROFF | 0 | +| gwe-lke.f90 | GweLkeModule | GweLkeType | IDXBUDIFLW | 0 | +| gwe-lke.f90 | GweLkeModule | GweLkeType | IDXBUDWDRL | 0 | +| gwe-lke.f90 | GweLkeModule | GweLkeType | IDXBUDOUTF | 0 | +| gwe-lke.f90 | GweLkeModule | GweLkeType | IDXBUDLBCD | 0 | +| gwe-lke.f90 | GweLkeModule | GweLkeType | TEMPRAIN | 1 | +| gwe-lke.f90 | GweLkeModule | GweLkeType | TEMPEVAP | 1 | +| gwe-lke.f90 | GweLkeModule | GweLkeType | TEMPROFF | 1 | +| gwe-lke.f90 | GweLkeModule | GweLkeType | TEMPIFLW | 1 | +| gwe-cnd.f90 | GweCndModule | GweCndType | IDISP | 0 | +| gwe-cnd.f90 | GweCndModule | GweCndType | IALH | 0 | +| gwe-cnd.f90 | GweCndModule | GweCndType | IALV | 0 | +| gwe-cnd.f90 | GweCndModule | GweCndType | IATH1 | 0 | +| gwe-cnd.f90 | GweCndModule | GweCndType | IATH2 | 0 | +| gwe-cnd.f90 | GweCndModule | GweCndType | IATV | 0 | +| gwe-cnd.f90 | GweCndModule | GweCndType | IXT3DOFF | 0 | +| gwe-cnd.f90 | GweCndModule | GweCndType | IXT3DRHS | 0 | +| gwe-cnd.f90 | GweCndModule | GweCndType | IXT3D | 0 | +| gwe-cnd.f90 | GweCndModule | GweCndType | ID22 | 0 | +| gwe-cnd.f90 | GweCndModule | GweCndType | ID33 | 0 | +| gwe-cnd.f90 | GweCndModule | GweCndType | IANGLE1 | 0 | +| gwe-cnd.f90 | GweCndModule | GweCndType | IANGLE2 | 0 | +| gwe-cnd.f90 | GweCndModule | GweCndType | IANGLE3 | 0 | +| gwe-cnd.f90 | GweCndModule | GweCndType | IKTW | 0 | +| gwe-cnd.f90 | GweCndModule | GweCndType | IKTS | 0 | +| gwe-cnd.f90 | GweCndModule | GweCndType | ALH | 1 | +| gwe-cnd.f90 | GweCndModule | GweCndType | ALV | 1 | +| gwe-cnd.f90 | GweCndModule | GweCndType | ATH1 | 1 | +| gwe-cnd.f90 | GweCndModule | GweCndType | ATH2 | 1 | +| gwe-cnd.f90 | GweCndModule | GweCndType | ATV | 1 | +| gwe-cnd.f90 | GweCndModule | GweCndType | D11 | 1 | +| gwe-cnd.f90 | GweCndModule | GweCndType | D22 | 1 | +| gwe-cnd.f90 | GweCndModule | GweCndType | D33 | 1 | +| gwe-cnd.f90 | GweCndModule | GweCndType | ANGLE1 | 1 | +| gwe-cnd.f90 | GweCndModule | GweCndType | ANGLE2 | 1 | +| gwe-cnd.f90 | GweCndModule | GweCndType | ANGLE3 | 1 | +| gwe-cnd.f90 | GweCndModule | GweCndType | KTW | 1 | +| gwe-cnd.f90 | GweCndModule | GweCndType | KTS | 1 | +| gwe-cnd.f90 | GweCndModule | GweCndType | DISPCOEF | 1 | +| gwe-sfe.f90 | GweSfeModule | GweSfeType | IDXBUDSSM | 1 | +| gwe-sfe.f90 | GweSfeModule | GweSfeType | IDXBUDRAIN | 0 | +| gwe-sfe.f90 | GweSfeModule | GweSfeType | IDXBUDEVAP | 0 | +| gwe-sfe.f90 | GweSfeModule | GweSfeType | IDXBUDROFF | 0 | +| gwe-sfe.f90 | GweSfeModule | GweSfeType | IDXBUDIFLW | 0 | +| gwe-sfe.f90 | GweSfeModule | GweSfeType | IDXBUDOUTF | 0 | +| gwe-sfe.f90 | GweSfeModule | GweSfeType | IDXBUDSBCD | 0 | +| gwe-sfe.f90 | GweSfeModule | GweSfeType | TEMPRAIN | 1 | +| gwe-sfe.f90 | GweSfeModule | GweSfeType | TEMPEVAP | 1 | +| gwe-sfe.f90 | GweSfeModule | GweSfeType | TEMPROFF | 1 | +| gwe-sfe.f90 | GweSfeModule | GweSfeType | TEMPIFLW | 1 | +| gwe.f90 | GweModule | GweModelType | INEST | 0 | +| gwe.f90 | GweModule | GweModelType | INCND | 0 | diff --git a/make/makedefaults b/make/makedefaults index 56b33637346..995cca74c8a 100644 --- a/make/makedefaults +++ b/make/makedefaults @@ -1,4 +1,4 @@ -# makedefaults created by pymake (version 1.2.9.dev0) for the 'mf6' executable. +# makedefaults created by pymake (version 1.2.10.dev0) for the 'mf6' executable. # determine OS ifeq ($(OS), Windows_NT) @@ -57,11 +57,11 @@ OPTLEVEL ?= -O2 # set the fortran flags ifeq ($(detected_OS), Windows) ifeq ($(FC), gfortran) - FFLAGS ?= -static -fbacktrace $(OS_macro) -fall-intrinsics -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -pedantic -std=f2008 -Wcharacter-truncation -cpp + FFLAGS ?= -static -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid -fall-intrinsics -pedantic -Wcharacter-truncation $(OS_macro) -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -std=f2008 -cpp endif else ifeq ($(FC), gfortran) - FFLAGS ?= -fbacktrace $(OS_macro) -fall-intrinsics -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -pedantic -std=f2008 -Wcharacter-truncation -cpp + FFLAGS ?= -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid -fall-intrinsics -pedantic -Wcharacter-truncation $(OS_macro) -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -std=f2008 -cpp endif ifeq ($(FC), $(filter $(FC), ifort mpiifort)) FFLAGS ?= -no-heap-arrays -fpe0 -traceback -Qdiag-disable:7416 -Qdiag-disable:7025 -Qdiag-disable:5268 -fpp diff --git a/make/makefile b/make/makefile index bc7f1d45cdc..a70403d508b 100644 --- a/make/makefile +++ b/make/makefile @@ -1,4 +1,4 @@ -# makefile created by pymake (version 1.2.9.dev0) for the 'mf6' executable. +# makefile created by pymake (version 1.2.10.dev0) for the 'mf6' executable. include ./makedefaults @@ -95,51 +95,51 @@ $(OBJDIR)/CharString.o \ $(OBJDIR)/InputDefinition.o \ $(OBJDIR)/Memory.o \ $(OBJDIR)/List.o \ -$(OBJDIR)/swf1zdg1idm.o \ -$(OBJDIR)/swf1idm.o \ -$(OBJDIR)/swf1ic1idm.o \ -$(OBJDIR)/swf1flw1idm.o \ -$(OBJDIR)/swf1disl1idm.o \ -$(OBJDIR)/swf1dfw1idm.o \ -$(OBJDIR)/swf1cxs1idm.o \ -$(OBJDIR)/swf1chd1idm.o \ +$(OBJDIR)/swf-zdgidm.o \ +$(OBJDIR)/swf-namidm.o \ +$(OBJDIR)/swf-icidm.o \ +$(OBJDIR)/swf-flwidm.o \ +$(OBJDIR)/swf-dislidm.o \ +$(OBJDIR)/swf-dfwidm.o \ +$(OBJDIR)/swf-cxsidm.o \ +$(OBJDIR)/swf-chdidm.o \ $(OBJDIR)/simtdisidm.o \ -$(OBJDIR)/simnamidm.o \ -$(OBJDIR)/gwt1idm.o \ -$(OBJDIR)/gwt1ic1idm.o \ -$(OBJDIR)/gwt1dsp1idm.o \ -$(OBJDIR)/gwt1disv1idm.o \ -$(OBJDIR)/gwt1disu1idm.o \ -$(OBJDIR)/gwt1dis1idm.o \ -$(OBJDIR)/gwt1cnc1idm.o \ -$(OBJDIR)/gwf3wel8idm.o \ -$(OBJDIR)/gwf3riv8idm.o \ -$(OBJDIR)/gwf3rch8idm.o \ -$(OBJDIR)/gwf3rcha8idm.o \ -$(OBJDIR)/gwf3npf8idm.o \ -$(OBJDIR)/gwf3idm.o \ -$(OBJDIR)/gwf3ic8idm.o \ -$(OBJDIR)/gwf3ghb8idm.o \ -$(OBJDIR)/gwf3evt8idm.o \ -$(OBJDIR)/gwf3evta8idm.o \ -$(OBJDIR)/gwf3drn8idm.o \ -$(OBJDIR)/gwf3disv8idm.o \ -$(OBJDIR)/gwf3disu8idm.o \ -$(OBJDIR)/gwf3dis8idm.o \ -$(OBJDIR)/gwf3chd8idm.o \ -$(OBJDIR)/gwe1idm.o \ -$(OBJDIR)/gwe1ic1idm.o \ -$(OBJDIR)/gwe1disv1idm.o \ -$(OBJDIR)/gwe1disu1idm.o \ -$(OBJDIR)/gwe1dis1idm.o \ -$(OBJDIR)/gwe1ctp1idm.o \ -$(OBJDIR)/gwe1cnd1idm.o \ -$(OBJDIR)/swfgwfidm.o \ -$(OBJDIR)/gwtgwtidm.o \ -$(OBJDIR)/gwfgwtidm.o \ -$(OBJDIR)/gwfgwfidm.o \ -$(OBJDIR)/gwfgweidm.o \ -$(OBJDIR)/gwegweidm.o \ +$(OBJDIR)/sim-namidm.o \ +$(OBJDIR)/gwt-namidm.o \ +$(OBJDIR)/gwt-icidm.o \ +$(OBJDIR)/gwt-dspidm.o \ +$(OBJDIR)/gwt-disvidm.o \ +$(OBJDIR)/gwt-disuidm.o \ +$(OBJDIR)/gwt-disidm.o \ +$(OBJDIR)/gwt-cncidm.o \ +$(OBJDIR)/gwf-welidm.o \ +$(OBJDIR)/gwf-rividm.o \ +$(OBJDIR)/gwf-rchidm.o \ +$(OBJDIR)/gwf-rchaidm.o \ +$(OBJDIR)/gwf-npfidm.o \ +$(OBJDIR)/gwf-namidm.o \ +$(OBJDIR)/gwf-icidm.o \ +$(OBJDIR)/gwf-ghbidm.o \ +$(OBJDIR)/gwf-evtidm.o \ +$(OBJDIR)/gwf-evtaidm.o \ +$(OBJDIR)/gwf-drnidm.o \ +$(OBJDIR)/gwf-disvidm.o \ +$(OBJDIR)/gwf-disuidm.o \ +$(OBJDIR)/gwf-disidm.o \ +$(OBJDIR)/gwf-chdidm.o \ +$(OBJDIR)/gwe-namidm.o \ +$(OBJDIR)/gwe-icidm.o \ +$(OBJDIR)/gwe-disvidm.o \ +$(OBJDIR)/gwe-disuidm.o \ +$(OBJDIR)/gwe-disidm.o \ +$(OBJDIR)/gwe-ctpidm.o \ +$(OBJDIR)/gwe-cndidm.o \ +$(OBJDIR)/exg-swfgwfidm.o \ +$(OBJDIR)/exg-gwtgwtidm.o \ +$(OBJDIR)/exg-gwfgwtidm.o \ +$(OBJDIR)/exg-gwfgwfidm.o \ +$(OBJDIR)/exg-gwfgweidm.o \ +$(OBJDIR)/exg-gwegweidm.o \ $(OBJDIR)/LongLineReader.o \ $(OBJDIR)/DevFeature.o \ $(OBJDIR)/MemoryList.o \ @@ -166,7 +166,6 @@ $(OBJDIR)/HashTable.o \ $(OBJDIR)/VectorBase.o \ $(OBJDIR)/Sparse.o \ $(OBJDIR)/DisvGeom.o \ -$(OBJDIR)/DislGeom.o \ $(OBJDIR)/ArrayReaders.o \ $(OBJDIR)/TimeSeriesManager.o \ $(OBJDIR)/SmoothingFunctions.o \ @@ -185,7 +184,7 @@ $(OBJDIR)/ObsContainer.o \ $(OBJDIR)/BudgetFileReader.o \ $(OBJDIR)/TimeArraySeriesManager.o \ $(OBJDIR)/PackageMover.o \ -$(OBJDIR)/Obs3.o \ +$(OBJDIR)/Obs.o \ $(OBJDIR)/NumericalPackage.o \ $(OBJDIR)/Budget.o \ $(OBJDIR)/BudgetTerm.o \ @@ -208,30 +207,30 @@ $(OBJDIR)/SimStages.o \ $(OBJDIR)/NumericalModel.o \ $(OBJDIR)/FlowModelInterface.o \ $(OBJDIR)/OutputControlData.o \ -$(OBJDIR)/gwf3ic8.o \ +$(OBJDIR)/gwf-ic.o \ $(OBJDIR)/Xt3dAlgorithm.o \ -$(OBJDIR)/gwf3tvbase8.o \ -$(OBJDIR)/gwf3sfr8.o \ -$(OBJDIR)/gwf3riv8.o \ -$(OBJDIR)/gwf3maw8.o \ +$(OBJDIR)/TvBase.o \ +$(OBJDIR)/gwf-sfr.o \ +$(OBJDIR)/gwf-riv.o \ +$(OBJDIR)/gwf-maw.o \ $(OBJDIR)/mf6lists.o \ -$(OBJDIR)/gwf3lak8.o \ +$(OBJDIR)/gwf-lak.o \ $(OBJDIR)/GwfVscInputData.o \ -$(OBJDIR)/gwf3ghb8.o \ -$(OBJDIR)/gwf3drn8.o \ +$(OBJDIR)/gwf-ghb.o \ +$(OBJDIR)/gwf-drn.o \ $(OBJDIR)/IndexMap.o \ $(OBJDIR)/VirtualModel.o \ $(OBJDIR)/BaseExchange.o \ -$(OBJDIR)/tsp1fmi1.o \ +$(OBJDIR)/tsp-fmi.o \ $(OBJDIR)/GwtSpc.o \ $(OBJDIR)/GweInputData.o \ $(OBJDIR)/OutputControl.o \ -$(OBJDIR)/tsp1ic1.o \ +$(OBJDIR)/tsp-ic.o \ $(OBJDIR)/TspAdvOptions.o \ $(OBJDIR)/UzfCellGroup.o \ $(OBJDIR)/Xt3dInterface.o \ -$(OBJDIR)/gwf3tvk8.o \ -$(OBJDIR)/gwf3vsc8.o \ +$(OBJDIR)/gwf-tvk.o \ +$(OBJDIR)/gwf-vsc.o \ $(OBJDIR)/GwfNpfOptions.o \ $(OBJDIR)/InterfaceMap.o \ $(OBJDIR)/SeqVector.o \ @@ -240,116 +239,117 @@ $(OBJDIR)/ConvergenceSummary.o \ $(OBJDIR)/ArrayReaderBase.o \ $(OBJDIR)/CellWithNbrs.o \ $(OBJDIR)/NumericalExchange.o \ -$(OBJDIR)/tsp1ssm1.o \ -$(OBJDIR)/tsp1oc1.o \ -$(OBJDIR)/tsp1obs1.o \ -$(OBJDIR)/tsp1mvt1.o \ -$(OBJDIR)/tsp1adv1.o \ -$(OBJDIR)/gwf3disv8.o \ -$(OBJDIR)/gwf3disu8.o \ -$(OBJDIR)/gwf3dis8.o \ -$(OBJDIR)/gwf3uzf8.o \ -$(OBJDIR)/tsp1apt1.o \ -$(OBJDIR)/gwt1mst1.o \ +$(OBJDIR)/tsp-ssm.o \ +$(OBJDIR)/tsp-oc.o \ +$(OBJDIR)/tsp-obs.o \ +$(OBJDIR)/tsp-mvt.o \ +$(OBJDIR)/tsp-adv.o \ +$(OBJDIR)/gwf-disv.o \ +$(OBJDIR)/gwf-disu.o \ +$(OBJDIR)/gwf-dis.o \ +$(OBJDIR)/gwf-uzf.o \ +$(OBJDIR)/tsp-apt.o \ +$(OBJDIR)/gwt-mst.o \ $(OBJDIR)/GwtDspOptions.o \ -$(OBJDIR)/gwf3npf8.o \ -$(OBJDIR)/gwf3tvs8.o \ +$(OBJDIR)/gwf-npf.o \ +$(OBJDIR)/gwf-tvs.o \ $(OBJDIR)/GwfStorageUtils.o \ $(OBJDIR)/Mover.o \ $(OBJDIR)/GwfMvrPeriodData.o \ -$(OBJDIR)/ims8misc.o \ +$(OBJDIR)/ImsLinearMisc.o \ $(OBJDIR)/GwfBuyInputData.o \ $(OBJDIR)/GweCndOptions.o \ $(OBJDIR)/VirtualSolution.o \ $(OBJDIR)/SparseMatrix.o \ $(OBJDIR)/LinearSolverBase.o \ -$(OBJDIR)/ims8reordering.o \ +$(OBJDIR)/ImsReordering.o \ $(OBJDIR)/ModflowInput.o \ $(OBJDIR)/IdmLogger.o \ $(OBJDIR)/Integer2dReader.o \ +$(OBJDIR)/DislGeom.o \ $(OBJDIR)/SwfCxsUtils.o \ $(OBJDIR)/VirtualExchange.o \ $(OBJDIR)/GridSorting.o \ $(OBJDIR)/DisConnExchange.o \ $(OBJDIR)/CsrUtils.o \ -$(OBJDIR)/tsp1.o \ -$(OBJDIR)/gwt1uzt1.o \ -$(OBJDIR)/gwt1src1.o \ -$(OBJDIR)/gwt1sft1.o \ -$(OBJDIR)/gwt1mwt1.o \ -$(OBJDIR)/gwt1lkt1.o \ -$(OBJDIR)/gwt1ist1.o \ -$(OBJDIR)/gwt1dsp1.o \ -$(OBJDIR)/gwt1cnc1.o \ -$(OBJDIR)/gwf3api8.o \ -$(OBJDIR)/gwf3wel8.o \ -$(OBJDIR)/gwf3rch8.o \ -$(OBJDIR)/gwf3sto8.o \ -$(OBJDIR)/gwf3oc8.o \ -$(OBJDIR)/gwf3obs8.o \ -$(OBJDIR)/gwf3mvr8.o \ -$(OBJDIR)/gwf3hfb8.o \ -$(OBJDIR)/gwf3csub8.o \ -$(OBJDIR)/gwf3buy8.o \ +$(OBJDIR)/tsp.o \ +$(OBJDIR)/gwt-uzt.o \ +$(OBJDIR)/gwt-src.o \ +$(OBJDIR)/gwt-sft.o \ +$(OBJDIR)/gwt-mwt.o \ +$(OBJDIR)/gwt-lkt.o \ +$(OBJDIR)/gwt-ist.o \ +$(OBJDIR)/gwt-dsp.o \ +$(OBJDIR)/gwt-cnc.o \ +$(OBJDIR)/gwf-api.o \ +$(OBJDIR)/gwf-wel.o \ +$(OBJDIR)/gwf-rch.o \ +$(OBJDIR)/gwf-sto.o \ +$(OBJDIR)/gwf-oc.o \ +$(OBJDIR)/gwf-obs.o \ +$(OBJDIR)/gwf-mvr.o \ +$(OBJDIR)/gwf-hfb.o \ +$(OBJDIR)/gwf-csub.o \ +$(OBJDIR)/gwf-buy.o \ $(OBJDIR)/GhostNode.o \ -$(OBJDIR)/gwf3evt8.o \ -$(OBJDIR)/gwf3chd8.o \ -$(OBJDIR)/gwe1uze1.o \ -$(OBJDIR)/gwe1sfe1.o \ -$(OBJDIR)/gwe1mwe1.o \ -$(OBJDIR)/gwe1lke1.o \ -$(OBJDIR)/gwe1est1.o \ -$(OBJDIR)/gwe1esl1.o \ -$(OBJDIR)/gwe1ctp1.o \ -$(OBJDIR)/gwe1cnd1.o \ +$(OBJDIR)/gwf-evt.o \ +$(OBJDIR)/gwf-chd.o \ +$(OBJDIR)/gwe-uze.o \ +$(OBJDIR)/gwe-sfe.o \ +$(OBJDIR)/gwe-mwe.o \ +$(OBJDIR)/gwe-lke.o \ +$(OBJDIR)/gwe-est.o \ +$(OBJDIR)/gwe-esl.o \ +$(OBJDIR)/gwe-ctp.o \ +$(OBJDIR)/gwe-cnd.o \ $(OBJDIR)/RouterBase.o \ $(OBJDIR)/ImsLinearSolver.o \ -$(OBJDIR)/ims8base.o \ +$(OBJDIR)/ImsLinearBase.o \ $(OBJDIR)/StructVector.o \ $(OBJDIR)/DefinitionSelect.o \ $(OBJDIR)/InputLoadType.o \ $(OBJDIR)/Integer1dReader.o \ $(OBJDIR)/Double2dReader.o \ $(OBJDIR)/Double1dReader.o \ -$(OBJDIR)/swf1disl1.o \ -$(OBJDIR)/swf1cxs1.o \ -$(OBJDIR)/swf1ic1.o \ +$(OBJDIR)/swf-disl.o \ +$(OBJDIR)/swf-cxs.o \ +$(OBJDIR)/swf-ic.o \ $(OBJDIR)/GridConnection.o \ $(OBJDIR)/DistributedVariable.o \ -$(OBJDIR)/gwt1.o \ -$(OBJDIR)/gwf3.o \ +$(OBJDIR)/gwt.o \ +$(OBJDIR)/gwf.o \ $(OBJDIR)/GwfExchangeMover.o \ -$(OBJDIR)/gwe1.o \ +$(OBJDIR)/gwe.o \ $(OBJDIR)/SerialRouter.o \ $(OBJDIR)/Timer.o \ $(OBJDIR)/LinearSolverFactory.o \ -$(OBJDIR)/ims8linear.o \ +$(OBJDIR)/ImsLinear.o \ $(OBJDIR)/BaseSolution.o \ $(OBJDIR)/StructArray.o \ $(OBJDIR)/BoundInputContext.o \ $(OBJDIR)/AsciiInputLoadType.o \ $(OBJDIR)/LayeredArrayReader.o \ -$(OBJDIR)/swf1zdg1.o \ -$(OBJDIR)/swf1sto1.o \ -$(OBJDIR)/swf1oc1.o \ -$(OBJDIR)/swf1obs1.o \ -$(OBJDIR)/swf1flw1.o \ -$(OBJDIR)/swf1dfw1.o \ +$(OBJDIR)/swf-zdg.o \ +$(OBJDIR)/swf-sto.o \ +$(OBJDIR)/swf-oc.o \ +$(OBJDIR)/swf-obs.o \ +$(OBJDIR)/swf-flw.o \ +$(OBJDIR)/swf-dfw.o \ $(OBJDIR)/ExplicitModel.o \ $(OBJDIR)/SpatialModelConnection.o \ $(OBJDIR)/GwtInterfaceModel.o \ -$(OBJDIR)/GwtGwtExchange.o \ +$(OBJDIR)/exg-gwtgwt.o \ $(OBJDIR)/GwfInterfaceModel.o \ -$(OBJDIR)/GwfGwfExchange.o \ +$(OBJDIR)/exg-gwfgwf.o \ $(OBJDIR)/GweInterfaceModel.o \ -$(OBJDIR)/GweGweExchange.o \ +$(OBJDIR)/exg-gwegwe.o \ $(OBJDIR)/RouterFactory.o \ $(OBJDIR)/NumericalSolution.o \ $(OBJDIR)/MappedMemory.o \ $(OBJDIR)/StressListInput.o \ $(OBJDIR)/StressGridInput.o \ $(OBJDIR)/LoadMf6File.o \ -$(OBJDIR)/swf1.o \ +$(OBJDIR)/swf.o \ $(OBJDIR)/ExplicitSolution.o \ $(OBJDIR)/GwtGwtConnection.o \ $(OBJDIR)/GwfGwfConnection.o \ @@ -364,11 +364,11 @@ $(OBJDIR)/VirtualGwfModel.o \ $(OBJDIR)/VirtualGwfExchange.o \ $(OBJDIR)/VirtualGweModel.o \ $(OBJDIR)/VirtualGweExchange.o \ -$(OBJDIR)/SwfGwfExchange.o \ +$(OBJDIR)/exg-swfgwf.o \ $(OBJDIR)/SolutionGroup.o \ $(OBJDIR)/SolutionFactory.o \ -$(OBJDIR)/GwfGwtExchange.o \ -$(OBJDIR)/GwfGweExchange.o \ +$(OBJDIR)/exg-gwfgwt.o \ +$(OBJDIR)/exg-gwfgwe.o \ $(OBJDIR)/RunControl.o \ $(OBJDIR)/SourceLoad.o \ $(OBJDIR)/ModelPackageInputs.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index 9a4d1a89eb6..5da12df2fa7 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -2,50 +2,44 @@ - - + - - - - - - - - - + + + + + + + + - - - - - - - - - + + + + + + + + - - - - - - - - - + + + + + + + + - - - - - - - - - - + + + + + + + + @@ -88,13 +82,13 @@ - + - + - + - + @@ -113,20 +107,20 @@ - - + + - - - - - - - - - - - + + + + + + + + + + + @@ -148,85 +142,105 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -254,45 +268,26 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - + + + + @@ -317,13 +312,13 @@ - + - + - + - + @@ -332,13 +327,13 @@ - + - + - + - + @@ -367,8 +362,8 @@ - - + + @@ -401,7 +396,7 @@ - + @@ -440,23 +435,23 @@ - + - + - + - + - + - + - + - + @@ -489,15 +484,13 @@ - + - + - + - - - - - - + + + + diff --git a/msvs/mf6lib.vfproj b/msvs/mf6lib.vfproj index dee2f209199..a14282b94e7 100644 --- a/msvs/mf6lib.vfproj +++ b/msvs/mf6lib.vfproj @@ -49,7 +49,7 @@ - + @@ -66,28 +66,28 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + @@ -116,7 +116,7 @@ - + diff --git a/pymake/makefile b/pymake/makefile index 8e7065a0d6d..d4d9c8381f7 100644 --- a/pymake/makefile +++ b/pymake/makefile @@ -78,19 +78,19 @@ $(OBJDIR)/BaseGeometry.o \ $(OBJDIR)/InputDefinition.o \ $(OBJDIR)/SimStages.o \ $(OBJDIR)/GwtDspOptions.o \ -$(OBJDIR)/gwf3npf8idm.o \ +$(OBJDIR)/gwf-npfidm.o \ $(OBJDIR)/Sparse.o \ $(OBJDIR)/GwtAdvOptions.o \ -$(OBJDIR)/gwt1disv1idm.o \ -$(OBJDIR)/gwt1dis1idm.o \ -$(OBJDIR)/gwf3dis8idm.o \ +$(OBJDIR)/gwt-disvidm.o \ +$(OBJDIR)/gwt-disidm.o \ +$(OBJDIR)/gwf-disidm.o \ $(OBJDIR)/simnamidm.o \ -$(OBJDIR)/gwf3disu8idm.o \ +$(OBJDIR)/gwf-disuidm.o \ $(OBJDIR)/CsrUtils.o \ -$(OBJDIR)/gwt1idm.o \ -$(OBJDIR)/gwf3disv8idm.o \ +$(OBJDIR)/gwtidm.o \ +$(OBJDIR)/gwf-disvidm.o \ $(OBJDIR)/blas1_d.o \ -$(OBJDIR)/gwt1dsp1idm.o \ +$(OBJDIR)/gwt-dspidm.o \ $(OBJDIR)/CharString.o \ $(OBJDIR)/OpenSpec.o \ $(OBJDIR)/dag_module.o \ @@ -99,8 +99,8 @@ $(OBJDIR)/Constants.o \ $(OBJDIR)/rcm.o \ $(OBJDIR)/HashTable.o \ $(OBJDIR)/sparsekit.o \ -$(OBJDIR)/gwt1disu1idm.o \ -$(OBJDIR)/gwf3idm.o \ +$(OBJDIR)/gwt-disuidm.o \ +$(OBJDIR)/gwfidm.o \ $(OBJDIR)/SfrCrossSectionUtils.o \ $(OBJDIR)/MatrixBase.o \ $(OBJDIR)/compilerversion.o \ @@ -192,92 +192,92 @@ $(OBJDIR)/UzfCellGroup.o \ $(OBJDIR)/BudgetTerm.o \ $(OBJDIR)/Observe.o \ $(OBJDIR)/OutputControlData.o \ -$(OBJDIR)/gwf3dis8.o \ +$(OBJDIR)/gwf-dis.o \ $(OBJDIR)/LayeredArrayReader.o \ $(OBJDIR)/TimeArray.o \ $(OBJDIR)/NumericalPackage.o \ $(OBJDIR)/LoadMf6File.o \ $(OBJDIR)/ExplicitModel.o \ $(OBJDIR)/BaseSolution.o \ -$(OBJDIR)/gwf3disu8.o \ +$(OBJDIR)/gwf-disu.o \ $(OBJDIR)/TimeArraySeries.o \ $(OBJDIR)/SolutionGroup.o \ $(OBJDIR)/ObsContainer.o \ $(OBJDIR)/ExplicitSolution.o \ $(OBJDIR)/TimeArraySeriesLink.o \ $(OBJDIR)/Xt3dInterface.o \ -$(OBJDIR)/gwf3disv8.o \ +$(OBJDIR)/gwf-disv.o \ $(OBJDIR)/ImsLinearSolver.o \ $(OBJDIR)/TimeArraySeriesManager.o \ $(OBJDIR)/BudgetObject.o \ $(OBJDIR)/ObsUtility.o \ -$(OBJDIR)/gwf3tvbase8.o \ -$(OBJDIR)/gwf3tvs8.o \ +$(OBJDIR)/TvBase.o \ +$(OBJDIR)/gwf-tvs.o \ $(OBJDIR)/IdmMf6File.o \ $(OBJDIR)/OutputControl.o \ $(OBJDIR)/LinearSolverFactory.o \ -$(OBJDIR)/gwf3ic8.o \ -$(OBJDIR)/Obs3.o \ -$(OBJDIR)/gwf3tvk8.o \ +$(OBJDIR)/gwf-ic.o \ +$(OBJDIR)/Obs.o \ +$(OBJDIR)/gwf-tvk.o \ $(OBJDIR)/GwtSpc.o \ $(OBJDIR)/IdmSimulation.o \ $(OBJDIR)/gwt1oc1.o \ -$(OBJDIR)/gwf3mvr8.o \ -$(OBJDIR)/gwt1ic1.o \ +$(OBJDIR)/gwf-mvr.o \ +$(OBJDIR)/gwt-ic.o \ $(OBJDIR)/gwt1obs1.o \ -$(OBJDIR)/gwf3obs8.o \ -$(OBJDIR)/gwf3oc8.o \ -$(OBJDIR)/gwf3sto8.o \ +$(OBJDIR)/gwf-obs.o \ +$(OBJDIR)/gwf-oc.o \ +$(OBJDIR)/gwf-sto.o \ $(OBJDIR)/BoundaryPackage.o \ -$(OBJDIR)/gwf3csub8.o \ -$(OBJDIR)/gwf3uzf8.o \ -$(OBJDIR)/gwt1cnc1.o \ -$(OBJDIR)/gwf3lak8.o \ -$(OBJDIR)/gwt1src1.o \ -$(OBJDIR)/gwf3maw8.o \ -$(OBJDIR)/gwt1fmi1.o \ -$(OBJDIR)/gwf3rch8.o \ -$(OBJDIR)/gwt1apt1.o \ -$(OBJDIR)/gwf3wel8.o \ -$(OBJDIR)/gwf3riv8.o \ -$(OBJDIR)/gwf3drn8.o \ -$(OBJDIR)/gwt1mwt1.o \ -$(OBJDIR)/gwf3sfr8.o \ -$(OBJDIR)/gwf3api8.o \ -$(OBJDIR)/gwf3evt8.o \ +$(OBJDIR)/gwf-csub.o \ +$(OBJDIR)/gwf-uzf.o \ +$(OBJDIR)/gwt-cnc.o \ +$(OBJDIR)/gwf-lak.o \ +$(OBJDIR)/gwt-src.o \ +$(OBJDIR)/gwf-maw.o \ +$(OBJDIR)/gwt-fmi.o \ +$(OBJDIR)/gwf-rch.o \ +$(OBJDIR)/gwt-apt.o \ +$(OBJDIR)/gwf-wel.o \ +$(OBJDIR)/gwf-riv.o \ +$(OBJDIR)/gwf-drn.o \ +$(OBJDIR)/gwt-mwt.o \ +$(OBJDIR)/gwf-sfr.o \ +$(OBJDIR)/gwf-api.o \ +$(OBJDIR)/gwf-evt.o \ $(OBJDIR)/NumericalModel.o \ -$(OBJDIR)/gwf3ghb8.o \ -$(OBJDIR)/gwf3chd8.o \ -$(OBJDIR)/gwt1uzt1.o \ -$(OBJDIR)/gwf3vsc8.o \ +$(OBJDIR)/gwf-ghb.o \ +$(OBJDIR)/gwf-chd.o \ +$(OBJDIR)/gwt-uzt.o \ +$(OBJDIR)/gwf-vsc.o \ $(OBJDIR)/NumericalExchange.o \ -$(OBJDIR)/gwt1ssm1.o \ +$(OBJDIR)/gwt-ssm.o \ $(OBJDIR)/NumericalSolution.o \ -$(OBJDIR)/gwt1adv1.o \ -$(OBJDIR)/gwt1lkt1.o \ +$(OBJDIR)/gwt-adv.o \ +$(OBJDIR)/gwt-lkt.o \ $(OBJDIR)/SolutionFactory.o \ $(OBJDIR)/VirtualModel.o \ -$(OBJDIR)/gwt1sft1.o \ -$(OBJDIR)/gwt1mst1.o \ +$(OBJDIR)/gwt-sft.o \ +$(OBJDIR)/gwt-mst.o \ $(OBJDIR)/VirtualSolution.o \ $(OBJDIR)/VirtualGwfModel.o \ -$(OBJDIR)/gwt1ist1.o \ -$(OBJDIR)/gwf3npf8.o \ +$(OBJDIR)/gwt-ist.o \ +$(OBJDIR)/gwf-npf.o \ $(OBJDIR)/TransportModel.o \ $(OBJDIR)/DisConnExchange.o \ $(OBJDIR)/GhostNode.o \ -$(OBJDIR)/gwt1mvt1.o \ +$(OBJDIR)/gwt-mvt.o \ $(OBJDIR)/VirtualExchange.o \ -$(OBJDIR)/gwt1dsp1.o \ -$(OBJDIR)/gwf3buy8.o \ +$(OBJDIR)/gwt-dsp.o \ +$(OBJDIR)/gwf-buy.o \ $(OBJDIR)/VirtualGwfExchange.o \ -$(OBJDIR)/gwf3hfb8.o \ +$(OBJDIR)/gwf-hfb.o \ $(OBJDIR)/VirtualGwtExchange.o \ $(OBJDIR)/VirtualGwtModel.o \ $(OBJDIR)/CellWithNbrs.o \ $(OBJDIR)/RouterBase.o \ -$(OBJDIR)/gwf3.o \ -$(OBJDIR)/gwt1.o \ +$(OBJDIR)/gwf.o \ +$(OBJDIR)/gwt.o \ $(OBJDIR)/GridSorting.o \ $(OBJDIR)/GwfGwfExchange.o \ $(OBJDIR)/SerialRouter.o \ diff --git a/src/Exchange/GweGweExchange.f90 b/src/Exchange/exg-gwegwe.f90 similarity index 100% rename from src/Exchange/GweGweExchange.f90 rename to src/Exchange/exg-gwegwe.f90 diff --git a/src/Exchange/gwegweidm.f90 b/src/Exchange/exg-gwegweidm.f90 similarity index 100% rename from src/Exchange/gwegweidm.f90 rename to src/Exchange/exg-gwegweidm.f90 diff --git a/src/Exchange/GwfGweExchange.f90 b/src/Exchange/exg-gwfgwe.f90 similarity index 100% rename from src/Exchange/GwfGweExchange.f90 rename to src/Exchange/exg-gwfgwe.f90 diff --git a/src/Exchange/gwfgweidm.f90 b/src/Exchange/exg-gwfgweidm.f90 similarity index 100% rename from src/Exchange/gwfgweidm.f90 rename to src/Exchange/exg-gwfgweidm.f90 diff --git a/src/Exchange/GwfGwfExchange.f90 b/src/Exchange/exg-gwfgwf.f90 similarity index 100% rename from src/Exchange/GwfGwfExchange.f90 rename to src/Exchange/exg-gwfgwf.f90 diff --git a/src/Exchange/gwfgwfidm.f90 b/src/Exchange/exg-gwfgwfidm.f90 similarity index 100% rename from src/Exchange/gwfgwfidm.f90 rename to src/Exchange/exg-gwfgwfidm.f90 diff --git a/src/Exchange/GwfGwtExchange.f90 b/src/Exchange/exg-gwfgwt.f90 similarity index 100% rename from src/Exchange/GwfGwtExchange.f90 rename to src/Exchange/exg-gwfgwt.f90 diff --git a/src/Exchange/gwfgwtidm.f90 b/src/Exchange/exg-gwfgwtidm.f90 similarity index 100% rename from src/Exchange/gwfgwtidm.f90 rename to src/Exchange/exg-gwfgwtidm.f90 diff --git a/src/Exchange/GwtGwtExchange.f90 b/src/Exchange/exg-gwtgwt.f90 similarity index 100% rename from src/Exchange/GwtGwtExchange.f90 rename to src/Exchange/exg-gwtgwt.f90 diff --git a/src/Exchange/gwtgwtidm.f90 b/src/Exchange/exg-gwtgwtidm.f90 similarity index 100% rename from src/Exchange/gwtgwtidm.f90 rename to src/Exchange/exg-gwtgwtidm.f90 diff --git a/src/Exchange/SwfGwfExchange.f90 b/src/Exchange/exg-swfgwf.f90 similarity index 100% rename from src/Exchange/SwfGwfExchange.f90 rename to src/Exchange/exg-swfgwf.f90 diff --git a/src/Exchange/swfgwfidm.f90 b/src/Exchange/exg-swfgwfidm.f90 similarity index 100% rename from src/Exchange/swfgwfidm.f90 rename to src/Exchange/exg-swfgwfidm.f90 diff --git a/src/Model/GroundWaterEnergy/gwe1cnd1.f90 b/src/Model/GroundWaterEnergy/gwe-cnd.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe1cnd1.f90 rename to src/Model/GroundWaterEnergy/gwe-cnd.f90 diff --git a/src/Model/GroundWaterEnergy/gwe1cnd1idm.f90 b/src/Model/GroundWaterEnergy/gwe-cndidm.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe1cnd1idm.f90 rename to src/Model/GroundWaterEnergy/gwe-cndidm.f90 diff --git a/src/Model/GroundWaterEnergy/gwe1ctp1.f90 b/src/Model/GroundWaterEnergy/gwe-ctp.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe1ctp1.f90 rename to src/Model/GroundWaterEnergy/gwe-ctp.f90 diff --git a/src/Model/GroundWaterEnergy/gwe1ctp1idm.f90 b/src/Model/GroundWaterEnergy/gwe-ctpidm.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe1ctp1idm.f90 rename to src/Model/GroundWaterEnergy/gwe-ctpidm.f90 diff --git a/src/Model/GroundWaterEnergy/gwe1dis1idm.f90 b/src/Model/GroundWaterEnergy/gwe-disidm.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe1dis1idm.f90 rename to src/Model/GroundWaterEnergy/gwe-disidm.f90 diff --git a/src/Model/GroundWaterEnergy/gwe1disu1idm.f90 b/src/Model/GroundWaterEnergy/gwe-disuidm.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe1disu1idm.f90 rename to src/Model/GroundWaterEnergy/gwe-disuidm.f90 diff --git a/src/Model/GroundWaterEnergy/gwe1disv1idm.f90 b/src/Model/GroundWaterEnergy/gwe-disvidm.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe1disv1idm.f90 rename to src/Model/GroundWaterEnergy/gwe-disvidm.f90 diff --git a/src/Model/GroundWaterEnergy/gwe1esl1.f90 b/src/Model/GroundWaterEnergy/gwe-esl.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe1esl1.f90 rename to src/Model/GroundWaterEnergy/gwe-esl.f90 diff --git a/src/Model/GroundWaterEnergy/gwe1est1.f90 b/src/Model/GroundWaterEnergy/gwe-est.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe1est1.f90 rename to src/Model/GroundWaterEnergy/gwe-est.f90 diff --git a/src/Model/GroundWaterEnergy/gwe1ic1idm.f90 b/src/Model/GroundWaterEnergy/gwe-icidm.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe1ic1idm.f90 rename to src/Model/GroundWaterEnergy/gwe-icidm.f90 diff --git a/src/Model/GroundWaterEnergy/gwe1lke1.f90 b/src/Model/GroundWaterEnergy/gwe-lke.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe1lke1.f90 rename to src/Model/GroundWaterEnergy/gwe-lke.f90 diff --git a/src/Model/GroundWaterEnergy/gwe1mwe1.f90 b/src/Model/GroundWaterEnergy/gwe-mwe.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe1mwe1.f90 rename to src/Model/GroundWaterEnergy/gwe-mwe.f90 diff --git a/src/Model/GroundWaterEnergy/gwe1idm.f90 b/src/Model/GroundWaterEnergy/gwe-namidm.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe1idm.f90 rename to src/Model/GroundWaterEnergy/gwe-namidm.f90 diff --git a/src/Model/GroundWaterEnergy/gwe1sfe1.f90 b/src/Model/GroundWaterEnergy/gwe-sfe.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe1sfe1.f90 rename to src/Model/GroundWaterEnergy/gwe-sfe.f90 diff --git a/src/Model/GroundWaterEnergy/gwe1uze1.f90 b/src/Model/GroundWaterEnergy/gwe-uze.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe1uze1.f90 rename to src/Model/GroundWaterEnergy/gwe-uze.f90 diff --git a/src/Model/GroundWaterEnergy/gwe1.f90 b/src/Model/GroundWaterEnergy/gwe.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe1.f90 rename to src/Model/GroundWaterEnergy/gwe.f90 diff --git a/src/Model/GroundWaterFlow/gwf3tvbase8.f90 b/src/Model/GroundWaterFlow/TvBase.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3tvbase8.f90 rename to src/Model/GroundWaterFlow/TvBase.f90 diff --git a/src/Model/GroundWaterFlow/gwf3api8.f90 b/src/Model/GroundWaterFlow/gwf-api.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3api8.f90 rename to src/Model/GroundWaterFlow/gwf-api.f90 diff --git a/src/Model/GroundWaterFlow/gwf3buy8.f90 b/src/Model/GroundWaterFlow/gwf-buy.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3buy8.f90 rename to src/Model/GroundWaterFlow/gwf-buy.f90 diff --git a/src/Model/GroundWaterFlow/gwf3chd8.f90 b/src/Model/GroundWaterFlow/gwf-chd.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3chd8.f90 rename to src/Model/GroundWaterFlow/gwf-chd.f90 diff --git a/src/Model/GroundWaterFlow/gwf3chd8idm.f90 b/src/Model/GroundWaterFlow/gwf-chdidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3chd8idm.f90 rename to src/Model/GroundWaterFlow/gwf-chdidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf3csub8.f90 b/src/Model/GroundWaterFlow/gwf-csub.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3csub8.f90 rename to src/Model/GroundWaterFlow/gwf-csub.f90 diff --git a/src/Model/GroundWaterFlow/gwf3dis8.f90 b/src/Model/GroundWaterFlow/gwf-dis.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3dis8.f90 rename to src/Model/GroundWaterFlow/gwf-dis.f90 diff --git a/src/Model/GroundWaterFlow/gwf3dis8idm.f90 b/src/Model/GroundWaterFlow/gwf-disidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3dis8idm.f90 rename to src/Model/GroundWaterFlow/gwf-disidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf3disu8.f90 b/src/Model/GroundWaterFlow/gwf-disu.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3disu8.f90 rename to src/Model/GroundWaterFlow/gwf-disu.f90 diff --git a/src/Model/GroundWaterFlow/gwf3disu8idm.f90 b/src/Model/GroundWaterFlow/gwf-disuidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3disu8idm.f90 rename to src/Model/GroundWaterFlow/gwf-disuidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf3disv8.f90 b/src/Model/GroundWaterFlow/gwf-disv.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3disv8.f90 rename to src/Model/GroundWaterFlow/gwf-disv.f90 diff --git a/src/Model/GroundWaterFlow/gwf3disv8idm.f90 b/src/Model/GroundWaterFlow/gwf-disvidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3disv8idm.f90 rename to src/Model/GroundWaterFlow/gwf-disvidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf3drn8.f90 b/src/Model/GroundWaterFlow/gwf-drn.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3drn8.f90 rename to src/Model/GroundWaterFlow/gwf-drn.f90 diff --git a/src/Model/GroundWaterFlow/gwf3drn8idm.f90 b/src/Model/GroundWaterFlow/gwf-drnidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3drn8idm.f90 rename to src/Model/GroundWaterFlow/gwf-drnidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf3evt8.f90 b/src/Model/GroundWaterFlow/gwf-evt.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3evt8.f90 rename to src/Model/GroundWaterFlow/gwf-evt.f90 diff --git a/src/Model/GroundWaterFlow/gwf3evta8idm.f90 b/src/Model/GroundWaterFlow/gwf-evtaidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3evta8idm.f90 rename to src/Model/GroundWaterFlow/gwf-evtaidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf3evt8idm.f90 b/src/Model/GroundWaterFlow/gwf-evtidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3evt8idm.f90 rename to src/Model/GroundWaterFlow/gwf-evtidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf3ghb8.f90 b/src/Model/GroundWaterFlow/gwf-ghb.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3ghb8.f90 rename to src/Model/GroundWaterFlow/gwf-ghb.f90 diff --git a/src/Model/GroundWaterFlow/gwf3ghb8idm.f90 b/src/Model/GroundWaterFlow/gwf-ghbidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3ghb8idm.f90 rename to src/Model/GroundWaterFlow/gwf-ghbidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf3hfb8.f90 b/src/Model/GroundWaterFlow/gwf-hfb.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3hfb8.f90 rename to src/Model/GroundWaterFlow/gwf-hfb.f90 diff --git a/src/Model/GroundWaterFlow/gwf3ic8.f90 b/src/Model/GroundWaterFlow/gwf-ic.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3ic8.f90 rename to src/Model/GroundWaterFlow/gwf-ic.f90 diff --git a/src/Model/GroundWaterFlow/gwf3ic8idm.f90 b/src/Model/GroundWaterFlow/gwf-icidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3ic8idm.f90 rename to src/Model/GroundWaterFlow/gwf-icidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf3lak8.f90 b/src/Model/GroundWaterFlow/gwf-lak.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3lak8.f90 rename to src/Model/GroundWaterFlow/gwf-lak.f90 diff --git a/src/Model/GroundWaterFlow/gwf3maw8.f90 b/src/Model/GroundWaterFlow/gwf-maw.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3maw8.f90 rename to src/Model/GroundWaterFlow/gwf-maw.f90 diff --git a/src/Model/GroundWaterFlow/gwf3mvr8.f90 b/src/Model/GroundWaterFlow/gwf-mvr.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3mvr8.f90 rename to src/Model/GroundWaterFlow/gwf-mvr.f90 diff --git a/src/Model/GroundWaterFlow/gwf3idm.f90 b/src/Model/GroundWaterFlow/gwf-namidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3idm.f90 rename to src/Model/GroundWaterFlow/gwf-namidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf3npf8.f90 b/src/Model/GroundWaterFlow/gwf-npf.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3npf8.f90 rename to src/Model/GroundWaterFlow/gwf-npf.f90 diff --git a/src/Model/GroundWaterFlow/gwf3npf8idm.f90 b/src/Model/GroundWaterFlow/gwf-npfidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3npf8idm.f90 rename to src/Model/GroundWaterFlow/gwf-npfidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf3obs8.f90 b/src/Model/GroundWaterFlow/gwf-obs.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3obs8.f90 rename to src/Model/GroundWaterFlow/gwf-obs.f90 diff --git a/src/Model/GroundWaterFlow/gwf3oc8.f90 b/src/Model/GroundWaterFlow/gwf-oc.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3oc8.f90 rename to src/Model/GroundWaterFlow/gwf-oc.f90 diff --git a/src/Model/GroundWaterFlow/gwf3rch8.f90 b/src/Model/GroundWaterFlow/gwf-rch.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3rch8.f90 rename to src/Model/GroundWaterFlow/gwf-rch.f90 diff --git a/src/Model/GroundWaterFlow/gwf3rcha8idm.f90 b/src/Model/GroundWaterFlow/gwf-rchaidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3rcha8idm.f90 rename to src/Model/GroundWaterFlow/gwf-rchaidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf3rch8idm.f90 b/src/Model/GroundWaterFlow/gwf-rchidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3rch8idm.f90 rename to src/Model/GroundWaterFlow/gwf-rchidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf3riv8.f90 b/src/Model/GroundWaterFlow/gwf-riv.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3riv8.f90 rename to src/Model/GroundWaterFlow/gwf-riv.f90 diff --git a/src/Model/GroundWaterFlow/gwf3riv8idm.f90 b/src/Model/GroundWaterFlow/gwf-rividm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3riv8idm.f90 rename to src/Model/GroundWaterFlow/gwf-rividm.f90 diff --git a/src/Model/GroundWaterFlow/gwf3sfr8.f90 b/src/Model/GroundWaterFlow/gwf-sfr.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3sfr8.f90 rename to src/Model/GroundWaterFlow/gwf-sfr.f90 diff --git a/src/Model/GroundWaterFlow/gwf3sto8.f90 b/src/Model/GroundWaterFlow/gwf-sto.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3sto8.f90 rename to src/Model/GroundWaterFlow/gwf-sto.f90 diff --git a/src/Model/GroundWaterFlow/gwf3tvk8.f90 b/src/Model/GroundWaterFlow/gwf-tvk.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3tvk8.f90 rename to src/Model/GroundWaterFlow/gwf-tvk.f90 diff --git a/src/Model/GroundWaterFlow/gwf3tvs8.f90 b/src/Model/GroundWaterFlow/gwf-tvs.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3tvs8.f90 rename to src/Model/GroundWaterFlow/gwf-tvs.f90 diff --git a/src/Model/GroundWaterFlow/gwf3uzf8.f90 b/src/Model/GroundWaterFlow/gwf-uzf.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3uzf8.f90 rename to src/Model/GroundWaterFlow/gwf-uzf.f90 diff --git a/src/Model/GroundWaterFlow/gwf3vsc8.f90 b/src/Model/GroundWaterFlow/gwf-vsc.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3vsc8.f90 rename to src/Model/GroundWaterFlow/gwf-vsc.f90 diff --git a/src/Model/GroundWaterFlow/gwf3wel8.f90 b/src/Model/GroundWaterFlow/gwf-wel.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3wel8.f90 rename to src/Model/GroundWaterFlow/gwf-wel.f90 diff --git a/src/Model/GroundWaterFlow/gwf3wel8idm.f90 b/src/Model/GroundWaterFlow/gwf-welidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf3wel8idm.f90 rename to src/Model/GroundWaterFlow/gwf-welidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf3.f90 b/src/Model/GroundWaterFlow/gwf.f90 similarity index 99% rename from src/Model/GroundWaterFlow/gwf3.f90 rename to src/Model/GroundWaterFlow/gwf.f90 index 00b44227c06..465baf62930 100644 --- a/src/Model/GroundWaterFlow/gwf3.f90 +++ b/src/Model/GroundWaterFlow/gwf.f90 @@ -1175,7 +1175,7 @@ end subroutine gwf_da !> @brief GroundWater Flow Model Budget Entry !! !! This subroutine adds a budget entry to the flow budget. It was added as - !! a method for the gwf3 model object so that the exchange object could add its + !! a method for the gwf model object so that the exchange object could add its !! contributions. !! !! (1) adds the entry to the budget object diff --git a/src/Model/GroundWaterTransport/gwt1cnc1.f90 b/src/Model/GroundWaterTransport/gwt-cnc.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1cnc1.f90 rename to src/Model/GroundWaterTransport/gwt-cnc.f90 diff --git a/src/Model/GroundWaterTransport/gwt1cnc1idm.f90 b/src/Model/GroundWaterTransport/gwt-cncidm.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1cnc1idm.f90 rename to src/Model/GroundWaterTransport/gwt-cncidm.f90 diff --git a/src/Model/GroundWaterTransport/gwt1dis1idm.f90 b/src/Model/GroundWaterTransport/gwt-disidm.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1dis1idm.f90 rename to src/Model/GroundWaterTransport/gwt-disidm.f90 diff --git a/src/Model/GroundWaterTransport/gwt1disu1idm.f90 b/src/Model/GroundWaterTransport/gwt-disuidm.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1disu1idm.f90 rename to src/Model/GroundWaterTransport/gwt-disuidm.f90 diff --git a/src/Model/GroundWaterTransport/gwt1disv1idm.f90 b/src/Model/GroundWaterTransport/gwt-disvidm.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1disv1idm.f90 rename to src/Model/GroundWaterTransport/gwt-disvidm.f90 diff --git a/src/Model/GroundWaterTransport/gwt1dsp1.f90 b/src/Model/GroundWaterTransport/gwt-dsp.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1dsp1.f90 rename to src/Model/GroundWaterTransport/gwt-dsp.f90 diff --git a/src/Model/GroundWaterTransport/gwt1dsp1idm.f90 b/src/Model/GroundWaterTransport/gwt-dspidm.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1dsp1idm.f90 rename to src/Model/GroundWaterTransport/gwt-dspidm.f90 diff --git a/src/Model/GroundWaterTransport/gwt1ic1idm.f90 b/src/Model/GroundWaterTransport/gwt-icidm.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1ic1idm.f90 rename to src/Model/GroundWaterTransport/gwt-icidm.f90 diff --git a/src/Model/GroundWaterTransport/gwt1ist1.f90 b/src/Model/GroundWaterTransport/gwt-ist.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1ist1.f90 rename to src/Model/GroundWaterTransport/gwt-ist.f90 diff --git a/src/Model/GroundWaterTransport/gwt1lkt1.f90 b/src/Model/GroundWaterTransport/gwt-lkt.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1lkt1.f90 rename to src/Model/GroundWaterTransport/gwt-lkt.f90 diff --git a/src/Model/GroundWaterTransport/gwt1mst1.f90 b/src/Model/GroundWaterTransport/gwt-mst.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1mst1.f90 rename to src/Model/GroundWaterTransport/gwt-mst.f90 diff --git a/src/Model/GroundWaterTransport/gwt1mwt1.f90 b/src/Model/GroundWaterTransport/gwt-mwt.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1mwt1.f90 rename to src/Model/GroundWaterTransport/gwt-mwt.f90 diff --git a/src/Model/GroundWaterTransport/gwt1idm.f90 b/src/Model/GroundWaterTransport/gwt-namidm.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1idm.f90 rename to src/Model/GroundWaterTransport/gwt-namidm.f90 diff --git a/src/Model/GroundWaterTransport/gwt1sft1.f90 b/src/Model/GroundWaterTransport/gwt-sft.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1sft1.f90 rename to src/Model/GroundWaterTransport/gwt-sft.f90 diff --git a/src/Model/GroundWaterTransport/gwt1src1.f90 b/src/Model/GroundWaterTransport/gwt-src.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1src1.f90 rename to src/Model/GroundWaterTransport/gwt-src.f90 diff --git a/src/Model/GroundWaterTransport/gwt1uzt1.f90 b/src/Model/GroundWaterTransport/gwt-uzt.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1uzt1.f90 rename to src/Model/GroundWaterTransport/gwt-uzt.f90 diff --git a/src/Model/GroundWaterTransport/gwt1.f90 b/src/Model/GroundWaterTransport/gwt.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt1.f90 rename to src/Model/GroundWaterTransport/gwt.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1chd1idm.f90 b/src/Model/SurfaceWaterFlow/swf-chdidm.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1chd1idm.f90 rename to src/Model/SurfaceWaterFlow/swf-chdidm.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1cxs1.f90 b/src/Model/SurfaceWaterFlow/swf-cxs.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1cxs1.f90 rename to src/Model/SurfaceWaterFlow/swf-cxs.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1cxs1idm.f90 b/src/Model/SurfaceWaterFlow/swf-cxsidm.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1cxs1idm.f90 rename to src/Model/SurfaceWaterFlow/swf-cxsidm.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1dfw1.f90 b/src/Model/SurfaceWaterFlow/swf-dfw.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1dfw1.f90 rename to src/Model/SurfaceWaterFlow/swf-dfw.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1dfw1idm.f90 b/src/Model/SurfaceWaterFlow/swf-dfwidm.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1dfw1idm.f90 rename to src/Model/SurfaceWaterFlow/swf-dfwidm.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1disl1.f90 b/src/Model/SurfaceWaterFlow/swf-disl.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1disl1.f90 rename to src/Model/SurfaceWaterFlow/swf-disl.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1disl1idm.f90 b/src/Model/SurfaceWaterFlow/swf-dislidm.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1disl1idm.f90 rename to src/Model/SurfaceWaterFlow/swf-dislidm.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1flw1.f90 b/src/Model/SurfaceWaterFlow/swf-flw.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1flw1.f90 rename to src/Model/SurfaceWaterFlow/swf-flw.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1flw1idm.f90 b/src/Model/SurfaceWaterFlow/swf-flwidm.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1flw1idm.f90 rename to src/Model/SurfaceWaterFlow/swf-flwidm.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1ic1.f90 b/src/Model/SurfaceWaterFlow/swf-ic.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1ic1.f90 rename to src/Model/SurfaceWaterFlow/swf-ic.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1ic1idm.f90 b/src/Model/SurfaceWaterFlow/swf-icidm.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1ic1idm.f90 rename to src/Model/SurfaceWaterFlow/swf-icidm.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1idm.f90 b/src/Model/SurfaceWaterFlow/swf-namidm.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1idm.f90 rename to src/Model/SurfaceWaterFlow/swf-namidm.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1obs1.f90 b/src/Model/SurfaceWaterFlow/swf-obs.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1obs1.f90 rename to src/Model/SurfaceWaterFlow/swf-obs.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1oc1.f90 b/src/Model/SurfaceWaterFlow/swf-oc.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1oc1.f90 rename to src/Model/SurfaceWaterFlow/swf-oc.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1sto1.f90 b/src/Model/SurfaceWaterFlow/swf-sto.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1sto1.f90 rename to src/Model/SurfaceWaterFlow/swf-sto.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1zdg1.f90 b/src/Model/SurfaceWaterFlow/swf-zdg.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1zdg1.f90 rename to src/Model/SurfaceWaterFlow/swf-zdg.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1zdg1idm.f90 b/src/Model/SurfaceWaterFlow/swf-zdgidm.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1zdg1idm.f90 rename to src/Model/SurfaceWaterFlow/swf-zdgidm.f90 diff --git a/src/Model/SurfaceWaterFlow/swf1.f90 b/src/Model/SurfaceWaterFlow/swf.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf1.f90 rename to src/Model/SurfaceWaterFlow/swf.f90 diff --git a/src/Model/TransportModel/tsp1adv1.f90 b/src/Model/TransportModel/tsp-adv.f90 similarity index 100% rename from src/Model/TransportModel/tsp1adv1.f90 rename to src/Model/TransportModel/tsp-adv.f90 diff --git a/src/Model/TransportModel/tsp1apt1.f90 b/src/Model/TransportModel/tsp-apt.f90 similarity index 100% rename from src/Model/TransportModel/tsp1apt1.f90 rename to src/Model/TransportModel/tsp-apt.f90 diff --git a/src/Model/TransportModel/tsp1fmi1.f90 b/src/Model/TransportModel/tsp-fmi.f90 similarity index 100% rename from src/Model/TransportModel/tsp1fmi1.f90 rename to src/Model/TransportModel/tsp-fmi.f90 diff --git a/src/Model/TransportModel/tsp1ic1.f90 b/src/Model/TransportModel/tsp-ic.f90 similarity index 100% rename from src/Model/TransportModel/tsp1ic1.f90 rename to src/Model/TransportModel/tsp-ic.f90 diff --git a/src/Model/TransportModel/tsp1mvt1.f90 b/src/Model/TransportModel/tsp-mvt.f90 similarity index 100% rename from src/Model/TransportModel/tsp1mvt1.f90 rename to src/Model/TransportModel/tsp-mvt.f90 diff --git a/src/Model/TransportModel/tsp1obs1.f90 b/src/Model/TransportModel/tsp-obs.f90 similarity index 100% rename from src/Model/TransportModel/tsp1obs1.f90 rename to src/Model/TransportModel/tsp-obs.f90 diff --git a/src/Model/TransportModel/tsp1oc1.f90 b/src/Model/TransportModel/tsp-oc.f90 similarity index 100% rename from src/Model/TransportModel/tsp1oc1.f90 rename to src/Model/TransportModel/tsp-oc.f90 diff --git a/src/Model/TransportModel/tsp1ssm1.f90 b/src/Model/TransportModel/tsp-ssm.f90 similarity index 100% rename from src/Model/TransportModel/tsp1ssm1.f90 rename to src/Model/TransportModel/tsp-ssm.f90 diff --git a/src/Model/TransportModel/tsp1.f90 b/src/Model/TransportModel/tsp.f90 similarity index 100% rename from src/Model/TransportModel/tsp1.f90 rename to src/Model/TransportModel/tsp.f90 diff --git a/src/Solution/LinearMethods/ims8linear.f90 b/src/Solution/LinearMethods/ImsLinear.f90 similarity index 100% rename from src/Solution/LinearMethods/ims8linear.f90 rename to src/Solution/LinearMethods/ImsLinear.f90 diff --git a/src/Solution/LinearMethods/ims8base.f90 b/src/Solution/LinearMethods/ImsLinearBase.f90 similarity index 100% rename from src/Solution/LinearMethods/ims8base.f90 rename to src/Solution/LinearMethods/ImsLinearBase.f90 diff --git a/src/Solution/LinearMethods/ims8misc.f90 b/src/Solution/LinearMethods/ImsLinearMisc.f90 similarity index 100% rename from src/Solution/LinearMethods/ims8misc.f90 rename to src/Solution/LinearMethods/ImsLinearMisc.f90 diff --git a/src/Solution/LinearMethods/ims8reordering.f90 b/src/Solution/LinearMethods/ImsReordering.f90 similarity index 100% rename from src/Solution/LinearMethods/ims8reordering.f90 rename to src/Solution/LinearMethods/ImsReordering.f90 diff --git a/src/Utilities/Observation/Obs3.f90 b/src/Utilities/Observation/Obs.f90 similarity index 100% rename from src/Utilities/Observation/Obs3.f90 rename to src/Utilities/Observation/Obs.f90 diff --git a/src/meson.build b/src/meson.build index dd175861e2f..92a1fef28bb 100644 --- a/src/meson.build +++ b/src/meson.build @@ -30,20 +30,20 @@ modflow_sources = files( 'Exchange' / 'BaseExchange.f90', 'Exchange' / 'DisConnExchange.f90', 'Exchange' / 'GhostNode.f90', - 'Exchange' / 'GweGweExchange.f90', 'Exchange' / 'GwfExchangeMover.f90', - 'Exchange' / 'GwfGweExchange.f90', - 'Exchange' / 'GwfGwfExchange.f90', - 'Exchange' / 'GwfGwtExchange.f90', - 'Exchange' / 'GwtGwtExchange.f90', 'Exchange' / 'NumericalExchange.f90', - 'Exchange' / 'gwfgwfidm.f90', - 'Exchange' / 'gwfgwtidm.f90', - 'Exchange' / 'gwfgweidm.f90', - 'Exchange' / 'gwtgwtidm.f90', - 'Exchange' / 'gwegweidm.f90', - 'Exchange' / 'SwfGwfExchange.f90', - 'Exchange' / 'swfgwfidm.f90', + 'Exchange' / 'exg-gwfgwe.f90', + 'Exchange' / 'exg-gwfgwf.f90', + 'Exchange' / 'exg-gwfgwt.f90', + 'Exchange' / 'exg-gwtgwt.f90', + 'Exchange' / 'exg-gwegwe.f90', + 'Exchange' / 'exg-swfgwf.f90', + 'Exchange' / 'exg-gwfgwfidm.f90', + 'Exchange' / 'exg-gwfgwtidm.f90', + 'Exchange' / 'exg-gwtgwtidm.f90', + 'Exchange' / 'exg-gwfgweidm.f90', + 'Exchange' / 'exg-gwegweidm.f90', + 'Exchange' / 'exg-swfgwfidm.f90', 'Model' / 'Connection' / 'ConnectionBuilder.f90', 'Model' / 'Connection' / 'CellWithNbrs.f90', 'Model' / 'Connection' / 'CsrUtils.f90', @@ -60,108 +60,108 @@ modflow_sources = files( 'Model' / 'Geometry' / 'BaseGeometry.f90', 'Model' / 'Geometry' / 'CircularGeometry.f90', 'Model' / 'Geometry' / 'RectangularGeometry.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe1.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe1cnd1.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe1cnd1idm.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe1ctp1.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe1ctp1idm.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe1dis1idm.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe1disu1idm.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe1disv1idm.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe1esl1.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe1est1.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe1ic1idm.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe1idm.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe1lke1.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe1mwe1.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe1sfe1.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe1uze1.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3api8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3buy8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3chd8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3chd8idm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3csub8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3dis8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3dis8idm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3disu8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3disu8idm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3disv8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3disv8idm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3drn8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3drn8idm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3evt8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3evt8idm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3evta8idm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3ghb8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3ghb8idm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3hfb8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3ic8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3ic8idm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3idm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3lak8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3maw8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3mvr8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3npf8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3npf8idm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3obs8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3oc8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3rch8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3rch8idm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3rcha8idm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3riv8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3riv8idm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3sfr8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3sto8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3tvbase8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3tvk8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3tvs8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3uzf8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3vsc8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3wel8.f90', - 'Model' / 'GroundWaterFlow' / 'gwf3wel8idm.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1cnc1.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1cnc1idm.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1dis1idm.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1disu1idm.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1disv1idm.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1dsp1.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1dsp1idm.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1ic1idm.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1idm.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1ist1.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1lkt1.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1mst1.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1mwt1.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1sft1.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1src1.f90', - 'Model' / 'GroundWaterTransport' / 'gwt1uzt1.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1disl1.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1disl1idm.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1idm.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1cxs1.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1cxs1idm.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1dfw1.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1dfw1idm.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1ic1.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1ic1idm.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1obs1.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1oc1.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1flw1.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1flw1idm.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1chd1idm.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1sto1.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1zdg1.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf1zdg1idm.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe-cnd.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe-cndidm.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe-ctp.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe-ctpidm.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe-disidm.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe-disuidm.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe-disvidm.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe-esl.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe-est.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe-icidm.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe-namidm.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe-lke.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe-mwe.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe-sfe.f90', + 'Model' / 'GroundWaterEnergy' / 'gwe-uze.f90', + 'Model' / 'GroundWaterFlow' / 'gwf.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-api.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-buy.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-chd.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-chdidm.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-csub.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-dis.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-disidm.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-disu.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-disuidm.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-disv.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-disvidm.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-drn.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-drnidm.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-evt.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-evtidm.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-evtaidm.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-ghb.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-ghbidm.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-hfb.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-ic.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-icidm.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-namidm.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-lak.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-maw.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-mvr.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-npf.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-npfidm.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-obs.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-oc.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-rch.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-rchidm.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-rchaidm.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-riv.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-rividm.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-sfr.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-sto.f90', + 'Model' / 'GroundWaterFlow' / 'TvBase.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-tvk.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-tvs.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-uzf.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-vsc.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-wel.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-welidm.f90', + 'Model' / 'GroundWaterTransport' / 'gwt.f90', + 'Model' / 'GroundWaterTransport' / 'gwt-cnc.f90', + 'Model' / 'GroundWaterTransport' / 'gwt-cncidm.f90', + 'Model' / 'GroundWaterTransport' / 'gwt-disidm.f90', + 'Model' / 'GroundWaterTransport' / 'gwt-disuidm.f90', + 'Model' / 'GroundWaterTransport' / 'gwt-disvidm.f90', + 'Model' / 'GroundWaterTransport' / 'gwt-dsp.f90', + 'Model' / 'GroundWaterTransport' / 'gwt-dspidm.f90', + 'Model' / 'GroundWaterTransport' / 'gwt-icidm.f90', + 'Model' / 'GroundWaterTransport' / 'gwt-namidm.f90', + 'Model' / 'GroundWaterTransport' / 'gwt-ist.f90', + 'Model' / 'GroundWaterTransport' / 'gwt-lkt.f90', + 'Model' / 'GroundWaterTransport' / 'gwt-mst.f90', + 'Model' / 'GroundWaterTransport' / 'gwt-mwt.f90', + 'Model' / 'GroundWaterTransport' / 'gwt-sft.f90', + 'Model' / 'GroundWaterTransport' / 'gwt-src.f90', + 'Model' / 'GroundWaterTransport' / 'gwt-uzt.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-disl.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-dislidm.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-namidm.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-cxs.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-cxsidm.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-dfw.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-dfwidm.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-ic.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-icidm.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-obs.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-oc.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-flw.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-flwidm.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-chdidm.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-sto.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-zdg.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-zdgidm.f90', 'Model' / 'ModelUtilities' / 'BoundaryPackage.f90', 'Model' / 'ModelUtilities' / 'BoundaryPackageExt.f90', 'Model' / 'ModelUtilities' / 'GweCndOptions.f90', 'Model' / 'ModelUtilities' / 'Connections.f90', 'Model' / 'ModelUtilities' / 'DiscretizationBase.f90', - 'Model' / 'ModelUtilities' / 'DislGeom.f90', 'Model' / 'ModelUtilities' / 'DisvGeom.f90', + 'Model' / 'ModelUtilities' / 'DislGeom.f90', 'Model' / 'ModelUtilities' / 'FlowModelInterface.f90', 'Model' / 'ModelUtilities' / 'GweInputData.f90', 'Model' / 'ModelUtilities' / 'GwfBuyInputData.f90', @@ -176,30 +176,30 @@ modflow_sources = files( 'Model' / 'ModelUtilities' / 'PackageMover.f90', 'Model' / 'ModelUtilities' / 'SfrCrossSectionManager.f90', 'Model' / 'ModelUtilities' / 'SfrCrossSectionUtils.f90', - 'Model' / 'ModelUtilities' / 'TspAdvOptions.f90', 'Model' / 'ModelUtilities' / 'SwfCxsUtils.f90', + 'Model' / 'ModelUtilities' / 'TspAdvOptions.f90', 'Model' / 'ModelUtilities' / 'UzfCellGroup.f90', 'Model' / 'ModelUtilities' / 'Xt3dAlgorithm.f90', 'Model' / 'ModelUtilities' / 'Xt3dInterface.f90', - 'Model' / 'TransportModel' / 'tsp1.f90', - 'Model' / 'TransportModel' / 'tsp1adv1.f90', - 'Model' / 'TransportModel' / 'tsp1apt1.f90', - 'Model' / 'TransportModel' / 'tsp1fmi1.f90', - 'Model' / 'TransportModel' / 'tsp1ic1.f90', - 'Model' / 'TransportModel' / 'tsp1obs1.f90', - 'Model' / 'TransportModel' / 'tsp1oc1.f90', - 'Model' / 'TransportModel' / 'tsp1mvt1.f90', - 'Model' / 'TransportModel' / 'tsp1ssm1.f90', + 'Model' / 'TransportModel' / 'tsp.f90', + 'Model' / 'TransportModel' / 'tsp-adv.f90', + 'Model' / 'TransportModel' / 'tsp-apt.f90', + 'Model' / 'TransportModel' / 'tsp-fmi.f90', + 'Model' / 'TransportModel' / 'tsp-ic.f90', + 'Model' / 'TransportModel' / 'tsp-obs.f90', + 'Model' / 'TransportModel' / 'tsp-oc.f90', + 'Model' / 'TransportModel' / 'tsp-mvt.f90', + 'Model' / 'TransportModel' / 'tsp-ssm.f90', 'Model' / 'BaseModel.f90', 'Model' / 'ExplicitModel.f90', 'Model' / 'NumericalModel.f90', 'Model' / 'NumericalPackage.f90', 'Solution' / 'ConvergenceSummary.f90', 'Solution' / 'LinearMethods' / 'ImsLinearSettings.f90', - 'Solution' / 'LinearMethods' / 'ims8base.f90', - 'Solution' / 'LinearMethods' / 'ims8linear.f90', - 'Solution' / 'LinearMethods' / 'ims8reordering.f90', - 'Solution' / 'LinearMethods' / 'ims8misc.f90', + 'Solution' / 'LinearMethods' / 'ImsLinearBase.f90', + 'Solution' / 'LinearMethods' / 'ImsLinear.f90', + 'Solution' / 'LinearMethods' / 'ImsReordering.f90', + 'Solution' / 'LinearMethods' / 'ImsLinearMisc.f90', 'Solution' / 'LinearMethods' / 'ImsLinearSolver.f90', 'Solution' / 'BaseSolution.f90', 'Solution' / 'ExplicitSolution.f90', @@ -239,8 +239,8 @@ modflow_sources = files( 'Utilities' / 'Idm' / 'selector' / 'IdmGweDfnSelector.f90', 'Utilities' / 'Idm' / 'selector' / 'IdmGwfDfnSelector.f90', 'Utilities' / 'Idm' / 'selector' / 'IdmGwtDfnSelector.f90', - 'Utilities' / 'Idm' / 'selector' / 'IdmSimDfnSelector.f90', 'Utilities' / 'Idm' / 'selector' / 'IdmSwfDfnSelector.f90', + 'Utilities' / 'Idm' / 'selector' / 'IdmSimDfnSelector.f90', 'Utilities' / 'Matrix' / 'MatrixBase.f90', 'Utilities' / 'Matrix' / 'SparseMatrix.f90', 'Utilities' / 'Memory' / 'Memory.f90', @@ -249,7 +249,7 @@ modflow_sources = files( 'Utilities' / 'Memory' / 'MemoryManager.f90', 'Utilities' / 'Memory' / 'MemoryManagerExt.f90', 'Utilities' / 'Memory' / 'MemorySetHandler.f90', - 'Utilities' / 'Observation' / 'Obs3.f90', + 'Utilities' / 'Observation' / 'Obs.f90', 'Utilities' / 'Observation' / 'ObsContainer.f90', 'Utilities' / 'Observation' / 'Observe.f90', 'Utilities' / 'Observation' / 'ObsOutput.f90', @@ -310,7 +310,7 @@ modflow_sources = files( 'Utilities' / 'version.f90', 'mf6core.f90', 'mf6lists.f90', - 'simnamidm.f90', + 'sim-namidm.f90', 'SimulationCreate.f90', 'RunControl.f90', 'RunControlFactory.F90' diff --git a/src/simnamidm.f90 b/src/sim-namidm.f90 similarity index 100% rename from src/simnamidm.f90 rename to src/sim-namidm.f90 diff --git a/utils/idmloader/scripts/dfn2f90.py b/utils/idmloader/scripts/dfn2f90.py index 6c09fdb8714..5dce00f5025 100644 --- a/utils/idmloader/scripts/dfn2f90.py +++ b/utils/idmloader/scripts/dfn2f90.py @@ -919,179 +919,179 @@ def _write_master_component(self, fh=None): # [relative path of input dnf, relative path of output f90 definition file] [ DFN_PATH / "gwf-chd.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf3chd8idm.f90", + SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-chdidm.f90", ], [ DFN_PATH / "gwf-dis.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf3dis8idm.f90", + SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-disidm.f90", ], [ DFN_PATH / "gwf-disu.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf3disu8idm.f90", + SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-disuidm.f90", ], [ DFN_PATH / "gwf-disv.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf3disv8idm.f90", + SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-disvidm.f90", ], [ DFN_PATH / "gwf-drn.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf3drn8idm.f90", + SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-drnidm.f90", ], [ DFN_PATH / "gwf-evt.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf3evt8idm.f90", + SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-evtidm.f90", ], [ DFN_PATH / "gwf-evta.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf3evta8idm.f90", + SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-evtaidm.f90", ], [ DFN_PATH / "gwf-ghb.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf3ghb8idm.f90", + SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-ghbidm.f90", ], [ DFN_PATH / "gwf-ic.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf3ic8idm.f90", + SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-icidm.f90", ], [ DFN_PATH / "gwf-npf.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf3npf8idm.f90", + SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-npfidm.f90", ], [ DFN_PATH / "gwf-rch.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf3rch8idm.f90", + SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-rchidm.f90", ], [ DFN_PATH / "gwf-rcha.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf3rcha8idm.f90", + SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-rchaidm.f90", ], [ DFN_PATH / "gwf-riv.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf3riv8idm.f90", + SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-rividm.f90", ], [ DFN_PATH / "gwf-wel.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf3wel8idm.f90", + SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-welidm.f90", ], [ DFN_PATH / "gwt-dis.dfn", - SRC_PATH / "Model" / "GroundWaterTransport" / "gwt1dis1idm.f90", + SRC_PATH / "Model" / "GroundWaterTransport" / "gwt-disidm.f90", ], [ DFN_PATH / "gwt-disu.dfn", - SRC_PATH / "Model" / "GroundWaterTransport" / "gwt1disu1idm.f90", + SRC_PATH / "Model" / "GroundWaterTransport" / "gwt-disuidm.f90", ], [ DFN_PATH / "gwt-disv.dfn", - SRC_PATH / "Model" / "GroundWaterTransport" / "gwt1disv1idm.f90", + SRC_PATH / "Model" / "GroundWaterTransport" / "gwt-disvidm.f90", ], [ DFN_PATH / "gwt-dsp.dfn", - SRC_PATH / "Model" / "GroundWaterTransport" / "gwt1dsp1idm.f90", + SRC_PATH / "Model" / "GroundWaterTransport" / "gwt-dspidm.f90", ], [ DFN_PATH / "gwt-cnc.dfn", - SRC_PATH / "Model" / "GroundWaterTransport" / "gwt1cnc1idm.f90", + SRC_PATH / "Model" / "GroundWaterTransport" / "gwt-cncidm.f90", ], [ DFN_PATH / "gwt-ic.dfn", - SRC_PATH / "Model" / "GroundWaterTransport" / "gwt1ic1idm.f90", + SRC_PATH / "Model" / "GroundWaterTransport" / "gwt-icidm.f90", ], [ DFN_PATH / "gwe-dis.dfn", - SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe1dis1idm.f90", + SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe-disidm.f90", ], [ DFN_PATH / "gwe-disu.dfn", - SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe1disu1idm.f90", + SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe-disuidm.f90", ], [ DFN_PATH / "gwe-disv.dfn", - SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe1disv1idm.f90", + SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe-disvidm.f90", ], [ DFN_PATH / "gwe-cnd.dfn", - SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe1cnd1idm.f90", + SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe-cndidm.f90", ], [ DFN_PATH / "gwe-ctp.dfn", - SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe1ctp1idm.f90", + SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe-ctpidm.f90", ], [ DFN_PATH / "gwe-ic.dfn", - SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe1ic1idm.f90", + SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe-icidm.f90", ], [ DFN_PATH / "gwf-nam.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf3idm.f90", + SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-namidm.f90", ], [ DFN_PATH / "gwt-nam.dfn", - SRC_PATH / "Model" / "GroundWaterTransport" / "gwt1idm.f90", + SRC_PATH / "Model" / "GroundWaterTransport" / "gwt-namidm.f90", ], [ DFN_PATH / "gwe-nam.dfn", - SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe1idm.f90", + SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe-namidm.f90", ], [ DFN_PATH / "exg-gwfgwf.dfn", - SRC_PATH / "Exchange" / "gwfgwfidm.f90", + SRC_PATH / "Exchange" / "exg-gwfgwfidm.f90", ], [ DFN_PATH / "exg-gwfgwt.dfn", - SRC_PATH / "Exchange" / "gwfgwtidm.f90", + SRC_PATH / "Exchange" / "exg-gwfgwtidm.f90", ], [ DFN_PATH / "exg-gwfgwe.dfn", - SRC_PATH / "Exchange" / "gwfgweidm.f90", + SRC_PATH / "Exchange" / "exg-gwfgweidm.f90", ], [ DFN_PATH / "exg-gwtgwt.dfn", - SRC_PATH / "Exchange" / "gwtgwtidm.f90", + SRC_PATH / "Exchange" / "exg-gwtgwtidm.f90", ], [ DFN_PATH / "exg-gwegwe.dfn", - SRC_PATH / "Exchange" / "gwegweidm.f90", + SRC_PATH / "Exchange" / "exg-gwegweidm.f90", ], [ DFN_PATH / "swf-nam.dfn", - SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf1idm.f90", + SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf-namidm.f90", ], [ DFN_PATH / "swf-disl.dfn", - SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf1disl1idm.f90", + SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf-dislidm.f90", ], [ DFN_PATH / "swf-cxs.dfn", - SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf1cxs1idm.f90", + SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf-cxsidm.f90", ], [ DFN_PATH / "swf-dfw.dfn", - SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf1dfw1idm.f90", + SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf-dfwidm.f90", ], [ DFN_PATH / "swf-ic.dfn", - SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf1ic1idm.f90", + SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf-icidm.f90", ], [ DFN_PATH / "swf-chd.dfn", - SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf1chd1idm.f90", + SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf-chdidm.f90", ], [ DFN_PATH / "swf-flw.dfn", - SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf1flw1idm.f90", + SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf-flwidm.f90", ], [ DFN_PATH / "swf-zdg.dfn", - SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf1zdg1idm.f90", + SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf-zdgidm.f90", ], [ DFN_PATH / "exg-swfgwf.dfn", - SRC_PATH / "Exchange" / "swfgwfidm.f90", + SRC_PATH / "Exchange" / "exg-swfgwfidm.f90", ], [ DFN_PATH / "sim-nam.dfn", - SRC_PATH / "simnamidm.f90", + SRC_PATH / "sim-namidm.f90", ], [ DFN_PATH / "sim-tdis.dfn", diff --git a/utils/mf5to6/make/makedefaults b/utils/mf5to6/make/makedefaults index 471ec1ebcae..482562ab0b7 100644 --- a/utils/mf5to6/make/makedefaults +++ b/utils/mf5to6/make/makedefaults @@ -1,4 +1,4 @@ -# makedefaults created by pymake (version 1.2.9.dev0) for the 'mf5to6' executable. +# makedefaults created by pymake (version 1.2.10.dev0) for the 'mf5to6' executable. # determine OS ifeq ($(OS), Windows_NT) @@ -57,11 +57,11 @@ OPTLEVEL ?= -O2 # set the fortran flags ifeq ($(detected_OS), Windows) ifeq ($(FC), gfortran) - FFLAGS ?= -static -fbacktrace $(OS_macro) -cpp + FFLAGS ?= -static -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid $(OS_macro) -cpp endif else ifeq ($(FC), gfortran) - FFLAGS ?= -fbacktrace $(OS_macro) -cpp + FFLAGS ?= -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid $(OS_macro) -cpp endif ifeq ($(FC), $(filter $(FC), ifort mpiifort)) FFLAGS ?= -no-heap-arrays -fpe0 -traceback -Qdiag-disable:7416 -Qdiag-disable:7025 -Qdiag-disable:5268 -fpp diff --git a/utils/mf5to6/make/makefile b/utils/mf5to6/make/makefile index 35c5c30f0a6..f99194fe0b9 100644 --- a/utils/mf5to6/make/makefile +++ b/utils/mf5to6/make/makefile @@ -1,4 +1,4 @@ -# makefile created by pymake (version 1.2.9.dev0) for the 'mf5to6' executable. +# makefile created by pymake (version 1.2.10.dev0) for the 'mf5to6' executable. include ./makedefaults diff --git a/utils/zonebudget/make/makedefaults b/utils/zonebudget/make/makedefaults index d53db57a948..dbbf549c9db 100644 --- a/utils/zonebudget/make/makedefaults +++ b/utils/zonebudget/make/makedefaults @@ -1,4 +1,4 @@ -# makedefaults created by pymake (version 1.2.9.dev0) for the 'zbud6' executable. +# makedefaults created by pymake (version 1.2.10.dev0) for the 'zbud6' executable. # determine OS ifeq ($(OS), Windows_NT) @@ -57,11 +57,11 @@ OPTLEVEL ?= -O2 # set the fortran flags ifeq ($(detected_OS), Windows) ifeq ($(FC), gfortran) - FFLAGS ?= -static -fbacktrace $(OS_macro) -fall-intrinsics -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -pedantic -std=f2008 -Wcharacter-truncation -cpp + FFLAGS ?= -static -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid -fall-intrinsics -pedantic -Wcharacter-truncation $(OS_macro) -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -std=f2008 -cpp endif else ifeq ($(FC), gfortran) - FFLAGS ?= -fbacktrace $(OS_macro) -fall-intrinsics -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -pedantic -std=f2008 -Wcharacter-truncation -cpp + FFLAGS ?= -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid -fall-intrinsics -pedantic -Wcharacter-truncation $(OS_macro) -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -std=f2008 -cpp endif ifeq ($(FC), $(filter $(FC), ifort mpiifort)) FFLAGS ?= -no-heap-arrays -fpe0 -traceback -Qdiag-disable:7416 -Qdiag-disable:7025 -Qdiag-disable:5268 -fpp diff --git a/utils/zonebudget/make/makefile b/utils/zonebudget/make/makefile index 8a24ed1c082..69fa6b73c71 100644 --- a/utils/zonebudget/make/makefile +++ b/utils/zonebudget/make/makefile @@ -1,4 +1,4 @@ -# makefile created by pymake (version 1.2.9.dev0) for the 'zbud6' executable. +# makefile created by pymake (version 1.2.10.dev0) for the 'zbud6' executable. include ./makedefaults From 1ae17deebe79dbbf01f34a72af44e94be0d88e41 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Mon, 19 Feb 2024 10:42:13 -0600 Subject: [PATCH 030/199] fix(sfr): resolve divide by zero issue (#1633) --- autotest/test_gwf_sfr_inactive.py | 247 ++++++++++++++++++++++++++ src/Model/GroundWaterFlow/gwf-sfr.f90 | 4 + 2 files changed, 251 insertions(+) create mode 100644 autotest/test_gwf_sfr_inactive.py diff --git a/autotest/test_gwf_sfr_inactive.py b/autotest/test_gwf_sfr_inactive.py new file mode 100644 index 00000000000..f3993681d1b --- /dev/null +++ b/autotest/test_gwf_sfr_inactive.py @@ -0,0 +1,247 @@ +# test based on issue 1585 fix +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +paktest = "sfr" +cases = ["sfr-1585"] + + +def build_models(idx, test): + # static model data + # temporal discretization + nper = 2 + tdis_rc = [] + for _ in range(nper): + tdis_rc.append((1.0, 1, 1.0)) + + # spatial discretization data + nlay, nrow, ncol = 1, 10, 10 + delr, delc = 100.0, 100.0 + top = 0.0 + botm = -10 + strt = 0.0 + + # calculate hk + hk = 1.0e-4 + + # solver options + hclose, rclose = 1e-9, 1e-3 + + # build MODFLOW 6 files + name = cases[idx] + sim = flopy.mf6.MFSimulation( + sim_name=name, version="mf6", exe_name="mf6", sim_ws=test.workspace + ) + # create tdis package + tdis = flopy.mf6.ModflowTdis( + sim, time_units="DAYS", nper=nper, perioddata=tdis_rc + ) + + # create iterative model solution and register the gwf model with it + ims = flopy.mf6.ModflowIms( + sim, + complexity="simple", + outer_dvclose=hclose, + under_relaxation="NONE", + inner_dvclose=hclose, + rcloserecord=rclose, + ) + + # 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, + ) + + # initial conditions + ic = flopy.mf6.ModflowGwfic(gwf, strt=strt) + + # node property flow + npf = flopy.mf6.ModflowGwfnpf(gwf, icelltype=0, k=hk) + + # chd files + # chd data + spd = [ + [(0, 0, 0), 1.0], + [(0, nrow - 1, ncol - 1), 0.0], + ] + chd = flopy.mf6.modflow.ModflowGwfchd( + gwf, stress_period_data=spd, pname="chd-1" + ) + + # sfr file + packagedata = [ + [ + 0, + (-1, -1, -1), + delr, + 1.0, + 1.0e-003, + 0.0, + 1.0, + 1.0e-5, + 3.0e-2, + 1, + 0.0, + 0, + ], + [ + 1, + (-1, -1, -1), + delr, + 1.0, + 1.0e-003, + 0.0, + 1.0, + 1.0e-5, + 3.0e-2, + 2, + 1.0, + 0, + ], + [ + 2, + (-1, -1, -1), + delr, + 1.0, + 1.0e-003, + 0.0, + 1.0, + 1.0e-5, + 3.0e-2, + 2, + 1.0, + 0, + ], + [ + 3, + (-1, -1, -1), + delr, + 1.0, + 1.0e-003, + 0.0, + 1.0, + 1.0e-5, + 3.0e-2, + 2, + 1.0, + 0, + ], + [ + 4, + (-1, -1, -1), + delr, + 1.0, + 1.0e-003, + 0.0, + 1.0, + 1.0e-5, + 3.0e-2, + 2, + 1.0, + 0, + ], + [ + 5, + (-1, -1, -1), + delr, + 1.0, + 1.0e-003, + 0.0, + 1.0, + 1.0e-5, + 3.0e-2, + 1, + 1.0, + 0, + ], + ] + connectiondata = [ + [0, -1], + [1, 0, -2], + [2, 1, -3], + [3, 2, -4], + [4, 3, -5], + [5, 4], + ] + inflow = 1.0 + perioddata = { + 0: [ + [0, "inflow", inflow], + ], + 1: [ + [3, "status", "inactive"], + [4, "status", "inactive"], + [5, "status", "inactive"], + ], + } + + sfr_dict = { + f"{paktest}_obs.csv": [ + ("r3_out", "outflow", (2,)), + ("r3_ext", "ext-outflow", (2,)), + ("r6_out", "outflow", (5,)), + ("r6_ext", "ext-outflow", (5,)), + ] + } + sfr = flopy.mf6.ModflowGwfsfr( + gwf, + print_stage=True, + print_input=True, + print_flows=True, + observations=sfr_dict, + nreaches=len(packagedata), + packagedata=packagedata, + connectiondata=connectiondata, + perioddata=perioddata, + pname="sfr_1", + ) + + # output control + oc = flopy.mf6.ModflowGwfoc( + gwf, + printrecord=[("BUDGET", "LAST"), ("HEAD", "LAST")], + ) + + return sim + + +def check_output(idx, test): + print("Checking sfr outflow and external outflow") + obs_values = flopy.utils.Mf6Obs(test.workspace / f"{paktest}_obs.csv") + test_values = { + "R3_OUT": [-1.0, 0.0], + "R3_EXT": [0.0, -1.0], + "R6_OUT": [0.0, 0.0], + "R6_EXT": [-1.0, 0.0], + } + for key, value in test_values.items(): + assert np.array_equal( + obs_values.get_data(obsname=key)[key], value + ), f"failed comparison for '{key}' observation" + + +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/src/Model/GroundWaterFlow/gwf-sfr.f90 b/src/Model/GroundWaterFlow/gwf-sfr.f90 index dea9390e846..27fc3e60f67 100644 --- a/src/Model/GroundWaterFlow/gwf-sfr.f90 +++ b/src/Model/GroundWaterFlow/gwf-sfr.f90 @@ -2363,6 +2363,7 @@ subroutine sfr_cq(this, x, flowja, iadv) real(DP) :: qext ! -- for budget integer(I4B) :: n + integer(I4B) :: n2 real(DP) :: qoutflow real(DP) :: qfrommvr real(DP) :: qtomvr @@ -2393,6 +2394,8 @@ subroutine sfr_cq(this, x, flowja, iadv) end if do i = this%ia(n) + 1, this%ia(n + 1) - 1 if (this%idir(i) > 0) cycle + n2 = this%ja(i) + if (this%iboundpak(n2) == 0) cycle qext = DZERO exit end do @@ -3829,6 +3832,7 @@ subroutine sfr_update_flows(this, n, qd, qgwf) if (this%idir(i) > 0) cycle if (this%idiv(i) > 0) cycle n2 = this%ja(i) + if (this%iboundpak(n2) == 0) cycle f = this%ustrf(n2) / this%ftotnd(n) this%qconn(i) = qd * f end do From 5d1cb50af989420efb3be9915e272a6de3a0f958 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Tue, 20 Feb 2024 07:07:15 -0600 Subject: [PATCH 031/199] refactor(swf): minor cleanup (#1634) * refactor: cleanup swf * minor tweaks --- autotest/test_swf_dfw.py | 2 +- autotest/test_swf_dfw_bowl.py | 17 +++-- doc/mf6io/mf6ivar/dfn/swf-dfw.dfn | 2 +- src/Model/GroundWaterEnergy/gwe.f90 | 7 +- src/Model/GroundWaterFlow/gwf.f90 | 93 +++----------------------- src/Model/GroundWaterTransport/gwt.f90 | 7 +- src/Model/NumericalModel.f90 | 51 ++++++++++++++ src/Model/SurfaceWaterFlow/swf-dfw.f90 | 21 +++--- src/Model/SurfaceWaterFlow/swf-flw.f90 | 4 +- src/Model/SurfaceWaterFlow/swf-obs.f90 | 2 +- src/Model/SurfaceWaterFlow/swf-oc.f90 | 5 +- src/Model/SurfaceWaterFlow/swf-sto.f90 | 2 +- src/Model/SurfaceWaterFlow/swf.f90 | 88 +++--------------------- src/Model/TransportModel/tsp.f90 | 55 +-------------- 14 files changed, 110 insertions(+), 246 deletions(-) diff --git a/autotest/test_swf_dfw.py b/autotest/test_swf_dfw.py index 7ab2b98621e..d0f63cd5e87 100644 --- a/autotest/test_swf_dfw.py +++ b/autotest/test_swf_dfw.py @@ -50,7 +50,7 @@ def build_models(idx, test): outer_dvclose=1.0e-7, inner_dvclose=1.0e-8, ) - swf = flopy.mf6.ModflowSwf(sim, modelname=name, save_flows=True) + swf = flopy.mf6.ModflowSwf(sim, modelname=name, save_flows=True, print_flows=True) dx = 1000.0 nreach = 3 diff --git a/autotest/test_swf_dfw_bowl.py b/autotest/test_swf_dfw_bowl.py index 05d2e72d0bf..788defecae3 100644 --- a/autotest/test_swf_dfw_bowl.py +++ b/autotest/test_swf_dfw_bowl.py @@ -62,29 +62,32 @@ def build_models(idx, test): sim, modelname=swfname, save_flows=True, + newtonoptions="newton underrelaxation", ) - nouter, ninner = 100, 50 + nouter, ninner = 200, 50 hclose, rclose, relax = 1e-8, 1e-8, 1.0 imsswf = flopy.mf6.ModflowIms( sim, - print_option="SUMMARY", + print_option="summary", outer_dvclose=hclose, outer_maximum=nouter, under_relaxation="DBD", - under_relaxation_theta=0.9, + under_relaxation_theta=0.95, under_relaxation_kappa=0.0001, under_relaxation_gamma=0.0, + under_relaxation_momentum=0.0, inner_maximum=ninner, inner_dvclose=hclose, linear_acceleration="BICGSTAB", scaling_method="NONE", reordering_method="NONE", relaxation_factor=relax, - backtracking_number=5, - backtracking_tolerance=1.0, - backtracking_reduction_factor=0.3, - backtracking_residual_limit=100.0, + # backtracking_number=5, + # backtracking_tolerance=1.0, + # backtracking_reduction_factor=0.3, + # backtracking_residual_limit=100.0, + csv_outer_output_filerecord=f"{swfname}.ims.outer.csv", filename=f"{swfname}.ims", ) sim.register_ims_package(imsswf, [swf.name]) diff --git a/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn b/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn index b0008c6699b..a03c493b2e3 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn @@ -6,7 +6,7 @@ type keyword reader urword optional true longname use central in space weighting -description keyword to indicate conductance should be calculated using central-in-space weighting instead of the default upstream weighting approach. +description keyword to indicate conductance should be calculated using central-in-space weighting instead of the default upstream weighting approach. This option should be used with caution as it does not work well unless all of the stream reaches are saturated. With this option, there is no way for water to flow into a dry reach from connected reaches. mf6internal icentral block options diff --git a/src/Model/GroundWaterEnergy/gwe.f90 b/src/Model/GroundWaterEnergy/gwe.f90 index fafde6d3101..f0d34e2354d 100644 --- a/src/Model/GroundWaterEnergy/gwe.f90 +++ b/src/Model/GroundWaterEnergy/gwe.f90 @@ -6,7 +6,6 @@ module GweModule use InputOutputModule, only: ParseLine, upcase use ConstantsModule, only: LENFTYPE, LENMEMPATH, DZERO, LENPAKLOC, & LENVARNAME, LENPACKAGETYPE - use VersionModule, only: write_listfile_header use NumericalModelModule, only: NumericalModelType use BaseModelModule, only: BaseModelType use BndModule, only: BndType, AddBndToList, GetBndFromList @@ -104,9 +103,9 @@ subroutine gwe_cr(filename, id, modelname) use BudgetModule, only: budget_cr use GweInputDataModule, only: gweshared_dat_cr ! -- dummy - character(len=*), intent(in) :: filename - integer(I4B), intent(in) :: id - character(len=*), intent(in) :: modelname + character(len=*), intent(in) :: filename !< input file + integer(I4B), intent(in) :: id !< consecutive model number listed in mfsim.nam + character(len=*), intent(in) :: modelname !< name of the model ! -- local integer(I4B) :: indis type(GweModelType), pointer :: this diff --git a/src/Model/GroundWaterFlow/gwf.f90 b/src/Model/GroundWaterFlow/gwf.f90 index 465baf62930..21ee5400f06 100644 --- a/src/Model/GroundWaterFlow/gwf.f90 +++ b/src/Model/GroundWaterFlow/gwf.f90 @@ -1,12 +1,12 @@ module GwfModule use KindModule, only: DP, I4B - use InputOutputModule, only: ParseLine, upcase, lowcase use ConstantsModule, only: LENFTYPE, LENMEMPATH, LENPAKLOC, DZERO, & - DEM1, DTEN, DEP20, LENPACKAGETYPE - use VersionModule, only: write_listfile_header + DTEN, LENPACKAGETYPE + use SimModule, only: count_errors, store_error, store_error_filename + use BaseModelModule, only: BaseModelType + use SimVariablesModule, only: errmsg use NumericalModelModule, only: NumericalModelType - use BaseDisModule, only: DisBaseType use BndModule, only: BndType, AddBndToList, GetBndFromList use GwfIcModule, only: GwfIcType use GwfNpfModule, only: GwfNpfType @@ -21,8 +21,6 @@ module GwfModule use GwfOcModule, only: GwfOcType use GhostNodeModule, only: GhostNodeType, gnc_cr use GwfObsModule, only: GwfObsType, gwf_obs_cr - use SimModule, only: count_errors, store_error, store_error_filename - use BaseModelModule, only: BaseModelType use MatrixBaseModule use VectorBaseModule @@ -95,7 +93,6 @@ module GwfModule procedure :: gwf_ot_bdsummary procedure, private :: create_packages procedure, private :: create_bndpkgs - procedure, private :: create_lstfile procedure, private :: log_namfile_options procedure, private :: steady_period_check ! @@ -148,9 +145,9 @@ subroutine gwf_cr(filename, id, modelname) use GwfNamInputModule, only: GwfNamParamFoundType use BudgetModule, only: budget_cr ! -- dummy - character(len=*), intent(in) :: filename - integer(I4B), intent(in) :: id - character(len=*), intent(in) :: modelname + character(len=*), intent(in) :: filename !< input file + integer(I4B), intent(in) :: id !< consecutive model number listed in mfsim.nam + character(len=*), intent(in) :: modelname !< name of the model ! -- local type(GwfModelType), pointer :: this class(BaseModelType), pointer :: model @@ -158,7 +155,6 @@ subroutine gwf_cr(filename, id, modelname) character(len=LINELENGTH) :: lst_fname type(GwfNamParamFoundType) :: found ! -- format -! ------------------------------------------------------------------------------ ! ! -- Allocate a new GWF Model (this) and add it to basemodellist allocate (this) @@ -191,7 +187,8 @@ subroutine gwf_cr(filename, id, modelname) call mem_set_value(this%ipakcb, 'SAVE_FLOWS', input_mempath, found%save_flows) ! ! -- create the list file - call this%create_lstfile(lst_fname, filename, found%list) + call this%create_lstfile(lst_fname, filename, found%list, & + 'GROUNDWATER FLOW MODEL (GWF)') ! ! -- activate save_flows if found if (found%save_flows) then @@ -226,7 +223,6 @@ subroutine gwf_df(this) ! -- local integer(I4B) :: ip class(BndType), pointer :: packobj -! ------------------------------------------------------------------------------ ! ! -- Define packages and utility objects call this%dis%dis_df() @@ -270,7 +266,6 @@ subroutine gwf_ac(this, sparse) ! -- local class(BndType), pointer :: packobj integer(I4B) :: ip -! ------------------------------------------------------------------------------ ! ! -- Add the primary grid connections of this model to sparse call this%dis%dis_ac(this%moffset, sparse) @@ -301,7 +296,6 @@ subroutine gwf_mc(this, matrix_sln) ! -- local class(BndType), pointer :: packobj integer(I4B) :: ip -! ------------------------------------------------------------------------------ ! ! -- Find the position of each connection in the global ia, ja structure ! and store them in idxglo. @@ -336,7 +330,6 @@ subroutine gwf_ar(this) ! -- locals integer(I4B) :: ip class(BndType), pointer :: packobj -! ------------------------------------------------------------------------------ ! ! -- Allocate and read modules attached to model if (this%inic > 0) call this%ic%ic_ar(this%x) @@ -386,7 +379,6 @@ subroutine gwf_rp(this) ! -- local class(BndType), pointer :: packobj integer(I4B) :: ip -! ------------------------------------------------------------------------------ ! ! -- Check with TDIS on whether or not it is time to RP if (.not. readnewdata) return @@ -427,7 +419,6 @@ subroutine gwf_ad(this) ! -- local integer(I4B) :: irestore integer(I4B) :: ip, n -! ------------------------------------------------------------------------------ ! ! -- Reset state variable irestore = 0 @@ -478,7 +469,6 @@ subroutine gwf_cf(this, kiter) ! -- local class(BndType), pointer :: packobj integer(I4B) :: ip -! ------------------------------------------------------------------------------ ! ! -- Call package cf routines if (this%innpf > 0) call this%npf%npf_cf(kiter, this%dis%nodes, this%x) @@ -504,7 +494,6 @@ subroutine gwf_fc(this, kiter, matrix_sln, inwtflag) class(BndType), pointer :: packobj integer(I4B) :: ip integer(I4B) :: inwt, inwtsto, inwtcsub, inwtpak -! ------------------------------------------------------------------------------ ! ! -- newton flags inwt = inwtflag @@ -608,7 +597,6 @@ subroutine gwf_cc(this, innertot, kiter, iend, icnvgmod, cpak, ipak, dpak) class(BndType), pointer :: packobj integer(I4B) :: ip ! -- formats -! ------------------------------------------------------------------------------ ! ! -- If mover is on, then at least 2 outers required if (this%inmvr > 0) then @@ -641,7 +629,7 @@ subroutine gwf_ptcchk(this, iptc) ! -- dummy class(GwfModelType) :: this integer(I4B), intent(inout) :: iptc -! ------------------------------------------------------------------------------ + ! ! -- determine if pseudo-transient continuation should be applied to this ! model - pseudo-transient continuation only applied to problems that ! use the Newton-Raphson formulation during steady-state stress periods @@ -755,7 +743,6 @@ subroutine gwf_nur(this, neqmod, x, xtemp, dx, inewtonur, dxmax, locmax) integer(I4B) :: i1 class(BndType), pointer :: packobj integer(I4B) :: ip -! ------------------------------------------------------------------------------ ! ! -- apply Newton-Raphson under-relaxation if model is using ! the Newton-Raphson formulation and this Newton-Raphson @@ -797,7 +784,6 @@ subroutine gwf_cq(this, icnvg, isuppress_output) integer(I4B) :: i integer(I4B) :: ip class(BndType), pointer :: packobj -! ------------------------------------------------------------------------------ ! ! -- Construct the flowja array. Flowja is calculated each time, even if ! output is suppressed. (flowja is positive into a cell.) The diagonal @@ -845,7 +831,6 @@ subroutine gwf_bd(this, icnvg, isuppress_output) ! -- local integer(I4B) :: ip class(BndType), pointer :: packobj -! ------------------------------------------------------------------------------ ! ! -- Finalize calculation of flowja by adding face flows to the diagonal. ! This results in the flow residual being stored in the diagonal @@ -897,7 +882,6 @@ subroutine gwf_ot(this) character(len=*), parameter :: fmtnocnvg = & "(1X,/9X,'****FAILED TO MEET SOLVER CONVERGENCE CRITERIA IN TIME STEP ', & &I0,' OF STRESS PERIOD ',I0,'****')" -! ------------------------------------------------------------------------------ ! ! -- Set write and print flags idvsave = 0 @@ -1084,7 +1068,6 @@ subroutine gwf_fp(this) ! -- dummy class(GwfModelType) :: this ! -- local -! ------------------------------------------------------------------------------ ! ! -- csub final processing if (this%incsub > 0) then @@ -1105,7 +1088,6 @@ subroutine gwf_da(this) ! -- local integer(I4B) :: ip class(BndType), pointer :: packobj -! ------------------------------------------------------------------------------ ! ! -- Deallocate idm memory call memorylist_remove(this%name, 'NAM', idm_context) @@ -1189,7 +1171,6 @@ subroutine gwf_bdentry(this, budterm, budtxt, rowlabel) real(DP), dimension(:, :), intent(in) :: budterm character(len=LENBUDTXT), dimension(:), intent(in) :: budtxt character(len=*), intent(in) :: rowlabel -! ------------------------------------------------------------------------------ ! call this%budget%addentry(budterm, delt, budtxt, rowlabel=rowlabel) ! @@ -1206,7 +1187,6 @@ function gwf_get_iasym(this) result(iasym) integer(I4B) :: iasym integer(I4B) :: ip class(BndType), pointer :: packobj -! ------------------------------------------------------------------------------ ! ! -- Start by setting iasym to zero iasym = 0 @@ -1239,7 +1219,6 @@ subroutine allocate_scalars(this, modelname) ! -- dummy class(GwfModelType) :: this character(len=*), intent(in) :: modelname -! ------------------------------------------------------------------------------ ! ! -- allocate members from parent class call this%NumericalModelType%allocate_scalars(modelname) @@ -1303,7 +1282,6 @@ subroutine package_create(this, filtyp, ipakid, ipaknum, pakname, mempath, & ! -- dummy class(GwfModelType) :: this character(len=*), intent(in) :: filtyp - character(len=LINELENGTH) :: errmsg integer(I4B), intent(in) :: ipakid integer(I4B), intent(in) :: ipaknum character(len=*), intent(in) :: pakname @@ -1314,7 +1292,6 @@ subroutine package_create(this, filtyp, ipakid, ipaknum, pakname, mempath, & class(BndType), pointer :: packobj class(BndType), pointer :: packobj2 integer(I4B) :: ip -! ------------------------------------------------------------------------------ ! ! -- This part creates the package object select case (filtyp) @@ -1379,8 +1356,6 @@ subroutine ftype_check(this, indis) class(GwfModelType) :: this integer(I4B), intent(in) :: indis ! -- local - character(len=LINELENGTH) :: errmsg -! ------------------------------------------------------------------------------ ! ! -- Check for IC8, DIS(u), and NPF. Stop if not present. if (this%inic == 0) then @@ -1614,54 +1589,6 @@ subroutine create_packages(this) return end subroutine create_packages - subroutine create_lstfile(this, lst_fname, model_fname, defined) - ! -- modules - use KindModule, only: LGP - use InputOutputModule, only: openfile, getunit - ! -- dummy - class(GwfModelType) :: this - character(len=*), intent(inout) :: lst_fname - character(len=*), intent(in) :: model_fname - logical(LGP), intent(in) :: defined - ! -- local - integer(I4B) :: i, istart, istop - ! - ! -- set list file name if not provided - if (.not. defined) then - ! - ! -- initialize - lst_fname = ' ' - istart = 0 - istop = len_trim(model_fname) - ! - ! -- identify '.' character position from back of string - do i = istop, 1, -1 - if (model_fname(i:i) == '.') then - istart = i - exit - end if - end do - ! - ! -- if not found start from string end - if (istart == 0) istart = istop + 1 - ! - ! -- set list file name - lst_fname = model_fname(1:istart) - istop = istart + 3 - lst_fname(istart:istop) = '.lst' - end if - ! - ! -- create the list file - this%iout = getunit() - call openfile(this%iout, 0, lst_fname, 'LIST', filstat_opt='REPLACE') - ! - ! -- write list file header - call write_listfile_header(this%iout, 'GROUNDWATER FLOW MODEL (GWF)') - ! - ! -- return - return - end subroutine create_lstfile - !> @brief Write model namfile options to list file !< subroutine log_namfile_options(this, found) diff --git a/src/Model/GroundWaterTransport/gwt.f90 b/src/Model/GroundWaterTransport/gwt.f90 index ad8dd762bba..aef3c247dfc 100644 --- a/src/Model/GroundWaterTransport/gwt.f90 +++ b/src/Model/GroundWaterTransport/gwt.f90 @@ -10,7 +10,6 @@ module GwtModule use KindModule, only: DP, I4B use ConstantsModule, only: LENFTYPE, LENMEMPATH, DZERO, DONE, & LENPAKLOC, LENVARNAME, LENPACKAGETYPE - use VersionModule, only: write_listfile_header use NumericalModelModule, only: NumericalModelType use BaseModelModule, only: BaseModelType @@ -105,9 +104,9 @@ subroutine gwt_cr(filename, id, modelname) use GwtNamInputModule, only: GwtNamParamFoundType use BudgetModule, only: budget_cr ! -- dummy - character(len=*), intent(in) :: filename - integer(I4B), intent(in) :: id - character(len=*), intent(in) :: modelname + character(len=*), intent(in) :: filename !< input file + integer(I4B), intent(in) :: id !< consecutive model number listed in mfsim.nam + character(len=*), intent(in) :: modelname !< name of the model ! -- local integer(I4B) :: indis type(GwtModelType), pointer :: this diff --git a/src/Model/NumericalModel.f90 b/src/Model/NumericalModel.f90 index e4d5e0e5add..b724e99643e 100644 --- a/src/Model/NumericalModel.f90 +++ b/src/Model/NumericalModel.f90 @@ -7,6 +7,7 @@ module NumericalModelModule use SparseModule, only: sparsematrix use TimeArraySeriesManagerModule, only: TimeArraySeriesManagerType use ListModule, only: ListType + use VersionModule, only: write_listfile_header use MatrixBaseModule use VectorBaseModule @@ -75,6 +76,7 @@ module NumericalModelModule procedure :: get_mcellid procedure :: get_mnodeu procedure :: get_iasym + procedure :: create_lstfile end type NumericalModelType contains @@ -460,4 +462,53 @@ function GetNumericalModelFromList(list, idx) result(res) return end function GetNumericalModelFromList + subroutine create_lstfile(this, lst_fname, model_fname, defined, headertxt) + ! -- modules + use KindModule, only: LGP + use InputOutputModule, only: openfile, getunit + ! -- dummy + class(NumericalModelType) :: this + character(len=*), intent(inout) :: lst_fname + character(len=*), intent(in) :: model_fname + logical(LGP), intent(in) :: defined + character(len=*), intent(in) :: headertxt + ! -- local + integer(I4B) :: i, istart, istop + ! + ! -- set list file name if not provided + if (.not. defined) then + ! + ! -- initialize + lst_fname = ' ' + istart = 0 + istop = len_trim(model_fname) + ! + ! -- identify '.' character position from back of string + do i = istop, 1, -1 + if (model_fname(i:i) == '.') then + istart = i + exit + end if + end do + ! + ! -- if not found start from string end + if (istart == 0) istart = istop + 1 + ! + ! -- set list file name + lst_fname = model_fname(1:istart) + istop = istart + 3 + lst_fname(istart:istop) = '.lst' + end if + ! + ! -- create the list file + this%iout = getunit() + call openfile(this%iout, 0, lst_fname, 'LIST', filstat_opt='REPLACE') + ! + ! -- write list file header + call write_listfile_header(this%iout, headertxt) + ! + ! -- return + return + end subroutine create_lstfile + end module NumericalModelModule diff --git a/src/Model/SurfaceWaterFlow/swf-dfw.f90 b/src/Model/SurfaceWaterFlow/swf-dfw.f90 index 46a74002b88..34c444204f0 100644 --- a/src/Model/SurfaceWaterFlow/swf-dfw.f90 +++ b/src/Model/SurfaceWaterFlow/swf-dfw.f90 @@ -19,7 +19,8 @@ module SwfDfwModule use KindModule, only: DP, I4B, LGP use ConstantsModule, only: LENMEMPATH, LENVARNAME, LINELENGTH, & DZERO, DHALF, DONE, DTWO, DTHREE, & - DNODATA, DEM5, DTWOTHIRDS, DP9, DONETHIRD + DNODATA, DEM5, DTWOTHIRDS, DP9, DONETHIRD, & + DPREC use MemoryHelperModule, only: create_mem_path use MemoryManagerModule, only: mem_allocate, mem_setptr, get_isize use SimVariablesModule, only: errmsg, warnmsg @@ -491,7 +492,8 @@ end subroutine dfw_ad !> @brief fill coefficients !! - !! Calculate conductance and put into amat + !! The DFW Package is entirely Newton based. All matrix and rhs terms + !! are added from thish routine. !! !< subroutine dfw_fc(this, kiter, matrix_sln, idxglo, rhs, stage, stage_old) @@ -640,9 +642,9 @@ function get_cond(this, n, m, stage_n, stage_m) result(cond) denom = DHALF * this%disl%reach_length(n) + & DHALF * this%disl%reach_length(m) cond = DZERO - if (denom > DZERO) then + if (denom > DPREC) then absdhdxsqr = abs((stage_n - stage_m) / denom)**DHALF - if (absdhdxsqr == DZERO) then + if (absdhdxsqr < DPREC) then absdhdxsqr = 1.e-7 end if @@ -658,14 +660,17 @@ function get_cond(this, n, m, stage_n, stage_m) result(cond) end if end if + ! -- Calculate a smoothed depth that goes to zero over + ! the specified range call sQuadratic(depth_n, range, dydx, smooth_factor) depth_n = depth_n * smooth_factor call sQuadratic(depth_m, range, dydx, smooth_factor) depth_m = depth_m * smooth_factor + cn = this%get_cond_n(n, depth_n, absdhdxsqr) cm = this%get_cond_n(m, depth_m, absdhdxsqr) - if ((cn + cm) > DZERO) then + if ((cn + cm) > DPREC) then cond = cn * cm / (cn + cm) else cond = DZERO @@ -681,13 +686,13 @@ end function get_cond !! using Manning's equation !! !< - function get_cond_n(this, n, depth, absdhdx) result(c) + function get_cond_n(this, n, depth, absdhdxsq) result(c) ! -- modules ! -- dummy class(SwfDfwType) :: this integer(I4B), intent(in) :: n !< reach number real(DP), intent(in) :: depth !< simulated depth (stage - elevation) in reach n for this iteration - real(DP), intent(in) :: absdhdx !< absolute value of simulated hydraulic gradient + real(DP), intent(in) :: absdhdxsq !< absolute value of simulated hydraulic gradient ! -- local real(DP) :: c real(DP) :: width @@ -709,7 +714,7 @@ function get_cond_n(this, n, depth, absdhdx) result(c) r = this%cxs%get_hydraulic_radius(this%idcxs(n), width, depth, area=a) ! -- conductance from manning's equation - c = this%unitconv * a * r**DTWOTHIRDS / roughc / absdhdx / dx + c = this%unitconv * a * r**DTWOTHIRDS / roughc / absdhdxsq / dx end function get_cond_n diff --git a/src/Model/SurfaceWaterFlow/swf-flw.f90 b/src/Model/SurfaceWaterFlow/swf-flw.f90 index 8cd22ebac4f..c3da6ef2e83 100644 --- a/src/Model/SurfaceWaterFlow/swf-flw.f90 +++ b/src/Model/SurfaceWaterFlow/swf-flw.f90 @@ -1,7 +1,7 @@ !> @brief This module contains the FLW package methods !! -!! This module can be used to represent inflow to streams. It is based -!! on the GWF WEL package. +!! This module can be used to represent inflow to streams. It is +!! designed similiarly to the GWF WEL package. !! !< module SwfFlwModule diff --git a/src/Model/SurfaceWaterFlow/swf-obs.f90 b/src/Model/SurfaceWaterFlow/swf-obs.f90 index 720ee432d7b..38f64a0c407 100644 --- a/src/Model/SurfaceWaterFlow/swf-obs.f90 +++ b/src/Model/SurfaceWaterFlow/swf-obs.f90 @@ -130,7 +130,7 @@ subroutine swf_obs_bd(this) return end subroutine swf_obs_bd - !> @brief Do GWF observations need any checking? If so, add checks here + !> @brief Do observations need any checking? If so, add checks here !< subroutine swf_obs_rp(this) class(SwfObsType), intent(inout) :: this diff --git a/src/Model/SurfaceWaterFlow/swf-oc.f90 b/src/Model/SurfaceWaterFlow/swf-oc.f90 index ea8f4ac7ae4..890e6bb5f87 100644 --- a/src/Model/SurfaceWaterFlow/swf-oc.f90 +++ b/src/Model/SurfaceWaterFlow/swf-oc.f90 @@ -10,10 +10,9 @@ module SwfOcModule private public SwfOcType, oc_cr - !> @ brief Output control for GWF + !> @ brief Output control !! - !! Concrete implementation of OutputControlType for the - !! GWF Model + !! Concrete implementation of OutputControlType !< type, extends(OutputControlType) :: SwfOcType contains diff --git a/src/Model/SurfaceWaterFlow/swf-sto.f90 b/src/Model/SurfaceWaterFlow/swf-sto.f90 index 47b6c6f8d85..45542330ae2 100644 --- a/src/Model/SurfaceWaterFlow/swf-sto.f90 +++ b/src/Model/SurfaceWaterFlow/swf-sto.f90 @@ -132,7 +132,7 @@ subroutine sto_ar(this, dis, ibound) this%dis => dis this%ibound => ibound ! - ! -- set pointer to gwf iss + ! -- set pointer to model iss call mem_setptr(this%iss, 'ISS', create_mem_path(this%name_model)) ! ! -- Allocate arrays diff --git a/src/Model/SurfaceWaterFlow/swf.f90 b/src/Model/SurfaceWaterFlow/swf.f90 index fa636ba5ad9..afa5175eac5 100644 --- a/src/Model/SurfaceWaterFlow/swf.f90 +++ b/src/Model/SurfaceWaterFlow/swf.f90 @@ -40,14 +40,11 @@ module SwfModule use KindModule, only: DP, I4B use ConstantsModule, only: DZERO, LENFTYPE, DNODATA, LINELENGTH, & LENMEMPATH, LENPACKAGETYPE - use InputOutputModule, only: ParseLine, upcase use SimModule, only: count_errors, store_error, store_error_filename use SimVariablesModule, only: errmsg use MemoryManagerModule, only: mem_allocate - use VersionModule, only: write_listfile_header use BaseModelModule, only: BaseModelType use NumericalModelModule, only: NumericalModelType - !use ExplicitModelModule, only: ExplicitModelType use BndModule, only: BndType, AddBndToList, GetBndFromList use SwfIcModule, only: SwfIcType use SwfDfwModule, only: SwfDfwType @@ -67,7 +64,6 @@ module SwfModule public :: SWF_BASEPKG, SWF_MULTIPKG type, extends(NumericalModelType) :: SwfModelType - ! character(len=LINELENGTH), pointer :: filename => null() !< input file name type(SwfIcType), pointer :: ic => null() ! initial conditions package type(SwfDfwType), pointer :: dfw => null() !< diffusive wave package type(SwfCxsType), pointer :: cxs => null() !< cross section package @@ -83,14 +79,6 @@ module SwfModule integer(I4B), pointer :: inoc => null() !< unit number OC integer(I4B), pointer :: iss => null() ! steady state flag integer(I4B), pointer :: inewtonur => null() ! newton under relaxation flag - - ! integer(I4B), dimension(:), pointer, contiguous :: ia => null() !< csr row pointer - ! integer(I4B), dimension(:), pointer, contiguous :: ja => null() !< csr columns - ! real(DP), dimension(:), pointer, contiguous :: x => null() !< dependent variable (todo: not used) - ! real(DP), dimension(:), pointer, contiguous :: rhs => null() !< right-hand side vector - ! real(DP), dimension(:), pointer, contiguous :: xold => null() !< dependent variable for previous timestep - ! real(DP), dimension(:), pointer, contiguous :: flowja => null() !< intercell flows - ! integer(I4B), dimension(:), pointer, contiguous :: ibound => null() !< ibound array contains procedure :: allocate_scalars procedure :: allocate_arrays @@ -117,7 +105,6 @@ module SwfModule procedure :: get_iasym => swf_get_iasym procedure, private :: create_packages procedure, private :: create_bndpkgs - procedure, private :: create_lstfile procedure, private :: log_namfile_options procedure, private :: steady_period_check end type SwfModelType @@ -158,16 +145,15 @@ subroutine swf_cr(filename, id, modelname) ! -- modules use ListsModule, only: basemodellist use BaseModelModule, only: AddBaseModelToList - use ConstantsModule, only: LINELENGTH use MemoryHelperModule, only: create_mem_path use MemoryManagerExtModule, only: mem_set_value use SimVariablesModule, only: idm_context use SwfNamInputModule, only: SwfNamParamFoundType use BudgetModule, only: budget_cr ! -- dummy - character(len=*), intent(in) :: filename - integer(I4B), intent(in) :: id - character(len=*), intent(in) :: modelname + character(len=*), intent(in) :: filename !< input file + integer(I4B), intent(in) :: id !< consecutive model number listed in mfsim.nam + character(len=*), intent(in) :: modelname !< name of the model ! -- local type(SwfModelType), pointer :: this class(BaseModelType), pointer :: model @@ -207,7 +193,8 @@ subroutine swf_cr(filename, id, modelname) call mem_set_value(this%ipakcb, 'SAVE_FLOWS', input_mempath, found%save_flows) ! ! -- create the list file - call this%create_lstfile(lst_fname, filename, found%list) + call this%create_lstfile(lst_fname, filename, found%list, & + 'SURFACE WATER FLOW MODEL (SWF)') ! ! -- activate save_flows if found if (found%save_flows) then @@ -241,7 +228,6 @@ subroutine allocate_scalars(this, modelname) call this%NumericalModelType%allocate_scalars(modelname) ! ! -- allocate members that are part of model class - !allocate (this%filename) call mem_allocate(this%inic, 'INIC', this%memoryPath) call mem_allocate(this%indfw, 'INDFW', this%memoryPath) call mem_allocate(this%incxs, 'INCXS', this%memoryPath) @@ -251,7 +237,6 @@ subroutine allocate_scalars(this, modelname) call mem_allocate(this%iss, 'ISS', this%memoryPath) call mem_allocate(this%inewtonur, 'INEWTONUR', this%memoryPath) ! - !this%filename = '' this%inic = 0 this%indfw = 0 this%incxs = 0 @@ -345,7 +330,7 @@ subroutine swf_ac(this, sparse) call this%dis%dis_ac(this%moffset, sparse) ! ! -- Add any additional connections - !if (this%indfw > 0) call this%dfw%dfw_ac(this%moffset, sparse) + ! none ! ! -- Add any package connections do ip = 1, this%bndlist%Count() @@ -373,7 +358,7 @@ subroutine swf_mc(this, matrix_sln) call this%dis%dis_mc(this%moffset, this%idxglo, matrix_sln) ! ! -- Map any additional connections - ! if (this%indfw > 0) call this%dfw%dfw_mc(this%moffset, matrix_sln) + ! none ! ! -- Map any package connections do ip = 1, this%bndlist%Count() @@ -938,7 +923,6 @@ subroutine swf_da(this) end do ! ! -- Scalars - !deallocate (this%filename) call mem_deallocate(this%inic) call mem_deallocate(this%indfw) call mem_deallocate(this%incxs) @@ -949,11 +933,6 @@ subroutine swf_da(this) call mem_deallocate(this%inewtonur) ! ! -- Arrays - ! call mem_deallocate(this%x) - ! call mem_deallocate(this%xold) - ! call mem_deallocate(this%rhs) - ! call mem_deallocate(this%ibound) - ! call mem_deallocate(this%flowja) ! ! -- NumericalModelType call this%NumericalModelType%model_da() @@ -1025,7 +1004,8 @@ subroutine package_create(this, filtyp, ipakid, ipaknum, pakname, mempath, & pakname, mempath, this%dis, this%cxs, this%dfw%unitconv) case default write (errmsg, *) 'Invalid package type: ', filtyp - call store_error(errmsg, terminate=.TRUE.) + call store_error(errmsg) + call store_error_filename(this%filename) end select ! ! -- Check to make sure that the package name is unique, then store a @@ -1052,7 +1032,7 @@ subroutine ftype_check(this, indis) integer(I4B), intent(in) :: indis ! -- local ! - ! -- Check for DISL, and DFW. Stop if not present. + ! -- Check for required packages. Stop if not present. if (indis == 0) then write (errmsg, '(1x,a)') & 'Discretization (DISL6) Package not specified.' @@ -1246,54 +1226,6 @@ subroutine create_packages(this) return end subroutine create_packages - subroutine create_lstfile(this, lst_fname, model_fname, defined) - ! -- modules - use KindModule, only: LGP - use InputOutputModule, only: openfile, getunit - ! -- dummy - class(SwfModelType) :: this - character(len=*), intent(inout) :: lst_fname - character(len=*), intent(in) :: model_fname - logical(LGP), intent(in) :: defined - ! -- local - integer(I4B) :: i, istart, istop - ! - ! -- set list file name if not provided - if (.not. defined) then - ! - ! -- initialize - lst_fname = ' ' - istart = 0 - istop = len_trim(model_fname) - ! - ! -- identify '.' character position from back of string - do i = istop, 1, -1 - if (model_fname(i:i) == '.') then - istart = i - exit - end if - end do - ! - ! -- if not found start from string end - if (istart == 0) istart = istop + 1 - ! - ! -- set list file name - lst_fname = model_fname(1:istart) - istop = istart + 3 - lst_fname(istart:istop) = '.lst' - end if - ! - ! -- create the list file - this%iout = getunit() - call openfile(this%iout, 0, lst_fname, 'LIST', filstat_opt='REPLACE') - ! - ! -- write list file header - call write_listfile_header(this%iout, 'SURFACE WATER FLOW MODEL (SWF)') - ! - ! -- return - return - end subroutine create_lstfile - !> @brief Write model namfile options to list file !< subroutine log_namfile_options(this, found) diff --git a/src/Model/TransportModel/tsp.f90 b/src/Model/TransportModel/tsp.f90 index 31d1f928b64..2f2eb9f70a6 100644 --- a/src/Model/TransportModel/tsp.f90 +++ b/src/Model/TransportModel/tsp.f90 @@ -6,7 +6,6 @@ module TransportModelModule use KindModule, only: DP, I4B - use VersionModule, only: write_listfile_header use ConstantsModule, only: LENFTYPE, LINELENGTH, DZERO, LENPAKLOC, & LENMEMPATH, LENVARNAME use SimVariablesModule, only: errmsg @@ -79,7 +78,6 @@ module TransportModelModule procedure, private :: tsp_ot_flowja procedure, private :: tsp_ot_dv procedure, private :: tsp_ot_bdsummary - procedure, private :: create_lstfile procedure, private :: create_tsp_packages procedure, private :: log_namfile_options @@ -128,7 +126,8 @@ subroutine tsp_cr(this, filename, id, modelname, macronym, indis) call mem_set_value(this%ipakcb, 'SAVE_FLOWS', input_mempath, found%save_flows) ! ! -- create the list file - call this%create_lstfile(lst_fname, filename, found%list) + call this%create_lstfile(lst_fname, filename, found%list, & + 'GROUNDWATER TRANSPORT MODEL (GWT)') ! ! -- activate save_flows if found if (found%save_flows) then @@ -674,56 +673,6 @@ subroutine ftype_check(this, indis, inmst) return end subroutine ftype_check - !> @brief Create listing output file - !< - subroutine create_lstfile(this, lst_fname, model_fname, defined) - ! -- modules - use KindModule, only: LGP - use InputOutputModule, only: openfile, getunit - ! -- dummy - class(TransportModelType) :: this - character(len=*), intent(inout) :: lst_fname - character(len=*), intent(in) :: model_fname - logical(LGP), intent(in) :: defined - ! -- local - integer(I4B) :: i, istart, istop - ! - ! -- Set list file name if not provided - if (.not. defined) then - ! - ! -- Initialize - lst_fname = ' ' - istart = 0 - istop = len_trim(model_fname) - ! - ! -- Identify '.' character position from back of string - do i = istop, 1, -1 - if (model_fname(i:i) == '.') then - istart = i - exit - end if - end do - ! - ! -- If not found start from string end - if (istart == 0) istart = istop + 1 - ! - ! -- Set list file name - lst_fname = model_fname(1:istart) - istop = istart + 3 - lst_fname(istart:istop) = '.lst' - end if - ! - ! -- Create the list file - this%iout = getunit() - call openfile(this%iout, 0, lst_fname, 'LIST', filstat_opt='REPLACE') - ! - ! -- Write list file header - call write_listfile_header(this%iout, 'GROUNDWATER TRANSPORT MODEL (GWT)') - ! - ! -- Return - return - end subroutine create_lstfile - !> @brief Write model name file options to list file !< subroutine log_namfile_options(this, found) From 6f8b4affa86a7d84a3472163c55ef9ba577c4f15 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 20 Feb 2024 09:17:58 -0500 Subject: [PATCH 032/199] refactor(dfn2f90): use dfns.txt input file, add options (#1603) * another step toward build-time model selection * introduce dfns.txt specifying paired IDM <-> DFN files * paired IDM files now named idm.f90, no need for explicit mapping * introduce options --dfn, --outdir, --verbose for dfn2f90.py * add pyaml to environment.yml (dfns.yml also supported) * colocate generated IDM files in src/Idm/ subdirectory * update utils/idmloader/IDM.md per above --- make/makefile | 70 ++--- msvs/mf6core.vfproj | 114 +++---- src/{Exchange => Idm}/exg-gwegweidm.f90 | 0 src/{Exchange => Idm}/exg-gwfgweidm.f90 | 0 src/{Exchange => Idm}/exg-gwfgwfidm.f90 | 0 src/{Exchange => Idm}/exg-gwfgwtidm.f90 | 0 src/{Exchange => Idm}/exg-gwtgwtidm.f90 | 0 src/{Exchange => Idm}/exg-swfgwfidm.f90 | 0 .../GroundWaterEnergy => Idm}/gwe-cndidm.f90 | 0 .../GroundWaterEnergy => Idm}/gwe-ctpidm.f90 | 0 .../GroundWaterEnergy => Idm}/gwe-disidm.f90 | 0 .../GroundWaterEnergy => Idm}/gwe-disuidm.f90 | 0 .../GroundWaterEnergy => Idm}/gwe-disvidm.f90 | 0 .../GroundWaterEnergy => Idm}/gwe-icidm.f90 | 0 .../GroundWaterEnergy => Idm}/gwe-namidm.f90 | 0 .../GroundWaterFlow => Idm}/gwf-chdidm.f90 | 0 .../GroundWaterFlow => Idm}/gwf-disidm.f90 | 0 .../GroundWaterFlow => Idm}/gwf-disuidm.f90 | 0 .../GroundWaterFlow => Idm}/gwf-disvidm.f90 | 0 .../GroundWaterFlow => Idm}/gwf-drnidm.f90 | 0 .../GroundWaterFlow => Idm}/gwf-evtaidm.f90 | 0 .../GroundWaterFlow => Idm}/gwf-evtidm.f90 | 0 .../GroundWaterFlow => Idm}/gwf-ghbidm.f90 | 0 .../GroundWaterFlow => Idm}/gwf-icidm.f90 | 0 .../GroundWaterFlow => Idm}/gwf-namidm.f90 | 0 .../GroundWaterFlow => Idm}/gwf-npfidm.f90 | 0 .../GroundWaterFlow => Idm}/gwf-rchaidm.f90 | 0 .../GroundWaterFlow => Idm}/gwf-rchidm.f90 | 0 .../GroundWaterFlow => Idm}/gwf-rividm.f90 | 0 .../GroundWaterFlow => Idm}/gwf-welidm.f90 | 0 .../gwt-cncidm.f90 | 0 .../gwt-disidm.f90 | 0 .../gwt-disuidm.f90 | 0 .../gwt-disvidm.f90 | 0 .../gwt-dspidm.f90 | 0 .../gwt-icidm.f90 | 0 .../gwt-namidm.f90 | 0 .../Idm/selector/IdmDfnSelector.f90 | 50 +-- .../Idm/selector/IdmExgDfnSelector.f90 | 22 +- .../Idm/selector/IdmGweDfnSelector.f90 | 120 ++++---- .../Idm/selector/IdmGwfDfnSelector.f90 | 22 +- .../Idm/selector/IdmGwtDfnSelector.f90 | 22 +- .../Idm/selector/IdmSimDfnSelector.f90 | 0 .../Idm/selector/IdmSwfDfnSelector.f90 | 0 src/{ => Idm}/sim-namidm.f90 | 0 .../simtdisidm.f90 => Idm/sim-tdisidm.f90} | 0 .../SurfaceWaterFlow => Idm}/swf-chdidm.f90 | 0 .../SurfaceWaterFlow => Idm}/swf-cxsidm.f90 | 0 .../SurfaceWaterFlow => Idm}/swf-dfwidm.f90 | 0 .../SurfaceWaterFlow => Idm}/swf-dislidm.f90 | 0 .../SurfaceWaterFlow => Idm}/swf-flwidm.f90 | 0 .../SurfaceWaterFlow => Idm}/swf-icidm.f90 | 0 .../SurfaceWaterFlow => Idm}/swf-namidm.f90 | 0 .../SurfaceWaterFlow => Idm}/swf-zdgidm.f90 | 0 src/meson.build | 111 +++---- utils/idmloader/IDM.md | 9 +- utils/idmloader/dfns.txt | 60 ++++ utils/idmloader/scripts/dfn2f90.py | 286 +++++------------- 58 files changed, 419 insertions(+), 467 deletions(-) rename src/{Exchange => Idm}/exg-gwegweidm.f90 (100%) rename src/{Exchange => Idm}/exg-gwfgweidm.f90 (100%) rename src/{Exchange => Idm}/exg-gwfgwfidm.f90 (100%) rename src/{Exchange => Idm}/exg-gwfgwtidm.f90 (100%) rename src/{Exchange => Idm}/exg-gwtgwtidm.f90 (100%) rename src/{Exchange => Idm}/exg-swfgwfidm.f90 (100%) rename src/{Model/GroundWaterEnergy => Idm}/gwe-cndidm.f90 (100%) rename src/{Model/GroundWaterEnergy => Idm}/gwe-ctpidm.f90 (100%) rename src/{Model/GroundWaterEnergy => Idm}/gwe-disidm.f90 (100%) rename src/{Model/GroundWaterEnergy => Idm}/gwe-disuidm.f90 (100%) rename src/{Model/GroundWaterEnergy => Idm}/gwe-disvidm.f90 (100%) rename src/{Model/GroundWaterEnergy => Idm}/gwe-icidm.f90 (100%) rename src/{Model/GroundWaterEnergy => Idm}/gwe-namidm.f90 (100%) rename src/{Model/GroundWaterFlow => Idm}/gwf-chdidm.f90 (100%) rename src/{Model/GroundWaterFlow => Idm}/gwf-disidm.f90 (100%) rename src/{Model/GroundWaterFlow => Idm}/gwf-disuidm.f90 (100%) rename src/{Model/GroundWaterFlow => Idm}/gwf-disvidm.f90 (100%) rename src/{Model/GroundWaterFlow => Idm}/gwf-drnidm.f90 (100%) rename src/{Model/GroundWaterFlow => Idm}/gwf-evtaidm.f90 (100%) rename src/{Model/GroundWaterFlow => Idm}/gwf-evtidm.f90 (100%) rename src/{Model/GroundWaterFlow => Idm}/gwf-ghbidm.f90 (100%) rename src/{Model/GroundWaterFlow => Idm}/gwf-icidm.f90 (100%) rename src/{Model/GroundWaterFlow => Idm}/gwf-namidm.f90 (100%) rename src/{Model/GroundWaterFlow => Idm}/gwf-npfidm.f90 (100%) rename src/{Model/GroundWaterFlow => Idm}/gwf-rchaidm.f90 (100%) rename src/{Model/GroundWaterFlow => Idm}/gwf-rchidm.f90 (100%) rename src/{Model/GroundWaterFlow => Idm}/gwf-rividm.f90 (100%) rename src/{Model/GroundWaterFlow => Idm}/gwf-welidm.f90 (100%) rename src/{Model/GroundWaterTransport => Idm}/gwt-cncidm.f90 (100%) rename src/{Model/GroundWaterTransport => Idm}/gwt-disidm.f90 (100%) rename src/{Model/GroundWaterTransport => Idm}/gwt-disuidm.f90 (100%) rename src/{Model/GroundWaterTransport => Idm}/gwt-disvidm.f90 (100%) rename src/{Model/GroundWaterTransport => Idm}/gwt-dspidm.f90 (100%) rename src/{Model/GroundWaterTransport => Idm}/gwt-icidm.f90 (100%) rename src/{Model/GroundWaterTransport => Idm}/gwt-namidm.f90 (100%) rename src/{Utilities => }/Idm/selector/IdmDfnSelector.f90 (100%) rename src/{Utilities => }/Idm/selector/IdmExgDfnSelector.f90 (100%) rename src/{Utilities => }/Idm/selector/IdmGweDfnSelector.f90 (100%) rename src/{Utilities => }/Idm/selector/IdmGwfDfnSelector.f90 (100%) rename src/{Utilities => }/Idm/selector/IdmGwtDfnSelector.f90 (100%) rename src/{Utilities => }/Idm/selector/IdmSimDfnSelector.f90 (100%) rename src/{Utilities => }/Idm/selector/IdmSwfDfnSelector.f90 (100%) rename src/{ => Idm}/sim-namidm.f90 (100%) rename src/{Timing/simtdisidm.f90 => Idm/sim-tdisidm.f90} (100%) rename src/{Model/SurfaceWaterFlow => Idm}/swf-chdidm.f90 (100%) rename src/{Model/SurfaceWaterFlow => Idm}/swf-cxsidm.f90 (100%) rename src/{Model/SurfaceWaterFlow => Idm}/swf-dfwidm.f90 (100%) rename src/{Model/SurfaceWaterFlow => Idm}/swf-dislidm.f90 (100%) rename src/{Model/SurfaceWaterFlow => Idm}/swf-flwidm.f90 (100%) rename src/{Model/SurfaceWaterFlow => Idm}/swf-icidm.f90 (100%) rename src/{Model/SurfaceWaterFlow => Idm}/swf-namidm.f90 (100%) rename src/{Model/SurfaceWaterFlow => Idm}/swf-zdgidm.f90 (100%) create mode 100644 utils/idmloader/dfns.txt diff --git a/make/makefile b/make/makefile index a70403d508b..e468b4dd6e1 100644 --- a/make/makefile +++ b/make/makefile @@ -5,38 +5,39 @@ include ./makedefaults # Define the source file directories SOURCEDIR1=../src -SOURCEDIR2=../src/Exchange -SOURCEDIR3=../src/Distributed -SOURCEDIR4=../src/Solution -SOURCEDIR5=../src/Solution/LinearMethods -SOURCEDIR6=../src/Solution/PETSc -SOURCEDIR7=../src/Timing -SOURCEDIR8=../src/Utilities -SOURCEDIR9=../src/Utilities/Idm -SOURCEDIR10=../src/Utilities/Idm/selector -SOURCEDIR11=../src/Utilities/Idm/mf6blockfile -SOURCEDIR12=../src/Utilities/TimeSeries -SOURCEDIR13=../src/Utilities/Memory -SOURCEDIR14=../src/Utilities/OutputControl -SOURCEDIR15=../src/Utilities/ArrayRead -SOURCEDIR16=../src/Utilities/Libraries -SOURCEDIR17=../src/Utilities/Libraries/rcm -SOURCEDIR18=../src/Utilities/Libraries/blas -SOURCEDIR19=../src/Utilities/Libraries/sparskit2 -SOURCEDIR20=../src/Utilities/Libraries/daglib -SOURCEDIR21=../src/Utilities/Libraries/sparsekit -SOURCEDIR22=../src/Utilities/Vector -SOURCEDIR23=../src/Utilities/Matrix -SOURCEDIR24=../src/Utilities/Observation -SOURCEDIR25=../src/Model -SOURCEDIR26=../src/Model/Connection -SOURCEDIR27=../src/Model/SurfaceWaterFlow -SOURCEDIR28=../src/Model/GroundWaterTransport -SOURCEDIR29=../src/Model/ModelUtilities -SOURCEDIR30=../src/Model/GroundWaterFlow -SOURCEDIR31=../src/Model/TransportModel -SOURCEDIR32=../src/Model/Geometry -SOURCEDIR33=../src/Model/GroundWaterEnergy +SOURCEDIR2=../src/Idm +SOURCEDIR3=../src/Idm/selector +SOURCEDIR4=../src/Exchange +SOURCEDIR5=../src/Distributed +SOURCEDIR6=../src/Solution +SOURCEDIR7=../src/Solution/LinearMethods +SOURCEDIR8=../src/Solution/PETSc +SOURCEDIR9=../src/Timing +SOURCEDIR10=../src/Utilities +SOURCEDIR11=../src/Utilities/Idm +SOURCEDIR12=../src/Utilities/Idm/mf6blockfile +SOURCEDIR13=../src/Utilities/TimeSeries +SOURCEDIR14=../src/Utilities/Memory +SOURCEDIR15=../src/Utilities/OutputControl +SOURCEDIR16=../src/Utilities/ArrayRead +SOURCEDIR17=../src/Utilities/Libraries +SOURCEDIR18=../src/Utilities/Libraries/rcm +SOURCEDIR19=../src/Utilities/Libraries/blas +SOURCEDIR20=../src/Utilities/Libraries/sparskit2 +SOURCEDIR21=../src/Utilities/Libraries/daglib +SOURCEDIR22=../src/Utilities/Libraries/sparsekit +SOURCEDIR23=../src/Utilities/Vector +SOURCEDIR24=../src/Utilities/Matrix +SOURCEDIR25=../src/Utilities/Observation +SOURCEDIR26=../src/Model +SOURCEDIR27=../src/Model/Connection +SOURCEDIR28=../src/Model/SurfaceWaterFlow +SOURCEDIR29=../src/Model/GroundWaterTransport +SOURCEDIR30=../src/Model/ModelUtilities +SOURCEDIR31=../src/Model/GroundWaterFlow +SOURCEDIR32=../src/Model/TransportModel +SOURCEDIR33=../src/Model/Geometry +SOURCEDIR34=../src/Model/GroundWaterEnergy VPATH = \ ${SOURCEDIR1} \ @@ -71,7 +72,8 @@ ${SOURCEDIR29} \ ${SOURCEDIR30} \ ${SOURCEDIR31} \ ${SOURCEDIR32} \ -${SOURCEDIR33} +${SOURCEDIR33} \ +${SOURCEDIR34} .SUFFIXES: .f90 .F90 .o @@ -103,7 +105,7 @@ $(OBJDIR)/swf-dislidm.o \ $(OBJDIR)/swf-dfwidm.o \ $(OBJDIR)/swf-cxsidm.o \ $(OBJDIR)/swf-chdidm.o \ -$(OBJDIR)/simtdisidm.o \ +$(OBJDIR)/sim-tdisidm.o \ $(OBJDIR)/sim-namidm.o \ $(OBJDIR)/gwt-namidm.o \ $(OBJDIR)/gwt-icidm.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index 5da12df2fa7..fa30c8185cb 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -103,23 +103,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - @@ -144,16 +193,9 @@ - - - - - - - @@ -163,37 +205,23 @@ - - - - - - - - - - - - - - @@ -202,18 +230,12 @@ - + - - - - + - - - @@ -224,22 +246,15 @@ - - + - - - - - - @@ -337,7 +352,7 @@ - + @@ -356,14 +371,7 @@ - - - - - - - - + @@ -491,6 +499,6 @@ - + diff --git a/src/Exchange/exg-gwegweidm.f90 b/src/Idm/exg-gwegweidm.f90 similarity index 100% rename from src/Exchange/exg-gwegweidm.f90 rename to src/Idm/exg-gwegweidm.f90 diff --git a/src/Exchange/exg-gwfgweidm.f90 b/src/Idm/exg-gwfgweidm.f90 similarity index 100% rename from src/Exchange/exg-gwfgweidm.f90 rename to src/Idm/exg-gwfgweidm.f90 diff --git a/src/Exchange/exg-gwfgwfidm.f90 b/src/Idm/exg-gwfgwfidm.f90 similarity index 100% rename from src/Exchange/exg-gwfgwfidm.f90 rename to src/Idm/exg-gwfgwfidm.f90 diff --git a/src/Exchange/exg-gwfgwtidm.f90 b/src/Idm/exg-gwfgwtidm.f90 similarity index 100% rename from src/Exchange/exg-gwfgwtidm.f90 rename to src/Idm/exg-gwfgwtidm.f90 diff --git a/src/Exchange/exg-gwtgwtidm.f90 b/src/Idm/exg-gwtgwtidm.f90 similarity index 100% rename from src/Exchange/exg-gwtgwtidm.f90 rename to src/Idm/exg-gwtgwtidm.f90 diff --git a/src/Exchange/exg-swfgwfidm.f90 b/src/Idm/exg-swfgwfidm.f90 similarity index 100% rename from src/Exchange/exg-swfgwfidm.f90 rename to src/Idm/exg-swfgwfidm.f90 diff --git a/src/Model/GroundWaterEnergy/gwe-cndidm.f90 b/src/Idm/gwe-cndidm.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe-cndidm.f90 rename to src/Idm/gwe-cndidm.f90 diff --git a/src/Model/GroundWaterEnergy/gwe-ctpidm.f90 b/src/Idm/gwe-ctpidm.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe-ctpidm.f90 rename to src/Idm/gwe-ctpidm.f90 diff --git a/src/Model/GroundWaterEnergy/gwe-disidm.f90 b/src/Idm/gwe-disidm.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe-disidm.f90 rename to src/Idm/gwe-disidm.f90 diff --git a/src/Model/GroundWaterEnergy/gwe-disuidm.f90 b/src/Idm/gwe-disuidm.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe-disuidm.f90 rename to src/Idm/gwe-disuidm.f90 diff --git a/src/Model/GroundWaterEnergy/gwe-disvidm.f90 b/src/Idm/gwe-disvidm.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe-disvidm.f90 rename to src/Idm/gwe-disvidm.f90 diff --git a/src/Model/GroundWaterEnergy/gwe-icidm.f90 b/src/Idm/gwe-icidm.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe-icidm.f90 rename to src/Idm/gwe-icidm.f90 diff --git a/src/Model/GroundWaterEnergy/gwe-namidm.f90 b/src/Idm/gwe-namidm.f90 similarity index 100% rename from src/Model/GroundWaterEnergy/gwe-namidm.f90 rename to src/Idm/gwe-namidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf-chdidm.f90 b/src/Idm/gwf-chdidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf-chdidm.f90 rename to src/Idm/gwf-chdidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf-disidm.f90 b/src/Idm/gwf-disidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf-disidm.f90 rename to src/Idm/gwf-disidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf-disuidm.f90 b/src/Idm/gwf-disuidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf-disuidm.f90 rename to src/Idm/gwf-disuidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf-disvidm.f90 b/src/Idm/gwf-disvidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf-disvidm.f90 rename to src/Idm/gwf-disvidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf-drnidm.f90 b/src/Idm/gwf-drnidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf-drnidm.f90 rename to src/Idm/gwf-drnidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf-evtaidm.f90 b/src/Idm/gwf-evtaidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf-evtaidm.f90 rename to src/Idm/gwf-evtaidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf-evtidm.f90 b/src/Idm/gwf-evtidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf-evtidm.f90 rename to src/Idm/gwf-evtidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf-ghbidm.f90 b/src/Idm/gwf-ghbidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf-ghbidm.f90 rename to src/Idm/gwf-ghbidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf-icidm.f90 b/src/Idm/gwf-icidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf-icidm.f90 rename to src/Idm/gwf-icidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf-namidm.f90 b/src/Idm/gwf-namidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf-namidm.f90 rename to src/Idm/gwf-namidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf-npfidm.f90 b/src/Idm/gwf-npfidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf-npfidm.f90 rename to src/Idm/gwf-npfidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf-rchaidm.f90 b/src/Idm/gwf-rchaidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf-rchaidm.f90 rename to src/Idm/gwf-rchaidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf-rchidm.f90 b/src/Idm/gwf-rchidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf-rchidm.f90 rename to src/Idm/gwf-rchidm.f90 diff --git a/src/Model/GroundWaterFlow/gwf-rividm.f90 b/src/Idm/gwf-rividm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf-rividm.f90 rename to src/Idm/gwf-rividm.f90 diff --git a/src/Model/GroundWaterFlow/gwf-welidm.f90 b/src/Idm/gwf-welidm.f90 similarity index 100% rename from src/Model/GroundWaterFlow/gwf-welidm.f90 rename to src/Idm/gwf-welidm.f90 diff --git a/src/Model/GroundWaterTransport/gwt-cncidm.f90 b/src/Idm/gwt-cncidm.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt-cncidm.f90 rename to src/Idm/gwt-cncidm.f90 diff --git a/src/Model/GroundWaterTransport/gwt-disidm.f90 b/src/Idm/gwt-disidm.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt-disidm.f90 rename to src/Idm/gwt-disidm.f90 diff --git a/src/Model/GroundWaterTransport/gwt-disuidm.f90 b/src/Idm/gwt-disuidm.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt-disuidm.f90 rename to src/Idm/gwt-disuidm.f90 diff --git a/src/Model/GroundWaterTransport/gwt-disvidm.f90 b/src/Idm/gwt-disvidm.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt-disvidm.f90 rename to src/Idm/gwt-disvidm.f90 diff --git a/src/Model/GroundWaterTransport/gwt-dspidm.f90 b/src/Idm/gwt-dspidm.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt-dspidm.f90 rename to src/Idm/gwt-dspidm.f90 diff --git a/src/Model/GroundWaterTransport/gwt-icidm.f90 b/src/Idm/gwt-icidm.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt-icidm.f90 rename to src/Idm/gwt-icidm.f90 diff --git a/src/Model/GroundWaterTransport/gwt-namidm.f90 b/src/Idm/gwt-namidm.f90 similarity index 100% rename from src/Model/GroundWaterTransport/gwt-namidm.f90 rename to src/Idm/gwt-namidm.f90 diff --git a/src/Utilities/Idm/selector/IdmDfnSelector.f90 b/src/Idm/selector/IdmDfnSelector.f90 similarity index 100% rename from src/Utilities/Idm/selector/IdmDfnSelector.f90 rename to src/Idm/selector/IdmDfnSelector.f90 index 409894f4bb7..64c1053bc8b 100644 --- a/src/Utilities/Idm/selector/IdmDfnSelector.f90 +++ b/src/Idm/selector/IdmDfnSelector.f90 @@ -5,12 +5,12 @@ module IdmDfnSelectorModule use SimModule, only: store_error use InputDefinitionModule, only: InputParamDefinitionType, & InputBlockDefinitionType + use IdmSimDfnSelectorModule use IdmGwfDfnSelectorModule use IdmGwtDfnSelectorModule use IdmGweDfnSelectorModule - use IdmExgDfnSelectorModule use IdmSwfDfnSelectorModule - use IdmSimDfnSelectorModule + use IdmExgDfnSelectorModule implicit none private @@ -29,18 +29,18 @@ function param_definitions(component, subcomponent) result(input_definition) type(InputParamDefinitionType), dimension(:), pointer :: input_definition nullify (input_definition) select case (component) + case ('SIM') + input_definition => sim_param_definitions(subcomponent) case ('GWF') input_definition => gwf_param_definitions(subcomponent) case ('GWT') input_definition => gwt_param_definitions(subcomponent) case ('GWE') input_definition => gwe_param_definitions(subcomponent) - case ('EXG') - input_definition => exg_param_definitions(subcomponent) case ('SWF') input_definition => swf_param_definitions(subcomponent) - case ('SIM') - input_definition => sim_param_definitions(subcomponent) + case ('EXG') + input_definition => exg_param_definitions(subcomponent) case default end select return @@ -52,18 +52,18 @@ function aggregate_definitions(component, subcomponent) result(input_definition) type(InputParamDefinitionType), dimension(:), pointer :: input_definition nullify (input_definition) select case (component) + case ('SIM') + input_definition => sim_aggregate_definitions(subcomponent) case ('GWF') input_definition => gwf_aggregate_definitions(subcomponent) case ('GWT') input_definition => gwt_aggregate_definitions(subcomponent) case ('GWE') input_definition => gwe_aggregate_definitions(subcomponent) - case ('EXG') - input_definition => exg_aggregate_definitions(subcomponent) case ('SWF') input_definition => swf_aggregate_definitions(subcomponent) - case ('SIM') - input_definition => sim_aggregate_definitions(subcomponent) + case ('EXG') + input_definition => exg_aggregate_definitions(subcomponent) case default end select return @@ -75,18 +75,18 @@ function block_definitions(component, subcomponent) result(input_definition) type(InputBlockDefinitionType), dimension(:), pointer :: input_definition nullify (input_definition) select case (component) + case ('SIM') + input_definition => sim_block_definitions(subcomponent) case ('GWF') input_definition => gwf_block_definitions(subcomponent) case ('GWT') input_definition => gwt_block_definitions(subcomponent) case ('GWE') input_definition => gwe_block_definitions(subcomponent) - case ('EXG') - input_definition => exg_block_definitions(subcomponent) case ('SWF') input_definition => swf_block_definitions(subcomponent) - case ('SIM') - input_definition => sim_block_definitions(subcomponent) + case ('EXG') + input_definition => exg_block_definitions(subcomponent) case default end select return @@ -97,18 +97,18 @@ function idm_multi_package(component, subcomponent) result(multi_package) character(len=*), intent(in) :: subcomponent logical :: multi_package select case (component) + case ('SIM') + multi_package = sim_idm_multi_package(subcomponent) case ('GWF') multi_package = gwf_idm_multi_package(subcomponent) case ('GWT') multi_package = gwt_idm_multi_package(subcomponent) case ('GWE') multi_package = gwe_idm_multi_package(subcomponent) - case ('EXG') - multi_package = exg_idm_multi_package(subcomponent) case ('SWF') multi_package = swf_idm_multi_package(subcomponent) - case ('SIM') - multi_package = sim_idm_multi_package(subcomponent) + case ('EXG') + multi_package = exg_idm_multi_package(subcomponent) case default call store_error('Idm selector component not found; '//& &'component="'//trim(component)//& @@ -123,18 +123,18 @@ function idm_integrated(component, subcomponent) result(integrated) logical :: integrated integrated = .false. select case (component) + case ('SIM') + integrated = sim_idm_integrated(subcomponent) case ('GWF') integrated = gwf_idm_integrated(subcomponent) case ('GWT') integrated = gwt_idm_integrated(subcomponent) case ('GWE') integrated = gwe_idm_integrated(subcomponent) - case ('EXG') - integrated = exg_idm_integrated(subcomponent) case ('SWF') integrated = swf_idm_integrated(subcomponent) - case ('SIM') - integrated = sim_idm_integrated(subcomponent) + case ('EXG') + integrated = exg_idm_integrated(subcomponent) case default end select return @@ -145,17 +145,17 @@ function idm_component(component) result(integrated) logical :: integrated integrated = .false. select case (component) + case ('SIM') + integrated = .true. case ('GWF') integrated = .true. case ('GWT') integrated = .true. case ('GWE') integrated = .true. - case ('EXG') - integrated = .true. case ('SWF') integrated = .true. - case ('SIM') + case ('EXG') integrated = .true. case default end select diff --git a/src/Utilities/Idm/selector/IdmExgDfnSelector.f90 b/src/Idm/selector/IdmExgDfnSelector.f90 similarity index 100% rename from src/Utilities/Idm/selector/IdmExgDfnSelector.f90 rename to src/Idm/selector/IdmExgDfnSelector.f90 index ab7c9b75fc6..55ac35a1537 100644 --- a/src/Utilities/Idm/selector/IdmExgDfnSelector.f90 +++ b/src/Idm/selector/IdmExgDfnSelector.f90 @@ -7,8 +7,8 @@ module IdmExgDfnSelectorModule InputBlockDefinitionType use ExgGwfgwfInputModule use ExgGwfgwtInputModule - use ExgGwfgweInputModule use ExgGwtgwtInputModule + use ExgGwfgweInputModule use ExgGwegweInputModule use ExgSwfgwfInputModule @@ -43,10 +43,10 @@ function exg_param_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, exg_gwfgwf_param_definitions) case ('GWFGWT') call set_param_pointer(input_definition, exg_gwfgwt_param_definitions) - case ('GWFGWE') - call set_param_pointer(input_definition, exg_gwfgwe_param_definitions) case ('GWTGWT') call set_param_pointer(input_definition, exg_gwtgwt_param_definitions) + case ('GWFGWE') + call set_param_pointer(input_definition, exg_gwfgwe_param_definitions) case ('GWEGWE') call set_param_pointer(input_definition, exg_gwegwe_param_definitions) case ('SWFGWF') @@ -65,10 +65,10 @@ function exg_aggregate_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, exg_gwfgwf_aggregate_definitions) case ('GWFGWT') call set_param_pointer(input_definition, exg_gwfgwt_aggregate_definitions) - case ('GWFGWE') - call set_param_pointer(input_definition, exg_gwfgwe_aggregate_definitions) case ('GWTGWT') call set_param_pointer(input_definition, exg_gwtgwt_aggregate_definitions) + case ('GWFGWE') + call set_param_pointer(input_definition, exg_gwfgwe_aggregate_definitions) case ('GWEGWE') call set_param_pointer(input_definition, exg_gwegwe_aggregate_definitions) case ('SWFGWF') @@ -87,10 +87,10 @@ function exg_block_definitions(subcomponent) result(input_definition) call set_block_pointer(input_definition, exg_gwfgwf_block_definitions) case ('GWFGWT') call set_block_pointer(input_definition, exg_gwfgwt_block_definitions) - case ('GWFGWE') - call set_block_pointer(input_definition, exg_gwfgwe_block_definitions) case ('GWTGWT') call set_block_pointer(input_definition, exg_gwtgwt_block_definitions) + case ('GWFGWE') + call set_block_pointer(input_definition, exg_gwfgwe_block_definitions) case ('GWEGWE') call set_block_pointer(input_definition, exg_gwegwe_block_definitions) case ('SWFGWF') @@ -108,10 +108,10 @@ function exg_idm_multi_package(subcomponent) result(multi_package) multi_package = exg_gwfgwf_multi_package case ('GWFGWT') multi_package = exg_gwfgwt_multi_package - case ('GWFGWE') - multi_package = exg_gwfgwe_multi_package case ('GWTGWT') multi_package = exg_gwtgwt_multi_package + case ('GWFGWE') + multi_package = exg_gwfgwe_multi_package case ('GWEGWE') multi_package = exg_gwegwe_multi_package case ('SWFGWF') @@ -133,10 +133,10 @@ function exg_idm_integrated(subcomponent) result(integrated) integrated = .true. case ('GWFGWT') integrated = .true. - case ('GWFGWE') - integrated = .true. case ('GWTGWT') integrated = .true. + case ('GWFGWE') + integrated = .true. case ('GWEGWE') integrated = .true. case ('SWFGWF') diff --git a/src/Utilities/Idm/selector/IdmGweDfnSelector.f90 b/src/Idm/selector/IdmGweDfnSelector.f90 similarity index 100% rename from src/Utilities/Idm/selector/IdmGweDfnSelector.f90 rename to src/Idm/selector/IdmGweDfnSelector.f90 index bbf704b441a..780ee0d64a3 100644 --- a/src/Utilities/Idm/selector/IdmGweDfnSelector.f90 +++ b/src/Idm/selector/IdmGweDfnSelector.f90 @@ -5,13 +5,13 @@ module IdmGweDfnSelectorModule use SimModule, only: store_error use InputDefinitionModule, only: InputParamDefinitionType, & InputBlockDefinitionType - use GweDisInputModule - use GweDisuInputModule - use GweDisvInputModule - use GweCndInputModule - use GweCtpInputModule - use GweIcInputModule use GweNamInputModule + use GweIcInputModule + use GweCtpInputModule + use GweCndInputModule + use GweDisvInputModule + use GweDisuInputModule + use GweDisInputModule implicit none private @@ -40,20 +40,20 @@ function gwe_param_definitions(subcomponent) result(input_definition) type(InputParamDefinitionType), dimension(:), pointer :: input_definition nullify (input_definition) select case (subcomponent) - case ('DIS') - call set_param_pointer(input_definition, gwe_dis_param_definitions) - case ('DISU') - call set_param_pointer(input_definition, gwe_disu_param_definitions) - case ('DISV') - call set_param_pointer(input_definition, gwe_disv_param_definitions) - case ('CND') - call set_param_pointer(input_definition, gwe_cnd_param_definitions) - case ('CTP') - call set_param_pointer(input_definition, gwe_ctp_param_definitions) - case ('IC') - call set_param_pointer(input_definition, gwe_ic_param_definitions) case ('NAM') call set_param_pointer(input_definition, gwe_nam_param_definitions) + case ('IC') + call set_param_pointer(input_definition, gwe_ic_param_definitions) + case ('CTP') + call set_param_pointer(input_definition, gwe_ctp_param_definitions) + case ('CND') + call set_param_pointer(input_definition, gwe_cnd_param_definitions) + case ('DISV') + call set_param_pointer(input_definition, gwe_disv_param_definitions) + case ('DISU') + call set_param_pointer(input_definition, gwe_disu_param_definitions) + case ('DIS') + call set_param_pointer(input_definition, gwe_dis_param_definitions) case default end select return @@ -64,20 +64,20 @@ function gwe_aggregate_definitions(subcomponent) result(input_definition) type(InputParamDefinitionType), dimension(:), pointer :: input_definition nullify (input_definition) select case (subcomponent) - case ('DIS') - call set_param_pointer(input_definition, gwe_dis_aggregate_definitions) - case ('DISU') - call set_param_pointer(input_definition, gwe_disu_aggregate_definitions) - case ('DISV') - call set_param_pointer(input_definition, gwe_disv_aggregate_definitions) - case ('CND') - call set_param_pointer(input_definition, gwe_cnd_aggregate_definitions) - case ('CTP') - call set_param_pointer(input_definition, gwe_ctp_aggregate_definitions) - case ('IC') - call set_param_pointer(input_definition, gwe_ic_aggregate_definitions) case ('NAM') call set_param_pointer(input_definition, gwe_nam_aggregate_definitions) + case ('IC') + call set_param_pointer(input_definition, gwe_ic_aggregate_definitions) + case ('CTP') + call set_param_pointer(input_definition, gwe_ctp_aggregate_definitions) + case ('CND') + call set_param_pointer(input_definition, gwe_cnd_aggregate_definitions) + case ('DISV') + call set_param_pointer(input_definition, gwe_disv_aggregate_definitions) + case ('DISU') + call set_param_pointer(input_definition, gwe_disu_aggregate_definitions) + case ('DIS') + call set_param_pointer(input_definition, gwe_dis_aggregate_definitions) case default end select return @@ -88,20 +88,20 @@ function gwe_block_definitions(subcomponent) result(input_definition) type(InputBlockDefinitionType), dimension(:), pointer :: input_definition nullify (input_definition) select case (subcomponent) - case ('DIS') - call set_block_pointer(input_definition, gwe_dis_block_definitions) - case ('DISU') - call set_block_pointer(input_definition, gwe_disu_block_definitions) - case ('DISV') - call set_block_pointer(input_definition, gwe_disv_block_definitions) - case ('CND') - call set_block_pointer(input_definition, gwe_cnd_block_definitions) - case ('CTP') - call set_block_pointer(input_definition, gwe_ctp_block_definitions) - case ('IC') - call set_block_pointer(input_definition, gwe_ic_block_definitions) case ('NAM') call set_block_pointer(input_definition, gwe_nam_block_definitions) + case ('IC') + call set_block_pointer(input_definition, gwe_ic_block_definitions) + case ('CTP') + call set_block_pointer(input_definition, gwe_ctp_block_definitions) + case ('CND') + call set_block_pointer(input_definition, gwe_cnd_block_definitions) + case ('DISV') + call set_block_pointer(input_definition, gwe_disv_block_definitions) + case ('DISU') + call set_block_pointer(input_definition, gwe_disu_block_definitions) + case ('DIS') + call set_block_pointer(input_definition, gwe_dis_block_definitions) case default end select return @@ -111,20 +111,20 @@ function gwe_idm_multi_package(subcomponent) result(multi_package) character(len=*), intent(in) :: subcomponent logical :: multi_package select case (subcomponent) - case ('DIS') - multi_package = gwe_dis_multi_package - case ('DISU') - multi_package = gwe_disu_multi_package - case ('DISV') - multi_package = gwe_disv_multi_package - case ('CND') - multi_package = gwe_cnd_multi_package - case ('CTP') - multi_package = gwe_ctp_multi_package - case ('IC') - multi_package = gwe_ic_multi_package case ('NAM') multi_package = gwe_nam_multi_package + case ('IC') + multi_package = gwe_ic_multi_package + case ('CTP') + multi_package = gwe_ctp_multi_package + case ('CND') + multi_package = gwe_cnd_multi_package + case ('DISV') + multi_package = gwe_disv_multi_package + case ('DISU') + multi_package = gwe_disu_multi_package + case ('DIS') + multi_package = gwe_dis_multi_package case default call store_error('Idm selector subcomponent not found; '//& &'component="GWE"'//& @@ -138,19 +138,19 @@ function gwe_idm_integrated(subcomponent) result(integrated) logical :: integrated integrated = .false. select case (subcomponent) - case ('DIS') + case ('NAM') integrated = .true. - case ('DISU') + case ('IC') integrated = .true. - case ('DISV') + case ('CTP') integrated = .true. case ('CND') integrated = .true. - case ('CTP') + case ('DISV') integrated = .true. - case ('IC') + case ('DISU') integrated = .true. - case ('NAM') + case ('DIS') integrated = .true. case default end select diff --git a/src/Utilities/Idm/selector/IdmGwfDfnSelector.f90 b/src/Idm/selector/IdmGwfDfnSelector.f90 similarity index 100% rename from src/Utilities/Idm/selector/IdmGwfDfnSelector.f90 rename to src/Idm/selector/IdmGwfDfnSelector.f90 index 7cfc9ccd101..468901a4dad 100644 --- a/src/Utilities/Idm/selector/IdmGwfDfnSelector.f90 +++ b/src/Idm/selector/IdmGwfDfnSelector.f90 @@ -5,6 +5,7 @@ module IdmGwfDfnSelectorModule use SimModule, only: store_error use InputDefinitionModule, only: InputParamDefinitionType, & InputBlockDefinitionType + use GwfNamInputModule use GwfChdInputModule use GwfDisInputModule use GwfDisuInputModule @@ -19,7 +20,6 @@ module IdmGwfDfnSelectorModule use GwfRchaInputModule use GwfRivInputModule use GwfWelInputModule - use GwfNamInputModule implicit none private @@ -48,6 +48,8 @@ function gwf_param_definitions(subcomponent) result(input_definition) type(InputParamDefinitionType), dimension(:), pointer :: input_definition nullify (input_definition) select case (subcomponent) + case ('NAM') + call set_param_pointer(input_definition, gwf_nam_param_definitions) case ('CHD') call set_param_pointer(input_definition, gwf_chd_param_definitions) case ('DIS') @@ -76,8 +78,6 @@ function gwf_param_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, gwf_riv_param_definitions) case ('WEL') call set_param_pointer(input_definition, gwf_wel_param_definitions) - case ('NAM') - call set_param_pointer(input_definition, gwf_nam_param_definitions) case default end select return @@ -88,6 +88,8 @@ function gwf_aggregate_definitions(subcomponent) result(input_definition) type(InputParamDefinitionType), dimension(:), pointer :: input_definition nullify (input_definition) select case (subcomponent) + case ('NAM') + call set_param_pointer(input_definition, gwf_nam_aggregate_definitions) case ('CHD') call set_param_pointer(input_definition, gwf_chd_aggregate_definitions) case ('DIS') @@ -116,8 +118,6 @@ function gwf_aggregate_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, gwf_riv_aggregate_definitions) case ('WEL') call set_param_pointer(input_definition, gwf_wel_aggregate_definitions) - case ('NAM') - call set_param_pointer(input_definition, gwf_nam_aggregate_definitions) case default end select return @@ -128,6 +128,8 @@ function gwf_block_definitions(subcomponent) result(input_definition) type(InputBlockDefinitionType), dimension(:), pointer :: input_definition nullify (input_definition) select case (subcomponent) + case ('NAM') + call set_block_pointer(input_definition, gwf_nam_block_definitions) case ('CHD') call set_block_pointer(input_definition, gwf_chd_block_definitions) case ('DIS') @@ -156,8 +158,6 @@ function gwf_block_definitions(subcomponent) result(input_definition) call set_block_pointer(input_definition, gwf_riv_block_definitions) case ('WEL') call set_block_pointer(input_definition, gwf_wel_block_definitions) - case ('NAM') - call set_block_pointer(input_definition, gwf_nam_block_definitions) case default end select return @@ -167,6 +167,8 @@ function gwf_idm_multi_package(subcomponent) result(multi_package) character(len=*), intent(in) :: subcomponent logical :: multi_package select case (subcomponent) + case ('NAM') + multi_package = gwf_nam_multi_package case ('CHD') multi_package = gwf_chd_multi_package case ('DIS') @@ -195,8 +197,6 @@ function gwf_idm_multi_package(subcomponent) result(multi_package) multi_package = gwf_riv_multi_package case ('WEL') multi_package = gwf_wel_multi_package - case ('NAM') - multi_package = gwf_nam_multi_package case default call store_error('Idm selector subcomponent not found; '//& &'component="GWF"'//& @@ -210,6 +210,8 @@ function gwf_idm_integrated(subcomponent) result(integrated) logical :: integrated integrated = .false. select case (subcomponent) + case ('NAM') + integrated = .true. case ('CHD') integrated = .true. case ('DIS') @@ -238,8 +240,6 @@ function gwf_idm_integrated(subcomponent) result(integrated) integrated = .true. case ('WEL') integrated = .true. - case ('NAM') - integrated = .true. case default end select return diff --git a/src/Utilities/Idm/selector/IdmGwtDfnSelector.f90 b/src/Idm/selector/IdmGwtDfnSelector.f90 similarity index 100% rename from src/Utilities/Idm/selector/IdmGwtDfnSelector.f90 rename to src/Idm/selector/IdmGwtDfnSelector.f90 index f9e71164ffa..8273f18a82a 100644 --- a/src/Utilities/Idm/selector/IdmGwtDfnSelector.f90 +++ b/src/Idm/selector/IdmGwtDfnSelector.f90 @@ -5,13 +5,13 @@ module IdmGwtDfnSelectorModule use SimModule, only: store_error use InputDefinitionModule, only: InputParamDefinitionType, & InputBlockDefinitionType + use GwtNamInputModule use GwtDisInputModule use GwtDisuInputModule use GwtDisvInputModule use GwtDspInputModule use GwtCncInputModule use GwtIcInputModule - use GwtNamInputModule implicit none private @@ -40,6 +40,8 @@ function gwt_param_definitions(subcomponent) result(input_definition) type(InputParamDefinitionType), dimension(:), pointer :: input_definition nullify (input_definition) select case (subcomponent) + case ('NAM') + call set_param_pointer(input_definition, gwt_nam_param_definitions) case ('DIS') call set_param_pointer(input_definition, gwt_dis_param_definitions) case ('DISU') @@ -52,8 +54,6 @@ function gwt_param_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, gwt_cnc_param_definitions) case ('IC') call set_param_pointer(input_definition, gwt_ic_param_definitions) - case ('NAM') - call set_param_pointer(input_definition, gwt_nam_param_definitions) case default end select return @@ -64,6 +64,8 @@ function gwt_aggregate_definitions(subcomponent) result(input_definition) type(InputParamDefinitionType), dimension(:), pointer :: input_definition nullify (input_definition) select case (subcomponent) + case ('NAM') + call set_param_pointer(input_definition, gwt_nam_aggregate_definitions) case ('DIS') call set_param_pointer(input_definition, gwt_dis_aggregate_definitions) case ('DISU') @@ -76,8 +78,6 @@ function gwt_aggregate_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, gwt_cnc_aggregate_definitions) case ('IC') call set_param_pointer(input_definition, gwt_ic_aggregate_definitions) - case ('NAM') - call set_param_pointer(input_definition, gwt_nam_aggregate_definitions) case default end select return @@ -88,6 +88,8 @@ function gwt_block_definitions(subcomponent) result(input_definition) type(InputBlockDefinitionType), dimension(:), pointer :: input_definition nullify (input_definition) select case (subcomponent) + case ('NAM') + call set_block_pointer(input_definition, gwt_nam_block_definitions) case ('DIS') call set_block_pointer(input_definition, gwt_dis_block_definitions) case ('DISU') @@ -100,8 +102,6 @@ function gwt_block_definitions(subcomponent) result(input_definition) call set_block_pointer(input_definition, gwt_cnc_block_definitions) case ('IC') call set_block_pointer(input_definition, gwt_ic_block_definitions) - case ('NAM') - call set_block_pointer(input_definition, gwt_nam_block_definitions) case default end select return @@ -111,6 +111,8 @@ function gwt_idm_multi_package(subcomponent) result(multi_package) character(len=*), intent(in) :: subcomponent logical :: multi_package select case (subcomponent) + case ('NAM') + multi_package = gwt_nam_multi_package case ('DIS') multi_package = gwt_dis_multi_package case ('DISU') @@ -123,8 +125,6 @@ function gwt_idm_multi_package(subcomponent) result(multi_package) multi_package = gwt_cnc_multi_package case ('IC') multi_package = gwt_ic_multi_package - case ('NAM') - multi_package = gwt_nam_multi_package case default call store_error('Idm selector subcomponent not found; '//& &'component="GWT"'//& @@ -138,6 +138,8 @@ function gwt_idm_integrated(subcomponent) result(integrated) logical :: integrated integrated = .false. select case (subcomponent) + case ('NAM') + integrated = .true. case ('DIS') integrated = .true. case ('DISU') @@ -150,8 +152,6 @@ function gwt_idm_integrated(subcomponent) result(integrated) integrated = .true. case ('IC') integrated = .true. - case ('NAM') - integrated = .true. case default end select return diff --git a/src/Utilities/Idm/selector/IdmSimDfnSelector.f90 b/src/Idm/selector/IdmSimDfnSelector.f90 similarity index 100% rename from src/Utilities/Idm/selector/IdmSimDfnSelector.f90 rename to src/Idm/selector/IdmSimDfnSelector.f90 diff --git a/src/Utilities/Idm/selector/IdmSwfDfnSelector.f90 b/src/Idm/selector/IdmSwfDfnSelector.f90 similarity index 100% rename from src/Utilities/Idm/selector/IdmSwfDfnSelector.f90 rename to src/Idm/selector/IdmSwfDfnSelector.f90 diff --git a/src/sim-namidm.f90 b/src/Idm/sim-namidm.f90 similarity index 100% rename from src/sim-namidm.f90 rename to src/Idm/sim-namidm.f90 diff --git a/src/Timing/simtdisidm.f90 b/src/Idm/sim-tdisidm.f90 similarity index 100% rename from src/Timing/simtdisidm.f90 rename to src/Idm/sim-tdisidm.f90 diff --git a/src/Model/SurfaceWaterFlow/swf-chdidm.f90 b/src/Idm/swf-chdidm.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf-chdidm.f90 rename to src/Idm/swf-chdidm.f90 diff --git a/src/Model/SurfaceWaterFlow/swf-cxsidm.f90 b/src/Idm/swf-cxsidm.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf-cxsidm.f90 rename to src/Idm/swf-cxsidm.f90 diff --git a/src/Model/SurfaceWaterFlow/swf-dfwidm.f90 b/src/Idm/swf-dfwidm.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf-dfwidm.f90 rename to src/Idm/swf-dfwidm.f90 diff --git a/src/Model/SurfaceWaterFlow/swf-dislidm.f90 b/src/Idm/swf-dislidm.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf-dislidm.f90 rename to src/Idm/swf-dislidm.f90 diff --git a/src/Model/SurfaceWaterFlow/swf-flwidm.f90 b/src/Idm/swf-flwidm.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf-flwidm.f90 rename to src/Idm/swf-flwidm.f90 diff --git a/src/Model/SurfaceWaterFlow/swf-icidm.f90 b/src/Idm/swf-icidm.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf-icidm.f90 rename to src/Idm/swf-icidm.f90 diff --git a/src/Model/SurfaceWaterFlow/swf-namidm.f90 b/src/Idm/swf-namidm.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf-namidm.f90 rename to src/Idm/swf-namidm.f90 diff --git a/src/Model/SurfaceWaterFlow/swf-zdgidm.f90 b/src/Idm/swf-zdgidm.f90 similarity index 100% rename from src/Model/SurfaceWaterFlow/swf-zdgidm.f90 rename to src/Idm/swf-zdgidm.f90 diff --git a/src/meson.build b/src/meson.build index 92a1fef28bb..b0539631c9c 100644 --- a/src/meson.build +++ b/src/meson.build @@ -38,12 +38,58 @@ modflow_sources = files( 'Exchange' / 'exg-gwtgwt.f90', 'Exchange' / 'exg-gwegwe.f90', 'Exchange' / 'exg-swfgwf.f90', - 'Exchange' / 'exg-gwfgwfidm.f90', - 'Exchange' / 'exg-gwfgwtidm.f90', - 'Exchange' / 'exg-gwtgwtidm.f90', - 'Exchange' / 'exg-gwfgweidm.f90', - 'Exchange' / 'exg-gwegweidm.f90', - 'Exchange' / 'exg-swfgwfidm.f90', + 'Idm' / 'exg-gwfgwfidm.f90', + 'Idm' / 'exg-gwfgwtidm.f90', + 'Idm' / 'exg-gwtgwtidm.f90', + 'Idm' / 'exg-gwfgweidm.f90', + 'Idm' / 'exg-gwegweidm.f90', + 'Idm' / 'exg-swfgwfidm.f90', + 'Idm' / 'gwe-cndidm.f90', + 'Idm' / 'gwe-ctpidm.f90', + 'Idm' / 'gwe-disidm.f90', + 'Idm' / 'gwe-disuidm.f90', + 'Idm' / 'gwe-disvidm.f90', + 'Idm' / 'gwe-icidm.f90', + 'Idm' / 'gwe-namidm.f90', + 'Idm' / 'gwf-chdidm.f90', + 'Idm' / 'gwf-disidm.f90', + 'Idm' / 'gwf-disuidm.f90', + 'Idm' / 'gwf-disvidm.f90', + 'Idm' / 'gwf-drnidm.f90', + 'Idm' / 'gwf-evtidm.f90', + 'Idm' / 'gwf-evtaidm.f90', + 'Idm' / 'gwf-ghbidm.f90', + 'Idm' / 'gwf-icidm.f90', + 'Idm' / 'gwf-namidm.f90', + 'Idm' / 'gwf-npfidm.f90', + 'Idm' / 'gwf-rchidm.f90', + 'Idm' / 'gwf-rchaidm.f90', + 'Idm' / 'gwf-rividm.f90', + 'Idm' / 'gwf-welidm.f90', + 'Idm' / 'gwt-cncidm.f90', + 'Idm' / 'gwt-disidm.f90', + 'Idm' / 'gwt-disuidm.f90', + 'Idm' / 'gwt-disvidm.f90', + 'Idm' / 'gwt-dspidm.f90', + 'Idm' / 'gwt-icidm.f90', + 'Idm' / 'gwt-namidm.f90', + 'Idm' / 'swf-dislidm.f90', + 'Idm' / 'swf-namidm.f90', + 'Idm' / 'swf-cxsidm.f90', + 'Idm' / 'swf-dfwidm.f90', + 'Idm' / 'swf-icidm.f90', + 'Idm' / 'swf-flwidm.f90', + 'Idm' / 'swf-chdidm.f90', + 'Idm' / 'swf-zdgidm.f90', + 'Idm' / 'sim-namidm.f90', + 'Idm' / 'sim-tdisidm.f90', + 'Idm' / 'selector' / 'IdmDfnSelector.f90', + 'Idm' / 'selector' / 'IdmExgDfnSelector.f90', + 'Idm' / 'selector' / 'IdmGweDfnSelector.f90', + 'Idm' / 'selector' / 'IdmGwfDfnSelector.f90', + 'Idm' / 'selector' / 'IdmGwtDfnSelector.f90', + 'Idm' / 'selector' / 'IdmSwfDfnSelector.f90', + 'Idm' / 'selector' / 'IdmSimDfnSelector.f90', 'Model' / 'Connection' / 'ConnectionBuilder.f90', 'Model' / 'Connection' / 'CellWithNbrs.f90', 'Model' / 'Connection' / 'CsrUtils.f90', @@ -62,55 +108,36 @@ modflow_sources = files( 'Model' / 'Geometry' / 'RectangularGeometry.f90', 'Model' / 'GroundWaterEnergy' / 'gwe.f90', 'Model' / 'GroundWaterEnergy' / 'gwe-cnd.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe-cndidm.f90', 'Model' / 'GroundWaterEnergy' / 'gwe-ctp.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe-ctpidm.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe-disidm.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe-disuidm.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe-disvidm.f90', 'Model' / 'GroundWaterEnergy' / 'gwe-esl.f90', 'Model' / 'GroundWaterEnergy' / 'gwe-est.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe-icidm.f90', - 'Model' / 'GroundWaterEnergy' / 'gwe-namidm.f90', 'Model' / 'GroundWaterEnergy' / 'gwe-lke.f90', 'Model' / 'GroundWaterEnergy' / 'gwe-mwe.f90', 'Model' / 'GroundWaterEnergy' / 'gwe-sfe.f90', 'Model' / 'GroundWaterEnergy' / 'gwe-uze.f90', + 'Model' / 'GroundWaterFlow' / 'gwf.f90', 'Model' / 'GroundWaterFlow' / 'gwf-api.f90', 'Model' / 'GroundWaterFlow' / 'gwf-buy.f90', 'Model' / 'GroundWaterFlow' / 'gwf-chd.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-chdidm.f90', 'Model' / 'GroundWaterFlow' / 'gwf-csub.f90', 'Model' / 'GroundWaterFlow' / 'gwf-dis.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-disidm.f90', 'Model' / 'GroundWaterFlow' / 'gwf-disu.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-disuidm.f90', 'Model' / 'GroundWaterFlow' / 'gwf-disv.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-disvidm.f90', 'Model' / 'GroundWaterFlow' / 'gwf-drn.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-drnidm.f90', + 'Model' / 'GroundWaterFlow' / 'gwf-evt.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-evtidm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-evtaidm.f90', 'Model' / 'GroundWaterFlow' / 'gwf-ghb.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-ghbidm.f90', 'Model' / 'GroundWaterFlow' / 'gwf-hfb.f90', 'Model' / 'GroundWaterFlow' / 'gwf-ic.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-icidm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-namidm.f90', 'Model' / 'GroundWaterFlow' / 'gwf-lak.f90', 'Model' / 'GroundWaterFlow' / 'gwf-maw.f90', 'Model' / 'GroundWaterFlow' / 'gwf-mvr.f90', 'Model' / 'GroundWaterFlow' / 'gwf-npf.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-npfidm.f90', 'Model' / 'GroundWaterFlow' / 'gwf-obs.f90', 'Model' / 'GroundWaterFlow' / 'gwf-oc.f90', 'Model' / 'GroundWaterFlow' / 'gwf-rch.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-rchidm.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-rchaidm.f90', 'Model' / 'GroundWaterFlow' / 'gwf-riv.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-rividm.f90', 'Model' / 'GroundWaterFlow' / 'gwf-sfr.f90', 'Model' / 'GroundWaterFlow' / 'gwf-sto.f90', 'Model' / 'GroundWaterFlow' / 'TvBase.f90', @@ -119,17 +146,9 @@ modflow_sources = files( 'Model' / 'GroundWaterFlow' / 'gwf-uzf.f90', 'Model' / 'GroundWaterFlow' / 'gwf-vsc.f90', 'Model' / 'GroundWaterFlow' / 'gwf-wel.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-welidm.f90', 'Model' / 'GroundWaterTransport' / 'gwt.f90', 'Model' / 'GroundWaterTransport' / 'gwt-cnc.f90', - 'Model' / 'GroundWaterTransport' / 'gwt-cncidm.f90', - 'Model' / 'GroundWaterTransport' / 'gwt-disidm.f90', - 'Model' / 'GroundWaterTransport' / 'gwt-disuidm.f90', - 'Model' / 'GroundWaterTransport' / 'gwt-disvidm.f90', 'Model' / 'GroundWaterTransport' / 'gwt-dsp.f90', - 'Model' / 'GroundWaterTransport' / 'gwt-dspidm.f90', - 'Model' / 'GroundWaterTransport' / 'gwt-icidm.f90', - 'Model' / 'GroundWaterTransport' / 'gwt-namidm.f90', 'Model' / 'GroundWaterTransport' / 'gwt-ist.f90', 'Model' / 'GroundWaterTransport' / 'gwt-lkt.f90', 'Model' / 'GroundWaterTransport' / 'gwt-mst.f90', @@ -137,24 +156,18 @@ modflow_sources = files( 'Model' / 'GroundWaterTransport' / 'gwt-sft.f90', 'Model' / 'GroundWaterTransport' / 'gwt-src.f90', 'Model' / 'GroundWaterTransport' / 'gwt-uzt.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-disl.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf-dislidm.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf-namidm.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-cxs.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf-cxsidm.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-dfw.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf-dfwidm.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-ic.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf-icidm.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-obs.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-oc.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-flw.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf-flwidm.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf-chdidm.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-sto.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-zdg.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf-zdgidm.f90', 'Model' / 'ModelUtilities' / 'BoundaryPackage.f90', 'Model' / 'ModelUtilities' / 'BoundaryPackageExt.f90', 'Model' / 'ModelUtilities' / 'GweCndOptions.f90', @@ -209,7 +222,7 @@ modflow_sources = files( 'Solution' / 'SolutionFactory.F90', 'Solution' / 'SolutionGroup.f90', 'Timing' / 'ats.f90', - 'Timing' / 'simtdisidm.f90', + 'Timing' / 'tdis.f90', 'Utilities' / 'ArrayRead' / 'ArrayReaderBase.f90', 'Utilities' / 'ArrayRead' / 'Double1dReader.f90', @@ -234,13 +247,7 @@ modflow_sources = files( 'Utilities' / 'Idm' / 'mf6blockfile' / 'StressListInput.f90', 'Utilities' / 'Idm' / 'mf6blockfile' / 'StructArray.f90', 'Utilities' / 'Idm' / 'mf6blockfile' / 'StructVector.f90', - 'Utilities' / 'Idm' / 'selector' / 'IdmDfnSelector.f90', - 'Utilities' / 'Idm' / 'selector' / 'IdmExgDfnSelector.f90', - 'Utilities' / 'Idm' / 'selector' / 'IdmGweDfnSelector.f90', - 'Utilities' / 'Idm' / 'selector' / 'IdmGwfDfnSelector.f90', - 'Utilities' / 'Idm' / 'selector' / 'IdmGwtDfnSelector.f90', - 'Utilities' / 'Idm' / 'selector' / 'IdmSwfDfnSelector.f90', - 'Utilities' / 'Idm' / 'selector' / 'IdmSimDfnSelector.f90', + 'Utilities' / 'Matrix' / 'MatrixBase.f90', 'Utilities' / 'Matrix' / 'SparseMatrix.f90', 'Utilities' / 'Memory' / 'Memory.f90', @@ -310,7 +317,7 @@ modflow_sources = files( 'Utilities' / 'version.f90', 'mf6core.f90', 'mf6lists.f90', - 'sim-namidm.f90', + 'SimulationCreate.f90', 'RunControl.f90', 'RunControlFactory.F90' diff --git a/utils/idmloader/IDM.md b/utils/idmloader/IDM.md index 4b2d07c5ac4..cf56e5af702 100644 --- a/utils/idmloader/IDM.md +++ b/utils/idmloader/IDM.md @@ -10,7 +10,7 @@ MODFLOW 6 reads simulation input from text and binary input files. Traditionall The MODFLOW 6 IDP (Input Data Processor) is a subsystem meant to generically read and store simulation input data from more than one type of input source. It is built upon existing MODFLOW 6 capabilities, specifically input parameter descriptions currently stored in \*.dfn (definition) files, and the Memory Manager. The parameter descriptions provide IDP with input block and parameter attributes needed to create memory and store input data. The Memory Manager provides a globally accessible way to create, update, access and remove input (and other) data. Existing components that read a traditional ASCII input file can be updated to source their input from the Memory Manager. This type of update is a significant step towards supporting sources of input data other than the traditional ASCII files. ## Framework -MODFLOW 6 \*.dfn files are used pre-compile time to generate fortran source files containing a subset of the parameter and block attribute information necessary to process input for the simulation. A single definition file is converted into one fortran source file that defines the component parameters and blocks and organizes them into lists. This conversion from defintion file to fortran source file is currently managed by the [dfn2f90.py](scripts/dfn2f90.py) script. This script also creates framework fortran source files with routines for generically accessing package definitions by component. A package or other component intended to be updated and integrated with IDM must be added to the dfn2f90.py script. This process is described below. +MODFLOW 6 \*.dfn files are used pre-compile time to generate fortran source files containing a subset of the parameter and block attribute information necessary to process input for the simulation. A single definition file is converted into one fortran source file that defines the component parameters and blocks and organizes them into lists. This conversion from defintion file to fortran source file is currently managed by the [dfn2f90.py](scripts/dfn2f90.py) script. This script also creates framework fortran source files with routines for generically accessing package definitions by component. A package or other component intended to be updated and integrated with IDM must be added to the `utils/idmloader/dfns.txt` file, which the `dfn2f90.py` script consumes. This process is described below. ## Design Input data stored in the Memory Manager use the special identifier ```__INPUT__``` as a prefix to a memory path. MODFLOW 6 refers to memory path prefixes such as these as a "context" and as such the collection of input data stored in the Memory Manager is referred to as the "input context". @@ -22,15 +22,14 @@ IDM distinguishes between static and dynamic loader objects. Static loader obje ## Integration A simulation component (package, etc) can be integrated with IDM by following these steps: - Create dfn file -- Add component to dfn2f90.py and run script +- Add component to `dfns.txt` and run `dfn2f90.py` - Update MODFLOW 6 build scripts (e.g. meson / msvs) - Use common intefaces to source input from input context -The dfn file is already a requirement for MODFLOW 6 package integration and so is not an IDM specific requirement. The dfn2f90.py update should be straightforward and currently amounts to specifying the input path to the package dfn file and an output path for the generated package \*idm.f90 file. To run the script: +The DFN file is already a requirement for MODFLOW 6 package integration and so is not an IDM specific requirement. The DFN file should be added to `doc/mf6io/mf6ivar/dfn/` and its filename added to `dfns.txt`. The generated package files are named `\*idm.f90` and located in the `src/Idm/` subdirectory by default. To run the script: ```shell -cd utils/idmloader/scripts -python dfn2f90.py +python utils/idmloader/scripts/dfn2f90.py ``` Running this command will generate a new definition file for the package and update the IDM selector framework. If the package also introduces a new model then a new selector framework file will also be created. Update the MODFLOW 6 build system (meson and msvs) files with any newly generated files. diff --git a/utils/idmloader/dfns.txt b/utils/idmloader/dfns.txt new file mode 100644 index 00000000000..e958f7bfd2a --- /dev/null +++ b/utils/idmloader/dfns.txt @@ -0,0 +1,60 @@ +# Add a new DFN parameter set to MF6 +# by adding a new entry to this list +# ---------------------------------- + +# simulation +sim-nam.dfn +sim-tdis.dfn + +# gwf model +gwf-nam.dfn +gwf-chd.dfn +gwf-dis.dfn +gwf-disu.dfn +gwf-disv.dfn +gwf-drn.dfn +gwf-evt.dfn +gwf-evta.dfn +gwf-ghb.dfn +gwf-ic.dfn +gwf-npf.dfn +gwf-rch.dfn +gwf-rcha.dfn +gwf-riv.dfn +gwf-wel.dfn + +# gwt model +gwt-nam.dfn +gwt-dis.dfn +gwt-disu.dfn +gwt-disv.dfn +gwt-dsp.dfn +gwt-cnc.dfn +gwt-ic.dfn + +# gwe model +gwe-nam.dfn +gwe-ic.dfn +gwe-ctp.dfn +gwe-cnd.dfn +gwe-disv.dfn +gwe-disu.dfn +gwe-dis.dfn + +# swf model +swf-nam.dfn +swf-disl.dfn +swf-cxs.dfn +swf-dfw.dfn +swf-ic.dfn +swf-chd.dfn +swf-flw.dfn +swf-zdg.dfn + +# exchanges +exg-gwfgwf.dfn +exg-gwfgwt.dfn +exg-gwtgwt.dfn +exg-gwfgwe.dfn +exg-gwegwe.dfn +exg-swfgwf.dfn \ No newline at end of file diff --git a/utils/idmloader/scripts/dfn2f90.py b/utils/idmloader/scripts/dfn2f90.py index 5dce00f5025..ab032f3d20f 100644 --- a/utils/idmloader/scripts/dfn2f90.py +++ b/utils/idmloader/scripts/dfn2f90.py @@ -1,20 +1,23 @@ +import argparse import sys +import textwrap +import yaml from pathlib import Path +from pprint import pprint MF6_LENVARNAME = 16 F90_LINELEN = 82 -PROJ_ROOT = Path(__file__).parents[3] -DFN_PATH = PROJ_ROOT / "doc" / "mf6io" / "mf6ivar" / "dfn" -SRC_PATH = PROJ_ROOT / "src" +PROJ_ROOT_PATH = Path(__file__).parents[3] +DEFAULT_DFNS_PATH = Path(__file__).parents[1] / "dfns.txt" +DFN_PATH = PROJ_ROOT_PATH / "doc" / "mf6io" / "mf6ivar" / "dfn" +SRC_PATH = PROJ_ROOT_PATH / "src" +IDM_PATH = SRC_PATH / "IDM" class Dfn2F90: """generate idm f90 file from dfn file""" - def __init__( - self, - dfnfspec: str = None, - ): + def __init__(self, dfnfspec: str = None, verbose: bool = False): """Dfn290 init""" self._dfnfspec = dfnfspec @@ -28,6 +31,7 @@ def __init__( self._aggregate_varnames = [] self._warnings = [] self._multi_package = False + self._verbose = verbose self.component, self.subcomponent = self._dfnfspec.stem.upper().split( "-" @@ -322,7 +326,8 @@ def _set_param_strs(self): self._block_str += " ), &\n" def _set_blk_param_strs(self, blockname, component, subcomponent): - print(" processing block params => ", blockname) + if self._verbose: + print(" Processing block params => ", blockname) required_l = None required_l = [] @@ -576,9 +581,7 @@ def write(self): self._write_master() def _write_master(self): - ofspec = ( - SRC_PATH / "Utilities" / "Idm" / "selector" / "IdmDfnSelector.f90" - ) + ofspec = SRC_PATH / "Idm" / "selector" / "IdmDfnSelector.f90" with open(ofspec, "w") as fh: self._write_master_decl(fh) self._write_master_defn(fh, defn="param", dtype="param") @@ -591,13 +594,7 @@ def _write_master(self): def _write_selectors(self): for c in self._d: - ofspec = ( - SRC_PATH - / "Utilities" - / "Idm" - / "selector" - / f"Idm{c.title()}DfnSelector.f90" - ) + ofspec = SRC_PATH / "Idm" / "selector" / f"Idm{c.title()}DfnSelector.f90" with open(ofspec, "w") as fh: self._write_selector_decl(fh, component=c, sc_list=self._d[c]) self._write_selector_helpers(fh) @@ -914,198 +911,77 @@ def _write_master_component(self, fh=None): if __name__ == "__main__": - dfns = [ - # ** Add a new dfn parameter set to MODFLOW 6 by adding a new entry to this list ** - # [relative path of input dnf, relative path of output f90 definition file] - [ - DFN_PATH / "gwf-chd.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-chdidm.f90", - ], - [ - DFN_PATH / "gwf-dis.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-disidm.f90", - ], - [ - DFN_PATH / "gwf-disu.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-disuidm.f90", - ], - [ - DFN_PATH / "gwf-disv.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-disvidm.f90", - ], - [ - DFN_PATH / "gwf-drn.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-drnidm.f90", - ], - [ - DFN_PATH / "gwf-evt.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-evtidm.f90", - ], - [ - DFN_PATH / "gwf-evta.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-evtaidm.f90", - ], - [ - DFN_PATH / "gwf-ghb.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-ghbidm.f90", - ], - [ - DFN_PATH / "gwf-ic.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-icidm.f90", - ], - [ - DFN_PATH / "gwf-npf.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-npfidm.f90", - ], - [ - DFN_PATH / "gwf-rch.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-rchidm.f90", - ], - [ - DFN_PATH / "gwf-rcha.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-rchaidm.f90", - ], - [ - DFN_PATH / "gwf-riv.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-rividm.f90", - ], - [ - DFN_PATH / "gwf-wel.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-welidm.f90", - ], - [ - DFN_PATH / "gwt-dis.dfn", - SRC_PATH / "Model" / "GroundWaterTransport" / "gwt-disidm.f90", - ], - [ - DFN_PATH / "gwt-disu.dfn", - SRC_PATH / "Model" / "GroundWaterTransport" / "gwt-disuidm.f90", - ], - [ - DFN_PATH / "gwt-disv.dfn", - SRC_PATH / "Model" / "GroundWaterTransport" / "gwt-disvidm.f90", - ], - [ - DFN_PATH / "gwt-dsp.dfn", - SRC_PATH / "Model" / "GroundWaterTransport" / "gwt-dspidm.f90", - ], - [ - DFN_PATH / "gwt-cnc.dfn", - SRC_PATH / "Model" / "GroundWaterTransport" / "gwt-cncidm.f90", - ], - [ - DFN_PATH / "gwt-ic.dfn", - SRC_PATH / "Model" / "GroundWaterTransport" / "gwt-icidm.f90", - ], - [ - DFN_PATH / "gwe-dis.dfn", - SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe-disidm.f90", - ], - [ - DFN_PATH / "gwe-disu.dfn", - SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe-disuidm.f90", - ], - [ - DFN_PATH / "gwe-disv.dfn", - SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe-disvidm.f90", - ], - [ - DFN_PATH / "gwe-cnd.dfn", - SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe-cndidm.f90", - ], - [ - DFN_PATH / "gwe-ctp.dfn", - SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe-ctpidm.f90", - ], - [ - DFN_PATH / "gwe-ic.dfn", - SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe-icidm.f90", - ], - [ - DFN_PATH / "gwf-nam.dfn", - SRC_PATH / "Model" / "GroundWaterFlow" / "gwf-namidm.f90", - ], - [ - DFN_PATH / "gwt-nam.dfn", - SRC_PATH / "Model" / "GroundWaterTransport" / "gwt-namidm.f90", - ], - [ - DFN_PATH / "gwe-nam.dfn", - SRC_PATH / "Model" / "GroundWaterEnergy" / "gwe-namidm.f90", - ], - [ - DFN_PATH / "exg-gwfgwf.dfn", - SRC_PATH / "Exchange" / "exg-gwfgwfidm.f90", - ], - [ - DFN_PATH / "exg-gwfgwt.dfn", - SRC_PATH / "Exchange" / "exg-gwfgwtidm.f90", - ], - [ - DFN_PATH / "exg-gwfgwe.dfn", - SRC_PATH / "Exchange" / "exg-gwfgweidm.f90", - ], - [ - DFN_PATH / "exg-gwtgwt.dfn", - SRC_PATH / "Exchange" / "exg-gwtgwtidm.f90", - ], - [ - DFN_PATH / "exg-gwegwe.dfn", - SRC_PATH / "Exchange" / "exg-gwegweidm.f90", - ], - [ - DFN_PATH / "swf-nam.dfn", - SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf-namidm.f90", - ], - [ - DFN_PATH / "swf-disl.dfn", - SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf-dislidm.f90", - ], - [ - DFN_PATH / "swf-cxs.dfn", - SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf-cxsidm.f90", - ], - [ - DFN_PATH / "swf-dfw.dfn", - SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf-dfwidm.f90", - ], - [ - DFN_PATH / "swf-ic.dfn", - SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf-icidm.f90", - ], - [ - DFN_PATH / "swf-chd.dfn", - SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf-chdidm.f90", - ], - [ - DFN_PATH / "swf-flw.dfn", - SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf-flwidm.f90", - ], - [ - DFN_PATH / "swf-zdg.dfn", - SRC_PATH / "Model" / "SurfaceWaterFlow" / "swf-zdgidm.f90", - ], - [ - DFN_PATH / "exg-swfgwf.dfn", - SRC_PATH / "Exchange" / "exg-swfgwfidm.f90", - ], - [ - DFN_PATH / "sim-nam.dfn", - SRC_PATH / "sim-namidm.f90", - ], - [ - DFN_PATH / "sim-tdis.dfn", - SRC_PATH / "Timing" / "simtdisidm.f90", - ], - ] + parser = argparse.ArgumentParser( + prog="Convert DFN files to Fortran source files", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=textwrap.dedent( + """\ + Generate Fortran source code from DFN files. This script + converts definition (DFN) files to Fortran source files, + each representing a parameter set for a particular input + definition. Fortran files generated by this tool provide + support for simulations, models or packages described by + the given DFN files. Each DFN file is transformed into a + corresponding Fortran file with "idm" and the same stem: + e.g. gwf-ic.dfn becomes gwf-icidm.f90. + """ + ), + ) + parser.add_argument( + "-d", + "--dfn", + required=False, + default=DEFAULT_DFNS_PATH, + help="Path to a DFN file, or to a text or YAML file listing DFN files (one per line)", + ) + parser.add_argument( + "-o", + "--outdir", + required=False, + default=IDM_PATH, + help="The directory to write Fortran source files", + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + required=False, + default=False, + help="Whether to show verbose output", + ) + args = parser.parse_args() + dfn = Path(args.dfn) + outdir = Path(args.outdir) if args.outdir else Path.cwd() + verbose = args.verbose + + if dfn.suffix.lower() in [".txt"]: + dfns = open(dfn, "r").readlines() + dfns = [l.strip() for l in dfns] + dfns = [l for l in dfns if not l.startswith("#") and l.lower().endswith(".dfn")] + if dfn == DEFAULT_DFNS_PATH: + dfns = [DFN_PATH / p for p in dfns] + elif dfn.suffix.lower() in [".yml", ".yaml"]: + dfns = yaml.safe_load(open(dfn, "r")) + elif dfn.suffix.lower() in [".dfn"]: + dfns = [dfn] + + assert all( + p.is_file() for p in dfns + ), f"DFNs not found: {[p for p in dfns if not p.is_file()]}" + + if verbose: + print("Converting DFNs:") + pprint(dfns) dfn_d = {} for dfn in dfns: - converter = Dfn2F90(dfnfspec=dfn[0]) - converter.write_f90(ofspec=dfn[1]) + converter = Dfn2F90(dfnfspec=dfn, verbose=verbose) + converter.write_f90(ofspec=outdir / f"{dfn.stem}idm.f90") converter.warn() converter.add_dfn_entry(dfn_d=dfn_d) selectors = IdmDfnSelector(dfn_d=dfn_d) selectors.write() - print("\n...done.") + + if verbose: + print("...done.") From 075fb12bdca95239587d127272cd1744cceb7057 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Tue, 20 Feb 2024 10:09:59 -0600 Subject: [PATCH 033/199] docs: update DEVELOPER.md (#1635) * update DEVELOPER.md so that meson setup command can be copied separately for Linux/MacOS and Windows --- DEVELOPER.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/DEVELOPER.md b/DEVELOPER.md index 7bdd5cdcca3..cc6c233b2df 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -275,11 +275,13 @@ Meson build configuration files are provided for MODFLOW 6, for the ZONEBUDGET a To build MODFLOW 6, first configure the build directory. By default Meson uses compiler flags for a release build. To create a debug build, add `-Doptimization=0` to the following `setup` command. +Meson `setup` on linux and macOS: ```shell -# bash (linux and macOS) meson setup builddir --prefix=$(pwd) --libdir=bin +``` -# cmd (windows) +Meson `setup` on windows: +```shell meson setup builddir --prefix=%CD% --libdir=bin ``` From b50f2a4a8c691b10fc18580fd2f3fb61023f2c74 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Tue, 20 Feb 2024 13:41:36 -0600 Subject: [PATCH 034/199] docs: update release notes (#1636) * add description of the bug fixed by PR #1633 * extend test_gwf_sfr_inactive autotest to reactivate sfr reaches after inactivating 3 of 6 reaches * update test_gwf_sfr_inactive autotest test description --- autotest/test_gwf_sfr_inactive.py | 62 ++++++++++++++++++++++++------- doc/ReleaseNotes/develop.tex | 10 ++--- 2 files changed, 53 insertions(+), 19 deletions(-) diff --git a/autotest/test_gwf_sfr_inactive.py b/autotest/test_gwf_sfr_inactive.py index f3993681d1b..47ea86849d3 100644 --- a/autotest/test_gwf_sfr_inactive.py +++ b/autotest/test_gwf_sfr_inactive.py @@ -1,4 +1,28 @@ -# test based on issue 1585 fix +""" +This test inactivation of SFR reaches during a simulation. +The test is based on the example provided with issue 1585, +which resulted in a divide by zero error when reaches were +inactivated in the second stress period. + +The test has 6 sfr reaches that are not connected to the +groundwater model. + + Reaches + 1 -o- 2 -o- 3 -o- 4 -o- 5 -o- 6 + +Test parameters: + + 1. initially all reaches are active + 2. in the 2nd stress period reaches 4, 5, and 6 are + inactivated + 3. in the 3rd stress period reach 4 is reactivated + 4. in the 4th stress period reach 5 is reactivated + 5. in the 5th stress period reach 6 is reactivated + +The test evaluates OUTFLOW and EXT-OUTFLOW for reaches +3, 4, 5, and 6 against expected values. +""" + import flopy import numpy as np import pytest @@ -12,7 +36,7 @@ def build_models(idx, test): # static model data # temporal discretization - nper = 2 + nper = 5 tdis_rc = [] for _ in range(nper): tdis_rc.append((1.0, 1, 1.0)) @@ -188,16 +212,22 @@ def build_models(idx, test): [4, "status", "inactive"], [5, "status", "inactive"], ], + 2: [ + [3, "status", "active"], + ], + 3: [ + [4, "status", "active"], + ], + 4: [ + [5, "status", "active"], + ], } - sfr_dict = { - f"{paktest}_obs.csv": [ - ("r3_out", "outflow", (2,)), - ("r3_ext", "ext-outflow", (2,)), - ("r6_out", "outflow", (5,)), - ("r6_ext", "ext-outflow", (5,)), - ] - } + sfr_obs = [] + for i in range(2, 6): + sfr_obs.append((f"r{i + 1}_out", "outflow", (i,))) + sfr_obs.append((f"r{i + 1}_ext", "ext-outflow", (i,))) + sfr_dict = {f"{paktest}_obs.csv": sfr_obs} sfr = flopy.mf6.ModflowGwfsfr( gwf, print_stage=True, @@ -224,10 +254,14 @@ def check_output(idx, test): print("Checking sfr outflow and external outflow") obs_values = flopy.utils.Mf6Obs(test.workspace / f"{paktest}_obs.csv") test_values = { - "R3_OUT": [-1.0, 0.0], - "R3_EXT": [0.0, -1.0], - "R6_OUT": [0.0, 0.0], - "R6_EXT": [-1.0, 0.0], + "R3_OUT": [-1.0, 0.0, -1.0, -1.0, -1.0], + "R3_EXT": [0.0, -1.0, 0.0, 0.0, 0.0], + "R6_OUT": [0.0, 0.0, 0.0, 0.0, 0.0], + "R6_EXT": [-1.0, 0.0, 0.0, 0.0, -1.0], + "R4_OUT": [-1.0, 0.0, 0.0, -1.0, -1.0], + "R4_EXT": [0.0, 0.0, -1.0, 0.0, 0.0], + "R5_OUT": [-1.0, 0.0, 0.0, 0.0, -1.0], + "R5_EXT": [0.0, 0.0, 0.0, -1.0, 0.0], } for key, value in test_values.items(): assert np.array_equal( diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index cbef622e93b..188a45ba0fc 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -17,7 +17,7 @@ % \item xxx %\end{itemize} - %\textbf{\underline{BUG FIXES AND OTHER CHANGES TO EXISTING FUNCTIONALITY}} \\ + \textbf{\underline{BUG FIXES AND OTHER CHANGES TO EXISTING FUNCTIONALITY}} \\ %\underline{BASIC FUNCTIONALITY} %\begin{itemize} % \item xxx @@ -39,12 +39,12 @@ % \item xxx %\end{itemize} - %\underline{ADVANCED STRESS PACKAGES} - %\begin{itemize} - % \item + \underline{ADVANCED STRESS PACKAGES} + \begin{itemize} + \item A divide by zero error would occur in the Streamflow Routing package when reaches were deactivated during a simulation. This bug was fixed by checking if the downstream reach is inactive before calculating the flow to the downstream reach. % \item xxx % \item xxx - %\end{itemize} + \end{itemize} %\underline{SOLUTION} %\begin{itemize} From 04402ff15bddc0d50dce05858655af0406847758 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Wed, 21 Feb 2024 14:20:39 -0600 Subject: [PATCH 035/199] fix(BND): fix issue with negative cond and auxmult (#1640) * add check of cond and auxmult values in DRN, RIV, and GHB packages * add test that DRN, RIV, and GHB packages issue error message if negative cond and auxmult values found * update release notes * update mf6io guide for DRN, RIV, and GHB with information on minimum COND and AUXMULT values and that the program will terminate with an error if negative values are specified. closes #1639 --- autotest/test_gwf_bnd_negative_cond.py | 181 +++++++++++++++++++++++++ doc/ReleaseNotes/develop.tex | 8 +- doc/mf6io/mf6ivar/tex/gwf-drn-desc.tex | 4 +- doc/mf6io/mf6ivar/tex/gwf-ghb-desc.tex | 6 +- doc/mf6io/mf6ivar/tex/gwf-riv-desc.tex | 6 +- src/Model/GroundWaterFlow/gwf-drn.f90 | 17 +++ src/Model/GroundWaterFlow/gwf-ghb.f90 | 17 +++ src/Model/GroundWaterFlow/gwf-riv.f90 | 17 +++ 8 files changed, 244 insertions(+), 12 deletions(-) create mode 100644 autotest/test_gwf_bnd_negative_cond.py diff --git a/autotest/test_gwf_bnd_negative_cond.py b/autotest/test_gwf_bnd_negative_cond.py new file mode 100644 index 00000000000..68a3fdadbb0 --- /dev/null +++ b/autotest/test_gwf_bnd_negative_cond.py @@ -0,0 +1,181 @@ +""" +This test build models with DRN, RIV, or GHB packages with +negative conductance multipliers or negative conductance +values. All of these models should terminate with an error +message. + +The test evaluates the error messages in the mfsim.lst file +for the correct error message. +""" + +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +paktest = "bnd" +cases = [ + "drn-cond", + "drn-mult", + "riv-cond", + "riv-mult", + "ghb-cond", + "ghb-mult", +] + + +def build_models(idx, test): + # static model data + # temporal discretization + nper = 1 + tdis_rc = [] + for _ in range(nper): + tdis_rc.append((1.0, 1, 1.0)) + + # spatial discretization data + nlay, nrow, ncol = 1, 1, 2 + delr, delc = 100.0, 100.0 + top = 0.0 + botm = -10 + strt = 0.0 + + # calculate hk + hk = 1.0e-4 + + # solver options + hclose, rclose = 1e-9, 1e-3 + + # build MODFLOW 6 files + name = cases[idx] + sim = flopy.mf6.MFSimulation( + sim_name=name, + version="mf6", + exe_name="mf6", + sim_ws=test.workspace, + ) + # create tdis package + tdis = flopy.mf6.ModflowTdis( + sim, + time_units="DAYS", + nper=nper, + perioddata=tdis_rc, + ) + + # create iterative model solution and register the gwf model with it + ims = flopy.mf6.ModflowIms( + sim, + complexity="simple", + outer_dvclose=hclose, + under_relaxation="NONE", + inner_dvclose=hclose, + rcloserecord=rclose, + ) + + # 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, + ) + + # initial conditions + ic = flopy.mf6.ModflowGwfic(gwf, strt=strt) + + # node property flow + npf = flopy.mf6.ModflowGwfnpf(gwf, icelltype=0, k=hk) + + # chd files + # chd data + spd = [ + [(0, 0, 0), 1.0], + ] + chd = flopy.mf6.modflow.ModflowGwfchd( + gwf, stress_period_data=spd, pname="chd-1" + ) + + bnd_loc = (0, 0, 1) + cond = 1.0 + mult = 1.0 + if name.endswith("mult"): + mult *= -1.0 + else: + cond *= -1.0 + if name.startswith("drn"): + drn = flopy.mf6.ModflowGwfdrn( + gwf, + auxiliary=["mult"], + auxmultname="mult", + stress_period_data=[(bnd_loc, top, cond, mult)], + ) + elif name.startswith("riv"): + riv = flopy.mf6.ModflowGwfriv( + gwf, + auxiliary=["mult"], + auxmultname="mult", + stress_period_data=[(bnd_loc, 1.0, cond, top, mult)], + ) + elif name.startswith("ghb"): + ghb = flopy.mf6.ModflowGwfghb( + gwf, + auxiliary=["mult"], + auxmultname="mult", + stress_period_data=[(bnd_loc, top, cond, mult)], + ) + + return sim + + +def check_output(idx, test): + print("Running error check") + name = cases[idx] + if name.startswith("drn"): + pak = "DRN" + elif name.startswith("riv"): + pak = "RIV" + elif name.startswith("ghb"): + pak = "GHB" + if name.endswith("mult"): + tag = ( + f"1. {pak} BOUNDARY (1) CONDUCTANCE " + + "MULTIPLIER ( -1.00 ) IS LESS THAN ZERO" + ) + else: + tag = ( + f"1. {pak} BOUNDARY (1) CONDUCTANCE " + + "( -1.00 ) IS LESS THAN ZERO" + ) + with open(test.workspace / "mfsim.lst", "r") as f: + lines = f.readlines() + error_count = 0 + for line in lines: + if tag in line: + error_count += 1 + + # ensure that error msg is in mfsim.lst file + assert error_count == 1, ( + "error count = " + str(error_count) + "but should equal 1" + ) + + +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + xfail=True, + ) + test.run() diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index 188a45ba0fc..2c84d5886a8 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -32,12 +32,12 @@ % \item xxx %\end{itemize} - %\underline{STRESS PACKAGES} - %\begin{itemize} - % \item xxx + \underline{STRESS PACKAGES} + \begin{itemize} + \item Floating point overflow errors would occur when negative conductance (COND) or auxiliary multiplier (AUXMULT) values were specified in the Drain, River, and General Head stress packages. This bug was fixed by checking if COND and AUXMULT values are greater than or equal to zero. The program will terminate with and error if negative COND or AUXMULT values are found. % \item xxx % \item xxx - %\end{itemize} + \end{itemize} \underline{ADVANCED STRESS PACKAGES} \begin{itemize} diff --git a/doc/mf6io/mf6ivar/tex/gwf-drn-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-drn-desc.tex index a73dab42ee5..0d2450badc8 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-drn-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-drn-desc.tex @@ -45,9 +45,9 @@ \item \textcolor{blue}{\texttt{elev}---is the elevation of the drain. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} -\item \textcolor{blue}{\texttt{cond}---is the hydraulic conductance of the interface between the aquifer and the drain. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} +\item \textcolor{blue}{\texttt{cond}---is the hydraulic conductance of the interface between the aquifer and the drain. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. COND values must be greater than or equal to zero. The program will terminate with an error if any COND value is less than zero.} -\item \textcolor{blue}{\texttt{aux}---represents the values of the auxiliary variables for each drain. The values of auxiliary variables must be present for each drain. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} +\item \textcolor{blue}{\texttt{aux}---represents the values of the auxiliary variables for each drain. The values of auxiliary variables must be present for each drain. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. If the Options block includes a AUXMULTNAME entry, AUXMULT values must be greater than or equal to zero. The program will terminate with an error if any AUXMULT value is less than zero.} \item \texttt{boundname}---name of the drain cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. diff --git a/doc/mf6io/mf6ivar/tex/gwf-ghb-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-ghb-desc.tex index 0abcadc0b74..c908442992c 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-ghb-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-ghb-desc.tex @@ -5,7 +5,7 @@ \begin{description} \item \texttt{auxiliary}---defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. -\item \texttt{auxmultname}---name of auxiliary variable to be used as multiplier of general-head boundary conductance. +\item \texttt{auxmultname}---name of auxiliary variable to be used as multiplier of general-head boundary conductance. \item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of general-head boundary cells. @@ -43,9 +43,9 @@ \item \textcolor{blue}{\texttt{bhead}---is the boundary head. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} -\item \textcolor{blue}{\texttt{cond}---is the hydraulic conductance of the interface between the aquifer cell and the boundary. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} +\item \textcolor{blue}{\texttt{cond}---is the hydraulic conductance of the interface between the aquifer cell and the boundary. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. COND values must be greater than or equal to zero. The program will terminate with an error if any COND value is less than zero.} -\item \textcolor{blue}{\texttt{aux}---represents the values of the auxiliary variables for each general-head boundary. The values of auxiliary variables must be present for each general-head boundary. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} +\item \textcolor{blue}{\texttt{aux}---represents the values of the auxiliary variables for each general-head boundary. The values of auxiliary variables must be present for each general-head boundary. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. If the Options block includes a AUXMULTNAME entry, AUXMULT values must be greater than or equal to zero. The program will terminate with an error if any AUXMULT value is less than zero. } \item \texttt{boundname}---name of the general-head boundary cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. diff --git a/doc/mf6io/mf6ivar/tex/gwf-riv-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-riv-desc.tex index 910dc777224..b2882f07b33 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-riv-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-riv-desc.tex @@ -5,7 +5,7 @@ \begin{description} \item \texttt{auxiliary}---defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. -\item \texttt{auxmultname}---name of auxiliary variable to be used as multiplier of riverbed conductance. +\item \texttt{auxmultname}---name of auxiliary variable to be used as multiplier of riverbed conductance. \item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of river cells. @@ -43,11 +43,11 @@ \item \textcolor{blue}{\texttt{stage}---is the head in the river. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} -\item \textcolor{blue}{\texttt{cond}---is the riverbed hydraulic conductance. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} +\item \textcolor{blue}{\texttt{cond}---is the riverbed hydraulic conductance. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. COND values must be greater than or equal to zero. The program will terminate with an error if any COND value is less than zero.} \item \textcolor{blue}{\texttt{rbot}---is the elevation of the bottom of the riverbed. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} -\item \textcolor{blue}{\texttt{aux}---represents the values of the auxiliary variables for each river. The values of auxiliary variables must be present for each river. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} +\item \textcolor{blue}{\texttt{aux}---represents the values of the auxiliary variables for each river. The values of auxiliary variables must be present for each river. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. If the Options block includes a AUXMULTNAME entry, AUXMULT values must be greater than or equal to zero. The program will terminate with an error if any AUXMULT value is less than zero.} \item \texttt{boundname}---name of the river cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. diff --git a/src/Model/GroundWaterFlow/gwf-drn.f90 b/src/Model/GroundWaterFlow/gwf-drn.f90 index 64a7f1240d3..3bdd20af213 100644 --- a/src/Model/GroundWaterFlow/gwf-drn.f90 +++ b/src/Model/GroundWaterFlow/gwf-drn.f90 @@ -314,6 +314,12 @@ subroutine drn_ck(this) character(len=*), parameter :: fmtdrnerr = & "('DRN BOUNDARY (',i0,') ELEVATION (',f10.3,') IS LESS THAN CELL & &BOTTOM (',f10.3,')')" + character(len=*), parameter :: fmtcondmulterr = & + "('DRN BOUNDARY (',i0,') CONDUCTANCE MULTIPLIER (',g10.3,') IS & + &LESS THAN ZERO')" + character(len=*), parameter :: fmtconderr = & + "('DRN BOUNDARY (',i0,') CONDUCTANCE (',g10.3,') IS LESS THAN & + &ZERO')" ! ! -- check stress period data do i = 1, this%nbound @@ -333,6 +339,17 @@ subroutine drn_ck(this) end if call store_error(errmsg) end if + if (this%iauxmultcol > 0) then + if (this%auxvar(this%iauxmultcol, i) < DZERO) then + write (errmsg, fmt=fmtcondmulterr) & + i, this%auxvar(this%iauxmultcol, i) + call store_error(errmsg) + end if + end if + if (this%cond(i) < DZERO) then + write (errmsg, fmt=fmtconderr) i, this%cond(i) + call store_error(errmsg) + end if end do ! ! -- write summary of drain package error messages diff --git a/src/Model/GroundWaterFlow/gwf-ghb.f90 b/src/Model/GroundWaterFlow/gwf-ghb.f90 index f4f4cc3dda2..9f2f5e7f2cf 100644 --- a/src/Model/GroundWaterFlow/gwf-ghb.f90 +++ b/src/Model/GroundWaterFlow/gwf-ghb.f90 @@ -221,6 +221,12 @@ subroutine ghb_ck(this) character(len=*), parameter :: fmtghberr = & "('GHB BOUNDARY (',i0,') HEAD (',f10.3,') IS LESS THAN CELL & &BOTTOM (',f10.3,')')" + character(len=*), parameter :: fmtcondmulterr = & + "('GHB BOUNDARY (',i0,') CONDUCTANCE MULTIPLIER (',g10.3,') IS & + &LESS THAN ZERO')" + character(len=*), parameter :: fmtconderr = & + "('GHB BOUNDARY (',i0,') CONDUCTANCE (',g10.3,') IS LESS THAN & + &ZERO')" ! ! -- check stress period data do i = 1, this%nbound @@ -231,6 +237,17 @@ subroutine ghb_ck(this) write (errmsg, fmt=fmtghberr) i, this%bhead(i), bt call store_error(errmsg) end if + if (this%iauxmultcol > 0) then + if (this%auxvar(this%iauxmultcol, i) < DZERO) then + write (errmsg, fmt=fmtcondmulterr) & + i, this%auxvar(this%iauxmultcol, i) + call store_error(errmsg) + end if + end if + if (this%cond(i) < DZERO) then + write (errmsg, fmt=fmtconderr) i, this%cond(i) + call store_error(errmsg) + end if end do ! !write summary of ghb package error messages diff --git a/src/Model/GroundWaterFlow/gwf-riv.f90 b/src/Model/GroundWaterFlow/gwf-riv.f90 index 5822f72944f..b0a884f4ba9 100644 --- a/src/Model/GroundWaterFlow/gwf-riv.f90 +++ b/src/Model/GroundWaterFlow/gwf-riv.f90 @@ -236,6 +236,12 @@ subroutine riv_ck(this) character(len=*), parameter :: fmtriverr3 = & "('RIV BOUNDARY (',i0,') RIVER STAGE (',f10.4,') IS LESS & &THAN CELL BOTTOM (',f10.4,')')" + character(len=*), parameter :: fmtcondmulterr = & + "('RIV BOUNDARY (',i0,') CONDUCTANCE MULTIPLIER (',g10.3,') IS & + &LESS THAN ZERO')" + character(len=*), parameter :: fmtconderr = & + "('RIV BOUNDARY (',i0,') CONDUCTANCE (',g10.3,') IS LESS THAN & + &ZERO')" ! ! -- check stress period data do i = 1, this%nbound @@ -256,6 +262,17 @@ subroutine riv_ck(this) write (errmsg, fmt=fmtriverr3) i, stage, bt call store_error(errmsg) end if + if (this%iauxmultcol > 0) then + if (this%auxvar(this%iauxmultcol, i) < DZERO) then + write (errmsg, fmt=fmtcondmulterr) & + i, this%auxvar(this%iauxmultcol, i) + call store_error(errmsg) + end if + end if + if (this%cond(i) < DZERO) then + write (errmsg, fmt=fmtconderr) i, this%cond(i) + call store_error(errmsg) + end if end do ! ! -- write summary of river package error messages From fa293619c090b6bcf31dc98d70cf59eb506bb51e Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 22 Feb 2024 13:06:41 -0500 Subject: [PATCH 036/199] ci: remove compiler checks schedule trigger (#1641) The main purpose of compilers.yml is to check which compiler toolchain/version work on which OS/version. The motivation for the scheduled runs was that github runner images might change underfoot, but this does not impact local development and is only relevant if we want to change how releases are built in CI in future (e.g. adding a gfortran build, using a newer ifort or ifx). So we can just run compiler checks manually whenever needed --- .github/workflows/compilers.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index e2fad0dab35..4f91d47df30 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -1,7 +1,5 @@ name: MODFLOW 6 compiler checks on: - schedule: - - cron: 0 0 * * 0 # 12am utc every sunday # workflow_dispatch trigger to start release via GitHub UI or CLI, see # https://docs.github.com/en/actions/managing-workflow-runs/manually-running-a-workflow workflow_dispatch: From 214c1ee6e8a663212eaf416dd13f926a3c8ced9a Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 22 Feb 2024 22:02:19 -0500 Subject: [PATCH 037/199] ci(release): statically linked gfortran build for ARM macs (#1643) * second try at ARM mac dist, replacing 95aec27 * add statically linked distribution built with gfortran * link static libgfortran and libquadmath by hiding dylibs * -static* flags don't seem to work on macOS * set LDFLAGS for macos >= 13 --- .github/workflows/release.yml | 44 ++++++++++++++++++++++---- .github/workflows/release_dispatch.yml | 2 +- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 689c93d8dd8..6737e9d9359 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -63,9 +63,17 @@ jobs: matrix: include: - os: ${{ inputs.linux_version }} - - os: macos-12 + compiler: ${{ inputs.compiler_toolchain }} + version: ${{ inputs.compiler_version }} + - os: macos-13 + compiler: ${{ inputs.compiler_toolchain }} + version: ${{ inputs.compiler_version }} - os: macos-14 + compiler: gcc + version: 13 - os: windows-2022 + compiler: ${{ inputs.compiler_toolchain }} + version: ${{ inputs.compiler_version }} defaults: run: shell: bash -l {0} @@ -90,12 +98,13 @@ jobs: bash powershell - - name: Setup ${{ inputs.compiler_toolchain }} ${{ inputs.compiler_version }} + - name: Setup ${{ matrix.compiler }} ${{ matrix.version }} + id: setup-fortran uses: fortran-lang/setup-fortran@v1 with: - compiler: ${{ inputs.compiler_toolchain }} - version: ${{ inputs.compiler_version }} - + compiler: ${{ matrix.compiler }} + version: ${{ matrix.version }} + - name: Set version number id: set_version run: | @@ -122,6 +131,22 @@ jobs: fi eval "$cmd" + # for statically linked gfortran ARM mac build + - name: Hide dylibs (macOS) + if: matrix.os == 'macos-14' + run: | + mv /opt/homebrew/opt/gcc/lib/gcc/current/libgfortran.5.dylib /opt/homebrew/opt/gcc/lib/gcc/current/libgfortran.5.dylib.bak + mv /opt/homebrew/opt/gcc/lib/gcc/current/libquadmath.0.dylib /opt/homebrew/opt/gcc/lib/gcc/current/libquadmath.0.dylib.bak + + - name: Set LDFLAGS (macOS) + if: runner.os == 'macOS' + run: | + os_ver=$(sw_vers -productVersion | cut -d'.' -f1) + if (( "$os_ver" > 12 )); then + ldflags="$LDFLAGS -Wl,-ld_classic" + echo "LDFLAGS=$ldflags" >> $GITHUB_ENV + fi + - name: Build binaries if: runner.os != 'Windows' working-directory: modflow6 @@ -145,6 +170,13 @@ jobs: ostag=$(python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") echo "ostag=$ostag" >> $GITHUB_OUTPUT + - name: Check architecture (macOS) + working-directory: modflow6/bin + if: runner.os == 'macOS' + run: | + otool -L mf6 + lipo -info mf6 + - name: Upload binaries uses: actions/upload-artifact@v3 with: @@ -412,7 +444,7 @@ jobs: matrix: include: - os: ubuntu-22.04 - - os: macos-12 + - os: macos-13 - os: macos-14 - os: windows-2022 defaults: diff --git a/.github/workflows/release_dispatch.yml b/.github/workflows/release_dispatch.yml index 654d6acd292..4c7cb5679fd 100644 --- a/.github/workflows/release_dispatch.yml +++ b/.github/workflows/release_dispatch.yml @@ -130,7 +130,7 @@ jobs: branch: ${{ needs.set_options.outputs.branch }} developmode: false full: true - run_tests: ${{ inputs.run_tests == '' || inputs.run_tests == 'true' }} + run_tests: ${{ inputs.run_tests }} version: ${{ needs.set_options.outputs.version }} pr: name: Draft release PR From ab6d3f84f2c4d764f38f075758aebedbf14b2761 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 23 Feb 2024 08:49:45 -0500 Subject: [PATCH 038/199] docs: fix typo in supplemental info (#1645) * fix 'ZDRN + DDN' -> 'ZDRN + DDRN' * same fix in DRN-Discharge-Scaling.ipynb --- doc/SuppTechInfo/drain-discharge-scaling.tex | 2 +- doc/SuppTechInfo/python/DRN-Discharge-Scaling.ipynb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/SuppTechInfo/drain-discharge-scaling.tex b/doc/SuppTechInfo/drain-discharge-scaling.tex index e3a32a0c35b..0840826f56f 100644 --- a/doc/SuppTechInfo/drain-discharge-scaling.tex +++ b/doc/SuppTechInfo/drain-discharge-scaling.tex @@ -164,7 +164,7 @@ \subsection{Theory} \subsection{Example Drain Discharge Scaling Calculations} -An example of the differences between the standard, linearly-scaled, and cubicly-scaled drainage discharge are shown in figure~\ref{fig:drndischdiff}. In this example the elevation that drainage discharge starts ($\mli{ZDRN}$) is set at $\frac{\mli{DDRN}}{2}$ below land surface elevation and drainage discharge is equal for all approaches at $\mli{ZDRN} + \mli{DDRN}$ (fig.~\ref{fig:drndischdiff}\textit{A}). In this conceptual problem, the groundwater head linearly increases from a value less than $\mli{ZDRN}$ to greater than $\mli{ZDRN + DDN}$ during the simulation, which is presented as the head difference ($h - \mli{ZDRN}$) divided by the drainage depth in figure~\ref{fig:drndischdiff}\textit{B}. The drainage discharge that results from the linear increase in groundwater head using the original-, linear-, and cubic-scaling increases with time as is shown in figure~\ref{fig:drndischdiff}\textit{C} and shows the continuous nature of the linear- and cubic scaled drainage discharge and that all three approaches result in the same drain discharge rate when the relative drain head difference is greater than or equal to one. Figure~\ref{fig:drndischdiff}\textit{D} shows that the cumulative drain discharge for the original drain formulation is 170 to 200 $L^3$ greater than the cubic- and linear-scaled drainage discharge, respectively. +An example of the differences between the standard, linearly-scaled, and cubicly-scaled drainage discharge are shown in figure~\ref{fig:drndischdiff}. In this example the elevation that drainage discharge starts ($\mli{ZDRN}$) is set at $\frac{\mli{DDRN}}{2}$ below land surface elevation and drainage discharge is equal for all approaches at $\mli{ZDRN} + \mli{DDRN}$ (fig.~\ref{fig:drndischdiff}\textit{A}). In this conceptual problem, the groundwater head linearly increases from a value less than $\mli{ZDRN}$ to greater than $\mli{ZDRN + DDRN}$ during the simulation, which is presented as the head difference ($h - \mli{ZDRN}$) divided by the drainage depth in figure~\ref{fig:drndischdiff}\textit{B}. The drainage discharge that results from the linear increase in groundwater head using the original-, linear-, and cubic-scaling increases with time as is shown in figure~\ref{fig:drndischdiff}\textit{C} and shows the continuous nature of the linear- and cubic scaled drainage discharge and that all three approaches result in the same drain discharge rate when the relative drain head difference is greater than or equal to one. Figure~\ref{fig:drndischdiff}\textit{D} shows that the cumulative drain discharge for the original drain formulation is 170 to 200 $L^3$ greater than the cubic- and linear-scaled drainage discharge, respectively. \begin{figure}[!ht] \begin{center} diff --git a/doc/SuppTechInfo/python/DRN-Discharge-Scaling.ipynb b/doc/SuppTechInfo/python/DRN-Discharge-Scaling.ipynb index 1ff9ac3ab41..ae101e3636a 100644 --- a/doc/SuppTechInfo/python/DRN-Discharge-Scaling.ipynb +++ b/doc/SuppTechInfo/python/DRN-Discharge-Scaling.ipynb @@ -472,7 +472,7 @@ " text = r'Land surface elevation - $\\frac{DDRN}{2}$'\n", " spnspecs.add_text(ax, text=text, x=0.5, y=zmin, transform=False, bold=False, \n", " ha='center', va='top')\n", - " text = r'$ZDRN + DDN$'\n", + " text = r'$ZDRN + DDRN$'\n", " spnspecs.add_text(ax, text=text, x=0.99, y=zmax, transform=False, bold=False, ha='right')\n", " text = r'$ZDRN$'\n", " spnspecs.add_text(ax, text=text, x=0.99, y=zmin, transform=False, bold=False, \n", @@ -484,7 +484,7 @@ "ax.plot(t, s, lw=1.5, color='0.5', ls='--', label=r'$F_{DRN}$')\n", "ax.set_xlabel('Fractional simulation time, unitless')\n", "ax.set_ylabel(r'$\\frac{h - ZDRN}{DDRN}$, unitless')\n", - "text = r'$h = ZDRN + DDN$'\n", + "text = r'$h = ZDRN + DDRN$'\n", "spnspecs.add_text(ax, text=text, x=0.02, y=.98, transform=False, bold=False, ha='left', va='top')\n", "text = r'$h = ZDRN$'\n", "spnspecs.add_text(ax, text=text, x=0.99, y=0.01, transform=False, bold=False, \n", From 61b088307dddab078fd4cb58754aa15c06b1d65c Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 23 Feb 2024 13:26:34 -0500 Subject: [PATCH 039/199] feat(PRT): introduce Particle Tracking (PRT) model (#1389) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit At this time PRT supports particle tracking on all DIS and some but not all DISV grids. DISV cells containing adjacent parallel faces are not properly handled and may cause crashes, this includes quad-refined grids as well as DISV grids generated by FloPy's voronoi module. A GWF-PRT exchange is included, which can be used to couple GWF and PRT models in the same simulation. PRT can also consume flows from a previously run GWF model via FMI. Support is planned but not yet implemented for: * configurable particle mass * local mass conservation — conserved between cells but not yet guaranteed at the subcell level * exchanging particles between models * DISU grids (longer term) * solving models in parallel (longer term) Docs/dfns and tests make up about half the changeset, the rest is fortran source. Input/output format is likely to change without notice until PRT reaches a release-ready state. PRT's primary author is Alden Provost. Some code is adapted from MODPATH and originally due to David Pollock. Co-authored-by: Alden Provost --- .github/common/update_fortran_style.py | 159 +++ .github/workflows/ci.yml | 6 + CITATION.cff | 2 +- autotest/TestMathUtil.f90 | 44 +- autotest/TestTimeSelect.f90 | 111 ++ autotest/build_mfio_tex.py | 2 +- autotest/framework.py | 20 +- autotest/meson.build | 3 +- autotest/prt_test_utils.py | 398 ++++++ autotest/test_examples.py | 5 + autotest/test_gwf_ats02.py | 2 +- autotest/test_prt_budget.py | 350 +++++ autotest/test_prt_disv1.py | 486 +++++++ autotest/test_prt_drape.py | 328 +++++ autotest/test_prt_exg.py | 326 +++++ autotest/test_prt_fmi.py | 383 ++++++ autotest/test_prt_notebooks.py | 250 ++++ autotest/test_prt_release_timing.py | 422 ++++++ autotest/test_prt_stop_zones.py | 424 ++++++ autotest/test_prt_ternary_methods.py | 194 +++ autotest/test_prt_track_events.py | 514 +++++++ autotest/test_prt_triangle.py | 297 ++++ autotest/test_prt_voronoi1.py | 423 ++++++ autotest/test_prt_voronoi2.py | 434 ++++++ autotest/test_prt_weak_sinks.py | 380 ++++++ autotest/tester.f90 | 4 +- doc/mf6io/body.tex | 5 + doc/mf6io/mf6ivar/dfn/exg-gwfprt.dfn | 3 + doc/mf6io/mf6ivar/dfn/prt-dis.dfn | 122 ++ doc/mf6io/mf6ivar/dfn/prt-disv.dfn | 204 +++ doc/mf6io/mf6ivar/dfn/prt-fmi.dfn | 50 + doc/mf6io/mf6ivar/dfn/prt-mip.dfn | 40 + doc/mf6io/mf6ivar/dfn/prt-nam.dfn | 73 + doc/mf6io/mf6ivar/dfn/prt-oc.dfn | 497 +++++++ doc/mf6io/mf6ivar/dfn/prt-prp.dfn | 355 +++++ doc/mf6io/mf6ivar/dfn/sln-pts.dfn | 178 +++ .../mf6ivar/examples/prt-fmi-example.dat | 8 + .../mf6ivar/examples/prt-mip-example.dat | 10 + .../mf6ivar/examples/prt-nam-example.dat | 11 + doc/mf6io/mf6ivar/examples/prt-oc-example.dat | 10 + .../mf6ivar/examples/prt-prp-example.dat | 18 + .../mf6ivar/examples/utl-obs-prt-example.dat | 18 + doc/mf6io/mf6ivar/md/mf6ivar.md | 128 +- doc/mf6io/mf6ivar/md/mf6memvar.md | 75 + doc/mf6io/mf6ivar/mf6ivar.py | 9 + doc/mf6io/mf6ivar/readme.md | 2 +- doc/mf6io/mf6ivar/tex/appendixA.tex | 30 + doc/mf6io/mf6ivar/tex/exg-gwfprt-desc.tex | 3 + doc/mf6io/mf6ivar/tex/gwf-drn-desc.tex | 4 +- doc/mf6io/mf6ivar/tex/gwf-ghb-desc.tex | 6 +- doc/mf6io/mf6ivar/tex/gwf-riv-desc.tex | 6 +- doc/mf6io/mf6ivar/tex/prt-dis-desc.tex | 41 + doc/mf6io/mf6ivar/tex/prt-dis-dimensions.dat | 5 + doc/mf6io/mf6ivar/tex/prt-dis-griddata.dat | 12 + doc/mf6io/mf6ivar/tex/prt-dis-options.dat | 7 + doc/mf6io/mf6ivar/tex/prt-disv-cell2d.dat | 5 + doc/mf6io/mf6ivar/tex/prt-disv-desc.tex | 61 + doc/mf6io/mf6ivar/tex/prt-disv-dimensions.dat | 5 + doc/mf6io/mf6ivar/tex/prt-disv-griddata.dat | 8 + doc/mf6io/mf6ivar/tex/prt-disv-options.dat | 7 + doc/mf6io/mf6ivar/tex/prt-disv-vertices.dat | 5 + doc/mf6io/mf6ivar/tex/prt-fmi-desc.tex | 19 + doc/mf6io/mf6ivar/tex/prt-fmi-options.dat | 3 + doc/mf6io/mf6ivar/tex/prt-fmi-packagedata.dat | 5 + doc/mf6io/mf6ivar/tex/prt-mip-desc.tex | 19 + doc/mf6io/mf6ivar/tex/prt-mip-griddata.dat | 8 + doc/mf6io/mf6ivar/tex/prt-mip-options.dat | 3 + doc/mf6io/mf6ivar/tex/prt-nam-desc.tex | 25 + doc/mf6io/mf6ivar/tex/prt-nam-options.dat | 6 + doc/mf6io/mf6ivar/tex/prt-nam-packages.dat | 5 + doc/mf6io/mf6ivar/tex/prt-oc-desc.tex | 93 ++ doc/mf6io/mf6ivar/tex/prt-oc-options.dat | 17 + doc/mf6io/mf6ivar/tex/prt-oc-period.dat | 4 + doc/mf6io/mf6ivar/tex/prt-prp-desc.tex | 85 ++ doc/mf6io/mf6ivar/tex/prt-prp-dimensions.dat | 3 + doc/mf6io/mf6ivar/tex/prt-prp-options.dat | 12 + doc/mf6io/mf6ivar/tex/prt-prp-packagedata.dat | 5 + doc/mf6io/mf6ivar/tex/prt-prp-period.dat | 5 + doc/mf6io/mf6ivar/tex/sln-pts-desc.tex | 33 + doc/mf6io/mf6ivar/tex/sln-pts-nonlinear.dat | 3 + doc/mf6io/mf6ivar/tex/sln-pts-options.dat | 8 + doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex | 2 +- doc/mf6io/prt/fmi.tex | 50 + doc/mf6io/prt/mip.tex | 16 + doc/mf6io/prt/namefile.tex | 42 + doc/mf6io/prt/oc.tex | 25 + doc/mf6io/prt/prp.tex | 25 + doc/mf6io/prt/prt-obs.tex | 39 + doc/mf6io/prt/prt.tex | 66 + environment.yml | 4 +- make/makefile | 122 +- msvs/mf6.vfproj | 6 +- msvs/mf6core.vfproj | 50 +- msvs/mf6lib.vfproj | 1 - src/Exchange/exg-gwfprt.f90 | 356 +++++ src/Idm/exg-gwfprtidm.f90 | 70 + src/Idm/prt-disidm.f90 | 313 +++++ src/Idm/prt-disvidm.f90 | 460 +++++++ src/Idm/prt-mipidm.f90 | 136 ++ src/Idm/prt-namidm.f90 | 196 +++ src/Idm/selector/IdmDfnSelector.f90 | 13 + src/Idm/selector/IdmExgDfnSelector.f90 | 11 + src/Idm/selector/IdmPrtDfnSelector.f90 | 127 ++ src/Model/ExplicitModel.f90 | 2 +- src/Model/GroundWaterFlow/gwf-disv.f90 | 2 +- src/Model/GroundWaterFlow/gwf-mvr.f90 | 1 - .../ModelUtilities/FlowModelInterface.f90 | 4 +- .../ModelUtilities/ModelPackageInput.f90 | 18 +- src/Model/ModelUtilities/TimeSelect.f90 | 167 +++ src/Model/ModelUtilities/TrackData.f90 | 324 +++++ src/Model/NumericalModel.f90 | 5 + src/Model/ParticleTracking/prt-fmi.f90 | 225 +++ src/Model/ParticleTracking/prt-mip.f90 | 150 ++ src/Model/ParticleTracking/prt-obs.f90 | 235 ++++ src/Model/ParticleTracking/prt-oc.f90 | 376 ++++++ src/Model/ParticleTracking/prt-prp.f90 | 984 ++++++++++++++ src/Model/ParticleTracking/prt.f90 | 1202 +++++++++++++++++ src/Model/TransportModel/tsp-mvt.f90 | 1 - src/Model/TransportModel/tsp.f90 | 1 - src/SimulationCreate.f90 | 18 +- src/Solution/ExplicitSolution.f90 | 39 +- src/Solution/ParticleTracker/Cell.f90 | 24 + src/Solution/ParticleTracker/CellDefn.f90 | 90 ++ src/Solution/ParticleTracker/CellPoly.f90 | 34 + src/Solution/ParticleTracker/CellRect.f90 | 54 + src/Solution/ParticleTracker/CellRectQuad.f90 | 220 +++ src/Solution/ParticleTracker/CellUtil.f90 | 169 +++ src/Solution/ParticleTracker/Method.f90 | 208 +++ .../ParticleTracker/MethodCellPassToBot.f90 | 61 + .../ParticleTracker/MethodCellPollock.f90 | 201 +++ .../ParticleTracker/MethodCellPollockQuad.f90 | 363 +++++ .../ParticleTracker/MethodCellPool.f90 | 41 + .../ParticleTracker/MethodCellTernary.f90 | 397 ++++++ src/Solution/ParticleTracker/MethodDis.f90 | 444 ++++++ src/Solution/ParticleTracker/MethodDisv.f90 | 786 +++++++++++ src/Solution/ParticleTracker/MethodPool.f90 | 30 + .../ParticleTracker/MethodSubcellPollock.f90 | 452 +++++++ .../ParticleTracker/MethodSubcellPool.f90 | 31 + .../ParticleTracker/MethodSubcellTernary.f90 | 495 +++++++ src/Solution/ParticleTracker/Particle.f90 | 361 +++++ src/Solution/ParticleTracker/Subcell.f90 | 31 + src/Solution/ParticleTracker/SubcellRect.f90 | 45 + src/Solution/ParticleTracker/SubcellTri.f90 | 43 + .../ParticleTracker/TernarySolveTrack.f90 | 972 +++++++++++++ src/Utilities/BlockParser.f90 | 27 +- src/Utilities/GeomUtil.f90 | 21 +- src/Utilities/MathUtil.f90 | 16 +- src/Utilities/Observation/Obs.f90 | 2 +- src/meson.build | 50 +- utils/idmloader/dfns.txt | 9 +- 150 files changed, 19759 insertions(+), 151 deletions(-) create mode 100644 .github/common/update_fortran_style.py create mode 100644 autotest/TestTimeSelect.f90 create mode 100644 autotest/prt_test_utils.py create mode 100644 autotest/test_prt_budget.py create mode 100644 autotest/test_prt_disv1.py create mode 100644 autotest/test_prt_drape.py create mode 100644 autotest/test_prt_exg.py create mode 100644 autotest/test_prt_fmi.py create mode 100644 autotest/test_prt_notebooks.py create mode 100644 autotest/test_prt_release_timing.py create mode 100644 autotest/test_prt_stop_zones.py create mode 100644 autotest/test_prt_ternary_methods.py create mode 100644 autotest/test_prt_track_events.py create mode 100644 autotest/test_prt_triangle.py create mode 100644 autotest/test_prt_voronoi1.py create mode 100644 autotest/test_prt_voronoi2.py create mode 100644 autotest/test_prt_weak_sinks.py create mode 100644 doc/mf6io/mf6ivar/dfn/exg-gwfprt.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/prt-dis.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/prt-disv.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/prt-fmi.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/prt-mip.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/prt-nam.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/prt-oc.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/prt-prp.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/sln-pts.dfn create mode 100644 doc/mf6io/mf6ivar/examples/prt-fmi-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/prt-mip-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/prt-nam-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/prt-oc-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/prt-prp-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/utl-obs-prt-example.dat create mode 100644 doc/mf6io/mf6ivar/tex/exg-gwfprt-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/prt-dis-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/prt-dis-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-dis-griddata.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-dis-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-disv-cell2d.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-disv-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/prt-disv-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-disv-griddata.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-disv-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-disv-vertices.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-fmi-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/prt-fmi-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-fmi-packagedata.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-mip-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/prt-mip-griddata.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-mip-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-nam-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/prt-nam-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-nam-packages.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-oc-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/prt-oc-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-oc-period.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-prp-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/prt-prp-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-prp-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-prp-packagedata.dat create mode 100644 doc/mf6io/mf6ivar/tex/prt-prp-period.dat create mode 100644 doc/mf6io/mf6ivar/tex/sln-pts-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/sln-pts-nonlinear.dat create mode 100644 doc/mf6io/mf6ivar/tex/sln-pts-options.dat create mode 100644 doc/mf6io/prt/fmi.tex create mode 100644 doc/mf6io/prt/mip.tex create mode 100644 doc/mf6io/prt/namefile.tex create mode 100644 doc/mf6io/prt/oc.tex create mode 100644 doc/mf6io/prt/prp.tex create mode 100644 doc/mf6io/prt/prt-obs.tex create mode 100644 doc/mf6io/prt/prt.tex create mode 100644 src/Exchange/exg-gwfprt.f90 create mode 100644 src/Idm/exg-gwfprtidm.f90 create mode 100644 src/Idm/prt-disidm.f90 create mode 100644 src/Idm/prt-disvidm.f90 create mode 100644 src/Idm/prt-mipidm.f90 create mode 100644 src/Idm/prt-namidm.f90 create mode 100644 src/Idm/selector/IdmPrtDfnSelector.f90 create mode 100644 src/Model/ModelUtilities/TimeSelect.f90 create mode 100644 src/Model/ModelUtilities/TrackData.f90 create mode 100644 src/Model/ParticleTracking/prt-fmi.f90 create mode 100644 src/Model/ParticleTracking/prt-mip.f90 create mode 100644 src/Model/ParticleTracking/prt-obs.f90 create mode 100644 src/Model/ParticleTracking/prt-oc.f90 create mode 100644 src/Model/ParticleTracking/prt-prp.f90 create mode 100644 src/Model/ParticleTracking/prt.f90 create mode 100644 src/Solution/ParticleTracker/Cell.f90 create mode 100644 src/Solution/ParticleTracker/CellDefn.f90 create mode 100644 src/Solution/ParticleTracker/CellPoly.f90 create mode 100644 src/Solution/ParticleTracker/CellRect.f90 create mode 100644 src/Solution/ParticleTracker/CellRectQuad.f90 create mode 100644 src/Solution/ParticleTracker/CellUtil.f90 create mode 100644 src/Solution/ParticleTracker/Method.f90 create mode 100644 src/Solution/ParticleTracker/MethodCellPassToBot.f90 create mode 100644 src/Solution/ParticleTracker/MethodCellPollock.f90 create mode 100644 src/Solution/ParticleTracker/MethodCellPollockQuad.f90 create mode 100644 src/Solution/ParticleTracker/MethodCellPool.f90 create mode 100644 src/Solution/ParticleTracker/MethodCellTernary.f90 create mode 100644 src/Solution/ParticleTracker/MethodDis.f90 create mode 100644 src/Solution/ParticleTracker/MethodDisv.f90 create mode 100644 src/Solution/ParticleTracker/MethodPool.f90 create mode 100644 src/Solution/ParticleTracker/MethodSubcellPollock.f90 create mode 100644 src/Solution/ParticleTracker/MethodSubcellPool.f90 create mode 100644 src/Solution/ParticleTracker/MethodSubcellTernary.f90 create mode 100644 src/Solution/ParticleTracker/Particle.f90 create mode 100644 src/Solution/ParticleTracker/Subcell.f90 create mode 100644 src/Solution/ParticleTracker/SubcellRect.f90 create mode 100644 src/Solution/ParticleTracker/SubcellTri.f90 create mode 100644 src/Solution/ParticleTracker/TernarySolveTrack.f90 diff --git a/.github/common/update_fortran_style.py b/.github/common/update_fortran_style.py new file mode 100644 index 00000000000..6b71687198a --- /dev/null +++ b/.github/common/update_fortran_style.py @@ -0,0 +1,159 @@ +import argparse +import re +from contextlib import nullcontext +from itertools import repeat +from pathlib import Path +from typing import Iterator, Optional +from warnings import warn + +from fprettify.fparse_utils import InputStream + +INTENT_PATTERN = re.compile(r".*(intent\(.+\)).*") + + +def get_intent(s) -> Optional[str]: + result = INTENT_PATTERN.match(s) + return result.group(1) if result else None + + +def get_param(s) -> bool: + return "parameter" in s + + +def get_comments(comments) -> Iterator[str]: + for comment in comments: + if not any(comment): + continue + yield comment.rstrip() + + +class Transforms: + @staticmethod + def separate_lines(path, overwrite=False): + """Variables defined on separate lines""" + + flines = [] + with open(path, "r") as f: + stream = InputStream(f) + while 1: + line, comments, lines = stream.next_fortran_line() + if not lines: + break + line = line.rstrip() + parts = line.rpartition("::") + comments = " " + "".join(get_comments(comments)) + if not parts[1] or "procedure" in parts[0]: + for l in lines: + flines.append(l.rstrip()) + continue + + nspaces = len(lines[0]) - len(lines[0].lstrip()) + prefix = "".join(repeat(" ", nspaces)) + vtype = parts[0].split(",")[0].strip() + split = parts[2].split(",") + intent = get_intent(parts[0]) + param = get_param(parts[0]) + + if not line: + continue + if (len(parts[0]) == 0 and len(parts[1]) == 0) or ( + "(" in parts[2] or ")" in parts[2] + ): + flines.append(prefix + line + comments) + elif len(split) == 1: + flines.append(prefix + line + comments) + elif param: + flines.append(prefix + line + comments) + else: + for s in split: + if s.strip() == "&": + continue + l = prefix + vtype + if intent: + l += f", {intent}" + l += f" :: {s.strip()}" + flines.append(l + comments) + + with open(path, "w") if overwrite else nullcontext() as f: + + def write(line): + if overwrite: + f.write(line + "\n") + else: + print(line) + + for line in flines: + write(line) + + @staticmethod + def no_return_statements(path, overwrite=False): + """Remove return statements at the end of routines""" + # todo + pass + + @staticmethod + def no_empty_comments(path, overwrite=False): + """Remove comments on lines with only whitespace""" + # todo + pass + + +def reformat(path, overwrite, separate_lines, no_return_statements, no_empty_comments): + if separate_lines: + Transforms.separate_lines(path, overwrite=overwrite) + if no_return_statements: + Transforms.no_return_statements(path, overwrite=overwrite) + warn("--no-return not implemented yet") + if no_empty_comments: + Transforms.no_empty_comments(path, overwrite=overwrite) + warn("--no-empty-comments not implemented yet") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + """ + Modify MODFLOW 6 Fortran source code, either writing to stdout or + overwriting the input file. Options are provided for several code + styles. + """ + ) + parser.add_argument( + "-i", "--input", help="path to input file" # todo: or directory + ) + parser.add_argument( + "-f", + "--force", + action="store_true", + default=False, + required=False, + help="overwrite/reformat files", + ) + parser.add_argument( + "--separate-lines", + action="store_true", + default=True, + required=False, + help="define variables on separate lines", + ) + parser.add_argument( + "--no-return_statements", + action="store_true", + default=False, + required=False, + help="no return statements at the end of routines", + ) + parser.add_argument( + "--no-empty-comments", + action="store_true", + default=False, + required=False, + help="no empty comments", + ) + args = parser.parse_args() + reformat( + path=Path(args.input).expanduser().absolute(), + overwrite=args.force, + separate_lines=args.separate_lines, + no_return_statements=args.no_return_statements, + no_empty_comments=args.no_empty_comments, + ) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 36d47d7bfce..365a55d7d0a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -336,6 +336,12 @@ jobs: with: repository: MODFLOW-USGS/modflow6-testmodels path: modflow6-testmodels + + - name: Checkout modflow6-examples + uses: actions/checkout@v4 + with: + repository: MODFLOW-USGS/modflow6-examples + path: modflow6-examples - name: Setup Micromamba uses: mamba-org/setup-micromamba@v1 diff --git a/CITATION.cff b/CITATION.cff index 094e7d0686d..08cfa01c6d4 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -55,7 +55,7 @@ authors: alias: mjreno - family-names: Bonelli given-names: Wesley P. - alias: w-bonelli + alias: wpbonelli affiliation: U.S. Geological Survey orcid: https://orcid.org/0000-0002-2665-5078 - family-names: Boyce diff --git a/autotest/TestMathUtil.f90 b/autotest/TestMathUtil.f90 index a07ad0af55c..18b377fd06d 100644 --- a/autotest/TestMathUtil.f90 +++ b/autotest/TestMathUtil.f90 @@ -4,7 +4,7 @@ module TestMathUtil use testdrive, only: check, error_type, new_unittest, test_failed, & to_string, unittest_type use MathUtilModule, only: f1d, is_close, mod_offset, & - zeroch, zerotest, zeroin + zero_ch, zero_test, zero_br implicit none private public :: collect_mathutil @@ -19,12 +19,12 @@ subroutine collect_mathutil(testsuite) test_is_close_symmetric_near_0), & new_unittest("mod_offset", & test_mod_offset), & - new_unittest("zeroch", & - test_zeroch), & - new_unittest("zeroin", & - test_zeroin), & - new_unittest("zerotest", & - test_zerotest) & + new_unittest("zero_ch", & + test_zero_ch), & + new_unittest("zero_br", & + test_zero_br), & + new_unittest("zero_test", & + test_zero_test) & ] end subroutine collect_mathutil @@ -177,7 +177,7 @@ pure function sine(bet) result(s) s = sin(bet) end function sine - subroutine test_zeroch(error) + subroutine test_zero_ch(error) type(error_type), allocatable, intent(out) :: error real(DP), parameter :: pi = 4 * atan(1.0_DP) real(DP) :: z @@ -185,20 +185,20 @@ subroutine test_zeroch(error) f => sine - z = zeroch(-1.0_DP, 1.0_DP, f, 0.001_DP) + z = zero_ch(-1.0_DP, 1.0_DP, f, 0.001_DP) call check(error, is_close(z, 0.0_DP, atol=1d-6), & 'expected 0, got: '//to_string(z)) - z = zeroch(-4.0_DP, -1.0_DP, f, 0.001_DP) + z = zero_ch(-4.0_DP, -1.0_DP, f, 0.001_DP) call check(error, is_close(z, -pi, atol=1d-6), & 'expected -pi, got: '//to_string(z)) - z = zeroch(1.0_DP, 4.0_DP, f, 0.001_DP) + z = zero_ch(1.0_DP, 4.0_DP, f, 0.001_DP) call check(error, is_close(z, pi, atol=1d-6), & 'expected pi, got: '//to_string(z)) - end subroutine test_zeroch + end subroutine test_zero_ch - subroutine test_zeroin(error) + subroutine test_zero_br(error) type(error_type), allocatable, intent(out) :: error real(DP), parameter :: pi = 4 * atan(1.0_DP) real(DP) :: z @@ -206,20 +206,20 @@ subroutine test_zeroin(error) f => sine - z = zeroin(-1.0_DP, 1.0_DP, f, 0.001_DP) + z = zero_br(-1.0_DP, 1.0_DP, f, 0.001_DP) call check(error, is_close(z, 0.0_DP, atol=1d-6), & 'expected 0, got: '//to_string(z)) - z = zeroin(-4.0_DP, -1.0_DP, f, 0.001_DP) + z = zero_br(-4.0_DP, -1.0_DP, f, 0.001_DP) call check(error, is_close(z, -pi, atol=1d-6), & 'expected -pi, got: '//to_string(z)) - z = zeroin(1.0_DP, 4.0_DP, f, 0.001_DP) + z = zero_br(1.0_DP, 4.0_DP, f, 0.001_DP) call check(error, is_close(z, pi, atol=1d-6), & 'expected pi, got: '//to_string(z)) - end subroutine test_zeroin + end subroutine test_zero_br - subroutine test_zerotest(error) + subroutine test_zero_test(error) type(error_type), allocatable, intent(out) :: error real(DP), parameter :: pi = 4 * atan(1.0_DP) real(DP) :: z @@ -227,17 +227,17 @@ subroutine test_zerotest(error) f => sine - z = zerotest(-1.0_DP, 1.0_DP, f, 0.001_DP) + z = zero_test(-1.0_DP, 1.0_DP, f, 0.001_DP) call check(error, is_close(z, 0.0_DP, atol=1d-6), & 'expected 0, got: '//to_string(z)) - z = zerotest(-4.0_DP, -1.0_DP, f, 0.001_DP) + z = zero_test(-4.0_DP, -1.0_DP, f, 0.001_DP) call check(error, is_close(z, -pi, atol=1d-6), & 'expected -pi, got: '//to_string(z)) - z = zerotest(1.0_DP, 4.0_DP, f, 0.001_DP) + z = zero_test(1.0_DP, 4.0_DP, f, 0.001_DP) call check(error, is_close(z, pi, atol=1d-6), & 'expected pi, got: '//to_string(z)) - end subroutine test_zerotest + end subroutine test_zero_test end module TestMathUtil diff --git a/autotest/TestTimeSelect.f90 b/autotest/TestTimeSelect.f90 new file mode 100644 index 00000000000..a1b80a9de10 --- /dev/null +++ b/autotest/TestTimeSelect.f90 @@ -0,0 +1,111 @@ +module TestTimeSelect + use KindModule, only: I4B, DP, LGP + use testdrive, only: check, error_type, new_unittest, test_failed, & + to_string, unittest_type + use TimeSelectModule, only: TimeSelectType + use ConstantsModule, only: LINELENGTH + implicit none + private + public :: collect_timeselect + +contains + subroutine collect_timeselect(testsuite) + type(unittest_type), allocatable, intent(out) :: testsuite(:) + testsuite = [ & + new_unittest("is_increasing", test_is_increasing), & + new_unittest("slice", test_slice) & + ] + end subroutine collect_timeselect + + subroutine test_is_increasing(error) + type(error_type), allocatable, intent(out) :: error + type(TimeSelectType) :: ts + + call ts%expand(3) + + ! increasing + ts%times = (/0.0_DP, 1.0_DP, 2.0_DP/) + call check(error, ts%increasing()) + + ! not decreasing + ts%times = (/0.0_DP, 0.0_DP, 2.0_DP/) + call check(error,.not. ts%increasing()) + + ! decreasing + ts%times = (/2.0_DP, 1.0_DP, 0.0_DP/) + call check(error,.not. ts%increasing()) + end subroutine + + subroutine test_slice(error) + type(error_type), allocatable, intent(out) :: error + type(TimeSelectType) :: ts + logical(LGP) :: changed + + call ts%expand(3) + ts%times = (/0.0_DP, 1.0_DP, 2.0_DP/) + call check( & + error, & + size(ts%times) == 3, & + "expected size 3, got"//to_string(size(ts%times))) + + ! empty slice + call ts%select(1.1_DP, 1.9_DP) + call check( & + error, & + ts%selection(1) == -1 .and. ts%selection(2) == -1, & + "empty slice failed, got ["// & + to_string(ts%selection(1))//","//to_string(ts%selection(2))//"]") + + ! single-item slice + call ts%select(0.5_DP, 1.5_DP) + call check( & + error, & + ts%selection(1) == 2 .and. ts%selection(2) == 2, & + "1-item slice failed, got ["// & + to_string(ts%selection(1))//","//to_string(ts%selection(2))//"]") + + ! multi-item slice + changed = .false. + call ts%select(0.5_DP, 2.5_DP, changed=changed) + call check(error, changed) + call check( & + error, & + ts%selection(1) == 2 .and. ts%selection(2) == 3, & + "2-item slice failed, got ["// & + to_string(ts%selection(1))//","//to_string(ts%selection(2))//"]") + + ! no-change + call ts%select(0.1_DP, 2.5_DP, changed=changed) + call check(error,.not. changed) + call check( & + error, & + ts%selection(1) == 2 .and. ts%selection(2) == 3, & + "2-item slice failed, got ["// & + to_string(ts%selection(1))//","//to_string(ts%selection(2))//"]") + + ! lower bound equal to a time value + call ts%select(0.0_DP, 2.5_DP) + call check( & + error, & + ts%selection(1) == 1 .and. ts%selection(2) == 3, & + "lb eq slice failed, got [" & + //to_string(ts%selection(1))//","//to_string(ts%selection(2))//"]") + + ! upper bound equal to a time value + call ts%select(-0.5_DP, 2.0_DP) + call check( & + error, & + ts%selection(1) == 1 .and. ts%selection(2) == 3, & + "ub eq slice failed, got [" & + //to_string(ts%selection(1))//","//to_string(ts%selection(2))//"]") + + ! both bounds equal to a time value + call ts%select(0.0_DP, 2.0_DP) + call check( & + error, & + ts%selection(1) == 1 .and. ts%selection(2) == 3, & + "lb ub eq slice failed, got [" & + //to_string(ts%selection(1))//","//to_string(ts%selection(2))//"]") + + end subroutine test_slice +end module TestTimeSelect diff --git a/autotest/build_mfio_tex.py b/autotest/build_mfio_tex.py index aca75f8e242..04c79d8e969 100644 --- a/autotest/build_mfio_tex.py +++ b/autotest/build_mfio_tex.py @@ -31,7 +31,7 @@ def test_clean_latex(): files = [ f"{base_name}.pdf", f"{base_name}.aux", - f"{base_name}.bbl", + # f"{base_name}.bbl", ] delete_files(files, pth, allow_failure=True) return diff --git a/autotest/framework.py b/autotest/framework.py index 23de078b6ad..dfc0fa8d366 100644 --- a/autotest/framework.py +++ b/autotest/framework.py @@ -299,10 +299,19 @@ def _compare_heads( else: files2.append(None) - if self.cmp_namefile is None: + # todo: clean up namfile path detection? + nf = next(iter(get_namefiles(cpth)), None) + cmp_namefile = ( + None + if "mf6" in self.compare or "libmf6" in self.compare + else os.path.basename(nf) + if nf + else None + ) + if cmp_namefile is None: pth = None else: - pth = os.path.join(cpth, self.cmp_namefile) + pth = os.path.join(cpth, cmp_namefile) for i in range(len(files1)): file1 = files1[i] @@ -629,8 +638,13 @@ def _run_sim_or_model( else: # non-MF6 model try: + nf_ext = ".mpsim" if "mp7" in target.name else ".nam" + namefile = next(iter(workspace.glob(f"*{nf_ext}")), None) + assert ( + namefile + ), f"Control file with extension {nf_ext} not found" success, buff = flopy.run_model( - target, self.cmp_namefile, workspace, report=True + target, namefile, workspace, report=True ) except Exception: warn(f"{target} model failed:\n{format_exc()}") diff --git a/autotest/meson.build b/autotest/meson.build index a36d6e1e82e..dc9ee68a221 100644 --- a/autotest/meson.build +++ b/autotest/meson.build @@ -9,7 +9,8 @@ if test_drive.found() and not fc_id.contains('intel') 'List', 'MathUtil', 'Message', - 'Sim' + 'Sim', + 'TimeSelect' ] test_srcs = files( diff --git a/autotest/prt_test_utils.py b/autotest/prt_test_utils.py new file mode 100644 index 00000000000..ebce0529780 --- /dev/null +++ b/autotest/prt_test_utils.py @@ -0,0 +1,398 @@ +import os +from types import SimpleNamespace +from typing import Tuple + +import flopy +import matplotlib as mpl +import numpy as np + + +def all_equal(series, val): + a = series.to_numpy() + return a[0] == val and (a[0] == a).all() + + +class HorizontalCase: + nlay = 1 + nrow = 1 + ncol = 10 + top = 1 + botm = [0.0] + nper = 1 + perlen = 1.0 + nstp = 1 + tsmult = 1.0 + porosity = 0.1 + releasepts_mp7 = [ + # node number, localx, localy, localz + (0, float(f"0.{i + 1}"), float(f"0.{i + 1}"), 0.5) + for i in range(9) + ] + releasepts_prt = [ + # particle index, k, i, j, x, y, z + [i, 0, 0, 0, float(f"0.{i + 1}"), float(f"9.{i + 1}"), 0.5] + for i in range(9) + ] + + @staticmethod + def get_gwf_sim(name, ws, mf6) -> flopy.mf6.MFSimulation: + """ + Simple GWF simulation on a simple horizontal line grid. + """ + + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=name, + exe_name=mf6, + version="mf6", + sim_ws=ws, + ) + + # create tdis package + flopy.mf6.modflow.mftdis.ModflowTdis( + sim, + pname="tdis", + time_units="DAYS", + nper=HorizontalCase.nper, + perioddata=[ + (HorizontalCase.perlen, HorizontalCase.nstp, HorizontalCase.tsmult) + ], + ) + + # create gwf model + gwfname = f"{name}_gwf" + gwf = flopy.mf6.ModflowGwf(sim, modelname=gwfname, save_flows=True) + + # create gwf discretization + flopy.mf6.modflow.mfgwfdis.ModflowGwfdis( + gwf, + pname="dis", + nlay=HorizontalCase.nlay, + nrow=HorizontalCase.nrow, + ncol=HorizontalCase.ncol, + ) + + # create gwf initial conditions package + flopy.mf6.modflow.mfgwfic.ModflowGwfic(gwf, pname="ic") + + # create gwf node property flow package + flopy.mf6.modflow.mfgwfnpf.ModflowGwfnpf( + gwf, + pname="npf", + save_saturation=True, + save_specific_discharge=True, + ) + + # create gwf chd package + spd = { + 0: [[(0, 0, 0), 1.0, 1.0], [(0, 0, 9), 0.0, 0.0]], + 1: [[(0, 0, 0), 0.0, 0.0], [(0, 0, 9), 1.0, 2.0]], + } + chd = flopy.mf6.ModflowGwfchd( + gwf, + pname="CHD-1", + stress_period_data=spd, + auxiliary=["concentration"], + ) + + # create gwf output control package + # output file names + gwf_budget_file = f"{gwfname}.bud" + gwf_head_file = f"{gwfname}.hds" + oc = flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord=gwf_budget_file, + head_filerecord=gwf_head_file, + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + ) + + # create iterative model solution for gwf model + ims = flopy.mf6.ModflowIms(sim) + + return sim + + +class FlopyReadmeCase: + nlay = 1 + nrow = 10 + ncol = 10 + top = 1.0 + botm = [0.0] + nper = 1 + perlen = 1.0 + nstp = 1 + tsmult = 1.0 + porosity = 0.1 + releasepts_mp7 = [ + # node number, localx, localy, localz + (0, float(f"0.{i + 1}"), float(f"0.{i + 1}"), 0.5) + for i in range(9) + ] + releasepts_prt = [ + # particle index, k, i, j, x, y, z + [i, 0, 0, 0, float(f"0.{i + 1}"), float(f"9.{i + 1}"), 0.5] + for i in range(9) + ] + + @staticmethod + def get_gwf_sim(name, ws, mf6) -> flopy.mf6.MFSimulation: + """ + Simple GWF simulation for use/modification by PRT tests + """ + + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=name, + exe_name=mf6, + version="mf6", + sim_ws=ws, + ) + + # create tdis package + flopy.mf6.modflow.mftdis.ModflowTdis( + sim, + pname="tdis", + time_units="DAYS", + nper=FlopyReadmeCase.nper, + perioddata=[ + (FlopyReadmeCase.perlen, FlopyReadmeCase.nstp, FlopyReadmeCase.tsmult) + ], + ) + + # create gwf model + gwfname = f"{name}_gwf" + gwf = flopy.mf6.ModflowGwf(sim, modelname=gwfname, save_flows=True) + + # create gwf discretization + flopy.mf6.modflow.mfgwfdis.ModflowGwfdis( + gwf, + pname="dis", + nlay=FlopyReadmeCase.nlay, + nrow=FlopyReadmeCase.nrow, + ncol=FlopyReadmeCase.ncol, + ) + + # create gwf initial conditions package + flopy.mf6.modflow.mfgwfic.ModflowGwfic(gwf, pname="ic") + + # create gwf node property flow package + flopy.mf6.modflow.mfgwfnpf.ModflowGwfnpf( + gwf, + pname="npf", + save_saturation=True, + save_specific_discharge=True, + ) + + # create gwf chd package + spd = { + 0: [[(0, 0, 0), 1.0, 1.0], [(0, 9, 9), 0.0, 0.0]], + 1: [[(0, 0, 0), 0.0, 0.0], [(0, 9, 9), 1.0, 2.0]], + } + chd = flopy.mf6.ModflowGwfchd( + gwf, + pname="CHD-1", + stress_period_data=spd, + auxiliary=["concentration"], + ) + + # create gwf output control package + # output file names + gwf_budget_file = f"{gwfname}.bud" + gwf_head_file = f"{gwfname}.hds" + oc = flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord=gwf_budget_file, + head_filerecord=gwf_head_file, + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + ) + + # create iterative model solution for gwf model + ims = flopy.mf6.ModflowIms(sim) + + return sim + + +def check_track_data( + track_bin: os.PathLike, + track_hdr: os.PathLike, + track_csv: os.PathLike, +): + """Check that binary and CSV track files are equal.""" + + # get dtype from ascii header file + dt = get_track_dtype(track_hdr) + + # read output files + data_bin = np.fromfile(track_bin, dtype=dt) + data_csv = np.genfromtxt(track_csv, dtype=dt, delimiter=",", names=True) + if len(data_csv.shape) == 0: + # https://stackoverflow.com/a/24943993/6514033 + data_csv = np.array([data_csv]) + + assert ( + data_bin.shape == data_csv.shape + ), f"Binary and CSV track data shapes do not match: {data_bin.shape} != {data_csv.shape}" + + # check each column separately to avoid + # TypeError: The DType could not be promoted by + for k in data_bin.dtype.names: + if k == "name": + continue + assert np.allclose(data_bin[k], data_csv[k], equal_nan=True) + + # make sure columns all have values in the expected range + assert all(data_bin["iprp"] >= 1) + assert all(data_bin["irpt"] >= 1) + assert all(data_bin["kper"] >= 1) + assert all(data_bin["kstp"] >= 1) + assert all(data_bin["ilay"] >= 1) + assert all(data_bin["icell"] >= 1) + assert all(data_bin["istatus"] >= 0) + assert all(data_bin["ireason"] >= 0) + + +def check_budget_data(lst: os.PathLike, perlen=1, nper=1, nstp=1): + # load PRT model's list file + mflist = flopy.utils.mflistfile.ListBudget( + lst, budgetkey="MASS BUDGET FOR ENTIRE MODEL" + ) + names = mflist.get_record_names() + entries = mflist.entries + + # check timesteps + inc = mflist.get_incremental() + v = inc["totim"][-1] + exp = float(perlen * nper) + assert v == exp, f"Last time should be {exp}, found {v}" + + # entries should be a subset of names + assert all(e in names for e in entries) + + # todo what other record names should we expect? + expected_entries = [ + "PRP_IN", + "PRP_OUT", + ] + assert all(en in names for en in expected_entries) + + # import pdb + # pdb.set_trace() + + +def get_model_name(name, mdl): + return f"{name}_{mdl}" + + +def get_track_dtype(path: os.PathLike): + """Read a numpy dtype describing particle track + data format from the ascii track header file.""" + + hdr_lns = open(path).readlines() + hdr_lns_spl = [[ll.strip() for ll in l.split(",")] for l in hdr_lns] + return np.dtype(list(zip(hdr_lns_spl[0], hdr_lns_spl[1]))) + + +def get_ireason_code(output_event): + """ + Map output event to PRT ireason code specifing + the reason a particle track datum was recorded. + """ + + return ( + 0 + if output_event == "RELEASE" + else ( + 1 + if output_event == "TRANSIT" + else ( + 2 + if output_event == "TIMESTEP" + else ( + 3 + if output_event == "TERMINATE" + else 4 if output_event == "WEAKSINK" else -1 + ) + ) + ) # default + ) + + +def get_partdata(grid, rpts): + """ + Make a flopy.modpath.ParticleData from the given grid and release points. + """ + + if grid.grid_type == "structured": + return flopy.modpath.ParticleData( + partlocs=[grid.get_lrc(p[0])[0] for p in rpts], + structured=True, + localx=[p[1] for p in rpts], + localy=[p[2] for p in rpts], + localz=[p[3] for p in rpts], + timeoffset=0, + drape=0, + ) + else: + return flopy.modpath.ParticleData( + partlocs=[p[0] for p in rpts], + structured=False, + localx=[p[1] for p in rpts], + localy=[p[2] for p in rpts], + localz=[p[3] for p in rpts], + timeoffset=0, + drape=0, + ) + + +def has_default_boundnames(data): + name = [int(n.partition("0")[2]) for n in data["name"].to_numpy()] + irpt = data["irpt"].to_numpy() + return np.array_equal(name, irpt) + + +def plot_nodes_and_vertices( + gwf, mg, ibd, ncpl, ax, xmin=None, xmax=None, ymin=None, ymax=None +): + """ + Plot cell nodes and vertices (and IDs) on a zoomed inset + """ + + ax.set_aspect("equal") + xlim = False + ylim = False + if xmin is not None and xmax is not None: + ax.set_xlim([xmin, xmax]) + xlim = True + if ymin is not None and ymax is not None: + ax.set_ylim([ymin, ymax]) + ylim = True + + # create map view plot + pmv = flopy.plot.PlotMapView(gwf, ax=ax) + v = pmv.plot_grid(lw=0.5, edgecolor="black") + t = ax.set_title("Node and vertex indices (one-based)\n", fontsize=14) + ax.set_xlim([xmin, xmax]) + ax.set_ylim([ymin, ymax]) + + # plot vertices + verts = mg.verts + ax.plot(verts[:, 0], verts[:, 1], "bo", alpha=0.5) + for i in range(ncpl): + x, y = verts[i, 0], verts[i, 1] + ax.annotate(str(i + 1), verts[i, :], color="b", alpha=0.5) + + # plot nodes + xc, yc = mg.get_xcellcenters_for_layer(0), mg.get_ycellcenters_for_layer(0) + for i in range(ncpl): + x, y = xc[i], yc[i] + ax.plot(x, y, "o", color="grey", alpha=0.5) + ax.annotate(str(i + 1), (x, y), color="grey", alpha=0.5) + + # create legend + ax.legend( + handles=[ + mpl.patches.Patch(color="blue", label="vertex"), + mpl.patches.Patch(color="grey", label="node"), + ], + loc="upper left", + ) diff --git a/autotest/test_examples.py b/autotest/test_examples.py index 4e8c6de357a..57f974c7148 100644 --- a/autotest/test_examples.py +++ b/autotest/test_examples.py @@ -45,6 +45,11 @@ def test_scenario( targets, ): name, namefiles = example_scenario + exdirs = [nf.parent for nf in namefiles] + + if "prt" in name: + pytest.skip(f"Excluding mf6 prt model (tested separately): {name}") + if name in excluded_models: pytest.skip(f"Skipping: {name} (excluded)") diff --git a/autotest/test_gwf_ats02.py b/autotest/test_gwf_ats02.py index 7e03230de24..7514eeafed5 100644 --- a/autotest/test_gwf_ats02.py +++ b/autotest/test_gwf_ats02.py @@ -202,7 +202,7 @@ def make_plot(test): label=f"Layer {ilay + 1}", ) plt.legend() - plt.show() + # plt.show() def check_output(idx, test): diff --git a/autotest/test_prt_budget.py b/autotest/test_prt_budget.py new file mode 100644 index 00000000000..234811afca3 --- /dev/null +++ b/autotest/test_prt_budget.py @@ -0,0 +1,350 @@ +""" +Tests particle mass budget tracking with a very +simple horizontal steady-state flow system. The +grid is a 1x1x10 horizontal line with 10 columns. +Particles are released from the left-most cell. +Pathlines are compared against a MODPATH 7 model. +""" + +from pathlib import Path + +import flopy +import matplotlib.cm as cm +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pytest +from flopy.plot.plotutil import to_mp7_pathlines +from flopy.utils import PathlineFile +from flopy.utils.binaryfile import HeadFile +from flopy.mf6.utils.postprocessing import get_structured_faceflows +from prt_test_utils import ( + HorizontalCase, + all_equal, + check_budget_data, + check_track_data, + get_model_name, + get_partdata, + has_default_boundnames, +) + +from framework import TestFramework + +simname = "prtbud" +cases = [simname] + + +def build_prt_sim(name, gwf_ws, prt_ws, mf6): + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=name, + exe_name=mf6, + version="mf6", + sim_ws=prt_ws, + ) + + # create tdis package + flopy.mf6.modflow.mftdis.ModflowTdis( + sim, + pname="tdis", + time_units="DAYS", + nper=HorizontalCase.nper, + perioddata=[ + (HorizontalCase.perlen, HorizontalCase.nstp, HorizontalCase.tsmult) + ], + ) + + # create prt model + prt_name = get_model_name(name, "prt") + prt = flopy.mf6.ModflowPrt(sim, modelname=prt_name, save_flows=True) + + # create prt discretization + flopy.mf6.modflow.mfgwfdis.ModflowGwfdis( + prt, + pname="dis", + nlay=HorizontalCase.nlay, + nrow=HorizontalCase.nrow, + ncol=HorizontalCase.ncol, + ) + + # create mip package + flopy.mf6.ModflowPrtmip(prt, pname="mip", porosity=HorizontalCase.porosity) + + # convert mp7 to prt release points and check against expectation + partdata = get_partdata(prt.modelgrid, HorizontalCase.releasepts_mp7) + coords = partdata.to_coords(prt.modelgrid) + releasepts = [(i, 0, 0, 0, c[0], c[1], c[2]) for i, c in enumerate(coords)] + # assert np.allclose(HorizontalCase.releasepts_prt, releasepts) + + # create prp package + prp_track_file = f"{prt_name}.prp.trk" + prp_track_csv_file = f"{prt_name}.prp.trk.csv" + flopy.mf6.ModflowPrtprp( + prt, + pname="prp1", + filename=f"{prt_name}_1.prp", + nreleasepts=len(releasepts), + packagedata=releasepts, + perioddata={0: ["FIRST"]}, + track_filerecord=[prp_track_file], + trackcsv_filerecord=[prp_track_csv_file], + stop_at_weak_sink="saws" in prt_name, + boundnames=True, + ) + + # create output control package + prt_budget_file = f"{prt_name}.bud" + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + budget_filerecord=[prt_budget_file], + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + saverecord=[("BUDGET", "ALL")], + ) + + # create the flow model interface + gwf_name = get_model_name(name, "gwf") + gwf_budget_file = gwf_ws / f"{gwf_name}.bud" + gwf_head_file = gwf_ws / f"{gwf_name}.hds" + flopy.mf6.ModflowPrtfmi( + prt, + packagedata=[ + ("GWFHEAD", gwf_head_file), + ("GWFBUDGET", gwf_budget_file), + ], + ) + + # add explicit model solution + ems = flopy.mf6.ModflowEms( + sim, + pname="ems", + filename=f"{prt_name}.ems", + ) + sim.register_solution_package(ems, [prt.name]) + + return sim + + +def build_mp7_sim(name, ws, mp7, gwf): + partdata = get_partdata(gwf.modelgrid, HorizontalCase.releasepts_mp7) + mp7_name = get_model_name(name, "mp7") + pg = flopy.modpath.ParticleGroup( + particlegroupname="G1", + particledata=partdata, + filename=f"{mp7_name}.sloc", + ) + mp = flopy.modpath.Modpath7( + modelname=mp7_name, + flowmodel=gwf, + exe_name=mp7, + model_ws=ws, + headfilename=f"{gwf.name}.hds", + budgetfilename=f"{gwf.name}.bud", + ) + mpbas = flopy.modpath.Modpath7Bas( + mp, + porosity=HorizontalCase.porosity, + ) + mpsim = flopy.modpath.Modpath7Sim( + mp, + simulationtype="pathline", + trackingdirection="forward", + budgetoutputoption="summary", + stoptimeoption="extend", + particlegroups=[pg], + ) + + return mp + + +def build_models(idx, test): + gwf_sim = HorizontalCase.get_gwf_sim( + test.name, test.workspace, test.targets["mf6"] + ) + prt_sim = build_prt_sim( + test.name, test.workspace, test.workspace / "prt", test.targets["mf6"] + ) + mp7_sim = build_mp7_sim( + test.name, + test.workspace / "mp7", + test.targets["mp7"], + gwf_sim.get_model(), + ) + return gwf_sim, prt_sim, mp7_sim + + +def check_output(idx, test): + name = test.name + gwf_ws = test.workspace + prt_ws = test.workspace / "prt" + mp7_ws = test.workspace / "mp7" + gwf_name = get_model_name(name, "gwf") + prt_name = get_model_name(name, "prt") + mp7_name = get_model_name(name, "mp7") + gwf_sim = test.sims[0] + gwf = gwf_sim.get_model(gwf_name) + mg = gwf.modelgrid + + # check mf6 output files exist + gwf_budget_file = f"{gwf_name}.bud" + gwf_head_file = f"{gwf_name}.hds" + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + prp_track_file = f"{prt_name}.prp.trk" + prp_track_csv_file = f"{prt_name}.prp.trk.csv" + assert (gwf_ws / gwf_budget_file).is_file() + assert (gwf_ws / gwf_head_file).is_file() + assert (prt_ws / prt_track_file).is_file() + assert (prt_ws / prt_track_csv_file).is_file() + assert (prt_ws / prp_track_file).is_file() + assert (prt_ws / prp_track_csv_file).is_file() + + # check mp7 output files exist + mp7_pathline_file = f"{mp7_name}.mppth" + assert (mp7_ws / mp7_pathline_file).is_file() + + # load mp7 pathline results + plf = PathlineFile(mp7_ws / mp7_pathline_file) + mp7_pls = pd.DataFrame( + plf.get_destination_pathline_data(range(mg.nnodes), to_recarray=True) + ) + # convert zero-based to one-based indexing in mp7 results + mp7_pls["particlegroup"] = mp7_pls["particlegroup"] + 1 + mp7_pls["node"] = mp7_pls["node"] + 1 + mp7_pls["k"] = mp7_pls["k"] + 1 + + # load mf6 pathline results + mf6_pls = pd.read_csv(prt_ws / prt_track_csv_file, na_filter=False) + + # make sure pathline df has "name" (boundname) column and default values + assert "name" in mf6_pls + assert has_default_boundnames(mf6_pls) + + # make sure all mf6 pathline data have correct model and PRP index (1) + assert all_equal(mf6_pls["imdl"], 1) + assert all_equal(mf6_pls["iprp"], 1) + + # check budget data were written to mf6 prt list file + check_budget_data( + prt_ws / f"{name}_prt.lst", HorizontalCase.perlen, HorizontalCase.nper + ) + + # check cell-by-cell particle mass flows + prt_budget_file = prt_ws / f"{prt_name}.bud" + prt_bud = flopy.utils.CellBudgetFile(prt_budget_file, precision="double") + prt_bud_data = prt_bud.get_data(kstpkper=(0, 0)) + assert len(prt_bud_data) == 2 + flowja = prt_bud.get_data(text="FLOW-JA-FACE")[0][0, 0, :] + prp = prt_bud.get_data(text="PRP")[0].squeeze() + assert flowja.shape == (28,) + assert prp.shape == (9,) + frf, fff, flf = get_structured_faceflows( + flowja, + grb_file=gwf_ws / f"{gwf_name}.dis.grb", + verbose=True, + ) + assert not fff.any() + assert not flf.any() + assert frf.any() + assert all(v == 9 for v in frf[:-1]) + + # check mf6 prt particle track data were written to binary/CSV files + # and that different formats are equal + for track_csv in [ + prt_ws / prt_track_csv_file, + prt_ws / prp_track_csv_file, + ]: + check_track_data( + track_bin=prt_ws / prt_track_file, + track_hdr=prt_ws + / Path(prt_track_file.replace(".trk", ".trk.hdr")), + track_csv=track_csv, + ) + + # extract head, budget, and specific discharge results from GWF model + hds = HeadFile(gwf_ws / gwf_head_file).get_data() + bud = gwf.output.budget() + spdis = bud.get_data(text="DATA-SPDIS")[0] + qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) + + # setup plot + fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) + for a in ax: + a.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title="MF6 pathlines", + kind="line", + x="x", + y="y", + ax=ax[0], + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) + + # plot mp7 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mp7_plines = mp7_pls.groupby(["particleid"]) + for ipl, (pid, pl) in enumerate(mp7_plines): + pl.plot( + title="MP7 pathlines", + kind="line", + x="x", + y="y", + ax=ax[1], + legend=False, + color=cm.plasma(ipl / len(mp7_plines)), + ) + + # view/save plot + # plt.show() + plt.savefig(gwf_ws / f"test_{simname}.png") + + # convert mf6 pathlines to mp7 format + mf6_pls = to_mp7_pathlines(mf6_pls) + + # sort both dataframes by particleid and time + mf6_pls.sort_values(by=["particleid", "time"], inplace=True) + mp7_pls.sort_values(by=["particleid", "time"], inplace=True) + + # drop columns for which there is no direct correspondence between mf6 and mp7 + del mf6_pls["sequencenumber"] + del mf6_pls["particleidloc"] + del mf6_pls["xloc"] + del mf6_pls["yloc"] + del mf6_pls["zloc"] + del mp7_pls["sequencenumber"] + del mp7_pls["particleidloc"] + del mp7_pls["xloc"] + del mp7_pls["yloc"] + del mp7_pls["zloc"] + + # compare mf6 / mp7 pathline data + assert mf6_pls.shape == mp7_pls.shape + assert np.allclose(mf6_pls, mp7_pls, atol=1e-3) + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + compare=None, + ) + test.run() diff --git a/autotest/test_prt_disv1.py b/autotest/test_prt_disv1.py new file mode 100644 index 00000000000..671530651af --- /dev/null +++ b/autotest/test_prt_disv1.py @@ -0,0 +1,486 @@ +""" +Tests particle tracking on a vertex (DISV) grid +that reduces to a regular grid. + +Two cases are provided, one with valid release +position and cell correspondences, and another +with mismatching cell IDs; expect PRT to catch +these and reject them. +""" + +from pathlib import Path +from pprint import pformat + +import flopy +import matplotlib.cm as cm +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pytest +from flopy.plot.plotutil import to_mp7_pathlines +from flopy.utils import PathlineFile +from flopy.utils.binaryfile import HeadFile +from flopy.utils.gridutil import get_disv_kwargs +from prt_test_utils import ( + all_equal, + check_budget_data, + check_track_data, + get_partdata, + has_default_boundnames, + plot_nodes_and_vertices, +) + +from framework import TestFramework + +simname = "prtdisv1" +cases = [f"{simname}", f"{simname}bprp", f"{simname}trts", f"{simname}trtf"] + +# model info +nlay = 1 +nrow = 10 +ncol = 10 +ncpl = nrow * ncol +delr = 1.0 +delc = 1.0 +nper = 1 +perlen = 10 +nstp = 5 +tsmult = 1.0 +tdis_rc = [(perlen, nstp, tsmult)] +top = 25.0 +botm = [20.0] +strt = 20 +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-9, 1e-3, 0.97 +porosity = 0.1 +tracktimes = list(np.linspace(0, 11, 10)) + + +def tracktimes_file(path) -> Path: + path = Path(path) + lines = [f"{t}\n" for t in tracktimes] + with open(path, "w") as f: + f.writelines(lines) + return path + + +# vertex grid properties +disvkwargs = get_disv_kwargs( + nlay, + nrow, + ncol, + delr, + delc, + top, + botm, +) + +# release points in mp7 format +releasepts_mp7 = [ + # node number, localx, localy, localz + (i * 10, 0.5, 0.5, 0.5) + for i in range(10) +] + + +def build_gwf_sim(idx, ws, mf6): + gwf_name = f"{cases[idx]}_gwf" + sim = flopy.mf6.MFSimulation( + sim_name=gwf_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 gwf model + gwf = flopy.mf6.ModflowGwf( + sim, modelname=gwf_name, newtonoptions="NEWTON", save_flows=True + ) + + # create iterative model solution and register the gwf model with it + ims = flopy.mf6.ModflowIms( + sim, + print_option="SUMMARY", + complexity="MODERATE", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="DBD", + inner_maximum=ninner, + inner_dvclose=hclose, + rcloserecord=rclose, + linear_acceleration="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + ) + sim.register_ims_package(ims, [gwf.name]) + + disv = flopy.mf6.ModflowGwfdisv(gwf, **disvkwargs) + + # initial conditions + ic = flopy.mf6.ModflowGwfic(gwf, strt=strt) + + # node property flow + npf = flopy.mf6.ModflowGwfnpf( + gwf, + save_flows=True, + save_specific_discharge=True, + save_saturation=True, + ) + + # constant head boundary + spd = { + 0: [[(0, 0), 1.0, 1.0], [(0, 99), 0.0, 0.0]], + # 1: [[(0, 0, 0), 0.0, 0.0], [(0, 9, 9), 1.0, 2.0]], + } + chd = flopy.mf6.ModflowGwfchd( + gwf, + pname="CHD-1", + stress_period_data=spd, + auxiliary=["concentration"], + ) + + # output control + oc = flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord="{}.cbc".format(gwf_name), + head_filerecord="{}.hds".format(gwf_name), + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + printrecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + filename="{}.oc".format(gwf_name), + ) + + # Print human-readable heads + obs_lst = [] + for k in np.arange(0, 1, 1): + for i in np.arange(40, 50, 1): + obs_lst.append(["obs_" + str(i + 1), "head", (k, i)]) + + obs_dict = {f"{gwf_name}.obs.csv": obs_lst} + obs = flopy.mf6.ModflowUtlobs( + gwf, pname="head_obs", digits=20, continuous=obs_dict + ) + + return sim + + +def build_prt_sim(idx, gwf_ws, prt_ws, mf6): + # create simulation + name = cases[idx] + sim = flopy.mf6.MFSimulation( + sim_name=name, + exe_name=mf6, + version="mf6", + sim_ws=prt_ws, + ) + + # create tdis package + tdis = flopy.mf6.ModflowTdis( + sim, time_units="DAYS", nper=nper, perioddata=tdis_rc + ) + + # create prt model + prt_name = f"{cases[idx]}_prt" + prt = flopy.mf6.ModflowPrt(sim, modelname=prt_name) + + # create prt discretization + disv = flopy.mf6.ModflowGwfdisv(prt, **disvkwargs) + + # create mip package + flopy.mf6.ModflowPrtmip(prt, pname="mip", porosity=porosity) + + # convert mp7 particledata to prt release points + partdata = get_partdata(prt.modelgrid, releasepts_mp7) + releasepts = list(partdata.to_prp(prt.modelgrid)) + if "bprp" in name: + # wrong cell index, point is in cell (0, 0) + releasepts[0] = (0, (0, 1), 0.5, 9.5, 22.5) + + # create prp package + prp_track_file = f"{prt_name}.prp.trk" + prp_track_csv_file = f"{prt_name}.prp.trk.csv" + flopy.mf6.ModflowPrtprp( + prt, + pname="prp1", + filename=f"{prt_name}_1.prp", + nreleasepts=len(releasepts), + packagedata=releasepts, + perioddata={0: ["FIRST"]}, + track_filerecord=[prp_track_file], + trackcsv_filerecord=[prp_track_csv_file], + stop_at_weak_sink=False, + boundnames=True, + ) + + # create output control package + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + if "trts" in name or "trtf" in name: + flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + track_release=True, + track_terminate=True, + track_usertime=True, + track_timesrecord=tracktimes if "trts" in name else None, + track_timesfilerecord=( + tracktimes_file(prt_ws / f"{prt_name}.tls") + if "trtf" in name + else None + ), + ) + else: + flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + track_all=True, + ) + + # create the flow model interface + gwf_name = f"{cases[idx]}_gwf" + gwf_budget_file = gwf_ws / f"{gwf_name}.cbc" + gwf_head_file = gwf_ws / f"{gwf_name}.hds" + flopy.mf6.ModflowPrtfmi( + prt, + packagedata=[ + ("GWFHEAD", gwf_head_file), + ("GWFBUDGET", gwf_budget_file), + ], + ) + + # add explicit model solution + ems = flopy.mf6.ModflowEms( + sim, + pname="ems", + filename=f"{prt_name}.ems", + ) + sim.register_solution_package(ems, [prt.name]) + + return sim + + +def build_mp7_sim(idx, ws, mp7, gwf): + partdata = get_partdata(gwf.modelgrid, releasepts_mp7) + mp7_name = f"{cases[idx]}_mp7" + pg = flopy.modpath.ParticleGroup( + particlegroupname="G1", + particledata=partdata, + filename=f"{mp7_name}.sloc", + ) + mp = flopy.modpath.Modpath7( + modelname=mp7_name, + flowmodel=gwf, + exe_name=mp7, + model_ws=ws, + headfilename=f"{gwf.name}.hds", + budgetfilename=f"{gwf.name}.cbc", + ) + mpbas = flopy.modpath.Modpath7Bas( + mp, + porosity=porosity, + ) + mpsim = flopy.modpath.Modpath7Sim( + mp, + simulationtype="pathline", + trackingdirection="forward", + budgetoutputoption="summary", + stoptimeoption="total", + particlegroups=[pg], + ) + + return mp + + +def build_models(idx, test): + gwf_sim = build_gwf_sim(idx, test.workspace, test.targets["mf6"]) + prt_sim = build_prt_sim( + idx, test.workspace, test.workspace / "prt", test.targets["mf6"] + ) + mp7_sim = build_mp7_sim( + idx, test.workspace / "mp7", test.targets["mp7"], gwf_sim.get_model() + ) + return gwf_sim, prt_sim, mp7_sim + + +def check_output(idx, test): + name = test.name + gwf_ws = test.workspace + prt_ws = test.workspace / "prt" + mp7_ws = test.workspace / "mp7" + gwf_name = f"{name}_gwf" + prt_name = f"{name}_prt" + mp7_name = f"{name}_mp7" + gwf_sim = test.sims[0] + prt_sim = test.sims[1] + gwf = gwf_sim.get_model(gwf_name) + prt = prt_sim.get_model(prt_name) + mg = gwf.modelgrid + + # if invalid release points, check for error message + if "bprp" in name: + buff = test.buffs[1] + assert any("Error: release point" in l for l in buff) + return + + # check mf6 output files exist + gwf_budget_file = f"{gwf_name}.cbc" + gwf_head_file = f"{gwf_name}.hds" + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + prp_track_file = f"{prt_name}.prp.trk" + prp_track_csv_file = f"{prt_name}.prp.trk.csv" + assert (gwf_ws / gwf_budget_file).is_file() + assert (gwf_ws / gwf_head_file).is_file() + assert (prt_ws / prt_track_file).is_file() + assert (prt_ws / prt_track_csv_file).is_file() + assert (prt_ws / prp_track_file).is_file() + assert (prt_ws / prp_track_csv_file).is_file() + + # check mp7 output files exist + mp7_pathline_file = f"{mp7_name}.mppth" + assert (mp7_ws / mp7_pathline_file).is_file() + + # load mp7 pathline results + plf = PathlineFile(mp7_ws / mp7_pathline_file) + mp7_pls = pd.DataFrame( + plf.get_destination_pathline_data(range(mg.nnodes), to_recarray=True) + ) + # convert zero-based to one-based indexing in mp7 results + mp7_pls["particlegroup"] = mp7_pls["particlegroup"] + 1 + mp7_pls["node"] = mp7_pls["node"] + 1 + mp7_pls["k"] = mp7_pls["k"] + 1 + + # load mf6 pathline results + mf6_pls = pd.read_csv(prt_ws / prt_track_csv_file, na_filter=False) + if "trts" in name or "trtf" in name: + assert len(mf6_pls) == 100 + + # make sure pathline df has "name" (boundname) column and default values + assert "name" in mf6_pls + assert has_default_boundnames(mf6_pls) + + # make sure all mf6 pathline data have correct model and PRP index (1) + assert all_equal(mf6_pls["imdl"], 1) + assert all_equal(mf6_pls["iprp"], 1) + + # check budget data were written to mf6 prt list file + check_budget_data(prt_ws / f"{name}_prt.lst", perlen, nper, nstp) + + # check mf6 prt particle track data were written to binary/CSV files + # and that different formats are equal + for track_bin, track_csv in zip( + [prt_ws / prt_track_file, prt_ws / prp_track_file], + [prt_ws / prt_track_csv_file, prt_ws / prp_track_csv_file], + ): + check_track_data( + track_bin=track_bin, + track_hdr=str(track_bin).replace(".trk", ".trk.hdr"), + track_csv=track_csv, + ) + + # extract head, budget, and specific discharge results from GWF model + hds = HeadFile(gwf_ws / gwf_head_file).get_data() + bud = gwf.output.budget() + spdis = bud.get_data(text="DATA-SPDIS")[0] + qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) + + plot = False + if "bprp" not in name and plot: + # setup plot + fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) + for a in ax: + a.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.2) + pmv.plot_vector(qx, qy, normalize=True, color="white") + # set zoom area + # xmin, xmax = 2050, 4800 + # ymin, ymax = 5200, 7550 + # plot labeled nodes and vertices + plot_nodes_and_vertices(gwf, mg, None, mg.ncpl, ax[0]) + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title="MF6 pathlines", + linestyle="None" if "trst" in name else "--", + marker="o", + markersize=2, + x="x", + y="y", + ax=ax[0], + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) + + # plot mp7 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.2) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mp7_plines = mp7_pls.groupby(["particleid"]) + for ipl, (pid, pl) in enumerate(mp7_plines): + pl.plot( + title="MP7 pathlines", + kind="line", + x="x", + y="y", + ax=ax[1], + legend=False, + color=cm.plasma(ipl / len(mp7_plines)), + ) + + # view/save plot + plt.show() + plt.savefig(gwf_ws / f"test_{simname}.png") + + # convert mf6 pathlines to mp7 format + mf6_pls = to_mp7_pathlines(mf6_pls) + + # sort both dataframes by particleid and time + mf6_pls.sort_values(by=["particleid", "time"], inplace=True) + mp7_pls.sort_values(by=["particleid", "time"], inplace=True) + + # drop columns for which there is no direct correspondence between mf6 and mp7 + del mf6_pls["sequencenumber"] + del mf6_pls["particleidloc"] + del mf6_pls["xloc"] + del mf6_pls["yloc"] + del mf6_pls["zloc"] + del mf6_pls["node"] # node numbers reversed in y direction in mp7 + del mp7_pls["sequencenumber"] + del mp7_pls["particleidloc"] + del mp7_pls["xloc"] + del mp7_pls["yloc"] + del mp7_pls["zloc"] + del mp7_pls["node"] + + # compare mf6 / mp7 pathline data + if "trts" in name or "trtf" in name: + pass + else: + assert mf6_pls.shape == mp7_pls.shape + assert np.allclose(mf6_pls, mp7_pls, atol=1e-3) + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + compare=None, + xfail=[False, "bprp" in name, False], + ) + test.run() diff --git a/autotest/test_prt_drape.py b/autotest/test_prt_drape.py new file mode 100644 index 00000000000..09d50eb5220 --- /dev/null +++ b/autotest/test_prt_drape.py @@ -0,0 +1,328 @@ +""" +Tests the "drape" option for the PRP package, +which moves particles released into dry cells +to the top-most active cell below, if any. + +The grid is a 10x10 square with 2 layers, based +on the flow system in autotest/test_gwf_rch01.py. + +Particles are released from the top left cell. +""" + +from pathlib import Path + +import flopy +import matplotlib.cm as cm +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pytest +from flopy.utils.binaryfile import HeadFile +from prt_test_utils import all_equal, check_track_data, get_model_name + +from framework import TestFramework + +simname = "prtfmi09" +cases = [simname, f"{simname}_drp"] +nlay, nrow, ncol = 2, 1, 5 +chdheads = [25.0] +nper = len(chdheads) +perlen = nper * [0.01] +nstp = nper * [1] +tsmult = nper * [1.0] +delr = delc = 1.0 +strt = [[[25.0, 25.0, 75.0, 25.0, 25.0], [25.0, 25.0, 75.0, 25.0, 25.0]]] +strt = np.array(strt, dtype=float) +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-9, 1e-3, 0.97 +tdis_rc = [(perlen[i], nstp[i], tsmult[i]) for i in range(nper)] +porosity = 0.1 +releasepts = [ + # particle index, k, i, j, x, y, z + [i, 0, 0, 1, float(f"1.{i + 1}"), float(f"0.{i + 1}"), 75] + for i in range(5) +] + [ + [i, 0, 0, 3, float(f"3.{i + 1}"), float(f"0.{i + 1}"), 75] + for i in range(5, 9) +] + + +def build_gwf_sim(name, ws, mf6): + ws = Path(ws) + gwf_name = get_model_name(name, "gwf") + + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=gwf_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 + ) + + # set ims csv files + csv0 = f"{gwf_name}.outer.ims.csv" + csv1 = f"{gwf_name}.inner.ims.csv" + + # create iterative model solution and register the gwf model with it + ims = flopy.mf6.ModflowIms( + sim, + print_option="ALL", + csv_outer_output_filerecord=csv0, + csv_inner_output_filerecord=csv1, + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="DBD", + inner_maximum=ninner, + inner_dvclose=hclose, + rcloserecord=rclose, + linear_acceleration="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + ) + + # create gwf model + gwf = flopy.mf6.ModflowGwf(sim, modelname=gwf_name, save_flows=True) + + dis = flopy.mf6.ModflowGwfdis( + gwf, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=100.0, + botm=[50.0, 0.0], + ) + + # initial conditions + ic = flopy.mf6.ModflowGwfic(gwf, strt=strt) + + # node property flow + npf = flopy.mf6.ModflowGwfnpf( + gwf, + save_flows=True, + save_saturation=True, + save_specific_discharge=True, + icelltype=1, + k=1.0, + ) + + sto = flopy.mf6.ModflowGwfsto(gwf, ss=1.0e-5, sy=0.1) + + # chd files + chdspd = {} + for kper, chdval in enumerate(chdheads): + chdspd[kper] = [ + [(nlay - 1, 0, 0), chdval], + [(nlay - 1, 0, ncol - 1), chdval], + ] + chd = flopy.mf6.ModflowGwfchd(gwf, stress_period_data=chdspd) + + rch = flopy.mf6.ModflowGwfrcha(gwf, recharge=0.1) + + # output control + oc = flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord=f"{gwf_name}.cbc", + head_filerecord=f"{gwf_name}.hds", + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + printrecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + filename=f"{gwf_name}.oc", + ) + + return sim + + +def build_prt_sim(name, gwf_ws, prt_ws, mf6): + prt_ws = Path(prt_ws) + gwf_name = get_model_name(name, "gwf") + prt_name = get_model_name(name, "prt") + + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=prt_name, + exe_name=mf6, + version="mf6", + sim_ws=prt_ws, + ) + + # create tdis package + tdis = flopy.mf6.ModflowTdis( + sim, time_units="DAYS", nper=nper, perioddata=tdis_rc + ) + + # create prt model + prt = flopy.mf6.ModflowPrt(sim, modelname=prt_name) + + # create prt discretization + dis = flopy.mf6.ModflowGwfdis( + prt, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=100.0, + botm=[50.0, 0.0], + ) + + # create mip package + flopy.mf6.ModflowPrtmip(prt, pname="mip", porosity=porosity) + + # create prp package + prp_track_file = f"{prt_name}.prp.trk" + prp_track_csv_file = f"{prt_name}.prp.trk.csv" + flopy.mf6.ModflowPrtprp( + prt, + pname="prp1", + filename=f"{prt_name}_1.prp", + nreleasepts=len(releasepts), + packagedata=releasepts, + perioddata={0: ["FIRST"]}, + track_filerecord=[prp_track_file], + trackcsv_filerecord=[prp_track_csv_file], + drape="drp" in name, + ) + + # create output control package + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + ) + + # create the flow model interface + gwf_budget_file = gwf_ws / f"{gwf_name}.cbc" + gwf_head_file = gwf_ws / f"{gwf_name}.hds" + flopy.mf6.ModflowPrtfmi( + prt, + packagedata=[ + ("GWFHEAD", gwf_head_file), + ("GWFBUDGET", gwf_budget_file), + ], + ) + + # add explicit model solution + ems = flopy.mf6.ModflowEms( + sim, + pname="ems", + filename=f"{prt_name}.ems", + ) + sim.register_solution_package(ems, [prt.name]) + + return sim + + +def build_models(idx, test): + gwf_sim = build_gwf_sim(test.name, test.workspace, test.targets["mf6"]) + prt_sim = build_prt_sim( + test.name, test.workspace, test.workspace / "prt", test.targets["mf6"] + ) + return gwf_sim, prt_sim + + +def check_output(idx, test): + name = test.name + gwf_ws = test.workspace + prt_ws = test.workspace / "prt" + gwf_name = get_model_name(name, "gwf") + prt_name = get_model_name(name, "prt") + gwf_sim = test.sims[0] + gwf = gwf_sim.get_model(gwf_name) + mg = gwf.modelgrid + drape = "drp" in name + + # check mf6 output files exist + gwf_budget_file = f"{gwf_name}.cbc" + gwf_head_file = f"{gwf_name}.hds" + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + prp_track_file = f"{prt_name}.prp.trk" + prp_track_csv_file = f"{prt_name}.prp.trk.csv" + assert (gwf_ws / gwf_budget_file).is_file() + assert (gwf_ws / gwf_head_file).is_file() + assert (prt_ws / prt_track_file).is_file() + assert (prt_ws / prt_track_csv_file).is_file() + assert (prt_ws / prp_track_file).is_file() + assert (prt_ws / prp_track_csv_file).is_file() + + # load mf6 pathline results + mf6_pls = pd.read_csv(prt_ws / prt_track_csv_file, na_filter=False) + + # make sure all mf6 pathline data have correct model and PRP index (1) + assert all_equal(mf6_pls["imdl"], 1) + assert all_equal(mf6_pls["iprp"], 1) + + # check budget data were written to mf6 prt list file + # check_budget_data(ws / f"{name}_prt.lst", perlen, nper) + + # check mf6 prt particle track data were written to binary/CSV files + # and that different formats are equal + for track_csv in [ + prt_ws / prt_track_csv_file, + prt_ws / prp_track_csv_file, + ]: + check_track_data( + track_bin=prt_ws / prt_track_file, + track_hdr=prt_ws + / Path(prt_track_file.replace(".trk", ".trk.hdr")), + track_csv=track_csv, + ) + + # extract head, budget, and specific discharge results from GWF model + hds = HeadFile(gwf_ws / gwf_head_file).get_data() + bud = gwf.output.budget() + spdis = bud.get_data(text="DATA-SPDIS")[0] + qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) + + # setup plot + fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(10, 10)) + ax.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title=f"MF6 pathlines{' (drape)' if drape else ''}", + kind="line", + x="x", + y="y", + ax=ax, + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) + + # view/save plot + # plt.show() + plt.savefig(gwf_ws / f"test_{simname}.png") + + if drape: + assert mf6_pls.shape[0] == 36 + else: + # expect no movement without drape + assert mf6_pls.shape[0] == 9 + # istatus=8 permanently unreleased + assert mf6_pls.istatus.eq(8).all() + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + compare=None, + ) + test.run() diff --git a/autotest/test_prt_exg.py b/autotest/test_prt_exg.py new file mode 100644 index 00000000000..db3dd407e4b --- /dev/null +++ b/autotest/test_prt_exg.py @@ -0,0 +1,326 @@ +""" +Test GWF and PRT models in the same simulation +with an exchange. + +The grid is a 10x10 square with a single layer, +the same flow system shown on the FloPy readme. +Particles are released from the top left cell. + +Results are compared against a MODPATH 7 model. + +This test includes two cases, one which gives +boundnames to particles and one which does not. +""" + +from pathlib import Path +from pprint import pformat + +import flopy +import matplotlib.cm as cm +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pytest +from flopy.plot.plotutil import to_mp7_pathlines +from flopy.utils import PathlineFile +from flopy.utils.binaryfile import HeadFile +from prt_test_utils import FlopyReadmeCase, check_budget_data, check_track_data + +from framework import TestFramework + +simname = "prtexg01" +cases = [simname, f"{simname}bnms"] + + +def get_model_name(idx, mdl): + return f"{cases[idx]}_{mdl}" + + +def build_mf6_sim(idx, test): + # create simulation + name = cases[idx] + sim = FlopyReadmeCase.get_gwf_sim( + name, test.workspace, test.targets["mf6"] + ) + + # create prt model + prt_name = get_model_name(idx, "prt") + prt = flopy.mf6.ModflowPrt(sim, modelname=prt_name) + + # create prt discretization + flopy.mf6.modflow.mfgwfdis.ModflowGwfdis( + prt, + pname="dis", + nlay=FlopyReadmeCase.nlay, + nrow=FlopyReadmeCase.nrow, + ncol=FlopyReadmeCase.ncol, + ) + + # create mip package + flopy.mf6.ModflowPrtmip( + prt, pname="mip", porosity=FlopyReadmeCase.porosity + ) + + # create prp package + rpts = ( + [r + [str(r[0] + 1)] for r in FlopyReadmeCase.releasepts_prt] + if "bnms" in name + else FlopyReadmeCase.releasepts_prt + ) + flopy.mf6.ModflowPrtprp( + prt, + pname="prp1", + filename=f"{prt_name}_1.prp", + nreleasepts=len(rpts), + packagedata=rpts, + perioddata={0: ["FIRST"]}, + boundnames="bnms" in name, + ) + + # create output control package + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + ) + + # create a flow model interface + # todo Mike Fienen's report (crash when FMI created but not needed) + # flopy.mf6.ModflowPrtfmi( + # prt, + # packagedata=[ + # ("GWFHEAD", gwf_head_file), + # ("GWFBUDGET", gwf_budget_file), + # ], + # ) + + # create exchange + gwf_name = get_model_name(idx, "gwf") + flopy.mf6.ModflowGwfprt( + sim, + exgtype="GWF6-PRT6", + exgmnamea=gwf_name, + exgmnameb=prt_name, + filename=f"{gwf_name}.gwfprt", + ) + + # add explicit model solution + ems = flopy.mf6.ModflowEms( + sim, + pname="ems", + filename=f"{prt_name}.ems", + ) + sim.register_solution_package(ems, [prt.name]) + return sim + + +def build_mp7_sim(idx, ws, mp7, gwf): + partdata = flopy.modpath.ParticleData( + partlocs=[p[0] for p in FlopyReadmeCase.releasepts_mp7], + localx=[p[1] for p in FlopyReadmeCase.releasepts_mp7], + localy=[p[2] for p in FlopyReadmeCase.releasepts_mp7], + localz=[p[3] for p in FlopyReadmeCase.releasepts_mp7], + timeoffset=0, + drape=0, + ) + mp7_name = get_model_name(idx, "mp7") + pg = flopy.modpath.ParticleGroup( + particlegroupname="G1", + particledata=partdata, + filename=f"{mp7_name}.sloc", + ) + mp = flopy.modpath.Modpath7( + modelname=mp7_name, + flowmodel=gwf, + exe_name=mp7, + model_ws=ws, + headfilename=f"{gwf.name}.hds", + budgetfilename=f"{gwf.name}.bud", + ) + mpbas = flopy.modpath.Modpath7Bas( + mp, + porosity=FlopyReadmeCase.porosity, + ) + mpsim = flopy.modpath.Modpath7Sim( + mp, + simulationtype="pathline", + trackingdirection="forward", + budgetoutputoption="summary", + stoptimeoption="extend", + particlegroups=[pg], + ) + return mp + + +def build_models(idx, test): + mf6sim = build_mf6_sim(idx, test) + gwf_name = get_model_name(idx, "gwf") + gwf = mf6sim.get_model(gwf_name) + mp7sim = build_mp7_sim( + idx, test.workspace / "mp7", test.targets["mp7"], gwf + ) + return mf6sim, mp7sim + + +def check_output(idx, test): + name = test.name + gwf_ws = Path(test.workspace) + mp7_ws = gwf_ws / "mp7" + + # model names + gwf_name = get_model_name(idx, "gwf") + prt_name = get_model_name(idx, "prt") + mp7_name = get_model_name(idx, "mp7") + + # extract model objects + sim = test.sims[0] + gwf = sim.get_model(gwf_name) + prt = sim.get_model(prt_name) + + # extract model grid + mg = gwf.modelgrid + + # check mf6 output files exist + gwf_budget_file = f"{gwf_name}.bud" + gwf_head_file = f"{gwf_name}.hds" + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + assert (gwf_ws / gwf_budget_file).is_file() + assert (gwf_ws / gwf_head_file).is_file() + assert (gwf_ws / prt_track_file).is_file() + assert (gwf_ws / prt_track_csv_file).is_file() + + # check mp7 output files exist + mp7_pathline_file = f"{mp7_name}.mppth" + assert (mp7_ws / mp7_pathline_file).is_file() + + # load mp7 pathline results + plf = PathlineFile(mp7_ws / mp7_pathline_file) + mp7_pls = pd.DataFrame( + plf.get_destination_pathline_data(range(mg.nnodes), to_recarray=True) + ) + # convert zero-based to one-based + mp7_pls["particlegroup"] = mp7_pls["particlegroup"] + 1 + mp7_pls["node"] = mp7_pls["node"] + 1 + mp7_pls["k"] = mp7_pls["k"] + 1 + + # load mf6 pathline results + mf6_pls = pd.read_csv(gwf_ws / prt_track_csv_file).replace( + r"^\s*$", np.nan, regex=True + ) + + # make sure pathline dataframe has "name" column + assert "name" in mf6_pls + + # check boundname values + if "bnms" in name: + # boundnames should be release point numbers (so pandas parses them as ints) + assert np.array_equal( + mf6_pls["name"].to_numpy(), mf6_pls["irpt"].to_numpy() + ) + else: + # no boundnames given so check for defaults + assert pd.isna(mf6_pls["name"]).all() + + # check budget data were written to mf6 prt list file + check_budget_data( + gwf_ws / f"{name}_prt.lst", + FlopyReadmeCase.perlen, + FlopyReadmeCase.nper, + ) + + # check mf6 prt particle track data were written to binary/CSV files + check_track_data( + track_bin=gwf_ws / prt_track_file, + track_hdr=gwf_ws / Path(prt_track_file.replace(".trk", ".trk.hdr")), + track_csv=gwf_ws / prt_track_csv_file, + ) + + # extract head, budget, and specific discharge results from GWF model + gwf = sim.get_model(gwf_name) + hds = HeadFile(gwf_ws / gwf_head_file).get_data() + bud = gwf.output.budget() + spdis = bud.get_data(text="DATA-SPDIS")[0] + qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) + + # setup plot + fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) + for a in ax: + a.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title="MF6 pathlines", + kind="line", + x="x", + y="y", + ax=ax[0], + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) + + # plot mp7 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mp7_plines = mp7_pls.groupby(["particleid"]) + for ipl, (pid, pl) in enumerate(mp7_plines): + pl.plot( + title="MP7 pathlines", + kind="line", + x="x", + y="y", + ax=ax[1], + legend=False, + color=cm.plasma(ipl / len(mp7_plines)), + ) + + # view/save plot + # plt.show() + plt.savefig(gwf_ws / f"test_{name}.png") + + # convert mf6 pathlines to mp7 format + mf6_pls = to_mp7_pathlines(mf6_pls) + + # sort both dataframes by particleid and time + mf6_pls.sort_values(by=["particleid", "time"], inplace=True) + mp7_pls.sort_values(by=["particleid", "time"], inplace=True) + + # drop columns for which there is no direct correspondence between mf6 and mp7 + del mf6_pls["sequencenumber"] + del mf6_pls["particleidloc"] + del mf6_pls["xloc"] + del mf6_pls["yloc"] + del mf6_pls["zloc"] + del mp7_pls["sequencenumber"] + del mp7_pls["particleidloc"] + del mp7_pls["xloc"] + del mp7_pls["yloc"] + del mp7_pls["zloc"] + + # compare mf6 / mp7 pathline data + assert mf6_pls.shape == mp7_pls.shape + assert np.allclose(mf6_pls, mp7_pls, atol=1e-3) + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + compare=None, + ) + test.run() diff --git a/autotest/test_prt_fmi.py b/autotest/test_prt_fmi.py new file mode 100644 index 00000000000..242f0d11c5f --- /dev/null +++ b/autotest/test_prt_fmi.py @@ -0,0 +1,383 @@ +""" +Tests ability to run a GWF model then a PRT model +in separate simulations via flow model interface, +as well as + +The grid is a 10x10 square with a single layer, +the same flow system shown on the FloPy readme. + +Test cases are defined for the particle release +package (PRP) option STOP_AT_WEAK_SINK, one on +and one with the option off. No effect on results +is expected, because the model has no weak sinks. +(Motivated by an old bug in which particles were +tracked improperly when this option was enabled, +even with no weak sink cells in the vicinity.) + +This test also specifies `boundnames=True` for +the PRP package, but does not provide boundnames +values, and checks that the "name" column in the +track output files contain the expected defaults. + +Particles are released from the top left cell. + +Pathlines are compared against a MODPATH 7 model. + +Runtime is benchmarked with pytest-benchmark. +""" + +from pathlib import Path + +import flopy +import matplotlib.cm as cm +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pytest +from flopy.plot.plotutil import to_mp7_pathlines +from flopy.utils import PathlineFile +from flopy.utils.binaryfile import HeadFile +from prt_test_utils import ( + FlopyReadmeCase, + all_equal, + check_budget_data, + check_track_data, + get_model_name, + get_partdata, + has_default_boundnames, +) + +from framework import TestFramework + +simname = "prtfmi01" +cases = [simname, f"{simname}saws", f"{simname}bprp"] + + +def build_prt_sim(name, gwf_ws, prt_ws, mf6): + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=name, + exe_name=mf6, + version="mf6", + sim_ws=prt_ws, + ) + + # create tdis package + flopy.mf6.modflow.mftdis.ModflowTdis( + sim, + pname="tdis", + time_units="DAYS", + nper=FlopyReadmeCase.nper, + perioddata=[ + ( + FlopyReadmeCase.perlen, + FlopyReadmeCase.nstp, + FlopyReadmeCase.tsmult, + ) + ], + ) + + # create prt model + prt_name = get_model_name(name, "prt") + prt = flopy.mf6.ModflowPrt(sim, modelname=prt_name, save_flows=True) + + # create prt discretization + flopy.mf6.modflow.mfgwfdis.ModflowGwfdis( + prt, + pname="dis", + nlay=FlopyReadmeCase.nlay, + nrow=FlopyReadmeCase.nrow, + ncol=FlopyReadmeCase.ncol, + ) + + # create mip package + flopy.mf6.ModflowPrtmip( + prt, pname="mip", porosity=FlopyReadmeCase.porosity + ) + + # convert mp7 to prt release points and check against expectation + partdata = get_partdata(prt.modelgrid, FlopyReadmeCase.releasepts_mp7) + coords = partdata.to_coords(prt.modelgrid) + if "bprp" in name: + # bad cell indices! + releasepts = [ + (i, 0, 1, 1, c[0], c[1], c[2]) for i, c in enumerate(coords) + ] + else: + releasepts = [ + (i, 0, 0, 0, c[0], c[1], c[2]) for i, c in enumerate(coords) + ] + assert np.allclose(FlopyReadmeCase.releasepts_prt, releasepts) + + # create prp package + prp_track_file = f"{prt_name}.prp.trk" + prp_track_csv_file = f"{prt_name}.prp.trk.csv" + flopy.mf6.ModflowPrtprp( + prt, + pname="prp1", + filename=f"{prt_name}_1.prp", + nreleasepts=len(releasepts), + packagedata=releasepts, + perioddata={0: ["FIRST"]}, + track_filerecord=[prp_track_file], + trackcsv_filerecord=[prp_track_csv_file], + stop_at_weak_sink="saws" in prt_name, + boundnames=True, + ) + + # create output control package + prt_budget_file = f"{prt_name}.bud" + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + budget_filerecord=[prt_budget_file], + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + saverecord=[("BUDGET", "ALL")], + ) + + # create the flow model interface + gwf_name = get_model_name(name, "gwf") + gwf_budget_file = gwf_ws / f"{gwf_name}.bud" + gwf_head_file = gwf_ws / f"{gwf_name}.hds" + flopy.mf6.ModflowPrtfmi( + prt, + packagedata=[ + ("GWFHEAD", gwf_head_file), + ("GWFBUDGET", gwf_budget_file), + ], + ) + + # add explicit model solution + ems = flopy.mf6.ModflowEms( + sim, + pname="ems", + filename=f"{prt_name}.ems", + ) + sim.register_solution_package(ems, [prt.name]) + + return sim + + +def build_mp7_sim(name, ws, mp7, gwf): + partdata = get_partdata(gwf.modelgrid, FlopyReadmeCase.releasepts_mp7) + mp7_name = get_model_name(name, "mp7") + pg = flopy.modpath.ParticleGroup( + particlegroupname="G1", + particledata=partdata, + filename=f"{mp7_name}.sloc", + ) + mp = flopy.modpath.Modpath7( + modelname=mp7_name, + flowmodel=gwf, + exe_name=mp7, + model_ws=ws, + headfilename=f"{gwf.name}.hds", + budgetfilename=f"{gwf.name}.bud", + ) + mpbas = flopy.modpath.Modpath7Bas( + mp, + porosity=FlopyReadmeCase.porosity, + ) + mpsim = flopy.modpath.Modpath7Sim( + mp, + simulationtype="pathline", + trackingdirection="forward", + budgetoutputoption="summary", + stoptimeoption="extend", + particlegroups=[pg], + ) + + return mp + + +def build_models(idx, test): + gwf_sim = FlopyReadmeCase.get_gwf_sim( + test.name, test.workspace, test.targets["mf6"] + ) + prt_sim = build_prt_sim( + test.name, test.workspace, test.workspace / "prt", test.targets["mf6"] + ) + mp7_sim = build_mp7_sim( + test.name, + test.workspace / "mp7", + test.targets["mp7"], + gwf_sim.get_model(), + ) + return gwf_sim, prt_sim, mp7_sim + + +def check_output(idx, test): + name = test.name + gwf_ws = test.workspace + prt_ws = test.workspace / "prt" + mp7_ws = test.workspace / "mp7" + gwf_name = get_model_name(name, "gwf") + prt_name = get_model_name(name, "prt") + mp7_name = get_model_name(name, "mp7") + gwf_sim = test.sims[0] + gwf = gwf_sim.get_model(gwf_name) + mg = gwf.modelgrid + + if "bprp" in name: + buff = test.buffs[1] + assert any("Error: release point" in l for l in buff) + return + + # check mf6 output files exist + gwf_budget_file = f"{gwf_name}.bud" + gwf_head_file = f"{gwf_name}.hds" + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + prp_track_file = f"{prt_name}.prp.trk" + prp_track_csv_file = f"{prt_name}.prp.trk.csv" + assert (gwf_ws / gwf_budget_file).is_file() + assert (gwf_ws / gwf_head_file).is_file() + assert (prt_ws / prt_track_file).is_file() + assert (prt_ws / prt_track_csv_file).is_file() + assert (prt_ws / prp_track_file).is_file() + assert (prt_ws / prp_track_csv_file).is_file() + + # check mp7 output files exist + mp7_pathline_file = f"{mp7_name}.mppth" + assert (mp7_ws / mp7_pathline_file).is_file() + + # load mp7 pathline results + plf = PathlineFile(mp7_ws / mp7_pathline_file) + mp7_pls = pd.DataFrame( + plf.get_destination_pathline_data(range(mg.nnodes), to_recarray=True) + ) + # convert zero-based to one-based indexing in mp7 results + mp7_pls["particlegroup"] = mp7_pls["particlegroup"] + 1 + mp7_pls["node"] = mp7_pls["node"] + 1 + mp7_pls["k"] = mp7_pls["k"] + 1 + + # load mf6 pathline results + mf6_pls = pd.read_csv(prt_ws / prt_track_csv_file, na_filter=False) + + # make sure pathline df has "name" (boundname) column and default values + assert "name" in mf6_pls + assert has_default_boundnames(mf6_pls) + + # make sure all mf6 pathline data have correct model and PRP index (1) + assert all_equal(mf6_pls["imdl"], 1) + assert all_equal(mf6_pls["iprp"], 1) + + # check budget data were written to mf6 prt list file + check_budget_data( + prt_ws / f"{name}_prt.lst", + FlopyReadmeCase.perlen, + FlopyReadmeCase.nper, + ) + + # check cell-by-cell particle mass budget file + prt_budget_file = prt_ws / f"{prt_name}.bud" + prt_bud = flopy.utils.CellBudgetFile(prt_budget_file, precision="double") + prt_bud_data = prt_bud.get_data(kstpkper=(0, 0)) + assert len(prt_bud_data) == 2 + assert prt_bud_data[0].shape == (1, 1, 460) + assert prt_bud_data[1].shape == (9,) + + # check mf6 prt particle track data were written to binary/CSV files + # and that different formats are equal + for track_csv in [ + prt_ws / prt_track_csv_file, + prt_ws / prp_track_csv_file, + ]: + check_track_data( + track_bin=prt_ws / prt_track_file, + track_hdr=prt_ws + / Path(prt_track_file.replace(".trk", ".trk.hdr")), + track_csv=track_csv, + ) + + # extract head, budget, and specific discharge results from GWF model + hds = HeadFile(gwf_ws / gwf_head_file).get_data() + bud = gwf.output.budget() + spdis = bud.get_data(text="DATA-SPDIS")[0] + qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) + + # setup plot + fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) + for a in ax: + a.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title="MF6 pathlines", + kind="line", + x="x", + y="y", + ax=ax[0], + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) + + # plot mp7 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mp7_plines = mp7_pls.groupby(["particleid"]) + for ipl, (pid, pl) in enumerate(mp7_plines): + pl.plot( + title="MP7 pathlines", + kind="line", + x="x", + y="y", + ax=ax[1], + legend=False, + color=cm.plasma(ipl / len(mp7_plines)), + ) + + # view/save plot + # plt.show() + plt.savefig(gwf_ws / f"test_{simname}.png") + + # convert mf6 pathlines to mp7 format + mf6_pls = to_mp7_pathlines(mf6_pls) + + # sort both dataframes by particleid and time + mf6_pls.sort_values(by=["particleid", "time"], inplace=True) + mp7_pls.sort_values(by=["particleid", "time"], inplace=True) + + # drop columns for which there is no direct correspondence between mf6 and mp7 + del mf6_pls["sequencenumber"] + del mf6_pls["particleidloc"] + del mf6_pls["xloc"] + del mf6_pls["yloc"] + del mf6_pls["zloc"] + del mp7_pls["sequencenumber"] + del mp7_pls["particleidloc"] + del mp7_pls["xloc"] + del mp7_pls["yloc"] + del mp7_pls["zloc"] + + # compare mf6 / mp7 pathline data + assert mf6_pls.shape == mp7_pls.shape + assert np.allclose(mf6_pls, mp7_pls, atol=1e-3) + + +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets, benchmark): + test = TestFramework( + name=name, + workspace=function_tmpdir, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + targets=targets, + compare=None, + xfail=[False, "bprp" in name, False], + ) + if "bprp" in name: + test.run() + else: + benchmark(test.run) diff --git a/autotest/test_prt_notebooks.py b/autotest/test_prt_notebooks.py new file mode 100644 index 00000000000..ae328857c62 --- /dev/null +++ b/autotest/test_prt_notebooks.py @@ -0,0 +1,250 @@ +import re +from os import environ +from pathlib import Path +from platform import system +from pprint import pprint +from warnings import warn + +import numpy as np +import pandas as pd +import pytest +from flopy.mf6 import MFSimulation +from flopy.plot.plotutil import to_mp7_pathlines +from flopy.utils import PathlineFile +from modflow_devtools.misc import run_cmd, set_env + +from conftest import project_root_path + + +def get_notebook_scripts(pattern=None, exclude=None): + repos_path = environ.get("REPOS_PATH", None) + if repos_path is None: + repos_path = project_root_path.parent + repo_path = Path(repos_path) / "modflow6-examples" + if not repo_path.is_dir(): + return [] + nbpaths = [ + str(p) + for p in (repo_path / "scripts").glob("*.py") + if pattern is None or pattern in p.name + ] + + # sort for pytest-xdist: workers must collect tests in the same order + return sorted( + [p for p in nbpaths if not exclude or not any(e in p for e in exclude)] + ) + + +@pytest.mark.slow +@pytest.mark.parametrize( + "notebook", + get_notebook_scripts(pattern="ex-prt", exclude=["ex-prt-mp7-p03"]), +) +def test_notebooks(notebook, function_tmpdir, targets): + notebook = Path(notebook) + + # temporarily add testing binaries to PATH + delim = ";" if system() == "Windows" else ":" + path = ( + environ.get("PATH", "") + + f"{delim}{targets['mf6'].parent}" + + f"{delim}{targets['mf6'].parent / 'downloaded'}" + + f"{delim}{targets['mf6'].parent / 'rebuilt'}" + ) + with set_env(PATH=path): + args = [ + "jupytext", + "--from", + "py", + "--to", + "ipynb", + "--execute", + "--run-path", + function_tmpdir, + "--output", + function_tmpdir / f"{notebook.stem}.ipynb", + str(notebook), + ] + # run the notebook + stdout, stderr, returncode = run_cmd(*args, verbose=True) + + # show output + pprint(stdout) + pprint(stderr) + + # check return code + if returncode != 0: + if "Missing optional dependency" in stderr: + pkg = re.findall("Missing optional dependency '(.*)'", stderr)[0] + pytest.skip(f"notebook requires optional dependency {pkg!r}") + elif "No module named " in stderr: + pkg = re.findall("No module named '(.*)'", stderr)[0] + pytest.skip(f"notebook requires package {pkg!r}") + assert returncode == 0, f"could not run {notebook}" + + # define expected simulation and model names + simname = Path(notebook).stem.replace("ex-prt-", "") + gwfname = f"{simname}-gwf" + prtname = f"{simname}-prt" + mp7_name = f"{simname}-mp7" + + # if example working directory doesn't exist, return early + example_ws = function_tmpdir.parent / "examples" / notebook.stem + if not example_ws.is_dir(): + warn(f"example workspace {example_ws} does not exist") + return + + # define working subdirs + mf6ws = example_ws / "mf6" + gwfws = example_ws / "gwf" + prtws = example_ws / "prt" + mp7ws = example_ws / "mp7" + + # prt notebooks running gwf and prt in separate simulations + # use gwf, prt and mp7 subdirectories, notebooks with gwf & + # prt in the same simulation use mf6 and mp7 subdirectories. + if mf6ws.is_dir(): + gwfws = mf6ws + prtws = mf6ws + else: + assert gwfws.is_dir() + # there may be more than one prt subdirectory + prtws = list(example_ws.glob("prt*")) + assert any(prtws) + if len(prtws) == 1: + prtws = prtws[0] + + # load model grid + gwfsim = MFSimulation.load(sim_ws=gwfws, load_only="dis") + gwf = gwfsim.get_model(gwfname) + grid = gwf.modelgrid + + # check gwf output files exist + gwf_budget_file = gwfws / f"{gwfname}.cbb" + gwf_head_file = gwfws / f"{gwfname}.hds" + assert gwf_budget_file.is_file() + assert gwf_head_file.is_file() + + # initialize PRT pathlines dataframe (loaded below) + prt_pls = None + + # check prt track output files exist + if isinstance(prtws, Path): + prt_track_file = prtws / f"{prtname}.trk" + prt_track_csv_file = prtws / f"{prtname}.trk.csv" + assert prt_track_file.is_file() + assert prt_track_csv_file.is_file() + prt_pls = pd.read_csv(prt_track_csv_file, na_filter=False) + else: + for ws in prtws: + ll = ws.stem[-1] # todo append to filename like mp7? + prt_track_file = ws / f"{prtname}.trk" + prt_track_csv_file = ws / f"{prtname}.trk.csv" + assert prt_track_file.is_file() + assert prt_track_csv_file.is_file() + + # if multiple prt dirs and track files, concatenate them into a single dataframe + pls = pd.read_csv(prt_track_csv_file, na_filter=False) + print(f"Adding {pls.shape} pathlines from {prt_track_csv_file}") + prt_pls = pls if prt_pls is None else pd.concat([prt_pls, pls]) + + # initialize MP7 pathlines dataframe (loaded below) + mp7_pls = None + + # there may be more than one mp7 subdirectory + mp7ws = list(example_ws.glob("mp7*")) + assert any(mp7ws) + if len(mp7ws) == 1: + mp7ws = mp7ws[0] + + # check mp7 pathline output file(s) + if isinstance(mp7ws, Path): + mp7_pathline_file = mp7ws / f"{mp7_name}.mppth" + assert mp7_pathline_file.is_file() + mp7_pls = pd.DataFrame.from_records( + PathlineFile(mp7_pathline_file).get_destination_pathline_data( + range(grid.nnodes), to_recarray=True + ), + ) + else: + for ws in mp7ws: + ll = ws.stem[-1] + mp7_pathline_file = ws / f"{mp7_name}{ll}.mppth" + mp7_endpoint_file = ws / f"{mp7_name}{ll}.mpend" + assert mp7_pathline_file.is_file() or mp7_endpoint_file.is_file() + + # if multiple mp7 dirs & pathline files, concatenate them into a single dataframe + if mp7_pathline_file.is_file(): + pls = pd.DataFrame.from_records( + PathlineFile( + mp7_pathline_file + ).get_destination_pathline_data( + range(grid.nnodes), to_recarray=True + ), + ) + print(f"Adding {pls.shape} pathlines from {mp7_pathline_file}") + mp7_pls = pls if mp7_pls is None else pd.concat([mp7_pls, pls]) + + # convert prt results to mp7 format + prt_pls = to_mp7_pathlines(prt_pls) + + # standardize to one-based indexing + if mp7_pls.particlegroup.min() == 0: + mp7_pls.particlegroup = mp7_pls.particlegroup + 1 + if prt_pls.particlegroup.min() == 0: + prt_pls.particlegroup = prt_pls.particlegroup + 1 + if mp7_pls.node.min() == 0: + mp7_pls.node = mp7_pls.node + 1 + if prt_pls.node.min() == 0: + prt_pls.node = prt_pls.node + 1 + if mp7_pls.k.min() == 0: + mp7_pls.k = mp7_pls.k + 1 + if prt_pls.k.min() == 0: + prt_pls.k = prt_pls.k + 1 + + # drop columns for which there is no direct correspondence between mf6 and mp7 + del prt_pls["sequencenumber"] + del prt_pls["particleidloc"] + del prt_pls["xloc"] + del prt_pls["yloc"] + del prt_pls["zloc"] + del prt_pls[ + "node" + ] # mp7 node numbers reversed in y direction for disv grids + del mp7_pls["sequencenumber"] + del mp7_pls["particleidloc"] + del mp7_pls["xloc"] + del mp7_pls["yloc"] + del mp7_pls["zloc"] + del mp7_pls["node"] + + # drop values for which time is a whole number (and not 0) + # (kluge to exclude timeseries data until prt supports it) + prt_pls = prt_pls[(prt_pls.time % 1 != 0) | (prt_pls.time == 0)] + mp7_pls = mp7_pls[(mp7_pls.time % 1 != 0) | (mp7_pls.time == 0)] + + # for mp7 example 1 drop prt pathline data for which z = 400 + # (kluge to work around particles starting at water table??) + if "ex-prt-mp7-p01" in notebook.name: + prt_pls = prt_pls[prt_pls.z != 400] + + # sort both dataframes by particleid and time + cols = ["particleid", "time", "x", "y", "z"] + prt_pls.sort_values(by=cols, inplace=True) + mp7_pls.sort_values(by=cols, inplace=True) + + # drop duplicates + prt_pls = prt_pls.drop_duplicates(subset=cols) + mp7_pls = mp7_pls.drop_duplicates(subset=cols) + prt_pls = prt_pls.sort_values(by=cols) + mp7_pls = mp7_pls.sort_values(by=cols) + + # compare result shape + assert prt_pls.shape == mp7_pls.shape + + # skip comparison for ex-prt-mp7-p02 until mp7 and prt particleids can be guaranteed to correspond + if "ex-prt-mp7-p02" in notebook.name: + return + + # compare result equality + assert np.allclose(prt_pls, mp7_pls, atol=1e-3) diff --git a/autotest/test_prt_release_timing.py b/autotest/test_prt_release_timing.py new file mode 100644 index 00000000000..a47fe6e611b --- /dev/null +++ b/autotest/test_prt_release_timing.py @@ -0,0 +1,422 @@ +""" +Test cases exercising release timing, 1st via +package-level RELEASETIME option, & then with +period-block config STEPS 1 and FRACTION 0.5. +The model is setup to release halfway through +the first and only time step of the first and +only stress period, with duration 1 time unit, +so the same value of 0.5 can be used for both +RELEASETIME and FRACTION. A third test case +checks that multiple values can be provided +for RELEASETIME. + +Period-block FRACTION should work with FIRST +and ALL, but flopy hangs with either option. +Todo: debug and enable corresponding cases. + +The grid is a 10x10 square with a single layer, +the same flow system shown on the FloPy readme. + +Particles are released from the top left cell. + +Results are compared against a MODPATH 7 model. +Telease time 0.5 could be configured, but mp7 +reports relative times, so there is no reason +& mp7 results are converted before comparison. +""" + +from pathlib import Path +from typing import Optional + +import flopy +import matplotlib.cm as cm +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pytest +from flopy.plot.plotutil import to_mp7_pathlines +from flopy.utils import PathlineFile +from flopy.utils.binaryfile import HeadFile +from prt_test_utils import ( + FlopyReadmeCase, + all_equal, + check_budget_data, + check_track_data, + get_model_name, + get_partdata, +) + +from framework import TestFramework + +simname = "prtrelt" +cases = [ + # options block options + f"{simname}sgl", # RELEASE_TIMES 0.5 + f"{simname}dbl", # RELEASE_TIMES 0.5 0.6 + f"{simname}tls", # RELEASE_TIMESFILE + # period block options + # f"{simname}all", # ALL FRACTION 0.5 # todo debug flopy hanging + # f"{simname}frst", # FIRST FRACTION 0.5 # todo debug flopy hanging + f"{simname}stps", # STEPS 1 FRACTION 0.5 +] + + +def releasetimes_file(path, rtimes) -> Path: + path = Path(path) + lines = [f"{t}\n" for t in rtimes] + with open(path, "w") as f: + f.writelines(lines) + return path + + +def get_perioddata(name, periods=1, fraction=None) -> Optional[dict]: + if "sgl" in name or "dbl" in name or "tls" in name: + return None + opt = [ + ( + "FIRST" + if "frst" in name + else ( + "ALL" + if "all" in name + else ("STEPS", 1) if "stps" in name else None + ) + ) + ] + if opt[0] is None: + raise ValueError(f"Invalid period option: {name}") + if fraction is not None: + opt.append(("FRACTION", fraction)) + return {i: opt for i in range(periods)} + + +def build_prt_sim(name, gwf_ws, prt_ws, mf6, fraction=None): + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=name, + exe_name=mf6, + version="mf6", + sim_ws=prt_ws, + ) + + # create tdis package + flopy.mf6.modflow.mftdis.ModflowTdis( + sim, + pname="tdis", + time_units="DAYS", + nper=FlopyReadmeCase.nper, + perioddata=[ + ( + FlopyReadmeCase.perlen, + FlopyReadmeCase.nstp, + FlopyReadmeCase.tsmult, + ) + ], + ) + + # create prt model + prt_name = get_model_name(name, "prt") + prt = flopy.mf6.ModflowPrt(sim, modelname=prt_name) + + # create prt discretization + flopy.mf6.modflow.mfgwfdis.ModflowGwfdis( + prt, + pname="dis", + nlay=FlopyReadmeCase.nlay, + nrow=FlopyReadmeCase.nrow, + ncol=FlopyReadmeCase.ncol, + ) + + # create mip package + flopy.mf6.ModflowPrtmip( + prt, pname="mip", porosity=FlopyReadmeCase.porosity + ) + + # convert mp7 particledata to prt release points + partdata = get_partdata(prt.modelgrid, FlopyReadmeCase.releasepts_mp7) + releasepts = list(partdata.to_prp(prt.modelgrid)) + + # check release points match expectation + assert np.allclose(FlopyReadmeCase.releasepts_prt, releasepts) + + # create prp package + prp_track_file = f"{prt_name}.prp.trk" + prp_track_csv_file = f"{prt_name}.prp.trk.csv" + pdat = get_perioddata(prt_name, fraction=fraction) + # fraction 0.5 equiv. to release time 0.5 since 1 period 1 step with length 1 + releasetime = ( + [fraction] + if "sgl" in prt_name + else ( + [fraction, fraction + 0.1] + if "dbl" in prt_name or "tls" in prt_name + else None + ) + ) + flopy.mf6.ModflowPrtprp( + prt, + pname="prp1", + filename=f"{prt_name}_1.prp", + nreleasepts=len(releasepts), + packagedata=releasepts, + perioddata=pdat, + track_filerecord=[prp_track_file], + trackcsv_filerecord=[prp_track_csv_file], + release_timesrecord=( + releasetime if ("sgl" in prt_name or "dbl" in name) else None + ), + release_timesfilerecord=( + releasetimes_file(prt_ws / f"{prt_name}.tls", releasetime) + if "tls" in name + else None + ), + ) + + # create output control package + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + ) + + # create the flow model interface + gwf_name = get_model_name(name, "gwf") + gwf_budget_file = gwf_ws / f"{gwf_name}.bud" + gwf_head_file = gwf_ws / f"{gwf_name}.hds" + flopy.mf6.ModflowPrtfmi( + prt, + packagedata=[ + ("GWFHEAD", gwf_head_file), + ("GWFBUDGET", gwf_budget_file), + ], + ) + + # add explicit model solution + ems = flopy.mf6.ModflowEms( + sim, + pname="ems", + filename=f"{prt_name}.ems", + ) + sim.register_solution_package(ems, [prt.name]) + + return sim + + +def build_mp7_sim(name, ws, mp7, gwf): + partdata = get_partdata(gwf.modelgrid, FlopyReadmeCase.releasepts_mp7) + mp7_name = get_model_name(name, "mp7") + pg = flopy.modpath.ParticleGroup( + particlegroupname="G1", + particledata=partdata, + filename=f"{mp7_name}.sloc", + ) + mp = flopy.modpath.Modpath7( + modelname=mp7_name, + flowmodel=gwf, + exe_name=mp7, + model_ws=ws, + headfilename=f"{gwf.name}.hds", + budgetfilename=f"{gwf.name}.bud", + ) + mpbas = flopy.modpath.Modpath7Bas( + mp, + porosity=FlopyReadmeCase.porosity, + ) + mpsim = flopy.modpath.Modpath7Sim( + mp, + simulationtype="pathline", + trackingdirection="forward", + budgetoutputoption="summary", + stoptimeoption="extend", + particlegroups=[pg], + ) + + return mp + + +def build_models(idx, test, fraction): + gwf_sim = FlopyReadmeCase.get_gwf_sim( + test.name, test.workspace, test.targets["mf6"] + ) + prt_sim = build_prt_sim( + test.name, + test.workspace, + test.workspace / "prt", + test.targets["mf6"], + fraction, + ) + mp7_sim = build_mp7_sim( + test.name, + test.workspace / "mp7", + test.targets["mp7"], + gwf_sim.get_model(), + ) + return gwf_sim, prt_sim, mp7_sim + + +def check_output(idx, test, fraction): + name = test.name + ws = test.workspace + prt_ws = test.workspace / "prt" + mp7_ws = test.workspace / "mp7" + gwf_name = get_model_name(name, "gwf") + prt_name = get_model_name(name, "prt") + mp7_name = get_model_name(name, "mp7") + gwf_sim = test.sims[0] + gwf = gwf_sim.get_model(gwf_name) + mg = gwf.modelgrid + + # check mf6 output files exist + gwf_budget_file = f"{gwf_name}.bud" + gwf_head_file = f"{gwf_name}.hds" + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + prp_track_file = f"{prt_name}.prp.trk" + prp_track_csv_file = f"{prt_name}.prp.trk.csv" + assert (ws / gwf_budget_file).is_file() + assert (ws / gwf_head_file).is_file() + assert (prt_ws / prt_track_file).is_file() + assert (prt_ws / prt_track_csv_file).is_file() + assert (prt_ws / prp_track_file).is_file() + assert (prt_ws / prp_track_csv_file).is_file() + + # check mp7 output files exist + mp7_pathline_file = f"{mp7_name}.mppth" + assert (mp7_ws / mp7_pathline_file).is_file() + + # load mp7 pathline results + plf = PathlineFile(mp7_ws / mp7_pathline_file) + mp7_pls = pd.DataFrame( + plf.get_destination_pathline_data(range(mg.nnodes), to_recarray=True) + ) + # convert zero-based to one-based indexing in mp7 results + mp7_pls["particlegroup"] = mp7_pls["particlegroup"] + 1 + mp7_pls["node"] = mp7_pls["node"] + 1 + mp7_pls["k"] = mp7_pls["k"] + 1 + + # apply reference time to mp7 results (mp7 reports relative times) + mp7_pls["time"] = mp7_pls["time"] + fraction + + # load mf6 pathline results + mf6_pls = pd.read_csv(prt_ws / prt_track_csv_file, na_filter=False) + + # make sure pathline df has "name" (boundname) column and empty values + assert "name" in mf6_pls + assert (mf6_pls["name"] == "").all() + + # make sure all mf6 pathline data have correct model and PRP index (1) + assert all_equal(mf6_pls["imdl"], 1) + assert all_equal(mf6_pls["iprp"], 1) + + # check budget data were written to mf6 prt list file + check_budget_data( + prt_ws / f"{name}_prt.lst", + FlopyReadmeCase.perlen, + FlopyReadmeCase.nper, + ) + + # check mf6 prt particle track data were written to binary/CSV files + # and that different formats are equal + for track_csv in [ + prt_ws / prt_track_csv_file, + prt_ws / prp_track_csv_file, + ]: + check_track_data( + track_bin=prt_ws / prt_track_file, + track_hdr=prt_ws + / Path(prt_track_file.replace(".trk", ".trk.hdr")), + track_csv=track_csv, + ) + + # extract head, budget, and specific discharge results from GWF model + hds = HeadFile(ws / gwf_head_file).get_data() + bud = gwf.output.budget() + spdis = bud.get_data(text="DATA-SPDIS")[0] + qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) + + # setup plot + fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) + for a in ax: + a.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title="MF6 pathlines", + kind="line", + x="x", + y="y", + ax=ax[0], + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) + + # plot mp7 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mp7_plines = mp7_pls.groupby(["particleid"]) + for ipl, (pid, pl) in enumerate(mp7_plines): + pl.plot( + title="MP7 pathlines", + kind="line", + x="x", + y="y", + ax=ax[1], + legend=False, + color=cm.plasma(ipl / len(mp7_plines)), + ) + + # view/save plot + # plt.show() + plt.savefig(ws / f"test_{simname}.png") + + # convert mf6 pathlines to mp7 format + mf6_pls = to_mp7_pathlines(mf6_pls) + + # sort both dataframes by particleid and time + mf6_pls.sort_values(by=["particleid", "time"], inplace=True) + mp7_pls.sort_values(by=["particleid", "time"], inplace=True) + + # drop columns for which there is no direct correspondence between mf6 and mp7 + del mf6_pls["sequencenumber"] + del mf6_pls["particleidloc"] + del mf6_pls["xloc"] + del mf6_pls["yloc"] + del mf6_pls["zloc"] + del mp7_pls["sequencenumber"] + del mp7_pls["particleidloc"] + del mp7_pls["xloc"] + del mp7_pls["yloc"] + del mp7_pls["zloc"] + + # compare mf6 / mp7 pathline data + if "dbl" in name or "tls" in name: + assert len(mf6_pls) == 2 * len(mp7_pls) + # todo check for double mass + else: + assert mf6_pls.shape == mp7_pls.shape + assert np.allclose(mf6_pls, mp7_pls, atol=1e-3) + + +@pytest.mark.parametrize("idx, name", enumerate(cases)) +@pytest.mark.parametrize("fraction", [0.5]) +def test_mf6model(idx, name, function_tmpdir, targets, fraction): + test = TestFramework( + name=name, + workspace=function_tmpdir, + build=lambda t: build_models(idx, t, fraction), + check=lambda t: check_output(idx, t, fraction), + targets=targets, + compare=None, + ) + test.run() diff --git a/autotest/test_prt_stop_zones.py b/autotest/test_prt_stop_zones.py new file mode 100644 index 00000000000..5765a36d8af --- /dev/null +++ b/autotest/test_prt_stop_zones.py @@ -0,0 +1,424 @@ +""" +This test exercises stop zones defined in the +model input package (MIP), i.e. particles are +terminated when they enter the selected zone. + +The grid is a 10x10 square, based on the flow +system from the FloPy readme. Two test cases +are defined with 1 and 2 layers respectively +(to test zone data can be read as 2D or 3D). + +There are two stop zones in the top right and +bottom left of the grid. + +Particles are released from the top left cell +and are either captured by either of the stop +zones, or continue to the bottom right cell. + +GWF and PRT models run in separate simulations +via flow model interface. + +Results are compared against a MODPATH 7 model. +""" + +from itertools import repeat +from pathlib import Path + +import flopy +import matplotlib.cm as cm +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pytest +from flopy.plot.plotutil import to_mp7_pathlines +from flopy.utils import PathlineFile +from flopy.utils.binaryfile import HeadFile +from matplotlib.collections import LineCollection +from prt_test_utils import ( + FlopyReadmeCase, + check_budget_data, + check_track_data, + get_model_name, +) + +from framework import TestFramework + +simname = "prtfmi03" +cases = [f"{simname}_l1", f"{simname}_l2"] +stopzone_cells = [(0, 1, 8), (0, 8, 1)] + + +def create_izone(nlay, nrow, ncol): + izone = np.zeros((nlay, nrow, ncol), dtype=int) + for iz in stopzone_cells: + izone[iz] = 1 + return izone + + +def build_prt_sim(name, gwf_ws, prt_ws, mf6): + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=name, + exe_name=mf6, + version="mf6", + sim_ws=prt_ws, + ) + + # create tdis package + flopy.mf6.modflow.mftdis.ModflowTdis( + sim, + pname="tdis", + time_units="DAYS", + nper=FlopyReadmeCase.nper, + perioddata=[ + ( + FlopyReadmeCase.perlen, + FlopyReadmeCase.nstp, + FlopyReadmeCase.tsmult, + ) + ], + ) + + # create prt model + prt_name = get_model_name(name, "prt") + prt = flopy.mf6.ModflowPrt(sim, modelname=prt_name) + + # create prt discretization + nlay = int(name[-1]) + botm = [FlopyReadmeCase.top - (k + 1) for k in range(nlay)] + flopy.mf6.modflow.mfgwfdis.ModflowGwfdis( + prt, + pname="dis", + nlay=nlay, + nrow=FlopyReadmeCase.nrow, + ncol=FlopyReadmeCase.ncol, + top=FlopyReadmeCase.top, + botm=botm, + ) + + # create mip package + izone = create_izone(nlay, FlopyReadmeCase.nrow, FlopyReadmeCase.ncol) + flopy.mf6.ModflowPrtmip( + prt, + pname="mip", + porosity=FlopyReadmeCase.porosity, + izone=izone, + ) + + # create prp package + flopy.mf6.ModflowPrtprp( + prt, + pname="prp1", + filename=f"{prt_name}_1.prp", + nreleasepts=len(FlopyReadmeCase.releasepts_prt), + packagedata=FlopyReadmeCase.releasepts_prt, + perioddata={0: ["FIRST"]}, + istopzone=1, + ) + + # create output control package + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + ) + + # create the flow model interface + gwf_name = get_model_name(name, "gwf") + gwf_budget_file = gwf_ws / f"{gwf_name}.bud" + gwf_head_file = gwf_ws / f"{gwf_name}.hds" + flopy.mf6.ModflowPrtfmi( + prt, + packagedata=[ + ("GWFHEAD", gwf_head_file), + ("GWFBUDGET", gwf_budget_file), + ], + ) + + # add explicit model solution + ems = flopy.mf6.ModflowEms( + sim, + pname="ems", + filename=f"{prt_name}.ems", + ) + sim.register_solution_package(ems, [prt.name]) + + return sim + + +def build_mp7_sim(name, ws, mp7, gwf): + partdata = flopy.modpath.ParticleData( + partlocs=[p[0] for p in FlopyReadmeCase.releasepts_mp7], + localx=[p[1] for p in FlopyReadmeCase.releasepts_mp7], + localy=[p[2] for p in FlopyReadmeCase.releasepts_mp7], + localz=[p[3] for p in FlopyReadmeCase.releasepts_mp7], + timeoffset=0, + drape=0, + ) + mp7_name = get_model_name(name, "mp7") + pg = flopy.modpath.ParticleGroup( + particlegroupname="G1", + particledata=partdata, + filename=f"{mp7_name}.sloc", + ) + mp = flopy.modpath.Modpath7( + modelname=mp7_name, + flowmodel=gwf, + exe_name=mp7, + model_ws=ws, + headfilename=f"{gwf.name}.hds", + budgetfilename=f"{gwf.name}.bud", + ) + mpbas = flopy.modpath.Modpath7Bas( + mp, + porosity=FlopyReadmeCase.porosity, + ) + nlay = int(name[-1]) + izone = create_izone(nlay, FlopyReadmeCase.nrow, FlopyReadmeCase.ncol) + mpsim = flopy.modpath.Modpath7Sim( + mp, + simulationtype="pathline", + trackingdirection="forward", + budgetoutputoption="summary", + stoptimeoption="extend", + stopzone=1, + zones=izone, + zonedataoption="on", + particlegroups=[pg], + ) + + return mp + + +def build_models(idx, test): + gwf_sim = FlopyReadmeCase.get_gwf_sim( + test.name, test.workspace, test.targets["mf6"] + ) + gwf = gwf_sim.get_model() + dis = gwf.get_package("DIS") + nlay = int(test.name[-1]) + botm = [FlopyReadmeCase.top - (k + 1) for k in range(nlay)] + botm_data = np.array( + [ + list(repeat(b, FlopyReadmeCase.nrow * FlopyReadmeCase.ncol)) + for b in botm + ] + ).reshape((nlay, FlopyReadmeCase.nrow, FlopyReadmeCase.ncol)) + dis.nlay = nlay + dis.botm.set_data(botm_data) + prt_sim = build_prt_sim( + test.name, test.workspace, test.workspace / "prt", test.targets["mf6"] + ) + mp7_sim = build_mp7_sim( + test.name, test.workspace / "mp7", test.targets["mp7"], gwf + ) + return gwf_sim, prt_sim, mp7_sim + + +def check_output(idx, test): + name = test.name + gwf_ws = test.workspace + prt_ws = test.workspace / "prt" + mp7_ws = test.workspace / "mp7" + gwf_name = get_model_name(name, "gwf") + prt_name = get_model_name(name, "prt") + mp7_name = get_model_name(name, "mp7") + gwf_sim = test.sims[0] + gwf = gwf_sim.get_model(gwf_name) + mg = gwf.modelgrid + + # check mf6 output files exist + gwf_budget_file = f"{gwf_name}.bud" + gwf_head_file = f"{gwf_name}.hds" + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + assert (gwf_ws / gwf_budget_file).is_file() + assert (gwf_ws / gwf_head_file).is_file() + assert (prt_ws / prt_track_file).is_file() + assert (prt_ws / prt_track_csv_file).is_file() + + # check mp7 output files exist + mp7_pathline_file = f"{mp7_name}.mppth" + assert (mp7_ws / mp7_pathline_file).is_file() + + # load mp7 pathline results + plf = PathlineFile(mp7_ws / mp7_pathline_file) + mp7_pls = pd.DataFrame( + plf.get_destination_pathline_data(range(mg.nnodes), to_recarray=True) + ) + # convert zero-based to one-based + mp7_pls["particlegroup"] = mp7_pls["particlegroup"] + 1 + mp7_pls["node"] = mp7_pls["node"] + 1 + mp7_pls["k"] = mp7_pls["k"] + 1 + + # load mf6 pathline results + mf6_pls = pd.read_csv(prt_ws / prt_track_csv_file) + + # check budget data were written to mf6 prt list file + check_budget_data( + prt_ws / f"{name}_prt.lst", + FlopyReadmeCase.perlen, + FlopyReadmeCase.nper, + ) + + # check mf6 prt particle track data were written to binary/CSV files + check_track_data( + track_bin=prt_ws / prt_track_file, + track_hdr=prt_ws / Path(prt_track_file.replace(".trk", ".trk.hdr")), + track_csv=prt_ws / prt_track_csv_file, + ) + + # get head, budget, and spdis results from GWF model + hds = HeadFile(gwf_ws / gwf_head_file).get_data() + bud = gwf.output.budget() + spdis = bud.get_data(text="DATA-SPDIS")[0] + qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) + + # setup map view plot + fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) + for a in ax: + a.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title="MF6 pathlines", + kind="line", + x="x", + y="y", + ax=ax[0], + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) + + # plot mp7 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mp7_plines = mp7_pls.groupby(["particleid"]) + for ipl, (pid, pl) in enumerate(mp7_plines): + pl.plot( + title="MP7 pathlines", + kind="line", + x="x", + y="y", + ax=ax[1], + legend=False, + color=cm.plasma(ipl / len(mp7_plines)), + ) + + def sort_square_verts(verts): + """Sort 4 or more points on a square in clockwise order, starting with the top-left point""" + + # sort by y coordinate + verts.sort(key=lambda v: v[1], reverse=True) + + # separate top and bottom rows + y0 = verts[0][1] + t = [v for v in verts if v[1] == y0] + b = verts[len(t) :] + + # sort top and bottom rows by x coordinate + t.sort(key=lambda v: v[0]) + b.sort(key=lambda v: v[0]) + + # return vertices in clockwise order + return t + list(reversed(b)) + + def plot_stop_zone(nn, ax): + ifaces = [] + iverts = mg.iverts[nn] + + # sort vertices of well cell in clockwise order + verts = [tuple(mg.verts[v]) for v in iverts] + sorted_verts = sort_square_verts(list(set(verts.copy()))) + for i in range(len(sorted_verts) - 1): + if i == 0: + p0 = sorted_verts[-1] + p1 = sorted_verts[i] + ifaces.append([p0, p1]) + p0 = sorted_verts[i] + p1 = sorted_verts[(i + 1)] + ifaces.append([p0, p1]) + + lc = LineCollection(ifaces, color="red", lw=4) + ax.add_collection(lc) + + # plot stop zones + for iz in stopzone_cells: + for a in ax: + plot_stop_zone(mg.get_node([iz])[0], a) + + # view/save plot + # plt.show() + plt.savefig(gwf_ws / f"test_{name}_map.png") + + # check that cell numbers are correct + for i, row in list(mf6_pls.iterrows()): + # todo debug final cell number disagreement + if row.ireason == 3: # termination + continue + + x, y, z, t, ilay, icell = ( + row.x, + row.y, + row.z, + row.t, + row.ilay, + row.icell, + ) + k, i, j = mg.intersect(x, y, z) + nn = mg.get_node([k, i, j]) + 1 + neighbors = mg.neighbors(nn) + assert np.isclose(nn, icell, atol=1) or any( + (nn - 1) == n for n in neighbors + ) + + # convert mf6 pathlines to mp7 format + mf6_pls = to_mp7_pathlines(mf6_pls) + + # drop columns for which there is no direct correspondence between mf6 and mp7 + del mf6_pls["sequencenumber"] + del mf6_pls["particleidloc"] + del mf6_pls["xloc"] + del mf6_pls["yloc"] + del mf6_pls["zloc"] + del mp7_pls["sequencenumber"] + del mp7_pls["particleidloc"] + del mp7_pls["xloc"] + del mp7_pls["yloc"] + del mp7_pls["zloc"] + + # drop duplicates and sort both dataframes + # todo debug why necessary to drop dupes + cols = ["particleid", "time"] + mp7_pls = mp7_pls.drop_duplicates(subset=cols) + mf6_pls = mf6_pls.drop_duplicates(subset=cols) + mf6_pls = mf6_pls.sort_values(by=cols) + mp7_pls = mp7_pls.sort_values(by=cols) + + # compare mf6 / mp7 pathline data + assert mf6_pls.shape == mp7_pls.shape + assert np.allclose(mf6_pls, mp7_pls, atol=1e-3) + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + compare=None, + ) + test.run() diff --git a/autotest/test_prt_ternary_methods.py b/autotest/test_prt_ternary_methods.py new file mode 100644 index 00000000000..c630d65c18e --- /dev/null +++ b/autotest/test_prt_ternary_methods.py @@ -0,0 +1,194 @@ +""" +Tests a PRT model on the vertex grid demonstrated +at the end of Flopy's triangular mesh example: + +https://flopy.readthedocs.io/en/latest/Notebooks/dis_triangle_example.html + +There are two scenarios, both of which release +particles from the right border of the grid. In +the 1st case flow is left to right, in the 2nd +flow is top right to bottom left. + +Runtime is benchmarked with pytest-benchmark. +The ZERO_METHOD option is used to select root- +finding methods for total runtime comparison. +""" + +from math import isclose +from pathlib import Path + +import flopy +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pytest +from flopy.discretization import VertexGrid +from flopy.utils import GridIntersect +from flopy.utils.triangle import Triangle +from prt_test_utils import get_model_name +from shapely.geometry import LineString + +from framework import TestFramework +from test_prt_triangle import ( + active_domain, + nlay, + top, + botm, + porosity, + get_tri, + build_gwf_sim, +) + +simname = "prtter" +cases = [ + f"{simname}eu", + f"{simname}br", + f"{simname}ch", + # f"{simname}test", +] +methods = [ + 0, # euler + 1, # brent + 2, # chandrupatla + # 3 # test method (doesn't always converge??) +] + + +def build_prt_sim(idx, name, gwf_ws, prt_ws, targets): + prt_ws = Path(prt_ws) + gwfname = get_model_name(name, "gwf") + prtname = get_model_name(name, "prt") + + # create grid + tri = get_tri(prt_ws / "grid", targets) + grid = VertexGrid(tri) + gi = GridIntersect(grid) + + # identify cells on left edge + line = LineString([active_domain[0], active_domain[-1]]) + cells_left = gi.intersect(line)["cellids"] + cells_left = np.array(list(cells_left)) + + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=name, version="mf6", exe_name=targets["mf6"], sim_ws=prt_ws + ) + tdis = flopy.mf6.ModflowTdis( + sim, time_units="DAYS", perioddata=[[1.0, 1, 1.0]] + ) + prt = flopy.mf6.ModflowPrt(sim, modelname=prtname) + cell2d = tri.get_cell2d() + vertices = tri.get_vertices() + xcyc = tri.get_xcyc() + ncpl = tri.ncpl + nvert = tri.nvert + dis = flopy.mf6.ModflowGwfdisv( + prt, + nlay=nlay, + ncpl=ncpl, + nvert=nvert, + top=top, + botm=botm, + vertices=vertices, + cell2d=cell2d, + ) + flopy.mf6.ModflowPrtmip( + prt, pname="mip", porosity=porosity, zero_method=methods[idx] + ) + prpdata = [ + # particle index, (layer, cell index), x, y, z + (0, (0, 88), 95, 92, 0.5), + (1, (0, 86), 96, 86, 0.5), + ] + prp_track_file = f"{prtname}.prp.trk" + prp_track_csv_file = f"{prtname}.prp.trk.csv" + flopy.mf6.ModflowPrtprp( + prt, + pname="prp1", + filename=f"{prtname}_1.prp", + nreleasepts=len(prpdata), + packagedata=prpdata, + perioddata={0: ["FIRST"]}, + track_filerecord=[prp_track_file], + trackcsv_filerecord=[prp_track_csv_file], + boundnames=True, + stop_at_weak_sink=True, # currently required for this problem + ) + prt_track_file = f"{prtname}.trk" + prt_track_csv_file = f"{prtname}.trk.csv" + flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + ) + gwf_budget_file = gwf_ws / f"{gwfname}.cbc" + gwf_head_file = gwf_ws / f"{gwfname}.hds" + flopy.mf6.ModflowPrtfmi( + prt, + packagedata=[ + ("GWFHEAD", gwf_head_file), + ("GWFBUDGET", gwf_budget_file), + ], + ) + ems = flopy.mf6.ModflowEms( + sim, + pname="ems", + filename=f"{prtname}.ems", + ) + sim.register_solution_package(ems, [prt.name]) + return sim + + +def build_models(idx, test): + gwf_sim = build_gwf_sim( + test.name, test.workspace, test.targets, ["left", "botm"] + ) + prt_sim = build_prt_sim( + idx, test.name, test.workspace, test.workspace / "prt", test.targets + ) + return gwf_sim, prt_sim + + +def check_output(idx, test): + name = test.name + prt_ws = test.workspace / "prt" + gwf_name = get_model_name(name, "gwf") + prt_name = get_model_name(name, "prt") + gwf_sim = test.sims[0] + gwf = gwf_sim.get_model(gwf_name) + + # get gwf output + gwf = gwf_sim.get_model() + head = gwf.output.head().get_data() + bdobj = gwf.output.budget() + spdis = bdobj.get_data(text="DATA-SPDIS")[0] + qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) + + # get prt output + prt_name = get_model_name(name, "prt") + prt_track_csv_file = f"{prt_name}.prp.trk.csv" + pls = pd.read_csv(prt_ws / prt_track_csv_file, na_filter=False) + endpts = ( + pls.sort_values("t") + .groupby(["imdl", "iprp", "irpt", "trelease"]) + .tail(1) + ) + + # check pathline shape and endpoints + assert pls.shape == (112, 16) + assert endpts.shape == (2, 16) + assert set(endpts.icell) == {111, 144} + + +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets, benchmark): + test = TestFramework( + name=name, + workspace=function_tmpdir, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + targets=targets, + compare=None, + ) + benchmark(test.run) diff --git a/autotest/test_prt_track_events.py b/autotest/test_prt_track_events.py new file mode 100644 index 00000000000..45c9c5f7ecb --- /dev/null +++ b/autotest/test_prt_track_events.py @@ -0,0 +1,514 @@ +""" +This test exercises TRACKEVENT options to check +that tracking event selection works as expected. + +GWF and PRT models run in separate simulations. + +The grid is a 10x10 square with a single layer, +the same flow system shown on the FloPy readme, +except for 2 inactive cells in the bottom left +and top right corners. + +The flow system is similar to test_prt_fmi01.py. +Particles are split across two release packages, +and the grid has an inactive region this time, +to check cell numbers recorded in pathline data +are converted from reduced to user node numbers. +This is verified with FloPy by intersecting path +points with the grid then computing node numbers. + +Particles are released from the top left cell. + +Pathlines are compared with a MODPATH 7 model. +""" + +from pathlib import Path +from typing import List + +import flopy +import matplotlib.cm as cm +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pytest +from flopy.plot.plotutil import to_mp7_pathlines +from flopy.utils import PathlineFile +from flopy.utils.binaryfile import HeadFile +from prt_test_utils import ( + FlopyReadmeCase, + check_budget_data, + check_track_data, + get_model_name, +) + +from framework import TestFramework + +simname = "prtevnt" +cases = [ + f"{simname}all", + f"{simname}rel", + f"{simname}tsit", + f"{simname}tstp", + f"{simname}term", + f"{simname}wksk", + f"{simname}mult", + f"{simname}trts", +] +releasepts_prt = { + "a": [ + # index, k, i, j, x, y, z + [i, 0, 0, 0, float(f"0.{i + 1}"), float(f"9.{i + 1}"), 0.5] + for i in range(4) + ], + "b": [ + # index, k, i, j, x, y, z + [i, 0, 0, 0, float(f"0.{i + 5}"), float(f"9.{i + 5}"), 0.5] + for i in range(5) + ], +} +releasepts_mp7 = { + "a": [ + # node number, localx, localy, localz + (0, float(f"0.{i + 1}"), float(f"0.{i + 1}"), 0.5) + for i in range(4) + ], + "b": [ + # node number, localx, localy, localz + (0, float(f"0.{i + 5}"), float(f"0.{i + 5}"), 0.5) + for i in range(5) + ], +} +tracktimes = list(np.linspace(0, 50, 1000)) + + +# function to create idomain from grid dimensions +def create_idomain(nlay, nrow, ncol): + idmn = np.ones((nlay, nrow, ncol), dtype=int) + idmn[0, 0, 9] = 0 + idmn[0, 9, 0] = 0 + return idmn + + +def build_prt_sim(name, gwf_ws, prt_ws, mf6): + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=name, + exe_name=mf6, + version="mf6", + sim_ws=prt_ws, + ) + + # create tdis package + flopy.mf6.modflow.mftdis.ModflowTdis( + sim, + pname="tdis", + time_units="DAYS", + nper=FlopyReadmeCase.nper, + perioddata=[ + ( + FlopyReadmeCase.perlen, + FlopyReadmeCase.nstp, + FlopyReadmeCase.tsmult, + ) + ], + ) + + # create prt model + prt_name = get_model_name(name, "prt") + prt = flopy.mf6.ModflowPrt(sim, modelname=prt_name) + + # create prt discretization + flopy.mf6.modflow.mfgwfdis.ModflowGwfdis( + prt, + pname="dis", + nlay=FlopyReadmeCase.nlay, + nrow=FlopyReadmeCase.nrow, + ncol=FlopyReadmeCase.ncol, + idomain=create_idomain( + FlopyReadmeCase.nlay, FlopyReadmeCase.nrow, FlopyReadmeCase.ncol + ), + ) + + # create mip package + flopy.mf6.ModflowPrtmip( + prt, pname="mip", porosity=FlopyReadmeCase.porosity + ) + + # create a prp package for groups a and b + prps = [ + flopy.mf6.ModflowPrtprp( + prt, + pname=f"prp_{grp}", + filename=f"{prt_name}_{grp}.prp", + nreleasepts=len(releasepts_prt[grp]), + packagedata=releasepts_prt[grp], + perioddata={0: ["FIRST"]}, + ) + for grp in ["a", "b"] + ] + + def get_oc() -> List[str]: + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + if "all" in name: + return flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + track_all=True, + ) + elif "rel" in name: + return flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + track_release=True, + ) + elif "tsit" in name: + return flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + track_transit=True, + ) + elif "tstp" in name: + return flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + track_timestep=True, + ) + elif "wksk" in name: + return flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + track_weaksink=True, + ) + elif "term" in name: + return flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + track_terminate=True, + ) + elif "mult" in name: + return flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + track_release=True, + track_terminate=True, + ) + elif "trts" in name: + return flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + track_usertime=True, + track_timesrecord=tracktimes if "trts" in name else None, + ) + + oc = get_oc() + + # create the flow model interface + gwf_name = get_model_name(name, "gwf") + gwf_budget_file = gwf_ws / f"{gwf_name}.bud" + gwf_head_file = gwf_ws / f"{gwf_name}.hds" + flopy.mf6.ModflowPrtfmi( + prt, + packagedata=[ + ("GWFHEAD", gwf_head_file), + ("GWFBUDGET", gwf_budget_file), + ], + ) + + # add explicit model solution + ems = flopy.mf6.ModflowEms( + sim, + pname="ems", + filename=f"{prt_name}.ems", + ) + sim.register_solution_package(ems, [prt.name]) + + return sim + + +def build_mp7_sim(name, ws, mp7, gwf): + mp7_name = get_model_name(name, "mp7") + pgs = [ + flopy.modpath.ParticleGroup( + particlegroupname=f"group_{grp}", + particledata=flopy.modpath.ParticleData( + partlocs=[p[0] for p in releasepts_mp7[grp]], + localx=[p[1] for p in releasepts_mp7[grp]], + localy=[p[2] for p in releasepts_mp7[grp]], + localz=[p[3] for p in releasepts_mp7[grp]], + timeoffset=0, + drape=0, + ), + filename=f"{mp7_name}_{grp}.sloc", + ) + for grp in ["a", "b"] + ] + mp = flopy.modpath.Modpath7( + modelname=mp7_name, + flowmodel=gwf, + exe_name=mp7, + model_ws=ws, + headfilename=f"{gwf.name}.hds", + budgetfilename=f"{gwf.name}.bud", + ) + mpbas = flopy.modpath.Modpath7Bas( + mp, + porosity=FlopyReadmeCase.porosity, + ) + mpsim = flopy.modpath.Modpath7Sim( + mp, + simulationtype="pathline", + trackingdirection="forward", + budgetoutputoption="summary", + stoptimeoption="extend", + particlegroups=pgs, + ) + + return mp + + +def build_models(idx, test): + # build gwf model + gwf_sim = FlopyReadmeCase.get_gwf_sim( + test.name, test.workspace, test.targets["mf6"] + ) + # add idomain + gwf = gwf_sim.get_model() + dis = gwf.get_package("DIS") + dis.idomain = create_idomain( + FlopyReadmeCase.nlay, FlopyReadmeCase.nrow, FlopyReadmeCase.ncol + ) + + # build prt model + prt_sim = build_prt_sim( + test.name, test.workspace, test.workspace / "prt", test.targets["mf6"] + ) + # build mp7 model + mp7_sim = build_mp7_sim( + test.name, test.workspace / "mp7", test.targets["mp7"], gwf + ) + return gwf_sim, prt_sim, mp7_sim + + +def check_output(idx, test): + name = test.name + gwf_ws = test.workspace + prt_ws = test.workspace / "prt" + mp7_ws = test.workspace / "mp7" + gwf_name = get_model_name(name, "gwf") + prt_name = get_model_name(name, "prt") + mp7_name = get_model_name(name, "mp7") + gwf_sim = test.sims[0] + gwf = gwf_sim.get_model(gwf_name) + mg = gwf.modelgrid + + # check mf6 output files exist + gwf_budget_file = f"{gwf_name}.bud" + gwf_head_file = f"{gwf_name}.hds" + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + mp7_pathline_file = f"{mp7_name}.mppth" + assert (gwf_ws / gwf_budget_file).is_file() + assert (gwf_ws / gwf_head_file).is_file() + assert (prt_ws / prt_track_file).is_file() + assert (prt_ws / prt_track_csv_file).is_file() + + # check mp7 output files exist + assert (mp7_ws / mp7_pathline_file).is_file() + + # load mp7 pathline results + plf = PathlineFile(mp7_ws / mp7_pathline_file) + mp7_pls = pd.DataFrame( + plf.get_destination_pathline_data(range(mg.nnodes), to_recarray=True) + ) + # convert zero-based to one-based + mp7_pls["particlegroup"] = mp7_pls["particlegroup"] + 1 + mp7_pls["node"] = mp7_pls["node"] + 1 + mp7_pls["k"] = mp7_pls["k"] + 1 + + # load mf6 pathline results + mf6_pls = pd.read_csv(prt_ws / prt_track_csv_file) + + # check pathlines total size + expected_len = 0 + if "all" in name: + expected_len = len(mp7_pls) + if "rel" in name: + expected_len += len(releasepts_prt["a"]) + len(releasepts_prt["b"]) + if "term" in name: + expected_len += len(releasepts_prt["a"]) + len(releasepts_prt["b"]) + if "tsit" in name: + expected_len += len(mp7_pls) - 2 * ( + len(releasepts_prt["a"]) + len(releasepts_prt["b"]) + ) + if "tstp" in name: + pass + if "wksk" in name: + pass + if "trts" in name: + expected_len += 5324 # hardcoded... todo: or 5315?? debug + if "mult" in name: + expected_len += 2 * ( + len(releasepts_prt["a"]) + len(releasepts_prt["b"]) + ) + assert len(mf6_pls) == expected_len + + # make sure mf6 pathline data have correct + # - model index (1) + # - PRP index (1 or 2, depending on release point index) + def all_equal(col, val): + a = col.to_numpy() + return a[0] == val and (a[0] == a).all() + + if len(mf6_pls) > 0: + assert all_equal(mf6_pls["imdl"], 1) + assert set(mf6_pls[mf6_pls["iprp"] == 1]["irpt"].unique()) == set( + range(1, 5) + ) + assert set(mf6_pls[mf6_pls["iprp"] == 2]["irpt"].unique()) == set( + range(1, 6) + ) + + # check budget data were written to mf6 prt list file + check_budget_data( + prt_ws / f"{name}_prt.lst", + FlopyReadmeCase.perlen, + FlopyReadmeCase.nper, + ) + + # check mf6 prt particle track data were written to binary/CSV files + check_track_data( + track_bin=prt_ws / prt_track_file, + track_hdr=prt_ws / Path(prt_track_file.replace(".trk", ".trk.hdr")), + track_csv=prt_ws / prt_track_csv_file, + ) + + # check that particle names are particle indices + # assert len(mf6_pldata) == len(mf6_pldata[mf6_pldata['irpt'].astype(str).eq(mf6_pldata['name'])]) + + # get head, budget, and spdis results from GWF model + hds = HeadFile(gwf_ws / gwf_head_file).get_data() + bud = gwf.output.budget() + spdis = bud.get_data(text="DATA-SPDIS")[0] + qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) + + # setup plot + fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) + for a in ax: + a.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title="MF6 pathlines", + marker="o", + markersize=2, + linestyle="None", + x="x", + y="y", + ax=ax[0], + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) + + # plot mp7 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mp7_plines = mp7_pls.groupby(["particleid"]) + for ipl, (pid, pl) in enumerate(mp7_plines): + pl.plot( + title="MP7 pathlines", + kind="line", + x="x", + y="y", + ax=ax[1], + legend=False, + color=cm.plasma(ipl / len(mp7_plines)), + ) + + # view/save plot + # plt.show() + plt.savefig(gwf_ws / f"test_{simname}.png") + + # check that cell numbers are correct + for i, row in list(mf6_pls.iterrows()): + # todo debug final cell number disagreement + if row.ireason == 3: # termination + continue + + x, y, z, t, ilay, icell = ( + row.x, + row.y, + row.z, + row.t, + row.ilay, + row.icell, + ) + k, i, j = mg.intersect(x, y, z) + nn = mg.get_node([k, i, j]) + 1 + neighbors = mg.neighbors(nn) + assert np.isclose(nn, icell, atol=1) or any( + (nn - 1) == n for n in neighbors + ), f"nn comparison failed: expected {nn}, got {icell}" + assert ilay == (k + 1) == 1 + + if "all" in name: + # convert mf6 pathlines to mp7 format + mf6_pls = to_mp7_pathlines(mf6_pls) + + # drop columns for which there is no direct correspondence between mf6 and mp7 + del mf6_pls["sequencenumber"] + del mf6_pls["particleidloc"] + del mf6_pls["xloc"] + del mf6_pls["yloc"] + del mf6_pls["zloc"] + del mp7_pls["sequencenumber"] + del mp7_pls["particleidloc"] + del mp7_pls["xloc"] + del mp7_pls["yloc"] + del mp7_pls["zloc"] + + # sort both dataframes + cols = ["x", "y", "z", "time"] + mf6_pls = mf6_pls.sort_values(by=cols) + mp7_pls = mp7_pls.sort_values(by=cols) + + # compare mf6 / mp7 pathline data + assert mf6_pls.shape == mp7_pls.shape + assert np.allclose(mf6_pls, mp7_pls, atol=1e-3) + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + compare=None, + ) + test.run() diff --git a/autotest/test_prt_triangle.py b/autotest/test_prt_triangle.py new file mode 100644 index 00000000000..fc9bb94da7d --- /dev/null +++ b/autotest/test_prt_triangle.py @@ -0,0 +1,297 @@ +""" +Tests a PRT model on the vertex grid demonstrated +at the end of Flopy's triangular mesh example: + +https://flopy.readthedocs.io/en/latest/Notebooks/dis_triangle_example.html + +There are two scenarios, both of which release +particles from the right border of the grid. In +the 1st case flow is left to right, in the 2nd +flow is top right to bottom left. +""" + +from math import isclose +from pathlib import Path + +import flopy +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pytest +from flopy.discretization import VertexGrid +from flopy.utils import GridIntersect +from flopy.utils.triangle import Triangle +from prt_test_utils import get_model_name +from shapely.geometry import LineString + +from framework import TestFramework + +simname = "prttri" +cases = [f"{simname}r2l", f"{simname}diag"] +angle = 30 +max_area = 100 +active_domain = [(0, 0), (100, 0), (100, 100), (0, 100)] +nlay = 1 +top = 1.0 +botm = [0.0] +k = 10.0 +tdis_rc = [[1.0, 1, 1.0]] +porosity = 0.1 + + +def get_chd_head(x): + return x * 10.0 / 100.0 + + +def get_tri(workspace, targets) -> Triangle: + workspace.mkdir(exist_ok=True, parents=True) + tri = Triangle( + angle=angle, + maximum_area=max_area, + model_ws=workspace, + exe_name=targets["triangle"], + ) + tri.add_polygon(active_domain) + tri.build() + return tri + + +def build_gwf_sim(name, ws, targets, chd_sides=None): + ws = Path(ws) + gwfname = get_model_name(name, "gwf") + sim = flopy.mf6.MFSimulation( + sim_name=name, version="mf6", exe_name=targets["mf6"], sim_ws=ws + ) + tdis = flopy.mf6.ModflowTdis(sim, time_units="DAYS", perioddata=tdis_rc) + gwf = flopy.mf6.ModflowGwf(sim, modelname=gwfname, save_flows=True) + ims = flopy.mf6.ModflowIms( + sim, + print_option="SUMMARY", + complexity="complex", + outer_dvclose=1.0e-8, + inner_dvclose=1.0e-8, + ) + tri = get_tri(ws / "grid", targets) + cell2d = tri.get_cell2d() + vertices = tri.get_vertices() + xcyc = tri.get_xcyc() + ncpl = tri.ncpl + nvert = tri.nvert + dis = flopy.mf6.ModflowGwfdisv( + gwf, + nlay=nlay, + ncpl=ncpl, + nvert=nvert, + top=top, + botm=botm, + vertices=vertices, + cell2d=cell2d, + ) + npf = flopy.mf6.ModflowGwfnpf( + gwf, + xt3doptions=[(True)], + save_specific_discharge=True, + save_saturation=True, + ) + ic = flopy.mf6.ModflowGwfic(gwf) + cells = [] + chdlist = [] + + if isinstance(chd_sides, (list, tuple)): + if "left" in chd_sides: + leftcells = tri.get_edge_cells(4) + cells.extend(leftcells) + if "right" in chd_sides: + rightcells = tri.get_edge_cells(2) + cells.extend(rightcells) + if "botm" in chd_sides: + botmcells = tri.get_edge_cells(3) + cells.extend(botmcells) + if "top" in chd_sides: + topcells = tri.get_edge_cells(1) + cells.extend(topcells) + for icpl in set(cells): + h = get_chd_head(xcyc[icpl, 0]) + chdlist.append([(0, icpl), h]) + + chd = flopy.mf6.ModflowGwfchd(gwf, stress_period_data=chdlist) + oc = flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord=f"{gwfname}.cbc", + head_filerecord=f"{gwfname}.hds", + saverecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + printrecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + ) + return sim + + +def build_prt_sim(idx, name, gwf_ws, prt_ws, targets): + prt_ws = Path(prt_ws) + gwfname = get_model_name(name, "gwf") + prtname = get_model_name(name, "prt") + + # create grid + tri = get_tri(prt_ws / "grid", targets) + grid = VertexGrid(tri) + gi = GridIntersect(grid) + + # identify cells on left edge + line = LineString([active_domain[0], active_domain[-1]]) + cells_left = gi.intersect(line)["cellids"] + cells_left = np.array(list(cells_left)) + + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=name, version="mf6", exe_name=targets["mf6"], sim_ws=prt_ws + ) + tdis = flopy.mf6.ModflowTdis( + sim, time_units="DAYS", perioddata=[[1.0, 1, 1.0]] + ) + prt = flopy.mf6.ModflowPrt(sim, modelname=prtname) + cell2d = tri.get_cell2d() + vertices = tri.get_vertices() + xcyc = tri.get_xcyc() + ncpl = tri.ncpl + nvert = tri.nvert + dis = flopy.mf6.ModflowGwfdisv( + prt, + nlay=nlay, + ncpl=ncpl, + nvert=nvert, + top=top, + botm=botm, + vertices=vertices, + cell2d=cell2d, + ) + flopy.mf6.ModflowPrtmip(prt, pname="mip", porosity=porosity) + prpdata = [ + # particle index, (layer, cell index), x, y, z + (0, (0, 88), 95, 92, 0.5), + (1, (0, 86), 96, 86, 0.5), + ] + prp_track_file = f"{prtname}.prp.trk" + prp_track_csv_file = f"{prtname}.prp.trk.csv" + flopy.mf6.ModflowPrtprp( + prt, + pname="prp1", + filename=f"{prtname}_1.prp", + nreleasepts=len(prpdata), + packagedata=prpdata, + perioddata={0: ["FIRST"]}, + track_filerecord=[prp_track_file], + trackcsv_filerecord=[prp_track_csv_file], + boundnames=True, + stop_at_weak_sink=True, # currently required for this problem + ) + prt_track_file = f"{prtname}.trk" + prt_track_csv_file = f"{prtname}.trk.csv" + flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + ) + gwf_budget_file = gwf_ws / f"{gwfname}.cbc" + gwf_head_file = gwf_ws / f"{gwfname}.hds" + flopy.mf6.ModflowPrtfmi( + prt, + packagedata=[ + ("GWFHEAD", gwf_head_file), + ("GWFBUDGET", gwf_budget_file), + ], + ) + ems = flopy.mf6.ModflowEms( + sim, + pname="ems", + filename=f"{prtname}.ems", + ) + sim.register_solution_package(ems, [prt.name]) + return sim + + +def build_models(idx, test): + gwf_sim = build_gwf_sim( + test.name, + test.workspace, + test.targets, + ( + ["left", "right"] + if "r2l" in test.name + else ["left", "botm"] if "diag" in test.name else None + ), + ) + prt_sim = build_prt_sim( + idx, test.name, test.workspace, test.workspace / "prt", test.targets + ) + return gwf_sim, prt_sim + + +def check_output(idx, test): + name = test.name + prt_ws = test.workspace / "prt" + gwf_name = get_model_name(name, "gwf") + prt_name = get_model_name(name, "prt") + gwf_sim = test.sims[0] + gwf = gwf_sim.get_model(gwf_name) + + # get gwf output + gwf = gwf_sim.get_model() + head = gwf.output.head().get_data() + bdobj = gwf.output.budget() + spdis = bdobj.get_data(text="DATA-SPDIS")[0] + qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) + + # get prt output + prt_name = get_model_name(name, "prt") + prt_track_csv_file = f"{prt_name}.prp.trk.csv" + pls = pd.read_csv(prt_ws / prt_track_csv_file, na_filter=False) + endpts = ( + pls.sort_values("t") + .groupby(["imdl", "iprp", "irpt", "trelease"]) + .tail(1) + ) + + plot_debug = False + if plot_debug: + fig = plt.figure(figsize=(10, 10)) + ax = plt.subplot(1, 1, 1, aspect="equal") + pmv = flopy.plot.PlotMapView(model=gwf, ax=ax) + pmv.plot_grid() + pmv.plot_array(head, cmap="Blues", alpha=0.25) + pmv.plot_vector(qx, qy, normalize=True, alpha=0.25) + mf6_plines = pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title=f"MF6 pathlines ({name})", + kind="line", + x="x", + y="y", + ax=ax, + legend=False, + color="black", + ) + plt.show() + + if "r2l" in name: + assert pls.shape == (76, 16) + assert (pls.z == 0.5).all() + assert isclose(min(pls.x), 5.1145, rel_tol=1e-6) + assert isclose(max(pls.x), 96, rel_tol=1e-6) + assert set(endpts.icell) == {12, 128} + elif "diag" in name: + assert pls.shape == (112, 16) + assert endpts.shape == (2, 16) + assert set(endpts.icell) == {111, 144} + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + compare=None, + ) + test.run() diff --git a/autotest/test_prt_voronoi1.py b/autotest/test_prt_voronoi1.py new file mode 100644 index 00000000000..257be507ea5 --- /dev/null +++ b/autotest/test_prt_voronoi1.py @@ -0,0 +1,423 @@ +""" +Tests a PRT model on the Voronoi grid demonstrated +in Flopy's Voronoi example: + +https://flopy.readthedocs.io/en/latest/Notebooks/dis_voronoi_example.html + +Three variants are included, first with straight +left to right pathlines and no boundary conditions, +then again with wells, first pumping, then injection. + +TODO: support parallel adjacent cell faces, +duplicated vertices as flopy.utils.voronoi +can produce via scipy/Qhull (for now flopy +filters these but mf6 probably should too) +""" + +from math import isclose +from os import environ +from pathlib import Path +from platform import system + +import flopy +import matplotlib as mpl +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pytest +from flopy.discretization import VertexGrid +from flopy.utils import GridIntersect +from flopy.utils.triangle import Triangle +from flopy.utils.voronoi import VoronoiGrid +from prt_test_utils import get_model_name +from shapely.geometry import LineString, Point +from modflow_devtools.misc import is_in_ci + +from framework import TestFramework + +simname = "prtvor1" +cases = [f"{simname}l2r", f"{simname}welp", f"{simname}weli"] +times = [True, False, False] +tracktimes = list(np.linspace(0, 40000, 100)) +xmin = 0.0 +xmax = 2000.0 +ymin = 0.0 +ymax = 1000.0 +top = 1.0 +botm = [0.0] +angle_min = 30 +area_max = 1000.0 +delr = area_max**0.5 +nlay = 1 +ncol = xmax / delr +nrow = ymax / delr +nodes = ncol * nrow +porosity = 0.1 +rpts = [[20, i, 0.5] for i in range(1, 999, 20)] + + +def get_grid(workspace, targets): + workspace.mkdir(exist_ok=True, parents=True) + tri = Triangle( + maximum_area=area_max, + angle=angle_min, + model_ws=workspace, + exe_name=targets["triangle"], + ) + poly = np.array(((xmin, ymin), (xmax, ymin), (xmax, ymax), (xmin, ymax))) + tri.add_polygon(poly) + tri.build(verbose=False) + return VoronoiGrid(tri) + + +def build_gwf_sim(name, ws, targets): + ws = Path(ws) + gwf_name = get_model_name(name, "gwf") + + # create grid + grid = get_grid(ws / "grid", targets) + vgrid = VertexGrid(**grid.get_gridprops_vertexgrid(), nlay=1) + ibd = np.zeros(vgrid.ncpl, dtype=int) + gi = GridIntersect(vgrid) + + # identify cells on left edge + line = LineString([(xmin, ymin), (xmin, ymax)]) + cells_left = gi.intersect(line)["cellids"] + cells_left = np.array(list(cells_left)) + ibd[cells_left] = 1 + + # identify cells on right edge + line = LineString([(xmax, ymin), (xmax, ymax)]) + cells_right = gi.intersect(line)["cellids"] + cells_right = np.array(list(cells_right)) + ibd[cells_right] = 2 + + # identify cells on bottom edge + line = LineString([(xmin, ymin), (xmax, ymin)]) + cells_bottom = gi.intersect(line)["cellids"] + cells_bottom = np.array(list(cells_bottom)) + ibd[cells_bottom] = 3 + + # identify release cell + point = Point((500, 500)) + cells2 = gi.intersect(point)["cellids"] + cells2 = np.array(list(cells2)) + + # identify well cell + points = [Point((1200, 500)), Point((700, 200)), Point((1600, 700))] + well_cells = [vgrid.intersect(p.x, p.y) for p in points] + + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=name, version="mf6", exe_name=targets["mf6"], sim_ws=ws + ) + tdis = flopy.mf6.ModflowTdis( + sim, time_units="DAYS", perioddata=[[1.0, 1, 1.0]] + ) + gwf = flopy.mf6.ModflowGwf(sim, modelname=gwf_name, save_flows=True) + ims = flopy.mf6.ModflowIms( + sim, + print_option="SUMMARY", + complexity="complex", + outer_dvclose=1.0e-8, + inner_dvclose=1.0e-8, + ) + disv = flopy.mf6.ModflowGwfdisv( + gwf, nlay=nlay, **grid.get_disv_gridprops(), top=top, botm=botm + ) + if "wel" in name: + # k, j, q + wells = [ + (0, c, 0.5 * (-1 if "welp" in name else 1)) for c in well_cells + ] + wel = flopy.mf6.ModflowGwfwel( + gwf, + maxbound=len(wells), + save_flows=True, + stress_period_data={0: wells}, + ) + npf = flopy.mf6.ModflowGwfnpf( + gwf, + xt3doptions=[(True)], + k=10.0, + save_saturation=True, + save_specific_discharge=True, + ) + ic = flopy.mf6.ModflowGwfic(gwf) + + chdlist = [] + icpl_seen = [] + for icpl in cells_left: + chdlist.append([(0, icpl), 1.0]) + icpl_seen.append(icpl) + for icpl in cells_right: + chdlist.append([(0, icpl), 0.0]) + icpl_seen.append(icpl) + if "wel" in name: + for icpl in cells_bottom: + if icpl in icpl_seen: + continue + chdlist.append([(0, icpl), 0.8]) + chd = flopy.mf6.ModflowGwfchd(gwf, stress_period_data=chdlist) + oc = flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord=f"{gwf_name}.bud", + head_filerecord=f"{gwf_name}.hds", + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + printrecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + ) + return sim + + +def build_prt_sim(idx, name, gwf_ws, prt_ws, targets): + prt_ws = Path(prt_ws) + gwf_name = get_model_name(name, "gwf") + prt_name = get_model_name(name, "prt") + + # create grid + grid = get_grid(prt_ws / "grid", targets) + gridprops = grid.get_gridprops_vertexgrid() + vgrid = VertexGrid(**gridprops, nlay=1) + ibd = np.zeros(vgrid.ncpl, dtype=int) + gi = GridIntersect(vgrid) + + # identify cells on left edge + line = LineString([(xmin, ymin), (xmin, ymax)]) + cells0 = gi.intersect(line)["cellids"] + cells0 = np.array(list(cells0)) + ibd[cells0] = 1 + + # identify cells on right edge + line = LineString([(xmax, ymin), (xmax, ymax)]) + cells1 = gi.intersect(line)["cellids"] + cells1 = np.array(list(cells1)) + ibd[cells1] = 2 + + # identify well cell + point = Point((800, 500)) + cell_wel = vgrid.intersect(point.x, point.y) + + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=name, version="mf6", exe_name=targets["mf6"], sim_ws=prt_ws + ) + tdis = flopy.mf6.ModflowTdis( + sim, time_units="DAYS", perioddata=[[1.0, 1, 1.0]] + ) + prt = flopy.mf6.ModflowPrt(sim, modelname=prt_name) + disv = flopy.mf6.ModflowGwfdisv( + prt, nlay=nlay, **grid.get_disv_gridprops(), top=top, botm=botm + ) + flopy.mf6.ModflowPrtmip(prt, pname="mip", porosity=porosity) + + prpdata = [ + # index, (layer, cell index), x, y, z + (i, (0, vgrid.intersect(p[0], p[1])), p[0], p[1], p[2]) + for i, p in enumerate(rpts[1:]) # first release point crashes + ] + prp_track_file = f"{prt_name}.prp.trk" + prp_track_csv_file = f"{prt_name}.prp.trk.csv" + flopy.mf6.ModflowPrtprp( + prt, + pname="prp1", + filename=f"{prt_name}_1.prp", + nreleasepts=len(prpdata), + packagedata=prpdata, + perioddata={0: ["FIRST"]}, + track_filerecord=[prp_track_file], + trackcsv_filerecord=[prp_track_csv_file], + boundnames=True, + stop_at_weak_sink=True, # currently required for this problem + ) + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + track_all=not times[idx], + track_usertime=times[idx], + track_timesrecord=tracktimes if times[idx] else None, + ) + gwf_budget_file = gwf_ws / f"{gwf_name}.bud" + gwf_head_file = gwf_ws / f"{gwf_name}.hds" + flopy.mf6.ModflowPrtfmi( + prt, + packagedata=[ + ("GWFHEAD", gwf_head_file), + ("GWFBUDGET", gwf_budget_file), + ], + ) + ems = flopy.mf6.ModflowEms( + sim, + pname="ems", + filename=f"{prt_name}.ems", + ) + sim.register_solution_package(ems, [prt.name]) + return sim + + +def build_models(idx, test): + gwf_sim = build_gwf_sim(test.name, test.workspace, test.targets) + prt_sim = build_prt_sim( + idx, test.name, test.workspace, test.workspace / "prt", test.targets + ) + return gwf_sim, prt_sim + + +def check_output(idx, test): + name = test.name + prt_ws = test.workspace / "prt" + prt_name = get_model_name(name, "prt") + gwfsim = test.sims[0] + + # get gwf output + gwf = gwfsim.get_model() + head = gwf.output.head().get_data() + bdobj = gwf.output.budget() + spdis = bdobj.get_data(text="DATA-SPDIS")[0] + qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) + + # get prt output + prt_track_csv_file = f"{prt_name}.prp.trk.csv" + pls = pd.read_csv(prt_ws / prt_track_csv_file, na_filter=False) + endpts = ( + pls.sort_values("t") + .groupby(["imdl", "iprp", "irpt", "trelease"]) + .tail(1) + ) + + if "l2r" in name: + # assert pls.shape == (212, 16) + assert (pls.z == 0.5).all() # no z change + # path should be horizontal from left to right + assert isclose(min(pls.x), 20, rel_tol=1e-4) + assert isclose(max(pls.x), 1980.571, rel_tol=1e-4) + assert isclose(min(pls.y), 21, rel_tol=1e-4) + assert isclose(max(pls.y), 981, rel_tol=1e-4) + + plot_2d = False + if plot_2d: + # plot in 2d with mpl + fig = plt.figure(figsize=(16, 10)) + ax = plt.subplot(1, 1, 1, aspect="equal") + pmv = flopy.plot.PlotMapView(model=gwf, ax=ax) + pmv.plot_grid(alpha=0.25) + pmv.plot_ibound(alpha=0.5) + headmesh = pmv.plot_array(head, alpha=0.25) + cv = pmv.contour_array( + head, levels=np.linspace(0, 1, 9), colors="black" + ) + plt.clabel(cv) + plt.colorbar( + headmesh, shrink=0.25, ax=ax, label="Head", location="right" + ) + handles = [ + mpl.lines.Line2D( + [0], + [0], + marker=">", + linestyle="", + label="Specific discharge", + color="grey", + markerfacecolor="gray", + ), + ] + if "wel" in name: + handles.append( + mpl.lines.Line2D( + [0], + [0], + marker="o", + linestyle="", + label="Well", + markerfacecolor="red", + ), + ) + ax.legend( + handles=handles, + loc="lower right", + ) + pmv.plot_vector(qx, qy, normalize=True, alpha=0.25) + if "wel" in name: + pmv.plot_bc(ftype="WEL") + mf6_plines = pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + title = "DISV voronoi grid particle tracks" + if "welp" in name: + title += ": pumping wells" + elif "weli" in name: + title += ": injection wells" + pl.plot( + title=title, + kind="line", + linestyle="--", + marker="o", + markersize=2, + x="x", + y="y", + ax=ax, + legend=False, + color="black", + ) + plt.show() + plt.savefig(prt_ws / f"{name}.png") + + plot_3d = False + if plot_3d: + # plot in 3d with pyvista (via vtk) + import pyvista as pv + from flopy.export.vtk import Vtk + from flopy.plot.plotutil import to_mp7_pathlines + + def get_meshes(model, pathlines): + vtk = Vtk(model=model, binary=False, smooth=False) + vtk.add_model(model) + vtk.add_pathline_points( + to_mp7_pathlines(pathlines.to_records(index=False)) + ) + grid_mesh, path_mesh = vtk.to_pyvista() + grid_mesh.rotate_x(-100, point=axes.origin, inplace=True) + grid_mesh.rotate_z(90, point=axes.origin, inplace=True) + grid_mesh.rotate_y(120, point=axes.origin, inplace=True) + path_mesh.rotate_x(-100, point=axes.origin, inplace=True) + path_mesh.rotate_z(90, point=axes.origin, inplace=True) + path_mesh.rotate_y(120, point=axes.origin, inplace=True) + return grid_mesh, path_mesh + + def callback(mesh, value): + sub = pls[pls.t <= value] + gm, pm = get_meshes(gwf, sub) + mesh.shallow_copy(pm) + + pv.set_plot_theme("document") + axes = pv.Axes(show_actor=True, actor_scale=2.0, line_width=5) + p = pv.Plotter(notebook=False) + grid_mesh, path_mesh = get_meshes(gwf, pls) + p.add_mesh(grid_mesh, scalars=head[0], cmap="Blues", opacity=0.5) + p.add_mesh(path_mesh, label="Time", style="points", color="black") + p.camera.zoom(1) + p.add_slider_widget(lambda v: callback(path_mesh, v), [0, 30202]) + p.show() + + +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + if ( + "weli" in name + and system() == "Darwin" + and environ.get("FC") == "ifort" + and is_in_ci() + ): + pytest.skip(f"FPE (div by 0) with ifort 2021.7 in macOS CI") + + test = TestFramework( + name=name, + workspace=function_tmpdir, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + targets=targets, + compare=None, + ) + test.run() diff --git a/autotest/test_prt_voronoi2.py b/autotest/test_prt_voronoi2.py new file mode 100644 index 00000000000..cd93b532488 --- /dev/null +++ b/autotest/test_prt_voronoi2.py @@ -0,0 +1,434 @@ +""" +Tests a PRT model on the Voronoi grid demonstrated +in Flopy's Voronoi example: + +https://flopy.readthedocs.io/en/latest/Notebooks/dis_voronoi_example.html + +Particles are released from the center of the plume +(i.e. the constant concentration cell) used in the +transport model. + +TODO: support parallel adjacent cell faces, +duplicated vertices as flopy.utils.voronoi +can produce via scipy/Qhull (for now flopy +filters these but mf6 probably should too) +""" + +from pathlib import Path + +import flopy +import matplotlib as mpl +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pytest +from flopy.discretization import VertexGrid +from flopy.utils import GridIntersect +from flopy.utils.triangle import Triangle +from flopy.utils.voronoi import VoronoiGrid +from prt_test_utils import get_model_name +from shapely.geometry import LineString, Point + +from framework import TestFramework + +simname = "prtvor2" +cases = [simname] +xmin = 0.0 +xmax = 2000.0 +ymin = 0.0 +ymax = 1000.0 +top = 1.0 +botm = [0.0] +angle_min = 30 +area_max = 1000.0 +delr = area_max**0.5 +nlay = 1 +ncol = xmax / delr +nrow = ymax / delr +nodes = ncol * nrow +porosity = 0.1 + + +def get_grid(workspace, targets): + workspace.mkdir(exist_ok=True, parents=True) + tri = Triangle( + maximum_area=area_max, + angle=angle_min, + model_ws=workspace, + exe_name=targets["triangle"], + ) + poly = np.array(((xmin, ymin), (xmax, ymin), (xmax, ymax), (xmin, ymax))) + tri.add_polygon(poly) + tri.build(verbose=False) + return VoronoiGrid(tri) + + +def build_gwf_sim(name, ws, targets): + ws = Path(ws) + gwf_name = get_model_name(name, "gwf") + + # create grid + grid = get_grid(ws / "grid", targets) + vgrid = VertexGrid(**grid.get_gridprops_vertexgrid(), nlay=1) + ibd = np.zeros(vgrid.ncpl, dtype=int) + gi = GridIntersect(vgrid) + + # identify cells on left edge + line = LineString([(xmin, ymin), (xmin, ymax)]) + cells_left = gi.intersect(line)["cellids"] + cells_left = np.array(list(cells_left)) + ibd[cells_left] = 1 + + # identify cells on right edge + line = LineString([(xmax, ymin), (xmax, ymax)]) + cells_right = gi.intersect(line)["cellids"] + cells_right = np.array(list(cells_right)) + ibd[cells_right] = 2 + + # identify cells on bottom edge + line = LineString([(xmin, ymin), (xmax, ymin)]) + cells_bottom = gi.intersect(line)["cellids"] + cells_bottom = np.array(list(cells_bottom)) + ibd[cells_bottom] = 3 + + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=name, version="mf6", exe_name=targets["mf6"], sim_ws=ws + ) + tdis = flopy.mf6.ModflowTdis( + sim, time_units="DAYS", perioddata=[[1.0, 1, 1.0]] + ) + gwf = flopy.mf6.ModflowGwf(sim, modelname=gwf_name, save_flows=True) + ims = flopy.mf6.ModflowIms( + sim, + print_option="SUMMARY", + complexity="complex", + outer_dvclose=1.0e-8, + inner_dvclose=1.0e-8, + ) + disv = flopy.mf6.ModflowGwfdisv( + gwf, nlay=nlay, **grid.get_disv_gridprops(), top=top, botm=botm + ) + npf = flopy.mf6.ModflowGwfnpf( + gwf, + xt3doptions=[(True)], + k=10.0, + save_saturation=True, + save_specific_discharge=True, + ) + ic = flopy.mf6.ModflowGwfic(gwf) + + chdlist = [] + icpl_seen = [] + for icpl in cells_left: + chdlist.append([(0, icpl), 1.0]) + icpl_seen.append(icpl) + for icpl in cells_right: + chdlist.append([(0, icpl), 0.0]) + icpl_seen.append(icpl) + chd = flopy.mf6.ModflowGwfchd(gwf, stress_period_data=chdlist) + oc = flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord=f"{gwf_name}.bud", + head_filerecord=f"{gwf_name}.hds", + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + printrecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + ) + return sim + + +def build_gwt_sim(name, gwf_ws, gwt_ws, targets): + ws = Path(gwt_ws) + gwf_name = get_model_name(name, "gwf") + gwt_name = get_model_name(name, "gwt") + + # create grid + grid = get_grid(ws / "grid", targets) + vgrid = VertexGrid(**grid.get_gridprops_vertexgrid(), nlay=1) + ibd = np.zeros(vgrid.ncpl, dtype=int) + gi = GridIntersect(vgrid) + + # identify release cell + point = Point((500, 500)) + cells2 = gi.intersect(point)["cellids"] + cells2 = np.array(list(cells2)) + + sim = flopy.mf6.MFSimulation( + sim_name=name, version="mf6", exe_name="mf6", sim_ws=ws + ) + tdis = flopy.mf6.ModflowTdis( + sim, time_units="DAYS", perioddata=[[100 * 365.0, 100, 1.0]] + ) + gwt = flopy.mf6.ModflowGwt(sim, modelname=gwt_name, save_flows=True) + ims = flopy.mf6.ModflowIms( + sim, + print_option="SUMMARY", + complexity="simple", + linear_acceleration="bicgstab", + outer_dvclose=1.0e-6, + inner_dvclose=1.0e-6, + ) + disv_gridprops = grid.get_disv_gridprops() + nlay = 1 + top = 1.0 + botm = [0.0] + disv = flopy.mf6.ModflowGwtdisv( + gwt, nlay=nlay, **disv_gridprops, top=top, botm=botm + ) + ic = flopy.mf6.ModflowGwtic(gwt, strt=0.0) + sto = flopy.mf6.ModflowGwtmst(gwt, porosity=0.2) + adv = flopy.mf6.ModflowGwtadv(gwt, scheme="TVD") + dsp = flopy.mf6.ModflowGwtdsp(gwt, alh=5.0, ath1=0.5) + sourcerecarray = [()] + ssm = flopy.mf6.ModflowGwtssm(gwt, sources=sourcerecarray) + cnclist = [ + [(0, cells2[0]), 1.0], + ] + cnc = flopy.mf6.ModflowGwtcnc( + gwt, maxbound=len(cnclist), stress_period_data=cnclist, pname="CNC-1" + ) + gwf_budget_file = gwf_ws / f"{gwf_name}.bud" + gwf_head_file = gwf_ws / f"{gwf_name}.hds" + flopy.mf6.ModflowGwtfmi( + gwt, + packagedata=[ + ("GWFHEAD", gwf_head_file), + ("GWFBUDGET", gwf_budget_file), + ], + ) + oc = flopy.mf6.ModflowGwtoc( + gwt, + budget_filerecord=f"{name}.cbc", + concentration_filerecord=f"{name}.ucn", + saverecord=[("CONCENTRATION", "ALL"), ("BUDGET", "ALL")], + ) + + return sim + + +def build_prt_sim(name, gwf_ws, prt_ws, targets): + prt_ws = Path(prt_ws) + gwf_name = get_model_name(name, "gwf") + prt_name = get_model_name(name, "prt") + + # create grid + grid = get_grid(prt_ws / "grid", targets) + gridprops = grid.get_gridprops_vertexgrid() + vgrid = VertexGrid(**gridprops, nlay=1) + ibd = np.zeros(vgrid.ncpl, dtype=int) + gi = GridIntersect(vgrid) + + # identify cells on left edge + line = LineString([(xmin, ymin), (xmin, ymax)]) + cells0 = gi.intersect(line)["cellids"] + cells0 = np.array(list(cells0)) + ibd[cells0] = 1 + + # identify cells on right edge + line = LineString([(xmax, ymin), (xmax, ymax)]) + cells1 = gi.intersect(line)["cellids"] + cells1 = np.array(list(cells1)) + ibd[cells1] = 2 + + # identify release cell + point = Point((500, 500)) + cells2 = gi.intersect(point)["cellids"] + cells2 = np.array(list(cells2)) + + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=name, version="mf6", exe_name=targets["mf6"], sim_ws=prt_ws + ) + tdis = flopy.mf6.ModflowTdis( + sim, time_units="DAYS", perioddata=[[1.0, 1, 1.0]] + ) + prt = flopy.mf6.ModflowPrt(sim, modelname=prt_name) + disv = flopy.mf6.ModflowGwfdisv( + prt, nlay=nlay, **grid.get_disv_gridprops(), top=top, botm=botm + ) + flopy.mf6.ModflowPrtmip(prt, pname="mip", porosity=porosity) + + sddata = flopy.modpath.CellDataType( + columncelldivisions=1, rowcelldivisions=1 + ) + data = flopy.modpath.NodeParticleData( + subdivisiondata=sddata, nodes=[cells2] + ) + prpdata = list(data.to_prp(prt.modelgrid)) + prp_track_file = f"{prt_name}.prp.trk" + prp_track_csv_file = f"{prt_name}.prp.trk.csv" + flopy.mf6.ModflowPrtprp( + prt, + pname="prp1", + filename=f"{prt_name}_1.prp", + nreleasepts=len(prpdata), + packagedata=prpdata, + perioddata={0: ["FIRST"]}, + track_filerecord=[prp_track_file], + trackcsv_filerecord=[prp_track_csv_file], + boundnames=True, + stop_at_weak_sink=True, # currently required for this problem + ) + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + ) + gwf_budget_file = gwf_ws / f"{gwf_name}.bud" + gwf_head_file = gwf_ws / f"{gwf_name}.hds" + flopy.mf6.ModflowPrtfmi( + prt, + packagedata=[ + ("GWFHEAD", gwf_head_file), + ("GWFBUDGET", gwf_budget_file), + ], + ) + ems = flopy.mf6.ModflowEms( + sim, + pname="ems", + filename=f"{prt_name}.ems", + ) + sim.register_solution_package(ems, [prt.name]) + return sim + + +def build_models(idx, test): + gwf_sim = build_gwf_sim(test.name, test.workspace, test.targets) + gwt_sim = build_gwt_sim( + test.name, test.workspace, test.workspace / "gwt", test.targets + ) + prt_sim = build_prt_sim( + test.name, test.workspace, test.workspace / "prt", test.targets + ) + return gwf_sim, gwt_sim, prt_sim + + +def check_output(idx, test): + name = test.name + prt_ws = test.workspace / "prt" + prt_name = get_model_name(name, "prt") + gwfsim, gwtsim, prtsim = test.sims + + # get gwf output + gwf = gwfsim.get_model() + head = gwf.output.head().get_data() + bdobj = gwf.output.budget() + spdis = bdobj.get_data(text="DATA-SPDIS")[0] + qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) + + # get gwt output + gwt = gwtsim.get_model() + conc = gwt.output.concentration().get_data() + + # get prt output + prt_track_csv_file = f"{prt_name}.prp.trk.csv" + pls = pd.read_csv(prt_ws / prt_track_csv_file, na_filter=False) + + plot_2d = False + if plot_2d: + # plot in 2d with mpl + fig = plt.figure(figsize=(16, 10)) + ax = plt.subplot(1, 1, 1, aspect="equal") + pmv = flopy.plot.PlotMapView(model=gwf, ax=ax) + pmv.plot_grid(alpha=0.25) + pmv.plot_ibound(alpha=0.5) + # headmesh = pmv.plot_array(head, alpha=0.25) + # headctr = pmv.contour_array(head, levels=np.linspace(0, 1, 9), colors="black") + # plt.clabel(headctr) + # plt.colorbar(headmesh, shrink=0.25, ax=ax, label="Head", location="right") + concmesh = pmv.plot_array(conc, cmap="jet") + concctr = pmv.contour_array( + conc, levels=(0.0001, 0.001, 0.01, 0.1), colors="y" + ) + plt.clabel(concctr) + plt.colorbar( + concmesh, + shrink=0.25, + ax=ax, + label="Concentration", + location="right", + ) + + handles = [ + mpl.lines.Line2D( + [0], + [0], + marker=">", + linestyle="", + label="Specific discharge", + color="grey", + markerfacecolor="gray", + ), + ] + ax.legend( + handles=handles, + loc="lower right", + ) + pmv.plot_vector(qx, qy, normalize=True, alpha=0.25) + mf6_plines = pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + title = "DISV voronoi grid particle tracks" + pl.plot( + title=title, + kind="line", + x="x", + y="y", + ax=ax, + legend=False, + color="black", + ) + plt.show() + plt.savefig(prt_ws / f"{name}.png") + + plot_3d = False + if plot_3d: + # plot in 3d with pyvista (via vtk) + import pyvista as pv + from flopy.export.vtk import Vtk + from flopy.plot.plotutil import to_mp7_pathlines + + def get_meshes(model, pathlines): + vtk = Vtk(model=model, binary=False, smooth=False) + vtk.add_model(model) + vtk.add_pathline_points( + to_mp7_pathlines(pathlines.to_records(index=False)) + ) + grid_mesh, path_mesh = vtk.to_pyvista() + grid_mesh.rotate_x(-100, point=axes.origin, inplace=True) + grid_mesh.rotate_z(90, point=axes.origin, inplace=True) + grid_mesh.rotate_y(120, point=axes.origin, inplace=True) + path_mesh.rotate_x(-100, point=axes.origin, inplace=True) + path_mesh.rotate_z(90, point=axes.origin, inplace=True) + path_mesh.rotate_y(120, point=axes.origin, inplace=True) + return grid_mesh, path_mesh + + def callback(mesh, value): + sub = pls[pls.t <= value] + gm, pm = get_meshes(gwf, sub) + mesh.shallow_copy(pm) + + pv.set_plot_theme("document") + axes = pv.Axes(show_actor=True, actor_scale=2.0, line_width=5) + p = pv.Plotter(notebook=False) + grid_mesh, path_mesh = get_meshes(gwf, pls) + p.add_mesh(grid_mesh, scalars=head[0], cmap="Blues", opacity=0.5) + p.add_mesh(path_mesh, label="Time", style="points", color="black") + p.camera.zoom(1) + p.add_slider_widget(lambda v: callback(path_mesh, v), [0, 30202]) + p.show() + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + compare=None, + ) + test.run() diff --git a/autotest/test_prt_weak_sinks.py b/autotest/test_prt_weak_sinks.py new file mode 100644 index 00000000000..6f420a40ce0 --- /dev/null +++ b/autotest/test_prt_weak_sinks.py @@ -0,0 +1,380 @@ +""" +GWF and PRT models run in separate simulations +via flow model interface. + +The grid is a 10x10 square with 2 layers, based +on the flow system provided in the FloPy readme. +There is a well near the middle of the grid in +the top layer, which pumps at a very low rate. +Two test cases are defined, one with particle +release package (PRP) option STOP_AT_WEAK_SINK +disabled and one with the option enabled. + +Particles are released from the top left cell. +With the STOP_AT_WEAK_SINK option enabled, the +well is expected to capture one particle. With +STOP_AT_WEAK_SINK disabled, the well no longer +captures the particle. + +Results are compared against a MODPATH 7 model, +using WeakSinkOption 1 (pass-through) when the +STOP_AT_WEAK_SINK option is disabled, and when +it is enabled using WeakSinkOption 2 (stop-at). +""" + +from pathlib import Path +from pprint import pformat + +import flopy +import matplotlib.cm as cm +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pytest +from flopy.plot.plotutil import to_mp7_pathlines +from flopy.utils import PathlineFile +from flopy.utils.binaryfile import HeadFile +from prt_test_utils import ( + FlopyReadmeCase, + check_budget_data, + check_track_data, + get_ireason_code, + get_model_name, +) + +from framework import TestFramework + +simname = "prtfmi04" +cases = [simname, f"{simname}saws"] + + +def build_prt_sim(name, gwf_ws, prt_ws, mf6): + # output files + gwfname = f"{name}_gwf" + prtname = f"{name}_prt" + gwf_budget_file = gwf_ws / f"{gwfname}.bud" + gwf_head_file = gwf_ws / f"{gwfname}.hds" + prt_track_file = prt_ws / f"{prtname}.trk" + prt_track_csv_file = prt_ws / f"{prtname}.trk.csv" + + # create simulation + sim = flopy.mf6.MFSimulation( + sim_name=name, + exe_name=mf6, + version="mf6", + sim_ws=prt_ws, + ) + + # create tdis package + pd = (FlopyReadmeCase.perlen, FlopyReadmeCase.nstp, FlopyReadmeCase.tsmult) + flopy.mf6.modflow.mftdis.ModflowTdis( + sim, + pname="tdis", + time_units="DAYS", + nper=FlopyReadmeCase.nper, + perioddata=[pd], + ) + + # create prt model + prt = flopy.mf6.ModflowPrt(sim, modelname=prtname) + + # create prt discretization + flopy.mf6.modflow.mfgwfdis.ModflowGwfdis( + prt, + pname="dis", + nlay=FlopyReadmeCase.nlay, + nrow=FlopyReadmeCase.nrow, + ncol=FlopyReadmeCase.ncol, + ) + + # create mip package + flopy.mf6.ModflowPrtmip( + prt, pname="mip", porosity=FlopyReadmeCase.porosity + ) + + # create prp package + flopy.mf6.ModflowPrtprp( + prt, + pname="prp1", + filename=f"{prtname}_1.prp", + nreleasepts=len(FlopyReadmeCase.releasepts_prt), + packagedata=FlopyReadmeCase.releasepts_prt, + perioddata={0: ["FIRST"]}, + stop_at_weak_sink="saws" in name, + ) + + # create output control package + flopy.mf6.ModflowPrtoc( + prt, + pname="oc", + track_filerecord=[prt_track_file], + trackcsv_filerecord=[prt_track_csv_file], + ) + + # create the flow model interface + flopy.mf6.ModflowPrtfmi( + prt, + packagedata=[ + ("GWFHEAD", gwf_head_file), + ("GWFBUDGET", gwf_budget_file), + ], + ) + + # add explicit model solution + ems = flopy.mf6.ModflowEms( + sim, + pname="ems", + filename=f"{prtname}.ems", + ) + sim.register_solution_package(ems, [prt.name]) + + return sim + + +def build_mp7_sim(name, ws, mp7, gwf): + mp7_name = f"{name}_mp7" + partdata = flopy.modpath.ParticleData( + partlocs=[p[0] for p in FlopyReadmeCase.releasepts_mp7], + localx=[p[1] for p in FlopyReadmeCase.releasepts_mp7], + localy=[p[2] for p in FlopyReadmeCase.releasepts_mp7], + localz=[p[3] for p in FlopyReadmeCase.releasepts_mp7], + timeoffset=0, + drape=0, + ) + pg = flopy.modpath.ParticleGroup( + particlegroupname="G1", + particledata=partdata, + filename=f"{mp7_name}.sloc", + ) + mp = flopy.modpath.Modpath7( + modelname=mp7_name, + flowmodel=gwf, + exe_name=mp7, + model_ws=ws, + headfilename=f"{gwf.name}.hds", + budgetfilename=f"{gwf.name}.bud", + ) + mpbas = flopy.modpath.Modpath7Bas( + mp, + porosity=FlopyReadmeCase.porosity, + ) + mpsim = flopy.modpath.Modpath7Sim( + mp, + simulationtype="pathline", + trackingdirection="forward", + budgetoutputoption="summary", + stoptimeoption="extend", + particlegroups=[pg], + weaksinkoption="stop_at" if "saws" in name else "pass_through", + ) + + return mp + + +def get_different_rows(source_df, new_df): + """Returns just the rows from the new dataframe that differ from the source dataframe""" + merged_df = source_df.merge(new_df, indicator=True, how="outer") + changed_rows_df = merged_df[merged_df["_merge"] == "right_only"] + return changed_rows_df.drop("_merge", axis=1) + + +def build_models(idx, test): + # build gwf model + gwf_sim = FlopyReadmeCase.get_gwf_sim( + test.name, test.workspace, test.targets["mf6"] + ) + # add wel package + gwf = gwf_sim.get_model() + wells = [ + # k, i, j, q + (0, 4, 4, -0.1), + ] + wel = flopy.mf6.ModflowGwfwel( + gwf, + maxbound=len(wells), + save_flows=True, + stress_period_data={0: wells, 1: wells}, + ) + + # build prt model + prt_sim = build_prt_sim( + test.name, test.workspace, test.workspace / "prt", test.targets["mf6"] + ) + + # build mp7 model + mp7_sim = build_mp7_sim( + test.name, test.workspace / "mp7", test.targets["mp7"], gwf + ) + return gwf_sim, prt_sim, mp7_sim + + +def check_output(idx, test): + name = test.name + gwf_ws = test.workspace + prt_ws = test.workspace / "prt" + mp7_ws = test.workspace / "mp7" + gwf_name = get_model_name(name, "gwf") + prt_name = get_model_name(name, "prt") + mp7_name = get_model_name(name, "mp7") + gwf_sim = test.sims[0] + gwf = gwf_sim.get_model(gwf_name) + mg = gwf.modelgrid + + # check mf6 output files exist + gwf_budget_file = f"{gwf_name}.bud" + gwf_head_file = f"{gwf_name}.hds" + prt_track_file = f"{prt_name}.trk" + prt_track_csv_file = f"{prt_name}.trk.csv" + mp7_pathline_file = f"{mp7_name}.mppth" + assert (gwf_ws / gwf_budget_file).is_file() + assert (gwf_ws / gwf_head_file).is_file() + assert (prt_ws / prt_track_file).is_file() + assert (prt_ws / prt_track_csv_file).is_file() + + # check mp7 output files exist + assert (mp7_ws / mp7_pathline_file).is_file() + + # load mp7 pathline results + plf = PathlineFile(mp7_ws / mp7_pathline_file) + mp7_pls = pd.DataFrame( + plf.get_destination_pathline_data(range(mg.nnodes), to_recarray=True) + ) + # convert zero-based to one-based indexing in mp7 results + mp7_pls["particlegroup"] = mp7_pls["particlegroup"] + 1 + mp7_pls["node"] = mp7_pls["node"] + 1 + mp7_pls["k"] = mp7_pls["k"] + 1 + + # load mf6 pathline results + mf6_pls = pd.read_csv(prt_ws / prt_track_csv_file) + + # if STOP_AT_WEAK_SINK disabled, check for an extra datum when particle exited weak sink + wksk_irsn = get_ireason_code("WEAKSINK") + assert len(mf6_pls[mf6_pls["ireason"] == wksk_irsn]) == ( + 1 if not "saws" in name else 0 + ) + # then drop the row so comparison will succeed below + mf6_pls.drop(mf6_pls[mf6_pls["ireason"] == wksk_irsn].index, inplace=True) + + # make sure all mf6 pathline data have correct model and PRP index (1) + def all_equal(col, val): + a = col.to_numpy() + return a[0] == val and (a[0] == a).all() + + assert all_equal(mf6_pls["imdl"], 1) + assert all_equal(mf6_pls["iprp"], 1) + + # check budget data were written to mf6 prt list file + check_budget_data( + prt_ws / f"{name}_prt.lst", + FlopyReadmeCase.perlen, + FlopyReadmeCase.nper, + ) + + # check mf6 prt particle track data were written to binary/CSV files + check_track_data( + track_bin=prt_ws / prt_track_file, + track_hdr=prt_ws / Path(prt_track_file.replace(".trk", ".trk.hdr")), + track_csv=prt_ws / prt_track_csv_file, + ) + + # extract head, budget, and specific discharge results from GWF model + hds = HeadFile(gwf_ws / gwf_head_file).get_data() + bud = gwf.output.budget() + spdis = bud.get_data(text="DATA-SPDIS")[0] + qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) + + # setup plot + fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) + for a in ax: + a.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(model=gwf, ax=ax[0]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + pmv.plot_bc("WEL") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title="MF6 pathlines", + kind="line", + x="x", + y="y", + ax=ax[0], + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) + + # plot mp7 pathlines in map view + pmv = flopy.plot.PlotMapView(model=gwf, ax=ax[1]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + pmv.plot_bc("WEL") + mp7_plines = mp7_pls.groupby(["particleid"]) + for ipl, (pid, pl) in enumerate(mp7_plines): + pl.plot( + title="MP7 pathlines", + kind="line", + x="x", + y="y", + ax=ax[1], + legend=False, + color=cm.plasma(ipl / len(mp7_plines)), + ) + + # plot cell centers + # xc, yc = mg.get_xcellcenters_for_layer(0), mg.get_ycellcenters_for_layer(0) + # xc = xc.flatten() + # yc = yc.flatten() + # for i in range(mg.ncpl): + # x, y = xc[i], yc[i] + # nn = mg.get_node(mg.intersect(x, y, 0))[0] + # for a in ax: + # a.plot(x, y, "ro") + # a.annotate(str(nn + 1), (x, y), color="r") + + # view/save plot + # plt.show() + plt.savefig(gwf_ws / f"test_{simname}.png") + + # convert mf6 pathlines to mp7 format + mf6_pls = to_mp7_pathlines(mf6_pls) + + # sort both dataframes by particleid and time + mf6_pls.sort_values(by=["particleid", "time"], inplace=True) + mp7_pls.sort_values(by=["particleid", "time"], inplace=True) + + # drop columns for which there is no direct correspondence between mf6 and mp7 + del mf6_pls["sequencenumber"] + del mf6_pls["particleidloc"] + del mf6_pls["xloc"] + del mf6_pls["yloc"] + del mf6_pls["zloc"] + del mp7_pls["sequencenumber"] + del mp7_pls["particleidloc"] + del mp7_pls["xloc"] + del mp7_pls["yloc"] + del mp7_pls["zloc"] + + # drop node number column because prt and mp7 disagree on a few + del mf6_pls["node"] + del mp7_pls["node"] + + # compare mf6 / mp7 pathline data + assert mf6_pls.shape == mp7_pls.shape + assert np.allclose(mf6_pls, mp7_pls, atol=1e-3) + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + compare=None, + ) + test.run() diff --git a/autotest/tester.f90 b/autotest/tester.f90 index ed297ef643c..1c9a92d5466 100644 --- a/autotest/tester.f90 +++ b/autotest/tester.f90 @@ -11,6 +11,7 @@ program tester use TestMathUtil, only: collect_mathutil use TestMessage, only: collect_message use TestSim, only: collect_sim + use TestTimeSelect, only: collect_timeselect implicit none integer :: stat, is character(len=:), allocatable :: suite_name, test_name @@ -27,7 +28,8 @@ program tester new_testsuite("List", collect_list), & new_testsuite("MathUtil", collect_mathutil), & new_testsuite("Message", collect_message), & - new_testsuite("Sim", collect_sim) & + new_testsuite("Sim", collect_sim), & + new_testsuite("TimeSelect", collect_timeselect) & ] call get_argument(1, suite_name) diff --git a/doc/mf6io/body.tex b/doc/mf6io/body.tex index 0c3f69808d1..1a48211159e 100644 --- a/doc/mf6io/body.tex +++ b/doc/mf6io/body.tex @@ -50,6 +50,11 @@ \SECTION{Groundwater Energy Transport (GWE) Model Input} \input{gwe/gwe.tex} +%PRT Model Input Instructions +\newpage +\SECTION{Particle Tracking (PRT) Model Input} +\input{prt/prt.tex} + %SWF Model Input Instructions \newpage \SECTION{Surface Water Flow (SWF) Model Input} diff --git a/doc/mf6io/mf6ivar/dfn/exg-gwfprt.dfn b/doc/mf6io/mf6ivar/dfn/exg-gwfprt.dfn new file mode 100644 index 00000000000..1008a718192 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/exg-gwfprt.dfn @@ -0,0 +1,3 @@ +# --------------------- exg gwfprt options --------------------- + + diff --git a/doc/mf6io/mf6ivar/dfn/prt-dis.dfn b/doc/mf6io/mf6ivar/dfn/prt-dis.dfn new file mode 100644 index 00000000000..c749650c064 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/prt-dis.dfn @@ -0,0 +1,122 @@ +# --------------------- prt dis options --------------------- + +block options +name length_units +type string +reader urword +optional true +longname model length units +description is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. + +block options +name nogrb +type keyword +reader urword +optional true +longname do not write binary grid file +description keyword to deactivate writing of the binary grid file. + +block options +name xorigin +type double precision +reader urword +optional true +longname x-position of the model grid origin +description x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name yorigin +type double precision +reader urword +optional true +longname y-position of the model grid origin +description y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name angrot +type double precision +reader urword +optional true +longname rotation angle +description counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + + +# --------------------- prt dis dimensions --------------------- + +block dimensions +name nlay +type integer +reader urword +optional false +longname number of layers +description is the number of layers in the model grid. +default_value 1 + +block dimensions +name nrow +type integer +reader urword +optional false +longname number of rows +description is the number of rows in the model grid. +default_value 2 + +block dimensions +name ncol +type integer +reader urword +optional false +longname number of columns +description is the number of columns in the model grid. +default_value 2 + +# --------------------- prt dis griddata --------------------- + +block griddata +name delr +type double precision +shape (ncol) +reader readarray +longname spacing along a row +description is the column spacing in the row direction. +default_value 1.0 + +block griddata +name delc +type double precision +shape (nrow) +reader readarray +longname spacing along a column +description is the row spacing in the column direction. +default_value 1.0 + +block griddata +name top +type double precision +shape (ncol, nrow) +reader readarray +longname cell top elevation +description is the top elevation for each cell in the top model layer. +default_value 1.0 + +block griddata +name botm +type double precision +shape (ncol, nrow, nlay) +reader readarray +layered true +longname cell bottom elevation +description is the bottom elevation for each cell. +default_value 0. + +block griddata +name idomain +type integer +shape (ncol, nrow, nlay) +reader readarray +layered true +optional true +longname idomain existence array +description is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. + + diff --git a/doc/mf6io/mf6ivar/dfn/prt-disv.dfn b/doc/mf6io/mf6ivar/dfn/prt-disv.dfn new file mode 100644 index 00000000000..8ff2a422132 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/prt-disv.dfn @@ -0,0 +1,204 @@ +# --------------------- prt disv options --------------------- + +block options +name length_units +type string +reader urword +optional true +longname model length units +description is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. + +block options +name nogrb +type keyword +reader urword +optional true +longname do not write binary grid file +description keyword to deactivate writing of the binary grid file. + +block options +name xorigin +type double precision +reader urword +optional true +longname x-position origin of the model grid coordinate system +description x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name yorigin +type double precision +reader urword +optional true +longname y-position origin of the model grid coordinate system +description y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name angrot +type double precision +reader urword +optional true +longname rotation angle +description counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +# --------------------- prt disv dimensions --------------------- + +block dimensions +name nlay +type integer +reader urword +optional false +longname number of layers +description is the number of layers in the model grid. + +block dimensions +name ncpl +type integer +reader urword +optional false +longname number of cells per layer +description is the number of cells per layer. This is a constant value for the grid and it applies to all layers. + +block dimensions +name nvert +type integer +reader urword +optional false +longname number of columns +description is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. + +# --------------------- prt disv griddata --------------------- + +block griddata +name top +type double precision +shape (ncpl) +reader readarray +longname model top elevation +description is the top elevation for each cell in the top model layer. + +block griddata +name botm +type double precision +shape (ncpl, nlay) +reader readarray +layered true +longname model bottom elevation +description is the bottom elevation for each cell. + +block griddata +name idomain +type integer +shape (ncpl, nlay) +reader readarray +layered true +optional true +longname idomain existence array +description is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. + + +# --------------------- prt disv vertices --------------------- + +block vertices +name vertices +type recarray iv xv yv +shape (nvert) +reader urword +optional false +longname vertices data +description + +block vertices +name iv +type integer +in_record true +tagged false +reader urword +optional false +longname vertex number +description is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. +numeric_index true + +block vertices +name xv +type double precision +in_record true +tagged false +reader urword +optional false +longname x-coordinate for vertex +description is the x-coordinate for the vertex. + +block vertices +name yv +type double precision +in_record true +tagged false +reader urword +optional false +longname y-coordinate for vertex +description is the y-coordinate for the vertex. + + +# --------------------- prt disv cell2d --------------------- + +block cell2d +name cell2d +type recarray icell2d xc yc ncvert icvert +shape (ncpl) +reader urword +optional false +longname cell2d data +description + +block cell2d +name icell2d +type integer +in_record true +tagged false +reader urword +optional false +longname cell2d number +description is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. +numeric_index true + +block cell2d +name xc +type double precision +in_record true +tagged false +reader urword +optional false +longname x-coordinate for cell center +description is the x-coordinate for the cell center. + +block cell2d +name yc +type double precision +in_record true +tagged false +reader urword +optional false +longname y-coordinate for cell center +description is the y-coordinate for the cell center. + +block cell2d +name ncvert +type integer +in_record true +tagged false +reader urword +optional false +longname number of cell vertices +description is the number of vertices required to define the cell. There may be a different number of vertices for each cell. + +block cell2d +name icvert +type integer +shape (ncvert) +in_record true +tagged false +reader urword +optional false +longname array of vertex numbers +description is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices. +numeric_index true diff --git a/doc/mf6io/mf6ivar/dfn/prt-fmi.dfn b/doc/mf6io/mf6ivar/dfn/prt-fmi.dfn new file mode 100644 index 00000000000..3deb36646fd --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/prt-fmi.dfn @@ -0,0 +1,50 @@ +# --------------------- prt fmi options --------------------- + +block options +name save_flows +type keyword +reader urword +optional true +longname save cell-by-cell flows to budget file +description REPLACE save_flows {'{#1}': 'FMI'} + +# --------------------- prt fmi packagedata --------------------- + +block packagedata +name packagedata +type recarray flowtype filein fname +reader urword +optional false +longname flowtype list +description + +block packagedata +name flowtype +in_record true +type string +tagged false +reader urword +longname flow type +description is the word GWFBUDGET or GWFHEAD. If GWFBUDGET is specified, then the corresponding file must be a budget file from a previous GWF Model run. + +block packagedata +name filein +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an input filename is expected next. + +block packagedata +name fname +in_record true +type string +preserve_case true +tagged false +reader urword +longname file name +description is the name of the file containing flows. The path to the file should be included if the file is not located in the folder where the program was run. + diff --git a/doc/mf6io/mf6ivar/dfn/prt-mip.dfn b/doc/mf6io/mf6ivar/dfn/prt-mip.dfn new file mode 100644 index 00000000000..34f0e6048a9 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/prt-mip.dfn @@ -0,0 +1,40 @@ +# --------------------- prt mip options --------------------- + +block options +name zero_method +type integer +reader urword +optional true +longname zero method +description the root finding algorithm to solve ternary subcells. 0 euler, 1 brent, 2 chandrupatla, 3 test. + +# --------------------- prt mip griddata --------------------- + +block griddata +name porosity +type double precision +shape (nodes) +reader readarray +layered true +longname porosity +description is the aquifer porosity. + +block griddata +name retfactor +type double precision +shape (nodes) +reader readarray +layered true +optional true +longname retardation factor +description is a real value by which velocity is divided within a given cell. RETFACTOR can be used to account for solute retardation, i.e., the apparent effect of linear sorption on the velocity of particles that track solute advection. RETFACTOR may be assigned any real value. A RETFACTOR value greater than 1 represents particle retardation (slowing), and a value of 1 represents no retardation. The effect of specifying a RETFACTOR value for each cell is the same as the effect of directly multiplying the POROSITY in each cell by the proposed RETFACTOR value for each cell. RETFACTOR allows conceptual isolation of effects such as retardation from the effect of porosity. The default value is 1. + +block griddata +name izone +type integer +shape (nodes) +reader readarray +layered true +optional true +longname zone number +description is an integer zone number assigned to each cell. IZONE may be positive, negative, or zero. The current cell's zone number is recorded with each particle track datum. If the ISTOPZONE option is set to any value other than zero in a PRP Package, particles released by that PRP Package terminate if they enter a cell whose IZONE value matches ISTOPZONE. If ISTOPZONE is not specified or is set to zero in a PRP Package, IZONE has no effect on the termination of particles released by that PRP Package. diff --git a/doc/mf6io/mf6ivar/dfn/prt-nam.dfn b/doc/mf6io/mf6ivar/dfn/prt-nam.dfn new file mode 100644 index 00000000000..e2c5e70e43e --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/prt-nam.dfn @@ -0,0 +1,73 @@ +# --------------------- prt nam options --------------------- + +block options +name list +type string +reader urword +optional true +longname name of listing file +description is name of the listing file to create for this PRT model. If not specified, then the name of the list file will be the basename of the PRT model name file and the '.lst' extension. For example, if the PRT name file is called ``my.model.nam'' then the list file will be called ``my.model.lst''. + +block options +name print_input +type keyword +reader urword +optional true +longname print input to listing file +description REPLACE print_input {'{#1}': 'all model stress package'} + +block options +name print_flows +type keyword +reader urword +optional true +longname print calculated flows to listing file +description REPLACE print_flows {'{#1}': 'all model package'} + +block options +name save_flows +type keyword +reader urword +optional true +longname save flows for all packages to budget file +description REPLACE save_flows {'{#1}': 'all model package'} + +# --------------------- prt nam packages --------------------- + +block packages +name packages +type recarray ftype fname pname +reader urword +optional false +longname package list +description + +block packages +name ftype +in_record true +type string +tagged false +reader urword +longname package type +description is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. + +block packages +name fname +in_record true +type string +preserve_case true +tagged false +reader urword +longname file name +description is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. + +block packages +name pname +in_record true +type string +tagged false +reader urword +optional true +longname user name for package +description is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single PRT Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. + diff --git a/doc/mf6io/mf6ivar/dfn/prt-oc.dfn b/doc/mf6io/mf6ivar/dfn/prt-oc.dfn new file mode 100644 index 00000000000..520afa1d9ce --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/prt-oc.dfn @@ -0,0 +1,497 @@ +# --------------------- prt oc options --------------------- + +block options +name budget_filerecord +type record budget fileout budgetfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name budget +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname budget keyword +description keyword to specify that record corresponds to the budget. + +block options +name fileout +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an output filename is expected next. + +block options +name budgetfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the output file to write budget information. + +block options +name budgetcsv_filerecord +type record budgetcsv fileout budgetcsvfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name budgetcsv +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname budget keyword +description keyword to specify that record corresponds to the budget CSV. + +block options +name budgetcsvfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. + +block options +name concentration_filerecord +type record concentration fileout concentrationfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name concentration +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname concentration keyword +description keyword to specify that record corresponds to concentration. + +block options +name concentrationfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the output file to write conc information. + +block options +name concentrationprintrecord +type record concentration print_format formatrecord +shape +reader urword +optional true +longname +description + +block options +name print_format +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname keyword to indicate that a print format follows +description keyword to specify format for printing to the listing file. + +block options +name formatrecord +type record columns width digits format +shape +in_record true +reader urword +tagged +optional false +longname +description + +block options +name columns +type integer +shape +in_record true +reader urword +tagged true +optional +longname number of columns +description number of columns for writing data. + +block options +name width +type integer +shape +in_record true +reader urword +tagged true +optional +longname width for each number +description width for writing each number. + +block options +name digits +type integer +shape +in_record true +reader urword +tagged true +optional +longname number of digits +description number of digits to use for writing a number. + +block options +name format +type string +shape +in_record true +reader urword +tagged false +optional false +longname write format +description write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + +block options +name track_filerecord +type record track fileout trackfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name track +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname track keyword +description keyword to specify that record corresponds to pathlines. + +block options +name trackfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the output file to write tracking information. + +block options +name trackcsv_filerecord +type record trackcsv fileout trackcsvfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name trackcsv +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname track keyword +description keyword to specify that record corresponds to the track CSV. + +block options +name trackcsvfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the comma-separated value (CSV) file to write tracking information. + +block options +name track_all +type keyword +reader urword +optional true +longname track all events +description whether to track all particle events + +block options +name track_release +type keyword +reader urword +optional true +longname track release +description whether to track particle release events + +block options +name track_transit +type keyword +reader urword +optional true +longname track transitions +description whether to track cell-to-cell transitions + +block options +name track_timestep +type keyword +reader urword +optional true +longname track timestep ends +description whether to track transitions between timesteps + +block options +name track_terminate +type keyword +reader urword +optional true +longname track termination +description whether to track particle termination events + +block options +name track_weaksink +type keyword +reader urword +optional true +longname track weaksink exits +description whether to track occasions when a particle exits a weak sink (a cell which removes some but not all inflow from adjacent cells) + +block options +name track_usertime +type keyword +reader urword +optional true +longname track termination +description whether to track user-specified times, provided as double precision values to the TRACK\_TIMES or TRACK\_TIMESFILE options + +block options +name track_timesrecord +type record track_times times +shape +reader urword +tagged true +optional true +longname +description + +block options +name track_times +type keyword +reader urword +in_record true +tagged true +shape +longname +description keyword indicating tracking times will follow + +block options +name times +type double precision +shape (unknown) +reader urword +in_record true +tagged false +repeating true +longname tracking times +description times to track, relative to the beginning of the simulation. + +block options +name track_timesfilerecord +type record track_timesfile timesfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name track_timesfile +type keyword +reader urword +in_record true +tagged true +shape +longname +description keyword indicating tracking times file name will follow + +block options +name timesfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the tracking times file + +# --------------------- prt oc period --------------------- + +block period +name iper +type integer +block_variable True +in_record true +tagged false +shape +valid +reader urword +optional false +longname stress period number +description REPLACE iper {} + +block period +name saverecord +type record save rtype ocsetting +shape +reader urword +tagged false +optional true +longname +description + +block period +name save +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname keyword to save +description keyword to indicate that information will be saved this stress period. + +block period +name printrecord +type record print rtype ocsetting +shape +reader urword +tagged false +optional true +longname +description + +block period +name print +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname keyword to save +description keyword to indicate that information will be printed this stress period. + +block period +name rtype +type string +shape +in_record true +reader urword +tagged false +optional false +longname record type +description type of information to save or print. Can be BUDGET or CONCENTRATION. + +block period +name ocsetting +type keystring all first last frequency steps +shape +tagged false +in_record true +reader urword +longname +description specifies the steps for which the data will be saved. + +block period +name all +type keyword +shape +in_record true +reader urword +longname +description keyword to indicate save for all time steps in period. + +block period +name first +type keyword +shape +in_record true +reader urword +longname +description keyword to indicate save for first step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +block period +name last +type keyword +shape +in_record true +reader urword +longname +description keyword to indicate save for last step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +block period +name frequency +type integer +shape +tagged true +in_record true +reader urword +longname +description save at the specified time step frequency. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +block period +name steps +type integer +shape ( + NROW + NCOL +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/prt-dis-griddata.dat b/doc/mf6io/mf6ivar/tex/prt-dis-griddata.dat new file mode 100644 index 00000000000..daae94c0ee3 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-dis-griddata.dat @@ -0,0 +1,12 @@ +BEGIN GRIDDATA + DELR + -- READARRAY + DELC + -- READARRAY + TOP + -- READARRAY + BOTM [LAYERED] + -- READARRAY + [IDOMAIN [LAYERED] + -- READARRAY] +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/prt-dis-options.dat b/doc/mf6io/mf6ivar/tex/prt-dis-options.dat new file mode 100644 index 00000000000..67e3ed895ae --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-dis-options.dat @@ -0,0 +1,7 @@ +BEGIN OPTIONS + [LENGTH_UNITS ] + [NOGRB] + [XORIGIN ] + [YORIGIN ] + [ANGROT ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/prt-disv-cell2d.dat b/doc/mf6io/mf6ivar/tex/prt-disv-cell2d.dat new file mode 100644 index 00000000000..27900d67235 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-disv-cell2d.dat @@ -0,0 +1,5 @@ +BEGIN CELL2D + + + ... +END CELL2D diff --git a/doc/mf6io/mf6ivar/tex/prt-disv-desc.tex b/doc/mf6io/mf6ivar/tex/prt-disv-desc.tex new file mode 100644 index 00000000000..dac7917328f --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-disv-desc.tex @@ -0,0 +1,61 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{length\_units}---is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. + +\item \texttt{NOGRB}---keyword to deactivate writing of the binary grid file. + +\item \texttt{xorigin}---x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\item \texttt{yorigin}---y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{nlay}---is the number of layers in the model grid. + +\item \texttt{ncpl}---is the number of cells per layer. This is a constant value for the grid and it applies to all layers. + +\item \texttt{nvert}---is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. + +\end{description} +\item \textbf{Block: GRIDDATA} + +\begin{description} +\item \texttt{top}---is the top elevation for each cell in the top model layer. + +\item \texttt{botm}---is the bottom elevation for each cell. + +\item \texttt{idomain}---is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. + +\end{description} +\item \textbf{Block: VERTICES} + +\begin{description} +\item \texttt{iv}---is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. + +\item \texttt{xv}---is the x-coordinate for the vertex. + +\item \texttt{yv}---is the y-coordinate for the vertex. + +\end{description} +\item \textbf{Block: CELL2D} + +\begin{description} +\item \texttt{icell2d}---is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. + +\item \texttt{xc}---is the x-coordinate for the cell center. + +\item \texttt{yc}---is the y-coordinate for the cell center. + +\item \texttt{ncvert}---is the number of vertices required to define the cell. There may be a different number of vertices for each cell. + +\item \texttt{icvert}---is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/prt-disv-dimensions.dat b/doc/mf6io/mf6ivar/tex/prt-disv-dimensions.dat new file mode 100644 index 00000000000..b05791a77b3 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-disv-dimensions.dat @@ -0,0 +1,5 @@ +BEGIN DIMENSIONS + NLAY + NCPL + NVERT +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/prt-disv-griddata.dat b/doc/mf6io/mf6ivar/tex/prt-disv-griddata.dat new file mode 100644 index 00000000000..e263cb1d7bb --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-disv-griddata.dat @@ -0,0 +1,8 @@ +BEGIN GRIDDATA + TOP + -- READARRAY + BOTM [LAYERED] + -- READARRAY + [IDOMAIN [LAYERED] + -- READARRAY] +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/prt-disv-options.dat b/doc/mf6io/mf6ivar/tex/prt-disv-options.dat new file mode 100644 index 00000000000..67e3ed895ae --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-disv-options.dat @@ -0,0 +1,7 @@ +BEGIN OPTIONS + [LENGTH_UNITS ] + [NOGRB] + [XORIGIN ] + [YORIGIN ] + [ANGROT ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/prt-disv-vertices.dat b/doc/mf6io/mf6ivar/tex/prt-disv-vertices.dat new file mode 100644 index 00000000000..6831f23b5ff --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-disv-vertices.dat @@ -0,0 +1,5 @@ +BEGIN VERTICES + + + ... +END VERTICES diff --git a/doc/mf6io/mf6ivar/tex/prt-fmi-desc.tex b/doc/mf6io/mf6ivar/tex/prt-fmi-desc.tex new file mode 100644 index 00000000000..f1370146b38 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-fmi-desc.tex @@ -0,0 +1,19 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{SAVE\_FLOWS}---keyword to indicate that FMI flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\end{description} +\item \textbf{Block: PACKAGEDATA} + +\begin{description} +\item \texttt{flowtype}---is the word GWFBUDGET or GWFHEAD. If GWFBUDGET is specified, then the corresponding file must be a budget file from a previous GWF Model run. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{fname}---is the name of the file containing flows. The path to the file should be included if the file is not located in the folder where the program was run. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/prt-fmi-options.dat b/doc/mf6io/mf6ivar/tex/prt-fmi-options.dat new file mode 100644 index 00000000000..f8518b490f4 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-fmi-options.dat @@ -0,0 +1,3 @@ +BEGIN OPTIONS + [SAVE_FLOWS] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/prt-fmi-packagedata.dat b/doc/mf6io/mf6ivar/tex/prt-fmi-packagedata.dat new file mode 100644 index 00000000000..85d840ad9ef --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-fmi-packagedata.dat @@ -0,0 +1,5 @@ +BEGIN PACKAGEDATA + FILEIN + FILEIN + ... +END PACKAGEDATA diff --git a/doc/mf6io/mf6ivar/tex/prt-mip-desc.tex b/doc/mf6io/mf6ivar/tex/prt-mip-desc.tex new file mode 100644 index 00000000000..ce3aa30f51a --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-mip-desc.tex @@ -0,0 +1,19 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{zero\_method}---the root finding algorithm to solve ternary subcells. 0 euler, 1 brent, 2 chandrupatla, 3 test. + +\end{description} +\item \textbf{Block: GRIDDATA} + +\begin{description} +\item \texttt{porosity}---is the aquifer porosity. + +\item \texttt{retfactor}---is a real value by which velocity is divided within a given cell. RETFACTOR can be used to account for solute retardation, i.e., the apparent effect of linear sorption on the velocity of particles that track solute advection. RETFACTOR may be assigned any real value. A RETFACTOR value greater than 1 represents particle retardation (slowing), and a value of 1 represents no retardation. The effect of specifying a RETFACTOR value for each cell is the same as the effect of directly multiplying the POROSITY in each cell by the proposed RETFACTOR value for each cell. RETFACTOR allows conceptual isolation of effects such as retardation from the effect of porosity. The default value is 1. + +\item \texttt{izone}---is an integer zone number assigned to each cell. IZONE may be positive, negative, or zero. The current cell's zone number is recorded with each particle track datum. If the ISTOPZONE option is set to any value other than zero in a PRP Package, particles released by that PRP Package terminate if they enter a cell whose IZONE value matches ISTOPZONE. If ISTOPZONE is not specified or is set to zero in a PRP Package, IZONE has no effect on the termination of particles released by that PRP Package. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/prt-mip-griddata.dat b/doc/mf6io/mf6ivar/tex/prt-mip-griddata.dat new file mode 100644 index 00000000000..5777ce9e6b8 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-mip-griddata.dat @@ -0,0 +1,8 @@ +BEGIN GRIDDATA + POROSITY [LAYERED] + -- READARRAY + [RETFACTOR [LAYERED] + -- READARRAY] + [IZONE [LAYERED] + -- READARRAY] +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/prt-mip-options.dat b/doc/mf6io/mf6ivar/tex/prt-mip-options.dat new file mode 100644 index 00000000000..daa82b4bb0a --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-mip-options.dat @@ -0,0 +1,3 @@ +BEGIN OPTIONS + [ZERO_METHOD ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/prt-nam-desc.tex b/doc/mf6io/mf6ivar/tex/prt-nam-desc.tex new file mode 100644 index 00000000000..6c7d8fd876e --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-nam-desc.tex @@ -0,0 +1,25 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{list}---is name of the listing file to create for this PRT model. If not specified, then the name of the list file will be the basename of the PRT model name file and the '.lst' extension. For example, if the PRT name file is called ``my.model.nam'' then the list file will be called ``my.model.lst''. + +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of all model stress package information will be written to the listing file immediately after it is read. + +\item \texttt{PRINT\_FLOWS}---keyword to indicate that the list of all model package flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that all model package flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\end{description} +\item \textbf{Block: PACKAGES} + +\begin{description} +\item \texttt{ftype}---is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. + +\item \texttt{fname}---is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. + +\item \texttt{pname}---is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single PRT Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/prt-nam-options.dat b/doc/mf6io/mf6ivar/tex/prt-nam-options.dat new file mode 100644 index 00000000000..a65ebd5e24d --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-nam-options.dat @@ -0,0 +1,6 @@ +BEGIN OPTIONS + [LIST ] + [PRINT_INPUT] + [PRINT_FLOWS] + [SAVE_FLOWS] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/prt-nam-packages.dat b/doc/mf6io/mf6ivar/tex/prt-nam-packages.dat new file mode 100644 index 00000000000..ee5dc814ee7 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-nam-packages.dat @@ -0,0 +1,5 @@ +BEGIN PACKAGES + [] + [] + ... +END PACKAGES diff --git a/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex b/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex new file mode 100644 index 00000000000..c502d09ca55 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex @@ -0,0 +1,93 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{BUDGET}---keyword to specify that record corresponds to the budget. + +\item \texttt{FILEOUT}---keyword to specify that an output filename is expected next. + +\item \texttt{budgetfile}---name of the output file to write budget information. + +\item \texttt{BUDGETCSV}---keyword to specify that record corresponds to the budget CSV. + +\item \texttt{budgetcsvfile}---name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. + +\item \texttt{CONCENTRATION}---keyword to specify that record corresponds to concentration. + +\item \texttt{concentrationfile}---name of the output file to write conc information. + +\item \texttt{PRINT\_FORMAT}---keyword to specify format for printing to the listing file. + +\item \texttt{columns}---number of columns for writing data. + +\item \texttt{width}---width for writing each number. + +\item \texttt{digits}---number of digits to use for writing a number. + +\item \texttt{format}---write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + +\item \texttt{TRACK}---keyword to specify that record corresponds to pathlines. + +\item \texttt{trackfile}---name of the output file to write tracking information. + +\item \texttt{TRACKCSV}---keyword to specify that record corresponds to the track CSV. + +\item \texttt{trackcsvfile}---name of the comma-separated value (CSV) file to write tracking information. + +\item \texttt{TRACK\_ALL}---whether to track all particle events + +\item \texttt{TRACK\_RELEASE}---whether to track particle release events + +\item \texttt{TRACK\_TRANSIT}---whether to track cell-to-cell transitions + +\item \texttt{TRACK\_TIMESTEP}---whether to track transitions between timesteps + +\item \texttt{TRACK\_TERMINATE}---whether to track particle termination events + +\item \texttt{TRACK\_WEAKSINK}---whether to track occasions when a particle exits a weak sink (a cell which removes some but not all inflow from adjacent cells) + +\item \texttt{TRACK\_USERTIME}---whether to track user-specified times, provided as double precision values to the TRACK\_TIMES or TRACK\_TIMESFILE options + +\item \texttt{TRACK\_TIMES}---keyword indicating tracking times will follow + +\item \texttt{times}---times to track, relative to the beginning of the simulation. + +\item \texttt{TRACK\_TIMESFILE}---keyword indicating tracking times file name will follow + +\item \texttt{timesfile}---name of the tracking times file + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. + +\item \texttt{SAVE}---keyword to indicate that information will be saved this stress period. + +\item \texttt{PRINT}---keyword to indicate that information will be printed this stress period. + +\item \texttt{rtype}---type of information to save or print. Can be BUDGET or CONCENTRATION. + +\item \texttt{ocsetting}---specifies the steps for which the data will be saved. + +\begin{lstlisting}[style=blockdefinition] +ALL +FIRST +LAST +FREQUENCY +STEPS +\end{lstlisting} + +\item \texttt{ALL}---keyword to indicate save for all time steps in period. + +\item \texttt{FIRST}---keyword to indicate save for first step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +\item \texttt{LAST}---keyword to indicate save for last step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +\item \texttt{frequency}---save at the specified time step frequency. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +\item \texttt{steps}---save for each step specified in STEPS. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/prt-oc-options.dat b/doc/mf6io/mf6ivar/tex/prt-oc-options.dat new file mode 100644 index 00000000000..cdb0c5dee6e --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-oc-options.dat @@ -0,0 +1,17 @@ +BEGIN OPTIONS + [BUDGET FILEOUT ] + [BUDGETCSV FILEOUT ] + [CONCENTRATION FILEOUT ] + [CONCENTRATION PRINT_FORMAT COLUMNS WIDTH DIGITS ] + [TRACK FILEOUT ] + [TRACKCSV FILEOUT ] + [TRACK_ALL] + [TRACK_RELEASE] + [TRACK_TRANSIT] + [TRACK_TIMESTEP] + [TRACK_TERMINATE] + [TRACK_WEAKSINK] + [TRACK_USERTIME] + [TRACK_TIMES ] + [TRACK_TIMESFILE ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/prt-oc-period.dat b/doc/mf6io/mf6ivar/tex/prt-oc-period.dat new file mode 100644 index 00000000000..abcceee3794 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-oc-period.dat @@ -0,0 +1,4 @@ +BEGIN PERIOD + [SAVE ] + [PRINT ] +END PERIOD diff --git a/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex b/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex new file mode 100644 index 00000000000..5c8f0eb2967 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex @@ -0,0 +1,85 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of release-point cells. + +\item \texttt{TRACK}---keyword to specify that record corresponds to track. + +\item \texttt{FILEOUT}---keyword to specify that an output filename is expected next. + +\item \texttt{trackfile}---name of the output file to write tracking information. + +\item \texttt{TRACKCSV}---keyword to specify that record corresponds to the track CSV. + +\item \texttt{trackcsvfile}---name of the comma-separated value (CSV) file to write tracking information. + +\item \texttt{stoptime}---real value defining the maximum simulation time to which particles in the model can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when simulation time STOPTIME is reached. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the simulation time to which particles can be tracked. + +\item \texttt{stoptraveltime}---real value defining the maximum travel time over which particles in the model can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when their travel time reaches STOPTRAVELTIME. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTRAVELTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the travel time over which particles can be tracked. + +\item \texttt{STOP\_AT\_WEAK\_SINK}---is a text keyword to indicate that a particle is to terminate when it enters a cell that is a weak sink. By default, particles are allowed to pass though cells that are weak sinks. + +\item \texttt{istopzone}---integer value defining the stop zone number. If cells have been assigned IZONE values in the GRIDDATA block, a particle terminates if it enters a cell whose IZONE value matches ISTOPZONE. An ISTOPZONE value of zero indicates that there is no stop zone. The default value is zero. + +\item \texttt{DRAPE}---is a text keyword to indicate that if a particle's release point is in a cell that happens to be dry at release time, the particle is to be moved to the topmost active cell below it, if any. By default, a particle is not released into the simulation if its release point's cell is dry at release time, instead the particle is terminated immediately with ireason 3 and istatus 8. + +\item \texttt{RELEASE\_TIMES}---keyword indicating release times will follow + +\item \texttt{times}---times to release, relative to the beginning of the simulation. + +\item \texttt{RELEASE\_TIMESFILE}---keyword indicating release times file name will follow + +\item \texttt{timesfile}---name of the release times file + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{nreleasepts}---is the number of particle release points. + +\end{description} +\item \textbf{Block: PACKAGEDATA} + +\begin{description} +\item \texttt{irptno}---integer value that defines the PRP release point number associated with the specified PACKAGEDATA data on the line. IRPTNO must be greater than zero and less than or equal to NRELEASEPTS. The program will terminate with an error if information for a PRP release point number is specified more than once. + +\item \texttt{cellid}---is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. + +\item \texttt{xrpt}---real value that defines the x coordinate of the release point in model coordinates. The (x, y, z) location specified for the release point must lie within the cell that corresponds to the specified cellid. + +\item \texttt{yrpt}---real value that defines the y coordinate of the release point in model coordinates. The (x, y, z) location specified for the release point must lie within the cell that corresponds to the specified cellid. + +\item \texttt{zrpt}---real value that defines the z coordinate of the release point in model coordinates. The (x, y, z) location specified for the release point must lie within the cell that corresponds to the specified cellid. + +\item \texttt{boundname}---name of the release-point cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block applies only to that stress period. + +\item \texttt{releasesetting}---specifies when to release particles within the stress period. Overrides package-level RELEASETIME option, which applies to all stress periods. By default, RELEASESETTING configures particles for release at the beginning of the specified time steps. For time-offset releases, provide a FRACTION value. + +\begin{lstlisting}[style=blockdefinition] +ALL +FIRST +FREQUENCY +STEPS +[FRACTION ] +\end{lstlisting} + +\item \texttt{ALL}---keyword to indicate release of particles at the start of all time steps in the period. + +\item \texttt{FIRST}---keyword to indicate release of particles at the start of the first time step in the period. This keyword may be used in conjunction with other keywords to release particles at the start of multiple time steps. + +\item \texttt{frequency}---release particles at the specified time step frequency. This keyword may be used in conjunction with other keywords to release particles at the start of multiple time steps. + +\item \texttt{steps}---release particles at the start of each step specified in STEPS. This keyword may be used in conjunction with other keywords to release particles at the start of multiple time steps. + +\item \texttt{fraction}---release particles after the specified fraction of the time step has elapsed. If FRACTION is not set, particles are released at the start of the specified time step(s). FRACTION must be a single value when used with ALL, FIRST, or FREQUENCY. When used with STEPS, FRACTION may be a single value or an array of the same length as STEPS. If a single FRACTION value is provided with STEPS, the fraction applies to all steps. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/prt-prp-dimensions.dat b/doc/mf6io/mf6ivar/tex/prt-prp-dimensions.dat new file mode 100644 index 00000000000..bbbac31a118 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-prp-dimensions.dat @@ -0,0 +1,3 @@ +BEGIN DIMENSIONS + NRELEASEPTS +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/prt-prp-options.dat b/doc/mf6io/mf6ivar/tex/prt-prp-options.dat new file mode 100644 index 00000000000..fb08e4b0068 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-prp-options.dat @@ -0,0 +1,12 @@ +BEGIN OPTIONS + [BOUNDNAMES] + [TRACK FILEOUT ] + [TRACKCSV FILEOUT ] + [STOPTIME ] + [STOPTRAVELTIME ] + [STOP_AT_WEAK_SINK] + [ISTOPZONE ] + [DRAPE] + [RELEASE_TIMES ] + [RELEASE_TIMESFILE ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/prt-prp-packagedata.dat b/doc/mf6io/mf6ivar/tex/prt-prp-packagedata.dat new file mode 100644 index 00000000000..070166487df --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-prp-packagedata.dat @@ -0,0 +1,5 @@ +BEGIN PACKAGEDATA + [] + [] + ... +END PACKAGEDATA diff --git a/doc/mf6io/mf6ivar/tex/prt-prp-period.dat b/doc/mf6io/mf6ivar/tex/prt-prp-period.dat new file mode 100644 index 00000000000..d183680202b --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/prt-prp-period.dat @@ -0,0 +1,5 @@ +BEGIN PERIOD + + + ... +END PERIOD diff --git a/doc/mf6io/mf6ivar/tex/sln-pts-desc.tex b/doc/mf6io/mf6ivar/tex/sln-pts-desc.tex new file mode 100644 index 00000000000..d4008f5fae5 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/sln-pts-desc.tex @@ -0,0 +1,33 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{print\_option}---is a flag that controls printing of convergence information from the solver. NONE means print nothing. SUMMARY means print only the total number of iterations and nonlinear residual reduction summaries. ALL means print linear matrix solver convergence information to the solution listing file and model specific linear matrix solver convergence information to each model listing file in addition to SUMMARY information. NONE is default if PRINT\_OPTION is not specified. + +\item \texttt{complexity}---is an optional keyword that defines default non-linear and linear solver parameters. SIMPLE - indicates that default solver input values will be defined that work well for nearly linear models. This would be used for models that do not include nonlinear stress packages and models that are either confined or consist of a single unconfined layer that is thick enough to contain the water table within a single layer. MODERATE - indicates that default solver input values will be defined that work well for moderately nonlinear models. This would be used for models that include nonlinear stress packages and models that consist of one or more unconfined layers. The MODERATE option should be used when the SIMPLE option does not result in successful convergence. COMPLEX - indicates that default solver input values will be defined that work well for highly nonlinear models. This would be used for models that include nonlinear stress packages and models that consist of one or more unconfined layers representing complex geology and surface-water/groundwater interaction. The COMPLEX option should be used when the MODERATE option does not result in successful convergence. Non-linear and linear solver parameters assigned using a specified complexity can be modified in the NONLINEAR and LINEAR blocks. If the COMPLEXITY option is not specified, NONLINEAR and LINEAR variables will be assigned the simple complexity values. + +\item \texttt{CSV\_OUTER\_OUTPUT}---keyword to specify that the record corresponds to the comma separated values outer iteration convergence output. + +\item \texttt{FILEOUT}---keyword to specify that an output filename is expected next. + +\item \texttt{outer\_csvfile}---name of the ascii comma separated values output file to write maximum dependent-variable (for example, head) change convergence information at the end of each outer iteration for each time step. + +\item \texttt{CSV\_INNER\_OUTPUT}---keyword to specify that the record corresponds to the comma separated values solver convergence output. + +\item \texttt{inner\_csvfile}---name of the ascii comma separated values output file to write solver convergence information. Comma separated values output includes maximum dependent-variable (for example, head) change and maximum residual convergence information for the solution and each model (if the solution includes more than one model) and linear acceleration information for each inner iteration. + +\item \texttt{NO\_PTC}---is a flag that is used to disable pseudo-transient continuation (PTC). Option only applies to steady-state stress periods for models using the Newton-Raphson formulation. For many problems, PTC can significantly improve convergence behavior for steady-state simulations, and for this reason it is active by default. In some cases, however, PTC can worsen the convergence behavior, especially when the initial conditions are similar to the solution. When the initial conditions are similar to, or exactly the same as, the solution and convergence is slow, then the NO\_PTC FIRST option should be used to deactivate PTC for the first stress period. The NO\_PTC ALL option should also be used in order to compare convergence behavior with other MODFLOW versions, as PTC is only available in MODFLOW 6. + +\item \texttt{no\_ptc\_option}---is an optional keyword that is used to define options for disabling pseudo-transient continuation (PTC). FIRST is an optional keyword to disable PTC for the first stress period, if steady-state and one or more model is using the Newton-Raphson formulation. ALL is an optional keyword to disable PTC for all steady-state stress periods for models using the Newton-Raphson formulation. If NO\_PTC\_OPTION is not specified, the NO\_PTC ALL option is used. + +\item \texttt{ats\_outer\_maximum\_fraction}---real value defining the fraction of the maximum allowable outer iterations used with the Adaptive Time Step (ATS) capability if it is active. If this value is set to zero by the user, then this solution will have no effect on ATS behavior. This value must be greater than or equal to zero and less than or equal to 0.5 or the program will terminate with an error. If it is not specified by the user, then it is assigned a default value of one third. When the number of outer iterations for this solution is less than the product of this value and the maximum allowable outer iterations, then ATS will increase the time step length by a factor of DTADJ in the ATS input file. When the number of outer iterations for this solution is greater than the maximum allowable outer iterations minus the product of this value and the maximum allowable outer iterations, then the ATS (if active) will decrease the time step length by a factor of 1 / DTADJ. + +\end{description} +\item \textbf{Block: NONLINEAR} + +\begin{description} +\item \texttt{outer\_maximum}---integer value defining the maximum number of outer (nonlinear) iterations -- that is, calls to the solution routine. For a linear problem OUTER\_MAXIMUM should be 1. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/sln-pts-nonlinear.dat b/doc/mf6io/mf6ivar/tex/sln-pts-nonlinear.dat new file mode 100644 index 00000000000..26678c67d08 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/sln-pts-nonlinear.dat @@ -0,0 +1,3 @@ +BEGIN NONLINEAR + OUTER_MAXIMUM +END NONLINEAR diff --git a/doc/mf6io/mf6ivar/tex/sln-pts-options.dat b/doc/mf6io/mf6ivar/tex/sln-pts-options.dat new file mode 100644 index 00000000000..ebcef48473f --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/sln-pts-options.dat @@ -0,0 +1,8 @@ +BEGIN OPTIONS + [PRINT_OPTION ] + [COMPLEXITY ] + [CSV_OUTER_OUTPUT FILEOUT ] + [CSV_INNER_OUTPUT FILEOUT ] + [NO_PTC []] + [ATS_OUTER_MAXIMUM_FRACTION ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex b/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex index 37aad56efcf..103a93ea34f 100644 --- a/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex @@ -3,7 +3,7 @@ \item \textbf{Block: OPTIONS} \begin{description} -\item \texttt{CENTRAL\_IN\_SPACE}---keyword to indicate conductance should be calculated using central-in-space weighting instead of the default upstream weighting approach. +\item \texttt{CENTRAL\_IN\_SPACE}---keyword to indicate conductance should be calculated using central-in-space weighting instead of the default upstream weighting approach. This option should be used with caution as it does not work well unless all of the stream reaches are saturated. With this option, there is no way for water to flow into a dry reach from connected reaches. \item \texttt{length\_conversion}---real value that is used to convert user-specified Manning's roughness coefficients from meters to model length units. LENGTH\_CONVERSION should be set to 3.28081, 1.0, and 100.0 when using length units (LENGTH\_UNITS) of feet, meters, or centimeters in the simulation, respectively. LENGTH\_CONVERSION does not need to be specified if LENGTH\_UNITS are meters. diff --git a/doc/mf6io/prt/fmi.tex b/doc/mf6io/prt/fmi.tex new file mode 100644 index 00000000000..b67883629e2 --- /dev/null +++ b/doc/mf6io/prt/fmi.tex @@ -0,0 +1,50 @@ +Flow Model Interface (FMI) Package information is read from the file that is specified by ``FMI6'' as the file type. The FMI Package is required, and only one FMI Package can be specified for a PRT model. + +For most simulations, the PRT Model needs groundwater flows for every cell in the model grid, for all boundary conditions, and for other terms, such as the flow of water in or out of storage. The FMI Package is the interface between the PRT Model and simulated groundwater flows provided by a corresponding GWF Model that is running concurrently within the simulation or from binary budget files that were created from a previous GWF model run. The following are several different FMI simulation cases: + +\begin{itemize} + +\item Flows are provided by a corresponding GWF Model running in the same simulation---in this case, all groundwater flows are calculated by the corresponding GWF Model and provided through FMI to the transport model. This is a common use case in which the user wants to run the flow and particle-tracking models as part of a single simulation. The GWF and PRT models must be part of a GWF-PRT Exchange that is listed in mfsim.nam. If a GWF-PRT Exchange is specified by the user, then the user does not need to specify an FMI Package input file for the simulation, unless an FMI option is needed. If a GWF-PRT Exchange is specified and the FMI Package is specified, then the PACKAGEDATA block below is not read or used. + +\item Flows are provided from a previous GWF model simulation---in this case FMI should be provided in the PRT name file and the head and budget files should be listed in the FMI PACKAGEDATA block. In this case, FMI reads the simulated head and flows from these files and makes them available to the particle-trcking model. There are some additional considerations when the heads and flows are provided from binary files. + +\begin{itemize} +\item The binary budget file must contain the simulated flows for all of the packages that were included in the GWF model run. Saving of flows can be activated for all packages by specifying ``SAVE\_FLOWS'' as an option in the GWF name file. The GWF Output Control Package must also have ``SAVE BUGET ALL'' specified. The easiest way to ensure that all flows and heads are saved is to use the following simple form of a GWF Output Control file: + +\begin{verbatim} +BEGIN OPTIONS + HEAD FILEOUT mymodel.hds + BUDGET FILEOUT mymodel.bud +END OPTIONS + +BEGIN PERIOD 1 + SAVE HEAD ALL + SAVE BUDGET ALL +END PERIOD +\end{verbatim} + +\item The binary budget file must have the same number of budget terms listed for each time step. This will always be the case when the binary budget file is created by \mf. +\item The binary heads file must have heads saved for all layers in the model. This will always be the case when the binary head file is created by \mf. This was not always the case as previous MODFLOW versions allowed different save options for each layer. +\item If the binary budget and head files have more than one time step for a single stress period, then the budget and head information must be contained within the binary file for every time step in the simulation stress period. +\item The binary budget and head files must correspond in terms of information stored for each time step and stress period. +\item If the binary budget and head files have information provided for only the first time step of a given stress period, this information will be used for all time steps in that stress period in the PRT simulation. If the final (or only) stress period in the binary budget and head files contains data for only one time step, this information will be used for any subsequent time steps and stress periods in the PRT simulation. This makes it possible to provide flows, for example, from a steady-state GWF stress period and have those flows used for all PRT time steps in that stress period, for all remaining time steps in the PRT simulation, or for all time steps throughout the entire GWT simulation. With this option, it is possible to have smaller time steps in the PRT simulation than the time steps used in the GWF simulation. Note that this cannot be done when the GWF and PRT models are run in the same simulation, because in that case, both models are solved over the same sequence of time steps and stress periods, as listed in the TDIS Package. The option to read flows from a previous GWF simulation via Flow Model Interface may offer an efficient alternative to running both models in the same simulation, but comes at the cost of having potentially very large budget files. +\end{itemize} + +\end{itemize} + +\noindent Determination of which FMI use case to invoke requires careful consideration of the different advantages and disadvantages of each case. For example, running PRT and GWF in the same simulation can often be faster because GWF flows are passed through memory to the PRT model instead of being written to files. The disadvantage of this approach is that the same time step lengths must be used for both GWF and PRT. Ultimately, it should be relatively straightforward to test different ways in which GWF and PRT interact and select the use case most appropriate for the particular problem. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/prt-fmi-packagedata.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/prt-fmi-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/prt-fmi-example.dat} + diff --git a/doc/mf6io/prt/mip.tex b/doc/mf6io/prt/mip.tex new file mode 100644 index 00000000000..55e275e6174 --- /dev/null +++ b/doc/mf6io/prt/mip.tex @@ -0,0 +1,16 @@ +Model Input (MIP) Package information is read from the file that is specified by ``MIP6'' as the file type. The MIP Package is required, and only one MIP Package can be specified for a PRT model. The information read by the MIP Package pertains to the entire PRT model. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +%%\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/prt-mip-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/prt-mip-griddata.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/prt-mip-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/prt-mip-example.dat} diff --git a/doc/mf6io/prt/namefile.tex b/doc/mf6io/prt/namefile.tex new file mode 100644 index 00000000000..18780f276cf --- /dev/null +++ b/doc/mf6io/prt/namefile.tex @@ -0,0 +1,42 @@ +The PRT Model Name File specifies the options and packages that are active for a PRT model. The Name File contains two blocks: OPTIONS and PACKAGES. The length of each line must be 299 characters or less. The lines in each block can be in any order. Files listed in the PACKAGES block must exist when the program starts. + +Comment lines are indicated when the first character in a line is one of the valid comment characters. Commented lines can be located anywhere in the file. Any text characters can follow the comment character. Comment lines have no effect on the simulation; their purpose is to allow users to provide documentation about a particular simulation. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/prt-nam-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/prt-nam-packages.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/prt-nam-desc.tex} +\end{description} + +\begin{table}[H] +\caption{Ftype values described in this report. The \texttt{Pname} column indicates whether or not a package name can be provided in the name file. The capability to provide a package name also indicates that the PRT Model can have more than one package of that Ftype} +\small +\begin{center} +\begin{tabular*}{\columnwidth}{l l l} +\hline +\hline +Ftype & Input File Description & \texttt{Pname}\\ +\hline +DIS6 & Rectilinear Discretization Input File \\ +DISV6 & Discretization by Vertices Input File \\ +MIP6 & Model Input File \\ +FMI6 & Flow Model Interface Package & \\ +PRP6 & Particle Release Point Package \\ +OC6 & Output Control Option \\ +OBS6 & Observations Option \\ +\hline +\end{tabular*} +\label{table:ftypeprt} +\end{center} +\normalsize +\end{table} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/prt-nam-example.dat} + diff --git a/doc/mf6io/prt/oc.tex b/doc/mf6io/prt/oc.tex new file mode 100644 index 00000000000..8077ad09bf9 --- /dev/null +++ b/doc/mf6io/prt/oc.tex @@ -0,0 +1,25 @@ +Input to the Output Control Option of the Particle Tracking Model is read from the file that is specified as type ``OC6'' in the Name File. If no ``OC6'' file is specified, default output control is used. The Output Control Option determines how and when concentrations are printed to the listing file and/or written to a separate binary output file. Under the default, concentration and overall transport budget are written to the Listing File at the end of every stress period. The default printout format for concentrations is 10G11.4. The concentrations and overall transport budget are also written to the list file if the simulation terminates prematurely due to failed convergence. + +Output Control data must be specified using words. The numeric codes supported in earlier MODFLOW versions can no longer be used. + +For the PRINT and SAVE options of concentration, there is no option to specify individual layers. Whenever the concentration array is printed or saved, all layers are printed or saved. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\vspace{5mm} + +\noindent \textit{FOR EACH SIMULATION} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/prt-oc-options.dat} +\vspace{5mm} +\noindent \textit{FOR ANY STRESS PERIOD} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/prt-oc-period.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/prt-oc-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/prt-oc-example.dat} diff --git a/doc/mf6io/prt/prp.tex b/doc/mf6io/prt/prp.tex new file mode 100644 index 00000000000..68edf7227f8 --- /dev/null +++ b/doc/mf6io/prt/prp.tex @@ -0,0 +1,25 @@ +Particle Release Point (PRP) Package information is read from the file that is specified by ``PRP6'' as the file type. More than one PRP Package can be specified for a PRT model. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/prt-prp-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/prt-prp-dimensions.dat} +%%\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/prt-prp-griddata.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/prt-prp-packagedata.dat} +\vspace{5mm} +\noindent \textit{FOR ANY STRESS PERIOD} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/prt-prp-period.dat} +\packageperioddescription \: If no PERIOD block is specified for any period, a single particle is released from each release point at the beginning of the simulation. +%\noindent All of the stress period information in a PERIOD block will apply only to that stress period; the information will not continue to apply for subsequent stress periods. Note that this behavior is different from the simple stress packages (CHD, WEL, DRN, RIV, +%GHB, RCH and EVT) and the advanced stress packages (MAW, SFR, LAK, and UZF). + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/prt-prp-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/prt-prp-example.dat} + diff --git a/doc/mf6io/prt/prt-obs.tex b/doc/mf6io/prt/prt-obs.tex new file mode 100644 index 00000000000..be59101d85a --- /dev/null +++ b/doc/mf6io/prt/prt-obs.tex @@ -0,0 +1,39 @@ + +PRT Model observations include the simulated groundwater concentration (\texttt{concentration}), and the mass flow, with units of mass per time, between two connected cells (\texttt{flow-ja-face}). The data required for each PRT Model observation type is defined in table~\ref{table:gwtobstype}. For \texttt{flow-ja-face} observation types, negative and positive values represent a loss from and gain to the \texttt{cellid} specified for ID, respectively. + +\subsubsection{Structure of Blocks} +\vspace{5mm} + +\noindent \textit{FOR EACH SIMULATION} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/utl-obs-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/utl-obs-continuous.dat} + +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/utl-obs-desc.tex} +\end{description} + + +\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +\caption{Available PRT model observation types} \tabularnewline + +\hline +\hline +\textbf{Model} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +\hline +\endhead + +\hline +\endfoot + +%%%\input{../Common/prt-obs.tex} +%%%\label{table:prtobstype} +\end{longtable} + +\vspace{5mm} +\subsubsection{Example Observation Input File} + +An example PRT Model observation file is shown below. + +\lstinputlisting[style=inputfile]{./mf6ivar/examples/utl-obs-prt-example.dat} + diff --git a/doc/mf6io/prt/prt.tex b/doc/mf6io/prt/prt.tex new file mode 100644 index 00000000000..372eea93685 --- /dev/null +++ b/doc/mf6io/prt/prt.tex @@ -0,0 +1,66 @@ +The PRT Model performs three-dimensional particle tracking in flowing groundwater. + +This section describes the data files for a \mf Particle Tracking (PRT) Model. A PRT Model is added to the simulation by including a PRT entry in the MODELS block of the simulation name file. There are currently two types of spatial discretization approaches that can be used with the PRT Model: DIS and DISV. The input instructions for these three packages are not described here in this section on PRT Model input; input instructions for these three packages are described in the section on GWF Model input. + +The PRT Model is designed to permit input to be gathered, as it is needed, from many different files. Likewise, results from the model calculations can be written to a number of output files. Details about the files used by each package are provided in this section on the PRT Model Instructions. + +The PRT Model reads a file called the Name File, which specifies most of the files that will be used in a simulation. Several files are always required whereas other files are optional depending on the simulation. The Output Control Package receives instructions from the user to control the amount and frequency of output. Details about the Name File and the Output Control Package are described in this section. + +For the PRT Model, ``flows'' (unless stated otherwise) represent particle mass ``flow'' in mass per time, rather than groundwater flow. Each particle is currently assigned unit mass (configurable mass is planned but not yet implemented), and the numerical value of the flow can be interpreted as particles per time. + +\begin{enumerate} + +\item The PRT Model simulates particle trajectories through flowing groundwater, and requires simulated groundwater flows as input. Flows can be routed to a PRT Model from a GWF Model in the same simulation via a GWF-PRT Exchange. Alternatively, a PRT Model can read binary flow and head files saved by a previously run GWF Model via Flow Model Interface. + +\item Particle tracking is not yet supported for the advanced stress packages or the Water Mover Package. + +\item A PRT-PRT Exchange is planned but has not yet been developed. This exchange will connect multiple particle-tracking models, e.g. for nested grid configurations. + +\end{enumerate} + +\subsection{Units of Length and Time} +The GWF Model formulates the groundwater flow equation without using prescribed length and time units. Any consistent units of length and time can be used when specifying the input data for a simulation. This capability gives a certain amount of freedom to the user, but care must be exercised to avoid mixing units. The program cannot detect the use of inconsistent units. + +\subsection{Particle Mass Budget} +A summary of all inflow (sources) and outflow (sinks) of particle mass is called a mass budget. \mf calculates a mass budget for the overall model as a check on the acceptability of the solution, and to provide a summary of the sources and sinks of mass to the flow system. The particle mass budget is printed to the PRT Model Listing File for selected time steps. In the current implementation, each particle is assigned unit mass, and the numerical value of the flow can be interpreted as particles per time. + +\subsection{Time Stepping} +In \mf time step lengths are controlled by the user and specified in the Temporal Discretization (TDIS) input file. When the flow model and particle-tracking model run in the same simulation, the time step length specified in TDIS is used for both models. If the PRT Model runs in a separate simulation, the time discretization may differ. Instructions for specifying time steps are described in the TDIS section of this user guide; additional information on GWF and PRT configurations are in the Flow Model Interface section. + + + +\newpage +\subsection{PRT Model Name File} +\input{prt/namefile.tex} + +%\newpage +%\subsection{Structured Discretization (DIS) Input File} +%\input{gwf/dis} + +%\newpage +%\subsection{Discretization with Vertices (DISV) Input File} +%\input{gwf/disv} + +%\newpage +%\subsection{Unstructured Discretization (DISU) Input File} +%\input{gwf/disu} + +\newpage +\subsection{Model Input (MIP) Package} +\input{prt/mip} + +\newpage +\subsection{Particle Release Point Conditions (PRP) Package} +\input{prt/prp} + +\newpage +\subsection{Output Control (OC) Option} +\input{prt/oc} + +\newpage +\subsection{Observation (OBS) Utility for a PRT Model} +\input{prt/prt-obs} + +\newpage +\subsection{Flow Model Interface (FMI) Package} +\input{prt/fmi} diff --git a/environment.yml b/environment.yml index 118a816e753..c7fc0fc6748 100644 --- a/environment.yml +++ b/environment.yml @@ -17,6 +17,7 @@ dependencies: - numpy - pyshp - shapely + - scipy - pip - pip: - git+https://github.com/modflowpy/flopy.git @@ -25,7 +26,8 @@ dependencies: - git+https://github.com/MODFLOW-USGS/modflowapi.git - git+https://github.com/MODFLOW-USGS/modflow-devtools.git - pytest + - pytest-benchmark - pytest-dotenv - pytest-order - pytest-xdist - - flaky + - flaky \ No newline at end of file diff --git a/make/makefile b/make/makefile index e468b4dd6e1..6b628f91f39 100644 --- a/make/makefile +++ b/make/makefile @@ -11,33 +11,35 @@ SOURCEDIR4=../src/Exchange SOURCEDIR5=../src/Distributed SOURCEDIR6=../src/Solution SOURCEDIR7=../src/Solution/LinearMethods -SOURCEDIR8=../src/Solution/PETSc -SOURCEDIR9=../src/Timing -SOURCEDIR10=../src/Utilities -SOURCEDIR11=../src/Utilities/Idm -SOURCEDIR12=../src/Utilities/Idm/mf6blockfile -SOURCEDIR13=../src/Utilities/TimeSeries -SOURCEDIR14=../src/Utilities/Memory -SOURCEDIR15=../src/Utilities/OutputControl -SOURCEDIR16=../src/Utilities/ArrayRead -SOURCEDIR17=../src/Utilities/Libraries -SOURCEDIR18=../src/Utilities/Libraries/rcm -SOURCEDIR19=../src/Utilities/Libraries/blas -SOURCEDIR20=../src/Utilities/Libraries/sparskit2 -SOURCEDIR21=../src/Utilities/Libraries/daglib -SOURCEDIR22=../src/Utilities/Libraries/sparsekit -SOURCEDIR23=../src/Utilities/Vector -SOURCEDIR24=../src/Utilities/Matrix -SOURCEDIR25=../src/Utilities/Observation -SOURCEDIR26=../src/Model -SOURCEDIR27=../src/Model/Connection -SOURCEDIR28=../src/Model/SurfaceWaterFlow -SOURCEDIR29=../src/Model/GroundWaterTransport -SOURCEDIR30=../src/Model/ModelUtilities -SOURCEDIR31=../src/Model/GroundWaterFlow -SOURCEDIR32=../src/Model/TransportModel -SOURCEDIR33=../src/Model/Geometry -SOURCEDIR34=../src/Model/GroundWaterEnergy +SOURCEDIR8=../src/Solution/ParticleTracker +SOURCEDIR9=../src/Solution/PETSc +SOURCEDIR10=../src/Timing +SOURCEDIR11=../src/Utilities +SOURCEDIR12=../src/Utilities/Idm +SOURCEDIR13=../src/Utilities/Idm/mf6blockfile +SOURCEDIR14=../src/Utilities/TimeSeries +SOURCEDIR15=../src/Utilities/Memory +SOURCEDIR16=../src/Utilities/OutputControl +SOURCEDIR17=../src/Utilities/ArrayRead +SOURCEDIR18=../src/Utilities/Libraries +SOURCEDIR19=../src/Utilities/Libraries/rcm +SOURCEDIR20=../src/Utilities/Libraries/blas +SOURCEDIR21=../src/Utilities/Libraries/sparskit2 +SOURCEDIR22=../src/Utilities/Libraries/daglib +SOURCEDIR23=../src/Utilities/Libraries/sparsekit +SOURCEDIR24=../src/Utilities/Vector +SOURCEDIR25=../src/Utilities/Matrix +SOURCEDIR26=../src/Utilities/Observation +SOURCEDIR27=../src/Model +SOURCEDIR28=../src/Model/Connection +SOURCEDIR29=../src/Model/ParticleTracking +SOURCEDIR30=../src/Model/SurfaceWaterFlow +SOURCEDIR31=../src/Model/GroundWaterTransport +SOURCEDIR32=../src/Model/ModelUtilities +SOURCEDIR33=../src/Model/GroundWaterFlow +SOURCEDIR34=../src/Model/TransportModel +SOURCEDIR35=../src/Model/Geometry +SOURCEDIR36=../src/Model/GroundWaterEnergy VPATH = \ ${SOURCEDIR1} \ @@ -73,7 +75,9 @@ ${SOURCEDIR30} \ ${SOURCEDIR31} \ ${SOURCEDIR32} \ ${SOURCEDIR33} \ -${SOURCEDIR34} +${SOURCEDIR34} \ +${SOURCEDIR35} \ +${SOURCEDIR36} .SUFFIXES: .f90 .F90 .o @@ -107,6 +111,10 @@ $(OBJDIR)/swf-cxsidm.o \ $(OBJDIR)/swf-chdidm.o \ $(OBJDIR)/sim-tdisidm.o \ $(OBJDIR)/sim-namidm.o \ +$(OBJDIR)/prt-namidm.o \ +$(OBJDIR)/prt-mipidm.o \ +$(OBJDIR)/prt-disvidm.o \ +$(OBJDIR)/prt-disidm.o \ $(OBJDIR)/gwt-namidm.o \ $(OBJDIR)/gwt-icidm.o \ $(OBJDIR)/gwt-dspidm.o \ @@ -138,6 +146,7 @@ $(OBJDIR)/gwe-ctpidm.o \ $(OBJDIR)/gwe-cndidm.o \ $(OBJDIR)/exg-swfgwfidm.o \ $(OBJDIR)/exg-gwtgwtidm.o \ +$(OBJDIR)/exg-gwfprtidm.o \ $(OBJDIR)/exg-gwfgwtidm.o \ $(OBJDIR)/exg-gwfgwfidm.o \ $(OBJDIR)/exg-gwfgweidm.o \ @@ -147,6 +156,7 @@ $(OBJDIR)/DevFeature.o \ $(OBJDIR)/MemoryList.o \ $(OBJDIR)/IdmSwfDfnSelector.o \ $(OBJDIR)/IdmSimDfnSelector.o \ +$(OBJDIR)/IdmPrtDfnSelector.o \ $(OBJDIR)/IdmGwtDfnSelector.o \ $(OBJDIR)/IdmGwfDfnSelector.o \ $(OBJDIR)/IdmGweDfnSelector.o \ @@ -180,34 +190,49 @@ $(OBJDIR)/DiscretizationBase.o \ $(OBJDIR)/TimeArraySeries.o \ $(OBJDIR)/ObsOutputList.o \ $(OBJDIR)/Observe.o \ +$(OBJDIR)/BudgetFileReader.o \ $(OBJDIR)/TimeArraySeriesLink.o \ $(OBJDIR)/ObsUtility.o \ $(OBJDIR)/ObsContainer.o \ -$(OBJDIR)/BudgetFileReader.o \ +$(OBJDIR)/BudgetTerm.o \ +$(OBJDIR)/Budget.o \ $(OBJDIR)/TimeArraySeriesManager.o \ $(OBJDIR)/PackageMover.o \ $(OBJDIR)/Obs.o \ $(OBJDIR)/NumericalPackage.o \ -$(OBJDIR)/Budget.o \ -$(OBJDIR)/BudgetTerm.o \ +$(OBJDIR)/PackageBudget.o \ +$(OBJDIR)/HeadFileReader.o \ +$(OBJDIR)/BudgetObject.o \ +$(OBJDIR)/BoundaryPackage.o \ +$(OBJDIR)/CellDefn.o \ +$(OBJDIR)/Particle.o \ +$(OBJDIR)/gwf-disv.o \ +$(OBJDIR)/FlowModelInterface.o \ +$(OBJDIR)/Subcell.o \ +$(OBJDIR)/TrackData.o \ +$(OBJDIR)/TimeSelect.o \ +$(OBJDIR)/prt-fmi.o \ +$(OBJDIR)/Cell.o \ $(OBJDIR)/sort.o \ $(OBJDIR)/SfrCrossSectionUtils.o \ -$(OBJDIR)/BoundaryPackage.o \ +$(OBJDIR)/TernarySolveTrack.o \ +$(OBJDIR)/SubcellTri.o \ +$(OBJDIR)/Method.o \ +$(OBJDIR)/SubcellRect.o \ +$(OBJDIR)/gwf-dis.o \ $(OBJDIR)/VirtualBase.o \ $(OBJDIR)/STLVecInt.o \ $(OBJDIR)/BaseModel.o \ -$(OBJDIR)/PackageBudget.o \ -$(OBJDIR)/HeadFileReader.o \ -$(OBJDIR)/BudgetObject.o \ $(OBJDIR)/PrintSaveManager.o \ $(OBJDIR)/SfrCrossSectionManager.o \ $(OBJDIR)/dag_module.o \ $(OBJDIR)/BoundaryPackageExt.o \ +$(OBJDIR)/MethodSubcellTernary.o \ +$(OBJDIR)/MethodSubcellPollock.o \ $(OBJDIR)/VirtualDataLists.o \ $(OBJDIR)/VirtualDataContainer.o \ $(OBJDIR)/SimStages.o \ $(OBJDIR)/NumericalModel.o \ -$(OBJDIR)/FlowModelInterface.o \ $(OBJDIR)/OutputControlData.o \ $(OBJDIR)/gwf-ic.o \ $(OBJDIR)/Xt3dAlgorithm.o \ @@ -221,6 +246,10 @@ $(OBJDIR)/GwfVscInputData.o \ $(OBJDIR)/gwf-ghb.o \ $(OBJDIR)/gwf-drn.o \ $(OBJDIR)/IndexMap.o \ +$(OBJDIR)/MethodSubcellPool.o \ +$(OBJDIR)/CellPoly.o \ +$(OBJDIR)/CellRectQuad.o \ +$(OBJDIR)/CellRect.o \ $(OBJDIR)/VirtualModel.o \ $(OBJDIR)/BaseExchange.o \ $(OBJDIR)/tsp-fmi.o \ @@ -239,6 +268,10 @@ $(OBJDIR)/SeqVector.o \ $(OBJDIR)/ImsLinearSettings.o \ $(OBJDIR)/ConvergenceSummary.o \ $(OBJDIR)/ArrayReaderBase.o \ +$(OBJDIR)/MethodCellTernary.o \ +$(OBJDIR)/MethodCellPollockQuad.o \ +$(OBJDIR)/MethodCellPollock.o \ +$(OBJDIR)/MethodCellPassToBot.o \ $(OBJDIR)/CellWithNbrs.o \ $(OBJDIR)/NumericalExchange.o \ $(OBJDIR)/tsp-ssm.o \ @@ -246,9 +279,7 @@ $(OBJDIR)/tsp-oc.o \ $(OBJDIR)/tsp-obs.o \ $(OBJDIR)/tsp-mvt.o \ $(OBJDIR)/tsp-adv.o \ -$(OBJDIR)/gwf-disv.o \ $(OBJDIR)/gwf-disu.o \ -$(OBJDIR)/gwf-dis.o \ $(OBJDIR)/gwf-uzf.o \ $(OBJDIR)/tsp-apt.o \ $(OBJDIR)/gwt-mst.o \ @@ -270,6 +301,8 @@ $(OBJDIR)/IdmLogger.o \ $(OBJDIR)/Integer2dReader.o \ $(OBJDIR)/DislGeom.o \ $(OBJDIR)/SwfCxsUtils.o \ +$(OBJDIR)/MethodCellPool.o \ +$(OBJDIR)/CellUtil.o \ $(OBJDIR)/VirtualExchange.o \ $(OBJDIR)/GridSorting.o \ $(OBJDIR)/DisConnExchange.o \ @@ -316,6 +349,8 @@ $(OBJDIR)/Double1dReader.o \ $(OBJDIR)/swf-disl.o \ $(OBJDIR)/swf-cxs.o \ $(OBJDIR)/swf-ic.o \ +$(OBJDIR)/MethodDisv.o \ +$(OBJDIR)/MethodDis.o \ $(OBJDIR)/GridConnection.o \ $(OBJDIR)/DistributedVariable.o \ $(OBJDIR)/gwt.o \ @@ -337,7 +372,11 @@ $(OBJDIR)/swf-oc.o \ $(OBJDIR)/swf-obs.o \ $(OBJDIR)/swf-flw.o \ $(OBJDIR)/swf-dfw.o \ -$(OBJDIR)/ExplicitModel.o \ +$(OBJDIR)/prt-prp.o \ +$(OBJDIR)/prt-oc.o \ +$(OBJDIR)/prt-obs.o \ +$(OBJDIR)/prt-mip.o \ +$(OBJDIR)/MethodPool.o \ $(OBJDIR)/SpatialModelConnection.o \ $(OBJDIR)/GwtInterfaceModel.o \ $(OBJDIR)/exg-gwtgwt.o \ @@ -352,6 +391,7 @@ $(OBJDIR)/StressListInput.o \ $(OBJDIR)/StressGridInput.o \ $(OBJDIR)/LoadMf6File.o \ $(OBJDIR)/swf.o \ +$(OBJDIR)/prt.o \ $(OBJDIR)/ExplicitSolution.o \ $(OBJDIR)/GwtGwtConnection.o \ $(OBJDIR)/GwfGwfConnection.o \ @@ -369,6 +409,7 @@ $(OBJDIR)/VirtualGweExchange.o \ $(OBJDIR)/exg-swfgwf.o \ $(OBJDIR)/SolutionGroup.o \ $(OBJDIR)/SolutionFactory.o \ +$(OBJDIR)/exg-gwfprt.o \ $(OBJDIR)/exg-gwfgwt.o \ $(OBJDIR)/exg-gwfgwe.o \ $(OBJDIR)/RunControl.o \ @@ -390,7 +431,8 @@ $(OBJDIR)/rcm.o \ $(OBJDIR)/blas1_d.o \ $(OBJDIR)/Iunit.o \ $(OBJDIR)/RectangularGeometry.o \ -$(OBJDIR)/CircularGeometry.o +$(OBJDIR)/CircularGeometry.o \ +$(OBJDIR)/ExplicitModel.o # Define the objects that make up the program $(PROGRAM) : $(OBJECTS) diff --git a/msvs/mf6.vfproj b/msvs/mf6.vfproj index 3d8eb21730e..cfad99a21e5 100644 --- a/msvs/mf6.vfproj +++ b/msvs/mf6.vfproj @@ -26,7 +26,7 @@ - + @@ -36,7 +36,7 @@ - + @@ -56,7 +56,7 @@ - + diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index fa30c8185cb..aef9e6f560d 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -110,6 +110,7 @@ + @@ -147,6 +148,10 @@ + + + + @@ -156,19 +161,23 @@ - + + + + - + + @@ -234,7 +243,6 @@ - @@ -246,7 +254,6 @@ - @@ -256,6 +263,14 @@ + + + + + + + + @@ -280,6 +295,8 @@ + + @@ -321,6 +338,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -371,7 +412,6 @@ - diff --git a/msvs/mf6lib.vfproj b/msvs/mf6lib.vfproj index a14282b94e7..2c27e0c358b 100644 --- a/msvs/mf6lib.vfproj +++ b/msvs/mf6lib.vfproj @@ -160,7 +160,6 @@ - diff --git a/src/Exchange/exg-gwfprt.f90 b/src/Exchange/exg-gwfprt.f90 new file mode 100644 index 00000000000..2ea62c71fb3 --- /dev/null +++ b/src/Exchange/exg-gwfprt.f90 @@ -0,0 +1,356 @@ +module GwfPrtExchangeModule + + use KindModule, only: DP, I4B + use ConstantsModule, only: LENPACKAGENAME + use ListsModule, only: basemodellist, baseexchangelist + use SimModule, only: store_error + use SimVariablesModule, only: errmsg + use BaseExchangeModule, only: BaseExchangeType, AddBaseExchangeToList + use BaseModelModule, only: BaseModelType, GetBaseModelFromList + use GwfModule, only: GwfModelType + use PrtModule, only: PrtModelType + use BndModule, only: BndType, GetBndFromList + + implicit none + public :: GwfPrtExchangeType + public :: gwfprt_cr + + type, extends(BaseExchangeType) :: GwfPrtExchangeType + + integer(I4B), pointer :: m1id => null() + integer(I4B), pointer :: m2id => null() + + contains + + procedure :: exg_df + procedure :: exg_ar + procedure :: exg_da + procedure, private :: set_model_pointers + procedure, private :: allocate_scalars + procedure, private :: gwfbnd2prtfmi + ! procedure, private :: gwfconn2prtconn + ! procedure, private :: link_connections + + end type GwfPrtExchangeType + +contains + + !> @brief Create a new GWF to PRT exchange object + subroutine gwfprt_cr(filename, id, m1id, m2id) + ! -- modules + use SimVariablesModule, only: model_loc_idx + ! -- dummy + character(len=*), intent(in) :: filename + integer(I4B), intent(in) :: id + integer(I4B), intent(in) :: m1id + integer(I4B), intent(in) :: m2id + ! -- local + class(BaseExchangeType), pointer :: baseexchange => null() + type(GwfPrtExchangeType), pointer :: exchange => null() + character(len=20) :: cint + ! + ! -- Create a new exchange and add it to the baseexchangelist container + allocate (exchange) + baseexchange => exchange + call AddBaseExchangeToList(baseexchangelist, baseexchange) + ! + ! -- Assign id and name + exchange%id = id + write (cint, '(i0)') id + exchange%name = 'GWF-PRT_'//trim(adjustl(cint)) + exchange%memoryPath = exchange%name + ! + ! -- allocate scalars + call exchange%allocate_scalars() + ! + ! -- NB: convert from id to local model index in base model list + exchange%m1id = model_loc_idx(m1id) + exchange%m2id = model_loc_idx(m2id) + ! + ! -- set model pointers + call exchange%set_model_pointers() + ! + ! -- return + return + end subroutine gwfprt_cr + + subroutine set_model_pointers(this) + ! -- modules + ! -- dummy + class(GwfPrtExchangeType) :: this + ! -- local + class(BaseModelType), pointer :: mb => null() + type(GwfModelType), pointer :: gwfmodel => null() + type(PrtModelType), pointer :: prtmodel => null() + ! + ! -- set gwfmodel + mb => GetBaseModelFromList(basemodellist, this%m1id) + select type (mb) + type is (GwfModelType) + gwfmodel => mb + end select + ! + ! -- set prtmodel + mb => GetBaseModelFromList(basemodellist, this%m2id) + select type (mb) + type is (PrtModelType) + prtmodel => mb + end select + ! + ! -- Verify that GWF model is of the correct type + if (.not. associated(gwfmodel)) then + write (errmsg, '(3a)') 'Problem with GWF-PRT exchange ', trim(this%name), & + '. Specified GWF Model does not appear to be of the correct type.' + call store_error(errmsg, terminate=.true.) + end if + ! + ! -- Verify that PRT model is of the correct type + if (.not. associated(prtmodel)) then + write (errmsg, '(3a)') 'Problem with GWF-PRT exchange ', trim(this%name), & + '. Specified PRT Model does not appear to be of the correct type.' + call store_error(errmsg, terminate=.true.) + end if + ! + ! -- Tell particle tracking model fmi flows are not read from file + prtmodel%fmi%flows_from_file = .false. + ! + ! -- Set a pointer to the GWF bndlist. This will allow the transport model + ! to look through the flow packages and establish a link to GWF flows + prtmodel%fmi%gwfbndlist => gwfmodel%bndlist + ! + ! -- return + return + end subroutine set_model_pointers + + subroutine exg_df(this) + ! -- modules + use MemoryManagerModule, only: mem_checkin + ! -- dummy + class(GwfPrtExchangeType) :: this + ! -- local + class(BaseModelType), pointer :: mb => null() + type(GwfModelType), pointer :: gwfmodel => null() + type(PrtModelType), pointer :: prtmodel => null() + integer(I4B) :: ngwfpack, ip + class(BndType), pointer :: packobj => null() + ! + ! + ! -- set gwfmodel + mb => GetBaseModelFromList(basemodellist, this%m1id) + select type (mb) + type is (GwfModelType) + gwfmodel => mb + end select + ! + ! -- set prtmodel + mb => GetBaseModelFromList(basemodellist, this%m2id) + select type (mb) + type is (PrtModelType) + prtmodel => mb + end select + ! + ! -- Check to make sure that flow is solved before particle tracking and in a + ! different solution + if (gwfmodel%idsoln >= prtmodel%idsoln) then + write (errmsg, '(3a)') 'Problem with GWF-PRT exchange ', trim(this%name), & + '. The GWF model must be solved by a different solution than the PRT model. & + &The IMS specified for GWF must be listed in mfsim.nam & + &before the EMS for PRT.' + call store_error(errmsg, terminate=.true.) + end if + ! + ! -- Set pointer to flowja + prtmodel%fmi%gwfflowja => gwfmodel%flowja + call mem_checkin(prtmodel%fmi%gwfflowja, & + 'GWFFLOWJA', prtmodel%fmi%memoryPath, & + 'FLOWJA', gwfmodel%memoryPath) + ! + ! -- Set the npf flag so that specific discharge is available for + ! transport calculations if dispersion is active + if (prtmodel%indsp > 0) then + gwfmodel%npf%icalcspdis = 1 + end if + ! + ! -- Set the auxiliary names for gwf flow packages in prt%fmi + ngwfpack = gwfmodel%bndlist%Count() + do ip = 1, ngwfpack + packobj => GetBndFromList(gwfmodel%bndlist, ip) + call prtmodel%fmi%gwfpackages(ip)%set_auxname(packobj%naux, & + packobj%auxname) + end do + ! + ! -- return + return + end subroutine exg_df + + subroutine exg_ar(this) + ! -- modules + use MemoryManagerModule, only: mem_checkin + ! -- dummy + class(GwfPrtExchangeType) :: this + ! -- local + class(BaseModelType), pointer :: mb => null() + type(GwfModelType), pointer :: gwfmodel => null() + type(PrtModelType), pointer :: prtmodel => null() + ! -- formats + character(len=*), parameter :: fmtdiserr = & + "('GWF and PRT Models do not have the same discretization for exchange& + & ',a,'.& + & GWF Model has ', i0, ' user nodes and ', i0, ' reduced nodes.& + & PRT Model has ', i0, ' user nodes and ', i0, ' reduced nodes.& + & Ensure discretization packages, including IDOMAIN, are identical.')" + ! + ! -- set gwfmodel + mb => GetBaseModelFromList(basemodellist, this%m1id) + select type (mb) + type is (GwfModelType) + gwfmodel => mb + end select + ! + ! -- set prtmodel + mb => GetBaseModelFromList(basemodellist, this%m2id) + select type (mb) + type is (PrtModelType) + prtmodel => mb + end select + ! + ! -- Check to make sure sizes are identical + if (prtmodel%dis%nodes /= gwfmodel%dis%nodes .or. & + prtmodel%dis%nodesuser /= gwfmodel%dis%nodesuser) then + write (errmsg, fmtdiserr) trim(this%name), & + gwfmodel%dis%nodesuser, & + gwfmodel%dis%nodes, & + prtmodel%dis%nodesuser, & + prtmodel%dis%nodes + call store_error(errmsg, terminate=.TRUE.) + end if + ! + ! -- setup pointers to gwf variables allocated in gwf_ar + prtmodel%fmi%gwfhead => gwfmodel%x + call mem_checkin(prtmodel%fmi%gwfhead, & + 'GWFHEAD', prtmodel%fmi%memoryPath, & + 'X', gwfmodel%memoryPath) + prtmodel%fmi%gwfsat => gwfmodel%npf%sat + call mem_checkin(prtmodel%fmi%gwfsat, & + 'GWFSAT', prtmodel%fmi%memoryPath, & + 'SAT', gwfmodel%npf%memoryPath) + prtmodel%fmi%gwfspdis => gwfmodel%npf%spdis + call mem_checkin(prtmodel%fmi%gwfspdis, & + 'GWFSPDIS', prtmodel%fmi%memoryPath, & + 'SPDIS', gwfmodel%npf%memoryPath) + ! + ! -- setup pointers to the flow storage rates. GWF strg arrays are + ! available after the gwf_ar routine is called. + if (prtmodel%inmst > 0) then + if (gwfmodel%insto > 0) then + prtmodel%fmi%gwfstrgss => gwfmodel%sto%strgss + prtmodel%fmi%igwfstrgss = 1 + if (gwfmodel%sto%iusesy == 1) then + prtmodel%fmi%gwfstrgsy => gwfmodel%sto%strgsy + prtmodel%fmi%igwfstrgsy = 1 + end if + end if + end if + + ! -- todo: set pointer to particle mass concentration, once calculated? + ! if (gwfmodel%inbuy > 0) & + ! call gwfmodel%buy%set_concentration_pointer(& + ! prtmodel%name, prtmodel%mass, prtmodel%ibound) + + ! -- transfer the boundary package information from gwf to prt + call this%gwfbnd2prtfmi() + + ! -- if mover package is active, then set a pointer to it's budget object + if (gwfmodel%inmvr /= 0) & + prtmodel%fmi%mvrbudobj => gwfmodel%mvr%budobj + + ! -- todo connections + end subroutine exg_ar + + ! todo subroutines: gwfconn2prtconn and link_connections + + subroutine exg_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + ! -- dummy + class(GwfPrtExchangeType) :: this + ! -- local + ! + call mem_deallocate(this%m1id) + call mem_deallocate(this%m2id) + ! + ! -- return + return + end subroutine exg_da + + subroutine allocate_scalars(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate, mem_checkin + ! -- dummy + class(GwfPrtExchangeType) :: this + ! -- local + ! + call mem_allocate(this%m1id, 'M1ID', this%memoryPath) + call mem_allocate(this%m2id, 'M2ID', this%memoryPath) + this%m1id = 0 + this%m2id = 0 + ! + ! -- return + return + end subroutine allocate_scalars + + subroutine gwfbnd2prtfmi(this) + ! -- modules + ! -- dummy + class(GwfPrtExchangeType) :: this + ! -- local + integer(I4B) :: ngwfpack, ip, iterm, imover + class(BaseModelType), pointer :: mb => null() + type(GwfModelType), pointer :: gwfmodel => null() + type(PrtModelType), pointer :: prtmodel => null() + class(BndType), pointer :: packobj => null() + ! + ! -- set gwfmodel + mb => GetBaseModelFromList(basemodellist, this%m1id) + select type (mb) + type is (GwfModelType) + gwfmodel => mb + end select + ! + ! -- set prtmodel + mb => GetBaseModelFromList(basemodellist, this%m2id) + select type (mb) + type is (PrtModelType) + prtmodel => mb + end select + ! + ! -- Call routines in FMI that will set pointers to the necessary flow + ! data (SIMVALS and SIMTOMVR) stored within each GWF flow package + ngwfpack = gwfmodel%bndlist%Count() + iterm = 1 + do ip = 1, ngwfpack + packobj => GetBndFromList(gwfmodel%bndlist, ip) + call prtmodel%fmi%gwfpackages(iterm)%set_pointers( & + 'SIMVALS', & + packobj%memoryPath, & + packobj%input_mempath) + iterm = iterm + 1 + ! + ! -- If a mover is active for this package, then establish a separate + ! pointer link for the mover flows stored in SIMTOMVR + imover = packobj%imover + if (packobj%isadvpak /= 0) imover = 0 + if (imover /= 0) then + call prtmodel%fmi%gwfpackages(iterm)%set_pointers( & + 'SIMTOMVR', & + packobj%memoryPath, & + packobj%input_mempath) + iterm = iterm + 1 + end if + end do + ! + ! -- return + return + end subroutine gwfbnd2prtfmi + +end module GwfPrtExchangeModule diff --git a/src/Idm/exg-gwfprtidm.f90 b/src/Idm/exg-gwfprtidm.f90 new file mode 100644 index 00000000000..25f8c662a93 --- /dev/null +++ b/src/Idm/exg-gwfprtidm.f90 @@ -0,0 +1,70 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module ExgGwfprtInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public exg_gwfprt_param_definitions + public exg_gwfprt_aggregate_definitions + public exg_gwfprt_block_definitions + public ExgGwfprtParamFoundType + public exg_gwfprt_multi_package + + type ExgGwfprtParamFoundType + end type ExgGwfprtParamFoundType + + logical :: exg_gwfprt_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + exg_gwfprt_param_definitions(*) = & + [ & + InputParamDefinitionType & + ( & + '', & ! component + '', & ! subcomponent + '', & ! block + '', & ! tag name + '', & ! fortran variable + '', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) & + ] + + type(InputParamDefinitionType), parameter :: & + exg_gwfprt_aggregate_definitions(*) = & + [ & + InputParamDefinitionType & + ( & + '', & ! component + '', & ! subcomponent + '', & ! block + '', & ! tag name + '', & ! fortran variable + '', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) & + ] + + type(InputBlockDefinitionType), parameter :: & + exg_gwfprt_block_definitions(*) = & + [ & + InputBlockDefinitionType & + ( & + '', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_varaible + ) & + ] + +end module ExgGwfprtInputModule diff --git a/src/Idm/prt-disidm.f90 b/src/Idm/prt-disidm.f90 new file mode 100644 index 00000000000..ff9c3ffc1c7 --- /dev/null +++ b/src/Idm/prt-disidm.f90 @@ -0,0 +1,313 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module PrtDisInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public prt_dis_param_definitions + public prt_dis_aggregate_definitions + public prt_dis_block_definitions + public PrtDisParamFoundType + public prt_dis_multi_package + + type PrtDisParamFoundType + logical :: length_units = .false. + logical :: nogrb = .false. + logical :: xorigin = .false. + logical :: yorigin = .false. + logical :: angrot = .false. + logical :: nlay = .false. + logical :: nrow = .false. + logical :: ncol = .false. + logical :: delr = .false. + logical :: delc = .false. + logical :: top = .false. + logical :: botm = .false. + logical :: idomain = .false. + end type PrtDisParamFoundType + + logical :: prt_dis_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + prtdis_length_units = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'LENGTH_UNITS', & ! tag name + 'LENGTH_UNITS', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdis_nogrb = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'NOGRB', & ! tag name + 'NOGRB', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdis_xorigin = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'XORIGIN', & ! tag name + 'XORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdis_yorigin = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'YORIGIN', & ! tag name + 'YORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdis_angrot = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'ANGROT', & ! tag name + 'ANGROT', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdis_nlay = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DIS', & ! subcomponent + 'DIMENSIONS', & ! block + 'NLAY', & ! tag name + 'NLAY', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdis_nrow = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DIS', & ! subcomponent + 'DIMENSIONS', & ! block + 'NROW', & ! tag name + 'NROW', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdis_ncol = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DIS', & ! subcomponent + 'DIMENSIONS', & ! block + 'NCOL', & ! tag name + 'NCOL', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdis_delr = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DIS', & ! subcomponent + 'GRIDDATA', & ! block + 'DELR', & ! tag name + 'DELR', & ! fortran variable + 'DOUBLE1D', & ! type + 'NCOL', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdis_delc = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DIS', & ! subcomponent + 'GRIDDATA', & ! block + 'DELC', & ! tag name + 'DELC', & ! fortran variable + 'DOUBLE1D', & ! type + 'NROW', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdis_top = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DIS', & ! subcomponent + 'GRIDDATA', & ! block + 'TOP', & ! tag name + 'TOP', & ! fortran variable + 'DOUBLE2D', & ! type + 'NCOL NROW', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdis_botm = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DIS', & ! subcomponent + 'GRIDDATA', & ! block + 'BOTM', & ! tag name + 'BOTM', & ! fortran variable + 'DOUBLE3D', & ! type + 'NCOL NROW NLAY', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdis_idomain = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DIS', & ! subcomponent + 'GRIDDATA', & ! block + 'IDOMAIN', & ! tag name + 'IDOMAIN', & ! fortran variable + 'INTEGER3D', & ! type + 'NCOL NROW NLAY', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prt_dis_param_definitions(*) = & + [ & + prtdis_length_units, & + prtdis_nogrb, & + prtdis_xorigin, & + prtdis_yorigin, & + prtdis_angrot, & + prtdis_nlay, & + prtdis_nrow, & + prtdis_ncol, & + prtdis_delr, & + prtdis_delc, & + prtdis_top, & + prtdis_botm, & + prtdis_idomain & + ] + + type(InputParamDefinitionType), parameter :: & + prt_dis_aggregate_definitions(*) = & + [ & + InputParamDefinitionType & + ( & + '', & ! component + '', & ! subcomponent + '', & ! block + '', & ! tag name + '', & ! fortran variable + '', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) & + ] + + type(InputBlockDefinitionType), parameter :: & + prt_dis_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'GRIDDATA', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module PrtDisInputModule diff --git a/src/Idm/prt-disvidm.f90 b/src/Idm/prt-disvidm.f90 new file mode 100644 index 00000000000..69cfdcc58bf --- /dev/null +++ b/src/Idm/prt-disvidm.f90 @@ -0,0 +1,460 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module PrtDisvInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public prt_disv_param_definitions + public prt_disv_aggregate_definitions + public prt_disv_block_definitions + public PrtDisvParamFoundType + public prt_disv_multi_package + + type PrtDisvParamFoundType + logical :: length_units = .false. + logical :: nogrb = .false. + logical :: xorigin = .false. + logical :: yorigin = .false. + logical :: angrot = .false. + logical :: nlay = .false. + logical :: ncpl = .false. + logical :: nvert = .false. + logical :: top = .false. + logical :: botm = .false. + logical :: idomain = .false. + logical :: iv = .false. + logical :: xv = .false. + logical :: yv = .false. + logical :: icell2d = .false. + logical :: xc = .false. + logical :: yc = .false. + logical :: ncvert = .false. + logical :: icvert = .false. + end type PrtDisvParamFoundType + + logical :: prt_disv_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + prtdisv_length_units = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'LENGTH_UNITS', & ! tag name + 'LENGTH_UNITS', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_nogrb = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'NOGRB', & ! tag name + 'NOGRB', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_xorigin = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'XORIGIN', & ! tag name + 'XORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_yorigin = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'YORIGIN', & ! tag name + 'YORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_angrot = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'ANGROT', & ! tag name + 'ANGROT', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_nlay = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'DIMENSIONS', & ! block + 'NLAY', & ! tag name + 'NLAY', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_ncpl = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'DIMENSIONS', & ! block + 'NCPL', & ! tag name + 'NCPL', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_nvert = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'DIMENSIONS', & ! block + 'NVERT', & ! tag name + 'NVERT', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_top = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'GRIDDATA', & ! block + 'TOP', & ! tag name + 'TOP', & ! fortran variable + 'DOUBLE1D', & ! type + 'NCPL', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_botm = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'GRIDDATA', & ! block + 'BOTM', & ! tag name + 'BOTM', & ! fortran variable + 'DOUBLE2D', & ! type + 'NCPL NLAY', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_idomain = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'GRIDDATA', & ! block + 'IDOMAIN', & ! tag name + 'IDOMAIN', & ! fortran variable + 'INTEGER2D', & ! type + 'NCPL NLAY', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_iv = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'VERTICES', & ! block + 'IV', & ! tag name + 'IV', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_xv = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'VERTICES', & ! block + 'XV', & ! tag name + 'XV', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_yv = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'VERTICES', & ! block + 'YV', & ! tag name + 'YV', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_icell2d = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'ICELL2D', & ! tag name + 'ICELL2D', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_xc = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'XC', & ! tag name + 'XC', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_yc = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'YC', & ! tag name + 'YC', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_ncvert = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'NCVERT', & ! tag name + 'NCVERT', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_icvert = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'ICVERT', & ! tag name + 'ICVERT', & ! fortran variable + 'INTEGER1D', & ! type + 'NCVERT', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prt_disv_param_definitions(*) = & + [ & + prtdisv_length_units, & + prtdisv_nogrb, & + prtdisv_xorigin, & + prtdisv_yorigin, & + prtdisv_angrot, & + prtdisv_nlay, & + prtdisv_ncpl, & + prtdisv_nvert, & + prtdisv_top, & + prtdisv_botm, & + prtdisv_idomain, & + prtdisv_iv, & + prtdisv_xv, & + prtdisv_yv, & + prtdisv_icell2d, & + prtdisv_xc, & + prtdisv_yc, & + prtdisv_ncvert, & + prtdisv_icvert & + ] + + type(InputParamDefinitionType), parameter :: & + prtdisv_vertices = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'VERTICES', & ! block + 'VERTICES', & ! tag name + 'VERTICES', & ! fortran variable + 'RECARRAY IV XV YV', & ! type + 'NVERT', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtdisv_cell2d = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'CELL2D', & ! tag name + 'CELL2D', & ! fortran variable + 'RECARRAY ICELL2D XC YC NCVERT ICVERT', & ! type + 'NCPL', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prt_disv_aggregate_definitions(*) = & + [ & + prtdisv_vertices, & + prtdisv_cell2d & + ] + + type(InputBlockDefinitionType), parameter :: & + prt_disv_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'GRIDDATA', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'VERTICES', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'CELL2D', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module PrtDisvInputModule diff --git a/src/Idm/prt-mipidm.f90 b/src/Idm/prt-mipidm.f90 new file mode 100644 index 00000000000..6548c358481 --- /dev/null +++ b/src/Idm/prt-mipidm.f90 @@ -0,0 +1,136 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module PrtMipInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public prt_mip_param_definitions + public prt_mip_aggregate_definitions + public prt_mip_block_definitions + public PrtMipParamFoundType + public prt_mip_multi_package + + type PrtMipParamFoundType + logical :: zero_method = .false. + logical :: porosity = .false. + logical :: retfactor = .false. + logical :: izone = .false. + end type PrtMipParamFoundType + + logical :: prt_mip_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + prtmip_zero_method = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'MIP', & ! subcomponent + 'OPTIONS', & ! block + 'ZERO_METHOD', & ! tag name + 'ZERO_METHOD', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtmip_porosity = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'MIP', & ! subcomponent + 'GRIDDATA', & ! block + 'POROSITY', & ! tag name + 'POROSITY', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtmip_retfactor = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'MIP', & ! subcomponent + 'GRIDDATA', & ! block + 'RETFACTOR', & ! tag name + 'RETFACTOR', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtmip_izone = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'MIP', & ! subcomponent + 'GRIDDATA', & ! block + 'IZONE', & ! tag name + 'IZONE', & ! fortran variable + 'INTEGER1D', & ! type + 'NODES', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prt_mip_param_definitions(*) = & + [ & + prtmip_zero_method, & + prtmip_porosity, & + prtmip_retfactor, & + prtmip_izone & + ] + + type(InputParamDefinitionType), parameter :: & + prt_mip_aggregate_definitions(*) = & + [ & + InputParamDefinitionType & + ( & + '', & ! component + '', & ! subcomponent + '', & ! block + '', & ! tag name + '', & ! fortran variable + '', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) & + ] + + type(InputBlockDefinitionType), parameter :: & + prt_mip_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'GRIDDATA', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module PrtMipInputModule diff --git a/src/Idm/prt-namidm.f90 b/src/Idm/prt-namidm.f90 new file mode 100644 index 00000000000..e1414a1e7fc --- /dev/null +++ b/src/Idm/prt-namidm.f90 @@ -0,0 +1,196 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module PrtNamInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public prt_nam_param_definitions + public prt_nam_aggregate_definitions + public prt_nam_block_definitions + public PrtNamParamFoundType + public prt_nam_multi_package + + type PrtNamParamFoundType + logical :: list = .false. + logical :: print_input = .false. + logical :: print_flows = .false. + logical :: save_flows = .false. + logical :: ftype = .false. + logical :: fname = .false. + logical :: pname = .false. + end type PrtNamParamFoundType + + logical :: prt_nam_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + prtnam_list = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'LIST', & ! tag name + 'LIST', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtnam_print_input = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_INPUT', & ! tag name + 'PRINT_INPUT', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtnam_print_flows = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_FLOWS', & ! tag name + 'PRINT_FLOWS', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtnam_save_flows = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'SAVE_FLOWS', & ! tag name + 'SAVE_FLOWS', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtnam_ftype = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'NAM', & ! subcomponent + 'PACKAGES', & ! block + 'FTYPE', & ! tag name + 'FTYPE', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtnam_fname = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'NAM', & ! subcomponent + 'PACKAGES', & ! block + 'FNAME', & ! tag name + 'FNAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prtnam_pname = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'NAM', & ! subcomponent + 'PACKAGES', & ! block + 'PNAME', & ! tag name + 'PNAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prt_nam_param_definitions(*) = & + [ & + prtnam_list, & + prtnam_print_input, & + prtnam_print_flows, & + prtnam_save_flows, & + prtnam_ftype, & + prtnam_fname, & + prtnam_pname & + ] + + type(InputParamDefinitionType), parameter :: & + prtnam_packages = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'NAM', & ! subcomponent + 'PACKAGES', & ! block + 'PACKAGES', & ! tag name + 'PACKAGES', & ! fortran variable + 'RECARRAY FTYPE FNAME PNAME', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + prt_nam_aggregate_definitions(*) = & + [ & + prtnam_packages & + ] + + type(InputBlockDefinitionType), parameter :: & + prt_nam_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'PACKAGES', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module PrtNamInputModule diff --git a/src/Idm/selector/IdmDfnSelector.f90 b/src/Idm/selector/IdmDfnSelector.f90 index 64c1053bc8b..0cc1a8f55db 100644 --- a/src/Idm/selector/IdmDfnSelector.f90 +++ b/src/Idm/selector/IdmDfnSelector.f90 @@ -10,6 +10,7 @@ module IdmDfnSelectorModule use IdmGwtDfnSelectorModule use IdmGweDfnSelectorModule use IdmSwfDfnSelectorModule + use IdmPrtDfnSelectorModule use IdmExgDfnSelectorModule implicit none @@ -39,6 +40,8 @@ function param_definitions(component, subcomponent) result(input_definition) input_definition => gwe_param_definitions(subcomponent) case ('SWF') input_definition => swf_param_definitions(subcomponent) + case ('PRT') + input_definition => prt_param_definitions(subcomponent) case ('EXG') input_definition => exg_param_definitions(subcomponent) case default @@ -62,6 +65,8 @@ function aggregate_definitions(component, subcomponent) result(input_definition) input_definition => gwe_aggregate_definitions(subcomponent) case ('SWF') input_definition => swf_aggregate_definitions(subcomponent) + case ('PRT') + input_definition => prt_aggregate_definitions(subcomponent) case ('EXG') input_definition => exg_aggregate_definitions(subcomponent) case default @@ -85,6 +90,8 @@ function block_definitions(component, subcomponent) result(input_definition) input_definition => gwe_block_definitions(subcomponent) case ('SWF') input_definition => swf_block_definitions(subcomponent) + case ('PRT') + input_definition => prt_block_definitions(subcomponent) case ('EXG') input_definition => exg_block_definitions(subcomponent) case default @@ -107,6 +114,8 @@ function idm_multi_package(component, subcomponent) result(multi_package) multi_package = gwe_idm_multi_package(subcomponent) case ('SWF') multi_package = swf_idm_multi_package(subcomponent) + case ('PRT') + multi_package = prt_idm_multi_package(subcomponent) case ('EXG') multi_package = exg_idm_multi_package(subcomponent) case default @@ -133,6 +142,8 @@ function idm_integrated(component, subcomponent) result(integrated) integrated = gwe_idm_integrated(subcomponent) case ('SWF') integrated = swf_idm_integrated(subcomponent) + case ('PRT') + integrated = prt_idm_integrated(subcomponent) case ('EXG') integrated = exg_idm_integrated(subcomponent) case default @@ -155,6 +166,8 @@ function idm_component(component) result(integrated) integrated = .true. case ('SWF') integrated = .true. + case ('PRT') + integrated = .true. case ('EXG') integrated = .true. case default diff --git a/src/Idm/selector/IdmExgDfnSelector.f90 b/src/Idm/selector/IdmExgDfnSelector.f90 index 55ac35a1537..ac464834577 100644 --- a/src/Idm/selector/IdmExgDfnSelector.f90 +++ b/src/Idm/selector/IdmExgDfnSelector.f90 @@ -11,6 +11,7 @@ module IdmExgDfnSelectorModule use ExgGwfgweInputModule use ExgGwegweInputModule use ExgSwfgwfInputModule + use ExgGwfprtInputModule implicit none private @@ -51,6 +52,8 @@ function exg_param_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, exg_gwegwe_param_definitions) case ('SWFGWF') call set_param_pointer(input_definition, exg_swfgwf_param_definitions) + case ('GWFPRT') + call set_param_pointer(input_definition, exg_gwfprt_param_definitions) case default end select return @@ -73,6 +76,8 @@ function exg_aggregate_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, exg_gwegwe_aggregate_definitions) case ('SWFGWF') call set_param_pointer(input_definition, exg_swfgwf_aggregate_definitions) + case ('GWFPRT') + call set_param_pointer(input_definition, exg_gwfprt_aggregate_definitions) case default end select return @@ -95,6 +100,8 @@ function exg_block_definitions(subcomponent) result(input_definition) call set_block_pointer(input_definition, exg_gwegwe_block_definitions) case ('SWFGWF') call set_block_pointer(input_definition, exg_swfgwf_block_definitions) + case ('GWFPRT') + call set_block_pointer(input_definition, exg_gwfprt_block_definitions) case default end select return @@ -116,6 +123,8 @@ function exg_idm_multi_package(subcomponent) result(multi_package) multi_package = exg_gwegwe_multi_package case ('SWFGWF') multi_package = exg_swfgwf_multi_package + case ('GWFPRT') + multi_package = exg_gwfprt_multi_package case default call store_error('Idm selector subcomponent not found; '//& &'component="EXG"'//& @@ -141,6 +150,8 @@ function exg_idm_integrated(subcomponent) result(integrated) integrated = .true. case ('SWFGWF') integrated = .true. + case ('GWFPRT') + integrated = .true. case default end select return diff --git a/src/Idm/selector/IdmPrtDfnSelector.f90 b/src/Idm/selector/IdmPrtDfnSelector.f90 new file mode 100644 index 00000000000..2a99cf6fca5 --- /dev/null +++ b/src/Idm/selector/IdmPrtDfnSelector.f90 @@ -0,0 +1,127 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module IdmPrtDfnSelectorModule + + use ConstantsModule, only: LENVARNAME + use SimModule, only: store_error + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + use PrtNamInputModule + use PrtDisInputModule + use PrtDisvInputModule + use PrtMipInputModule + + implicit none + private + public :: prt_param_definitions + public :: prt_aggregate_definitions + public :: prt_block_definitions + public :: prt_idm_multi_package + public :: prt_idm_integrated + +contains + + subroutine set_param_pointer(input_dfn, input_dfn_target) + type(InputParamDefinitionType), dimension(:), pointer :: input_dfn + type(InputParamDefinitionType), dimension(:), target :: input_dfn_target + input_dfn => input_dfn_target + end subroutine set_param_pointer + + subroutine set_block_pointer(input_dfn, input_dfn_target) + type(InputBlockDefinitionType), dimension(:), pointer :: input_dfn + type(InputBlockDefinitionType), dimension(:), target :: input_dfn_target + input_dfn => input_dfn_target + end subroutine set_block_pointer + + function prt_param_definitions(subcomponent) result(input_definition) + character(len=*), intent(in) :: subcomponent + type(InputParamDefinitionType), dimension(:), pointer :: input_definition + nullify (input_definition) + select case (subcomponent) + case ('NAM') + call set_param_pointer(input_definition, prt_nam_param_definitions) + case ('DIS') + call set_param_pointer(input_definition, prt_dis_param_definitions) + case ('DISV') + call set_param_pointer(input_definition, prt_disv_param_definitions) + case ('MIP') + call set_param_pointer(input_definition, prt_mip_param_definitions) + case default + end select + return + end function prt_param_definitions + + function prt_aggregate_definitions(subcomponent) result(input_definition) + character(len=*), intent(in) :: subcomponent + type(InputParamDefinitionType), dimension(:), pointer :: input_definition + nullify (input_definition) + select case (subcomponent) + case ('NAM') + call set_param_pointer(input_definition, prt_nam_aggregate_definitions) + case ('DIS') + call set_param_pointer(input_definition, prt_dis_aggregate_definitions) + case ('DISV') + call set_param_pointer(input_definition, prt_disv_aggregate_definitions) + case ('MIP') + call set_param_pointer(input_definition, prt_mip_aggregate_definitions) + case default + end select + return + end function prt_aggregate_definitions + + function prt_block_definitions(subcomponent) result(input_definition) + character(len=*), intent(in) :: subcomponent + type(InputBlockDefinitionType), dimension(:), pointer :: input_definition + nullify (input_definition) + select case (subcomponent) + case ('NAM') + call set_block_pointer(input_definition, prt_nam_block_definitions) + case ('DIS') + call set_block_pointer(input_definition, prt_dis_block_definitions) + case ('DISV') + call set_block_pointer(input_definition, prt_disv_block_definitions) + case ('MIP') + call set_block_pointer(input_definition, prt_mip_block_definitions) + case default + end select + return + end function prt_block_definitions + + function prt_idm_multi_package(subcomponent) result(multi_package) + character(len=*), intent(in) :: subcomponent + logical :: multi_package + select case (subcomponent) + case ('NAM') + multi_package = prt_nam_multi_package + case ('DIS') + multi_package = prt_dis_multi_package + case ('DISV') + multi_package = prt_disv_multi_package + case ('MIP') + multi_package = prt_mip_multi_package + case default + call store_error('Idm selector subcomponent not found; '//& + &'component="PRT"'//& + &', subcomponent="'//trim(subcomponent)//'".', .true.) + end select + return + end function prt_idm_multi_package + + function prt_idm_integrated(subcomponent) result(integrated) + character(len=*), intent(in) :: subcomponent + logical :: integrated + integrated = .false. + select case (subcomponent) + case ('NAM') + integrated = .true. + case ('DIS') + integrated = .true. + case ('DISV') + integrated = .true. + case ('MIP') + integrated = .true. + case default + end select + return + end function prt_idm_integrated + +end module IdmPrtDfnSelectorModule diff --git a/src/Model/ExplicitModel.f90 b/src/Model/ExplicitModel.f90 index 6c23d5a0969..dd829d4d465 100644 --- a/src/Model/ExplicitModel.f90 +++ b/src/Model/ExplicitModel.f90 @@ -22,7 +22,7 @@ module ExplicitModelModule !< type, extends(BaseModelType) :: ExplicitModelType character(len=LINELENGTH), pointer :: filename => null() !< input file name - integer(I4B), dimension(:), pointer, contiguous :: ibound => null() !< ibound array + integer(I4B), dimension(:), pointer, contiguous :: ibound => null() !< ibound type(ListType), pointer :: bndlist => null() !< array of boundary packages class(DisBaseType), pointer :: dis => null() !< discretization object contains diff --git a/src/Model/GroundWaterFlow/gwf-disv.f90 b/src/Model/GroundWaterFlow/gwf-disv.f90 index 41237ddacf8..63752778967 100644 --- a/src/Model/GroundWaterFlow/gwf-disv.f90 +++ b/src/Model/GroundWaterFlow/gwf-disv.f90 @@ -1370,7 +1370,7 @@ subroutine get_polyverts(this, ic, polyverts, closed) class(GwfDisvType), intent(inout) :: this integer(I4B), intent(in) :: ic !< cell number (reduced) real(DP), allocatable, intent(out) :: polyverts(:, :) !< polygon vertices (column-major indexing) - logical(LGP), intent(in), optional :: closed !< whether to close the polygon, duplicating a vertex + logical(LGP), intent(in), optional :: closed !< whether to close the polygon, duplicating a vertex (default false) ! -- local integer(I4B) :: icu, icu2d, iavert, ncpl, nverts, m, j logical(LGP) :: lclosed diff --git a/src/Model/GroundWaterFlow/gwf-mvr.f90 b/src/Model/GroundWaterFlow/gwf-mvr.f90 index cf536f3c4e1..0e9fd9594ce 100644 --- a/src/Model/GroundWaterFlow/gwf-mvr.f90 +++ b/src/Model/GroundWaterFlow/gwf-mvr.f90 @@ -599,7 +599,6 @@ end subroutine mvr_ot_printflow subroutine mvr_ot_bdsummary(this, ibudfl) ! -- modules use TdisModule, only: kstp, kper, delt, totim - use ArrayHandlersModule, only: ifind, expandarray ! -- dummy class(GwfMvrType) :: this integer(I4B), intent(in) :: ibudfl diff --git a/src/Model/ModelUtilities/FlowModelInterface.f90 b/src/Model/ModelUtilities/FlowModelInterface.f90 index 993a70f34c4..f1f2e2cd049 100644 --- a/src/Model/ModelUtilities/FlowModelInterface.f90 +++ b/src/Model/ModelUtilities/FlowModelInterface.f90 @@ -425,7 +425,7 @@ subroutine read_packagedata(this) call openfile(inunit, this%iout, fname, 'DATA(BINARY)', FORM, & ACCESS, 'UNKNOWN') this%iumvr = inunit - call budgetobject_cr_bfr(this%mvrbudobj, 'MVT', this%iumvr, & ! kluge note: MVT? + call budgetobject_cr_bfr(this%mvrbudobj, 'MVT', this%iumvr, & this%iout) call this%mvrbudobj%fill_from_bfr(this%dis, this%iout) case default @@ -537,7 +537,7 @@ subroutine advance_bfr(this) if (this%bfr%kstp > 1 .and. (kstp /= this%bfr%kstp)) then write (errmsg, '(4x,a)') 'TIME STEP NUMBER IN BUDGET FILE & &DOES NOT MATCH TIME STEP NUMBER IN TRANSPORT MODEL. IF THERE & - &IS MORE THAN ONE TIME STEP IN THE BUDGET FILE FOR A GIVEN STRESS & + &IS MORE THAN ONE TIME STEP IN THE BUDGET FILE FOR A GIVEN STRESS & &PERIOD, BUDGET FILE TIME STEPS MUST MATCH GWT MODEL TIME STEPS & &ONE-FOR-ONE IN THAT STRESS PERIOD.' call store_error(errmsg) diff --git a/src/Model/ModelUtilities/ModelPackageInput.f90 b/src/Model/ModelUtilities/ModelPackageInput.f90 index ae0c6708eb5..9ff1ba3f855 100644 --- a/src/Model/ModelUtilities/ModelPackageInput.f90 +++ b/src/Model/ModelUtilities/ModelPackageInput.f90 @@ -18,6 +18,8 @@ module ModelPackageInputModule GWE_BASEPKG, GWE_MULTIPKG use SwfModule, only: SWF_NBASEPKG, SWF_NMULTIPKG, & SWF_BASEPKG, SWF_MULTIPKG + use PrtModule, only: PRT_NBASEPKG, PRT_NMULTIPKG, & + PRT_BASEPKG, PRT_MULTIPKG implicit none @@ -48,22 +50,22 @@ subroutine supported_model_packages(mtype, pkgtypes, numpkgs) numpkgs = GWF_NBASEPKG + GWF_NMULTIPKG allocate (pkgtypes(numpkgs)) pkgtypes = [GWF_BASEPKG, GWF_MULTIPKG] - ! case ('GWT6') numpkgs = GWT_NBASEPKG + GWT_NMULTIPKG allocate (pkgtypes(numpkgs)) pkgtypes = [GWT_BASEPKG, GWT_MULTIPKG] - ! case ('GWE6') numpkgs = GWE_NBASEPKG + GWE_NMULTIPKG allocate (pkgtypes(numpkgs)) pkgtypes = [GWE_BASEPKG, GWE_MULTIPKG] - ! + case ('PRT6') + numpkgs = PRT_NBASEPKG + PRT_NMULTIPKG + allocate (pkgtypes(numpkgs)) + pkgtypes = [PRT_BASEPKG, PRT_MULTIPKG] case ('SWF6') numpkgs = SWF_NBASEPKG + SWF_NMULTIPKG allocate (pkgtypes(numpkgs)) pkgtypes = [SWF_BASEPKG, SWF_MULTIPKG] - ! case default end select ! @@ -112,6 +114,14 @@ function multi_package_type(mtype_component, ptype_component, pkgtype) & end if end do ! + case ('PRT') + do n = 1, PRT_NMULTIPKG + if (PRT_MULTIPKG(n) == pkgtype) then + multi_package = .true. + exit + end if + end do + ! case default end select ! diff --git a/src/Model/ModelUtilities/TimeSelect.f90 b/src/Model/ModelUtilities/TimeSelect.f90 new file mode 100644 index 00000000000..3d8057b971b --- /dev/null +++ b/src/Model/ModelUtilities/TimeSelect.f90 @@ -0,0 +1,167 @@ +!> @brief Specify times for some event(s) to occur. +module TimeSelectModule + + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: DZERO, DONE + use ArrayHandlersModule, only: ExpandArray + use ErrorUtilModule, only: pstop + implicit none + public :: TimeSelectType + + !> @brief Represents a series of instants at which some event should occur. + !! + !! Supports selection e.g. to filter times in a selected period & time step. + !! Array storage can be expanded as needed. Note: array expansion must take + !! place before selection; when expand() is invoked the selection is cleared. + !! The time series is assumed to strictly increase, increasing() checks this. + !< + type :: TimeSelectType + real(DP), allocatable :: times(:) + integer(I4B) :: selection(2) + contains + procedure :: destroy + procedure :: expand + procedure :: init + procedure :: increasing + procedure :: select + procedure :: try_advance + end type TimeSelectType + +contains + + !> @brief Destroy the time selection object. + subroutine destroy(this) + class(TimeSelectType) :: this + deallocate (this%times) + end subroutine destroy + + !> @brief Expand capacity by the given amount. Resets the current slice. + subroutine expand(this, increment) + class(TimeSelectType) :: this + integer(I4B), optional, intent(in) :: increment + call ExpandArray(this%times, increment=increment) + this%selection = (/1, size(this%times)/) + end subroutine expand + + !> @brief Initialize or clear the time selection object. + subroutine init(this) + class(TimeSelectType) :: this + if (.not. allocated(this%times)) allocate (this%times(0)) + this%selection = (/0, 0/) + end subroutine + + !> @brief Determine if times strictly increase. + !! Returns true if empty or not yet allocated. + function increasing(this) result(inc) + class(TimeSelectType) :: this + logical(LGP) :: inc + integer(I4B) :: i + real(DP) :: l, t + + inc = .true. + if (.not. allocated(this%times)) return + do i = 1, size(this%times) + t = this%times(i) + if (i /= 1) then + if (l >= t) then + inc = .false. + return + end if + end if + l = t + end do + end function increasing + + !> @brief Select times between t0 and t1 (inclusive). + !! + !! Finds and stores the index of the first time at the same instant + !! as or following the start time, and of the last time at the same + !! instant as or preceding the end time. Allows filtering the times + !! for e.g. a particular stress period and time step. Array indices + !! are assumed to start at 1. If no times are found to fall within + !! the selection (i.e. it falls entirely between two consecutive + !! times or beyond the time range), indices are set to [-1, -1]. + !! + !! The given start and end times are first checked against currently + !! stored indices to avoid recalculating them if possible, allowing + !! multiple consuming components (e.g., subdomain particle tracking + !! solutions) to share the object efficiently, provided all proceed + !! through stress periods and time steps in lockstep, i.e. they all + !! solve any given period/step before any will proceed to the next. + !< + subroutine select(this, t0, t1, changed) + ! -- dummy + class(TimeSelectType) :: this + real(DP), intent(in) :: t0, t1 + logical(LGP), intent(inout), optional :: changed + ! -- local + integer(I4B) :: i, i0, i1 + integer(I4B) :: l, u, lp, up + real(DP) :: t + + ! -- by default, need to iterate over all times + i0 = 1 + i1 = size(this%times) + + ! -- if no times fall within the slice, set to [-1, -1] + l = -1 + u = -1 + + ! -- previous bounding indices + lp = this%selection(1) + up = this%selection(2) + + ! -- Check if we can reuse either the lower or upper bound. + ! The lower doesn't need to change if it indexes the 1st + ! time simultaneous with or later than the slice's start. + ! The upper doesn't need to change if it indexes the last + ! time before or simultaneous with the slice's end. + if (lp > 0 .and. up > 0) then + if (lp > 1) then + if (this%times(lp - 1) < t0 .and. & + this%times(lp) >= t0) then + l = lp + i0 = l + end if + end if + if (up > 1 .and. up < i1) then + if (this%times(up + 1) > t1 .and. & + this%times(up) <= t1) then + u = up + i1 = u + end if + end if + if (l == lp .and. u == up) then + this%selection = (/l, u/) + if (present(changed)) changed = .false. + return + end if + end if + + ! -- recompute bounding indices if needed + do i = i0, i1 + t = this%times(i) + if (l < 0 .and. t >= t0 .and. t <= t1) l = i + if (l > 0 .and. t <= t1) u = i + end do + this%selection = (/l, u/) + if (present(changed)) changed = l /= lp .or. u /= up + + end subroutine + + !> @brief Update the selection to match the current time step. + subroutine try_advance(this) + ! -- modules + use TdisModule, only: kper, kstp, nper, nstp, totimc, delt + ! -- dummy + class(TimeSelectType) :: this + ! -- local + real(DP) :: l, u + l = minval(this%times) + u = maxval(this%times) + if (.not. (kper == 1 .and. kstp == 1)) l = totimc + if (.not. (kper == nper .and. kstp == nstp(kper))) u = totimc + delt + call this%select(l, u) + end subroutine try_advance + +end module TimeSelectModule diff --git a/src/Model/ModelUtilities/TrackData.f90 b/src/Model/ModelUtilities/TrackData.f90 new file mode 100644 index 00000000000..b9b6006ebd6 --- /dev/null +++ b/src/Model/ModelUtilities/TrackData.f90 @@ -0,0 +1,324 @@ +module TrackModule + + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: DZERO, DONE + use ParticleModule, only: ParticleType + + implicit none + + private save_record + public :: TrackFileType + public :: TrackFileControlType + + !> @brief Output file containing all or some particle pathlines. + !! + !! Can be associated with a particle release point (PRP) package + !! or with an entire model, and can be binary or comma-separated. + !< + type :: TrackFileType + integer(I4B) :: iun = 0 !< file unit number + logical(LGP) :: csv = .false. !< whether the file is binary or CSV + integer(I4B) :: iprp = -1 !< -1 is model-level file, 0 is exchange PRP + end type TrackFileType + + !> @brief Manages particle track (i.e. pathline) files. + !! + !! Optionally filters events ("ireason" codes), e.g. release + !! or cell-to-cell transitions. Events ("ireason" codes) are: + !! + !! -1: ALL + !! 0: RELEASE: particle is released + !! 1: TRANSIT: particle moves from cell to cell + !! 2: TIMESTEP: timestep ends + !! 3: TERMINATE: tracking stops for a particle + !! 4: WEAKSINK: particle exits a weak sink + !! 5: USERTIME: user-specified tracking time + !! + !! An arbitrary number of files can be managed. internal arrays + !! are resized as needed. + !< + type :: TrackFileControlType + private + type(TrackFileType), public, allocatable :: trackfiles(:) !< output files + integer(I4B), public :: ntrackfiles !< number of output files + logical(LGP), public :: trackrelease !< track release events + logical(LGP), public :: tracktransit !< track cell-to-cell transitions + logical(LGP), public :: tracktimestep !< track timestep ends + logical(LGP), public :: trackterminate !< track termination events + logical(LGP), public :: trackweaksink !< track weak sink exit events + logical(LGP), public :: trackusertime !< track user-selected times + contains + procedure :: expand + procedure, public :: init_track_file + procedure, public :: save + procedure, public :: set_track_events + end type TrackFileControlType + + ! Track file header + character(len=*), parameter, public :: TRACKHEADER = & + 'kper,kstp,imdl,iprp,irpt,ilay,icell,izone,& + &istatus,ireason,trelease,t,x,y,z,name' + + ! Track file dtypes + character(len=*), parameter, public :: TRACKDTYPES = & + ' @brief Initialize a new track file + subroutine init_track_file(this, iun, csv, iprp) + ! -- dummy + class(TrackFileControlType) :: this + integer(I4B), intent(in) :: iun + logical(LGP), intent(in), optional :: csv + integer(I4B), intent(in), optional :: iprp + ! -- local + type(TrackFileType), pointer :: file + + ! -- allocate or expand array + if (.not. allocated(this%trackfiles)) then + allocate (this%trackfiles(1)) + else + call this%expand(increment=1) + end if + + ! -- setup new file + allocate (file) + file%iun = iun + if (present(csv)) file%csv = csv + if (present(iprp)) file%iprp = iprp + + ! -- update array and counter + this%ntrackfiles = size(this%trackfiles) + this%trackfiles(this%ntrackfiles) = file + + end subroutine init_track_file + + !> @brief Expand the trackfile array, internal use only + subroutine expand(this, increment) + ! -- dummy + class(TrackFileControlType) :: this + integer(I4B), optional, intent(in) :: increment + ! -- local + integer(I4B) :: inclocal + integer(I4B) :: isize + integer(I4B) :: newsize + type(TrackFileType), allocatable, dimension(:) :: temp + + ! -- initialize + if (present(increment)) then + inclocal = increment + else + inclocal = 1 + end if + + ! -- increase size of array + if (allocated(this%trackfiles)) then + isize = size(this%trackfiles) + newsize = isize + inclocal + allocate (temp(newsize)) + temp(1:isize) = this%trackfiles + deallocate (this%trackfiles) + call move_alloc(temp, this%trackfiles) + else + allocate (this%trackfiles(inclocal)) + end if + + end subroutine expand + + !> @brief Save record to binary or CSV file, internal use only + subroutine save_record(iun, particle, kper, kstp, reason, csv) + ! -- dummy + integer(I4B), intent(in) :: iun + type(ParticleType), pointer, intent(in) :: particle + integer(I4B), intent(in) :: kper + integer(I4B), intent(in) :: kstp + integer(I4B), intent(in) :: reason + logical(LGP), intent(in) :: csv + ! -- local + real(DP) :: x + real(DP) :: y + real(DP) :: z + integer(I4B) :: status + + ! -- Get model (global) coordinates + call particle%get_model_coords(x, y, z) + + ! -- Get status + if (particle%istatus .lt. 0) then + status = 1 + else + status = particle%istatus + end if + + if (csv) then + write (iun, '(*(G0,:,","))') & + kper, & + kstp, & + particle%imdl, & + particle%iprp, & + particle%irpt, & + particle%ilay, & + particle%icu, & + particle%izone, & + status, & + reason, & + particle%trelease, & + particle%ttrack, & + x, & + y, & + z, & + trim(adjustl(particle%name)) + else + write (iun) & + kper, & + kstp, & + particle%imdl, & + particle%iprp, & + particle%irpt, & + particle%ilay, & + particle%icu, & + particle%izone, & + status, & + reason, & + particle%trelease, & + particle%ttrack, & + x, & + y, & + z, & + particle%name + end if + + end subroutine + + !> @brief Save the particle's state to track output file(s). + !! + !! A record is saved to all enabled model-level files and to + !! any PRP-level files with PRP index matching the particle's + !! PRP index. + !< + subroutine save(this, particle, kper, kstp, reason, level) + ! -- dummy + class(TrackFileControlType), intent(inout) :: this + type(ParticleType), pointer, intent(in) :: particle + integer(I4B), intent(in) :: kper + integer(I4B), intent(in) :: kstp + integer(I4B), intent(in) :: reason + integer(I4B), intent(in), optional :: level + ! -- local + integer(I4B) :: i + type(TrackFileType) :: file + + ! -- Only save if reporting is enabled for specified event. + if (.not. ((this%trackrelease .and. reason == 0) .or. & + (this%tracktransit .and. reason == 1) .or. & + (this%tracktimestep .and. reason == 2) .or. & + (this%trackterminate .and. reason == 3) .or. & + (this%trackweaksink .and. reason == 4) .or. & + (this%trackusertime .and. reason == 5))) & + return + + ! -- For now, only allow reporting from outside the tracking + ! algorithm (e.g. release time), in which case level will + ! not be provided, or if within the tracking solution, in + ! subcells (level 3) only. This may change if the subcell + ! ever delegates tracking to even smaller subcomponents. + if (present(level)) then + if (level .ne. 3) return + end if + + ! -- Save to any enabled model-scoped or PRP-scoped files + do i = 1, this%ntrackfiles + file = this%trackfiles(i) + if (file%iun > 0 .and. & + (file%iprp == -1 .or. & + file%iprp == particle%iprp)) & + call save_record(file%iun, particle, & + kper, kstp, reason, csv=file%csv) + end do + + end subroutine save + + !> @brief Configure particle events to track. + !! + !! Each tracking event corresponds to an "ireason" code + !! as appears in each row of track output. + !< + subroutine set_track_events(this, & + release, & + transit, & + timestep, & + terminate, & + weaksink, & + usertime) + class(TrackFileControlType) :: this + logical(LGP), intent(in) :: release + logical(LGP), intent(in) :: transit + logical(LGP), intent(in) :: timestep + logical(LGP), intent(in) :: terminate + logical(LGP), intent(in) :: weaksink + logical(LGP), intent(in) :: usertime + this%trackrelease = release + this%tracktransit = transit + this%tracktimestep = timestep + this%trackterminate = terminate + this%trackweaksink = weaksink + this%trackusertime = usertime + end subroutine set_track_events + +end module TrackModule diff --git a/src/Model/NumericalModel.f90 b/src/Model/NumericalModel.f90 index b724e99643e..38a124592d5 100644 --- a/src/Model/NumericalModel.f90 +++ b/src/Model/NumericalModel.f90 @@ -50,6 +50,7 @@ module NumericalModelModule procedure :: model_rp procedure :: model_ad procedure :: model_reset + procedure :: model_solve procedure :: model_cf procedure :: model_fc procedure :: model_ptcchk @@ -123,6 +124,10 @@ subroutine model_reset(this) end subroutine model_reset + subroutine model_solve(this) + class(NumericalModelType) :: this + end subroutine model_solve + subroutine model_cf(this, kiter) class(NumericalModelType) :: this integer(I4B), intent(in) :: kiter diff --git a/src/Model/ParticleTracking/prt-fmi.f90 b/src/Model/ParticleTracking/prt-fmi.f90 new file mode 100644 index 00000000000..5fd7acb5f53 --- /dev/null +++ b/src/Model/ParticleTracking/prt-fmi.f90 @@ -0,0 +1,225 @@ +module PrtFmiModule + + use KindModule, only: DP, I4B + use ConstantsModule, only: DZERO, LENAUXNAME, LENPACKAGENAME + use SimModule, only: store_error, store_error_unit + use SimVariablesModule, only: errmsg + use FlowModelInterfaceModule, only: FlowModelInterfaceType + use BaseDisModule, only: DisBaseType + use BudgetObjectModule, only: BudgetObjectType + + implicit none + private + public :: PrtFmiType + public :: fmi_cr + + character(len=LENPACKAGENAME) :: text = ' PRTFMI' + + type, extends(FlowModelInterfaceType) :: PrtFmiType + + double precision, allocatable, public :: SourceFlows(:) ! cell source flows array + double precision, allocatable, public :: SinkFlows(:) ! cell sink flows array + double precision, allocatable, public :: StorageFlows(:) ! cell storage flows array + double precision, allocatable, public :: BoundaryFlows(:) ! cell boundary flows array + + contains + + procedure :: fmi_ad + procedure :: fmi_df => prtfmi_df + procedure, private :: accumulate_flows + + end type PrtFmiType + +contains + + !> @brief Create a new PrtFmi object + subroutine fmi_cr(fmiobj, name_model, inunit, iout) + ! -- dummy + type(PrtFmiType), pointer :: fmiobj + character(len=*), intent(in) :: name_model + integer(I4B), intent(inout) :: inunit + integer(I4B), intent(in) :: iout + ! + ! -- Create the object + allocate (fmiobj) + ! + ! -- create name and memory path + call fmiobj%set_names(1, name_model, 'FMI', 'FMI') + fmiobj%text = text + ! + ! -- Allocate scalars + call fmiobj%allocate_scalars() + ! + ! -- Set variables + fmiobj%inunit = inunit + fmiobj%iout = iout + ! + ! -- Initialize block parser + call fmiobj%parser%Initialize(fmiobj%inunit, fmiobj%iout) + ! + ! -- Assign dependent variable label + fmiobj%depvartype = 'TRACKS ' + + end subroutine fmi_cr + + !> @brief Time step advance + subroutine fmi_ad(this) + ! -- modules + use ConstantsModule, only: DHDRY + ! -- dummy + class(PrtFmiType) :: this + ! -- local + integer(I4B) :: n + character(len=15) :: nodestr + character(len=*), parameter :: fmtdry = & + &"(/1X,'WARNING: DRY CELL ENCOUNTERED AT ',a,'; RESET AS INACTIVE')" + character(len=*), parameter :: fmtrewet = & + &"(/1X,'DRY CELL REACTIVATED AT ', a)" + ! + ! -- Set flag to indicated that flows are being updated. For the case where + ! flows may be reused (only when flows are read from a file) then set + ! the flag to zero to indicated that flows were not updated + this%iflowsupdated = 1 + ! + ! -- If reading flows from a budget file, read the next set of records + if (this%iubud /= 0) then + call this%advance_bfr() + end if + ! + ! -- If reading heads from a head file, read the next set of records + if (this%iuhds /= 0) then + call this%advance_hfr() + end if + ! + ! -- If mover flows are being read from file, read the next set of records + if (this%iumvr /= 0) then + call this%mvrbudobj%bfr_advance(this%dis, this%iout) + end if + ! + ! -- Accumulate flows + call this%accumulate_flows() + ! + ! -- if flow cell is dry, then set this%ibound = 0 + do n = 1, this%dis%nodes + ! + ! -- Calculate the ibound-like array that has 0 if saturation + ! is zero and 1 otherwise + if (this%gwfsat(n) > DZERO) then + this%ibdgwfsat0(n) = 1 + else + this%ibdgwfsat0(n) = 0 + end if + ! + ! -- Check if active model cell is inactive for flow + if (this%ibound(n) > 0) then + if (this%gwfhead(n) == DHDRY) then + ! -- cell should be made inactive + this%ibound(n) = 0 + call this%dis%noder_to_string(n, nodestr) + write (this%iout, fmtdry) trim(nodestr) + end if + end if + ! + ! -- Convert dry model cell to active if flow has rewet + if (this%ibound(n) == 0) then + if (this%gwfhead(n) /= DHDRY) then + ! -- cell is now wet + this%ibound(n) = 1 + call this%dis%noder_to_string(n, nodestr) + write (this%iout, fmtrewet) trim(nodestr) + end if + end if + end do + + end subroutine fmi_ad + + !> @brief Define the flow model interface + subroutine prtfmi_df(this, dis, idryinactive) + ! -- modules + use SimModule, only: store_error + ! -- dummy + class(PrtFmiType) :: this + class(DisBaseType), pointer, intent(in) :: dis + integer(I4B), intent(in) :: idryinactive + ! + ! -- Call parent class define + call this%FlowModelInterfaceType%fmi_df(dis, idryinactive) + ! + ! -- Allocate arrays + allocate (this%StorageFlows(this%dis%nodes)) ! kluge note: need allocate_arrays subroutine + allocate (this%SourceFlows(this%dis%nodes)) + allocate (this%SinkFlows(this%dis%nodes)) + allocate (this%BoundaryFlows(this%dis%nodes * 10)) ! kluge note: hardwired to max 8 polygon faces plus top and bottom for now + + end subroutine prtfmi_df + + !> @brief Accumulate flows + subroutine accumulate_flows(this) + use GwfDisvModule ! kluge??? + implicit none + ! -- dummy + class(PrtFmiType) :: this + ! -- local + integer :: j, i, ip, ib + integer :: ioffset, iflowface, iauxiflowface !, iface + double precision :: qbnd + character(len=LENAUXNAME) :: auxname + integer(I4B) :: naux + ! + this%StorageFlows = 0d0 + if (this%igwfstrgss /= 0) & + this%StorageFlows = this%StorageFlows + & + this%gwfstrgss + if (this%igwfstrgsy /= 0) & + this%StorageFlows = this%StorageFlows + & + this%gwfstrgsy + ! kluge note: need separate SourceFlows and SinkFlows? just for budget-reporting? + ! kluge note: SinkFlows used to identify weak sinks + this%SourceFlows = 0d0 + this%SinkFlows = 0d0 + this%BoundaryFlows = 0d0 + do ip = 1, this%nflowpack + iauxiflowface = 0 + naux = this%gwfpackages(ip)%naux + if (naux > 0) then + do j = 1, naux + auxname = this%gwfpackages(ip)%auxname(j) + if (trim(adjustl(auxname)) == "IFLOWFACE") then + iauxiflowface = j + exit + ! else if (trim(adjustl(auxname)) == "IFACE") then ! kluge note: allow IFACE and do conversion??? + ! iauxiflowface = -j + ! exit + end if + end do + end if + do ib = 1, this%gwfpackages(ip)%nbound + i = this%gwfpackages(ip)%nodelist(ib) + ! if (this%gwfibound(i) <= 0) cycle + if (this%ibound(i) <= 0) cycle + qbnd = this%gwfpackages(ip)%get_flow(ib) + iflowface = 0 ! kluge note: eventually have default iflowface values for different packages + if (iauxiflowface > 0) then + ! expected int here... ok to round?? + iflowface = NINT(this%gwfpackages(ip)%auxvar(iauxiflowface, ib)) + if (iflowface < 0) iflowface = iflowface + 11 ! bot -> 9, top -> 10; see note re: max faces below + ! else if (iauxiflowface < 0) then ! kluge note: allow IFACE and do conversion??? + ! ! kluge note: is it possible to check for a rectangular-celled grid here??? + ! iface = this%gwfpackages(ip)%auxvar(-iauxiflowface, ib) + ! iflowface = iface ! kluge note: will need to convert + end if + if (iflowface .gt. 0) then + ioffset = (i - 1) * 10 ! kluge note: hardwired for max 8 polygon faces plus top and bottom for now + this%BoundaryFlows(ioffset + iflowface) = & + this%BoundaryFlows(ioffset + iflowface) + qbnd + else if (qbnd .gt. 0d0) then + this%SourceFlows(i) = this%SourceFlows(i) + qbnd + else if (qbnd .lt. 0d0) then + this%SinkFlows(i) = this%SinkFlows(i) + qbnd + end if + end do + end do + + end subroutine accumulate_flows + +end module PrtFmiModule diff --git a/src/Model/ParticleTracking/prt-mip.f90 b/src/Model/ParticleTracking/prt-mip.f90 new file mode 100644 index 00000000000..bb587adff56 --- /dev/null +++ b/src/Model/ParticleTracking/prt-mip.f90 @@ -0,0 +1,150 @@ +module PrtMipModule + + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: DZERO, DONE, LINELENGTH + use NumericalPackageModule, only: NumericalPackageType + use BlockParserModule, only: BlockParserType + use BaseDisModule, only: DisBaseType + use MemoryManagerModule, only: mem_allocate, mem_deallocate + use MemoryManagerExtModule, only: mem_set_value, memorylist_remove + use SimVariablesModule, only: idm_context + use SimModule, only: store_error + use PrtMipInputModule, only: PrtMipParamFoundType + + implicit none + private + public :: PrtMipType + public :: mip_cr + + type, extends(NumericalPackageType) :: PrtMipType + real(DP), dimension(:), pointer, contiguous :: porosity => null() !< aquifer porosity + real(DP), dimension(:), pointer, contiguous :: retfactor => null() !< retardation factor + integer(I4B), dimension(:), pointer, contiguous :: izone => null() !< zone number + integer(I4B), pointer :: zeromethod + contains + procedure :: mip_ar + procedure :: mip_da + procedure :: allocate_scalars + procedure, private :: allocate_arrays + end type PrtMipType + +contains + + !> @brief Create a model input object + subroutine mip_cr(mip, name_model, input_mempath, inunit, iout, dis) + ! -- dummy + type(PrtMipType), pointer :: mip + character(len=*), intent(in) :: name_model + character(len=*), intent(in) :: input_mempath + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + class(DisBaseType), pointer, intent(in) :: dis + ! -- formats + character(len=*), parameter :: fmtheader = & + "(1x, /1x, 'MIP -- MODEL INPUT PACKAGE', & + &' INPUT READ FROM MEMPATH: ', A, /)" + ! + ! -- Create the object + allocate (mip) + ! + ! -- Create name and memory path + call mip%set_names(1, name_model, 'MIP', 'MIP', input_mempath) + ! + ! -- Allocate scalars + call mip%allocate_scalars() + ! + ! -- Set variables + mip%inunit = inunit + mip%iout = iout + ! + ! -- Set pointers + mip%dis => dis + ! + ! -- Print a message identifying the package if enabled + if (inunit > 0) & + write (iout, fmtheader) input_mempath + + end subroutine mip_cr + + !> @brief Deallocate memory + subroutine mip_da(this) + class(PrtMipType) :: this + ! + ! -- Deallocate input memory + call memorylist_remove(this%name_model, 'MIP', idm_context) + ! + ! -- Deallocate parent package + call this%NumericalPackageType%da() + ! + ! -- Deallocate arrays + call mem_deallocate(this%porosity) + call mem_deallocate(this%retfactor) + call mem_deallocate(this%izone) + ! + ! -- Deallocate scalars + call mem_deallocate(this%zeromethod) + end subroutine mip_da + + subroutine allocate_scalars(this) + class(PrtMipType) :: this + call this%NumericalPackageType%allocate_scalars() + call mem_allocate(this%zeromethod, 'IZEROMETHOD', this%memoryPath) + end subroutine allocate_scalars + + !> @brief Allocate arrays + subroutine allocate_arrays(this, nodes) + class(PrtMipType) :: this + integer(I4B), intent(in) :: nodes + ! -- local + integer(I4B) :: i + ! + ! -- Allocate + call mem_allocate(this%porosity, nodes, 'POROSITY', this%memoryPath) + call mem_allocate(this%retfactor, nodes, 'RETFACTOR', this%memoryPath) + call mem_allocate(this%izone, nodes, 'IZONE', this%memoryPath) + ! + do i = 1, nodes + this%porosity(i) = DZERO + this%retfactor(i) = DONE + this%izone(i) = 0 + end do + + end subroutine allocate_arrays + + !> @ brief Initialize package inputs + subroutine mip_ar(this) + ! -- dummy variables + class(PrtMipType), intent(inout) :: this !< PrtMipType object + ! -- local variables + character(len=LINELENGTH) :: errmsg + type(PrtMipParamFoundType) :: found + integer(I4B), dimension(:), pointer, contiguous :: map => null() + ! + ! -- set map to convert user input data into reduced data + if (this%dis%nodes < this%dis%nodesuser) map => this%dis%nodeuser + ! + ! -- Allocate arrays + call this%allocate_arrays(this%dis%nodes) + ! + ! -- Source array inputs from IDM + call mem_set_value(this%porosity, 'POROSITY', this%input_mempath, & + map, found%porosity) + call mem_set_value(this%retfactor, 'RETFACTOR', this%input_mempath, & + map, found%retfactor) + call mem_set_value(this%izone, 'IZONE', this%input_mempath, map, & + found%izone) + ! + ! -- Source scalars + call mem_set_value(this%zeromethod, 'ZERO_METHOD', this%input_mempath, & + found%zero_method) + if (.not. found%zero_method) this%zeromethod = 1 + ! + ! -- Ensure POROSITY was found + if (.not. found%porosity) then + write (errmsg, '(a)') 'Error in GRIDDATA block: POROSITY not found' + call store_error(errmsg) + end if + + end subroutine mip_ar + +end module PrtMipModule diff --git a/src/Model/ParticleTracking/prt-obs.f90 b/src/Model/ParticleTracking/prt-obs.f90 new file mode 100644 index 00000000000..b39beefa478 --- /dev/null +++ b/src/Model/ParticleTracking/prt-obs.f90 @@ -0,0 +1,235 @@ +module PrtObsModule + + use KindModule, only: DP, I4B + use ConstantsModule, only: LINELENGTH, MAXOBSTYPES + use BaseDisModule, only: DisBaseType + use ObserveModule, only: ObserveType + use ObsModule, only: ObsType + use SimModule, only: count_errors, store_error, & + store_error_unit + implicit none + + private + public :: PrtObsType, prt_obs_cr + + type, extends(ObsType) :: PrtObsType + ! -- Private members + real(DP), dimension(:), pointer, contiguous, private :: x => null() !< concentration + real(DP), dimension(:), pointer, contiguous, private :: flowja => null() !< intercell flows + contains + ! -- Public procedures + procedure, public :: prt_obs_ar + procedure, public :: obs_bd => prt_obs_bd + procedure, public :: obs_df => prt_obs_df + procedure, public :: obs_rp => prt_obs_rp + procedure, public :: obs_da => prt_obs_da + ! -- Private procedures + procedure, private :: set_pointers + end type PrtObsType + +contains + + !> @brief Create a new PrtObsType object + subroutine prt_obs_cr(obs, inobs) + ! -- dummy + type(PrtObsType), pointer, intent(out) :: obs + integer(I4B), pointer, intent(in) :: inobs + ! + allocate (obs) + call obs%allocate_scalars() + obs%active = .false. + obs%inputFilename = '' + obs%inUnitObs => inobs + + end subroutine prt_obs_cr + + !> @brief Allocate and read + subroutine prt_obs_ar(this, x, flowja) + ! -- dummy + class(PrtObsType), intent(inout) :: this + real(DP), dimension(:), pointer, contiguous, intent(in) :: x + real(DP), dimension(:), pointer, contiguous, intent(in) :: flowja + ! + ! Call ar method of parent class + call this%obs_ar() + ! + ! set pointers + call this%set_pointers(x, flowja) + + end subroutine prt_obs_ar + + !> @brief Define package + subroutine prt_obs_df(this, iout, pkgname, filtyp, dis) + ! -- dummy + class(PrtObsType), intent(inout) :: this + integer(I4B), intent(in) :: iout + character(len=*), intent(in) :: pkgname + character(len=*), intent(in) :: filtyp + class(DisBaseType), pointer :: dis + ! -- local + integer(I4B) :: indx + ! + ! Call overridden method of parent class + call this%ObsType%obs_df(iout, pkgname, filtyp, dis) + ! + ! -- StoreObsType arguments are: (ObserveType, cumulative, indx); + ! indx is returned. + ! + ! -- Store obs type and assign procedure pointer for head observation type + call this%StoreObsType('concentration', .false., indx) + this%obsData(indx)%ProcessIdPtr => prt_process_concentration_obs_id + ! + ! -- Store obs type and assign procedure pointer for flow-ja-face observation type + call this%StoreObsType('flow-ja-face', .true., indx) + this%obsData(indx)%ProcessIdPtr => prt_process_intercell_obs_id + + end subroutine prt_obs_df + + !> @brief Save observations + subroutine prt_obs_bd(this) + ! -- dummy + class(PrtObsType), intent(inout) :: this + ! -- local + integer(I4B) :: i, jaindex, nodenumber + character(len=100) :: msg + class(ObserveType), pointer :: obsrv => null() + ! + call this%obs_bd_clear() + ! + ! -- iterate through all PRT observations + if (this%npakobs > 0) then + do i = 1, this%npakobs + obsrv => this%pakobs(i)%obsrv + nodenumber = obsrv%NodeNumber + jaindex = obsrv%JaIndex + select case (obsrv%ObsTypeId) + case ('CONCENTRATION') + call this%SaveOneSimval(obsrv, this%x(nodenumber)) + case ('FLOW-JA-FACE') + call this%SaveOneSimval(obsrv, this%flowja(jaindex)) + case default + msg = 'Error: Unrecognized observation type: '//trim(obsrv%ObsTypeId) + call store_error(msg) + call store_error_unit(this%inUnitObs) + end select + end do + end if + + end subroutine prt_obs_bd + + !> @brief Read and prepare + subroutine prt_obs_rp(this) + class(PrtObsType), intent(inout) :: this + ! Do PRT observations need any checking? If so, add checks here + end subroutine prt_obs_rp + + !> @brief Deallocate + subroutine prt_obs_da(this) + ! -- dummy + class(PrtObsType), intent(inout) :: this + ! + nullify (this%x) + nullify (this%flowja) + call this%ObsType%obs_da() + + end subroutine prt_obs_da + + !> @brief Set pointers + subroutine set_pointers(this, x, flowja) + ! -- dummy + class(PrtObsType), intent(inout) :: this + real(DP), dimension(:), pointer, contiguous, intent(in) :: x + real(DP), dimension(:), pointer, contiguous, intent(in) :: flowja + ! + this%x => x + this%flowja => flowja + + end subroutine set_pointers + + ! -- Procedures related to GWF observations (NOT type-bound) + + subroutine prt_process_concentration_obs_id(obsrv, dis, inunitobs, iout) + ! -- dummy + type(ObserveType), intent(inout) :: obsrv + class(DisBaseType), intent(in) :: dis + integer(I4B), intent(in) :: inunitobs + integer(I4B), intent(in) :: iout + ! -- local + integer(I4B) :: nn1 + integer(I4B) :: icol, istart, istop + character(len=LINELENGTH) :: ermsg, strng + ! + ! -- Initialize variables + strng = obsrv%IDstring + icol = 1 + ! + ! Get node number, with option for ID string to be either node + ! number or lay, row, column (when dis is structured). + nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & + iout, strng, .false.) + ! + if (nn1 > 0) then + obsrv%NodeNumber = nn1 + else + ermsg = 'Error reading data from ID string' + call store_error(ermsg) + call store_error_unit(inunitobs) + end if + + end subroutine prt_process_concentration_obs_id + + subroutine prt_process_intercell_obs_id(obsrv, dis, inunitobs, iout) + ! -- dummy + type(ObserveType), intent(inout) :: obsrv + class(DisBaseType), intent(in) :: dis + integer(I4B), intent(in) :: inunitobs + integer(I4B), intent(in) :: iout + ! -- local + integer(I4B) :: nn1, nn2 + integer(I4B) :: icol, istart, istop, jaidx + character(len=LINELENGTH) :: ermsg, strng + ! formats +70 format('Error: No connection exists between cells identified in text: ', a) + ! + ! -- Initialize variables + strng = obsrv%IDstring + icol = 1 + ! + ! Get node number, with option for ID string to be either node + ! number or lay, row, column (when dis is structured). + nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & + iout, strng, .false.) + ! + if (nn1 > 0) then + obsrv%NodeNumber = nn1 + else + ermsg = 'Error reading data from ID string: '//strng(istart:istop) + call store_error(ermsg) + end if + ! + ! Get node number, with option for ID string to be either node + ! number or lay, row, column (when dis is structured). + nn2 = dis%noder_from_string(icol, istart, istop, inunitobs, & + iout, strng, .false.) + if (nn2 > 0) then + obsrv%NodeNumber2 = nn2 + else + ermsg = 'Error reading data from ID string: '//strng(istart:istop) + call store_error(ermsg) + end if + ! + ! -- store JA index + jaidx = dis%con%getjaindex(nn1, nn2) + if (jaidx == 0) then + write (ermsg, 70) trim(strng) + call store_error(ermsg) + end if + obsrv%JaIndex = jaidx + ! + if (count_errors() > 0) then + call store_error_unit(inunitobs) + end if + + end subroutine prt_process_intercell_obs_id + +end module PrtObsModule diff --git a/src/Model/ParticleTracking/prt-oc.f90 b/src/Model/ParticleTracking/prt-oc.f90 new file mode 100644 index 00000000000..5eabcc00c28 --- /dev/null +++ b/src/Model/ParticleTracking/prt-oc.f90 @@ -0,0 +1,376 @@ +module PrtOcModule + + use BaseDisModule, only: DisBaseType + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: LENMODELNAME, MNORMAL + use OutputControlModule, only: OutputControlType + use OutputControlDataModule, only: OutputControlDataType, ocd_cr + use SimVariablesModule, only: errmsg, warnmsg + use MemoryManagerModule, only: mem_allocate, mem_deallocate, mem_reallocate + use MemoryHelperModule, only: create_mem_path + use ArrayHandlersModule, only: ExpandArray + use BlockParserModule, only: BlockParserType + use InputOutputModule, only: urword, openfile + use TimeSelectModule, only: TimeSelectType + + implicit none + private + public PrtOcType, oc_cr + + !> @ brief Output control for particle tracking models + type, extends(OutputControlType) :: PrtOcType + + integer(I4B), pointer :: itrkout => null() !< binary output file + integer(I4B), pointer :: itrkhdr => null() !< output header file + integer(I4B), pointer :: itrkcsv => null() !< CSV output file + integer(I4B), pointer :: itrktls => null() !< track time list input file + logical(LGP), pointer :: trackrelease => null() !< whether to track release events + logical(LGP), pointer :: tracktransit => null() !< whether to track cell transition events + logical(LGP), pointer :: tracktimestep => null() !< whether to track timestep events + logical(LGP), pointer :: trackterminate => null() !< whether to track termination events + logical(LGP), pointer :: trackweaksink => null() !< whether to track weak sink exit events + logical(LGP), pointer :: trackusertime => null() !< whether to track user-specified times + type(TimeSelectType), pointer :: tracktimes !< user-specified tracking times + + contains + procedure :: oc_ar + procedure :: oc_da => prt_oc_da + procedure :: allocate_scalars => prt_oc_allocate_scalars + procedure :: read_options => prt_oc_read_options + + end type PrtOcType + +contains + + !> @ brief Create an output control object + subroutine oc_cr(ocobj, name_model, inunit, iout) + type(PrtOcType), pointer :: ocobj !< PrtOcType object + character(len=*), intent(in) :: name_model !< name of the model + integer(I4B), intent(in) :: inunit !< unit number for input + integer(I4B), intent(in) :: iout !< unit number for output + + ! -- Create the object + allocate (ocobj) + + ! -- Allocate scalars + call ocobj%allocate_scalars(name_model) + + ! -- Save unit numbers + ocobj%inunit = inunit + ocobj%iout = iout + + ! -- Initialize block parser + call ocobj%parser%Initialize(inunit, iout) + end subroutine oc_cr + + subroutine prt_oc_allocate_scalars(this, name_model) + class(PrtOcType) :: this + character(len=*), intent(in) :: name_model !< name of model + + this%memoryPath = create_mem_path(name_model, 'OC') + + allocate (this%name_model) + call mem_allocate(this%inunit, 'INUNIT', this%memoryPath) + call mem_allocate(this%iout, 'IOUT', this%memoryPath) + call mem_allocate(this%ibudcsv, 'IBUDCSV', this%memoryPath) + call mem_allocate(this%iperoc, 'IPEROC', this%memoryPath) + call mem_allocate(this%iocrep, 'IOCREP', this%memoryPath) + call mem_allocate(this%itrkout, 'ITRKOUT', this%memoryPath) + call mem_allocate(this%itrkhdr, 'ITRKHDR', this%memoryPath) + call mem_allocate(this%itrkcsv, 'ITRKCSV', this%memoryPath) + call mem_allocate(this%itrktls, 'ITRKTLS', this%memoryPath) + call mem_allocate(this%trackrelease, 'ITRACKRLS', this%memoryPath) + call mem_allocate(this%tracktransit, 'ITRACKTRS', this%memoryPath) + call mem_allocate(this%tracktimestep, 'ITRACKTST', this%memoryPath) + call mem_allocate(this%trackterminate, 'ITRACKTER', this%memoryPath) + call mem_allocate(this%trackweaksink, 'ITRACKWSK', this%memoryPath) + call mem_allocate(this%trackusertime, 'ITRACKTLS', this%memoryPath) + + this%name_model = name_model + this%inunit = 0 + this%iout = 0 + this%ibudcsv = 0 + this%iperoc = 0 + this%iocrep = 0 + this%itrkout = 0 + this%itrkhdr = 0 + this%itrkcsv = 0 + this%itrktls = 0 + this%trackrelease = .false. + this%tracktransit = .false. + this%tracktimestep = .false. + this%trackterminate = .false. + this%trackweaksink = .false. + this%trackusertime = .false. + + end subroutine prt_oc_allocate_scalars + + !> @ brief Setup output control variables. + subroutine oc_ar(this, mass, dis, dnodata) + ! -- dummy + class(PrtOcType) :: this !< PrtOcType object + real(DP), dimension(:), pointer, contiguous, intent(in) :: mass !< particle mass + class(DisBaseType), pointer, intent(in) :: dis !< model discretization package + real(DP), intent(in) :: dnodata !< no data value + ! -- local + integer(I4B) :: i, nocdobj, inodata + type(OutputControlDataType), pointer :: ocdobjptr + real(DP), dimension(:), pointer, contiguous :: nullvec => null() + + ! -- Allocate and initialize variables + allocate (this%tracktimes) + call this%tracktimes%init() + inodata = 0 + nocdobj = 2 + allocate (this%ocdobj(nocdobj)) + do i = 1, nocdobj + call ocd_cr(ocdobjptr) + select case (i) + case (1) + call ocdobjptr%init_dbl('BUDGET', nullvec, dis, 'PRINT LAST ', & + 'COLUMNS 10 WIDTH 11 DIGITS 4 GENERAL ', & + this%iout, dnodata) + case (2) + call ocdobjptr%init_dbl('MASS', mass, dis, 'PRINT LAST ', & + 'COLUMNS 10 WIDTH 11 DIGITS 4 GENERAL ', & + this%iout, dnodata) + end select + this%ocdobj(i) = ocdobjptr + deallocate (ocdobjptr) + end do + + ! -- Read options or set defaults if this package not on + if (this%inunit > 0) then + call this%read_options() + end if + end subroutine oc_ar + + subroutine prt_oc_da(this) + ! -- dummy + class(PrtOcType) :: this + ! -- local + integer(I4B) :: i + + call this%tracktimes%destroy() + + do i = 1, size(this%ocdobj) + call this%ocdobj(i)%ocd_da() + end do + deallocate (this%ocdobj) + + deallocate (this%name_model) + call mem_deallocate(this%inunit) + call mem_deallocate(this%iout) + call mem_deallocate(this%ibudcsv) + call mem_deallocate(this%iperoc) + call mem_deallocate(this%iocrep) + call mem_deallocate(this%itrkout) + call mem_deallocate(this%itrkhdr) + call mem_deallocate(this%itrkcsv) + call mem_deallocate(this%itrktls) + call mem_deallocate(this%trackrelease) + call mem_deallocate(this%tracktransit) + call mem_deallocate(this%tracktimestep) + call mem_deallocate(this%trackterminate) + call mem_deallocate(this%trackweaksink) + call mem_deallocate(this%trackusertime) + + end subroutine prt_oc_da + + subroutine prt_oc_read_options(this) + ! -- modules + use OpenSpecModule, only: access, form + use InputOutputModule, only: getunit, openfile, lowcase + use ConstantsModule, only: LINELENGTH + use TrackModule, only: TRACKHEADER, TRACKDTYPES + use SimModule, only: store_error, store_error_unit + use InputOutputModule, only: openfile, getunit + ! -- dummy + class(PrtOcType) :: this + ! -- local + character(len=LINELENGTH) :: keyword + character(len=LINELENGTH) :: keyword2 + character(len=LINELENGTH) :: fname + character(len=:), allocatable :: line + integer(I4B) :: i, ierr, ipos, ios, nlines + real(DP) :: dval + logical(LGP) :: isfound, found, endOfBlock, eventFound, success + type(OutputControlDataType), pointer :: ocdobjptr + ! -- formats + character(len=*), parameter :: fmttrkbin = & + "(4x, 'PARTICLE TRACKS WILL BE SAVED TO BINARY FILE: ', a, /4x, & + &'OPENED ON UNIT: ', I0)" + character(len=*), parameter :: fmttrkcsv = & + "(4x, 'PARTICLE TRACKS WILL BE SAVED TO CSV FILE: ', a, /4x, & + &'OPENED ON UNIT: ', I0)" + + ! -- get options block + call this%parser%GetBlock('OPTIONS', isfound, ierr, & + supportOpenClose=.true., blockRequired=.false.) + + ! -- parse options block if detected + if (isfound) then + write (this%iout, '(/,1x,a,/)') 'PROCESSING OC OPTIONS' + eventFound = .false. + do + call this%parser%GetNextLine(endOfBlock) + if (endOfBlock) exit + call this%parser%GetStringCaps(keyword) + found = .false. + select case (keyword) + case ('BUDGETCSV') + call this%parser%GetStringCaps(keyword2) + if (keyword2 /= 'FILEOUT') then + errmsg = "BUDGETCSV must be followed by FILEOUT and then budget & + &csv file name. Found '"//trim(keyword2)//"'." + call store_error(errmsg) + call this%parser%StoreErrorUnit() + end if + call this%parser%GetString(fname) + this%ibudcsv = GetUnit() + call openfile(this%ibudcsv, this%iout, fname, 'CSV', & + filstat_opt='REPLACE') + found = .true. + case ('TRACK') + call this%parser%GetStringCaps(keyword) + if (keyword == 'FILEOUT') then + ! parse filename + call this%parser%GetString(fname) + ! open binary track output file + this%itrkout = getunit() + call openfile(this%itrkout, this%iout, fname, 'DATA(BINARY)', & + form, access, filstat_opt='REPLACE', & + mode_opt=MNORMAL) + write (this%iout, fmttrkbin) trim(adjustl(fname)), this%itrkout + ! open and write ascii track header file + this%itrkhdr = getunit() + fname = trim(fname)//'.hdr' + call openfile(this%itrkhdr, this%iout, fname, 'CSV', & + filstat_opt='REPLACE', mode_opt=MNORMAL) + write (this%itrkhdr, '(a,/,a)') TRACKHEADER, TRACKDTYPES + else + call store_error('OPTIONAL TRACK KEYWORD MUST BE '// & + 'FOLLOWED BY FILEOUT') + end if + found = .true. + case ('TRACKCSV') + call this%parser%GetStringCaps(keyword) + if (keyword == 'FILEOUT') then + ! parse filename + call this%parser%GetString(fname) + ! open CSV track output file and write headers + this%itrkcsv = getunit() + call openfile(this%itrkcsv, this%iout, fname, 'CSV', & + filstat_opt='REPLACE') + write (this%iout, fmttrkcsv) trim(adjustl(fname)), this%itrkcsv + write (this%itrkcsv, '(a)') TRACKHEADER + else + call store_error('OPTIONAL TRACKCSV KEYWORD MUST BE & + &FOLLOWED BY FILEOUT') + end if + found = .true. + case ('TRACK_ALL') + eventFound = .false. ! defaults set below + found = .true. + case ('TRACK_RELEASE') + this%trackrelease = .true. + eventFound = .true. + found = .true. + case ('TRACK_TRANSIT') + this%tracktransit = .true. + eventFound = .true. + found = .true. + case ('TRACK_TIMESTEP') + this%tracktimestep = .true. + eventFound = .true. + found = .true. + case ('TRACK_TERMINATE') + this%trackterminate = .true. + eventFound = .true. + found = .true. + case ('TRACK_WEAKSINK') + this%trackweaksink = .true. + eventFound = .true. + found = .true. + case ('TRACK_USERTIME') + this%trackusertime = .true. + eventFound = .true. + found = .true. + case ('TRACK_TIMES') + ttloop: do + success = .false. + call this%parser%TryGetDouble(dval, success) + if (.not. success) exit ttloop + call this%tracktimes%expand() + this%tracktimes%times(size(this%tracktimes%times)) = dval + end do ttloop + if (.not. this%tracktimes%increasing()) then + errmsg = "TRACK TIMES MUST STRICTLY INCREASE" + call store_error(errmsg) + call this%parser%StoreErrorUnit(terminate=.true.) + end if + this%trackusertime = .true. + found = .true. + case ('TRACK_TIMESFILE') + call this%parser%GetString(fname) + call openfile(this%itrktls, this%iout, fname, 'TLS') + nlines = 0 + ttfloop: do + read (this%itrktls, '(A)', iostat=ios) line + if (ios /= 0) exit ttfloop + nlines = nlines + 1 + end do ttfloop + call this%tracktimes%expand(nlines) + rewind (this%itrktls) + allocate (character(len=LINELENGTH) :: line) + do i = 1, nlines + read (this%itrktls, '(A)') line + read (line, '(f30.0)') dval + this%tracktimes%times(i) = dval + end do + if (.not. this%tracktimes%increasing()) then + errmsg = "TRACK TIMES MUST STRICTLY INCREASE" + call store_error(errmsg) + call this%parser%StoreErrorUnit(terminate=.true.) + end if + this%trackusertime = .true. + found = .true. + case default + found = .false. + end select + + ! -- check if we're done + if (.not. found) then + do ipos = 1, size(this%ocdobj) + ocdobjptr => this%ocdobj(ipos) + if (keyword == trim(ocdobjptr%cname)) then + found = .true. + exit + end if + end do + if (.not. found) then + errmsg = "UNKNOWN OC OPTION '"//trim(keyword)//"'." + call store_error(errmsg) + call this%parser%StoreErrorUnit() + end if + call this%parser%GetRemainingLine(line) + call ocdobjptr%set_option(line, this%parser%iuactive, this%iout) + end if + end do + + ! -- default to all events + if (.not. eventFound) then + this%trackrelease = .true. + this%tracktransit = .true. + this%tracktimestep = .true. + this%trackterminate = .true. + this%trackweaksink = .true. + this%trackusertime = .true. + end if + + ! -- logging + write (this%iout, '(1x,a)') 'END OF OC OPTIONS' + end if + end subroutine prt_oc_read_options + +end module PrtOcModule diff --git a/src/Model/ParticleTracking/prt-prp.f90 b/src/Model/ParticleTracking/prt-prp.f90 new file mode 100644 index 00000000000..eb7c60e14a7 --- /dev/null +++ b/src/Model/ParticleTracking/prt-prp.f90 @@ -0,0 +1,984 @@ +module PrtPrpModule + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: DZERO, DEM1, DONE, LENFTYPE, LINELENGTH, & + LENBOUNDNAME, LENPAKLOC, TABLEFT, TABCENTER, & + MNORMAL + use BndModule, only: BndType + use ObsModule, only: DefaultObsIdProcessor + use TableModule, only: TableType, table_cr + use TimeSeriesModule, only: TimeSeriesType + use TimeSeriesRecordModule, only: TimeSeriesRecordType + use TimeSeriesLinkModule, only: TimeSeriesLinkType, & + GetTimeSeriesLinkFromList + use BlockParserModule, only: BlockParserType + use PrtFmiModule, only: PrtFmiType + use ParticleModule, only: ParticleType, ParticleStoreType, & + create_particle, create_particle_store + use SimModule, only: count_errors, store_error, store_error_unit, & + store_warning + use SimVariablesModule, only: errmsg, warnmsg + use TrackModule, only: TrackFileControlType + use GeomUtilModule, only: point_in_polygon, get_ijk, get_jk + use MemoryManagerModule, only: mem_allocate, mem_deallocate, & + mem_reallocate + use TimeSelectModule, only: TimeSelectType + + implicit none + + private + public :: PrtPrpType + public :: prp_create + + character(len=LENFTYPE) :: ftype = 'PRP' + character(len=16) :: text = ' PRP' + + !> @brief Particle release point (PRP) package + type, extends(BndType) :: PrtPrpType + type(PrtFmiType), pointer :: fmi => null() !< flow model interface + type(ParticleStoreType), pointer :: particles => null() !< particle store + type(TrackFileControlType), pointer :: trackfilectl => null() !< track file control + integer(I4B), pointer :: nreleasepts => null() !< number of release points + integer(I4B), pointer :: nparticles => null() !< number of particles released + integer(I4B), pointer :: istopweaksink => null() !< weak sink option: 0 = no stop, 1 = stop + integer(I4B), pointer :: istopzone => null() !< optional stop zone number: 0 = no stop zone + integer(I4B), pointer :: idrape => null() !< drape option: 0 = do not drape, 1 = drape to topmost active cell + integer(I4B), pointer :: itrkout => null() !< binary track file + integer(I4B), pointer :: itrkhdr => null() !< track header file + integer(I4B), pointer :: itrkcsv => null() !< CSV track file + integer(I4B), pointer :: irlstls => null() !< release time file + logical(LGP), pointer :: rlsall => null() !< release in all time step + logical(LGP), pointer :: rlsfirst => null() !< release in first time step + logical(LGP), pointer :: rlstimelist => null() !< use global release time + real(DP), pointer :: offset => null() !< release time offset + real(DP), pointer :: stoptime => null() !< stop time for all release points + real(DP), pointer :: stoptraveltime => null() !< stop travel time for all points + integer(I4B), pointer, contiguous :: rlskstp(:) !< time steps selected for release + integer(I4B), pointer, contiguous :: rptnode(:) => null() !< release point reduced nns + integer(I4B), pointer, contiguous :: rptzone(:) => null() !< release point zone numbers + real(DP), pointer, contiguous :: rptx(:) => null() !< release point x coordinates + real(DP), pointer, contiguous :: rpty(:) => null() !< release point y coordinates + real(DP), pointer, contiguous :: rptz(:) => null() !< release point z coordinates + real(DP), pointer, contiguous :: rptmass(:) => null() !< total mass released from point + character(len=LENBOUNDNAME), pointer, contiguous :: rptname(:) => null() !< release point names + type(TimeSelectType), pointer :: releasetimes + + contains + procedure :: prp_allocate_arrays + procedure :: prp_allocate_scalars + procedure :: bnd_ar => prp_ar + procedure :: bnd_ad => prp_ad + procedure :: bnd_rp => prp_rp + procedure :: bnd_cq_simrate => prp_cq_simrate + procedure :: bnd_da => prp_da + procedure :: define_listlabel + procedure :: prp_set_pointers + procedure :: bnd_options => prp_options + procedure :: read_dimensions => prp_read_dimensions + procedure :: prp_read_packagedata + procedure, public :: bnd_obs_supported => prp_obs_supported + procedure, public :: bnd_df_obs => prp_df_obs + end type PrtPrpType + +contains + + !> @brief Create a new particle release point package + subroutine prp_create(packobj, id, ibcnum, inunit, iout, namemodel, & + pakname, mempath, fmi) + ! -- dummy + class(BndType), pointer :: packobj + integer(I4B), intent(in) :: id + integer(I4B), intent(in) :: ibcnum + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + character(len=*), intent(in) :: namemodel + character(len=*), intent(in) :: pakname + character(len=*), intent(in) :: mempath + type(PrtFmiType), pointer :: fmi + ! -- local + type(PrtPrpType), pointer :: prpobj + ! -- formats + character(len=*), parameter :: fmtheader = & + "(1x, /1x, 'PRP -- PARTICLE RELEASE POINT PACKAGE', & + &' INPUT READ FROM MEMPATH: ', A, /)" + + ! -- allocate the object and assign values to object variables + allocate (prpobj) + packobj => prpobj + + ! -- create name and memory path + call packobj%set_names(ibcnum, namemodel, pakname, ftype, mempath) + prpobj%text = text + + ! -- allocate scalars + call prpobj%prp_allocate_scalars() + + ! -- initialize package + call packobj%pack_initialize() + + packobj%inunit = inunit + packobj%iout = iout + packobj%id = id + packobj%ibcnum = ibcnum + packobj%ncolbnd = 4 + packobj%iscloc = 1 + + ! -- store pointer to flow model interface + prpobj%fmi => fmi + + ! -- if prp is enabled, print a message identifying it + if (inunit > 0) write (iout, fmtheader) mempath + end subroutine prp_create + + !> @brief Deallocate memory + subroutine prp_da(this) + class(PrtPrpType) :: this + + ! -- deallocate parent + call this%BndType%bnd_da() + + ! -- deallocate scalars + call mem_deallocate(this%rlsall) + call mem_deallocate(this%rlsfirst) + call mem_deallocate(this%rlstimelist) + call mem_deallocate(this%offset) + call mem_deallocate(this%stoptime) + call mem_deallocate(this%stoptraveltime) + call mem_deallocate(this%istopweaksink) + call mem_deallocate(this%istopzone) + call mem_deallocate(this%idrape) + call mem_deallocate(this%nreleasepts) + call mem_deallocate(this%nparticles) + call mem_deallocate(this%itrkout) + call mem_deallocate(this%itrkhdr) + call mem_deallocate(this%itrkcsv) + call mem_deallocate(this%irlstls) + + ! -- deallocate arrays + call mem_deallocate(this%rptx) + call mem_deallocate(this%rpty) + call mem_deallocate(this%rptz) + call mem_deallocate(this%rptnode) + call mem_deallocate(this%rptmass) + call mem_deallocate(this%rlskstp) + call mem_deallocate(this%rptname, 'RPTNAME', this%memoryPath) + + ! -- deallocate particle store + call this%particles%destroy(this%memoryPath) + deallocate (this%particles) + + ! -- deallocate release time selection + call this%releasetimes%destroy() + deallocate (this%releasetimes) + end subroutine prp_da + + !> @ brief Set pointers to model variables + subroutine prp_set_pointers(this, ibound, izone, trackfilectl) + ! -- dummy variables + class(PrtPrpType) :: this + integer(I4B), dimension(:), pointer, contiguous :: ibound + integer(I4B), dimension(:), pointer, contiguous :: izone + type(TrackFileControlType), pointer :: trackfilectl + + this%ibound => ibound + this%rptzone => izone + this%trackfilectl => trackfilectl + end subroutine prp_set_pointers + + !> @brief Allocate arrays + subroutine prp_allocate_arrays(this, nodelist, auxvar) + ! -- dummy + class(PrtPrpType) :: this + integer(I4B), dimension(:), pointer, contiguous, optional :: nodelist + real(DP), dimension(:, :), pointer, contiguous, optional :: auxvar + ! -- local + integer(I4B) :: nps + + ! -- Allocate particle store, starting with the number + ! of release points (arrays resized if/when needed) + call create_particle_store(this%particles, this%nreleasepts, this%memoryPath) + + ! -- Allocate arrays + call mem_allocate(this%rptx, this%nreleasepts, 'RPTX', this%memoryPath) + call mem_allocate(this%rpty, this%nreleasepts, 'RPTY', this%memoryPath) + call mem_allocate(this%rptz, this%nreleasepts, 'RPTZ', this%memoryPath) + call mem_allocate(this%rptmass, this%nreleasepts, 'RPTMASS', this%memoryPath) + call mem_allocate(this%rptnode, this%nreleasepts, 'RPTNODER', & + this%memoryPath) + call mem_allocate(this%rlskstp, 1, 'RLSKSTP', this%memoryPath) + call mem_allocate(this%rptname, LENBOUNDNAME, this%nreleasepts, & + 'RPTNAME', this%memoryPath) + + ! -- Initialize arrays + this%rlskstp(1) = 1 ! single release in first time step by default + do nps = 1, this%nreleasepts + this%rptmass(nps) = DZERO + end do + end subroutine prp_allocate_arrays + + !> @brief Allocate scalars + subroutine prp_allocate_scalars(this) + class(PrtPrpType) :: this + + ! -- Allocate release time selection + allocate (this%releasetimes) + call this%releasetimes%init() + + ! -- call standard BndType allocate scalars + call this%BndType%allocate_scalars() + + ! -- Allocate scalars for this type + call mem_allocate(this%rlsall, 'RLSALL', this%memoryPath) + call mem_allocate(this%rlsfirst, 'RLSFIRST', this%memoryPath) + call mem_allocate(this%rlstimelist, 'RELEASETIME', this%memoryPath) + call mem_allocate(this%offset, 'OFFSET', this%memoryPath) + call mem_allocate(this%stoptime, 'STOPTIME', this%memoryPath) + call mem_allocate(this%stoptraveltime, 'STOPTRAVELTIME', this%memoryPath) + call mem_allocate(this%istopweaksink, 'ISTOPWEAKSINK', this%memoryPath) + call mem_allocate(this%istopzone, 'ISTOPZONE', this%memoryPath) + call mem_allocate(this%idrape, 'IDRAPE', this%memoryPath) + call mem_allocate(this%nreleasepts, 'NRELEASEPTS', this%memoryPath) + call mem_allocate(this%nparticles, 'NPART', this%memoryPath) + call mem_allocate(this%itrkout, 'ITRKOUT', this%memoryPath) + call mem_allocate(this%itrkhdr, 'ITRKHDR', this%memoryPath) + call mem_allocate(this%itrkcsv, 'ITRKCSV', this%memoryPath) + call mem_allocate(this%irlstls, 'IRLSTLS', this%memoryPath) + + ! -- Set values + this%rlsall = .false. + this%rlsfirst = .false. + this%rlstimelist = .false. + this%offset = DZERO + this%stoptime = huge(1d0) + this%stoptraveltime = huge(1d0) + this%istopweaksink = 0 + this%istopzone = 0 + this%idrape = 0 + this%nreleasepts = 0 + this%nparticles = 0 + this%itrkout = 0 + this%itrkhdr = 0 + this%itrkcsv = 0 + this%irlstls = 0 + end subroutine prp_allocate_scalars + + !> @ brief Allocate and read period data + subroutine prp_ar(this) + ! -- dummy variables + class(PrtPrpType), intent(inout) :: this + ! -- local variables + integer(I4B) :: n + + call this%obs%obs_ar() + call this%BndType%allocate_arrays() + if (this%inamedbound /= 0) then + do n = 1, this%nreleasepts + this%boundname(n) = this%rptname(n) + end do + end if + do n = 1, this%nreleasepts + this%nodelist(n) = this%rptnode(n) + end do + ! if (this%imover /= 0) then + ! allocate(this%pakmvrobj) + ! call this%pakmvrobj%ar(this%maxbound, this%maxbound, this%memoryPath) + ! endif + end subroutine prp_ar + + !> @brief Advance a time step and release particles if appropriate. + !! + !! Releases may be scheduled via a global RELEASETIME, or within a + !! stress period via ALL, FIRST, FREQUENCY or STEPS (with optional + !! FRACTION). If no release option is specified, a single release + !! is conducted at the first moment of the first time step of the + !! first stress period. + !< + subroutine prp_ad(this) + ! -- modules + use TdisModule, only: totimc, delt, kstp + use GwfDisModule, only: GwfDisType + use GwfDisvModule, only: GwfDisvType + ! -- dummy + class(PrtPrpType) :: this + ! -- local + character(len=LINELENGTH) :: errmsg + integer(I4B) :: ic, icu, nps, nts, nrel, & + nreleasets, np, irow, icol, ilay, icpl + real(DP) :: x, y, z, trelease, tend + real(DP), allocatable :: polyverts(:, :) + type(ParticleType), pointer :: particle + + ! -- Check if there's a release to make + if (.not. ( & + ! all time steps? + this%rlsall .or. & + ! first time step? + (this%rlsfirst .and. kstp == 1) .or. & + ! specified time steps? + any(this%rlskstp == kstp) .or. & + ! specified release times? + this%rlstimelist)) return + + if (this%rlstimelist) then + nreleasets = size(this%releasetimes%times) + else + nreleasets = 1 + end if + nrel = this%nreleasepts * nreleasets + + ! -- Reset mass release for time step + do nps = 1, this%nreleasepts + this%rptmass(nps) = DZERO + end do + + ! -- Resize particle store if another set + ! of particles will exceed its capacity + if ((this%nparticles + nrel) > size(this%particles%irpt)) & + call this%particles%resize( & + size(this%particles%irpt) + nrel, & + this%memoryPath) + + ! -- Release a particle from each point... + do nps = 1, this%nreleasepts + ic = this%rptnode(nps) + icu = this%dis%get_nodeuser(ic) + ! -- ...for each release time in the current time step + tsloop: do nts = 1, nreleasets + if (this%rlstimelist) then + trelease = this%releasetimes%times(nts) + tend = totimc + delt + if (trelease < totimc .or. trelease >= tend) cycle tsloop + else + trelease = totimc + this%offset * delt + end if + + np = this%nparticles + 1 + this%nparticles = np + + ! -- Check release point is within the specified cell + ! and not above/below grid top/bottom respectively + x = this%rptx(nps) + y = this%rpty(nps) + z = this%rptz(nps) + call this%dis%get_polyverts(ic, polyverts) + if (.not. point_in_polygon(x, y, polyverts)) then + write (errmsg, '(a,g0,a,g0,a,i0)') & + 'Error: release point (x=', x, ', y=', y, ') is not in cell ', icu + call store_error(errmsg, terminate=.false.) + call store_error_unit(this%inunit, terminate=.true.) + end if + if (z > maxval(this%dis%top)) then + write (errmsg, '(a,g0,a,g0,a,i0)') & + 'Error: release point (z=', z, ') is above grid top ', & + maxval(this%dis%top) + call store_error(errmsg, terminate=.false.) + call store_error_unit(this%inunit, terminate=.true.) + else if (z < minval(this%dis%bot)) then + write (errmsg, '(a,g0,a,g0,a,i0)') & + 'Error: release point (z=', z, ') is below grid bottom ', & + minval(this%dis%bot) + call store_error(errmsg, terminate=.false.) + call store_error_unit(this%inunit, terminate=.true.) + end if + + ! -- Initialize particle and add it to particle store + ! -- Todo: branch depending on exchange PRP or a normal PRP. + ! if exchange PRP, particle identity properties should be + ! passed in (e.g. imdl, iprp, irpt, trelease, name). + ! if normal PRP, imdl and iprp should be set from pointers + ! provided to PRP by PRT model; irpt and trelease as below. + allocate (particle) + call create_particle(particle) + if (size(this%boundname) /= 0) then + particle%name = this%boundname(nps) + else + particle%name = '' + end if + particle%irpt = nps + particle%istopweaksink = this%istopweaksink + particle%istopzone = this%istopzone + particle%icu = icu + select type (dis => this%dis) + type is (GwfDisType) + call get_ijk(icu, dis%nrow, dis%ncol, dis%nlay, irow, icol, ilay) + type is (GwfDisvType) + call get_jk(icu, dis%ncpl, dis%nlay, icpl, ilay) + end select + particle%ilay = ilay + particle%izone = this%rptzone(ic) + particle%istatus = 0 + ! Handle inactive cells + if (this%ibound(ic) == 0) then + ! -- If drape option activated, release in highest active + ! cell vertically below release point. + if (this%idrape /= 0) & + call this%dis%highest_active(ic, this%ibound) + ! -- If returned cell is inactive, do not release particle + if (this%ibound(ic) == 0) & + particle%istatus = 8 ! permanently unreleased + end if + particle%x = x + particle%y = y + particle%z = this%rptz(nps) + particle%trelease = trelease + ! Set stopping time to earlier of times specified by STOPTIME and STOPTRAVELTIME + if (this%stoptraveltime == huge(1d0)) then + particle%tstop = this%stoptime + else + particle%tstop = particle%trelease + this%stoptraveltime + if (this%stoptime < particle%tstop) particle%tstop = this%stoptime + end if + particle%ttrack = particle%trelease + particle%idomain(0) = 0 + particle%iboundary(0) = 0 + particle%idomain(1) = 0 + particle%iboundary(1) = 0 + particle%idomain(2) = ic + particle%iboundary(2) = 0 + particle%idomain(3) = 0 + particle%iboundary(3) = 0 + call this%particles%load_from_particle(particle, np) + + ! -- Accumulate mass release from this point + this%rptmass(nps) = this%rptmass(nps) + DONE + end do tsloop + end do + end subroutine prp_ad + + !> @ brief Read and prepare period data for particle input + subroutine prp_rp(this) + ! -- modules + use TdisModule, only: kper, nper, nstp + use InputOutputModule, only: urword + ! -- dummy variables + class(PrtPrpType), intent(inout) :: this + ! -- local variables + integer(I4B) :: ierr + integer(I4B) :: n, i + integer(I4B) :: lloc, istart, istop, ival + real(DP) :: dval + logical(LGP) :: isfound + logical(LGP) :: endOfBlock + logical(LGP) :: use_last + logical(LGP) :: noperiodblocks + character(len=LINELENGTH) :: keyword + character(len=:), allocatable :: line + ! -- formats + character(len=*), parameter :: fmtblkerr = & + "('Looking for BEGIN PERIOD iper. & + &Found ', a, ' instead.')" + character(len=*), parameter :: fmt_steps = & + "(6x,'TIME STEP(S) ',50(I0,' '))" ! kluge 50 (similar to STEPS in OC)? + character(len=*), parameter :: fmt_freq = & + "(6x,'EVERY ',I0,' TIME STEP(S)')" + character(len=*), parameter :: fmt_fracs = & + "(6x,50(f10.3,' '))" + + ! -- Set ionper to the stress period number for which a new block of data + ! will be read. + if (this%inunit == 0) return + + ! -- get stress period data + noperiodblocks = .false. + if (this%ionper < kper) then + ! -- get period block + call this%parser%GetBlock('PERIOD', isfound, ierr, & + supportOpenClose=.true., & + blockRequired=.false.) + if (isfound) then + ! -- read ionper and check for increasing period numbers + call this%read_check_ionper() + else + ! -- PERIOD block not found + if (ierr < 0) then + if (kper == 1) then + ! -- End of file found; no period data for the simulation. + noperiodblocks = .true. + else + ! -- End of file found; no more period data. + this%ionper = nper + 1 + end if + else + ! -- Found invalid block + call this%parser%GetCurrentLine(line) + write (errmsg, fmtblkerr) adjustl(trim(line)) + call store_error(errmsg, terminate=.TRUE.) + end if + end if + end if + + ! -- If no period data for the simulation default to single + ! release at beginning of first period's first time step. + ! Otherwise read release timing settings from the period + ! data block of the package input file. + if (noperiodblocks) then + if (kper == 1) then + call mem_reallocate(this%rlskstp, 1, & + "RLSKSTP", this%memoryPath) + this%rlsfirst = .true. + use_last = .false. + end if + ! -- If the current stress period matches the + ! block we are reading continue parsing it + else if (this%ionper == kper) then + use_last = .false. + recordloop: do + call this%parser%GetNextLine(endOfBlock) + if (endOfBlock) exit + call this%parser%GetStringCaps(keyword) + select case (keyword) + case ('ALL') + this%rlsall = .true. + case ('STEPS') + call mem_reallocate(this%rlskstp, 0, & + "RLSKSTP", this%memoryPath) + call this%parser%GetRemainingLine(line) + lloc = 1 + stepslistsearch: do + call urword(line, lloc, istart, istop, 2, ival, dval, -1, 0) + if (ival > 0) then + n = size(this%rlskstp) + call mem_reallocate(this%rlskstp, n + 1, & + 'RLSKSTP', this%memoryPath) + this%rlskstp(n + 1) = ival + cycle stepslistsearch + end if + exit stepslistsearch + end do stepslistsearch + case ('FIRST') + this%rlsfirst = .true. + case ('FREQUENCY') + ival = this%parser%GetInteger() + if (ival < 0) then + errmsg = "FREQUENCY must be non-negative" + call store_error(errmsg) + call this%parser%StoreErrorUnit(terminate=.true.) + end if + do i = 1, nstp(this%ionper) + if (mod(i, ival) == 0) then + n = size(this%rlskstp) + call mem_reallocate(this%rlskstp, n + 1, & + 'RLSKSTP', this%memoryPath) + this%rlskstp(n + 1) = i + end if + end do + case ('FRACTION') + dval = this%parser%GetDouble() + this%offset = dval + case default + write (errmsg, '(2a)') & + 'Looking for ALL, STEPS, FIRST, FREQUENCY, or FRACTION. Found: ', & + trim(adjustl(keyword)) + call store_error(errmsg, terminate=.TRUE.) + end select + end do recordloop + else + ! -- else repeat period settings + use_last = .true. + end if + + ! -- write settings to list file + if (.not. any(this%rlskstp > 0)) then + write (this%iout, "(1x,/1x,a)") 'NO PARTICLE RELEASES IN THIS STRESS '// & + 'PERIOD' + else if (use_last) then + write (this%iout, "(1x,/1x,a)") 'REUSING PARTICLE RELEASE SETTINGS '// & + 'FROM LAST STRESS PERIOD' + else + ! -- write particle release setting + write (this%iout, "(1x,/1x,a)", advance='no') 'PARTICLE RELEASE:' + if (any(this%rlskstp > 0)) then + n = size(this%rlskstp) + if (n > 0) write (this%iout, fmt_steps, advance='no') this%rlskstp + end if + write (this%iout, "(1x,a)", advance='no') 'AT OFFSET' + write (this%iout, fmt_fracs) (/this%offset/) + write (this%iout, '(A)') + end if + end subroutine prp_rp + + !> @ brief Calculate flow between package and model. + subroutine prp_cq_simrate(this, hnew, flowja, imover) + ! -- modules + use TdisModule, only: delt + ! -- dummy variables + class(PrtPrpType) :: this + real(DP), dimension(:), intent(in) :: hnew !< todo: mass concentration? + real(DP), dimension(:), intent(inout) :: flowja !< flow between package and model + integer(I4B), intent(in) :: imover !< flag indicating if the mover package is active + ! -- local variables + integer(I4B) :: i + integer(I4B) :: node + integer(I4B) :: idiag + real(DP) :: rrate + + ! -- If no boundaries, skip flow calculations. + if (this%nbound <= 0) return + + ! -- Loop through each boundary calculating flow. + do i = 1, this%nbound + node = this%nodelist(i) + rrate = DZERO + ! -- If cell is no-flow or constant-head, then ignore it. + ! todo: think about condition(s) under which to ignore cell + if (node > 0) then + idiag = this%dis%con%ia(node) + ! todo: think about condition(s) under which to ignore cell + ! -- Calculate the flow rate into the cell. + rrate = this%rptmass(i) * (DONE / delt) ! reciprocal of tstp length + flowja(idiag) = flowja(idiag) + rrate + end if + + ! -- Save simulated value to simvals array. + this%simvals(i) = rrate + end do + end subroutine prp_cq_simrate + + !> @ brief Define list heading written with PRINT_INPUT option + subroutine define_listlabel(this) ! kluge note: update for PRT? + class(PrtPrpType), intent(inout) :: this + + ! -- create the header list label + this%listlabel = trim(this%filtyp)//' NO.' + if (this%dis%ndim == 3) then + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'ROW' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'COL' + elseif (this%dis%ndim == 2) then + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'CELL2D' + else + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'NODE' + end if + write (this%listlabel, '(a, a16)') trim(this%listlabel), 'STRESS RATE' + if (this%inamedbound == 1) then + write (this%listlabel, '(a, a16)') trim(this%listlabel), 'BOUNDARY NAME' + end if + end subroutine define_listlabel + + !> @brief Indicates whether observations are supported. + logical function prp_obs_supported(this) + class(PrtPrpType) :: this + prp_obs_supported = .true. + end function prp_obs_supported + + !> @brief Store supported observations + subroutine prp_df_obs(this) + ! -- dummy + class(PrtPrpType) :: this + ! -- local + integer(I4B) :: indx + call this%obs%StoreObsType('prp', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => DefaultObsIdProcessor + + ! -- Store obs type and assign procedure pointer + ! for to-mvr observation type. + call this%obs%StoreObsType('to-mvr', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => DefaultObsIdProcessor + end subroutine prp_df_obs + + !> @brief Set options specific to PrtPrpType + subroutine prp_options(this, option, found) + use OpenSpecModule, only: access, form + use ConstantsModule, only: MAXCHARLEN, DZERO + use InputOutputModule, only: urword, getunit, openfile + use TrackModule, only: TRACKHEADER, TRACKDTYPES + ! -- dummy + class(PrtPrpType), intent(inout) :: this + character(len=*), intent(inout) :: option + logical, intent(inout) :: found + ! -- locals + real(DP) :: dval + integer(I4B) :: i, ios, nlines + logical(LGP) :: success + character(len=MAXCHARLEN) :: fname + character(len=MAXCHARLEN) :: keyword + character(len=:), allocatable :: line + ! -- formats + character(len=*), parameter :: fmttrkbin = & + "(4x, 'PARTICLE TRACKS WILL BE SAVED TO BINARY FILE: ', a, /4x, & + &'OPENED ON UNIT: ', I0)" + character(len=*), parameter :: fmttrkcsv = & + "(4x, 'PARTICLE TRACKS WILL BE SAVED TO CSV FILE: ', a, /4x, & + &'OPENED ON UNIT: ', I0)" + + select case (option) + case ('STOPTIME') + this%stoptime = this%parser%GetDouble() + found = .true. + case ('STOPTRAVELTIME') + this%stoptraveltime = this%parser%GetDouble() + found = .true. + case ('STOP_AT_WEAK_SINK') + this%istopweaksink = 1 + found = .true. + case ('ISTOPZONE') + this%istopzone = this%parser%GetInteger() + found = .true. + case ('DRAPE') + this%idrape = 1 + found = .true. + case ('RELEASE_TIMES') + rtloop: do + success = .false. + call this%parser%TryGetDouble(dval, success) + if (.not. success) exit rtloop + call this%releasetimes%expand() + this%releasetimes%times(size(this%releasetimes%times)) = dval + end do rtloop + if (.not. this%releasetimes%increasing()) then + errmsg = "RELEASE TIMES MUST STRICTLY INCREASE" + call store_error(errmsg) + call this%parser%StoreErrorUnit(terminate=.true.) + end if + this%rlstimelist = .true. + found = .true. + case ('RELEASE_TIMESFILE') + call this%parser%GetString(fname) + call openfile(this%irlstls, this%iout, fname, 'TLS') + nlines = 0 + rtfloop: do + read (this%irlstls, '(A)', iostat=ios) line + if (ios /= 0) exit rtfloop + nlines = nlines + 1 + end do rtfloop + call this%releasetimes%expand(nlines) + rewind (this%irlstls) + allocate (character(len=LINELENGTH) :: line) + do i = 1, nlines + read (this%irlstls, '(A)') line + read (line, '(f30.0)') dval + this%releasetimes%times(i) = dval + end do + if (.not. this%releasetimes%increasing()) then + errmsg = "RELEASE TIMES MUST STRICTLY INCREASE" + call store_error(errmsg) + call this%parser%StoreErrorUnit(terminate=.true.) + end if + this%rlstimelist = .true. + found = .true. + case ('TRACK') + call this%parser%GetStringCaps(keyword) + if (keyword == 'FILEOUT') then + ! parse filename + call this%parser%GetString(fname) + ! open binary output file + this%itrkout = getunit() + call openfile(this%itrkout, this%iout, fname, 'DATA(BINARY)', & + form, access, filstat_opt='REPLACE', & + mode_opt=MNORMAL) + write (this%iout, fmttrkbin) trim(adjustl(fname)), this%itrkout + ! open and write ascii header spec file + this%itrkhdr = getunit() + fname = trim(fname)//'.hdr' + call openfile(this%itrkhdr, this%iout, fname, 'CSV', & + filstat_opt='REPLACE', mode_opt=MNORMAL) + write (this%itrkhdr, '(a,/,a)') TRACKHEADER, TRACKDTYPES + else + call store_error('OPTIONAL TRACK KEYWORD MUST BE '// & + 'FOLLOWED BY FILEOUT') + end if + found = .true. + case ('TRACKCSV') + call this%parser%GetStringCaps(keyword) + if (keyword == 'FILEOUT') then + ! parse filename + call this%parser%GetString(fname) + ! open CSV output file and write headers + this%itrkcsv = getunit() + call openfile(this%itrkcsv, this%iout, fname, 'CSV', & + filstat_opt='REPLACE') + write (this%iout, fmttrkcsv) trim(adjustl(fname)), this%itrkcsv + write (this%itrkcsv, '(a)') TRACKHEADER + else + call store_error('OPTIONAL TRACKCSV KEYWORD MUST BE & + &FOLLOWED BY FILEOUT') + end if + found = .true. + case default + found = .false. + end select + end subroutine prp_options + + !> @brief Read the packagedata for this package + subroutine prp_read_packagedata(this) + ! -- dummy + class(PrtPrpType), intent(inout) :: this + ! -- local + character(len=LINELENGTH) :: cellid + character(len=LENBOUNDNAME) :: bndName, bndNameTemp + character(len=9) :: cno + logical :: isfound + logical :: endOfBlock + integer(I4B) :: ival + integer(I4B) :: n + integer(I4B) :: ierr + character(len=LENBOUNDNAME), dimension(:), allocatable :: nametxt + integer(I4B), dimension(:), allocatable :: nboundchk + integer(I4B), dimension(:), allocatable :: noder + real(DP), dimension(:), allocatable :: x + real(DP), dimension(:), allocatable :: y + real(DP), dimension(:), allocatable :: z + real(DP), dimension(:), allocatable :: tstop + ! -- format + character(len=*), parameter :: fmttend = & + "('end time (', G0, ') must be greater than or equal to the & + &begin time (', G0, ').')" + + ! -- allocate and initialize temporary variables + allocate (noder(this%nreleasepts)) + allocate (x(this%nreleasepts)) + allocate (y(this%nreleasepts)) + allocate (z(this%nreleasepts)) + allocate (tstop(this%nreleasepts)) + allocate (nametxt(this%nreleasepts)) + allocate (nboundchk(this%nreleasepts)) + + ! -- initialize temporary variables + do n = 1, this%nreleasepts + nboundchk(n) = 0 + end do + + ! -- read particle release point data + ! -- get particle release points block + call this%parser%GetBlock('PACKAGEDATA', isfound, ierr, & + supportopenclose=.true.) + + ! -- parse block if detected + if (isfound) then + write (this%iout, '(/1x,a)') 'PROCESSING '//trim(adjustl(this%packName)) & + //' PACKAGEDATA' + do + call this%parser%GetNextLine(endOfBlock) + if (endOfBlock) exit + ival = this%parser%GetInteger() + n = ival + + if (n < 1 .or. n > this%nreleasepts) then + write (errmsg, '(a,1x,i0,a)') & + 'Release point number must be greater than 0 and less than ', & + 'or equal to', this%nreleasepts, '.' + call store_error(errmsg) + cycle + end if + + ! -- increment nboundchk + nboundchk(n) = nboundchk(n) + 1 + + ! -- node number + call this%parser%GetCellid(this%dis%ndim, cellid) + noder(n) = this%dis%noder_from_cellid(cellid, this%inunit, this%iout) + + ! -- x, y, z coordinates + x(n) = this%parser%GetDouble() + y(n) = this%parser%GetDouble() + z(n) = this%parser%GetDouble() + + ! -- set default boundname + write (cno, '(i9.9)') n + bndName = 'PRP'//cno + + ! -- read boundnames from file, if provided + if (this%inamedbound /= 0) then + call this%parser%GetStringCaps(bndNameTemp) + if (bndNameTemp /= '') & + bndName = bndNameTemp + else + bndName = '' + end if + + ! -- store temp boundnames + nametxt(n) = bndName + end do + + write (this%iout, '(1x,a)') & + 'END OF '//trim(adjustl(this%packName))//' PACKAGEDATA' + + ! -- check for duplicate or missing particle release points + do n = 1, this%nreleasepts + if (nboundchk(n) == 0) then + write (errmsg, '(a,a,1x,i0,a)') 'No data specified for particle ', & + 'release point', n, '.' + call store_error(errmsg) + else if (nboundchk(n) > 1) then + write (errmsg, '(a,1x,i0,1x,a,1x,i0,1x,a)') & + 'Data for particle release point', n, 'specified', nboundchk(n), & + 'times.' + call store_error(errmsg) + end if + end do + else + call store_error('Required packagedata block not found.') + end if + + ! -- terminate if any errors were detected + if (count_errors() > 0) then + call this%parser%StoreErrorUnit() + end if + + ! -- fill particle release point data with data stored in temporary local arrays + do n = 1, this%nreleasepts + this%rptnode(n) = noder(n) + this%rptx(n) = x(n) + this%rpty(n) = y(n) + this%rptz(n) = z(n) + this%rptname(n) = nametxt(n) + end do + + ! -- deallocate local storage + deallocate (noder) + deallocate (x) + deallocate (y) + deallocate (z) + deallocate (tstop) + deallocate (nametxt) + deallocate (nboundchk) + end subroutine prp_read_packagedata + + !> @brief Read package dimensions + subroutine prp_read_dimensions(this) + ! -- dummy + class(PrtPrpType), intent(inout) :: this + ! -- local + character(len=LINELENGTH) :: errmsg, keyword + integer(I4B) :: ierr + logical :: isfound, endOfBlock + + ! -- get dimension block + call this%parser%GetBlock('DIMENSIONS', isfound, ierr, & + supportOpenClose=.true.) + + ! -- parse dimension block if detected + if (isfound) then + write (this%iout, '(1x,a)') 'PROCESSING PARTICLE INPUT DIMENSIONS' + do + call this%parser%GetNextLine(endOfBlock) + if (endOfBlock) exit + call this%parser%GetStringCaps(keyword) + select case (keyword) + case ('NRELEASEPTS') + this%nreleasepts = this%parser%GetInteger() + case default + write (errmsg, & + '(4x,a,a)') '****ERROR. UNKNOWN PARTICLE INPUT DIMENSION: ', & + trim(keyword) + call store_error(errmsg) + call this%parser%StoreErrorUnit() + end select + end do + write (this%iout, '(1x,a)') 'END OF PARTICLE INPUT DIMENSIONS' + else + call store_error('ERROR. REQUIRED DIMENSIONS BLOCK NOT FOUND.') + end if + + ! -- set maxbound and nbound to nreleasepts + this%maxbound = this%nreleasepts + this%nbound = this%nreleasepts + + ! -- allocate arrays for prp package + call this%prp_allocate_arrays() + + ! -- read packagedata + call this%prp_read_packagedata() + end subroutine prp_read_dimensions + +end module PrtPrpModule diff --git a/src/Model/ParticleTracking/prt.f90 b/src/Model/ParticleTracking/prt.f90 new file mode 100644 index 00000000000..91c98536dec --- /dev/null +++ b/src/Model/ParticleTracking/prt.f90 @@ -0,0 +1,1202 @@ +module PrtModule + use KindModule, only: DP, I4B, LGP + use ErrorUtilModule, only: pstop + use InputOutputModule, only: ParseLine, upcase, lowcase + use ConstantsModule, only: LENFTYPE, LENMEMPATH, DZERO, DONE, & + LENPAKLOC, LENPACKAGETYPE, LENBUDTXT, MNORMAL, & + LINELENGTH + use VersionModule, only: write_listfile_header + use NumericalModelModule, only: NumericalModelType + use BaseModelModule, only: BaseModelType + use BndModule, only: BndType, AddBndToList, GetBndFromList + use GwfDisModule, only: GwfDisType + use GwfDisvModule, only: GwfDisvType + use PrtPrpModule, only: PrtPrpType + use PrtFmiModule, only: PrtFmiType + use PrtMipModule, only: PrtMipType + use PrtOcModule, only: PrtOcType + use PrtObsModule, only: PrtObsType + use BudgetModule, only: BudgetType + use ListModule, only: ListType + use ParticleModule, only: ParticleType, create_particle + use TrackModule, only: TrackFileControlType, TrackFileType + use SimModule, only: count_errors, store_error, store_error_filename + use MemoryManagerModule, only: mem_allocate + use MethodModule, only: MethodType + + implicit none + + private + public :: prt_cr + public :: PrtModelType + public :: PRT_NBASEPKG, PRT_NMULTIPKG + public :: PRT_BASEPKG, PRT_MULTIPKG + + integer(I4B), parameter :: NBDITEMS = 1 + character(len=LENBUDTXT), dimension(NBDITEMS) :: budtxt + data budtxt/' STORAGE'/ + + !> @brief Particle tracking (PRT) model + type, extends(NumericalModelType) :: PrtModelType + type(PrtFmiType), pointer :: fmi => null() ! flow model interface + type(PrtMipType), pointer :: mip => null() ! model input package + type(PrtOcType), pointer :: oc => null() ! output control package + type(PrtObsType), pointer :: obs => null() ! observation package + type(BudgetType), pointer :: budget => null() ! budget object + class(MethodType), pointer :: method => null() ! tracking method + type(TrackFileControlType), pointer :: trackfilectl ! track file control + integer(I4B), pointer :: infmi => null() ! unit number FMI + integer(I4B), pointer :: inmip => null() ! unit number MIP + integer(I4B), pointer :: inmvt => null() ! unit number MVT + integer(I4B), pointer :: inmst => null() ! unit number MST + integer(I4B), pointer :: inadv => null() ! unit number ADV + integer(I4B), pointer :: indsp => null() ! unit number DSP + integer(I4B), pointer :: inssm => null() ! unit number SSM + integer(I4B), pointer :: inoc => null() ! unit number OC + integer(I4B), pointer :: inobs => null() ! unit number OBS + integer(I4B), pointer :: nprp => null() ! number of PRP packages in the model + real(DP), dimension(:), pointer, contiguous :: masssto => null() !< particle mass storage in cells, new value + real(DP), dimension(:), pointer, contiguous :: massstoold => null() !< particle mass storage in cells, old value + real(DP), dimension(:), pointer, contiguous :: ratesto => null() !< particle mass storage rate in cells + contains + ! -- Override BaseModelType procs + procedure :: model_df => prt_df + procedure :: model_ar => prt_ar + procedure :: model_rp => prt_rp + procedure :: model_ad => prt_ad + procedure :: model_cq => prt_cq + procedure :: model_bd => prt_bd + procedure :: model_ot => prt_ot + procedure :: model_da => prt_da + procedure :: model_solve => prt_solve + + ! -- Private utilities + procedure :: allocate_scalars + procedure :: allocate_arrays + procedure, private :: package_create + procedure, private :: ftype_check + procedure, private :: prt_ot_flow + procedure, private :: prt_ot_saveflow + procedure, private :: prt_ot_printflow + procedure, private :: prt_ot_dv + procedure, private :: prt_ot_bdsummary + procedure, private :: prt_ot_obs + procedure, private :: prt_cq_sto + procedure, private :: create_packages + procedure, private :: create_bndpkgs + procedure, private :: log_namfile_options + + end type PrtModelType + + !> @brief PRT base package array descriptors + !! + !! PRT6 model base package types. Only listed packages are candidates + !! for input and these will be loaded in the order specified. + !< + integer(I4B), parameter :: PRT_NBASEPKG = 50 + character(len=LENPACKAGETYPE), dimension(PRT_NBASEPKG) :: PRT_BASEPKG + data PRT_BASEPKG/'DIS6 ', 'DISV6', 'DISU6', 'IC6 ', 'MST6 ', & ! 5 + &'ADV6 ', 'DSP6 ', 'SSM6 ', 'MIP6 ', 'CNC6 ', & ! 10 + &'OC6 ', 'OBS6 ', 'FMI6 ', ' ', 'IST6 ', & ! 15 + &'LKT6 ', 'SFT6 ', 'MWT6 ', 'UZT6 ', 'MVT6 ', & ! 20 + &'API6 ', ' ', ' ', ' ', ' ', & ! 25 + 25*' '/ ! 50 + + !> @brief PRT multi package array descriptors + !! + !! PRT6 model multi-instance package types. Only listed packages are + !! candidates for input and these will be loaded in the order specified. + !< + integer(I4B), parameter :: PRT_NMULTIPKG = 50 + character(len=LENPACKAGETYPE), dimension(PRT_NMULTIPKG) :: PRT_MULTIPKG + data PRT_MULTIPKG/'PRP6 ', ' ', ' ', ' ', ' ', & ! 5 + &45*' '/ ! 50 + + ! -- size of supported model package arrays + integer(I4B), parameter :: NIUNIT_PRT = PRT_NBASEPKG + PRT_NMULTIPKG + +contains + + !> @brief Create a new particle tracking model object + subroutine prt_cr(filename, id, modelname) + ! -- modules + use ListsModule, only: basemodellist + use BaseModelModule, only: AddBaseModelToList + use ConstantsModule, only: LINELENGTH, LENPACKAGENAME + use CompilerVersion + use MemoryHelperModule, only: create_mem_path + use MemoryManagerExtModule, only: mem_set_value + use SimVariablesModule, only: idm_context + use GwfNamInputModule, only: GwfNamParamFoundType + ! -- dummy + character(len=*), intent(in) :: filename + integer(I4B), intent(in) :: id + character(len=*), intent(in) :: modelname + ! -- local + type(PrtModelType), pointer :: this + class(BaseModelType), pointer :: model + character(len=LENMEMPATH) :: input_mempath + character(len=LINELENGTH) :: lst_fname + type(GwfNamParamFoundType) :: found + + ! -- Allocate a new PRT Model (this) + allocate (this) + + ! -- Set this before any allocs in the memory manager can be done + this%memoryPath = create_mem_path(modelname) + + ! -- Allocate track control object + allocate (this%trackfilectl) + + ! -- Allocate scalars and add model to basemodellist + call this%allocate_scalars(modelname) + model => this + call AddBaseModelToList(basemodellist, model) + + ! -- Assign variables + this%filename = filename + this%name = modelname + this%macronym = 'PRT' + this%id = id + + ! -- Set input model namfile memory path + input_mempath = create_mem_path(modelname, 'NAM', idm_context) + + ! -- Copy options from input context + call mem_set_value(this%iprpak, 'PRINT_INPUT', input_mempath, & + found%print_input) + call mem_set_value(this%iprflow, 'PRINT_FLOWS', input_mempath, & + found%print_flows) + call mem_set_value(this%ipakcb, 'SAVE_FLOWS', input_mempath, & + found%save_flows) + + ! -- Create the list file + call this%create_lstfile(lst_fname, filename, found%list, & + 'PARTICLE TRACKING MODEL (PRT)') + + ! -- Activate save_flows if found + if (found%save_flows) then + this%ipakcb = -1 + end if + + ! -- Log options + if (this%iout > 0) then + call this%log_namfile_options(found) + end if + + ! -- Create model packages + call this%create_packages() + end subroutine prt_cr + + !> @brief Define packages + !! + !! (1) call df routines for each package + !! (2) set variables and pointers + !< + subroutine prt_df(this) + ! -- modules + use PrtPrpModule, only: PrtPrpType + ! -- dummy + class(PrtModelType) :: this + ! -- local + integer(I4B) :: ip + class(BndType), pointer :: packobj + + ! -- Define packages and utility objects + call this%dis%dis_df() + call this%fmi%fmi_df(this%dis, 1) + call this%oc%oc_df() + call this%budget%budget_df(NIUNIT_PRT, 'MASS', 'M') + + ! -- Define packages and assign iout for time series managers + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_df(this%dis%nodes, this%dis) + packobj%TsManager%iout = this%iout + packobj%TasManager%iout = this%iout + end do + + ! -- Allocate model arrays + call this%allocate_arrays() + + ! -- Store information needed for observations + call this%obs%obs_df(this%iout, this%name, 'PRT', this%dis) + end subroutine prt_df + + !> @brief Allocate and read + !! + !! (1) allocates and reads packages part of this model, + !! (2) allocates memory for arrays part of this model object + !< + subroutine prt_ar(this) + ! -- modules + use ConstantsModule, only: DHNOFLO + use PrtPrpModule, only: PrtPrpType + use PrtMipModule, only: PrtMipType + use MethodPoolModule, only: method_dis, method_disv + ! -- dummy + class(PrtModelType) :: this + ! -- locals + integer(I4B) :: ip + class(BndType), pointer :: packobj + + ! -- Allocate and read modules attached to model + call this%fmi%fmi_ar(this%ibound) + if (this%inmip > 0) call this%mip%mip_ar() + + ! -- set up output control + call this%oc%oc_ar(this%masssto, this%dis, DHNOFLO) + call this%budget%set_ibudcsv(this%oc%ibudcsv) + + ! -- Package input files now open, so allocate and read + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + select type (packobj) + type is (PrtPrpType) + call packobj%prp_set_pointers(this%ibound, this%mip%izone, & + this%trackfilectl) + end select + ! -- Read and allocate package + call packobj%bnd_ar() + end do + + ! -- Initialize tracking method + select type (dis => this%dis) + type is (GwfDisType) + call method_dis%init( & + fmi=this%fmi, & + trackfilectl=this%trackfilectl, & + izone=this%mip%izone, & + flowja=this%flowja, & + porosity=this%mip%porosity, & + retfactor=this%mip%retfactor, & + tracktimes=this%oc%tracktimes) + this%method => method_dis + type is (GwfDisvType) + call method_disv%init( & + fmi=this%fmi, & + trackfilectl=this%trackfilectl, & + izone=this%mip%izone, & + flowja=this%flowja, & + porosity=this%mip%porosity, & + retfactor=this%mip%retfactor, & + tracktimes=this%oc%tracktimes) + this%method => method_disv + method_disv%zeromethod = this%mip%zeromethod + end select + + ! -- Initialize track output files and reporting options + if (this%oc%itrkout > 0) & + call this%trackfilectl%init_track_file(this%oc%itrkout) + if (this%oc%itrkcsv > 0) & + call this%trackfilectl%init_track_file(this%oc%itrkcsv, csv=.true.) + call this%trackfilectl%set_track_events( & + this%oc%trackrelease, & + this%oc%tracktransit, & + this%oc%tracktimestep, & + this%oc%trackterminate, & + this%oc%trackweaksink, & + this%oc%trackusertime) + end subroutine prt_ar + + !> @brief Read and prepare (calls package read and prepare routines) + subroutine prt_rp(this) + use TdisModule, only: readnewdata + ! -- dummy + class(PrtModelType) :: this + ! -- local + class(BndType), pointer :: packobj + integer(I4B) :: ip + + ! -- Check with TDIS on whether or not it is time to RP + if (.not. readnewdata) return + + ! -- Read and prepare + if (this%inoc > 0) call this%oc%oc_rp() + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_rp() + call packobj%bnd_rp_obs() + end do + end subroutine prt_rp + + !> @brief Time step advance (calls package advance subroutines) + subroutine prt_ad(this) + ! -- modules + use SimVariablesModule, only: isimcheck, iFailedStepRetry + ! -- dummy + class(PrtModelType) :: this + class(BndType), pointer :: packobj + ! -- local + integer(I4B) :: irestore + integer(I4B) :: ip, n, i + + ! -- Reset state variable + irestore = 0 + if (iFailedStepRetry > 0) irestore = 1 + + ! -- Copy masssto into massstoold + do n = 1, this%dis%nodes + this%massstoold(n) = this%masssto(n) + end do + + ! -- Advance fmi + call this%fmi%fmi_ad() + + ! -- Advance + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ad() + if (isimcheck > 0) then + call packobj%bnd_ck() + end if + end do + + ! -- Push simulated values to preceding time/subtime step + call this%obs%obs_ad() + ! + ! -- Initialize the flowja array. Flowja is calculated each time, + ! even if output is suppressed. (Flowja represents flow of particle + ! mass and is positive into a cell. Currently, each particle is assigned + ! unit mass.) Flowja is updated continually as particles are tracked + ! over the time step and at the end of the time step. The diagonal + ! position of the flowja array will contain the flow residual. + do i = 1, this%dis%nja + this%flowja(i) = DZERO + end do + end subroutine prt_ad + + !> @brief Calculate intercell flow (flowja) + subroutine prt_cq(this, icnvg, isuppress_output) + ! -- modules + use SparseModule, only: csr_diagsum + use TdisModule, only: delt + use PrtPrpModule, only: PrtPrpType + ! -- dummy + class(PrtModelType) :: this + integer(I4B), intent(in) :: icnvg + integer(I4B), intent(in) :: isuppress_output + ! -- local + integer(I4B) :: i + integer(I4B) :: ip + class(BndType), pointer :: packobj + real(DP) :: tled + + ! -- Flowja is calculated each time, even if output is suppressed. + ! Flowja represents flow of particle mass and is positive into a cell. + ! Currently, each particle is assigned unit mass. + ! + ! -- Reciprocal of time step size. + tled = DONE / delt + ! + ! -- Flowja was updated continually as particles were tracked over the + ! time step. At this point, flowja contains the net particle mass + ! exchanged between cells during the time step. To convert these to + ! flow rates (particle mass per time), divide by the time step size. + do i = 1, this%dis%nja + this%flowja(i) = this%flowja(i) * tled + end do + + ! -- Particle mass storage + call this%prt_cq_sto() + + ! -- Go through packages and call cq routines. Just a formality. + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_cq(this%masssto, this%flowja) + end do + + ! -- Finalize calculation of flowja by adding face flows to the diagonal. + ! This results in the flow residual being stored in the diagonal + ! position for each cell. + call csr_diagsum(this%dis%con%ia, this%flowja) + end subroutine prt_cq + + !> @brief Calculate particle mass storage + subroutine prt_cq_sto(this) + ! -- modules + use TdisModule, only: delt + use PrtPrpModule, only: PrtPrpType + ! -- dummy + class(PrtModelType) :: this + ! -- local + integer(I4B) :: ip + class(BndType), pointer :: packobj + integer(I4B) :: n + integer(I4B) :: np + integer(I4B) :: idiag + integer(I4B) :: istatus + real(DP) :: tled + real(DP) :: rate + + ! -- Reciprocal of time step size. + tled = DONE / delt + + ! -- Particle mass storage rate + do n = 1, this%dis%nodes + this%masssto(n) = DZERO + this%ratesto(n) = DZERO + end do + do ip = 1, this%bndlist%Count() ! kluge note: could accumulate masssto on the fly in prt_solve instead + packobj => GetBndFromList(this%bndlist, ip) + select type (packobj) + type is (PrtPrpType) + do np = 1, packobj%nparticles + istatus = packobj%particles%istatus(np) + ! refine these conditions as necessary + ! (status 8 is permanently unreleased) + if ((istatus > 0) .and. (istatus /= 8)) then + n = packobj%particles%idomain(np, 2) + ! -- Each particle currently assigned unit mass + this%masssto(n) = this%masssto(n) + DONE + end if + end do + end select + end do + do n = 1, this%dis%nodes ! kluge note: set rate to zero and skip inactive nodes? + rate = -(this%masssto(n) - this%massstoold(n)) * tled + this%ratesto(n) = rate + idiag = this%dis%con%ia(n) + this%flowja(idiag) = this%flowja(idiag) + rate + end do + end subroutine prt_cq_sto + + !> @brief Calculate flows and budget + !! + !! (1) Calculate intercell flows (flowja) + !! (2) Calculate package contributions to model budget + !! + !< + subroutine prt_bd(this, icnvg, isuppress_output) + ! -- modules + use TdisModule, only: delt + use BudgetModule, only: rate_accumulator + ! -- dummy + class(PrtModelType) :: this + integer(I4B), intent(in) :: icnvg + integer(I4B), intent(in) :: isuppress_output + ! -- local + integer(I4B) :: ip + class(BndType), pointer :: packobj + real(DP) :: rin + real(DP) :: rout + + ! -- Budget routines (start by resetting). Sole purpose of this section + ! is to add in and outs to model budget. All ins and out for a model + ! should be added here to this%budget. In a subsequent exchange call, + ! exchange flows might also be added. + call this%budget%reset() + call rate_accumulator(this%ratesto, rin, rout) + call this%budget%addentry(rin, rout, delt, budtxt(1), & + isuppress_output, ' PRT') + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_bd(this%budget) + end do + end subroutine prt_bd + + !> @brief Print and/or save model output + subroutine prt_ot(this) + use TdisModule, only: tdis_ot, endofperiod + ! -- dummy + class(PrtModelType) :: this + ! -- local + integer(I4B) :: idvsave + integer(I4B) :: idvprint + integer(I4B) :: icbcfl + integer(I4B) :: icbcun + integer(I4B) :: ibudfl + integer(I4B) :: ipflag + + ! -- Note: particle tracking output is handled elsewhere + + ! -- Set write and print flags + idvsave = 0 + idvprint = 0 + icbcfl = 0 + ibudfl = 0 + if (this%oc%oc_save('CONCENTRATION')) idvsave = 1 + if (this%oc%oc_print('CONCENTRATION')) idvprint = 1 + if (this%oc%oc_save('BUDGET')) icbcfl = 1 + if (this%oc%oc_print('BUDGET')) ibudfl = 1 + icbcun = this%oc%oc_save_unit('BUDGET') + + ! -- Override ibudfl and idvprint flags for nonconvergence + ! and end of period + ibudfl = this%oc%set_print_flag('BUDGET', 1, endofperiod) + idvprint = this%oc%set_print_flag('CONCENTRATION', 1, endofperiod) + + ! -- Calculate and save observations + call this%prt_ot_obs() + + ! -- Save and print flows + call this%prt_ot_flow(icbcfl, ibudfl, icbcun) + + ! -- Save and print dependent variables + call this%prt_ot_dv(idvsave, idvprint, ipflag) + + ! -- Print budget summaries + call this%prt_ot_bdsummary(ibudfl, ipflag) + + ! -- Timing Output; if any dependendent variables or budgets + ! are printed, then ipflag is set to 1. + if (ipflag == 1) call tdis_ot(this%iout) + end subroutine prt_ot + + !> @brief Calculate and save observations + subroutine prt_ot_obs(this) + class(PrtModelType) :: this + class(BndType), pointer :: packobj + integer(I4B) :: ip + + ! -- Calculate and save observations + call this%obs%obs_bd() + call this%obs%obs_ot() + + ! -- Calculate and save package obserations + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_bd_obs() + call packobj%bnd_ot_obs() + end do + end subroutine prt_ot_obs + + !> @brief Save flows + subroutine prt_ot_flow(this, icbcfl, ibudfl, icbcun) + use PrtPrpModule, only: PrtPrpType + class(PrtModelType) :: this + integer(I4B), intent(in) :: icbcfl + integer(I4B), intent(in) :: ibudfl + integer(I4B), intent(in) :: icbcun + class(BndType), pointer :: packobj + integer(I4B) :: ip + + ! -- Save PRT flows + call this%prt_ot_saveflow(this%dis%nja, this%flowja, icbcfl, icbcun) + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ot_model_flows(icbcfl=icbcfl, ibudfl=0, icbcun=icbcun) + end do + + ! -- Save advanced package flows + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ot_package_flows(icbcfl=icbcfl, ibudfl=0) + end do + + ! -- Print PRT flows + call this%prt_ot_printflow(ibudfl, this%flowja) + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ot_model_flows(icbcfl=icbcfl, ibudfl=ibudfl, icbcun=0) + end do + + ! -- Print advanced package flows + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ot_package_flows(icbcfl=0, ibudfl=ibudfl) + end do + end subroutine prt_ot_flow + + !> @brief Save intercell flows + subroutine prt_ot_saveflow(this, nja, flowja, icbcfl, icbcun) + ! -- dummy + class(PrtModelType) :: this + integer(I4B), intent(in) :: nja + real(DP), dimension(nja), intent(in) :: flowja + integer(I4B), intent(in) :: icbcfl + integer(I4B), intent(in) :: icbcun + ! -- local + integer(I4B) :: ibinun + + ! -- Set unit number for binary output + if (this%ipakcb < 0) then + ibinun = icbcun + elseif (this%ipakcb == 0) then + ibinun = 0 + else + ibinun = this%ipakcb + end if + if (icbcfl == 0) ibinun = 0 + + ! -- Write the face flows if requested + if (ibinun /= 0) then + call this%dis%record_connection_array(flowja, ibinun, this%iout) + end if + end subroutine prt_ot_saveflow + + !> @brief Print intercell flows + subroutine prt_ot_printflow(this, ibudfl, flowja) + ! -- modules + use TdisModule, only: kper, kstp + use ConstantsModule, only: LENBIGLINE + ! -- dummy + class(PrtModelType) :: this + integer(I4B), intent(in) :: ibudfl + real(DP), intent(inout), dimension(:) :: flowja + ! -- local + character(len=LENBIGLINE) :: line + character(len=30) :: tempstr + integer(I4B) :: n, ipos, m + real(DP) :: qnm + ! -- formats + character(len=*), parameter :: fmtiprflow = & + "(/,4x,'CALCULATED INTERCELL FLOW & + &FOR PERIOD ', i0, ' STEP ', i0)" + + ! -- Write flowja to list file if requested + if (ibudfl /= 0 .and. this%iprflow > 0) then + write (this%iout, fmtiprflow) kper, kstp + do n = 1, this%dis%nodes + line = '' + call this%dis%noder_to_string(n, tempstr) + line = trim(tempstr)//':' + do ipos = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1 + m = this%dis%con%ja(ipos) + call this%dis%noder_to_string(m, tempstr) + line = trim(line)//' '//trim(tempstr) + qnm = flowja(ipos) + write (tempstr, '(1pg15.6)') qnm + line = trim(line)//' '//trim(adjustl(tempstr)) + end do + write (this%iout, '(a)') trim(line) + end do + end if + end subroutine prt_ot_printflow + + !> @brief Print dependent variables + subroutine prt_ot_dv(this, idvsave, idvprint, ipflag) + ! -- dummy + class(PrtModelType) :: this + integer(I4B), intent(in) :: idvsave + integer(I4B), intent(in) :: idvprint + integer(I4B), intent(inout) :: ipflag + ! -- local + class(BndType), pointer :: packobj + integer(I4B) :: ip + + ! -- Print advanced package dependent variables + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ot_dv(idvsave, idvprint) + end do + + ! -- save head and print head + call this%oc%oc_ot(ipflag) + end subroutine prt_ot_dv + + !> @brief Print budget summary + subroutine prt_ot_bdsummary(this, ibudfl, ipflag) + ! -- modules + use TdisModule, only: kstp, kper, totim + ! -- dummy + class(PrtModelType) :: this + integer(I4B), intent(in) :: ibudfl + integer(I4B), intent(inout) :: ipflag + ! -- local + class(BndType), pointer :: packobj + integer(I4B) :: ip + + ! -- Package budget summary + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_ot_bdsummary(kstp, kper, this%iout, ibudfl) + end do + + ! -- model budget summary + if (ibudfl /= 0) then + ipflag = 1 + ! -- model budget summary + call this%budget%budget_ot(kstp, kper, this%iout) + end if + + ! -- Write to budget csv + call this%budget%writecsv(totim) + end subroutine prt_ot_bdsummary + + !> @brief Deallocate + subroutine prt_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + use MemoryManagerExtModule, only: memorylist_remove + use SimVariablesModule, only: idm_context + use MethodPoolModule, only: destroy_method_pool + use MethodCellPoolModule, only: destroy_method_cell_pool + use MethodSubcellPoolModule, only: destroy_method_subcell_pool + ! -- dummy + class(PrtModelType) :: this + ! -- local + integer(I4B) :: ip + class(BndType), pointer :: packobj + + ! -- Deallocate idm memory + call memorylist_remove(this%name, 'NAM', idm_context) + call memorylist_remove(component=this%name, context=idm_context) + + ! -- Internal packages + call this%dis%dis_da() + call this%fmi%fmi_da() + call this%mip%mip_da() + call this%budget%budget_da() + call this%oc%oc_da() + call this%obs%obs_da() + deallocate (this%dis) + deallocate (this%fmi) + deallocate (this%mip) + deallocate (this%budget) + deallocate (this%oc) + deallocate (this%obs) + + ! -- Method objects + call destroy_method_subcell_pool() + call destroy_method_cell_pool() + call destroy_method_pool() + + ! -- Boundary packages + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + call packobj%bnd_da() + deallocate (packobj) + end do + + ! -- Scalars + call mem_deallocate(this%infmi) + call mem_deallocate(this%inmip) + call mem_deallocate(this%inadv) + call mem_deallocate(this%indsp) + call mem_deallocate(this%inssm) + call mem_deallocate(this%inmst) + call mem_deallocate(this%inmvt) + call mem_deallocate(this%inoc) + call mem_deallocate(this%inobs) + call mem_deallocate(this%nprp) + + ! -- Arrays + call mem_deallocate(this%masssto) + call mem_deallocate(this%massstoold) + call mem_deallocate(this%ratesto) + + ! -- Track file control + deallocate (this%trackfilectl) + + ! -- Parent type + call this%NumericalModelType%model_da() + end subroutine prt_da + + !> @brief Allocate memory for non-allocatable members + subroutine allocate_scalars(this, modelname) + ! -- dummy + class(PrtModelType) :: this + character(len=*), intent(in) :: modelname + + ! -- allocate members from parent class + call this%NumericalModelType%allocate_scalars(modelname) + + ! -- allocate members that are part of model class + call mem_allocate(this%infmi, 'INFMI', this%memoryPath) + call mem_allocate(this%inmip, 'INMIP', this%memoryPath) + call mem_allocate(this%inmvt, 'INMVT', this%memoryPath) + call mem_allocate(this%inmst, 'INMST', this%memoryPath) + call mem_allocate(this%inadv, 'INADV', this%memoryPath) + call mem_allocate(this%indsp, 'INDSP', this%memoryPath) + call mem_allocate(this%inssm, 'INSSM', this%memoryPath) + call mem_allocate(this%inoc, 'INOC ', this%memoryPath) + call mem_allocate(this%inobs, 'INOBS', this%memoryPath) + call mem_allocate(this%nprp, 'NPRP', this%memoryPath) ! kluge? + + this%infmi = 0 + this%inmip = 0 + this%inmvt = 0 + this%inmst = 0 + this%inadv = 0 + this%indsp = 0 + this%inssm = 0 + this%inoc = 0 + this%inobs = 0 + this%nprp = 0 + end subroutine allocate_scalars + + !> @brief Allocate arrays + subroutine allocate_arrays(this) + use MemoryManagerModule, only: mem_allocate + class(PrtModelType) :: this + integer(I4B) :: n + + ! -- Allocate arrays in parent type + this%nja = this%dis%nja + call this%NumericalModelType%allocate_arrays() + + ! -- Allocate and initialize arrays + call mem_allocate(this%masssto, this%dis%nodes, & + 'MASSSTO', this%memoryPath) + call mem_allocate(this%massstoold, this%dis%nodes, & + 'MASSSTOOLD', this%memoryPath) + call mem_allocate(this%ratesto, this%dis%nodes, & + 'RATESTO', this%memoryPath) + ! -- explicit model, so these must be manually allocated + call mem_allocate(this%x, this%dis%nodes, 'X', this%memoryPath) + call mem_allocate(this%rhs, this%dis%nodes, 'RHS', this%memoryPath) + call mem_allocate(this%ibound, this%dis%nodes, 'IBOUND', this%memoryPath) + do n = 1, this%dis%nodes + this%masssto(n) = DZERO + this%massstoold(n) = DZERO + this%ratesto(n) = DZERO + this%x(n) = DZERO + this%rhs(n) = DZERO + this%ibound(n) = 1 + end do + end subroutine allocate_arrays + + !> @brief Create boundary condition packages for this model + subroutine package_create(this, filtyp, ipakid, ipaknum, pakname, mempath, & + inunit, iout) + ! -- modules + use ConstantsModule, only: LINELENGTH + use PrtPrpModule, only: prp_create + use ApiModule, only: api_create + ! -- dummy + class(PrtModelType) :: this + character(len=*), intent(in) :: filtyp + character(len=LINELENGTH) :: errmsg + integer(I4B), intent(in) :: ipakid + integer(I4B), intent(in) :: ipaknum + character(len=*), intent(in) :: pakname + character(len=*), intent(in) :: mempath + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + ! -- local + class(BndType), pointer :: packobj + class(BndType), pointer :: packobj2 + integer(I4B) :: ip + + ! -- This part creates the package object + select case (filtyp) + case ('PRP6') + this%nprp = this%nprp + 1 + call prp_create(packobj, ipakid, ipaknum, inunit, iout, & + this%name, pakname, mempath, this%fmi) + case ('API6') + call api_create(packobj, ipakid, ipaknum, inunit, iout, & + this%name, pakname) + case default + write (errmsg, *) 'Invalid package type: ', filtyp + call store_error(errmsg, terminate=.TRUE.) + end select + + ! -- Packages is the bndlist that is associated with the parent model + ! -- The following statement puts a pointer to this package in the ipakid + ! -- position of packages. + do ip = 1, this%bndlist%Count() + packobj2 => GetBndFromList(this%bndlist, ip) + if (packobj2%packName == pakname) then + write (errmsg, '(a,a)') 'Cannot create package. Package name '// & + 'already exists: ', trim(pakname) + call store_error(errmsg, terminate=.TRUE.) + end if + end do + call AddBndToList(this%bndlist, packobj) + end subroutine package_create + + !> @brief Check to make sure required input files have been specified + subroutine ftype_check(this, indis) + ! -- dummy + class(PrtModelType) :: this + integer(I4B), intent(in) :: indis + ! -- local + character(len=LINELENGTH) :: errmsg + + ! -- Check for DIS(u) and MIP. Stop if not present. + if (indis == 0) then + write (errmsg, '(1x,a)') & + 'Discretization (DIS6, DISV6, or DISU6) package not specified.' + call store_error(errmsg) + end if + if (this%inmip == 0) then + write (errmsg, '(1x,a)') & + 'Model input (MIP6) package not specified.' + call store_error(errmsg) + end if + + if (count_errors() > 0) then + write (errmsg, '(1x,a)') 'One or more required package(s) not specified.' + call store_error(errmsg) + call store_error_filename(this%filename) + end if + end subroutine ftype_check + + !> @brief Solve the model + subroutine prt_solve(this) + ! -- modules + use TdisModule, only: kper, kstp, totimc, totim, nper, nstp + use PrtPrpModule, only: PrtPrpType + ! -- dummy variables + class(PrtModelType) :: this + ! -- local variables + integer(I4B) :: np, ip + class(BndType), pointer :: packobj + type(ParticleType), pointer :: particle + real(DP) :: tmax + integer(I4B) :: iprp + + ! -- Initialize particle + call create_particle(particle) + + ! -- Loop over PRP packages + iprp = 0 + do ip = 1, this%bndlist%Count() + packobj => GetBndFromList(this%bndlist, ip) + select type (packobj) + type is (PrtPrpType) + ! -- Update PRP index + iprp = iprp + 1 + + ! -- Initialize PRP-specific track files, if enabled + if (packobj%itrkout > 0) then + call this%trackfilectl%init_track_file( & + packobj%itrkout, & + iprp=iprp) + end if + if (packobj%itrkcsv > 0) then + call this%trackfilectl%init_track_file( & + packobj%itrkcsv, & + csv=.true., & + iprp=iprp) + end if + + ! -- Loop over particles in package + do np = 1, packobj%nparticles + ! -- Load particle from storage + call particle%load_from_store(packobj%particles, & + this%id, iprp, np) + + ! -- If particle is permanently unreleased, record its initial/terminal state + if (particle%istatus == 8) & + call this%trackfilectl%save(particle, kper=kper, & + kstp=kstp, reason=3) ! reason=3: termination + + ! -- If particle is inactive or not yet to be released, cycle + if (particle%istatus > 1) cycle + + ! -- If particle released this time step, record its initial state + particle%istatus = 1 + if (particle%trelease >= totimc) & + call this%trackfilectl%save(particle, kper=kper, & + kstp=kstp, reason=0) ! reason=0: release + + ! -- Unless in last stress period and it has only one time step, + ! -- limit max time to no later than end of time step + tmax = particle%tstop + if (kper == nper .and. nstp(kper) /= 1 .and. totim < particle%tstop) & + tmax = totim + + ! -- Get and apply the tracking method + call this%method%apply(particle, tmax) + + ! -- Update particle storage + call packobj%particles%load_from_particle(particle, np) + end do + end select + end do + + ! -- Destroy particle + call particle%destroy() + deallocate (particle) + end subroutine prt_solve + + !> @brief Source package info and begin to process + subroutine create_bndpkgs(this, bndpkgs, pkgtypes, pkgnames, & + mempaths, inunits) + ! -- modules + use ConstantsModule, only: LINELENGTH, LENPACKAGENAME + use CharacterStringModule, only: CharacterStringType + ! -- dummy + class(PrtModelType) :: this + integer(I4B), dimension(:), allocatable, intent(inout) :: bndpkgs + type(CharacterStringType), dimension(:), contiguous, & + pointer, intent(inout) :: pkgtypes + type(CharacterStringType), dimension(:), contiguous, & + pointer, intent(inout) :: pkgnames + type(CharacterStringType), dimension(:), contiguous, & + pointer, intent(inout) :: mempaths + integer(I4B), dimension(:), contiguous, & + pointer, intent(inout) :: inunits + ! -- local + integer(I4B) :: ipakid, ipaknum + character(len=LENFTYPE) :: pkgtype, bndptype + character(len=LENPACKAGENAME) :: pkgname + character(len=LENMEMPATH) :: mempath + integer(I4B), pointer :: inunit + integer(I4B) :: n + + if (allocated(bndpkgs)) then + ! + ! -- create stress packages + ipakid = 1 + bndptype = '' + do n = 1, size(bndpkgs) + ! + pkgtype = pkgtypes(bndpkgs(n)) + pkgname = pkgnames(bndpkgs(n)) + mempath = mempaths(bndpkgs(n)) + inunit => inunits(bndpkgs(n)) + ! + if (bndptype /= pkgtype) then + ipaknum = 1 + bndptype = pkgtype + end if + ! + call this%package_create(pkgtype, ipakid, ipaknum, pkgname, mempath, & + inunit, this%iout) + ipakid = ipakid + 1 + ipaknum = ipaknum + 1 + end do + ! + ! -- cleanup + deallocate (bndpkgs) + end if + + end subroutine create_bndpkgs + + !> @brief Source package info and begin to process + subroutine create_packages(this) + ! -- modules + use ConstantsModule, only: LINELENGTH, LENPACKAGENAME + use CharacterStringModule, only: CharacterStringType + use ArrayHandlersModule, only: expandarray + use MemoryManagerModule, only: mem_setptr + use MemoryHelperModule, only: create_mem_path + use SimVariablesModule, only: idm_context + use GwfDisModule, only: dis_cr + use GwfDisvModule, only: disv_cr + use GwfDisuModule, only: disu_cr + use BudgetModule, only: budget_cr + use MethodPoolModule, only: create_method_pool + use MethodCellPoolModule, only: create_method_cell_pool + use MethodSubcellPoolModule, only: create_method_subcell_pool + use PrtMipModule, only: mip_cr + use PrtFmiModule, only: fmi_cr + use PrtOcModule, only: oc_cr + use PrtObsModule, only: prt_obs_cr + ! -- dummy + class(PrtModelType) :: this + ! -- local + type(CharacterStringType), dimension(:), contiguous, & + pointer :: pkgtypes => null() + type(CharacterStringType), dimension(:), contiguous, & + pointer :: pkgnames => null() + type(CharacterStringType), dimension(:), contiguous, & + pointer :: mempaths => null() + integer(I4B), dimension(:), contiguous, & + pointer :: inunits => null() + character(len=LENMEMPATH) :: model_mempath + character(len=LENFTYPE) :: pkgtype + character(len=LENPACKAGENAME) :: pkgname + character(len=LENMEMPATH) :: mempath + integer(I4B), pointer :: inunit + integer(I4B), dimension(:), allocatable :: bndpkgs + integer(I4B) :: n + integer(I4B) :: indis = 0 ! DIS enabled flag + character(len=LENMEMPATH) :: mempathmip = '' + + ! -- set input memory paths, input/model and input/model/namfile + model_mempath = create_mem_path(component=this%name, context=idm_context) + + ! -- set pointers to model path package info + call mem_setptr(pkgtypes, 'PKGTYPES', model_mempath) + call mem_setptr(pkgnames, 'PKGNAMES', model_mempath) + call mem_setptr(mempaths, 'MEMPATHS', model_mempath) + call mem_setptr(inunits, 'INUNITS', model_mempath) + + do n = 1, size(pkgtypes) + ! attributes for this input package + pkgtype = pkgtypes(n) + pkgname = pkgnames(n) + mempath = mempaths(n) + inunit => inunits(n) + + ! -- create dis package first as it is a prerequisite for other packages + select case (pkgtype) + case ('DIS6') + indis = 1 + call dis_cr(this%dis, this%name, mempath, indis, this%iout) + case ('DISV6') + indis = 1 + call disv_cr(this%dis, this%name, mempath, indis, this%iout) + case ('DISU6') + indis = 1 + call disu_cr(this%dis, this%name, mempath, indis, this%iout) + case ('MIP6') + this%inmip = 1 + mempathmip = mempath + case ('FMI6') + this%infmi = inunit + case ('OC6') + this%inoc = inunit + case ('OBS6') + this%inobs = inunit + case ('PRP6') + call expandarray(bndpkgs) + bndpkgs(size(bndpkgs)) = n + case default + call pstop(1, "Unrecognized package type: "//pkgtype) + end select + end do + + ! -- Create budget manager + call budget_cr(this%budget, this%name) + + ! -- Create tracking method pools + call create_method_pool() + call create_method_cell_pool() + call create_method_subcell_pool() + + ! -- Create packages that are tied directly to model + call mip_cr(this%mip, this%name, mempathmip, this%inmip, this%iout, this%dis) + call fmi_cr(this%fmi, this%name, this%infmi, this%iout) + call oc_cr(this%oc, this%name, this%inoc, this%iout) + call prt_obs_cr(this%obs, this%inobs) + + ! -- Check to make sure that required ftype's have been specified + call this%ftype_check(indis) + + ! -- Create boundary packages + call this%create_bndpkgs(bndpkgs, pkgtypes, pkgnames, mempaths, inunits) + end subroutine create_packages + + !> @brief Write model namfile options to list file + subroutine log_namfile_options(this, found) + use GwfNamInputModule, only: GwfNamParamFoundType + class(PrtModelType) :: this + type(GwfNamParamFoundType), intent(in) :: found + + write (this%iout, '(1x,a)') 'NAMEFILE OPTIONS:' + + if (found%newton) then + write (this%iout, '(4x,a)') & + 'NEWTON-RAPHSON method enabled for the model.' + if (found%under_relaxation) then + write (this%iout, '(4x,a,a)') & + 'NEWTON-RAPHSON UNDER-RELAXATION based on the bottom ', & + 'elevation of the model will be applied to the model.' + end if + end if + + if (found%print_input) then + write (this%iout, '(4x,a)') 'STRESS PACKAGE INPUT WILL BE PRINTED '// & + 'FOR ALL MODEL STRESS PACKAGES' + end if + + if (found%print_flows) then + write (this%iout, '(4x,a)') 'PACKAGE FLOWS WILL BE PRINTED '// & + 'FOR ALL MODEL PACKAGES' + end if + + if (found%save_flows) then + write (this%iout, '(4x,a)') & + 'FLOWS WILL BE SAVED TO BUDGET FILE SPECIFIED IN OUTPUT CONTROL' + end if + + write (this%iout, '(1x,a)') 'END NAMEFILE OPTIONS:' + end subroutine log_namfile_options + +end module PrtModule diff --git a/src/Model/TransportModel/tsp-mvt.f90 b/src/Model/TransportModel/tsp-mvt.f90 index a0b1530dc80..f16961666b2 100644 --- a/src/Model/TransportModel/tsp-mvt.f90 +++ b/src/Model/TransportModel/tsp-mvt.f90 @@ -478,7 +478,6 @@ end subroutine mvt_ot_printflow subroutine mvt_ot_bdsummary(this, ibudfl) ! -- modules use TdisModule, only: kstp, kper, delt, totim - use ArrayHandlersModule, only: ifind, expandarray ! -- dummy class(TspMvtType) :: this integer(I4B), intent(in) :: ibudfl diff --git a/src/Model/TransportModel/tsp.f90 b/src/Model/TransportModel/tsp.f90 index 2f2eb9f70a6..82d49c1dd67 100644 --- a/src/Model/TransportModel/tsp.f90 +++ b/src/Model/TransportModel/tsp.f90 @@ -721,7 +721,6 @@ subroutine create_tsp_packages(this, indis) ! -- modules use ConstantsModule, only: LINELENGTH, LENPACKAGENAME use CharacterStringModule, only: CharacterStringType - use ArrayHandlersModule, only: expandarray use MemoryManagerModule, only: mem_setptr use MemoryHelperModule, only: create_mem_path use SimVariablesModule, only: idm_context diff --git a/src/SimulationCreate.f90 b/src/SimulationCreate.f90 index 81451c187ee..c25c11a9920 100644 --- a/src/SimulationCreate.f90 +++ b/src/SimulationCreate.f90 @@ -1,9 +1,9 @@ module SimulationCreateModule use KindModule, only: DP, I4B, LGP, write_kindinfo + use DevFeatureModule, only: dev_feature use ConstantsModule, only: LINELENGTH, LENMODELNAME, LENBIGLINE, & DZERO, LENEXCHANGENAME, LENMEMPATH, LENPACKAGETYPE - use CharacterStringModule, only: CharacterStringType use SimVariablesModule, only: iout, simulation_mode, proc_id, & nr_procs, model_names, model_ranks, & @@ -215,10 +215,12 @@ subroutine models_create() use GwtModule, only: gwt_cr use GweModule, only: gwe_cr use SwfModule, only: swf_cr + use PrtModule, only: prt_cr use NumericalModelModule, only: NumericalModelType, GetNumericalModelFromList use VirtualGwfModelModule, only: add_virtual_gwf_model use VirtualGwtModelModule, only: add_virtual_gwt_model use VirtualGweModelModule, only: add_virtual_gwe_model + ! use VirtualPrtModelModule, only: add_virtual_prt_model use ConstantsModule, only: LENMODELNAME ! -- dummy ! -- locals @@ -314,7 +316,15 @@ subroutine models_create() num_model => GetNumericalModelFromList(basemodellist, im) model_loc_idx(n) = im end if - !todo call add_virtual_gwt_model(n, model_names(n), num_model) + case ('PRT6') + im = im + 1 + write (iout, '(4x,2a,i0,a)') trim(model_type), ' model ', & + n, ' will be created' + call prt_cr(fname, n, model_names(n)) + call dev_feature("PRT is still under development, install the' & + &nightly build or compile from source with IDEVELOPMODE = 1.") + num_model => GetNumericalModelFromList(basemodellist, im) + model_loc_idx(n) = im case default write (errmsg, '(a,a)') & 'Unknown simulation model type: ', trim(model_type) @@ -346,12 +356,14 @@ subroutine exchanges_create() use GwfGwfExchangeModule, only: gwfexchange_create use GwfGwtExchangeModule, only: gwfgwt_cr use GwfGweExchangeModule, only: gwfgwe_cr + use GwfPrtExchangeModule, only: gwfprt_cr use GwtGwtExchangeModule, only: gwtexchange_create use GweGweExchangeModule, only: gweexchange_create use SwfGwfExchangeModule, only: swfgwf_cr use VirtualGwfExchangeModule, only: add_virtual_gwf_exchange use VirtualGwtExchangeModule, only: add_virtual_gwt_exchange use VirtualGweExchangeModule, only: add_virtual_gwe_exchange + ! use VirtualPrtExchangeModule, only: add_virtual_prt_exchange ! -- dummy ! -- locals character(len=LENMEMPATH) :: input_mempath @@ -446,6 +458,8 @@ subroutine exchanges_create() if (both_local) then call gwfgwe_cr(fname, exg_id, m1_id, m2_id) end if + case ('GWF6-PRT6') + call gwfprt_cr(fname, exg_id, m1_id, m2_id) case ('GWT6-GWT6') write (exg_name, '(a,i0)') 'GWT-GWT_', exg_id if (.not. both_remote) then diff --git a/src/Solution/ExplicitSolution.f90 b/src/Solution/ExplicitSolution.f90 index d40a2fe4046..35fa3ee1f6f 100644 --- a/src/Solution/ExplicitSolution.f90 +++ b/src/Solution/ExplicitSolution.f90 @@ -1,4 +1,11 @@ -!> @brief Explicit model solution +!> @brief Explicit Solution Module +!! +!! This module contains the Explicit Solution, which is a +!! class for solving explicit models. The explicit solution +!! scrolls through a list of explicit models and calls +!! methods in a prescribed sequence. +!! +!< module ExplicitSolutionModule use KindModule, only: I4B, DP use TimerModule, only: code_timer @@ -6,9 +13,9 @@ module ExplicitSolutionModule MNORMAL, LINELENGTH, DZERO use MemoryHelperModule, only: create_mem_path use BaseModelModule, only: BaseModelType - use ExplicitModelModule, only: ExplicitModelType, & - AddExplicitModelToList, & - GetExplicitModelFromList + use NumericalModelModule, only: NumericalModelType, & + AddNumericalModelToList, & + GetNumericalModelFromList use BaseExchangeModule, only: BaseExchangeType use BaseSolutionModule, only: BaseSolutionType, AddBaseSolutionToList use ListModule, only: ListType @@ -187,7 +194,7 @@ subroutine sln_ca(this, isgcnvg, isuppress_output) integer(I4B), intent(inout) :: isgcnvg !< solution group convergence flag integer(I4B), intent(in) :: isuppress_output !< flag for suppressing output ! -- local variables - class(ExplicitModelType), pointer :: mp => null() + class(NumericalModelType), pointer :: mp => null() character(len=LINELENGTH) :: line character(len=LINELENGTH) :: fmt integer(I4B) :: im @@ -200,7 +207,7 @@ subroutine sln_ca(this, isgcnvg, isuppress_output) line = 'mode="validation" -- Skipping assembly and solution.' fmt = "(/,1x,a,/)" do im = 1, this%modellist%Count() - mp => GetExplicitModelFromList(this%modellist, im) + mp => GetNumericalModelFromList(this%modellist, im) call mp%model_message(line, fmt=fmt) end do case (MNORMAL) @@ -220,11 +227,11 @@ subroutine prepareSolve(this) class(ExplicitSolutionType) :: this !< ExplicitSolutionType instance ! -- local variables integer(I4B) :: im - class(ExplicitModelType), pointer :: mp => null() + class(NumericalModelType), pointer :: mp => null() ! -- Model advance do im = 1, this%modellist%Count() - mp => GetExplicitModelFromList(this%modellist, im) + mp => GetNumericalModelFromList(this%modellist, im) call mp%model_ad() end do @@ -238,13 +245,13 @@ subroutine solve(this) ! -- dummy variables class(ExplicitSolutionType) :: this !< ExplicitSolutionType instance ! -- local variables - class(ExplicitModelType), pointer :: mp => null() + class(NumericalModelType), pointer :: mp => null() integer(I4B) :: im real(DP) :: ttsoln call code_timer(0, ttsoln, this%ttsoln) do im = 1, this%modellist%Count() - mp => GetExplicitModelFromList(this%modellist, im) + mp => GetNumericalModelFromList(this%modellist, im) call mp%model_solve() end do call code_timer(1, ttsoln, this%ttsoln) @@ -260,17 +267,17 @@ subroutine finalizeSolve(this, isgcnvg, isuppress_output) integer(I4B), intent(in) :: isuppress_output !< flag for suppressing output ! -- local variables integer(I4B) :: im - class(ExplicitModelType), pointer :: mp => null() + class(NumericalModelType), pointer :: mp => null() ! -- Calculate flow for each model do im = 1, this%modellist%Count() - mp => GetExplicitModelFromList(this%modellist, im) + mp => GetNumericalModelFromList(this%modellist, im) call mp%model_cq(this%icnvg, isuppress_output) end do ! -- Budget terms for each model do im = 1, this%modellist%Count() - mp => GetExplicitModelFromList(this%modellist, im) + mp => GetNumericalModelFromList(this%modellist, im) call mp%model_bd(this%icnvg, isuppress_output) end do end subroutine finalizeSolve @@ -297,13 +304,13 @@ subroutine add_model(this, mp) class(ExplicitSolutionType) :: this !< ExplicitSolutionType instance class(BaseModelType), pointer, intent(in) :: mp !< model instance ! -- local variables - class(ExplicitModelType), pointer :: m => null() + class(NumericalModelType), pointer :: m => null() ! -- add a model select type (mp) - class is (ExplicitModelType) + class is (NumericalModelType) m => mp - call AddExplicitModelToList(this%modellist, m) + call AddNumericalModelToList(this%modellist, m) end select end subroutine add_model diff --git a/src/Solution/ParticleTracker/Cell.f90 b/src/Solution/ParticleTracker/Cell.f90 new file mode 100644 index 00000000000..00aee613d48 --- /dev/null +++ b/src/Solution/ParticleTracker/Cell.f90 @@ -0,0 +1,24 @@ +module CellModule + + use CellDefnModule, only: CellDefnType + implicit none + private + public :: CellType + + !> @brief Base type for grid cells of a concrete type. Contains + !! a cell-definition which is information shared by cell types. + type, abstract :: CellType + character(len=40), pointer :: type ! tracking domain type + type(CellDefnType), pointer :: defn => null() ! cell defn + contains + procedure(destroy), deferred :: destroy !< destroy the cell + end type CellType + + abstract interface + subroutine destroy(this) + import CellType + class(CellType), intent(inout) :: this + end subroutine + end interface + +end module CellModule diff --git a/src/Solution/ParticleTracker/CellDefn.f90 b/src/Solution/ParticleTracker/CellDefn.f90 new file mode 100644 index 00000000000..82db0209cb0 --- /dev/null +++ b/src/Solution/ParticleTracker/CellDefn.f90 @@ -0,0 +1,90 @@ +module CellDefnModule + use KindModule, only: DP, I4B, LGP + implicit none + + private + public :: CellDefnType + public :: create_defn + + !> @brief Base grid cell definition. + type CellDefnType + private + integer(I4B), public :: icell !< index of cell in source grid + logical(LGP), public :: can_be_rect !< whether cell is representable as a rectangular cell + logical(LGP), public :: can_be_quad !< whether cell is representable as a rectangular quad cell + integer(I4B), public :: npolyverts !< number of vertices for cell polygon + real(DP), public :: porosity !< cell porosity + real(DP), public :: retfactor !< cell retardation factor + integer(I4B), public :: izone !< cell zone number + integer(I4B), public :: iweaksink !< weak sink indicator + integer(I4B), public :: inoexitface !< no exit face indicator + integer(I4B), public :: iatop !< index of cell top in grid's top/bot arrays (<0 => top array) + real(DP), public :: top, bot !< top and bottom elevations of cell + real(DP), public :: sat !< cell saturation + real(DP), allocatable, public :: polyvert(:, :) !< vertices for cell polygon + logical(LGP), allocatable, public :: ispv180(:) !< indicator of 180-degree vertices (.true. = 180-degree angle at vertex) + integer(I4B), allocatable, public :: facenbr(:) !< neighbors that correspond to faces(/vertices) + real(DP), allocatable, public :: faceflow(:) !< flows that correspond to faces(/vertices) + real(DP), public :: distflow !< net distributed flow into cell + contains + procedure, public :: get_npolyverts !< returns the number of polygon vertices + procedure, public :: get_ispv180 !< returns 180-degree indicator for a vertex + procedure, public :: get_botflow !< returns bottom flow + procedure, public :: get_topflow !< returns top flow + procedure, public :: get_distflow !< returns distributed flow + procedure, public :: get_faceflow !< returns a face flow + end type CellDefnType + +contains + + !> @brief Create a new cell definition object + subroutine create_defn(cellDefn) + type(CellDefnType), pointer :: cellDefn + allocate (cellDefn) + end subroutine create_defn + + !> @brief Return the number of polygon vertices + function get_npolyverts(this) result(npolyverts) + class(CellDefnType), intent(inout) :: this + integer :: npolyverts + npolyverts = this%npolyverts + end function get_npolyverts + + !> @brief Return 180-degree indicator for a vertex + function get_ispv180(this, m) result(ispv180) + class(CellDefnType), intent(inout) :: this + integer :: m + logical :: ispv180 + ispv180 = this%ispv180(m) + end function get_ispv180 + + !> @brief Return the bottom flow + function get_botflow(this) result(botflow) + class(CellDefnType), intent(inout) :: this + double precision :: botflow + botflow = this%faceflow(this%npolyverts + 2) + end function get_botflow + + !> @brief Return the top flow + function get_topflow(this) result(topflow) + class(CellDefnType), intent(inout) :: this + double precision :: topflow + topflow = this%faceflow(this%npolyverts + 3) + end function get_topflow + + !> @brief Return the distributed flow + function get_distflow(this) result(distflow) + class(CellDefnType), intent(inout) :: this + double precision :: distflow + distflow = this%distflow + end function get_distflow + + !> @brief Return a face flow + function get_faceflow(this, m) result(faceflow) + class(CellDefnType), intent(inout) :: this + integer :: m + double precision :: faceflow + faceflow = this%faceflow(m) + end function get_faceflow + +end module CellDefnModule diff --git a/src/Solution/ParticleTracker/CellPoly.f90 b/src/Solution/ParticleTracker/CellPoly.f90 new file mode 100644 index 00000000000..2f83e508aae --- /dev/null +++ b/src/Solution/ParticleTracker/CellPoly.f90 @@ -0,0 +1,34 @@ +module CellPolyModule + + use CellModule, only: CellType + use CellDefnModule, only: CellDefnType + implicit none + + private + public :: CellPolyType + public :: create_cell_poly + + type, extends(CellType) :: CellPolyType + contains + procedure :: destroy => destroy_cell_poly + end type CellPolyType + +contains + + !> @brief Create a new polygonal cell + subroutine create_cell_poly(cell) + type(CellPolyType), pointer :: cell + allocate (cell) + allocate (cell%defn) + allocate (cell%type) + cell%type = 'poly' + end subroutine create_cell_poly + + !> @brief Destroy the polygonal cell + subroutine destroy_cell_poly(this) + class(CellPolyType), intent(inout) :: this + deallocate (this%defn) + deallocate (this%type) + end subroutine destroy_cell_poly + +end module CellPolyModule diff --git a/src/Solution/ParticleTracker/CellRect.f90 b/src/Solution/ParticleTracker/CellRect.f90 new file mode 100644 index 00000000000..b359135917f --- /dev/null +++ b/src/Solution/ParticleTracker/CellRect.f90 @@ -0,0 +1,54 @@ +module CellRectModule + + use CellModule, only: CellType + use CellDefnModule, only: CellDefnType + implicit none + + private + public :: CellRectType + public :: create_cell_rect + + type, extends(CellType) :: CellRectType + private + double precision, public :: dx ! dimension of cell in local x direction + double precision, public :: dy ! dimension of cell in local y direction + double precision, public :: dz ! dimension of cell in z direction + + double precision, public :: sinrot ! sine of rotation angle for local (x, y) + double precision, public :: cosrot ! cosine of rotation angle for local (x, y) + + double precision, public :: vx1 ! west-boundary local-x velocity + double precision, public :: vx2 ! east-boundary local-x velocity + double precision, public :: vy1 ! south-boundary local-y velocity + double precision, public :: vy2 ! north-boundary local-y velocity + double precision, public :: vz1 ! bottom-boundary z velocity + double precision, public :: vz2 ! top-boundary z velocity + + integer, public :: ipvOrigin ! origin vertex + double precision, public :: xOrigin ! model x origin for local (x, y) + double precision, public :: yOrigin ! model y origin for local (x, y) + double precision, public :: zOrigin ! model z origin for local z + + contains + procedure :: destroy => destroy_rect ! destructor for the cell + end type CellRectType + +contains + + !> @brief Create a new rectangular cell + subroutine create_cell_rect(cell) + type(CellRectType), pointer :: cell + allocate (cell) + allocate (cell%defn) + allocate (cell%type) + cell%type = 'rect' + end subroutine create_cell_rect + + !> @brief Destroy the rectangular cell + subroutine destroy_rect(this) + class(CellRectType), intent(inout) :: this + deallocate (this%defn) + deallocate (this%type) + end subroutine destroy_rect + +end module CellRectModule diff --git a/src/Solution/ParticleTracker/CellRectQuad.f90 b/src/Solution/ParticleTracker/CellRectQuad.f90 new file mode 100644 index 00000000000..b8dc00c3020 --- /dev/null +++ b/src/Solution/ParticleTracker/CellRectQuad.f90 @@ -0,0 +1,220 @@ +module CellRectQuadModule + + use CellModule, only: CellType + use CellDefnModule, only: CellDefnType + implicit none + + private + public :: CellRectQuadType + public :: create_cell_rect_quad + + type, extends(CellType) :: CellRectQuadType + double precision :: dx ! dimension of cell in local x direction + double precision :: dy ! dimension of cell in local y direction + double precision :: dz ! dimension of cell in z direction + + double precision :: sinrot ! sine of rotation angle for local (x, y) + double precision :: cosrot ! cosine of rotation angle for local (x, y) + + integer :: irvOrigin ! origin rectangle vertex + double precision :: xOrigin ! model x origin for local (x, y) + double precision :: yOrigin ! model y origin for local (x, y) + double precision :: zOrigin ! model z origin for local z + + double precision :: qextl1(4), qextl2(4), qintl(5) ! external and internal subcell flows for the cell + integer, allocatable :: irectvert(:) ! list of indices of the rectangle vertices + integer, allocatable :: ipv4irv(:, :) ! list of the polygon vertex indices that correspond to the rectangle vertex indices + double precision, allocatable :: rectflow(:, :) ! flow(s) for each rectangle face + contains + procedure :: destroy => destroy_cell_rect_quad ! destructor for the cell + procedure :: init_from ! initializes the cell from an existing cell + + procedure :: load_irectvert ! loads list of indices of the rectangle vertices + procedure :: get_irectvertSW ! gets index of southwest rectangle vertex + procedure :: get_rectDimensionsRotation ! gets rectangular dimensions and rotation + + procedure :: get_rectflow ! returns a rectangle face flow + procedure :: face_is_refined ! returns whether a rectangle face is refined + end type CellRectQuadType + +contains + + !> @brief Create a new rectangular-quad cell + subroutine create_cell_rect_quad(cell) + type(CellRectQuadType), pointer :: cell + allocate (cell) + allocate (cell%defn) + allocate (cell%irectvert(5)) + allocate (cell%ipv4irv(2, 4)) + allocate (cell%rectflow(2, 4)) + allocate (cell%type) + cell%type = 'rectquad' + end subroutine create_cell_rect_quad + + !> @brief Destroy the rectangular-quad cell + subroutine destroy_cell_rect_quad(this) + class(CellRectQuadType), intent(inout) :: this + deallocate (this%defn) + deallocate (this%irectvert) + deallocate (this%type) + end subroutine destroy_cell_rect_quad + + !> @brief Initialize a rectangular-quad cell from another cell + subroutine init_from(this, defn) + class(CellRectQuadType), intent(inout) :: this + type(CellDefnType), pointer :: defn + this%defn => defn + call this%load_irectvert() + end subroutine init_from + + !> @brief Load local polygon vertex indices + !! + !! Loads local polygon vertex indices of the four rectangle + !! vertices of a rectangular-quad cell. Todo: rename? + !< + subroutine load_irectvert(this) + ! -- dummy + class(CellRectQuadType), intent(inout) :: this + ! -- local + integer :: npolyverts, n, m + + npolyverts = this%defn%get_npolyverts() + + n = 0 + do m = 1, npolyverts + if (.not. this%defn%get_ispv180(m)) then + n = n + 1 + this%irectvert(n) = m + this%ipv4irv(1, n) = m + this%rectflow(1, n) = this%defn%get_faceflow(m) + this%ipv4irv(2, n) = 0 + this%rectflow(2, n) = 0d0 + else + if (n .ne. 0) then + this%ipv4irv(2, n) = m + this%rectflow(2, n) = this%defn%get_faceflow(m) + end if + end if + end do + + ! Wrap around for convenience + this%irectvert(5) = this%irectvert(1) + end subroutine load_irectvert + + !> @brief Get index of SW rectangle vertex + !! + !! Return the index (1, 2, 3, or 4) of the southwest + !! rectangle vertex of a rectangular-quad cell + !< + function get_irectvertSW(this) result(irv1) + ! -- dummy + class(CellRectQuadType), intent(inout) :: this + integer :: irv1 + ! -- local + integer :: irv, irv2, irv4, ipv1, ipv2, ipv4 + integer, dimension(4) :: irvnxt = (/2, 3, 4, 1/) ! kluge??? + double precision :: x1, y1, x2, y2, x4, y4 + + ! -- Find the "southwest" rectangle vertex by finding the vertex formed + ! -- either by (1) a rectangle edge over which x decreases (going + ! -- clockwise) followed by an edge over which x does not increase, or by + ! -- (2) a rectangle edge over which y does not decrease (again going + ! -- clockwise) followed by a rectangle edge over which y increases. In + ! -- the end, ipv1 is the index (1, 2, 3, or 4) of the southwest + ! -- rectangle vertex. + do irv = 1, 4 + irv4 = irv + irv1 = irvnxt(irv4) + ipv4 = this%irectvert(irv4) + ipv1 = this%irectvert(irv1) + x4 = this%defn%polyvert(1, ipv4) + y4 = this%defn%polyvert(2, ipv4) + x1 = this%defn%polyvert(1, ipv1) + y1 = this%defn%polyvert(2, ipv1) + if (x1 .lt. x4) then + irv2 = irvnxt(irv1) + ipv2 = this%irectvert(irv2) + x2 = this%defn%polyvert(1, ipv2) + if (x2 .le. x1) return + else if (y1 .ge. y4) then + irv2 = irvnxt(irv1) + ipv2 = this%irectvert(irv2) + y2 = this%defn%polyvert(2, ipv2) + if (y2 .gt. y1) return + end if + end do + end function get_irectvertSW + + !> @brief Get rectangular cell dimensions and rotation + !! + !! Compute rectangular dimensions and rotation of + !! the cell using the specified rectangle vertex + !! as the origin + !< + subroutine get_rectDimensionsRotation(this, irv1, xOrigin, yOrigin, zOrigin, & + dx, dy, dz, sinrot, cosrot) + ! -- dummy + class(CellRectQuadType), intent(inout) :: this + integer :: irv1 + double precision :: xOrigin, yOrigin, zOrigin, dx, dy, dz, sinrot, cosrot + ! -- local + integer :: irv2, irv4, ipv1, ipv2, ipv4 + integer, dimension(4) :: irvnxt = (/2, 3, 4, 1/) ! kluge??? + double precision :: x1, y1, x2, y2, x4, y4, dx2, dy2, dx4, dy4 + + ! -- Get rectangle vertex neighbors irv2 and irv4 + irv2 = irvnxt(irv1) + irv4 = irvnxt(irvnxt(irv2)) ! kluge + + ! -- Get model coordinates at irv1, irv2, and irv4 + ipv1 = this%irectvert(irv1) + x1 = this%defn%polyvert(1, ipv1) + y1 = this%defn%polyvert(2, ipv1) + ipv2 = this%irectvert(irv2) + x2 = this%defn%polyvert(1, ipv2) + y2 = this%defn%polyvert(2, ipv2) + ipv4 = this%irectvert(irv4) + x4 = this%defn%polyvert(1, ipv4) + y4 = this%defn%polyvert(2, ipv4) + + ! -- Compute rectangle dimensions + xOrigin = x1 + yOrigin = y1 + zOrigin = this%defn%bot + dx2 = x2 - xOrigin + dy2 = y2 - yOrigin + dx4 = x4 - xOrigin + dy4 = y4 - yOrigin + dx = dsqrt(dx4 * dx4 + dy4 * dy4) + dy = dsqrt(dx2 * dx2 + dy2 * dy2) + dz = this%defn%top - zOrigin ! kluge note: need to account for partial saturation + + ! -- Compute sine and cosine of rotation angle (angle between "southern" + ! -- rectangle side irv1-irv4 and the model x axis) + sinrot = dy4 / dx + cosrot = dx4 / dx + end subroutine get_rectDimensionsRotation + + !> @brief Return a rectangle face flow + function get_rectflow(this, iq, irv) result(rectflow) + class(CellRectQuadType), intent(inout) :: this + integer :: iq, irv + double precision :: rectflow + rectflow = this%rectflow(iq, irv) + end function get_rectflow + + !> @brief Return whether a rectangle face is refined + function face_is_refined(this, i) result(is_refined) + ! -- dummy + class(CellRectQuadType), intent(inout) :: this + integer :: i !< face index + logical :: is_refined + + if (this%ipv4irv(2, i) .ne. 0) then + is_refined = .true. + else + is_refined = .false. + end if + end function face_is_refined + +end module CellRectQuadModule diff --git a/src/Solution/ParticleTracker/CellUtil.f90 b/src/Solution/ParticleTracker/CellUtil.f90 new file mode 100644 index 00000000000..0e4eabcf170 --- /dev/null +++ b/src/Solution/ParticleTracker/CellUtil.f90 @@ -0,0 +1,169 @@ +module CellUtilModule + + implicit none + + private + public :: cell_poly_to_rect + public :: cell_poly_to_quad + +contains + + !> @brief Convert CellPoly representation to CellRect if possible + subroutine cell_poly_to_rect(poly, rect) + use ConstantsModule, only: DONE + use CellRectModule, only: CellRectType, create_cell_rect + use CellPolyModule, only: CellPolyType + use CellDefnModule, only: CellDefnType + ! -- dummy + type(CellPolyType), intent(in), pointer :: poly + type(CellRectType), intent(inout), pointer :: rect + ! -- local + type(CellDefnType), pointer :: defn + integer :: ipv, ipv1, ipv2, ipv3, ipv4 + integer, dimension(4) :: ipvnxt = (/2, 3, 4, 1/) + double precision :: x1, y1, x2, y2, x4, y4 + double precision :: dx2, dy2, dx4, dy4, areax, areay, areaz + double precision :: xOrigin, yOrigin, zOrigin, dx, dy, dz, sinrot, cosrot + double precision :: factor, term + + call create_cell_rect(rect) + defn => poly%defn + ! -- kluge note: no check whether conversion is possible; assumes it is + + ! -- Translate and rotate the rectangular cell into local coordinates + ! -- with x varying from 0 to dx and y varying from 0 to dy. Choose the + ! -- "south-west" vertex to be the local origin so that the rotation + ! -- angle is zero if the cell already aligns with the model x and y + ! -- coordinates. The "southwest" vertex is found by finding the vertex + ! -- formed either by (1) an edge over which x decreases (going + ! -- clockwise) followed by an edge over which x does not increase, or + ! -- by (2) an edge over which y does not decrease (again going + ! -- clockwise) followed by an edge over which y increases. In the end, + ! -- ipv1 is the local vertex number (within the cell, taking a value + ! -- of 1, 2, 3, or 4) of the southwest vertex, and ipv2, ipv3, and + ! -- ipv4 are the local vertex numbers of the remaining three vertices + ! -- going clockwise. + do ipv = 1, 4 + ipv4 = ipv + ipv1 = ipvnxt(ipv4) + x4 = defn%polyvert(1, ipv4) + y4 = defn%polyvert(2, ipv4) + x1 = defn%polyvert(1, ipv1) + y1 = defn%polyvert(2, ipv1) + if (x1 .lt. x4) then + ipv2 = ipvnxt(ipv1) + x2 = defn%polyvert(1, ipv2) + if (x2 .le. x1) then + y2 = defn%polyvert(2, ipv2) + exit + end if + else if (y1 .ge. y4) then + ipv2 = ipvnxt(ipv1) + y2 = defn%polyvert(2, ipv2) + if (y2 .gt. y1) then + x2 = defn%polyvert(1, ipv2) + exit + end if + end if + end do + ipv3 = ipvnxt(ipv2) + + ! -- Compute upper bounds on the local coordinates (the rectangular + ! -- dimensions of the cell) and the sine and cosine of the rotation + ! -- angle, and store local origin information + xOrigin = x1 + yOrigin = y1 + zOrigin = defn%bot + dx2 = x2 - xOrigin + dy2 = y2 - yOrigin + dx4 = x4 - xOrigin + dy4 = y4 - yOrigin + dx = dsqrt(dx4 * dx4 + dy4 * dy4) + dy = dsqrt(dx2 * dx2 + dy2 * dy2) + dz = defn%top - zOrigin ! todo: need to account for partial saturation + sinrot = dy4 / dx + cosrot = dx4 / dx + rect%defn = poly%defn + rect%dx = dx + rect%dy = dy + rect%dz = dz + rect%sinrot = sinrot + rect%cosrot = cosrot + rect%xOrigin = xOrigin + rect%yOrigin = yOrigin + rect%zOrigin = zOrigin + rect%ipvOrigin = ipv1 + + ! -- Compute (unscaled) cell edge velocities from face flows + areax = dx * dz + areay = dy * dz + areaz = dx * dy + factor = DONE / (defn%retfactor * defn%porosity) + term = factor / areax + rect%vx1 = defn%faceflow(ipv1) * term + rect%vx2 = -defn%faceflow(ipv3) * term + term = factor / areay + rect%vy1 = defn%faceflow(ipv4) * term + rect%vy2 = -defn%faceflow(ipv2) * term + term = factor / areaz + rect%vz1 = defn%faceflow(6) * term + rect%vz2 = -defn%faceflow(7) * term + end subroutine cell_poly_to_rect + + !> @brief Convert CellPoly representation to CellRectQuad if possible + subroutine cell_poly_to_quad(poly, quad) + use CellRectQuadModule, only: CellRectQuadType, create_cell_rect_quad + use CellPolyModule, only: CellPolyType + use MathUtilModule, only: mod_offset + ! -- dummy + type(CellPolyType), intent(in), pointer :: poly + type(CellRectQuadType), intent(inout), pointer :: quad + ! -- local + integer :: i, irv, isc + double precision :: qhalf, qdisttopbot, q1, q2, q4 + + call create_cell_rect_quad(quad) + call quad%init_from(poly%defn) + ! kluge note: no check whether conversion is possible; assumes it is + ! -- Translate and rotate the rect-quad cell into local coordinates with + ! -- x varying from 0 to dx and y varying from 0 to dy. Choose the "south- + ! -- west" rectangle vertex to be the local origin so that the rotation + ! -- angle is zero if the cell already aligns with the model x and y + ! -- coordinates. + quad%irvOrigin = quad%get_irectvertSW() ! kluge note: no need to pass all that stuff in call below -- set internally in CellRectQuad + call quad%get_rectDimensionsRotation( & + quad%irvOrigin, quad%xOrigin, & + quad%yOrigin, quad%zOrigin, & + quad%dx, quad%dy, & + quad%dz, quad%sinrot, & + quad%cosrot) + + ! -- Set the external and internal face flows used for subcells + do i = 0, 3 + irv = mod_offset(i + quad%irvOrigin, 4, 1) + isc = mod_offset(i + 3, 4, 1) + if (.not. quad%face_is_refined(irv)) then + qhalf = 5d-1 * quad%get_rectflow(1, irv) + quad%qextl2(isc) = qhalf + isc = mod_offset(isc + 1, 4, 1) + quad%qextl1(isc) = qhalf + else + quad%qextl2(isc) = quad%get_rectflow(1, irv) + isc = mod_offset(isc + 1, 4, 1) + quad%qextl1(isc) = quad%get_rectflow(2, irv) + end if + end do + qdisttopbot = 2.5d-1 * (quad%defn%get_distflow() & + + quad%defn%get_botflow() & + + quad%defn%get_topflow()) + q1 = qdisttopbot + quad%qextl1(1) + quad%qextl2(1) + q2 = qdisttopbot + quad%qextl1(2) + quad%qextl2(2) + q4 = qdisttopbot + quad%qextl1(4) + quad%qextl2(4) + quad%qintl(1) = -5d-1 * (q1 + 5d-1 * (q2 - q4)) + quad%qintl(2) = quad%qintl(1) + q1 + quad%qintl(3) = quad%qintl(2) + q2 + quad%qintl(4) = quad%qintl(1) - q4 + quad%qintl(5) = quad%qintl(1) + end subroutine cell_poly_to_quad + +end module CellUtilModule diff --git a/src/Solution/ParticleTracker/Method.f90 b/src/Solution/ParticleTracker/Method.f90 new file mode 100644 index 00000000000..5a0820bc11a --- /dev/null +++ b/src/Solution/ParticleTracker/Method.f90 @@ -0,0 +1,208 @@ +!> @brief Particle tracking strategies +module MethodModule + + use KindModule, only: DP, I4B, LGP + use ErrorUtilModule, only: pstop + use SubcellModule, only: SubcellType + use ParticleModule + use BaseDisModule, only: DisBaseType + use PrtFmiModule, only: PrtFmiType + use CellModule, only: CellType + use CellDefnModule, only: CellDefnType + use TrackModule, only: TrackFileControlType + use TimeSelectModule, only: TimeSelectType + implicit none + + private + public :: MethodType, get_iatop + + !> @brief Base type for particle tracking methods. + !! + !! The PRT tracking algorithm invokes a "tracking method" for each + !! domain. A domain can be a model, cell in a model, or subcell in + !! a cell. Tracking proceeds recursively, delegating to a possibly + !! arbitrary number of subdomains (currently, only the three above + !! are recognized). A tracking method is responsible for advancing + !! a particle through a domain, delegating to subdomains as needed + !! depending on cell geometry (implementing the strategy pattern). + !< + type, abstract :: MethodType + character(len=40), pointer, public :: type ! method name + logical(LGP), public :: delegates ! whether the method delegates + type(PrtFmiType), pointer, public :: fmi => null() !< ptr to fmi + class(CellType), pointer, public :: cell => null() ! ptr to a cell + class(SubcellType), pointer, public :: subcell => null() ! ptr to a subcell + type(TrackFileControlType), pointer, public :: trackfilectl => null() ! ptr to track file control + type(TimeSelectType), pointer, public :: tracktimes => null() ! ptr to user-defined tracking times + integer(I4B), dimension(:), pointer, contiguous, public :: izone => null() !< pointer to zone numbers + real(DP), dimension(:), pointer, contiguous, public :: flowja => null() !< pointer to intercell flows + real(DP), dimension(:), pointer, contiguous, public :: porosity => null() !< pointer to aquifer porosity + real(DP), dimension(:), pointer, contiguous, public :: retfactor => null() !< pointer to retardation factor + contains + ! Implemented in all subtypes + procedure(apply), deferred :: apply + procedure(destroy), deferred :: destroy + ! Overridden in subtypes that delegate + procedure :: pass + procedure :: load + ! Implemented in this class + procedure :: init + procedure :: track + procedure :: try_pass + procedure :: update + end type MethodType + + abstract interface + subroutine apply(this, particle, tmax) + import DP + import MethodType + import ParticleType + class(MethodType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + real(DP), intent(in) :: tmax + end subroutine apply + subroutine destroy(this) + import MethodType + class(MethodType), intent(inout) :: this + end subroutine destroy + end interface + +contains + + subroutine init(this, fmi, cell, subcell, trackfilectl, tracktimes, & + izone, flowja, porosity, retfactor) + class(MethodType), intent(inout) :: this + type(PrtFmiType), intent(in), pointer, optional :: fmi + class(CellType), intent(in), pointer, optional :: cell + class(SubcellType), intent(in), pointer, optional :: subcell + type(TrackFileControlType), intent(in), pointer, optional :: trackfilectl + type(TimeSelectType), intent(in), pointer, optional :: tracktimes + integer(I4B), intent(in), pointer, optional :: izone(:) + real(DP), intent(in), pointer, optional :: flowja(:) + real(DP), intent(in), pointer, optional :: porosity(:) + real(DP), intent(in), pointer, optional :: retfactor(:) + + if (present(fmi)) this%fmi => fmi + if (present(cell)) this%cell => cell + if (present(subcell)) this%subcell => subcell + if (present(trackfilectl)) this%trackfilectl => trackfilectl + if (present(tracktimes)) this%tracktimes => tracktimes + if (present(izone)) this%izone => izone + if (present(flowja)) this%flowja => flowja + if (present(porosity)) this%porosity => porosity + if (present(retfactor)) this%retfactor => retfactor + end subroutine init + + !> @brief Track particle through subdomains + recursive subroutine track(this, particle, level, tmax) + ! dummy + class(MethodType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + integer(I4B) :: level + real(DP), intent(in) :: tmax + ! local + logical(LGP) :: advancing + integer(I4B) :: nextlevel + class(methodType), pointer :: submethod + + advancing = .true. + nextlevel = level + 1 + do while (advancing) + call this%load(particle, nextlevel, submethod) + call submethod%apply(particle, tmax) + call this%try_pass(particle, nextlevel, advancing) + end do + end subroutine track + + !> @brief Try passing the particle to the next subdomain + subroutine try_pass(this, particle, nextlevel, advancing) + class(MethodType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + integer(I4B) :: nextlevel + logical(LGP) :: advancing + + ! tracking submethod marked tracking complete? + ! reset domain boundary flag and don't advance + if (.not. particle%advancing) then + particle%iboundary = 0 + advancing = .false. + else + ! otherwise pass particle to next subdomain + ! and if it's on a boundary, stop advancing + call this%pass(particle) + if (particle%iboundary(nextlevel - 1) .ne. 0) & + advancing = .false. + end if + end subroutine try_pass + + !> @brief Load subdomain tracking method (submethod) + subroutine load(this, particle, next_level, submethod) + class(MethodType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + integer, intent(in) :: next_level + class(MethodType), pointer, intent(inout) :: submethod + call pstop(1, "load must be overridden") + end subroutine load + + !> @brief Pass a particle to the next subdomain, internal use only + subroutine pass(this, particle) + class(MethodType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + call pstop(1, "pass must be overridden") + end subroutine pass + + !> @brief Update particle state and check termination conditions + !! + !! Update the particle's properties (e.g. advancing flag, zone number, + !! status). If any termination conditions apply, the particle's status + !! will be set to the appropriate termination value. If any reporting + !! conditions apply, save particle state with the proper reason code. + !< + subroutine update(this, particle, cell_defn) + ! -- modules + use TdisModule, only: kper, kstp + ! -- dummy + class(MethodType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + type(CellDefnType), pointer, intent(inout) :: cell_defn + + particle%izone = cell_defn%izone + if (cell_defn%izone .ne. 0) then + if (particle%istopzone .eq. cell_defn%izone) then + particle%advancing = .false. + particle%istatus = 6 + call this%trackfilectl%save(particle, kper=kper, & + kstp=kstp, reason=3) ! reason=3: termination + end if + else if (cell_defn%inoexitface .ne. 0) then + particle%advancing = .false. + particle%istatus = 5 + call this%trackfilectl%save(particle, kper=kper, & + kstp=kstp, reason=3) ! reason=3: termination + else if (cell_defn%iweaksink .ne. 0) then + if (particle%istopweaksink .ne. 0) then + particle%advancing = .false. + particle%istatus = 3 + call this%trackfilectl%save(particle, kper=kper, & + kstp=kstp, reason=3) ! reason=3: termination + else + call this%trackfilectl%save(particle, kper=kper, & + kstp=kstp, reason=4) ! reason=4: exited weak sink + end if + end if + end subroutine update + + !> @brief Get the index corresponding to top elevation of a cell in the grid. + !! This is -1 if the cell is in the top layer and 1 otherwise. + function get_iatop(ncpl, icu) result(iatop) + integer(I4B), intent(in) :: ncpl, icu + integer(I4B) :: iatop + + if (icu .le. ncpl) then + iatop = -1 + else + iatop = 1 + end if + end function get_iatop + +end module MethodModule diff --git a/src/Solution/ParticleTracker/MethodCellPassToBot.f90 b/src/Solution/ParticleTracker/MethodCellPassToBot.f90 new file mode 100644 index 00000000000..ce28718113a --- /dev/null +++ b/src/Solution/ParticleTracker/MethodCellPassToBot.f90 @@ -0,0 +1,61 @@ +module MethodCellPassToBotModule + + use KindModule, only: DP, I4B + use MethodModule, only: MethodType + use CellDefnModule, only: CellDefnType, create_defn + use PrtFmiModule, only: PrtFmiType + use BaseDisModule, only: DisBaseType + use ParticleModule + use CellModule, only: CellType + use SubcellModule, only: SubcellType + use TrackModule, only: TrackFileControlType + implicit none + + private + public :: MethodCellPassToBotType + public :: create_method_cell_ptb + + type, extends(MethodType) :: MethodCellPassToBotType + private + type(CellDefnType), pointer :: defn + contains + procedure, public :: apply => apply_ptb + procedure, public :: destroy + end type MethodCellPassToBotType + +contains + + !> @brief Create a new tracking method + subroutine create_method_cell_ptb(method) + type(MethodCellPassToBotType), pointer :: method + allocate (method) + allocate (method%type) + method%type = "passtobottom" + method%delegates = .false. + call create_defn(method%defn) + end subroutine create_method_cell_ptb + + !> @brief Destroy the tracking method + subroutine destroy(this) + class(MethodCellPassToBotType), intent(inout) :: this + deallocate (this%type) + end subroutine destroy + + !> @brief Pass particle vertically and instantaneously to the cell bottom + subroutine apply_ptb(this, particle, tmax) + ! -- modules + use TdisModule, only: kper, kstp + ! -- dummy + class(MethodCellPassToBotType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + real(DP), intent(in) :: tmax + + call this%update(particle, this%defn) + if (.not. particle%advancing) return + particle%z = this%defn%bot + particle%iboundary(2) = this%defn%npolyverts + 2 + call this%trackfilectl%save(particle, kper=kper, & + kstp=kstp, reason=1) ! reason=1: cell transition + end subroutine apply_ptb + +end module MethodCellPassToBotModule diff --git a/src/Solution/ParticleTracker/MethodCellPollock.f90 b/src/Solution/ParticleTracker/MethodCellPollock.f90 new file mode 100644 index 00000000000..08cecf422a6 --- /dev/null +++ b/src/Solution/ParticleTracker/MethodCellPollock.f90 @@ -0,0 +1,201 @@ +module MethodCellPollockModule + + use KindModule, only: DP, I4B + use ConstantsModule, only: DONE + use MethodModule, only: MethodType + use MethodSubcellPoolModule, only: method_subcell_plck, & + method_subcell_tern + use CellRectModule, only: CellRectType, create_cell_rect + use SubcellRectModule, only: SubcellRectType, create_subcell_rect + use ParticleModule, only: ParticleType + use TrackModule, only: TrackFileControlType + implicit none + + private + public :: MethodCellPollockType + public :: create_method_cell_pollock + + type, extends(MethodType) :: MethodCellPollockType + contains + procedure, public :: apply => apply_mcp + procedure, public :: destroy => destroy_mcp + procedure, public :: load => load_mcp + procedure, public :: load_subcell + procedure, public :: pass => pass_mcp + end type MethodCellPollockType + +contains + + !> @brief Create a tracking method + subroutine create_method_cell_pollock(method) + ! -- dummy + type(MethodCellPollockType), pointer :: method + ! -- local + type(CellRectType), pointer :: cell + type(SubcellRectType), pointer :: subcell + + allocate (method) + call create_cell_rect(cell) + method%cell => cell + method%type => method%cell%type + method%delegates = .true. + call create_subcell_rect(subcell) + method%subcell => subcell + end subroutine create_method_cell_pollock + + !> @brief Destroy the tracking method + subroutine destroy_mcp(this) + class(MethodCellPollockType), intent(inout) :: this + deallocate (this%type) + end subroutine destroy_mcp + + !> @brief Load subcell tracking method + subroutine load_mcp(this, particle, next_level, submethod) + ! -- modules + use SubcellModule, only: SubcellType + ! -- dummy + class(MethodCellPollockType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + integer, intent(in) :: next_level + class(MethodType), pointer, intent(inout) :: submethod + + select type (subcell => this%subcell) + type is (SubcellRectType) + call this%load_subcell(particle, subcell) + end select + call method_subcell_plck%init( & + subcell=this%subcell, & + trackfilectl=this%trackfilectl, & + tracktimes=this%tracktimes) + submethod => method_subcell_plck + particle%idomain(next_level) = 1 + end subroutine load_mcp + + !> @brief Having exited the lone subcell, pass the particle to the cell face + !! In this case the lone subcell is the cell. + subroutine pass_mcp(this, particle) + ! -- dummy + class(MethodCellPollockType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + ! -- local + integer(I4B) :: exitface + integer(I4B) :: entryface + + exitface = particle%iboundary(3) + ! -- Map subcell exit face to cell face + select case (exitface) ! note: exitFace uses Dave's iface convention + case (0) + entryface = -1 + case (1) + entryface = 1 + case (2) + entryface = 3 + case (3) + entryface = 4 + case (4) + entryface = 2 + case (5) + entryface = 6 ! note: inface=5 same as inface=1 due to wraparound + case (6) + entryface = 7 + end select + if (entryface .eq. -1) then + particle%iboundary(2) = 0 + else + if ((entryface .ge. 1) .and. (entryface .le. 4)) then + ! -- Account for local cell rotation + select type (cell => this%cell) + type is (CellRectType) + entryface = entryface + cell%ipvOrigin - 1 + end select + if (entryface .gt. 4) entryface = entryface - 4 + end if + particle%iboundary(2) = entryface + end if + end subroutine pass_mcp + + !> @brief Apply Pollock's method to a rectangular cell + subroutine apply_mcp(this, particle, tmax) + use TdisModule, only: kper, kstp + ! -- dummy + class(MethodCellPollockType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + real(DP), intent(in) :: tmax + ! -- local + real(DP) :: xOrigin + real(DP) :: yOrigin + real(DP) :: zOrigin + real(DP) :: sinrot + real(DP) :: cosrot + + select type (cell => this%cell) + type is (CellRectType) + ! -- Update particle state, checking whether any reporting or + ! -- termination conditions apply + call this%update(particle, cell%defn) + + ! -- Return early if particle is done advancing + if (.not. particle%advancing) return + + ! -- If the particle is above the top of the cell (which is presumed to + ! -- represent a water table above the cell bottom), pass the particle + ! -- vertically and instantaneously to the cell top elevation and save + ! -- the particle state to output file(s). + if (particle%z > cell%defn%top) then + particle%z = cell%defn%top + call this%trackfilectl%save(particle, kper=kper, & + kstp=kstp, reason=1) ! reason=1: cell transition + end if + + ! Transform particle location into local cell coordinates + ! (translated and rotated but not scaled relative to model). + ! Transform particle location back to model coordinates, then + ! reset transformation and eliminate accumulated roundoff error. + xOrigin = cell%xOrigin + yOrigin = cell%yOrigin + zOrigin = cell%zOrigin + sinrot = cell%sinrot + cosrot = cell%cosrot + call particle%transform(xOrigin, yOrigin, zOrigin, & + sinrot, cosrot) + call this%track(particle, 2, tmax) ! kluge, hardwired to level 2 + call particle%transform(xOrigin, yOrigin, zOrigin, & + sinrot, cosrot, invert=.true.) + call particle%transform(reset=.true.) + end select + end subroutine apply_mcp + + !> @brief Loads the lone rectangular subcell from the rectangular cell + !! kluge note: is levelNext needed here and in similar "load" routines??? + subroutine load_subcell(this, particle, subcell) ! + ! -- dummy + class(MethodCellPollockType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + type(SubcellRectType), intent(inout) :: subcell + + select type (cell => this%cell) + type is (CellRectType) + ! -- Set subcell number to 1 + subcell%isubcell = 1 + + ! -- Subcell calculations will be done in local subcell coordinates + subcell%dx = cell%dx + subcell%dy = cell%dy + subcell%dz = cell%dz + subcell%sinrot = 0d0 + subcell%cosrot = 1d0 ! kluge note: rethink how/where to store subcell data??? + subcell%xOrigin = 0d0 + subcell%yOrigin = 0d0 + subcell%zOrigin = 0d0 + + ! -- Set subcell edge velocities + subcell%vx1 = cell%vx1 ! kluge note: cell velocities now already account for retfactor and porosity + subcell%vx2 = cell%vx2 + subcell%vy1 = cell%vy1 + subcell%vy2 = cell%vy2 + subcell%vz1 = cell%vz1 + subcell%vz2 = cell%vz2 + end select + end subroutine load_subcell + +end module MethodCellPollockModule diff --git a/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 b/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 new file mode 100644 index 00000000000..8834de4ed6f --- /dev/null +++ b/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 @@ -0,0 +1,363 @@ +module MethodCellPollockQuadModule + + use KindModule, only: DP, I4B + use ErrorUtilModule, only: pstop + use ConstantsModule, only: DONE + use MethodModule, only: MethodType + use MethodSubcellPoolModule, only: method_subcell_plck + use CellRectQuadModule, only: CellRectQuadType, create_cell_rect_quad + use CellDefnModule, only: CellDefnType + use SubcellRectModule, only: SubcellRectType, create_subcell_rect + use ParticleModule, only: ParticleType + use TrackModule, only: TrackFileControlType + implicit none + + private + public :: MethodCellPollockQuadType + public :: create_method_cell_quad + + type, extends(MethodType) :: MethodCellPollockQuadType + contains + procedure, public :: apply => apply_mcpq + procedure, public :: destroy + procedure, public :: load => load_mcpq + procedure, public :: load_subcell + procedure, public :: pass => pass_mcpq + end type MethodCellPollockQuadType + +contains + + !> @brief Create a new tracking method + subroutine create_method_cell_quad(method) + ! -- dummy + type(MethodCellPollockQuadType), pointer :: method + ! -- local + type(CellRectQuadType), pointer :: cell + type(SubcellRectType), pointer :: subcell + + allocate (method) + call create_cell_rect_quad(cell) + method%cell => cell + method%type => method%cell%type + method%delegates = .true. + call create_subcell_rect(subcell) + method%subcell => subcell + end subroutine create_method_cell_quad + + !> @brief Destroy the tracking method + subroutine destroy(this) + class(MethodCellPollockQuadType), intent(inout) :: this + deallocate (this%type) + end subroutine destroy + + !> @brief Load subcell into tracking method + subroutine load_mcpq(this, particle, next_level, submethod) + class(MethodCellPollockQuadType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + integer, intent(in) :: next_level + class(MethodType), pointer, intent(inout) :: submethod + + select type (subcell => this%subcell) + type is (SubcellRectType) + call this%load_subcell(particle, subcell) + end select + call method_subcell_plck%init( & + subcell=this%subcell, & + trackfilectl=this%trackfilectl, & + tracktimes=this%tracktimes) + submethod => method_subcell_plck + end subroutine load_mcpq + + !> @brief Pass particle to next subcell if there is one, or to the cell face + subroutine pass_mcpq(this, particle) + ! -- dummy + class(MethodCellPollockQuadType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + ! -- local + integer :: isc, exitFace, npolyverts, inface, infaceoff + + select type (cell => this%cell) + type is (CellRectQuadType) + exitFace = particle%iboundary(3) + isc = particle%idomain(3) + npolyverts = cell%defn%npolyverts + + select case (exitFace) ! kluge note: exitFace uses Dave's iface convention + case (0) + ! -- Subcell interior (cell interior) + inface = -1 + case (1) + select case (isc) + case (1) + ! -- W face, subcell 1 --> E face, subcell 4 (cell interior) + particle%idomain(3) = 4 + particle%iboundary(3) = 2 + inface = 0 ! kluge note: want Domain(2) unchanged; Boundary(2) = 0 + case (2) + ! -- W face, subcell 2 --> E face, subcell 3 (cell interior) + particle%idomain(3) = 3 + particle%iboundary(3) = 2 + inface = 0 ! kluge note: want Domain(2) unchanged; Boundary(2) = 0 + case (3) + ! -- W face, subcell 3 (cell face) + inface = 1 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + infaceoff = 0 + case (4) + ! -- W face, subcell 4 (cell face) + inface = 2 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + infaceoff = -1 + end select + case (2) + select case (isc) + case (1) + ! -- E face, subcell 1 (cell face) + inface = 3 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + infaceoff = 0 + case (2) + ! -- E face, subcell 2 (cell face) + inface = 4 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + infaceoff = -1 + case (3) + ! -- E face, subcell 3 --> W face, subcell 2 (cell interior) + particle%idomain(3) = 2 + particle%iboundary(3) = 1 + inface = 0 ! kluge note: want Domain(2) unchanged; Boundary(2) = 0 + case (4) + ! -- E face, subcell 4 --> W face subcell 1 (cell interior) + particle%idomain(3) = 1 + particle%iboundary(3) = 1 + inface = 0 ! kluge note: want Domain(2) unchanged; Boundary(2) = 0 + end select + case (3) + select case (isc) + case (1) + ! -- S face, subcell 1 --> N face, subcell 2 (cell interior) + particle%idomain(3) = 2 + particle%iboundary(3) = 4 + inface = 0 ! kluge note: want Domain(2) unchanged; Boundary(2) = 0 + case (2) + ! -- S face, subcell 2 (cell face) + inface = 4 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + infaceoff = 0 + case (3) + ! -- S face, subcell 3 (cell face) + inface = 1 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + infaceoff = -1 + case (4) + ! -- S face, subcell 4 --> N face, subcell 3 (cell interior) + particle%idomain(3) = 3 + particle%iboundary(3) = 4 + inface = 0 ! kluge note: want Domain(2) unchanged; Boundary(2) = 0 + end select + case (4) + select case (isc) + case (1) + ! -- N face, subcell 1 (cell face) + inface = 3 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + infaceoff = -1 + case (2) + ! -- N face, subcell 2 --> S face, subcell 1 (cell interior) + particle%idomain(3) = 1 + particle%iboundary(3) = 3 + inface = 0 ! kluge note: want Domain(2) unchanged; Boundary(2) = 0 + case (3) + ! -- N face, subcell 3 --> S face, subcell 4 (cell interior) + particle%idomain(3) = 4 + particle%iboundary(3) = 3 + inface = 0 ! kluge note: want Domain(2) unchanged; Boundary(2) = 0 + case (4) + ! -- N face, subcell 4 (cell face) + inface = 2 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + infaceoff = 0 + end select + case (5) + ! -- Subcell bottom (cell bottom) + inface = npolyverts + 2 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + case (6) + ! -- Subcell top (cell top) + inface = npolyverts + 3 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + end select + if (inface .eq. -1) then + particle%iboundary(2) = 0 + else if (inface .eq. 0) then + particle%iboundary(2) = 0 + else + if ((inface .ge. 1) .and. (inface .le. 4)) then + ! -- Account for local cell rotation + inface = inface + cell%irvOrigin - 1 + if (inface .gt. 4) inface = inface - 4 + inface = cell%irectvert(inface) + infaceoff + if (inface .lt. 1) inface = inface + npolyverts + end if + particle%iboundary(2) = inface + end if + end select + end subroutine pass_mcpq + + !> @brief Solve the quad-rectangular cell via Pollock's method + subroutine apply_mcpq(this, particle, tmax) + use TdisModule, only: kper, kstp + ! -- dummy + class(MethodCellPollockQuadType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + real(DP), intent(in) :: tmax + ! -- local + double precision :: xOrigin, yOrigin, zOrigin, sinrot, cosrot + + select type (cell => this%cell) + type is (CellRectQuadType) + ! -- Update particle state, terminate early if done advancing + call this%update(particle, cell%defn) + if (.not. particle%advancing) return + + ! -- If the particle is above the top of the cell (which is presumed to + ! -- represent a water table above the cell bottom), pass the particle + ! -- vertically and instantaneously to the cell top elevation and save + ! -- the particle state to output file(s). + if (particle%z > cell%defn%top) then + particle%z = cell%defn%top + call this%trackfilectl%save(particle, kper=kper, & + kstp=kstp, reason=1) ! reason=1: cell transition + end if + + ! -- Transform particle location into local cell coordinates, + ! translated and rotated but not scaled relative to model. + ! Then track particle, transform back to model coordinates, + ! and reset transformation (drop accumulated roundoff error) + xOrigin = cell%xOrigin + yOrigin = cell%yOrigin + zOrigin = cell%zOrigin + sinrot = cell%sinrot + cosrot = cell%cosrot + call particle%transform(xOrigin, yOrigin, zOrigin, & + sinrot, cosrot) + call this%track(particle, 2, tmax) ! kluge, hardwired to level 2 + call particle%transform(xOrigin, yOrigin, zOrigin, & + sinrot, cosrot, invert=.true.) + call particle%transform(reset=.true.) + end select + end subroutine apply_mcpq + + !> @brief Load the rectangular subcell from the rectangular cell + subroutine load_subcell(this, particle, subcell) + ! -- dummy + class(MethodCellPollockQuadType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + class(SubcellRectType), intent(inout) :: subcell + ! -- local + double precision :: dx, dy, dz, areax, areay, areaz + double precision :: dxprel, dyprel + integer :: isc, npolyverts, m1, m2 + double precision :: qextl1, qextl2, qintl1, qintl2 + double precision :: factor, term + + select type (cell => this%cell) + type is (CellRectQuadType) + factor = DONE / cell%defn%retfactor + factor = factor / cell%defn%porosity + npolyverts = cell%defn%npolyverts + + isc = particle%idomain(3) + ! -- Subcells 1, 2, 3, and 4 are Pollock's subcells A, B, C, and D, + ! -- respectively + + dx = cell%dx + dy = cell%dy + ! -- If not already known, determine subcell number + if (isc .le. 0) then + dxprel = particle%x / dx + dyprel = particle%y / dy + if (dxprel .lt. 5d-1) then + if (dyprel .lt. 5d-1) then + isc = 3 + else if (dyprel .gt. 5d-1) then + isc = 4 + else + ! kluge note: need to resolve this ambiguity based on flow direction + call pstop(1, "particle initially on shared subcell edge") + end if + else if (dxprel .gt. 5d-1) then + if (dyprel .lt. 5d-1) then + isc = 2 + else if (dyprel .gt. 5d-1) then + isc = 1 + else + ! kluge note: need to resolve this ambiguity based on flow direction + call pstop(1, "particle initially on shared subcell edge") + end if + else + ! kluge note: need to resolve this ambiguity based on flow direction + call pstop(1, "particle initially on shared subcell edge") + end if + subcell%isubcell = isc + ! kluge note: as a matter of form, do we want to allow + ! this subroutine to modify the particle??? + particle%idomain(3) = isc + ! kluge note: initial insubface is not currently being determined + end if + dx = 5d-1 * dx + dy = 5d-1 * dy + dz = cell%defn%top - & + cell%defn%bot ! kluge note: need to account for partial saturation + areax = dy * dz + areay = dx * dz + areaz = dx * dy + qintl1 = cell%qintl(isc) + ! qintl list wraps around, so isc+1=5 is ok + qintl2 = cell%qintl(isc + 1) + qextl1 = cell%qextl1(isc) + qextl2 = cell%qextl2(isc) + ! + subcell%dx = dx + subcell%dy = dy + subcell%dz = dz + subcell%sinrot = 0d0 + subcell%cosrot = 1d0 + subcell%zOrigin = 0d0 + select case (isc) + case (1) + subcell%xOrigin = dx + subcell%yOrigin = dy + term = factor / areax + subcell%vx1 = qintl1 * term + subcell%vx2 = -qextl2 * term + term = factor / areay + subcell%vy1 = -qintl2 * term + subcell%vy2 = -qextl1 * term + case (2) + subcell%xOrigin = dx + subcell%yOrigin = 0d0 + term = factor / areax + subcell%vx1 = -qintl2 * term + subcell%vx2 = -qextl1 * term + term = factor / areay + subcell%vy1 = qextl2 * term + subcell%vy2 = -qintl1 * term + case (3) + subcell%xOrigin = 0d0 + subcell%yOrigin = 0d0 + term = factor / areax + subcell%vx1 = qextl2 * term + subcell%vx2 = -qintl1 * term + term = factor / areay + subcell%vy1 = qextl1 * term + subcell%vy2 = qintl2 * term + case (4) + subcell%xOrigin = 0d0 + subcell%yOrigin = dy + term = factor / areax + subcell%vx1 = qextl1 * term + subcell%vx2 = qintl2 * term + term = factor / areay + subcell%vy1 = qintl1 * term + subcell%vy2 = -qextl2 * term + end select + m1 = npolyverts + 2 + m2 = m1 + 1 + term = factor / areaz + subcell%vz1 = 2.5d-1 * cell%defn%faceflow(m1) * term + subcell%vz2 = -2.5d-1 * cell%defn%faceflow(m2) * term + end select + end subroutine load_subcell + +end module MethodCellPollockQuadModule diff --git a/src/Solution/ParticleTracker/MethodCellPool.f90 b/src/Solution/ParticleTracker/MethodCellPool.f90 new file mode 100644 index 00000000000..88a34b710e5 --- /dev/null +++ b/src/Solution/ParticleTracker/MethodCellPool.f90 @@ -0,0 +1,41 @@ +!> @brief Cell-level tracking methods. +module MethodCellPoolModule + + use MethodCellPollockModule + use MethodCellPollockQuadModule + use MethodCellTernaryModule + use MethodCellPassToBotModule + implicit none + + private + public :: create_method_cell_pool + public :: destroy_method_cell_pool + + type(MethodCellPollockType), pointer, public :: method_cell_plck => null() + type(MethodCellPollockQuadType), pointer, public :: method_cell_quad => null() + type(MethodCellTernaryType), pointer, public :: method_cell_tern => null() + type(MethodCellPassToBotType), pointer, public :: method_cell_ptb => null() + +contains + + !> @brief Create the cell method pool + subroutine create_method_cell_pool() + call create_method_cell_pollock(method_cell_plck) + call create_method_cell_quad(method_cell_quad) + call create_method_cell_ternary(method_cell_tern) + call create_method_cell_ptb(method_cell_ptb) + end subroutine create_method_cell_pool + + !> @brief Destroy the cell method pool + subroutine destroy_method_cell_pool() + call method_cell_plck%destroy() + deallocate (method_cell_plck) + call method_cell_quad%destroy() + deallocate (method_cell_quad) + call method_cell_tern%destroy() + deallocate (method_cell_tern) + call method_cell_ptb%destroy() + deallocate (method_cell_ptb) + end subroutine destroy_method_cell_pool + +end module MethodCellPoolModule diff --git a/src/Solution/ParticleTracker/MethodCellTernary.f90 b/src/Solution/ParticleTracker/MethodCellTernary.f90 new file mode 100644 index 00000000000..b84a86d78d2 --- /dev/null +++ b/src/Solution/ParticleTracker/MethodCellTernary.f90 @@ -0,0 +1,397 @@ +module MethodCellTernaryModule + + use KindModule, only: DP, I4B + use ErrorUtilModule, only: pstop + use MethodModule + use MethodSubcellPoolModule + use CellPolyModule + use CellDefnModule + use SubcellTriModule, only: SubcellTriType, create_subcell_tri + use ParticleModule + use TrackModule, only: TrackFileControlType + use ArrayHandlersModule, only: ExpandArray + implicit none + + private + public :: MethodCellTernaryType + public :: create_method_cell_ternary + + type, extends(MethodType) :: MethodCellTernaryType + private + real(DP), allocatable :: x_vert(:) + real(DP), allocatable :: y_vert(:) !< cell vertex coordinates + real(DP), allocatable :: vx_vert_polygon(:) + real(DP), allocatable :: vy_vert_polygon(:) !< cell vertex velocities + real(DP) :: xctr + real(DP) :: yctr !< cell center coordinates + real(DP) :: vxctr + real(DP) :: vyctr !< cell center velocities + real(DP) :: ztop + real(DP) :: zbot !< cell top and bottom elevations + real(DP) :: dz !< cell thickness + real(DP) :: vztop + real(DP) :: vzbot !< cell top and bottom velocities + integer(I4B), public, pointer :: zeromethod + contains + procedure, public :: apply => apply_mct + procedure, public :: destroy => destroy_mct + procedure, public :: load => load_mct + procedure, public :: load_subcell + procedure, public :: pass => pass_mct + end type MethodCellTernaryType + +contains + + !> @brief Create a tracking method + subroutine create_method_cell_ternary(method) + ! -- dummy + type(MethodCellTernaryType), pointer :: method + ! -- local + type(CellPolyType), pointer :: cell + type(SubcellTriType), pointer :: subcell + + allocate (method) + allocate (method%zeromethod) + call create_cell_poly(cell) + method%cell => cell + method%type => method%cell%type + method%delegates = .true. + call create_subcell_tri(subcell) + method%subcell => subcell + method%zeromethod = 0 + end subroutine create_method_cell_ternary + + !> @brief Destroy the tracking method + subroutine destroy_mct(this) + class(MethodCellTernaryType), intent(inout) :: this + deallocate (this%type) + end subroutine destroy_mct + + !> @brief Load subcell into tracking method + subroutine load_mct(this, particle, next_level, submethod) + ! -- dummy + class(MethodCellTernaryType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + integer(I4B), intent(in) :: next_level + class(MethodType), pointer, intent(inout) :: submethod + + select type (subcell => this%subcell) + type is (SubcellTriType) + call this%load_subcell(particle, subcell) + end select + call method_subcell_tern%init( & + subcell=this%subcell, & + trackfilectl=this%trackfilectl, & + tracktimes=this%tracktimes) + submethod => method_subcell_tern + method_subcell_tern%zeromethod = this%zeromethod + end subroutine load_mct + + !> @brief Pass particle to next subcell if there is one, or to the cell face + subroutine pass_mct(this, particle) + ! -- dummy + class(MethodCellTernaryType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + ! local + integer(I4B) :: isc + integer(I4B) :: exitFace + integer(I4B) :: inface + integer(I4B) :: npolyverts + + exitFace = particle%iboundary(3) + isc = particle%idomain(3) + select type (cell => this%cell) + type is (CellPolyType) + npolyverts = cell%defn%npolyverts + end select + + select case (exitFace) + case (0) + ! -- Subcell interior (cell interior) + inface = -1 + case (1) + ! -- Subcell face 1 (cell face) + inface = isc + if (inface .eq. 0) inface = npolyverts + case (2) + ! -- Subcell face --> next subcell in "cycle" (cell interior) + isc = isc + 1 + if (isc .gt. npolyverts) isc = 1 + particle%idomain(3) = isc + particle%iboundary(3) = 3 + inface = 0 + case (3) + ! -- Subcell face --> preceding subcell in "cycle" (cell interior) + isc = isc - 1 + if (isc .lt. 1) isc = npolyverts + particle%idomain(3) = isc + particle%iboundary(3) = 2 + inface = 0 + case (4) + ! -- Subcell bottom (cell bottom) + inface = npolyverts + 2 + case (5) + ! -- Subcell top (cell top) + inface = npolyverts + 3 + end select + if (inface .eq. -1) then + particle%iboundary(2) = 0 + else if (inface .eq. 0) then + particle%iboundary(2) = 0 + else + particle%iboundary(2) = inface + end if + end subroutine pass_mct + + !> @brief Apply the ternary method to a polygonal cell + subroutine apply_mct(this, particle, tmax) + use ConstantsModule, only: DZERO, DONE, DHALF + use TdisModule, only: kper, kstp + ! dummy + class(MethodCellTernaryType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + real(DP), intent(in) :: tmax + ! local + integer(I4B) :: npolyverts + integer(I4B) :: iv + integer(I4B) :: ivp1 + integer(I4B) :: ivm1 + real(DP) :: retfactor + real(DP) :: x0 + real(DP) :: y0 + real(DP) :: x1 + real(DP) :: y1 + real(DP) :: x2 + real(DP) :: y2 + real(DP) :: xsum + real(DP) :: ysum + real(DP) :: vxsum + real(DP) :: vysum + real(DP) :: flow0 + real(DP) :: flow1 + real(DP) :: v0x + real(DP) :: v0y + real(DP) :: d01x + real(DP) :: d01y + real(DP) :: d02x + real(DP) :: d02y + real(DP) :: det + real(DP) :: area + real(DP) :: term + + select type (cell => this%cell) + type is (CellPolyType) + ! -- Update particle state, checking whether any reporting or + ! -- termination conditions apply + call this%update(particle, cell%defn) + + ! -- Return early if particle is done advancing + if (.not. particle%advancing) return + + ! -- If the particle is above the top of the cell (presumed water table) + ! -- pass it vertically and instantaneously to the cell top and save the + ! -- particle state to file + if (particle%z > cell%defn%top) then + particle%z = cell%defn%top + call this%trackfilectl%save(particle, kper=kper, & + kstp=kstp, reason=1) ! reason=1: cell transition + end if + + npolyverts = cell%defn%npolyverts + if (allocated(this%x_vert)) then + deallocate (this%x_vert) + deallocate (this%y_vert) + deallocate (this%vx_vert_polygon) + deallocate (this%vy_vert_polygon) + end if + allocate (this%x_vert(npolyverts)) + allocate (this%y_vert(npolyverts)) + allocate (this%vx_vert_polygon(npolyverts)) + allocate (this%vy_vert_polygon(npolyverts)) + + xsum = DZERO + ysum = DZERO + vxsum = DZERO + vysum = DZERO + area = DZERO + this%ztop = cell%defn%top + this%zbot = cell%defn%bot + this%dz = this%ztop - this%zbot + do iv = 1, npolyverts + ivp1 = iv + 1 + if (ivp1 .gt. npolyverts) ivp1 = 1 + ivm1 = iv - 1 + if (ivm1 .lt. 1) ivm1 = npolyverts + x0 = cell%defn%polyvert(1, iv) + y0 = cell%defn%polyvert(2, iv) + x2 = cell%defn%polyvert(1, ivp1) + y2 = cell%defn%polyvert(2, ivp1) + x1 = cell%defn%polyvert(1, ivm1) + y1 = cell%defn%polyvert(2, ivm1) + term = DONE / (cell%defn%porosity * this%dz) + flow0 = cell%defn%faceflow(iv) * term + flow1 = cell%defn%faceflow(ivm1) * term + d01x = x1 - x0 ! kluge note: do this more efficiently, not recomputing things so much??? + d01y = y1 - y0 + d02x = x2 - x0 + d02y = y2 - y0 + ! kluge note: can det ever be zero, like maybe for a 180-deg vertex??? + ! oodet = DONE/(d01y*d02x - d02y*d01x) + ! velmult = particle%velmult + ! kluge note: "flow" is volumetric (face) flow rate per unit thickness, divided by porosity + ! v0x = -velmult*oodet*(d02x*flow1 + d01x*flow0) + ! v0y = -velmult*oodet*(d02y*flow1 + d01y*flow0) ! + det = d01y * d02x - d02y * d01x + retfactor = cell%defn%retfactor + ! kluge note: can det ever be zero, like maybe for a 180-deg vertex??? + ! term = velfactor/det + ! kluge note: can det ever be zero, like maybe for a 180-deg vertex??? + term = DONE / (retfactor * det) + ! kluge note: "flow" here is volumetric flow rate (MODFLOW face flow) + v0x = -term * (d02x * flow1 + d01x * flow0) + ! per unit thickness, divided by porosity + v0y = -term * (d02y * flow1 + d01y * flow0) + this%vx_vert_polygon(iv) = v0x + this%vy_vert_polygon(iv) = v0y + xsum = xsum + x0 + ysum = ysum + y0 + vxsum = vxsum + v0x + vysum = vysum + v0y + this%x_vert(iv) = x0 + this%y_vert(iv) = y0 + area = area + x0 * y1 - x1 * y0 + end do + area = area * DHALF + term = DONE / (retfactor * cell%defn%porosity * area) + this%vzbot = cell%defn%faceflow(npolyverts + 2) * term + this%vztop = -cell%defn%faceflow(npolyverts + 3) * term + this%xctr = xsum / dble(npolyverts) + this%yctr = ysum / dble(npolyverts) + this%vxctr = vxsum / dble(npolyverts) + this%vyctr = vysum / dble(npolyverts) + + ! -- Track across subcells + call this%track(particle, 2, tmax) ! kluge, hardwired to level 2 + end select + end subroutine apply_mct + + !> @brief Loads a triangular subcell from the polygonal cell + subroutine load_subcell(this, particle, subcell) + ! -- modules + use ParticleModule, only: get_particle_id + ! -- dummy + class(MethodCellTernaryType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + class(SubcellTriType), intent(inout) :: subcell + ! -- local + integer(I4B) :: ic + integer(I4B) :: isc + integer(I4B) :: npolyverts + integer(I4B) :: iv0 + integer(I4B) :: iv1 + integer(I4B) :: ipv0 + integer(I4B) :: ipv1 + integer(I4B) :: iv + real(DP) :: x0 + real(DP) :: y0 + real(DP) :: x1 + real(DP) :: y1 + real(DP) :: x2 + real(DP) :: y2 + real(DP) :: x1rel + real(DP) :: y1rel + real(DP) :: x2rel + real(DP) :: y2rel + real(DP) :: xi + real(DP) :: yi + real(DP) :: di2 + real(DP) :: d02 + real(DP) :: d12 + real(DP) :: di1 + real(DP) :: d01 + real(DP) :: alphai + real(DP) :: betai + real(DP) :: betatol + + select type (cell => this%cell) + type is (CellPolyType) + ic = cell%defn%icell + subcell%icell = ic + isc = particle%idomain(3) + npolyverts = cell%defn%npolyverts + if (isc .le. 0) then + xi = particle%x + yi = particle%y + do iv = 1, npolyverts + iv0 = iv + iv1 = iv + 1 + if (iv1 .gt. npolyverts) iv1 = 1 + ipv0 = iv0 + ipv1 = iv1 + x0 = this%x_vert(ipv0) + y0 = this%y_vert(ipv0) + x1 = this%x_vert(ipv1) + y1 = this%y_vert(ipv1) + x2 = this%xctr + y2 = this%yctr + x1rel = x1 - x0 + y1rel = y1 - y0 + x2rel = x2 - x0 + y2rel = y2 - y0 + di2 = xi * y2rel - yi * x2rel + d02 = x0 * y2rel - y0 * x2rel + d12 = x1rel * y2rel - y1rel * x2rel + di1 = xi * y1rel - yi * x1rel + d01 = x0 * y1rel - y0 * x1rel + alphai = (di2 - d02) / d12 + betai = -(di1 - d01) / d12 + ! kluge note: can iboundary(2) be used to identify the subcell? + betatol = -1e-7 ! kluge + ! kluge note: think this handles points on triangle boundaries ok + if ((alphai .ge. 0d0) .and. & + (betai .ge. betatol) .and. & + (alphai + betai .le. 1d0)) then + isc = iv ! but maybe not!!!!!!!!!!!! + exit ! kluge note: doesn't handle particle smack on cell center + end if + end do + if (isc .le. 0) then + print *, "error -- initial triangle not found for particle ", & + get_particle_id(particle), " in cell ", ic + call pstop(1) + else + ! subcellTri%isubcell = isc + ! kluge note: as a matter of form, do we want to allow + ! this subroutine to modify the particle??? + particle%idomain(3) = isc + end if + end if + subcell%isubcell = isc + + ! -- Set coordinates and velocities at vertices of triangular subcell + iv0 = isc + iv1 = isc + 1 + if (iv1 .gt. npolyverts) iv1 = 1 + ipv0 = iv0 + ipv1 = iv1 + subcell%x0 = this%x_vert(ipv0) + subcell%y0 = this%y_vert(ipv0) + subcell%x1 = this%x_vert(ipv1) + subcell%y1 = this%y_vert(ipv1) + subcell%x2 = this%xctr + subcell%y2 = this%yctr + subcell%v0x = this%vx_vert_polygon(iv0) + subcell%v0y = this%vy_vert_polygon(iv0) + subcell%v1x = this%vx_vert_polygon(iv1) + subcell%v1y = this%vy_vert_polygon(iv1) + subcell%v2x = this%vxctr + subcell%v2y = this%vyctr + subcell%ztop = this%ztop + subcell%zbot = this%zbot + subcell%dz = this%dz + subcell%vzbot = this%vzbot + subcell%vztop = this%vztop + end select + end subroutine load_subcell + +end module MethodCellTernaryModule diff --git a/src/Solution/ParticleTracker/MethodDis.f90 b/src/Solution/ParticleTracker/MethodDis.f90 new file mode 100644 index 00000000000..b1f9eb17119 --- /dev/null +++ b/src/Solution/ParticleTracker/MethodDis.f90 @@ -0,0 +1,444 @@ +module MethodDisModule + + use KindModule, only: DP, I4B + use ConstantsModule, only: DONE, DZERO + use MethodModule, only: MethodType, get_iatop + use MethodCellPoolModule + use CellDefnModule + use CellRectModule + use ParticleModule + use PrtFmiModule, only: PrtFmiType + use GwfDisModule, only: GwfDisType + use TrackModule, only: TrackFileControlType + use GeomUtilModule, only: get_ijk, get_jk + use ArrayHandlersModule, only: ExpandArray + implicit none + + private + public :: MethodDisType + public :: create_method_dis + + type, extends(MethodType) :: MethodDisType + contains + procedure, public :: apply => apply_dis ! apply the method + procedure, public :: destroy !< destructor for the method + procedure, public :: load => load_dis ! load the method + procedure :: load_cell_defn !< load cell definition from the grid + procedure, public :: pass => pass_dis !< pass the particle to the next domain + procedure, private :: get_top ! get cell top elevation + procedure, private :: load_nbrs_to_defn ! load face neighbors + procedure, private :: load_flows_to_defn ! loads face flows + procedure, private :: load_boundary_flows_to_defn ! loads BoundaryFlows + end type MethodDisType + +contains + + !> @brief Create a new structured grid (DIS) tracking method + subroutine create_method_dis(method) + ! -- dummy + type(MethodDisType), pointer :: method + ! -- local + type(CellRectType), pointer :: cell + + allocate (method) + allocate (method%type) + call create_cell_rect(cell) + method%cell => cell + method%type = "dis" + method%delegates = .true. + end subroutine create_method_dis + + !> @brief Destructor the tracking method + subroutine destroy(this) + class(MethodDisType), intent(inout) :: this + deallocate (this%type) + end subroutine destroy + + !> @brief Load the cell geometry and method (tracking strategy) + subroutine load_dis(this, particle, next_level, submethod) + ! -- dummy + class(MethodDisType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + integer(I4B), intent(in) :: next_level + class(MethodType), pointer, intent(inout) :: submethod + ! -- local + integer(I4B) :: ic + integer(I4B) :: icu + integer(I4B) :: irow + integer(I4B) :: jcol + integer(I4B) :: klay + real(DP) :: areax + real(DP) :: areay + real(DP) :: areaz + real(DP) :: dx + real(DP) :: dy + real(DP) :: dz + real(DP) :: factor + real(DP) :: term + + select type (cell => this%cell) + type is (CellRectType) + select type (dis => this%fmi%dis) + type is (GwfDisType) + ic = particle%idomain(next_level) + call this%load_cell_defn(ic, cell%defn) + + ! -- If cell is active but dry, select and initialize + ! -- pass-to-bottom method and set cell method pointer + if (this%fmi%ibdgwfsat0(ic) == 0) then ! kluge note: use cellDefn%sat == DZERO here instead? + call method_cell_ptb%init( & + cell=this%cell, & + trackfilectl=this%trackfilectl, & + tracktimes=this%tracktimes) + submethod => method_cell_ptb + else + ! -- load rectangular cell (todo: refactor into separate routine) + icu = dis%get_nodeuser(ic) + call get_ijk(icu, dis%nrow, dis%ncol, dis%nlay, & + irow, jcol, klay) + dx = dis%delr(jcol) + dy = dis%delc(irow) + dz = cell%defn%top - cell%defn%bot + cell%dx = dx + cell%dy = dy + cell%dz = dz + cell%sinrot = DZERO + cell%cosrot = DONE + cell%xOrigin = cell%defn%polyvert(1, 1) ! kluge note: could avoid using polyvert here + cell%yOrigin = cell%defn%polyvert(2, 1) + cell%zOrigin = cell%defn%bot + cell%ipvOrigin = 1 + areax = dy * dz + areay = dx * dz + areaz = dx * dy + factor = DONE / cell%defn%retfactor + factor = factor / cell%defn%porosity + term = factor / areax + cell%vx1 = cell%defn%faceflow(1) * term + cell%vx2 = -cell%defn%faceflow(3) * term + term = factor / areay + cell%vy1 = cell%defn%faceflow(4) * term + cell%vy2 = -cell%defn%faceflow(2) * term + term = factor / areaz + cell%vz1 = cell%defn%faceflow(6) * term + cell%vz2 = -cell%defn%faceflow(7) * term + + ! -- Select and initialize Pollock's method and set method pointer + call method_cell_plck%init( & + cell=this%cell, & + trackfilectl=this%trackfilectl, & + tracktimes=this%tracktimes) + submethod => method_cell_plck + end if + end select + end select + end subroutine load_dis + + !> @brief Pass a particle to the next cell, if there is one + subroutine pass_dis(this, particle) + ! -- modules + use TdisModule, only: kper, kstp + ! -- dummy + class(MethodDisType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + ! -- local + integer(I4B) :: inface + integer(I4B) :: ipos + integer(I4B) :: ic + integer(I4B) :: icu + integer(I4B) :: inbr + integer(I4B) :: idiag + integer(I4B) :: ilay + integer(I4B) :: irow + integer(I4B) :: icol + real(DP) :: z + real(DP) :: zrel + real(DP) :: topfrom + real(DP) :: botfrom + real(DP) :: top + real(DP) :: bot + real(DP) :: sat + + inface = particle%iboundary(2) + z = particle%z + + select type (cell => this%cell) + type is (CellRectType) + select type (dis => this%fmi%dis) + type is (GwfDisType) + inbr = cell%defn%facenbr(inface) + if (inbr .eq. 0) then + ! -- Exterior face; no neighbor to map to + ! particle%idomain(1) = 0 + ! particle%idomain(2) = 0 ! kluge note: set a "has_exited" attribute instead??? + ! particle%idomain(1) = -abs(particle%idomain(1)) ! kluge??? + ! particle%idomain(2) = -abs(particle%idomain(2)) ! kluge??? + particle%istatus = 2 ! kluge note: use -2 to allow check for transfer to another model??? + particle%advancing = .false. + call this%trackfilectl%save(particle, kper=kper, & + kstp=kstp, reason=3) ! reason=3: termination + ! particle%iboundary(2) = -1 + else + idiag = dis%con%ia(cell%defn%icell) + ipos = idiag + inbr + ic = dis%con%ja(ipos) ! kluge note: use PRT model's DIS instead of fmi's??? + particle%idomain(2) = ic + + ! compute and set user node number and layer on particle + icu = dis%get_nodeuser(ic) + call get_ijk(icu, dis%nrow, dis%ncol, dis%nlay, & + irow, icol, ilay) + particle%icu = icu + particle%ilay = ilay + + ! call this%mapToNbrCell(cellRect%cellDefn,inface,z) + if (inface .eq. 1) then + inface = 3 + else if (inface .eq. 2) then + inface = 4 + else if (inface .eq. 3) then + inface = 1 + else if (inface .eq. 4) then + inface = 2 + else if (inface .eq. 6) then + inface = 7 + else if (inface .eq. 7) then + inface = 6 + end if + particle%iboundary(2) = inface + if (inface < 5) then + ! -- Map z between cells + topfrom = cell%defn%top + botfrom = cell%defn%bot + zrel = (z - botfrom) / (topfrom - botfrom) + top = dis%top(ic) ! kluge note: use PRT model's DIS instead of fmi's??? + bot = dis%bot(ic) + sat = this%fmi%gwfsat(ic) + z = bot + zrel * sat * (top - bot) + end if + particle%z = z + ! -- Update cell-cell flows of particle mass. + ! Every particle is currently assigned unit mass. + ! -- leaving old cell + this%flowja(ipos) = this%flowja(ipos) - DONE + ! -- entering new cell + this%flowja(dis%con%isym(ipos)) & + = this%flowja(dis%con%isym(ipos)) + DONE + end if + end select + end select + end subroutine pass_dis + + !> @brief Apply the method to a particle + subroutine apply_dis(this, particle, tmax) + class(MethodDisType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + real(DP), intent(in) :: tmax + + call this%track(particle, 1, tmax) ! kluge, hardwired to level 1 + end subroutine apply_dis + + !> @brief Returns a top elevation based on index iatop + function get_top(this, iatop) result(top) + class(MethodDisType), intent(inout) :: this + integer, intent(in) :: iatop + double precision :: top + + if (iatop .lt. 0) then + top = this%fmi%dis%top(-iatop) + else + top = this%fmi%dis%bot(iatop) + end if + end function get_top + + !> @brief Loads cell definition from the grid + subroutine load_cell_defn(this, ic, defn) + ! -- dummy + class(MethodDisType), intent(inout) :: this + integer(I4B), intent(in) :: ic + type(CellDefnType), pointer, intent(inout) :: defn + + select type (dis => this%fmi%dis) + type is (GwfDisType) + ! -- Set basic cell properties + defn%icell = ic + defn%npolyverts = 4 ! rectangular cell always has 4 vertices + defn%iatop = get_iatop(dis%get_ncpl(), & + dis%get_nodeuser(ic)) + defn%top = dis%bot(ic) + & + this%fmi%gwfsat(ic) * (dis%top(ic) - dis%bot(ic)) + defn%bot = dis%bot(ic) + defn%sat = this%fmi%gwfsat(ic) + defn%porosity = this%porosity(ic) + defn%retfactor = this%retfactor(ic) + defn%izone = this%izone(ic) + defn%can_be_rect = .true. + defn%can_be_quad = .false. + + ! -- Load cell polygon vertices + call dis%get_polyverts( & + defn%icell, & + defn%polyvert, & + closed=.true.) + + ! -- Load face neighbors + call this%load_nbrs_to_defn(defn) + + ! -- Load 180 degree face indicators + call ExpandArray(defn%ispv180, defn%npolyverts + 1) + defn%ispv180(1:defn%npolyverts + 1) = .false. + + ! -- Load flows (assumes face neighbors already loaded) + call this%load_flows_to_defn(defn) + end select + end subroutine load_cell_defn + + !> @brief Loads face neighbors to cell definition from the grid. + !! Assumes cell index and number of vertices are already loaded. + subroutine load_nbrs_to_defn(this, defn) + ! -- dummy + class(MethodDisType), intent(inout) :: this + type(CellDefnType), pointer, intent(inout) :: defn + ! -- local + integer(I4B) :: ic1 + integer(I4B) :: ic2 + integer(I4B) :: icu1 + integer(I4B) :: icu2 + integer(I4B) :: j1 + integer(I4B) :: iloc + integer(I4B) :: ipos + integer(I4B) :: irow1 + integer(I4B) :: irow2 + integer(I4B) :: jcol1 + integer(I4B) :: jcol2 + integer(I4B) :: klay1 + integer(I4B) :: klay2 + integer(I4B) :: iedgeface + + ! -- Allocate facenbr array + call ExpandArray(defn%facenbr, defn%npolyverts + 3) + + select type (dis => this%fmi%dis) + type is (GwfDisType) + ! -- Load face neighbors + defn%facenbr = 0 + ic1 = defn%icell + icu1 = dis%get_nodeuser(ic1) + call get_ijk(icu1, dis%nrow, dis%ncol, dis%nlay, & + irow1, jcol1, klay1) + call get_jk(icu1, dis%get_ncpl(), dis%nlay, j1, klay1) + do iloc = 1, dis%con%ia(ic1 + 1) - dis%con%ia(ic1) - 1 + ipos = dis%con%ia(ic1) + iloc + if (dis%con%mask(ipos) == 0) cycle ! kluge note: need mask here??? + ic2 = dis%con%ja(ipos) + icu2 = dis%get_nodeuser(ic2) + call get_ijk(icu2, dis%nrow, dis%ncol, dis%nlay, & + irow2, jcol2, klay2) + if (klay2 == klay1) then + ! -- Edge (polygon) face neighbor + if (irow2 > irow1) then + ! Neighbor to the S + iedgeface = 4 ! kluge note: make sure this numbering is consistent with numbering in cell method + else if (jcol2 > jcol1) then + ! Neighbor to the E + iedgeface = 3 + else if (irow2 < irow1) then + ! Neighbor to the N + iedgeface = 2 + else + ! Neighbor to the W + iedgeface = 1 + end if + defn%facenbr(iedgeface) = int(iloc, 1) + else if (klay2 > klay1) then + ! -- Bottom face neighbor + defn%facenbr(defn%npolyverts + 2) = int(iloc, 1) + else + ! -- Top face neighbor + defn%facenbr(defn%npolyverts + 3) = int(iloc, 1) + end if + end do + end select + ! -- List of edge (polygon) faces wraps around + ! todo: why need to wrap around? no analog to "closing" a polygon? + defn%facenbr(defn%npolyverts + 1) = defn%facenbr(1) + end subroutine load_nbrs_to_defn + + !> @brief Load flows into the cell definition. + !! These include face flows and net distributed flows. + !! Assumes cell index and number of vertices are already loaded. + subroutine load_flows_to_defn(this, defn) + ! -- dummy + class(MethodDisType), intent(inout) :: this + type(CellDefnType), intent(inout) :: defn + ! -- local + integer(I4B) :: ic + integer(I4B) :: m + integer(I4B) :: n + integer(I4B) :: npolyverts + + ic = defn%icell + npolyverts = defn%npolyverts + + ! -- allocate faceflow array + call ExpandArray(defn%faceflow, npolyverts + 3) + + ! -- Load face flows. Note that the faceflow array + ! -- does not get reallocated if it is already allocated + ! -- to a size greater than or equal to npolyverts+3. + defn%faceflow = 0d0 ! kluge note: eventually use DZERO for 0d0 throughout + ! -- As with polygon nbrs, polygon face flows wrap around for + ! -- convenience at position npolyverts+1, and bot and top flows + ! -- are tacked on the end of the list + do m = 1, npolyverts + 3 + n = defn%facenbr(m) + if (n > 0) & + defn%faceflow(m) = this%fmi%gwfflowja(this%fmi%dis%con%ia(ic) + n) + ! if (cellDefn%faceflow(m) < 0d0) defn%inoexitface = 0 + end do + ! -- Add BoundaryFlows to face flows + call this%load_boundary_flows_to_defn(defn) + ! -- Set inoexitface flag + defn%inoexitface = 1 + do m = 1, npolyverts + 3 ! kluge note: can be streamlined with above code + if (defn%faceflow(m) < 0d0) defn%inoexitface = 0 + end do + + ! -- Add up net distributed flow + defn%distflow = this%fmi%SourceFlows(ic) + this%fmi%SinkFlows(ic) + & + this%fmi%StorageFlows(ic) + + ! -- Set weak sink flag + if (this%fmi%SinkFlows(ic) .ne. 0d0) then + defn%iweaksink = 1 + else + defn%iweaksink = 0 + end if + end subroutine load_flows_to_defn + + !> @brief Add boundary flows to the cell definition faceflow array. + !! Assumes cell index and number of vertices are already loaded. + subroutine load_boundary_flows_to_defn(this, defn) + ! -- dummy + class(MethodDisType), intent(inout) :: this + type(CellDefnType), intent(inout) :: defn + ! -- local + integer(I4B) :: ioffset + + ioffset = (defn%icell - 1) * 10 + defn%faceflow(1) = defn%faceflow(1) + & + this%fmi%BoundaryFlows(ioffset + 1) ! kluge note: should these be additive (seems so)??? + defn%faceflow(2) = defn%faceflow(2) + & + this%fmi%BoundaryFlows(ioffset + 2) + defn%faceflow(3) = defn%faceflow(3) + & + this%fmi%BoundaryFlows(ioffset + 3) + defn%faceflow(4) = defn%faceflow(4) + & + this%fmi%BoundaryFlows(ioffset + 4) + defn%faceflow(5) = defn%faceflow(1) + defn%faceflow(6) = defn%faceflow(6) + & + this%fmi%BoundaryFlows(ioffset + 9) + defn%faceflow(7) = defn%faceflow(7) + & + this%fmi%BoundaryFlows(ioffset + 10) + end subroutine load_boundary_flows_to_defn + +end module MethodDisModule diff --git a/src/Solution/ParticleTracker/MethodDisv.f90 b/src/Solution/ParticleTracker/MethodDisv.f90 new file mode 100644 index 00000000000..15781913592 --- /dev/null +++ b/src/Solution/ParticleTracker/MethodDisv.f90 @@ -0,0 +1,786 @@ +module MethodDisvModule + + use KindModule, only: DP, I4B, LGP + use ErrorUtilModule, only: pstop + use ConstantsModule, only: DONE + use MethodModule, only: MethodType, get_iatop + use MethodCellPoolModule + use CellDefnModule + use CellPolyModule + use ParticleModule + use PrtFmiModule, only: PrtFmiType + use GwfDisvModule, only: GwfDisvType + use ArrayHandlersModule, only: ExpandArray + use TrackModule, only: TrackFileControlType + use GeomUtilModule, only: get_jk + implicit none + + private + public :: MethodDisvType + public :: create_method_disv + + type, extends(MethodType) :: MethodDisvType + integer(I4B), pointer :: zeromethod + contains + procedure, public :: apply => apply_disv ! applies the DISV-grid method + procedure, public :: destroy ! destructor for the method + procedure, public :: load => load_disv ! loads the cell method + procedure, public :: load_cell_defn ! loads cell definition from the grid + procedure, public :: map_neighbor ! maps a location on the cell face to the shared face of a neighbor + procedure, public :: pass => pass_disv ! passes the particle to the next cell + procedure, private :: get_npolyverts ! returns the number of polygon vertices for a cell in the grid + procedure, private :: get_top ! returns top elevation based on index iatop + procedure, private :: load_nbrs_to_defn ! loads face neighbors to a cell object + procedure, private :: load_flags_to_defn ! loads 180-degree vertex indicator to a cell object + procedure, private :: load_flows_to_defn ! loads flows to a cell object + procedure, private :: load_boundary_flows_to_defn_rect ! adds BoundaryFlows from the grid to the faceflow array of a rectangular cell + procedure, private :: load_boundary_flows_to_defn_rect_quad ! adds BoundaryFlows from the grid to the faceflow array of a rectangular-quad cell + procedure, private :: load_boundary_flows_to_defn_poly ! adds BoundaryFlows from the grid to the faceflow array of a polygonal cell + end type MethodDisvType + +contains + + !> @brief Create a new vertex grid (DISV) tracking method + subroutine create_method_disv(method) + ! -- dummy + type(MethodDisvType), pointer :: method + ! -- local + type(CellPolyType), pointer :: cell + + allocate (method) + allocate (method%type) + allocate (method%zeromethod) + call create_cell_poly(cell) + method%cell => cell + method%type = "disv" + method%delegates = .true. + method%zeromethod = 0 + end subroutine create_method_disv + + !> @brief Destroy the tracking method + subroutine destroy(this) + class(MethodDisvType), intent(inout) :: this + deallocate (this%type) + end subroutine destroy + + !> @brief Load the cell and the tracking method + subroutine load_disv(this, particle, next_level, submethod) + use CellModule + use CellRectModule + use CellRectQuadModule + use CellUtilModule + ! -- dummy + class(MethodDisvType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + integer(I4B), intent(in) :: next_level + class(MethodType), pointer, intent(inout) :: submethod + ! -- local + integer(I4B) :: ic + class(CellType), pointer :: base + type(CellRectType), pointer :: rect + type(CellRectQuadType), pointer :: quad + + select type (cell => this%cell) + type is (CellPolyType) + ! load cell definition + ic = particle%idomain(next_level) ! kluge note: is cell number always known coming in? + call this%load_cell_defn(ic, cell%defn) + if (this%fmi%ibdgwfsat0(ic) == 0) then ! kluge note: use cellDefn%sat == DZERO here instead? + ! -- Cell is active but dry, so select and initialize pass-to-bottom + ! -- cell method and set cell method pointer + call method_cell_ptb%init( & + cell=this%cell, & + trackfilectl=this%trackfilectl, & + tracktimes=this%tracktimes) + submethod => method_cell_ptb + else + ! -- Select and initialize cell method and set cell method pointer + if (cell%defn%can_be_rect) then + call cell_poly_to_rect(cell, rect) + base => rect + call method_cell_plck%init( & + cell=base, & + trackfilectl=this%trackfilectl, & + tracktimes=this%tracktimes) + submethod => method_cell_plck + else if (cell%defn%can_be_quad) then + call cell_poly_to_quad(cell, quad) + base => quad + call method_cell_quad%init( & + cell=base, & + trackfilectl=this%trackfilectl, & + tracktimes=this%tracktimes) + submethod => method_cell_quad + else + call method_cell_tern%init( & + cell=this%cell, & + trackfilectl=this%trackfilectl, & + tracktimes=this%tracktimes) + submethod => method_cell_tern + method_cell_tern%zeromethod = this%zeromethod + end if + end if + end select + end subroutine load_disv + + !> @brief Pass a particle to the next cell, if there is one + subroutine pass_disv(this, particle) + ! -- modules + use GwfDisvModule, only: GwfDisvType + use TdisModule, only: kper, kstp + ! -- dummy + class(MethodDisvType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + ! -- local + integer(I4B) :: inface + integer(I4B) :: ipos + integer(I4B) :: ic + integer(I4B) :: icu + integer(I4B) :: inbr + integer(I4B) :: idiag + integer(I4B) :: icpl + integer(I4B) :: ilay + real(DP) :: z + + inface = particle%iboundary(2) + z = particle%z + + select type (cell => this%cell) + type is (CellPolyType) + select type (dis => this%fmi%dis) + type is (GwfDisvType) + inbr = cell%defn%facenbr(inface) + if (inbr .eq. 0) then + ! -- Exterior face; no neighbor to map to + ! particle%idomain(1) = 0 + ! particle%idomain(2) = 0 ! kluge note: "has_exited" attribute instead??? + ! particle%idomain(1) = -abs(particle%idomain(1)) ! kluge??? + ! particle%idomain(2) = -abs(particle%idomain(2)) ! kluge??? + particle%istatus = 2 ! kluge note, todo: use -2 to check for transfer to another model??? + particle%advancing = .false. + call this%trackfilectl%save(particle, kper=kper, & + kstp=kstp, reason=3) ! reason=3: termination + ! particle%iboundary(2) = -1 + else + idiag = dis%con%ia(cell%defn%icell) + ipos = idiag + inbr + ic = dis%con%ja(ipos) ! kluge note, todo: use PRT model's DIS instead of fmi's?? + particle%idomain(2) = ic + + ! compute and set user node number and layer on particle + icu = dis%get_nodeuser(ic) + call get_jk(icu, dis%ncpl, dis%nlay, icpl, ilay) + particle%icu = icu + particle%ilay = ilay + + call this%map_neighbor(cell%defn, inface, z) + particle%iboundary(2) = inface + particle%idomain(3:) = 0 + particle%iboundary(3:) = 0 + particle%z = z + ! -- Update cell-cell flows of particle mass. + ! Every particle is currently assigned unit mass. + ! -- leaving old cell + this%flowja(ipos) = this%flowja(ipos) - DONE + ! -- entering new cell + this%flowja(dis%con%isym(ipos)) & + = this%flowja(dis%con%isym(ipos)) + DONE + end if + end select + end select + end subroutine pass_disv + + !> @brief Map location on cell face to shared cell face of neighbor + subroutine map_neighbor(this, defn, inface, z) + ! dummy + class(MethodDisvType), intent(inout) :: this + type(CellDefnType), pointer, intent(inout) :: defn + integer(I4B), intent(inout) :: inface + double precision, intent(inout) :: z + ! local + integer(I4B) :: icin + integer(I4B) :: npolyvertsin + integer(I4B) :: ic + integer(I4B) :: npolyverts + integer(I4B) :: inbr + integer(I4B) :: inbrnbr + integer(I4B) :: j + integer(I4B) :: m + real(DP) :: zrel + real(DP) :: topfrom + real(DP) :: botfrom + real(DP) :: top + real(DP) :: bot + real(DP) :: sat + type(CellDefnType), pointer :: cd + + ! -- Map to shared cell face of neighbor + inbr = defn%facenbr(inface) + if (inbr .eq. 0) then ! kluge note: redundant check + ! -- Exterior face; no neighbor to map to + inface = -1 ! kluge??? + else + ! -- Load definition for neighbor cell (neighbor with shared face) + icin = defn%icell + j = this%fmi%dis%con%ia(icin) + ic = this%fmi%dis%con%ja(j + inbr) + call create_defn(cd) + ! kluge note: really only need to load facenbr and npolyverts for this + call this%load_cell_defn(ic, cd) ! kluge + npolyvertsin = defn%npolyverts + npolyverts = cd%npolyverts + if (inface .eq. npolyvertsin + 2) then + ! -- Exits through bot, enters through top + inface = npolyverts + 3 + else if (inface .eq. npolyvertsin + 3) then + ! -- Exits through top, enters through bot + inface = npolyverts + 2 + else + ! -- Exits and enters through shared polygon face + j = this%fmi%dis%con%ia(ic) + ! kluge note: use shared_edge in DisvGeom to find shared polygon face??? + do m = 1, npolyverts + 3 + inbrnbr = cd%facenbr(m) + if (this%fmi%dis%con%ja(j + inbrnbr) .eq. icin) then + inface = m + exit + end if + end do + ! -- Map z between cells + topfrom = defn%top + botfrom = defn%bot + zrel = (z - botfrom) / (topfrom - botfrom) + ! kluge note: use PRT model's DIS instead of fmi's??? + top = this%fmi%dis%top(ic) + bot = this%fmi%dis%bot(ic) + sat = this%fmi%gwfsat(ic) + z = bot + zrel * sat * (top - bot) + end if + deallocate (cd) + end if + end subroutine map_neighbor + + !> @brief Apply the DISV-grid method + subroutine apply_disv(this, particle, tmax) + class(MethodDisvType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + real(DP), intent(in) :: tmax + call this%track(particle, 1, tmax) ! kluge, hardwired to level 1 + end subroutine apply_disv + + !> @brief Return the number of polygon vertices for a cell in the grid + function get_npolyverts(this, ic) result(npolyverts) + ! -- dummy + class(MethodDisvType), intent(inout) :: this + integer(I4B), intent(in) :: ic + ! -- local + integer(I4B) :: icu + integer(I4B) :: icu2d + integer(I4B) :: ncpl + ! -- result + integer(I4B) :: npolyverts + + select type (dis => this%fmi%dis) + type is (GwfDisvType) + ncpl = dis%get_ncpl() + icu = dis%get_nodeuser(ic) + icu2d = icu - ((icu - 1) / ncpl) * ncpl ! kluge note: use MOD or MODULO??? + npolyverts = dis%iavert(icu2d + 1) - dis%iavert(icu2d) - 1 + if (npolyverts .le. 0) npolyverts = npolyverts + size(dis%javert) ! kluge??? + end select + end function get_npolyverts + + !> @brief Get top elevation based on index iatop + !! kluge note: not needed??? + function get_top(this, iatop) result(top) + ! -- dummy + class(MethodDisvType), intent(inout) :: this + integer(I4B), intent(in) :: iatop + ! -- result + real(DP) :: top + + if (iatop .lt. 0) then + top = this%fmi%dis%top(-iatop) + else + top = this%fmi%dis%bot(iatop) + end if + end function get_top + + !> @brief Load cell definition from the grid + subroutine load_cell_defn(this, ic, defn) + ! -- dummy + class(MethodDisvType), intent(inout) :: this + integer(I4B), intent(in) :: ic + type(CellDefnType), pointer, intent(inout) :: defn + ! -- local + real(DP) :: top + real(DP) :: bot + real(DP) :: sat + + ! -- Load basic cell properties + defn%icell = ic + defn%npolyverts = this%get_npolyverts(ic) + defn%iatop = get_iatop(this%fmi%dis%get_ncpl(), & + this%fmi%dis%get_nodeuser(ic)) + top = this%fmi%dis%top(ic) + bot = this%fmi%dis%bot(ic) + sat = this%fmi%gwfsat(ic) + top = bot + sat * (top - bot) + defn%top = top + defn%bot = bot + defn%sat = sat + defn%porosity = this%porosity(ic) + defn%retfactor = this%retfactor(ic) + defn%izone = this%izone(ic) + + ! -- Load polygon vertices + call this%fmi%dis%get_polyverts( & + defn%icell, & + defn%polyvert, & + closed=.true.) + + ! -- Load face neighbors + call this%load_nbrs_to_defn(defn) + + ! -- Load 180-degree indicator + call this%load_flags_to_defn(defn) + + ! -- Load flows (assumes face neighbors already loaded) + call this%load_flows_to_defn(defn) + end subroutine load_cell_defn + + !> @brief Loads face neighbors to cell definition from the grid + !! Assumes cell index and number of vertices are already loaded. + subroutine load_nbrs_to_defn(this, defn) + ! -- dummy + class(MethodDisvType), intent(inout) :: this + type(CellDefnType), pointer, intent(inout) :: defn + ! -- local + integer(I4B) :: ic + integer(I4B) :: npolyverts + integer(I4B) :: ic1 + integer(I4B) :: ic2 + integer(I4B) :: icu1 + integer(I4B) :: icu2 + integer(I4B) :: j1 + integer(I4B) :: j2 + integer(I4B) :: k1 + integer(I4B) :: k2 + integer(I4B) :: iloc + integer(I4B) :: ipos + integer(I4B) :: istart1 + integer(I4B) :: istart2 + integer(I4B) :: istop1 + integer(I4B) :: istop2 + integer(I4B) :: iedgeface + integer(I4B) :: ncpl + + ic = defn%icell + npolyverts = defn%npolyverts + + ! -- allocate facenbr array + call ExpandArray(defn%facenbr, npolyverts + 3) + + select type (dis => this%fmi%dis) + type is (GwfDisvType) + ! -- Load face neighbors. + defn%facenbr = 0 + ic1 = ic + icu1 = dis%get_nodeuser(ic1) + ncpl = dis%get_ncpl() + call get_jk(icu1, ncpl, dis%nlay, j1, k1) + istart1 = dis%iavert(j1) + istop1 = dis%iavert(j1 + 1) - 1 + do iloc = 1, dis%con%ia(ic1 + 1) - dis%con%ia(ic1) - 1 + ipos = dis%con%ia(ic1) + iloc + if (dis%con%mask(ipos) == 0) cycle ! kluge note: need mask here??? + ic2 = dis%con%ja(ipos) + icu2 = dis%get_nodeuser(ic2) + call get_jk(icu2, ncpl, dis%nlay, j2, k2) + istart2 = dis%iavert(j2) + istop2 = dis%iavert(j2 + 1) - 1 + call shared_edgeface(dis%javert(istart1:istop1), & + dis%javert(istart2:istop2), & + iedgeface) + if (iedgeface /= 0) then + ! -- Edge (polygon) face neighbor + defn%facenbr(iedgeface) = int(iloc, 1) + else + if (k2 > k1) then + ! -- Bottom face neighbor + defn%facenbr(npolyverts + 2) = int(iloc, 1) + else if (k2 < k1) then + ! -- Top face neighbor + defn%facenbr(npolyverts + 3) = int(iloc, 1) + else + call pstop(1, "k2 should be <> k1, since no shared edge face") + end if + end if + end do + end select + ! -- List of edge (polygon) faces wraps around + defn%facenbr(npolyverts + 1) = defn%facenbr(1) + + end subroutine load_nbrs_to_defn + + !> @brief Find the edge face shared by two cells + !! + !! Find the shared edge face of cell1 shared by cell1 and cell2. + !! isharedface will return with 0 if there is no shared edge + !! face. Proceed forward through ivlist1 and backward through + !! ivlist2 as a clockwise face in cell1 must correspond to a + !! counter clockwise face in cell2. + !! + !! kluge note: based on DisvGeom shared_edge + !< + subroutine shared_edgeface(ivlist1, ivlist2, iedgeface) + integer(I4B), dimension(:) :: ivlist1 + integer(I4B), dimension(:) :: ivlist2 + integer(I4B), intent(out) :: iedgeface + integer(I4B) :: nv1 + integer(I4B) :: nv2 + integer(I4B) :: il1 + integer(I4B) :: il2 + logical(LGP) :: found + + found = .false. + nv1 = size(ivlist1) + nv2 = size(ivlist2) + iedgeface = 0 + outerloop: do il1 = 1, nv1 - 1 + do il2 = nv2, 2, -1 + if (ivlist1(il1) == ivlist2(il2) .and. & + ivlist1(il1 + 1) == ivlist2(il2 - 1)) then + found = .true. + iedgeface = il1 + exit outerloop + end if + end do + if (found) exit + end do outerloop + end subroutine shared_edgeface + + !> @brief Load flows into the cell definition. + !! These include face flows and net distributed flows. + !! Assumes cell index and number of vertices are already loaded. + subroutine load_flows_to_defn(this, defn) + ! -- dummy + class(MethodDisvType), intent(inout) :: this + type(CellDefnType), intent(inout) :: defn + ! -- local + integer(I4B) :: ic + integer(I4B) :: npolyverts + integer(I4B) :: m + integer(I4B) :: n + + ic = defn%icell + npolyverts = defn%npolyverts + + ! -- allocate faceflow array + call ExpandArray(defn%faceflow, npolyverts + 3) + + ! -- Load face flows. Note that the faceflow array + ! -- does not get reallocated if it is already allocated + ! -- to a size greater than or equal to npolyverts+3. + defn%faceflow = 0d0 + + ! -- As with polygon nbrs, polygon face flows wrap around for + ! -- convenience at position npolyverts+1, and bot and top flows + ! -- are tacked on the end of the list + do m = 1, npolyverts + 3 + n = defn%facenbr(m) + if (n > 0) & + defn%faceflow(m) = this%fmi%gwfflowja(this%fmi%dis%con%ia(ic) + n) + end do + call this%load_boundary_flows_to_defn_poly(defn) + ! -- Set inoexitface flag + defn%inoexitface = 1 + do m = 1, npolyverts + 3 ! kluge note: can be streamlined with above code + if (defn%faceflow(m) < 0d0) defn%inoexitface = 0 + end do + + ! -- Add up net distributed flow + defn%distflow = this%fmi%SourceFlows(ic) + this%fmi%SinkFlows(ic) + & + this%fmi%StorageFlows(ic) + + ! -- Set weak sink flag + if (this%fmi%SinkFlows(ic) .ne. 0d0) then + defn%iweaksink = 1 + else + defn%iweaksink = 0 + end if + + end subroutine load_flows_to_defn + + !> @brief Load boundary flows from the grid into a rectangular cell. + !! Assumes cell index and number of vertices are already loaded. + subroutine load_boundary_flows_to_defn_rect(this, defn) + ! -- dummy + class(MethodDisvType), intent(inout) :: this + type(CellDefnType), intent(inout) :: defn + ! -- local + integer(I4B) :: ic + integer(I4B) :: npolyverts + integer(I4B) :: ioffset + + ic = defn%icell + npolyverts = defn%npolyverts + + ! kluge note - assignment of BoundaryFlows to faceflow below assumes vertex 1 + ! is at upper left of rectangular cell, and BoundaryFlows use old iface order + ! ioffset = (ic - 1)*6 + ioffset = (ic - 1) * 10 + ! kluge note: should these be additive (seems so)??? + defn%faceflow(1) = defn%faceflow(1) + & + this%fmi%BoundaryFlows(ioffset + 4) + defn%faceflow(2) = defn%faceflow(2) + & + this%fmi%BoundaryFlows(ioffset + 2) + defn%faceflow(3) = defn%faceflow(3) + & + this%fmi%BoundaryFlows(ioffset + 3) + defn%faceflow(4) = defn%faceflow(4) + & + this%fmi%BoundaryFlows(ioffset + 1) + defn%faceflow(5) = defn%faceflow(1) + defn%faceflow(6) = defn%faceflow(6) + & + this%fmi%BoundaryFlows(ioffset + 9) + defn%faceflow(7) = defn%faceflow(7) + & + this%fmi%BoundaryFlows(ioffset + 10) + + end subroutine load_boundary_flows_to_defn_rect + + !> @brief Load boundary flows from the grid into rectangular quadcell. + !! Assumes cell index and number of vertices are already loaded. + subroutine load_boundary_flows_to_defn_rect_quad(this, defn) + ! -- dummy + class(MethodDisvType), intent(inout) :: this + type(CellDefnType), intent(inout) :: defn + ! -- local + integer(I4B) :: ic + integer(I4B) :: npolyverts + integer(I4B) :: m + integer(I4B) :: n + integer(I4B) :: nn + integer(I4B) :: ioffset + integer(I4B) :: nbf + integer(I4B) :: m1 + integer(I4B) :: m2 + integer(I4B) :: mdiff + real(DP) :: qbf + integer(I4B) :: irectvert(5) ! kluge + + ic = defn%icell + npolyverts = defn%npolyverts + + ! kluge note - assignment of BoundaryFlows to faceflow below assumes vertex 1 + ! is at upper left of rectangular cell, and BoundaryFlows use old iface order + ! ioffset = (ic - 1)*6 + ioffset = (ic - 1) * 10 + ! -- Polygon faces in positions 1 through npolyverts + do n = 1, 4 + if (n .eq. 2) then + nbf = 4 + else if (n .eq. 4) then + nbf = 1 + else + nbf = n + end if + qbf = this%fmi%BoundaryFlows(ioffset + nbf) + nn = 0 ! kluge ... + do m = 1, npolyverts + if (.not. defn%ispv180(m)) then + nn = nn + 1 + irectvert(nn) = m + end if + end do + irectvert(5) = irectvert(1) ! ... kluge + m1 = irectvert(n) + m2 = irectvert(n + 1) + if (m2 .lt. m1) m2 = m2 + npolyverts + mdiff = m2 - m1 + if (mdiff .eq. 1) then + ! -- Assign BoundaryFlow to corresponding polygon face + defn%faceflow(m1) = defn%faceflow(m1) + qbf + else + ! -- Split BoundaryFlow between two faces on quad-refined edge + qbf = 5d-1 * qbf + defn%faceflow(m1) = defn%faceflow(m1) + qbf + defn%faceflow(m1 + 1) = defn%faceflow(m1 + 1) + qbf + end if + end do + ! -- Wrap around to 1 in position npolyverts+1 + m = npolyverts + 1 + defn%faceflow(m) = defn%faceflow(1) + ! -- Bottom in position npolyverts+2 + m = m + 1 + defn%faceflow(m) = defn%faceflow(m) + & + this%fmi%BoundaryFlows(ioffset + 9) + ! -- Top in position npolyverts+3 + m = m + 1 + defn%faceflow(m) = defn%faceflow(m) + & + this%fmi%BoundaryFlows(ioffset + 10) + + end subroutine load_boundary_flows_to_defn_rect_quad + + !> @brief Load boundary flows from the grid into a polygonal cell. + !! Assumes cell index and number of vertices are already loaded. + subroutine load_boundary_flows_to_defn_poly(this, defn) + ! -- dummy + class(MethodDisvType), intent(inout) :: this + type(CellDefnType), intent(inout) :: defn + ! -- local + integer(I4B) :: ic + integer(I4B) :: npolyverts + integer(I4B) :: ioffset + integer(I4B) :: iv + + ic = defn%icell + npolyverts = defn%npolyverts + + ! kluge note: hardwired for max 8 polygon faces plus top and bottom for now + ioffset = (ic - 1) * 10 + do iv = 1, npolyverts + ! kluge note: should these be additive (seems so)??? + defn%faceflow(iv) = & + defn%faceflow(iv) + & + this%fmi%BoundaryFlows(ioffset + iv) + end do + defn%faceflow(npolyverts + 1) = defn%faceflow(1) + defn%faceflow(npolyverts + 2) = & + defn%faceflow(npolyverts + 2) + & + this%fmi%BoundaryFlows(ioffset + 9) + defn%faceflow(npolyverts + 3) = & + defn%faceflow(npolyverts + 3) + & + this%fmi%BoundaryFlows(ioffset + 10) + + end subroutine load_boundary_flows_to_defn_poly + + !> @brief Load 180-degree vertex indicator array and set flags + !! indicating how cell can be represented (kluge: latter needed?). + !! Assumes cell index and number of vertices are already loaded. + subroutine load_flags_to_defn(this, defn) ! kluge note: rename??? + ! -- dummy + class(MethodDisvType), intent(inout) :: this + type(CellDefnType), pointer, intent(inout) :: defn + ! -- local + integer(I4B) :: npolyverts + integer(I4B) :: m + integer(I4B) :: m0 + integer(I4B) :: m1 + integer(I4B) :: m2 + integer(I4B) :: ic + integer(I4B) :: num90 + integer(I4B) :: num180 + integer(I4B) :: numacute + real(DP) :: x0 + real(DP) :: y0 + real(DP) :: x1 + real(DP) :: y1 + real(DP) :: x2 + real(DP) :: y2 + real(DP) :: epsang + real(DP) :: epslen + real(DP) :: s0x + real(DP) :: s0y + real(DP) :: & + s0mag, s2x, s2y, s2mag, sinang, dotprod + logical(LGP) last180 + + ic = defn%icell + npolyverts = defn%npolyverts + + ! -- allocate ispv180 array + call ExpandArray(defn%ispv180, npolyverts + 1) + + ! -- Load 180-degree indicator. + ! -- Also, set flags that indicate how cell can be represented. + defn%ispv180(1:npolyverts + 1) = .false. + defn%can_be_rect = .false. + defn%can_be_quad = .false. + epsang = 1d-3 ! kluge hardwire, and using one value for all angles + epslen = 1d-3 ! kluge hardwire + num90 = 0 + num180 = 0 + numacute = 0 + last180 = .false. + ! kluge note: assumes non-self-intersecting polygon; + ! no checks for self-intersection (e.g., star) + do m = 1, npolyverts + m1 = m + if (m1 .eq. 1) then + m0 = npolyverts + m2 = 2 + else if (m1 .eq. npolyverts) then + m0 = npolyverts - 1 + m2 = 1 + else + m0 = m1 - 1 + m2 = m1 + 1 + end if + x0 = defn%polyvert(1, m0) + y0 = defn%polyvert(2, m0) + x1 = defn%polyvert(1, m1) + y1 = defn%polyvert(2, m1) + x2 = defn%polyvert(1, m2) + y2 = defn%polyvert(2, m2) + s0x = x0 - x1 + s0y = y0 - y1 + s0mag = dsqrt(s0x * s0x + s0y * s0y) + s2x = x2 - x1 + s2y = y2 - y1 + s2mag = dsqrt(s2x * s2x + s2y * s2y) + sinang = (s0x * s2y - s0y * s2x) / (s0mag * s2mag) + ! kluge note: is it better to check in terms of angle rather than sin{angle}??? + if (dabs(sinang) .lt. epsang) then + dotprod = s0x * s2x + s0y * s2y + if (dotprod .gt. 0d0) then + print *, "Cell ", ic, " has a zero angle" ! kluge + print *, " (tolerance epsang = ", epsang, ")" + call pstop(1) + else + if (last180) then + print *, "Cell ", ic, & + " has consecutive 180-deg angles - not supported" ! kluge + print *, " (tolerance epsang = ", epsang, ")" + call pstop(1) + else if (dabs((s2mag - s0mag) / max(s2mag, s0mag)) .gt. epslen) then + print *, "Cell ", ic, & + " has a non-bisecting 180-deg vertex - not supported" ! kluge + print *, " (tolerance epslen = ", epslen, ")" + call pstop(1) + end if + ! kluge note: want to evaluate 180-deg vertex using one criterion implemented in + ! one place (procedure) to avoid potential disparities between multiple checks + num180 = num180 + 1 + last180 = .true. + defn%ispv180(m) = .true. + end if + else if (sinang .gt. 0d0) then + numacute = numacute + 1 + if (dabs(1d0 - sinang) .lt. epsang) num90 = num90 + 1 + last180 = .false. + else + print *, "Cell ", ic, & + " has an obtuse angle and so is nonconvex" ! kluge + print *, " (tolerance epsang = ", epsang, ")" + call pstop(1) + end if + end do + if ((num90 .ne. 4) .and. (num180 .ne. 0)) then + print *, "Cell ", ic, & + " is a non-rectangle with a 180-deg angle - not supported" ! kluge + print *, " (tolerance epsang = ", epsang, ")" + call pstop(1) + end if + ! -- List of 180-degree indicators wraps around for convenience + defn%ispv180(npolyverts + 1) = defn%ispv180(1) + ! + if (num90 .eq. 4) then + if (num180 .eq. 0) then + defn%can_be_rect = .true. + else + defn%can_be_quad = .true. + end if + end if + + end subroutine load_flags_to_defn + +end module MethodDisvModule diff --git a/src/Solution/ParticleTracker/MethodPool.f90 b/src/Solution/ParticleTracker/MethodPool.f90 new file mode 100644 index 00000000000..810bae266da --- /dev/null +++ b/src/Solution/ParticleTracker/MethodPool.f90 @@ -0,0 +1,30 @@ +!> @brief Model-level tracking methods. +module MethodPoolModule + use MethodModule, only: MethodType + use MethodDisModule, only: MethodDisType, create_method_dis + use MethodDisvModule, only: MethodDisvType, create_method_disv + implicit none + + private + public :: create_method_pool, destroy_method_pool + + type(MethodDisType), pointer, public :: method_dis => null() + type(MethodDisvType), pointer, public :: method_disv => null() + +contains + + !> @brief Create the method pool + subroutine create_method_pool() + call create_method_dis(method_dis) + call create_method_disv(method_disv) + end subroutine create_method_pool + + !> @brief Destroy the method pool + subroutine destroy_method_pool() + call method_dis%destroy() + deallocate (method_dis) + call method_disv%destroy() + deallocate (method_disv) + end subroutine destroy_method_pool + +end module MethodPoolModule diff --git a/src/Solution/ParticleTracker/MethodSubcellPollock.f90 b/src/Solution/ParticleTracker/MethodSubcellPollock.f90 new file mode 100644 index 00000000000..86d01e44ad2 --- /dev/null +++ b/src/Solution/ParticleTracker/MethodSubcellPollock.f90 @@ -0,0 +1,452 @@ +module MethodSubcellPollockModule + use KindModule, only: DP, I4B, LGP + use ErrorUtilModule, only: pstop + use MethodModule, only: MethodType + use SubcellRectModule, only: SubcellRectType, create_subcell_rect + use ParticleModule, only: ParticleType + use PrtFmiModule, only: PrtFmiType + use TrackModule, only: TrackFileControlType + use BaseDisModule, only: DisBaseType + use GwfDisModule, only: GwfDisType + use CellModule, only: CellType + implicit none + private + public :: MethodSubcellPollockType + public :: create_method_subcell_pollock + public :: calculate_dt + + !> @brief Rectangular subcell tracking method + type, extends(MethodType) :: MethodSubcellPollockType + private + real(DP), allocatable, public :: qextl1(:), qextl2(:), qintl(:) !< external and internal subcell flows + contains + procedure, public :: apply => apply_msp + procedure, public :: destroy => destroy_msp + procedure, private :: track_subcell + end type MethodSubcellPollockType + +contains + + !> @brief Create a new Pollock's subcell-method object + subroutine create_method_subcell_pollock(method) + ! -- dummy + type(MethodSubcellPollockType), pointer :: method + ! -- local + type(SubcellRectType), pointer :: subcell + + allocate (method) + call create_subcell_rect(subcell) + method%subcell => subcell + method%type => method%subcell%type + method%delegates = .false. + end subroutine create_method_subcell_pollock + + !> @brief Destructor for a Pollock's subcell-method object + subroutine destroy_msp(this) + class(MethodSubcellPollockType), intent(inout) :: this + deallocate (this%type) + end subroutine destroy_msp + + !> @brief Apply Pollock's method to a rectangular subcell + subroutine apply_msp(this, particle, tmax) + ! -- dummy + class(MethodSubcellPollockType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + real(DP), intent(in) :: tmax + ! -- local + real(DP) :: xOrigin + real(DP) :: yOrigin + real(DP) :: zOrigin + real(DP) :: sinrot + real(DP) :: cosrot + + select type (subcell => this%subcell) + type is (SubcellRectType) + ! -- Transform particle position into local subcell coordinates, + ! track particle across subcell, convert back to model coords + ! (sinrot and cosrot should be 0 and 1, respectively, i.e. no + ! rotation, also no z translation; only x and y translations) + xOrigin = subcell%xOrigin + yOrigin = subcell%yOrigin + zOrigin = subcell%zOrigin + sinrot = subcell%sinrot + cosrot = subcell%cosrot + call particle%transform(xOrigin, yOrigin) + call this%track_subcell(subcell, particle, tmax) + call particle%transform(xOrigin, yOrigin, invert=.true.) + end select + end subroutine apply_msp + + !> @brief Track a particle across a rectangular subcell using Pollock's method + !! + !! This subroutine consists partly of code written by + !! David W. Pollock of the USGS for MODPATH 7. PRT's + !! authors take responsibility for its application in + !! this context and for any modifications or errors. + !< + subroutine track_subcell(this, subcell, particle, tmax) + ! modules + use ParticleModule, only: get_particle_id + use TdisModule, only: kper, kstp + ! dummy + class(MethodSubcellPollockType), intent(inout) :: this + class(SubcellRectType), intent(in) :: subcell + type(ParticleType), pointer, intent(inout) :: particle + real(DP), intent(in) :: tmax + ! local + real(DP) :: vx + real(DP) :: dvxdx + real(DP) :: vy + real(DP) :: dvydy + real(DP) :: vz + real(DP) :: dvzdz + real(DP) :: dtexitx + real(DP) :: dtexity + real(DP) :: dtexitz + real(DP) :: dtexit + real(DP) :: texit + real(DP) :: dt + real(DP) :: t + real(DP) :: t0 + real(DP) :: x + real(DP) :: y + real(DP) :: z + integer(I4B) :: statusVX + integer(I4B) :: statusVY + integer(I4B) :: statusVZ + integer(I4B) :: i + real(DP) :: initialX + real(DP) :: initialY + real(DP) :: initialZ + integer(I4B) :: exitFace + integer(I4B) :: reason + integer(I4B) :: tslice(2) !< user-time slice for the current time step + + reason = -1 + + ! -- Initial particle location in scaled subcell coordinates + initialX = particle%x / subcell%dx + initialY = particle%y / subcell%dy + initialZ = particle%z / subcell%dz + + ! -- Compute time of travel to each possible exit face + statusVX = calculate_dt(subcell%vx1, subcell%vx2, subcell%dx, & + initialX, vx, dvxdx, dtexitx) + statusVY = calculate_dt(subcell%vy1, subcell%vy2, subcell%dy, & + initialY, vy, dvydy, dtexity) + statusVZ = calculate_dt(subcell%vz1, subcell%vz2, subcell%dz, & + initialZ, vz, dvzdz, dtexitz) + + ! -- Subcells should never be strong sinks, contact the developer situation + if ((statusVX .eq. 3) .and. (statusVY .eq. 3) .and. (statusVZ .eq. 3)) then + print *, "Subcell with no exit face:", & + "particle", get_particle_id(particle), & + "cell", particle%idomain(2) + call pstop(1) + end if + + ! -- Determine (earliest) exit face and corresponding travel time to exit + exitFace = 0 + dtexit = 1.0d+30 + if ((statusVX .lt. 2) .or. (statusVY .lt. 2) .or. (statusVZ .lt. 2)) then + ! -- Consider x-oriented faces + dtexit = dtexitx + if (vx .lt. 0d0) then + exitFace = 1 + else if (vx .gt. 0) then + exitFace = 2 + end if + ! -- Consider y-oriented faces + if (dtexity .lt. dtexit) then + dtexit = dtexity + if (vy .lt. 0d0) then + exitFace = 3 + else if (vy .gt. 0d0) then + exitFace = 4 + end if + end if + ! -- Consider z-oriented faces + if (dtexitz .lt. dtexit) then + dtexit = dtexitz + if (vz .lt. 0d0) then + exitFace = 5 + else if (vz .gt. 0d0) then + exitFace = 6 + end if + end if + else + end if + + ! -- Compute exit time + texit = particle%ttrack + dtexit + t0 = particle%ttrack + + ! -- Select user tracking times to solve. If this is the first time step + ! of the simulation, include all times before it begins; if it is the + ! last time step include all times after it ends, otherwise the times + ! within the current period and time step only. + call this%tracktimes%try_advance() + tslice = this%tracktimes%selection + if (all(tslice > 0)) then + do i = tslice(1), tslice(2) + t = this%tracktimes%times(i) + if (t < particle%ttrack .or. t >= texit .or. t >= tmax) cycle + dt = t - t0 + x = new_x(vx, dvxdx, subcell%vx1, subcell%vx2, & + dt, initialX, subcell%dx, statusVX == 1) + y = new_x(vy, dvydy, subcell%vy1, subcell%vy2, & + dt, initialY, subcell%dy, statusVY == 1) + z = new_x(vz, dvzdz, subcell%vz1, subcell%vz2, & + dt, initialZ, subcell%dz, statusVZ == 1) + particle%x = x * subcell%dx + particle%y = y * subcell%dy + particle%z = z * subcell%dz + particle%ttrack = t + particle%istatus = 1 + call this%trackfilectl%save(particle, kper=kper, & + kstp=kstp, reason=5) + end do + end if + + if (texit .gt. tmax) then + ! -- The computed exit time is greater than the maximum time, so set + ! -- final time for particle trajectory equal to maximum time and + ! -- calculate particle location at that final time. + t = tmax + dt = t - t0 + x = new_x(vx, dvxdx, subcell%vx1, subcell%vx2, & + dt, initialX, subcell%dx, statusVX == 1) + y = new_x(vy, dvydy, subcell%vy1, subcell%vy2, & + dt, initialY, subcell%dy, statusVY == 1) + z = new_x(vz, dvzdz, subcell%vz1, subcell%vz2, & + dt, initialZ, subcell%dz, statusVZ == 1) + exitFace = 0 + particle%istatus = 1 + particle%advancing = .false. + reason = 2 ! timestep end + else + ! -- The computed exit time is less than or equal to the maximum time, + ! -- so set final time for particle trajectory equal to exit time and + ! -- calculate exit location. + t = texit + dt = dtexit + if ((exitFace .eq. 1) .or. (exitFace .eq. 2)) then + x = 0d0 + y = new_x(vy, dvydy, subcell%vy1, subcell%vy2, & + dt, initialY, subcell%dy, statusVY == 1) + z = new_x(vz, dvzdz, subcell%vz1, subcell%vz2, & + dt, initialZ, subcell%dz, statusVZ == 1) + if (exitFace .eq. 2) x = 1.0d0 + else if ((exitFace .eq. 3) .or. (exitFace .eq. 4)) then + x = new_x(vx, dvxdx, subcell%vx1, subcell%vx2, dt, & + initialX, subcell%dx, statusVX == 1) + y = 0d0 + z = new_x(vz, dvzdz, subcell%vz1, subcell%vz2, dt, & + initialZ, subcell%dz, statusVZ == 1) + if (exitFace .eq. 4) y = 1.0d0 + else if ((exitFace .eq. 5) .or. (exitFace .eq. 6)) then + x = new_x(vx, dvxdx, subcell%vx1, subcell%vx2, & + dt, initialX, subcell%dx, statusVX == 1) + y = new_x(vy, dvydy, subcell%vy1, subcell%vy2, & + dt, initialY, subcell%dy, statusVY == 1) + z = 0d0 + if (exitFace .eq. 6) z = 1.0d0 + else + print *, "programmer error, invalid exit face", exitFace + call pstop(1) + end if + reason = 1 ! cell transition + end if + + ! -- Set final particle location in local (unscaled) subcell coordinates, + ! -- final time for particle trajectory, and exit face + particle%x = x * subcell%dx + particle%y = y * subcell%dy + particle%z = z * subcell%dz + particle%ttrack = t + particle%iboundary(3) = exitFace + + ! -- Save particle track record + if (reason > -1) & + call this%trackfilectl%save(particle, kper=kper, & + kstp=kstp, reason=reason) + + end subroutine track_subcell + + !> @brief Calculate particle travel time to exit and exit status. + !! + !! This subroutine consists partly or entirely of code written by + !! David W. Pollock of the USGS for MODPATH 7. The authors of the present + !! code are responsible for its appropriate application in this context + !! and for any modifications or errors. + !< + function calculate_dt(v1, v2, dx, xL, v, dvdx, dt) result(status) + ! dummy + real(DP) :: v1 + real(DP) :: v2 + real(DP) :: dx + real(DP) :: xL + real(DP) :: v + real(DP) :: dvdx + real(DP) :: dt + ! result + integer(I4B) :: status + ! local + real(DP) :: v2a + real(DP) :: v1a + real(DP) :: dv + real(DP) :: dva + real(DP) :: vv + real(DP) :: vvv + real(DP) :: zro + real(DP) :: zrom + real(DP) :: x + real(DP) :: tol + real(DP) :: vr1 + real(DP) :: vr2 + real(DP) :: vr + real(DP) :: v1v2 + logical(LGP) :: noOutflow + + ! -- Initialize variables. + status = -1 + dt = 1.0d+20 + v2a = v2 + if (v2a .lt. 0d0) v2a = -v2a + v1a = v1 + if (v1a .lt. 0d0) v1a = -v1a + dv = v2 - v1 + dva = dv + if (dva .lt. 0d0) dva = -dva + + ! -- Check for a uniform zero velocity in this direction. + ! -- If so, set status = 2 and return (dt = 1.0d+20). + tol = 1.0d-15 + if ((v2a .lt. tol) .and. (v1a .lt. tol)) then + v = 0d0 + dvdx = 0d0 + status = 2 + return + end if + + ! -- Check for uniform non-zero velocity in this direction. + ! -- If so, set compute dt using the constant velocity, + ! -- set status = 1 and return. + vv = v1a + if (v2a .gt. vv) vv = v2a + vvv = dva / vv + if (vvv .lt. 1.0d-4) then + zro = tol + zrom = -zro + v = v1 + x = xL * dx + if (v1 .gt. zro) dt = (dx - x) / v1 + if (v1 .lt. zrom) dt = -x / v1 + dvdx = 0d0 + status = 1 + return + end if + + ! -- Velocity has a linear variation. + ! -- Compute velocity corresponding to particle position. + dvdx = dv / dx + v = (1.0d0 - xL) * v1 + xL * v2 + + ! -- If flow is into the cell from both sides there is no outflow. + ! -- In that case, set status = 3 and return. + noOutflow = .true. + if (v1 .lt. 0d0) noOutflow = .false. + if (v2 .gt. 0d0) noOutflow = .false. + if (noOutflow) then + status = 3 + return + end if + + ! -- If there is a divide in the cell for this flow direction, check to + ! -- see if the particle is located exactly on the divide. If it is, move + ! -- it very slightly to get it off the divide. This avoids possible + ! -- numerical problems related to stagnation points. + if ((v1 .le. 0d0) .and. (v2 .ge. 0d0)) then + if (abs(v) .le. 0d0) then + v = 1.0d-20 + if (v2 .le. 0d0) v = -v + end if + end if + + ! -- If there is a flow divide, this check finds out what side of the + ! -- divide the particle is on and sets the value of vr appropriately + ! -- to reflect that location. + vr1 = v1 / v + vr2 = v2 / v + vr = vr1 + if (vr .le. 0d0) then + vr = vr2 + end if + + ! -- If the product v1*v2 > 0, the velocity is in the same direction + ! -- throughout the cell (i.e. no flow divide). If so, set the value + ! -- of vr to reflect the appropriate direction. + v1v2 = v1 * v2 + if (v1v2 .gt. 0d0) then + if (v .gt. 0d0) vr = vr2 + if (v .lt. 0d0) vr = vr1 + end if + + ! -- Check if vr is (very close to) zero. + ! -- If so, set status = 2 and return (dt = 1.0d+20). + if (dabs(vr) .lt. 1.0d-10) then + v = 0d0 + dvdx = 0d0 + status = 2 + return + end if + + ! -- Compute travel time to exit face. Return with status = 0. + dt = log(vr) / dvdx + status = 0 + + end function calculate_dt + + !> @brief Update a cell-local coordinate based on a time increment. + !! + !! This subroutine consists partly or entirely of code written by + !! David W. Pollock of the USGS for MODPATH 7. The authors of the present + !! code are responsible for its appropriate application in this context + !! and for any modifications or errors. + !< + pure function new_x(v, dvdx, v1, v2, dt, x, dx, velocity_profile) result(newx) + ! dummy + real(DP), intent(in) :: v + real(DP), intent(in) :: dvdx + real(DP), intent(in) :: v1 + real(DP), intent(in) :: v2 + real(DP), intent(in) :: dt + real(DP), intent(in) :: x + real(DP), intent(in) :: dx + logical(LGP), intent(in), optional :: velocity_profile + ! result + real(DP) :: newx + logical(LGP) :: lprofile + + ! -- process optional arguments + if (present(velocity_profile)) then + lprofile = velocity_profile + else + lprofile = .false. + end if + + ! -- recompute coordinate + newx = x + if (lprofile) then + newx = newx + (v1 * dt / dx) + else if (v .ne. 0d0) then + newx = newx + (v * (exp(dvdx * dt) - 1.0d0) / dvdx / dx) + end if + + ! -- clamp to [0, 1] + if (newx .lt. 0d0) newx = 0d0 + if (newx .gt. 1.0d0) newx = 1.0d0 + + end function new_x + +end module MethodSubcellPollockModule diff --git a/src/Solution/ParticleTracker/MethodSubcellPool.f90 b/src/Solution/ParticleTracker/MethodSubcellPool.f90 new file mode 100644 index 00000000000..cb07ac34b2f --- /dev/null +++ b/src/Solution/ParticleTracker/MethodSubcellPool.f90 @@ -0,0 +1,31 @@ +!> @brief Subcell-level tracking methods. +module MethodSubcellPoolModule + + use MethodSubcellPollockModule + use MethodSubcellTernaryModule + implicit none + + private + public :: create_method_subcell_pool + public :: destroy_method_subcell_pool + + type(MethodSubcellPollockType), pointer, public :: method_subcell_plck => null() + type(MethodSubcellTernaryType), pointer, public :: method_subcell_tern => null() + +contains + + !> @brief Create the subcell method pool + subroutine create_method_subcell_pool() + call create_method_subcell_pollock(method_subcell_plck) + call create_method_subcell_ternary(method_subcell_tern) + end subroutine create_method_subcell_pool + + !> @brief Destroy the subcell method pool + subroutine destroy_method_subcell_pool() + call method_subcell_plck%destroy() + deallocate (method_subcell_plck) + call method_subcell_tern%destroy() + deallocate (method_subcell_tern) + end subroutine destroy_method_subcell_pool + +end module MethodSubcellPoolModule diff --git a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 new file mode 100644 index 00000000000..04a7151449c --- /dev/null +++ b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 @@ -0,0 +1,495 @@ +module MethodSubcellTernaryModule + use KindModule, only: DP, I4B, LGP + use ErrorUtilModule, only: pstop + use GeomUtilModule, only: skew + use MethodModule, only: MethodType + use CellModule, only: CellType + use SubcellModule, only: SubcellType + use SubcellTriModule, only: SubcellTriType, create_subcell_tri + use ParticleModule, only: ParticleType, get_particle_id + use TrackModule, only: TrackFileControlType + use TernarySolveTrack, only: traverse_triangle, step_analytical, canonical + use PrtFmiModule, only: PrtFmiType + use BaseDisModule, only: DisBaseType + use GwfDisvModule, only: GwfDisvType + implicit none + + private + public :: MethodSubcellTernaryType + public :: create_method_subcell_ternary + + !> @brief Ternary triangular subcell tracking method + type, extends(MethodType) :: MethodSubcellTernaryType + integer(I4B), public, pointer :: zeromethod + contains + procedure, public :: apply => apply_mst + procedure, public :: destroy + procedure, private :: track_subcell + end type MethodSubcellTernaryType + +contains + + !> @brief Create a new ternary subcell-method object + subroutine create_method_subcell_ternary(method) + ! -- dummy + type(MethodSubcellTernaryType), pointer :: method + ! -- local + type(SubcellTriType), pointer :: subcell + + allocate (method) + allocate (method%zeromethod) + call create_subcell_tri(subcell) + method%subcell => subcell + method%type => method%subcell%type + method%delegates = .false. + method%zeromethod = 0 + end subroutine create_method_subcell_ternary + + !> @brief Destructor for a ternary subcell-method object + subroutine destroy(this) + class(MethodSubcellTernaryType), intent(inout) :: this + deallocate (this%type) + end subroutine destroy + + !> @brief Apply the ternary subcell method + subroutine apply_mst(this, particle, tmax) + class(MethodSubcellTernaryType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + real(DP), intent(in) :: tmax + + select type (subcell => this%subcell) + type is (SubcellTriType) + call this%track_subcell(subcell, particle, tmax) + end select + end subroutine apply_mst + + !> @brief Track a particle across a triangular subcell using the ternary method + subroutine track_subcell(this, subcell, particle, tmax) + ! modules + use TdisModule, only: kper, kstp + ! dummy + class(MethodSubcellTernaryType), intent(inout) :: this + class(SubcellTriType), intent(in) :: subcell + type(ParticleType), pointer, intent(inout) :: particle + real(DP), intent(in) :: tmax + ! local + integer(I4B) :: exitFace + logical(LGP) :: lbary ! kluge + real(DP) :: x0 + real(DP) :: y0 + real(DP) :: x1 + real(DP) :: y1 + real(DP) :: x2 + real(DP) :: y2 + real(DP) :: v0x + real(DP) :: v0y + real(DP) :: v1x + real(DP) :: v1y + real(DP) :: v2x + real(DP) :: v2y + real(DP) :: xi + real(DP) :: yi + real(DP) :: zi + real(DP) :: zirel + real(DP) :: ztop + real(DP) :: zbot + real(DP) :: dz + real(DP) :: rxx + real(DP) :: rxy + real(DP) :: ryx + real(DP) :: ryy + real(DP) :: sxx + real(DP) :: sxy + real(DP) :: syy + real(DP) :: rot(2, 2), res(2), loc(2) + real(DP) :: alp + real(DP) :: bet + real(DP) :: alp0 + real(DP) :: bet0 + real(DP) :: alp1 + real(DP) :: bet1 + real(DP) :: alp2 + real(DP) :: bet2 + real(DP) :: alpi + real(DP) :: beti + real(DP) :: vzbot + real(DP) :: vztop + real(DP) :: vzi + real(DP) :: vziodz + real(DP) :: az + real(DP) :: dtexitz + real(DP) :: dt + real(DP) :: t + real(DP) :: t0 + real(DP) :: dtexitxy + real(DP) :: texit + real(DP) :: x + real(DP) :: y + real(DP) :: z + integer(I4B) :: izstatus + integer(I4B) :: itopbotexit + integer(I4B) :: ntmax + integer(I4B) :: nsave + integer(I4B) :: isolv + integer(I4B) :: itrifaceenter + integer(I4B) :: itrifaceexit + real(DP) :: tol + real(DP) :: step + real(DP) :: dtexit + real(DP) :: alpexit + real(DP) :: betexit + integer(I4B) :: ntdebug ! kluge + integer(I4B) :: reason + integer(I4B) :: i + integer(I4B) :: tslice(2) + + lbary = .true. ! kluge + ntmax = 10000 + nsave = 1 ! needed??? + isolv = this%zeromethod + tol = 1d-7 + step = 1e-3 ! needed only for euler + reason = -1 + + ! -- Set some local variables for convenience + xi = particle%x + yi = particle%y + zi = particle%z + x0 = subcell%x0 + y0 = subcell%y0 + x1 = subcell%x1 + y1 = subcell%y1 + x2 = subcell%x2 + y2 = subcell%y2 + v0x = subcell%v0x + v0y = subcell%v0y + v1x = subcell%v1x + v1y = subcell%v1y + v2x = subcell%v2x + v2y = subcell%v2y + zbot = subcell%zbot + ztop = subcell%ztop + dz = subcell%dz + vzbot = subcell%vzbot + vztop = subcell%vztop + + ! -- Translate and rotate coordinates to "canonical" configuration + call canonical(x0, y0, x1, y1, x2, y2, & + v0x, v0y, v1x, v1y, v2x, v2y, & + xi, yi, & + rxx, rxy, ryx, ryy, & + sxx, sxy, syy, & + alp0, bet0, alp1, bet1, alp2, bet2, alpi, beti, & + lbary) + + ! -- Do calculations related to analytical z solution, which can be done + ! -- after traverse_triangle call if results not needed for adaptive time + ! -- stepping during triangle (subcell) traversal + ! kluge note: actually, can probably do z calculation just once for each cell + zirel = (zi - zbot) / dz + call calculate_dt(vzbot, vztop, dz, zirel, vzi, & + az, dtexitz, izstatus, & + itopbotexit) + vziodz = vzi / dz + + ! -- Traverse triangular subcell + ntdebug = -999 ! kluge debug bludebug + itrifaceenter = particle%iboundary(3) - 1 + if (itrifaceenter .eq. -1) itrifaceenter = 999 + + ! kluge note: can probably avoid calculating alpexit + ! here in many cases and wait to calculate it later, + ! once the final trajectory time is known + call traverse_triangle(isolv, tol, step, & + dtexitxy, alpexit, betexit, & + itrifaceenter, itrifaceexit, & + rxx, rxy, ryx, ryy, & + alp0, bet0, alp1, bet1, alp2, bet2, alpi, beti, & + vziodz, az, lbary) + + ! -- Check for no exit face + if ((itopbotexit .eq. 0) .and. (itrifaceexit .eq. 0)) then + ! exitFace = 0 + ! particle%iboundary(3) = exitFace + ! particle%istatus = 5 + ! return + + ! contact the developer situation (for now? always?) + print *, "Subcell with no exit face: particle", get_particle_id(particle), & + "cell", particle%idomain(2) + call pstop(1) + end if + + ! -- Determine (earliest) exit face and corresponding travel time to exit + if (itopbotexit .eq. 0) then + ! -- Exits through triangle face first + exitFace = itrifaceexit + dtexit = dtexitxy + else if (itrifaceexit .eq. 0) then + ! -- Exits through top/bottom first + exitFace = 45 + dtexit = dtexitz + else if (dtexitz .lt. dtexitxy) then + ! -- Exits through top/bottom first + exitFace = 45 + dtexit = dtexitz + else + ! -- Exits through triangle face first + exitFace = itrifaceexit + dtexit = dtexitxy + end if + if (exitFace .eq. 45) then + if (itopbotexit .eq. -1) then + exitFace = 4 + else + exitFace = 5 + end if + end if + + ! -- Compute exit time + texit = particle%ttrack + dtexit + t0 = particle%ttrack + + ! -- Select user tracking times to solve. If this is the first time step + ! of the simulation, include all times before it begins; if it is the + ! last time step, include all times after it ends. Otherwise take the + ! times within the current period and time step only. + call this%tracktimes%try_advance() + tslice = this%tracktimes%selection + if (all(tslice > 0)) then + do i = tslice(1), tslice(2) + t = this%tracktimes%times(i) + if (t < particle%ttrack .or. t >= texit .or. t >= tmax) cycle + dt = t - t0 + call step_analytical(dt, alp, bet) + loc = (/alp, bet/) + if (lbary) loc = skew(loc, (/sxx, sxy, syy/), invert=.true.) + rot = reshape((/rxx, rxy, ryx, ryy/), shape(rot)) + res = matmul(rot, loc) ! rotate vector + x = res(1) + x0 + y = res(2) + y0 + ! kluge note: make this into a function + if (izstatus .eq. 2) then + ! -- vz uniformly zero + z = zi + else if (izstatus .eq. 1) then + ! -- vz uniform, nonzero + z = zi + vzi * dt + else + ! -- vz nonuniform + z = zbot + (vzi * dexp(az * dt) - vzbot) / az + end if + particle%x = x + particle%y = y + particle%z = z + particle%ttrack = t + particle%istatus = 1 + call this%trackfilectl%save(particle, kper=kper, & + kstp=kstp, reason=5) + end do + end if + + if (texit .gt. tmax) then + ! -- The computed exit time is greater than the maximum time, so set + ! -- final time for particle trajectory equal to maximum time. + t = tmax + dt = t - t0 + exitFace = 0 + particle%istatus = 1 + particle%advancing = .false. + reason = 2 ! timestep end + else + ! -- The computed exit time is less than or equal to the maximum time, + ! -- so set final time for particle trajectory equal to exit time. + t = texit + dt = dtexit + reason = 1 ! cell transition + end if + + ! -- Calculate final particle location + ! -- kluge note: need to evaluate both alpha and beta here only + ! -- for exitFace=0, otherwise just one or the other + call step_analytical(dt, alp, bet) + if (exitFace .eq. 1) then + bet = 0d0 + else if (exitFace .eq. 2) then + alp = 1d0 - bet + else if (exitFace .eq. 3) then + alp = 0d0 + end if + loc = (/alp, bet/) + if (lbary) loc = skew(loc, (/sxx, sxy, syy/), invert=.true.) + rot = reshape((/rxx, rxy, ryx, ryy/), shape(rot)) + res = matmul(rot, loc) ! rotate vector + x = res(1) + x0 + y = res(2) + y0 + if (exitFace .eq. 4) then + z = zbot + else if (exitFace .eq. 5) then + z = ztop + else + if (izstatus .eq. 2) then ! kluge note: make this into a function + ! -- vz uniformly zero + z = zi + else if (izstatus .eq. 1) then + ! -- vz uniform, nonzero + z = zi + vzi * dt + else + ! -- vz nonuniform + z = zbot + (vzi * dexp(az * dt) - vzbot) / az + end if + end if + + ! -- Set final particle location in local (unscaled) subcell coordinates, + ! -- final time for particle trajectory, and exit face + particle%x = x + particle%y = y + particle%z = z + particle%ttrack = t + particle%iboundary(3) = exitFace + + ! -- Save particle track record + if (reason > -1) & + call this%trackfilectl%save(particle, kper=kper, & + kstp=kstp, reason=reason) ! reason=2: timestep + end subroutine track_subcell + + !> @brief Do calculations related to analytical z solution + !! + !! This subroutine consists partly or entirely of code written by + !! David W. Pollock of the USGS for MODPATH 7. The authors of the present + !! code are responsible for its appropriate application in this context + !! and for any modifications or errors. + !< + subroutine calculate_dt(v1, v2, dx, xL, v, dvdx, & + dt, status, itopbotexit) + real(DP) :: v1 + real(DP) :: v2 + real(DP) :: dx + real(DP) :: xL + real(DP) :: v + real(DP) :: dvdx + real(DP) :: dt + real(DP) :: v2a + real(DP) :: v1a + real(DP) :: dv + real(DP) :: dva + real(DP) :: vv + real(DP) :: vvv + real(DP) :: zro + real(DP) :: zrom + real(DP) :: x + real(DP) :: tol + real(DP) :: vr1 + real(DP) :: vr2 + real(DP) :: vr + real(DP) :: v1v2 + integer(I4B) :: status + integer(I4B) :: itopbotexit + logical(LGP) :: noOutflow + + ! Initialize variables + status = -1 + dt = 1.0d+20 + v2a = v2 + if (v2a .lt. 0d0) v2a = -v2a + v1a = v1 + if (v1a .lt. 0d0) v1a = -v1a + dv = v2 - v1 + dva = dv + if (dva .lt. 0d0) dva = -dva + + ! Check for a uniform zero velocity in this direction. + ! If so, set status = 2 and return (dt = 1.0d+20). + tol = 1.0d-15 + if ((v2a .lt. tol) .and. (v1a .lt. tol)) then + v = 0d0 + dvdx = 0d0 + status = 2 + itopbotexit = 0 + return + end if + + ! Check for uniform non-zero velocity in this direction. + ! If so, set compute dt using the constant velocity, + ! set status = 1 and return. + vv = v1a + if (v2a .gt. vv) vv = v2a + vvv = dva / vv + if (vvv .lt. 1.0d-4) then + zro = tol + zrom = -zro + v = v1 + x = xL * dx + if (v1 .gt. zro) then + dt = (dx - x) / v1 + itopbotexit = -2 + end if + if (v1 .lt. zrom) then + dt = -x / v1 + itopbotexit = -1 + end if + dvdx = 0d0 + status = 1 + return + end if + + ! Velocity has a linear variation. + ! Compute velocity corresponding to particle position + dvdx = dv / dx + v = (1.0d0 - xL) * v1 + xL * v2 + + ! If flow is into the cell from both sides there is no outflow. + ! In that case, set status = 3 and return + noOutflow = .true. + if (v1 .lt. 0d0) noOutflow = .false. + if (v2 .gt. 0d0) noOutflow = .false. + if (noOutflow) then + status = 3 + itopbotexit = 0 + return + end if + + ! If there is a divide in the cell for this flow direction, check to see if the + ! particle is located exactly on the divide. If it is, move it very slightly to + ! get it off the divide. This avoids possible numerical problems related to + ! stagnation points. + if ((v1 .le. 0d0) .and. (v2 .ge. 0d0)) then + if (abs(v) .le. 0d0) then + v = 1.0d-20 + if (v2 .le. 0d0) v = -v + end if + end if + + ! If there is a flow divide, find out what side of the divide the particle + ! is on and set the value of vr appropriately to reflect that location. + vr1 = v1 / v + vr2 = v2 / v + vr = vr1 + itopbotexit = -1 + if (vr .le. 0d0) then + vr = vr2 + itopbotexit = -2 + end if + + ! Check if velocity is in the same direction throughout cell (i.e. no flow divide). + ! Check if product v1*v2 > 0 then the velocity is in the same direction throughout + ! the cell (i.e. no flow divide). If so, set vr to reflect appropriate direction. + v1v2 = v1 * v2 + if (v1v2 .gt. 0d0) then + if (v .gt. 0d0) then + vr = vr2 + itopbotexit = -2 + end if + if (v .lt. 0d0) then + vr = vr1 + itopbotexit = -1 + end if + end if + + ! Compute travel time to exit face. Return with status = 0 + dt = log(vr) / dvdx + status = 0 + end subroutine calculate_dt + +end module MethodSubcellTernaryModule diff --git a/src/Solution/ParticleTracker/Particle.f90 b/src/Solution/ParticleTracker/Particle.f90 new file mode 100644 index 00000000000..1ce8e47a507 --- /dev/null +++ b/src/Solution/ParticleTracker/Particle.f90 @@ -0,0 +1,361 @@ +module ParticleModule + + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: DZERO, DONE, LENMEMPATH, LENBOUNDNAME + use MemoryManagerModule, only: mem_allocate, mem_deallocate, & + mem_reallocate + implicit none + + private + public :: ParticleType, ParticleStoreType, & + create_particle, create_particle_store, & + get_particle_id + + ! min/max tracking levels (1: model, 2: cell, 3: subcell) + integer, parameter, public :: levelmin = 0, levelmax = 4 + + !> @brief A particle tracked by the PRT model. + !! + !! Record-type used mainly for convenience to shuffle + !! data into and out of storage as tracking proceeds. + !! + !! Particle coordinates may be local to the cell or + !! global/model. Routines are provided to convert a + !! particle's global coordinates to/from cell-local + !! coordinates for tracking through cell subdomains. + !! + !! Particles are identified by composite key, i.e., + !! combinations of properties imdl, iprp, irpt, and + !! trelease. An optional label may be provided, but + !! need not be unique + !< + type ParticleType + private + ! identity + character(len=LENBOUNDNAME), public :: name = '' !< optional particle name + integer(I4B), public :: imdl !< index of model the particle originated in + integer(I4B), public :: iprp !< index of release package the particle is from + integer(I4B), public :: irpt !< index of release point the particle is from + integer(I4B), public :: ip !< index of particle in the particle list + ! stop criteria + integer(I4B), public :: istopweaksink !< weak sink option (0: do not stop, 1: stop) + integer(I4B), public :: istopzone !< stop zone number + ! state + integer(I4B), allocatable, public :: idomain(:) !< tracking domain hierarchy + integer(I4B), allocatable, public :: iboundary(:) !< tracking domain boundaries + integer(I4B), public :: icu !< user cell (node) number + integer(I4B), public :: ilay !< grid layer + integer(I4B), public :: izone !< zone number + integer(I4B), public :: istatus !< tracking status + real(DP), public :: x !< x coordinate + real(DP), public :: y !< y coordinate + real(DP), public :: z !< z coordinate + real(DP), public :: trelease !< release time + real(DP), public :: tstop !< stop time + real(DP), public :: ttrack !< time tracked so far + real(DP), public :: xorigin !< x origin for coordinate transformation from model to local + real(DP), public :: yorigin !< y origin for coordinate transformation from model to local + real(DP), public :: zorigin !< z origin for coordinate transformation from model to local + real(DP), public :: sinrot !< sine of rotation angle for coordinate transformation from model to local + real(DP), public :: cosrot !< cosine of rotation angle for coordinate transformation from model to local + logical(LGP), public :: transformed !< whether coordinates have been transformed from model to local + logical(LGP), public :: advancing !< whether particle is still being tracked for current time step + contains + procedure, public :: destroy => destroy_particle + procedure, public :: get_model_coords + procedure, public :: load_from_store + procedure, public :: transform => transform_coords + end type ParticleType + + !> @brief Structure of arrays to store particles. + type ParticleStoreType + ! identity + character(len=LENBOUNDNAME), dimension(:), pointer, contiguous :: name !< optional particle label + integer(I4B), dimension(:), pointer, contiguous :: imdl !< index of model particle originated in + integer(I4B), dimension(:), pointer, contiguous :: iprp !< index of release package the particle originated in + integer(I4B), dimension(:), pointer, contiguous :: irpt !< index of release point in the particle release package the particle originated in + ! stopping criteria + integer(I4B), dimension(:), pointer, contiguous :: istopweaksink !< weak sink option: 0 = do not stop, 1 = stop + integer(I4B), dimension(:), pointer, contiguous :: istopzone !< stop zone number + ! state + integer(I4B), dimension(:, :), allocatable :: idomain !< array of indices for domains in the tracking domain hierarchy + integer(I4B), dimension(:, :), allocatable :: iboundary !< array of indices for tracking domain boundaries + integer(I4B), dimension(:), pointer, contiguous :: icu !< cell number (user, not reduced) + integer(I4B), dimension(:), pointer, contiguous :: ilay !< layer + integer(I4B), dimension(:), pointer, contiguous :: izone !< current zone number + integer(I4B), dimension(:), pointer, contiguous :: istatus !< particle status + real(DP), dimension(:), pointer, contiguous :: x !< model x coord of particle + real(DP), dimension(:), pointer, contiguous :: y !< model y coord of particle + real(DP), dimension(:), pointer, contiguous :: z !< model z coord of particle + real(DP), dimension(:), pointer, contiguous :: trelease !< particle release time + real(DP), dimension(:), pointer, contiguous :: tstop !< particle stop time + real(DP), dimension(:), pointer, contiguous :: ttrack !< current tracking time + contains + procedure, public :: destroy => destroy_store + procedure, public :: resize => resize_store + procedure, public :: load_from_particle + end type ParticleStoreType + +contains + + !> @brief Create a new particle + subroutine create_particle(particle) + type(ParticleType), pointer :: particle !< particle + allocate (particle) + allocate (particle%idomain(levelmin:levelmax)) + allocate (particle%iboundary(levelmin:levelmax)) + end subroutine create_particle + + !> @brief Destroy a particle + subroutine destroy_particle(this) + class(ParticleType), intent(inout) :: this !< particle + deallocate (this%idomain) + deallocate (this%iboundary) + end subroutine destroy_particle + + !> @brief Create a new particle store + subroutine create_particle_store(this, np, mempath) + type(ParticleStoreType), pointer :: this !< store + integer(I4B), intent(in) :: np !< number of particles + character(*), intent(in) :: mempath !< path to memory + + allocate (this) + call mem_allocate(this%imdl, np, 'PLIMDL', mempath) + call mem_allocate(this%irpt, np, 'PLIRPT', mempath) + call mem_allocate(this%iprp, np, 'PLIPRP', mempath) + call mem_allocate(this%name, LENBOUNDNAME, np, 'PLNAME', mempath) + ! -- kluge todo: update mem_allocate to allow custom range of indices? + ! e.g. here we want to allocate 0-4 for trackdomain levels, not 1-5 + allocate (this%idomain(np, levelmin:levelmax)) + allocate (this%iboundary(np, levelmin:levelmax)) + call mem_allocate(this%icu, np, 'PLICU', mempath) + call mem_allocate(this%ilay, np, 'PLILAY', mempath) + call mem_allocate(this%izone, np, 'PLIZONE', mempath) + call mem_allocate(this%istatus, np, 'PLISTATUS', mempath) + call mem_allocate(this%x, np, 'PLX', mempath) + call mem_allocate(this%y, np, 'PLY', mempath) + call mem_allocate(this%z, np, 'PLZ', mempath) + call mem_allocate(this%trelease, np, 'PLTRELEASE', mempath) + call mem_allocate(this%tstop, np, 'PLTSTOP', mempath) + call mem_allocate(this%ttrack, np, 'PLTTRACK', mempath) + call mem_allocate(this%istopweaksink, np, 'PLISTOPWEAKSINK', mempath) + call mem_allocate(this%istopzone, np, 'PLISTOPZONE', mempath) + end subroutine create_particle_store + + !> @brief Deallocate particle arrays + subroutine destroy_store(this, mempath) + class(ParticleStoreType), intent(inout) :: this !< store + character(*), intent(in) :: mempath !< path to memory + + call mem_deallocate(this%imdl, 'PLIMDL', mempath) + call mem_deallocate(this%iprp, 'PLIPRP', mempath) + call mem_deallocate(this%irpt, 'PLIRPT', mempath) + call mem_deallocate(this%name, 'PLNAME', mempath) + deallocate (this%idomain) + deallocate (this%iboundary) + call mem_deallocate(this%icu, 'PLICU', mempath) + call mem_deallocate(this%ilay, 'PLILAY', mempath) + call mem_deallocate(this%izone, 'PLIZONE', mempath) + call mem_deallocate(this%istatus, 'PLISTATUS', mempath) + call mem_deallocate(this%x, 'PLX', mempath) + call mem_deallocate(this%y, 'PLY', mempath) + call mem_deallocate(this%z, 'PLZ', mempath) + call mem_deallocate(this%trelease, 'PLTRELEASE', mempath) + call mem_deallocate(this%tstop, 'PLTSTOP', mempath) + call mem_deallocate(this%ttrack, 'PLTTRACK', mempath) + call mem_deallocate(this%istopweaksink, 'PLISTOPWEAKSINK', mempath) + call mem_deallocate(this%istopzone, 'PLISTOPZONE', mempath) + end subroutine destroy_store + + !> @brief Reallocate particle arrays + subroutine resize_store(this, np, mempath) + ! -- modules + use ArrayHandlersModule, only: ExpandArray2D + ! -- dummy + class(ParticleStoreType), intent(inout) :: this !< particle store + integer(I4B), intent(in) :: np !< number of particles + character(*), intent(in) :: mempath !< path to memory + + ! resize 1D arrays + call mem_reallocate(this%imdl, np, 'PLIMDL', mempath) + call mem_reallocate(this%iprp, np, 'PLIPRP', mempath) + call mem_reallocate(this%irpt, np, 'PLIRPT', mempath) + call mem_reallocate(this%name, LENBOUNDNAME, np, 'PLNAME', mempath) + call mem_reallocate(this%icu, np, 'PLICU', mempath) + call mem_reallocate(this%ilay, np, 'PLILAY', mempath) + call mem_reallocate(this%izone, np, 'PLIZONE', mempath) + call mem_reallocate(this%istatus, np, 'PLISTATUS', mempath) + call mem_reallocate(this%x, np, 'PLX', mempath) + call mem_reallocate(this%y, np, 'PLY', mempath) + call mem_reallocate(this%z, np, 'PLZ', mempath) + call mem_reallocate(this%trelease, np, 'PLTRELEASE', mempath) + call mem_reallocate(this%tstop, np, 'PLTSTOP', mempath) + call mem_reallocate(this%ttrack, np, 'PLTTRACK', mempath) + call mem_reallocate(this%istopweaksink, np, 'PLISTOPWEAKSINK', mempath) + call mem_reallocate(this%istopzone, np, 'PLISTOPZONE', mempath) + ! resize first dimension of 2D arrays + ! todo: memory manager support? + call ExpandArray2D( & + this%idomain, & + np - size(this%idomain, 1), & + 0) + call ExpandArray2D( & + this%iboundary, & + np - size(this%iboundary, 1), & + 0) + end subroutine resize_store + + !> @brief Initialize particle from particle list. + !! + !! This routine is used to initialize a particle from the list + !! so it can be tracked by prt_solve. The particle's advancing + !! flag is set and local coordinate transformations are reset. + !< + subroutine load_from_store(this, store, imdl, iprp, ip) + class(ParticleType), intent(inout) :: this !< particle + type(ParticleStoreType), intent(in) :: store !< particle storage + integer(I4B), intent(in) :: imdl !< index of model particle originated in + integer(I4B), intent(in) :: iprp !< index of particle release package particle originated in + integer(I4B), intent(in) :: ip !< index into the particle list + + call this%transform(reset=.true.) + this%imdl = imdl + this%iprp = iprp + this%irpt = store%irpt(ip) + this%ip = ip + this%name = store%name(ip) + this%istopweaksink = store%istopweaksink(ip) + this%istopzone = store%istopzone(ip) + this%icu = store%icu(ip) + this%ilay = store%ilay(ip) + this%izone = store%izone(ip) + this%istatus = store%istatus(ip) + this%x = store%x(ip) + this%y = store%y(ip) + this%z = store%z(ip) + this%trelease = store%trelease(ip) + this%tstop = store%tstop(ip) + this%ttrack = store%ttrack(ip) + this%advancing = .true. + this%idomain(levelmin:levelmax) = & + store%idomain(ip, levelmin:levelmax) + this%idomain(1) = imdl + this%iboundary(levelmin:levelmax) = & + store%iboundary(ip, levelmin:levelmax) + end subroutine load_from_store + + !> @brief Update particle store from particle + subroutine load_from_particle(this, particle, ip) + class(ParticleStoreType), intent(inout) :: this !< particle storage + type(ParticleType), intent(in) :: particle !< particle + integer(I4B), intent(in) :: ip !< particle index + + this%imdl(ip) = particle%imdl + this%iprp(ip) = particle%iprp + this%irpt(ip) = particle%irpt + this%name(ip) = particle%name + this%istopweaksink(ip) = particle%istopweaksink + this%istopzone(ip) = particle%istopzone + this%icu(ip) = particle%icu + this%ilay(ip) = particle%ilay + this%izone(ip) = particle%izone + this%istatus(ip) = particle%istatus + this%x(ip) = particle%x + this%y(ip) = particle%y + this%z(ip) = particle%z + this%trelease(ip) = particle%trelease + this%tstop(ip) = particle%tstop + this%ttrack(ip) = particle%ttrack + this%idomain( & + ip, & + levelmin:levelmax) = & + particle%idomain(levelmin:levelmax) + this%iboundary( & + ip, & + levelmin:levelmax) = & + particle%iboundary(levelmin:levelmax) + end subroutine load_from_particle + + !> @brief Apply the given global-to-local transformation to the particle. + subroutine transform_coords(this, xorigin, yorigin, zorigin, & + sinrot, cosrot, invert, reset) + use GeomUtilModule, only: transform, compose + class(ParticleType), intent(inout) :: this !< particle + real(DP), intent(in), optional :: xorigin !< x coordinate of origin + real(DP), intent(in), optional :: yorigin !< y coordinate of origin + real(DP), intent(in), optional :: zorigin !< z coordinate of origin + real(DP), intent(in), optional :: sinrot !< sine of rotation angle + real(DP), intent(in), optional :: cosrot !< cosine of rotation angle + logical(LGP), intent(in), optional :: invert !< whether to invert + logical(LGP), intent(in), optional :: reset !< whether to reset + + ! -- reset if requested + if (present(reset)) then + if (reset) then + this%xorigin = DZERO + this%yorigin = DZERO + this%zorigin = DZERO + this%sinrot = DZERO + this%cosrot = DONE + this%cosrot = DONE + this%transformed = .false. + return + end if + end if + + ! -- Otherwise, transform coordinates + call transform(this%x, this%y, this%z, & + this%x, this%y, this%z, & + xorigin, yorigin, zorigin, & + sinrot, cosrot, invert) + + ! -- Modify transformation from model coordinates to particle's new + ! -- local coordinates by incorporating this latest transformation + call compose(this%xorigin, this%yorigin, this%zorigin, & + this%sinrot, this%cosrot, & + xorigin, yorigin, zorigin, & + sinrot, cosrot, invert) + + ! -- Set isTransformed flag to true. Note that there is no check + ! -- to see whether the modification brings the coordinates back + ! -- to model coordinates (in which case the origin would be very + ! -- close to zero and sinrot and cosrot would be very close to 0. + ! -- and 1., respectively, allowing for roundoff error). + this%transformed = .true. + end subroutine transform_coords + + !> @brief Return the particle's model (global) coordinates. + subroutine get_model_coords(this, x, y, z) + use GeomUtilModule, only: transform, compose + class(ParticleType), intent(inout) :: this !< particle + real(DP), intent(out) :: x !< x coordinate + real(DP), intent(out) :: y !< y coordinate + real(DP), intent(out) :: z !< z coordinate + + if (this%transformed) then + ! -- Transform back from local to model coordinates + call transform(this%x, this%y, this%z, x, y, z, & + this%xorigin, this%yorigin, this%zorigin, & + this%sinrot, this%cosrot, .true.) + else + ! -- Already in model coordinates + x = this%x + y = this%y + z = this%z + end if + end subroutine get_model_coords + + !> @brief Return the particle's composite ID. + !! + !! Particles are uniquely identified by model index, PRP index, + !! location index, and release time. + !< + pure function get_particle_id(particle) result(id) + class(ParticleType), intent(in) :: particle !< particle + character(len=LENMEMPATH) :: id !< particle id + + write (id, '(I0,"-",I0,"-",I0,"-",F0.0)') & + particle%imdl, particle%iprp, particle%irpt, particle%trelease + end function get_particle_id + +end module ParticleModule diff --git a/src/Solution/ParticleTracker/Subcell.f90 b/src/Solution/ParticleTracker/Subcell.f90 new file mode 100644 index 00000000000..c326f595eb7 --- /dev/null +++ b/src/Solution/ParticleTracker/Subcell.f90 @@ -0,0 +1,31 @@ +module SubcellModule + + use CellDefnModule, only: CellDefnType + implicit none + private + public :: SubcellType + + !> @brief A subcell of a cell. + type, abstract :: SubcellType + private + character(len=40), pointer, public :: type !< character string that names the tracking domain type + integer, public :: isubcell !< index of subcell in the cell + integer, public :: icell !< index of cell in the source grid + contains + procedure(destroy), deferred :: destroy !< destructor + procedure(init), deferred :: init !< initializer + end type SubcellType + + abstract interface + subroutine destroy(this) + import SubcellType + class(SubcellType), intent(inout) :: this + end subroutine + + subroutine init(this) + import SubcellType + class(SubcellType), intent(inout) :: this + end subroutine init + end interface + +end module SubcellModule diff --git a/src/Solution/ParticleTracker/SubcellRect.f90 b/src/Solution/ParticleTracker/SubcellRect.f90 new file mode 100644 index 00000000000..7ea6e4a35b1 --- /dev/null +++ b/src/Solution/ParticleTracker/SubcellRect.f90 @@ -0,0 +1,45 @@ +module SubcellRectModule + + use SubcellModule, only: SubcellType + implicit none + + private + public :: SubcellRectType + public :: create_subcell_rect + + type, extends(SubcellType) :: SubcellRectType + private + double precision, public :: sinrot !< sine of rotation angle for local (x, y) + double precision, public :: cosrot !< cosine of rotation angle for local (x, y) + double precision, public :: xOrigin !< cell x origin for local (x, y) + double precision, public :: yOrigin !< cell y origin for local (x, y) + double precision, public :: zOrigin !< cell z origin for local z + double precision, public :: dx, dy, dz !< subcell dimensions + double precision, public :: vx1, vx2, vy1, vy2, vz1, vz2 !< subcell face velocities + contains + procedure, public :: destroy => destroy_subcell_rect !< destructor for the subcell + procedure, public :: init => init_subcell_rect !< initializes the rectangular subcell + end type SubcellRectType + +contains + + !> @brief Create a new rectangular subcell + subroutine create_subcell_rect(subcell) + type(SubcellRectType), pointer :: subcell + allocate (subcell) + allocate (subcell%type) + subcell%type = 'subcellrect' + end subroutine create_subcell_rect + + !> @brief Destructor for a rectangular subcell + subroutine destroy_subcell_rect(this) + class(SubcellRectType), intent(inout) :: this + deallocate (this%type) + end subroutine destroy_subcell_rect + + !> @brief Initialize a rectangular subcell + subroutine init_subcell_rect(this) + class(SubcellRectType), intent(inout) :: this + end subroutine init_subcell_rect + +end module SubcellRectModule diff --git a/src/Solution/ParticleTracker/SubcellTri.f90 b/src/Solution/ParticleTracker/SubcellTri.f90 new file mode 100644 index 00000000000..6a441463ed2 --- /dev/null +++ b/src/Solution/ParticleTracker/SubcellTri.f90 @@ -0,0 +1,43 @@ +module SubcellTriModule + + use SubcellModule, only: SubcellType + implicit none + + private + public :: SubcellTriType + public :: create_subcell_tri + + type, extends(SubcellType) :: SubcellTriType + private + double precision, public :: x0, y0, x1, y1, x2, y2 !< subcell corner coordinates + double precision, public :: v0x, v0y, v1x, v1y, v2x, v2y !< subcell corner velocities + double precision, public :: ztop, zbot !< subcell top and bottom elevations + double precision, public :: dz !< subcell thickness + double precision, public :: vztop, vzbot !< subcell top and bottom velocities + contains + procedure, public :: destroy => destroy_subcell_tri !< destructor for the subcell + procedure, public :: init => init_subcell_tri !< initializes the triangular subcell + end type SubcellTriType + +contains + + !> @brief Create a new triangular subcell + subroutine create_subcell_tri(subcell) + type(SubcellTriType), pointer :: subcell + allocate (subcell) + allocate (subcell%type) + subcell%type = 'subcelltri' + end subroutine create_subcell_tri + + !> @brief Destructor for a triangular subcell + subroutine destroy_subcell_tri(this) + class(SubcellTriType), intent(inout) :: this + deallocate (this%type) + end subroutine destroy_subcell_tri + + !> @brief Initialize a triangular subcell + subroutine init_subcell_tri(this) + class(SubcellTriType), intent(inout) :: this + end subroutine init_subcell_tri + +end module SubcellTriModule diff --git a/src/Solution/ParticleTracker/TernarySolveTrack.f90 b/src/Solution/ParticleTracker/TernarySolveTrack.f90 new file mode 100644 index 00000000000..dbc49a10eb7 --- /dev/null +++ b/src/Solution/ParticleTracker/TernarySolveTrack.f90 @@ -0,0 +1,972 @@ +module TernarySolveTrack + + use KindModule, only: I4B, DP, LGP + use GeomUtilModule, only: skew + use MathUtilModule, only: f1d, zero_ch, zero_br, zero_test + use ErrorUtilModule, only: pstop + + private + public :: traverse_triangle + public :: canonical + public :: get_w + public :: solve_coefs + public :: step_analytical + public :: step_euler + public :: find_exit_bary + public :: get_t_alpt + public :: get_bet_outflow_bary + public :: get_bet_soln_limits + public :: soln_brent + public :: soln_chand + public :: soln_test + public :: soln_euler + public :: alpfun + + ! global data + real(DP) ca1, ca2, ca3, cb1, cb2 !< Analytical solution coefficients + real(DP) waa, wab, wba, wbb !< Elements of the "velocity matrix," W + real(DP) :: cv0(2), cv1(2), cv2(2) !< "Canonical" velocity components at corners of triangular subcell + integer(I4B) icase !< Case index for analytical solution + +contains + + !> @brief Traverse triangular cell + subroutine traverse_triangle(isolv, tol, step, texit, & + alpexit, betexit, & + itrifaceenter, itrifaceexit, & + rxx, rxy, ryx, ryy, & + alp0, bet0, alp1, bet1, alp2, bet2, alpi, beti, & + vziodz, az, & + bary) + ! -- dummy + integer(I4B), intent(in) :: isolv !< solution method + real(DP), intent(in) :: tol !< solution tolerance + real(DP), intent(in) :: step !< stepsize for numerical methods (e.g. euler) + real(DP), intent(out) :: texit !< time particle exits the cell + real(DP) :: alpexit + real(DP) :: betexit !< alpha and beta coefficients + integer(I4B) :: itrifaceenter + integer(I4B) :: itrifaceexit !< entry and exit faces + real(DP) :: rxx + real(DP) :: rxy + real(DP) :: ryx + real(DP) :: ryy !< rotation matrix + real(DP) :: alp0 + real(DP) :: bet0 + real(DP) :: alp1 + real(DP) :: bet1 + real(DP) :: alp2 + real(DP) :: bet2 + real(DP) :: alpi + real(DP) :: beti !< alpha and beta coefficients + real(DP) :: vziodz + real(DP) :: az + logical(LGP), intent(in) :: bary !< whether to use barycentric coordinates + ! -- local + real(DP) :: texit0 + real(DP) :: alpexit0 + real(DP) :: betexit0 + real(DP) :: texit1 + real(DP) :: alpexit1 + real(DP) :: betexit1 + real(DP) :: texit2 + real(DP) :: alpexit2 + real(DP) :: betexit2 + + ! -- Compute elements of matrix W + call get_w(alp1, bet1, alp2, bet2, waa, wab, wba, wbb, bary) + + ! -- Determine alpha and beta analytically as functions of time + call solve_coefs(alpi, beti) + + ! -- Compute exit time (travel time to exit) and exit location + call find_exit_bary(isolv, 0, itrifaceenter, & + alpi, beti, & + tol, step, vziodz, az, & + texit0, alpexit0, betexit0) + call find_exit_bary(isolv, 1, itrifaceenter, & + alpi, beti, & + tol, step, vziodz, az, & + texit1, alpexit1, betexit1) + call find_exit_bary(isolv, 2, itrifaceenter, & + alpi, beti, & + tol, step, vziodz, az, & + texit2, alpexit2, betexit2) + texit = min(texit0, texit1, texit2) + + ! -- Note that while the numbering of triangle faces is generally zero-based + ! -- (0, 1, 2), itrifaceexit, which gets passed out, is one-based (1, 2, 3). + if (texit .eq. texit0) then + alpexit = alpexit0 + betexit = betexit0 + itrifaceexit = 1 + else if (texit .eq. texit1) then + alpexit = alpexit1 + betexit = betexit1 + itrifaceexit = 2 + else if (texit .eq. texit2) then + alpexit = alpexit2 + betexit = betexit2 + itrifaceexit = 3 + end if + if (texit .eq. huge(1d0)) itrifaceexit = 0 + + end subroutine + + !> @brief Set coordinates to "canonical" configuration + subroutine canonical(x0, y0, x1, y1, x2, y2, & + v0x, v0y, v1x, v1y, v2x, v2y, & + xi, yi, & + rxx, rxy, ryx, ryy, & + sxx, sxy, syy, & + alp0, bet0, alp1, bet1, alp2, bet2, alpi, beti, & + bary) + ! -- dummy + real(DP) :: x0 + real(DP) :: y0 + real(DP) :: x1 + real(DP) :: y1 + real(DP) :: x2 + real(DP) :: y2 + real(DP) :: v0x + real(DP) :: v0y + real(DP) :: v1x + real(DP) :: v1y + real(DP) :: v2x + real(DP) :: v2y + real(DP) :: xi + real(DP) :: yi + real(DP) :: rxx + real(DP) :: rxy + real(DP) :: ryx + real(DP) :: ryy !< rotation matrix + real(DP), intent(inout) :: sxx, sxy, syy !< skew matrix entries (top left, top right, bottom right) + real(DP) :: alp0 + real(DP) :: bet0 + real(DP) :: alp1 + real(DP) :: bet1 + real(DP) :: alp2 + real(DP) :: bet2 + real(DP) :: alpi + real(DP) :: beti !< alpha and beta coefficients + logical(LGP), intent(in) :: bary !< whether to use barycentric coordinates + ! -- local + real(DP) :: baselen + real(DP) :: oobaselen + real(DP) :: sinomega + real(DP) :: cosomega + real(DP) :: x1diff + real(DP) :: y1diff + real(DP) :: x2diff + real(DP) :: y2diff + real(DP) :: xidiff + real(DP) :: yidiff + real(DP) :: rot(2, 2), res(2) + + ! -- Translate and rotate coordinates to "canonical" configuration + x1diff = x1 - x0 + y1diff = y1 - y0 + x2diff = x2 - x0 + y2diff = y2 - y0 + baselen = dsqrt(x1diff * x1diff + y1diff * y1diff) + oobaselen = 1d0 / baselen + cosomega = x1diff * oobaselen + sinomega = y1diff * oobaselen + rxx = cosomega + rxy = sinomega + ryx = -sinomega + ryy = cosomega + alp0 = 0d0 + bet0 = 0d0 + alp1 = baselen + bet1 = 0d0 + + rot = reshape((/rxx, ryx, rxy, ryy/), shape(rot)) + res = matmul(rot, (/x2diff, y2diff/)) + alp2 = res(1) + bet2 = res(2) + + cv0 = matmul(rot, (/v0x, v0y/)) + cv1 = matmul(rot, (/v1x, v1y/)) + cv2 = matmul(rot, (/v2x, v2y/)) + + xidiff = xi - x0 + yidiff = yi - y0 + res = matmul(rot, (/xidiff, yidiff/)) + alpi = res(1) + beti = res(2) + + if (bary) then + sxx = 1d0 / alp1 + syy = 1d0 / bet2 + sxy = -alp2 * sxx * syy + alp1 = 1d0 + alp2 = 0d0 + bet2 = 1d0 + cv0 = skew(cv0, (/sxx, sxy, syy/)) + cv1 = skew(cv1, (/sxx, sxy, syy/)) + cv2 = skew(cv2, (/sxx, sxy, syy/)) + res = (/alpi, beti/) + res = skew(res, (/sxx, sxy, syy/)) + alpi = res(1) + beti = res(2) + end if + + end subroutine + + !> @brief Compute elements of W matrix + subroutine get_w( & + alp1, bet1, alp2, bet2, & + waa, wab, wba, wbb, & + bary) + ! -- dummy + real(DP) :: alp1 + real(DP) :: bet1 + real(DP) :: alp2 + real(DP) :: bet2 !< triangle face points + real(DP) :: waa + real(DP) :: wab + real(DP) :: wba + real(DP) :: wbb !< w matrix + logical(LGP), intent(in), optional :: bary !< barycentric coordinates + ! -- local + logical(LGP) :: lbary + real(DP) :: v1alpdiff + real(DP) :: v2alpdiff + real(DP) :: v2betdiff + real(DP) :: ooalp1 + real(DP) :: oobet2 + real(DP) :: vterm + + if (present(bary)) then + lbary = bary + else + lbary = .true. + end if + + ! -- Note: wab is the "alpha,beta" entry in matrix W + ! and the alpha component of the w^(beta) vector + v1alpdiff = cv1(1) - cv0(1) + v2alpdiff = cv2(1) - cv0(1) + v2betdiff = cv2(2) - cv0(2) + if (bary) then + waa = v1alpdiff + wab = v2alpdiff + wba = 0d0 + wbb = v2betdiff + else + ooalp1 = 1d0 / alp1 + oobet2 = 1d0 / bet2 + vterm = v1alpdiff * ooalp1 + waa = vterm + wab = (v2alpdiff - alp2 * vterm) * oobet2 + wba = 0d0 + wbb = v2betdiff * oobet2 + end if + + end subroutine + + !> @brief Compute analytical solution coefficients depending on case + subroutine solve_coefs(alpi, beti) + ! -- dummy + real(DP) :: alpi + real(DP) :: beti + ! -- local + real(DP) :: zerotol + real(DP) :: wratv + real(DP) :: acoef + real(DP) :: bcoef + real(DP) :: afact + real(DP) :: bfact + real(DP) :: vfact + real(DP) :: oowaa + + zerotol = 1d-10 ! kluge + if (dabs(wbb) .gt. zerotol) then + wratv = (wab / wbb) * cv0(2) + acoef = cv0(1) - wratv + bcoef = wratv + wab * beti + afact = acoef / waa + vfact = cv0(2) / wbb + ! -- Coefs for beta do not depend on whether waa = 0 or not + cb1 = -vfact ! const term in beta + cb2 = vfact + beti ! coef for e(wbb*t) term in beta + ! -- Coefs for alpha + if (dabs(waa) .gt. zerotol) then + ! -- Case waa <> 0, wbb <> 0 + if (dabs(wbb - waa) .gt. zerotol) then + ! -- Subcase wbb <> waa + bfact = bcoef / (wbb - waa) + ca1 = -afact ! const term in alpha + ca2 = alpi + afact - bfact ! coef for exp(waa*t) term in alpha + ca3 = bfact ! coef for exp(wbb*t) term in alpha + icase = 1 + else + ! -- Subcase wbb = waa + ca1 = -afact ! const term in alpha + ca2 = alpi + afact ! coef for exp(waa*t) term in alpha + ca3 = bcoef ! coef for t*exp(waa*t) term in alpha + icase = -1 + end if + else + ! -- Case waa = 0, wbb <> 0 + bfact = bcoef / wbb + ca1 = alpi - bfact ! const term in alpha + ca2 = acoef ! coef for t term in alpha + ca3 = bfact ! coef for exp(wbb*t) term in alpha + icase = 2 + end if + else + ! -- Coefs for beta do not depend on whether waa = 0 or not + cb1 = beti ! const term in beta + cb2 = cv0(2) ! coef for t term in beta + if (dabs(waa) .gt. zerotol) then + ! -- Case waa <> 0, wbb = 0 + oowaa = 1d0 / waa + vfact = (wab * oowaa) * cv0(2) + ca1 = -oowaa * (cv0(1) + wab * beti + vfact) ! const term in alpha + ca2 = -vfact ! coef for t term in alpha + ca3 = alpi - ca1 ! coef for exp(waa*t) term in alpha + icase = 3 + else + ! -- Case waa = 0, wbb = 0 + ca1 = alpi ! const term in alpha + ca2 = cv0(1) + wab * beti ! coef for t term in alpha + ca3 = 5d-1 * wab * cv0(2) ! coef for t^2 term in alpha + icase = 4 + end if + end if + + end subroutine + + !> @brief Step (evaluate) analytically depending on case + subroutine step_analytical(t, alp, bet) + ! -- dummy + real(DP), intent(in) :: t + real(DP) :: alp + real(DP) :: bet + + if (icase .eq. 1) then + alp = ca1 + ca2 * dexp(waa * t) + ca3 * dexp(wbb * t) + bet = cb1 + cb2 * dexp(wbb * t) + else if (icase .eq. -1) then + alp = ca1 + (ca2 + ca3 * t) * dexp(waa * t) + bet = cb1 + cb2 * dexp(wbb * t) + else if (icase .eq. 2) then + alp = ca1 + ca2 * t + ca3 * dexp(wbb * t) + bet = cb1 + cb2 * dexp(wbb * t) + else if (icase .eq. 3) then + alp = ca1 + ca2 * t + ca3 * dexp(waa * t) + bet = cb1 + cb2 * t + else if (icase .eq. 4) then + alp = ca1 + (ca2 + ca3 * t) * t + bet = cb1 + cb2 * t + end if + + end subroutine + + !> @brief Step (evaluate) numerically depending in case + subroutine step_euler(nt, step, vziodz, az, alpi, beti, t, alp, bet) + ! -- dummy + integer(I4B) :: nt + real(DP), intent(in) :: step + real(DP) :: vziodz + real(DP) :: az + real(DP) :: alpi + real(DP) :: beti + real(DP), intent(inout) :: t + real(DP) :: alp + real(DP) :: bet + ! -- local + real(DP) :: alpproj + real(DP) :: betproj + real(DP) :: valp + real(DP) :: vbet + real(DP) :: vz + real(DP) :: vmeasure + real(DP) :: delt + real(DP) :: thalf + real(DP) :: rkn1 + real(DP) :: rln1 + real(DP) :: rkn2 + real(DP) :: rln2 + real(DP) :: rkn3 + real(DP) :: rln3 + real(DP) :: rkn4 + real(DP) :: rln4 + + if (nt .eq. 0) then + ! -- Initial location + alp = alpi + bet = beti + t = 0d0 + else + ! -- Step numerically + valp = cv0(1) + waa * alp + wab * bet + vbet = cv0(2) + wba * alp + wbb * bet + if (step .lt. 0d0) then + ! -- Compute time step based on abs value of step, interpreting the latter + ! -- as a distance in canonical coordinates (alpha, beta, and scaled z) + vz = vziodz * dexp(az * t) + vmeasure = dsqrt(valp * valp + vbet * vbet + vz * vz) + delt = -step / vmeasure + else + ! -- Set time step directly to step + delt = step + end if + ikluge = 2 ! kluge + if (ikluge .eq. 1) then + t = t + delt + alp = alp + valp * delt + bet = bet + vbet * delt + else + rkn1 = valp + rln1 = vbet + thalf = t + 5d-1 * delt + call step_analytical(thalf, alpproj, betproj) + rkn2 = cv0(1) + waa * alpproj + wab * betproj + rln2 = cv0(2) + wba * alpproj + wbb * betproj + rkn3 = rkn2 + rln3 = rln2 + t = t + delt + call step_analytical(t, alpproj, betproj) + rkn4 = cv0(1) + waa * alpproj + wab * betproj + rln4 = cv0(2) + wba * alpproj + wbb * betproj + alp = alp + delt * (rkn1 + 2d0 * rkn2 + 2d0 * rkn3 + rkn4) / 6d0 + bet = bet + delt * (rln1 + 2d0 * rln2 + 2d0 * rln3 + rln4) / 6d0 + end if + end if + + end subroutine + + !> @brief Find the exit time and location in barycentric coordinates. + subroutine find_exit_bary(isolv, itriface, itrifaceenter, & + alpi, beti, & + tol, step, vziodz, az, & + texit, alpexit, betexit) + ! -- dummy + integer(I4B) :: isolv + integer(I4B) :: itriface + integer(I4B) :: itrifaceenter + real(DP) :: alpi + real(DP) :: beti + real(DP) :: tol + real(DP) :: step + real(DP) :: vziodz + real(DP) :: az + real(DP) :: texit + real(DP) :: alpexit + real(DP) :: betexit + ! -- local + real(DP) :: alplo + real(DP) :: alphi + real(DP) :: alpt + real(DP) :: alplim + real(DP) :: fax + real(DP) :: fbx + real(DP) :: t + real(DP) :: tlo + real(DP) :: thi + real(DP) :: v0alpstar + real(DP) :: valpi + real(DP) :: v1n + real(DP) :: v2n + real(DP) :: vbeti + real(DP) :: zerotol + real(DP) :: betlo + real(DP) :: bethi + real(DP) :: betsollo + real(DP) :: betsolhi + real(DP) :: betoutlo + real(DP) :: betouthi + integer(I4B) :: ibettrend + + ! -- Use iterative scheme or numerical integration indicated by isolv. + zerotol = 1d-10 ! kluge + if (itriface .eq. 0) then + ! -- Checking for exit on canonical face 0 (beta = 0) + if (itrifaceenter .eq. 0) then + ! -- Entrance face, so no exit. (Normal velocity is uniform along face 0, + ! -- so it cannot be both an entrance and an exit.) + texit = huge(1d0) + else + ! -- Not the entrance face, so check for outflow + if (cv0(2) .ge. 0d0) then + ! -- Inflow or no flow, so no exit + texit = huge(1d0) + else + ! -- Outflow, so check beta-velocity at the initial location, + ! -- recognizing that it will never change sign along the + ! -- trajectory (and will not be blocked from zero by an asymptote) + vbeti = cv0(2) + wbb * beti + if (vbeti .ge. 0d0) then + ! -- Can't exit along beta = 0 + texit = huge(1d0) + else + ! -- get alpt and check it + call get_t_alpt(0d0, t, alpt) + if ((alpt .ge. 0d0) .and. (alpt .le. 1d0)) then + ! -- alpt within the edge, so exit found + texit = t + alpexit = alpt + betexit = 0d0 + else + ! -- alpt not within the edge, so not an exit + texit = huge(1d0) + end if + end if + end if + end if + ! -- End canonical face 0 (beta = 0) + else + ! -- Checking for exit on canonical face 1 (gamma = 0.) or 2 (alpha = 0.) + if (itriface .eq. 1) then + ! -- Normal velocities (gamma components) at ends of canonical face 1 + v1n = -cv1(1) - cv1(2) + v2n = -cv2(1) - cv2(2) + else + ! -- Normal velocities (alpha components) at ends of canonical face 2 + v1n = cv0(1) + v2n = cv2(1) + end if + if ((v1n .ge. 0d0) .and. (v2n .ge. 0d0)) then + ! -- No outflow at vn1 and vn2 corners; no outflow interval, so no exit. + texit = huge(1d0) + else + ! -- Find outflow interval + call get_bet_outflow_bary(v1n, v2n, betoutlo, betouthi) + ! -- Find trend of and limits on beta from beta{t} solution + call get_bet_soln_limits(beti, betsollo, betsolhi, ibettrend) + ! -- Look for exit + if (ibettrend .eq. 0) then + ! -- Beta is constant, so check if it's within the outflow interval; + ! -- if not, no exit; if so, solve for t and alpha + if ((beti .gt. betouthi) .or. (beti .lt. betoutlo)) then + texit = huge(1d0) + else + ! -- Check alpha-velocity at the initial location, + ! -- recognizing that it will never change sign along the + ! -- trajectory (and will not be blocked from zero by an asymptote) + ! -- in this special case + v0alpstar = cv0(1) + wab * beti + valpi = v0alpstar + waa * alpi + if ((itriface .eq. 1) .and. (valpi .le. 0d0)) then + ! -- Can't exit along gamma = 0. + texit = huge(1d0) + else if ((itriface .eq. 2) .and. (valpi .ge. 0d0)) then + ! -- Can't exit along alpha = 0. + texit = huge(1d0) + else + ! -- get exit + if (itriface .eq. 1) then + alpexit = 1d0 - beti + else + alpexit = 0d0 + end if ! kluge note: seems like in this case (beta=const) this + betexit = beti ! must be the ONLY exit; no need to check other edges?? + if (waa .ne. 0d0) then + alplim = -v0alpstar / waa + texit = dlog(alpexit - alplim / (alpi - alplim)) / waa + else + texit = (alpexit - alpi) / v0alpstar + end if + end if + end if + ! -- End constant-beta case + else + ! -- Beta varies along trajectory; combine outflow and soln limits on beta + bethi = min(betouthi, betsolhi) + betlo = max(betoutlo, betsollo) + if (betlo .ge. bethi) then + ! -- If bounds on bet leave no feasible interval, no exit + texit = huge(1d0) + else + ! -- Check sign of function value at beta bounds + call get_t_alpt(bethi, thi, alphi) + call get_t_alpt(betlo, tlo, alplo) + if (itriface .eq. 1) then + fax = 1d0 - betlo - alplo + fbx = 1d0 - bethi - alphi + else + fax = alplo + fbx = alphi + end if + if (fax * fbx .gt. 0d0) then + ! -- Root not bracketed; no exit + texit = huge(1d0) + else + if (isolv .eq. 0) then + ! -- Use Euler integration to find exit + call soln_euler(itriface, alpi, beti, step, vziodz, az, & + texit, alpexit, betexit) + else if (isolv .eq. 1) then + ! -- Use Brent's method with initial bounds on beta of betlo and bethi, + ! -- assuming they bound the root + call soln_brent(itriface, betlo, bethi, tol, texit, & + alpexit, betexit) + else if (isolv .eq. 2) then + ! -- Use Chandrupatla's method with initial bounds on beta of betlo and bethi, + ! -- assuming they bound the root + call soln_chand(itriface, betlo, bethi, tol, texit, & + alpexit, betexit) + else if (isolv .eq. 3) then + ! -- Use a test method with initial bounds on beta of betlo and bethi, + ! -- assuming they bound the root + call soln_test(itriface, betlo, bethi, tol, texit, & + alpexit, betexit) + else + call pstop(1, "Invalid isolv, expected 0, 1, 2, or 3") + end if + end if + end if + ! -- End variable-beta case + end if + end if + ! -- End canonical face 1 (gamma = 0.) or 2 (alpha = 0.) + end if + + if (texit .ne. huge(1d0) .and. texit .lt. 0d0) & + call pstop(1, "texit is negative (unexpected)") ! shouldn't get here + + end subroutine + + !> @brief Brent's method applied to canonical face 1 (gamma = 0) + function fbary1(bet) result(fb) + ! -- dummy + real(DP), intent(in) :: bet + real(DP) :: fb + ! -- local + real(DP) :: t + real(DP) :: alpt + + ! -- Evaluate gamma{t{beta}} = 1. - alpha{t{beta}} - beta + call get_t_alpt(bet, t, alpt) + fb = 1d0 - alpt - bet + end function + + !> @brief Brent's method applied to canonical face 2 (alpha = 0) + function fbary2(bet) result(fb) + ! -- dummy + real(DP), intent(in) :: bet + real(DP) :: fb + ! -- local + real(DP) :: t + real(DP) :: alpt + + ! -- Evaluate alpha{t{beta}} + call get_t_alpt(bet, t, alpt) + fb = alpt + end function + + !> @brief Given beta evaluate t and alpha depending on case + subroutine get_t_alpt(bet, t, alp) + ! -- dummy + real(DP), intent(in) :: bet + real(DP) :: t + real(DP) :: alp + ! -- local + real(DP) :: term + real(DP) :: zerotol + + ! kluge note: assumes cb2<>0, wbb<>0 as appropriate + zerotol = 1d-10 ! kluge + term = (bet - cb1) / cb2 + if (icase .eq. 1) then + term = max(term, zerotol) + t = dlog(term) / wbb + alp = ca1 + ca2 * dexp(waa * t) + ca3 * dexp(wbb * t) + else if (icase .eq. -1) then + term = max(term, zerotol) + t = dlog(term) / wbb + alp = ca1 + (ca2 + ca3 * t) * dexp(waa * t) + else if (icase .eq. 2) then + term = max(term, zerotol) + t = dlog(term) / wbb + alp = ca1 + ca2 * t + ca3 * dexp(wbb * t) + else if (icase .eq. 3) then + t = term + alp = ca1 + ca2 * t + ca3 * dexp(waa * t) + else if (icase .eq. 4) then + t = term + alp = ca1 + (ca2 + ca3 * t) * t + end if + + end subroutine + + !> @brief Find outflow interval + subroutine get_bet_outflow_bary(vn1, vn2, betoutlo, betouthi) + ! -- dummy + real(DP) :: vn1 + real(DP) :: vn2 + real(DP) :: betoutlo + real(DP) :: betouthi + ! -- local + real(DP) :: vndiff + + vndiff = vn2 - vn1 + if (vn1 .lt. 0d0) then + ! -- Outflow at vn1 corner + betoutlo = 0d0 + if (vn2 .le. 0d0) then + ! -- Outflow along entire edge (except possibly no-flow right at vn2 corner) + betouthi = 1d0 + else + ! -- Outflow along part of edge + betouthi = -vn1 / vndiff + end if + else + ! -- Outflow at vn2 corner + betouthi = 1d0 + if (vn1 .le. 0d0) then + ! -- Outflow along entire edge (except possibly no-flow right at vn1 corner) + betoutlo = 0d0 + else + ! -- Outflow along part of edge + betoutlo = -vn1 / vndiff + end if + end if + + end subroutine + + !> @brief Find trend of and limits on beta from beta{t} solution + subroutine get_bet_soln_limits(beti, betsollo, betsolhi, ibettrend) + ! -- dummy + real(DP), intent(in) :: beti + real(DP) :: betsollo + real(DP) :: betsolhi + integer(I4B), intent(inout) :: ibettrend + ! -- local + real(DP) :: betlim + + if (wbb .gt. 0d0) then + betlim = -cv0(2) / wbb + if (beti .gt. betlim) then + betsolhi = huge(1d0) + betsollo = beti + ibettrend = 1 + else if (beti .lt. betlim) then + betsolhi = beti + betsollo = -huge(1d0) + ibettrend = -1 + else + betsolhi = beti + betsollo = beti + ibettrend = 0 + end if + else if (wbb .lt. 0d0) then + betlim = -cv0(2) / wbb + if (beti .gt. betlim) then + betsolhi = beti + betsollo = betlim + ibettrend = -1 + else if (beti .lt. betlim) then + betsolhi = betlim + betsollo = beti + ibettrend = 1 + else + betsolhi = beti + betsollo = beti + ibettrend = 0 + end if + else ! kluge note: use zerotol and elsewhere? + if (cv0(2) .gt. 0d0) then + betsolhi = huge(1d0) + betsollo = beti + ibettrend = 1 + else if (cv0(2) .lt. 0d0) then + betsolhi = beti + betsollo = -huge(1d0) + ibettrend = -1 + else + betsolhi = beti + betsollo = beti + ibettrend = 0 + end if + end if + + end subroutine + + !> @brief Use Brent's method with initial bounds on beta of betlo and bethi + subroutine soln_brent(itriface, betlo, bethi, tol, & + texit, alpexit, betexit) + ! -- dummy + integer(I4B), intent(in) :: itriface + real(DP) :: betlo + real(DP) :: bethi + real(DP), intent(in) :: tol + real(DP) :: texit + real(DP) :: alpexit + real(DP) :: betexit + ! -- local + real(DP) :: itmax + real(DP) :: itact + real(DP) :: blo + real(DP) :: bhi + procedure(f1d), pointer :: f + + ! -- assuming betlo and bethi bracket the root + ! -- + ! tol = 1d-7 ! kluge + itmax = 50 ! kluge + itact = itmax + 1 ! kluge + blo = betlo + bhi = bethi + if (itriface .eq. 1) then + f => fbary1 + betexit = zero_br(blo, bhi, f, tol) + else + f => fbary2 + betexit = zero_br(blo, bhi, f, tol) + end if + call get_t_alpt(betexit, texit, alpexit) + + end subroutine + + !> @brief Use Chandrupatla's method with initial bounds on beta of betlo and bethi + subroutine soln_chand(itriface, betlo, bethi, tol, & + texit, alpexit, betexit) + ! -- dummy + integer(I4B), intent(in) :: itriface + real(DP) :: betlo + real(DP) :: bethi + real(DP), intent(in) :: tol + real(DP) :: texit + real(DP) :: alpexit + real(DP) :: betexit + ! -- local + real(DP) :: itmax + real(DP) :: itact + real(DP) :: blo + real(DP) :: bhi + procedure(f1d), pointer :: f + + ! -- note: assuming betlo and bethi bracket the root + ! tol = 1d-7 ! kluge + itmax = 50 ! kluge + itact = itmax + 1 ! kluge + blo = betlo + bhi = bethi + if (itriface .eq. 1) then + f => fbary1 + betexit = zero_ch(blo, bhi, f, tol) + else + f => fbary2 + betexit = zero_ch(blo, bhi, f, tol) + end if + call get_t_alpt(betexit, texit, alpexit) + + end subroutine + + !> @brief Use a test method with initial bounds on beta of betlo and bethi + subroutine soln_test(itriface, betlo, bethi, tol, & + texit, alpexit, betexit) + ! -- dummy + integer(I4B), intent(in) :: itriface + real(DP) :: betlo + real(DP) :: bethi + real(DP), intent(in) :: tol + real(DP) :: texit + real(DP) :: alpexit + real(DP) :: betexit + ! -- local + real(DP) :: itmax + real(DP) :: itact + real(DP) :: blo + real(DP) :: bhi + procedure(f1d), pointer :: f + + ! -- assuming betlo and bethi bracket the root + ! tol = 1d-7 ! kluge + itmax = 50 ! kluge + itact = itmax + 1 ! kluge + blo = betlo + bhi = bethi + if (itriface .eq. 1) then + f => fbary1 + betexit = zero_test(blo, bhi, f, tol) + else + f => fbary2 + betexit = zero_test(blo, bhi, f, tol) + end if + call get_t_alpt(betexit, texit, alpexit) + + end subroutine + + !> @brief Use Euler integration to find exit + subroutine soln_euler(itriface, alpi, beti, step, vziodz, & + az, texit, alpexit, betexit) + ! -- dummy + integer(I4B), intent(in) :: itriface + real(DP) :: alpi + real(DP) :: beti + real(DP), intent(in) :: step + real(DP) :: vziodz + real(DP) :: az + real(DP) :: texit + real(DP) :: alpexit + real(DP) :: betexit + ! -- local + real(DP) :: alp + real(DP) :: bet + real(DP) :: gam + real(DP) :: alpold + real(DP) :: betold + real(DP) :: gamold + real(DP) :: wt + real(DP) :: omwt + real(DP) :: t + real(DP) :: told + + t = 0d0 + alp = alpi + bet = beti + if (itriface .eq. 1) gam = 1d0 - alpi - beti + do nt = 1, 1000000000 ! kluge hardwired + ! -- Save current time, alpha, and beta + told = t + alpold = alp + betold = bet + ! -- Step forward in time + ! t = dble(nt)*step + call step_euler(nt, step, vziodz, az, alpi, beti, t, alp, bet) + ! if (nt.eq.0) then + ! znum = zi + ! else + ! vz = vzbot + az*(znum - zbot) + ! znum = znum + vz*delt ! kluge note: can be smart about checking z + ! end if + if (itriface .eq. 1) then + ! -- If gamma has crossed zero, interpolate linearly + ! -- to find crossing (exit) point + gamold = gam + gam = 1d0 - alp - bet + if (gam .lt. 0d0) then + wt = gamold / (gamold - gam) + omwt = 1d0 - wt + texit = omwt * told + wt * t + alpexit = omwt * alpold + wt * alp + betexit = omwt * betold + wt * bet + exit + end if + else + ! -- If alpha has crossed zero, interpolate linearly + ! -- to find crossing (exit) point + if (alp .lt. 0d0) then + wt = alpold / (alpold - alp) + omwt = 1d0 - wt + texit = omwt * told + wt * t + alpexit = omwt * alpold + wt * alp + betexit = omwt * betold + wt * bet + exit + end if + end if + ! -- End time step loop + end do + if (nt .gt. 1000000000) then ! kluge hardwired + ! -- Exit not found after max number of time steps + call pstop(1, "Didn't find exit in soln_euler") + end if + + end subroutine + +end module TernarySolveTrack diff --git a/src/Utilities/BlockParser.f90 b/src/Utilities/BlockParser.f90 index 887955ff972..d808748f036 100644 --- a/src/Utilities/BlockParser.f90 +++ b/src/Utilities/BlockParser.f90 @@ -6,7 +6,7 @@ !< module BlockParserModule - use KindModule, only: DP, I4B + use KindModule, only: DP, I4B, LGP use DevFeatureModule, only: dev_feature use ConstantsModule, only: LENBIGLINE, LENHUGELINE, LINELENGTH, MAXCHARLEN use InputOutputModule, only: urword, upcase, openfile, & @@ -39,6 +39,7 @@ module BlockParserModule procedure, public :: GetCellid procedure, public :: GetCurrentLine procedure, public :: GetDouble + procedure, public :: TryGetDouble procedure, public :: GetInteger procedure, public :: GetLinesRead procedure, public :: GetNextLine @@ -313,11 +314,29 @@ function GetDouble(this) result(r) if (istart == istop .and. istop == len(this%line)) then call this%ReadScalarError('DOUBLE PRECISION') end if - ! - ! -- return - return + end function GetDouble + subroutine TryGetDouble(this, r, success) + ! -- dummy variables + class(BlockParserType), intent(inout) :: this !< BlockParserType object + real(DP), intent(inout) :: r !< double precision real variable + logical(LGP), intent(inout) :: success !< whether parsing was successful + ! -- local variables + integer(I4B) :: istart + integer(I4B) :: istop + integer(I4B) :: ival + + call urword(this%line, this%lloc, istart, istop, 3, ival, r, & + this%iout, this%iuext) + + success = .true. + if (istart == istop .and. istop == len(this%line)) then + success = .false. + end if + + end subroutine TryGetDouble + !> @ brief Issue a read error !! !! Method to issue an unable to read error. diff --git a/src/Utilities/GeomUtil.f90 b/src/Utilities/GeomUtil.f90 index 9d1bad53c2b..9fdd947e99f 100644 --- a/src/Utilities/GeomUtil.f90 +++ b/src/Utilities/GeomUtil.f90 @@ -6,8 +6,7 @@ module GeomUtilModule private public :: between, point_in_polygon, & get_node, get_ijk, get_jk, & - skew, transform, & - compose + skew, transform, compose contains !> @brief Check if a value is between two other values (inclusive). @@ -17,8 +16,10 @@ logical function between(x, a, b) end function between !> @brief Check if a point is within a polygon. - !! Vertices and edge points are considered in. - !! Reference: https://stackoverflow.com/a/63436180/6514033 + !! + !! Vertices and edge points are considered in the polygon. + !! Adapted from https://stackoverflow.com/a/63436180/6514033, + !< logical function point_in_polygon(x, y, poly) ! dummy real(DP), intent(in) :: x !< x point coordinate @@ -38,23 +39,27 @@ logical function point_in_polygon(x, y, poly) xb = poly(1, ii) yb = poly(2, ii) - if ((x == xa .and. y == ya) .or. (x == xb .and. y == yb)) then + if ((x == xa .and. y == ya) .or. & + (x == xb .and. y == yb)) then ! on vertex point_in_polygon = .true. exit - else if (ya == yb .and. y == ya .and. between(x, xa, xb)) then + else if (ya == yb .and. & + y == ya .and. & + between(x, xa, xb)) then ! on horizontal edge point_in_polygon = .true. exit else if (between(y, ya, yb)) then - if ((y == ya .and. yb >= ya) .or. (y == yb .and. ya >= yb)) then + if ((y == ya .and. yb >= ya) .or. & + (y == yb .and. ya >= yb)) then xa = xb ya = yb cycle end if ! cross product c = (xa - x) * (yb - y) - (xb - x) * (ya - y) - if (c == 0) then + if (c == 0.0_DP) then ! on edge point_in_polygon = .true. exit diff --git a/src/Utilities/MathUtil.f90 b/src/Utilities/MathUtil.f90 index f53c1d3d21c..058f32d5f1d 100644 --- a/src/Utilities/MathUtil.f90 +++ b/src/Utilities/MathUtil.f90 @@ -7,7 +7,7 @@ module MathUtilModule implicit none private - public :: f1d, is_close, mod_offset, zeroch, zeroin, zerotest + public :: f1d, is_close, mod_offset, zero_ch, zero_br, zero_test interface mod_offset module procedure :: mod_offset_int, mod_offset_dbl @@ -128,7 +128,7 @@ end function mod_offset_dbl !! Simulation of Classical and Quantum Systems," 2nd ed., Springer, New York. !! !< - function zeroch(x0, x1, f, epsa) result(z) + function zero_ch(x0, x1, f, epsa) result(z) ! -- dummy real(DP) :: x0, x1 procedure(f1d), pointer, intent(in) :: f @@ -240,11 +240,11 @@ function zeroch(x0, x1, f, epsa) result(z) !! !! Output: !! - !! zeroin abscissa approximating a zero of f in the interval ax,bx + !! zero_br abscissa approximating a zero of f in the interval ax,bx !! !! it is assumed that f(ax) and f(bx) have opposite signs !! this is checked, and an error message is printed if this is not - !! satisfied. zeroin returns a zero x in the given interval + !! satisfied. zero_br returns a zero x in the given interval !! ax,bx to within a tolerance 4*macheps*abs(x)+tol, where macheps is !! the relative machine precision defined as the smallest representable !! number such that 1.+macheps .gt. 1. @@ -252,7 +252,7 @@ function zeroch(x0, x1, f, epsa) result(z) !! the algol 60 procedure zero given in richard brent, algorithms for !! minimization without derivatives, prentice-hall, inc. (1973). !< - function zeroin(ax, bx, f, tol) result(z) + function zero_br(ax, bx, f, tol) result(z) ! -- dummy real(DP) :: ax, bx procedure(f1d), pointer, intent(in) :: f @@ -352,10 +352,10 @@ function zeroin(ax, bx, f, tol) result(z) fb = f(b) rs = (fb * (fc / dabs(fc))) .gt. 0.0d0 end do - end function zeroin + end function zero_br - !> @brief Compute a zero of the function f(x) in the interval (x0, x1) - function zerotest(x0, x1, f, epsa) result(z) + !> @brief Compute a zero of f(x) in the interval (x0, x1) with a test method. + function zero_test(x0, x1, f, epsa) result(z) ! -- dummy real(DP) :: x0, x1 procedure(f1d), pointer, intent(in) :: f diff --git a/src/Utilities/Observation/Obs.f90 b/src/Utilities/Observation/Obs.f90 index b1d1867ad38..93ec3b973f3 100644 --- a/src/Utilities/Observation/Obs.f90 +++ b/src/Utilities/Observation/Obs.f90 @@ -980,7 +980,7 @@ end function get_obs !> @ brief Read observation blocks !! - !! Subroutine to read CONTIGUIUS block from the observation input file. + !! Subroutine to read CONTIGUOUS block from the observation input file. !! !< subroutine read_obs_blocks(this, fname) diff --git a/src/meson.build b/src/meson.build index b0539631c9c..9836a06a526 100644 --- a/src/meson.build +++ b/src/meson.build @@ -32,18 +32,20 @@ modflow_sources = files( 'Exchange' / 'GhostNode.f90', 'Exchange' / 'GwfExchangeMover.f90', 'Exchange' / 'NumericalExchange.f90', - 'Exchange' / 'exg-gwfgwe.f90', 'Exchange' / 'exg-gwfgwf.f90', 'Exchange' / 'exg-gwfgwt.f90', 'Exchange' / 'exg-gwtgwt.f90', + 'Exchange' / 'exg-gwfgwe.f90', 'Exchange' / 'exg-gwegwe.f90', 'Exchange' / 'exg-swfgwf.f90', + 'Exchange' / 'exg-gwfprt.f90', 'Idm' / 'exg-gwfgwfidm.f90', 'Idm' / 'exg-gwfgwtidm.f90', 'Idm' / 'exg-gwtgwtidm.f90', 'Idm' / 'exg-gwfgweidm.f90', 'Idm' / 'exg-gwegweidm.f90', 'Idm' / 'exg-swfgwfidm.f90', + 'Idm' / 'exg-gwfprtidm.f90', 'Idm' / 'gwe-cndidm.f90', 'Idm' / 'gwe-ctpidm.f90', 'Idm' / 'gwe-disidm.f90', @@ -83,12 +85,17 @@ modflow_sources = files( 'Idm' / 'swf-zdgidm.f90', 'Idm' / 'sim-namidm.f90', 'Idm' / 'sim-tdisidm.f90', + 'Idm' / 'prt-namidm.f90', + 'Idm' / 'prt-disidm.f90', + 'Idm' / 'prt-disvidm.f90', + 'Idm' / 'prt-mipidm.f90', 'Idm' / 'selector' / 'IdmDfnSelector.f90', 'Idm' / 'selector' / 'IdmExgDfnSelector.f90', 'Idm' / 'selector' / 'IdmGweDfnSelector.f90', 'Idm' / 'selector' / 'IdmGwfDfnSelector.f90', 'Idm' / 'selector' / 'IdmGwtDfnSelector.f90', 'Idm' / 'selector' / 'IdmSwfDfnSelector.f90', + 'Idm' / 'selector' / 'IdmPrtDfnSelector.f90', 'Idm' / 'selector' / 'IdmSimDfnSelector.f90', 'Model' / 'Connection' / 'ConnectionBuilder.f90', 'Model' / 'Connection' / 'CellWithNbrs.f90', @@ -115,7 +122,6 @@ modflow_sources = files( 'Model' / 'GroundWaterEnergy' / 'gwe-mwe.f90', 'Model' / 'GroundWaterEnergy' / 'gwe-sfe.f90', 'Model' / 'GroundWaterEnergy' / 'gwe-uze.f90', - 'Model' / 'GroundWaterFlow' / 'gwf.f90', 'Model' / 'GroundWaterFlow' / 'gwf-api.f90', 'Model' / 'GroundWaterFlow' / 'gwf-buy.f90', @@ -125,7 +131,6 @@ modflow_sources = files( 'Model' / 'GroundWaterFlow' / 'gwf-disu.f90', 'Model' / 'GroundWaterFlow' / 'gwf-disv.f90', 'Model' / 'GroundWaterFlow' / 'gwf-drn.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-evt.f90', 'Model' / 'GroundWaterFlow' / 'gwf-ghb.f90', 'Model' / 'GroundWaterFlow' / 'gwf-hfb.f90', @@ -156,11 +161,9 @@ modflow_sources = files( 'Model' / 'GroundWaterTransport' / 'gwt-sft.f90', 'Model' / 'GroundWaterTransport' / 'gwt-src.f90', 'Model' / 'GroundWaterTransport' / 'gwt-uzt.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-disl.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-cxs.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf-dfw.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-ic.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-obs.f90', @@ -168,6 +171,12 @@ modflow_sources = files( 'Model' / 'SurfaceWaterFlow' / 'swf-flw.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-sto.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-zdg.f90', + 'Model' / 'ParticleTracking' / 'prt.f90', + 'Model' / 'ParticleTracking' / 'prt-fmi.f90', + 'Model' / 'ParticleTracking' / 'prt-mip.f90', + 'Model' / 'ParticleTracking' / 'prt-obs.f90', + 'Model' / 'ParticleTracking' / 'prt-oc.f90', + 'Model' / 'ParticleTracking' / 'prt-prp.f90', 'Model' / 'ModelUtilities' / 'BoundaryPackage.f90', 'Model' / 'ModelUtilities' / 'BoundaryPackageExt.f90', 'Model' / 'ModelUtilities' / 'GweCndOptions.f90', @@ -191,6 +200,8 @@ modflow_sources = files( 'Model' / 'ModelUtilities' / 'SfrCrossSectionUtils.f90', 'Model' / 'ModelUtilities' / 'SwfCxsUtils.f90', 'Model' / 'ModelUtilities' / 'TspAdvOptions.f90', + 'Model' / 'ModelUtilities' / 'TimeSelect.f90', + 'Model' / 'ModelUtilities' / 'TrackData.f90', 'Model' / 'ModelUtilities' / 'UzfCellGroup.f90', 'Model' / 'ModelUtilities' / 'Xt3dAlgorithm.f90', 'Model' / 'ModelUtilities' / 'Xt3dInterface.f90', @@ -221,8 +232,30 @@ modflow_sources = files( 'Solution' / 'NumericalSolution.f90', 'Solution' / 'SolutionFactory.F90', 'Solution' / 'SolutionGroup.f90', + 'Solution' / 'ParticleTracker' / 'Cell.f90', + 'Solution' / 'ParticleTracker' / 'CellDefn.f90', + 'Solution' / 'ParticleTracker' / 'CellPoly.f90', + 'Solution' / 'ParticleTracker' / 'CellRect.f90', + 'Solution' / 'ParticleTracker' / 'CellRectQuad.f90', + 'Solution' / 'ParticleTracker' / 'CellUtil.f90', + 'Solution' / 'ParticleTracker' / 'Method.f90', + 'Solution' / 'ParticleTracker' / 'MethodCellPollock.f90', + 'Solution' / 'ParticleTracker' / 'MethodCellPollockQuad.f90', + 'Solution' / 'ParticleTracker' / 'MethodCellPool.f90', + 'Solution' / 'ParticleTracker' / 'MethodCellTernary.f90', + 'Solution' / 'ParticleTracker' / 'MethodDis.f90', + 'Solution' / 'ParticleTracker' / 'MethodDisv.f90', + 'Solution' / 'ParticleTracker' / 'MethodPool.f90', + 'Solution' / 'ParticleTracker' / 'MethodCellPassToBot.f90', + 'Solution' / 'ParticleTracker' / 'MethodSubcellPollock.f90', + 'Solution' / 'ParticleTracker' / 'MethodSubcellPool.f90', + 'Solution' / 'ParticleTracker' / 'MethodSubcellTernary.f90', + 'Solution' / 'ParticleTracker' / 'Particle.f90', + 'Solution' / 'ParticleTracker' / 'Subcell.f90', + 'Solution' / 'ParticleTracker' / 'SubcellRect.f90', + 'Solution' / 'ParticleTracker' / 'SubcellTri.f90', + 'Solution' / 'ParticleTracker' / 'TernarySolveTrack.f90', 'Timing' / 'ats.f90', - 'Timing' / 'tdis.f90', 'Utilities' / 'ArrayRead' / 'ArrayReaderBase.f90', 'Utilities' / 'ArrayRead' / 'Double1dReader.f90', @@ -247,7 +280,6 @@ modflow_sources = files( 'Utilities' / 'Idm' / 'mf6blockfile' / 'StressListInput.f90', 'Utilities' / 'Idm' / 'mf6blockfile' / 'StructArray.f90', 'Utilities' / 'Idm' / 'mf6blockfile' / 'StructVector.f90', - 'Utilities' / 'Matrix' / 'MatrixBase.f90', 'Utilities' / 'Matrix' / 'SparseMatrix.f90', 'Utilities' / 'Memory' / 'Memory.f90', @@ -286,6 +318,7 @@ modflow_sources = files( 'Utilities' / 'CharString.f90', 'Utilities' / 'comarg.f90', 'Utilities' / 'compilerversion.F90', + 'Utilities' / 'CharString.f90', 'Utilities' / 'Constants.f90', 'Utilities' / 'defmacro.F90', 'Utilities' / 'DevFeature.f90', @@ -308,7 +341,7 @@ modflow_sources = files( 'Utilities' / 'SimVariables.f90', 'Utilities' / 'SmoothingFunctions.f90', 'Utilities' / 'sort.f90', - 'Utilities' / 'Sparse.f90', + 'Utilities' / 'Sparse.f90', 'Utilities' / 'STLVecInt.f90', 'Utilities' / 'StringList.f90', 'Utilities' / 'Table.f90', @@ -317,7 +350,6 @@ modflow_sources = files( 'Utilities' / 'version.f90', 'mf6core.f90', 'mf6lists.f90', - 'SimulationCreate.f90', 'RunControl.f90', 'RunControlFactory.F90' diff --git a/utils/idmloader/dfns.txt b/utils/idmloader/dfns.txt index e958f7bfd2a..f67efab0ab0 100644 --- a/utils/idmloader/dfns.txt +++ b/utils/idmloader/dfns.txt @@ -51,10 +51,17 @@ swf-chd.dfn swf-flw.dfn swf-zdg.dfn +# prt model +prt-nam.dfn +prt-dis.dfn +prt-disv.dfn +prt-mip.dfn + # exchanges exg-gwfgwf.dfn exg-gwfgwt.dfn exg-gwtgwt.dfn exg-gwfgwe.dfn exg-gwegwe.dfn -exg-swfgwf.dfn \ No newline at end of file +exg-swfgwf.dfn +exg-gwfprt.dfn \ No newline at end of file From 577b14dc726c495acfbf5d1fdcc17761a0ac99b9 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Fri, 23 Feb 2024 15:06:48 -0600 Subject: [PATCH 040/199] fix(lak): fix issue with outlet observations (#1646) * in cases with multiple outlets in a lake the outlet observation used the incorrect index when evaluating the package ibound * added test that compares outlet observations to known values --- autotest/test_gwf_lakobs02.py | 227 ++++++++++++++++++++++++++ src/Model/GroundWaterFlow/gwf-lak.f90 | 5 +- 2 files changed, 228 insertions(+), 4 deletions(-) create mode 100644 autotest/test_gwf_lakobs02.py diff --git a/autotest/test_gwf_lakobs02.py b/autotest/test_gwf_lakobs02.py new file mode 100644 index 00000000000..5ecad4208ea --- /dev/null +++ b/autotest/test_gwf_lakobs02.py @@ -0,0 +1,227 @@ +""" +Test for lake package outlet observations. + +The test evaluates the total outlet flow calculated using lake boundname +with EXT-OUTFLOW and OUTLET flow for all three outlets. +""" + + +import os + +import flopy +import numpy as np +import pathlib as pl +import pytest + +from framework import DNODATA, TestFramework + +cases = ["lakoutlet_obs"] + + +def build_models(idx, test): + nlay = 2 + nrow = 3 + ncol = 3 + nper = 1 + delc = 1000.0 + delr = 1000.0 + top = 5.0 + botm = [-5.0, -10.] + + perlen = [1.0] + nstp = [1] + tsmult = [1.0] + + Kh = 1.0 + + tdis_rc = [(1.0, 1, 1.0)] + + name = cases[idx] + + # build MODFLOW 6 files + sim = flopy.mf6.MFSimulation( + sim_name=name, + sim_ws=test.workspace, + ) + + # create tdis package + tdis = flopy.mf6.ModflowTdis( + sim, + time_units="DAYS", + nper=nper, + perioddata=tdis_rc, + ) + + # create gwf model + gwf = flopy.mf6.ModflowGwf(sim, modelname=name) #, newtonoptions="newton") + + imsgwf = flopy.mf6.ModflowIms( + sim, + print_option="SUMMARY", + complexity="simple", + inner_dvclose=1e-9, + outer_dvclose=1e-8, + # linear_acceleration="bicgstab", + ) + + # number of columns to be a lake for layer 1, 2, , ... len(lakend) + idomain = np.ones((nlay, nrow, ncol), dtype=int) + idomain[0, 1, 1] = 0 + dis = flopy.mf6.ModflowGwfdis( + gwf, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=idomain, + ) + + # initial conditions + strt = 0.0 + ic = flopy.mf6.ModflowGwfic(gwf, strt=strt) + + # node property flow + npf = flopy.mf6.ModflowGwfnpf( + gwf, + icelltype=1, + k=Kh, + ) + + sy = 0.3 + ss = 0.0 + sto = flopy.mf6.ModflowGwfsto(gwf, sy=sy, ss=ss, iconvert=1) + + lake_connect = [ + (0, 1), + (1, 0), + (1, 2), + (2, 1), + ] + nlakeconn = len(lake_connect) + 1 + + # pak_data = [ifno, strt, nlakeconn] + pak_data = [(0, strt, nlakeconn, "LAKE1")] + + bedleak = DNODATA + belev = botm[0] + con_data = [ + ( + 0, + idx, + (0, i, j), + "HORIZONTAL", + bedleak, + belev, + top, + delr / 2.0, + delr, + ) + for idx, (i, j) in enumerate(lake_connect) + ] + con_data.append( + ( + 0, + 4, + (1, 1, 1), + "VERTICAL", + bedleak, + belev, + top, + 0.0, + 0.0, + ) + + ) + + # outlet data + outlet_data = [ + (0, 0, -1, "specified", 0.0, 0.0, 0.0, 0.0), + (1, 0, -1, "specified", 0.0, 0.0, 0.0, 0.0), + (2, 0, -1, "specified", 0.0, 0.0, 0.0, 0.0), + ] + noutlets = len(outlet_data) + + # period data + p_data = [ + (0, "RATE", -3.0), + (1, "RATE", -2.0), + (2, "RATE", -1.0), + # (0, "INFLOW", 6.0), + ] + + lak_obs = { + f"{name}.lak.obs.csv": [ + ("total", "ext-outflow", "LAKE1"), + ("o1", "outlet", (0,)), + ("o2", "outlet", (1,)), + ("o3", "outlet", (2,)), + ], + } + + lak = flopy.mf6.modflow.ModflowGwflak( + gwf, + surfdep=0.0, + save_flows=True, + print_input=True, + print_flows=True, + print_stage=True, + boundnames=True, + nlakes=len(pak_data), + ntables=0, + noutlets=noutlets, + outlets=outlet_data, + packagedata=pak_data, + pname="LAK-1", + connectiondata=con_data, + perioddata=p_data, + observations=lak_obs, + ) + + # idx = np.where(idomain == 1) + # chdspd = [] + # for k, i, j in zip(*idx): + # chdspd.append(((k, i, j), 0.0)) + # chd = flopy.mf6.modflow.ModflowGwfchd(gwf, stress_period_data=chdspd) + + rech = 6.0 / (8.0 * delr * delc) + rch = flopy.mf6.modflow.ModflowGwfrcha( + gwf, print_flows=True, save_flows=True, recharge=rech, + ) + + # output control + oc = flopy.mf6.ModflowGwfoc( + gwf, + printrecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + ) + + return sim, None + + +def check_output(idx, test): + name = cases[idx] + obs_values = flopy.utils.Mf6Obs(test.workspace / f"{name}.lak.obs.csv") + test_values = { + "TOTAL": [-6.0], + "O1": [-3.0], + "O2": [-2.0], + "O3": [-1.0], + } + for key, value in test_values.items(): + assert np.array_equal( + obs_values.get_data(obsname=key)[key], value + ), f"failed comparison for '{key}' observation" + + +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/src/Model/GroundWaterFlow/gwf-lak.f90 b/src/Model/GroundWaterFlow/gwf-lak.f90 index 4deebd42096..4218ca8d3f2 100644 --- a/src/Model/GroundWaterFlow/gwf-lak.f90 +++ b/src/Model/GroundWaterFlow/gwf-lak.f90 @@ -4778,11 +4778,8 @@ subroutine lak_bd_obs(this) end if case ('OUTLET') n = this%lakein(jj) - if (this%iboundpak(jj) /= 0) then + if (this%iboundpak(n) /= 0) then v = this%simoutrate(jj) - !if (this%imover == 1) then - ! v = v + this%pakmvrobj%get_qtomvr(jj) - !end if end if case ('VOLUME') if (this%iboundpak(jj) /= 0) then From 0950ba86cb01fbd3f6e3c62581bf551519a3703b Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Fri, 23 Feb 2024 16:26:29 -0600 Subject: [PATCH 041/199] refactor(misc): improve doc (#1647) * refactor(misc): improve doc * improve auto flow reduce description in dfn to indicate it is only for unconfined cells * mark swf as a dev_feature * minor name change to tsp list file header * fprettify --- doc/mf6io/mf6ivar/dfn/gwf-wel.dfn | 2 +- src/Model/TransportModel/tsp.f90 | 2 +- src/SimulationCreate.f90 | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/doc/mf6io/mf6ivar/dfn/gwf-wel.dfn b/doc/mf6io/mf6ivar/dfn/gwf-wel.dfn index c7de3e7e96f..5b9e82872bb 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-wel.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-wel.dfn @@ -62,7 +62,7 @@ type double precision reader urword optional true longname cell fractional thickness for reduced pumping -description keyword and real value that defines the fraction of the cell thickness used as an interval for smoothly adjusting negative pumping rates to 0 in cells with head values less than or equal to the bottom of the cell. Negative pumping rates are adjusted to 0 or a smaller negative value when the head in the cell is equal to or less than the calculated interval above the cell bottom. AUTO\_FLOW\_REDUCE is set to 0.1 if the specified value is less than or equal to zero. By default, negative pumping rates are not reduced during a simulation. +description keyword and real value that defines the fraction of the cell thickness used as an interval for smoothly adjusting negative pumping rates to 0 in cells with head values less than or equal to the bottom of the cell. Negative pumping rates are adjusted to 0 or a smaller negative value when the head in the cell is equal to or less than the calculated interval above the cell bottom. AUTO\_FLOW\_REDUCE is set to 0.1 if the specified value is less than or equal to zero. By default, negative pumping rates are not reduced during a simulation. This AUTO\_FLOW\_REDUCE option only applies to wells in model cells that are marked as ``convertible'' (ICELLTYPE /= 0) in the Node Property Flow (NPF) input file. Reduction in flow will not occur for wells in cells marked as confined (ICELLTYPE = 0). mf6internal flowred block options diff --git a/src/Model/TransportModel/tsp.f90 b/src/Model/TransportModel/tsp.f90 index 82d49c1dd67..aaf90cf0e67 100644 --- a/src/Model/TransportModel/tsp.f90 +++ b/src/Model/TransportModel/tsp.f90 @@ -127,7 +127,7 @@ subroutine tsp_cr(this, filename, id, modelname, macronym, indis) ! ! -- create the list file call this%create_lstfile(lst_fname, filename, found%list, & - 'GROUNDWATER TRANSPORT MODEL (GWT)') + 'TRANSPORT MODEL ('//trim(macronym)//')') ! ! -- activate save_flows if found if (found%save_flows) then diff --git a/src/SimulationCreate.f90 b/src/SimulationCreate.f90 index c25c11a9920..7f514fefbb2 100644 --- a/src/SimulationCreate.f90 +++ b/src/SimulationCreate.f90 @@ -313,6 +313,8 @@ subroutine models_create() write (iout, '(4x,2a,i0,a)') trim(model_type), " model ", & n, " will be created" call swf_cr(fname, n, model_names(n)) + call dev_feature('SWF is still under development, install the & + &nightly build or compile from source with IDEVELOPMODE = 1.') num_model => GetNumericalModelFromList(basemodellist, im) model_loc_idx(n) = im end if @@ -321,8 +323,8 @@ subroutine models_create() write (iout, '(4x,2a,i0,a)') trim(model_type), ' model ', & n, ' will be created' call prt_cr(fname, n, model_names(n)) - call dev_feature("PRT is still under development, install the' & - &nightly build or compile from source with IDEVELOPMODE = 1.") + call dev_feature('PRT is still under development, install the & + &nightly build or compile from source with IDEVELOPMODE = 1.') num_model => GetNumericalModelFromList(basemodellist, im) model_loc_idx(n) = im case default From 8d0799246d9a3beefa8e8a035e72de41b849a23c Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 26 Feb 2024 10:20:10 -0500 Subject: [PATCH 042/199] refactor: move hyeff function to separate module (#1650) * move function for effective horizontal hydraulic conductivity out of gwf-npf.f90 * introduce HGeoUtilModule for standalone hydrogeologic functions * eliminate dependency on gwf-npf from gwt-dsp and gwe-cnd * todo: more generic routine and argument naming --- make/makefile | 3 +- msvs/mf6core.vfproj | 1 + src/Model/GroundWaterEnergy/gwe-cnd.f90 | 14 +-- src/Model/GroundWaterFlow/gwf-npf.f90 | 112 +-------------------- src/Model/GroundWaterTransport/gwt-dsp.f90 | 14 +-- src/Utilities/HGeoUtil.f90 | 110 ++++++++++++++++++++ src/meson.build | 1 + 7 files changed, 133 insertions(+), 122 deletions(-) create mode 100644 src/Utilities/HGeoUtil.f90 diff --git a/make/makefile b/make/makefile index 6b628f91f39..dcc22ac2537 100644 --- a/make/makefile +++ b/make/makefile @@ -261,6 +261,7 @@ $(OBJDIR)/TspAdvOptions.o \ $(OBJDIR)/UzfCellGroup.o \ $(OBJDIR)/Xt3dInterface.o \ $(OBJDIR)/gwf-tvk.o \ +$(OBJDIR)/HGeoUtil.o \ $(OBJDIR)/gwf-vsc.o \ $(OBJDIR)/GwfNpfOptions.o \ $(OBJDIR)/InterfaceMap.o \ @@ -284,12 +285,12 @@ $(OBJDIR)/gwf-uzf.o \ $(OBJDIR)/tsp-apt.o \ $(OBJDIR)/gwt-mst.o \ $(OBJDIR)/GwtDspOptions.o \ -$(OBJDIR)/gwf-npf.o \ $(OBJDIR)/gwf-tvs.o \ $(OBJDIR)/GwfStorageUtils.o \ $(OBJDIR)/Mover.o \ $(OBJDIR)/GwfMvrPeriodData.o \ $(OBJDIR)/ImsLinearMisc.o \ +$(OBJDIR)/gwf-npf.o \ $(OBJDIR)/GwfBuyInputData.o \ $(OBJDIR)/GweCndOptions.o \ $(OBJDIR)/VirtualSolution.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index aef9e6f560d..54ae3f978c7 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -505,6 +505,7 @@ + diff --git a/src/Model/GroundWaterEnergy/gwe-cnd.f90 b/src/Model/GroundWaterEnergy/gwe-cnd.f90 index f3a1646ef55..f678e9fe99b 100644 --- a/src/Model/GroundWaterEnergy/gwe-cnd.f90 +++ b/src/Model/GroundWaterEnergy/gwe-cnd.f90 @@ -809,7 +809,7 @@ end subroutine calcdispellipse !< subroutine calcdispcoef(this) ! -- modules - use GwfNpfModule, only: hyeff_calc + use HGeoUtilModule, only: hyeff ! -- dummy class(GweCndType) :: this ! -- local @@ -859,12 +859,12 @@ subroutine calcdispcoef(this) ! normal to the shared n-m face and for cell m in the direction ! normal to the shared n-m face. call this%dis%connection_normal(n, m, ihc, vg1, vg2, vg3, ipos) - dn = hyeff_calc(this%d11(n), this%d22(n), this%d33(n), & - this%angle1(n), this%angle2(n), this%angle3(n), & - vg1, vg2, vg3, iavgmeth) - dm = hyeff_calc(this%d11(m), this%d22(m), this%d33(m), & - this%angle1(m), this%angle2(m), this%angle3(m), & - vg1, vg2, vg3, iavgmeth) + dn = hyeff(this%d11(n), this%d22(n), this%d33(n), & + this%angle1(n), this%angle2(n), this%angle3(n), & + vg1, vg2, vg3, iavgmeth) + dm = hyeff(this%d11(m), this%d22(m), this%d33(m), & + this%angle1(m), this%angle2(m), this%angle3(m), & + vg1, vg2, vg3, iavgmeth) ! ! -- Calculate dispersion conductance based on NPF subroutines and the ! effective dispersion coefficients dn and dm. diff --git a/src/Model/GroundWaterFlow/gwf-npf.f90 b/src/Model/GroundWaterFlow/gwf-npf.f90 index e02a183b87c..a22f77cb3e9 100644 --- a/src/Model/GroundWaterFlow/gwf-npf.f90 +++ b/src/Model/GroundWaterFlow/gwf-npf.f90 @@ -20,6 +20,7 @@ module GwfNpfModule mem_deallocate, mem_setptr, & mem_reassignptr use MatrixBaseModule + use HGeoUtilModule, only: hyeff implicit none @@ -30,7 +31,6 @@ module GwfNpfModule public :: vcond public :: condmean public :: thksatnm - public :: hyeff_calc type, extends(NumericalPackageType) :: GwfNpfType @@ -2472,8 +2472,8 @@ function hy_eff(this, n, m, ihc, ipos, vg) result(hy) ang2 = this%angle2(n) ang3 = DZERO if (this%iangle3 > 0) ang3 = this%angle3(n) - hy = hyeff_calc(hy11, hy22, hy33, ang1, ang2, ang3, vg1, vg2, vg3, & - this%iavgkeff) + hy = hyeff(hy11, hy22, hy33, ang1, ang2, ang3, vg1, vg2, vg3, & + this%iavgkeff) end if ! else @@ -2498,8 +2498,8 @@ function hy_eff(this, n, m, ihc, ipos, vg) result(hy) if (this%iangle3 > 0) ang3 = this%angle3(n) end if end if - hy = hyeff_calc(hy11, hy22, hy33, ang1, ang2, ang3, vg1, vg2, vg3, & - this%iavgkeff) + hy = hyeff(hy11, hy22, hy33, ang1, ang2, ang3, vg1, vg2, vg3, & + this%iavgkeff) end if ! end if @@ -2862,108 +2862,6 @@ function logmean(d1, d2) return end function logmean - !> @brief Calculate the effective horizontal hydraulic conductivity from an - !! ellipse using a specified direction (unit vector vg1, vg2, vg3) - !! - !! k11 is the hydraulic conductivity of the major ellipse axis - !! k22 is the hydraulic conductivity of first minor axis - !! k33 is the hydraulic conductivity of the second minor axis - !! ang1 is the counter-clockwise rotation (radians) of the ellipse in - !! the (x, y) plane - !! ang2 is the rotation of the conductivity ellipsoid upward or - !! downward from the (x, y) plane - !! ang3 is the rotation of the conductivity ellipsoid about the major - !! axis - !! vg1, vg2, and vg3 are the components of a unit vector in model coordinates - !! in the direction of the connection between cell n and m - !!iavgmeth is the averaging method. If zero, then use harmonic averaging. - !! if one, then use arithmetic averaging. - !< - function hyeff_calc(k11, k22, k33, ang1, ang2, ang3, vg1, vg2, vg3, & - iavgmeth) result(hyeff) - ! -- modules - use ConstantsModule, only: DONE - ! -- return - real(DP) :: hyeff - ! -- dummy - real(DP), intent(in) :: k11 - real(DP), intent(in) :: k22 - real(DP), intent(in) :: k33 - real(DP), intent(in) :: ang1 - real(DP), intent(in) :: ang2 - real(DP), intent(in) :: ang3 - real(DP), intent(in) :: vg1 - real(DP), intent(in) :: vg2 - real(DP), intent(in) :: vg3 - integer(I4B), intent(in) :: iavgmeth - ! -- local - real(DP) :: s1, s2, s3, c1, c2, c3 - real(DP), dimension(3, 3) :: r - real(DP) :: ve1, ve2, ve3 - real(DP) :: denom, dnum, d1, d2, d3 - ! - ! -- Sin and cos of angles - s1 = sin(ang1) - c1 = cos(ang1) - s2 = sin(ang2) - c2 = cos(ang2) - s3 = sin(ang3) - c3 = cos(ang3) - ! - ! -- Rotation matrix - r(1, 1) = c1 * c2 - r(1, 2) = c1 * s2 * s3 - s1 * c3 - r(1, 3) = -c1 * s2 * c3 - s1 * s3 - r(2, 1) = s1 * c2 - r(2, 2) = s1 * s2 * s3 + c1 * c3 - r(2, 3) = -s1 * s2 * c3 + c1 * s3 - r(3, 1) = s2 - r(3, 2) = -c2 * s3 - r(3, 3) = c2 * c3 - ! - ! -- Unit vector in direction of n-m connection in a local coordinate - ! system aligned with the ellipse axes - ve1 = r(1, 1) * vg1 + r(2, 1) * vg2 + r(3, 1) * vg3 - ve2 = r(1, 2) * vg1 + r(2, 2) * vg2 + r(3, 2) * vg3 - ve3 = r(1, 3) * vg1 + r(2, 3) * vg2 + r(3, 3) * vg3 - ! - ! -- Effective hydraulic conductivity calculated using harmonic (1) - ! or arithmetic (2) weighting - hyeff = DZERO - if (iavgmeth == 0) then - ! - ! -- Arithmetic weighting. If principal direction corresponds exactly with - ! unit vector then set to principal direction. Otherwise weight it. - dnum = DONE - d1 = ve1**2 - d2 = ve2**2 - d3 = ve3**2 - if (ve1 /= DZERO) then - dnum = dnum * k11 - d2 = d2 * k11 - d3 = d3 * k11 - end if - if (ve2 /= DZERO) then - dnum = dnum * k22 - d1 = d1 * k22 - d3 = d3 * k22 - end if - if (ve3 /= DZERO) then - dnum = dnum * k33 - d1 = d1 * k33 - d2 = d2 * k33 - end if - denom = d1 + d2 + d3 - if (denom > DZERO) hyeff = dnum / denom - else if (iavgmeth == 1) then - ! -- arithmetic - hyeff = ve1**2 * k11 + ve2**2 * k22 + ve3**2 * k33 - end if - ! - ! -- Return - return - end function hyeff_calc - !> @brief Calculate the 3 conmponents of specific discharge at the cell center !< subroutine calc_spdis(this, flowja) diff --git a/src/Model/GroundWaterTransport/gwt-dsp.f90 b/src/Model/GroundWaterTransport/gwt-dsp.f90 index 0cd1f598b55..e244db9dd9c 100644 --- a/src/Model/GroundWaterTransport/gwt-dsp.f90 +++ b/src/Model/GroundWaterTransport/gwt-dsp.f90 @@ -790,7 +790,7 @@ end subroutine calcdispellipse !< subroutine calcdispcoef(this) ! -- modules - use GwfNpfModule, only: hyeff_calc + use HGeoUtilModule, only: hyeff ! -- dummy class(GwtDspType) :: this ! -- local @@ -840,12 +840,12 @@ subroutine calcdispcoef(this) ! normal to the shared n-m face and for cell m in the direction ! normal to the shared n-m face. call this%dis%connection_normal(n, m, ihc, vg1, vg2, vg3, ipos) - dn = hyeff_calc(this%d11(n), this%d22(n), this%d33(n), & - this%angle1(n), this%angle2(n), this%angle3(n), & - vg1, vg2, vg3, iavgmeth) - dm = hyeff_calc(this%d11(m), this%d22(m), this%d33(m), & - this%angle1(m), this%angle2(m), this%angle3(m), & - vg1, vg2, vg3, iavgmeth) + dn = hyeff(this%d11(n), this%d22(n), this%d33(n), & + this%angle1(n), this%angle2(n), this%angle3(n), & + vg1, vg2, vg3, iavgmeth) + dm = hyeff(this%d11(m), this%d22(m), this%d33(m), & + this%angle1(m), this%angle2(m), this%angle3(m), & + vg1, vg2, vg3, iavgmeth) ! ! -- Calculate dispersion conductance based on NPF subroutines and the ! effective dispersion coefficients dn and dm. diff --git a/src/Utilities/HGeoUtil.f90 b/src/Utilities/HGeoUtil.f90 new file mode 100644 index 00000000000..780d498d8df --- /dev/null +++ b/src/Utilities/HGeoUtil.f90 @@ -0,0 +1,110 @@ +!> @brief General-purpose hydrogeologic functions. +module HGeoUtilModule + use KindModule, only: DP, I4B + use ConstantsModule, only: DZERO, DONE + + implicit none + private + public :: hyeff + +contains + + !> @brief Calculate the effective horizontal hydraulic conductivity from an + !! ellipse using a specified direction (unit vector vg1, vg2, vg3) + !! + !! k11 is the hydraulic conductivity of the major ellipse axis + !! k22 is the hydraulic conductivity of first minor axis + !! k33 is the hydraulic conductivity of the second minor axis + !! ang1 is the counter-clockwise rotation (radians) of the ellipse in + !! the (x, y) plane + !! ang2 is the rotation of the conductivity ellipsoid upward or + !! downward from the (x, y) plane + !! ang3 is the rotation of the conductivity ellipsoid about the major + !! axis + !! vg1, vg2, and vg3 are the components of a unit vector in model coordinates + !! in the direction of the connection between cell n and m + !!iavgmeth is the averaging method. If zero, then use harmonic averaging. + !! if one, then use arithmetic averaging. + !< + function hyeff(k11, k22, k33, ang1, ang2, ang3, vg1, vg2, vg3, & + iavgmeth) result(K) + ! -- return + real(DP) :: K + ! -- dummy + real(DP), intent(in) :: k11 + real(DP), intent(in) :: k22 + real(DP), intent(in) :: k33 + real(DP), intent(in) :: ang1 + real(DP), intent(in) :: ang2 + real(DP), intent(in) :: ang3 + real(DP), intent(in) :: vg1 + real(DP), intent(in) :: vg2 + real(DP), intent(in) :: vg3 + integer(I4B), intent(in) :: iavgmeth + ! -- local + real(DP) :: s1, s2, s3, c1, c2, c3 + real(DP), dimension(3, 3) :: r + real(DP) :: ve1, ve2, ve3 + real(DP) :: denom, dnum, d1, d2, d3 + ! + ! -- Sin and cos of angles + s1 = sin(ang1) + c1 = cos(ang1) + s2 = sin(ang2) + c2 = cos(ang2) + s3 = sin(ang3) + c3 = cos(ang3) + ! + ! -- Rotation matrix + r(1, 1) = c1 * c2 + r(1, 2) = c1 * s2 * s3 - s1 * c3 + r(1, 3) = -c1 * s2 * c3 - s1 * s3 + r(2, 1) = s1 * c2 + r(2, 2) = s1 * s2 * s3 + c1 * c3 + r(2, 3) = -s1 * s2 * c3 + c1 * s3 + r(3, 1) = s2 + r(3, 2) = -c2 * s3 + r(3, 3) = c2 * c3 + ! + ! -- Unit vector in direction of n-m connection in a local coordinate + ! system aligned with the ellipse axes + ve1 = r(1, 1) * vg1 + r(2, 1) * vg2 + r(3, 1) * vg3 + ve2 = r(1, 2) * vg1 + r(2, 2) * vg2 + r(3, 2) * vg3 + ve3 = r(1, 3) * vg1 + r(2, 3) * vg2 + r(3, 3) * vg3 + ! + ! -- Effective hydraulic conductivity calculated using harmonic (1) + ! or arithmetic (2) weighting + K = DZERO + if (iavgmeth == 0) then + ! + ! -- Arithmetic weighting. If principal direction corresponds exactly with + ! unit vector then set to principal direction. Otherwise weight it. + dnum = DONE + d1 = ve1**2 + d2 = ve2**2 + d3 = ve3**2 + if (ve1 /= DZERO) then + dnum = dnum * k11 + d2 = d2 * k11 + d3 = d3 * k11 + end if + if (ve2 /= DZERO) then + dnum = dnum * k22 + d1 = d1 * k22 + d3 = d3 * k22 + end if + if (ve3 /= DZERO) then + dnum = dnum * k33 + d1 = d1 * k33 + d2 = d2 * k33 + end if + denom = d1 + d2 + d3 + if (denom > DZERO) K = dnum / denom + else if (iavgmeth == 1) then + ! -- arithmetic + K = ve1**2 * k11 + ve2**2 * k22 + ve3**2 * k33 + end if + + end function hyeff + +end module HGeoUtilModule diff --git a/src/meson.build b/src/meson.build index 9836a06a526..3a565ecb248 100644 --- a/src/meson.build +++ b/src/meson.build @@ -326,6 +326,7 @@ modflow_sources = files( 'Utilities' / 'GeomUtil.f90', 'Utilities' / 'HashTable.f90', 'Utilities' / 'HeadFileReader.f90', + 'Utilities' / 'HGeoUtil.f90', 'Utilities' / 'InputOutput.f90', 'Utilities' / 'Iunit.f90', 'Utilities' / 'kind.f90', From 9af21a0d1798f0b1dd88bd515d657a5c96831373 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 27 Feb 2024 16:08:23 -0500 Subject: [PATCH 043/199] refactor(discretization): move dis modules to src/Model/Discretization (#1637) * move discretization modules to src/Model/Discretization/ * rename gwf-dis.f90 -> Dis.f90, likewise for disv and disu * define "found type" in discretization modules, remove generated IDM file dependency * move toward clean separation between generic framework and model-scoped code * future work may introduce model-specific dis types extending these * for now this allows moving forward with feature toggling * rerun mem_allocate.py and mf6ivar.py --- doc/mf6io/mf6ivar/md/mf6ivar.md | 2 +- doc/mf6io/mf6ivar/md/mf6memvar.md | 88 ++--- doc/mf6io/mf6ivar/tex/gwf-wel-desc.tex | 2 +- make/makefile | 16 +- msvs/mf6core.vfproj | 6 +- msvs/mf6lib.vfproj | 6 +- src/Model/Connection/GridConnection.f90 | 4 +- src/Model/Connection/GweInterfaceModel.f90 | 2 +- src/Model/Connection/GwfInterfaceModel.f90 | 2 +- src/Model/Connection/GwtInterfaceModel.f90 | 2 +- .../gwf-dis.f90 => Discretization/Dis.f90} | 127 ++++---- .../gwf-disu.f90 => Discretization/Disu.f90} | 300 ++++++++++-------- .../gwf-disv.f90 => Discretization/Disv.f90} | 147 +++++---- src/Model/GroundWaterFlow/gwf.f90 | 6 +- src/Model/ParticleTracking/prt-fmi.f90 | 1 - src/Model/ParticleTracking/prt-prp.f90 | 8 +- src/Model/ParticleTracking/prt.f90 | 12 +- src/Model/TransportModel/tsp.f90 | 6 +- src/Solution/ParticleTracker/MethodDis.f90 | 10 +- src/Solution/ParticleTracker/MethodDisv.f90 | 10 +- .../ParticleTracker/MethodSubcellPollock.f90 | 1 - .../ParticleTracker/MethodSubcellTernary.f90 | 1 - src/meson.build | 6 +- 23 files changed, 415 insertions(+), 350 deletions(-) rename src/Model/{GroundWaterFlow/gwf-dis.f90 => Discretization/Dis.f90} (95%) rename src/Model/{GroundWaterFlow/gwf-disu.f90 => Discretization/Disu.f90} (95%) rename src/Model/{GroundWaterFlow/gwf-disv.f90 => Discretization/Disv.f90} (95%) diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index cd2ee91d2d7..5079a6c8f5a 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -381,7 +381,7 @@ | GWF | WEL | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of well information will be written to the listing file immediately after it is read. | | GWF | WEL | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of well flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | | GWF | WEL | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that well flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWF | WEL | OPTIONS | AUTO_FLOW_REDUCE | DOUBLE PRECISION | keyword and real value that defines the fraction of the cell thickness used as an interval for smoothly adjusting negative pumping rates to 0 in cells with head values less than or equal to the bottom of the cell. Negative pumping rates are adjusted to 0 or a smaller negative value when the head in the cell is equal to or less than the calculated interval above the cell bottom. AUTO\_FLOW\_REDUCE is set to 0.1 if the specified value is less than or equal to zero. By default, negative pumping rates are not reduced during a simulation. | +| GWF | WEL | OPTIONS | AUTO_FLOW_REDUCE | DOUBLE PRECISION | keyword and real value that defines the fraction of the cell thickness used as an interval for smoothly adjusting negative pumping rates to 0 in cells with head values less than or equal to the bottom of the cell. Negative pumping rates are adjusted to 0 or a smaller negative value when the head in the cell is equal to or less than the calculated interval above the cell bottom. AUTO\_FLOW\_REDUCE is set to 0.1 if the specified value is less than or equal to zero. By default, negative pumping rates are not reduced during a simulation. This AUTO\_FLOW\_REDUCE option only applies to wells in model cells that are marked as ``convertible'' (ICELLTYPE /= 0) in the Node Property Flow (NPF) input file. Reduction in flow will not occur for wells in cells marked as confined (ICELLTYPE = 0). | | GWF | WEL | OPTIONS | AUTO_FLOW_REDUCE_CSV | KEYWORD | keyword to specify that record corresponds to the AUTO\_FLOW\_REDUCE output option in which a new record is written for each well and for each time step in which the user-requested extraction rate is reduced by the program. | | GWF | WEL | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | | GWF | WEL | OPTIONS | AFRCSVFILE | STRING | name of the comma-separated value (CSV) output file to write information about well extraction rates that have been reduced by the program. Entries are only written if the extraction rates are reduced. | diff --git a/doc/mf6io/mf6ivar/md/mf6memvar.md b/doc/mf6io/mf6ivar/md/mf6memvar.md index 92d54ce30e2..b23923fe4a0 100644 --- a/doc/mf6io/mf6ivar/md/mf6memvar.md +++ b/doc/mf6io/mf6ivar/md/mf6memvar.md @@ -756,39 +756,7 @@ | PackageMover.f90 | PackageMoverModule | PackageMoverType | QTOMVR | 1 | | PackageMover.f90 | PackageMoverModule | PackageMoverType | QFROMMVR | 1 | | PackageMover.f90 | PackageMoverModule | PackageMoverType | QFROMMVR0 | 1 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | TOP1D | 1 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | BOT1D | 1 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | AREA1D | 1 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | IDOMAIN | 1 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | VERTICES | 2 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | IAINP | 1 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | JAINP | 1 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | IHCINP | 1 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | CL12INP | 1 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | HWVAINP | 1 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | ANGLDEGXINP | 1 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | CELLXY | 2 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | IAVERT | 1 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | JAVERT | 1 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | NJAUSR | 0 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | NVERT | 0 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | VOFFSETTOL | 0 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | IANGLEDEGX | 0 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | NODEUSER | 1 | -| gwf-disu.f90 | GwfDisuModule | GwfDisuType | NODEREDUCED | 1 | | gwf-ic.f90 | GwfIcModule | GwfIcType | STRT | 1 | -| gwf-disv.f90 | GwfDisvModule | GwfDisvType | IDOMAIN | 2 | -| gwf-disv.f90 | GwfDisvModule | GwfDisvType | TOP1D | 1 | -| gwf-disv.f90 | GwfDisvModule | GwfDisvType | BOT2D | 2 | -| gwf-disv.f90 | GwfDisvModule | GwfDisvType | VERTICES | 2 | -| gwf-disv.f90 | GwfDisvModule | GwfDisvType | CELLXY | 2 | -| gwf-disv.f90 | GwfDisvModule | GwfDisvType | IAVERT | 1 | -| gwf-disv.f90 | GwfDisvModule | GwfDisvType | JAVERT | 1 | -| gwf-disv.f90 | GwfDisvModule | GwfDisvType | NLAY | 0 | -| gwf-disv.f90 | GwfDisvModule | GwfDisvType | NCPL | 0 | -| gwf-disv.f90 | GwfDisvModule | GwfDisvType | NVERT | 0 | -| gwf-disv.f90 | GwfDisvModule | GwfDisvType | NODEUSER | 1 | -| gwf-disv.f90 | GwfDisvModule | GwfDisvType | NODEREDUCED | 1 | | gwf-npf.f90 | GwfNpfModule | GwfNpftype | INAME | 0 | | gwf-npf.f90 | GwfNpfModule | GwfNpftype | IXT3D | 0 | | gwf-npf.f90 | GwfNpfModule | GwfNpftype | IXT3DRHS | 0 | @@ -1344,20 +1312,52 @@ | gwf-sfr.f90 | SfrModule | SfrType | QAUXCBC | 1 | | gwf-sfr.f90 | SfrModule | SfrType | DENSETERMS | 2 | | gwf-sfr.f90 | SfrModule | SfrType | VISCRATIOS | 2 | -| gwf-dis.f90 | GwfDisModule | GwfDisType | DELR | 1 | -| gwf-dis.f90 | GwfDisModule | GwfDisType | DELC | 1 | -| gwf-dis.f90 | GwfDisModule | GwfDisType | IDOMAIN | 3 | -| gwf-dis.f90 | GwfDisModule | GwfDisType | TOP2D | 2 | -| gwf-dis.f90 | GwfDisModule | GwfDisType | BOT3D | 3 | -| gwf-dis.f90 | GwfDisModule | GwfDisType | CELLX | 1 | -| gwf-dis.f90 | GwfDisModule | GwfDisType | CELLY | 1 | -| gwf-dis.f90 | GwfDisModule | GwfDisType | NLAY | 0 | -| gwf-dis.f90 | GwfDisModule | GwfDisType | NROW | 0 | -| gwf-dis.f90 | GwfDisModule | GwfDisType | NCOL | 0 | -| gwf-dis.f90 | GwfDisModule | GwfDisType | NODEUSER | 1 | -| gwf-dis.f90 | GwfDisModule | GwfDisType | NODEREDUCED | 1 | | gwf-drn.f90 | DrnModule | DrnType | IAUXDDRNCOL | 0 | | gwf-drn.f90 | DrnModule | DrnType | ICUBIC_SCALING | 0 | +| Disv.f90 | DisvModule | DisvType | IDOMAIN | 2 | +| Disv.f90 | DisvModule | DisvType | TOP1D | 1 | +| Disv.f90 | DisvModule | DisvType | BOT2D | 2 | +| Disv.f90 | DisvModule | DisvType | VERTICES | 2 | +| Disv.f90 | DisvModule | DisvType | CELLXY | 2 | +| Disv.f90 | DisvModule | DisvType | IAVERT | 1 | +| Disv.f90 | DisvModule | DisvType | JAVERT | 1 | +| Disv.f90 | DisvModule | DisvType | NLAY | 0 | +| Disv.f90 | DisvModule | DisvType | NCPL | 0 | +| Disv.f90 | DisvModule | DisvType | NVERT | 0 | +| Disv.f90 | DisvModule | DisvType | NODEUSER | 1 | +| Disv.f90 | DisvModule | DisvType | NODEREDUCED | 1 | +| Disu.f90 | DisuModule | DisuType | TOP1D | 1 | +| Disu.f90 | DisuModule | DisuType | BOT1D | 1 | +| Disu.f90 | DisuModule | DisuType | AREA1D | 1 | +| Disu.f90 | DisuModule | DisuType | IDOMAIN | 1 | +| Disu.f90 | DisuModule | DisuType | VERTICES | 2 | +| Disu.f90 | DisuModule | DisuType | IAINP | 1 | +| Disu.f90 | DisuModule | DisuType | JAINP | 1 | +| Disu.f90 | DisuModule | DisuType | IHCINP | 1 | +| Disu.f90 | DisuModule | DisuType | CL12INP | 1 | +| Disu.f90 | DisuModule | DisuType | HWVAINP | 1 | +| Disu.f90 | DisuModule | DisuType | ANGLDEGXINP | 1 | +| Disu.f90 | DisuModule | DisuType | CELLXY | 2 | +| Disu.f90 | DisuModule | DisuType | IAVERT | 1 | +| Disu.f90 | DisuModule | DisuType | JAVERT | 1 | +| Disu.f90 | DisuModule | DisuType | NJAUSR | 0 | +| Disu.f90 | DisuModule | DisuType | NVERT | 0 | +| Disu.f90 | DisuModule | DisuType | VOFFSETTOL | 0 | +| Disu.f90 | DisuModule | DisuType | IANGLEDEGX | 0 | +| Disu.f90 | DisuModule | DisuType | NODEUSER | 1 | +| Disu.f90 | DisuModule | DisuType | NODEREDUCED | 1 | +| Dis.f90 | DisModule | DisType | DELR | 1 | +| Dis.f90 | DisModule | DisType | DELC | 1 | +| Dis.f90 | DisModule | DisType | IDOMAIN | 3 | +| Dis.f90 | DisModule | DisType | TOP2D | 2 | +| Dis.f90 | DisModule | DisType | BOT3D | 3 | +| Dis.f90 | DisModule | DisType | CELLX | 1 | +| Dis.f90 | DisModule | DisType | CELLY | 1 | +| Dis.f90 | DisModule | DisType | NLAY | 0 | +| Dis.f90 | DisModule | DisType | NROW | 0 | +| Dis.f90 | DisModule | DisType | NCOL | 0 | +| Dis.f90 | DisModule | DisType | NODEUSER | 1 | +| Dis.f90 | DisModule | DisType | NODEREDUCED | 1 | | tsp-apt.f90 | TspAptModule | TspAptType | IAUXFPCONC | 0 | | tsp-apt.f90 | TspAptModule | TspAptType | IMATROWS | 0 | | tsp-apt.f90 | TspAptModule | TspAptType | IPRCONC | 0 | diff --git a/doc/mf6io/mf6ivar/tex/gwf-wel-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-wel-desc.tex index 5834632c55f..a256ff09f78 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-wel-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-wel-desc.tex @@ -15,7 +15,7 @@ \item \texttt{SAVE\_FLOWS}---keyword to indicate that well flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. -\item \texttt{auto\_flow\_reduce}---keyword and real value that defines the fraction of the cell thickness used as an interval for smoothly adjusting negative pumping rates to 0 in cells with head values less than or equal to the bottom of the cell. Negative pumping rates are adjusted to 0 or a smaller negative value when the head in the cell is equal to or less than the calculated interval above the cell bottom. AUTO\_FLOW\_REDUCE is set to 0.1 if the specified value is less than or equal to zero. By default, negative pumping rates are not reduced during a simulation. +\item \texttt{auto\_flow\_reduce}---keyword and real value that defines the fraction of the cell thickness used as an interval for smoothly adjusting negative pumping rates to 0 in cells with head values less than or equal to the bottom of the cell. Negative pumping rates are adjusted to 0 or a smaller negative value when the head in the cell is equal to or less than the calculated interval above the cell bottom. AUTO\_FLOW\_REDUCE is set to 0.1 if the specified value is less than or equal to zero. By default, negative pumping rates are not reduced during a simulation. This AUTO\_FLOW\_REDUCE option only applies to wells in model cells that are marked as ``convertible'' (ICELLTYPE /= 0) in the Node Property Flow (NPF) input file. Reduction in flow will not occur for wells in cells marked as confined (ICELLTYPE = 0). \item \texttt{AUTO\_FLOW\_REDUCE\_CSV}---keyword to specify that record corresponds to the AUTO\_FLOW\_REDUCE output option in which a new record is written for each well and for each time step in which the user-requested extraction rate is reduced by the program. diff --git a/make/makefile b/make/makefile index dcc22ac2537..eca740dd8ec 100644 --- a/make/makefile +++ b/make/makefile @@ -37,9 +37,10 @@ SOURCEDIR30=../src/Model/SurfaceWaterFlow SOURCEDIR31=../src/Model/GroundWaterTransport SOURCEDIR32=../src/Model/ModelUtilities SOURCEDIR33=../src/Model/GroundWaterFlow -SOURCEDIR34=../src/Model/TransportModel -SOURCEDIR35=../src/Model/Geometry -SOURCEDIR36=../src/Model/GroundWaterEnergy +SOURCEDIR34=../src/Model/Discretization +SOURCEDIR35=../src/Model/TransportModel +SOURCEDIR36=../src/Model/Geometry +SOURCEDIR37=../src/Model/GroundWaterEnergy VPATH = \ ${SOURCEDIR1} \ @@ -77,7 +78,8 @@ ${SOURCEDIR32} \ ${SOURCEDIR33} \ ${SOURCEDIR34} \ ${SOURCEDIR35} \ -${SOURCEDIR36} +${SOURCEDIR36} \ +${SOURCEDIR37} .SUFFIXES: .f90 .F90 .o @@ -206,7 +208,6 @@ $(OBJDIR)/BudgetObject.o \ $(OBJDIR)/BoundaryPackage.o \ $(OBJDIR)/CellDefn.o \ $(OBJDIR)/Particle.o \ -$(OBJDIR)/gwf-disv.o \ $(OBJDIR)/FlowModelInterface.o \ $(OBJDIR)/Subcell.o \ $(OBJDIR)/TrackData.o \ @@ -219,7 +220,6 @@ $(OBJDIR)/TernarySolveTrack.o \ $(OBJDIR)/SubcellTri.o \ $(OBJDIR)/Method.o \ $(OBJDIR)/SubcellRect.o \ -$(OBJDIR)/gwf-dis.o \ $(OBJDIR)/VirtualBase.o \ $(OBJDIR)/STLVecInt.o \ $(OBJDIR)/BaseModel.o \ @@ -280,7 +280,9 @@ $(OBJDIR)/tsp-oc.o \ $(OBJDIR)/tsp-obs.o \ $(OBJDIR)/tsp-mvt.o \ $(OBJDIR)/tsp-adv.o \ -$(OBJDIR)/gwf-disu.o \ +$(OBJDIR)/Disv.o \ +$(OBJDIR)/Disu.o \ +$(OBJDIR)/Dis.o \ $(OBJDIR)/gwf-uzf.o \ $(OBJDIR)/tsp-apt.o \ $(OBJDIR)/gwt-mst.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index 54ae3f978c7..dba032b5f44 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -215,9 +215,9 @@ - - - + + + diff --git a/msvs/mf6lib.vfproj b/msvs/mf6lib.vfproj index 2c27e0c358b..dedc1f6723d 100644 --- a/msvs/mf6lib.vfproj +++ b/msvs/mf6lib.vfproj @@ -68,9 +68,9 @@ - - - + + + diff --git a/src/Model/Connection/GridConnection.f90 b/src/Model/Connection/GridConnection.f90 index 03a61f5ae3d..8ad009e905a 100644 --- a/src/Model/Connection/GridConnection.f90 +++ b/src/Model/Connection/GridConnection.f90 @@ -11,7 +11,7 @@ module GridConnectionModule use MemoryHelperModule, only: create_mem_path use ListModule, only: ListType, isEqualIface use NumericalModelModule - use GwfDisuModule + use DisuModule use DisConnExchangeModule use VirtualModelModule, only: VirtualModelType, get_virtual_model, & get_virtual_model_from_list @@ -973,7 +973,7 @@ subroutine getDiscretization(this, disu) use ConnectionsModule use SparseModule, only: sparsematrix class(GridConnectionType) :: this !< the grid connection - class(GwfDisuType), pointer :: disu !< the target disu object + class(DisuType), pointer :: disu !< the target disu object ! local integer(I4B) :: icell, nrOfCells, idx class(VirtualModelType), pointer :: v_model diff --git a/src/Model/Connection/GweInterfaceModel.f90 b/src/Model/Connection/GweInterfaceModel.f90 index d7f1978f5ff..cc7590e40ec 100644 --- a/src/Model/Connection/GweInterfaceModel.f90 +++ b/src/Model/Connection/GweInterfaceModel.f90 @@ -5,7 +5,7 @@ module GweInterfaceModelModule use MemoryHelperModule, only: create_mem_path use NumericalModelModule, only: NumericalModelType use GweModule, only: GweModelType, CastAsGweModel - use GwfDisuModule, only: disu_cr, CastAsDisuType + use DisuModule, only: disu_cr, CastAsDisuType use TspFmiModule, only: fmi_cr, TspFmiType use TspAdvModule, only: adv_cr, TspAdvType use TspAdvOptionsModule, only: TspAdvOptionsType diff --git a/src/Model/Connection/GwfInterfaceModel.f90 b/src/Model/Connection/GwfInterfaceModel.f90 index 1d3fd25744f..80f3816c74e 100644 --- a/src/Model/Connection/GwfInterfaceModel.f90 +++ b/src/Model/Connection/GwfInterfaceModel.f90 @@ -9,7 +9,7 @@ module GwfInterfaceModelModule use GwfBuyModule, only: buy_cr use GridConnectionModule use BaseDisModule - use GwfDisuModule + use DisuModule use GwfNpfModule use GwfNpfOptionsModule use GwfBuyInputDataModule diff --git a/src/Model/Connection/GwtInterfaceModel.f90 b/src/Model/Connection/GwtInterfaceModel.f90 index 59d5eec3827..6cc3f6bf0f6 100644 --- a/src/Model/Connection/GwtInterfaceModel.f90 +++ b/src/Model/Connection/GwtInterfaceModel.f90 @@ -5,7 +5,7 @@ module GwtInterfaceModelModule use MemoryHelperModule, only: create_mem_path use NumericalModelModule, only: NumericalModelType use GwtModule, only: GwtModelType, CastAsGwtModel - use GwfDisuModule, only: disu_cr, CastAsDisuType + use DisuModule, only: disu_cr, CastAsDisuType use TspFmiModule, only: fmi_cr, TspFmiType use TspAdvModule, only: adv_cr, TspAdvType use TspAdvOptionsModule, only: TspAdvOptionsType diff --git a/src/Model/GroundWaterFlow/gwf-dis.f90 b/src/Model/Discretization/Dis.f90 similarity index 95% rename from src/Model/GroundWaterFlow/gwf-dis.f90 rename to src/Model/Discretization/Dis.f90 index 5ddb0adb81b..cd9bc86f349 100644 --- a/src/Model/GroundWaterFlow/gwf-dis.f90 +++ b/src/Model/Discretization/Dis.f90 @@ -1,4 +1,4 @@ -module GwfDisModule +module DisModule use ArrayReadersModule, only: ReadArray use KindModule, only: DP, I4B, LGP @@ -14,24 +14,24 @@ module GwfDisModule use MemoryManagerModule, only: mem_allocate, mem_deallocate use MemoryManagerExtModule, only: mem_set_value, memorylist_remove use TdisModule, only: kstp, kper, pertim, totim, delt - use GwfDisInputModule, only: GwfDisParamFoundType implicit none private - public dis_cr, GwfDisType + public dis_cr, DisType - type, extends(DisBaseType) :: GwfDisType - integer(I4B), pointer :: nlay => null() ! number of layers - integer(I4B), pointer :: nrow => null() ! number of rows - integer(I4B), pointer :: ncol => null() ! number of columns - real(DP), dimension(:), pointer, contiguous :: delr => null() ! spacing along a row - real(DP), dimension(:), pointer, contiguous :: delc => null() ! spacing along a column - real(DP), dimension(:, :), pointer, contiguous :: top2d => null() ! top elevations for each cell at top of model (ncol, nrow) - real(DP), dimension(:, :, :), pointer, contiguous :: bot3d => null() ! bottom elevations for each cell (ncol, nrow, nlay) - integer(I4B), dimension(:, :, :), pointer, contiguous :: idomain => null() ! idomain (ncol, nrow, nlay) - real(DP), dimension(:, :, :), pointer :: botm => null() ! top and bottom elevations for each cell (ncol, nrow, nlay) - real(DP), dimension(:), pointer, contiguous :: cellx => null() ! cell center x coordinate for column j - real(DP), dimension(:), pointer, contiguous :: celly => null() ! cell center y coordinate for row i + !> @brief Structured grid discretization + type, extends(DisBaseType) :: DisType + integer(I4B), pointer :: nlay => null() !< number of layers + integer(I4B), pointer :: nrow => null() !< number of rows + integer(I4B), pointer :: ncol => null() !< number of columns + real(DP), dimension(:), pointer, contiguous :: delr => null() !< spacing along a row + real(DP), dimension(:), pointer, contiguous :: delc => null() !< spacing along a column + real(DP), dimension(:, :), pointer, contiguous :: top2d => null() !< top elevations for each cell at top of model (ncol, nrow) + real(DP), dimension(:, :, :), pointer, contiguous :: bot3d => null() !< bottom elevations for each cell (ncol, nrow, nlay) + integer(I4B), dimension(:, :, :), pointer, contiguous :: idomain => null() !< idomain (ncol, nrow, nlay) + real(DP), dimension(:, :, :), pointer :: botm => null() !< top and bottom elevations for each cell (ncol, nrow, nlay) + real(DP), dimension(:), pointer, contiguous :: cellx => null() !< cell center x coordinate for column j + real(DP), dimension(:), pointer, contiguous :: celly => null() !< cell center y coordinate for row i contains @@ -69,7 +69,24 @@ module GwfDisModule ! -- Read a node-sized model array (reduced or not) procedure :: read_int_array procedure :: read_dbl_array - end type GwfDisType + end type DisType + + !> @brief Simplifies tracking parameters sourced from the input context. + type DisFoundType + logical :: length_units = .false. + logical :: nogrb = .false. + logical :: xorigin = .false. + logical :: yorigin = .false. + logical :: angrot = .false. + logical :: nlay = .false. + logical :: nrow = .false. + logical :: ncol = .false. + logical :: delr = .false. + logical :: delc = .false. + logical :: top = .false. + logical :: botm = .false. + logical :: idomain = .false. + end type DisFoundtype contains @@ -83,7 +100,7 @@ subroutine dis_cr(dis, name_model, input_mempath, inunit, iout) integer(I4B), intent(in) :: inunit integer(I4B), intent(in) :: iout ! -- locals - type(GwfDisType), pointer :: disnew + type(DisType), pointer :: disnew ! -- formats character(len=*), parameter :: fmtheader = & "(1X, /1X, 'DIS -- STRUCTURED GRID DISCRETIZATION PACKAGE,', & @@ -110,7 +127,7 @@ end subroutine dis_cr !< subroutine dis3d_df(this) ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this ! ! -- Transfer the data from the memory manager into this package object if (this%inunit /= 0) then @@ -134,7 +151,7 @@ end subroutine dis3d_df !< subroutine dis3d_da(this) ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this ! ! -- Deallocate idm memory call memorylist_remove(this%name_model, 'DIS', idm_context) @@ -164,11 +181,11 @@ end subroutine dis3d_da !< subroutine source_options(this) ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this ! -- locals character(len=LENVARNAME), dimension(3) :: lenunits = & &[character(len=LENVARNAME) :: 'FEET', 'METERS', 'CENTIMETERS'] - type(GwfDisParamFoundType) :: found + type(DisFoundType) :: found ! ! -- update defaults with idm sourced values call mem_set_value(this%lenuni, 'LENGTH_UNITS', this%input_mempath, & @@ -189,8 +206,8 @@ end subroutine source_options !< subroutine log_options(this, found) ! -- dummy - class(GwfDisType) :: this - type(GwfDisParamFoundType), intent(in) :: found + class(DisType) :: this + type(DisFoundType), intent(in) :: found ! write (this%iout, '(1x,a)') 'Setting Discretization Options' ! @@ -224,10 +241,10 @@ end subroutine log_options !< subroutine source_dimensions(this) ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this ! -- locals integer(I4B) :: i, j, k - type(GwfDisParamFoundType) :: found + type(DisFoundType) :: found ! ! -- update defaults with idm sourced values call mem_set_value(this%nlay, 'NLAY', this%input_mempath, found%nlay) @@ -285,8 +302,8 @@ end subroutine source_dimensions !< subroutine log_dimensions(this, found) ! -- dummy - class(GwfDisType) :: this - type(GwfDisParamFoundType), intent(in) :: found + class(DisType) :: this + type(DisFoundType), intent(in) :: found ! write (this%iout, '(1x,a)') 'Setting Discretization Dimensions' ! @@ -310,8 +327,8 @@ end subroutine log_dimensions !< subroutine source_griddata(this) ! -- dummy - class(GwfDisType) :: this - type(GwfDisParamFoundType) :: found + class(DisType) :: this + type(DisFoundType) :: found ! ! -- update defaults with idm sourced values call mem_set_value(this%delr, 'DELR', this%input_mempath, found%delr) @@ -331,8 +348,8 @@ end subroutine source_griddata !< subroutine log_griddata(this, found) ! -- dummy - class(GwfDisType) :: this - type(GwfDisParamFoundType), intent(in) :: found + class(DisType) :: this + type(DisFoundType), intent(in) :: found ! write (this%iout, '(1x,a)') 'Setting Discretization Griddata' ! @@ -366,7 +383,7 @@ subroutine grid_finalize(this) ! -- modules use MemoryManagerModule, only: mem_allocate ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this ! -- locals integer(I4B) :: n, i, j, k integer(I4B) :: node @@ -530,7 +547,7 @@ subroutine write_grb(this, icelltype) ! -- modules use OpenSpecModule, only: access, form ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this integer(I4B), dimension(:), intent(in) :: icelltype ! -- local integer(I4B) :: iunit, ntxt, ncpl @@ -644,7 +661,7 @@ end subroutine write_grb !< subroutine nodeu_to_string(this, nodeu, str) ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this integer(I4B), intent(in) :: nodeu character(len=*), intent(inout) :: str ! -- local @@ -665,7 +682,7 @@ end subroutine nodeu_to_string !< subroutine nodeu_to_array(this, nodeu, arr) ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this integer(I4B), intent(in) :: nodeu integer(I4B), dimension(:), intent(inout) :: arr ! -- local @@ -697,7 +714,7 @@ function get_nodenumber_idx1(this, nodeu, icheck) result(nodenumber) ! -- return integer(I4B) :: nodenumber ! -- dummy - class(GwfDisType), intent(in) :: this + class(DisType), intent(in) :: this integer(I4B), intent(in) :: nodeu integer(I4B), intent(in) :: icheck ! @@ -728,7 +745,7 @@ function get_nodenumber_idx3(this, k, i, j, icheck) result(nodenumber) ! -- return integer(I4B) :: nodenumber ! -- dummy - class(GwfDisType), intent(in) :: this + class(DisType), intent(in) :: this integer(I4B), intent(in) :: k, i, j integer(I4B), intent(in) :: icheck ! -- local @@ -770,7 +787,7 @@ end function get_nodenumber_idx3 !< subroutine allocate_scalars(this, name_model, input_mempath) ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this character(len=*), intent(in) :: name_model character(len=*), intent(in) :: input_mempath ! @@ -794,12 +811,12 @@ end subroutine allocate_scalars !< subroutine allocate_arrays(this) ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this ! ! -- Allocate arrays in DisBaseType (mshape, top, bot, area) call this%DisBaseType%allocate_arrays() ! - ! -- Allocate arrays for GwfDisType + ! -- Allocate arrays for DisType if (this%nodes < this%nodesuser) then call mem_allocate(this%nodeuser, this%nodes, 'NODEUSER', this%memoryPath) call mem_allocate(this%nodereduced, this%nodesuser, 'NODEREDUCED', & @@ -825,7 +842,7 @@ end subroutine allocate_arrays function nodeu_from_string(this, lloc, istart, istop, in, iout, line, & flag_string, allow_zero) result(nodeu) ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this integer(I4B), intent(inout) :: lloc integer(I4B), intent(inout) :: istart integer(I4B), intent(inout) :: istop @@ -918,7 +935,7 @@ function nodeu_from_cellid(this, cellid, inunit, iout, flag_string, & ! -- return integer(I4B) :: nodeu ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this character(len=*), intent(inout) :: cellid integer(I4B), intent(in) :: inunit integer(I4B), intent(in) :: iout @@ -1000,7 +1017,7 @@ end function nodeu_from_cellid !< logical function supports_layers(this) ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this ! supports_layers = .true. ! @@ -1010,7 +1027,7 @@ end function supports_layers !< function get_ncpl(this) integer(I4B) :: get_ncpl - class(GwfDisType) :: this + class(DisType) :: this get_ncpl = this%nrow * this%ncol end function get_ncpl @@ -1021,7 +1038,7 @@ end function get_ncpl subroutine connection_normal(this, noden, nodem, ihc, xcomp, ycomp, zcomp, & ipos) ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this integer(I4B), intent(in) :: noden !< cell (reduced nn) integer(I4B), intent(in) :: nodem !< neighbor (reduced nn) integer(I4B), intent(in) :: ihc !< horizontal connection flag @@ -1078,7 +1095,7 @@ subroutine connection_vector(this, noden, nodem, nozee, satn, satm, ihc, & ! -- modules use DisvGeom, only: line_unit_vector ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this integer(I4B), intent(in) :: noden !< cell (reduced nn) integer(I4B), intent(in) :: nodem !< neighbor (reduced nn) logical, intent(in) :: nozee @@ -1147,7 +1164,7 @@ subroutine connection_vector(this, noden, nodem, nozee, satn, satm, ihc, & !< subroutine get_dis_type(this, dis_type) ! -- dummy - class(GwfDisType), intent(in) :: this + class(DisType), intent(in) :: this character(len=*), intent(out) :: dis_type ! dis_type = "DIS" @@ -1160,7 +1177,7 @@ end subroutine get_dis_type !< subroutine get_polyverts(this, ic, polyverts, closed) ! -- dummy - class(GwfDisType), intent(inout) :: this + class(DisType), intent(inout) :: this integer(I4B), intent(in) :: ic !< cell number (reduced) real(DP), allocatable, intent(out) :: polyverts(:, :) !< polygon vertices (column-major indexing) logical(LGP), intent(in), optional :: closed !< whether to close the polygon, duplicating a vertex @@ -1208,7 +1225,7 @@ subroutine get_polyverts(this, ic, polyverts, closed) subroutine read_int_array(this, line, lloc, istart, istop, iout, in, & iarray, aname) ! -- dummy - class(GwfDisType), intent(inout) :: this + class(DisType), intent(inout) :: this character(len=*), intent(inout) :: line integer(I4B), intent(inout) :: lloc integer(I4B), intent(inout) :: istart @@ -1267,7 +1284,7 @@ end subroutine read_int_array subroutine read_dbl_array(this, line, lloc, istart, istop, iout, in, & darray, aname) ! -- dummy - class(GwfDisType), intent(inout) :: this + class(DisType), intent(inout) :: this character(len=*), intent(inout) :: line integer(I4B), intent(inout) :: lloc integer(I4B), intent(inout) :: istart @@ -1329,7 +1346,7 @@ end subroutine read_dbl_array subroutine read_layer_array(this, nodelist, darray, ncolbnd, maxbnd, & icolbnd, aname, inunit, iout) ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this integer(I4B), intent(in) :: maxbnd integer(I4B), dimension(maxbnd) :: nodelist integer(I4B), intent(in) :: ncolbnd @@ -1375,7 +1392,7 @@ end subroutine read_layer_array subroutine record_array(this, darray, iout, iprint, idataun, aname, & cdatafmp, nvaluesp, nwidthp, editdesc, dinact) ! -- dummy - class(GwfDisType), intent(inout) :: this + class(DisType), intent(inout) :: this real(DP), dimension(:), pointer, contiguous, intent(inout) :: darray !< double precision array to record integer(I4B), intent(in) :: iout !< ascii output unit number integer(I4B), intent(in) :: iprint !< whether to print the array @@ -1464,7 +1481,7 @@ subroutine record_srcdst_list_header(this, text, textmodel, textpackage, & dstmodel, dstpackage, naux, auxtxt, & ibdchn, nlist, iout) ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this character(len=16), intent(in) :: text character(len=16), intent(in) :: textmodel character(len=16), intent(in) :: textpackage @@ -1493,7 +1510,7 @@ end subroutine record_srcdst_list_header !< subroutine nlarray_to_nodelist(this, darray, nodelist, maxbnd, nbound, aname) ! -- dummy - class(GwfDisType) :: this + class(DisType) :: this integer(I4B), intent(in) :: maxbnd integer(I4B), dimension(:), pointer, contiguous :: darray integer(I4B), dimension(maxbnd), intent(inout) :: nodelist @@ -1565,4 +1582,4 @@ subroutine nlarray_to_nodelist(this, darray, nodelist, maxbnd, nbound, aname) ! end subroutine nlarray_to_nodelist -end module GwfDisModule +end module DisModule diff --git a/src/Model/GroundWaterFlow/gwf-disu.f90 b/src/Model/Discretization/Disu.f90 similarity index 95% rename from src/Model/GroundWaterFlow/gwf-disu.f90 rename to src/Model/Discretization/Disu.f90 index e5ee2aaac74..0a24483f4f1 100644 --- a/src/Model/GroundWaterFlow/gwf-disu.f90 +++ b/src/Model/Discretization/Disu.f90 @@ -1,4 +1,4 @@ -module GwfDisuModule +module DisuModule use ArrayReadersModule, only: ReadArray use KindModule, only: DP, I4B, LGP @@ -15,17 +15,17 @@ module GwfDisuModule mem_reallocate, mem_setptr use MemoryManagerExtModule, only: mem_set_value, memorylist_remove use TdisModule, only: kstp, kper, pertim, totim, delt - use GwfDisuInputModule, only: GwfDisuParamFoundType use DisvGeom, only: line_unit_vector implicit none private - public :: GwfDisuType + public :: DisuType public :: disu_cr public :: CastAsDisuType - type, extends(DisBaseType) :: GwfDisuType + !> @brief Unstructured grid discretization + type, extends(DisBaseType) :: DisuType integer(I4B), pointer :: njausr => null() ! user-specified nja size integer(I4B), pointer :: nvert => null() ! number of x,y vertices real(DP), pointer :: voffsettol => null() ! vertical offset tolerance @@ -86,7 +86,37 @@ module GwfDisuModule procedure :: read_int_array procedure :: read_dbl_array - end type GwfDisuType + end type DisuType + + type DisuFoundType + logical :: length_units = .false. + logical :: nogrb = .false. + logical :: xorigin = .false. + logical :: yorigin = .false. + logical :: angrot = .false. + logical :: voffsettol = .false. + logical :: nodes = .false. + logical :: nja = .false. + logical :: nvert = .false. + logical :: top = .false. + logical :: bot = .false. + logical :: area = .false. + logical :: idomain = .false. + logical :: iac = .false. + logical :: ja = .false. + logical :: ihc = .false. + logical :: cl12 = .false. + logical :: hwva = .false. + logical :: angldegx = .false. + logical :: iv = .false. + logical :: xv = .false. + logical :: yv = .false. + logical :: icell2d = .false. + logical :: xc = .false. + logical :: yc = .false. + logical :: ncvert = .false. + logical :: icvert = .false. + end type DisuFoundType contains @@ -100,7 +130,7 @@ subroutine disu_cr(dis, name_model, input_mempath, inunit, iout) integer(I4B), intent(in) :: inunit integer(I4B), intent(in) :: iout ! -- local - type(GwfDisuType), pointer :: disnew + type(DisuType), pointer :: disnew character(len=*), parameter :: fmtheader = & "(1X, /1X, 'DISU -- UNSTRUCTURED GRID DISCRETIZATION PACKAGE,', & &' VERSION 2 : 3/27/2014 - INPUT READ FROM MEMPATH: ', A, //)" @@ -132,7 +162,7 @@ end subroutine disu_cr !< subroutine disu_load(this) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this ! ! -- source input data call this%source_options() @@ -159,7 +189,7 @@ end subroutine disu_load !< subroutine disu_df(this) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this ! call this%grid_finalize() ! @@ -169,7 +199,7 @@ end subroutine disu_df !< subroutine grid_finalize(this) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this ! -- locals integer(I4B) :: n integer(I4B) :: node @@ -279,7 +309,7 @@ end subroutine grid_finalize !< subroutine disu_ck(this) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this ! -- local integer(I4B) :: n, m integer(I4B) :: ipos @@ -399,7 +429,7 @@ end subroutine disu_ck !< subroutine disu_da(this) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this ! ! -- Deallocate idm memory call memorylist_remove(this%name_model, 'DISU', idm_context) @@ -445,7 +475,7 @@ end subroutine disu_da !< subroutine nodeu_to_string(this, nodeu, str) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this integer(I4B), intent(in) :: nodeu character(len=*), intent(inout) :: str ! -- local @@ -459,7 +489,7 @@ end subroutine nodeu_to_string !> @brief Convert a user nodenumber to an array (nodenumber) !< subroutine nodeu_to_array(this, nodeu, arr) - class(GwfDisuType) :: this + class(DisuType) :: this integer(I4B), intent(in) :: nodeu integer(I4B), dimension(:), intent(inout) :: arr ! -- local @@ -479,12 +509,39 @@ subroutine nodeu_to_array(this, nodeu, arr) ! end subroutine nodeu_to_array + !> @brief Copy options from IDM into package + !< + subroutine source_options(this) + ! -- dummy + class(DisuType) :: this + ! -- locals + character(len=LENVARNAME), dimension(3) :: lenunits = & + &[character(len=LENVARNAME) :: 'FEET', 'METERS', 'CENTIMETERS'] + type(DisuFoundType) :: found + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%lenuni, 'LENGTH_UNITS', this%input_mempath, & + lenunits, found%length_units) + call mem_set_value(this%nogrb, 'NOGRB', this%input_mempath, found%nogrb) + call mem_set_value(this%xorigin, 'XORIGIN', this%input_mempath, found%xorigin) + call mem_set_value(this%yorigin, 'YORIGIN', this%input_mempath, found%yorigin) + call mem_set_value(this%angrot, 'ANGROT', this%input_mempath, found%angrot) + call mem_set_value(this%voffsettol, 'VOFFSETTOL', this%input_mempath, & + found%voffsettol) + ! + ! -- log values to list file + if (this%iout > 0) then + call this%log_options(found) + end if + ! + end subroutine source_options + !> @brief Write user options to list file !< subroutine log_options(this, found) ! -- dummy - class(GwfDisuType) :: this - type(GwfDisuParamFoundType), intent(in) :: found + class(DisuType) :: this + type(DisuFoundType), intent(in) :: found ! write (this%iout, '(1x,a)') 'Setting Discretization Options' ! @@ -519,65 +576,14 @@ subroutine log_options(this, found) ! end subroutine log_options - !> @brief Copy options from IDM into package - !< - subroutine source_options(this) - ! -- dummy - class(GwfDisuType) :: this - ! -- locals - character(len=LENVARNAME), dimension(3) :: lenunits = & - &[character(len=LENVARNAME) :: 'FEET', 'METERS', 'CENTIMETERS'] - type(GwfDisuParamFoundType) :: found - ! - ! -- update defaults with idm sourced values - call mem_set_value(this%lenuni, 'LENGTH_UNITS', this%input_mempath, & - lenunits, found%length_units) - call mem_set_value(this%nogrb, 'NOGRB', this%input_mempath, found%nogrb) - call mem_set_value(this%xorigin, 'XORIGIN', this%input_mempath, found%xorigin) - call mem_set_value(this%yorigin, 'YORIGIN', this%input_mempath, found%yorigin) - call mem_set_value(this%angrot, 'ANGROT', this%input_mempath, found%angrot) - call mem_set_value(this%voffsettol, 'VOFFSETTOL', this%input_mempath, & - found%voffsettol) - ! - ! -- log values to list file - if (this%iout > 0) then - call this%log_options(found) - end if - ! - end subroutine source_options - - !> @brief Write dimensions to list file - !< - subroutine log_dimensions(this, found) - class(GwfDisuType) :: this - type(GwfDisuParamFoundType), intent(in) :: found - ! - write (this%iout, '(1x,a)') 'Setting Discretization Dimensions' - ! - if (found%nodes) then - write (this%iout, '(4x,a,i0)') 'NODES = ', this%nodesuser - end if - ! - if (found%nja) then - write (this%iout, '(4x,a,i0)') 'NJA = ', this%njausr - end if - ! - if (found%nvert) then - write (this%iout, '(4x,a,i0)') 'NVERT = ', this%nvert - end if - ! - write (this%iout, '(1x,a,/)') 'End Setting Discretization Dimensions' - ! - end subroutine log_dimensions - !> @brief Copy dimensions from IDM into package !< subroutine source_dimensions(this) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this ! -- locals integer(I4B) :: n - type(GwfDisuParamFoundType) :: found + type(DisuFoundType) :: found ! ! -- update defaults with idm sourced values call mem_set_value(this%nodesuser, 'NODES', this%input_mempath, found%nodes) @@ -631,42 +637,37 @@ subroutine source_dimensions(this) ! end subroutine source_dimensions - !> @brief Write griddata found to list file + !> @brief Write dimensions to list file !< - subroutine log_griddata(this, found) - ! -- dummy - class(GwfDisuType) :: this - type(GwfDisuParamFoundType), intent(in) :: found - ! - write (this%iout, '(1x,a)') 'Setting Discretization Griddata' + subroutine log_dimensions(this, found) + class(DisuType) :: this + type(DisuFoundType), intent(in) :: found ! - if (found%top) then - write (this%iout, '(4x,a)') 'TOP set from input file' - end if + write (this%iout, '(1x,a)') 'Setting Discretization Dimensions' ! - if (found%bot) then - write (this%iout, '(4x,a)') 'BOT set from input file' + if (found%nodes) then + write (this%iout, '(4x,a,i0)') 'NODES = ', this%nodesuser end if ! - if (found%area) then - write (this%iout, '(4x,a)') 'AREA set from input file' + if (found%nja) then + write (this%iout, '(4x,a,i0)') 'NJA = ', this%njausr end if ! - if (found%idomain) then - write (this%iout, '(4x,a)') 'IDOMAIN set from input file' + if (found%nvert) then + write (this%iout, '(4x,a,i0)') 'NVERT = ', this%nvert end if ! - write (this%iout, '(1x,a,/)') 'End Setting Discretization Griddata' + write (this%iout, '(1x,a,/)') 'End Setting Discretization Dimensions' ! - end subroutine log_griddata + end subroutine log_dimensions !> @brief Copy grid data from IDM into package !< subroutine source_griddata(this) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this ! -- locals - type(GwfDisuParamFoundType) :: found + type(DisuFoundType) :: found ! ! -- update defaults with idm sourced values call mem_set_value(this%top1d, 'TOP', this%input_mempath, found%top) @@ -683,48 +684,40 @@ end subroutine source_griddata !> @brief Write griddata found to list file !< - subroutine log_connectivity(this, found, iac) - class(GwfDisuType) :: this - type(GwfDisuParamFoundType), intent(in) :: found - integer(I4B), dimension(:), contiguous, pointer, intent(in) :: iac - ! - write (this%iout, '(1x,a)') 'Setting Discretization Connectivity' - ! - if (associated(iac)) then - write (this%iout, '(4x,a)') 'IAC set from input file' - end if + subroutine log_griddata(this, found) + ! -- dummy + class(DisuType) :: this + type(DisuFoundType), intent(in) :: found ! - if (found%ja) then - write (this%iout, '(4x,a)') 'JA set from input file' - end if + write (this%iout, '(1x,a)') 'Setting Discretization Griddata' ! - if (found%ihc) then - write (this%iout, '(4x,a)') 'IHC set from input file' + if (found%top) then + write (this%iout, '(4x,a)') 'TOP set from input file' end if ! - if (found%cl12) then - write (this%iout, '(4x,a)') 'CL12 set from input file' + if (found%bot) then + write (this%iout, '(4x,a)') 'BOT set from input file' end if ! - if (found%hwva) then - write (this%iout, '(4x,a)') 'HWVA set from input file' + if (found%area) then + write (this%iout, '(4x,a)') 'AREA set from input file' end if ! - if (found%angldegx) then - write (this%iout, '(4x,a)') 'ANGLDEGX set from input file' + if (found%idomain) then + write (this%iout, '(4x,a)') 'IDOMAIN set from input file' end if ! - write (this%iout, '(1x,a,/)') 'End Setting Discretization Connectivity' + write (this%iout, '(1x,a,/)') 'End Setting Discretization Griddata' ! - end subroutine log_connectivity + end subroutine log_griddata !> @brief Copy grid connectivity info from IDM into package !< subroutine source_connectivity(this) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this ! -- locals - type(GwfDisuParamFoundType) :: found + type(DisuFoundType) :: found integer(I4B), dimension(:), contiguous, pointer :: iac => null() ! -- formats ! @@ -752,11 +745,48 @@ subroutine source_connectivity(this) ! end subroutine source_connectivity + !> @brief Write griddata found to list file + !< + subroutine log_connectivity(this, found, iac) + class(DisuType) :: this + type(DisuFoundType), intent(in) :: found + integer(I4B), dimension(:), contiguous, pointer, intent(in) :: iac + ! + write (this%iout, '(1x,a)') 'Setting Discretization Connectivity' + ! + if (associated(iac)) then + write (this%iout, '(4x,a)') 'IAC set from input file' + end if + ! + if (found%ja) then + write (this%iout, '(4x,a)') 'JA set from input file' + end if + ! + if (found%ihc) then + write (this%iout, '(4x,a)') 'IHC set from input file' + end if + ! + if (found%cl12) then + write (this%iout, '(4x,a)') 'CL12 set from input file' + end if + ! + if (found%hwva) then + write (this%iout, '(4x,a)') 'HWVA set from input file' + end if + ! + if (found%angldegx) then + write (this%iout, '(4x,a)') 'ANGLDEGX set from input file' + end if + ! + write (this%iout, '(1x,a,/)') 'End Setting Discretization Connectivity' + ! + end subroutine log_connectivity + !> @brief Copy grid vertex data from IDM into package !< subroutine source_vertices(this) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this ! -- local integer(I4B) :: i real(DP), dimension(:), contiguous, pointer :: vert_x => null() @@ -790,7 +820,7 @@ subroutine define_cellverts(this, icell2d, ncvert, icvert) ! -- modules use SparseModule, only: sparsematrix ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this integer(I4B), dimension(:), contiguous, pointer, intent(in) :: icell2d integer(I4B), dimension(:), contiguous, pointer, intent(in) :: ncvert integer(I4B), dimension(:), contiguous, pointer, intent(in) :: icvert @@ -829,7 +859,7 @@ end subroutine define_cellverts !< subroutine source_cell2d(this) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this ! -- locals integer(I4B), dimension(:), contiguous, pointer :: icell2d => null() integer(I4B), dimension(:), contiguous, pointer :: ncvert => null() @@ -878,7 +908,7 @@ subroutine write_grb(this, icelltype) ! -- modules use OpenSpecModule, only: access, form ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this integer(I4B), dimension(:), intent(in) :: icelltype ! -- local integer(I4B) :: i, iunit, ntxt @@ -996,7 +1026,7 @@ end subroutine write_grb !> @brief Get reduced node number from user node number !< function get_nodenumber_idx1(this, nodeu, icheck) result(nodenumber) - class(GwfDisuType), intent(in) :: this + class(DisuType), intent(in) :: this integer(I4B), intent(in) :: nodeu integer(I4B), intent(in) :: icheck integer(I4B) :: nodenumber @@ -1027,7 +1057,7 @@ end function get_nodenumber_idx1 subroutine connection_normal(this, noden, nodem, ihc, xcomp, ycomp, zcomp, & ipos) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this integer(I4B), intent(in) :: noden !< cell (reduced nn) integer(I4B), intent(in) :: nodem !< neighbor (reduced nn) integer(I4B), intent(in) :: ihc !< horizontal connection flag @@ -1074,7 +1104,7 @@ end subroutine connection_normal subroutine connection_vector(this, noden, nodem, nozee, satn, satm, ihc, & xcomp, ycomp, zcomp, conlen) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this integer(I4B), intent(in) :: noden integer(I4B), intent(in) :: nodem logical, intent(in) :: nozee @@ -1132,7 +1162,7 @@ end subroutine connection_vector !< subroutine get_dis_type(this, dis_type) ! -- dummy - class(GwfDisuType), intent(in) :: this + class(DisuType), intent(in) :: this character(len=*), intent(out) :: dis_type ! dis_type = "DISU" @@ -1143,7 +1173,7 @@ end subroutine get_dis_type !< subroutine allocate_scalars(this, name_model, input_mempath) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this character(len=*), intent(in) :: name_model character(len=*), intent(in) :: input_mempath ! @@ -1170,7 +1200,7 @@ end subroutine allocate_scalars !< subroutine allocate_arrays(this) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this ! ! -- Allocate arrays in DisBaseType (mshape, top, bot, area) call this%DisBaseType%allocate_arrays() @@ -1196,7 +1226,7 @@ subroutine allocate_arrays_mem(this) ! -- modules use MemoryManagerModule, only: mem_allocate ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this ! call mem_allocate(this%idomain, this%nodes, 'IDOMAIN', this%memoryPath) call mem_allocate(this%vertices, 2, this%nvert, 'VERTICES', this%memoryPath) @@ -1213,7 +1243,7 @@ end subroutine allocate_arrays_mem function nodeu_from_string(this, lloc, istart, istop, in, iout, line, & flag_string, allow_zero) result(nodeu) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this integer(I4B), intent(inout) :: lloc integer(I4B), intent(inout) :: istart integer(I4B), intent(inout) :: istop @@ -1275,7 +1305,7 @@ function nodeu_from_cellid(this, cellid, inunit, iout, flag_string, & ! -- return integer(I4B) :: nodeu ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this character(len=*), intent(inout) :: cellid integer(I4B), intent(in) :: inunit integer(I4B), intent(in) :: iout @@ -1326,7 +1356,7 @@ end function nodeu_from_cellid !< logical function supports_layers(this) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this ! supports_layers = .false. ! @@ -1338,7 +1368,7 @@ function get_ncpl(this) ! -- return integer(I4B) :: get_ncpl ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this ! get_ncpl = this%nodesuser ! @@ -1349,7 +1379,7 @@ end function get_ncpl subroutine read_int_array(this, line, lloc, istart, istop, iout, in, & iarray, aname) ! -- dummy - class(GwfDisuType), intent(inout) :: this + class(DisuType), intent(inout) :: this character(len=*), intent(inout) :: line integer(I4B), intent(inout) :: lloc integer(I4B), intent(inout) :: istart @@ -1390,7 +1420,7 @@ end subroutine read_int_array subroutine read_dbl_array(this, line, lloc, istart, istop, iout, in, & darray, aname) ! -- dummy - class(GwfDisuType), intent(inout) :: this + class(DisuType), intent(inout) :: this character(len=*), intent(inout) :: line integer(I4B), intent(inout) :: lloc integer(I4B), intent(inout) :: istart @@ -1433,7 +1463,7 @@ end subroutine read_dbl_array subroutine record_array(this, darray, iout, iprint, idataun, aname, & cdatafmp, nvaluesp, nwidthp, editdesc, dinact) ! -- dummy - class(GwfDisuType), intent(inout) :: this + class(DisuType), intent(inout) :: this real(DP), dimension(:), pointer, contiguous, intent(inout) :: darray !< double precision array to record integer(I4B), intent(in) :: iout !< ascii output unit number integer(I4B), intent(in) :: iprint !< whether to print the array @@ -1522,7 +1552,7 @@ subroutine record_srcdst_list_header(this, text, textmodel, textpackage, & dstmodel, dstpackage, naux, auxtxt, & ibdchn, nlist, iout) ! -- dummy - class(GwfDisuType) :: this + class(DisuType) :: this character(len=16), intent(in) :: text character(len=16), intent(in) :: textmodel character(len=16), intent(in) :: textpackage @@ -1553,14 +1583,14 @@ function CastAsDisuType(dis) result(disu) ! -- dummy class(*), pointer :: dis !< base pointer to DISU object ! -- return - class(GwfDisuType), pointer :: disu !< the resulting DISU pointer + class(DisuType), pointer :: disu !< the resulting DISU pointer ! disu => null() select type (dis) - class is (GwfDisuType) + class is (DisuType) disu => dis end select ! end function CastAsDisuType -end module GwfDisuModule +end module DisuModule diff --git a/src/Model/GroundWaterFlow/gwf-disv.f90 b/src/Model/Discretization/Disv.f90 similarity index 95% rename from src/Model/GroundWaterFlow/gwf-disv.f90 rename to src/Model/Discretization/Disv.f90 index 63752778967..846539d7248 100644 --- a/src/Model/GroundWaterFlow/gwf-disv.f90 +++ b/src/Model/Discretization/Disv.f90 @@ -1,4 +1,4 @@ -module GwfDisvModule +module DisvModule use ArrayReadersModule, only: ReadArray use KindModule, only: DP, I4B, LGP @@ -15,23 +15,23 @@ module GwfDisvModule use MemoryManagerModule, only: mem_allocate, mem_deallocate, mem_setptr use MemoryManagerExtModule, only: mem_set_value, memorylist_remove use TdisModule, only: kstp, kper, pertim, totim, delt - use GwfDisvInputModule, only: GwfDisvParamFoundType implicit none private - public disv_cr, GwfDisvType + public disv_cr, DisvType - type, extends(DisBaseType) :: GwfDisvType - integer(I4B), pointer :: nlay => null() ! number of layers - integer(I4B), pointer :: ncpl => null() ! number of cells per layer - integer(I4B), pointer :: nvert => null() ! number of x,y vertices - real(DP), dimension(:, :), pointer, contiguous :: vertices => null() ! cell vertices stored as 2d array of x and y - real(DP), dimension(:, :), pointer, contiguous :: cellxy => null() ! cell center stored as 2d array of x and y - integer(I4B), dimension(:), pointer, contiguous :: iavert => null() ! cell vertex pointer ia array - integer(I4B), dimension(:), pointer, contiguous :: javert => null() ! cell vertex pointer ja array - real(DP), dimension(:), pointer, contiguous :: top1d => null() ! top elevations for each cell at top of model (ncpl) - real(DP), dimension(:, :), pointer, contiguous :: bot2d => null() ! bottom elevations for each cell (ncpl, nlay) - integer(I4B), dimension(:, :), pointer, contiguous :: idomain => null() ! idomain (ncpl, nlay) + !> @brief Vertex grid discretization + type, extends(DisBaseType) :: DisvType + integer(I4B), pointer :: nlay => null() !< number of layers + integer(I4B), pointer :: ncpl => null() !< number of cells per layer + integer(I4B), pointer :: nvert => null() !< number of x,y vertices + real(DP), dimension(:, :), pointer, contiguous :: vertices => null() !< cell vertices stored as 2d array of x and y + real(DP), dimension(:, :), pointer, contiguous :: cellxy => null() !< cell center stored as 2d array of x and y + integer(I4B), dimension(:), pointer, contiguous :: iavert => null() !< cell vertex pointer ia array + integer(I4B), dimension(:), pointer, contiguous :: javert => null() !< cell vertex pointer ja array + real(DP), dimension(:), pointer, contiguous :: top1d => null() !< top elevations for each cell at top of model (ncpl) + real(DP), dimension(:, :), pointer, contiguous :: bot2d => null() !< bottom elevations for each cell (ncpl, nlay) + integer(I4B), dimension(:, :), pointer, contiguous :: idomain => null() !< idomain (ncpl, nlay) contains @@ -59,11 +59,11 @@ module GwfDisvModule procedure :: source_options procedure :: source_dimensions procedure :: source_griddata - procedure :: source_vertices - procedure :: source_cell2d procedure :: log_options procedure :: log_dimensions procedure :: log_griddata + procedure :: source_vertices + procedure :: source_cell2d procedure :: define_cellverts procedure :: grid_finalize procedure :: connect @@ -76,7 +76,29 @@ module GwfDisvModule procedure :: read_int_array procedure :: read_dbl_array - end type GwfDisvType + end type DisvType + + type DisvFoundType + logical :: length_units = .false. + logical :: nogrb = .false. + logical :: xorigin = .false. + logical :: yorigin = .false. + logical :: angrot = .false. + logical :: nlay = .false. + logical :: ncpl = .false. + logical :: nvert = .false. + logical :: top = .false. + logical :: botm = .false. + logical :: idomain = .false. + logical :: iv = .false. + logical :: xv = .false. + logical :: yv = .false. + logical :: icell2d = .false. + logical :: xc = .false. + logical :: yc = .false. + logical :: ncvert = .false. + logical :: icvert = .false. + end type DisvFoundType contains @@ -90,7 +112,7 @@ subroutine disv_cr(dis, name_model, input_mempath, inunit, iout) integer(I4B), intent(in) :: inunit integer(I4B), intent(in) :: iout ! -- local - type(GwfDisvType), pointer :: disnew + type(DisvType), pointer :: disnew ! -- formats character(len=*), parameter :: fmtheader = & "(1X, /1X, 'DISV -- VERTEX GRID DISCRETIZATION PACKAGE,', & @@ -120,7 +142,7 @@ end subroutine disv_cr !< subroutine disv_load(this) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this ! ! -- source input data call this%source_options() @@ -135,7 +157,7 @@ end subroutine disv_load !< subroutine disv_df(this) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this ! call this%grid_finalize() ! @@ -145,7 +167,7 @@ end subroutine disv_df !< subroutine disv_da(this) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this ! ! -- Deallocate idm memory call memorylist_remove(this%name_model, 'DISV', idm_context) @@ -177,11 +199,11 @@ end subroutine disv_da !< subroutine source_options(this) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this ! -- locals character(len=LENVARNAME), dimension(3) :: lenunits = & &[character(len=LENVARNAME) :: 'FEET', 'METERS', 'CENTIMETERS'] - type(GwfDisvParamFoundType) :: found + type(DisvFoundType) :: found ! ! -- update defaults with idm sourced values call mem_set_value(this%lenuni, 'LENGTH_UNITS', this%input_mempath, & @@ -202,8 +224,8 @@ end subroutine source_options !< subroutine log_options(this, found) ! -- dummy - class(GwfDisvType) :: this - type(GwfDisvParamFoundType), intent(in) :: found + class(DisvType) :: this + type(DisvFoundType), intent(in) :: found ! write (this%iout, '(1x,a)') 'Setting Discretization Options' ! @@ -237,10 +259,10 @@ end subroutine log_options !< subroutine source_dimensions(this) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this ! -- locals integer(I4B) :: j, k - type(GwfDisvParamFoundType) :: found + type(DisvFoundType) :: found ! ! -- update defaults with idm sourced values call mem_set_value(this%nlay, 'NLAY', this%input_mempath, found%nlay) @@ -296,8 +318,8 @@ end subroutine source_dimensions !< subroutine log_dimensions(this, found) ! -- dummy - class(GwfDisvType) :: this - type(GwfDisvParamFoundType), intent(in) :: found + class(DisvType) :: this + type(DisvFoundType), intent(in) :: found ! write (this%iout, '(1x,a)') 'Setting Discretization Dimensions' ! @@ -321,10 +343,9 @@ end subroutine log_dimensions !< subroutine source_griddata(this) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this ! -- locals - type(GwfDisvParamFoundType) :: found - ! -- formats + type(DisvFoundType) :: found ! ! -- update defaults with idm sourced values call mem_set_value(this%top1d, 'TOP', this%input_mempath, found%top) @@ -342,8 +363,8 @@ end subroutine source_griddata !< subroutine log_griddata(this, found) ! -- dummy - class(GwfDisvType) :: this - type(GwfDisvParamFoundType), intent(in) :: found + class(DisvType) :: this + type(DisvFoundType), intent(in) :: found ! write (this%iout, '(1x,a)') 'Setting Discretization Griddata' ! @@ -367,7 +388,7 @@ end subroutine log_griddata !< subroutine grid_finalize(this) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this ! -- locals integer(I4B) :: node, noder, j, k real(DP) :: top @@ -494,7 +515,7 @@ end subroutine grid_finalize !< subroutine source_vertices(this) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this ! -- local integer(I4B) :: i real(DP), dimension(:), contiguous, pointer :: vert_x => null() @@ -527,7 +548,7 @@ subroutine define_cellverts(this, icell2d, ncvert, icvert) ! -- modules use SparseModule, only: sparsematrix ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this integer(I4B), dimension(:), contiguous, pointer, intent(in) :: icell2d integer(I4B), dimension(:), contiguous, pointer, intent(in) :: ncvert integer(I4B), dimension(:), contiguous, pointer, intent(in) :: icvert @@ -566,7 +587,7 @@ end subroutine define_cellverts !< subroutine source_cell2d(this) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this ! -- locals integer(I4B), dimension(:), contiguous, pointer :: icell2d => null() integer(I4B), dimension(:), contiguous, pointer :: ncvert => null() @@ -614,7 +635,7 @@ end subroutine source_cell2d !< subroutine connect(this) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this ! -- local integer(I4B) :: j, k integer(I4B) :: noder, nrsize @@ -688,7 +709,7 @@ subroutine write_grb(this, icelltype) ! -- modules use OpenSpecModule, only: access, form ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this integer(I4B), dimension(:), intent(in) :: icelltype ! -- local integer(I4B) :: iunit, i, ntxt @@ -820,7 +841,7 @@ end subroutine write_grb !< subroutine nodeu_to_string(this, nodeu, str) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this integer(I4B), intent(in) :: nodeu character(len=*), intent(inout) :: str ! -- local @@ -839,7 +860,7 @@ end subroutine nodeu_to_string !< subroutine nodeu_to_array(this, nodeu, arr) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this integer(I4B), intent(in) :: nodeu integer(I4B), dimension(:), intent(inout) :: arr ! -- local @@ -870,7 +891,7 @@ function get_nodenumber_idx1(this, nodeu, icheck) result(nodenumber) ! -- return integer(I4B) :: nodenumber ! -- dummy - class(GwfDisvType), intent(in) :: this + class(DisvType), intent(in) :: this integer(I4B), intent(in) :: nodeu integer(I4B), intent(in) :: icheck ! -- local @@ -902,7 +923,7 @@ function get_nodenumber_idx2(this, k, j, icheck) result(nodenumber) ! -- return integer(I4B) :: nodenumber ! -- dummy - class(GwfDisvType), intent(in) :: this + class(DisvType), intent(in) :: this integer(I4B), intent(in) :: k, j integer(I4B), intent(in) :: icheck ! -- local @@ -957,7 +978,7 @@ end function get_nodenumber_idx2 subroutine connection_normal(this, noden, nodem, ihc, xcomp, ycomp, zcomp, & ipos) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this integer(I4B), intent(in) :: noden !< cell (reduced nn) integer(I4B), intent(in) :: nodem !< neighbor (reduced nn) integer(I4B), intent(in) :: ihc !< horizontal connection flag @@ -1003,7 +1024,7 @@ end subroutine connection_normal subroutine connection_vector(this, noden, nodem, nozee, satn, satm, ihc, & xcomp, ycomp, zcomp, conlen) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this integer(I4B), intent(in) :: noden !< cell (reduced nn) integer(I4B), intent(in) :: nodem !< neighbor (reduced nn) logical, intent(in) :: nozee @@ -1061,7 +1082,7 @@ end subroutine connection_vector !< subroutine get_dis_type(this, dis_type) ! -- dummy - class(GwfDisvType), intent(in) :: this + class(DisvType), intent(in) :: this character(len=*), intent(out) :: dis_type ! dis_type = "DISV" @@ -1072,7 +1093,7 @@ end subroutine get_dis_type !< subroutine allocate_scalars(this, name_model, input_mempath) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this character(len=*), intent(in) :: name_model character(len=*), intent(in) :: input_mempath ! @@ -1096,12 +1117,12 @@ end subroutine allocate_scalars !< subroutine allocate_arrays(this) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this ! ! -- Allocate arrays in DisBaseType (mshape, top, bot, area) call this%DisBaseType%allocate_arrays() ! - ! -- Allocate arrays for GwfDisvType + ! -- Allocate arrays for DisvType if (this%nodes < this%nodesuser) then call mem_allocate(this%nodeuser, this%nodes, 'NODEUSER', this%memoryPath) call mem_allocate(this%nodereduced, this%nodesuser, 'NODEREDUCED', & @@ -1125,7 +1146,7 @@ end subroutine allocate_arrays !< function get_cell2d_area(this, icell2d) result(area) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this integer(I4B), intent(in) :: icell2d ! -- return real(DP) :: area @@ -1181,7 +1202,7 @@ end function get_cell2d_area function nodeu_from_string(this, lloc, istart, istop, in, iout, line, & flag_string, allow_zero) result(nodeu) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this integer(I4B), intent(inout) :: lloc integer(I4B), intent(inout) :: istart integer(I4B), intent(inout) :: istop @@ -1268,7 +1289,7 @@ function nodeu_from_cellid(this, cellid, inunit, iout, flag_string, & ! -- return integer(I4B) :: nodeu ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this character(len=*), intent(inout) :: cellid integer(I4B), intent(in) :: inunit integer(I4B), intent(in) :: iout @@ -1344,7 +1365,7 @@ end function nodeu_from_cellid !< logical function supports_layers(this) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this ! supports_layers = .true. ! @@ -1356,7 +1377,7 @@ function get_ncpl(this) ! -- return integer(I4B) :: get_ncpl ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this ! get_ncpl = this%ncpl ! @@ -1367,7 +1388,7 @@ end function get_ncpl !< subroutine get_polyverts(this, ic, polyverts, closed) ! -- dummy - class(GwfDisvType), intent(inout) :: this + class(DisvType), intent(inout) :: this integer(I4B), intent(in) :: ic !< cell number (reduced) real(DP), allocatable, intent(out) :: polyverts(:, :) !< polygon vertices (column-major indexing) logical(LGP), intent(in), optional :: closed !< whether to close the polygon, duplicating a vertex (default false) @@ -1414,7 +1435,7 @@ subroutine get_polyverts(this, ic, polyverts, closed) subroutine read_int_array(this, line, lloc, istart, istop, iout, in, & iarray, aname) ! -- dummy - class(GwfDisvType), intent(inout) :: this + class(DisvType), intent(inout) :: this character(len=*), intent(inout) :: line integer(I4B), intent(inout) :: lloc integer(I4B), intent(inout) :: istart @@ -1473,7 +1494,7 @@ end subroutine read_int_array subroutine read_dbl_array(this, line, lloc, istart, istop, iout, in, & darray, aname) ! -- dummy - class(GwfDisvType), intent(inout) :: this + class(DisvType), intent(inout) :: this character(len=*), intent(inout) :: line integer(I4B), intent(inout) :: lloc integer(I4B), intent(inout) :: istart @@ -1535,7 +1556,7 @@ end subroutine read_dbl_array subroutine read_layer_array(this, nodelist, darray, ncolbnd, maxbnd, & icolbnd, aname, inunit, iout) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this integer(I4B), intent(in) :: ncolbnd integer(I4B), intent(in) :: maxbnd integer(I4B), dimension(maxbnd) :: nodelist @@ -1579,7 +1600,7 @@ end subroutine read_layer_array subroutine record_array(this, darray, iout, iprint, idataun, aname, & cdatafmp, nvaluesp, nwidthp, editdesc, dinact) ! -- dummy - class(GwfDisvType), intent(inout) :: this + class(DisvType), intent(inout) :: this real(DP), dimension(:), pointer, contiguous, intent(inout) :: darray !< double precision array to record integer(I4B), intent(in) :: iout !< ascii output unit number integer(I4B), intent(in) :: iprint !< whether to print the array @@ -1668,7 +1689,7 @@ subroutine record_srcdst_list_header(this, text, textmodel, textpackage, & dstmodel, dstpackage, naux, auxtxt, & ibdchn, nlist, iout) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this character(len=16), intent(in) :: text character(len=16), intent(in) :: textmodel character(len=16), intent(in) :: textpackage @@ -1697,7 +1718,7 @@ end subroutine record_srcdst_list_header !< subroutine nlarray_to_nodelist(this, darray, nodelist, maxbnd, nbound, aname) ! -- dummy - class(GwfDisvType) :: this + class(DisvType) :: this integer(I4B), intent(in) :: maxbnd integer(I4B), dimension(:), pointer, contiguous :: darray integer(I4B), dimension(maxbnd), intent(inout) :: nodelist @@ -1753,4 +1774,4 @@ subroutine nlarray_to_nodelist(this, darray, nodelist, maxbnd, nbound, aname) ! end subroutine nlarray_to_nodelist -end module GwfDisvModule +end module DisvModule diff --git a/src/Model/GroundWaterFlow/gwf.f90 b/src/Model/GroundWaterFlow/gwf.f90 index 21ee5400f06..1caed0d0fec 100644 --- a/src/Model/GroundWaterFlow/gwf.f90 +++ b/src/Model/GroundWaterFlow/gwf.f90 @@ -1468,9 +1468,9 @@ subroutine create_packages(this) use MemoryManagerModule, only: mem_setptr use MemoryHelperModule, only: create_mem_path use SimVariablesModule, only: idm_context - use GwfDisModule, only: dis_cr - use GwfDisvModule, only: disv_cr - use GwfDisuModule, only: disu_cr + use DisModule, only: dis_cr + use DisvModule, only: disv_cr + use DisuModule, only: disu_cr use GwfNpfModule, only: npf_cr use Xt3dModule, only: xt3d_cr use GwfBuyModule, only: buy_cr diff --git a/src/Model/ParticleTracking/prt-fmi.f90 b/src/Model/ParticleTracking/prt-fmi.f90 index 5fd7acb5f53..274dbc59192 100644 --- a/src/Model/ParticleTracking/prt-fmi.f90 +++ b/src/Model/ParticleTracking/prt-fmi.f90 @@ -155,7 +155,6 @@ end subroutine prtfmi_df !> @brief Accumulate flows subroutine accumulate_flows(this) - use GwfDisvModule ! kluge??? implicit none ! -- dummy class(PrtFmiType) :: this diff --git a/src/Model/ParticleTracking/prt-prp.f90 b/src/Model/ParticleTracking/prt-prp.f90 index eb7c60e14a7..aa970c8ec9b 100644 --- a/src/Model/ParticleTracking/prt-prp.f90 +++ b/src/Model/ParticleTracking/prt-prp.f90 @@ -295,8 +295,8 @@ end subroutine prp_ar subroutine prp_ad(this) ! -- modules use TdisModule, only: totimc, delt, kstp - use GwfDisModule, only: GwfDisType - use GwfDisvModule, only: GwfDisvType + use DisModule, only: DisType + use DisvModule, only: DisvType ! -- dummy class(PrtPrpType) :: this ! -- local @@ -398,9 +398,9 @@ subroutine prp_ad(this) particle%istopzone = this%istopzone particle%icu = icu select type (dis => this%dis) - type is (GwfDisType) + type is (DisType) call get_ijk(icu, dis%nrow, dis%ncol, dis%nlay, irow, icol, ilay) - type is (GwfDisvType) + type is (DisvType) call get_jk(icu, dis%ncpl, dis%nlay, icpl, ilay) end select particle%ilay = ilay diff --git a/src/Model/ParticleTracking/prt.f90 b/src/Model/ParticleTracking/prt.f90 index 91c98536dec..94462f0b940 100644 --- a/src/Model/ParticleTracking/prt.f90 +++ b/src/Model/ParticleTracking/prt.f90 @@ -9,8 +9,9 @@ module PrtModule use NumericalModelModule, only: NumericalModelType use BaseModelModule, only: BaseModelType use BndModule, only: BndType, AddBndToList, GetBndFromList - use GwfDisModule, only: GwfDisType - use GwfDisvModule, only: GwfDisvType + use DisModule, only: DisType, dis_cr + use DisvModule, only: DisvType, disv_cr + use DisuModule, only: DisuType, disu_cr use PrtPrpModule, only: PrtPrpType use PrtFmiModule, only: PrtFmiType use PrtMipModule, only: PrtMipType @@ -262,7 +263,7 @@ subroutine prt_ar(this) ! -- Initialize tracking method select type (dis => this%dis) - type is (GwfDisType) + type is (DisType) call method_dis%init( & fmi=this%fmi, & trackfilectl=this%trackfilectl, & @@ -272,7 +273,7 @@ subroutine prt_ar(this) retfactor=this%mip%retfactor, & tracktimes=this%oc%tracktimes) this%method => method_dis - type is (GwfDisvType) + type is (DisvType) call method_disv%init( & fmi=this%fmi, & trackfilectl=this%trackfilectl, & @@ -1066,9 +1067,6 @@ subroutine create_packages(this) use MemoryManagerModule, only: mem_setptr use MemoryHelperModule, only: create_mem_path use SimVariablesModule, only: idm_context - use GwfDisModule, only: dis_cr - use GwfDisvModule, only: disv_cr - use GwfDisuModule, only: disu_cr use BudgetModule, only: budget_cr use MethodPoolModule, only: create_method_pool use MethodCellPoolModule, only: create_method_cell_pool diff --git a/src/Model/TransportModel/tsp.f90 b/src/Model/TransportModel/tsp.f90 index aaf90cf0e67..15f997bff07 100644 --- a/src/Model/TransportModel/tsp.f90 +++ b/src/Model/TransportModel/tsp.f90 @@ -724,9 +724,9 @@ subroutine create_tsp_packages(this, indis) use MemoryManagerModule, only: mem_setptr use MemoryHelperModule, only: create_mem_path use SimVariablesModule, only: idm_context - use GwfDisModule, only: dis_cr - use GwfDisvModule, only: disv_cr - use GwfDisuModule, only: disu_cr + use DisModule, only: dis_cr + use DisvModule, only: disv_cr + use DisuModule, only: disu_cr use TspIcModule, only: ic_cr use TspFmiModule, only: fmi_cr use TspAdvModule, only: adv_cr diff --git a/src/Solution/ParticleTracker/MethodDis.f90 b/src/Solution/ParticleTracker/MethodDis.f90 index b1f9eb17119..91c87a61864 100644 --- a/src/Solution/ParticleTracker/MethodDis.f90 +++ b/src/Solution/ParticleTracker/MethodDis.f90 @@ -8,7 +8,7 @@ module MethodDisModule use CellRectModule use ParticleModule use PrtFmiModule, only: PrtFmiType - use GwfDisModule, only: GwfDisType + use DisModule, only: DisType use TrackModule, only: TrackFileControlType use GeomUtilModule, only: get_ijk, get_jk use ArrayHandlersModule, only: ExpandArray @@ -79,7 +79,7 @@ subroutine load_dis(this, particle, next_level, submethod) select type (cell => this%cell) type is (CellRectType) select type (dis => this%fmi%dis) - type is (GwfDisType) + type is (DisType) ic = particle%idomain(next_level) call this%load_cell_defn(ic, cell%defn) @@ -165,7 +165,7 @@ subroutine pass_dis(this, particle) select type (cell => this%cell) type is (CellRectType) select type (dis => this%fmi%dis) - type is (GwfDisType) + type is (DisType) inbr = cell%defn%facenbr(inface) if (inbr .eq. 0) then ! -- Exterior face; no neighbor to map to @@ -259,7 +259,7 @@ subroutine load_cell_defn(this, ic, defn) type(CellDefnType), pointer, intent(inout) :: defn select type (dis => this%fmi%dis) - type is (GwfDisType) + type is (DisType) ! -- Set basic cell properties defn%icell = ic defn%npolyverts = 4 ! rectangular cell always has 4 vertices @@ -319,7 +319,7 @@ subroutine load_nbrs_to_defn(this, defn) call ExpandArray(defn%facenbr, defn%npolyverts + 3) select type (dis => this%fmi%dis) - type is (GwfDisType) + type is (DisType) ! -- Load face neighbors defn%facenbr = 0 ic1 = defn%icell diff --git a/src/Solution/ParticleTracker/MethodDisv.f90 b/src/Solution/ParticleTracker/MethodDisv.f90 index 15781913592..c19017cce95 100644 --- a/src/Solution/ParticleTracker/MethodDisv.f90 +++ b/src/Solution/ParticleTracker/MethodDisv.f90 @@ -9,7 +9,7 @@ module MethodDisvModule use CellPolyModule use ParticleModule use PrtFmiModule, only: PrtFmiType - use GwfDisvModule, only: GwfDisvType + use DisvModule, only: DisvType use ArrayHandlersModule, only: ExpandArray use TrackModule, only: TrackFileControlType use GeomUtilModule, only: get_jk @@ -126,7 +126,7 @@ end subroutine load_disv !> @brief Pass a particle to the next cell, if there is one subroutine pass_disv(this, particle) ! -- modules - use GwfDisvModule, only: GwfDisvType + use DisvModule, only: DisvType use TdisModule, only: kper, kstp ! -- dummy class(MethodDisvType), intent(inout) :: this @@ -148,7 +148,7 @@ subroutine pass_disv(this, particle) select type (cell => this%cell) type is (CellPolyType) select type (dis => this%fmi%dis) - type is (GwfDisvType) + type is (DisvType) inbr = cell%defn%facenbr(inface) if (inbr .eq. 0) then ! -- Exterior face; no neighbor to map to @@ -281,7 +281,7 @@ function get_npolyverts(this, ic) result(npolyverts) integer(I4B) :: npolyverts select type (dis => this%fmi%dis) - type is (GwfDisvType) + type is (DisvType) ncpl = dis%get_ncpl() icu = dis%get_nodeuser(ic) icu2d = icu - ((icu - 1) / ncpl) * ncpl ! kluge note: use MOD or MODULO??? @@ -382,7 +382,7 @@ subroutine load_nbrs_to_defn(this, defn) call ExpandArray(defn%facenbr, npolyverts + 3) select type (dis => this%fmi%dis) - type is (GwfDisvType) + type is (DisvType) ! -- Load face neighbors. defn%facenbr = 0 ic1 = ic diff --git a/src/Solution/ParticleTracker/MethodSubcellPollock.f90 b/src/Solution/ParticleTracker/MethodSubcellPollock.f90 index 86d01e44ad2..f4d54e37b99 100644 --- a/src/Solution/ParticleTracker/MethodSubcellPollock.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellPollock.f90 @@ -7,7 +7,6 @@ module MethodSubcellPollockModule use PrtFmiModule, only: PrtFmiType use TrackModule, only: TrackFileControlType use BaseDisModule, only: DisBaseType - use GwfDisModule, only: GwfDisType use CellModule, only: CellType implicit none private diff --git a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 index 04a7151449c..33721911b10 100644 --- a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 @@ -11,7 +11,6 @@ module MethodSubcellTernaryModule use TernarySolveTrack, only: traverse_triangle, step_analytical, canonical use PrtFmiModule, only: PrtFmiType use BaseDisModule, only: DisBaseType - use GwfDisvModule, only: GwfDisvType implicit none private diff --git a/src/meson.build b/src/meson.build index 3a565ecb248..96b3fa34afb 100644 --- a/src/meson.build +++ b/src/meson.build @@ -110,6 +110,9 @@ modflow_sources = files( 'Model' / 'Connection' / 'GwtInterfaceModel.f90', 'Model' / 'Connection' / 'SpatialModelConnection.f90', 'Model' / 'Connection' / 'DistributedVariable.f90', + 'Model' / 'Discretization' / 'Dis.f90', + 'Model' / 'Discretization' / 'Disu.f90', + 'Model' / 'Discretization' / 'Disv.f90', 'Model' / 'Geometry' / 'BaseGeometry.f90', 'Model' / 'Geometry' / 'CircularGeometry.f90', 'Model' / 'Geometry' / 'RectangularGeometry.f90', @@ -127,9 +130,6 @@ modflow_sources = files( 'Model' / 'GroundWaterFlow' / 'gwf-buy.f90', 'Model' / 'GroundWaterFlow' / 'gwf-chd.f90', 'Model' / 'GroundWaterFlow' / 'gwf-csub.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-dis.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-disu.f90', - 'Model' / 'GroundWaterFlow' / 'gwf-disv.f90', 'Model' / 'GroundWaterFlow' / 'gwf-drn.f90', 'Model' / 'GroundWaterFlow' / 'gwf-evt.f90', 'Model' / 'GroundWaterFlow' / 'gwf-ghb.f90', From a666ed4e1ffa709fa9afb4d9868d22f9aa383c37 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 28 Feb 2024 11:20:14 -0500 Subject: [PATCH 044/199] ci: update rules in fortran style script (#1651) * add rules: no trailing return statements, clean up comments (no double dashes, no empty comments, internal comment spacing) * run black/isort on scripts in .github/common/ --- .github/common/fortran_format_check.py | 4 +- .github/common/update_fortran_style.py | 220 ++++++++++++++----------- .github/common/wide_compat_reports.py | 3 +- 3 files changed, 132 insertions(+), 95 deletions(-) diff --git a/.github/common/fortran_format_check.py b/.github/common/fortran_format_check.py index a2c6eb1411e..b04f0997453 100644 --- a/.github/common/fortran_format_check.py +++ b/.github/common/fortran_format_check.py @@ -1,7 +1,7 @@ -import os -import sys import argparse import glob +import os +import sys from pathlib import Path from subprocess import run diff --git a/.github/common/update_fortran_style.py b/.github/common/update_fortran_style.py index 6b71687198a..095a9fa4902 100644 --- a/.github/common/update_fortran_style.py +++ b/.github/common/update_fortran_style.py @@ -1,112 +1,159 @@ import argparse -import re -from contextlib import nullcontext +import string from itertools import repeat from pathlib import Path -from typing import Iterator, Optional -from warnings import warn from fprettify.fparse_utils import InputStream -INTENT_PATTERN = re.compile(r".*(intent\(.+\)).*") +ALPHANUMERICS = set(string.ascii_letters + string.digits) -def get_intent(s) -> Optional[str]: - result = INTENT_PATTERN.match(s) - return result.group(1) if result else None +def join_comments(comments) -> str: + return "".join([c for c in comments if any(c)]) -def get_param(s) -> bool: - return "parameter" in s - - -def get_comments(comments) -> Iterator[str]: - for comment in comments: - if not any(comment): - continue - yield comment.rstrip() - - -class Transforms: +class Rules: @staticmethod - def separate_lines(path, overwrite=False): + def separate_lines(path): """Variables defined on separate lines""" flines = [] with open(path, "r") as f: stream = InputStream(f) while 1: - line, comments, lines = stream.next_fortran_line() + line, comment, lines = stream.next_fortran_line() if not lines: break line = line.rstrip() parts = line.rpartition("::") - comments = " " + "".join(get_comments(comments)) - if not parts[1] or "procedure" in parts[0]: - for l in lines: - flines.append(l.rstrip()) + comment = join_comments(comment) + + if ( + not parts[1] + or "procedure" in parts[0] + or parts[0].strip().startswith("use") + ): + flines.extend(lines) continue - nspaces = len(lines[0]) - len(lines[0].lstrip()) - prefix = "".join(repeat(" ", nspaces)) - vtype = parts[0].split(",")[0].strip() - split = parts[2].split(",") - intent = get_intent(parts[0]) - param = get_param(parts[0]) + indent = "".join(repeat(" ", len(lines[0]) - len(lines[0].lstrip()))) + quals = [q.strip() for q in parts[0].split(",")] # qualifiers + vars = [v.strip() for v in parts[2].split(",")] # variable names if not line: continue - if (len(parts[0]) == 0 and len(parts[1]) == 0) or ( - "(" in parts[2] or ")" in parts[2] + if ( + (len(parts[0]) == 0 and len(parts[1]) == 0) + or ("(" in parts[2] or ")" in parts[2]) + or len(vars) == 1 + or "parameter" in parts[0] ): - flines.append(prefix + line + comments) - elif len(split) == 1: - flines.append(prefix + line + comments) - elif param: - flines.append(prefix + line + comments) + flines.extend(lines) else: - for s in split: - if s.strip() == "&": + for s in vars: + if s == "&": continue - l = prefix + vtype - if intent: - l += f", {intent}" - l += f" :: {s.strip()}" - flines.append(l + comments) - - with open(path, "w") if overwrite else nullcontext() as f: - - def write(line): - if overwrite: - f.write(line + "\n") - else: - print(line) + l = indent + ", ".join(quals) + l += f" :: {s}" + flines.append(l + comment) + with open(path, "w") as f: for line in flines: - write(line) + f.write(line.rstrip() + "\n") @staticmethod - def no_return_statements(path, overwrite=False): + def trailing_returns(path): """Remove return statements at the end of routines""" - # todo - pass + + flines = [] + with open(path, "r") as f: + stream = InputStream(f) + while 1: + line, comment, lines = stream.next_fortran_line() + if not lines: + break + line = line.rstrip() + comment = join_comments(comment) + + if comment.strip().lower().replace("-", "").replace(" ", "") in [ + "!return" + ]: + continue + elif "end subroutine" in line or "end function" in line: + for i, fl in enumerate(reversed(flines)): + l = fl.strip() + if not any(l): + continue + elif l == "return": + del flines[len(flines) - i - 1] + break + flines.extend(lines) + + with open(path, "w") as f: + for line in flines: + f.write(line.rstrip() + "\n") @staticmethod - def no_empty_comments(path, overwrite=False): - """Remove comments on lines with only whitespace""" - # todo - pass + def cleanup_comments(path): + """ + Remove comments on lines with only whitespace, remove '--' from the beginnings + of comments, make sure comment spacing is consistent (one space after '!'), + remove horizontal dividers consisting of '-' or '*', remove 'SPECIFICATION' + """ + + flines = [] + with open(path, "r") as f: + stream = InputStream(f) + while 1: + line, comment, lines = stream.next_fortran_line() + if not lines: + break + line = line.rstrip() + comment = join_comments(comment) + nspaces = len(lines[0]) - len(lines[0].lstrip()) + indent = "".join(repeat(" ", nspaces)) + + if comment.startswith("#"): + # preprocessor directives + flines.extend(lines) + elif not any(line): + if any(pattern in comment for pattern in ["!!", "!<", "!>"]): + flines.extend(lines) + elif "SPECIFICATIONS" in comment: + continue + elif any(set(comment) & ALPHANUMERICS): + comment = comment.strip().replace("--", "") + i = 0 + for c in comment: + if c.isdigit() or c.isalnum(): + break + i += 1 + comment = f"! {comment[i:]}" + flines.append(indent + comment) + elif "-" in comment or "*" in comment: + continue + else: + flines.append("") + else: + flines.extend(lines) + + with open(path, "w") as f: + for line in flines: + f.write(line.rstrip() + "\n") -def reformat(path, overwrite, separate_lines, no_return_statements, no_empty_comments): +def reformat( + path, + separate_lines, + trailing_returns, + cleanup_comments, +): if separate_lines: - Transforms.separate_lines(path, overwrite=overwrite) - if no_return_statements: - Transforms.no_return_statements(path, overwrite=overwrite) - warn("--no-return not implemented yet") - if no_empty_comments: - Transforms.no_empty_comments(path, overwrite=overwrite) - warn("--no-empty-comments not implemented yet") + Rules.separate_lines(path) + if trailing_returns: + Rules.trailing_returns(path) + if cleanup_comments: + Rules.cleanup_comments(path) if __name__ == "__main__": @@ -117,43 +164,32 @@ def reformat(path, overwrite, separate_lines, no_return_statements, no_empty_com styles. """ ) - parser.add_argument( - "-i", "--input", help="path to input file" # todo: or directory - ) - parser.add_argument( - "-f", - "--force", - action="store_true", - default=False, - required=False, - help="overwrite/reformat files", - ) + parser.add_argument("path") parser.add_argument( "--separate-lines", action="store_true", default=True, required=False, - help="define variables on separate lines", + help="Define dummy arguments and local variables on separate lines.", ) parser.add_argument( - "--no-return_statements", + "--trailing-returns", action="store_true", - default=False, + default=True, required=False, - help="no return statements at the end of routines", + help="Remove return statements at the end of routines.", ) parser.add_argument( - "--no-empty-comments", + "--cleanup-comments", action="store_true", - default=False, + default=True, required=False, - help="no empty comments", + help="Remove empty comments (containing only '!', or '!' followed by some number of '-' or '='), remove double dashes from beginnings of comments (e.g., '! -- comment' becomes '! comment'), and make internal comment spacing consistent (one space after '!' before text begins).", ) args = parser.parse_args() reformat( - path=Path(args.input).expanduser().absolute(), - overwrite=args.force, + path=Path(args.path).expanduser().absolute(), separate_lines=args.separate_lines, - no_return_statements=args.no_return_statements, - no_empty_comments=args.no_empty_comments, + trailing_returns=args.trailing_returns, + cleanup_comments=args.cleanup_comments, ) diff --git a/.github/common/wide_compat_reports.py b/.github/common/wide_compat_reports.py index f2ffb531ba1..8b8826f8973 100644 --- a/.github/common/wide_compat_reports.py +++ b/.github/common/wide_compat_reports.py @@ -3,9 +3,10 @@ and makes a markdown table from the wide format report. """ +import sys from pathlib import Path + import pandas as pd -import sys ip = Path(sys.argv[1]) # input file path op = Path(sys.argv[2]) # output file path From 8ea03bd04d8f4b28ad4b590846ccc3628073c389 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Mon, 4 Mar 2024 13:00:02 -0600 Subject: [PATCH 045/199] refactor(npf): remove minimum saturated thickness (#1654) * restrict yanked pytest version --- doc/mf6io/mf6ivar/dfn/gwf-npf.dfn | 9 ---- doc/mf6io/mf6ivar/md/mf6ivar.md | 1 - environment.yml | 2 +- src/Idm/gwf-npfidm.f90 | 19 --------- src/Model/GroundWaterFlow/gwf-buy.f90 | 4 +- src/Model/GroundWaterFlow/gwf-npf.f90 | 60 ++++++++------------------- src/Utilities/SmoothingFunctions.f90 | 24 +---------- 7 files changed, 22 insertions(+), 97 deletions(-) diff --git a/doc/mf6io/mf6ivar/dfn/gwf-npf.dfn b/doc/mf6io/mf6ivar/dfn/gwf-npf.dfn index 311fbed7065..ad824437ff1 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-npf.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-npf.dfn @@ -253,15 +253,6 @@ longname use MODFLOW-NWT approach for upstream weighting description use MODFLOW-NWT approach for upstream weighting mf6internal inwtupw -block options -name dev_minimum_saturated_thickness -type double precision -reader urword -optional true -longname set minimum allowed saturated thickness -description set minimum allowed saturated thickness -mf6internal satmin - block options name dev_omega type double precision diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 5079a6c8f5a..819e76ec545 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -257,7 +257,6 @@ | GWF | NPF | OPTIONS | DEV_NO_NEWTON | KEYWORD | turn off Newton for unconfined cells | | GWF | NPF | OPTIONS | DEV_MODFLOWUSG_UPSTREAM_WEIGHTED_SATURATION | KEYWORD | use MODFLOW-USG upstream-weighted saturation approach | | GWF | NPF | OPTIONS | DEV_MODFLOWNWT_UPSTREAM_WEIGHTING | KEYWORD | use MODFLOW-NWT approach for upstream weighting | -| GWF | NPF | OPTIONS | DEV_MINIMUM_SATURATED_THICKNESS | DOUBLE PRECISION | set minimum allowed saturated thickness | | GWF | NPF | OPTIONS | DEV_OMEGA | DOUBLE PRECISION | set saturation omega value | | GWF | NPF | GRIDDATA | ICELLTYPE | INTEGER (NODES) | flag for each cell that specifies how saturated thickness is treated. 0 means saturated thickness is held constant; $>$0 means saturated thickness varies with computed head when head is below the cell top; $<$0 means saturated thickness varies with computed head unless the THICKSTRT option is in effect. When THICKSTRT is in effect, a negative value for ICELLTYPE indicates that the saturated thickness value used in conductance calculations in the NPF Package will be computed as STRT-BOT and held constant. If the THICKSTRT option is not in effect, then negative values provided by the user for ICELLTYPE are automatically reassigned by the program to a value of one. | | GWF | NPF | GRIDDATA | K | DOUBLE PRECISION (NODES) | is the hydraulic conductivity. For the common case in which the user would like to specify the horizontal hydraulic conductivity and the vertical hydraulic conductivity, then K should be assigned as the horizontal hydraulic conductivity, K33 should be assigned as the vertical hydraulic conductivity, and K22 and the three rotation angles should not be specified. When more sophisticated anisotropy is required, then K corresponds to the K11 hydraulic conductivity axis. All included cells (IDOMAIN $>$ 0) must have a K value greater than zero. | diff --git a/environment.yml b/environment.yml index c7fc0fc6748..66e15331237 100644 --- a/environment.yml +++ b/environment.yml @@ -25,7 +25,7 @@ dependencies: - git+https://github.com/Deltares/xmipy.git - git+https://github.com/MODFLOW-USGS/modflowapi.git - git+https://github.com/MODFLOW-USGS/modflow-devtools.git - - pytest + - pytest!=8.1.0 - pytest-benchmark - pytest-dotenv - pytest-order diff --git a/src/Idm/gwf-npfidm.f90 b/src/Idm/gwf-npfidm.f90 index b4e7f4e7ac2..efe934efb3a 100644 --- a/src/Idm/gwf-npfidm.f90 +++ b/src/Idm/gwf-npfidm.f90 @@ -38,7 +38,6 @@ module GwfNpfInputModule logical :: inewton = .false. logical :: iusgnrhc = .false. logical :: inwtupw = .false. - logical :: satmin = .false. logical :: satomega = .false. logical :: icelltype = .false. logical :: k = .false. @@ -511,23 +510,6 @@ module GwfNpfInputModule .false. & ! timeseries ) - type(InputParamDefinitionType), parameter :: & - gwfnpf_satmin = InputParamDefinitionType & - ( & - 'GWF', & ! component - 'NPF', & ! subcomponent - 'OPTIONS', & ! block - 'DEV_MINIMUM_SATURATED_THICKNESS', & ! tag name - 'SATMIN', & ! fortran variable - 'DOUBLE', & ! type - '', & ! shape - .false., & ! required - .false., & ! multi-record - .false., & ! preserve case - .false., & ! layered - .false. & ! timeseries - ) - type(InputParamDefinitionType), parameter :: & gwfnpf_satomega = InputParamDefinitionType & ( & @@ -711,7 +693,6 @@ module GwfNpfInputModule gwfnpf_inewton, & gwfnpf_iusgnrhc, & gwfnpf_inwtupw, & - gwfnpf_satmin, & gwfnpf_satomega, & gwfnpf_icelltype, & gwfnpf_k, & diff --git a/src/Model/GroundWaterFlow/gwf-buy.f90 b/src/Model/GroundWaterFlow/gwf-buy.f90 index 70f87f67f61..24095275200 100644 --- a/src/Model/GroundWaterFlow/gwf-buy.f90 +++ b/src/Model/GroundWaterFlow/gwf-buy.f90 @@ -1243,7 +1243,7 @@ subroutine calcbuy(this, n, m, icon, hn, hm, buy) this%dis%con%cl1(this%dis%con%jas(icon)), & this%dis%con%cl2(this%dis%con%jas(icon)), & this%dis%con%hwva(this%dis%con%jas(icon)), & - this%npf%satomega, this%npf%satmin) + this%npf%satomega) end if ! ! -- Calculate buoyancy term @@ -1326,7 +1326,7 @@ subroutine calchhterms(this, n, m, icon, hn, hm, rhsterm, amatnn, amatnm) this%dis%con%cl1(this%dis%con%jas(icon)), & this%dis%con%cl2(this%dis%con%jas(icon)), & this%dis%con%hwva(this%dis%con%jas(icon)), & - this%npf%satomega, this%npf%satmin) + this%npf%satomega) end if ! ! -- Calculate terms diff --git a/src/Model/GroundWaterFlow/gwf-npf.f90 b/src/Model/GroundWaterFlow/gwf-npf.f90 index a22f77cb3e9..b0686214689 100644 --- a/src/Model/GroundWaterFlow/gwf-npf.f90 +++ b/src/Model/GroundWaterFlow/gwf-npf.f90 @@ -87,7 +87,6 @@ module GwfNpfModule real(DP), dimension(:), pointer, contiguous :: wetdry => null() !< wetdry array real(DP), dimension(:), pointer, contiguous :: sat => null() !< saturation (0. to 1.) for each cell real(DP), dimension(:), pointer, contiguous :: condsat => null() !< saturated conductance (symmetric array) - real(DP), pointer :: satmin => null() !< minimum saturated thickness integer(I4B), dimension(:), pointer, contiguous :: ibotnode => null() !< bottom node used if igwfnewtonur /= 0 ! real(DP), dimension(:, :), pointer, contiguous :: spdis => null() !< specific discharge : qx, qy, qz (nodes, 3) @@ -566,7 +565,7 @@ subroutine npf_fc(this, kiter, matrix_sln, idxglo, rhs, hnew) this%dis%con%cl1(this%dis%con%jas(ii)), & this%dis%con%cl2(this%dis%con%jas(ii)), & this%dis%con%hwva(this%dis%con%jas(ii)), & - this%satomega, this%satmin) + this%satomega) end if ! ! -- Fill row n @@ -672,7 +671,7 @@ subroutine npf_fn(this, kiter, matrix_sln, idxglo, rhs, hnew) !filledterm = cond filledterm = matrix_sln%get_value_pos(idxglo(ii)) derv = sQuadraticSaturationDerivative(topup, botup, hnew(iups), & - this%satomega, this%satmin) + this%satomega) idiagm = this%dis%con%ia(m) ! fill jacobian for n being the upstream node if (iups == n) then @@ -825,8 +824,7 @@ subroutine sgwf_npf_thksat(this, n, hn, thksat) ! -- Newton-Raphson Formulation if (this%inewton /= 0) then thksat = sQuadraticSaturation(this%dis%top(n), this%dis%bot(n), hn, & - this%satomega, this%satmin) - !if (thksat < this%satmin) thksat = this%satmin + this%satomega) end if ! ! -- Return @@ -879,7 +877,7 @@ subroutine sgwf_npf_qcalc(this, n, m, hn, hm, icon, qnm) this%dis%con%cl1(this%dis%con%jas(icon)), & this%dis%con%cl2(this%dis%con%jas(icon)), & this%dis%con%hwva(this%dis%con%jas(icon)), & - this%satomega, this%satmin) + this%satomega) end if ! ! -- Initialize hntemp and hmtemp @@ -1039,7 +1037,6 @@ subroutine npf_da(this) call mem_deallocate(this%wetfct) call mem_deallocate(this%iwetit) call mem_deallocate(this%ihdwet) - call mem_deallocate(this%satmin) call mem_deallocate(this%ibotnode) call mem_deallocate(this%iwetdry) call mem_deallocate(this%iangle1) @@ -1123,7 +1120,6 @@ subroutine allocate_scalars(this) call mem_allocate(this%wetfct, 'WETFCT', this%memoryPath) call mem_allocate(this%iwetit, 'IWETIT', this%memoryPath) call mem_allocate(this%ihdwet, 'IHDWET', this%memoryPath) - call mem_allocate(this%satmin, 'SATMIN', this%memoryPath) call mem_allocate(this%iangle1, 'IANGLE1', this%memoryPath) call mem_allocate(this%iangle2, 'IANGLE2', this%memoryPath) call mem_allocate(this%iangle3, 'IANGLE3', this%memoryPath) @@ -1165,7 +1161,6 @@ subroutine allocate_scalars(this) this%wetfct = DONE this%iwetit = 1 this%ihdwet = 0 - this%satmin = DZERO ! DEM7 this%iangle1 = 0 this%iangle2 = 0 this%iangle3 = 0 @@ -1336,9 +1331,6 @@ subroutine log_options(this, found) if (found%inwtupw) & write (this%iout, '(4x,a)') 'MODFLOW-NWT upstream weighting method will be & &used' - if (found%satmin) & - write (this%iout, '(4x,a,1pg15.6)') 'Minimum saturated thickness has been & - &set to: ', this%satmin if (found%satomega) & write (this%iout, '(4x,a,1pg15.6)') 'Saturation omega: ', this%satomega if (found%irewet) & @@ -1402,7 +1394,6 @@ subroutine source_options(this) call mem_set_value(this%iusgnrhc, 'IUSGNRHC', this%input_mempath, & found%iusgnrhc) call mem_set_value(this%inwtupw, 'INWTUPW', this%input_mempath, found%inwtupw) - call mem_set_value(this%satmin, 'SATMIN', this%input_mempath, found%satmin) call mem_set_value(this%satomega, 'SATOMEGA', this%input_mempath, & found%satomega) call mem_set_value(this%irewet, 'IREWET', this%input_mempath, found%irewet) @@ -2167,7 +2158,7 @@ subroutine calc_condsat(this, node, upperOnly) botn, botm, & this%dis%con%cl1(jj), & this%dis%con%cl2(jj), & - fawidth, this%satomega, this%satmin) + fawidth, this%satomega) end if this%condsat(jj) = csat end do @@ -2519,7 +2510,7 @@ end function hy_eff !< function hcond(ibdn, ibdm, ictn, ictm, inewton, inwtup, ihc, icellavg, iusg, & iupw, condsat, hn, hm, satn, satm, hkn, hkm, topn, topm, & - botn, botm, cln, clm, fawidth, satomega, satminopt) & + botn, botm, cln, clm, fawidth, satomega) & result(condnm) ! -- return real(DP) :: condnm @@ -2549,10 +2540,8 @@ function hcond(ibdn, ibdm, ictn, ictm, inewton, inwtup, ihc, icellavg, iusg, & real(DP), intent(in) :: clm real(DP), intent(in) :: fawidth real(DP), intent(in) :: satomega - real(DP), optional, intent(in) :: satminopt ! -- local integer(I4B) :: indk - real(DP) :: satmin real(DP) :: sn real(DP) :: sm real(DP) :: thksatn @@ -2563,12 +2552,6 @@ function hcond(ibdn, ibdm, ictn, ictm, inewton, inwtup, ihc, icellavg, iusg, & real(DP) :: athk real(DP) :: afac ! - if (present(satminopt)) then - satmin = satminopt - else - satmin = DZERO - end if - ! ! -- If either n or m is inactive then conductance is zero if (ibdn == 0 .or. ibdm == 0) then condnm = DZERO @@ -2604,11 +2587,11 @@ function hcond(ibdn, ibdm, ictn, ictm, inewton, inwtup, ihc, icellavg, iusg, & top = topn bot = botn end if - sn = sQuadraticSaturation(top, bot, hn, satomega, satmin) - sm = sQuadraticSaturation(top, bot, hm, satomega, satmin) + sn = sQuadraticSaturation(top, bot, hn, satomega) + sm = sQuadraticSaturation(top, bot, hm, satomega) else - sn = sQuadraticSaturation(topn, botn, hn, satomega, satmin) - sm = sQuadraticSaturation(topm, botm, hm, satomega, satmin) + sn = sQuadraticSaturation(topn, botn, hn, satomega) + sm = sQuadraticSaturation(topm, botm, hm, satomega) end if ! if (hn > hm) then @@ -2998,7 +2981,7 @@ subroutine calc_spdis(this, flowja) this%inewton, ihc, this%iusgnrhc, & this%hnew(n), this%hnew(m), this%sat(n), this%sat(m), & this%dis%top(n), this%dis%top(m), this%dis%bot(n), & - this%dis%bot(m), this%satomega, this%satmin) + this%dis%bot(m), this%satomega) area = area * dz call this%dis%connection_normal(n, m, ihc, xn, yn, zn, ipos) call this%dis%connection_vector(n, m, nozee, this%sat(n), this%sat(m), & @@ -3298,8 +3281,7 @@ function calcSatThickness(this, n, m, ihc) result(satThickness) this%dis%top(m), & this%dis%bot(n), & this%dis%bot(m), & - this%satomega, & - this%satmin) + this%satomega) ! ! -- Return return @@ -3309,7 +3291,7 @@ end function calcSatThickness !< function thksatnm(ibdn, ibdm, ictn, ictm, inwtup, ihc, iusg, & hn, hm, satn, satm, topn, topm, botn, botm, & - satomega, satminopt) result(res) + satomega) result(res) ! -- return real(DP) :: res ! -- dummy @@ -3329,10 +3311,8 @@ function thksatnm(ibdn, ibdm, ictn, ictm, inwtup, ihc, iusg, & real(DP), intent(in) :: botn real(DP), intent(in) :: botm real(DP), intent(in) :: satomega - real(DP), optional, intent(in) :: satminopt ! -- local integer(I4B) :: indk - real(DP) :: satmin real(DP) :: sn real(DP) :: sm real(DP) :: thksatn @@ -3341,12 +3321,6 @@ function thksatnm(ibdn, ibdm, ictn, ictm, inwtup, ihc, iusg, & real(DP) :: tpn, tpm real(DP) :: top, bot ! - if (present(satminopt)) then - satmin = satminopt - else - satmin = DZERO - end if - ! ! -- If either n or m is inactive then saturated thickness is zero if (ibdn == 0 .or. ibdm == 0) then res = DZERO @@ -3389,11 +3363,11 @@ function thksatnm(ibdn, ibdm, ictn, ictm, inwtup, ihc, iusg, & top = topn bot = botn end if - sn = sQuadraticSaturation(top, bot, hn, satomega, satmin) - sm = sQuadraticSaturation(top, bot, hm, satomega, satmin) + sn = sQuadraticSaturation(top, bot, hn, satomega) + sm = sQuadraticSaturation(top, bot, hm, satomega) else - sn = sQuadraticSaturation(topn, botn, hn, satomega, satmin) - sm = sQuadraticSaturation(topm, botm, hm, satomega, satmin) + sn = sQuadraticSaturation(topn, botn, hn, satomega) + sm = sQuadraticSaturation(topm, botm, hm, satomega) end if ! ! -- upstream weight the thickness diff --git a/src/Utilities/SmoothingFunctions.f90 b/src/Utilities/SmoothingFunctions.f90 index 657457b79de..40c82161021 100644 --- a/src/Utilities/SmoothingFunctions.f90 +++ b/src/Utilities/SmoothingFunctions.f90 @@ -280,7 +280,7 @@ end function sCubicSaturation !! !! Nonlinear quadratic saturation function returns value between 0-1 !< - function sQuadraticSaturation(top, bot, x, eps, bmin) result(y) + function sQuadraticSaturation(top, bot, x, eps) result(y) ! -- return real(DP) :: y ! -- dummy variables @@ -288,10 +288,8 @@ function sQuadraticSaturation(top, bot, x, eps, bmin) result(y) real(DP), intent(in) :: bot real(DP), intent(in) :: x real(DP), optional, intent(in) :: eps - real(DP), optional, intent(in) :: bmin ! -- local real(DP) :: teps - real(DP) :: tbmin real(DP) :: b real(DP) :: br real(DP) :: bri @@ -303,11 +301,6 @@ function sQuadraticSaturation(top, bot, x, eps, bmin) result(y) else teps = DEM6 end if - if (present(bmin)) then - tbmin = bmin - else - tbmin = DZERO - end if b = top - bot if (b > DZERO) then if (x < bot) then @@ -319,9 +312,6 @@ function sQuadraticSaturation(top, bot, x, eps, bmin) result(y) end if av = DONE / (DONE - teps) bri = DONE - br - if (br < tbmin) then - br = tbmin - end if if (br < teps) then y = av * DHALF * (br * br) / teps elseif (br < (DONE - teps)) then @@ -381,7 +371,7 @@ end function svanGenuchtenSaturation !! !! Derivative of nonlinear smoothing function returns value between 0-1; !< - function sQuadraticSaturationDerivative(top, bot, x, eps, bmin) result(y) + function sQuadraticSaturationDerivative(top, bot, x, eps) result(y) ! -- return real(DP) :: y ! -- dummy variables @@ -389,10 +379,8 @@ function sQuadraticSaturationDerivative(top, bot, x, eps, bmin) result(y) real(DP), intent(in) :: bot real(DP), intent(in) :: x real(DP), optional, intent(in) :: eps - real(DP), optional, intent(in) :: bmin ! -- local real(DP) :: teps - real(DP) :: tbmin real(DP) :: b real(DP) :: br real(DP) :: bri @@ -404,11 +392,6 @@ function sQuadraticSaturationDerivative(top, bot, x, eps, bmin) result(y) else teps = DEM6 end if - if (present(bmin)) then - tbmin = bmin - else - tbmin = DZERO - end if b = top - bot if (x < bot) then br = DZERO @@ -419,9 +402,6 @@ function sQuadraticSaturationDerivative(top, bot, x, eps, bmin) result(y) end if av = DONE / (DONE - teps) bri = DONE - br - if (br < tbmin) then - br = tbmin - end if if (br < teps) then y = av * br / teps elseif (br < (DONE - teps)) then From 58bd3494a9e7c5a5bfa08ee48897910e213a75ac Mon Sep 17 00:00:00 2001 From: mjr-deltares <45555666+mjr-deltares@users.noreply.github.com> Date: Mon, 4 Mar 2024 18:00:28 -0500 Subject: [PATCH 046/199] - minor changes to get GWE parallel (#1656) --- autotest/test_gwegwe_exchng_with_comp2gwt.py | 3 +- autotest/test_par_gwe_comp2gwt.py | 40 ++++++++++ src/Distributed/MpiMessageBuilder.f90 | 6 +- src/Distributed/VirtualGweModel.f90 | 1 + src/SimulationCreate.f90 | 78 ++++++++++++-------- 5 files changed, 94 insertions(+), 34 deletions(-) create mode 100644 autotest/test_par_gwe_comp2gwt.py diff --git a/autotest/test_gwegwe_exchng_with_comp2gwt.py b/autotest/test_gwegwe_exchng_with_comp2gwt.py index ecefa3fb51e..4eb41492fcd 100644 --- a/autotest/test_gwegwe_exchng_with_comp2gwt.py +++ b/autotest/test_gwegwe_exchng_with_comp2gwt.py @@ -59,7 +59,6 @@ """ - import os import sys @@ -292,7 +291,7 @@ def build_models(idx, test): filename="{}.gwfgwt".format("lower"), ) - return sim + return sim, None # Instatiate the upper and lower flow models diff --git a/autotest/test_par_gwe_comp2gwt.py b/autotest/test_par_gwe_comp2gwt.py new file mode 100644 index 00000000000..16ca86905b9 --- /dev/null +++ b/autotest/test_par_gwe_comp2gwt.py @@ -0,0 +1,40 @@ +""" +This tests reuses the simulation data in +test_gwegwe_exchng_with_comp2gwt and runs it +in parallel on two cpus +""" + +import pytest + +from framework import TestFramework + +cases = ["gwegwe-gwtgwt"] + + +def build_models(idx, test): + from test_gwegwe_exchng_with_comp2gwt import build_models as build + + sim, dummy = build(idx, test) + return sim, dummy + + +def check_output(idx, test): + from test_gwegwe_exchng_with_comp2gwt import check_output as check + + check(idx, test) + + +@pytest.mark.parallel +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + compare=None, + parallel=True, + ncpus=2, + ) + test.run() diff --git a/src/Distributed/MpiMessageBuilder.f90 b/src/Distributed/MpiMessageBuilder.f90 index 8c9be363329..d987dbe8365 100644 --- a/src/Distributed/MpiMessageBuilder.f90 +++ b/src/Distributed/MpiMessageBuilder.f90 @@ -635,14 +635,16 @@ function get_vdc_from_hdr(this, header) result(vdc) vdc => null() if (header%container_type == VDC_GWFMODEL_TYPE .or. & - header%container_type == VDC_GWTMODEL_TYPE) then + header%container_type == VDC_GWTMODEL_TYPE .or. & + header%container_type == VDC_GWEMODEL_TYPE) then do i = 1, size(this%vdc_models) vdc => this%vdc_models(i)%ptr if (vdc%id == header%id) return vdc => null() end do else if (header%container_type == VDC_GWFEXG_TYPE .or. & - header%container_type == VDC_GWTEXG_TYPE) then + header%container_type == VDC_GWTEXG_TYPE .or. & + header%container_type == VDC_GWEEXG_TYPE) then do i = 1, size(this%vdc_exchanges) vdc => this%vdc_exchanges(i)%ptr if (vdc%id == header%id) return diff --git a/src/Distributed/VirtualGweModel.f90 b/src/Distributed/VirtualGweModel.f90 index ef9c93cf696..53c824b46f2 100644 --- a/src/Distributed/VirtualGweModel.f90 +++ b/src/Distributed/VirtualGweModel.f90 @@ -139,6 +139,7 @@ subroutine vgwe_prepare_stage(this, stage) call this%map(this%cnd_ath2%base(), nr_nodes, (/STG_BFR_CON_AR/)) call this%map(this%cnd_atv%base(), nr_nodes, (/STG_BFR_CON_AR/)) call this%map(this%cnd_ktw%base(), nr_nodes, (/STG_BFR_CON_AR/)) + call this%map(this%cnd_kts%base(), nr_nodes, (/STG_BFR_CON_AR/)) end if call this%map(this%fmi_gwfhead%base(), nr_nodes, (/STG_BFR_EXG_AD/)) diff --git a/src/SimulationCreate.f90 b/src/SimulationCreate.f90 index 7f514fefbb2..bdfc505d6c9 100644 --- a/src/SimulationCreate.f90 +++ b/src/SimulationCreate.f90 @@ -861,12 +861,12 @@ subroutine create_load_balance(mranks) integer(I4B), dimension(:) :: mranks ! local integer(I4B) :: im, imm, ie, ip, cnt - integer(I4B) :: nr_models, nr_gwf_models, nr_gwt_models + integer(I4B) :: nr_models, nr_gwf_models integer(I4B) :: nr_exchanges integer(I4B) :: min_per_proc, nr_left integer(I4B) :: rank integer(I4B), dimension(:), allocatable :: nr_models_proc - character(len=:), allocatable :: model_type_str + character(len=LENPACKAGETYPE) :: model_type_str character(len=LINELENGTH) :: errmsg character(len=LENMEMPATH) :: input_mempath type(CharacterStringType), dimension(:), contiguous, & @@ -894,18 +894,21 @@ subroutine create_load_balance(mranks) ! count flow models nr_models = size(mnames) nr_gwf_models = 0 - nr_gwt_models = 0 do im = 1, nr_models if (mtypes(im) == 'GWF6') then nr_gwf_models = nr_gwf_models + 1 - else if (mtypes(im) == 'GWT6') then - nr_gwt_models = nr_gwt_models + 1 - else - model_type_str = mtypes(im) - write (errmsg, *) 'Model type ', model_type_str, & - ' not supported in parallel mode.' - call store_error(errmsg, terminate=.true.) end if + + if (mtypes(im) == 'GWF6' .or. & + mtypes(im) == 'GWT6' .or. & + mtypes(im) == 'GWE6') then + cycle + end if + + model_type_str = mtypes(im) + write (errmsg, *) 'Model type ', model_type_str, & + ' not supported in parallel mode.' + call store_error(errmsg, terminate=.true.) end do ! calculate nr of flow models for each rank @@ -933,29 +936,44 @@ subroutine create_load_balance(mranks) end if end do - ! match transport to flow + ! match other models to flow nr_exchanges = size(etypes) - do im = 1, nr_models - if (.not. mtypes(im) == 'GWT6') cycle - - ! find match - do ie = 1, nr_exchanges - if (etypes(ie) == 'GWF6-GWT6' .and. mnames(im) == emnames_b(ie)) then - ! this is the exchange, now find the flow model's rank - rank = 0 - do imm = 1, nr_models - if (mnames(imm) == emnames_a(ie)) then - rank = mranks(imm) - exit - end if - end do + if (mtypes(im) == 'GWT6') then + + ! find match + do ie = 1, nr_exchanges + if (etypes(ie) == 'GWF6-GWT6' .and. mnames(im) == emnames_b(ie)) then + rank = 0 + do imm = 1, nr_models + if (mnames(imm) == emnames_a(ie)) then + rank = mranks(imm) + exit + end if + end do + mranks(im) = rank + exit + end if + end do - ! we have our rank, assign and go to next transport model - mranks(im) = rank - exit - end if - end do + else if (mtypes(im) == 'GWE6') then + do ie = 1, nr_exchanges + if (etypes(ie) == 'GWF6-GWE6' .and. mnames(im) == emnames_b(ie)) then + rank = 0 + do imm = 1, nr_models + if (mnames(imm) == emnames_a(ie)) then + rank = mranks(imm) + exit + end if + end do + mranks(im) = rank + exit + end if + end do + + else + cycle ! e.g., for a flow model + end if end do ! cleanup From 78fcadeaf5cd280549bf576019966b80c0a68ae5 Mon Sep 17 00:00:00 2001 From: mjr-deltares <45555666+mjr-deltares@users.noreply.github.com> Date: Wed, 6 Mar 2024 10:17:31 -0500 Subject: [PATCH 047/199] fix(buy): coupled GWF models with BUY require interface model (#1657) * - coupled gwf with buy requires interface model * - update makefile * - update makefile --- autotest/test_gwf_ifmod_buy.py | 37 +++++++++------ autotest/test_gwt_henry_gwtgwt.py | 1 - make/makefile | 76 +++++++++++++++---------------- src/Exchange/exg-gwfgwf.f90 | 12 ++++- 4 files changed, 73 insertions(+), 53 deletions(-) diff --git a/autotest/test_gwf_ifmod_buy.py b/autotest/test_gwf_ifmod_buy.py index 0f0bfa5df4d..6446779680e 100644 --- a/autotest/test_gwf_ifmod_buy.py +++ b/autotest/test_gwf_ifmod_buy.py @@ -45,7 +45,7 @@ hclose_check = 1e-9 # model spatial discretization -nlay = 1 +nlay = 10 ncol = 10 ncol_left = 5 ncol_right = 5 @@ -62,7 +62,7 @@ shift_y = 0.0 # top/bot of the aquifer -tops = [0.0, -5.0] +tops = [0.0 - ilay * 5.0 for ilay in range(nlay + 1)] # hydraulic conductivity k11 = 10.0 @@ -75,10 +75,24 @@ h_start = -2.0 # head boundaries -left_chd = [[(0, irow, 0), h_left] for irow in range(nrow)] -right_chd = [[(0, irow, ncol - 1), h_right] for irow in range(nrow)] +left_chd = [ + [(ilay, irow, 0), h_left] for irow in range(nrow) for ilay in range(nlay) +] +right_chd = [ + [(ilay, irow, ncol - 1), h_right] + for irow in range(nrow) + for ilay in range(nlay) +] +right_chd_split = [ + [(ilay, irow, ncol_right - 1), h_right] + for irow in range(nrow) + for ilay in range(nlay) +] + chd_data = left_chd + right_chd chd_spd = {0: chd_data} +chd_spd_left = {0: left_chd} +chd_spd_right = {0: right_chd_split} # initial conc c_strt = 1.1 @@ -232,8 +246,6 @@ def add_refmodel(sim): def add_leftmodel(sim): - left_chd = [[(0, irow, 0), h_left] for irow in range(nrow)] - chd_spd_left = {0: left_chd} gwf = flopy.mf6.ModflowGwf(sim, modelname=mname_left, save_flows=True) dis = flopy.mf6.ModflowGwfdis( @@ -273,8 +285,6 @@ def add_leftmodel(sim): def add_rightmodel(sim): - right_chd = [[(0, irow, ncol_right - 1), h_right] for irow in range(nrow)] - chd_spd_right = {0: right_chd} gwf = flopy.mf6.ModflowGwf(sim, modelname=mname_right, save_flows=True) dis = flopy.mf6.ModflowGwfdis( @@ -320,8 +330,8 @@ def add_gwfexchange(sim): cdist = delr gwfgwf_data = [ [ - (0, irow, ncol_left - 1), - (0, irow, 0), + (ilay, irow, ncol_left - 1), + (ilay, irow, 0), 1, delr / 2.0, delr / 2.0, @@ -330,6 +340,7 @@ def add_gwfexchange(sim): cdist, ] for irow in range(nrow) + for ilay in range(nlay) ] gwfgwf = flopy.mf6.ModflowGwfgwf( sim, @@ -339,7 +350,6 @@ def add_gwfexchange(sim): exgmnameb=mname_right, exchangedata=gwfgwf_data, auxiliary=["ANGLDEGX", "CDIST"], - dev_interfacemodel_on=True, ) @@ -488,8 +498,8 @@ def add_gwtexchange(sim): cdist = delr gwtgwt_data = [ [ - (0, irow, ncol_left - 1), - (0, irow, 0), + (ilay, irow, ncol_left - 1), + (ilay, irow, 0), 1, delr / 2.0, delr / 2.0, @@ -498,6 +508,7 @@ def add_gwtexchange(sim): cdist, ] for irow in range(nrow) + for ilay in range(nlay) ] gwtgwt = flopy.mf6.ModflowGwtgwt( sim, diff --git a/autotest/test_gwt_henry_gwtgwt.py b/autotest/test_gwt_henry_gwtgwt.py index 362f627f525..356cc2a7d52 100644 --- a/autotest/test_gwt_henry_gwtgwt.py +++ b/autotest/test_gwt_henry_gwtgwt.py @@ -288,7 +288,6 @@ def build_models(idx, test): exchangedata=gwfgwf_data, auxiliary=["ANGLDEGX", "CDIST"], filename="leftright.gwfgwf", - dev_interfacemodel_on=True, ) # create transport models and GWT-GWT exchange diff --git a/make/makefile b/make/makefile index eca740dd8ec..b8f7aecc42d 100644 --- a/make/makefile +++ b/make/makefile @@ -1,46 +1,46 @@ -# makefile created by pymake (version 1.2.10.dev0) for the 'mf6' executable. +# makefile created by pymake (version 1.2.9.dev0) for the 'mf6' executable. include ./makedefaults # Define the source file directories SOURCEDIR1=../src -SOURCEDIR2=../src/Idm -SOURCEDIR3=../src/Idm/selector -SOURCEDIR4=../src/Exchange -SOURCEDIR5=../src/Distributed -SOURCEDIR6=../src/Solution -SOURCEDIR7=../src/Solution/LinearMethods -SOURCEDIR8=../src/Solution/ParticleTracker -SOURCEDIR9=../src/Solution/PETSc -SOURCEDIR10=../src/Timing -SOURCEDIR11=../src/Utilities -SOURCEDIR12=../src/Utilities/Idm -SOURCEDIR13=../src/Utilities/Idm/mf6blockfile -SOURCEDIR14=../src/Utilities/TimeSeries -SOURCEDIR15=../src/Utilities/Memory -SOURCEDIR16=../src/Utilities/OutputControl -SOURCEDIR17=../src/Utilities/ArrayRead -SOURCEDIR18=../src/Utilities/Libraries -SOURCEDIR19=../src/Utilities/Libraries/rcm -SOURCEDIR20=../src/Utilities/Libraries/blas -SOURCEDIR21=../src/Utilities/Libraries/sparskit2 -SOURCEDIR22=../src/Utilities/Libraries/daglib -SOURCEDIR23=../src/Utilities/Libraries/sparsekit -SOURCEDIR24=../src/Utilities/Vector -SOURCEDIR25=../src/Utilities/Matrix -SOURCEDIR26=../src/Utilities/Observation -SOURCEDIR27=../src/Model -SOURCEDIR28=../src/Model/Connection -SOURCEDIR29=../src/Model/ParticleTracking -SOURCEDIR30=../src/Model/SurfaceWaterFlow -SOURCEDIR31=../src/Model/GroundWaterTransport -SOURCEDIR32=../src/Model/ModelUtilities -SOURCEDIR33=../src/Model/GroundWaterFlow -SOURCEDIR34=../src/Model/Discretization -SOURCEDIR35=../src/Model/TransportModel -SOURCEDIR36=../src/Model/Geometry -SOURCEDIR37=../src/Model/GroundWaterEnergy +SOURCEDIR2=../src/Model +SOURCEDIR3=../src/Model/SurfaceWaterFlow +SOURCEDIR4=../src/Model/TransportModel +SOURCEDIR5=../src/Model/GroundWaterFlow +SOURCEDIR6=../src/Model/GroundWaterEnergy +SOURCEDIR7=../src/Model/Geometry +SOURCEDIR8=../src/Model/ParticleTracking +SOURCEDIR9=../src/Model/Discretization +SOURCEDIR10=../src/Model/ModelUtilities +SOURCEDIR11=../src/Model/GroundWaterTransport +SOURCEDIR12=../src/Model/Connection +SOURCEDIR13=../src/Idm +SOURCEDIR14=../src/Idm/selector +SOURCEDIR15=../src/Distributed +SOURCEDIR16=../src/Utilities +SOURCEDIR17=../src/Utilities/Idm +SOURCEDIR18=../src/Utilities/Idm/mf6blockfile +SOURCEDIR19=../src/Utilities/Vector +SOURCEDIR20=../src/Utilities/Matrix +SOURCEDIR21=../src/Utilities/Observation +SOURCEDIR22=../src/Utilities/ArrayRead +SOURCEDIR23=../src/Utilities/OutputControl +SOURCEDIR24=../src/Utilities/Libraries +SOURCEDIR25=../src/Utilities/Libraries/blas +SOURCEDIR26=../src/Utilities/Libraries/rcm +SOURCEDIR27=../src/Utilities/Libraries/sparsekit +SOURCEDIR28=../src/Utilities/Libraries/sparskit2 +SOURCEDIR29=../src/Utilities/Libraries/daglib +SOURCEDIR30=../src/Utilities/Memory +SOURCEDIR31=../src/Utilities/TimeSeries +SOURCEDIR32=../src/Timing +SOURCEDIR33=../src/Solution +SOURCEDIR34=../src/Solution/ParticleTracker +SOURCEDIR35=../src/Solution/PETSc +SOURCEDIR36=../src/Solution/LinearMethods +SOURCEDIR37=../src/Exchange VPATH = \ ${SOURCEDIR1} \ @@ -358,6 +358,7 @@ $(OBJDIR)/GridConnection.o \ $(OBJDIR)/DistributedVariable.o \ $(OBJDIR)/gwt.o \ $(OBJDIR)/gwf.o \ +$(OBJDIR)/VirtualGwfModel.o \ $(OBJDIR)/GwfExchangeMover.o \ $(OBJDIR)/gwe.o \ $(OBJDIR)/SerialRouter.o \ @@ -405,7 +406,6 @@ $(OBJDIR)/IdmMf6File.o \ $(OBJDIR)/ModelPackageInput.o \ $(OBJDIR)/VirtualGwtModel.o \ $(OBJDIR)/VirtualGwtExchange.o \ -$(OBJDIR)/VirtualGwfModel.o \ $(OBJDIR)/VirtualGwfExchange.o \ $(OBJDIR)/VirtualGweModel.o \ $(OBJDIR)/VirtualGweExchange.o \ diff --git a/src/Exchange/exg-gwfgwf.f90 b/src/Exchange/exg-gwfgwf.f90 index c501c52501f..7bb49d683be 100644 --- a/src/Exchange/exg-gwfgwf.f90 +++ b/src/Exchange/exg-gwfgwf.f90 @@ -2061,13 +2061,23 @@ end function gwf_gwf_connects_model !> @brief Should interface model be used for this exchange !< function use_interface_model(this) result(use_im) + use VirtualGwfModelModule, only: VirtualGwfModelType ! -- dummy class(GwfExchangeType) :: this !< GwfExchangeType ! -- return logical(LGP) :: use_im !< true when interface model should be used - ! + ! -- local + integer(I4B) :: inbuy_m1 + use_im = this%DisConnExchangeType%use_interface_model() use_im = use_im .or. (this%ixt3d > 0) + + inbuy_m1 = 0 + select type (m => this%v_model1) + class is (VirtualGwfModelType) + inbuy_m1 = m%inbuy%get() + end select + use_im = use_im .or. (inbuy_m1 > 0) ! ! -- Return return From fb24b2c38da4c30b92964ed238a4b3711ede51d0 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 6 Mar 2024 11:27:44 -0500 Subject: [PATCH 048/199] test(gwe/uze): relax sln comparison failing on ARM macs (#1658) --- autotest/test_gwe_uze00.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autotest/test_gwe_uze00.py b/autotest/test_gwe_uze00.py index 5ef6a0e885e..9fb9b6336c1 100644 --- a/autotest/test_gwe_uze00.py +++ b/autotest/test_gwe_uze00.py @@ -552,7 +552,7 @@ def check_output(idx, test): "Simulated fits to analytical solution are " "falling outside established bounds on day 100" ) - assert np.max(analytical_sln[100] - temps[100]) <= 0.10680304268, msg4 + assert np.max(analytical_sln[100] - temps[100]) <= 0.107, msg4 assert np.min(analytical_sln[100] - temps[100]) >= -0.20763221276, msg4 # If a plot is needed for visual inspection, change following if statement to "True" From 5a4d398e597bc0f60b4627540db83748efe2d3c4 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 6 Mar 2024 11:30:00 -0500 Subject: [PATCH 049/199] test(PRT): move import statements into check fns (#1660) * workaround for netcdf flopy branch not yet having PRT utils (needs rebase) * unblock mf6 netcdf work for mjreno --- autotest/test_prt_budget.py | 3 ++- autotest/test_prt_disv1.py | 3 ++- autotest/test_prt_exg.py | 3 ++- autotest/test_prt_fmi.py | 3 ++- autotest/test_prt_notebooks.py | 3 ++- autotest/test_prt_release_timing.py | 3 ++- autotest/test_prt_stop_zones.py | 3 ++- autotest/test_prt_track_events.py | 3 ++- autotest/test_prt_weak_sinks.py | 3 ++- 9 files changed, 18 insertions(+), 9 deletions(-) diff --git a/autotest/test_prt_budget.py b/autotest/test_prt_budget.py index 234811afca3..444abf99a29 100644 --- a/autotest/test_prt_budget.py +++ b/autotest/test_prt_budget.py @@ -14,7 +14,6 @@ import numpy as np import pandas as pd import pytest -from flopy.plot.plotutil import to_mp7_pathlines from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile from flopy.mf6.utils.postprocessing import get_structured_faceflows @@ -177,6 +176,8 @@ def build_models(idx, test): def check_output(idx, test): + from flopy.plot.plotutil import to_mp7_pathlines + name = test.name gwf_ws = test.workspace prt_ws = test.workspace / "prt" diff --git a/autotest/test_prt_disv1.py b/autotest/test_prt_disv1.py index 671530651af..25a830b3362 100644 --- a/autotest/test_prt_disv1.py +++ b/autotest/test_prt_disv1.py @@ -17,7 +17,6 @@ import numpy as np import pandas as pd import pytest -from flopy.plot.plotutil import to_mp7_pathlines from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile from flopy.utils.gridutil import get_disv_kwargs @@ -310,6 +309,8 @@ def build_models(idx, test): def check_output(idx, test): + from flopy.plot.plotutil import to_mp7_pathlines + name = test.name gwf_ws = test.workspace prt_ws = test.workspace / "prt" diff --git a/autotest/test_prt_exg.py b/autotest/test_prt_exg.py index db3dd407e4b..1e3a9fafdaa 100644 --- a/autotest/test_prt_exg.py +++ b/autotest/test_prt_exg.py @@ -21,7 +21,6 @@ import numpy as np import pandas as pd import pytest -from flopy.plot.plotutil import to_mp7_pathlines from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile from prt_test_utils import FlopyReadmeCase, check_budget_data, check_track_data @@ -166,6 +165,8 @@ def build_models(idx, test): def check_output(idx, test): + from flopy.plot.plotutil import to_mp7_pathlines + name = test.name gwf_ws = Path(test.workspace) mp7_ws = gwf_ws / "mp7" diff --git a/autotest/test_prt_fmi.py b/autotest/test_prt_fmi.py index 242f0d11c5f..bccb176639b 100644 --- a/autotest/test_prt_fmi.py +++ b/autotest/test_prt_fmi.py @@ -34,7 +34,6 @@ import numpy as np import pandas as pd import pytest -from flopy.plot.plotutil import to_mp7_pathlines from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile from prt_test_utils import ( @@ -210,6 +209,8 @@ def build_models(idx, test): def check_output(idx, test): + from flopy.plot.plotutil import to_mp7_pathlines + name = test.name gwf_ws = test.workspace prt_ws = test.workspace / "prt" diff --git a/autotest/test_prt_notebooks.py b/autotest/test_prt_notebooks.py index ae328857c62..d7d20a8fb44 100644 --- a/autotest/test_prt_notebooks.py +++ b/autotest/test_prt_notebooks.py @@ -9,7 +9,6 @@ import pandas as pd import pytest from flopy.mf6 import MFSimulation -from flopy.plot.plotutil import to_mp7_pathlines from flopy.utils import PathlineFile from modflow_devtools.misc import run_cmd, set_env @@ -41,6 +40,8 @@ def get_notebook_scripts(pattern=None, exclude=None): get_notebook_scripts(pattern="ex-prt", exclude=["ex-prt-mp7-p03"]), ) def test_notebooks(notebook, function_tmpdir, targets): + from flopy.plot.plotutil import to_mp7_pathlines + notebook = Path(notebook) # temporarily add testing binaries to PATH diff --git a/autotest/test_prt_release_timing.py b/autotest/test_prt_release_timing.py index a47fe6e611b..82f1d6d3965 100644 --- a/autotest/test_prt_release_timing.py +++ b/autotest/test_prt_release_timing.py @@ -34,7 +34,6 @@ import numpy as np import pandas as pd import pytest -from flopy.plot.plotutil import to_mp7_pathlines from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile from prt_test_utils import ( @@ -258,6 +257,8 @@ def build_models(idx, test, fraction): def check_output(idx, test, fraction): + from flopy.plot.plotutil import to_mp7_pathlines + name = test.name ws = test.workspace prt_ws = test.workspace / "prt" diff --git a/autotest/test_prt_stop_zones.py b/autotest/test_prt_stop_zones.py index 5765a36d8af..aef6fe3bc8b 100644 --- a/autotest/test_prt_stop_zones.py +++ b/autotest/test_prt_stop_zones.py @@ -30,7 +30,6 @@ import numpy as np import pandas as pd import pytest -from flopy.plot.plotutil import to_mp7_pathlines from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile from matplotlib.collections import LineCollection @@ -219,6 +218,8 @@ def build_models(idx, test): def check_output(idx, test): + from flopy.plot.plotutil import to_mp7_pathlines + name = test.name gwf_ws = test.workspace prt_ws = test.workspace / "prt" diff --git a/autotest/test_prt_track_events.py b/autotest/test_prt_track_events.py index 45c9c5f7ecb..1c16253bcbd 100644 --- a/autotest/test_prt_track_events.py +++ b/autotest/test_prt_track_events.py @@ -31,7 +31,6 @@ import numpy as np import pandas as pd import pytest -from flopy.plot.plotutil import to_mp7_pathlines from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile from prt_test_utils import ( @@ -307,6 +306,8 @@ def build_models(idx, test): def check_output(idx, test): + from flopy.plot.plotutil import to_mp7_pathlines + name = test.name gwf_ws = test.workspace prt_ws = test.workspace / "prt" diff --git a/autotest/test_prt_weak_sinks.py b/autotest/test_prt_weak_sinks.py index 6f420a40ce0..5ed9ee5a4e5 100644 --- a/autotest/test_prt_weak_sinks.py +++ b/autotest/test_prt_weak_sinks.py @@ -31,7 +31,6 @@ import numpy as np import pandas as pd import pytest -from flopy.plot.plotutil import to_mp7_pathlines from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile from prt_test_utils import ( @@ -209,6 +208,8 @@ def build_models(idx, test): def check_output(idx, test): + from flopy.plot.plotutil import to_mp7_pathlines + name = test.name gwf_ws = test.workspace prt_ws = test.workspace / "prt" From adce9119046e5a95c3e53f476b23fd16de463d32 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 6 Mar 2024 11:40:50 -0500 Subject: [PATCH 050/199] ci: don't test large models with ifx (#1661) --- .github/workflows/large.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/large.yml b/.github/workflows/large.yml index 578a07559f4..df917faf865 100644 --- a/.github/workflows/large.yml +++ b/.github/workflows/large.yml @@ -38,8 +38,6 @@ jobs: include: - {compiler: gcc, version: 13, repo: examples} - {compiler: gcc, version: 13, repo: largetestmodels} - - {compiler: intel, version: 2022.2.1, repo: examples} - - {compiler: intel, version: 2022.2.1, repo: largetestmodels} - {compiler: intel-classic, version: 2021.6, repo: examples} - {compiler: intel-classic, version: 2021.6, repo: largetestmodels} defaults: From 668b8d26c466ff199c1427cb63972f083dd5f033 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Wed, 6 Mar 2024 16:21:52 -0500 Subject: [PATCH 051/199] fix(disl): copy disl%reach_bottom into disbase%bot (#1662) * does not account yet for idomain --- src/Model/SurfaceWaterFlow/swf-disl.f90 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Model/SurfaceWaterFlow/swf-disl.f90 b/src/Model/SurfaceWaterFlow/swf-disl.f90 index 304e5b0babb..7b75220ac7b 100644 --- a/src/Model/SurfaceWaterFlow/swf-disl.f90 +++ b/src/Model/SurfaceWaterFlow/swf-disl.f90 @@ -685,6 +685,11 @@ subroutine grid_finalize(this) node = node + 1 end do end if + ! + ! -- Move reach_bottom into bot + do node = 1, this%nodesuser + this%bot(node) = this%reach_bottom(node) + end do ! -- Return return From 26eb1efce5009fb6f018a5f4d6bccaaca789668e Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Thu, 7 Mar 2024 14:12:59 -0500 Subject: [PATCH 052/199] test(gwe): New autotest for GWE that will facilitate additional parallel testing of GWE (#1659) * test(gwe): New autotest for GWE that will facilitate additional parallel testing of GWE * get more info on why autotests are hanging & hanging * Forgot to turn off the plotting --- autotest/test_gwe_esl_analyt_sln.py | 6 +- autotest/test_gwe_split_analyt.py | 681 ++++++++++++++++++++++++++++ 2 files changed, 685 insertions(+), 2 deletions(-) create mode 100644 autotest/test_gwe_split_analyt.py diff --git a/autotest/test_gwe_esl_analyt_sln.py b/autotest/test_gwe_esl_analyt_sln.py index 8d39c6416a3..38f835d139c 100644 --- a/autotest/test_gwe_esl_analyt_sln.py +++ b/autotest/test_gwe_esl_analyt_sln.py @@ -6,7 +6,9 @@ (ESL) package. Basic model set up is below, with a slab of unit thickness (1.0 m) that is 100 m "deep" with energy being loaded on right side. Temperature will begin to rise on the right and propagate to the left. There are - no sinks in this first example. + no sinks in this first example. The titles that follow, for example + "Section 43, case x" refer to specific analytical solutions found in Carslaw & + Jaeger (1947) Section 43, case i: ------------------- @@ -149,7 +151,7 @@ def calc_ener_input(primer_val): # Define function to solve analytical solution -# Function names derive from equation numbers in Techniques and Methdos +# Function names derive from equation numbers in Techniques and Methods def build_models(idx, test, ener_input): diff --git a/autotest/test_gwe_split_analyt.py b/autotest/test_gwe_split_analyt.py new file mode 100644 index 00000000000..5d8d9b16516 --- /dev/null +++ b/autotest/test_gwe_split_analyt.py @@ -0,0 +1,681 @@ +""" + An analytical solution provided by Carslaw & Jaeger (1947) and discussed in + accompanying Techniques & Methods report. + + Energy is added to the right hand side boundary using the energy source loading + (ESL) package. Basic model set up is below, with a slab of unit thickness + (1.0 m) that is 100 m "deep" with energy being loaded on right side. + Temperature will begin to rise on the right and propagate to the left. There are + no sinks in this first example. The titles that follow, for example + "Section 43, case x" refer to specific analytical solutions found in Carslaw & + Jaeger (1947) + + Section 43, case i: + ------------------- + + | <--------- 5 m ----------> | | <--------- 5 m ----------> | + + +--------------------------------+ +--------------------------------+ + | Initial temperature = T_0 | <-exchange-> | Initial temperature = T_0 | <-- *ESL + +--------------------------------+ +--------------------------------+ + ^ * ESL: Energy Source Loading Boundary + | + No heat-flow boundary + + + Section 43, case ii: + -------------------- + + | <--------- 5 m ----------> | | <--------- 5 m ----------> | + + +--------------------------------+ +--------------------------------+ + | Initial temperature = T_0 | <-exchange-> | Initial temperature = T_0 | <-- *ESL + +--------------------------------+ +--------------------------------+ + ^ * ESL: Energy Source Loading Boundary + | + Specified temperature boundary, T_0 + + + Section 43, case iii: + --------------------- + + +--------------------------------+ +--------------------------------+ +CTP -> | Initial temperature = T_0 | <-exchange-> | Initial temperature = T_0 | <-- CTP = T_0 + = T_0 +--------------------------------+ +--------------------------------+ + \--------------------------------/ \--------------------------------/ + | | + Uniform, constant heat production throughout the slab + + Specified temperature boundary, T_0 + +""" + +import os +import math +import pytest +import flopy +import numpy as np +import matplotlib.pyplot as plt + +from framework import TestFramework + +# Parameters that vary by scenario +cases = ["eslcasei", "eslcaseii", "eslcaseiii"] +perlen = {0: [100, 900], 1: [100, 9900], 2: [100, 900]} +nstp = [100, 900] +tsmult = [ + [1.0, 1.0], + [1.0, 1.0], + [1.0, 1.0], +] + +T_0 = 0.0 # Initial temperature in all scenarios. +# Additionally serves as the CTP bnd temperature in scenarios ii and iii + +xt3d = [True] +scheme = "UPSTREAM" + +# Parameters for tdis package + +# Model parameters + +# Slab thickness +el = 10.0 # meters + +# Cell dimensions +nlay, nrow, ncol = 1, 1, 500 +delc = 1.0 +delz = 1.0 +delr = el / (ncol * 2) + +top = 1.0 +laytyp = 1 +strt = 0.0 +ss = 0.0 +sy = 0.1 +botm = [0.0] +strt = 0.0 +hnoflo = 1e30 +hdry = -1e30 +hk = 1.0 +alh = 0.0 +alv = 0.0 +ath1 = 0.0 +atv = 0.0 +lhv = 2454.0 + +# Solver parameters +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-6, 1e-6, 1.0 + +# Boundary condition (same for all scenarios +chd_perdat = {0: [[(0, 0, 0), 0.0000000], [(0, 0, ncol - 1), 0.0000000]]} + +# The following lists the parameter used in generating an analytical solution +# for comparing the MF6 solution to. + +# Density of the solids +rhos = 2700.0 # kg/m^3 + +# Density of water +rhow = 1000.0 # kg/m^3 + +# Heat capacity of the solids +Cps = 703.7 # J / (kg * C) + +# Heat capacity of water +Cpw = 4183.0 # J / (kg * C) + +# "Bulk" thermal conductivity +# For this problem, K_t_bulk represents the thermal conductivity of the +# solid material only since the problem represents a dry slab +Kts = 0.2700 * 86400 # * 1e8 # J / (day * m * C) +Ktw = 0.5918 * 86400 # J / (day * m * C) + +# Amount of saturation in a cell (cells are dry in this example) +Sw = 0.0 # dimensionless + +# Define porosity +theta = 0.1 # dimensionless + +# Equation 4-6 (for now anyway) +K_t_bulk = Sw * theta * Ktw + (1 - theta) * Kts + +# Eqn 7-4: Bulk specific heat on a per volume basis +rho_C_bulk = Sw * theta * rhow * Cpw + (1 - theta) * rhos * Cps + +# Eqn 7-3: Bulk thermal diffusivity +D = K_t_bulk / rho_C_bulk + + +# Energy input to boundary (q_x term in the documentation) +def calc_ener_input(primer_val): + ener_add_rate = delr * delc * delz * rho_C_bulk * primer_val + return ener_add_rate + + +# Define function to solve analytical solution +def assemble_half_model( + idx, test, ener_input, side="right", sim=None, imsgwf=None, imsgwe=None +): + + name = cases[idx] + "-" + side[0] + + # Build MODFLOW 6 files + ws = test.workspace + if sim is None: + sim = flopy.mf6.MFSimulation( + sim_name=name, version="mf6", exe_name="mf6", sim_ws=ws + ) + + # Create tdis package + tdis_rc = [] + for i in range(len(perlen[idx])): + tdis_rc.append((perlen[idx][i], nstp[i], tsmult[idx][i])) + + flopy.mf6.ModflowTdis( + sim, time_units="DAYS", nper=len(perlen[idx]), perioddata=tdis_rc + ) + + # Create GWF model + gwfname = "gwf-" + name + gwf = flopy.mf6.MFModel( + sim, + model_type="gwf6", + modelname=gwfname, + model_nam_file=f"{gwfname}.nam", + ) + gwf.name_file.save_flows = True + + # Create iterative model solution and register the gwf model with it + if imsgwf is None: + imsgwf = 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, + filename=f"{gwfname}.ims", + ) + sim.register_ims_package(imsgwf, [gwf.name]) + + xorigin = 0.0 + if side == "right": + xorigin = ncol * delr + + # Discretization package + flopy.mf6.ModflowGwfdis( + gwf, + xorigin=xorigin, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=np.ones((nlay, nrow, ncol), dtype=int), + pname="DIS-GWF-" + side[0], + filename=f"{gwfname}.dis", + ) + + # Initial conditions + flopy.mf6.ModflowGwfic( + gwf, strt=strt, pname="IC-" + side[0], filename=f"{gwfname}.ic" + ) + + # Node property flow + flopy.mf6.ModflowGwfnpf( + gwf, + save_specific_discharge=True, + icelltype=laytyp, + k=hk, + k33=hk, + pname="NPF-" + side[0], + filename=f"{gwfname}.npf", + ) + + # Instantiating MODFLOW 6 storage package + flopy.mf6.ModflowGwfsto( + gwf, + ss=ss, + sy=sy, + iconvert=1, + steady_state=False, + transient=True, + pname="STO-" + side[0], + filename="{}.sto".format(gwfname), + ) + + # Constant head files + chd = None + # chd = flopy.mf6.ModflowGwfchd( + # gwf, + # maxbound=len(chd_perdat[0]), + # stress_period_data=chd_perdat, + # save_flows=False, + # pname="CHD-" + side[0], + # filename=f"{gwfname}.chd" + # ) + + # Output control + flopy.mf6.ModflowGwfoc( + gwf, + pname="OC-" + side[0], + budget_filerecord=f"{gwfname}.cbc", + head_filerecord=f"{gwfname}.hds", + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + printrecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + filename=f"{gwfname}.oc", + ) + + # ----------------- + # Create GWE model + # ----------------- + + gwename = "gwe-" + name + gwe = flopy.mf6.MFModel( + sim, + model_type="gwe6", + modelname=gwename, + model_nam_file=f"{gwename}.nam", + ) + gwe.name_file.save_flows = True + + # Create iterative model solution and register the gwt model with it + if imsgwe is None: + imsgwe = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename=f"{gwename}.ims", + ) + sim.register_ims_package(imsgwe, [gwe.name]) + + flopy.mf6.ModflowGwedis( + gwe, + xorigin=xorigin, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + idomain=1, + pname="DIS-" + side[0], + filename=f"{gwename}.dis", + ) + + # Initial conditions + flopy.mf6.ModflowGweic( + gwe, strt=T_0, pname="IC-" + side[0], filename=f"{gwename}.ic" + ) + + # Advection + flopy.mf6.ModflowGweadv( + gwe, scheme=scheme, pname="ADV-" + side[0], filename=f"{gwename}.adv" + ) + + # Heat conduction + flopy.mf6.ModflowGwecnd( + gwe, + alh=alh, + alv=alv, + ath1=ath1, + atv=atv, + ktw=Ktw, + kts=Kts, + pname="CND-" + side[0], + filename="{}.cnd".format(gwename), + ) + + flopy.mf6.ModflowGweest( + gwe, + porosity=theta, + cps=Cps, + rhos=rhos, + packagedata=[Cpw, rhow, lhv], + pname="EST-" + side[0], + filename="{}.est".format(gwename), + ) + + # Constant temperature goes on the left side of the left model + # Note: Implementation of the CTP boundary depends on which analytical sln is in view + # See notes at top of script regarding scenarios + if side == "left": + if idx > 0: + ctp = {0: [[(0, 0, 0), T_0]]} + + flopy.mf6.ModflowGwectp( + gwe, + maxbound=len(ctp), + stress_period_data=ctp, + save_flows=True, + pname="CTP-" + side[0], + filename=f"{gwename}.ctp", + ) + + if side == "right": + if idx == 2: + ctp = {0: [[(0, 0, ncol - 1), T_0]]} + + flopy.mf6.ModflowGwectp( + gwe, + maxbound=len(ctp), + stress_period_data=ctp, + save_flows=True, + pname="CTP-" + side[0], + filename=f"{gwename}.ctp", + ) + + # Instantiate energy source loading (ESL) package + esrc = None + if idx < 2: + if side == "right": + esrc = {0: [[(0, 0, ncol - 1), ener_input]]} + + elif idx == 2: # do this for both models + esrcs = [] + for j in np.arange(ncol): + esrcs.append([(0, 0, j), ener_input]) + esrc = {0: esrcs} + + if esrc is not None: + flopy.mf6.ModflowGweesl( + gwe, + maxbound=len(esrc[0]), + stress_period_data=esrc, + save_flows=False, + pname="ESL-" + side[0], + filename=f"{gwename}.esl", + ) + + # Sources + if chd is not None: + flopy.mf6.ModflowGwessm( + gwe, + sources=[[]], + pname="SSM-" + side[0], + filename=f"{gwename}.ssm", + ) + + # Output control + flopy.mf6.ModflowGweoc( + gwe, + pname="OC-" + side[0], + budget_filerecord=f"{gwename}.cbc", + temperature_filerecord=f"{gwename}.ucn", + temperatureprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], + printrecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], + filename=f"{gwename}.oc", + ) + + # GWF-GWE exchange + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname, + exgmnameb=gwename, + filename=f"{name}.gwfgwe", + ) + + return sim, imsgwf, imsgwe + + +def build_models(idx, test, ener_input): + # left model + sim, imsgwf, imsgwe = assemble_half_model( + idx, test, ener_input, side="left" + ) + sim, imsgwf, imsgwe = assemble_half_model( + idx, + test, + ener_input, + side="right", + sim=sim, + imsgwf=imsgwf, + imsgwe=imsgwe, + ) + + all_mod_names = sim.model_names + + # link up gwf-gwf and gwe-gwe + gwf_mod_names = [nm for nm in all_mod_names if "gwf-" in nm] + gwe_mod_names = [nm for nm in all_mod_names if "gwe-" in nm] + + # Assert that the "left" model is listed first + assert ( + "-l" in gwf_mod_names[0] + ), "assumed gwf model order is not as expected" + assert ( + "-l" in gwe_mod_names[0] + ), "assumed gwe model order is not as expected" + + # Add the exchange data + exgdata = [ + ((0, 0, ncol - 1), (0, 0, 0), 1, delr / 2, delr / 2, delc, 0.0, delr) + ] + flopy.mf6.ModflowGwfgwf( + sim, + exgtype="GWF6-GWF6", + nexg=len(exgdata), + exgmnamea=gwf_mod_names[0], + exgmnameb=gwf_mod_names[1], + exchangedata=exgdata, + xt3d=xt3d[0], + print_flows=True, + auxiliary=["ANGLDEGX", "CDIST"], + filename="{}.gwfgwf".format("exchng"), + ) + + flopy.mf6.ModflowGwegwe( + sim, + exgtype="GWE6-GWE6", + gwfmodelname1=gwf_mod_names[0], + gwfmodelname2=gwf_mod_names[1], + adv_scheme=scheme, + nexg=len(exgdata), + exgmnamea=gwe_mod_names[0], + exgmnameb=gwe_mod_names[1], + exchangedata=exgdata, + auxiliary=["ANGLDEGX", "CDIST"], + filename="{}.gwegwe".format("exchng"), + ) + + return sim, None + + +def eq7_24(x, t, l, D, T_0, ener_add_rate): + # Compute corresponding x_hat term + x_hat = x / l # Dimensionless distance + + # Compute corresponding t_hat term + t_hat = D * t / l**2 # Dimensionless time + + # Solve equation 7-24 + term1 = (1 / 2) * (x_hat**2 - 1 / 3) + summation_terms = [ + ((-1) ** n) + / n**2 + * math.exp(-1 * n**2 * math.pi**2 * t_hat) + * math.cos(n * math.pi * x_hat) + for n in np.arange(1, 1000) + ] + term2 = 2 / (math.pi**2) * np.sum(summation_terms) + T = T_0 + ener_add_rate * l / K_t_bulk * (t_hat + term1 - term2) + + return T + + +def eq7_25(x, t, l, D, T_0, ener_add_rate): + # Compute corresponding x_hat term + x_hat = x / l # Dimensionless distance + + # Compute corresponding t_hat term + t_hat = D * t / l**2 # Dimensionless time + + # Solve equation 7-25 + summation_terms = [ + ((-1) ** n) + / (2 * n + 1) ** 2 + * math.exp(-1 * (2 * n + 1) ** 2 * math.pi**2 * t_hat / 4) + * math.sin((2 * n + 1) * math.pi * x_hat / 2) + for n in np.arange(0, 1000) + ] + term1 = (8 / math.pi**2) * np.sum(summation_terms) + + T = T_0 + ener_add_rate * l / K_t_bulk * (x_hat - term1) + + return T + + +def eq7_26(x, t, el, D, T_0, ener_add_rate): + # Compute corresponding x_hat term + x_hat = x / el # Dimensionless distance + + # Compute corresponding t_hat term + t_hat = D * t / el**2 # Dimensionless time + + # Solve equation 7-26 + term1 = x_hat * (1 - x_hat) + summation_terms = [ + 1 + / (2 * n + 1) ** 3 + * math.exp(-1 * (2 * n + 1) ** 2 * math.pi**2 * t_hat) + * math.sin((2 * n + 1) * math.pi * x_hat) + for n in np.arange(0, 1000) + ] + term2 = (8 / math.pi**3) * np.sum(summation_terms) + T = T_0 + 0.5 * ener_add_rate * el**2 / K_t_bulk * (term1 - term2) + + return T + + +def check_output(idx, test, ener_input): + name = test.name + gwename1 = "gwe-" + name + "-l" + gwename2 = "gwe-" + name + "-r" + + # left side + fpth1 = os.path.join(test.workspace, f"{gwename1}.ucn") + tobj1 = flopy.utils.HeadFile(fpth1, precision="double", text="TEMPERATURE") + sim_temps_l = tobj1.get_alldata() + + # right side + fpth2 = os.path.join(test.workspace, f"{gwename2}.ucn") + tobj2 = flopy.utils.HeadFile(fpth2, precision="double", text="TEMPERATURE") + sim_temps_r = tobj2.get_alldata() + + # stitch the left and right sides together + sim_temps = np.concatenate( + (sim_temps_l, sim_temps_r), axis=len(sim_temps_l.shape) - 1 + ) + + # Compare simulated output to analytical solutions (scenario dependent) + if idx < 2: + t_accumulate = 0.0 + area_input = delc * delz + ener_flux = ener_input / area_input + + for sp, t in enumerate(perlen[idx]): + # Time to solution + t_accumulate += t # days + + # Iterate over x which represents the cell centroid locations for which + # analytical solution is desired (cell centroid locations) + cell_centroids = [] + analytical_temps = [] + for x in np.arange(delr / 2, el + (delr / 2), delr): + cell_centroids.append(x) + if idx == 0: + T = eq7_24(x, t_accumulate, el, D, T_0, ener_flux) + elif idx == 1: + T = eq7_25(x, t_accumulate, el, D, T_0, ener_flux) + analytical_temps.append(T) + + analytical_temps = np.array(analytical_temps) + assert np.allclose( + analytical_temps, sim_temps[sp, 0, 0, :], atol=0.005 + ), "simulated solution is whacked" + # plt.plot(cell_centroids, analytical_temps, "r-", label="Analytical Solution") + # plt.plot(cell_centroids, sim_temps[sp, 0, 0, :], "b--", label="GWE") + # plt.axhline(0.0, color='black') + # plt.legend() + # plt.show() + + elif idx == 2: + + t_accumulate = 0.0 + ener_src = ener_input / (delr * delc * delz) + + for sp, t in enumerate(perlen[idx]): + # Time to solution + t_accumulate += t # days + + analytical_temps = [] + cell_centroids = [] + for x in np.arange(delr / 2, el + (delr / 2), delr): + cell_centroids.append(x) + T = eq7_26(x, t_accumulate, el - (delr * 2), D, T_0, ener_src) + analytical_temps.append(T) + + analytical_temps = np.array(analytical_temps) + if sp == 0: + atol = 0.16 + else: + atol = 0.47 + + assert np.allclose( + analytical_temps, sim_temps[sp, 0, 0, :], atol=atol + ), "simulated solution is whacked" + + # plt.plot( + # cell_centroids, + # analytical_temps, + # "r-", + # label="Analytical Solution", + # ) + # plt.plot( + # cell_centroids, sim_temps[sp, 0, 0, :], "b--", label="GWE" + # ) + # plt.axhline(0.0, color="black") + # plt.legend() + # plt.show() + + +# - No need to change any code below +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + if idx < 2: + ener_input = calc_ener_input(1.0) + elif idx == 2: + ener_input = calc_ener_input(0.1) + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t, ener_input), + check=lambda t: check_output(idx, t, ener_input), + ) + test.run() From af7e80b2e064f557e01bd9b11f69f106431b3f0a Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 7 Mar 2024 16:13:12 -0500 Subject: [PATCH 053/199] test(framework): fix workspace selection and comparison logic (#1664) * base workspace was selected where sim/model-specific workspace should have been * only collect expected output files if comparison is enabled * a lot of these complications will go away with snapshot testing --- autotest/framework.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/autotest/framework.py b/autotest/framework.py index dfc0fa8d366..c0142c3c5d7 100644 --- a/autotest/framework.py +++ b/autotest/framework.py @@ -304,9 +304,7 @@ def _compare_heads( cmp_namefile = ( None if "mf6" in self.compare or "libmf6" in self.compare - else os.path.basename(nf) - if nf - else None + else os.path.basename(nf) if nf else None ) if cmp_namefile is None: pth = None @@ -624,7 +622,7 @@ def _run_sim_or_model( try: success, buff = flopy.run_model( target, - self.workspace / "mfsim.nam", + workspace / "mfsim.nam", model_ws=workspace, report=True, ) @@ -742,13 +740,13 @@ def run(self): f"{'should have failed' if xfail else 'failed'}: {workspace}" ) - # get expected output files from main simulation - _, self.outp = get_mf6_files( - self.workspace / "mfsim.nam", self.verbose - ) - # setup and run comparison model(s), if enabled if self.compare: + # get expected output files from main simulation + _, self.outp = get_mf6_files( + self.workspace / "mfsim.nam", self.verbose + ) + # try to autodetect comparison type if enabled if self.compare == "auto": if self.verbose: From 2b39d4060548e1112a5bc0b84d2659d1c45182ba Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 7 Mar 2024 16:22:20 -0500 Subject: [PATCH 054/199] ci: support dir path in fortran style script (#1666) --- .github/common/update_fortran_style.py | 46 ++++++++++++++++++-------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/.github/common/update_fortran_style.py b/.github/common/update_fortran_style.py index 095a9fa4902..95b49a5c19c 100644 --- a/.github/common/update_fortran_style.py +++ b/.github/common/update_fortran_style.py @@ -1,6 +1,7 @@ import argparse import string from itertools import repeat +from multiprocessing import cpu_count, Pool from pathlib import Path from fprettify.fparse_utils import InputStream @@ -15,7 +16,7 @@ def join_comments(comments) -> str: class Rules: @staticmethod def separate_lines(path): - """Variables defined on separate lines""" + """Define dummy arguments, local variables, and procedure declarations on separate lines.""" flines = [] with open(path, "r") as f: @@ -63,7 +64,7 @@ def separate_lines(path): @staticmethod def trailing_returns(path): - """Remove return statements at the end of routines""" + """Remove return statements (and corresponding comments) at the end of routines.""" flines = [] with open(path, "r") as f: @@ -96,9 +97,10 @@ def trailing_returns(path): @staticmethod def cleanup_comments(path): """ - Remove comments on lines with only whitespace, remove '--' from the beginnings - of comments, make sure comment spacing is consistent (one space after '!'), - remove horizontal dividers consisting of '-' or '*', remove 'SPECIFICATION' + Remove empty comments (containing only '!', or '!' followed by some number of '-' or '='), + remove double dashes from beginnings of comments (e.g., '! -- comment' becomes '! comment'), + remove 'SPECIFICATION' comment lines, and make internal comment spacing consistent (one space + after '!' before text begins). """ flines = [] @@ -170,26 +172,42 @@ def reformat( action="store_true", default=True, required=False, - help="Define dummy arguments and local variables on separate lines.", + help="Define dummy arguments, local variables, and procedure declarations on separate lines.", ) parser.add_argument( "--trailing-returns", action="store_true", default=True, required=False, - help="Remove return statements at the end of routines.", + help="Remove return statements (and corresponding comments) at the end of routines.", ) parser.add_argument( "--cleanup-comments", action="store_true", default=True, required=False, - help="Remove empty comments (containing only '!', or '!' followed by some number of '-' or '='), remove double dashes from beginnings of comments (e.g., '! -- comment' becomes '! comment'), and make internal comment spacing consistent (one space after '!' before text begins).", + help="Remove empty comments (containing only '!', or '!' followed by some number of '-' or '='), remove double dashes from beginnings of comments (e.g., '! -- comment' becomes '! comment'), remove 'SPECIFICATION' comment lines, and make internal comment spacing consistent (one space after '!' before text begins).", ) args = parser.parse_args() - reformat( - path=Path(args.path).expanduser().absolute(), - separate_lines=args.separate_lines, - trailing_returns=args.trailing_returns, - cleanup_comments=args.cleanup_comments, - ) + + # parse path + path = Path(args.path).expanduser().absolute() + assert path.exists(), f"Path not found: {path}" + + # parse rules + sl = args.separate_lines + tr = args.trailing_returns + cc = args.cleanup_comments + + # reformat + if path.is_file(): + reformat( + path=Path(args.path).expanduser().absolute(), + separate_lines=sl, + trailing_returns=tr, + cleanup_comments=cc, + ) + else: + with Pool(cpu_count()) as pool: + files = [p for p in path.rglob("*.f90") if p.is_file()] + pool.starmap(reformat, [(f, sl, tr, cc) for f in files]) From f8885ecf0122ac1d44402aecf90fb78d37d4499c Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Fri, 8 Mar 2024 08:18:00 -0600 Subject: [PATCH 055/199] refactor(npf): remove mfnwt and mfusg development conductance options (#1655) * remove DEV_MODFLOWUSG_UPSTREAM_WEIGHTED_SATURATION option * exclude test models that use mfnwt or mfusg conductance options * add staggered_thkfrac function to containerize staggered logic * move conductance functions to GwfConductanceUtilsModule * use staggered_thkfrac function in gwe-cnd and gwt-dsp * add vscode task for rebuilding makefiles * remove saturation recalculation in HCOND for newton * modify test_gwe_drycell_cnd0.py to skip evaluation of first timestep * exclude test001d_Tnewton until v 6.5.0 is released * add ENUM for horizontal conductance options * add ENUM for 3-D cell connection types --- .vscode/tasks.json | 14 + autotest/test_gwe_drycell_cnd0.py | 3 +- autotest/test_testmodels_mf6.py | 11 + doc/mf6io/mf6ivar/dfn/gwf-npf.dfn | 18 - doc/mf6io/mf6ivar/md/mf6ivar.md | 2 - make/makedefaults | 2 +- make/makefile | 1 + msvs/mf6core.vfproj | 1 + src/Exchange/exg-gwfgwf.f90 | 28 +- src/Exchange/exg-swfgwf.f90 | 18 +- src/Idm/gwf-npfidm.f90 | 38 -- src/Model/GroundWaterEnergy/gwe-cnd.f90 | 16 +- src/Model/GroundWaterFlow/gwf-buy.f90 | 18 +- src/Model/GroundWaterFlow/gwf-npf.f90 | 591 +----------------- src/Model/GroundWaterTransport/gwt-dsp.f90 | 16 +- .../ModelUtilities/GwfConductanceUtils.f90 | 396 ++++++++++++ src/Utilities/Constants.f90 | 8 + src/meson.build | 1 + 18 files changed, 502 insertions(+), 680 deletions(-) create mode 100644 src/Model/ModelUtilities/GwfConductanceUtils.f90 diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 76f6cb2fe2d..c8285990d59 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -289,5 +289,19 @@ }, "problemMatcher": [] }, + { + "label": "Rebuild makefiles", + "type": "shell", + "command": "source activate modflow6; pwd; python build_makefiles.py", + "options": {"cwd": "${workspaceFolder}/distribution"}, + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "clear": true + }, + "problemMatcher": [] + }, ] } diff --git a/autotest/test_gwe_drycell_cnd0.py b/autotest/test_gwe_drycell_cnd0.py index 8ab3e9ac7e6..5a6e789e43d 100644 --- a/autotest/test_gwe_drycell_cnd0.py +++ b/autotest/test_gwe_drycell_cnd0.py @@ -194,7 +194,6 @@ def build_models(idx, test): icelltype=icelltype, k=k11, k33=k33, - alternative_cell_averaging="AMT-HMK", save_specific_discharge=True, pname="NPF-1", filename="{}.npf".format(gwfname), @@ -404,7 +403,7 @@ def check_output(idx, test): "Pass through cell should not be as warm as its neighbor to " "the left" ) - assert np.all(conc1[:, 0, 0, 2] > conc1[:, 0, 0, 3]), msg5 + assert np.all(conc1[1:, 0, 0, 2] > conc1[1:, 0, 0, 3]), msg5 # - No need to change any code below diff --git a/autotest/test_testmodels_mf6.py b/autotest/test_testmodels_mf6.py index 862170df23a..a40a5280000 100644 --- a/autotest/test_testmodels_mf6.py +++ b/autotest/test_testmodels_mf6.py @@ -17,6 +17,17 @@ "test004_bcfss", "test014_NWTP3Low_dev", "test041_flowdivert_nwt_dev", + # todo reinstate after 6.5.0 release + "test001d_Tnewton", + # remove tests with nwt usg conductance weighting + "test006_gwf3_gnc_nr_dev", + "test006_gwf3_nr_dev", + "test014_NWTP3High_dev", + "test015_KeatingLike_disu_dev", + "test041_flowdivert_nr_dev", + "test016_Keating_disu_dev", + "test053_npf-a-nwt_dev", + "test053_npf-b-nwt_dev", ] diff --git a/doc/mf6io/mf6ivar/dfn/gwf-npf.dfn b/doc/mf6io/mf6ivar/dfn/gwf-npf.dfn index ad824437ff1..8da4e40e484 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-npf.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-npf.dfn @@ -235,24 +235,6 @@ longname turn off Newton for unconfined cells description turn off Newton for unconfined cells mf6internal inewton -block options -name dev_modflowusg_upstream_weighted_saturation -type keyword -reader urword -optional true -longname use MODFLOW-USG upstream-weighted saturation approach -description use MODFLOW-USG upstream-weighted saturation approach -mf6internal iusgnrhc - -block options -name dev_modflownwt_upstream_weighting -type keyword -reader urword -optional true -longname use MODFLOW-NWT approach for upstream weighting -description use MODFLOW-NWT approach for upstream weighting -mf6internal inwtupw - block options name dev_omega type double precision diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 819e76ec545..703f0e87a49 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -255,8 +255,6 @@ | GWF | NPF | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | | GWF | NPF | OPTIONS | TVK6_FILENAME | STRING | defines a time-varying hydraulic conductivity (TVK) input file. Records in the TVK file can be used to change hydraulic conductivity properties at specified times or stress periods. | | GWF | NPF | OPTIONS | DEV_NO_NEWTON | KEYWORD | turn off Newton for unconfined cells | -| GWF | NPF | OPTIONS | DEV_MODFLOWUSG_UPSTREAM_WEIGHTED_SATURATION | KEYWORD | use MODFLOW-USG upstream-weighted saturation approach | -| GWF | NPF | OPTIONS | DEV_MODFLOWNWT_UPSTREAM_WEIGHTING | KEYWORD | use MODFLOW-NWT approach for upstream weighting | | GWF | NPF | OPTIONS | DEV_OMEGA | DOUBLE PRECISION | set saturation omega value | | GWF | NPF | GRIDDATA | ICELLTYPE | INTEGER (NODES) | flag for each cell that specifies how saturated thickness is treated. 0 means saturated thickness is held constant; $>$0 means saturated thickness varies with computed head when head is below the cell top; $<$0 means saturated thickness varies with computed head unless the THICKSTRT option is in effect. When THICKSTRT is in effect, a negative value for ICELLTYPE indicates that the saturated thickness value used in conductance calculations in the NPF Package will be computed as STRT-BOT and held constant. If the THICKSTRT option is not in effect, then negative values provided by the user for ICELLTYPE are automatically reassigned by the program to a value of one. | | GWF | NPF | GRIDDATA | K | DOUBLE PRECISION (NODES) | is the hydraulic conductivity. For the common case in which the user would like to specify the horizontal hydraulic conductivity and the vertical hydraulic conductivity, then K should be assigned as the horizontal hydraulic conductivity, K33 should be assigned as the vertical hydraulic conductivity, and K22 and the three rotation angles should not be specified. When more sophisticated anisotropy is required, then K corresponds to the K11 hydraulic conductivity axis. All included cells (IDOMAIN $>$ 0) must have a K value greater than zero. | diff --git a/make/makedefaults b/make/makedefaults index 995cca74c8a..88e1790887a 100644 --- a/make/makedefaults +++ b/make/makedefaults @@ -1,4 +1,4 @@ -# makedefaults created by pymake (version 1.2.10.dev0) for the 'mf6' executable. +# makedefaults created by pymake (version 1.2.9.dev0) for the 'mf6' executable. # determine OS ifeq ($(OS), Windows_NT) diff --git a/make/makefile b/make/makefile index b8f7aecc42d..09d4d953710 100644 --- a/make/makefile +++ b/make/makefile @@ -264,6 +264,7 @@ $(OBJDIR)/gwf-tvk.o \ $(OBJDIR)/HGeoUtil.o \ $(OBJDIR)/gwf-vsc.o \ $(OBJDIR)/GwfNpfOptions.o \ +$(OBJDIR)/GwfConductanceUtils.o \ $(OBJDIR)/InterfaceMap.o \ $(OBJDIR)/SeqVector.o \ $(OBJDIR)/ImsLinearSettings.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index dba032b5f44..f34e74acfb3 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -282,6 +282,7 @@ + diff --git a/src/Exchange/exg-gwfgwf.f90 b/src/Exchange/exg-gwfgwf.f90 index 7bb49d683be..84959af972d 100644 --- a/src/Exchange/exg-gwfgwf.f90 +++ b/src/Exchange/exg-gwfgwf.f90 @@ -513,7 +513,7 @@ end subroutine gwf_gwf_cf subroutine gwf_gwf_fc(this, kiter, matrix_sln, rhs_sln, inwtflag) ! -- modules use ConstantsModule, only: DHALF - use GwfNpfModule, only: hcond, vcond + use GwfConductanceUtilsModule, only: hcond, vcond ! -- dummy class(GwfExchangeType) :: this !< GwfExchangeType integer(I4B), intent(in) :: kiter @@ -787,11 +787,10 @@ end subroutine gwf_gwf_add_to_flowja subroutine gwf_gwf_set_flow_to_npf(this) ! -- modules use ConstantsModule, only: DZERO, DPIO180 - use GwfNpfModule, only: thksatnm + use GwfConductanceUtilsModule, only: thksatnm ! -- dummy class(GwfExchangeType) :: this !< GwfExchangeType ! -- local - integer(I4B) :: iusg integer(I4B) :: i integer(I4B) :: n1, n2 integer(I4B) :: ibdn1, ibdn2 @@ -814,9 +813,6 @@ subroutine gwf_gwf_set_flow_to_npf(this) if (this%gwfmodel1%npf%icalcspdis == 0 .and. & this%gwfmodel2%npf%icalcspdis == 0) return ! - ! -- initialize - iusg = 0 - ! ! -- Loop through all exchanges using the flow rate ! stored in simvals do i = 1, this%nexg @@ -860,8 +856,8 @@ subroutine gwf_gwf_set_flow_to_npf(this) ! ! -- Calculate the saturated thickness at interface between n1 and n2 thksat = thksatnm(ibdn1, ibdn2, ictn1, ictn2, this%inewton, ihc, & - iusg, hn1, hn2, satn1, satn2, & - topn1, topn2, botn1, botn2, this%satomega) + hn1, hn2, satn1, satn2, & + topn1, topn2, botn1, botn2) area = hwva * thksat end if ! @@ -1531,7 +1527,7 @@ end subroutine rewet subroutine calc_cond_sat(this) ! -- modules use ConstantsModule, only: LINELENGTH, DZERO, DHALF, DONE, DPIO180 - use GwfNpfModule, only: condmean, vcond, hcond + use GwfConductanceUtilsModule, only: condmean, vcond, hcond ! -- dummy class(GwfExchangeType) :: this !< GwfExchangeType ! -- local @@ -1601,13 +1597,13 @@ subroutine calc_cond_sat(this) end if ! fawidth = this%hwva(iexg) - csat = hcond(1, 1, 1, 1, this%inewton, 0, ihc, & - this%icellavg, 0, 0, DONE, & + csat = hcond(1, 1, 1, 1, 0, ihc, & + this%icellavg, DONE, & topn, topm, satn, satm, hyn, hym, & topn, topm, & botn, botm, & this%cl1(iexg), this%cl2(iexg), & - fawidth, this%satomega) + fawidth) end if ! ! -- store csat in condsat @@ -1625,7 +1621,7 @@ end subroutine calc_cond_sat subroutine condcalc(this) ! -- modules use ConstantsModule, only: DHALF, DZERO, DONE - use GwfNpfModule, only: hcond, vcond + use GwfConductanceUtilsModule, only: hcond, vcond ! -- dummy class(GwfExchangeType) :: this !< GwfExchangeType ! -- local @@ -1698,10 +1694,10 @@ subroutine condcalc(this) end if ! fawidth = this%hwva(iexg) - cond = hcond(ibdn, ibdm, ictn, ictm, this%inewton, this%inewton, & - this%ihc(iexg), this%icellavg, 0, 0, this%condsat(iexg), & + cond = hcond(ibdn, ibdm, ictn, ictm, this%inewton, & + this%ihc(iexg), this%icellavg, this%condsat(iexg), & hn, hm, satn, satm, hyn, hym, topn, topm, botn, botm, & - this%cl1(iexg), this%cl2(iexg), fawidth, this%satomega) + this%cl1(iexg), this%cl2(iexg), fawidth) end if ! this%cond(iexg) = cond diff --git a/src/Exchange/exg-swfgwf.f90 b/src/Exchange/exg-swfgwf.f90 index 96bfdc42c72..85cbca147bf 100644 --- a/src/Exchange/exg-swfgwf.f90 +++ b/src/Exchange/exg-swfgwf.f90 @@ -1679,7 +1679,7 @@ end module SwfGwfExchangeModule ! subroutine swf_gwf_fc(this, kiter, matrix_sln, rhs_sln, inwtflag) ! ! -- modules ! use ConstantsModule, only: DHALF -! use GwfNpfModule, only: hcond, vcond +! use GwfConductanceUtilsModule, only: hcond, vcond ! ! -- dummy ! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType ! integer(I4B), intent(in) :: kiter @@ -1949,7 +1949,7 @@ end module SwfGwfExchangeModule ! subroutine swf_gwf_set_flow_to_npf(this) ! ! -- modules ! use ConstantsModule, only: DZERO, DPIO180 -! use GwfNpfModule, only: thksatnm +! use GwfConductanceUtilsModule, only: thksatnm ! ! -- dummy ! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType ! ! -- local @@ -2023,7 +2023,7 @@ end module SwfGwfExchangeModule ! ! ! -- Calculate the saturated thickness at interface between n1 and n2 ! ! thksat = thksatnm(ibdn1, ibdn2, ictn1, ictn2, this%inewton, ihc, & ! ! iusg, hn1, hn2, satn1, satn2, & -! ! topn1, topn2, botn1, botn2, this%satomega) +! ! topn1, topn2, botn1, botn2) ! ! area = hwva * thksat ! ! end if ! ! ! @@ -2688,7 +2688,7 @@ end module SwfGwfExchangeModule ! subroutine calc_cond_sat(this) ! ! -- modules ! use ConstantsModule, only: LINELENGTH, DZERO, DHALF, DONE, DPIO180 -! use GwfNpfModule, only: condmean, vcond, hcond +! use GwfConductanceUtilsModule, only: condmean, vcond, hcond ! ! -- dummy ! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType ! ! -- local @@ -2758,13 +2758,13 @@ end module SwfGwfExchangeModule ! end if ! ! ! fawidth = this%hwva(iexg) -! csat = hcond(1, 1, 1, 1, this%inewton, 0, ihc, & +! csat = hcond(1, 1, 1, 1, 0, ihc, & ! this%icellavg, 0, 0, DONE, & ! topn, topm, satn, satm, hyn, hym, & ! topn, topm, & ! botn, botm, & ! this%cl1(iexg), this%cl2(iexg), & -! fawidth, this%satomega) +! fawidth) ! end if ! ! ! ! -- store csat in condsat @@ -2782,7 +2782,7 @@ end module SwfGwfExchangeModule ! subroutine condcalc(this) ! ! -- modules ! use ConstantsModule, only: DHALF, DZERO, DONE -! use GwfNpfModule, only: hcond, vcond +! use GwfConductanceUtilsModule, only: hcond, vcond ! ! -- dummy ! class(SwfGwfExchangeType) :: this !< SwfGwfExchangeType ! ! -- local @@ -2855,10 +2855,10 @@ end module SwfGwfExchangeModule ! ! end if ! ! ! ! ! fawidth = this%hwva(iexg) -! ! cond = hcond(ibdn, ibdm, ictn, ictm, this%inewton, this%inewton, & +! ! cond = hcond(ibdn, ibdm, ictn, ictm, this%inewton, & ! ! this%ihc(iexg), this%icellavg, 0, 0, this%condsat(iexg), & ! ! hn, hm, satn, satm, hyn, hym, topn, topm, botn, botm, & -! ! this%cl1(iexg), this%cl2(iexg), fawidth, this%satomega) +! ! this%cl1(iexg), this%cl2(iexg), fawidth) ! end if ! ! ! this%cond(iexg) = cond diff --git a/src/Idm/gwf-npfidm.f90 b/src/Idm/gwf-npfidm.f90 index efe934efb3a..1915c11a9f3 100644 --- a/src/Idm/gwf-npfidm.f90 +++ b/src/Idm/gwf-npfidm.f90 @@ -36,8 +36,6 @@ module GwfNpfInputModule logical :: filein = .false. logical :: tvk6_filename = .false. logical :: inewton = .false. - logical :: iusgnrhc = .false. - logical :: inwtupw = .false. logical :: satomega = .false. logical :: icelltype = .false. logical :: k = .false. @@ -476,40 +474,6 @@ module GwfNpfInputModule .false. & ! timeseries ) - type(InputParamDefinitionType), parameter :: & - gwfnpf_iusgnrhc = InputParamDefinitionType & - ( & - 'GWF', & ! component - 'NPF', & ! subcomponent - 'OPTIONS', & ! block - 'DEV_MODFLOWUSG_UPSTREAM_WEIGHTED_SATURATION', & ! tag name - 'IUSGNRHC', & ! fortran variable - 'KEYWORD', & ! type - '', & ! shape - .false., & ! required - .false., & ! multi-record - .false., & ! preserve case - .false., & ! layered - .false. & ! timeseries - ) - - type(InputParamDefinitionType), parameter :: & - gwfnpf_inwtupw = InputParamDefinitionType & - ( & - 'GWF', & ! component - 'NPF', & ! subcomponent - 'OPTIONS', & ! block - 'DEV_MODFLOWNWT_UPSTREAM_WEIGHTING', & ! tag name - 'INWTUPW', & ! fortran variable - 'KEYWORD', & ! type - '', & ! shape - .false., & ! required - .false., & ! multi-record - .false., & ! preserve case - .false., & ! layered - .false. & ! timeseries - ) - type(InputParamDefinitionType), parameter :: & gwfnpf_satomega = InputParamDefinitionType & ( & @@ -691,8 +655,6 @@ module GwfNpfInputModule gwfnpf_filein, & gwfnpf_tvk6_filename, & gwfnpf_inewton, & - gwfnpf_iusgnrhc, & - gwfnpf_inwtupw, & gwfnpf_satomega, & gwfnpf_icelltype, & gwfnpf_k, & diff --git a/src/Model/GroundWaterEnergy/gwe-cnd.f90 b/src/Model/GroundWaterEnergy/gwe-cnd.f90 index f678e9fe99b..3c930e6f739 100644 --- a/src/Model/GroundWaterEnergy/gwe-cnd.f90 +++ b/src/Model/GroundWaterEnergy/gwe-cnd.f90 @@ -810,6 +810,7 @@ end subroutine calcdispellipse subroutine calcdispcoef(this) ! -- modules use HGeoUtilModule, only: hyeff + use GwfConductanceUtilsModule, only: staggered_thkfrac ! -- dummy class(GweCndType) :: this ! -- local @@ -820,7 +821,7 @@ subroutine calcdispcoef(this) integer(I4B) :: iavgmeth real(DP) :: satn, satm, topn, topm, botn, botm real(DP) :: hwva, cond, cn, cm, denom - real(DP) :: anm, amn, thksatn, thksatm, sill_top, sill_bot, tpn, tpm + real(DP) :: anm, amn, thksatn, thksatm ! ! -- set iavgmeth = 1 to use arithmetic averaging for effective dispersion iavgmeth = 1 @@ -893,17 +894,14 @@ subroutine calcdispcoef(this) else ! ! -- horizontal conductance - thksatn = (topn - botn) * satn - thksatm = (topm - botm) * satm ! ! -- handle vertically staggered case if (ihc == 2) then - sill_top = min(topn, topm) - sill_bot = max(botn, botm) - tpn = botn + thksatn - tpm = botm + thksatm - thksatn = max(min(tpn, sill_top) - sill_bot, DZERO) - thksatm = max(min(tpm, sill_top) - sill_bot, DZERO) + thksatn = staggered_thkfrac(topn, botn, satn, topm, botm) + thksatm = staggered_thkfrac(topm, botm, satm, topn, botn) + else + thksatn = (topn - botn) * satn + thksatm = (topm - botm) * satm end if ! ! -- calculate the saturated area term diff --git a/src/Model/GroundWaterFlow/gwf-buy.f90 b/src/Model/GroundWaterFlow/gwf-buy.f90 index 24095275200..6cca69d1d95 100644 --- a/src/Model/GroundWaterFlow/gwf-buy.f90 +++ b/src/Model/GroundWaterFlow/gwf-buy.f90 @@ -1171,7 +1171,7 @@ end subroutine set_packagedata !< subroutine calcbuy(this, n, m, icon, hn, hm, buy) ! -- modules - use GwfNpfModule, only: hcond, vcond + use GwfConductanceUtilsModule, only: hcond, vcond ! -- dummy class(GwfBuyType) :: this integer(I4B), intent(in) :: n @@ -1232,9 +1232,9 @@ subroutine calcbuy(this, n, m, icon, hn, hm, buy) else cond = hcond(this%ibound(n), this%ibound(m), & this%npf%icelltype(n), this%npf%icelltype(m), & - this%npf%inewton, this%npf%inewton, & + this%npf%inewton, & this%dis%con%ihc(this%dis%con%jas(icon)), & - this%npf%icellavg, this%npf%iusgnrhc, this%npf%inwtupw, & + this%npf%icellavg, & this%npf%condsat(this%dis%con%jas(icon)), & hn, hm, this%npf%sat(n), this%npf%sat(m), & hyn, hym, & @@ -1242,8 +1242,7 @@ subroutine calcbuy(this, n, m, icon, hn, hm, buy) this%dis%bot(n), this%dis%bot(m), & this%dis%con%cl1(this%dis%con%jas(icon)), & this%dis%con%cl2(this%dis%con%jas(icon)), & - this%dis%con%hwva(this%dis%con%jas(icon)), & - this%npf%satomega) + this%dis%con%hwva(this%dis%con%jas(icon))) end if ! ! -- Calculate buoyancy term @@ -1257,7 +1256,7 @@ end subroutine calcbuy !< subroutine calchhterms(this, n, m, icon, hn, hm, rhsterm, amatnn, amatnm) ! -- modules - use GwfNpfModule, only: hcond, vcond + use GwfConductanceUtilsModule, only: hcond, vcond ! -- dummy class(GwfBuyType) :: this integer(I4B), intent(in) :: n @@ -1315,9 +1314,9 @@ subroutine calchhterms(this, n, m, icon, hn, hm, rhsterm, amatnn, amatnm) else cond = hcond(this%ibound(n), this%ibound(m), & this%npf%icelltype(n), this%npf%icelltype(m), & - this%npf%inewton, this%npf%inewton, & + this%npf%inewton, & this%dis%con%ihc(this%dis%con%jas(icon)), & - this%npf%icellavg, this%npf%iusgnrhc, this%npf%inwtupw, & + this%npf%icellavg, & this%npf%condsat(this%dis%con%jas(icon)), & hn, hm, this%npf%sat(n), this%npf%sat(m), & hyn, hym, & @@ -1325,8 +1324,7 @@ subroutine calchhterms(this, n, m, icon, hn, hm, rhsterm, amatnn, amatnm) this%dis%bot(n), this%dis%bot(m), & this%dis%con%cl1(this%dis%con%jas(icon)), & this%dis%con%cl2(this%dis%con%jas(icon)), & - this%dis%con%hwva(this%dis%con%jas(icon)), & - this%npf%satomega) + this%dis%con%hwva(this%dis%con%jas(icon))) end if ! ! -- Calculate terms diff --git a/src/Model/GroundWaterFlow/gwf-npf.f90 b/src/Model/GroundWaterFlow/gwf-npf.f90 index b0686214689..8c62e6d67a3 100644 --- a/src/Model/GroundWaterFlow/gwf-npf.f90 +++ b/src/Model/GroundWaterFlow/gwf-npf.f90 @@ -3,9 +3,9 @@ module GwfNpfModule use SimVariablesModule, only: errmsg use ConstantsModule, only: DZERO, DEM9, DEM8, DEM7, DEM6, DEM2, & DHALF, DP9, DONE, DTWO, & - DLNLOW, DLNHIGH, & DHNOFLO, DHDRY, DEM10, & - LENMEMPATH, LENVARNAME, LINELENGTH + LENMEMPATH, LENVARNAME, LINELENGTH, & + C3D_VERTICAL use SmoothingModule, only: sQuadraticSaturation, & sQuadraticSaturationDerivative use NumericalPackageModule, only: NumericalPackageType @@ -21,16 +21,15 @@ module GwfNpfModule mem_reassignptr use MatrixBaseModule use HGeoUtilModule, only: hyeff + use GwfConductanceUtilsModule, only: hcond, vcond, & + condmean, thksatnm, & + CCOND_HMEAN implicit none private public :: GwfNpfType public :: npf_cr - public :: hcond - public :: vcond - public :: condmean - public :: thksatnm type, extends(NumericalPackageType) :: GwfNpfType @@ -48,8 +47,6 @@ module GwfNpfModule integer(I4B), pointer :: idewatcv => null() !< CV may be a discontinuous function of water table integer(I4B), pointer :: ithickstrt => null() !< thickstrt option flag integer(I4B), pointer :: igwfnewtonur => null() !< newton head dampening using node bottom option flag - integer(I4B), pointer :: iusgnrhc => null() !< MODFLOW-USG saturation calculation option flag - integer(I4B), pointer :: inwtupw => null() !< MODFLOW-NWT upstream weighting option flag integer(I4B), pointer :: icalcspdis => null() !< Calculate specific discharge at cell centers integer(I4B), pointer :: isavspdis => null() !< Save specific discharge at cell centers integer(I4B), pointer :: isavsat => null() !< Save sat to budget file @@ -501,7 +498,6 @@ subroutine npf_fc(this, kiter, matrix_sln, idxglo, rhs, hnew) if (this%ixt3d /= 0) then call this%xt3d%xt3d_fc(kiter, matrix_sln, idxglo, rhs, hnew) else - ! do n = 1, this%dis%nodes do ii = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1 if (this%dis%con%mask(ii) == 0) cycle @@ -516,7 +512,7 @@ subroutine npf_fc(this, kiter, matrix_sln, idxglo, rhs, hnew) hym = this%hy_eff(m, n, ihc, ipos=ii) ! ! -- Vertical connection - if (ihc == 0) then + if (ihc == C3D_VERTICAL) then ! ! -- Calculate vertical conductance cond = vcond(this%ibound(n), this%ibound(m), & @@ -555,17 +551,16 @@ subroutine npf_fc(this, kiter, matrix_sln, idxglo, rhs, hnew) ! -- Horizontal conductance cond = hcond(this%ibound(n), this%ibound(m), & this%icelltype(n), this%icelltype(m), & - this%inewton, this%inewton, & + this%inewton, & this%dis%con%ihc(this%dis%con%jas(ii)), & - this%icellavg, this%iusgnrhc, this%inwtupw, & + this%icellavg, & this%condsat(this%dis%con%jas(ii)), & hnew(n), hnew(m), this%sat(n), this%sat(m), hyn, hym, & this%dis%top(n), this%dis%top(m), & this%dis%bot(n), this%dis%bot(m), & this%dis%con%cl1(this%dis%con%jas(ii)), & this%dis%con%cl2(this%dis%con%jas(ii)), & - this%dis%con%hwva(this%dis%con%jas(ii)), & - this%satomega) + this%dis%con%hwva(this%dis%con%jas(ii))) end if ! ! -- Fill row n @@ -609,11 +604,8 @@ subroutine npf_fn(this, kiter, matrix_sln, idxglo, rhs, hnew) real(DP) :: derv real(DP) :: hds real(DP) :: term - real(DP) :: afac real(DP) :: topup real(DP) :: botup - real(DP) :: topdn - real(DP) :: botdn ! ! -- add newton terms to solution matrix nodes = this%dis%nodes @@ -657,15 +649,6 @@ subroutine npf_fn(this, kiter, matrix_sln, idxglo, rhs, hnew) ! get saturated conductivity for derivative cond = this%condsat(this%dis%con%jas(ii)) ! - ! -- if using MODFLOW-NWT upstream weighting option apply - ! factor to remove average thickness - if (this%inwtupw /= 0) then - topdn = this%dis%top(idn) - botdn = this%dis%bot(idn) - afac = DTWO / (DONE + (topdn - botdn) / (topup - botup)) - cond = cond * afac - end if - ! ! compute additional term consterm = -cond * (hnew(iups) - hnew(idn)) !needs to use hwadi instead of hnew(idn) !filledterm = cond @@ -854,7 +837,7 @@ subroutine sgwf_npf_qcalc(this, n, m, hn, hm, icon, qnm) hym = this%hy_eff(m, n, ihc, ipos=icon) ! ! -- Calculate conductance - if (ihc == 0) then + if (ihc == C3D_VERTICAL) then condnm = vcond(this%ibound(n), this%ibound(m), & this%icelltype(n), this%icelltype(m), this%inewton, & this%ivarcv, this%idewatcv, & @@ -867,17 +850,16 @@ subroutine sgwf_npf_qcalc(this, n, m, hn, hm, icon, qnm) else condnm = hcond(this%ibound(n), this%ibound(m), & this%icelltype(n), this%icelltype(m), & - this%inewton, this%inewton, & + this%inewton, & this%dis%con%ihc(this%dis%con%jas(icon)), & - this%icellavg, this%iusgnrhc, this%inwtupw, & + this%icellavg, & this%condsat(this%dis%con%jas(icon)), & hn, hm, this%sat(n), this%sat(m), hyn, hym, & this%dis%top(n), this%dis%top(m), & this%dis%bot(n), this%dis%bot(m), & this%dis%con%cl1(this%dis%con%jas(icon)), & this%dis%con%cl2(this%dis%con%jas(icon)), & - this%dis%con%hwva(this%dis%con%jas(icon)), & - this%satomega) + this%dis%con%hwva(this%dis%con%jas(icon))) end if ! ! -- Initialize hntemp and hmtemp @@ -1028,8 +1010,6 @@ subroutine npf_da(this) call mem_deallocate(this%ivarcv) call mem_deallocate(this%idewatcv) call mem_deallocate(this%ithickstrt) - call mem_deallocate(this%iusgnrhc) - call mem_deallocate(this%inwtupw) call mem_deallocate(this%isavspdis) call mem_deallocate(this%isavsat) call mem_deallocate(this%icalcspdis) @@ -1111,8 +1091,6 @@ subroutine allocate_scalars(this) call mem_allocate(this%ivarcv, 'IVARCV', this%memoryPath) call mem_allocate(this%idewatcv, 'IDEWATCV', this%memoryPath) call mem_allocate(this%ithickstrt, 'ITHICKSTRT', this%memoryPath) - call mem_allocate(this%iusgnrhc, 'IUSGNRHC', this%memoryPath) - call mem_allocate(this%inwtupw, 'INWTUPW', this%memoryPath) call mem_allocate(this%icalcspdis, 'ICALCSPDIS', this%memoryPath) call mem_allocate(this%isavspdis, 'ISAVSPDIS', this%memoryPath) call mem_allocate(this%isavsat, 'ISAVSAT', this%memoryPath) @@ -1142,7 +1120,7 @@ subroutine allocate_scalars(this) this%satomega = DZERO this%hnoflo = DHNOFLO !1.d30 this%hdry = DHDRY !-1.d30 - this%icellavg = 0 + this%icellavg = CCOND_HMEAN this%iavgkeff = 0 this%ik22 = 0 this%ik33 = 0 @@ -1152,8 +1130,6 @@ subroutine allocate_scalars(this) this%ivarcv = 0 this%idewatcv = 0 this%ithickstrt = 0 - this%iusgnrhc = 0 - this%inwtupw = 0 this%icalcspdis = 0 this%isavspdis = 0 this%isavsat = 0 @@ -1325,12 +1301,6 @@ subroutine log_options(this, found) if (found%inewton) & write (this%iout, '(4x,a)') 'NEWTON-RAPHSON method disabled for unconfined & &cells' - if (found%iusgnrhc) & - write (this%iout, '(4x,a)') 'MODFLOW-USG saturation calculation method & - &will be used' - if (found%inwtupw) & - write (this%iout, '(4x,a)') 'MODFLOW-NWT upstream weighting method will be & - &used' if (found%satomega) & write (this%iout, '(4x,a,1pg15.6)') 'Saturation omega: ', this%satomega if (found%irewet) & @@ -1391,9 +1361,6 @@ subroutine source_options(this) call mem_set_value(this%ik33overk, 'IK33OVERK', this%input_mempath, & found%ik33overk) call mem_set_value(this%inewton, 'INEWTON', this%input_mempath, found%inewton) - call mem_set_value(this%iusgnrhc, 'IUSGNRHC', this%input_mempath, & - found%iusgnrhc) - call mem_set_value(this%inwtupw, 'INWTUPW', this%input_mempath, found%inwtupw) call mem_set_value(this%satomega, 'SATOMEGA', this%input_mempath, & found%satomega) call mem_set_value(this%irewet, 'IREWET', this%input_mempath, found%irewet) @@ -1462,47 +1429,6 @@ subroutine check_options(this) ! -- dummy class(GwfNpftype) :: this ! - ! -- check if this%iusgnrhc has been enabled for a model that is not using - ! the Newton-Raphson formulation - if (this%iusgnrhc > 0 .and. this%inewton == 0) then - this%iusgnrhc = 0 - write (this%iout, '(4x,a,3(1x,a))') & - '****WARNING. MODFLOW-USG saturation calculation not needed', & - 'for a model that is using the standard conductance formulation.', & - 'Resetting DEV_MODFLOWUSG_UPSTREAM_WEIGHTED_SATURATION OPTION from', & - '1 to 0.' - end if - ! - ! -- check that the this%inwtupw option is not specified for non-newton - ! models - if (this%inwtupw /= 0 .and. this%inewton == 0) then - this%inwtupw = 0 - write (this%iout, '(4x,a,3(1x,a))') & - '****WARNING. The DEV_MODFLOWNWT_UPSTREAM_WEIGHTING option has', & - 'been specified for a model that is using the standard conductance', & - 'formulation. Resetting DEV_MODFLOWNWT_UPSTREAM_WEIGHTING OPTION from', & - '1 to 0.' - end if - ! - ! -- check that the transmissivity weighting functions are not specified with - ! with the this%inwtupw option - if (this%inwtupw /= 0 .and. this%icellavg < 2) then - write (errmsg, '(a,2(1x,a))') & - 'THE DEV_MODFLOWNWT_UPSTREAM_WEIGHTING OPTION CAN', & - 'ONLY BE SPECIFIED WITH THE AMT-LMK AND AMT-HMK', & - 'ALTERNATIVE_CELL_AVERAGING OPTIONS IN THE NPF PACKAGE.' - call store_error(errmsg) - end if - ! - ! -- check that this%iusgnrhc and this%inwtupw have not both been enabled - if (this%iusgnrhc /= 0 .and. this%inwtupw /= 0) then - write (errmsg, '(a,2(1x,a))') & - 'THE DEV_MODFLOWUSG_UPSTREAM_WEIGHTED_SATURATION', & - 'AND DEV_MODFLOWNWT_UPSTREAM_WEIGHTING OPTIONS CANNOT BE', & - 'SPECIFIED IN THE SAME NPF PACKAGE.' - call store_error(errmsg) - end if - ! ! -- set omega value used for saturation calculations if (this%inewton > 0) then this%satomega = DEM6 @@ -2135,7 +2061,7 @@ subroutine calc_condsat(this, node, upperOnly) ! ! -- Calculate conductance depending on whether connection is ! vertical (0), horizontal (1), or staggered horizontal (2) - if (ihc == 0) then + if (ihc == C3D_VERTICAL) then ! ! -- Vertical conductance for fully saturated conditions csat = vcond(1, 1, 1, 1, 0, 1, 1, DONE, & @@ -2149,16 +2075,16 @@ subroutine calc_condsat(this, node, upperOnly) ! ! -- Horizontal conductance for fully saturated conditions fawidth = this%dis%con%hwva(jj) - csat = hcond(1, 1, 1, 1, this%inewton, 0, & + csat = hcond(1, 1, 1, 1, 0, & ihc, & - this%icellavg, this%iusgnrhc, this%inwtupw, & + this%icellavg, & DONE, & hn, hm, satn, satm, hyn, hym, & topn, topm, & botn, botm, & this%dis%con%cl1(jj), & this%dis%con%cl2(jj), & - fawidth, this%satomega) + fawidth) end if this%condsat(jj) = csat end do @@ -2331,7 +2257,7 @@ subroutine rewet_check(this, kiter, node, hm, ibdm, ihc, hnew, irewet) ! ! -- Check head in adjacent cells to see if wetting elevation has ! been reached - if (ihc == 0) then + if (ihc == C3D_VERTICAL) then ! ! -- check cell below if (ibdm > 0 .and. hm >= turnon) irewet = 1 @@ -2446,7 +2372,7 @@ function hy_eff(this, n, m, ihc, ipos, vg) result(hy) ! ! -- Calculate effective K based on whether connection is vertical ! or horizontal - if (ihc == 0) then + if (ihc == C3D_VERTICAL) then ! ! -- Handle rotated anisotropy case that would affect the effective ! vertical hydraulic conductivity @@ -2499,352 +2425,6 @@ function hy_eff(this, n, m, ihc, ipos, vg) result(hy) return end function hy_eff - !> @brief Horizontal conductance between two cells - !! - !! inwtup: if 1, then upstream-weight condsat, otherwise recalculate - !! - !! This function uses a weighted transmissivity in the harmonic mean - !! conductance calculations. This differs from the MODFLOW-NWT and - !! MODFLOW-USG conductance calculations for the Newton-Raphson formulation - !! which use a weighted hydraulic conductivity. - !< - function hcond(ibdn, ibdm, ictn, ictm, inewton, inwtup, ihc, icellavg, iusg, & - iupw, condsat, hn, hm, satn, satm, hkn, hkm, topn, topm, & - botn, botm, cln, clm, fawidth, satomega) & - result(condnm) - ! -- return - real(DP) :: condnm - ! -- dummy - integer(I4B), intent(in) :: ibdn - integer(I4B), intent(in) :: ibdm - integer(I4B), intent(in) :: ictn - integer(I4B), intent(in) :: ictm - integer(I4B), intent(in) :: inewton - integer(I4B), intent(in) :: inwtup - integer(I4B), intent(in) :: ihc - integer(I4B), intent(in) :: icellavg - integer(I4B), intent(in) :: iusg - integer(I4B), intent(in) :: iupw - real(DP), intent(in) :: condsat - real(DP), intent(in) :: hn - real(DP), intent(in) :: hm - real(DP), intent(in) :: satn - real(DP), intent(in) :: satm - real(DP), intent(in) :: hkn - real(DP), intent(in) :: hkm - real(DP), intent(in) :: topn - real(DP), intent(in) :: topm - real(DP), intent(in) :: botn - real(DP), intent(in) :: botm - real(DP), intent(in) :: cln - real(DP), intent(in) :: clm - real(DP), intent(in) :: fawidth - real(DP), intent(in) :: satomega - ! -- local - integer(I4B) :: indk - real(DP) :: sn - real(DP) :: sm - real(DP) :: thksatn - real(DP) :: thksatm - real(DP) :: sill_top, sill_bot - real(DP) :: tpn, tpm - real(DP) :: top, bot - real(DP) :: athk - real(DP) :: afac - ! - ! -- If either n or m is inactive then conductance is zero - if (ibdn == 0 .or. ibdm == 0) then - condnm = DZERO - ! - ! -- if both cells are non-convertible then use condsat - elseif (ictn == 0 .and. ictm == 0) then - if (icellavg /= 4) then - condnm = condsat - else - if (hn > hm) then - condnm = satn * (topn - botn) - else - condnm = satm * (topm - botm) - end if - condnm = condnm * condsat - end if - ! - ! -- At least one of the cells is convertible, so calculate average saturated - ! thickness and multiply with saturated conductance - else - if (inwtup == 1) then - ! -- set flag use to determine if bottom of cells n and m are - ! significantly different - indk = 0 - if (abs(botm - botn) < DEM2) indk = 1 - ! -- recalculate saturation if using MODFLOW-USG saturation - ! calculation approach - if (iusg == 1 .and. indk == 0) then - if (botm > botn) then - top = topm - bot = botm - else - top = topn - bot = botn - end if - sn = sQuadraticSaturation(top, bot, hn, satomega) - sm = sQuadraticSaturation(top, bot, hm, satomega) - else - sn = sQuadraticSaturation(topn, botn, hn, satomega) - sm = sQuadraticSaturation(topm, botm, hm, satomega) - end if - ! - if (hn > hm) then - condnm = sn - else - condnm = sm - end if - ! - ! -- if using MODFLOW-NWT upstream weighting option apply - ! factor to remove average thickness - if (iupw /= 0) then - if (hn > hm) then - afac = DTWO / (DONE + (topm - botm) / (topn - botn)) - condnm = condnm * afac - else - afac = DTWO / (DONE + (topn - botn) / (topm - botm)) - condnm = condnm * afac - end if - end if - ! - ! -- multiply condsat by condnm factor - condnm = condnm * condsat - else - thksatn = satn * (topn - botn) - thksatm = satm * (topm - botm) - ! - ! -- If staggered connection, subtract parts of cell that are above and - ! below the sill top and bottom elevations - if (ihc == 2) then - ! - ! -- Calculate sill_top and sill_bot - sill_top = min(topn, topm) - sill_bot = max(botn, botm) - ! - ! -- Calculate tpn and tpm - tpn = botn + thksatn - tpm = botm + thksatm - ! - ! -- Calculate saturated thickness for cells n and m - thksatn = max(min(tpn, sill_top) - sill_bot, DZERO) - thksatm = max(min(tpm, sill_top) - sill_bot, DZERO) - end if - ! - athk = DONE - if (iusg == 1) then - if (ihc == 2) then - athk = min(thksatn, thksatm) - else - athk = DHALF * (thksatn + thksatm) - end if - thksatn = DONE - thksatm = DONE - end if - ! - condnm = condmean(hkn, hkm, thksatn, thksatm, cln, clm, & - fawidth, icellavg) * athk - end if - end if - ! - ! -- Return - return - end function hcond - - !> @brief Vertical conductance between two cells - !< - function vcond(ibdn, ibdm, ictn, ictm, inewton, ivarcv, idewatcv, & - condsat, hn, hm, vkn, vkm, satn, satm, topn, topm, botn, & - botm, flowarea) result(condnm) - ! -- return - real(DP) :: condnm - ! -- dummy - integer(I4B), intent(in) :: ibdn - integer(I4B), intent(in) :: ibdm - integer(I4B), intent(in) :: ictn - integer(I4B), intent(in) :: ictm - integer(I4B), intent(in) :: inewton - integer(I4B), intent(in) :: ivarcv - integer(I4B), intent(in) :: idewatcv - real(DP), intent(in) :: condsat - real(DP), intent(in) :: hn - real(DP), intent(in) :: hm - real(DP), intent(in) :: vkn - real(DP), intent(in) :: vkm - real(DP), intent(in) :: satn - real(DP), intent(in) :: satm - real(DP), intent(in) :: topn - real(DP), intent(in) :: topm - real(DP), intent(in) :: botn - real(DP), intent(in) :: botm - real(DP), intent(in) :: flowarea - ! -- local - real(DP) :: satntmp, satmtmp - real(DP) :: bovk1 - real(DP) :: bovk2 - real(DP) :: denom - ! - ! -- If either n or m is inactive then conductance is zero - if (ibdn == 0 .or. ibdm == 0) then - condnm = DZERO - ! - ! -- if constantcv then use condsat - elseif (ivarcv == 0) then - condnm = condsat - ! - ! -- if both cells are non-convertible then use condsat - elseif (ictn == 0 .and. ictm == 0) then - condnm = condsat - ! - ! -- if both cells are fully saturated then use condsat - elseif (hn >= topn .and. hm >= topm) then - condnm = condsat - ! - ! -- At least one cell is partially saturated, so recalculate vertical - ! -- conductance for this connection - ! -- todo: upstream weighting? - else - ! - ! -- Default is for CV correction (dewatered option); use underlying - ! saturation of 1. - satntmp = satn - satmtmp = satm - if (idewatcv == 0) then - if (botn > botm) then - ! -- n is above m - satmtmp = DONE - else - ! -- m is above n - satntmp = DONE - end if - end if - bovk1 = satntmp * (topn - botn) * DHALF / vkn - bovk2 = satmtmp * (topm - botm) * DHALF / vkm - denom = (bovk1 + bovk2) - if (denom /= DZERO) then - condnm = flowarea / denom - else - condnm = DZERO - end if - end if - ! - ! -- Return - return - end function vcond - - !> @brief Calculate the conductance between two cells - !! - !! k1 is hydraulic conductivity for cell 1 (in the direction of cell2) - !! k2 is hydraulic conductivity for cell 2 (in the direction of cell1) - !! thick1 is the saturated thickness for cell 1 - !! thick2 is the saturated thickness for cell 2 - !! cl1 is the distance from the center of cell1 to the shared face with cell2 - !! cl2 is the distance from the center of cell2 to the shared face with cell1 - !! h1 is the head for cell1 - !! h2 is the head for cell2 - !! width is the width perpendicular to flow - !! iavgmeth is the averaging method: - !! 0 is harmonic averaging - !! 1 is logarithmic averaging - !! 2 is arithmetic averaging of sat thickness and logarithmic averaging of - !! hydraulic conductivity - !! 3 is arithmetic averaging of sat thickness and harmonic averaging of - !! hydraulic conductivity - !< - function condmean(k1, k2, thick1, thick2, cl1, cl2, width, iavgmeth) - ! -- return - real(DP) :: condmean - ! -- dummy - real(DP), intent(in) :: k1 - real(DP), intent(in) :: k2 - real(DP), intent(in) :: thick1 - real(DP), intent(in) :: thick2 - real(DP), intent(in) :: cl1 - real(DP), intent(in) :: cl2 - real(DP), intent(in) :: width - integer(I4B), intent(in) :: iavgmeth - ! -- local - real(DP) :: t1 - real(DP) :: t2 - real(DP) :: tmean, kmean, denom - ! - ! -- Initialize - t1 = k1 * thick1 - t2 = k2 * thick2 - ! - ! -- Averaging - select case (iavgmeth) - ! - ! -- Harmonic-mean method - case (0) - ! - if (t1 * t2 > DZERO) then - condmean = width * t1 * t2 / (t1 * cl2 + t2 * cl1) - else - condmean = DZERO - end if - ! - ! -- Logarithmic-mean method - case (1) - if (t1 * t2 > DZERO) then - tmean = logmean(t1, t2) - else - tmean = DZERO - end if - condmean = tmean * width / (cl1 + cl2) - ! - ! -- Arithmetic-mean thickness and logarithmic-mean hydraulic conductivity - case (2) - if (k1 * k2 > DZERO) then - kmean = logmean(k1, k2) - else - kmean = DZERO - end if - condmean = kmean * DHALF * (thick1 + thick2) * width / (cl1 + cl2) - ! - ! -- Arithmetic-mean thickness and harmonic-mean hydraulic conductivity - case (3) - denom = (k1 * cl2 + k2 * cl1) - if (denom > DZERO) then - kmean = k1 * k2 / denom - else - kmean = DZERO - end if - condmean = kmean * DHALF * (thick1 + thick2) * width - end select - ! - ! -- Return - return - end function condmean - - !> @brief Calculate the the logarithmic mean of two double precision numbers - !! - !! Use an approximation if the ratio is near 1 - !< - function logmean(d1, d2) - ! -- return - real(DP) :: logmean - ! -- dummy - real(DP), intent(in) :: d1 - real(DP), intent(in) :: d2 - ! -- local - real(DP) :: drat - ! - drat = d2 / d1 - if (drat <= DLNLOW .or. drat >= DLNHIGH) then - logmean = (d2 - d1) / log(drat) - else - logmean = DHALF * (d1 + d2) - end if - ! - ! -- Return - return - end function logmean - !> @brief Calculate the 3 conmponents of specific discharge at the cell center !< subroutine calc_spdis(this, flowja) @@ -2954,7 +2534,7 @@ subroutine calc_spdis(this, flowja) isympos = this%dis%con%jas(ipos) ihc = this%dis%con%ihc(isympos) area = this%dis%con%hwva(isympos) - if (ihc == 0) then + if (ihc == C3D_VERTICAL) then ! ! -- vertical connection iz = iz + 1 @@ -2978,10 +2558,10 @@ subroutine calc_spdis(this, flowja) ic = ic + 1 dz = thksatnm(this%ibound(n), this%ibound(m), & this%icelltype(n), this%icelltype(m), & - this%inewton, ihc, this%iusgnrhc, & + this%inewton, ihc, & this%hnew(n), this%hnew(m), this%sat(n), this%sat(m), & this%dis%top(n), this%dis%top(m), this%dis%bot(n), & - this%dis%bot(m), this%satomega) + this%dis%bot(m)) area = area * dz call this%dis%connection_normal(n, m, ihc, xn, yn, zn, ipos) call this%dis%connection_vector(n, m, nozee, this%sat(n), this%sat(m), & @@ -3012,7 +2592,7 @@ subroutine calc_spdis(this, flowja) ! -- propsedge: (Q, area, nx, ny, distance) ihc = this%ihcedge(m) area = this%propsedge(2, m) - if (ihc == 0) then + if (ihc == C3D_VERTICAL) then iz = iz + 1 viz(iz) = this%propsedge(1, m) / area diz(iz) = this%propsedge(5, m) @@ -3272,7 +2852,6 @@ function calcSatThickness(this, n, m, ihc) result(satThickness) this%icelltype(m), & this%inewton, & ihc, & - this%iusgnrhc, & this%hnew(n), & this%hnew(m), & this%sat(n), & @@ -3280,130 +2859,10 @@ function calcSatThickness(this, n, m, ihc) result(satThickness) this%dis%top(n), & this%dis%top(m), & this%dis%bot(n), & - this%dis%bot(m), & - this%satomega) + this%dis%bot(m)) ! ! -- Return return end function calcSatThickness - !> @brief Calculate saturated thickness at interface between two cells - !< - function thksatnm(ibdn, ibdm, ictn, ictm, inwtup, ihc, iusg, & - hn, hm, satn, satm, topn, topm, botn, botm, & - satomega) result(res) - ! -- return - real(DP) :: res - ! -- dummy - integer(I4B), intent(in) :: ibdn - integer(I4B), intent(in) :: ibdm - integer(I4B), intent(in) :: ictn - integer(I4B), intent(in) :: ictm - integer(I4B), intent(in) :: inwtup - integer(I4B), intent(in) :: ihc - integer(I4B), intent(in) :: iusg - real(DP), intent(in) :: hn - real(DP), intent(in) :: hm - real(DP), intent(in) :: satn - real(DP), intent(in) :: satm - real(DP), intent(in) :: topn - real(DP), intent(in) :: topm - real(DP), intent(in) :: botn - real(DP), intent(in) :: botm - real(DP), intent(in) :: satomega - ! -- local - integer(I4B) :: indk - real(DP) :: sn - real(DP) :: sm - real(DP) :: thksatn - real(DP) :: thksatm - real(DP) :: sill_top, sill_bot - real(DP) :: tpn, tpm - real(DP) :: top, bot - ! - ! -- If either n or m is inactive then saturated thickness is zero - if (ibdn == 0 .or. ibdm == 0) then - res = DZERO - ! - ! -- if both cells are non-convertible then use average cell thickness - elseif (ictn == 0 .and. ictm == 0) then - thksatn = topn - botn - thksatm = topm - botm - ! - ! -- If staggered connection, subtract parts of cell that are above and - ! below the sill top and bottom elevations - if (ihc == 2) then - ! - ! -- Calculate sill_top and sill_bot - sill_top = min(topn, topm) - sill_bot = max(botn, botm) - ! - ! -- Saturated thickness is sill_top - sill_bot - thksatn = max(sill_top - sill_bot, DZERO) - thksatm = thksatn - end if - ! - res = DHALF * (thksatn + thksatm) - ! - ! -- At least one of the cells is convertible, so calculate average saturated - ! thickness - else - if (inwtup == 1) then - ! -- set flag used to determine if bottom of cells n and m are - ! significantly different - indk = 0 - if (abs(botm - botn) < DEM2) indk = 1 - ! -- recalculate saturation if using MODFLOW-USG saturation - ! calculation approach - if (iusg == 1 .and. indk == 0) then - if (botm > botn) then - top = topm - bot = botm - else - top = topn - bot = botn - end if - sn = sQuadraticSaturation(top, bot, hn, satomega) - sm = sQuadraticSaturation(top, bot, hm, satomega) - else - sn = sQuadraticSaturation(topn, botn, hn, satomega) - sm = sQuadraticSaturation(topm, botm, hm, satomega) - end if - ! - ! -- upstream weight the thickness - if (hn > hm) then - res = sn * (topn - botn) - else - res = sm * (topm - botm) - end if - ! - else - thksatn = satn * (topn - botn) - thksatm = satm * (topm - botm) - ! - ! -- If staggered connection, subtract parts of cell that are above and - ! below the sill top and bottom elevations - if (ihc == 2) then - ! - ! -- Calculate sill_top and sill_bot - sill_top = min(topn, topm) - sill_bot = max(botn, botm) - ! - ! -- Calculate tpn and tpm - tpn = botn + thksatn - tpm = botm + thksatm - ! - ! -- Calculate saturated thickness for cells n and m - thksatn = max(min(tpn, sill_top) - sill_bot, DZERO) - thksatm = max(min(tpm, sill_top) - sill_bot, DZERO) - end if - ! - res = DHALF * (thksatn + thksatm) - end if - end if - ! - ! -- Return - return - end function thksatnm - end module GwfNpfModule diff --git a/src/Model/GroundWaterTransport/gwt-dsp.f90 b/src/Model/GroundWaterTransport/gwt-dsp.f90 index e244db9dd9c..349b35e1c50 100644 --- a/src/Model/GroundWaterTransport/gwt-dsp.f90 +++ b/src/Model/GroundWaterTransport/gwt-dsp.f90 @@ -791,6 +791,7 @@ end subroutine calcdispellipse subroutine calcdispcoef(this) ! -- modules use HGeoUtilModule, only: hyeff + use GwfConductanceUtilsModule, only: staggered_thkfrac ! -- dummy class(GwtDspType) :: this ! -- local @@ -801,7 +802,7 @@ subroutine calcdispcoef(this) integer(I4B) :: iavgmeth real(DP) :: satn, satm, topn, topm, botn, botm real(DP) :: hwva, cond, cn, cm, denom - real(DP) :: anm, amn, thksatn, thksatm, sill_top, sill_bot, tpn, tpm + real(DP) :: anm, amn, thksatn, thksatm ! ! -- set iavgmeth = 1 to use arithmetic averaging for effective dispersion iavgmeth = 1 @@ -874,17 +875,14 @@ subroutine calcdispcoef(this) else ! ! -- horizontal conductance - thksatn = (topn - botn) * satn - thksatm = (topm - botm) * satm ! ! -- handle vertically staggered case if (ihc == 2) then - sill_top = min(topn, topm) - sill_bot = max(botn, botm) - tpn = botn + thksatn - tpm = botm + thksatm - thksatn = max(min(tpn, sill_top) - sill_bot, DZERO) - thksatm = max(min(tpm, sill_top) - sill_bot, DZERO) + thksatn = staggered_thkfrac(topn, botn, satn, topm, botm) + thksatm = staggered_thkfrac(topm, botm, satm, topn, botn) + else + thksatn = (topn - botn) * satn + thksatm = (topm - botm) * satm end if ! ! -- calculate the saturated area term diff --git a/src/Model/ModelUtilities/GwfConductanceUtils.f90 b/src/Model/ModelUtilities/GwfConductanceUtils.f90 new file mode 100644 index 00000000000..3ae8546a0a8 --- /dev/null +++ b/src/Model/ModelUtilities/GwfConductanceUtils.f90 @@ -0,0 +1,396 @@ +!> @brief This module contains stateless storage subroutines and functions +!! +!! This module contains the functions to calculate the specific +!! storage (SC1) and specific yield (SC2) capacities that are used in +!! the storage (STO) package. It also contains subroutines to calculate +!! the amat and rhs terms for specific storage and specific yield. +!! This module does not depend on the STO package. +!! +!< +module GwfConductanceUtilsModule + use KindModule, only: DP, I4B + use ConstantsModule, only: DZERO, DHALF, DONE, & + DLNLOW, DLNHIGH, & + C3D_STAGGERED + + implicit none + private + public :: hcond + public :: vcond + public :: condmean + public :: thksatnm + public :: staggered_thkfrac + public :: CCOND_HMEAN + + !> @brief enumerator that defines the conductance options + !< + ENUM, BIND(C) + ENUMERATOR :: CCOND_HMEAN = 0 !< Harmonic mean + ENUMERATOR :: CCOND_LMEAN = 1 !< Logarithmic mean + ENUMERATOR :: CCOND_AMTLMK = 2 !< Arithmetic-mean thickness and logarithmic-mean hydraulic conductivity + ENUMERATOR :: CCOND_AMTHMK = 3 !< Arithmetic-mean thickness and harmonic-mean hydraulic conductivity + END ENUM + +contains + + !> @brief Horizontal conductance between two cells + !! + !! This function uses a weighted transmissivity in the harmonic mean + !! conductance calculations. This differs from the MODFLOW-NWT and + !! MODFLOW-USG conductance calculations for the Newton-Raphson formulation + !! which use a weighted hydraulic conductivity. + !< + function hcond(ibdn, ibdm, ictn, ictm, iupstream, ihc, icellavg, & + condsat, hn, hm, satn, satm, hkn, hkm, topn, topm, & + botn, botm, cln, clm, fawidth) & + result(condnm) + ! return variable + real(DP) :: condnm !< horizontal conductance between two cells + ! dummy + integer(I4B), intent(in) :: ibdn !< cell n active flag + integer(I4B), intent(in) :: ibdm !< cell m active flag + integer(I4B), intent(in) :: ictn !< cell n convertible cell flag + integer(I4B), intent(in) :: ictm !< cell m convertible cell flag + integer(I4B), intent(in) :: iupstream !< flag for upstream weighting + integer(I4B), intent(in) :: ihc !< connection type + integer(I4B), intent(in) :: icellavg !< cell averaging option + real(DP), intent(in) :: condsat !< saturated conductance + real(DP), intent(in) :: hn !< cell n head + real(DP), intent(in) :: hm !< cell m head + real(DP), intent(in) :: satn !< cell n wetted cell fraction + real(DP), intent(in) :: satm !< cell m wetted cell fraction + real(DP), intent(in) :: hkn !< horizontal hydraulic conductivity for cell n (in the direction of cell m) + real(DP), intent(in) :: hkm !< horizontal hydraulic conductivity for cell m (in the direction of cell n) + real(DP), intent(in) :: topn !< top of cell n + real(DP), intent(in) :: topm !< top of cell m + real(DP), intent(in) :: botn !< bottom of cell n + real(DP), intent(in) :: botm !< bottom of cell m + real(DP), intent(in) :: cln !< distance from the center of cell n to the shared face with cell m + real(DP), intent(in) :: clm !< distance from the center of cell m to the shared face with cell n + real(DP), intent(in) :: fawidth !< width of cell perpendicular to flow + + ! n or m is inactive + if (ibdn == 0 .or. ibdm == 0) then + condnm = DZERO + ! both cells are non-convertible + elseif (ictn == 0 .and. ictm == 0) then + condnm = condsat + else if (iupstream == 1) then + condnm = convertible_upstream(hn, hm, satn, satm, condsat) + else + condnm = convertible_standard(ihc, icellavg, & + satn, satm, hkn, hkm, & + topn, topm, botn, botm, & + cln, clm, fawidth) + end if + end function hcond + + !> @brief Convertible cell(s) with upstream weighted horizontal conductance + !< + function convertible_upstream(hn, hm, satn, satm, condsat) & + result(condnm) + ! return variable + real(DP) :: condnm !< horizontal conductance between two cells + ! dummy + real(DP), intent(in) :: condsat !< saturated conductance + real(DP), intent(in) :: hn !< cell n head + real(DP), intent(in) :: hm !< cell m head + real(DP), intent(in) :: satn !< cell n wetted cell fraction + real(DP), intent(in) :: satm !< cell m wetted cell fraction + ! local + real(DP) :: sat_up + + if (hn > hm) then + sat_up = satn + else + sat_up = satm + end if + condnm = sat_up * condsat + end function convertible_upstream + + !> @brief Convertible cell(s) with standard weighted horizontal conductance + !< + function convertible_standard(ihc, icellavg, satn, satm, hkn, hkm, & + topn, topm, botn, botm, cln, clm, fawidth) & + result(condnm) + ! return variable + real(DP) :: condnm !< horizontal conductance between two cells + ! dummy + integer(I4B), intent(in) :: ihc !< connection type + integer(I4B), intent(in) :: icellavg !< cell averaging option + real(DP), intent(in) :: satn !< cell n wetted cell fraction + real(DP), intent(in) :: satm !< cell m wetted cell fraction + real(DP), intent(in) :: hkn !< horizontal hydraulic conductivity for cell n (in the direction of cell m) + real(DP), intent(in) :: hkm !< horizontal hydraulic conductivity for cell m (in the direction of cell n) + real(DP), intent(in) :: topn !< top of cell n + real(DP), intent(in) :: topm !< top of cell m + real(DP), intent(in) :: botn !< bottom of cell n + real(DP), intent(in) :: botm !< bottom of cell m + real(DP), intent(in) :: cln !< distance from the center of cell n to the shared face with cell m + real(DP), intent(in) :: clm !< distance from the center of cell m to the shared face with cell n + real(DP), intent(in) :: fawidth !< width of cell perpendicular to flow + ! local + real(DP) :: thksatn + real(DP) :: thksatm + + if (ihc == C3D_STAGGERED) then + thksatn = staggered_thkfrac(topn, botn, satn, topm, botm) + thksatm = staggered_thkfrac(topm, botm, satm, topn, botn) + else + thksatn = satn * (topn - botn) + thksatm = satm * (topm - botm) + end if + condnm = condmean(hkn, hkm, thksatn, thksatm, cln, clm, & + fawidth, icellavg) + end function convertible_standard + + !> @brief Vertical conductance between two cells + !< + function vcond(ibdn, ibdm, ictn, ictm, inewton, ivarcv, idewatcv, & + condsat, hn, hm, vkn, vkm, satn, satm, topn, topm, botn, & + botm, flowarea) result(condnm) + ! return variable + real(DP) :: condnm + ! dummy + integer(I4B), intent(in) :: ibdn !< cell n active flag + integer(I4B), intent(in) :: ibdm !< cell m active flag + integer(I4B), intent(in) :: ictn !< cell n convertible cell flag + integer(I4B), intent(in) :: ictm !< cell m convertible cell flag + integer(I4B), intent(in) :: inewton !< flag for Newton-Raphson formulation + integer(I4B), intent(in) :: ivarcv !< variable vertical conductance flag + integer(I4B), intent(in) :: idewatcv !< dewatered vertical conductance flag + real(DP), intent(in) :: condsat !< saturated conductance + real(DP), intent(in) :: hn !< cell n head + real(DP), intent(in) :: hm !< cell m head + real(DP), intent(in) :: vkn !< vertical hydraulic conductivity for cell n (in the direction of cell m) + real(DP), intent(in) :: vkm !< vertical hydraulic conductivity for cell m (in the direction of cell n) + real(DP), intent(in) :: satn !< cell n wetted cell fraction + real(DP), intent(in) :: satm !< cell m wetted cell fraction + real(DP), intent(in) :: topn !< top of cell n + real(DP), intent(in) :: topm !< top of cell m + real(DP), intent(in) :: botn !< bottom of cell n + real(DP), intent(in) :: botm !< bottom of cell m + real(DP), intent(in) :: flowarea !< flow area between cell n and m + ! local + real(DP) :: satntmp + real(DP) :: satmtmp + real(DP) :: bovk1 + real(DP) :: bovk2 + real(DP) :: denom + ! + ! Either n or m is inactive + if (ibdn == 0 .or. ibdm == 0) then + condnm = DZERO + ! + ! constantcv + elseif (ivarcv == 0) then + condnm = condsat + ! + ! both cells are non-convertible + elseif (ictn == 0 .and. ictm == 0) then + condnm = condsat + ! + ! both cells are fully saturated + elseif (hn >= topn .and. hm >= topm) then + condnm = condsat + ! + ! At least one cell is partially saturated, so recalculate vertical + ! conductance for this connection + ! todo: upstream weighting? + else + ! + ! Default is for CV correction (dewatered option); use underlying + ! saturation of 1. + satntmp = satn + satmtmp = satm + if (idewatcv == 0) then + if (botn > botm) then + satmtmp = DONE + else + satntmp = DONE + end if + end if + bovk1 = satntmp * (topn - botn) * DHALF / vkn + bovk2 = satmtmp * (topm - botm) * DHALF / vkm + denom = (bovk1 + bovk2) + if (denom /= DZERO) then + condnm = flowarea / denom + else + condnm = DZERO + end if + end if + end function vcond + + !> @brief Calculate the conductance between two cells + !< + function condmean(k1, k2, thick1, thick2, cl1, cl2, width, iavgmeth) + ! return variable + real(DP) :: condmean !< mean conductance between two cell + ! dummy + real(DP), intent(in) :: k1 !< hydraulic conductivity for cell n (in the direction of cell m) + real(DP), intent(in) :: k2 !< hydraulic conductivity for cell m (in the direction of celln) + real(DP), intent(in) :: thick1 !< saturated thickness for cell 1 + real(DP), intent(in) :: thick2 !< saturated thickness for cell 2 + real(DP), intent(in) :: cl1 !< distance from the center of cell n to the shared face with cell m + real(DP), intent(in) :: cl2 !< distance from the center of cell m to the shared face with cell n + real(DP), intent(in) :: width !< width of cell perpendicular to flow + integer(I4B), intent(in) :: iavgmeth !< averaging method + ! local + real(DP) :: t1 + real(DP) :: t2 + real(DP) :: tmean + real(DP) :: kmean + real(DP) :: denom + ! + ! Initialize + t1 = k1 * thick1 + t2 = k2 * thick2 + + ! Averaging method + select case (iavgmeth) + + case (CCOND_HMEAN) + if (t1 * t2 > DZERO) then + condmean = width * t1 * t2 / (t1 * cl2 + t2 * cl1) + else + condmean = DZERO + end if + + case (CCOND_LMEAN) + if (t1 * t2 > DZERO) then + tmean = logmean(t1, t2) + else + tmean = DZERO + end if + condmean = tmean * width / (cl1 + cl2) + + case (CCOND_AMTLMK) + if (k1 * k2 > DZERO) then + kmean = logmean(k1, k2) + else + kmean = DZERO + end if + condmean = kmean * DHALF * (thick1 + thick2) * width / (cl1 + cl2) + + case (CCOND_AMTHMK) + denom = (k1 * cl2 + k2 * cl1) + if (denom > DZERO) then + kmean = k1 * k2 / denom + else + kmean = DZERO + end if + condmean = kmean * DHALF * (thick1 + thick2) * width + end select + end function condmean + + !> @brief Calculate the the logarithmic mean of two double precision numbers + !! + !! Use an approximation if the ratio is near 1 + !< + function logmean(d1, d2) + ! return variable + real(DP) :: logmean !< logarithmic mean for two number + ! dummy + real(DP), intent(in) :: d1 !< first number + real(DP), intent(in) :: d2 !< second number + ! local + real(DP) :: drat + + drat = d2 / d1 + if (drat <= DLNLOW .or. drat >= DLNHIGH) then + logmean = (d2 - d1) / log(drat) + else + logmean = DHALF * (d1 + d2) + end if + end function logmean + + !> @brief Calculate wetted cell thickness at interface between two cells + !< + function thksatnm(ibdn, ibdm, ictn, ictm, iupstream, ihc, & + hn, hm, satn, satm, topn, topm, botn, botm) result(res) + ! return variable + real(DP) :: res !< wetted cell thickness for connection nm + ! dummy + integer(I4B), intent(in) :: ibdn !< cell n active flag + integer(I4B), intent(in) :: ibdm !< cell m active flag + integer(I4B), intent(in) :: ictn !< cell n convertible cell flag + integer(I4B), intent(in) :: ictm !< cell m convertible cell flag + integer(I4B), intent(in) :: iupstream !< flag for upstream weighting + integer(I4B), intent(in) :: ihc !< connection type + real(DP), intent(in) :: hn !< cell n head + real(DP), intent(in) :: hm !< cell m head + real(DP), intent(in) :: satn !< cell n wetted cell fraction + real(DP), intent(in) :: satm !< cell m wetted cell fraction + real(DP), intent(in) :: topn !< top of cell n + real(DP), intent(in) :: topm !< top of cell m + real(DP), intent(in) :: botn !< bottom of cell n + real(DP), intent(in) :: botm !< bottom of cell m + ! local + real(DP) :: thksatn + real(DP) :: thksatm + real(DP) :: sill_top + real(DP) :: sill_bot + ! + ! n or m is inactive + if (ibdn == 0 .or. ibdm == 0) then + res = DZERO + ! + ! both cells are non-convertible + elseif (ictn == 0 .and. ictm == 0) then + if (ihc == C3D_STAGGERED) then + sill_top = min(topn, topm) + sill_bot = max(botn, botm) + + thksatn = max(sill_top - sill_bot, DZERO) + thksatm = thksatn + else + thksatn = topn - botn + thksatm = topm - botm + end if + res = DHALF * (thksatn + thksatm) + ! + ! At least one of the cells is convertible + elseif (iupstream == 1) then + if (hn > hm) then + res = satn * (topn - botn) + else + res = satm * (topm - botm) + end if + ! + ! At least one of the cells is convertible and not upstream weighted + else + if (ihc == C3D_STAGGERED) then + thksatn = staggered_thkfrac(topn, botn, satn, topm, botm) + thksatm = staggered_thkfrac(topm, botm, satm, topn, botn) + else + thksatn = satn * (topn - botn) + thksatm = satm * (topm - botm) + end if + res = DHALF * (thksatn + thksatm) + end if + return + end function thksatnm + + !> @brief Calculate the thickness fraction for staggered grids + !< + function staggered_thkfrac(top, bot, sat, topc, botc) result(res) + ! return variable + real(DP) :: res !< staggered thickness fraction for cell + ! dummy + real(DP) :: top !< top of cell + real(DP) :: bot !< bottom of cell + real(DP) :: sat !< cell saturation + real(DP) :: topc !< top of connected cell + real(DP) :: botc !< bottom of connected cells + ! local + real(DP) :: sill_top + real(DP) :: sill_bot + real(DP) :: tp + + sill_top = min(top, topc) + sill_bot = max(bot, botc) + tp = bot + sat * (top - bot) + res = max(min(tp, sill_top) - sill_bot, DZERO) + end function staggered_thkfrac + +end module GwfConductanceUtilsModule diff --git a/src/Utilities/Constants.f90 b/src/Utilities/Constants.f90 index 718a9ae392c..038240f25b1 100644 --- a/src/Utilities/Constants.f90 +++ b/src/Utilities/Constants.f90 @@ -189,4 +189,12 @@ module ConstantsModule ENUMERATOR :: CCRAYFTN = 3 !< 3 END ENUM + !> @brief enumerator that defines the cell connection type + !< + ENUM, BIND(C) + ENUMERATOR :: C3D_VERTICAL = 0 !< vertical connection + ENUMERATOR :: C3D_HORIZONTAL = 1 !< horizontal connection + ENUMERATOR :: C3D_STAGGERED = 2 !< horizontal connection for a vertically staggered grid + END ENUM + end module ConstantsModule diff --git a/src/meson.build b/src/meson.build index 96b3fa34afb..c6ceb3b2ca4 100644 --- a/src/meson.build +++ b/src/meson.build @@ -187,6 +187,7 @@ modflow_sources = files( 'Model' / 'ModelUtilities' / 'FlowModelInterface.f90', 'Model' / 'ModelUtilities' / 'GweInputData.f90', 'Model' / 'ModelUtilities' / 'GwfBuyInputData.f90', + 'Model' / 'ModelUtilities' / 'GwfConductanceUtils.f90', 'Model' / 'ModelUtilities' / 'GwfMvrPeriodData.f90', 'Model' / 'ModelUtilities' / 'GwfNpfOptions.f90', 'Model' / 'ModelUtilities' / 'GwfStorageUtils.f90', From 7b31cfff66c059e25d5efd072990558b07149fd8 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Fri, 8 Mar 2024 09:02:49 -0600 Subject: [PATCH 056/199] readme: update MODFLOW paper and report references (#1667) --- README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 15ec9fb662f..afe5cbddce0 100644 --- a/README.md +++ b/README.md @@ -84,17 +84,19 @@ The GWT model for MODFLOW 6 simulates three-dimensional transport of a single so [Provost, A.M., Langevin, C.D., and Hughes, J.D., 2017, Documentation for the "XT3D" option in the Node Property Flow (NPF) Package of MODFLOW 6: U.S. Geological Survey Techniques and Methods, book 6, chap. A56, 40 p., https://doi.org/10.3133/tm6A56.](https://doi.org/10.3133/tm6A56) -[Langevin, C.D., Panday, S, and Provost, A.M., 2020, Hydraulic-head formulation for density-dependent flow and transport: Groundwater, v. 58, no. 3, p. 349–362.](https://doi.org/10.1111/gwat.12967) +[Langevin, C.D., Panday, S, and Provost, A.M., 2020, Hydraulic-head formulation for density-dependent flow and transport: Groundwater, v. 58, no. 3, p. 349–362, https://doi.org/10.1111/gwat.12967.](https://doi.org/10.1111/gwat.12967) -[Morway, E.D., Langevin, C.D., and Hughes, J.D., 2021, Use of the MODFLOW 6 water mover package to represent natural and managed hydrologic connections: Groundwater, v. 59, no. 6, p. 913-924.](https://doi.org/10.1111/gwat.13117) +[Morway, E.D., Langevin, C.D., and Hughes, J.D., 2021, Use of the MODFLOW 6 water mover package to represent natural and managed hydrologic connections: Groundwater, v. 59, no. 6, p. 913-924, https://doi.org/10.1111/gwat.13117.](https://doi.org/10.1111/gwat.13117) -[Hughes, J.D., Russcher, M.J., Langevin, C.D., Morway, E.D., and McDonald, R.R., 2022, The MODFLOW Application Programming Interface for simulation control and software interoperability: Environmental Modelling & Software, v. 148, 105257, https://doi.org/10.1016/j.envsoft.2021.105257](https://doi.org/10.1016/j.envsoft.2021.105257) +[Hughes, J.D., Russcher, M.J., Langevin, C.D., Morway, E.D., and McDonald, R.R., 2022, The MODFLOW Application Programming Interface for simulation control and software interoperability: Environmental Modelling & Software, v. 148, 105257, https://doi.org/10.1016/j.envsoft.2021.105257.](https://doi.org/10.1016/j.envsoft.2021.105257) -[Langevin, C.D., Provost, A.M., Panday, Sorab, and Hughes, J.D., 2022, Documentation for the MODFLOW 6 Groundwater Transport (GWT) Model: U.S. Geological Survey Techniques and Methods, book 6, chap. A61, 56 p., https://doi.org/10.3133/tm6A61](https://doi.org/10.3133/tm6A61) +[Langevin, C.D., Provost, A.M., Panday, Sorab, and Hughes, J.D., 2022, Documentation for the MODFLOW 6 Groundwater Transport (GWT) Model: U.S. Geological Survey Techniques and Methods, book 6, chap. A61, 56 p., https://doi.org/10.3133/tm6A61.](https://doi.org/10.3133/tm6A61) -[Hughes, J.D., Leake, S.A., Galloway, D.L., and White, J.T., 2022, Documentation for the Skeletal Storage, Compaction, and Subsidence (CSUB) Package of MODFLOW 6: U.S. Geological Survey Techniques and Methods, book 6, chap. A62, 57 p., https://doi.org/10.3133/tm6A62](https://doi.org/10.3133/tm6A62) +[Hughes, J.D., Leake, S.A., Galloway, D.L., and White, J.T., 2022, Documentation for the Skeletal Storage, Compaction, and Subsidence (CSUB) Package of MODFLOW 6: U.S. Geological Survey Techniques and Methods, book 6, chap. A62, 57 p., https://doi.org/10.3133/tm6A62.](https://doi.org/10.3133/tm6A62) -[Langevin, C.D., Hughes, J.D., Provost, A.M., Russcher, M.J. and Panday, S., 2023, MODFLOW as a Configurable Multi-Model Hydrologic Simulator: Groundwater, https://doi.org/10.1111/gwat.13351](https://doi.org/10.1111/gwat.13351) +[Langevin, C.D., Hughes, J.D., Provost, A.M., Russcher, M.J. and Panday, S., 2023, MODFLOW as a Configurable Multi-Model Hydrologic Simulator: Groundwater, v. 62, p. 111-123, https://doi.org/10.1111/gwat.13351.](https://doi.org/10.1111/gwat.13351) + +[Larsen, J.D., Langevin, C.D., Hughes, J.D. and Niswonger, R.G. (2024), An Agricultural Package for MODFLOW 6 Using the Application Programming Interface. Groundwater, v. 62, p. 157-166, https://doi.org/10.1111/gwat.13367.](https://doi.org/10.1111/gwat.13367) #### ***Software/Code*** From 3e7198db764cf0c5b15fac3a1ab756197e3e0735 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Fri, 8 Mar 2024 10:34:24 -0600 Subject: [PATCH 057/199] style: update doxygen comments (#1668) --- .../ModelUtilities/GwfConductanceUtils.f90 | 14 ++-- src/Utilities/Constants.f90 | 71 ++++++++++--------- 2 files changed, 46 insertions(+), 39 deletions(-) diff --git a/src/Model/ModelUtilities/GwfConductanceUtils.f90 b/src/Model/ModelUtilities/GwfConductanceUtils.f90 index 3ae8546a0a8..dda98fc38ff 100644 --- a/src/Model/ModelUtilities/GwfConductanceUtils.f90 +++ b/src/Model/ModelUtilities/GwfConductanceUtils.f90 @@ -1,10 +1,10 @@ -!> @brief This module contains stateless storage subroutines and functions +!> @brief This module contains stateless conductance functions !! -!! This module contains the functions to calculate the specific -!! storage (SC1) and specific yield (SC2) capacities that are used in -!! the storage (STO) package. It also contains subroutines to calculate -!! the amat and rhs terms for specific storage and specific yield. -!! This module does not depend on the STO package. +!! This module contains the functions to calculate the horizontal +!! and vertical conductance between two cells that are used in the +!! the node property flow (NPF) package. It also contains functions +!! to calculate the wetted cell fraction. This module does not +!! depend on the NPF package. !! !< module GwfConductanceUtilsModule @@ -225,7 +225,7 @@ end function vcond !< function condmean(k1, k2, thick1, thick2, cl1, cl2, width, iavgmeth) ! return variable - real(DP) :: condmean !< mean conductance between two cell + real(DP) :: condmean !< mean conductance between two cells ! dummy real(DP), intent(in) :: k1 !< hydraulic conductivity for cell n (in the direction of cell m) real(DP), intent(in) :: k2 !< hydraulic conductivity for cell m (in the direction of celln) diff --git a/src/Utilities/Constants.f90 b/src/Utilities/Constants.f90 index 038240f25b1..619322f4ab2 100644 --- a/src/Utilities/Constants.f90 +++ b/src/Utilities/Constants.f90 @@ -136,57 +136,64 @@ module ConstantsModule ' LAYER', ' CELL2D', ' ', & ' LAYER', ' ROW', ' COL'], [3, 3]) !< cellid labels for DIS, DISV, and DISU discretizations - ! -- enumerator used with TimeSeriesType + !> @brief enumerator used with TimeSeriesType + !< ENUM, BIND(C) - ENUMERATOR :: UNDEFINED = 0 !< 0 - ENUMERATOR :: STEPWISE = 1 !< 1 - ENUMERATOR :: LINEAR = 2 !< 2 - ENUMERATOR :: LINEAREND = 3 !< 3 + ENUMERATOR :: UNDEFINED = 0 !< undefined interpolation + ENUMERATOR :: STEPWISE = 1 !< stepwise interpolation + ENUMERATOR :: LINEAR = 2 !< linear interpolation + ENUMERATOR :: LINEAREND = 3 !< linear end interpolation END ENUM - ! -- enumerator used with table objects + !> @brief enumerator used with table objects + !< ENUM, BIND(C) - ENUMERATOR :: TABLEFT = 0 !< 0 - ENUMERATOR :: TABCENTER = 1 !< 1 - ENUMERATOR :: TABRIGHT = 2 !< 2 + ENUMERATOR :: TABLEFT = 0 !< left justified table column + ENUMERATOR :: TABCENTER = 1 !< centered table column + ENUMERATOR :: TABRIGHT = 2 !< right justified table column END ENUM - ! -- enumerator used to define table column data type + !> @brief enumerator used to define table column data type + !< ENUM, BIND(C) - ENUMERATOR :: TABSTRING = 0 !< 0 - ENUMERATOR :: TABUCSTRING = 1 !< 1 - ENUMERATOR :: TABINTEGER = 2 !< 2 - ENUMERATOR :: TABREAL = 3 !< 3 + ENUMERATOR :: TABSTRING = 0 !< string table data + ENUMERATOR :: TABUCSTRING = 1 !< upper case string table data + ENUMERATOR :: TABINTEGER = 2 !< integer table data + ENUMERATOR :: TABREAL = 3 !< real table data END ENUM - ! -- enumerator used to define output option + !> @brief enumerator used to define output option + !< ENUM, BIND(C) - ENUMERATOR :: VSUMMARY = 0 !< 0 - ENUMERATOR :: VALL = 1 !< 1 - ENUMERATOR :: VDEBUG = 2 !< 2 + ENUMERATOR :: VSUMMARY = 0 !< write summary output + ENUMERATOR :: VALL = 1 !< write all simulation notes and warnings + ENUMERATOR :: VDEBUG = 2 !< write debug output END ENUM - ! -- enumerator that defines the operating system + !> @brief enumerator that defines the operating system + !< ENUM, BIND(C) - ENUMERATOR :: OSUNDEF = 0 !< 0 - ENUMERATOR :: OSLINUX = 1 !< 1 - ENUMERATOR :: OSMAC = 2 !< 2 - ENUMERATOR :: OSWIN = 3 !< 3 + ENUMERATOR :: OSUNDEF = 0 !< unknown operating system + ENUMERATOR :: OSLINUX = 1 !< Linux operating system + ENUMERATOR :: OSMAC = 2 !< MacOS operating system + ENUMERATOR :: OSWIN = 3 !< Windows operating system END ENUM - ! -- enumerator that defines the simulation mode + !> @brief enumerator that defines the simulation mode + !< ENUM, BIND(C) - ENUMERATOR :: MVALIDATE = 0 !< 0 - ENUMERATOR :: MNORMAL = 1 !< 1 - ENUMERATOR :: MRUN = 2 !< 2 + ENUMERATOR :: MVALIDATE = 0 !< validation mode - do not run time steps + ENUMERATOR :: MNORMAL = 1 !< normal output mode + ENUMERATOR :: MRUN = 2 !< run output mode END ENUM - ! -- enumerator that defines the compiler + !> @brief enumerator that defines the compiler + !< ENUM, BIND(C) - ENUMERATOR :: CUNKNOWN = 0 !< 0 - ENUMERATOR :: CGFORTRAN = 1 !< 1 - ENUMERATOR :: CINTEL = 3 !< 2 - ENUMERATOR :: CCRAYFTN = 3 !< 3 + ENUMERATOR :: CUNKNOWN = 0 !< unknown compiler + ENUMERATOR :: CGFORTRAN = 1 !< gfortran compiler + ENUMERATOR :: CINTEL = 3 !< intel ifort compiler + ENUMERATOR :: CCRAYFTN = 3 !< cray fortran compiler END ENUM !> @brief enumerator that defines the cell connection type From 486c8096daf8a0f40a4b32994e74da856024c64e Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 8 Mar 2024 21:51:39 -0500 Subject: [PATCH 058/199] ci(large.yml): multiple fixes/refactoring (#1669) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * exclude models using options removed in f8885ec * running out of disk, remove some software preinstalled on the runner image to free some space * remove test_examples.py, example models can be tested nightly in mf6 examples repo, with regression comparisons accomplished via snapshot testing in that repo — mf6 test framework makes assumptions about workspace dirs that new GWE models don't (and need not) follow --- .github/workflows/large.yml | 39 +++++------------- autotest/test_examples.py | 69 -------------------------------- autotest/test_largetestmodels.py | 7 +++- 3 files changed, 16 insertions(+), 99 deletions(-) delete mode 100644 autotest/test_examples.py diff --git a/.github/workflows/large.yml b/.github/workflows/large.yml index df917faf865..9408c458888 100644 --- a/.github/workflows/large.yml +++ b/.github/workflows/large.yml @@ -36,25 +36,26 @@ jobs: fail-fast: false matrix: include: - - {compiler: gcc, version: 13, repo: examples} - - {compiler: gcc, version: 13, repo: largetestmodels} - - {compiler: intel-classic, version: 2021.6, repo: examples} - - {compiler: intel-classic, version: 2021.6, repo: largetestmodels} + - {compiler: gcc, version: 13} + - {compiler: intel-classic, version: 2021.7} defaults: run: shell: bash -l {0} steps: + - name: Free disk space (Ubuntu) + if: runner.os == 'Linux' + uses: jlumbroso/free-disk-space@main - name: Checkout modflow6 uses: actions/checkout@v4 with: path: modflow6 - - name: Checkout modflow6-${{ matrix.repo }} + - name: Checkout modflow6-largetestmodels uses: actions/checkout@v4 with: - repository: MODFLOW-USGS/modflow6-${{ matrix.repo }} - path: modflow6-${{ matrix.repo }} + repository: MODFLOW-USGS/modflow6-largetestmodels + path: modflow6-largetestmodels - name: Setup Micromamba uses: mamba-org/setup-micromamba@v1 @@ -69,30 +70,10 @@ jobs: compiler: ${{ matrix.compiler }} version: ${{ matrix.version }} - - name: Cache modflow6 examples - id: cache-examples - uses: actions/cache@v4 - with: - path: modflow6-examples/examples - key: modflow6-examples-${{ hashFiles('modflow6-examples/scripts/**') }} - - - name: Install extra Python packages - if: matrix.repo == 'examples' && steps.cache-examples.outputs.cache-hit != 'true' - working-directory: modflow6-examples/etc - run: | - pip install -r requirements.pip.txt - - - name: Build example models - if: matrix.repo == 'examples' && steps.cache-examples.outputs.cache-hit != 'true' - working-directory: modflow6-examples/autotest - run: | - pytest -v -n auto test_scripts.py --init - ls -lh ../examples/ - - name: Build modflow6 working-directory: modflow6 run: | - meson setup builddir -Ddebug=false --prefix=$(pwd) --libdir=bin + meson setup builddir --prefix=$(pwd) --libdir=bin meson install -C builddir - name: Get executables @@ -107,7 +88,7 @@ jobs: - name: Run tests working-directory: modflow6/autotest - run: pytest -v -n auto --durations 0 test_${{ matrix.repo }}.py --keep-failed .failed + run: pytest -v -n auto --durations 0 test_largetestmodels.py --keep-failed .failed - name: Upload failed test output if: failure() diff --git a/autotest/test_examples.py b/autotest/test_examples.py deleted file mode 100644 index 57f974c7148..00000000000 --- a/autotest/test_examples.py +++ /dev/null @@ -1,69 +0,0 @@ -from shutil import copytree - -import pytest - -from framework import TestFramework -from common_regression import setup_mf6 - -# skip nested models -# ex-gwf-csub-p02c has subdirs like 'es-001', 'hb-100' -# all others just have 2 folders 'mf6gwf' and 'mf6gwt' -excluded_models = [ - "ex-gwf-csub-p02c", - "ex-gwt-hecht-mendez-b", - "ex-gwt-hecht-mendez-c", - "ex-gwt-keating", - "ex-gwt-moc3d-p01a", - "ex-gwt-moc3d-p01b", - "ex-gwt-moc3d-p01c", - "ex-gwt-moc3d-p01d", - "ex-gwt-moc3d-p02", - "ex-gwt-moc3d-p02tg", - "ex-gwt-mt3dms-p02a", - "ex-gwt-mt3dms-p02b", - "ex-gwt-mt3dms-p02c", - "ex-gwt-mt3dms-p02d", - "ex-gwt-mt3dms-p02e", - "ex-gwt-mt3dms-p02f", - "ex-gwt-mt3dsupp631", - "ex-gwt-mt3dsupp632a", - "ex-gwt-mt3dsupp632b", - "ex-gwt-mt3dsupp632c", - "ex-gwt-mt3dsupp82", - "ex-gwt-prudic2004t2", -] - - -@pytest.mark.large -@pytest.mark.repo -@pytest.mark.regression -@pytest.mark.slow -def test_scenario( - # https://modflow-devtools.readthedocs.io/en/latest/md/fixtures.html#example-scenarios - function_tmpdir, - example_scenario, - targets, -): - name, namefiles = example_scenario - exdirs = [nf.parent for nf in namefiles] - - if "prt" in name: - pytest.skip(f"Excluding mf6 prt model (tested separately): {name}") - - if name in excluded_models: - pytest.skip(f"Skipping: {name} (excluded)") - - model_paths = [nf.parent for nf in namefiles] - for model_path in model_paths: - model_name = f"{name}_{model_path.name}" - workspace = function_tmpdir / model_name - setup_mf6(src=model_path, dst=workspace) - test = TestFramework( - name=model_name, - workspace=workspace, - targets=targets, - compare="mf6_regression", - verbose=False, - ) - copytree(workspace, workspace / "mf6_regression") - test.run() diff --git a/autotest/test_largetestmodels.py b/autotest/test_largetestmodels.py index a694c7d2796..36fcb5b91de 100644 --- a/autotest/test_largetestmodels.py +++ b/autotest/test_largetestmodels.py @@ -9,7 +9,12 @@ get_mf6_comparison, ) -excluded_models = [] +excluded_models = [ + "test1002_biscqtg_disv_gnc_nr_dev", + "test1002_biscqtg_disv_nr_MD_dev", + "test1002_biscqtg_disv_nr_RCM_dev", + "test1002_biscqtg_disv_nr_dev" +] @pytest.mark.large From 80aec42751dc2f4bbad71aaa9ebf1b08c717b351 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Sun, 10 Mar 2024 07:29:42 -0400 Subject: [PATCH 059/199] test: avoid warnings from 3rd party libs (#1670) * ignore well-known python-dateutil and pandas warnings * use .item() to extract single items from numpy arrays * mark PRT voronoi tests slow (todo: refactor, speed up) * use raw docstrings if they contain backslashes --- autotest/pytest.ini | 5 ++ autotest/test_gwe_esl_analyt_sln.py | 90 ++++++++++++++--------------- autotest/test_gwe_lke_conduction.py | 2 +- autotest/test_gwe_split_analyt.py | 2 +- autotest/test_gwf_sfr_npoint01.py | 2 +- autotest/test_gwf_sto03.py | 4 +- autotest/test_prt_voronoi1.py | 1 + autotest/test_prt_voronoi2.py | 1 + 8 files changed, 57 insertions(+), 50 deletions(-) diff --git a/autotest/pytest.ini b/autotest/pytest.ini index b8e144f9f5c..f6c6634ba08 100644 --- a/autotest/pytest.ini +++ b/autotest/pytest.ini @@ -16,3 +16,8 @@ markers = lak: tests for lake package maw: tests for multi-aquifer well package parallel: test relying on a parallel (MPI+PETSc) build +filterwarnings = + # from python-dateutil, used by arrow, jupyter_client, matplotlib, pandas + ignore:datetime.datetime.utcfromtimestamp + # from pandas, see https://github.com/pandas-dev/pandas/issues/54466 + ignore:\n.*Pyarrow \ No newline at end of file diff --git a/autotest/test_gwe_esl_analyt_sln.py b/autotest/test_gwe_esl_analyt_sln.py index 38f835d139c..356c2b93c0d 100644 --- a/autotest/test_gwe_esl_analyt_sln.py +++ b/autotest/test_gwe_esl_analyt_sln.py @@ -1,51 +1,51 @@ -""" - An analytical solution provided by Carslaw & Jaeger (1947) and discussed in - accompanying Techniques & Methods report. - - Energy is added to the right hand side boundary using the energy source loading - (ESL) package. Basic model set up is below, with a slab of unit thickness - (1.0 m) that is 100 m "deep" with energy being loaded on right side. - Temperature will begin to rise on the right and propagate to the left. There are - no sinks in this first example. The titles that follow, for example - "Section 43, case x" refer to specific analytical solutions found in Carslaw & - Jaeger (1947) - - Section 43, case i: - ------------------- - - | <-------------------------- 10 m --------------------------> | - - +------------------------------------------------------------------+ - | Initial temperature = T_0 | <-- *ESL - +------------------------------------------------------------------+ - ^ * ESL: Energy Source Loading Boundary - | - No heat-flow boundary - - - Section 43, case ii: - -------------------- - - +------------------------------------------------------------------+ - | Initial temperature = 0.0 | <-- *ESL - +------------------------------------------------------------------+ - ^ - | - Specified temperature boundary, T_0 - - - Section 43, case iii: - --------------------- - +r""" +An analytical solution provided by Carslaw & Jaeger (1947) and discussed in +accompanying Techniques & Methods report. + +Energy is added to the right hand side boundary using the energy source loading +(ESL) package. Basic model set up is below, with a slab of unit thickness +(1.0 m) that is 100 m "deep" with energy being loaded on right side. +Temperature will begin to rise on the right and propagate to the left. There are +no sinks in this first example. The titles that follow, for example +"Section 43, case x" refer to specific analytical solutions found in Carslaw & +Jaeger (1947) + +Section 43, case i: +------------------- + + | <-------------------------- 10 m --------------------------> | + + +------------------------------------------------------------------+ + | Initial temperature = T_0 | <-- *ESL + +------------------------------------------------------------------+ + ^ * ESL: Energy Source Loading Boundary + | + No heat-flow boundary + + +Section 43, case ii: +-------------------- + + +------------------------------------------------------------------+ + | Initial temperature = 0.0 | <-- *ESL + +------------------------------------------------------------------+ + ^ + | + Specified temperature boundary, T_0 + + +Section 43, case iii: +--------------------- + +------------------------------------------------------------------+ CTP -> | | <- CTP = T_0 = T_0 +------------------------------------------------------------------+ - \-------------------------------------------------------------/ - | - Uniform, constant heat production throughout the slab - - - Specified temperature boundary, T_0 + \-------------------------------------------------------------/ + | + Uniform, constant heat production throughout the slab + + + Specified temperature boundary, T_0 """ diff --git a/autotest/test_gwe_lke_conduction.py b/autotest/test_gwe_lke_conduction.py index 412df9816e9..7b645fb71e4 100644 --- a/autotest/test_gwe_lke_conduction.py +++ b/autotest/test_gwe_lke_conduction.py @@ -71,7 +71,7 @@ def get_bud(fname, srchStr): def trenddetector(list_of_index, array_of_data, order=1): result = np.polyfit(list_of_index, list(array_of_data), order) slope = result[-2] - return float(slope) + return float(slope.item()) cases = ["lke-conductn", "lke-conductm", "lke-conductr"] diff --git a/autotest/test_gwe_split_analyt.py b/autotest/test_gwe_split_analyt.py index 5d8d9b16516..8b780c90399 100644 --- a/autotest/test_gwe_split_analyt.py +++ b/autotest/test_gwe_split_analyt.py @@ -1,4 +1,4 @@ -""" +r""" An analytical solution provided by Carslaw & Jaeger (1947) and discussed in accompanying Techniques & Methods report. diff --git a/autotest/test_gwf_sfr_npoint01.py b/autotest/test_gwf_sfr_npoint01.py index 7d654809633..4de3b82bcdf 100644 --- a/autotest/test_gwf_sfr_npoint01.py +++ b/autotest/test_gwf_sfr_npoint01.py @@ -33,7 +33,7 @@ "w", "v_invalid", "|/", - "\|", + r"\|", ) # spatial discretization data diff --git a/autotest/test_gwf_sto03.py b/autotest/test_gwf_sto03.py index 4e0c078ed84..19024a90708 100644 --- a/autotest/test_gwf_sto03.py +++ b/autotest/test_gwf_sto03.py @@ -194,7 +194,7 @@ def eval_hmax(fpth): bv[:] = b.get_data(totim=1.0)[obsname] sv = np.zeros(ctimes.shape, dtype=float) for i, t in enumerate(ctimes): - sv[i] = b.get_data(totim=t)[obsname] + sv[i] = b.get_data(totim=t)[obsname].item() msg = ( "maximum heads in {} exceed tolerance ".format(fpth) @@ -229,7 +229,7 @@ def check_output(idx, test): base_cmp[:] = base_obs.get_data(totim=1.0)[obsname] offset_cmp = np.zeros(cmp_times.shape, dtype=float) for i, t in enumerate(cmp_times): - offset_cmp[i] = base_obs.get_data(totim=t)[obsname] + offset_cmp[i] = base_obs.get_data(totim=t)[obsname].item() msg = ( "maximum heads exceed tolerance when offset removed " diff --git a/autotest/test_prt_voronoi1.py b/autotest/test_prt_voronoi1.py index 257be507ea5..9b3ce29ac19 100644 --- a/autotest/test_prt_voronoi1.py +++ b/autotest/test_prt_voronoi1.py @@ -402,6 +402,7 @@ def callback(mesh, value): p.show() +@pytest.mark.slow @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): if ( diff --git a/autotest/test_prt_voronoi2.py b/autotest/test_prt_voronoi2.py index cd93b532488..89ba0c666e4 100644 --- a/autotest/test_prt_voronoi2.py +++ b/autotest/test_prt_voronoi2.py @@ -421,6 +421,7 @@ def callback(mesh, value): p.show() +@pytest.mark.slow @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( From 30b3738103c3f522317a6b4fbf863b83c41155e5 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 11 Mar 2024 08:11:14 -0400 Subject: [PATCH 060/199] test(PRT): cleanup/speedup voronoi DISV grid tests (#1671) * fix test name in test_prt_drape.py * reuse functions from test_prt_voronoi1.py in ..._voronoi2.py * hardcode cell IDs in voronoi tests instead of re-intersecting every run * remove slow markers, tests now run in a few seconds --- autotest/test_prt_budget.py | 6 +- autotest/test_prt_disv1.py | 4 +- autotest/test_prt_drape.py | 4 +- autotest/test_prt_exg.py | 2 +- autotest/test_prt_fmi.py | 4 +- autotest/test_prt_release_timing.py | 4 +- autotest/test_prt_stop_zones.py | 4 +- autotest/test_prt_ternary_methods.py | 11 +- autotest/test_prt_track_events.py | 4 +- autotest/test_prt_triangle.py | 2 +- autotest/test_prt_voronoi1.py | 221 +++++++++++++++++++++------ autotest/test_prt_voronoi2.py | 141 ++++------------- autotest/test_prt_weak_sinks.py | 4 +- 13 files changed, 228 insertions(+), 183 deletions(-) diff --git a/autotest/test_prt_budget.py b/autotest/test_prt_budget.py index 444abf99a29..7c65a3f45ec 100644 --- a/autotest/test_prt_budget.py +++ b/autotest/test_prt_budget.py @@ -14,9 +14,11 @@ import numpy as np import pandas as pd import pytest +from flopy.mf6.utils.postprocessing import get_structured_faceflows from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile -from flopy.mf6.utils.postprocessing import get_structured_faceflows + +from framework import TestFramework from prt_test_utils import ( HorizontalCase, all_equal, @@ -27,8 +29,6 @@ has_default_boundnames, ) -from framework import TestFramework - simname = "prtbud" cases = [simname] diff --git a/autotest/test_prt_disv1.py b/autotest/test_prt_disv1.py index 25a830b3362..d879ae12be0 100644 --- a/autotest/test_prt_disv1.py +++ b/autotest/test_prt_disv1.py @@ -20,6 +20,8 @@ from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile from flopy.utils.gridutil import get_disv_kwargs + +from framework import TestFramework from prt_test_utils import ( all_equal, check_budget_data, @@ -29,8 +31,6 @@ plot_nodes_and_vertices, ) -from framework import TestFramework - simname = "prtdisv1" cases = [f"{simname}", f"{simname}bprp", f"{simname}trts", f"{simname}trtf"] diff --git a/autotest/test_prt_drape.py b/autotest/test_prt_drape.py index 09d50eb5220..f27b2e81d0d 100644 --- a/autotest/test_prt_drape.py +++ b/autotest/test_prt_drape.py @@ -18,11 +18,11 @@ import pandas as pd import pytest from flopy.utils.binaryfile import HeadFile -from prt_test_utils import all_equal, check_track_data, get_model_name from framework import TestFramework +from prt_test_utils import all_equal, check_track_data, get_model_name -simname = "prtfmi09" +simname = "prtdrape" cases = [simname, f"{simname}_drp"] nlay, nrow, ncol = 2, 1, 5 chdheads = [25.0] diff --git a/autotest/test_prt_exg.py b/autotest/test_prt_exg.py index 1e3a9fafdaa..f1ca6903312 100644 --- a/autotest/test_prt_exg.py +++ b/autotest/test_prt_exg.py @@ -23,9 +23,9 @@ import pytest from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile -from prt_test_utils import FlopyReadmeCase, check_budget_data, check_track_data from framework import TestFramework +from prt_test_utils import FlopyReadmeCase, check_budget_data, check_track_data simname = "prtexg01" cases = [simname, f"{simname}bnms"] diff --git a/autotest/test_prt_fmi.py b/autotest/test_prt_fmi.py index bccb176639b..7986007f721 100644 --- a/autotest/test_prt_fmi.py +++ b/autotest/test_prt_fmi.py @@ -36,6 +36,8 @@ import pytest from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile + +from framework import TestFramework from prt_test_utils import ( FlopyReadmeCase, all_equal, @@ -46,8 +48,6 @@ has_default_boundnames, ) -from framework import TestFramework - simname = "prtfmi01" cases = [simname, f"{simname}saws", f"{simname}bprp"] diff --git a/autotest/test_prt_release_timing.py b/autotest/test_prt_release_timing.py index 82f1d6d3965..3a3cfcad606 100644 --- a/autotest/test_prt_release_timing.py +++ b/autotest/test_prt_release_timing.py @@ -36,6 +36,8 @@ import pytest from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile + +from framework import TestFramework from prt_test_utils import ( FlopyReadmeCase, all_equal, @@ -45,8 +47,6 @@ get_partdata, ) -from framework import TestFramework - simname = "prtrelt" cases = [ # options block options diff --git a/autotest/test_prt_stop_zones.py b/autotest/test_prt_stop_zones.py index aef6fe3bc8b..a7e354dd87a 100644 --- a/autotest/test_prt_stop_zones.py +++ b/autotest/test_prt_stop_zones.py @@ -33,6 +33,8 @@ from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile from matplotlib.collections import LineCollection + +from framework import TestFramework from prt_test_utils import ( FlopyReadmeCase, check_budget_data, @@ -40,8 +42,6 @@ get_model_name, ) -from framework import TestFramework - simname = "prtfmi03" cases = [f"{simname}_l1", f"{simname}_l2"] stopzone_cells = [(0, 1, 8), (0, 8, 1)] diff --git a/autotest/test_prt_ternary_methods.py b/autotest/test_prt_ternary_methods.py index c630d65c18e..4208d2be7c4 100644 --- a/autotest/test_prt_ternary_methods.py +++ b/autotest/test_prt_ternary_methods.py @@ -14,7 +14,6 @@ finding methods for total runtime comparison. """ -from math import isclose from pathlib import Path import flopy @@ -25,18 +24,18 @@ from flopy.discretization import VertexGrid from flopy.utils import GridIntersect from flopy.utils.triangle import Triangle -from prt_test_utils import get_model_name from shapely.geometry import LineString from framework import TestFramework +from prt_test_utils import get_model_name from test_prt_triangle import ( active_domain, - nlay, - top, botm, - porosity, - get_tri, build_gwf_sim, + get_tri, + nlay, + porosity, + top, ) simname = "prtter" diff --git a/autotest/test_prt_track_events.py b/autotest/test_prt_track_events.py index 1c16253bcbd..6f984731442 100644 --- a/autotest/test_prt_track_events.py +++ b/autotest/test_prt_track_events.py @@ -33,6 +33,8 @@ import pytest from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile + +from framework import TestFramework from prt_test_utils import ( FlopyReadmeCase, check_budget_data, @@ -40,8 +42,6 @@ get_model_name, ) -from framework import TestFramework - simname = "prtevnt" cases = [ f"{simname}all", diff --git a/autotest/test_prt_triangle.py b/autotest/test_prt_triangle.py index fc9bb94da7d..bf2ba804b58 100644 --- a/autotest/test_prt_triangle.py +++ b/autotest/test_prt_triangle.py @@ -21,10 +21,10 @@ from flopy.discretization import VertexGrid from flopy.utils import GridIntersect from flopy.utils.triangle import Triangle -from prt_test_utils import get_model_name from shapely.geometry import LineString from framework import TestFramework +from prt_test_utils import get_model_name simname = "prttri" cases = [f"{simname}r2l", f"{simname}diag"] diff --git a/autotest/test_prt_voronoi1.py b/autotest/test_prt_voronoi1.py index 9b3ce29ac19..fd32f856ba3 100644 --- a/autotest/test_prt_voronoi1.py +++ b/autotest/test_prt_voronoi1.py @@ -29,11 +29,11 @@ from flopy.utils import GridIntersect from flopy.utils.triangle import Triangle from flopy.utils.voronoi import VoronoiGrid -from prt_test_utils import get_model_name -from shapely.geometry import LineString, Point from modflow_devtools.misc import is_in_ci +from shapely.geometry import LineString, Point from framework import TestFramework +from prt_test_utils import get_model_name simname = "prtvor1" cases = [f"{simname}l2r", f"{simname}welp", f"{simname}weli"] @@ -78,34 +78,164 @@ def build_gwf_sim(name, ws, targets): grid = get_grid(ws / "grid", targets) vgrid = VertexGrid(**grid.get_gridprops_vertexgrid(), nlay=1) ibd = np.zeros(vgrid.ncpl, dtype=int) - gi = GridIntersect(vgrid) + + # Intersecting points with the grid is slow, so below we + # hardcode the known cell IDs; if this test changes they + # will need to be recomputed. + # gi = GridIntersect(vgrid) # identify cells on left edge - line = LineString([(xmin, ymin), (xmin, ymax)]) - cells_left = gi.intersect(line)["cellids"] - cells_left = np.array(list(cells_left)) - ibd[cells_left] = 1 + # line = LineString([(xmin, ymin), (xmin, ymax)]) + # cells_left = gi.intersect(line)["cellids"] + left_cells = [ + 0, + 3, + 1197, + 1268, + 1442, + 1443, + 1459, + 1461, + 1474, + 1499, + 1515, + 1520, + 1529, + 1545, + 1552, + 1563, + 1581, + 1584, + 1586, + 1590, + 1596, + 1608, + 1609, + 1614, + 1616, + 1625, + 1643, + 1649, + 1652, + 1655, + 1659, + 1662, + ] + left_cells = np.array(list(left_cells)) + ibd[left_cells] = 1 # identify cells on right edge - line = LineString([(xmax, ymin), (xmax, ymax)]) - cells_right = gi.intersect(line)["cellids"] - cells_right = np.array(list(cells_right)) - ibd[cells_right] = 2 + # line = LineString([(xmax, ymin), (xmax, ymax)]) + # cells_right = gi.intersect(line)["cellids"] + right_cells = [ + 1, + 2, + 6, + 12, + 210, + 399, + 400, + 406, + 412, + 421, + 519, + 559, + 601, + 605, + 617, + 623, + 624, + 674, + 770, + 783, + 785, + 786, + 792, + 793, + 801, + 809, + 812, + 813, + 814, + 920, + ] + right_cells = np.array(list(right_cells)) + ibd[right_cells] = 2 # identify cells on bottom edge - line = LineString([(xmin, ymin), (xmax, ymin)]) - cells_bottom = gi.intersect(line)["cellids"] - cells_bottom = np.array(list(cells_bottom)) - ibd[cells_bottom] = 3 - - # identify release cell - point = Point((500, 500)) - cells2 = gi.intersect(point)["cellids"] - cells2 = np.array(list(cells2)) + # line = LineString([(xmin, ymin), (xmax, ymin)]) + # cells_bottom = gi.intersect(line)["cellids"] + bottom_cells = [ + 0, + 1, + 4, + 8, + 258, + 274, + 308, + 328, + 332, + 333, + 334, + 342, + 343, + 345, + 347, + 353, + 354, + 355, + 439, + 445, + 456, + 460, + 465, + 475, + 479, + 485, + 516, + 527, + 533, + 541, + 631, + 752, + 810, + 819, + 824, + 830, + 832, + 834, + 835, + 927, + 929, + 932, + 1091, + 1096, + 1207, + 1212, + 1215, + 1217, + 1242, + 1247, + 1249, + 1257, + 1262, + 1269, + 1276, + 1389, + 1393, + 1447, + 1455, + 1462, + 1677, + 1685, + ] + bottom_cells = np.array(list(bottom_cells)) + ibd[bottom_cells] = 3 - # identify well cell - points = [Point((1200, 500)), Point((700, 200)), Point((1600, 700))] - well_cells = [vgrid.intersect(p.x, p.y) for p in points] + # identify well cells + # points = [Point((1200, 500)), Point((700, 200)), Point((1600, 700))] + # well_cells = [vgrid.intersect(p.x, p.y) for p in points] + well_cells = [163, 1178, 67] # create simulation sim = flopy.mf6.MFSimulation( @@ -147,14 +277,14 @@ def build_gwf_sim(name, ws, targets): chdlist = [] icpl_seen = [] - for icpl in cells_left: + for icpl in left_cells: chdlist.append([(0, icpl), 1.0]) icpl_seen.append(icpl) - for icpl in cells_right: + for icpl in right_cells: chdlist.append([(0, icpl), 0.0]) icpl_seen.append(icpl) if "wel" in name: - for icpl in cells_bottom: + for icpl in bottom_cells: if icpl in icpl_seen: continue chdlist.append([(0, icpl), 0.8]) @@ -166,10 +296,15 @@ def build_gwf_sim(name, ws, targets): saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], printrecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], ) - return sim + return sim, { + "left": left_cells, + "right": right_cells, + "bottom": bottom_cells, + "well": well_cells, + } -def build_prt_sim(idx, name, gwf_ws, prt_ws, targets): +def build_prt_sim(idx, name, gwf_ws, prt_ws, targets, cell_ids): prt_ws = Path(prt_ws) gwf_name = get_model_name(name, "gwf") prt_name = get_model_name(name, "prt") @@ -179,23 +314,16 @@ def build_prt_sim(idx, name, gwf_ws, prt_ws, targets): gridprops = grid.get_gridprops_vertexgrid() vgrid = VertexGrid(**gridprops, nlay=1) ibd = np.zeros(vgrid.ncpl, dtype=int) - gi = GridIntersect(vgrid) # identify cells on left edge - line = LineString([(xmin, ymin), (xmin, ymax)]) - cells0 = gi.intersect(line)["cellids"] - cells0 = np.array(list(cells0)) - ibd[cells0] = 1 + left_cells = cell_ids["left"] + left_cells = np.array(list(left_cells)) + ibd[left_cells] = 1 # identify cells on right edge - line = LineString([(xmax, ymin), (xmax, ymax)]) - cells1 = gi.intersect(line)["cellids"] - cells1 = np.array(list(cells1)) - ibd[cells1] = 2 - - # identify well cell - point = Point((800, 500)) - cell_wel = vgrid.intersect(point.x, point.y) + right_cells = cell_ids["right"] + right_cells = np.array(list(right_cells)) + ibd[right_cells] = 2 # create simulation sim = flopy.mf6.MFSimulation( @@ -259,9 +387,14 @@ def build_prt_sim(idx, name, gwf_ws, prt_ws, targets): def build_models(idx, test): - gwf_sim = build_gwf_sim(test.name, test.workspace, test.targets) + gwf_sim, cell_ids = build_gwf_sim(test.name, test.workspace, test.targets) prt_sim = build_prt_sim( - idx, test.name, test.workspace, test.workspace / "prt", test.targets + idx, + test.name, + test.workspace, + test.workspace / "prt", + test.targets, + cell_ids, ) return gwf_sim, prt_sim @@ -289,7 +422,6 @@ def check_output(idx, test): ) if "l2r" in name: - # assert pls.shape == (212, 16) assert (pls.z == 0.5).all() # no z change # path should be horizontal from left to right assert isclose(min(pls.x), 20, rel_tol=1e-4) @@ -402,7 +534,6 @@ def callback(mesh, value): p.show() -@pytest.mark.slow @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): if ( diff --git a/autotest/test_prt_voronoi2.py b/autotest/test_prt_voronoi2.py index 89ba0c666e4..b3a01c1b1cf 100644 --- a/autotest/test_prt_voronoi2.py +++ b/autotest/test_prt_voronoi2.py @@ -26,10 +26,11 @@ from flopy.utils import GridIntersect from flopy.utils.triangle import Triangle from flopy.utils.voronoi import VoronoiGrid -from prt_test_utils import get_model_name from shapely.geometry import LineString, Point from framework import TestFramework +from prt_test_utils import get_model_name +from test_prt_voronoi1 import build_gwf_sim, get_grid simname = "prtvor2" cases = [simname] @@ -49,94 +50,6 @@ porosity = 0.1 -def get_grid(workspace, targets): - workspace.mkdir(exist_ok=True, parents=True) - tri = Triangle( - maximum_area=area_max, - angle=angle_min, - model_ws=workspace, - exe_name=targets["triangle"], - ) - poly = np.array(((xmin, ymin), (xmax, ymin), (xmax, ymax), (xmin, ymax))) - tri.add_polygon(poly) - tri.build(verbose=False) - return VoronoiGrid(tri) - - -def build_gwf_sim(name, ws, targets): - ws = Path(ws) - gwf_name = get_model_name(name, "gwf") - - # create grid - grid = get_grid(ws / "grid", targets) - vgrid = VertexGrid(**grid.get_gridprops_vertexgrid(), nlay=1) - ibd = np.zeros(vgrid.ncpl, dtype=int) - gi = GridIntersect(vgrid) - - # identify cells on left edge - line = LineString([(xmin, ymin), (xmin, ymax)]) - cells_left = gi.intersect(line)["cellids"] - cells_left = np.array(list(cells_left)) - ibd[cells_left] = 1 - - # identify cells on right edge - line = LineString([(xmax, ymin), (xmax, ymax)]) - cells_right = gi.intersect(line)["cellids"] - cells_right = np.array(list(cells_right)) - ibd[cells_right] = 2 - - # identify cells on bottom edge - line = LineString([(xmin, ymin), (xmax, ymin)]) - cells_bottom = gi.intersect(line)["cellids"] - cells_bottom = np.array(list(cells_bottom)) - ibd[cells_bottom] = 3 - - # create simulation - sim = flopy.mf6.MFSimulation( - sim_name=name, version="mf6", exe_name=targets["mf6"], sim_ws=ws - ) - tdis = flopy.mf6.ModflowTdis( - sim, time_units="DAYS", perioddata=[[1.0, 1, 1.0]] - ) - gwf = flopy.mf6.ModflowGwf(sim, modelname=gwf_name, save_flows=True) - ims = flopy.mf6.ModflowIms( - sim, - print_option="SUMMARY", - complexity="complex", - outer_dvclose=1.0e-8, - inner_dvclose=1.0e-8, - ) - disv = flopy.mf6.ModflowGwfdisv( - gwf, nlay=nlay, **grid.get_disv_gridprops(), top=top, botm=botm - ) - npf = flopy.mf6.ModflowGwfnpf( - gwf, - xt3doptions=[(True)], - k=10.0, - save_saturation=True, - save_specific_discharge=True, - ) - ic = flopy.mf6.ModflowGwfic(gwf) - - chdlist = [] - icpl_seen = [] - for icpl in cells_left: - chdlist.append([(0, icpl), 1.0]) - icpl_seen.append(icpl) - for icpl in cells_right: - chdlist.append([(0, icpl), 0.0]) - icpl_seen.append(icpl) - chd = flopy.mf6.ModflowGwfchd(gwf, stress_period_data=chdlist) - oc = flopy.mf6.ModflowGwfoc( - gwf, - budget_filerecord=f"{gwf_name}.bud", - head_filerecord=f"{gwf_name}.hds", - saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], - printrecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], - ) - return sim - - def build_gwt_sim(name, gwf_ws, gwt_ws, targets): ws = Path(gwt_ws) gwf_name = get_model_name(name, "gwf") @@ -146,12 +59,13 @@ def build_gwt_sim(name, gwf_ws, gwt_ws, targets): grid = get_grid(ws / "grid", targets) vgrid = VertexGrid(**grid.get_gridprops_vertexgrid(), nlay=1) ibd = np.zeros(vgrid.ncpl, dtype=int) - gi = GridIntersect(vgrid) + # gi = GridIntersect(vgrid) # identify release cell - point = Point((500, 500)) - cells2 = gi.intersect(point)["cellids"] - cells2 = np.array(list(cells2)) + # point = Point((500, 500)) + # release_cells = gi.intersect(point)["cellids"] + release_cells = [1294] + release_cells = np.array(list(release_cells)) sim = flopy.mf6.MFSimulation( sim_name=name, version="mf6", exe_name="mf6", sim_ws=ws @@ -182,7 +96,7 @@ def build_gwt_sim(name, gwf_ws, gwt_ws, targets): sourcerecarray = [()] ssm = flopy.mf6.ModflowGwtssm(gwt, sources=sourcerecarray) cnclist = [ - [(0, cells2[0]), 1.0], + [(0, release_cells[0]), 1.0], ] cnc = flopy.mf6.ModflowGwtcnc( gwt, maxbound=len(cnclist), stress_period_data=cnclist, pname="CNC-1" @@ -203,10 +117,10 @@ def build_gwt_sim(name, gwf_ws, gwt_ws, targets): saverecord=[("CONCENTRATION", "ALL"), ("BUDGET", "ALL")], ) - return sim + return sim, {"release": release_cells} -def build_prt_sim(name, gwf_ws, prt_ws, targets): +def build_prt_sim(name, gwf_ws, prt_ws, targets, cell_ids): prt_ws = Path(prt_ws) gwf_name = get_model_name(name, "gwf") prt_name = get_model_name(name, "prt") @@ -216,24 +130,20 @@ def build_prt_sim(name, gwf_ws, prt_ws, targets): gridprops = grid.get_gridprops_vertexgrid() vgrid = VertexGrid(**gridprops, nlay=1) ibd = np.zeros(vgrid.ncpl, dtype=int) - gi = GridIntersect(vgrid) # identify cells on left edge - line = LineString([(xmin, ymin), (xmin, ymax)]) - cells0 = gi.intersect(line)["cellids"] - cells0 = np.array(list(cells0)) - ibd[cells0] = 1 + left_cells = cell_ids["left"] + left_cells = np.array(list(left_cells)) + ibd[left_cells] = 1 # identify cells on right edge - line = LineString([(xmax, ymin), (xmax, ymax)]) - cells1 = gi.intersect(line)["cellids"] - cells1 = np.array(list(cells1)) - ibd[cells1] = 2 + right_cells = cell_ids["right"] + right_cells = np.array(list(right_cells)) + ibd[right_cells] = 2 # identify release cell - point = Point((500, 500)) - cells2 = gi.intersect(point)["cellids"] - cells2 = np.array(list(cells2)) + release_cells = cell_ids["release"] + release_cells = np.array(list(release_cells)) # create simulation sim = flopy.mf6.MFSimulation( @@ -252,7 +162,7 @@ def build_prt_sim(name, gwf_ws, prt_ws, targets): columncelldivisions=1, rowcelldivisions=1 ) data = flopy.modpath.NodeParticleData( - subdivisiondata=sddata, nodes=[cells2] + subdivisiondata=sddata, nodes=[release_cells] ) prpdata = list(data.to_prp(prt.modelgrid)) prp_track_file = f"{prt_name}.prp.trk" @@ -296,12 +206,18 @@ def build_prt_sim(name, gwf_ws, prt_ws, targets): def build_models(idx, test): - gwf_sim = build_gwf_sim(test.name, test.workspace, test.targets) - gwt_sim = build_gwt_sim( + gwf_sim, gwf_cell_ids = build_gwf_sim( + test.name, test.workspace, test.targets + ) + gwt_sim, gwt_cell_ids = build_gwt_sim( test.name, test.workspace, test.workspace / "gwt", test.targets ) prt_sim = build_prt_sim( - test.name, test.workspace, test.workspace / "prt", test.targets + test.name, + test.workspace, + test.workspace / "prt", + test.targets, + {**gwf_cell_ids, **gwt_cell_ids}, ) return gwf_sim, gwt_sim, prt_sim @@ -421,7 +337,6 @@ def callback(mesh, value): p.show() -@pytest.mark.slow @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( diff --git a/autotest/test_prt_weak_sinks.py b/autotest/test_prt_weak_sinks.py index 5ed9ee5a4e5..1f83721d028 100644 --- a/autotest/test_prt_weak_sinks.py +++ b/autotest/test_prt_weak_sinks.py @@ -33,6 +33,8 @@ import pytest from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile + +from framework import TestFramework from prt_test_utils import ( FlopyReadmeCase, check_budget_data, @@ -41,8 +43,6 @@ get_model_name, ) -from framework import TestFramework - simname = "prtfmi04" cases = [simname, f"{simname}saws"] From 6a7a2bddf357bbca13aca4bbc33061dc3b13f1e1 Mon Sep 17 00:00:00 2001 From: mjreno Date: Mon, 11 Mar 2024 11:53:24 -0400 Subject: [PATCH 061/199] refactor(idm): updates in preparation for keystring input types (#1610) * updates in preparation for keystring input types * rebuild makefiles * fix rebase conflict * some refactor and cleanup --------- Co-authored-by: mjreno --- make/makedefaults | 2 +- make/makefile | 99 +-- msvs/mf6core.vfproj | 5 +- src/Utilities/Idm/BoundInputContext.f90 | 521 ++++++---------- src/Utilities/Idm/DefinitionSelect.f90 | 79 ++- src/Utilities/Idm/DynamicPackageParams.f90 | 391 ++++++++++++ src/Utilities/Idm/IdmLoad.f90 | 27 +- src/Utilities/Idm/InputDefinition.f90 | 47 +- src/Utilities/Idm/InputLoadType.f90 | 92 +-- src/Utilities/Idm/SourceCommon.f90 | 35 +- .../Idm/mf6blockfile/AsciiInputLoadType.f90 | 19 +- src/Utilities/Idm/mf6blockfile/IdmMf6File.f90 | 231 +++---- .../Idm/mf6blockfile/LoadMf6File.f90 | 577 ++++++++++------- ...ressGridInput.f90 => Mf6FileGridInput.f90} | 296 ++++----- .../Idm/mf6blockfile/Mf6FileListInput.f90 | 585 ++++++++++++++++++ .../Idm/mf6blockfile/StressListInput.f90 | 439 ------------- .../Idm/mf6blockfile/StructArray.f90 | 309 +++++---- src/meson.build | 5 +- utils/mf5to6/make/makedefaults | 2 +- utils/mf5to6/make/makefile | 10 +- utils/zonebudget/make/makedefaults | 2 +- utils/zonebudget/make/makefile | 2 +- 22 files changed, 2209 insertions(+), 1566 deletions(-) create mode 100644 src/Utilities/Idm/DynamicPackageParams.f90 rename src/Utilities/Idm/mf6blockfile/{StressGridInput.f90 => Mf6FileGridInput.f90} (60%) create mode 100644 src/Utilities/Idm/mf6blockfile/Mf6FileListInput.f90 delete mode 100644 src/Utilities/Idm/mf6blockfile/StressListInput.f90 diff --git a/make/makedefaults b/make/makedefaults index 88e1790887a..0e275ee6477 100644 --- a/make/makedefaults +++ b/make/makedefaults @@ -1,4 +1,4 @@ -# makedefaults created by pymake (version 1.2.9.dev0) for the 'mf6' executable. +# makedefaults created by pymake (version 1.2.9) for the 'mf6' executable. # determine OS ifeq ($(OS), Windows_NT) diff --git a/make/makefile b/make/makefile index 09d4d953710..424ef2c76b5 100644 --- a/make/makefile +++ b/make/makefile @@ -1,46 +1,46 @@ -# makefile created by pymake (version 1.2.9.dev0) for the 'mf6' executable. +# makefile created by pymake (version 1.2.9) for the 'mf6' executable. include ./makedefaults # Define the source file directories SOURCEDIR1=../src -SOURCEDIR2=../src/Model -SOURCEDIR3=../src/Model/SurfaceWaterFlow -SOURCEDIR4=../src/Model/TransportModel -SOURCEDIR5=../src/Model/GroundWaterFlow -SOURCEDIR6=../src/Model/GroundWaterEnergy -SOURCEDIR7=../src/Model/Geometry -SOURCEDIR8=../src/Model/ParticleTracking -SOURCEDIR9=../src/Model/Discretization -SOURCEDIR10=../src/Model/ModelUtilities -SOURCEDIR11=../src/Model/GroundWaterTransport -SOURCEDIR12=../src/Model/Connection -SOURCEDIR13=../src/Idm -SOURCEDIR14=../src/Idm/selector -SOURCEDIR15=../src/Distributed -SOURCEDIR16=../src/Utilities -SOURCEDIR17=../src/Utilities/Idm -SOURCEDIR18=../src/Utilities/Idm/mf6blockfile -SOURCEDIR19=../src/Utilities/Vector -SOURCEDIR20=../src/Utilities/Matrix -SOURCEDIR21=../src/Utilities/Observation -SOURCEDIR22=../src/Utilities/ArrayRead -SOURCEDIR23=../src/Utilities/OutputControl -SOURCEDIR24=../src/Utilities/Libraries -SOURCEDIR25=../src/Utilities/Libraries/blas -SOURCEDIR26=../src/Utilities/Libraries/rcm -SOURCEDIR27=../src/Utilities/Libraries/sparsekit -SOURCEDIR28=../src/Utilities/Libraries/sparskit2 -SOURCEDIR29=../src/Utilities/Libraries/daglib -SOURCEDIR30=../src/Utilities/Memory -SOURCEDIR31=../src/Utilities/TimeSeries -SOURCEDIR32=../src/Timing -SOURCEDIR33=../src/Solution -SOURCEDIR34=../src/Solution/ParticleTracker -SOURCEDIR35=../src/Solution/PETSc -SOURCEDIR36=../src/Solution/LinearMethods -SOURCEDIR37=../src/Exchange +SOURCEDIR2=../src/Exchange +SOURCEDIR3=../src/Idm +SOURCEDIR4=../src/Idm/selector +SOURCEDIR5=../src/Timing +SOURCEDIR6=../src/Model +SOURCEDIR7=../src/Model/Connection +SOURCEDIR8=../src/Model/Discretization +SOURCEDIR9=../src/Model/ModelUtilities +SOURCEDIR10=../src/Model/GroundWaterFlow +SOURCEDIR11=../src/Model/Geometry +SOURCEDIR12=../src/Model/TransportModel +SOURCEDIR13=../src/Model/GroundWaterTransport +SOURCEDIR14=../src/Model/SurfaceWaterFlow +SOURCEDIR15=../src/Model/ParticleTracking +SOURCEDIR16=../src/Model/GroundWaterEnergy +SOURCEDIR17=../src/Solution +SOURCEDIR18=../src/Solution/ParticleTracker +SOURCEDIR19=../src/Solution/LinearMethods +SOURCEDIR20=../src/Solution/PETSc +SOURCEDIR21=../src/Distributed +SOURCEDIR22=../src/Utilities +SOURCEDIR23=../src/Utilities/TimeSeries +SOURCEDIR24=../src/Utilities/Idm +SOURCEDIR25=../src/Utilities/Idm/mf6blockfile +SOURCEDIR26=../src/Utilities/ArrayRead +SOURCEDIR27=../src/Utilities/Memory +SOURCEDIR28=../src/Utilities/Matrix +SOURCEDIR29=../src/Utilities/Vector +SOURCEDIR30=../src/Utilities/Observation +SOURCEDIR31=../src/Utilities/OutputControl +SOURCEDIR32=../src/Utilities/Libraries +SOURCEDIR33=../src/Utilities/Libraries/rcm +SOURCEDIR34=../src/Utilities/Libraries/sparskit2 +SOURCEDIR35=../src/Utilities/Libraries/sparsekit +SOURCEDIR36=../src/Utilities/Libraries/blas +SOURCEDIR37=../src/Utilities/Libraries/daglib VPATH = \ ${SOURCEDIR1} \ @@ -246,6 +246,7 @@ $(OBJDIR)/GwfVscInputData.o \ $(OBJDIR)/gwf-ghb.o \ $(OBJDIR)/gwf-drn.o \ $(OBJDIR)/IndexMap.o \ +$(OBJDIR)/ArrayReaderBase.o \ $(OBJDIR)/MethodSubcellPool.o \ $(OBJDIR)/CellPoly.o \ $(OBJDIR)/CellRectQuad.o \ @@ -269,7 +270,7 @@ $(OBJDIR)/InterfaceMap.o \ $(OBJDIR)/SeqVector.o \ $(OBJDIR)/ImsLinearSettings.o \ $(OBJDIR)/ConvergenceSummary.o \ -$(OBJDIR)/ArrayReaderBase.o \ +$(OBJDIR)/Integer2dReader.o \ $(OBJDIR)/MethodCellTernary.o \ $(OBJDIR)/MethodCellPollockQuad.o \ $(OBJDIR)/MethodCellPollock.o \ @@ -300,9 +301,13 @@ $(OBJDIR)/VirtualSolution.o \ $(OBJDIR)/SparseMatrix.o \ $(OBJDIR)/LinearSolverBase.o \ $(OBJDIR)/ImsReordering.o \ +$(OBJDIR)/StructVector.o \ $(OBJDIR)/ModflowInput.o \ $(OBJDIR)/IdmLogger.o \ -$(OBJDIR)/Integer2dReader.o \ +$(OBJDIR)/Integer1dReader.o \ +$(OBJDIR)/Double2dReader.o \ +$(OBJDIR)/Double1dReader.o \ +$(OBJDIR)/DefinitionSelect.o \ $(OBJDIR)/DislGeom.o \ $(OBJDIR)/SwfCxsUtils.o \ $(OBJDIR)/MethodCellPool.o \ @@ -344,12 +349,10 @@ $(OBJDIR)/gwe-cnd.o \ $(OBJDIR)/RouterBase.o \ $(OBJDIR)/ImsLinearSolver.o \ $(OBJDIR)/ImsLinearBase.o \ -$(OBJDIR)/StructVector.o \ -$(OBJDIR)/DefinitionSelect.o \ +$(OBJDIR)/StructArray.o \ +$(OBJDIR)/LayeredArrayReader.o \ +$(OBJDIR)/DynamicPackageParams.o \ $(OBJDIR)/InputLoadType.o \ -$(OBJDIR)/Integer1dReader.o \ -$(OBJDIR)/Double2dReader.o \ -$(OBJDIR)/Double1dReader.o \ $(OBJDIR)/swf-disl.o \ $(OBJDIR)/swf-cxs.o \ $(OBJDIR)/swf-ic.o \ @@ -367,10 +370,9 @@ $(OBJDIR)/Timer.o \ $(OBJDIR)/LinearSolverFactory.o \ $(OBJDIR)/ImsLinear.o \ $(OBJDIR)/BaseSolution.o \ -$(OBJDIR)/StructArray.o \ +$(OBJDIR)/LoadMf6File.o \ $(OBJDIR)/BoundInputContext.o \ $(OBJDIR)/AsciiInputLoadType.o \ -$(OBJDIR)/LayeredArrayReader.o \ $(OBJDIR)/swf-zdg.o \ $(OBJDIR)/swf-sto.o \ $(OBJDIR)/swf-oc.o \ @@ -392,9 +394,8 @@ $(OBJDIR)/exg-gwegwe.o \ $(OBJDIR)/RouterFactory.o \ $(OBJDIR)/NumericalSolution.o \ $(OBJDIR)/MappedMemory.o \ -$(OBJDIR)/StressListInput.o \ -$(OBJDIR)/StressGridInput.o \ -$(OBJDIR)/LoadMf6File.o \ +$(OBJDIR)/Mf6FileListInput.o \ +$(OBJDIR)/Mf6FileGridInput.o \ $(OBJDIR)/swf.o \ $(OBJDIR)/prt.o \ $(OBJDIR)/ExplicitSolution.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index f34e74acfb3..d56119c92ff 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -409,12 +409,13 @@ - - + + + diff --git a/src/Utilities/Idm/BoundInputContext.f90 b/src/Utilities/Idm/BoundInputContext.f90 index 2afa3bdf041..fd6af60c6a4 100644 --- a/src/Utilities/Idm/BoundInputContext.f90 +++ b/src/Utilities/Idm/BoundInputContext.f90 @@ -7,15 +7,25 @@ module BoundInputContextModule use KindModule, only: DP, I4B, LGP - use ConstantsModule, only: DZERO, IZERO, LENAUXNAME, LENVARNAME, LENBOUNDNAME + use ConstantsModule, only: DZERO, IZERO, LINELENGTH, LENAUXNAME, & + LENVARNAME, LENBOUNDNAME use SimVariablesModule, only: errmsg use SimModule, only: store_error, store_error_filename use ModflowInputModule, only: ModflowInputType + use InputDefinitionModule, only: InputParamDefinitionType use CharacterStringModule, only: CharacterStringType + use DynamicPackageParamsModule, only: DynamicPackageParamsType implicit none private public :: BoundInputContextType + public :: ReadStateVarType + + !> @brief Pointer type for read state variable + !< + type ReadStateVarType + integer, pointer :: invar + end type ReadStateVarType !> @brief derived type for boundary package input context !! @@ -39,28 +49,26 @@ module BoundInputContextModule real(DP), dimension(:, :), pointer, & contiguous :: auxvar => null() !< auxiliary variable array integer(I4B), dimension(:), pointer, contiguous :: mshape => null() !< model shape - character(len=LENVARNAME), dimension(:), allocatable :: filtcols !< list input in scope columns - integer(I4B) :: nfiltcol !< list input number of in scope columns logical(LGP) :: readasarrays !< grid or list based input + type(DynamicPackageParamsType) :: package_params type(ModflowInputType) :: mf6_input !< description of input contains - procedure :: init => bndctx_init - procedure :: create_context - procedure :: enable - procedure :: bound_params_allocate - procedure :: param_init - procedure :: allocate_read_state_var - procedure :: destroy => bndctx_destroy - procedure :: set_filtered_cols - procedure :: filtered_cols + procedure :: create + procedure :: allocate_scalars + procedure :: allocate_arrays + procedure :: list_params_create + procedure :: array_params_create + procedure :: destroy + procedure :: rsv_alloc + procedure :: bound_params end type BoundInputContextType contains - !> @brief initialize boundary input context + !> @brief create boundary input context !! !< - subroutine bndctx_init(this, mf6_input, readasarrays) + subroutine create(this, mf6_input, readasarrays) ! -- modules ! -- dummy class(BoundInputContextType) :: this @@ -71,27 +79,21 @@ subroutine bndctx_init(this, mf6_input, readasarrays) this%readasarrays = readasarrays ! ! -- create the dynamic package input context - call this%create_context() - ! - ! -- determine in scope list input columns - if (.not. readasarrays) then - call this%set_filtered_cols() - end if + call this%allocate_scalars() ! ! --return return - end subroutine bndctx_init + end subroutine create !> @brief create boundary input context !! !< - subroutine create_context(this) + subroutine allocate_scalars(this) ! -- modules use MemoryManagerModule, only: mem_allocate, mem_setptr, get_isize use MemoryManagerExtModule, only: mem_set_value ! -- dummy class(BoundInputContextType) :: this - integer(I4B), dimension(:, :), pointer, contiguous :: cellid => null() logical(LGP) :: found ! ! -- set pointers to defined scalars @@ -112,7 +114,6 @@ subroutine create_context(this) this%maxbound = 0 this%inamedbound = 0 this%iprpak = 0 - this%nfiltcol = 0 ! ! -- update optional scalars call mem_set_value(this%inamedbound, 'BOUNDNAMES', this%mf6_input%mempath, & @@ -120,49 +121,52 @@ subroutine create_context(this) call mem_set_value(this%maxbound, 'MAXBOUND', this%mf6_input%mempath, found) call mem_set_value(this%iprpak, 'IPRPAK', this%mf6_input%mempath, found) ! - ! -- set pointers to defined arrays + ! -- set pointer to model shape call mem_setptr(this%mshape, 'MODEL_SHAPE', & this%mf6_input%component_mempath) ! - ! -- update ncpl as shape is known + ! -- update ncpl from model shape if (size(this%mshape) == 2) then this%ncpl = this%mshape(2) else if (size(this%mshape) == 3) then this%ncpl = this%mshape(2) * this%mshape(3) end if ! - ! -- set auxname_cst and iauxmultcol - if (this%naux > 0) then - call mem_setptr(this%auxname_cst, 'AUXILIARY', this%mf6_input%mempath) - else - call mem_allocate(this%auxname_cst, LENAUXNAME, 0, & - 'AUXILIARY', this%mf6_input%mempath) - end if - ! - ! -- allocate cellid if this is not list input - if (this%readasarrays) then - call mem_allocate(cellid, 0, 0, 'CELLID', this%mf6_input%mempath) - end if + ! -- initialize package params object + call this%package_params%init(this%mf6_input, this%readasarrays, & + this%naux, this%inamedbound) ! ! -- return return - end subroutine create_context + end subroutine allocate_scalars - !> @brief enable bound input context + !> @brief allocate_arrays !! - !! This routine should be invoked after the loader allocates dynamic - !! input params. This routine will assign pointers to arrays if they - !! have been allocated and allocate the arrays if not. + !! allocate bound input context arrays !! !< - subroutine enable(this) + subroutine allocate_arrays(this) ! -- modules use MemoryManagerModule, only: mem_allocate, mem_setptr, get_isize use MemoryManagerExtModule, only: mem_set_value ! -- dummy class(BoundInputContextType) :: this + integer(I4B), dimension(:, :), pointer, contiguous :: cellid ! -- local ! + ! -- set auxname_cst and iauxmultcol + if (this%naux > 0) then + call mem_setptr(this%auxname_cst, 'AUXILIARY', this%mf6_input%mempath) + else + call mem_allocate(this%auxname_cst, LENAUXNAME, 0, & + 'AUXILIARY', this%mf6_input%mempath) + end if + ! + ! -- allocate cellid if this is not list input + if (this%readasarrays) then + call mem_allocate(cellid, 0, 0, 'CELLID', this%mf6_input%mempath) + end if + ! ! -- allocate or set pointer to BOUNDNAME if (this%inamedbound == 0) then call mem_allocate(this%boundname_cst, LENBOUNDNAME, 0, & @@ -182,194 +186,148 @@ subroutine enable(this) ! ! -- return return - end subroutine enable + end subroutine allocate_arrays - !> @brief allocate a read state variable - !! - !! Create and set a read state variable, e.g. 'INRECHARGE', - !! which are updated per iper load as follows: - !! -1: unset, not in use - !! 0: not read in most recent period block - !! 1: numeric input read in most recent period block - !! 2: time series input read in most recent period block - !! - !< - function allocate_read_state_var(this, mf6varname) result(varname) + subroutine list_params_create(this, params, nparam, input_name) ! -- modules - use MemoryManagerModule, only: mem_setptr, mem_allocate + use InputDefinitionModule, only: InputParamDefinitionType + use DefinitionSelectModule, only: get_param_definition_type + use DynamicPackageParamsModule, only: allocate_param_int1d, & + allocate_param_int2d, & + allocate_param_dbl1d, & + allocate_param_dbl2d, & + allocate_param_charstr ! -- dummy class(BoundInputContextType) :: this - character(len=*), intent(in) :: mf6varname - ! -- locals - character(len=LENVARNAME) :: varname - integer(I4B) :: ilen - integer(I4B), pointer :: intvar - character(len=2) :: prefix = 'IN' - ! - ! -- assign first column as the block number - ilen = len_trim(mf6varname) - ! - if (ilen > (LENVARNAME - len(prefix))) then - varname = prefix//mf6varname(1:(LENVARNAME - len(prefix))) - else - varname = prefix//trim(mf6varname) - end if - ! - call mem_allocate(intvar, varname, this%mf6_input%mempath) - intvar = -1 + character(len=*), dimension(:), allocatable, intent(in) :: params + integer(I4B), intent(in) :: nparam + character(len=*), intent(in) :: input_name + ! -- local + type(InputParamDefinitionType), pointer :: idt + integer(I4B) :: iparam + ! + ! -- + do iparam = 1, nparam + idt => get_param_definition_type(this%mf6_input%param_dfns, & + this%mf6_input%component_type, & + this%mf6_input%subcomponent_type, & + 'PERIOD', params(iparam), '') + ! + ! allocate based on dfn datatype + select case (idt%datatype) + case ('INTEGER') + call allocate_param_int1d(this%maxbound, idt%mf6varname, & + this%mf6_input%mempath) + ! + case ('DOUBLE') + call allocate_param_dbl1d(this%maxbound, idt%mf6varname, & + this%mf6_input%mempath) + ! + case ('STRING') + call allocate_param_charstr(LENBOUNDNAME, this%maxbound, idt%mf6varname, & + this%mf6_input%mempath) + ! + case ('INTEGER1D') + if (idt%shape == 'NCELLDIM') then + call allocate_param_int2d(size(this%mshape), this%maxbound, & + idt%mf6varname, this%mf6_input%mempath) + else + errmsg = 'IDM unimplemented. BoundInputContext::list_params_create & + &shape='//trim(idt%shape) + call store_error(errmsg) + call store_error_filename(input_name) + end if + ! + case ('DOUBLE1D') + if (idt%shape == 'NAUX') then + call allocate_param_dbl2d(this%naux, this%maxbound, & + idt%mf6varname, this%mf6_input%mempath) + else + errmsg = 'IDM unimplemented. BoundInputContext::list_params_create & + &tagname='//trim(idt%tagname) + call store_error(errmsg) + call store_error_filename(input_name) + end if + ! + case default + errmsg = 'IDM unimplemented. BoundInputContext::list_params_create & + &datatype='//trim(idt%datatype) + call store_error(errmsg) + call store_error_filename(input_name) + end select + end do ! ! -- return return - end function allocate_read_state_var + end subroutine list_params_create - !> @brief allocate dfn period block parameters + !> @brief allocate dfn array input period block parameters !! !! Currently supports numeric (i.e. array based) params !! !< - subroutine bound_params_allocate(this, sourcename) + subroutine array_params_create(this, params, nparam, input_name) ! -- modules - use MemoryManagerModule, only: mem_allocate - use InputDefinitionModule, only: InputParamDefinitionType + use DefinitionSelectModule, only: get_param_definition_type + use DynamicPackageParamsModule, only: allocate_param_int1d, & + allocate_param_dbl1d, & + allocate_param_dbl2d ! -- dummy class(BoundInputContextType) :: this - character(len=*) :: sourcename + character(len=*), dimension(:), allocatable, intent(in) :: params + integer(I4B), intent(in) :: nparam + character(len=*), intent(in) :: input_name + ! -- local type(InputParamDefinitionType), pointer :: idt - integer(I4B), dimension(:), pointer, contiguous :: int1d - real(DP), dimension(:), pointer, contiguous :: dbl1d - real(DP), dimension(:, :), pointer, contiguous :: dbl2d - integer(I4B) :: iparam, n, m - ! - ! -- list input allocates via structarray - if (.not. this%readasarrays) then - call store_error('Programming error. (IDM) Bound context unsupported & - &list based param allocation.') - call store_error_filename(sourcename) - end if + integer(I4B) :: iparam ! ! -- allocate dfn input params - do iparam = 1, size(this%mf6_input%param_dfns) + do iparam = 1, nparam ! ! -- assign param definition pointer - idt => this%mf6_input%param_dfns(iparam) + idt => get_param_definition_type(this%mf6_input%param_dfns, & + this%mf6_input%component_type, & + this%mf6_input%subcomponent_type, & + 'PERIOD', params(iparam), '') ! if (idt%blockname == 'PERIOD') then - ! - ! allocate based on dfn datatype select case (idt%datatype) case ('INTEGER1D') - ! - call mem_allocate(int1d, this%ncpl, idt%mf6varname, & - this%mf6_input%mempath) - ! - do n = 1, this%ncpl - int1d(n) = IZERO - end do + call allocate_param_int1d(this%ncpl, idt%mf6varname, & + this%mf6_input%mempath) ! case ('DOUBLE1D') - ! - call mem_allocate(dbl1d, this%ncpl, idt%mf6varname, & - this%mf6_input%mempath) - ! - do n = 1, this%ncpl - dbl1d(n) = DZERO - end do + call allocate_param_dbl1d(this%ncpl, idt%mf6varname, & + this%mf6_input%mempath) ! case ('DOUBLE2D') - ! - call mem_allocate(dbl2d, this%naux, this%ncpl, & - idt%mf6varname, this%mf6_input%mempath) - ! - do m = 1, this%ncpl - do n = 1, this%naux - dbl2d(n, m) = DZERO - end do - end do + call allocate_param_dbl2d(this%naux, this%ncpl, idt%mf6varname, & + this%mf6_input%mempath) ! case default - call store_error('Programming error. (IDM) Bound context unsupported & - &data type allocation for param='//trim(idt%tagname)) - call store_error_filename(sourcename) + errmsg = 'IDM unimplemented. BoundInputContext::array_params_create & + &datatype='//trim(idt%datatype) + call store_error(errmsg) + call store_error_filename(input_name) end select - ! end if end do ! - ! -- enable - call this%enable() - ! ! -- return return - end subroutine bound_params_allocate - - subroutine param_init(this, datatype, varname, mempath, sourcename) - ! -- modules - use MemoryManagerModule, only: mem_setptr - ! -- dummy - class(BoundInputContextType) :: this - character(len=*), intent(in) :: datatype - character(len=*), intent(in) :: varname - character(len=*), intent(in) :: mempath - character(len=*), intent(in) :: sourcename - ! -- locals - integer(I4B), dimension(:), pointer, contiguous :: int1d - real(DP), dimension(:), pointer, contiguous :: dbl1d - real(DP), dimension(:, :), pointer, contiguous :: dbl2d - type(CharacterStringType), dimension(:), pointer, & - contiguous :: charstr1d => null() - integer(I4B) :: n, m - ! - select case (datatype) - case ('INTEGER1D') - ! - call mem_setptr(int1d, varname, mempath) - do n = 1, this%ncpl - int1d(n) = IZERO - end do - ! - case ('DOUBLE1D') - ! - call mem_setptr(dbl1d, varname, mempath) - do n = 1, this%ncpl - dbl1d(n) = DZERO - end do - ! - case ('DOUBLE2D') - ! - call mem_setptr(dbl2d, varname, mempath) - do m = 1, this%ncpl - do n = 1, this%naux - dbl2d(n, m) = DZERO - end do - end do - ! - case ('CHARSTR1D') - ! - call mem_setptr(charstr1d, varname, mempath) - do n = 1, size(charstr1d) - charstr1d(n) = '' - end do - ! - case default - ! - call store_error('Programming error. (IDM) Bound context unsupported & - &data type initialization for param='//trim(varname)) - call store_error_filename(sourcename) - ! - end select - ! - ! -- return - return - end subroutine param_init + end subroutine array_params_create !> @brief destroy boundary input context !! !< - subroutine bndctx_destroy(this) + subroutine destroy(this) ! -- modules ! -- dummy class(BoundInputContextType) :: this ! + ! -- destroy package params object + call this%package_params%destroy() + ! ! -- deallocate deallocate (this%maxbound) deallocate (this%inamedbound) @@ -387,175 +345,94 @@ subroutine bndctx_destroy(this) nullify (this%auxvar) nullify (this%mshape) ! - deallocate (this%filtcols) - ! ! --return return - end subroutine bndctx_destroy + end subroutine destroy - !> @brief create array of in scope list input columns + !> @brief allocate a read state variable + !! + !! Create and set a read state variable, e.g. 'INRECHARGE', + !! which are updated per iper load as follows: + !! -1: unset, not in use + !! 0: not read in most recent period block + !! 1: numeric input read in most recent period block + !! 2: time series input read in most recent period block !! - !! Filter the recarray description of list input parameters - !! to determine which columns are to be read in this run. !< - subroutine set_filtered_cols(this) + function rsv_alloc(this, mf6varname) result(varname) ! -- modules - use InputDefinitionModule, only: InputParamDefinitionType - use DefinitionSelectModule, only: get_aggregate_definition_type - use ArrayHandlersModule, only: expandarray - use InputOutputModule, only: parseline + use ConstantsModule, only: LENVARNAME + use MemoryManagerModule, only: mem_setptr, mem_allocate ! -- dummy class(BoundInputContextType) :: this + character(len=*), intent(in) :: mf6varname ! -- local - type(InputParamDefinitionType), pointer :: ra_idt - character(len=:), allocatable :: parse_str - character(len=LENVARNAME), dimension(:), allocatable :: dfncols - integer(I4B), dimension(:), allocatable :: idxs - integer(I4B) :: dfnncol, icol, keepcnt - logical(LGP) :: keep - ! - ! -- initialize - keepcnt = 0 - ! - ! -- get aggregate param definition for period block - ra_idt => & - get_aggregate_definition_type(this%mf6_input%aggregate_dfns, & - this%mf6_input%component_type, & - this%mf6_input%subcomponent_type, & - 'PERIOD') - ! - ! -- split recarray definition - parse_str = trim(ra_idt%datatype)//' ' - call parseline(parse_str, dfnncol, dfncols) - ! - ! -- determine which columns are in scope - do icol = 1, dfnncol - ! - keep = .false. - ! - if (dfncols(icol) == 'RECARRAY') then - ! no-op - else if (dfncols(icol) == 'AUX') then - if (this%naux > 0) then - keep = .true. - end if - else if (dfncols(icol) == 'BOUNDNAME') then - if (this%inamedbound /= 0) then - keep = .true. - end if - else - keep = pkg_param_in_scope(this%mf6_input, dfncols(icol)) - end if - ! - if (keep) then - keepcnt = keepcnt + 1 - call expandarray(idxs) - idxs(keepcnt) = icol - end if - end do - ! - ! -- update nfiltcol - this%nfiltcol = keepcnt + character(len=LENVARNAME) :: varname + integer(I4B) :: ilen + integer(I4B), pointer :: intvar + character(len=2) :: prefix = 'IN' ! - ! -- allocate filtcols - allocate (this%filtcols(this%nfiltcol)) + ! -- assign first column as the block number + ilen = len_trim(mf6varname) ! - ! -- set filtcols - do icol = 1, this%nfiltcol - this%filtcols(icol) = dfncols(idxs(icol)) - end do + if (ilen > (LENVARNAME - len(prefix))) then + varname = prefix//mf6varname(1:(LENVARNAME - len(prefix))) + else + varname = prefix//trim(mf6varname) + end if ! - ! -- cleanup - deallocate (dfncols) - deallocate (idxs) - deallocate (parse_str) + call mem_allocate(intvar, varname, this%mf6_input%mempath) + intvar = -1 ! ! -- return return - end subroutine set_filtered_cols + end function rsv_alloc !> @brief allocate and set input array to filtered param set !! !< - subroutine filtered_cols(this, cols, ncol) + subroutine bound_params(this, params, nparam, input_name, create) ! -- modules ! -- dummy class(BoundInputContextType) :: this - character(len=LENVARNAME), dimension(:), allocatable, & - intent(inout) :: cols - integer(I4B), intent(inout) :: ncol + character(len=LINELENGTH), dimension(:), allocatable, & + intent(inout) :: params + integer(I4B), intent(inout) :: nparam + character(len=*), intent(in) :: input_name + logical(LGP), optional, intent(in) :: create + logical(LGP) :: allocate_params integer(I4B) :: n ! - if (allocated(cols)) deallocate (cols) + ! -- initialize allocate_params + allocate_params = .true. ! - ncol = this%nfiltcol + ! -- override default if provided + if (present(create)) then + allocate_params = create + end if ! - allocate (cols(ncol)) + if (allocated(params)) deallocate (params) ! - do n = 1, ncol - cols(n) = this%filtcols(n) - end do + nparam = this%package_params%nparam ! - ! -- return - return - end subroutine filtered_cols - - !> @brief determine if input param is in scope for a package - !! - !< - function pkg_param_in_scope(mf6_input, tagname) result(in_scope) - ! -- modules - use MemoryManagerModule, only: get_isize, mem_setptr - use InputDefinitionModule, only: InputParamDefinitionType - use DefinitionSelectModule, only: get_param_definition_type - ! -- dummy - type(ModflowInputType), intent(in) :: mf6_input - character(len=*), intent(in) :: tagname - ! -- return - logical(LGP) :: in_scope - ! -- locals - type(InputParamDefinitionType), pointer :: idt - integer(I4B) :: pdim_isize, popt_isize - integer(I4B), pointer :: pdim - ! - ! -- initialize - in_scope = .false. + allocate (params(nparam)) ! - idt => get_param_definition_type(mf6_input%param_dfns, & - mf6_input%component_type, & - mf6_input%subcomponent_type, & - 'PERIOD', tagname, '') + do n = 1, nparam + params(n) = this%package_params%params(n) + end do ! - if (idt%required) then - ! -- required params always included - in_scope = .true. - else - ! - ! -- package specific logic to determine if input params to be read - select case (mf6_input%subcomponent_type) - case ('EVT') + if (allocate_params) then + if (this%readasarrays) then ! - if (tagname == 'PXDP' .or. tagname == 'PETM') then - call get_isize('NSEG', mf6_input%mempath, pdim_isize) - if (pdim_isize > 0) then - call mem_setptr(pdim, 'NSEG', mf6_input%mempath) - if (pdim > 1) then - in_scope = .true. - end if - end if - else if (tagname == 'PETM0') then - call get_isize('SURFRATESPEC', mf6_input%mempath, popt_isize) - if (popt_isize > 0) then - in_scope = .true. - end if - end if + call this%array_params_create(params, nparam, input_name) + else ! - case default - end select + call this%list_params_create(params, nparam, input_name) + end if end if ! ! -- return return - end function pkg_param_in_scope + end subroutine bound_params end module BoundInputContextModule diff --git a/src/Utilities/Idm/DefinitionSelect.f90 b/src/Utilities/Idm/DefinitionSelect.f90 index 656312e9cf8..ef6ec9b5883 100644 --- a/src/Utilities/Idm/DefinitionSelect.f90 +++ b/src/Utilities/Idm/DefinitionSelect.f90 @@ -18,9 +18,81 @@ module DefinitionSelectModule public :: get_param_definition_type public :: get_aggregate_definition_type public :: split_record_definition + public :: idt_parse_rectype contains + !> @brief allocate and set RECARRAY, KEYSTRING or RECORD param list + !< + subroutine idt_parse_rectype(idt, cols, ncol) + ! -- modules + use ConstantsModule, only: LINELENGTH + use InputOutputModule, only: parseline + ! -- dummy + type(InputParamDefinitionType), pointer, intent(in) :: idt + character(len=LINELENGTH), dimension(:), allocatable, & + intent(inout) :: cols + integer(I4B), intent(inout) :: ncol + ! -- local + character(len=:), allocatable :: parse_str + character(len=LINELENGTH), dimension(:), allocatable :: param_cols + integer(I4B) :: param_ncol, n + ! + ! -- initialize + if (allocated(cols)) deallocate (cols) + ncol = 0 + ! + ! -- split definition + parse_str = trim(idt%datatype)//' ' + call parseline(parse_str, param_ncol, param_cols) + ! + if (param_ncol > 1) then + if (param_cols(1) == 'RECARRAY' .or. & + param_cols(1) == 'KEYSTRING' .or. & + param_cols(1) == 'RECORD') then + ! -- exclude 1st column + allocate (cols(param_ncol - 1)) + do n = 2, param_ncol + cols(n - 1) = param_cols(n) + end do + ! + ! -- set ncol + ncol = param_ncol - 1 + end if + end if + ! + ! -- cleanup + if (allocated(param_cols)) deallocate (param_cols) + if (allocated(parse_str)) deallocate (parse_str) + ! + ! -- return + return + end subroutine idt_parse_rectype + + !> @brief return input definition type datatype + !< + function idt_datatype(idt) result(datatype) + ! -- modules + use ConstantsModule, only: LINELENGTH + ! -- dummy + type(InputParamDefinitionType), pointer, intent(in) :: idt + ! -- result + character(len=LINELENGTH) :: datatype + ! + if (idt%datatype(1:9) == 'KEYSTRING') then + datatype = 'KEYSTRING' + else if (idt%datatype(1:8) == 'RECARRAY') then + datatype = 'RECARRAY' + else if (idt%datatype(1:6) == 'RECORD') then + datatype = 'RECORD' + else + datatype = idt%datatype + end if + ! + ! -- return + return + end function idt_datatype + !> @brief Return parameter definition !< function get_param_definition_type(input_definition_types, & @@ -38,7 +110,7 @@ function get_param_definition_type(input_definition_types, & type(InputParamDefinitionType), pointer :: tmp_ptr integer(I4B) :: i ! - idt => null() + nullify (idt) do i = 1, size(input_definition_types) tmp_ptr => input_definition_types(i) if (tmp_ptr%component_type == component_type .and. & @@ -76,7 +148,7 @@ function get_aggregate_definition_type(input_definition_types, component_type, & type(InputParamDefinitionType), pointer :: tmp_ptr integer(I4B) :: i ! - idt => null() + nullify (idt) do i = 1, size(input_definition_types) tmp_ptr => input_definition_types(i) if (tmp_ptr%component_type == component_type .and. & @@ -134,7 +206,7 @@ subroutine split_record_definition(input_definition_types, component_type, & ! -- match for definition to split if (tmp_ptr%component_type == component_type .and. & tmp_ptr%subcomponent_type == subcomponent_type .and. & - tmp_ptr%datatype(1:6) == 'RECORD') then + idt_datatype(tmp_ptr) == 'RECORD') then ! ! -- set split string parse_str = trim(input_definition_types(i)%datatype)//' ' @@ -145,7 +217,6 @@ subroutine split_record_definition(input_definition_types, component_type, & ! -- check for match and manage memory if (nwords >= 2) then if (words(1) == 'RECORD' .and. words(2) == tagname) then - if (allocated(parse_str)) deallocate (parse_str) exit end if end if diff --git a/src/Utilities/Idm/DynamicPackageParams.f90 b/src/Utilities/Idm/DynamicPackageParams.f90 new file mode 100644 index 00000000000..7cb43b53b5f --- /dev/null +++ b/src/Utilities/Idm/DynamicPackageParams.f90 @@ -0,0 +1,391 @@ +!> @brief This module contains the DynamicPackageParamsModule +!! +!! +!< +module DynamicPackageParamsModule + + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: LINELENGTH, DZERO, IZERO + use SimVariablesModule, only: errmsg + use SimModule, only: store_error, store_error_filename + use MemoryManagerModule, only: mem_allocate + use ModflowInputModule, only: ModflowInputType + use InputDefinitionModule, only: InputParamDefinitionType + use DefinitionSelectModule, only: get_param_definition_type, & + get_aggregate_definition_type, & + idt_parse_rectype + use ArrayHandlersModule, only: expandarray + use CharacterStringModule, only: CharacterStringType + + implicit none + private + public :: DynamicPackageParamsType + public :: allocate_param_charstr + public :: allocate_param_int1d, allocate_param_int2d + public :: allocate_param_dbl1d, allocate_param_dbl2d + + !> @brief dynamic parameter filter type + !! + !! + !< + type :: DynamicPackageParamsType + character(len=LINELENGTH), dimension(:), allocatable :: params !< in scope param tags + integer(I4B) :: naux !< number of aux variables in package + integer(I4B) :: inamedbound !< package inamedbound setting + integer(I4B) :: nparam !< number of in scope params + type(ModflowInputType) :: mf6_input !< description of input + contains + procedure :: init + procedure :: destroy + procedure :: set_filtered_list + procedure :: set_filtered_grid + procedure :: package_params + end type DynamicPackageParamsType + +contains + + !> @brief initialize dynamic param filter + !! + !< + subroutine init(this, mf6_input, readasarrays, naux, inamedbound) + ! -- modules + ! -- dummy + class(DynamicPackageParamsType) :: this + type(ModflowInputType), intent(in) :: mf6_input + logical(LGP), intent(in) :: readasarrays + integer(I4B), intent(in) :: naux + integer(I4B), intent(in) :: inamedbound + ! -- local + ! + this%mf6_input = mf6_input + this%nparam = 0 + this%naux = naux + this%inamedbound = inamedbound + ! + ! -- determine in scope input params + if (readasarrays) then + call this%set_filtered_grid() + else + call this%set_filtered_list() + end if + ! + ! --return + return + end subroutine init + + !> @brief destroy + !! + !< + subroutine destroy(this) + ! -- modules + ! -- dummy + class(DynamicPackageParamsType) :: this + ! + ! -- deallocate + if (allocated(this%params)) deallocate (this%params) + ! + ! --return + return + end subroutine destroy + + !> @brief array based input dynamic param filter + !! + !< + subroutine set_filtered_grid(this) + ! -- modules + ! -- dummy + class(DynamicPackageParamsType) :: this + ! -- local + type(InputParamDefinitionType), pointer :: idt + integer(I4B), dimension(:), allocatable :: idt_idxs + integer(I4B) :: keepcnt, iparam + logical(LGP) :: keep + ! + ! -- initialize + keepcnt = 0 + ! + ! -- allocate dfn input params + do iparam = 1, size(this%mf6_input%param_dfns) + ! + keep = .true. + ! + ! -- assign param definition pointer + idt => this%mf6_input%param_dfns(iparam) + ! + if (idt%blockname /= 'PERIOD') then + keep = .false. + end if + ! + if (idt%tagname == 'AUX') then + if (this%naux == 0) then + keep = .false. + end if + end if + ! + if (keep) then + keepcnt = keepcnt + 1 + call expandarray(idt_idxs) + idt_idxs(keepcnt) = iparam + end if + end do + ! + ! -- update nparam + this%nparam = keepcnt + ! + ! -- allocate filtcols + allocate (this%params(this%nparam)) + ! + ! -- set filtcols + do iparam = 1, this%nparam + idt => this%mf6_input%param_dfns(idt_idxs(iparam)) + this%params(iparam) = trim(idt%tagname) + end do + ! + ! -- cleanup + deallocate (idt_idxs) + ! + ! -- return + return + end subroutine set_filtered_grid + + !> @brief create array of in scope list input columns + !! + !! Filter the recarray description of list input parameters + !! to determine which columns are to be read in this run. + !< + subroutine set_filtered_list(this) + ! -- modules + ! -- dummy + class(DynamicPackageParamsType) :: this + ! -- local + type(InputParamDefinitionType), pointer :: ra_idt, idt + character(len=LINELENGTH), dimension(:), allocatable :: ra_cols + integer(I4B) :: ra_ncol, icol, keepcnt + logical(LGP) :: keep + ! + ! -- initialize + keepcnt = 0 + ! + ! -- get aggregate param definition for period block + ra_idt => & + get_aggregate_definition_type(this%mf6_input%aggregate_dfns, & + this%mf6_input%component_type, & + this%mf6_input%subcomponent_type, & + 'PERIOD') + ! + ! -- split recarray definition + call idt_parse_rectype(ra_idt, ra_cols, ra_ncol) + ! + ! -- determine which columns are in scope + do icol = 1, ra_ncol + ! + keep = .false. + ! + ! -- set dfn pointer to recarray parameter + idt => get_param_definition_type(this%mf6_input%param_dfns, & + this%mf6_input%component_type, & + this%mf6_input%subcomponent_type, & + 'PERIOD', ra_cols(icol), '') + ! + if (ra_cols(icol) == 'RECARRAY') then + ! no-op + else if (ra_cols(icol) == 'AUX') then + if (this%naux > 0) then + keep = .true. + end if + else if (ra_cols(icol) == 'BOUNDNAME') then + if (this%inamedbound /= 0) then + keep = .true. + end if + else + ! -- determine if the param is scope + keep = pkg_param_in_scope(this%mf6_input, ra_cols(icol)) + end if + ! + if (keep) then + keepcnt = keepcnt + 1 + call expandarray(this%params) + this%params(keepcnt) = trim(ra_cols(icol)) + end if + end do + ! + ! -- update nparam + this%nparam = keepcnt + ! + ! -- cleanup + deallocate (ra_cols) + ! + ! -- return + return + end subroutine set_filtered_list + + !> @brief allocate and set input array to filtered param set + !! + !< + subroutine package_params(this, params, nparam) + ! -- modules + ! -- dummy + class(DynamicPackageParamsType) :: this + character(len=LINELENGTH), dimension(:), allocatable, & + intent(inout) :: params + integer(I4B), intent(inout) :: nparam + integer(I4B) :: n + ! + if (allocated(params)) deallocate (params) + ! + nparam = this%nparam + ! + allocate (params(nparam)) + ! + do n = 1, nparam + params(n) = this%params(n) + end do + ! + ! -- return + return + end subroutine package_params + + !> @brief allocate character string type array + !< + subroutine allocate_param_charstr(strlen, nrow, varname, mempath) + integer(I4B), intent(in) :: strlen !< string number of characters + integer(I4B), intent(in) :: nrow !< integer array number of rows + character(len=*), intent(in) :: varname !< variable name + character(len=*), intent(in) :: mempath !< variable mempath + type(CharacterStringType), dimension(:), pointer, & + contiguous :: charstr1d + integer(I4B) :: n + ! + call mem_allocate(charstr1d, strlen, nrow, varname, mempath) + do n = 1, nrow + charstr1d(n) = '' + end do + end subroutine allocate_param_charstr + + !> @brief allocate int1d + !< + subroutine allocate_param_int1d(nrow, varname, mempath) + integer(I4B), intent(in) :: nrow !< integer array number of rows + character(len=*), intent(in) :: varname !< variable name + character(len=*), intent(in) :: mempath !< variable mempath + integer(I4B), dimension(:), pointer, contiguous :: int1d + integer(I4B) :: n + ! + call mem_allocate(int1d, nrow, varname, mempath) + do n = 1, nrow + int1d(n) = IZERO + end do + end subroutine allocate_param_int1d + + !> @brief allocate int2d + !< + subroutine allocate_param_int2d(ncol, nrow, varname, mempath) + integer(I4B), intent(in) :: ncol !< integer array number of cols + integer(I4B), intent(in) :: nrow !< integer array number of rows + character(len=*), intent(in) :: varname !< variable name + character(len=*), intent(in) :: mempath !< variable mempath + integer(I4B), dimension(:, :), pointer, contiguous :: int2d + integer(I4B) :: n, m + ! + call mem_allocate(int2d, ncol, nrow, varname, mempath) + do m = 1, nrow + do n = 1, ncol + int2d(n, m) = IZERO + end do + end do + end subroutine allocate_param_int2d + + !> @brief allocate dbl1d + !< + subroutine allocate_param_dbl1d(nrow, varname, mempath) + integer(I4B), intent(in) :: nrow !< integer array number of rows + character(len=*), intent(in) :: varname !< variable name + character(len=*), intent(in) :: mempath !< variable mempath + real(DP), dimension(:), pointer, contiguous :: dbl1d + integer(I4B) :: n + ! + call mem_allocate(dbl1d, nrow, varname, mempath) + do n = 1, nrow + dbl1d(n) = DZERO + end do + end subroutine allocate_param_dbl1d + + !> @brief allocate dbl2d + !< + subroutine allocate_param_dbl2d(ncol, nrow, varname, mempath) + integer(I4B), intent(in) :: ncol !< integer array number of cols + integer(I4B), intent(in) :: nrow !< integer array number of rows + character(len=*), intent(in) :: varname !< variable name + character(len=*), intent(in) :: mempath !< variable mempath + real(DP), dimension(:, :), pointer, contiguous :: dbl2d + integer(I4B) :: n, m + ! + call mem_allocate(dbl2d, ncol, nrow, varname, mempath) + do m = 1, nrow + do n = 1, ncol + dbl2d(n, m) = DZERO + end do + end do + end subroutine allocate_param_dbl2d + + !> @brief determine if input param is in scope for a package + !! + !< + function pkg_param_in_scope(mf6_input, tagname) result(in_scope) + ! -- modules + use MemoryManagerModule, only: get_isize, mem_setptr + ! -- dummy + type(ModflowInputType), intent(in) :: mf6_input + character(len=*), intent(in) :: tagname + ! -- return + logical(LGP) :: in_scope + ! -- local + type(InputParamDefinitionType), pointer :: idt + integer(I4B) :: pdim_isize, popt_isize + integer(I4B), pointer :: pdim + ! + ! -- initialize + in_scope = .false. + ! + idt => get_param_definition_type(mf6_input%param_dfns, & + mf6_input%component_type, & + mf6_input%subcomponent_type, & + 'PERIOD', tagname, '') + ! + if (idt%required) then + ! -- required params always included + in_scope = .true. + else + ! + ! -- package specific logic to determine if input params to be read + select case (mf6_input%subcomponent_type) + case ('EVT') + ! + if (tagname == 'PXDP' .or. tagname == 'PETM') then + call get_isize('NSEG', mf6_input%mempath, pdim_isize) + if (pdim_isize > 0) then + call mem_setptr(pdim, 'NSEG', mf6_input%mempath) + if (pdim > 1) then + in_scope = .true. + end if + end if + else if (tagname == 'PETM0') then + call get_isize('SURFRATESPEC', mf6_input%mempath, popt_isize) + if (popt_isize > 0) then + in_scope = .true. + end if + end if + ! + case default + errmsg = 'IDM unimplemented. DynamicPackageParamsType::pkg_param_in_scope & + &add case tagname='//trim(idt%tagname) + call store_error(errmsg, .true.) + !call store_error_filename(sourcename) + end select + end if + ! + ! -- return + return + end function pkg_param_in_scope + +end module DynamicPackageParamsModule diff --git a/src/Utilities/Idm/IdmLoad.f90 b/src/Utilities/Idm/IdmLoad.f90 index 26c6aa21973..c3093961cf5 100644 --- a/src/Utilities/Idm/IdmLoad.f90 +++ b/src/Utilities/Idm/IdmLoad.f90 @@ -130,7 +130,10 @@ subroutine model_pkg_load(model_pkg_inputs, itype, ipkg, iout) integer(I4B), intent(in) :: iout class(StaticPkgLoadBaseType), pointer :: static_loader class(DynamicPkgLoadBaseType), pointer :: dynamic_loader - class(ModelDynamicPkgsType), pointer :: dynamic_pkgs => null() + class(ModelDynamicPkgsType), pointer :: dynamic_pkgs + ! + ! -- initialize + nullify (dynamic_pkgs) ! ! -- create model package loader static_loader => & @@ -216,7 +219,7 @@ subroutine load_models(model_loadmask, iout) ! -- dummy integer(I4B), dimension(:), intent(in) :: model_loadmask integer(I4B), intent(in) :: iout - ! -- locals + ! -- local character(len=LENMEMPATH) :: input_mempath type(CharacterStringType), dimension(:), contiguous, & pointer :: mtypes !< model types @@ -284,7 +287,7 @@ subroutine load_exchanges(model_loadmask, iout) ! -- dummy integer(I4B), dimension(:), intent(in) :: model_loadmask integer(I4B), intent(in) :: iout - ! -- locals + ! -- local type(CharacterStringType), dimension(:), contiguous, & pointer :: etypes !< exg types type(CharacterStringType), dimension(:), contiguous, & @@ -547,8 +550,12 @@ subroutine simnam_load_dim() pointer :: mtypes !< model types type(CharacterStringType), dimension(:), contiguous, & pointer :: etypes !< model types - integer(I4B), pointer :: nummodels => null() - integer(I4B), pointer :: numexchanges => null() + integer(I4B), pointer :: nummodels + integer(I4B), pointer :: numexchanges + ! + ! -- initialize + nullify (nummodels) + nullify (numexchanges) ! ! -- set memory paths sim_mempath = create_mem_path(component='SIM', context=idm_context) @@ -577,7 +584,7 @@ subroutine allocate_simnam_int(input_mempath, idt) use SimVariablesModule, only: isimcontinue, isimcheck, simfile character(len=LENMEMPATH), intent(in) :: input_mempath type(InputParamDefinitionType), pointer, intent(in) :: idt - integer(I4B), pointer :: intvar => null() + integer(I4B), pointer :: intvar ! ! -- allocate and set default call mem_allocate(intvar, idt%mf6varname, input_mempath) @@ -595,7 +602,7 @@ subroutine allocate_simnam_int(input_mempath, idt) intvar = 0 case default write (errmsg, '(a,a)') & - 'Programming error. Idm SIMNAM Load default value setting '& + 'Idm SIMNAM Load default value setting '& &'is unhandled for this variable: ', & trim(idt%mf6varname) call store_error(errmsg) @@ -614,9 +621,9 @@ subroutine allocate_simnam_param(input_mempath, idt) use CharacterStringModule, only: CharacterStringType character(len=LENMEMPATH), intent(in) :: input_mempath type(InputParamDefinitionType), pointer, intent(in) :: idt - character(len=LINELENGTH), pointer :: cstr => null() + character(len=LINELENGTH), pointer :: cstr type(CharacterStringType), dimension(:), & - pointer, contiguous :: acharstr1d => null() + pointer, contiguous :: acharstr1d ! ! -- initialize ! @@ -642,7 +649,7 @@ subroutine allocate_simnam_param(input_mempath, idt) end if case default write (errmsg, '(a,a)') & - 'Programming error. IdmLoad unhandled datatype: ', & + 'IdmLoad allocate simnam param unhandled datatype: ', & trim(idt%datatype) call store_error(errmsg) call store_error_filename(simfile) diff --git a/src/Utilities/Idm/InputDefinition.f90 b/src/Utilities/Idm/InputDefinition.f90 index 0d488e50d90..63197b415dc 100644 --- a/src/Utilities/Idm/InputDefinition.f90 +++ b/src/Utilities/Idm/InputDefinition.f90 @@ -1,51 +1,52 @@ !> @brief This module contains the InputDefinitionModule !! -!! This module contains helper objects for storing -!! information about how to read modflow input files. +!! This module contains type definitions that represent +!! descriptions of input from modflow 6 defintion files. !! !< module InputDefinitionModule use KindModule, only: LGP - use ConstantsModule, only: LENVARNAME + use ConstantsModule, only: LINELENGTH, LENVARNAME, LENCOMPONENTNAME implicit none private public :: InputParamDefinitionType, & InputBlockDefinitionType - !> @brief derived type for storing input definition + !> @brief Input paramater definition type !! - !! This derived type is used to store information for + !! This type is used to store information for !! each modflow input record !! !< type InputParamDefinitionType - character(len=100) :: component_type = '' - character(len=100) :: subcomponent_type = '' - character(len=100) :: blockname = '' - character(len=100) :: tagname = '' - character(len=LENVARNAME) :: mf6varname = '' - character(len=120) :: datatype = '' - character(len=100) :: shape = '' - logical(LGP) :: required = .false. - logical(LGP) :: in_record = .false. - logical(LGP) :: preserve_case = .false. - logical(LGP) :: layered = .false. - logical(LGP) :: timeseries = .false. + character(len=LENCOMPONENTNAME) :: component_type = '' !< type of component, e.g. GWF + character(len=LENCOMPONENTNAME) :: subcomponent_type = '' !< type of subcomponent, e.g. CHD + character(len=LINELENGTH) :: blockname = '' !< input block, e.g. DiMENSIONS + character(len=LINELENGTH) :: tagname = '' !< parameter user tag name + character(len=LENVARNAME) :: mf6varname = '' !< parameter internal managed memory name + character(len=LINELENGTH) :: datatype = '' !< parameter data type + character(len=LINELENGTH) :: shape = '' !< shape of data type + logical(LGP) :: required = .false. !< is the parameter required + logical(LGP) :: in_record = .false. !< is the parameter within an input record + logical(LGP) :: preserve_case = .false. !< should string case be preserved + logical(LGP) :: layered = .false. !< does the parameter support a layered read + logical(LGP) :: timeseries = .false. !< does the parameter support timeseries end type InputParamDefinitionType - !> @brief derived type for storing block information + !> @brief Input block definition type !! - !! This derived type is used to store information for + !! This type is used to store information for !! how to read a modflow block !! !< type InputBlockDefinitionType - character(len=100) :: blockname = '' - logical(LGP) :: required = .false. - logical(LGP) :: aggregate = .false. - logical(LGP) :: block_variable = .false. + character(len=LINELENGTH) :: blockname = '' !< name of block, e.g. DIMENSIONS + logical(LGP) :: required = .false. !< is the block required + logical(LGP) :: aggregate = .false. !< is this structarray style input + logical(LGP) :: block_variable = .false. !< does this block have a block variable + logical(LGP) :: timeseries = .false. !< does this block support timeseries end type InputBlockDefinitionType end module InputDefinitionModule diff --git a/src/Utilities/Idm/InputLoadType.f90 b/src/Utilities/Idm/InputLoadType.f90 index 24001ba17d6..de3c7b2cbb1 100644 --- a/src/Utilities/Idm/InputLoadType.f90 +++ b/src/Utilities/Idm/InputLoadType.f90 @@ -1,6 +1,6 @@ !> @brief This module contains the InputLoadTypeModule !! -!! This module defines types that support generic IDP +!! This module defines types that support generic IDM !! static and dynamic input loading. !! !< @@ -8,6 +8,8 @@ module InputLoadTypeModule use KindModule, only: DP, I4B, LGP use ConstantsModule, only: LINELENGTH, LENCOMPONENTNAME, LENMODELNAME + use SimVariablesModule, only: errmsg + use SimModule, only: store_error, store_error_filename use ModflowInputModule, only: ModflowInputType use ListModule, only: ListType use InputDefinitionModule, only: InputParamDefinitionType @@ -20,24 +22,23 @@ module InputLoadTypeModule public :: AddDynamicModelToList, GetDynamicModelFromList public :: StaticPkgLoadType, DynamicPkgLoadType - !> @brief derived type for source static load + !> @brief Static loader type !! - !! This derived type is a base concrete type for a model - !! package static load + !! This type is a base concrete type for a static input loader !! !< type StaticPkgLoadType type(ModflowInputType) :: mf6_input !< description of modflow6 input character(len=LENCOMPONENTNAME) :: component_name !< name of component - character(len=LINELENGTH) :: component_input_name !< name of component input name, e.g. filename - character(len=LINELENGTH) :: input_name !< source name, e.g. name of input file - integer(I4B) :: iperblock + character(len=LINELENGTH) :: component_input_name !< component input name, e.g. model name file + character(len=LINELENGTH) :: input_name !< input name, e.g. package *.chd file + integer(I4B) :: iperblock !< index of period block on block definition list contains procedure :: init => static_init procedure :: destroy => static_destroy end type StaticPkgLoadType - !> @brief base abstract type for source static load + !> @brief Base abstract type for static input loader !! !! IDM sources should extend and implement this type !! @@ -47,20 +48,23 @@ module InputLoadTypeModule procedure(load_if), deferred :: load end type StaticPkgLoadBaseType - !> @brief derived type for source dynamic load + !> @brief Dynamic loader type !! - !! This derived type is a base concrete type for a model - !! package dynamic (period) load + !! This type is a base concrete type for a dynamic (period) input loader !! !< type :: DynamicPkgLoadType type(ModflowInputType) :: mf6_input !< description of modflow6 input - character(len=LENMODELNAME) :: modelname !< name of model - character(len=LINELENGTH) :: modelfname !< name of model input file - character(len=LINELENGTH) :: sourcename !< source name, e.g. name of file - logical(LGP) :: readasarrays - integer(I4B) :: iperblock - integer(I4B) :: iout + character(len=LENCOMPONENTNAME) :: component_name !< name of component + character(len=LINELENGTH) :: component_input_name !< component input name, e.g. model name file + character(len=LINELENGTH) :: input_name !< input name, e.g. package *.chd file + character(len=LINELENGTH), dimension(:), allocatable :: param_names !< dynamic param tagnames + integer(I4B), pointer :: iper => null() !< memory managed variable, loader iper + integer(I4B), pointer :: ionper => null() !< memory managed variable, next load period + logical(LGP) :: readasarrays !< is this array based input + integer(I4B) :: iperblock !< index of period block on block definition list + integer(I4B) :: iout !< inunit number for logging + integer(I4B) :: nparam !< number of in scope params contains procedure :: init => dynamic_init procedure :: df => dynamic_df @@ -68,7 +72,7 @@ module InputLoadTypeModule procedure :: destroy => dynamic_destroy end type DynamicPkgLoadType - !> @brief base abstract type for source dynamic load + !> @brief Base abstract type for dynamic input loader !! !! IDM sources should extend and implement this type !! @@ -93,9 +97,9 @@ subroutine period_load_if(this) end subroutine end interface - !> @brief derived type for storing a dynamic package load list + !> @brief type for storing a dynamic package load list !! - !! This derived type is used to store a list of package + !! This type is used to store a list of package !! dynamic load types for a model !! !< @@ -156,27 +160,40 @@ end subroutine static_destroy !> @brief initialize dynamic package loader !! !! Any managed memory pointed to from model/package context - !! must be allocated when derived dynamic loader is initialized. + !! must be allocated when dynamic loader is initialized. !! !< - subroutine dynamic_init(this, mf6_input, modelname, modelfname, source, & - iperblock, iout) + subroutine dynamic_init(this, mf6_input, component_name, component_input_name, & + input_name, iperblock, iout) use SimVariablesModule, only: errmsg - use SimModule, only: store_error, store_error_filename + use MemoryManagerModule, only: mem_allocate + use InputDefinitionModule, only: InputParamDefinitionType + ! -- dummy class(DynamicPkgLoadType), intent(inout) :: this type(ModflowInputType), intent(in) :: mf6_input - character(len=*), intent(in) :: modelname - character(len=*), intent(in) :: modelfname - character(len=*), intent(in) :: source + character(len=*), intent(in) :: component_name + character(len=*), intent(in) :: component_input_name + character(len=*), intent(in) :: input_name integer(I4B), intent(in) :: iperblock integer(I4B), intent(in) :: iout + type(InputParamDefinitionType), pointer :: idt ! this%mf6_input = mf6_input - this%modelname = modelname - this%modelfname = modelfname - this%sourcename = source + this%component_name = component_name + this%component_input_name = component_input_name + this%input_name = input_name this%iperblock = iperblock + this%nparam = 0 this%iout = iout + nullify (idt) + ! + ! -- allocate scalars + call mem_allocate(this%iper, 'IPER', mf6_input%mempath) + call mem_allocate(this%ionper, 'IONPER', mf6_input%mempath) + ! + ! -- initialize + this%iper = 0 + this%ionper = 0 ! ! -- throw error and exit if not found if (this%iperblock == 0) then @@ -185,12 +202,12 @@ subroutine dynamic_init(this, mf6_input, modelname, modelfname, source, & &'dynamic package input block dfns: ', & trim(mf6_input%subcomponent_name) call store_error(errmsg) - call store_error_filename(this%sourcename) - else - ! - this%readasarrays = (.not. mf6_input%block_dfns(iperblock)%aggregate) + call store_error_filename(this%input_name) end if ! + ! -- set readasarrays + this%readasarrays = (.not. mf6_input%block_dfns(iperblock)%aggregate) + ! ! -- return return end subroutine dynamic_init @@ -221,10 +238,15 @@ end subroutine dynamic_ad !! !< subroutine dynamic_destroy(this) + use MemoryManagerModule, only: mem_deallocate use MemoryManagerExtModule, only: memorylist_remove use SimVariablesModule, only: idm_context class(DynamicPkgLoadType), intent(inout) :: this ! + ! -- deallocate scalars + call mem_deallocate(this%iper) + call mem_deallocate(this%ionper) + ! ! -- deallocate package static and dynamic input context call memorylist_remove(this%mf6_input%component_name, & this%mf6_input%subcomponent_name, & @@ -399,7 +421,7 @@ function GetDynamicModelFromList(list, idx) result(res) class(*), pointer :: obj ! ! -- initialize res - res => null() + nullify (res) ! ! -- get the object from the list obj => list%GetItem(idx) diff --git a/src/Utilities/Idm/SourceCommon.f90 b/src/Utilities/Idm/SourceCommon.f90 index 7ed0f52d6e8..67d50c1aac8 100644 --- a/src/Utilities/Idm/SourceCommon.f90 +++ b/src/Utilities/Idm/SourceCommon.f90 @@ -8,8 +8,8 @@ module SourceCommonModule use KindModule, only: DP, I4B, LGP use SimVariablesModule, only: errmsg - use ConstantsModule, only: LINELENGTH, LENMEMPATH, LENMODELNAME, LENFTYPE, & - LENPACKAGETYPE, LENPACKAGENAME, LENCOMPONENTNAME + use ConstantsModule, only: LINELENGTH, LENPACKAGETYPE, LENPACKAGENAME, & + LENCOMPONENTNAME use SimModule, only: store_error, store_error_filename implicit none @@ -38,12 +38,12 @@ function package_source_type(sourcename) result(sourcetype) character(len=*), intent(in) :: sourcename ! -- result character(len=LENPACKAGENAME) :: sourcetype - ! -- locals + ! -- local + character(len=LENPACKAGENAME) :: ext ! - sourcetype = sourcename - call upcase(sourcetype) + ext = file_ext(sourcename) ! - select case (sourcetype) + select case (ext) case default sourcetype = 'MF6FILE' end select @@ -168,7 +168,7 @@ end function idm_subcomponent_name !> @brief input file extension !! - !! Return the input file extension, or an empty string if + !! Return a file extension, or an empty string if !! not identified. !! !< @@ -180,24 +180,18 @@ function file_ext(filename) result(ext) ! -- return character(len=LENPACKAGETYPE) :: ext ! -- local - integer(I4B) :: i, istart, istop + integer(I4B) :: idx ! ! -- initialize ext = '' - istart = 0 - istop = len_trim(filename) + idx = 0 ! ! -- identify '.' character position from back of string - do i = istop, 1, -1 - if (filename(i:i) == '.') then - istart = i - exit - end if - end do + idx = index(filename, '.', back=.true.) ! ! - if (istart > 0) then - ext = filename(istart + 1:istop) + if (idx > 0) then + ext = filename(idx + 1:len_trim(filename)) end if ! ! -- return @@ -340,9 +334,12 @@ end subroutine set_model_shape subroutine mem_allocate_naux(mempath) use MemoryManagerModule, only: mem_allocate, mem_setptr, get_isize character(len=*), intent(in) :: mempath - integer(I4B), pointer :: naux => null() + integer(I4B), pointer :: naux integer(I4B) :: isize ! + ! -- initialize + nullify (naux) + ! ! -- allocate optional input scalars locally call get_isize('NAUX', mempath, isize) if (isize < 0) then diff --git a/src/Utilities/Idm/mf6blockfile/AsciiInputLoadType.f90 b/src/Utilities/Idm/mf6blockfile/AsciiInputLoadType.f90 index 081f31f1579..4f5b0078c4d 100644 --- a/src/Utilities/Idm/mf6blockfile/AsciiInputLoadType.f90 +++ b/src/Utilities/Idm/mf6blockfile/AsciiInputLoadType.f90 @@ -10,6 +10,7 @@ module AsciiInputLoadTypeModule use KindModule, only: DP, I4B, LGP use InputLoadTypeModule, only: DynamicPkgLoadType use BlockParserModule, only: BlockParserType + use ModflowInputModule, only: ModflowInputType implicit none private @@ -20,15 +21,29 @@ module AsciiInputLoadTypeModule !< type, abstract, extends(DynamicPkgLoadType) :: AsciiDynamicPkgLoadBaseType contains - procedure(ascii_period_load_if), deferred :: rp + procedure(load_init_if), deferred :: ainit !< source loader init + procedure(period_load_if), deferred :: rp !< source loader read and prepare end type AsciiDynamicPkgLoadBaseType abstract interface - subroutine ascii_period_load_if(this, parser) + subroutine period_load_if(this, parser) import AsciiDynamicPkgLoadBaseType, BlockParserType class(AsciiDynamicPkgLoadBaseType), intent(inout) :: this type(BlockParserType), pointer, intent(inout) :: parser !< block parser end subroutine + subroutine load_init_if(this, mf6_input, component_name, & + component_input_name, input_name, & + iperblock, parser, iout) + import I4B, AsciiDynamicPkgLoadBaseType, BlockParserType, ModflowInputType + class(AsciiDynamicPkgLoadBaseType), intent(inout) :: this + type(ModflowInputType), intent(in) :: mf6_input !< description of input + character(len=*), intent(in) :: component_name !< component name + character(len=*), intent(in) :: component_input_name !< component input name, e.g. model name file + character(len=*), intent(in) :: input_name !< input name, e.g. package *.chd file + integer(I4B), intent(in) :: iperblock !< index of period block on block definition list + type(BlockParserType), pointer, intent(inout) :: parser !< block parser + integer(I4B), intent(in) :: iout + end subroutine end interface end module AsciiInputLoadTypeModule diff --git a/src/Utilities/Idm/mf6blockfile/IdmMf6File.f90 b/src/Utilities/Idm/mf6blockfile/IdmMf6File.f90 index 365cafcdefb..c3829cea09c 100644 --- a/src/Utilities/Idm/mf6blockfile/IdmMf6File.f90 +++ b/src/Utilities/Idm/mf6blockfile/IdmMf6File.f90 @@ -1,23 +1,20 @@ !> @brief This module contains the IdmMf6FileModule !! !! This module contains high-level routines for loading -!! MODFLOW 6 ASCII source input. +!! MODFLOW 6 ASCII source input. This module implements the +!! loader types that the IdmLoadModule creates and invokes. +!! It also creates and manages dynamic ASCII input loaders +!! for all supported types of MODFLOW 6 ASCII dynamic input. !! !< module IdmMf6FileModule use KindModule, only: DP, I4B, LGP use SimVariablesModule, only: errmsg - use ConstantsModule, only: LINELENGTH, LENMEMPATH, LENMODELNAME, & - LENPACKAGENAME, LENFTYPE, LENPACKAGETYPE, & - LENAUXNAME, LENBOUNDNAME, LENTIMESERIESNAME, & - LENLISTLABEL, LENVARNAME, DNODATA, & - DZERO, IZERO + use ConstantsModule, only: LINELENGTH use SimModule, only: store_error, store_error_filename - use InputOutputModule, only: openfile, getunit use BlockParserModule, only: BlockParserType use ModflowInputModule, only: ModflowInputType, getModflowInput - use CharacterStringModule, only: CharacterStringType use InputLoadTypeModule, only: StaticPkgLoadBaseType, DynamicPkgLoadBaseType use AsciiInputLoadTypeModule, only: AsciiDynamicPkgLoadBaseType @@ -27,30 +24,7 @@ module IdmMf6FileModule public :: Mf6FileStaticPkgLoadType, Mf6FileDynamicPkgLoadType public :: open_mf6file - !> @brief derived type for storing package loader - !! - !! This derived type is used to store a pointer to a - !! package load procedure. This could be used to write - !! a custom package loader as a way to override the - !! generic_mf6_load routine. - !! - !< - type :: PackageLoad - procedure(IPackageLoad), nopass, pointer, public :: load_package => null() !< procedure pointer to the load routine - end type PackageLoad - - abstract interface - subroutine IPackageLoad(parser, mf6_input, iout) - use KindModule, only: DP, I4B - use BlockParserModule, only: BlockParserType - use ModflowInputModule, only: ModflowInputType - type(BlockParserType), intent(inout) :: parser !< block parser - type(ModflowInputType), intent(in) :: mf6_input !< description of input - integer(I4B), intent(in) :: iout !< unit number for output - end subroutine IPackageLoad - end interface - - !> @brief MF6File static loader derived type + !> @brief MF6File static loader type !< type, extends(StaticPkgLoadBaseType) :: Mf6FileStaticPkgLoadType contains @@ -59,18 +33,15 @@ end subroutine IPackageLoad procedure :: destroy => static_destroy end type Mf6FileStaticPkgLoadType - !> @brief MF6File dynamic loader derived type + !> @brief MF6File dynamic loader type !< type, extends(DynamicPkgLoadBaseType) :: Mf6FileDynamicPkgLoadType type(BlockParserType), pointer :: parser !< parser for MF6File period blocks - integer(I4B), pointer :: iper => null() - integer(I4B), pointer :: ionper => null() - class(AsciiDynamicPkgLoadBaseType), pointer :: block_loader => null() + class(AsciiDynamicPkgLoadBaseType), pointer :: rp_loader contains procedure :: init => dynamic_init procedure :: df => dynamic_df procedure :: ad => dynamic_ad - procedure :: set => dynamic_set procedure :: rp => dynamic_rp procedure :: read_ionper => dynamic_read_ionper procedure :: create_loader => dynamic_create_loader @@ -79,60 +50,30 @@ end subroutine IPackageLoad contains - !> @brief generic procedure to MODFLOW 6 load routine - !< - subroutine generic_mf6_load(parser, mf6_input, iout) - use LoadMf6FileModule, only: idm_load - type(BlockParserType), intent(inout) :: parser !< block parser - type(ModflowInputType), intent(in) :: mf6_input !< description of input - integer(I4B), intent(in) :: iout !< unit number for output - - call idm_load(parser, mf6_input, iout) - - end subroutine generic_mf6_load - - !> @brief input load for traditional mf6 simulation input file + !> @brief input load for traditional mf6 simulation static input file !< - subroutine input_load(filename, mf6_input, component_filename, iout, & - mf6_parser) + subroutine input_load(filename, mf6_input, component_filename, iout) + use LoadMf6FileModule, only: LoadMf6FileType character(len=*), intent(in) :: filename type(ModflowInputType), intent(in) :: mf6_input character(len=*), intent(in) :: component_filename !< component (e.g. model) filename integer(I4B), intent(in) :: iout !< unit number for output - type(BlockParserType), pointer, optional, intent(inout) :: mf6_parser type(BlockParserType), allocatable, target :: parser !< block parser - type(PackageLoad) :: pkgloader + type(LoadMf6FileType) :: loader integer(I4B) :: inunit ! - ! -- set parser based package loader by file type - select case (mf6_input%pkgtype) - case default - ! - ! -- open input file - inunit = open_mf6file(mf6_input%pkgtype, filename, component_filename, iout) - ! - ! -- allocate and initialize parser - allocate (parser) - call parser%Initialize(inunit, iout) - ! - ! -- set load interface - pkgloader%load_package => generic_mf6_load - ! - end select + ! -- open input file + inunit = open_mf6file(mf6_input%pkgtype, filename, component_filename, iout) ! - ! -- invoke the selected load routine - call pkgloader%load_package(parser, mf6_input, iout) + ! -- allocate and initialize parser + allocate (parser) + call parser%Initialize(inunit, iout) ! - ! -- generate a dynamic loader parser if requested - if (present(mf6_parser)) then - ! - ! -- create dynamic parser - allocate (mf6_parser, source=parser) - else - ! - ! -- clear parser file handles - call parser%clear() - end if + ! -- invoke the load routine + call loader%load(parser, mf6_input, filename, iout) + ! + ! -- clear parser file handles + call parser%clear() ! ! -- cleanup deallocate (parser) @@ -151,6 +92,7 @@ subroutine static_init(this, mf6_input, component_name, component_input_name, & character(len=*), intent(in) :: component_input_name character(len=*), intent(in) :: input_name ! + ! -- initialize base type call this%StaticPkgLoadType%init(mf6_input, component_name, & component_input_name, input_name) ! @@ -158,36 +100,28 @@ end subroutine static_init !> @brief load routine for static loader !< - function static_load(this, iout) result(period_loader) + function static_load(this, iout) result(rp_loader) class(Mf6FileStaticPkgLoadType), intent(inout) :: this integer(I4B), intent(in) :: iout - class(DynamicPkgLoadBaseType), pointer :: period_loader - class(Mf6FileDynamicPkgLoadType), pointer :: mf6_loader => null() - type(BlockParserType), pointer :: parser => null() + class(DynamicPkgLoadBaseType), pointer :: rp_loader + class(Mf6FileDynamicPkgLoadType), pointer :: mf6_loader ! - ! -- initialize - nullify (period_loader) + ! -- initialize return pointer + nullify (rp_loader) ! ! -- load model package to input context if (this%iperblock > 0) then ! - ! -- package is dynamic, allocate loader + ! -- allocate dynamic loader allocate (mf6_loader) ! - ! -- load static input - call input_load(this%input_name, this%mf6_input, & - this%component_input_name, iout, parser) - ! ! -- initialize dynamic loader call mf6_loader%init(this%mf6_input, this%component_name, & this%component_input_name, this%input_name, & this%iperblock, iout) ! - ! -- set parser - call mf6_loader%set(parser) - ! ! -- set return pointer to base dynamic loader - period_loader => mf6_loader + rp_loader => mf6_loader ! else ! @@ -205,33 +139,41 @@ end function static_load subroutine static_destroy(this) class(Mf6FileStaticPkgLoadType), intent(inout) :: this ! + ! -- deallocate base type call this%StaticPkgLoadType%destroy() ! end subroutine static_destroy !> @brief dynamic loader init !< - subroutine dynamic_init(this, mf6_input, modelname, modelfname, source, & - iperblock, iout) + subroutine dynamic_init(this, mf6_input, component_name, component_input_name, & + input_name, iperblock, iout) use InputDefinitionModule, only: InputParamDefinitionType use DefinitionSelectModule, only: get_param_definition_type - use MemoryManagerModule, only: mem_allocate class(Mf6FileDynamicPkgLoadType), intent(inout) :: this type(ModflowInputType), intent(in) :: mf6_input - character(len=*), intent(in) :: modelname - character(len=*), intent(in) :: modelfname - character(len=*), intent(in) :: source + character(len=*), intent(in) :: component_name + character(len=*), intent(in) :: component_input_name + character(len=*), intent(in) :: input_name integer(I4B), intent(in) :: iperblock integer(I4B), intent(in) :: iout + integer(I4B) :: inunit + ! + ! -- initialize base loader + call this%DynamicPkgLoadType%init(mf6_input, component_name, & + component_input_name, input_name, & + iperblock, iout) ! - call this%DynamicPkgLoadType%init(mf6_input, modelname, modelfname, & - source, iperblock, iout) + ! -- initialize rp_loader + nullify (this%rp_loader) ! - call mem_allocate(this%iper, 'IPER', this%mf6_input%mempath) - call mem_allocate(this%ionper, 'IONPER', this%mf6_input%mempath) + ! -- open input file + inunit = open_mf6file(mf6_input%pkgtype, input_name, & + component_input_name, iout) ! - this%iper = 0 - this%ionper = 0 + ! -- allocate and initialize parser + allocate (this%parser) + call this%parser%Initialize(inunit, iout) ! ! -- allocate and initialize loader call this%create_loader() @@ -240,30 +182,16 @@ subroutine dynamic_init(this, mf6_input, modelname, modelfname, source, & return end subroutine dynamic_init - !> @brief dynamic loader set parser object - !< - subroutine dynamic_set(this, parser) - use InputDefinitionModule, only: InputParamDefinitionType - use DefinitionSelectModule, only: get_param_definition_type - class(Mf6FileDynamicPkgLoadType), intent(inout) :: this - type(BlockParserType), pointer, intent(inout) :: parser - ! - ! -- set the parser - this%parser => parser - ! - ! -- return - return - end subroutine dynamic_set - !> @brief define routine for dynamic loader !< subroutine dynamic_df(this) class(Mf6FileDynamicPkgLoadType), intent(inout) :: this ! - ! -- read first iper - call this%read_ionper() + ! -- invoke loader define + call this%rp_loader%df() ! - call this%block_loader%df() + ! -- read first ionper + call this%read_ionper() ! ! -- return return @@ -274,7 +202,8 @@ end subroutine dynamic_df subroutine dynamic_ad(this) class(Mf6FileDynamicPkgLoadType), intent(inout) :: this ! - call this%block_loader%ad() + ! -- invoke loader advance + call this%rp_loader%ad() ! ! -- return return @@ -285,16 +214,15 @@ end subroutine dynamic_ad subroutine dynamic_rp(this) ! -- modules use TdisModule, only: kper, nper - use MemoryManagerModule, only: mem_setptr ! -- dummy class(Mf6FileDynamicPkgLoadType), intent(inout) :: this - ! -- locals + ! -- local ! ! -- check if ready to load if (this%ionper /= kper) return ! ! -- dynamic load - call this%block_loader%rp(this%parser) + call this%rp_loader%rp(this%parser) ! ! -- update loaded iper this%iper = kper @@ -317,7 +245,7 @@ subroutine dynamic_read_ionper(this) use TdisModule, only: kper, nper ! -- dummy class(Mf6FileDynamicPkgLoadType), intent(inout) :: this - ! -- locals + ! -- local character(len=LINELENGTH) :: line logical(LGP) :: isblockfound integer(I4B) :: ierr @@ -364,29 +292,30 @@ end subroutine dynamic_read_ionper !> @brief allocate a dynamic loader based on load context !< subroutine dynamic_create_loader(this) - use StressListInputModule, only: StressListInputType - use StressGridInputModule, only: StressGridInputType + use Mf6FileGridInputModule, only: BoundGridInputType + use Mf6FileListInputModule, only: BoundListInputType ! -- dummy class(Mf6FileDynamicPkgLoadType), intent(inout) :: this - class(StressListInputType), pointer :: list_loader - class(StressGridInputType), pointer :: grid_loader + class(BoundListInputType), pointer :: bndlist_loader + class(BoundGridInputType), pointer :: bndgrid_loader ! ! -- allocate and set loader if (this%readasarrays) then - allocate (grid_loader) - this%block_loader => grid_loader + allocate (bndgrid_loader) + this%rp_loader => bndgrid_loader else - allocate (list_loader) - this%block_loader => list_loader + allocate (bndlist_loader) + this%rp_loader => bndlist_loader end if ! ! -- initialize loader - call this%block_loader%init(this%mf6_input, & - this%modelname, & - this%modelfname, & - this%sourcename, & - this%iperblock, & - this%iout) + call this%rp_loader%ainit(this%mf6_input, & + this%component_name, & + this%component_input_name, & + this%input_name, & + this%iperblock, & + this%parser, & + this%iout) ! ! -- return return @@ -397,12 +326,9 @@ end subroutine dynamic_create_loader subroutine dynamic_destroy(this) class(Mf6FileDynamicPkgLoadType), intent(inout) :: this ! - ! -- deallocate input context - !call this%DynamicPkgLoadType%destroy() - ! ! -- deallocate loader - call this%block_loader%destroy() - deallocate (this%block_loader) + call this%rp_loader%destroy() + deallocate (this%rp_loader) ! ! -- deallocate parser call this%parser%clear() @@ -419,6 +345,7 @@ end subroutine dynamic_destroy !< function open_mf6file(filetype, filename, component_fname, iout) result(inunit) ! -- modules + use InputOutputModule, only: openfile, getunit ! -- dummy character(len=*), intent(in) :: filetype character(len=*), intent(in) :: filename @@ -426,14 +353,14 @@ function open_mf6file(filetype, filename, component_fname, iout) result(inunit) integer(I4B), intent(in) :: iout ! -- return integer(I4B) :: inunit - ! -- locals + ! -- local ! ! -- initialize inunit = 0 ! if (filename /= '') then ! - ! -- get unit number, update object and open file + ! -- get unit number and open file inunit = getunit() call openfile(inunit, iout, trim(adjustl(filename)), filetype, & 'FORMATTED', 'SEQUENTIAL', 'OLD') diff --git a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 index d2664bf18c8..60f1e82f8e1 100644 --- a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 +++ b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 @@ -1,7 +1,7 @@ !> @brief This module contains the LoadMf6FileModule !! !! This module contains the input data model routines for -!! loading the data from a MODFLOW 6 input file using the +!! loading static data from a MODFLOW 6 input file using the !! block parser. !! !< @@ -10,7 +10,7 @@ module LoadMf6FileModule use KindModule, only: DP, I4B, LGP use SimVariablesModule, only: errmsg use SimModule, only: store_error - use ConstantsModule, only: LINELENGTH, LENMEMPATH, LENVARNAME + use ConstantsModule, only: LINELENGTH, LENVARNAME use BlockParserModule, only: BlockParserType use LayeredArrayReaderModule, only: read_dbl1d_layered, & read_dbl2d_layered, & @@ -29,89 +29,217 @@ module LoadMf6FileModule use ModflowInputModule, only: ModflowInputType, getModflowInput use MemoryManagerModule, only: mem_allocate, mem_setptr use MemoryHelperModule, only: create_mem_path + use StructArrayModule, only: StructArrayType use IdmLoggerModule, only: idm_log_var, idm_log_header, idm_log_close implicit none private - public :: idm_load + public :: LoadMf6FileType + + !> @brief Static parser based input loader + !! + !! This type defines a static input context loader + !! for traditional mf6 ascii input files. + !! + !< + type :: LoadMf6FileType + type(BlockParserType), pointer :: parser !< ascii block parser + integer(I4B), dimension(:), pointer, contiguous :: mshape => null() !< model shape + type(StructArrayType), pointer :: structarray => null() !< structarray for loading list input + type(ModflowInputType) :: mf6_input !< description of input + character(len=LINELENGTH) :: filename !< name of ascii input file + logical(LGP) :: ts_active !< is timeseries active + integer(I4B) :: iout !< inunit for list log + contains + procedure :: load + procedure :: init + procedure :: load_block + procedure :: finalize + procedure :: parse_block + procedure :: block_post_process + procedure :: parse_io_tag + procedure :: parse_keyword_tag + procedure :: parse_tag + procedure :: block_index_dfn + procedure :: parse_structarray_block + end type LoadMf6FileType contains - !> @brief procedure to load a file + !> @brief load all static input blocks !! - !! Use parser to load information from an input file into the __INPUT__ - !! memory context location of the memory manager. + !! Invoke this routine to load all static input blocks + !! in single call. !! !< - subroutine idm_load(parser, mf6_input, iout) - use SimVariablesModule, only: idm_context - use SourceCommonModule, only: set_model_shape, mem_allocate_naux - type(BlockParserType), intent(inout) :: parser !< block parser - type(ModflowInputType), intent(in) :: mf6_input !< ModflowInputType - integer(I4B), intent(in) :: iout !< unit number for output - integer(I4B) :: iblock !< consecutive block number as defined in definition file - character(len=LENMEMPATH) :: componentMemPath - integer(I4B), dimension(:), contiguous, pointer :: mshape => null() - character(len=LINELENGTH) :: filename !< input filename - ! - ! -- model shape memory path - componentMemPath = create_mem_path(component=mf6_input%component_name, & - context=idm_context) - ! - ! -- set filename - inquire (unit=parser%GetUnit(), name=filename) + subroutine load(this, parser, mf6_input, filename, iout) + ! -- modules + use MemoryManagerModule, only: get_isize + ! -- dummy + class(LoadMf6FileType) :: this + type(BlockParserType), target, intent(inout) :: parser + type(ModflowInputType), intent(in) :: mf6_input + character(len=*), intent(in) :: filename + integer(I4B), intent(in) :: iout + ! -- local + integer(I4B) :: iblk ! - ! -- log lst file header - call idm_log_header(mf6_input%component_name, & - mf6_input%subcomponent_name, iout) + ! -- initialize static load + call this%init(parser, mf6_input, filename, iout) ! ! -- process blocks - do iblock = 1, size(mf6_input%block_dfns) + do iblk = 1, size(this%mf6_input%block_dfns) ! ! -- don't load dynamic input data - if (mf6_input%block_dfns(iblock)%blockname == 'PERIOD') exit + if (this%mf6_input%block_dfns(iblk)%blockname == 'PERIOD') exit ! ! -- load the block - call parse_block(parser, mf6_input, iblock, mshape, filename, iout, .false.) - ! - ! -- - call block_post_process(mf6_input, mf6_input%block_dfns(iblock)%blockname, & - mshape, filename) + call this%load_block(iblk) ! end do ! - ! -- close logging statement - call idm_log_close(mf6_input%component_name, & - mf6_input%subcomponent_name, iout) - end subroutine idm_load + ! -- finalize static load + call this%finalize() + ! + ! --return + return + end subroutine load - subroutine block_post_process(mf6_input, blockname, mshape, filename) - use SourceCommonModule, only: set_model_shape, mem_allocate_naux - type(ModflowInputType), intent(in) :: mf6_input !< ModflowInputType - character(len=*), intent(in) :: blockname - integer(I4B), dimension(:), contiguous, pointer, intent(inout) :: mshape + !> @brief init + !! + !! init / finalize are only used when load_block() will be called + !! + !< + subroutine init(this, parser, mf6_input, filename, iout) + ! -- modules + use MemoryManagerModule, only: get_isize + ! -- dummy + class(LoadMf6FileType) :: this + type(BlockParserType), target, intent(inout) :: parser + type(ModflowInputType), intent(in) :: mf6_input character(len=*), intent(in) :: filename + integer(I4B), intent(in) :: iout + ! -- local + integer(I4B) :: isize + ! + this%parser => parser + this%mf6_input = mf6_input + this%filename = filename + this%ts_active = .false. + this%iout = iout + ! + call get_isize('MODEL_SHAPE', mf6_input%component_mempath, isize) + ! + if (isize > 0) then + call mem_setptr(this%mshape, 'MODEL_SHAPE', mf6_input%component_mempath) + end if + ! + ! -- log lst file header + call idm_log_header(this%mf6_input%component_name, & + this%mf6_input%subcomponent_name, this%iout) + ! + ! -- return + return + end subroutine init + + !> @brief load a single block + !! + !! Assumed in order load of single (next) block. If a + !! StructArray object is allocated to load this block + !! it persists until this routine (or finalize) is + !! called again. + !! + !< + subroutine load_block(this, iblk) + ! -- modules + use StructArrayModule, only: destructStructArray + ! -- dummy + class(LoadMf6FileType) :: this + integer(I4B), intent(in) :: iblk + ! -- local + ! + ! -- reset structarray if it was created for previous block + if (associated(this%structarray)) then + ! -- destroy the structured array reader + call destructStructArray(this%structarray) + end if + ! + ! -- load the block + call this%parse_block(iblk, .false.) + ! + ! -- post process block + call this%block_post_process(iblk) + ! + ! --return + return + end subroutine load_block + + !> @brief finalize + !! + !! init / finalize are only used when load_block() will be called + !! + !< + subroutine finalize(this) + ! -- modules + use StructArrayModule, only: destructStructArray + ! -- dummy + class(LoadMf6FileType) :: this + ! -- local + ! + ! -- cleanup + if (associated(this%structarray)) then + ! -- destroy the structured array reader + call destructStructArray(this%structarray) + end if + ! + ! -- close logging block + call idm_log_close(this%mf6_input%component_name, & + this%mf6_input%subcomponent_name, this%iout) + ! + ! -- return + return + end subroutine finalize + + !> @brief Post parse block handling + !! + !< + subroutine block_post_process(this, iblk) + ! -- modules + use MemoryManagerModule, only: get_isize + use SourceCommonModule, only: set_model_shape, mem_allocate_naux + ! -- dummy + class(LoadMf6FileType) :: this + integer(I4B), intent(in) :: iblk + ! -- local type(InputParamDefinitionType), pointer :: idt - integer(I4B) :: iparam + integer(I4B) :: iparam, ts6_size ! - select case (blockname) + select case (this%mf6_input%block_dfns(iblk)%blockname) case ('OPTIONS') ! -- allocate naux and set to 0 if not allocated - do iparam = 1, size(mf6_input%param_dfns) - idt => mf6_input%param_dfns(iparam) + do iparam = 1, size(this%mf6_input%param_dfns) + idt => this%mf6_input%param_dfns(iparam) ! if (idt%blockname == 'OPTIONS' .and. & idt%tagname == 'AUXILIARY') then - call mem_allocate_naux(mf6_input%mempath) + call mem_allocate_naux(this%mf6_input%mempath) exit end if end do + ! + ! -- determine if TS6 files were provided in OPTIONS block + call get_isize('TS6_FILENAME', this%mf6_input%mempath, ts6_size) + ! + if (ts6_size > 0) then + this%ts_active = .true. + end if + ! case ('DIMENSIONS') ! -- set model shape if discretization dimensions have been read - if (mf6_input%pkgtype(1:3) == 'DIS') then - call set_model_shape(mf6_input%pkgtype, filename, & - mf6_input%component_mempath, & - mf6_input%mempath, mshape) + if (this%mf6_input%pkgtype(1:3) == 'DIS') then + call set_model_shape(this%mf6_input%pkgtype, this%filename, & + this%mf6_input%component_mempath, & + this%mf6_input%mempath, this%mshape) end if case default end select @@ -120,24 +248,18 @@ subroutine block_post_process(mf6_input, blockname, mshape, filename) return end subroutine block_post_process - !> @brief procedure to load a block - !! - !! Use parser to load information from a block into the __INPUT__ - !! memory context location of the memory manager. Allow for recursive - !! calls for blocks that may appear multiple times in an input file. + !> @brief parse block !! !< - recursive subroutine parse_block(parser, mf6_input, iblock, mshape, filename, & - iout, recursive_call) + recursive subroutine parse_block(this, iblk, recursive_call) + ! -- modules use MemoryTypeModule, only: MemoryType use MemoryManagerModule, only: get_from_memorylist - type(BlockParserType), intent(inout) :: parser !< block parser - type(ModflowInputType), intent(in) :: mf6_input !< ModflowInputType - integer(I4B), intent(in) :: iblock !< consecutive block number as defined in definition file - integer(I4B), dimension(:), contiguous, pointer, intent(inout) :: mshape !< model shape - character(len=*), intent(in) :: filename !< input filename - integer(I4B), intent(in) :: iout !< unit number for output + ! -- dummy + class(LoadMf6FileType) :: this + integer(I4B), intent(in) :: iblk logical(LGP), intent(in) :: recursive_call !< true if recursive call + ! -- local logical(LGP) :: isblockfound logical(LGP) :: endOfBlock logical(LGP) :: supportOpenClose @@ -146,10 +268,11 @@ recursive subroutine parse_block(parser, mf6_input, iblock, mshape, filename, & type(MemoryType), pointer :: mt ! ! -- disu vertices/cell2d blocks are contingent on NVERT dimension - if (mf6_input%pkgtype == 'DISU6' .or. mf6_input%pkgtype == 'DISL6') then - if (mf6_input%block_dfns(iblock)%blockname == 'VERTICES' .or. & - mf6_input%block_dfns(iblock)%blockname == 'CELL2D') then - call get_from_memorylist('NVERT', mf6_input%mempath, mt, found, & + if (this%mf6_input%pkgtype == 'DISU6' .or. & + this%mf6_input%pkgtype == 'DISL6') then + if (this%mf6_input%block_dfns(iblk)%blockname == 'VERTICES' .or. & + this%mf6_input%block_dfns(iblk)%blockname == 'CELL2D') then + call get_from_memorylist('NVERT', this%mf6_input%mempath, mt, found, & .false.) if (.not. found) return if (mt%intsclr == 0) return @@ -157,39 +280,39 @@ recursive subroutine parse_block(parser, mf6_input, iblock, mshape, filename, & end if ! ! -- block open/close support - supportOpenClose = (mf6_input%block_dfns(iblock)%blockname /= 'GRIDDATA') + supportOpenClose = (this%mf6_input%block_dfns(iblk)%blockname /= 'GRIDDATA') ! ! -- parser search for block - required = mf6_input%block_dfns(iblock)%required .and. .not. recursive_call - call parser%GetBlock(mf6_input%block_dfns(iblock)%blockname, isblockfound, & - ierr, supportOpenClose=supportOpenClose, & - blockRequired=required) + required = this%mf6_input%block_dfns(iblk)%required .and. .not. recursive_call + call this%parser%GetBlock(this%mf6_input%block_dfns(iblk)%blockname, & + isblockfound, ierr, & + supportOpenClose=supportOpenClose, & + blockRequired=required) ! ! -- process block if (isblockfound) then - if (mf6_input%block_dfns(iblock)%aggregate) then + if (this%mf6_input%block_dfns(iblk)%aggregate) then ! ! -- process block recarray type, set of variable 1d/2d types - call parse_structarray_block(parser, mf6_input, iblock, mshape, & - filename, iout) + call this%parse_structarray_block(iblk) + ! else do ! process each line in block - call parser%GetNextLine(endOfBlock) + call this%parser%GetNextLine(endOfBlock) if (endOfBlock) exit ! ! -- process line as tag(s) - call parse_tag(parser, mf6_input, iblock, mshape, filename, iout, & - .false.) + call this%parse_tag(iblk, .false.) + ! end do end if end if ! ! -- recurse if block is reloadable and was just read - if (mf6_input%block_dfns(iblock)%block_variable) then + if (this%mf6_input%block_dfns(iblk)%block_variable) then if (isblockfound) then - call parse_block(parser, mf6_input, iblock, mshape, filename, iout, & - .true.) + call this%parse_block(iblk, .true.) end if end if ! @@ -197,67 +320,99 @@ recursive subroutine parse_block(parser, mf6_input, iblock, mshape, filename, & return end subroutine parse_block - subroutine parse_iofile_tag(parser, mf6_input, iblock, mshape, tag, found, & - filename, iout) + subroutine parse_io_tag(this, iblk, pkgtype, which, tag) + ! -- modules + ! -- dummy + class(LoadMf6FileType) :: this + integer(I4B), intent(in) :: iblk + character(len=*), intent(in) :: pkgtype + character(len=*), intent(in) :: which + character(len=*), intent(in) :: tag + ! -- local + type(InputParamDefinitionType), pointer :: idt !< input data type object describing this record + ! + ! -- matches, read and load file name + idt => & + get_param_definition_type(this%mf6_input%param_dfns, & + this%mf6_input%component_type, & + this%mf6_input%subcomponent_type, & + this%mf6_input%block_dfns(iblk)%blockname, & + tag, this%filename) + ! + ! -- load io tag + call load_io_tag(this%parser, idt, this%mf6_input%mempath, which, this%iout) + ! + ! -- return + return + end subroutine parse_io_tag + + subroutine parse_keyword_tag(this, iblk, tag, idt) + ! -- modules use DefinitionSelectModule, only: split_record_definition - type(BlockParserType), intent(inout) :: parser !< block parser - type(ModflowInputType), intent(in) :: mf6_input !< ModflowInputType - integer(I4B), intent(in) :: iblock !< consecutive block number as defined in definition file - integer(I4B), dimension(:), contiguous, pointer, intent(inout) :: mshape !< model shape + ! -- dummy + class(LoadMf6FileType) :: this + integer(I4B), intent(in) :: iblk character(len=LINELENGTH), intent(in) :: tag - logical(LGP), intent(inout) :: found !< file tag was identified and loaded - character(len=*), intent(in) :: filename !< input filename - integer(I4B), intent(in) :: iout !< unit number for output - type(InputParamDefinitionType), pointer :: idt !< input data type object describing this record + type(InputParamDefinitionType), pointer, intent(in) :: idt + ! -- local character(len=40), dimension(:), allocatable :: words integer(I4B) :: nwords character(len=LINELENGTH) :: io_tag + logical(LGP) :: found ! ! -- initialization found = .false. ! - ! -- get tokens in matching definition - call split_record_definition(mf6_input%param_dfns, & - mf6_input%component_type, & - mf6_input%subcomponent_type, & - tag, nwords, words) - ! - ! -- a filein/fileout record tag definition has 4 tokens - if (nwords == 4) then + ! -- if in record tag check and load if input/output file + if (idt%in_record) then ! - ! -- verify third definition token is FILEIN/FILEOUT - if (words(3) == 'FILEIN' .or. words(3) == 'FILEOUT') then - ! - ! -- read 3rd token - call parser%GetStringCaps(io_tag) + ! -- get tokens in matching definition + call split_record_definition(this%mf6_input%param_dfns, & + this%mf6_input%component_type, & + this%mf6_input%subcomponent_type, & + tag, nwords, words) + ! + ! -- a filein/fileout record tag definition has 4 tokens + if (nwords == 4) then ! - ! -- check if 3rd token matches definition - if (.not. (io_tag == words(3))) then - errmsg = 'Expected "'//trim(words(3))//'" following keyword "'// & - trim(tag)//'" but instead found "'//trim(io_tag)//'"' - call store_error(errmsg) - call parser%StoreErrorUnit() - else + ! -- verify third definition token is FILEIN/FILEOUT + if (words(3) == 'FILEIN' .or. words(3) == 'FILEOUT') then ! - ! -- matches, read and load file name - idt => & - get_param_definition_type(mf6_input%param_dfns, & - mf6_input%component_type, & - mf6_input%subcomponent_type, & - mf6_input%block_dfns(iblock)%blockname, & - words(4), filename) + ! -- read 3rd token + call this%parser%GetStringCaps(io_tag) ! - call load_io_tag(parser, idt, mf6_input%mempath, words(3), iout) + ! -- check if 3rd token matches definition + if (io_tag == words(3)) then + call this%parse_io_tag(iblk, words(2), words(3), words(4)) + found = .true. + else + errmsg = 'Expected "'//trim(words(3))//'" following keyword "'// & + trim(tag)//'" but instead found "'//trim(io_tag)//'"' + call store_error(errmsg) + call this%parser%StoreErrorUnit() + end if ! - ! -- io tag loaded - found = .true. end if end if + ! + ! -- deallocate words + if (allocated(words)) deallocate (words) + end if + ! + if (.not. found) then + ! -- load standard keyword tag + call load_keyword_type(this%parser, idt, this%mf6_input%mempath, this%iout) + ! + ! -- check/set as dev option + if (idt%tagname(1:4) == 'DEV_' .and. & + this%mf6_input%block_dfns(iblk)%blockname == 'OPTIONS') then + call this%parser%DevOpt() + end if end if ! - ! -- deallocate words - if (allocated(words)) deallocate (words) - end subroutine parse_iofile_tag + ! -- return + return + end subroutine parse_keyword_tag !> @brief load an individual input record into memory !! @@ -266,21 +421,18 @@ end subroutine parse_iofile_tag !! tags are on a single line. !! !< - recursive subroutine parse_tag(parser, mf6_input, iblock, mshape, filename, & - iout, recursive_call) - type(BlockParserType), intent(inout) :: parser !< block parser - type(ModflowInputType), intent(in) :: mf6_input !< ModflowInputType - integer(I4B), intent(in) :: iblock !< consecutive block number as defined in definition file - integer(I4B), dimension(:), contiguous, pointer, intent(inout) :: mshape !< model shape - character(len=*), intent(in) :: filename !< input filename - integer(I4B), intent(in) :: iout !< unit number for output + recursive subroutine parse_tag(this, iblk, recursive_call) + ! -- modules + ! -- dummy + class(LoadMf6FileType) :: this + integer(I4B), intent(in) :: iblk logical(LGP), intent(in) :: recursive_call !< true if recursive call + ! -- local character(len=LINELENGTH) :: tag type(InputParamDefinitionType), pointer :: idt !< input data type object describing this record - logical(LGP) :: found_io_tag ! ! -- read tag name - call parser%GetStringCaps(tag) + call this%parser%GetStringCaps(tag) if (recursive_call) then if (tag == '') then ! no data on line so return @@ -289,100 +441,87 @@ recursive subroutine parse_tag(parser, mf6_input, iblock, mshape, filename, & end if ! ! -- find keyword in input definition - idt => get_param_definition_type(mf6_input%param_dfns, & - mf6_input%component_type, & - mf6_input%subcomponent_type, & - mf6_input%block_dfns(iblock)%blockname, & - tag, filename) + idt => get_param_definition_type(this%mf6_input%param_dfns, & + this%mf6_input%component_type, & + this%mf6_input%subcomponent_type, & + this%mf6_input%block_dfns(iblk)%blockname, & + tag, this%filename) ! ! -- allocate and load data type select case (idt%datatype) case ('KEYWORD') - ! - ! -- initialize, not a filein/fileout tag - found_io_tag = .false. - ! - ! -- if in record tag check and load if input/output file - if (idt%in_record) then - ! - ! -- identify and load the file name - call parse_iofile_tag(parser, mf6_input, iblock, mshape, tag, & - found_io_tag, filename, iout) - end if - ! - if (.not. found_io_tag) then - ! - ! -- load standard keyword tag - call load_keyword_type(parser, idt, mf6_input%mempath, iout) - end if - ! - ! -- check/set as dev option - if (mf6_input%block_dfns(iblock)%blockname == 'OPTIONS' .and. & - idt%tagname(1:4) == 'DEV_') then - call parser%DevOpt() - end if + call this%parse_keyword_tag(iblk, tag, idt) case ('STRING') if (idt%shape == 'NAUX') then - call load_auxvar_names(parser, idt, mf6_input%mempath, iout) + call load_auxvar_names(this%parser, idt, this%mf6_input%mempath, & + this%iout) else - call load_string_type(parser, idt, mf6_input%mempath, iout) + call load_string_type(this%parser, idt, this%mf6_input%mempath, this%iout) end if case ('INTEGER') - call load_integer_type(parser, idt, mf6_input%mempath, iout) + call load_integer_type(this%parser, idt, this%mf6_input%mempath, this%iout) case ('INTEGER1D') - call load_integer1d_type(parser, idt, mf6_input%mempath, mshape, iout) + call load_integer1d_type(this%parser, idt, this%mf6_input%mempath, & + this%mshape, this%iout) case ('INTEGER2D') - call load_integer2d_type(parser, idt, mf6_input%mempath, mshape, iout) + call load_integer2d_type(this%parser, idt, this%mf6_input%mempath, & + this%mshape, this%iout) case ('INTEGER3D') - call load_integer3d_type(parser, idt, mf6_input%mempath, mshape, iout) + call load_integer3d_type(this%parser, idt, this%mf6_input%mempath, & + this%mshape, this%iout) case ('DOUBLE') - call load_double_type(parser, idt, mf6_input%mempath, iout) + call load_double_type(this%parser, idt, this%mf6_input%mempath, this%iout) case ('DOUBLE1D') - call load_double1d_type(parser, idt, mf6_input%mempath, mshape, iout) + call load_double1d_type(this%parser, idt, this%mf6_input%mempath, & + this%mshape, this%iout) case ('DOUBLE2D') - call load_double2d_type(parser, idt, mf6_input%mempath, mshape, iout) + call load_double2d_type(this%parser, idt, this%mf6_input%mempath, & + this%mshape, this%iout) case ('DOUBLE3D') - call load_double3d_type(parser, idt, mf6_input%mempath, mshape, iout) + call load_double3d_type(this%parser, idt, this%mf6_input%mempath, & + this%mshape, this%iout) case default write (errmsg, '(a,a)') 'Failure reading data for tag: ', trim(tag) call store_error(errmsg) - call parser%StoreErrorUnit() + call this%parser%StoreErrorUnit() end select ! ! -- continue line if in same record if (idt%in_record) then ! ! recursively call parse tag again to read rest of line - call parse_tag(parser, mf6_input, iblock, mshape, filename, iout, .true.) + call this%parse_tag(iblk, .true.) end if ! - ! -- + ! -- return return end subroutine parse_tag - function block_index_dfn(mf6_input, iblock, iout) result(idt) - type(ModflowInputType), intent(in) :: mf6_input !< ModflowInputType - integer(I4B), intent(in) :: iblock !< consecutive block number as defined in definition file - integer(I4B), intent(in) :: iout !< unit number for output + function block_index_dfn(this, iblk) result(idt) + ! -- modules + ! -- dummy + class(LoadMf6FileType) :: this + integer(I4B), intent(in) :: iblk + ! -- local type(InputParamDefinitionType) :: idt !< input data type object describing this record character(len=LENVARNAME) :: varname integer(I4B) :: ilen character(len=3) :: block_suffix = 'NUM' ! ! -- assign first column as the block number - ilen = len_trim(mf6_input%block_dfns(iblock)%blockname) + ilen = len_trim(this%mf6_input%block_dfns(iblk)%blockname) ! if (ilen > (LENVARNAME - len(block_suffix))) then varname = & - mf6_input%block_dfns(iblock)% & + this%mf6_input%block_dfns(iblk)% & blockname(1:(LENVARNAME - len(block_suffix)))//block_suffix else - varname = trim(mf6_input%block_dfns(iblock)%blockname)//block_suffix + varname = trim(this%mf6_input%block_dfns(iblk)%blockname)//block_suffix end if ! - idt%component_type = trim(mf6_input%component_type) - idt%subcomponent_type = trim(mf6_input%subcomponent_type) - idt%blockname = trim(mf6_input%block_dfns(iblock)%blockname) + idt%component_type = trim(this%mf6_input%component_type) + idt%subcomponent_type = trim(this%mf6_input%subcomponent_type) + idt%blockname = trim(this%mf6_input%block_dfns(iblk)%blockname) idt%tagname = varname idt%mf6varname = varname idt%datatype = 'INTEGER' @@ -399,37 +538,34 @@ end function block_index_dfn !! vector. !! !< - subroutine parse_structarray_block(parser, mf6_input, iblock, mshape, & - filename, iout) - use StructArrayModule, only: StructArrayType, constructStructArray, & - destructStructArray - type(BlockParserType), intent(inout) :: parser !< block parser - type(ModflowInputType), intent(in) :: mf6_input !< ModflowInputType - integer(I4B), intent(in) :: iblock !< consecutive block number as defined in definition file - integer(I4B), dimension(:), contiguous, pointer, intent(inout) :: mshape !< model shape - character(len=*), intent(in) :: filename !< input filename - integer(I4B), intent(in) :: iout !< unit number for output + subroutine parse_structarray_block(this, iblk) + ! -- modules + use StructArrayModule, only: StructArrayType, constructStructArray + ! -- dummy + class(LoadMf6FileType) :: this + integer(I4B), intent(in) :: iblk + ! -- local type(InputParamDefinitionType), pointer :: idt !< input data type object describing this record type(InputParamDefinitionType), target :: blockvar_idt integer(I4B) :: blocknum, iwords - integer(I4B), pointer :: nrow => null() + integer(I4B), pointer :: nrow integer(I4B) :: nrows, nrowsread integer(I4B) :: icol integer(I4B) :: ncol integer(I4B) :: nwords character(len=16), dimension(:), allocatable :: words - type(StructArrayType), pointer :: struct_array character(len=:), allocatable :: parse_str ! ! -- set input definition for this block - idt => get_aggregate_definition_type(mf6_input%aggregate_dfns, & - mf6_input%component_type, & - mf6_input%subcomponent_type, & - mf6_input%block_dfns(iblock)%blockname) + idt => & + get_aggregate_definition_type(this%mf6_input%aggregate_dfns, & + this%mf6_input%component_type, & + this%mf6_input%subcomponent_type, & + this%mf6_input%block_dfns(iblk)%blockname) ! ! -- if block is reloadable read the block number - if (mf6_input%block_dfns(iblock)%block_variable) then - blocknum = parser%GetInteger() + if (this%mf6_input%block_dfns(iblk)%block_variable) then + blocknum = this%parser%GetInteger() else blocknum = 0 end if @@ -444,16 +580,16 @@ subroutine parse_structarray_block(parser, mf6_input, iblock, mshape, & ! ! -- use shape to set the max num of rows if (idt%shape /= '') then - call mem_setptr(nrow, idt%shape, mf6_input%mempath) + call mem_setptr(nrow, idt%shape, this%mf6_input%mempath) nrows = nrow else nrows = 0 end if ! ! -- create a structured array - struct_array => constructStructArray(mf6_input, ncol, nrows, blocknum, & - mf6_input%mempath, & - mf6_input%component_mempath) + this%structarray => constructStructArray(this%mf6_input, ncol, nrows, & + blocknum, this%mf6_input%mempath, & + this%mf6_input%component_mempath) ! ! -- create structarray vectors for each column do icol = 1, ncol @@ -462,10 +598,10 @@ subroutine parse_structarray_block(parser, mf6_input, iblock, mshape, & if (blocknum > 0) then if (icol == 1) then ! - blockvar_idt = block_index_dfn(mf6_input, iblock, iout) + blockvar_idt = this%block_index_dfn(iblk) idt => blockvar_idt ! - call struct_array%mem_create_vector(icol, idt) + call this%structarray%mem_create_vector(icol, idt) ! ! -- continue as this column managed by internally SA object cycle @@ -480,23 +616,22 @@ subroutine parse_structarray_block(parser, mf6_input, iblock, mshape, & end if ! ! -- set pointer to input definition for this 1d vector - idt => get_param_definition_type(mf6_input%param_dfns, & - mf6_input%component_type, & - mf6_input%subcomponent_type, & - mf6_input%block_dfns(iblock)%blockname, & - words(iwords), filename) + idt => & + get_param_definition_type(this%mf6_input%param_dfns, & + this%mf6_input%component_type, & + this%mf6_input%subcomponent_type, & + this%mf6_input%block_dfns(iblk)%blockname, & + words(iwords), this%filename) ! ! -- allocate variable in memory manager - call struct_array%mem_create_vector(icol, idt) + call this%structarray%mem_create_vector(icol, idt) end do ! ! -- read the structured array - nrowsread = struct_array%read_from_parser(parser, .false., iout) - ! - ! -- destroy the structured array reader - call destructStructArray(struct_array) + nrowsread = this%structarray%read_from_parser(this%parser, this%ts_active, & + this%iout) ! - ! -- + ! -- return return end subroutine parse_structarray_block diff --git a/src/Utilities/Idm/mf6blockfile/StressGridInput.f90 b/src/Utilities/Idm/mf6blockfile/Mf6FileGridInput.f90 similarity index 60% rename from src/Utilities/Idm/mf6blockfile/StressGridInput.f90 rename to src/Utilities/Idm/mf6blockfile/Mf6FileGridInput.f90 index 1cade321848..947bab0ef22 100644 --- a/src/Utilities/Idm/mf6blockfile/StressGridInput.f90 +++ b/src/Utilities/Idm/mf6blockfile/Mf6FileGridInput.f90 @@ -1,13 +1,13 @@ -!> @brief This module contains the StressGridInputModule +!> @brief This module contains the Mf6FileGridInputModule !! !! This module contains the routines for reading period block !! array based input. !! !< -module StressGridInputModule +module Mf6FileGridInputModule use KindModule, only: I4B, DP, LGP - use ConstantsModule, only: DZERO, IZERO, LINELENGTH, LENMEMPATH, LENVARNAME, & + use ConstantsModule, only: DZERO, IZERO, LINELENGTH, LENVARNAME, & LENTIMESERIESNAME, LENAUXNAME use SimVariablesModule, only: errmsg use SimModule, only: store_error, store_error_filename @@ -16,73 +16,75 @@ module StressGridInputModule use CharacterStringModule, only: CharacterStringType use BlockParserModule, only: BlockParserType use ModflowInputModule, only: ModflowInputType, getModflowInput - use BoundInputContextModule, only: BoundInputContextType + use BoundInputContextModule, only: BoundInputContextType, ReadStateVarType use TimeArraySeriesManagerModule, only: TimeArraySeriesManagerType, & tasmanager_cr use AsciiInputLoadTypeModule, only: AsciiDynamicPkgLoadBaseType implicit none private - public :: StressGridInputType - - !> @brief Pointer type for read state variable - !< - type ReadStateVar - integer, pointer :: invar - end type ReadStateVar + public :: BoundGridInputType !> @brief Ascii grid based dynamic loader type !< - type, extends(AsciiDynamicPkgLoadBaseType) :: StressGridInputType + type, extends(AsciiDynamicPkgLoadBaseType) :: BoundGridInputType integer(I4B) :: tas_active !< Are TAS6 inputs defined - integer(I4B) :: nparam !< number of dynamic parameters other than AUX type(CharacterStringType), dimension(:), contiguous, & - pointer :: aux_tasnames => null() !< array of AUXVAR TAS names + pointer :: aux_tasnames !< array of AUXVAR TAS names type(CharacterStringType), dimension(:), contiguous, & - pointer :: param_tasnames => null() !< array of dynamic param TAS names - character(len=LENVARNAME), dimension(:), & - allocatable :: param_names !< dynamic param names - type(ReadStateVar), dimension(:), allocatable :: param_reads !< read states for current load - integer(I4B), dimension(:), allocatable :: idt_idxs !< idt indexes corresponding to dfn param list - type(TimeArraySeriesManagerType), pointer :: tasmanager => null() !< TAS manager object - type(BoundInputContextType) :: bndctx !< boundary package input context + pointer :: param_tasnames !< array of dynamic param TAS names + type(ReadStateVarType), dimension(:), allocatable :: param_reads !< read states for current load + type(TimeArraySeriesManagerType), pointer :: tasmanager !< TAS manager + type(BoundInputContextType) :: bound_context contains - procedure :: init => ingrid_init - procedure :: df => ingrid_df - procedure :: ad => ingrid_ad - procedure :: rp => ingrid_rp - procedure :: destroy => ingrid_destroy - procedure :: reset => ingrid_reset - procedure :: params_alloc => ingrid_params_alloc - procedure :: param_load => ingrid_param_load - procedure :: tas_arrays_alloc => ingrid_tas_arrays_alloc - procedure :: tas_links_create => ingrid_tas_links_create - end type StressGridInputType + procedure :: ainit => bndgrid_init + procedure :: df => bndgrid_df + procedure :: ad => bndgrid_ad + procedure :: rp => bndgrid_rp + procedure :: destroy => bndgrid_destroy + procedure :: reset => bndgrid_reset + procedure :: init_charstr1d + procedure :: params_alloc => bndgrid_params_alloc + procedure :: param_load => bndgrid_param_load + procedure :: tas_arrays_alloc => bndgrid_tas_arrays_alloc + procedure :: tas_links_create => bndgrid_tas_links_create + end type BoundGridInputType contains - subroutine ingrid_init(this, mf6_input, modelname, modelfname, & - source, iperblock, iout) + subroutine bndgrid_init(this, mf6_input, component_name, & + component_input_name, input_name, & + iperblock, parser, iout) use MemoryManagerModule, only: get_isize - class(StressGridInputType), intent(inout) :: this + use BlockParserModule, only: BlockParserType + use LoadMf6FileModule, only: LoadMf6FileType + class(BoundGridInputType), intent(inout) :: this type(ModflowInputType), intent(in) :: mf6_input - character(len=*), intent(in) :: modelname - character(len=*), intent(in) :: modelfname - character(len=*), intent(in) :: source + character(len=*), intent(in) :: component_name + character(len=*), intent(in) :: component_input_name + character(len=*), intent(in) :: input_name integer(I4B), intent(in) :: iperblock + type(BlockParserType), pointer, intent(inout) :: parser integer(I4B), intent(in) :: iout + type(LoadMf6FileType) :: loader type(CharacterStringType), dimension(:), pointer, & contiguous :: tas_fnames character(len=LINELENGTH) :: fname integer(I4B) :: tas6_size, n ! - call this%DynamicPkgLoadType%init(mf6_input, modelname, modelfname, & - source, iperblock, iout) + ! -- initialize base type + call this%DynamicPkgLoadType%init(mf6_input, component_name, & + component_input_name, & + input_name, iperblock, iout) ! -- initialize + nullify (this%aux_tasnames) + nullify (this%param_tasnames) this%tas_active = 0 - this%nparam = 0 this%iout = iout ! + ! -- load static input + call loader%load(parser, mf6_input, this%input_name, iout) + ! ! -- create tasmanager allocate (this%tasmanager) call tasmanager_cr(this%tasmanager, modelname=this%mf6_input%component_name, & @@ -106,7 +108,7 @@ subroutine ingrid_init(this, mf6_input, modelname, modelfname, & end if ! ! -- initialize input context memory - call this%bndctx%init(mf6_input, .true.) + call this%bound_context%create(mf6_input, this%readasarrays) ! ! -- allocate dfn params call this%params_alloc() @@ -116,29 +118,30 @@ subroutine ingrid_init(this, mf6_input, modelname, modelfname, & ! ! -- return return - end subroutine ingrid_init + end subroutine bndgrid_init - subroutine ingrid_df(this) + subroutine bndgrid_df(this) ! -- modules - class(StressGridInputType), intent(inout) :: this !< Mf6FileGridInputType + ! -- dummy + class(BoundGridInputType), intent(inout) :: this !< Mf6FileGridInputType ! call this%tasmanager%tasmanager_df() ! ! -- return return - end subroutine ingrid_df + end subroutine bndgrid_df - subroutine ingrid_ad(this) + subroutine bndgrid_ad(this) ! -- modules - class(StressGridInputType), intent(inout) :: this !< Mf6FileGridInputType + class(BoundGridInputType), intent(inout) :: this !< Mf6FileGridInputType ! call this%tasmanager%ad() ! ! -- return return - end subroutine ingrid_ad + end subroutine bndgrid_ad - subroutine ingrid_rp(this, parser) + subroutine bndgrid_rp(this, parser) ! -- modules use MemoryManagerModule, only: mem_setptr use BlockParserModule, only: BlockParserType @@ -147,9 +150,9 @@ subroutine ingrid_rp(this, parser) use ArrayHandlersModule, only: ifind use SourceCommonModule, only: ifind_charstr use IdmLoggerModule, only: idm_log_header, idm_log_close, idm_log_var - class(StressGridInputType), intent(inout) :: this !< Mf6FileGridInputType + class(BoundGridInputType), intent(inout) :: this !< Mf6FileGridInputType type(BlockParserType), pointer, intent(inout) :: parser - ! -- locals + ! -- local logical(LGP) :: endOfBlock character(len=LINELENGTH) :: keyword, param_tag type(InputParamDefinitionType), pointer :: idt @@ -176,7 +179,7 @@ subroutine ingrid_rp(this, parser) call parser%GetStringCaps(param_tag) ! ! -- is param tag an auxvar? - iaux = ifind_charstr(this%bndctx%auxname_cst, param_tag) + iaux = ifind_charstr(this%bound_context%auxname_cst, param_tag) ! ! -- any auvxar corresponds to the definition tag 'AUX' if (iaux > 0) param_tag = 'AUX' @@ -185,7 +188,7 @@ subroutine ingrid_rp(this, parser) idt => get_param_definition_type(this%mf6_input%param_dfns, & this%mf6_input%component_type, & this%mf6_input%subcomponent_type, & - 'PERIOD', param_tag, this%sourcename) + 'PERIOD', param_tag, this%input_name) ! ! -- look for TAS keyword if tas is active if (this%tas_active /= 0) then @@ -228,24 +231,21 @@ subroutine ingrid_rp(this, parser) ! ! -- return return - end subroutine ingrid_rp + end subroutine bndgrid_rp - subroutine ingrid_destroy(this) + subroutine bndgrid_destroy(this) ! -- modules - class(StressGridInputType), intent(inout) :: this !< Mf6FileGridInputType + class(BoundGridInputType), intent(inout) :: this !< Mf6FileGridInputType ! deallocate (this%tasmanager) ! ! -- return return - end subroutine ingrid_destroy + end subroutine bndgrid_destroy - subroutine ingrid_reset(this) + subroutine bndgrid_reset(this) ! -- modules - use MemoryManagerModule, only: mem_deallocate, mem_setptr, get_isize - use InputDefinitionModule, only: InputParamDefinitionType - use DefinitionSelectModule, only: get_param_definition_type - class(StressGridInputType), intent(inout) :: this !< StressGridInputType + class(BoundGridInputType), intent(inout) :: this !< BoundGridInputType integer(I4B) :: n, m ! if (this%tas_active /= 0) then @@ -254,96 +254,76 @@ subroutine ingrid_reset(this) call this%tasmanager%reset(this%mf6_input%subcomponent_name) ! ! -- reinitialize tas name arrays - call this%bndctx%param_init('CHARSTR1D', 'AUXTASNAME', & - this%mf6_input%mempath, this%sourcename) - call this%bndctx%param_init('CHARSTR1D', 'PARAMTASNAME', & - this%mf6_input%mempath, this%sourcename) + call this%init_charstr1d('AUXTASNAME', this%input_name) + call this%init_charstr1d('PARAMTASNAME', this%input_name) end if ! do n = 1, this%nparam - if (this%param_reads(n)%invar /= 0) then - ! - ! -- reset read state - this%param_reads(n)%invar = 0 - ! - end if + ! -- reset read state + this%param_reads(n)%invar = 0 end do ! ! -- explicitly reset auxvar array each period - do m = 1, this%bndctx%ncpl - do n = 1, this%bndctx%naux - this%bndctx%auxvar(n, m) = DZERO + do m = 1, this%bound_context%ncpl + do n = 1, this%bound_context%naux + this%bound_context%auxvar(n, m) = DZERO end do end do ! ! -- return return - end subroutine ingrid_reset + end subroutine bndgrid_reset - subroutine ingrid_params_alloc(this) + subroutine init_charstr1d(this, varname, input_name) ! -- modules - use MemoryManagerModule, only: mem_allocate - use InputDefinitionModule, only: InputParamDefinitionType - use DefinitionSelectModule, only: get_param_definition_type - use ArrayHandlersModule, only: expandarray + use MemoryManagerModule, only: mem_setptr ! -- dummy - class(StressGridInputType), intent(inout) :: this !< StressGridInputType - type(InputParamDefinitionType), pointer :: idt - character(len=LENVARNAME), dimension(:), allocatable :: read_state_varnames + class(BoundGridInputType) :: this + character(len=*), intent(in) :: varname + character(len=*), intent(in) :: input_name + ! -- local + type(CharacterStringType), dimension(:), pointer, & + contiguous :: charstr1d + integer(I4B) :: n + ! + call mem_setptr(charstr1d, varname, this%mf6_input%mempath) + do n = 1, size(charstr1d) + charstr1d(n) = '' + end do + end subroutine init_charstr1d + + subroutine bndgrid_params_alloc(this) + ! -- modules + ! -- dummy + class(BoundGridInputType), intent(inout) :: this !< BoundGridInputType + character(len=LENVARNAME) :: rs_varname integer(I4B), pointer :: intvar integer(I4B) :: iparam ! - ! -- allocate period dfn params - call this%bndctx%bound_params_allocate(this%sourcename) + ! -- set in scope param names + call this%bound_context%bound_params(this%param_names, this%nparam, & + this%input_name) ! - ! -- allocate dfn input params - do iparam = 1, size(this%mf6_input%param_dfns) - ! - ! -- assign param definition pointer - idt => this%mf6_input%param_dfns(iparam) - ! - if (idt%blockname == 'PERIOD') then - ! - ! -- store parameter info - if (idt%tagname /= 'AUX') then - this%nparam = this%nparam + 1 - ! - ! -- reallocate param info arrays - call expandarray(this%param_names) - call expandarray(this%idt_idxs) - call expandarray(read_state_varnames) - ! - ! -- internal mf6 param name - this%param_names(this%nparam) = idt%mf6varname - ! -- idt list index of param - this%idt_idxs(this%nparam) = iparam - ! -- allocate and store name of read state variable - read_state_varnames(this%nparam) = & - this%bndctx%allocate_read_state_var(idt%mf6varname) - ! - end if - ! - end if - end do + call this%bound_context%allocate_arrays() ! ! -- allocate and set param_reads pointer array allocate (this%param_reads(this%nparam)) ! ! store read state variable pointers do iparam = 1, this%nparam - call mem_setptr(intvar, read_state_varnames(iparam), this%mf6_input%mempath) + ! -- allocate and store name of read state variable + rs_varname = this%bound_context%rsv_alloc(this%param_names(iparam)) + call mem_setptr(intvar, rs_varname, this%mf6_input%mempath) this%param_reads(iparam)%invar => intvar + this%param_reads(iparam)%invar = 0 end do ! - ! -- cleanup - deallocate (read_state_varnames) - ! ! -- return return - end subroutine ingrid_params_alloc + end subroutine bndgrid_params_alloc - subroutine ingrid_param_load(this, parser, datatype, varname, & - tagname, mempath, iaux) + subroutine bndgrid_param_load(this, parser, datatype, varname, & + tagname, mempath, iaux) ! -- modules use MemoryManagerModule, only: mem_setptr use ArrayHandlersModule, only: ifind @@ -354,14 +334,14 @@ subroutine ingrid_param_load(this, parser, datatype, varname, & use Integer1dReaderModule, only: read_int1d use IdmLoggerModule, only: idm_log_var ! -- dummy - class(StressGridInputType), intent(inout) :: this !< StressGridInputType + class(BoundGridInputType), intent(inout) :: this !< BoundGridInputType type(BlockParserType), intent(in) :: parser character(len=*), intent(in) :: datatype character(len=*), intent(in) :: varname character(len=*), intent(in) :: tagname character(len=*), intent(in) :: mempath integer(I4B), intent(in) :: iaux - ! -- locals + ! -- local integer(I4B), dimension(:), pointer, contiguous :: int1d real(DP), dimension(:), pointer, contiguous :: dbl1d real(DP), dimension(:, :), pointer, contiguous :: dbl2d @@ -388,9 +368,10 @@ subroutine ingrid_param_load(this, parser, datatype, varname, & ! case default ! - call store_error('Programming error. (IDM) unsupported memload & - &data type for param='//trim(tagname)) - call store_error_filename(this%sourcename) + errmsg = 'IDM unimplemented. Mf6FileGridInput::param_load & + &datatype='//trim(datatype) + call store_error(errmsg) + call store_error_filename(this%input_name) ! end select ! @@ -403,27 +384,24 @@ subroutine ingrid_param_load(this, parser, datatype, varname, & ! ! -- return return - end subroutine ingrid_param_load + end subroutine bndgrid_param_load - subroutine ingrid_tas_arrays_alloc(this) + subroutine bndgrid_tas_arrays_alloc(this) ! -- modules use MemoryManagerModule, only: mem_allocate - class(StressGridInputType), intent(inout) :: this !< StressGridInputType + class(BoundGridInputType), intent(inout) :: this !< BoundGridInputType ! ! -- count params other than AUX if (this%tas_active /= 0) then ! - call mem_allocate(this%aux_tasnames, LENTIMESERIESNAME, this%bndctx%naux, & - 'AUXTASNAME', this%mf6_input%mempath) + call mem_allocate(this%aux_tasnames, LENTIMESERIESNAME, & + this%bound_context%naux, 'AUXTASNAME', & + this%mf6_input%mempath) call mem_allocate(this%param_tasnames, LENTIMESERIESNAME, this%nparam, & 'PARAMTASNAME', this%mf6_input%mempath) ! - call this%bndctx%param_init('CHARSTR1D', 'AUXTASNAME', & - this%mf6_input%mempath, & - this%sourcename) - call this%bndctx%param_init('CHARSTR1D', 'PARAMTASNAME', & - this%mf6_input%mempath, & - this%sourcename) + call this%init_charstr1d('AUXTASNAME', this%input_name) + call this%init_charstr1d('PARAMTASNAME', this%input_name) ! else ! @@ -436,16 +414,17 @@ subroutine ingrid_tas_arrays_alloc(this) ! ! -- return return - end subroutine ingrid_tas_arrays_alloc + end subroutine bndgrid_tas_arrays_alloc ! FLUX and SFAC are handled in model context - subroutine ingrid_tas_links_create(this, inunit) + subroutine bndgrid_tas_links_create(this, inunit) ! -- modules use InputDefinitionModule, only: InputParamDefinitionType + use DefinitionSelectModule, only: get_param_definition_type ! -- dummy - class(StressGridInputType), intent(inout) :: this !< StressGridInputType + class(BoundGridInputType), intent(inout) :: this !< BoundGridInputType integer(I4B), intent(in) :: inunit - ! -- locals + ! -- local type(InputParamDefinitionType), pointer :: idt ! -- non-contiguous beacuse a slice of bound is passed real(DP), dimension(:), pointer :: auxArrayPtr, bndArrayPtr @@ -463,51 +442,46 @@ subroutine ingrid_tas_links_create(this, inunit) convertflux = .false. ! ! Create AUX Time Array Series links - do n = 1, this%bndctx%naux + do n = 1, this%bound_context%naux tas_name = this%aux_tasnames(n) ! if (tas_name /= '') then - ! ! -- set auxvar pointer - auxArrayPtr => this%bndctx%auxvar(n, :) - ! - aux_name = this%bndctx%auxname_cst(n) - ! + auxArrayPtr => this%bound_context%auxvar(n, :) + aux_name = this%bound_context%auxname_cst(n) call this%tasmanager%MakeTasLink(this%mf6_input%subcomponent_name, & - auxArrayPtr, this%bndctx%iprpak, & + auxArrayPtr, this%bound_context%iprpak, & tas_name, aux_name, convertFlux, & nodelist, inunit) end if - ! end do ! ! Create BND Time Array Series links do n = 1, this%nparam - ! ! -- assign param definition pointer - idt => this%mf6_input%param_dfns(this%idt_idxs(n)) + idt => get_param_definition_type(this%mf6_input%param_dfns, & + this%mf6_input%component_type, & + this%mf6_input%subcomponent_type, & + 'PERIOD', this%param_names(n), & + this%input_name) ! if (idt%timeseries) then - ! if (this%param_reads(n)%invar == 2) then tas_name = this%param_tasnames(n) - ! call mem_setptr(bound, idt%mf6varname, this%mf6_input%mempath) - ! ! -- set bound pointer bndArrayPtr => bound(:) - ! call this%tasmanager%MakeTasLink(this%mf6_input%subcomponent_name, & - bndArrayPtr, this%bndctx%iprpak, & + bndArrayPtr, & + this%bound_context%iprpak, & tas_name, idt%mf6varname, & convertFlux, nodelist, inunit) end if end if end do - ! ! -- return return - end subroutine ingrid_tas_links_create + end subroutine bndgrid_tas_links_create -end module StressGridInputModule +end module Mf6FileGridInputModule diff --git a/src/Utilities/Idm/mf6blockfile/Mf6FileListInput.f90 b/src/Utilities/Idm/mf6blockfile/Mf6FileListInput.f90 new file mode 100644 index 00000000000..52cc4646b31 --- /dev/null +++ b/src/Utilities/Idm/mf6blockfile/Mf6FileListInput.f90 @@ -0,0 +1,585 @@ +!> @brief This module contains the Mf6FileListInputModule +!! +!! This module contains the routines for reading period block +!! list based input. +!! +!< +module Mf6FileListInputModule + + use KindModule, only: I4B, DP, LGP + use ConstantsModule, only: DZERO, IZERO, LINELENGTH, LENMEMPATH, LENVARNAME, & + LENTIMESERIESNAME, LENAUXNAME, LENBOUNDNAME, & + LENCOMPONENTNAME + use SimVariablesModule, only: errmsg + use SimModule, only: store_error, count_errors, store_error_unit + use InputOutputModule, only: openfile, getunit + use InputDefinitionModule, only: InputParamDefinitionType + use MemoryManagerModule, only: mem_setptr + use CharacterStringModule, only: CharacterStringType + use ModflowInputModule, only: ModflowInputType, getModflowInput + use TimeSeriesManagerModule, only: TimeSeriesManagerType, tsmanager_cr + use StructArrayModule, only: StructArrayType, constructStructArray, & + destructStructArray + use AsciiInputLoadTypeModule, only: AsciiDynamicPkgLoadBaseType + use BoundInputContextModule, only: BoundInputContextType + use StructVectorModule, only: StructVectorType, TSStringLocType + + implicit none + private + public :: BoundListInputType + + !> @brief Abstract base class for ascii list loaders + !! + !! Abstract class with types and routines common to Ascii list + !! based loaders. + !! + !< + type, abstract, extends(AsciiDynamicPkgLoadBaseType) :: ListInputBaseType + integer(I4B) :: ts_active + integer(I4B) :: ibinary + integer(I4B) :: oc_inunit + type(TimeSeriesManagerType), pointer :: tsmanager => null() + type(StructArrayType), pointer :: structarray => null() + contains + procedure :: base_init + procedure :: base_destroy + procedure :: df + procedure :: ad + procedure :: reset + procedure :: read_control_record + end type ListInputBaseType + + !> @brief Boundary package list loader. + !! + !! Creates boundary input context for a package, + !! (e.g. CHD or MAW) and updates that context in + !! read and prepare (RP) routines. + !! + !< + type, extends(ListInputBaseType) :: BoundListInputType + integer(I4B) :: iboundname + type(BoundInputContextType) :: bound_context + contains + procedure :: ainit => bndlist_init + procedure :: rp => bndlist_rp + procedure :: destroy => bndlist_destroy + procedure :: ts_link_bnd => bndlist_ts_link_bnd + procedure :: ts_link_aux => bndlist_ts_link_aux + procedure :: ts_link => bndlist_ts_link + procedure :: ts_update => bndlist_ts_update + procedure :: create_structarray => bndlist_create_structarray + end type BoundListInputType + +contains + + subroutine bndlist_init(this, mf6_input, component_name, component_input_name, & + input_name, iperblock, parser, iout) + use BlockParserModule, only: BlockParserType + use LoadMf6FileModule, only: LoadMf6FileType + class(BoundListInputType), intent(inout) :: this + type(ModflowInputType), intent(in) :: mf6_input + character(len=*), intent(in) :: component_name + character(len=*), intent(in) :: component_input_name + character(len=*), intent(in) :: input_name + integer(I4B), intent(in) :: iperblock + type(BlockParserType), pointer, intent(inout) :: parser + integer(I4B), intent(in) :: iout + type(LoadMf6FileType) :: loader + character(len=LINELENGTH) :: blockname + integer(I4B) :: iblk + ! + ! -- initialize scalars + this%iboundname = 0 + ! + ! -- initialize base class + call this%base_init(mf6_input, component_name, component_input_name, & + input_name, iperblock, parser, loader, iout) + ! + ! -- initialize package input context + call this%bound_context%create(mf6_input, this%readasarrays) + ! + ! -- load blocks after OPTIONS and DIMENSIONS + do iblk = 1, size(this%mf6_input%block_dfns) + ! + ! -- log block header via loader or directly here? + ! + ! -- set blockname + blockname = this%mf6_input%block_dfns(iblk)%blockname + ! + ! -- base_init loads OPTIONS and DIMENSIONS blocks if defined + if (blockname == 'OPTIONS' .or. blockname == 'DIMENSIONS') cycle + if (blockname == 'PERIOD') exit + ! + ! -- load block + call loader%load_block(iblk) + ! + if (this%mf6_input%block_dfns(iblk)%aggregate) then + if (this%mf6_input%block_dfns(iblk)%timeseries) then + if (this%ts_active > 0) then + call this%ts_update(loader%structarray) + end if + end if + end if + ! + end do + ! + call loader%finalize() + ! + ! -- store in scope SA cols for list input + call this%bound_context%bound_params(this%param_names, this%nparam, & + this%input_name, create=.false.) + ! + ! -- construct and set up the struct array object + call this%create_structarray() + ! + ! -- finalize input context setup + call this%bound_context%allocate_arrays() + ! + ! -- return + return + end subroutine bndlist_init + + subroutine bndlist_rp(this, parser) + ! -- modules + use BlockParserModule, only: BlockParserType + use StructVectorModule, only: StructVectorType + use IdmLoggerModule, only: idm_log_header, idm_log_close + ! -- dummy + class(BoundListInputType), intent(inout) :: this + type(BlockParserType), pointer, intent(inout) :: parser + ! -- local + logical(LGP) :: ts_active + ! + call this%reset() + ! + call this%read_control_record(parser) + ! + ! -- log lst file header + call idm_log_header(this%mf6_input%component_name, & + this%mf6_input%subcomponent_name, this%iout) + ! + if (this%ibinary == 1) then + ! + this%bound_context%nbound = & + this%structarray%read_from_binary(this%oc_inunit, this%iout) + ! + call parser%terminateblock() + ! + close (this%oc_inunit) + this%ibinary = 0 + this%oc_inunit = 0 + ! + else + ! + ts_active = (this%ts_active /= 0) + ! + this%bound_context%nbound = & + this%structarray%read_from_parser(parser, ts_active, this%iout) + end if + ! + ! update ts links + if (this%ts_active /= 0) then + call this%ts_update(this%structarray) + end if + ! + ! -- close logging statement + call idm_log_close(this%mf6_input%component_name, & + this%mf6_input%subcomponent_name, this%iout) + ! + ! -- return + return + end subroutine bndlist_rp + + subroutine bndlist_destroy(this) + ! -- modules + class(BoundListInputType), intent(inout) :: this !< BoundListInputType + ! + call this%base_destroy() + call this%bound_context%destroy() + ! + ! -- return + return + end subroutine bndlist_destroy + + subroutine bndlist_ts_link_bnd(this, structvector, ts_strloc) + ! -- modules + use TimeSeriesLinkModule, only: TimeSeriesLinkType + use TimeSeriesManagerModule, only: read_value_or_time_series + use StructVectorModule, only: StructVectorType, TSStringLocType + ! -- dummy + class(BoundListInputType), intent(inout) :: this + type(StructVectorType), pointer, intent(in) :: structvector + type(TSStringLocType), pointer, intent(in) :: ts_strloc + ! -- local + real(DP), pointer :: bndElem + type(TimeSeriesLinkType), pointer :: tsLinkBnd + type(StructVectorType), pointer :: sv_bound + character(len=LENBOUNDNAME) :: boundname + ! + nullify (tsLinkBnd) + ! + ! -- set bound element + bndElem => structvector%dbl1d(ts_strloc%row) + ! + ! -- set link + call read_value_or_time_series(ts_strloc%token, ts_strloc%row, & + ts_strloc%structarray_col, bndElem, & + this%mf6_input%subcomponent_name, & + 'BND', this%tsmanager, & + this%bound_context%iprpak, tsLinkBnd) + ! + if (associated(tsLinkBnd)) then + ! + ! -- set variable name + tsLinkBnd%Text = structvector%idt%mf6varname + ! + ! -- set boundname if provided + if (this%bound_context%inamedbound > 0) then + sv_bound => this%structarray%get(this%iboundname) + boundname = sv_bound%charstr1d(ts_strloc%row) + tsLinkBnd%BndName = boundname + end if + end if + ! + ! -- return + return + end subroutine bndlist_ts_link_bnd + + subroutine bndlist_ts_link_aux(this, structvector, ts_strloc) + ! -- modules + use TimeSeriesLinkModule, only: TimeSeriesLinkType + use TimeSeriesManagerModule, only: read_value_or_time_series + use StructVectorModule, only: StructVectorType, TSStringLocType + ! -- dummy + class(BoundListInputType), intent(inout) :: this + type(StructVectorType), pointer, intent(in) :: structvector + type(TSStringLocType), pointer, intent(in) :: ts_strloc + ! -- local + real(DP), pointer :: bndElem + type(TimeSeriesLinkType), pointer :: tsLinkAux + type(StructVectorType), pointer :: sv_bound + character(len=LENBOUNDNAME) :: boundname + ! + nullify (tsLinkAux) + ! + ! -- set bound element + bndElem => structvector%dbl2d(ts_strloc%col, ts_strloc%row) + ! + ! -- set link + call read_value_or_time_series(ts_strloc%token, ts_strloc%row, & + ts_strloc%structarray_col, bndElem, & + this%mf6_input%subcomponent_name, & + 'AUX', this%tsmanager, & + this%bound_context%iprpak, tsLinkAux) + + if (associated(tsLinkAux)) then + ! + ! -- set variable name + tsLinkAux%Text = this%bound_context%auxname_cst(ts_strloc%col) + ! + ! -- set boundname if provided + if (this%bound_context%inamedbound > 0) then + sv_bound => this%structarray%get(this%iboundname) + boundname = sv_bound%charstr1d(ts_strloc%row) + tsLinkAux%BndName = boundname + end if + ! + end if + ! + ! -- return + return + end subroutine bndlist_ts_link_aux + + subroutine bndlist_ts_update(this, structarray) + ! -- modules + use StructVectorModule, only: TSStringLocType + use StructVectorModule, only: StructVectorType + ! -- dummy + class(BoundListInputType), intent(inout) :: this + type(StructArrayType), pointer, intent(inout) :: structarray + ! -- local + integer(I4B) :: n, m + type(TSStringLocType), pointer :: ts_strloc + type(StructVectorType), pointer :: sv + ! + do m = 1, structarray%count() + + sv => structarray%get(m) + + if (sv%idt%timeseries) then + ! + do n = 1, sv%ts_strlocs%count() + ts_strloc => sv%get_ts_strloc(n) + call this%ts_link(sv, ts_strloc) + end do + ! + call sv%clear() + end if + end do + ! + ! -- return + return + end subroutine bndlist_ts_update + + subroutine bndlist_ts_link(this, structvector, ts_strloc) + ! -- modules + use StructVectorModule, only: StructVectorType, TSStringLocType + ! -- dummy + class(BoundListInputType), intent(inout) :: this + type(StructVectorType), pointer, intent(in) :: structvector + type(TSStringLocType), pointer, intent(in) :: ts_strloc + ! -- local + ! + select case (structvector%memtype) + case (2) ! -- dbl1d + ! + call this%ts_link_bnd(structvector, ts_strloc) + ! + case (6) ! -- dbl2d + ! + call this%ts_link_aux(structvector, ts_strloc) + ! + case default + end select + ! + ! -- return + return + end subroutine bndlist_ts_link + + subroutine bndlist_create_structarray(this) + ! -- modules + use InputDefinitionModule, only: InputParamDefinitionType + use DefinitionSelectModule, only: get_param_definition_type + ! -- dummy + class(BoundListInputType), intent(inout) :: this + ! -- local + type(InputParamDefinitionType), pointer :: idt + integer(I4B) :: icol + ! + ! -- construct and set up the struct array object + this%structarray => constructStructArray(this%mf6_input, this%nparam, & + this%bound_context%maxbound, 0, & + this%mf6_input%mempath, & + this%mf6_input%component_mempath) + ! + ! -- set up struct array + do icol = 1, this%nparam + ! + idt => get_param_definition_type(this%mf6_input%param_dfns, & + this%mf6_input%component_type, & + this%mf6_input%subcomponent_type, & + 'PERIOD', & + this%param_names(icol), this%input_name) + ! + ! -- allocate variable in memory manager + call this%structarray%mem_create_vector(icol, idt) + ! + ! -- store boundname index when found + if (idt%mf6varname == 'BOUNDNAME') this%iboundname = icol + ! + end do + ! + ! -- return + return + end subroutine bndlist_create_structarray + + subroutine base_init(this, mf6_input, component_name, component_input_name, & + input_name, iperblock, parser, loader, iout) + use ConstantsModule, only: LENCOMPONENTNAME + use BlockParserModule, only: BlockParserType + use LoadMf6FileModule, only: LoadMf6FileType + use MemoryManagerModule, only: get_isize + use IdmLoggerModule, only: idm_log_header + class(ListInputBaseType), intent(inout) :: this + type(ModflowInputType), intent(in) :: mf6_input + character(len=*), intent(in) :: component_name + character(len=*), intent(in) :: component_input_name + character(len=*), intent(in) :: input_name + integer(I4B), intent(in) :: iperblock + type(BlockParserType), intent(inout) :: parser + type(LoadMf6FileType), intent(inout) :: loader + integer(I4B), intent(in) :: iout + type(CharacterStringType), dimension(:), pointer, & + contiguous :: ts_fnames + character(len=LINELENGTH) :: fname + integer(I4B) :: ts6_size, n + character(len=LINELENGTH) :: blockname + integer(I4B) :: iblk + ! + ! -- init loader + call this%DynamicPkgLoadType%init(mf6_input, component_name, & + component_input_name, input_name, & + iperblock, iout) + ! + ! -- initialize + this%ts_active = 0 + this%ibinary = 0 + this%oc_inunit = 0 + ! + ! -- initialize static loader + call loader%init(parser, mf6_input, this%input_name, iout) + ! + ! -- load OPTIONS and DIMENSIONS blocks + do iblk = 1, size(this%mf6_input%block_dfns) + ! + ! -- set blockname + blockname = this%mf6_input%block_dfns(iblk)%blockname + ! + ! -- step 1 loads OPTIONS and DIMENSIONS blocks if defined + if (blockname /= 'OPTIONS' .and. blockname /= 'DIMENSIONS') exit + ! + ! -- load block + call loader%load_block(iblk) + ! + end do + ! + ! -- create tsmanager + allocate (this%tsmanager) + call tsmanager_cr(this%tsmanager, iout) + ! + ! -- determine if TS6 files were provided in OPTIONS block + call get_isize('TS6_FILENAME', this%mf6_input%mempath, ts6_size) + ! + if (ts6_size > 0) then + ! + this%ts_active = 1 + call mem_setptr(ts_fnames, 'TS6_FILENAME', this%mf6_input%mempath) + ! + do n = 1, size(ts_fnames) + fname = ts_fnames(n) + call this%tsmanager%add_tsfile(fname, GetUnit()) + end do + ! + end if + ! + ! -- define TS manager + call this%tsmanager%tsmanager_df() + ! + ! -- return + return + end subroutine base_init + + subroutine base_destroy(this) + ! -- modules + class(ListInputBaseType), intent(inout) :: this !< ListInputType + ! + deallocate (this%tsmanager) + ! + ! -- deallocate StructArray + call destructStructArray(this%structarray) + ! + ! -- return + return + end subroutine base_destroy + + subroutine df(this) + ! -- modules + ! -- dummy + class(ListInputBaseType), intent(inout) :: this !< ListInputType + ! + ! -- define tsmanager + !call this%tsmanager%tsmanager_df() + ! + ! -- return + return + end subroutine df + + subroutine ad(this) + ! -- modules + class(ListInputBaseType), intent(inout) :: this !< ListInputType + ! + ! -- advance timeseries + call this%tsmanager%ad() + ! + ! -- return + return + end subroutine ad + + subroutine reset(this) + ! -- modules + class(ListInputBaseType), intent(inout) :: this !< ListInputType + ! + ! -- reset tsmanager + call this%tsmanager%reset(this%mf6_input%subcomponent_name) + ! + ! -- return + return + end subroutine reset + + subroutine read_control_record(this, parser) + ! -- modules + use InputOutputModule, only: urword + use OpenSpecModule, only: form, access + use ConstantsModule, only: LINELENGTH + use BlockParserModule, only: BlockParserType + ! -- dummy + class(ListInputBaseType), intent(inout) :: this + type(BlockParserType), intent(inout) :: parser + ! -- local + integer(I4B) :: lloc, istart, istop, idum, inunit, itmp, ierr + integer(I4B) :: nunopn = 99 + character(len=:), allocatable :: line + character(len=LINELENGTH) :: fname + logical :: exists + real(DP) :: r + ! -- formats + character(len=*), parameter :: fmtocne = & + &"('Specified OPEN/CLOSE file ',(A),' does not exist')" + character(len=*), parameter :: fmtobf = & + &"(1X,/1X,'OPENING BINARY FILE ON UNIT ',I0,':',/1X,A)" + ! + inunit = parser%getunit() + ! + ! -- Read to the first non-commented line + lloc = 1 + call parser%line_reader%rdcom(inunit, this%iout, line, ierr) + call urword(line, lloc, istart, istop, 1, idum, r, this%iout, inunit) + ! + if (line(istart:istop) == 'OPEN/CLOSE') then + ! + ! -- get filename + call urword(line, lloc, istart, istop, 0, idum, r, & + this%iout, inunit) + ! + fname = line(istart:istop) + ! + ! -- check to see if file OPEN/CLOSE file exists + inquire (file=fname, exist=exists) + ! + if (.not. exists) then + write (errmsg, fmtocne) line(istart:istop) + call store_error(errmsg) + call store_error('Specified OPEN/CLOSE file does not exist') + call store_error_unit(inunit) + end if + ! + ! -- Check for (BINARY) keyword + call urword(line, lloc, istart, istop, 1, idum, r, & + this%iout, inunit) + ! + if (line(istart:istop) == '(BINARY)') this%ibinary = 1 + ! + ! -- Open the file depending on ibinary flag + if (this%ibinary == 1) then + this%oc_inunit = nunopn + itmp = this%iout + ! + if (this%iout > 0) then + itmp = 0 + write (this%iout, fmtobf) this%oc_inunit, trim(adjustl(fname)) + end if + ! + call openfile(this%oc_inunit, itmp, fname, 'OPEN/CLOSE', & + fmtarg_opt=form, accarg_opt=access) + end if + end if + ! + if (this%ibinary == 0) then + call parser%line_reader%bkspc(parser%getunit()) + end if + ! + ! -- return + return + end subroutine read_control_record + +end module Mf6FileListInputModule diff --git a/src/Utilities/Idm/mf6blockfile/StressListInput.f90 b/src/Utilities/Idm/mf6blockfile/StressListInput.f90 deleted file mode 100644 index 8528397ad27..00000000000 --- a/src/Utilities/Idm/mf6blockfile/StressListInput.f90 +++ /dev/null @@ -1,439 +0,0 @@ -!> @brief This module contains the StressListInputModule -!! -!! This module contains the routines for reading period block -!! list based input. -!! -!< -module StressListInputModule - - use KindModule, only: I4B, DP, LGP - use ConstantsModule, only: DZERO, IZERO, LINELENGTH, LENMEMPATH, LENVARNAME, & - LENTIMESERIESNAME, LENAUXNAME, LENBOUNDNAME - use SimVariablesModule, only: errmsg - use SimModule, only: store_error, count_errors, store_error_unit - use InputOutputModule, only: openfile, getunit - use InputDefinitionModule, only: InputParamDefinitionType - use MemoryManagerModule, only: mem_allocate, mem_reallocate, mem_setptr - use CharacterStringModule, only: CharacterStringType - use ModflowInputModule, only: ModflowInputType, getModflowInput - use TimeSeriesManagerModule, only: TimeSeriesManagerType, tsmanager_cr - use BoundInputContextModule, only: BoundInputContextType - use StructArrayModule, only: StructArrayType, constructStructArray, & - destructStructArray - use AsciiInputLoadTypeModule, only: AsciiDynamicPkgLoadBaseType - - implicit none - private - public :: StressListInputType - - !> @brief Ascii list based dynamic loader type - !< - type, extends(AsciiDynamicPkgLoadBaseType) :: StressListInputType - integer(I4B) :: ts_active - integer(I4B) :: ibinary - integer(I4B) :: oc_inunit - integer(I4B) :: ncol - integer(I4B) :: iboundname - character(len=LENVARNAME), dimension(:), allocatable :: cols - type(TimeSeriesManagerType), pointer :: tsmanager => null() - type(StructArrayType), pointer :: structarray - type(BoundInputContextType) :: bndctx - contains - procedure :: init => inlist_init - procedure :: df => inlist_df - procedure :: ad => inlist_ad - procedure :: rp => inlist_rp - procedure :: destroy => inlist_destroy - procedure :: reset => inlist_reset - procedure :: ts_link => inlist_ts_link - procedure :: ts_update => inlist_ts_update - procedure :: create_structarray - procedure :: read_control_record - end type StressListInputType - -contains - - subroutine inlist_init(this, mf6_input, modelname, modelfname, & - source, iperblock, iout) - use MemoryManagerModule, only: get_isize - class(StressListInputType), intent(inout) :: this - type(ModflowInputType), intent(in) :: mf6_input - character(len=*), intent(in) :: modelname - character(len=*), intent(in) :: modelfname - character(len=*), intent(in) :: source - integer(I4B), intent(in) :: iperblock - integer(I4B), intent(in) :: iout - type(CharacterStringType), dimension(:), pointer, & - contiguous :: ts_fnames - character(len=LINELENGTH) :: fname - integer(I4B) :: ts6_size, n - ! - call this%DynamicPkgLoadType%init(mf6_input, modelname, modelfname, & - source, iperblock, iout) - ! - ! -- initialize - this%ts_active = 0 - this%ibinary = 0 - this%oc_inunit = 0 - ! - ! -- create tsmanager - allocate (this%tsmanager) - call tsmanager_cr(this%tsmanager, iout) - ! - ! -- determine if TS6 files were provided in OPTIONS block - call get_isize('TS6_FILENAME', this%mf6_input%mempath, ts6_size) - ! - if (ts6_size > 0) then - ! - this%ts_active = 1 - call mem_setptr(ts_fnames, 'TS6_FILENAME', this%mf6_input%mempath) - ! - do n = 1, size(ts_fnames) - fname = ts_fnames(n) - call this%tsmanager%add_tsfile(fname, GetUnit()) - end do - ! - end if - ! - ! -- initialize package input context - call this%bndctx%init(mf6_input, .false.) - ! - ! -- set SA cols in scope for list input - call this%bndctx%filtered_cols(this%cols, this%ncol) - ! - ! -- construct and set up the struct array object - call this%create_structarray() - ! - ! -- finalize input context setup - call this%bndctx%enable() - ! - ! -- return - return - end subroutine inlist_init - - subroutine inlist_df(this) - ! -- modules - class(StressListInputType), intent(inout) :: this !< StressListInputType - ! - ! -- define tsmanager - call this%tsmanager%tsmanager_df() - ! - ! -- return - return - end subroutine inlist_df - - subroutine inlist_ad(this) - ! -- modules - class(StressListInputType), intent(inout) :: this !< StressListInputType - ! - ! -- advance tsmanager - call this%tsmanager%ad() - ! - ! -- return - return - end subroutine inlist_ad - - subroutine inlist_rp(this, parser) - ! -- modules - use BlockParserModule, only: BlockParserType - use StructVectorModule, only: StructVectorType - use IdmLoggerModule, only: idm_log_header, idm_log_close - ! -- dummy - class(StressListInputType), intent(inout) :: this - type(BlockParserType), pointer, intent(inout) :: parser - ! -- locals - logical(LGP) :: ts_active - ! - call this%reset() - ! - call this%read_control_record(parser) - ! - ! -- log lst file header - call idm_log_header(this%mf6_input%component_name, & - this%mf6_input%subcomponent_name, this%iout) - ! - if (this%ibinary == 1) then - ! - this%bndctx%nbound = & - this%structarray%read_from_binary(this%oc_inunit, this%iout) - ! - call parser%terminateblock() - ! - close (this%oc_inunit) - this%ibinary = 0 - this%oc_inunit = 0 - ! - else - ! - ts_active = (this%ts_active /= 0) - ! - this%bndctx%nbound = & - this%structarray%read_from_parser(parser, & - ts_active, this%iout) - end if - ! - ! update ts links - if (this%ts_active /= 0) then - call this%ts_update() - end if - ! - ! -- close logging statement - call idm_log_close(this%mf6_input%component_name, & - this%mf6_input%subcomponent_name, this%iout) - ! - ! -- return - return - end subroutine inlist_rp - - subroutine inlist_destroy(this) - ! -- modules - class(StressListInputType), intent(inout) :: this !< StressListInputType - ! - deallocate (this%cols) - deallocate (this%tsmanager) - call destructStructArray(this%structarray) - call this%bndctx%destroy() - ! - ! -- return - return - end subroutine inlist_destroy - - subroutine inlist_reset(this) - ! -- modules - class(StressListInputType), intent(inout) :: this !< StressListInputType - ! - ! -- reset tsmanager - call this%tsmanager%reset(this%mf6_input%subcomponent_name) - ! - ! -- return - return - end subroutine inlist_reset - - subroutine inlist_ts_link(this, structvector, ts_strloc) - ! -- modules - use TimeSeriesLinkModule, only: TimeSeriesLinkType - use TimeSeriesManagerModule, only: read_value_or_time_series - use StructVectorModule, only: StructVectorType, TSStringLocType - !use ArrayHandlersModule, only: ifind - ! -- dummy - class(StressListInputType), intent(inout) :: this - type(StructVectorType), pointer, intent(in) :: structvector - type(TSStringLocType), pointer, intent(in) :: ts_strloc - ! -- locals - real(DP), pointer :: bndElem => null() - type(TimeSeriesLinkType), pointer :: tsLinkBnd => null() - type(TimeSeriesLinkType), pointer :: tsLinkAux => null() - type(StructVectorType), pointer :: sv_bound - character(len=LENBOUNDNAME) :: boundname - ! - select case (structvector%memtype) - case (2) - ! - tsLinkBnd => NULL() - ! - ! -- set bound element - bndElem => structvector%dbl1d(ts_strloc%row) - ! - ! -- set link - call read_value_or_time_series(ts_strloc%token, ts_strloc%row, & - ts_strloc%structarray_col, bndElem, & - this%mf6_input%subcomponent_name, & - 'BND', this%tsmanager, & - this%bndctx%iprpak, tsLinkBnd) - ! - if (associated(tsLinkBnd)) then - ! - ! -- set variable name - tsLinkBnd%Text = structvector%idt%mf6varname - ! - ! -- set boundname if provided - if (this%bndctx%inamedbound > 0) then - sv_bound => this%structarray%get(this%iboundname) - boundname = sv_bound%charstr1d(ts_strloc%row) - tsLinkBnd%BndName = boundname - end if - - ! Flux is handled from model context - - end if - ! - case (6) - ! - tsLinkAux => NULL() - ! - ! -- set bound element - bndElem => structvector%dbl2d(ts_strloc%col, ts_strloc%row) - ! - ! -- set link - call read_value_or_time_series(ts_strloc%token, ts_strloc%row, & - ts_strloc%structarray_col, bndElem, & - this%mf6_input%subcomponent_name, & - 'AUX', this%tsmanager, & - this%bndctx%iprpak, tsLinkAux) - - if (associated(tsLinkAux)) then - ! - ! -- set variable name - tsLinkAux%Text = this%bndctx%auxname_cst(ts_strloc%col) - ! - ! -- set boundname if provided - if (this%bndctx%inamedbound > 0) then - sv_bound => this%structarray%get(this%iboundname) - boundname = sv_bound%charstr1d(ts_strloc%row) - tsLinkAux%BndName = boundname - end if - ! - end if - ! - case default - end select - ! - ! -- return - return - end subroutine inlist_ts_link - - subroutine inlist_ts_update(this) - ! -- modules - use StructVectorModule, only: TSStringLocType - use StructVectorModule, only: StructVectorType - ! -- dummy - class(StressListInputType), intent(inout) :: this - ! -- locals - integer(I4B) :: n, m - type(TSStringLocType), pointer :: ts_strloc - type(StructVectorType), pointer :: sv - ! - ! - do m = 1, this%structarray%count() - - sv => this%structarray%get(m) - - if (sv%idt%timeseries) then - ! - do n = 1, sv%ts_strlocs%count() - ts_strloc => sv%get_ts_strloc(n) - call this%ts_link(sv, ts_strloc) - end do - ! - call sv%clear() - end if - end do - ! - ! -- return - return - end subroutine inlist_ts_update - - subroutine create_structarray(this) - ! -- modules - use InputDefinitionModule, only: InputParamDefinitionType - use DefinitionSelectModule, only: get_param_definition_type - ! -- dummy - class(StressListInputType), intent(inout) :: this - ! -- locals - type(InputParamDefinitionType), pointer :: idt - integer(I4B) :: icol - ! - ! -- construct and set up the struct array object - this%structarray => constructStructArray(this%mf6_input, this%ncol, & - this%bndctx%maxbound, 0, & - this%mf6_input%mempath, & - this%mf6_input%component_mempath) - ! - ! -- set up struct array - do icol = 1, this%ncol - ! - idt => get_param_definition_type(this%mf6_input%param_dfns, & - this%mf6_input%component_type, & - this%mf6_input%subcomponent_type, & - 'PERIOD', & - this%cols(icol), this%sourcename) - ! - ! -- allocate variable in memory manager - call this%structarray%mem_create_vector(icol, idt) - ! - ! -- store boundname index when found - if (idt%mf6varname == 'BOUNDNAME') this%iboundname = icol - ! - end do - ! - ! -- return - return - end subroutine create_structarray - - subroutine read_control_record(this, parser) - ! -- modules - use InputOutputModule, only: urword - use OpenSpecModule, only: form, access - use ConstantsModule, only: LINELENGTH - use BlockParserModule, only: BlockParserType - ! -- dummy - class(StressListInputType), intent(inout) :: this - type(BlockParserType), intent(inout) :: parser - ! -- local - integer(I4B) :: lloc, istart, istop, idum, inunit, itmp, ierr - integer(I4B) :: nunopn = 99 - character(len=:), allocatable :: line - character(len=LINELENGTH) :: fname - logical :: exists - real(DP) :: r - ! -- formats - character(len=*), parameter :: fmtocne = & - &"('Specified OPEN/CLOSE file ',(A),' does not exist')" - character(len=*), parameter :: fmtobf = & - &"(1X,/1X,'OPENING BINARY FILE ON UNIT ',I0,':',/1X,A)" - ! - inunit = parser%getunit() - ! - ! -- Read to the first non-commented line - lloc = 1 - call parser%line_reader%rdcom(inunit, this%iout, line, ierr) - call urword(line, lloc, istart, istop, 1, idum, r, this%iout, inunit) - ! - if (line(istart:istop) == 'OPEN/CLOSE') then - ! - ! -- get filename - call urword(line, lloc, istart, istop, 0, idum, r, & - this%iout, inunit) - ! - fname = line(istart:istop) - ! - ! -- check to see if file OPEN/CLOSE file exists - inquire (file=fname, exist=exists) - ! - if (.not. exists) then - write (errmsg, fmtocne) line(istart:istop) - call store_error(errmsg) - call store_error('Specified OPEN/CLOSE file does not exist') - call store_error_unit(inunit) - end if - ! - ! -- Check for (BINARY) keyword - call urword(line, lloc, istart, istop, 1, idum, r, & - this%iout, inunit) - ! - if (line(istart:istop) == '(BINARY)') this%ibinary = 1 - ! - ! -- Open the file depending on ibinary flag - if (this%ibinary == 1) then - this%oc_inunit = nunopn - itmp = this%iout - ! - if (this%iout > 0) then - itmp = 0 - write (this%iout, fmtobf) this%oc_inunit, trim(adjustl(fname)) - end if - ! - call openfile(this%oc_inunit, itmp, fname, 'OPEN/CLOSE', & - fmtarg_opt=form, accarg_opt=access) - end if - end if - ! - if (this%ibinary == 0) then - call parser%line_reader%bkspc(parser%getunit()) - end if - ! - ! -- return - return - end subroutine read_control_record - -end module StressListInputModule diff --git a/src/Utilities/Idm/mf6blockfile/StructArray.f90 b/src/Utilities/Idm/mf6blockfile/StructArray.f90 index 49befb0b53a..42ed137c1c4 100644 --- a/src/Utilities/Idm/mf6blockfile/StructArray.f90 +++ b/src/Utilities/Idm/mf6blockfile/StructArray.f90 @@ -8,7 +8,8 @@ module StructArrayModule use KindModule, only: I4B, DP, LGP - use ConstantsModule, only: DZERO, IZERO, LINELENGTH, LENMEMPATH, LENVARNAME + use ConstantsModule, only: DZERO, IZERO, DNODATA, & + LINELENGTH, LENMEMPATH, LENVARNAME use SimVariablesModule, only: errmsg use SimModule, only: store_error use StructVectorModule, only: StructVectorType @@ -19,16 +20,17 @@ module StructArrayModule use IdmLoggerModule, only: idm_log_var use BlockParserModule, only: BlockParserType use ModflowInputModule, only: ModflowInputType + use ArrayHandlersModule, only: expandarray implicit none private public :: StructArrayType public :: constructStructArray, destructStructArray - !> @brief derived type for structured array + !> @brief type for structured array !! - !! This derived type is used to read and store a - !! list that consists of multiple one-dimensional + !! This type is used to read and store a list + !! that consists of multiple one-dimensional !! vectors. !! !< @@ -53,6 +55,7 @@ module StructArrayModule procedure :: allocate_charstr_type procedure :: allocate_int1d_type procedure :: allocate_dbl1d_type + procedure :: write_struct_vector procedure :: read_from_parser procedure :: read_from_binary procedure :: memload_vectors @@ -168,6 +171,10 @@ subroutine mem_create_vector(this, icol, idt) call this%allocate_dbl1d_type(sv) numcol = sv%intshape ! + case default + errmsg = 'IDM unimplemented. StructArray::mem_create_vector & + &type='//trim(idt%datatype) + call store_error(errmsg, .true.) end select ! ! -- set the object in the Struct Array @@ -209,18 +216,20 @@ subroutine allocate_int_type(this, sv) class(StructArrayType) :: this !< StructArrayType type(StructVectorType), intent(inout) :: sv integer(I4B), dimension(:), pointer, contiguous :: int1d - integer(I4B) :: j + integer(I4B) :: j, nrow ! if (this%deferred_shape) then ! -- shape not known, allocate locally + nrow = this%deferred_size_init allocate (int1d(this%deferred_size_init)) else ! -- shape known, allocate in managed memory + nrow = this%nrow call mem_allocate(int1d, this%nrow, sv%idt%mf6varname, this%mempath) end if ! ! -- initialize vector values - do j = 1, this%nrow + do j = 1, nrow int1d(j) = IZERO end do ! @@ -237,17 +246,20 @@ subroutine allocate_dbl_type(this, sv) class(StructArrayType) :: this !< StructArrayType type(StructVectorType), intent(inout) :: sv real(DP), dimension(:), pointer, contiguous :: dbl1d - integer(I4B) :: j + integer(I4B) :: j, nrow ! if (this%deferred_shape) then ! -- shape not known, allocate locally + nrow = this%deferred_size_init allocate (dbl1d(this%deferred_size_init)) else ! -- shape known, allocate in managed memory + nrow = this%nrow call mem_allocate(dbl1d, this%nrow, sv%idt%mf6varname, this%mempath) end if ! - do j = 1, this%nrow + ! -- initialize + do j = 1, nrow dbl1d(j) = DZERO end do ! @@ -299,6 +311,7 @@ subroutine allocate_int1d_type(this, sv) character(len=LENMODELNAME) :: mname type(CharacterStringType), dimension(:), contiguous, & pointer :: charstr1d + integer(I4B) :: nrow, n, m ! if (sv%idt%shape == 'NCELLDIM') then ! @@ -330,15 +343,22 @@ subroutine allocate_int1d_type(this, sv) ! if (this%deferred_shape) then ! -- shape not known, allocate locally + nrow = this%deferred_size_init allocate (int2d(ncelldim, this%deferred_size_init)) + ! else ! -- shape known, allocate in managed memory + nrow = this%nrow call mem_allocate(int2d, ncelldim, this%nrow, & sv%idt%mf6varname, this%mempath) end if ! ! -- initialize - int2d = IZERO + do m = 1, nrow + do n = 1, ncelldim + int2d(n, m) = IZERO + end do + end do ! sv%memtype = 5 sv%int2d => int2d @@ -372,7 +392,7 @@ subroutine allocate_dbl1d_type(this, sv) type(StructVectorType), intent(inout) :: sv real(DP), dimension(:, :), pointer, contiguous :: dbl2d integer(I4B), pointer :: naux, nseg, nseg_1 - integer(I4B) :: nseg1_isize + integer(I4B) :: nseg1_isize, n, m ! if (sv%idt%shape == 'NAUX') then call mem_setptr(naux, sv%idt%shape, this%mempath) @@ -380,7 +400,11 @@ subroutine allocate_dbl1d_type(this, sv) call mem_allocate(dbl2d, naux, this%nrow, sv%idt%mf6varname, this%mempath) ! ! -- initialize - dbl2d = DZERO + do m = 1, this%nrow + do n = 1, naux + dbl2d(n, m) = DZERO + end do + end do ! sv%memtype = 6 sv%dbl2d => dbl2d @@ -401,15 +425,19 @@ subroutine allocate_dbl1d_type(this, sv) call mem_allocate(dbl2d, nseg_1, this%nrow, sv%idt%mf6varname, this%mempath) ! ! -- initialize - dbl2d = DZERO + do m = 1, this%nrow + do n = 1, nseg_1 + dbl2d(n, m) = DZERO + end do + end do ! sv%memtype = 6 sv%dbl2d => dbl2d sv%intshape => nseg_1 ! else - errmsg = 'Programming error. IDM SA 2d real input param unsupported & - &shape "'//trim(sv%idt%shape)//'".' + errmsg = 'IDM unimplemented. StructArray::allocate_dbl1d_type & + & unsupported shape "'//trim(sv%idt%shape)//'".' call store_error(errmsg, terminate=.TRUE.) end if ! @@ -439,7 +467,7 @@ subroutine load_deferred_vector(this, icol) ! case (1) ! -- memtype integer ! - if (isize > 0) then + if (isize > -1) then ! -- variable exists, reallocate and append call mem_setptr(p_int1d, varname, this%mempath) ! -- Currently deferred vectors are appended to managed @@ -470,20 +498,30 @@ subroutine load_deferred_vector(this, icol) ! case (2) ! -- memtype real ! - call mem_allocate(p_dbl1d, this%nrow, varname, this%mempath) - ! - do i = 1, this%nrow - p_dbl1d(i) = this%struct_vectors(icol)%dbl1d(i) - end do + if (isize > -1) then + call mem_setptr(p_dbl1d, varname, this%mempath) + call mem_reallocate(p_dbl1d, this%nrow + isize, varname, & + this%mempath) + ! + do i = 1, this%nrow + p_dbl1d(isize + i) = this%struct_vectors(icol)%dbl1d(i) + end do + else + call mem_allocate(p_dbl1d, this%nrow, varname, this%mempath) + ! + do i = 1, this%nrow + p_dbl1d(i) = this%struct_vectors(icol)%dbl1d(i) + end do + end if ! deallocate (this%struct_vectors(icol)%dbl1d) ! - ! -- this%struct_vectors(icol)%dbl1d => p_dbl1d this%struct_vectors(icol)%size = this%nrow ! case (3) ! -- memtype charstring - if (isize > 0) then + ! + if (isize > -1) then call mem_setptr(p_charstr1d, varname, this%mempath) call mem_reallocate(p_charstr1d, LINELENGTH, this%nrow + isize, varname, & this%mempath) @@ -503,17 +541,32 @@ subroutine load_deferred_vector(this, icol) ! deallocate (this%struct_vectors(icol)%charstr1d) ! + this%struct_vectors(icol)%charstr1d => p_charstr1d + this%struct_vectors(icol)%size = this%nrow + ! case (4) ! -- memtype intvector ! no-op case (5) - call mem_allocate(p_int2d, this%struct_vectors(icol)%intshape, this%nrow, & - varname, this%mempath) - ! - do i = 1, this%nrow - do j = 1, this%struct_vectors(icol)%intshape - p_int2d(j, i) = this%struct_vectors(icol)%int2d(j, i) + if (isize > -1) then + call mem_setptr(p_int2d, varname, this%mempath) + call mem_reallocate(p_int2d, this%struct_vectors(icol)%intshape, & + this%nrow, varname, this%mempath) + + do i = 1, this%nrow + do j = 1, this%struct_vectors(icol)%intshape + p_int2d(j, isize + i) = this%struct_vectors(icol)%int2d(j, i) + end do end do - end do + else + call mem_allocate(p_int2d, this%struct_vectors(icol)%intshape, & + this%nrow, varname, this%mempath) + ! + do i = 1, this%nrow + do j = 1, this%struct_vectors(icol)%intshape + p_int2d(j, i) = this%struct_vectors(icol)%int2d(j, i) + end do + end do + end if ! deallocate (this%struct_vectors(icol)%int2d) ! @@ -522,7 +575,8 @@ subroutine load_deferred_vector(this, icol) ! ! TODO: case (6) case default - errmsg = 'Programming error. IDM load_deferred_vector unsupported memtype.' + errmsg = 'IDM unimplemented. StructArray::load_deferred_vector & + &unsupported memtype.' call store_error(errmsg, terminate=.TRUE.) end select ! @@ -733,9 +787,10 @@ subroutine check_reallocate(this) this%struct_vectors(j)%int2d => p_int2d this%struct_vectors(j)%size = newsize end if - !TODO: case (6) + ! TODO: case (6) case default - errmsg = 'Programming error. IDM check_reallocate unsupported memtype.' + errmsg = 'IDM unimplemented. StructArray::check_reallocate & + &unsupported memtype.' call store_error(errmsg, terminate=.TRUE.) end select end do @@ -744,6 +799,104 @@ subroutine check_reallocate(this) return end subroutine check_reallocate + subroutine write_struct_vector(this, parser, sv_col, irow, timeseries, & + iout, auxcol) + class(StructArrayType) :: this !< StructArrayType + type(BlockParserType), intent(inout) :: parser !< block parser to read from + integer(I4B), intent(in) :: sv_col + integer(I4B), intent(in) :: irow + logical(LGP), intent(in) :: timeseries + integer(I4B), intent(in) :: iout !< unit number for output + integer(I4B), optional, intent(in) :: auxcol + integer(I4B) :: n, intval, numval, icol + character(len=LINELENGTH) :: str + character(len=:), allocatable :: line + logical(LGP) :: preserve_case + ! + select case (this%struct_vectors(sv_col)%memtype) + ! + case (1) ! -- memtype integer + ! + ! -- if reloadable block and first col, store blocknum + if (sv_col == 1 .and. this%blocknum > 0) then + ! -- store blocknum + this%struct_vectors(sv_col)%int1d(irow) = this%blocknum + else + ! -- read and store int + this%struct_vectors(sv_col)%int1d(irow) = parser%GetInteger() + end if + ! + case (2) ! -- memtype real + ! + if (this%struct_vectors(sv_col)%idt%timeseries .and. timeseries) then + call parser%GetString(str) + if (present(auxcol)) then + icol = auxcol + else + icol = 1 + end if + this%struct_vectors(sv_col)%dbl1d(irow) = & + this%struct_vectors(sv_col)%read_token(str, this%startidx(sv_col), & + icol, irow) + else + this%struct_vectors(sv_col)%dbl1d(irow) = parser%GetDouble() + end if + ! + case (3) ! -- memtype charstring + ! + if (this%struct_vectors(sv_col)%idt%shape /= '') then + ! -- if last column with any shape, store rest of line + if (sv_col == this%ncol) then + call parser%GetRemainingLine(line) + this%struct_vectors(sv_col)%charstr1d(irow) = line + deallocate (line) + end if + else + ! + ! -- read string token + preserve_case = (.not. this%struct_vectors(sv_col)%idt%preserve_case) + call parser%GetString(str, preserve_case) + this%struct_vectors(sv_col)%charstr1d(irow) = str + end if + ! + case (4) ! -- memtype intvector + ! + ! -- get shape for this row + numval = this%struct_vectors(sv_col)%intvector_shape(irow) + ! + ! -- read and store row values + do n = 1, numval + intval = parser%GetInteger() + call this%struct_vectors(sv_col)%intvector%push_back(intval) + end do + ! + case (5) ! -- memtype int2d + ! + ! -- read and store row values + do n = 1, this%struct_vectors(sv_col)%intshape + this%struct_vectors(sv_col)%int2d(n, irow) = parser%GetInteger() + end do + ! + case (6) ! -- memtype dbl2d + ! + ! -- read and store row values + do n = 1, this%struct_vectors(sv_col)%intshape + if (this%struct_vectors(sv_col)%idt%timeseries .and. timeseries) then + call parser%GetString(str) + icol = this%startidx(sv_col) + n - 1 + this%struct_vectors(sv_col)%dbl2d(n, irow) = & + this%struct_vectors(sv_col)%read_token(str, icol, n, irow) + else + this%struct_vectors(sv_col)%dbl2d(n, irow) = parser%GetDouble() + end if + end do + ! + end select + ! + ! -- return + return + end subroutine write_struct_vector + !> @brief read from the block parser to fill the StructArrayType !< function read_from_parser(this, parser, timeseries, iout) result(irow) @@ -751,12 +904,8 @@ function read_from_parser(this, parser, timeseries, iout) result(irow) type(BlockParserType) :: parser !< block parser to read from logical(LGP), intent(in) :: timeseries integer(I4B), intent(in) :: iout !< unit number for output - integer(I4B) :: irow - logical(LGP) :: endOfBlock, preserve_case - integer(I4B) :: j, k - integer(I4B) :: intval, numval - character(len=LINELENGTH) :: str - character(len=:), allocatable :: line + integer(I4B) :: irow, j + logical(LGP) :: endOfBlock ! ! -- initialize index irow irow = 0 @@ -786,80 +935,8 @@ function read_from_parser(this, parser, timeseries, iout) result(irow) ! -- handle line reads by column memtype do j = 1, this%ncol ! - select case (this%struct_vectors(j)%memtype) - ! - case (1) ! -- memtype integer - ! - ! -- if reloadable block and first col, store blocknum - if (j == 1 .and. this%blocknum > 0) then - ! -- store blocknum - this%struct_vectors(j)%int1d(irow) = this%blocknum - else - ! -- read and store int - this%struct_vectors(j)%int1d(irow) = parser%GetInteger() - end if - ! - case (2) ! -- memtype real - ! - if (this%struct_vectors(j)%idt%timeseries .and. timeseries) then - call parser%GetString(str) - this%struct_vectors(j)%dbl1d(irow) = & - this%struct_vectors(j)%read_token(str, this%startidx(j), 1, irow) - else - this%struct_vectors(j)%dbl1d(irow) = parser%GetDouble() - end if - ! - case (3) ! -- memtype charstring - ! - !if (this%struct_vectors(j)%idt%shape == ':') then - if (this%struct_vectors(j)%idt%shape /= '') then - ! -- if last column with any shape, store rest of line - if (j == this%ncol) then - call parser%GetRemainingLine(line) - this%struct_vectors(j)%charstr1d(irow) = line - deallocate (line) - end if - else - ! - ! -- read string token - preserve_case = (.not. this%struct_vectors(j)%idt%preserve_case) - call parser%GetString(str, preserve_case) - this%struct_vectors(j)%charstr1d(irow) = str - end if - ! - case (4) ! -- memtype intvector - ! - ! -- get shape for this row - numval = this%struct_vectors(j)%intvector_shape(irow) - ! - ! -- read and store row values - do k = 1, numval - intval = parser%GetInteger() - call this%struct_vectors(j)%intvector%push_back(intval) - end do - ! - case (5) ! -- memtype int2d - ! - ! -- read and store row values - do k = 1, this%struct_vectors(j)%intshape - this%struct_vectors(j)%int2d(k, irow) = parser%GetInteger() - end do - ! - case (6) ! -- memtype dbl2d - ! - ! -- read and store row values - do k = 1, this%struct_vectors(j)%intshape - if (this%struct_vectors(j)%idt%timeseries .and. timeseries) then - call parser%GetString(str) - this%struct_vectors(j)%dbl2d(k, irow) = & - this%struct_vectors(j)%read_token(str, this%startidx(j) + k - 1, & - k, irow) - else - this%struct_vectors(j)%dbl2d(k, irow) = parser%GetDouble() - end if - end do - ! - end select + call this%write_struct_vector(parser, j, irow, timeseries, iout) + ! end do end do ! @@ -892,8 +969,8 @@ function read_from_binary(this, inunit, iout) result(irow) ! -- set error and exit if deferred shape if (this%deferred_shape) then ! - errmsg = 'Programming error. IDM SA deferred shape currently not & - &supported for binary inputs.' + errmsg = 'IDM unimplemented. StructArray::read_from_binary deferred shape & + ¬ supported for binary inputs.' call store_error(errmsg, terminate=.TRUE.) ! end if @@ -918,8 +995,8 @@ function read_from_binary(this, inunit, iout) result(irow) read (inunit, iostat=ierr) this%struct_vectors(j)%dbl1d(irow) case (3) ! -- memtype charstring ! - errmsg = 'Programming error. IDM SA input string types currently not & - &supported for binary inputs.' + errmsg = 'IDM unimplemented. StructArray::read_from_binary string & + &types not supported for binary inputs.' call store_error(errmsg, terminate=.TRUE.) ! case (4) ! -- memtype intvector diff --git a/src/meson.build b/src/meson.build index c6ceb3b2ca4..d2bb50bc27d 100644 --- a/src/meson.build +++ b/src/meson.build @@ -266,6 +266,7 @@ modflow_sources = files( 'Utilities' / 'ArrayRead' / 'LayeredArrayReader.f90', 'Utilities' / 'Idm' / 'BoundInputContext.f90', 'Utilities' / 'Idm' / 'DefinitionSelect.f90', + 'Utilities' / 'Idm' / 'DynamicPackageParams.f90', 'Utilities' / 'Idm' / 'IdmLoad.f90', 'Utilities' / 'Idm' / 'IdmLogger.f90', 'Utilities' / 'Idm' / 'InputDefinition.f90', @@ -277,8 +278,8 @@ modflow_sources = files( 'Utilities' / 'Idm' / 'mf6blockfile' / 'AsciiInputLoadType.f90', 'Utilities' / 'Idm' / 'mf6blockfile' / 'IdmMf6File.f90', 'Utilities' / 'Idm' / 'mf6blockfile' / 'LoadMf6File.f90', - 'Utilities' / 'Idm' / 'mf6blockfile' / 'StressGridInput.f90', - 'Utilities' / 'Idm' / 'mf6blockfile' / 'StressListInput.f90', + 'Utilities' / 'Idm' / 'mf6blockfile' / 'Mf6FileGridInput.f90', + 'Utilities' / 'Idm' / 'mf6blockfile' / 'Mf6FileListInput.f90', 'Utilities' / 'Idm' / 'mf6blockfile' / 'StructArray.f90', 'Utilities' / 'Idm' / 'mf6blockfile' / 'StructVector.f90', 'Utilities' / 'Matrix' / 'MatrixBase.f90', diff --git a/utils/mf5to6/make/makedefaults b/utils/mf5to6/make/makedefaults index 482562ab0b7..90b934de204 100644 --- a/utils/mf5to6/make/makedefaults +++ b/utils/mf5to6/make/makedefaults @@ -1,4 +1,4 @@ -# makedefaults created by pymake (version 1.2.10.dev0) for the 'mf5to6' executable. +# makedefaults created by pymake (version 1.2.9) for the 'mf5to6' executable. # determine OS ifeq ($(OS), Windows_NT) diff --git a/utils/mf5to6/make/makefile b/utils/mf5to6/make/makefile index f99194fe0b9..dc152caa230 100644 --- a/utils/mf5to6/make/makefile +++ b/utils/mf5to6/make/makefile @@ -1,14 +1,14 @@ -# makefile created by pymake (version 1.2.10.dev0) for the 'mf5to6' executable. +# makefile created by pymake (version 1.2.9) for the 'mf5to6' executable. include ./makedefaults # Define the source file directories SOURCEDIR1=../src -SOURCEDIR2=../src/NWT -SOURCEDIR3=../src/LGR -SOURCEDIR4=../src/Preproc -SOURCEDIR5=../src/MF2005 +SOURCEDIR2=../src/MF2005 +SOURCEDIR3=../src/NWT +SOURCEDIR4=../src/LGR +SOURCEDIR5=../src/Preproc SOURCEDIR6=../../../src/Utilities/Memory SOURCEDIR7=../../../src/Utilities/TimeSeries SOURCEDIR8=../../../src/Utilities diff --git a/utils/zonebudget/make/makedefaults b/utils/zonebudget/make/makedefaults index dbbf549c9db..bdcd84dddbf 100644 --- a/utils/zonebudget/make/makedefaults +++ b/utils/zonebudget/make/makedefaults @@ -1,4 +1,4 @@ -# makedefaults created by pymake (version 1.2.10.dev0) for the 'zbud6' executable. +# makedefaults created by pymake (version 1.2.9) for the 'zbud6' executable. # determine OS ifeq ($(OS), Windows_NT) diff --git a/utils/zonebudget/make/makefile b/utils/zonebudget/make/makefile index 69fa6b73c71..9e53c7daa9d 100644 --- a/utils/zonebudget/make/makefile +++ b/utils/zonebudget/make/makefile @@ -1,4 +1,4 @@ -# makefile created by pymake (version 1.2.10.dev0) for the 'zbud6' executable. +# makefile created by pymake (version 1.2.9) for the 'zbud6' executable. include ./makedefaults From b0d37f7017756575e0103905a3bcccd761be5c25 Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Mon, 11 Mar 2024 11:18:18 -0500 Subject: [PATCH 062/199] test(par/gwe): second autotest for parallel gwe (#1665) * test(par/gwe): second autotest for parallel gwe * clean-up of a clean-up * fix my misunderstanding * case name was too long * adding missing scenarios to cases variable * refactor test_gwe_split_analyt.py fitting better with parallel testing * Remove commented-out plotting commands --- autotest/test_gwe_split_analyt.py | 364 +++++++++++--------------- autotest/test_par_gwe_split_analyt.py | 44 ++++ 2 files changed, 203 insertions(+), 205 deletions(-) create mode 100644 autotest/test_par_gwe_split_analyt.py diff --git a/autotest/test_gwe_split_analyt.py b/autotest/test_gwe_split_analyt.py index 8b780c90399..a99a89711db 100644 --- a/autotest/test_gwe_split_analyt.py +++ b/autotest/test_gwe_split_analyt.py @@ -4,36 +4,37 @@ Energy is added to the right hand side boundary using the energy source loading (ESL) package. Basic model set up is below, with a slab of unit thickness - (1.0 m) that is 100 m "deep" with energy being loaded on right side. - Temperature will begin to rise on the right and propagate to the left. There are - no sinks in this first example. The titles that follow, for example + (1.0 m) that is 1 m "deep" ("into the page") with energy being loaded on right + side. Temperature will begin to rise on the right and propagate to the left. + There are no sinks in this first example. There are two additional conceptual + models named "case ii" and "case iii". The titles that follow, for example "Section 43, case x" refer to specific analytical solutions found in Carslaw & Jaeger (1947) Section 43, case i: ------------------- - | <--------- 5 m ----------> | | <--------- 5 m ----------> | - - +--------------------------------+ +--------------------------------+ - | Initial temperature = T_0 | <-exchange-> | Initial temperature = T_0 | <-- *ESL - +--------------------------------+ +--------------------------------+ - ^ * ESL: Energy Source Loading Boundary - | - No heat-flow boundary + | <--------- 5 m ----------> | | <--------- 5 m ----------> | + + +--------------------------------+ +--------------------------------+ + | Initial temperature = T_0 | <-exchange-> | Initial temperature = T_0 | <-- *ESL + +--------------------------------+ +--------------------------------+ + ^ * ESL: Energy Source Loading Boundary + | + No heat-flow boundary Section 43, case ii: -------------------- - | <--------- 5 m ----------> | | <--------- 5 m ----------> | - - +--------------------------------+ +--------------------------------+ - | Initial temperature = T_0 | <-exchange-> | Initial temperature = T_0 | <-- *ESL - +--------------------------------+ +--------------------------------+ - ^ * ESL: Energy Source Loading Boundary - | - Specified temperature boundary, T_0 + | <--------- 5 m ----------> | | <--------- 5 m ----------> | + + +--------------------------------+ +--------------------------------+ + | Initial temperature = T_0 | <-exchange-> | Initial temperature = T_0 | <-- *ESL + +--------------------------------+ +--------------------------------+ + ^ * ESL: Energy Source Loading Boundary + | + Specified temperature boundary, T_0 Section 43, case iii: @@ -55,7 +56,6 @@ import pytest import flopy import numpy as np -import matplotlib.pyplot as plt from framework import TestFramework @@ -155,30 +155,9 @@ def calc_ener_input(primer_val): # Define function to solve analytical solution -def assemble_half_model( - idx, test, ener_input, side="right", sim=None, imsgwf=None, imsgwe=None -): - - name = cases[idx] + "-" + side[0] - - # Build MODFLOW 6 files - ws = test.workspace - if sim is None: - sim = flopy.mf6.MFSimulation( - sim_name=name, version="mf6", exe_name="mf6", sim_ws=ws - ) - - # Create tdis package - tdis_rc = [] - for i in range(len(perlen[idx])): - tdis_rc.append((perlen[idx][i], nstp[i], tsmult[idx][i])) - - flopy.mf6.ModflowTdis( - sim, time_units="DAYS", nper=len(perlen[idx]), perioddata=tdis_rc - ) - +def assemble_half_model(sim, gwfname, gwfpath, side="right"): + # Create GWF model - gwfname = "gwf-" + name gwf = flopy.mf6.MFModel( sim, model_type="gwf6", @@ -187,25 +166,6 @@ def assemble_half_model( ) gwf.name_file.save_flows = True - # Create iterative model solution and register the gwf model with it - if imsgwf is None: - imsgwf = 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, - filename=f"{gwfname}.ims", - ) - sim.register_ims_package(imsgwf, [gwf.name]) - xorigin = 0.0 if side == "right": xorigin = ncol * delr @@ -222,14 +182,10 @@ def assemble_half_model( top=top, botm=botm, idomain=np.ones((nlay, nrow, ncol), dtype=int), - pname="DIS-GWF-" + side[0], - filename=f"{gwfname}.dis", ) # Initial conditions - flopy.mf6.ModflowGwfic( - gwf, strt=strt, pname="IC-" + side[0], filename=f"{gwfname}.ic" - ) + flopy.mf6.ModflowGwfic(gwf, strt=strt) # Node property flow flopy.mf6.ModflowGwfnpf( @@ -238,8 +194,6 @@ def assemble_half_model( icelltype=laytyp, k=hk, k33=hk, - pname="NPF-" + side[0], - filename=f"{gwfname}.npf", ) # Instantiating MODFLOW 6 storage package @@ -250,38 +204,24 @@ def assemble_half_model( iconvert=1, steady_state=False, transient=True, - pname="STO-" + side[0], - filename="{}.sto".format(gwfname), ) - - # Constant head files - chd = None - # chd = flopy.mf6.ModflowGwfchd( - # gwf, - # maxbound=len(chd_perdat[0]), - # stress_period_data=chd_perdat, - # save_flows=False, - # pname="CHD-" + side[0], - # filename=f"{gwfname}.chd" - # ) - + # Output control flopy.mf6.ModflowGwfoc( gwf, - pname="OC-" + side[0], budget_filerecord=f"{gwfname}.cbc", head_filerecord=f"{gwfname}.hds", headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], saverecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], printrecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], - filename=f"{gwfname}.oc", ) + + gwf.set_model_relative_path(gwfpath) + return gwf - # ----------------- - # Create GWE model - # ----------------- - gwename = "gwe-" + name +def get_gwe_model(idx, sim, gwename, gwepath, ener_input, side="right"): + gwe = flopy.mf6.MFModel( sim, model_type="gwe6", @@ -290,24 +230,9 @@ def assemble_half_model( ) gwe.name_file.save_flows = True - # Create iterative model solution and register the gwt model with it - if imsgwe is None: - imsgwe = 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="BICGSTAB", - scaling_method="NONE", - reordering_method="NONE", - relaxation_factor=relax, - filename=f"{gwename}.ims", - ) - sim.register_ims_package(imsgwe, [gwe.name]) + xorigin = 0.0 + if side == "right": + xorigin = ncol * delr flopy.mf6.ModflowGwedis( gwe, @@ -325,14 +250,10 @@ def assemble_half_model( ) # Initial conditions - flopy.mf6.ModflowGweic( - gwe, strt=T_0, pname="IC-" + side[0], filename=f"{gwename}.ic" - ) + flopy.mf6.ModflowGweic(gwe, strt=T_0) # Advection - flopy.mf6.ModflowGweadv( - gwe, scheme=scheme, pname="ADV-" + side[0], filename=f"{gwename}.adv" - ) + flopy.mf6.ModflowGweadv(gwe, scheme=scheme) # Heat conduction flopy.mf6.ModflowGwecnd( @@ -343,8 +264,6 @@ def assemble_half_model( atv=atv, ktw=Ktw, kts=Kts, - pname="CND-" + side[0], - filename="{}.cnd".format(gwename), ) flopy.mf6.ModflowGweest( @@ -353,8 +272,6 @@ def assemble_half_model( cps=Cps, rhos=rhos, packagedata=[Cpw, rhow, lhv], - pname="EST-" + side[0], - filename="{}.est".format(gwename), ) # Constant temperature goes on the left side of the left model @@ -370,7 +287,6 @@ def assemble_half_model( stress_period_data=ctp, save_flows=True, pname="CTP-" + side[0], - filename=f"{gwename}.ctp", ) if side == "right": @@ -383,7 +299,6 @@ def assemble_half_model( stress_period_data=ctp, save_flows=True, pname="CTP-" + side[0], - filename=f"{gwename}.ctp", ) # Instantiate energy source loading (ESL) package @@ -405,22 +320,11 @@ def assemble_half_model( stress_period_data=esrc, save_flows=False, pname="ESL-" + side[0], - filename=f"{gwename}.esl", - ) - - # Sources - if chd is not None: - flopy.mf6.ModflowGwessm( - gwe, - sources=[[]], - pname="SSM-" + side[0], - filename=f"{gwename}.ssm", ) - + # Output control flopy.mf6.ModflowGweoc( gwe, - pname="OC-" + side[0], budget_filerecord=f"{gwename}.cbc", temperature_filerecord=f"{gwename}.ucn", temperatureprintrecord=[ @@ -428,49 +332,46 @@ def assemble_half_model( ], saverecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], printrecord=[("TEMPERATURE", "LAST"), ("BUDGET", "LAST")], - filename=f"{gwename}.oc", ) - # GWF-GWE exchange - flopy.mf6.ModflowGwfgwe( - sim, - exgtype="GWF6-GWE6", - exgmnamea=gwfname, - exgmnameb=gwename, - filename=f"{name}.gwfgwe", - ) + gwe.set_model_relative_path(gwepath) + return gwe + + +def get_ener_input(idx): + if idx < 2: + ener_input = calc_ener_input(1.0) + elif idx == 2: + ener_input = calc_ener_input(0.1) - return sim, imsgwf, imsgwe + return ener_input -def build_models(idx, test, ener_input): - # left model - sim, imsgwf, imsgwe = assemble_half_model( - idx, test, ener_input, side="left" - ) - sim, imsgwf, imsgwe = assemble_half_model( - idx, - test, - ener_input, - side="right", - sim=sim, - imsgwf=imsgwf, - imsgwe=imsgwe, +def build_models(idx, test): + ener_input = get_ener_input(idx) + + name = cases[idx] + + # Build MODFLOW 6 files + ws = test.workspace + sim = flopy.mf6.MFSimulation( + sim_name=ws, version="mf6", exe_name="mf6", sim_ws=ws ) - all_mod_names = sim.model_names + # Create tdis package + tdis_rc = [] + for i in range(len(perlen[idx])): + tdis_rc.append((perlen[idx][i], nstp[i], tsmult[idx][i])) - # link up gwf-gwf and gwe-gwe - gwf_mod_names = [nm for nm in all_mod_names if "gwf-" in nm] - gwe_mod_names = [nm for nm in all_mod_names if "gwe-" in nm] + flopy.mf6.ModflowTdis( + sim, time_units="DAYS", nper=len(perlen[idx]), perioddata=tdis_rc + ) - # Assert that the "left" model is listed first - assert ( - "-l" in gwf_mod_names[0] - ), "assumed gwf model order is not as expected" - assert ( - "-l" in gwe_mod_names[0] - ), "assumed gwe model order is not as expected" + # left model + gwf1 = assemble_half_model(sim, "flow1", "flow1", side="left") + + # right model + gwf2 = assemble_half_model(sim, "flow2", "flow2", side="right") # Add the exchange data exgdata = [ @@ -480,28 +381,88 @@ def build_models(idx, test, ener_input): sim, exgtype="GWF6-GWF6", nexg=len(exgdata), - exgmnamea=gwf_mod_names[0], - exgmnameb=gwf_mod_names[1], + exgmnamea=gwf1.name, + exgmnameb=gwf2.name, exchangedata=exgdata, xt3d=xt3d[0], print_flows=True, auxiliary=["ANGLDEGX", "CDIST"], filename="{}.gwfgwf".format("exchng"), + dev_interfacemodel_on=True, ) + # create iterative model solution and register the gwf model with it + imsgwf = 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, + filename="flow.ims", + ) + sim.register_ims_package(imsgwf, [gwf1.name, gwf2.name]) + + # Create gw3 model + gwe1 = get_gwe_model(idx, sim, "energy1", "energy1", ener_input, side="left") + + # Create gwe model + gwe2 = get_gwe_model(idx, sim, "energy2", "energy2", ener_input, side="right") + + # Create GWE GWE exchange flopy.mf6.ModflowGwegwe( sim, exgtype="GWE6-GWE6", - gwfmodelname1=gwf_mod_names[0], - gwfmodelname2=gwf_mod_names[1], + gwfmodelname1=gwf1.name, + gwfmodelname2=gwf2.name, adv_scheme=scheme, nexg=len(exgdata), - exgmnamea=gwe_mod_names[0], - exgmnameb=gwe_mod_names[1], + exgmnamea=gwe1.name, + exgmnameb=gwe2.name, exchangedata=exgdata, auxiliary=["ANGLDEGX", "CDIST"], filename="{}.gwegwe".format("exchng"), ) + + # GWF-GWE exchange + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea="flow1", + exgmnameb="energy1", + filename="flow1_transport1.gwfgwe", + ) + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea="flow2", + exgmnameb="energy2", + filename="flow2_transport2.gwfgwe", + ) + + # create iterative model solution and register the gwt model with it + imsgwe = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="energy.ims", + ) + sim.register_ims_package(imsgwe, [gwe1.name, gwe2.name]) return sim, None @@ -572,20 +533,29 @@ def eq7_26(x, t, el, D, T_0, ener_add_rate): return T -def check_output(idx, test, ener_input): - name = test.name - gwename1 = "gwe-" + name + "-l" - gwename2 = "gwe-" + name + "-r" - - # left side - fpth1 = os.path.join(test.workspace, f"{gwename1}.ucn") - tobj1 = flopy.utils.HeadFile(fpth1, precision="double", text="TEMPERATURE") - sim_temps_l = tobj1.get_alldata() +def check_output(idx, test): + ener_input = get_ener_input(idx) - # right side - fpth2 = os.path.join(test.workspace, f"{gwename2}.ucn") - tobj2 = flopy.utils.HeadFile(fpth2, precision="double", text="TEMPERATURE") - sim_temps_r = tobj2.get_alldata() + gwename = "energy1" + fpth = os.path.join(test.workspace, gwename, f"{gwename}.ucn") + try: + tobj = flopy.utils.HeadFile( + fpth, precision="double", text="TEMPERATURE" + ) + sim_temps_l = tobj.get_alldata() + except: + assert False, f'could not load data from "{fpth}"' + + gwename = "energy2" + fpth = os.path.join(test.workspace, gwename, f"{gwename}.ucn") + try: + tobj = flopy.utils.HeadFile( + fpth, precision="double", text="TEMPERATURE" + ) + sim_temps_r = tobj.get_alldata() + except: + assert False, f'could not load data from "{fpth}"' + # stitch the left and right sides together sim_temps = np.concatenate( @@ -623,7 +593,7 @@ def check_output(idx, test, ener_input): # plt.axhline(0.0, color='black') # plt.legend() # plt.show() - + elif idx == 2: t_accumulate = 0.0 @@ -648,34 +618,18 @@ def check_output(idx, test, ener_input): assert np.allclose( analytical_temps, sim_temps[sp, 0, 0, :], atol=atol - ), "simulated solution is whacked" - - # plt.plot( - # cell_centroids, - # analytical_temps, - # "r-", - # label="Analytical Solution", - # ) - # plt.plot( - # cell_centroids, sim_temps[sp, 0, 0, :], "b--", label="GWE" - # ) - # plt.axhline(0.0, color="black") - # plt.legend() - # plt.show() + ), "simulated solution isn't matching the analytical solution" # - No need to change any code below @pytest.mark.parametrize("idx, name", enumerate(cases)) +@pytest.mark.developmode def test_mf6model(idx, name, function_tmpdir, targets): - if idx < 2: - ener_input = calc_ener_input(1.0) - elif idx == 2: - ener_input = calc_ener_input(0.1) test = TestFramework( name=name, workspace=function_tmpdir, targets=targets, - build=lambda t: build_models(idx, t, ener_input), - check=lambda t: check_output(idx, t, ener_input), + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), ) test.run() diff --git a/autotest/test_par_gwe_split_analyt.py b/autotest/test_par_gwe_split_analyt.py new file mode 100644 index 00000000000..fa7e183f811 --- /dev/null +++ b/autotest/test_par_gwe_split_analyt.py @@ -0,0 +1,44 @@ +""" +This tests reuses the simulation data in test_gwe_split_analyt and runs it +in parallel on two cpus. test_gwe_split_analyt runs 3 different conceptual +models documented in Carslaw and Jaeger (1947). +""" + +import pytest + +from framework import TestFramework + +cases = ["par_eslcasei", "par_eslcaseii", "par_eslcaseiii"] + + +def build_models(idx, test): + from test_gwe_split_analyt import ( + build_models as build, + ) + + sim, dummy = build(idx, test) + return sim, dummy + + +def check_output(idx, test): + from test_gwe_split_analyt import ( + check_output as check, + ) + + check(idx, test) + + +@pytest.mark.parallel +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + compare=None, + parallel=True, + ncpus=2, + ) + test.run() From 2a34c3beebd506f38a3dbc274b9ff13192e4872f Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Thu, 14 Mar 2024 13:32:13 -0500 Subject: [PATCH 063/199] feat(sfw): implement conveyance concept (#1673) * Implement conveyance approach for diffusive wave flow calculation * update tests to work with conveyance formulation * fprettify * test-drive test for cxs utils * fprettify * add an n-point cross section test-drive autotest * fprettify * try to figure out why failing on windows * Model misbehaving on Windows --- autotest/TestSwfUtils.f90 | 429 +++++++++++++++++++++++ autotest/meson.build | 1 + autotest/test_swf_dfw_beg2022.py | 6 +- autotest/test_swf_dfw_bowl.py | 17 +- autotest/test_swf_dfw_loop.py | 8 +- autotest/tester.f90 | 2 + src/Model/ModelUtilities/SwfCxsUtils.f90 | 156 ++++++++- src/Model/SurfaceWaterFlow/swf-cxs.f90 | 130 ++++++- src/Model/SurfaceWaterFlow/swf-dfw.f90 | 50 ++- src/Model/SurfaceWaterFlow/swf-zdg.f90 | 6 +- 10 files changed, 783 insertions(+), 22 deletions(-) create mode 100644 autotest/TestSwfUtils.f90 diff --git a/autotest/TestSwfUtils.f90 b/autotest/TestSwfUtils.f90 new file mode 100644 index 00000000000..d43b71bf5f5 --- /dev/null +++ b/autotest/TestSwfUtils.f90 @@ -0,0 +1,429 @@ +module TestSwfUtils + use KindModule, only: I4B, DP + use ConstantsModule, only: DZERO, DHALF, DONE, DTWO, DNODATA, DTWOTHIRDS + use testdrive, only : error_type, unittest_type, new_unittest, check, test_failed, to_string + use SwfCxsUtilsModule, only: get_cross_section_area, & + get_wetted_perimeter, & + get_conveyance + implicit none + private + public :: collect_swfutils +contains + + subroutine collect_swfutils(testsuite) + type(unittest_type), allocatable, intent(out) :: testsuite(:) + testsuite = [ & + new_unittest("two_point_section", test_two_point_section), & + new_unittest("three_point_section", test_three_point_section), & + new_unittest("test_four_point_rectangular_section", test_four_point_rectangular_section), & + new_unittest("test_n_point_rectangular_section", test_n_point_rectangular_section) & + ] + end subroutine collect_swfutils + + subroutine test_two_point_section(error) + type(error_type), allocatable, intent(out) :: error + integer(I4B), parameter :: NPTS=2 + real(DP), dimension(NPTS) :: xfraction + real(DP), dimension(NPTS) :: height + real(DP), dimension(NPTS) :: cxs_rf + real(DP) :: res + real(DP) :: area + real(DP) :: perimeter + real(DP) :: conveyance + real(DP) :: width + real(DP) :: depth + real(DP) :: rough + + xfraction = (/DZERO, DONE/) + height = (/DZERO, DZERO/) + cxs_rf = (/DONE, DNODATA/) + width = 10.d0 + depth = 10.d0 + rough = 0.035d0 + + ! confirm wetted perimeter calculation + res = get_wetted_perimeter(NPTS, & + xfraction, & + height, & + width, depth) + perimeter = res + call check(error, perimeter == width, "Wetted perimeter correct") + if (allocated(error)) then + call test_failed(error, "Wetted perimeter incorrect") + return + end if + + ! confirm cross section area calculation + res = get_cross_section_area(NPTS, & + xfraction, & + height, & + width, depth) + area = res + call check(error, area == width * depth, "Cross section area correct") + if (allocated(error)) then + call test_failed(error, "Cross section area incorrect") + return + end if + + ! confirm composite conveyance calculation = A*R^(2/3)/n + res = get_conveyance(NPTS, & + xfraction, & + height, cxs_rf, & + width, rough, depth) + conveyance = res + call check(error, & + conveyance == area * (area / perimeter) ** (DTWOTHIRDS) / rough, & + "Conveyance correct") + if (allocated(error)) then + call test_failed(error, "Conveyance incorrect") + return + end if + end subroutine test_two_point_section + + subroutine test_three_point_section(error) + type(error_type), allocatable, intent(out) :: error + integer(I4B), parameter :: NPTS=3 + real(DP), dimension(NPTS) :: xfraction + real(DP), dimension(NPTS) :: height + real(DP), dimension(NPTS) :: cxs_rf + real(DP) :: res + real(DP) :: area + real(DP) :: perimeter + real(DP) :: conveyance + real(DP) :: width + real(DP) :: depth + real(DP) :: rough + real(DP) :: a + real(DP) :: p + real(DP) :: c + + xfraction = (/DZERO, DHALF, DONE/) + height = (/DONE, DZERO, DONE/) + cxs_rf = (/DONE, DONE, DNODATA/) + width = 10.d0 + depth = 1.D0 + rough = 0.035d0 + + ! confirm wetted perimeter calculation + res = get_wetted_perimeter(NPTS, & + xfraction, & + height, & + width, depth) + perimeter = res + call check(error, & + perimeter == DTWO * sqrt((width / DTWO) ** DTWO + depth ** DTWO), & + "Wetted perimeter correct") + if (allocated(error)) then + call test_failed(error, "Wetted perimeter incorrect") + return + end if + + ! confirm cross section area calculation + res = get_cross_section_area(NPTS, & + xfraction, & + height, & + width, depth) + area = res + call check(error, area == DHALF * width * depth, "Cross section area correct") + if (allocated(error)) then + call test_failed(error, "Cross section area incorrect") + return + end if + + ! confirm conveyance calculation = A*R^(2/3)/n + res = get_conveyance(NPTS, & + xfraction, & + height, cxs_rf, & + width, rough, depth) + conveyance = res + a = area / DTWO + p = perimeter / DTWO + c = DTWO * (a * ((a / p) ** DTWOTHIRDS) / rough) + call check(error, & + abs(conveyance - c) < 1.d-8, & + "Swf util conveyance " // to_string(conveyance) // & + " /= expected conveyance " // to_string(c)) + if (allocated(error)) then + call test_failed(error, "Conveyance calculation failed") + return + end if + end subroutine test_three_point_section + + subroutine test_four_point_rectangular_section(error) + type(error_type), allocatable, intent(out) :: error + integer(I4B), parameter :: NPTS=4 + real(DP), dimension(NPTS) :: xfraction + real(DP), dimension(NPTS) :: height + real(DP), dimension(NPTS) :: cxs_rf + real(DP) :: res + real(DP) :: area + real(DP) :: perimeter + real(DP) :: conveyance + real(DP) :: width + real(DP) :: depth + real(DP) :: rough + real(DP) :: a + real(DP) :: p + real(DP) :: c + + depth = DHALF + + xfraction = [DZERO, DZERO, DONE, DONE] + height = [DONE, DZERO, DZERO, DONE] + cxs_rf = [DONE, DONE, DONE, DNODATA] + width = 10.d0 + rough = 0.035d0 + + ! confirm wetted perimeter calculation + res = get_wetted_perimeter(NPTS, & + xfraction, & + height, & + width, depth) + perimeter = res + p = DTWO * depth + width + call check(error, & + perimeter == p, & + "Wetted perimeter " // to_string(perimeter) // & + " /= expected value " // to_string(p)) + if (allocated(error)) then + call test_failed(error, "Wetted perimeter fail") + return + end if + + ! confirm cross section area calculation + res = get_cross_section_area(NPTS, & + xfraction, & + height, & + width, depth) + area = res + a = depth * width + call check(error, & + area == a, & + "Area " // to_string(area) // & + " /= expected value " // to_string(a)) + if (allocated(error)) then + call test_failed(error, "Cross section area incorrect") + return + end if + + ! confirm composite conveyance calculation = A/n*R^(2/3) + res = get_conveyance(NPTS, & + xfraction, & + height, cxs_rf, & + width, rough, depth) + conveyance = res + a = area + p = perimeter + c = a / rough * (a / p) ** DTWOTHIRDS + call check(error, & + abs(conveyance - c) < 1.d-8, & + "Conveyance " // to_string(conveyance) // & + " /= expected value " // to_string(c)) + if (allocated(error)) then + call test_failed(error, "Conveyance calculation failed") + return + end if + + ! test calculations when depth is above the highest + ! cross section height. In this case, the wetted perimeter + ! does not increase when the water surface rises above the + ! highest height point. + depth = 1.5d0 + + ! confirm wetted perimeter calculation + res = get_wetted_perimeter(NPTS, & + xfraction, & + height, & + width, depth) + perimeter = res + p = DTWO * height(1) + width + call check(error, & + perimeter == p, & + "Wetted perimeter " // to_string(perimeter) // & + " /= expected value " // to_string(p)) + if (allocated(error)) then + call test_failed(error, "Wetted perimeter fail") + return + end if + + ! confirm cross section area calculation + res = get_cross_section_area(NPTS, & + xfraction, & + height, & + width, depth) + area = res + a = depth * width + call check(error, & + area == a, & + "Area " // to_string(area) // & + " /= expected value " // to_string(a)) + if (allocated(error)) then + call test_failed(error, "Cross section area incorrect") + return + end if + + ! confirm composite conveyance calculation = A/n*R^(2/3) + res = get_conveyance(NPTS, & + xfraction, & + height, cxs_rf, & + width, rough, depth) + conveyance = res + a = area + p = perimeter + c = a / rough * (a / p) ** DTWOTHIRDS + call check(error, & + abs(conveyance - c) < 1.d-8, & + "Conveyance " // to_string(conveyance) // & + " /= expected value " // to_string(c)) + if (allocated(error)) then + call test_failed(error, "Conveyance calculation failed") + return + end if + end subroutine test_four_point_rectangular_section + + !> @brief Test n-point cross section calculations + !! + !! Use the 8-point cross section data from the + !< Punxsutawney example of the HEC-HMS tutorial. + subroutine test_n_point_rectangular_section(error) + type(error_type), allocatable, intent(out) :: error + integer(I4B), parameter :: NPTS=8 + integer(I4B), parameter :: NDEPTHS=12 + real(DP), dimension(NPTS) :: xfraction + real(DP), dimension(NPTS) :: height + real(DP), dimension(NPTS) :: cxs_rf + real(DP), dimension(NDEPTHS) :: depths + real(DP), dimension(NDEPTHS) :: area_expected + real(DP), dimension(NDEPTHS) :: wp_expected + real(DP), dimension(NDEPTHS) :: conveyance_expected + integer(I4B) :: idepth + real(DP) :: atol = 1.d-9 + real(DP) :: difference + real(DP) :: res + real(DP) :: area + real(DP) :: perimeter + real(DP) :: conveyance + real(DP) :: width + real(DP) :: depth + real(DP) :: rough + real(DP) :: a + real(DP) :: p + real(DP) :: c + + ! expected values + area_expected = [ & + 0.0000000000000000d0, & + 14.756129265604915d0, & + 37.883172712533252d0, & + 63.615202573234768d0, & + 91.952218847709474d0, & + 139.22191462507655d0, & + 231.01552353826017d0, & + 325.38720871509929d0, & + 422.33697015559397d0, & + 521.86480785974402d0, & + 623.97072182754971d0, & + 728.53880232770473d0 & + ] + wp_expected = [ & + 0.0000000000000000d0, & + 22.416013040258729d0, & + 25.759029889993588d0, & + 29.102046739728443d0, & + 32.445063589463295d0, & + 93.878846225107850d0, & + 97.159078583084536d0, & + 100.43931094106127d0, & + 103.71954329903795d0, & + 106.99977565701464d0, & + 110.28000801499132d0, & + 112.57661057753654d0 & + ] + conveyance_expected = [ & + 0.0000000000000000d0, & + 285.75028108202571d0, & + 1289.7912773134653d0, & + 2876.8119843270820d0, & + 5016.5410818181253d0, & + 7835.1910481243458d0, & + 12094.062268307061d0, & + 17566.086627356817d0, & + 24108.098792137902d0, & + 31647.248549995347d0, & + 40136.606753502856d0, & + 49571.805574496953d0 & + ] + + xfraction = [0.d0, 6.10003658d0, 37.39941478d0, 41.09973177d0, & + 61.39965862d0, 68.6021702d0, 96.299683d0, 105.19995123d0] + height = [10.70013411d0, 4.70007315d0, 4.60009754d0, 0.d0, 0.6000061d0, & + 4.60009754d0, 5.d0, 10.70013411d0] + cxs_rf = [0.09d0, 0.09d0, 0.04d0, 0.04d0, 0.04d0, 0.09d0, 0.09d0, 0.d0] + depths = [0.d0, 1.d0, 2.d0, 3.d0, 4.d0, 5.d0, 6.d0, 7.d0, 8.d0, 9.d0, 10.d0, 11.d0] + + width = DONE + rough = DONE + + do idepth = 1, NDEPTHS + + depth = depths(idepth) + + ! confirm cross section area calculation + res = get_cross_section_area(NPTS, & + xfraction, & + height, & + width, depth) + area = res + a = area_expected(idepth) + difference = abs(area - a) + call check(error, & + difference < atol, & + "Area " // to_string(area) // & + " /= expected value " // to_string(a) // & + " Difference is " // to_string(difference)) + if (allocated(error)) then + call test_failed(error, "Cross section area incorrect") + return + end if + + ! confirm wetted perimeter calculation + res = get_wetted_perimeter(NPTS, & + xfraction, & + height, & + width, depth) + perimeter = res + p = wp_expected(idepth) + difference = abs(perimeter - p) + call check(error, & + difference < atol, & + "Wetted perimeter " // to_string(perimeter) // & + " /= expected value " // to_string(p) // & + " Difference is " // to_string(difference)) + if (allocated(error)) then + call test_failed(error, "Wetted perimeter fail") + return + end if + + ! confirm composite conveyance calculation = A/n*R^(2/3) + res = get_conveyance(NPTS, & + xfraction, & + height, cxs_rf, & + width, rough, depth) + conveyance = res + c = conveyance_expected(idepth) + difference = abs(conveyance - c) + call check(error, & + difference < atol, & + "Conveyance " // to_string(conveyance) // & + " /= expected value " // to_string(c) // & + " Difference is " // to_string(difference)) + if (allocated(error)) then + call test_failed(error, "Conveyance calculation failed") + return + end if + + end do + + end subroutine test_n_point_rectangular_section + +end module TestSwfUtils \ No newline at end of file diff --git a/autotest/meson.build b/autotest/meson.build index dc9ee68a221..736ea08e9a3 100644 --- a/autotest/meson.build +++ b/autotest/meson.build @@ -10,6 +10,7 @@ if test_drive.found() and not fc_id.contains('intel') 'MathUtil', 'Message', 'Sim', + 'SwfUtils', 'TimeSelect' ] diff --git a/autotest/test_swf_dfw_beg2022.py b/autotest/test_swf_dfw_beg2022.py index f789c5ab9d6..2125809a620 100644 --- a/autotest/test_swf_dfw_beg2022.py +++ b/autotest/test_swf_dfw_beg2022.py @@ -226,8 +226,8 @@ def make_plot(test, mfsim): ) x = df_mfswr["TOTTIME"] - 86400.0 x = x / 60.0 / 60.0 - ax.plot(x, -df_mfswr["QCRFLOW"], "go", mfc="none", label="MODFLOW-SWR") - ax.plot(times / 60.0 / 60.0, qoutflow, "bo", mfc="none", label="MODFLOW 6") + ax.plot(x, -df_mfswr["QCRFLOW"], "go:", mfc="none", label="MODFLOW-SWR") + ax.plot(times / 60.0 / 60.0, qoutflow, "bo:", mfc="none", label="MODFLOW 6") ax.set_xlim(0, 24.0) ax.set_ylim(19, 26) plt.xlabel("time, in hours") @@ -314,7 +314,7 @@ def check_output(idx, test): diff = np.abs(qoutflow_mf6 - qoutflow_mf2005) print(diff) print(f"max difference is: {diff.max()}") - assert np.allclose(qoutflow_mf6, qoutflow_mf2005, atol=0.15) + assert np.allclose(qoutflow_mf6, qoutflow_mf2005, atol=0.6) return diff --git a/autotest/test_swf_dfw_bowl.py b/autotest/test_swf_dfw_bowl.py index 788defecae3..c82cbed444c 100644 --- a/autotest/test_swf_dfw_bowl.py +++ b/autotest/test_swf_dfw_bowl.py @@ -230,9 +230,9 @@ def check_output(idx, test): 0.00610977, 1.00848343, 2.00848545, - 2.00848563, + 2.00848562, 2.00848566, - 2.00848563, + 2.00848562, 2.00848545, 1.00848343, 0.00610977, @@ -243,14 +243,23 @@ def check_output(idx, test): 2.03027665, 2.03027599, 2.00975688, - 2.00975619, + 2.00975618, 2.00975605, 2.00975535, 1.00975489, 0.00928387, ] - assert np.allclose(stage_all[-1].flatten(), stage_answer, atol=1.0e-5) + # print out the answer in a form that can be + # dropped into this script, if necessary, as the answer + for v in stage_all[-1].flatten(): + print(f"{2*" "}{v:.8f},") + + msg = ( + "Simulated stage does not match with the answer " + "stored from a previous run." + ) + assert np.allclose(stage_all[-1].flatten(), stage_answer, atol=1.0e-5), msg @pytest.mark.parametrize("idx, name", enumerate(cases)) diff --git a/autotest/test_swf_dfw_loop.py b/autotest/test_swf_dfw_loop.py index 08c08bf4c6f..cd091809be1 100644 --- a/autotest/test_swf_dfw_loop.py +++ b/autotest/test_swf_dfw_loop.py @@ -36,7 +36,7 @@ def build_models(idx, test): version="mf6", exe_name="mf6", sim_ws=sim_ws, - memory_print_option="all", + memory_print_option="summary", ) tdis = flopy.mf6.ModflowTdis( @@ -54,6 +54,8 @@ def build_models(idx, test): backtracking_tolerance=1.0, backtracking_reduction_factor=0.3, backtracking_residual_limit=100.0, + under_relaxation="simple", + under_relaxation_gamma=0.7, ) swf = flopy.mf6.ModflowSwf( sim, @@ -437,8 +439,8 @@ def check_output(idx, test): print(diff) print(diff.max(), diff.min()) assert np.allclose( - diff, 0.0, atol=0.0035 - ), f"Max diff with sfr is {diff.min(), diff.max()}" + diff, 0.0, atol=0.06 + ), f"Max diff with swr is {diff.min(), diff.max()}" # read the binary grid file fpth = test.workspace / f"{name}.disl.grb" diff --git a/autotest/tester.f90 b/autotest/tester.f90 index 1c9a92d5466..e4b04fad0e4 100644 --- a/autotest/tester.f90 +++ b/autotest/tester.f90 @@ -11,6 +11,7 @@ program tester use TestMathUtil, only: collect_mathutil use TestMessage, only: collect_message use TestSim, only: collect_sim + use TestSwfUtils, only: collect_swfutils use TestTimeSelect, only: collect_timeselect implicit none integer :: stat, is @@ -29,6 +30,7 @@ program tester new_testsuite("MathUtil", collect_mathutil), & new_testsuite("Message", collect_message), & new_testsuite("Sim", collect_sim), & + new_testsuite("SwfUtils", collect_swfutils), & new_testsuite("TimeSelect", collect_timeselect) & ] diff --git a/src/Model/ModelUtilities/SwfCxsUtils.f90 b/src/Model/ModelUtilities/SwfCxsUtils.f90 index 277a254fb6e..00061a73690 100644 --- a/src/Model/ModelUtilities/SwfCxsUtils.f90 +++ b/src/Model/ModelUtilities/SwfCxsUtils.f90 @@ -10,7 +10,7 @@ !< module SwfCxsUtilsModule - use KindModule, only: DP, I4B + use KindModule, only: DP, I4B, LGP use ConstantsModule, only: DZERO, DHALF, DTWOTHIRDS, DONE, DTWO, & DEM5, DP999, DTHREE use SmoothingModule, only: sChSmooth @@ -27,6 +27,8 @@ module SwfCxsUtilsModule public :: get_hydraulic_radius_xf public :: get_mannings_section public :: calc_composite_roughness + public :: get_conveyance + public :: get_composite_conveyance contains @@ -589,6 +591,158 @@ function get_cross_section_area(npts, xfraction, heights, width, d) result(a) return end function get_cross_section_area + !> @brief Calculate conveyance + !! + !! Return a calculated conveyance. Calculation + !! depends on whether the channel is a rectangular channel + !< with vertical sides or something else. + function get_conveyance(npts, xfraction, heights, cxs_rf, & + width, rough, d) result(c) + ! -- dummy variables + integer(I4B), intent(in) :: npts !< number of station-height data for a reach + real(DP), dimension(npts), intent(in) :: xfraction !< cross-section station distances (x-distance) + real(DP), dimension(npts), intent(in) :: heights !< cross-section height data + real(DP), dimension(:), intent(in) :: cxs_rf ! mannings fractions for this cross section + real(DP), intent(in) :: width !< reach width + real(DP), intent(in) :: rough !< reach roughness + real(DP), intent(in) :: d !< depth to evaluate cross-section + ! result + real(DP) :: c + if (is_rectangular(xfraction)) then + c = get_rectangular_conveyance(npts, xfraction, heights, cxs_rf, & + width, rough, d) + else + c = get_composite_conveyance(npts, xfraction, heights, cxs_rf, & + width, rough, d) + end if + end function get_conveyance + + !> @brief Calculate conveyance for rectangular channel + !< + function get_rectangular_conveyance(npts, xfraction, heights, cxs_rf, & + width, rough, d) result(c) + ! -- dummy variables + integer(I4B), intent(in) :: npts !< number of station-height data for a reach + real(DP), dimension(npts), intent(in) :: xfraction !< cross-section station distances (x-distance) + real(DP), dimension(npts), intent(in) :: heights !< cross-section height data + real(DP), dimension(:), intent(in) :: cxs_rf ! mannings fractions for this cross section + real(DP), intent(in) :: width !< reach width + real(DP), intent(in) :: rough !< reach roughness + real(DP), intent(in) :: d !< depth to evaluate cross-section + ! -- local variables + real(DP) :: c + real(DP) :: a + real(DP) :: p + real(DP) :: ravg + + ! find cross sectional area and wetted perimeter + a = get_cross_section_area(npts, xfraction, heights, width, d) + p = get_wetted_perimeter(npts, xfraction, heights, width, d) + + ! calculate roughness or determine an average + if (has_uniform_resistance(cxs_rf)) then + ravg = rough * cxs_rf(1) + else + ravg = calc_composite_roughness(npts, d, width, rough, DZERO, & + xfraction, heights, cxs_rf, 0) + end if + + ! make conveyance calculation + c = DZERO + if (p > DZERO) then + c = a / ravg * (a / p)**DTWOTHIRDS + end if + end function get_rectangular_conveyance + + !> @brief Determine if cross section is rectangular + !< + function is_rectangular(xfraction) + ! dummy + real(DP), dimension(:), intent(in) :: xfraction !< cross-section station distances (x-distance) + ! result + logical(LGP) :: is_rectangular + is_rectangular = .false. + if (size(xfraction) == 4) then + if (xfraction(1) == xfraction(2) .and. & + xfraction(3) == xfraction(4)) then + is_rectangular = .true. + end if + end if + end function is_rectangular + + !> @brief Determine if roughness is uniform for the section + !< + function has_uniform_resistance(cxs_rf) + ! dummy + real(DP), dimension(:), intent(in) :: cxs_rf !< cross-section station distances (x-distance) + ! result + logical(LGP) :: has_uniform_resistance + ! local + real(DP) :: rmin + real(DP) :: rmax + rmin = minval(cxs_rf(1:3)) + rmax = maxval(cxs_rf(1:3)) + has_uniform_resistance = (rmin == rmax) + end function has_uniform_resistance + + !> @brief Calculate composite conveyance + !! + !! Function to calculate the composite conveyance. + !! This is based on the approach in HEC-RAS, where + !! a conveyance is calculated for each line segment + !! in the cross section, and then summed to produce + !! a total conveyance. + !! + !< + function get_composite_conveyance(npts, xfraction, heights, cxs_rf, & + width, rough, d) result(c) + ! -- dummy variables + integer(I4B), intent(in) :: npts !< number of station-height data for a reach + real(DP), dimension(npts), intent(in) :: xfraction !< cross-section station distances (x-distance) + real(DP), dimension(npts), intent(in) :: heights !< cross-section height data + real(DP), dimension(:), intent(in) :: cxs_rf ! mannings fractions for this cross section + real(DP), intent(in) :: width !< reach width + real(DP), intent(in) :: rough !< reach roughness + real(DP), intent(in) :: d !< depth to evaluate cross-section + ! -- local variables + integer(I4B) :: n + real(DP) :: c + real(DP) :: p + real(DP) :: rc + real(DP) :: rh + real(DP) :: cn + real(DP), dimension(npts) :: stations + real(DP), dimension(npts - 1) :: areas + real(DP), dimension(npts - 1) :: perimeters + ! + ! -- calculate station from xfractions and width + do n = 1, npts + stations(n) = xfraction(n) * width + end do + ! + ! -- calculate the cross-sectional area for each line segment + call get_cross_section_areas(npts, stations, heights, d, areas) + ! + ! -- calculate the wetted perimeter for each line segment + call get_wetted_perimeters(npts, stations, heights, d, perimeters) + ! + ! -- calculate the composite conveyance + c = DZERO + do n = 1, npts - 1 + rc = cxs_rf(n) * rough + p = perimeters(n) + cn = DZERO + if (p > DZERO) then + rh = areas(n) / p + cn = areas(n) / rc * rh**DTWOTHIRDS + end if + c = c + cn + end do + ! + ! -- return + return + end function get_composite_conveyance + !> @brief Calculate the hydraulic radius for a reach !! !! Function to calculate the hydraulic radius for a reach using diff --git a/src/Model/SurfaceWaterFlow/swf-cxs.f90 b/src/Model/SurfaceWaterFlow/swf-cxs.f90 index efbfdfc8e60..b42f396665f 100644 --- a/src/Model/SurfaceWaterFlow/swf-cxs.f90 +++ b/src/Model/SurfaceWaterFlow/swf-cxs.f90 @@ -5,7 +5,7 @@ module SwfCxsModule use KindModule, only: DP, I4B, LGP - use ConstantsModule, only: LENMEMPATH, DZERO + use ConstantsModule, only: LENMEMPATH, DZERO, DTWOTHIRDS use MemoryHelperModule, only: create_mem_path use MemoryManagerModule, only: mem_allocate use SimVariablesModule, only: errmsg, warnmsg @@ -46,8 +46,11 @@ module SwfCxsModule procedure :: cxs_da procedure :: get_cross_section_info procedure :: get_area + procedure :: get_wetted_perimeter => cxs_wetted_perimeter procedure :: get_roughness + procedure :: get_conveyance => cxs_conveyance procedure :: get_hydraulic_radius + procedure :: write_cxs_table end type SwfCxsType @@ -455,6 +458,71 @@ subroutine log_crosssectiondata(this, found) end subroutine log_crosssectiondata + subroutine write_cxs_table(this, idcxs, width, slope, rough, unitconv) + ! -- module + use SortModule, only: qsort, unique_values + ! -- dummy + class(SwfCxsType) :: this + integer(I4B), intent(in) :: idcxs + real(DP), intent(in) :: width + real(DP), intent(in) :: slope + real(DP), intent(in) :: rough + real(DP), intent(in) :: unitconv + ! -- local + integer(I4B) :: ipt + real(DP) :: d + real(DP) :: a + real(DP) :: rh + real(DP) :: wp + real(DP) :: r + real(DP) :: c + real(DP) :: q + integer(I4B) :: i0 + integer(I4B) :: i1 + integer(I4B) :: npts + integer(I4B) :: icalcmeth + real(DP), dimension(:), allocatable :: depths + real(DP), dimension(:), allocatable :: depths_unique + integer(I4B), dimension(:), allocatable :: indx + + call this%get_cross_section_info(idcxs, i0, i1, npts, icalcmeth) + + if (npts > 0) then + + write (this%iout, *) 'Processing information for cross section ', idcxs + write (this%iout, *) 'Depth Area WettedP HydRad Rough Conveyance Q' + + allocate (depths(npts)) + allocate (indx(size(depths))) + + depths(:) = this%height(:) + call qsort(indx, depths) + call unique_values(depths, depths_unique) + + do ipt = 1, size(depths_unique) + d = depths_unique(ipt) + a = this%get_area(idcxs, width, d) + wp = this%get_wetted_perimeter(idcxs, width, d) + rh = this%get_hydraulic_radius(idcxs, width, d, a) + r = this%get_roughness(idcxs, width, d, rough, slope) + c = this%get_conveyance(idcxs, width, d, rough) + if (slope > DZERO) then + q = unitconv * c * sqrt(slope) + else + q = DZERO + end if + write (this%iout, *) d, a, wp, rh, r, c, q + end do + + deallocate (depths) + deallocate (depths_unique) + write (this%iout, *) 'Done processing information for cross section ', idcxs + + end if + + return + end subroutine write_cxs_table + !> @brief deallocate memory !< subroutine cxs_da(this) @@ -521,7 +589,7 @@ subroutine get_cross_section_info(this, idcxs, i0, i1, npts, icalcmeth) npts = i1 - i0 + 1 icalcmeth = 0 ! linear composite mannings resistance if (npts > 4) then - icalcmeth = 1 ! sum q by cross section segments + icalcmeth = 0 ! sum q by cross section segments end if end if return @@ -552,6 +620,31 @@ function get_area(this, idcxs, width, depth) result(area) end if end function get_area + function cxs_wetted_perimeter(this, idcxs, width, depth) result(wp) + ! -- modules + use SwfCxsUtilsModule, only: get_wetted_perimeter + ! -- dummy + class(SwfCxsType) :: this + integer(I4B), intent(in) :: idcxs !< cross section id + real(DP), intent(in) :: width !< width in reach + real(DP), intent(in) :: depth !< stage in reach + ! -- local + real(DP) :: wp + integer(I4B) :: i0 + integer(I4B) :: i1 + integer(I4B) :: npts + integer(I4B) :: icalcmeth + call this%get_cross_section_info(idcxs, i0, i1, npts, icalcmeth) + if (npts == 0) then + wp = width + else + wp = get_wetted_perimeter(npts, & + this%xfraction(i0:i1), & + this%height(i0:i1), & + width, depth) + end if + end function cxs_wetted_perimeter + function get_roughness(this, idcxs, width, depth, rough, & slope) result(roughc) ! -- modules @@ -585,6 +678,39 @@ function get_roughness(this, idcxs, width, depth, rough, & end if end function get_roughness + function cxs_conveyance(this, idcxs, width, depth, & + rough) result(conveyance) + ! -- modules + use SwfCxsUtilsModule, only: get_conveyance + ! -- dummy + class(SwfCxsType) :: this + integer(I4B), intent(in) :: idcxs !< cross section id + real(DP), intent(in) :: width !< width in reach + real(DP), intent(in) :: depth !< stage in reach + real(DP), intent(in) :: rough !< mannings value provided for the reach + ! -- return + real(DP) :: conveyance !< calculated composite roughness + ! -- local + real(DP) :: a + real(DP) :: rh + integer(I4B) :: i0 + integer(I4B) :: i1 + integer(I4B) :: npts + integer(I4B) :: icalcmeth + call this%get_cross_section_info(idcxs, i0, i1, npts, icalcmeth) + if (npts == 0) then + a = depth * width + rh = a / width + conveyance = a * rh**DTWOTHIRDS / rough + else + conveyance = get_conveyance(npts, & + this%xfraction(i0:i1), & + this%height(i0:i1), & + this%manfraction(i0:i1), & + width, rough, depth) + end if + end function cxs_conveyance + function get_hydraulic_radius(this, idcxs, width, depth, area) result(r) ! -- modules use SwfCxsUtilsModule, only: get_hydraulic_radius_xf diff --git a/src/Model/SurfaceWaterFlow/swf-dfw.f90 b/src/Model/SurfaceWaterFlow/swf-dfw.f90 index 34c444204f0..3dc2801a889 100644 --- a/src/Model/SurfaceWaterFlow/swf-dfw.f90 +++ b/src/Model/SurfaceWaterFlow/swf-dfw.f90 @@ -92,6 +92,7 @@ module SwfDfwModule procedure :: get_cond !procedure :: get_cond_swr procedure :: get_cond_n + procedure :: write_cxs_tables end type SwfDfwType @@ -442,10 +443,30 @@ subroutine log_griddata(this, found) write (this%iout, '(4x,a)') 'IDCXS set from input file' end if + call this%write_cxs_tables() + write (this%iout, '(1x,a,/)') 'End Setting DFW Griddata' end subroutine log_griddata + subroutine write_cxs_tables(this) + ! -- modules + ! -- dummy + class(SwfDfwType) :: this !< this instance + ! -- local + ! integer(I4B) :: idcxs + ! integer(I4B) :: n + + !-- TODO: write cross section tables + ! do n = 1, this%dis%nodes + ! idcxs = this%idcxs(n) + ! if (idcxs > 0) then + ! call this%cxs%write_cxs_table(idcxs, this%width(n), this%slope(n), & + ! this%manningsn(n), this%unitconv) + ! end if + ! end do + end subroutine write_cxs_tables + !> @brief allocate memory !< subroutine dfw_ar(this, ibound) @@ -645,12 +666,15 @@ function get_cond(this, n, m, stage_n, stage_m) result(cond) if (denom > DPREC) then absdhdxsqr = abs((stage_n - stage_m) / denom)**DHALF if (absdhdxsqr < DPREC) then + ! TODO: Set this differently somehow? absdhdxsqr = 1.e-7 end if - + ! + ! -- Calculate depth in each reach depth_n = stage_n - this%disl%reach_bottom(n) depth_m = stage_m - this%disl%reach_bottom(m) - + ! + ! -- Assign upstream depth, if not central if (this%icentral == 0) then ! -- use upstream weighting if (stage_n > stage_m) then @@ -659,17 +683,22 @@ function get_cond(this, n, m, stage_n, stage_m) result(cond) depth_n = depth_m end if end if - + ! ! -- Calculate a smoothed depth that goes to zero over ! the specified range call sQuadratic(depth_n, range, dydx, smooth_factor) depth_n = depth_n * smooth_factor call sQuadratic(depth_m, range, dydx, smooth_factor) depth_m = depth_m * smooth_factor - + ! + ! -- Calculate half-cell conductance for reach + ! n and m cn = this%get_cond_n(n, depth_n, absdhdxsqr) cm = this%get_cond_n(m, depth_m, absdhdxsqr) - + ! + ! -- Use harmonic mean to calculated weighted + ! conductance bewteen the centers of reaches + ! n and m if ((cn + cm) > DPREC) then cond = cn * cm / (cn + cm) else @@ -693,8 +722,9 @@ function get_cond_n(this, n, depth, absdhdxsq) result(c) integer(I4B), intent(in) :: n !< reach number real(DP), intent(in) :: depth !< simulated depth (stage - elevation) in reach n for this iteration real(DP), intent(in) :: absdhdxsq !< absolute value of simulated hydraulic gradient - ! -- local + ! -- return real(DP) :: c + ! -- local real(DP) :: width real(DP) :: rough real(DP) :: slope @@ -702,10 +732,14 @@ function get_cond_n(this, n, depth, absdhdxsq) result(c) real(DP) :: roughc real(DP) :: a real(DP) :: r + real(DP) :: conveyance ! width = this%width(n) rough = this%manningsn(n) slope = this%slope(n) + + ! -- TODO: this should probably come from cl1/cl2 in case the cell + ! center does not correspond to the middle of the reach. dx = DHALF * this%disl%reach_length(n) roughc = this%cxs%get_roughness(this%idcxs(n), width, depth, rough, & @@ -714,7 +748,9 @@ function get_cond_n(this, n, depth, absdhdxsq) result(c) r = this%cxs%get_hydraulic_radius(this%idcxs(n), width, depth, area=a) ! -- conductance from manning's equation - c = this%unitconv * a * r**DTWOTHIRDS / roughc / absdhdxsq / dx + !conveyance = a * r**DTWOTHIRDS / roughc + conveyance = this%cxs%get_conveyance(this%idcxs(n), width, depth, rough) + c = this%unitconv * conveyance / absdhdxsq / dx end function get_cond_n diff --git a/src/Model/SurfaceWaterFlow/swf-zdg.f90 b/src/Model/SurfaceWaterFlow/swf-zdg.f90 index fb29d2049db..670e7f656c5 100644 --- a/src/Model/SurfaceWaterFlow/swf-zdg.f90 +++ b/src/Model/SurfaceWaterFlow/swf-zdg.f90 @@ -379,6 +379,7 @@ function get_cond(this, i, depth, absdhdxsq, unitconv) result(c) real(DP) :: roughc real(DP) :: a real(DP) :: r + real(DP) :: conveyance ! idcxs = this%idcxs(i) width = this%width(i) @@ -389,8 +390,9 @@ function get_cond(this, i, depth, absdhdxsq, unitconv) result(c) a = this%cxs%get_area(idcxs, width, depth) r = this%cxs%get_hydraulic_radius(idcxs, width, depth, area=a) - ! todo: unit convert? - c = a * r**DTWOTHIRDS / roughc / absdhdxsq + !conveyance = a * r**DTWOTHIRDS / roughc + conveyance = this%cxs%get_conveyance(idcxs, width, depth, rough) + c = conveyance / absdhdxsq end function get_cond From c99aa8bf3cd0827c02672e43149afb6ffe027207 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 15 Mar 2024 18:06:20 -0400 Subject: [PATCH 064/199] ci(parallel): add mf6 parallel test on windows (#1672) * build petsc with ifort/cl from cygwin * factor out scripts for cygwin build steps * factor out actions for mf6 parallel testing * meson test serially to avoid errors on windows --- .github/actions/test-par-win/action.yml | 152 +++++++++++++++++++++++ .github/actions/test-par/action.yml | 81 ++++++++++++ .github/common/compile_modflow6.bat | 5 + .github/common/compile_petsc.sh | 3 + .github/common/configure_petsc.sh | 12 ++ .github/common/install_intel_windows.bat | 8 ++ .github/common/test_modflow6.bat | 3 + .github/workflows/ci.yml | 129 ++----------------- .github/workflows/docs.yml | 1 + autotest/framework.py | 11 +- meson.build | 25 ++-- 11 files changed, 297 insertions(+), 133 deletions(-) create mode 100644 .github/actions/test-par-win/action.yml create mode 100644 .github/actions/test-par/action.yml create mode 100644 .github/common/compile_modflow6.bat create mode 100644 .github/common/compile_petsc.sh create mode 100644 .github/common/configure_petsc.sh create mode 100644 .github/common/install_intel_windows.bat create mode 100644 .github/common/test_modflow6.bat diff --git a/.github/actions/test-par-win/action.yml b/.github/actions/test-par-win/action.yml new file mode 100644 index 00000000000..b5b85de8863 --- /dev/null +++ b/.github/actions/test-par-win/action.yml @@ -0,0 +1,152 @@ +name: Test parallel MF6 (Windows) +description: Build and test parallel MODFLOW 6 on Windows +runs: + using: "composite" + steps: + + - name: Convert line endings + shell: cmd + run: | + unix2dos -n "modflow6\.github\common\configure_petsc.sh" "%TEMP%\configure_petsc.sh" + unix2dos -n "modflow6\.github\common\compile_petsc.sh" "%TEMP%\compile_petsc.sh" + unix2dos -n "modflow6\.github\common\compile_modflow6.bat" "%TEMP%\compile_modflow6.bat" + unix2dos -n "modflow6\.github\common\test_modflow6.bat" "%TEMP%\test_modflow6.bat" + + - name: Hide Strawberry programs + shell: bash + run: | + mkdir "$RUNNER_TEMP/strawberry" + mv /c/Strawberry/c/bin/gmake "$RUNNER_TEMP/strawberry/gmake" + mv /c/Strawberry/perl/bin/pkg-config "$RUNNER_TEMP/strawberry/pkg-config" + mv /c/Strawberry/perl/bin/pkg-config.bat "$RUNNER_TEMP/strawberry/pkg-config.bat" + + - name: Get date + id: get-date + shell: bash + run: echo "date=$(/bin/date -u "+%Y%m%d")" >> "$GITHUB_OUTPUT" + + - name: Set oneAPI install dir + id: oneapi-root + shell: bash + run: echo "ONEAPI_ROOT=C:\Program Files (x86)\Intel\oneAPI" >> "$GITHUB_ENV" + + - name: Restore oneAPI cache + id: oneapi-cache + uses: actions/cache/restore@v3 + with: + path: ${{ env.ONEAPI_ROOT }} + key: oneapi-${{ runner.os }}-${{ steps.get-date.outputs.date }} + + - name: Install oneAPI BaseKit + shell: bash + if: steps.oneapi-cache.outputs.cache-hit != 'true' + run: | + url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/5cb30fb9-21e9-47e8-82da-a91e00191670/w_BaseKit_p_2024.0.1.45_offline.exe" + cmp="intel.oneapi.win.mkl.devel" + "modflow6/.github/common/install_intel_windows.bat" $url $cmp + rm -rf $TEMP/webimage.exe + rm -rf $TEMP/webimage_extracted + + - name: Install oneAPI HPCKit + shell: bash + if: steps.oneapi-cache.outputs.cache-hit != 'true' + run: | + url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/7a6db8a1-a8b9-4043-8e8e-ca54b56c34e4/w_HPCKit_p_2024.0.1.35_offline.exe" + cmp="intel.oneapi.win.cpp-dpcpp-common:intel.oneapi.win.ifort-compiler:intel.oneapi.win.mpi.devel" + "modflow6/.github/common/install_intel_windows.bat" $url $cmp + rm -rf $TEMP/webimage.exe + rm -rf $TEMP/webimage_extracted + + - name: Save oneAPI cache + if: steps.oneapi-cache.outputs.cache-hit != 'true' + uses: actions/cache/save@v3 + with: + path: ${{ env.ONEAPI_ROOT }} + key: oneapi-${{ runner.os }}-${{ steps.get-date.outputs.date }} + + - name: Restore PETSc cache + id: petsc-cache + uses: actions/cache/restore@v3 + with: + path: petsc + key: petsc-${{ runner.os }}-${{ steps.get-date.outputs.date }} + + - name: Configure environment + shell: bash + run: | + PETSC_DIR=$GITHUB_WORKSPACE/petsc + PETSC_ARCH=arch-mswin-c-opt + echo "PETSC_DIR=$PETSC_DIR" >> $GITHUB_ENV + echo "PETSC_ARCH=$PETSC_ARCH" >> $GITHUB_ENV + echo "$PETSC_DIR/$PETSC_ARCH/lib" >> $GITHUB_PATH + + - name: Download PETSc + if: steps.petsc-cache.outputs.cache-hit != 'true' + shell: bash + run: | + curl https://web.cels.anl.gov/projects/petsc/download/release-snapshots/petsc-3.20.5.tar.gz -O -J + mkdir petsc + tar -xzf petsc-3.20.5.tar.gz -C petsc --strip-components=1 + + - name: Setup Cygwin + if: steps.petsc-cache.outputs.cache-hit != 'true' + uses: egor-tensin/setup-cygwin@v4 + with: + packages: python3 make gcc-core gcc-g++ pkg-config + + - name: Hide Cygwin linker + if: steps.petsc-cache.outputs.cache-hit != 'true' + shell: C:\tools\cygwin\bin\bash.exe --login --norc -eo pipefail -o igncr '{0}' + run: | + mv /usr/bin/link.exe /usr/bin/link-cygwin.exe + which link + + - name: Configure PETSc + if: steps.petsc-cache.outputs.cache-hit != 'true' + shell: cmd + run: | + "${{ env.ONEAPI_ROOT }}\setvars.bat" intel64 vs2022 && "C:\tools\cygwin\bin\bash.exe" --login --norc -eo pipefail -o igncr "%TEMP%\configure_petsc.sh" + + - name: Build PETSc + if: steps.petsc-cache.outputs.cache-hit != 'true' + shell: cmd + run: | + "${{ env.ONEAPI_ROOT }}\setvars.bat" intel64 vs2022 && "C:\tools\cygwin\bin\bash.exe" --login --norc -eo pipefail -o igncr "%TEMP%\compile_petsc.sh" + + - name: Save PETSc cache + if: steps.petsc-cache.outputs.cache-hit != 'true' + uses: actions/cache/save@v3 + with: + path: petsc + key: petsc-${{ runner.os }}-${{ steps.get-date.outputs.date }} + + - name: Build modflow6 + shell: cmd + run: | + "${{ env.ONEAPI_ROOT }}\setvars.bat" intel64 vs2022 && "%TEMP%\compile_modflow6.bat" + + - name: Show Meson logs + if: failure() + shell: bash + working-directory: modflow6 + run: cat builddir/meson-logs/meson-log.txt + + - name: Update flopy + working-directory: modflow6/autotest + shell: cmd + run: micromamba run -r "C:\Users\runneradmin\micromamba" -n modflow6 python update_flopy.py + + - name: Get executables + working-directory: modflow6/autotest + shell: cmd + env: + GITHUB_TOKEN: ${{ github.token }} + run: micromamba run -r "C:\Users\runneradmin\micromamba" -n modflow6 pytest -v --durations 0 get_exes.py + + - name: Test programs + working-directory: modflow6/autotest + shell: cmd + env: + REPOS_PATH: ${{ github.workspace }} + run: | + "${{ env.ONEAPI_ROOT }}\setvars.bat" intel64 vs2022 && "%TEMP%\test_modflow6.bat" \ No newline at end of file diff --git a/.github/actions/test-par/action.yml b/.github/actions/test-par/action.yml new file mode 100644 index 00000000000..fb643ca9f81 --- /dev/null +++ b/.github/actions/test-par/action.yml @@ -0,0 +1,81 @@ +name: Test parallel MF6 +description: Build and test parallel MODFLOW 6 +runs: + using: "composite" + steps: + + - name: Setup GNU Fortran + uses: fortran-lang/setup-fortran@v1 + with: + compiler: gcc + version: 13 + + - name: Checkout PETSc + uses: actions/checkout@v4 + with: + repository: petsc/petsc + path: petsc + ref: release + + - name: Configure environment + if: runner.os == 'Linux' + shell: bash + run: | + echo "PKG_CONFIG_PATH=$GITHUB_WORKSPACE/petsc/linux-gnu/lib/pkgconfig" >> $GITHUB_ENV + echo "$GITHUB_WORKSPACE/petsc/linux-gnu/bin" >> $GITHUB_PATH + + - name: Configure environment + if: runner.os == 'macOS' + shell: bash + run: | + echo "PKG_CONFIG_PATH=$GITHUB_WORKSPACE/petsc/arch-darwin-gcc-debug/lib/pkgconfig" >> $GITHUB_ENV + echo "$GITHUB_WORKSPACE/petsc/arch-darwin-gcc-debug/bin" >> $GITHUB_PATH + + - name: Configure PETSc + if: runner.os == 'Linux' + shell: bash + working-directory: petsc + run: | + sudo ./configure PETSC_ARCH=linux-gnu --download-fblaslapack --download-openmpi + sudo make all + + - name: Configure PETSc + if: runner.os == 'macOS' + shell: bash + working-directory: petsc + run: | + sudo ./configure PETSC_DIR="$GITHUB_WORKSPACE/petsc" PETSC_ARCH=arch-darwin-gcc-debug --download-fblaslapack --download-openmpi + sudo make all + + - name: Build modflow6 + shell: bash -l {0} + working-directory: modflow6 + run: | + meson setup builddir -Ddebug=false -Dparallel=true --prefix=$(pwd) --libdir=bin + meson install -C builddir + meson test --verbose --no-rebuild -C builddir + + - name: Show Meson logs + if: failure() + shell: bash + working-directory: modflow6 + run: cat builddir/meson-logs/meson-log.txt + + - name: Update flopy + shell: bash -l {0} + working-directory: modflow6/autotest + run: python update_flopy.py + + - name: Get executables + shell: bash -l {0} + working-directory: modflow6/autotest + env: + GITHUB_TOKEN: ${{ github.token }} + run: pytest -v --durations 0 get_exes.py + + - name: Test programs + shell: bash -l {0} + working-directory: modflow6/autotest + env: + REPOS_PATH: ${{ github.workspace }} + run: pytest -v -n auto --parallel --durations 0 -k "test_par" --keep-failed .failed \ No newline at end of file diff --git a/.github/common/compile_modflow6.bat b/.github/common/compile_modflow6.bat new file mode 100644 index 00000000000..874a255488b --- /dev/null +++ b/.github/common/compile_modflow6.bat @@ -0,0 +1,5 @@ +set FC=ifort +cd "%GITHUB_WORKSPACE%\modflow6" +micromamba run -r "C:\Users\runneradmin\micromamba" -n modflow6 meson setup builddir -Ddebug=false -Dparallel=true --prefix=%CD% --libdir=bin +micromamba run -r "C:\Users\runneradmin\micromamba" -n modflow6 meson install -C builddir +micromamba run -r "C:\Users\runneradmin\micromamba" -n modflow6 meson test --verbose --no-rebuild -C builddir \ No newline at end of file diff --git a/.github/common/compile_petsc.sh b/.github/common/compile_petsc.sh new file mode 100644 index 00000000000..8883d53d0d9 --- /dev/null +++ b/.github/common/compile_petsc.sh @@ -0,0 +1,3 @@ +cd "$GITHUB_WORKSPACE/petsc" +make all +make check \ No newline at end of file diff --git a/.github/common/configure_petsc.sh b/.github/common/configure_petsc.sh new file mode 100644 index 00000000000..b4a8ab7e44c --- /dev/null +++ b/.github/common/configure_petsc.sh @@ -0,0 +1,12 @@ +cd "$GITHUB_WORKSPACE/petsc" +./configure \ + --with-debugging=0 \ + --with-shared-libraries=1 \ + --with-cc='cl' \ + --with-fc='ifort' \ + --with-cxx='cl' \ + --with-blaslapack-lib='-L/cygdrive/c/PROGRA~2/Intel/oneAPI/mkl/latest/lib mkl_intel_lp64_dll.lib mkl_sequential_dll.lib mkl_core_dll.lib' \ + --with-mpi-include='/cygdrive/c/PROGRA~2/Intel/oneAPI/mpi/latest/include' \ + --with-mpi-lib='/cygdrive/c/PROGRA~2/Intel/oneAPI/mpi/latest/lib/impi.lib' \ + --with-mpiexec='/cygdrive/c/PROGRA~2/Intel/oneAPI/mpi/latest/bin/mpiexec -localonly' \ + --with-python-exec='/usr/bin/PYTHON~1.EXE' \ No newline at end of file diff --git a/.github/common/install_intel_windows.bat b/.github/common/install_intel_windows.bat new file mode 100644 index 00000000000..f9ef203fc27 --- /dev/null +++ b/.github/common/install_intel_windows.bat @@ -0,0 +1,8 @@ +@echo off + +:: download and unpack installer +curl.exe --output %TEMP%\webimage.exe --url %1 --retry 5 --retry-delay 5 +start /b /wait %TEMP%\webimage.exe -s -x -f %TEMP%\webimage_extracted --log %TEMP%\extract.log + +:: run installer +%TEMP%\webimage_extracted\bootstrapper.exe -s --action install --components=%2 --eula=accept -p=NEED_VS2017_INTEGRATION=0 -p=NEED_VS2019_INTEGRATION=0 -p=NEED_VS2022_INTEGRATION=1 --log-dir=%TEMP% \ No newline at end of file diff --git a/.github/common/test_modflow6.bat b/.github/common/test_modflow6.bat new file mode 100644 index 00000000000..af180d981ae --- /dev/null +++ b/.github/common/test_modflow6.bat @@ -0,0 +1,3 @@ +cd "%GITHUB_WORKSPACE%\modflow6\autotest" +ldd ..\bin\mf6 +micromamba run -r "C:\Users\runneradmin\micromamba" -n modflow6 pytest -v -n auto --parallel -k "test_par" --durations 0 --keep-failed .failed \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 365a55d7d0a..f713859309a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -422,13 +422,11 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-22.04, macos-12 ] #, windows-2022 ] + os: [ ubuntu-22.04, macos-12, windows-2022 ] defaults: run: shell: bash -l {0} - env: - FC: gfortran - FC_V: 12 + steps: - name: Checkout modflow6 @@ -436,88 +434,6 @@ jobs: with: path: modflow6 - - name: Setup MSYS2 - if: runner.os == 'Windows' - uses: msys2/setup-msys2@v2 - with: - update: true - install: | - git - make - mingw-w64-x86_64-gcc - mingw-w64-x86_64-python - mingw-w64-x86_64-python-pip - mingw-w64-x86_64-python-pytest - - - name: Setup MPI - if: runner.os == 'Windows' - uses: mpi4py/setup-mpi@v1 - with: - mpi: msmpi - - - name: Setup ${{ env.FC }} ${{ env.FC_V }} - uses: fortran-lang/setup-fortran@v1 - with: - compiler: gcc - version: ${{ env.FC_V }} - - - name: Cache PETSc - id: cache-petsc - uses: actions/cache@v4 - with: - path: petsc - key: ${{ runner.os }}-petsc - - - name: Clone PETSc - if: runner.os != 'Windows' && steps.cache-petsc.outputs.cache-hit != 'true' - run: git clone -b release https://gitlab.com/petsc/petsc.git petsc - - - name: Download PETSc - if: runner.os == 'Windows' - run: | - curl https://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-3.18.4.tar.gz -O -J - mkdir petsc - tar -xzf petsc-3.18.4.tar.gz -C petsc --strip-components=1 - - - name: Configure environment - if: runner.os == 'Linux' - run: | - echo "PKG_CONFIG_PATH=$GITHUB_WORKSPACE/petsc/linux-gnu/lib/pkgconfig" >> $GITHUB_ENV - echo "$GITHUB_WORKSPACE/petsc/linux-gnu/bin" >> $GITHUB_PATH - - - name: Configure environment - if: runner.os == 'macOS' - run: | - echo "PKG_CONFIG_PATH=$GITHUB_WORKSPACE/petsc/arch-darwin-gcc-debug/lib/pkgconfig" >> $GITHUB_ENV - echo "$GITHUB_WORKSPACE/petsc/arch-darwin-gcc-debug/bin" >> $GITHUB_PATH - - - name: Configure PETSc - if: runner.os == 'Linux' - working-directory: petsc - run: | - sudo ./configure PETSC_ARCH=linux-gnu --download-fblaslapack --download-openmpi - sudo make all - - - name: Configure PETSc - if: runner.os == 'macOS' - working-directory: petsc - run: | - sudo ./configure PETSC_DIR="$GITHUB_WORKSPACE/petsc" PETSC_ARCH=arch-darwin-gcc-debug --download-fblaslapack --download-openmpi - sudo make all - - - name: Configure PETSc - if: runner.os == 'Windows' - shell: msys2 {0} - working-directory: petsc - run: | - pacman -Syu - pacman -Sy --noconfirm autoconf automake-wrapper bison bsdcpio make git \ - mingw-w64-x86_64-toolchain patch python flex \ - pkg-config pkgfile tar unzip mingw-w64-x86_64-cmake \ - mingw-w64-x86_64-msmpi mingw-w64-x86_64-openblas mingw-w64-x86_64-jq - /usr/bin/python ./configure --with-mpiexec='/C/Program\ Files/Microsoft\ MPI/Bin/mpiexec' --with-shared-libraries=0 - make all - - name: Setup Micromamba uses: mamba-org/setup-micromamba@v1 with: @@ -528,42 +444,17 @@ jobs: cache-environment: true cache-downloads: true - - name: Build modflow6 - working-directory: modflow6 - run: | - meson setup builddir -Ddebug=false -Dparallel=true --prefix=$(pwd) --libdir=bin - meson install -C builddir - meson test --verbose --no-rebuild -C builddir + - name: Test parallel MF6 + if: runner.os != 'Windows' + uses: ./modflow6/.github/actions/test-par - - name: Show Meson logs - if: failure() - working-directory: modflow6 - run: cat builddir/meson-logs/meson-log.txt - - - name: Update flopy - working-directory: modflow6/autotest - run: python update_flopy.py - - - name: Get executables - working-directory: modflow6/autotest - env: - GITHUB_TOKEN: ${{ github.token }} - run: pytest -v --durations 0 get_exes.py - - - name: Test programs (parallel) - working-directory: modflow6/autotest - env: - REPOS_PATH: ${{ github.workspace }} - run: | - branch="${{ github.ref_name }}" - marker="not large" - markers=$([ "$branch" == "master" ] && echo "$marker and not developmode" || echo "$marker") - pytest -v -n auto --parallel --durations 0 -m "$markers" --keep-failed .failed + - name: Test parallel MF6 (Windows) + if: runner.os == 'Windows' + uses: ./modflow6/.github/actions/test-par-win - name: Upload failed test output if: failure() uses: actions/upload-artifact@v4 with: - name: failed-${{ matrix.os }}-${{ env.FC }}-${{ env.FC_V }} - path: modflow6/autotest/.failed - + name: failed-${{ matrix.os }} + path: modflow6/autotest/.failed \ No newline at end of file diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 6e3e129bdb4..37743f39fc4 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -3,6 +3,7 @@ on: push: paths-ignore: - '.github/workflows/release.yml' + - '.github/workflows/ci.yml' - '.hpc/**' pull_request: branches: diff --git a/autotest/framework.py b/autotest/framework.py index c0142c3c5d7..a653ad6441a 100644 --- a/autotest/framework.py +++ b/autotest/framework.py @@ -92,9 +92,14 @@ def run_parallel(workspace, target, ncpus) -> Tuple[bool, List[str]]: buff = [] # parallel commands - mpiexec_cmd = ( - ["mpiexec"] + oversubscribed + ["-np", str(ncpus), target, "-p"] - ) + if get_ostag() in ["win64"]: + mpiexec_cmd = ( + ["mpiexec", "-np", str(ncpus), target, "-p"] + ) + else: + mpiexec_cmd = ( + ["mpiexec"] + oversubscribed + ["-np", str(ncpus), target, "-p"] + ) proc = Popen(mpiexec_cmd, stdout=PIPE, stderr=STDOUT, cwd=workspace) diff --git a/meson.build b/meson.build index 5589f7b43d7..0da78223a9e 100644 --- a/meson.build +++ b/meson.build @@ -72,6 +72,7 @@ if fc_id == 'intel-cl' '/Qdiag-disable:7416', # f2008 warning '/Qdiag-disable:7025', # f2008 warning '/Qdiag-disable:5268', # Line too long + '/Qdiag-disable:10448',# ifort deprecation warning ] link_args += ['/ignore:4217', # access through ddlimport might be inefficient '/ignore:4286' # same as 4217, but more general @@ -128,8 +129,11 @@ endif message('Extended build:', is_extended_build) # windows options for petsc -petsc_dir = meson.project_source_root() / '..' /'petsc-3.18.5' -petsc_arch = 'arch-ci-mswin-intel-modflow6' +petsc_dir_rel = '..' /'petsc' +petsc_dir_abs = meson.project_source_root() / '..' /'petsc' +petsc_arch = 'arch-mswin-c-opt' +petsc_compiled_rel = petsc_dir_rel / petsc_arch +petsc_compiled_abs = petsc_dir_abs / petsc_arch # on windows only with intel if build_machine.system() == 'windows' and is_extended_build @@ -149,8 +153,7 @@ if is_extended_build petsc = dependency('PETSc', required : true) else # directly look for petsc - petsc_compiled = petsc_dir / petsc_arch - petsc = fc.find_library('libpetsc', dirs: petsc_compiled / 'lib', required : true) + petsc = fc.find_library('libpetsc', dirs: petsc_compiled_abs / 'lib', required : true) endif extra_cmp_args += [ '-D__WITH_PETSC__' ] dependencies += petsc @@ -194,8 +197,8 @@ add_project_link_arguments(fc.get_supported_arguments(link_args), language: 'for if is_extended_build and build_machine.system() == 'windows' message('Compiling PETSc Fortran modules') - petsc_incdir = include_directories([petsc_dir / 'include', petsc_compiled / 'include']) - petsc_src = petsc_dir / 'src' + petsc_incdir = include_directories([petsc_dir_rel / 'include', petsc_compiled_rel / 'include']) + petsc_src = petsc_dir_abs / 'src' sources_petsc = [petsc_src / 'dm/f90-mod/petscdmdamod.F90', petsc_src / 'dm/f90-mod/petscdmmod.F90', petsc_src / 'dm/f90-mod/petscdmplexmod.F90', @@ -235,11 +238,11 @@ testdir = meson.project_source_root() / '.mf6minsim' if with_mpi mpiexec = find_program('mpiexec', required : false) if mpiexec.found() - test('Parallel version command line test', mpiexec, args : ['-n', '2', mf6exe, '-v', '-p']) - test('Parallel compiler command line test', mpiexec, args : ['-n', '2', mf6exe, '-c', '-p']) - test('Serial simulation test', mf6exe, workdir : testdir) - test('Parallel simulation test - 1 core', mpiexec, workdir : testdir, args : ['-n', '1', mf6exe, '-p']) - test('Parallel simulation test - 2 cores', mpiexec, workdir : testdir, args : ['-n', '2', mf6exe, '-p']) + test('Parallel version command line test', mpiexec, args : ['-n', '2', mf6exe, '-v', '-p'], is_parallel : false) + test('Parallel compiler command line test', mpiexec, args : ['-n', '2', mf6exe, '-c', '-p'], is_parallel : false) + test('Serial simulation test', mf6exe, workdir : testdir, is_parallel : false) + test('Parallel simulation test - 1 core', mpiexec, workdir : testdir, args : ['-n', '1', mf6exe, '-p'], is_parallel : false) + test('Parallel simulation test - 2 cores', mpiexec, workdir : testdir, args : ['-n', '2', mf6exe, '-p'], is_parallel : false) endif else test('Version command line test', mf6exe, args : ['-v',]) From 00d7d971a8826c1f9a930575fa86e1af555a1e7e Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Fri, 15 Mar 2024 18:00:45 -0500 Subject: [PATCH 065/199] feat(overland flow): SWF now works with DIS/DISV (#1675) * refactor(swf): generalize dis usage to support dis/disv * preparation for moving width out of dfw package * removal of width from dfw; starting to implement dis/disv * DIS appears to be working with SWF; new test is passing * fprettify * update latex files * remove backtracking --- autotest/test_swf_dfw.py | 2 +- autotest/test_swf_dfw_beg2022.py | 2 +- autotest/test_swf_dfw_bowl.py | 2 +- autotest/test_swf_dfw_gwf.py | 2 +- autotest/test_swf_dfw_loop.py | 2 +- autotest/test_swf_dfw_swrt2.py | 2 +- autotest/test_swf_dfw_swrt2b.py | 2 +- autotest/test_swf_dfw_swrt2dis.py | 252 ++++++++++ doc/mf6io/mf6ivar/dfn/swf-dfw.dfn | 11 - doc/mf6io/mf6ivar/dfn/swf-dis.dfn | 122 +++++ doc/mf6io/mf6ivar/dfn/swf-disl.dfn | 11 + doc/mf6io/mf6ivar/dfn/swf-disv.dfn | 204 ++++++++ doc/mf6io/mf6ivar/md/mf6ivar.md | 34 +- doc/mf6io/mf6ivar/mf6ivar.py | 2 + doc/mf6io/mf6ivar/tex/appendixA.tex | 10 + doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex | 2 - doc/mf6io/mf6ivar/tex/swf-dfw-griddata.dat | 2 - doc/mf6io/mf6ivar/tex/swf-dis-desc.tex | 41 ++ doc/mf6io/mf6ivar/tex/swf-dis-dimensions.dat | 5 + doc/mf6io/mf6ivar/tex/swf-dis-griddata.dat | 12 + doc/mf6io/mf6ivar/tex/swf-dis-options.dat | 7 + doc/mf6io/mf6ivar/tex/swf-disl-desc.tex | 2 + doc/mf6io/mf6ivar/tex/swf-disl-griddata.dat | 2 + doc/mf6io/mf6ivar/tex/swf-disv-cell2d.dat | 5 + doc/mf6io/mf6ivar/tex/swf-disv-desc.tex | 61 +++ doc/mf6io/mf6ivar/tex/swf-disv-dimensions.dat | 5 + doc/mf6io/mf6ivar/tex/swf-disv-griddata.dat | 8 + doc/mf6io/mf6ivar/tex/swf-disv-options.dat | 7 + doc/mf6io/mf6ivar/tex/swf-disv-vertices.dat | 5 + doc/mf6io/swf/namefile.tex | 2 + make/makedefaults | 4 +- make/makefile | 74 +-- msvs/mf6core.vfproj | 318 ++++++------ src/Idm/selector/IdmSwfDfnSelector.f90 | 22 + src/Idm/swf-dfwidm.f90 | 19 - src/Idm/swf-disidm.f90 | 313 ++++++++++++ src/Idm/swf-dislidm.f90 | 19 + src/Idm/swf-disvidm.f90 | 460 ++++++++++++++++++ src/Model/ModelUtilities/Connections.f90 | 95 +++- .../ModelUtilities/DiscretizationBase.f90 | 26 + src/Model/SurfaceWaterFlow/swf-dfw.f90 | 193 ++++---- src/Model/SurfaceWaterFlow/swf-disl.f90 | 147 ++++-- src/Model/SurfaceWaterFlow/swf-ic.f90 | 186 +++---- src/Model/SurfaceWaterFlow/swf-sto.f90 | 267 +++++++--- src/Model/SurfaceWaterFlow/swf-zdg.f90 | 2 +- src/Model/SurfaceWaterFlow/swf.f90 | 17 +- src/meson.build | 2 + utils/idmloader/dfns.txt | 2 + utils/mf5to6/make/makedefaults | 4 +- utils/mf5to6/make/makefile | 8 +- utils/zonebudget/make/makedefaults | 4 +- 51 files changed, 2396 insertions(+), 612 deletions(-) create mode 100644 autotest/test_swf_dfw_swrt2dis.py create mode 100644 doc/mf6io/mf6ivar/dfn/swf-dis.dfn create mode 100644 doc/mf6io/mf6ivar/dfn/swf-disv.dfn create mode 100644 doc/mf6io/mf6ivar/tex/swf-dis-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/swf-dis-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-dis-griddata.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-dis-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-disv-cell2d.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-disv-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/swf-disv-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-disv-griddata.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-disv-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-disv-vertices.dat create mode 100644 src/Idm/swf-disidm.f90 create mode 100644 src/Idm/swf-disvidm.f90 diff --git a/autotest/test_swf_dfw.py b/autotest/test_swf_dfw.py index d0f63cd5e87..a455f24beef 100644 --- a/autotest/test_swf_dfw.py +++ b/autotest/test_swf_dfw.py @@ -69,6 +69,7 @@ def build_models(idx, test): nodes=nodes, nvert=nvert, reach_length=dx, + reach_width=50., reach_bottom=0.0, toreach=toreach, # -1 gives 0 in one-based, which means outflow cell idomain=1, @@ -80,7 +81,6 @@ def build_models(idx, test): swf, print_flows=True, save_flows=True, - width=50.0, manningsn=0.035, slope=0.001, idcxs=0, diff --git a/autotest/test_swf_dfw_beg2022.py b/autotest/test_swf_dfw_beg2022.py index 2125809a620..6cf5221d7a5 100644 --- a/autotest/test_swf_dfw_beg2022.py +++ b/autotest/test_swf_dfw_beg2022.py @@ -86,6 +86,7 @@ def build_models(idx, test): nodes=nodes, nvert=nvert, reach_length=dx, + reach_width=40., reach_bottom=z, # toreach=toreach, # -1 gives 0 in one-based, which means outflow cell idomain=1, @@ -98,7 +99,6 @@ def build_models(idx, test): central_in_space=True, print_flows=True, save_flows=True, - width=40.0, manningsn=1.0 / 80.0, slope=slope, idcxs=0, diff --git a/autotest/test_swf_dfw_bowl.py b/autotest/test_swf_dfw_bowl.py index c82cbed444c..ece2695443e 100644 --- a/autotest/test_swf_dfw_bowl.py +++ b/autotest/test_swf_dfw_bowl.py @@ -105,6 +105,7 @@ def build_models(idx, test): nodes=nodes, nvert=nvert, reach_length=dx, + reach_width=1., reach_bottom=reach_bottom, idomain=1, vertices=vertices, @@ -115,7 +116,6 @@ def build_models(idx, test): swf, print_flows=True, save_flows=True, - width=1.0, manningsn=0.035, slope=1 / dx, idcxs=0, diff --git a/autotest/test_swf_dfw_gwf.py b/autotest/test_swf_dfw_gwf.py index 2225eec5a46..9c36d6cb3b3 100644 --- a/autotest/test_swf_dfw_gwf.py +++ b/autotest/test_swf_dfw_gwf.py @@ -99,6 +99,7 @@ def add_swf_model(sim): nodes=nodes, nvert=nvert, reach_length=dx, + reach_width=50., reach_bottom=0.0, toreach=toreach, # -1 gives 0 in one-based, which means outflow cell idomain=1, @@ -112,7 +113,6 @@ def add_swf_model(sim): save_flows=True, length_conversion=1.0, time_conversion=86400.0, - width=50.0, manningsn=0.035, slope=0.001, idcxs=0, diff --git a/autotest/test_swf_dfw_loop.py b/autotest/test_swf_dfw_loop.py index cd091809be1..7a2dc0520cd 100644 --- a/autotest/test_swf_dfw_loop.py +++ b/autotest/test_swf_dfw_loop.py @@ -232,6 +232,7 @@ def build_models(idx, test): nodes=nodes, nvert=nvert, reach_length=reach_length, + reach_width=1., reach_bottom=reach_bottom, # toreach=toreach, # -1 gives 0 in one-based, which means outflow cell idomain=1, @@ -247,7 +248,6 @@ def build_models(idx, test): central_in_space=True, print_flows=True, save_flows=True, - width=1.0, # cross sections defined explicitly (not fractions) manningsn=0.03, slope=0.001, idcxs=idcxs, diff --git a/autotest/test_swf_dfw_swrt2.py b/autotest/test_swf_dfw_swrt2.py index 965aa066107..b270fcf99e5 100644 --- a/autotest/test_swf_dfw_swrt2.py +++ b/autotest/test_swf_dfw_swrt2.py @@ -92,6 +92,7 @@ def build_models(idx, test): nodes=nodes, nvert=nvert, reach_length=dx, + reach_width=dx, reach_bottom=reach_bottom, idomain=1, vertices=vertices, @@ -102,7 +103,6 @@ def build_models(idx, test): swf, print_flows=True, save_flows=True, - width=dx, manningsn=0.30, slope=0.05 / 500.0, idcxs=None, diff --git a/autotest/test_swf_dfw_swrt2b.py b/autotest/test_swf_dfw_swrt2b.py index 47550a30d0f..7ed893c8d91 100644 --- a/autotest/test_swf_dfw_swrt2b.py +++ b/autotest/test_swf_dfw_swrt2b.py @@ -102,6 +102,7 @@ def build_models(idx, test): nodes=nodes, nvert=nvert, reach_length=dx, + reach_width=dx, reach_bottom=reach_bottom, idomain=1, vertices=vertices, @@ -112,7 +113,6 @@ def build_models(idx, test): swf, print_flows=True, save_flows=True, - width=dx, manningsn=0.30, slope=0.05 / 500.0, idcxs=None, diff --git a/autotest/test_swf_dfw_swrt2dis.py b/autotest/test_swf_dfw_swrt2dis.py new file mode 100644 index 00000000000..909bb041e90 --- /dev/null +++ b/autotest/test_swf_dfw_swrt2dis.py @@ -0,0 +1,252 @@ +""" + +SWR Test Problem 2 simulates two-dimensional overland flow using +a grid of rows and columns. The SWR code was compared with results +from SWIFT2D, a USGS 2D overland flow simulator. This version of +the problem uses the DIS Package as a 2d grid. The problem is set up +so that once steady conditions are achieved, the depth in each reach +should be 1.0 m. + +""" + +import os + +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +cases = [ + "swf-swr-t2-dis", +] + + +def build_models(idx, test): + dx = 500.0 + nreach = 11 + nper = 1 + perlen = [5040 * 2 * 60.0] # 7 days (in seconds) + nstp = [50] # In SWR report nstp = [5040] and tsmult is 1. + tsmult = [1.2] + + tdis_rc = [] + for i in range(nper): + tdis_rc.append((perlen[i], nstp[i], tsmult[i])) + + name = "swf" + + # build MODFLOW 6 files + ws = test.workspace + sim = flopy.mf6.MFSimulation( + sim_name=f"{name}_sim", version="mf6", exe_name="mf6", sim_ws=ws + ) + # create tdis package + tdis = flopy.mf6.ModflowTdis( + sim, time_units="SECONDS", nper=nper, perioddata=tdis_rc + ) + + # surface water model + swfname = f"{name}_model" + swf = flopy.mf6.ModflowSwf(sim, modelname=swfname, save_flows=True) + + nouter, ninner = 100, 50 + hclose, rclose, relax = 1e-8, 1e-8, 1.0 + imsswf = flopy.mf6.ModflowIms( + sim, + print_option="SUMMARY", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="DBD", + under_relaxation_theta=0.9, + under_relaxation_kappa=0.0001, + under_relaxation_gamma=0.0, + inner_maximum=ninner, + inner_dvclose=hclose, + linear_acceleration="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + # backtracking_number=5, + # backtracking_tolerance=1.0, + # backtracking_reduction_factor=0.3, + # backtracking_residual_limit=100.0, + filename=f"{swfname}.ims", + ) + sim.register_ims_package(imsswf, [swf.name]) + + # vertices = [] + # vertices = [[j, j * dx, 0.0, 0.0] for j in range(nreach + 1)] + # cell2d = [] + # for j in range(nreach): + # cell2d.append([j, 0.5, 2, j, j + 1]) + # nodes = len(cell2d) + # nvert = len(vertices) + + nlay = 1 + nrow = 11 + ncol = 11 + botm = np.empty((nlay, nrow, ncol), dtype=float) + for i in range(nrow): + botm[0, i, :] = np.linspace(1.05, 0.05, nrow) + + dis = flopy.mf6.ModflowSwfdis( + swf, + nlay=1, + nrow=11, + ncol=11, + delr=dx, + delc=dx, + top=100., + botm=botm, + ) + + # disl = flopy.mf6.ModflowSwfdisl( + # swf, + # nodes=nodes, + # nvert=nvert, + # reach_length=dx, + # reach_width=dx, + # reach_bottom=reach_bottom, + # idomain=1, + # vertices=vertices, + # cell2d=cell2d, + # ) + + dfw = flopy.mf6.ModflowSwfdfw( + swf, + print_flows=True, + save_flows=True, + manningsn=0.30, + slope=0.05 / 500.0, + idcxs=None, + ) + + sto = flopy.mf6.ModflowSwfsto( + swf, + save_flows=True, + ) + + ic = flopy.mf6.ModflowSwfic( + swf, + strt=2.05, + ) + + # output control + oc = flopy.mf6.ModflowSwfoc( + swf, + budget_filerecord=f"{swfname}.bud", + stage_filerecord=f"{swfname}.stage", + saverecord=[ + ("STAGE", "ALL"), + ("BUDGET", "ALL"), + ], + printrecord=[ + ("STAGE", "ALL"), + ("BUDGET", "ALL"), + ], + ) + + # flw + qinflow = 23.570 + spd = [(0, i, 0, qinflow) for i in range(nrow)] + flw = flopy.mf6.ModflowSwfflw( + swf, + maxbound=len(spd), + print_input=True, + print_flows=True, + stress_period_data=spd, + ) + + spd = [(0, i, ncol - 1, 1.05) for i in range(nrow)] + chd = flopy.mf6.ModflowSwfchd( + swf, + maxbound=len(spd), + print_input=True, + print_flows=True, + stress_period_data=spd, + ) + + # obs_data = { + # f"{swfname}.obs.csv": [ + # ("OBS1", "STAGE", (1,)), + # ("OBS2", "STAGE", (5,)), + # ("OBS3", "STAGE", (8,)), + # ], + # } + # obs_package = flopy.mf6.ModflowUtlobs( + # swf, + # filename=f"{swfname}.obs", + # digits=10, + # print_input=True, + # continuous=obs_data, + # ) + + return sim, None + + +def make_plot(test, mfsim): + print("making plots...") + import matplotlib.pyplot as plt + + fpth = test.workspace / f"swf_model.obs.csv" + obsvals = np.genfromtxt(fpth, names=True, delimiter=",") + + fig = plt.figure(figsize=(10, 10)) + ax = fig.add_subplot(1, 1, 1) + for irch in [1, 2, 3]: + ax.plot( + obsvals["time"] / 3600.0, + obsvals[f"OBS{irch}"], + marker="o", + mfc="none", + mec="k", + lw=0.0, + label=f"MF6 reach {irch}", + ) + # ax.plot(obsvals["time"], answer[f"STAGE00000000{irch:02d}"], "k-", label=f"SWR Reach {irch}") + ax.set_xlim(0, 30.0) + ax.set_ylim(1.2, 2.4) + plt.xlabel("time, in hours") + plt.ylabel("stage, in meters") + plt.legend() + fname = test.workspace / "swf_model.obs.1.png" + plt.savefig(fname) + + return + + +def check_output(idx, test): + print(f"evaluating model for case {idx}...") + + swfname = "swf_model" + ws = test.workspace + mfsim = flopy.mf6.MFSimulation.load(sim_ws=ws) + + makeplot = False + if makeplot: + make_plot(test, mfsim) + + # read binary stage file + fpth = test.workspace / f"{swfname}.stage" + sobj = flopy.utils.HeadFile(fpth, precision="double", text="STAGE") + stage_all = sobj.get_alldata() + + # at end of simulation, water depth should be 1.0 for all reaches + swf = mfsim.get_model(swfname) + depth = stage_all[-1] - swf.dis.botm.array + np.allclose( + depth, 1.0 + ), f"Simulated depth at end should be 1, but found {depth}" + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + ) + test.run() diff --git a/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn b/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn index a03c493b2e3..9a00dd3e6ce 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn @@ -90,17 +90,6 @@ description REPLACE obs6_filename {'{#1}': 'DFW'} # --------------------- swf dfw griddata --------------------- -block griddata -name width -type double precision -shape (nodes) -valid -reader readarray -layered false -optional -longname stream width -description real value that defines the reach width. WIDTH must be greater than zero. - block griddata name manningsn type double precision diff --git a/doc/mf6io/mf6ivar/dfn/swf-dis.dfn b/doc/mf6io/mf6ivar/dfn/swf-dis.dfn new file mode 100644 index 00000000000..bb77bac782e --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/swf-dis.dfn @@ -0,0 +1,122 @@ +# --------------------- gwe dis options --------------------- + +block options +name length_units +type string +reader urword +optional true +longname model length units +description is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. + +block options +name nogrb +type keyword +reader urword +optional true +longname do not write binary grid file +description keyword to deactivate writing of the binary grid file. + +block options +name xorigin +type double precision +reader urword +optional true +longname x-position of the model grid origin +description x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name yorigin +type double precision +reader urword +optional true +longname y-position of the model grid origin +description y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name angrot +type double precision +reader urword +optional true +longname rotation angle +description counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + + +# --------------------- gwe dis dimensions --------------------- + +block dimensions +name nlay +type integer +reader urword +optional false +longname number of layers +description is the number of layers in the model grid. +default_value 1 + +block dimensions +name nrow +type integer +reader urword +optional false +longname number of rows +description is the number of rows in the model grid. +default_value 2 + +block dimensions +name ncol +type integer +reader urword +optional false +longname number of columns +description is the number of columns in the model grid. +default_value 2 + +# --------------------- gwe dis griddata --------------------- + +block griddata +name delr +type double precision +shape (ncol) +reader readarray +longname spacing along a row +description is the column spacing in the row direction. +default_value 1.0 + +block griddata +name delc +type double precision +shape (nrow) +reader readarray +longname spacing along a column +description is the row spacing in the column direction. +default_value 1.0 + +block griddata +name top +type double precision +shape (ncol, nrow) +reader readarray +longname cell top elevation +description is the top elevation for each cell in the top model layer. +default_value 1.0 + +block griddata +name botm +type double precision +shape (ncol, nrow, nlay) +reader readarray +layered true +longname cell bottom elevation +description is the bottom elevation for each cell. +default_value 0. + +block griddata +name idomain +type integer +shape (ncol, nrow, nlay) +reader readarray +layered true +optional true +longname idomain existence array +description is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. + + diff --git a/doc/mf6io/mf6ivar/dfn/swf-disl.dfn b/doc/mf6io/mf6ivar/dfn/swf-disl.dfn index d0ba0de2a9c..800e3bf2e9b 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-disl.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-disl.dfn @@ -87,6 +87,17 @@ optional longname reach length description length for each reach +block griddata +name reach_width +type double precision +shape (nodes) +valid +reader readarray +layered false +optional +longname reach width +description real value that defines the reach width. REACH\_WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the REACH\_WIDTH value will be multiplied by the specified cross section x-fraction values. + block griddata name reach_bottom type double precision diff --git a/doc/mf6io/mf6ivar/dfn/swf-disv.dfn b/doc/mf6io/mf6ivar/dfn/swf-disv.dfn new file mode 100644 index 00000000000..376c0e2d532 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/swf-disv.dfn @@ -0,0 +1,204 @@ +# --------------------- gwt disv options --------------------- + +block options +name length_units +type string +reader urword +optional true +longname model length units +description is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. + +block options +name nogrb +type keyword +reader urword +optional true +longname do not write binary grid file +description keyword to deactivate writing of the binary grid file. + +block options +name xorigin +type double precision +reader urword +optional true +longname x-position origin of the model grid coordinate system +description x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name yorigin +type double precision +reader urword +optional true +longname y-position origin of the model grid coordinate system +description y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +block options +name angrot +type double precision +reader urword +optional true +longname rotation angle +description counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +# --------------------- gwt disv dimensions --------------------- + +block dimensions +name nlay +type integer +reader urword +optional false +longname number of layers +description is the number of layers in the model grid. + +block dimensions +name ncpl +type integer +reader urword +optional false +longname number of cells per layer +description is the number of cells per layer. This is a constant value for the grid and it applies to all layers. + +block dimensions +name nvert +type integer +reader urword +optional false +longname number of columns +description is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. + +# --------------------- gwt disv griddata --------------------- + +block griddata +name top +type double precision +shape (ncpl) +reader readarray +longname model top elevation +description is the top elevation for each cell in the top model layer. + +block griddata +name botm +type double precision +shape (ncpl, nlay) +reader readarray +layered true +longname model bottom elevation +description is the bottom elevation for each cell. + +block griddata +name idomain +type integer +shape (ncpl, nlay) +reader readarray +layered true +optional true +longname idomain existence array +description is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. + + +# --------------------- gwt disv vertices --------------------- + +block vertices +name vertices +type recarray iv xv yv +shape (nvert) +reader urword +optional false +longname vertices data +description + +block vertices +name iv +type integer +in_record true +tagged false +reader urword +optional false +longname vertex number +description is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. +numeric_index true + +block vertices +name xv +type double precision +in_record true +tagged false +reader urword +optional false +longname x-coordinate for vertex +description is the x-coordinate for the vertex. + +block vertices +name yv +type double precision +in_record true +tagged false +reader urword +optional false +longname y-coordinate for vertex +description is the y-coordinate for the vertex. + + +# --------------------- gwt disv cell2d --------------------- + +block cell2d +name cell2d +type recarray icell2d xc yc ncvert icvert +shape (ncpl) +reader urword +optional false +longname cell2d data +description + +block cell2d +name icell2d +type integer +in_record true +tagged false +reader urword +optional false +longname cell2d number +description is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. +numeric_index true + +block cell2d +name xc +type double precision +in_record true +tagged false +reader urword +optional false +longname x-coordinate for cell center +description is the x-coordinate for the cell center. + +block cell2d +name yc +type double precision +in_record true +tagged false +reader urword +optional false +longname y-coordinate for cell center +description is the y-coordinate for the cell center. + +block cell2d +name ncvert +type integer +in_record true +tagged false +reader urword +optional false +longname number of cell vertices +description is the number of vertices required to define the cell. There may be a different number of vertices for each cell. + +block cell2d +name icvert +type integer +shape (ncvert) +in_record true +tagged false +reader urword +optional false +longname array of vertex numbers +description is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices. +numeric_index true diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 703f0e87a49..187d584f141 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -1525,6 +1525,7 @@ | SWF | DISL | DIMENSIONS | NODES | INTEGER | is the number of linear cells. | | SWF | DISL | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y, z) vertex pairs used to characterize the model grid. | | SWF | DISL | GRIDDATA | REACH_LENGTH | DOUBLE PRECISION (NODES) | length for each reach | +| SWF | DISL | GRIDDATA | REACH_WIDTH | DOUBLE PRECISION (NODES) | real value that defines the reach width. REACH\_WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the REACH\_WIDTH value will be multiplied by the specified cross section x-fraction values. | | SWF | DISL | GRIDDATA | REACH_BOTTOM | DOUBLE PRECISION (NODES) | bottom elevation of surface water channel | | SWF | DISL | GRIDDATA | TOREACH | INTEGER (NODES) | index of the downstream reach. Flow from this reach is passed into the dowstream reach. For reaches that do not flow to another reach enter a 0 to toreach. | | SWF | DISL | GRIDDATA | IDOMAIN | INTEGER (NODES) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. | @@ -1536,6 +1537,38 @@ | SWF | DISL | CELL2D | FDC | DOUBLE PRECISION | is the fractional distance to the cell center. FDC is relative to the first vertex in the ICVERT array. In most cases FDC should be 0.5, which would place the center of the line segment that defines the cell. If the value of FDC is 1, the cell center would located at the last vertex. FDC values of 0 and 1 can be used to place the node at either end of the cell which can be useful for cells with boundary conditions. | | SWF | DISL | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | | SWF | DISL | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC. | +| SWF | DIS | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | +| SWF | DIS | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | +| SWF | DIS | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DIS | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DIS | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DIS | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | +| SWF | DIS | DIMENSIONS | NROW | INTEGER | is the number of rows in the model grid. | +| SWF | DIS | DIMENSIONS | NCOL | INTEGER | is the number of columns in the model grid. | +| SWF | DIS | GRIDDATA | DELR | DOUBLE PRECISION (NCOL) | is the column spacing in the row direction. | +| SWF | DIS | GRIDDATA | DELC | DOUBLE PRECISION (NROW) | is the row spacing in the column direction. | +| SWF | DIS | GRIDDATA | TOP | DOUBLE PRECISION (NCOL, NROW) | is the top elevation for each cell in the top model layer. | +| SWF | DIS | GRIDDATA | BOTM | DOUBLE PRECISION (NCOL, NROW, NLAY) | is the bottom elevation for each cell. | +| SWF | DIS | GRIDDATA | IDOMAIN | INTEGER (NCOL, NROW, NLAY) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. | +| SWF | DISV | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | +| SWF | DISV | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | +| SWF | DISV | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DISV | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DISV | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DISV | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | +| SWF | DISV | DIMENSIONS | NCPL | INTEGER | is the number of cells per layer. This is a constant value for the grid and it applies to all layers. | +| SWF | DISV | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. | +| SWF | DISV | GRIDDATA | TOP | DOUBLE PRECISION (NCPL) | is the top elevation for each cell in the top model layer. | +| SWF | DISV | GRIDDATA | BOTM | DOUBLE PRECISION (NCPL, NLAY) | is the bottom elevation for each cell. | +| SWF | DISV | GRIDDATA | IDOMAIN | INTEGER (NCPL, NLAY) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. | +| SWF | DISV | VERTICES | IV | INTEGER | is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. | +| SWF | DISV | VERTICES | XV | DOUBLE PRECISION | is the x-coordinate for the vertex. | +| SWF | DISV | VERTICES | YV | DOUBLE PRECISION | is the y-coordinate for the vertex. | +| SWF | DISV | CELL2D | ICELL2D | INTEGER | is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. | +| SWF | DISV | CELL2D | XC | DOUBLE PRECISION | is the x-coordinate for the cell center. | +| SWF | DISV | CELL2D | YC | DOUBLE PRECISION | is the y-coordinate for the cell center. | +| SWF | DISV | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | +| SWF | DISV | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices. | | SWF | DFW | OPTIONS | CENTRAL_IN_SPACE | KEYWORD | keyword to indicate conductance should be calculated using central-in-space weighting instead of the default upstream weighting approach. This option should be used with caution as it does not work well unless all of the stream reaches are saturated. With this option, there is no way for water to flow into a dry reach from connected reaches. | | SWF | DFW | OPTIONS | LENGTH_CONVERSION | DOUBLE PRECISION | real value that is used to convert user-specified Manning's roughness coefficients from meters to model length units. LENGTH\_CONVERSION should be set to 3.28081, 1.0, and 100.0 when using length units (LENGTH\_UNITS) of feet, meters, or centimeters in the simulation, respectively. LENGTH\_CONVERSION does not need to be specified if LENGTH\_UNITS are meters. | | SWF | DFW | OPTIONS | TIME_CONVERSION | DOUBLE PRECISION | real value that is used to convert user-specified Manning's roughness coefficients from seconds to model time units. TIME\_CONVERSION should be set to 1.0, 60.0, 3,600.0, 86,400.0, and 31,557,600.0 when using time units (TIME\_UNITS) of seconds, minutes, hours, days, or years in the simulation, respectively. TIME\_CONVERSION does not need to be specified if TIME\_UNITS are seconds. | @@ -1544,7 +1577,6 @@ | SWF | DFW | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | | SWF | DFW | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | | SWF | DFW | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the DFW package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the DFW package. | -| SWF | DFW | GRIDDATA | WIDTH | DOUBLE PRECISION (NODES) | real value that defines the reach width. WIDTH must be greater than zero. | | SWF | DFW | GRIDDATA | MANNINGSN | DOUBLE PRECISION (NODES) | mannings roughness coefficient | | SWF | DFW | GRIDDATA | SLOPE | DOUBLE PRECISION (NODES) | bottom slope of the river bed | | SWF | DFW | GRIDDATA | IDCXS | INTEGER (NODES) | integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide. | diff --git a/doc/mf6io/mf6ivar/mf6ivar.py b/doc/mf6io/mf6ivar/mf6ivar.py index 4c0fc97d51a..cff367816d5 100644 --- a/doc/mf6io/mf6ivar/mf6ivar.py +++ b/doc/mf6io/mf6ivar/mf6ivar.py @@ -761,6 +761,8 @@ def write_appendix(texdir, allblocks): "gwe-fmi", "swf-nam", "swf-disl", + "swf-dis", + "swf-disv", "swf-dfw", "swf-cxs", "swf-ic", diff --git a/doc/mf6io/mf6ivar/tex/appendixA.tex b/doc/mf6io/mf6ivar/tex/appendixA.tex index 6e8beee38ab..ad1d2529469 100644 --- a/doc/mf6io/mf6ivar/tex/appendixA.tex +++ b/doc/mf6io/mf6ivar/tex/appendixA.tex @@ -325,6 +325,16 @@ SWF & DISL & VERTICES & yes \\ SWF & DISL & CELL2D & yes \\ \hline +SWF & DIS & OPTIONS & yes \\ +SWF & DIS & DIMENSIONS & yes \\ +SWF & DIS & GRIDDATA & no \\ +\hline +SWF & DISV & OPTIONS & yes \\ +SWF & DISV & DIMENSIONS & yes \\ +SWF & DISV & GRIDDATA & no \\ +SWF & DISV & VERTICES & yes \\ +SWF & DISV & CELL2D & yes \\ +\hline SWF & DFW & OPTIONS & yes \\ SWF & DFW & GRIDDATA & no \\ \hline diff --git a/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex b/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex index 103a93ea34f..51abe6802f7 100644 --- a/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex @@ -23,8 +23,6 @@ \item \textbf{Block: GRIDDATA} \begin{description} -\item \texttt{width}---real value that defines the reach width. WIDTH must be greater than zero. - \item \texttt{manningsn}---mannings roughness coefficient \item \texttt{slope}---bottom slope of the river bed diff --git a/doc/mf6io/mf6ivar/tex/swf-dfw-griddata.dat b/doc/mf6io/mf6ivar/tex/swf-dfw-griddata.dat index 8357702fb8f..959b5b72cf2 100644 --- a/doc/mf6io/mf6ivar/tex/swf-dfw-griddata.dat +++ b/doc/mf6io/mf6ivar/tex/swf-dfw-griddata.dat @@ -1,6 +1,4 @@ BEGIN GRIDDATA - WIDTH - -- READARRAY MANNINGSN -- READARRAY SLOPE diff --git a/doc/mf6io/mf6ivar/tex/swf-dis-desc.tex b/doc/mf6io/mf6ivar/tex/swf-dis-desc.tex new file mode 100644 index 00000000000..afef5a5fa76 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-dis-desc.tex @@ -0,0 +1,41 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{length\_units}---is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. + +\item \texttt{NOGRB}---keyword to deactivate writing of the binary grid file. + +\item \texttt{xorigin}---x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\item \texttt{yorigin}---y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{nlay}---is the number of layers in the model grid. + +\item \texttt{nrow}---is the number of rows in the model grid. + +\item \texttt{ncol}---is the number of columns in the model grid. + +\end{description} +\item \textbf{Block: GRIDDATA} + +\begin{description} +\item \texttt{delr}---is the column spacing in the row direction. + +\item \texttt{delc}---is the row spacing in the column direction. + +\item \texttt{top}---is the top elevation for each cell in the top model layer. + +\item \texttt{botm}---is the bottom elevation for each cell. + +\item \texttt{idomain}---is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/swf-dis-dimensions.dat b/doc/mf6io/mf6ivar/tex/swf-dis-dimensions.dat new file mode 100644 index 00000000000..227d0e1f799 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-dis-dimensions.dat @@ -0,0 +1,5 @@ +BEGIN DIMENSIONS + NLAY + NROW + NCOL +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-dis-griddata.dat b/doc/mf6io/mf6ivar/tex/swf-dis-griddata.dat new file mode 100644 index 00000000000..daae94c0ee3 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-dis-griddata.dat @@ -0,0 +1,12 @@ +BEGIN GRIDDATA + DELR + -- READARRAY + DELC + -- READARRAY + TOP + -- READARRAY + BOTM [LAYERED] + -- READARRAY + [IDOMAIN [LAYERED] + -- READARRAY] +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/swf-dis-options.dat b/doc/mf6io/mf6ivar/tex/swf-dis-options.dat new file mode 100644 index 00000000000..67e3ed895ae --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-dis-options.dat @@ -0,0 +1,7 @@ +BEGIN OPTIONS + [LENGTH_UNITS ] + [NOGRB] + [XORIGIN ] + [YORIGIN ] + [ANGROT ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-disl-desc.tex b/doc/mf6io/mf6ivar/tex/swf-disl-desc.tex index f9a3460ea30..b5b55f90221 100644 --- a/doc/mf6io/mf6ivar/tex/swf-disl-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-disl-desc.tex @@ -31,6 +31,8 @@ \begin{description} \item \texttt{reach\_length}---length for each reach +\item \texttt{reach\_width}---real value that defines the reach width. REACH\_WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the REACH\_WIDTH value will be multiplied by the specified cross section x-fraction values. + \item \texttt{reach\_bottom}---bottom elevation of surface water channel \item \texttt{toreach}---index of the downstream reach. Flow from this reach is passed into the dowstream reach. For reaches that do not flow to another reach enter a 0 to toreach. diff --git a/doc/mf6io/mf6ivar/tex/swf-disl-griddata.dat b/doc/mf6io/mf6ivar/tex/swf-disl-griddata.dat index cc95929f605..da2a23a4e67 100644 --- a/doc/mf6io/mf6ivar/tex/swf-disl-griddata.dat +++ b/doc/mf6io/mf6ivar/tex/swf-disl-griddata.dat @@ -1,6 +1,8 @@ BEGIN GRIDDATA REACH_LENGTH -- READARRAY + REACH_WIDTH + -- READARRAY REACH_BOTTOM -- READARRAY [TOREACH diff --git a/doc/mf6io/mf6ivar/tex/swf-disv-cell2d.dat b/doc/mf6io/mf6ivar/tex/swf-disv-cell2d.dat new file mode 100644 index 00000000000..27900d67235 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-disv-cell2d.dat @@ -0,0 +1,5 @@ +BEGIN CELL2D + + + ... +END CELL2D diff --git a/doc/mf6io/mf6ivar/tex/swf-disv-desc.tex b/doc/mf6io/mf6ivar/tex/swf-disv-desc.tex new file mode 100644 index 00000000000..dac7917328f --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-disv-desc.tex @@ -0,0 +1,61 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{length\_units}---is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. + +\item \texttt{NOGRB}---keyword to deactivate writing of the binary grid file. + +\item \texttt{xorigin}---x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\item \texttt{yorigin}---y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{nlay}---is the number of layers in the model grid. + +\item \texttt{ncpl}---is the number of cells per layer. This is a constant value for the grid and it applies to all layers. + +\item \texttt{nvert}---is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. + +\end{description} +\item \textbf{Block: GRIDDATA} + +\begin{description} +\item \texttt{top}---is the top elevation for each cell in the top model layer. + +\item \texttt{botm}---is the bottom elevation for each cell. + +\item \texttt{idomain}---is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. + +\end{description} +\item \textbf{Block: VERTICES} + +\begin{description} +\item \texttt{iv}---is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. + +\item \texttt{xv}---is the x-coordinate for the vertex. + +\item \texttt{yv}---is the y-coordinate for the vertex. + +\end{description} +\item \textbf{Block: CELL2D} + +\begin{description} +\item \texttt{icell2d}---is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. + +\item \texttt{xc}---is the x-coordinate for the cell center. + +\item \texttt{yc}---is the y-coordinate for the cell center. + +\item \texttt{ncvert}---is the number of vertices required to define the cell. There may be a different number of vertices for each cell. + +\item \texttt{icvert}---is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/swf-disv-dimensions.dat b/doc/mf6io/mf6ivar/tex/swf-disv-dimensions.dat new file mode 100644 index 00000000000..b05791a77b3 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-disv-dimensions.dat @@ -0,0 +1,5 @@ +BEGIN DIMENSIONS + NLAY + NCPL + NVERT +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-disv-griddata.dat b/doc/mf6io/mf6ivar/tex/swf-disv-griddata.dat new file mode 100644 index 00000000000..e263cb1d7bb --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-disv-griddata.dat @@ -0,0 +1,8 @@ +BEGIN GRIDDATA + TOP + -- READARRAY + BOTM [LAYERED] + -- READARRAY + [IDOMAIN [LAYERED] + -- READARRAY] +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/swf-disv-options.dat b/doc/mf6io/mf6ivar/tex/swf-disv-options.dat new file mode 100644 index 00000000000..67e3ed895ae --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-disv-options.dat @@ -0,0 +1,7 @@ +BEGIN OPTIONS + [LENGTH_UNITS ] + [NOGRB] + [XORIGIN ] + [YORIGIN ] + [ANGROT ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-disv-vertices.dat b/doc/mf6io/mf6ivar/tex/swf-disv-vertices.dat new file mode 100644 index 00000000000..6831f23b5ff --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-disv-vertices.dat @@ -0,0 +1,5 @@ +BEGIN VERTICES + + + ... +END VERTICES diff --git a/doc/mf6io/swf/namefile.tex b/doc/mf6io/swf/namefile.tex index a49780ef249..9cadf7e30a3 100644 --- a/doc/mf6io/swf/namefile.tex +++ b/doc/mf6io/swf/namefile.tex @@ -23,6 +23,8 @@ \subsubsection{Explanation of Variables} Ftype & Input File Description & \texttt{Pname}\\ \hline DISL6 & Line Network Discretization Input File \\ +DIS6 & Structured Grid Discretization Input File \\ +DISV6 & Discretization by Vertices Input File \\ DFW6 & Diffusive Wave Package \\ CXS6 & Cross Section Package \\ OC6 & Output Control Option \\ diff --git a/make/makedefaults b/make/makedefaults index 0e275ee6477..3890e49c6ca 100644 --- a/make/makedefaults +++ b/make/makedefaults @@ -57,11 +57,11 @@ OPTLEVEL ?= -O2 # set the fortran flags ifeq ($(detected_OS), Windows) ifeq ($(FC), gfortran) - FFLAGS ?= -static -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid -fall-intrinsics -pedantic -Wcharacter-truncation $(OS_macro) -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -std=f2008 -cpp + FFLAGS ?= -static -fbacktrace $(OS_macro) -fall-intrinsics -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -pedantic -std=f2008 -Wcharacter-truncation -cpp endif else ifeq ($(FC), gfortran) - FFLAGS ?= -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid -fall-intrinsics -pedantic -Wcharacter-truncation $(OS_macro) -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -std=f2008 -cpp + FFLAGS ?= -fbacktrace $(OS_macro) -fall-intrinsics -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -pedantic -std=f2008 -Wcharacter-truncation -cpp endif ifeq ($(FC), $(filter $(FC), ifort mpiifort)) FFLAGS ?= -no-heap-arrays -fpe0 -traceback -Qdiag-disable:7416 -Qdiag-disable:7025 -Qdiag-disable:5268 -fpp diff --git a/make/makefile b/make/makefile index 424ef2c76b5..6813456df50 100644 --- a/make/makefile +++ b/make/makefile @@ -5,42 +5,42 @@ include ./makedefaults # Define the source file directories SOURCEDIR1=../src -SOURCEDIR2=../src/Exchange -SOURCEDIR3=../src/Idm -SOURCEDIR4=../src/Idm/selector -SOURCEDIR5=../src/Timing -SOURCEDIR6=../src/Model -SOURCEDIR7=../src/Model/Connection -SOURCEDIR8=../src/Model/Discretization -SOURCEDIR9=../src/Model/ModelUtilities -SOURCEDIR10=../src/Model/GroundWaterFlow -SOURCEDIR11=../src/Model/Geometry -SOURCEDIR12=../src/Model/TransportModel -SOURCEDIR13=../src/Model/GroundWaterTransport -SOURCEDIR14=../src/Model/SurfaceWaterFlow -SOURCEDIR15=../src/Model/ParticleTracking -SOURCEDIR16=../src/Model/GroundWaterEnergy -SOURCEDIR17=../src/Solution -SOURCEDIR18=../src/Solution/ParticleTracker -SOURCEDIR19=../src/Solution/LinearMethods -SOURCEDIR20=../src/Solution/PETSc -SOURCEDIR21=../src/Distributed -SOURCEDIR22=../src/Utilities -SOURCEDIR23=../src/Utilities/TimeSeries -SOURCEDIR24=../src/Utilities/Idm -SOURCEDIR25=../src/Utilities/Idm/mf6blockfile -SOURCEDIR26=../src/Utilities/ArrayRead -SOURCEDIR27=../src/Utilities/Memory -SOURCEDIR28=../src/Utilities/Matrix -SOURCEDIR29=../src/Utilities/Vector -SOURCEDIR30=../src/Utilities/Observation -SOURCEDIR31=../src/Utilities/OutputControl -SOURCEDIR32=../src/Utilities/Libraries -SOURCEDIR33=../src/Utilities/Libraries/rcm -SOURCEDIR34=../src/Utilities/Libraries/sparskit2 -SOURCEDIR35=../src/Utilities/Libraries/sparsekit -SOURCEDIR36=../src/Utilities/Libraries/blas -SOURCEDIR37=../src/Utilities/Libraries/daglib +SOURCEDIR2=../src/Idm +SOURCEDIR3=../src/Idm/selector +SOURCEDIR4=../src/Exchange +SOURCEDIR5=../src/Distributed +SOURCEDIR6=../src/Solution +SOURCEDIR7=../src/Solution/LinearMethods +SOURCEDIR8=../src/Solution/ParticleTracker +SOURCEDIR9=../src/Solution/PETSc +SOURCEDIR10=../src/Timing +SOURCEDIR11=../src/Utilities +SOURCEDIR12=../src/Utilities/Idm +SOURCEDIR13=../src/Utilities/Idm/mf6blockfile +SOURCEDIR14=../src/Utilities/TimeSeries +SOURCEDIR15=../src/Utilities/Memory +SOURCEDIR16=../src/Utilities/OutputControl +SOURCEDIR17=../src/Utilities/ArrayRead +SOURCEDIR18=../src/Utilities/Libraries +SOURCEDIR19=../src/Utilities/Libraries/rcm +SOURCEDIR20=../src/Utilities/Libraries/blas +SOURCEDIR21=../src/Utilities/Libraries/sparskit2 +SOURCEDIR22=../src/Utilities/Libraries/daglib +SOURCEDIR23=../src/Utilities/Libraries/sparsekit +SOURCEDIR24=../src/Utilities/Vector +SOURCEDIR25=../src/Utilities/Matrix +SOURCEDIR26=../src/Utilities/Observation +SOURCEDIR27=../src/Model +SOURCEDIR28=../src/Model/Connection +SOURCEDIR29=../src/Model/ParticleTracking +SOURCEDIR30=../src/Model/SurfaceWaterFlow +SOURCEDIR31=../src/Model/GroundWaterTransport +SOURCEDIR32=../src/Model/ModelUtilities +SOURCEDIR33=../src/Model/GroundWaterFlow +SOURCEDIR34=../src/Model/Discretization +SOURCEDIR35=../src/Model/TransportModel +SOURCEDIR36=../src/Model/Geometry +SOURCEDIR37=../src/Model/GroundWaterEnergy VPATH = \ ${SOURCEDIR1} \ @@ -107,7 +107,9 @@ $(OBJDIR)/swf-zdgidm.o \ $(OBJDIR)/swf-namidm.o \ $(OBJDIR)/swf-icidm.o \ $(OBJDIR)/swf-flwidm.o \ +$(OBJDIR)/swf-disvidm.o \ $(OBJDIR)/swf-dislidm.o \ +$(OBJDIR)/swf-disidm.o \ $(OBJDIR)/swf-dfwidm.o \ $(OBJDIR)/swf-cxsidm.o \ $(OBJDIR)/swf-chdidm.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index d56119c92ff..2e13e476422 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -2,44 +2,50 @@ - + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - + + + + + + + + + + @@ -82,13 +88,13 @@ - + - + - + - + @@ -103,27 +109,56 @@ + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + - + - + @@ -133,52 +168,22 @@ - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + @@ -200,7 +205,6 @@ - @@ -208,16 +212,16 @@ - + + - + + + - - - @@ -233,15 +237,14 @@ - - + + - @@ -250,27 +253,8 @@ - - - - - - - - - - - - - - - - - - - - - + + @@ -295,14 +279,31 @@ - + + + + + + + + + + + + + + + + + + + - @@ -310,35 +311,20 @@ - + + - + - - - - - - - - - - - - - - - - - - + + @@ -363,19 +349,35 @@ + + + + + + + + + + + + + + + + - + - + - + - + @@ -384,17 +386,16 @@ - + - + - + - + - @@ -485,23 +486,23 @@ - + - + - + - + - + - + - + - + @@ -535,13 +536,14 @@ - + - + - + - - - - + + + + + diff --git a/src/Idm/selector/IdmSwfDfnSelector.f90 b/src/Idm/selector/IdmSwfDfnSelector.f90 index fc55ac514c7..9fd24a5146a 100644 --- a/src/Idm/selector/IdmSwfDfnSelector.f90 +++ b/src/Idm/selector/IdmSwfDfnSelector.f90 @@ -7,6 +7,8 @@ module IdmSwfDfnSelectorModule InputBlockDefinitionType use SwfNamInputModule use SwfDislInputModule + use SwfDisInputModule + use SwfDisvInputModule use SwfCxsInputModule use SwfDfwInputModule use SwfIcInputModule @@ -45,6 +47,10 @@ function swf_param_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, swf_nam_param_definitions) case ('DISL') call set_param_pointer(input_definition, swf_disl_param_definitions) + case ('DIS') + call set_param_pointer(input_definition, swf_dis_param_definitions) + case ('DISV') + call set_param_pointer(input_definition, swf_disv_param_definitions) case ('CXS') call set_param_pointer(input_definition, swf_cxs_param_definitions) case ('DFW') @@ -71,6 +77,10 @@ function swf_aggregate_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, swf_nam_aggregate_definitions) case ('DISL') call set_param_pointer(input_definition, swf_disl_aggregate_definitions) + case ('DIS') + call set_param_pointer(input_definition, swf_dis_aggregate_definitions) + case ('DISV') + call set_param_pointer(input_definition, swf_disv_aggregate_definitions) case ('CXS') call set_param_pointer(input_definition, swf_cxs_aggregate_definitions) case ('DFW') @@ -97,6 +107,10 @@ function swf_block_definitions(subcomponent) result(input_definition) call set_block_pointer(input_definition, swf_nam_block_definitions) case ('DISL') call set_block_pointer(input_definition, swf_disl_block_definitions) + case ('DIS') + call set_block_pointer(input_definition, swf_dis_block_definitions) + case ('DISV') + call set_block_pointer(input_definition, swf_disv_block_definitions) case ('CXS') call set_block_pointer(input_definition, swf_cxs_block_definitions) case ('DFW') @@ -122,6 +136,10 @@ function swf_idm_multi_package(subcomponent) result(multi_package) multi_package = swf_nam_multi_package case ('DISL') multi_package = swf_disl_multi_package + case ('DIS') + multi_package = swf_dis_multi_package + case ('DISV') + multi_package = swf_disv_multi_package case ('CXS') multi_package = swf_cxs_multi_package case ('DFW') @@ -151,6 +169,10 @@ function swf_idm_integrated(subcomponent) result(integrated) integrated = .true. case ('DISL') integrated = .true. + case ('DIS') + integrated = .true. + case ('DISV') + integrated = .true. case ('CXS') integrated = .true. case ('DFW') diff --git a/src/Idm/swf-dfwidm.f90 b/src/Idm/swf-dfwidm.f90 index 57c6a7d55e3..15729b20e03 100644 --- a/src/Idm/swf-dfwidm.f90 +++ b/src/Idm/swf-dfwidm.f90 @@ -20,7 +20,6 @@ module SwfDfwInputModule logical :: obs6 = .false. logical :: filein = .false. logical :: obs6_filename = .false. - logical :: width = .false. logical :: manningsn = .false. logical :: slope = .false. logical :: idcxs = .false. @@ -181,23 +180,6 @@ module SwfDfwInputModule .false. & ! timeseries ) - type(InputParamDefinitionType), parameter :: & - swfdfw_width = InputParamDefinitionType & - ( & - 'SWF', & ! component - 'DFW', & ! subcomponent - 'GRIDDATA', & ! block - 'WIDTH', & ! tag name - 'WIDTH', & ! fortran variable - 'DOUBLE1D', & ! type - 'NODES', & ! shape - .true., & ! required - .false., & ! multi-record - .false., & ! preserve case - .false., & ! layered - .false. & ! timeseries - ) - type(InputParamDefinitionType), parameter :: & swfdfw_manningsn = InputParamDefinitionType & ( & @@ -261,7 +243,6 @@ module SwfDfwInputModule swfdfw_obs6, & swfdfw_filein, & swfdfw_obs6_filename, & - swfdfw_width, & swfdfw_manningsn, & swfdfw_slope, & swfdfw_idcxs & diff --git a/src/Idm/swf-disidm.f90 b/src/Idm/swf-disidm.f90 new file mode 100644 index 00000000000..5f903c4b5ed --- /dev/null +++ b/src/Idm/swf-disidm.f90 @@ -0,0 +1,313 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module SwfDisInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public swf_dis_param_definitions + public swf_dis_aggregate_definitions + public swf_dis_block_definitions + public SwfDisParamFoundType + public swf_dis_multi_package + + type SwfDisParamFoundType + logical :: length_units = .false. + logical :: nogrb = .false. + logical :: xorigin = .false. + logical :: yorigin = .false. + logical :: angrot = .false. + logical :: nlay = .false. + logical :: nrow = .false. + logical :: ncol = .false. + logical :: delr = .false. + logical :: delc = .false. + logical :: top = .false. + logical :: botm = .false. + logical :: idomain = .false. + end type SwfDisParamFoundType + + logical :: swf_dis_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + swfdis_length_units = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'LENGTH_UNITS', & ! tag name + 'LENGTH_UNITS', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis_nogrb = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'NOGRB', & ! tag name + 'NOGRB', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis_xorigin = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'XORIGIN', & ! tag name + 'XORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis_yorigin = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'YORIGIN', & ! tag name + 'YORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis_angrot = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'ANGROT', & ! tag name + 'ANGROT', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis_nlay = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS', & ! subcomponent + 'DIMENSIONS', & ! block + 'NLAY', & ! tag name + 'NLAY', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis_nrow = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS', & ! subcomponent + 'DIMENSIONS', & ! block + 'NROW', & ! tag name + 'NROW', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis_ncol = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS', & ! subcomponent + 'DIMENSIONS', & ! block + 'NCOL', & ! tag name + 'NCOL', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis_delr = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS', & ! subcomponent + 'GRIDDATA', & ! block + 'DELR', & ! tag name + 'DELR', & ! fortran variable + 'DOUBLE1D', & ! type + 'NCOL', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis_delc = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS', & ! subcomponent + 'GRIDDATA', & ! block + 'DELC', & ! tag name + 'DELC', & ! fortran variable + 'DOUBLE1D', & ! type + 'NROW', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis_top = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS', & ! subcomponent + 'GRIDDATA', & ! block + 'TOP', & ! tag name + 'TOP', & ! fortran variable + 'DOUBLE2D', & ! type + 'NCOL NROW', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis_botm = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS', & ! subcomponent + 'GRIDDATA', & ! block + 'BOTM', & ! tag name + 'BOTM', & ! fortran variable + 'DOUBLE3D', & ! type + 'NCOL NROW NLAY', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis_idomain = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS', & ! subcomponent + 'GRIDDATA', & ! block + 'IDOMAIN', & ! tag name + 'IDOMAIN', & ! fortran variable + 'INTEGER3D', & ! type + 'NCOL NROW NLAY', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_dis_param_definitions(*) = & + [ & + swfdis_length_units, & + swfdis_nogrb, & + swfdis_xorigin, & + swfdis_yorigin, & + swfdis_angrot, & + swfdis_nlay, & + swfdis_nrow, & + swfdis_ncol, & + swfdis_delr, & + swfdis_delc, & + swfdis_top, & + swfdis_botm, & + swfdis_idomain & + ] + + type(InputParamDefinitionType), parameter :: & + swf_dis_aggregate_definitions(*) = & + [ & + InputParamDefinitionType & + ( & + '', & ! component + '', & ! subcomponent + '', & ! block + '', & ! tag name + '', & ! fortran variable + '', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) & + ] + + type(InputBlockDefinitionType), parameter :: & + swf_dis_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'GRIDDATA', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module SwfDisInputModule diff --git a/src/Idm/swf-dislidm.f90 b/src/Idm/swf-dislidm.f90 index 6095075646c..18e31b2bfb1 100644 --- a/src/Idm/swf-dislidm.f90 +++ b/src/Idm/swf-dislidm.f90 @@ -21,6 +21,7 @@ module SwfDislInputModule logical :: nodes = .false. logical :: nvert = .false. logical :: reach_length = .false. + logical :: reach_width = .false. logical :: reach_bottom = .false. logical :: toreach = .false. logical :: idomain = .false. @@ -206,6 +207,23 @@ module SwfDislInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + swfdisl_reach_width = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISL', & ! subcomponent + 'GRIDDATA', & ! block + 'REACH_WIDTH', & ! tag name + 'REACH_WIDTH', & ! fortran variable + 'DOUBLE1D', & ! type + 'NODES', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & swfdisl_reach_bottom = InputParamDefinitionType & ( & @@ -406,6 +424,7 @@ module SwfDislInputModule swfdisl_nodes, & swfdisl_nvert, & swfdisl_reach_length, & + swfdisl_reach_width, & swfdisl_reach_bottom, & swfdisl_toreach, & swfdisl_idomain, & diff --git a/src/Idm/swf-disvidm.f90 b/src/Idm/swf-disvidm.f90 new file mode 100644 index 00000000000..8a368e23f3d --- /dev/null +++ b/src/Idm/swf-disvidm.f90 @@ -0,0 +1,460 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module SwfDisvInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public swf_disv_param_definitions + public swf_disv_aggregate_definitions + public swf_disv_block_definitions + public SwfDisvParamFoundType + public swf_disv_multi_package + + type SwfDisvParamFoundType + logical :: length_units = .false. + logical :: nogrb = .false. + logical :: xorigin = .false. + logical :: yorigin = .false. + logical :: angrot = .false. + logical :: nlay = .false. + logical :: ncpl = .false. + logical :: nvert = .false. + logical :: top = .false. + logical :: botm = .false. + logical :: idomain = .false. + logical :: iv = .false. + logical :: xv = .false. + logical :: yv = .false. + logical :: icell2d = .false. + logical :: xc = .false. + logical :: yc = .false. + logical :: ncvert = .false. + logical :: icvert = .false. + end type SwfDisvParamFoundType + + logical :: swf_disv_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + swfdisv_length_units = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'LENGTH_UNITS', & ! tag name + 'LENGTH_UNITS', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_nogrb = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'NOGRB', & ! tag name + 'NOGRB', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_xorigin = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'XORIGIN', & ! tag name + 'XORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_yorigin = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'YORIGIN', & ! tag name + 'YORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_angrot = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'ANGROT', & ! tag name + 'ANGROT', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_nlay = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'DIMENSIONS', & ! block + 'NLAY', & ! tag name + 'NLAY', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_ncpl = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'DIMENSIONS', & ! block + 'NCPL', & ! tag name + 'NCPL', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_nvert = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'DIMENSIONS', & ! block + 'NVERT', & ! tag name + 'NVERT', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_top = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'GRIDDATA', & ! block + 'TOP', & ! tag name + 'TOP', & ! fortran variable + 'DOUBLE1D', & ! type + 'NCPL', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_botm = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'GRIDDATA', & ! block + 'BOTM', & ! tag name + 'BOTM', & ! fortran variable + 'DOUBLE2D', & ! type + 'NCPL NLAY', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_idomain = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'GRIDDATA', & ! block + 'IDOMAIN', & ! tag name + 'IDOMAIN', & ! fortran variable + 'INTEGER2D', & ! type + 'NCPL NLAY', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .true., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_iv = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'VERTICES', & ! block + 'IV', & ! tag name + 'IV', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_xv = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'VERTICES', & ! block + 'XV', & ! tag name + 'XV', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_yv = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'VERTICES', & ! block + 'YV', & ! tag name + 'YV', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_icell2d = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'ICELL2D', & ! tag name + 'ICELL2D', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_xc = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'XC', & ! tag name + 'XC', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_yc = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'YC', & ! tag name + 'YC', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_ncvert = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'NCVERT', & ! tag name + 'NCVERT', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_icvert = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'ICVERT', & ! tag name + 'ICVERT', & ! fortran variable + 'INTEGER1D', & ! type + 'NCVERT', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_disv_param_definitions(*) = & + [ & + swfdisv_length_units, & + swfdisv_nogrb, & + swfdisv_xorigin, & + swfdisv_yorigin, & + swfdisv_angrot, & + swfdisv_nlay, & + swfdisv_ncpl, & + swfdisv_nvert, & + swfdisv_top, & + swfdisv_botm, & + swfdisv_idomain, & + swfdisv_iv, & + swfdisv_xv, & + swfdisv_yv, & + swfdisv_icell2d, & + swfdisv_xc, & + swfdisv_yc, & + swfdisv_ncvert, & + swfdisv_icvert & + ] + + type(InputParamDefinitionType), parameter :: & + swfdisv_vertices = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'VERTICES', & ! block + 'VERTICES', & ! tag name + 'VERTICES', & ! fortran variable + 'RECARRAY IV XV YV', & ! type + 'NVERT', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdisv_cell2d = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'CELL2D', & ! block + 'CELL2D', & ! tag name + 'CELL2D', & ! fortran variable + 'RECARRAY ICELL2D XC YC NCVERT ICVERT', & ! type + 'NCPL', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_disv_aggregate_definitions(*) = & + [ & + swfdisv_vertices, & + swfdisv_cell2d & + ] + + type(InputBlockDefinitionType), parameter :: & + swf_disv_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'GRIDDATA', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'VERTICES', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'CELL2D', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module SwfDisvInputModule diff --git a/src/Model/ModelUtilities/Connections.f90 b/src/Model/ModelUtilities/Connections.f90 index ab673bbc912..f865d0373b2 100644 --- a/src/Model/ModelUtilities/Connections.f90 +++ b/src/Model/ModelUtilities/Connections.f90 @@ -2,7 +2,7 @@ module ConnectionsModule use ArrayReadersModule, only: ReadArray use KindModule, only: DP, I4B - use ConstantsModule, only: LENMODELNAME, LENMEMPATH + use ConstantsModule, only: LENMODELNAME, LENMEMPATH, DHALF use MessageModule, only: write_message use SimVariablesModule, only: errmsg use BlockParserModule, only: BlockParserType @@ -955,49 +955,54 @@ end subroutine disuconnections !> @brief procedure to fill the connections object for a disl package !! - !! todo: No handling yet of cl1, cl2, hwva, etc. for disl as they are not needed - !! and only unreduced disl grids are allowed at the moment + !! todo: Still need to handle hwva + !! todo: Only unreduced disl grids are allowed at the moment !! !< - subroutine dislconnections(this, name_model, toreach) + subroutine dislconnections(this, name_model, toreach, reach_length) ! -- modules use MemoryManagerModule, only: mem_deallocate, mem_setptr use SparseModule, only: sparsematrix ! -- dummy - class(ConnectionsType) :: this - character(len=*), intent(in) :: name_model - integer(I4B), dimension(:), intent(in) :: toreach + class(ConnectionsType) :: this !< object + character(len=*), intent(in) :: name_model !< name of model + integer(I4B), dimension(:), intent(in) :: toreach !< dowstream reach number + real(DP), dimension(:), intent(in) :: reach_length !< length of each reach ! -- local type(sparsematrix) :: sparse integer(I4B) :: ierror - ! - ! -- Allocate scalars + + ! Allocate scalars call this%allocate_scalars(name_model) - ! - ! -- Set scalars + + ! Set scalars this%nodes = size(toreach) this%ianglex = 0 - ! - ! -- create sparse matrix object using toreach - ! and fill ia and ja + + ! Create sparse matrix object using toreach + ! and fill ia and ja call sparse_from_toreach(toreach, sparse) this%nja = sparse%nnz this%njas = (this%nja - this%nodes) / 2 - ! - ! -- Allocate index arrays of size nja and symmetric arrays + + ! Allocate index arrays of size nja and symmetric arrays call this%allocate_arrays() - ! - ! -- Fill the IA and JA arrays from sparse, then destroy sparse + + ! Fill the IA and JA arrays from sparse, then destroy sparse call sparse%sort() call sparse%filliaja(this%ia, this%ja, ierror) call sparse%destroy() - ! - ! -- fill the isym and jas arrays + + ! Fill the isym and jas arrays call fillisym(this%nodes, this%nja, this%ia, this%ja, this%isym) call filljas(this%nodes, this%nja, this%ia, this%ja, this%isym, this%jas) - ! - ! -- If reduced system, then need to build iausr and jausr, otherwise point - ! them to ia and ja. + + ! Fill disl symmetric arrays + call fill_disl_symarrays(this%ia, this%ja, this%jas, reach_length, & + this%ihc, this%cl1, this%cl2) + + ! If reduced system, then need to build iausr and jausr, otherwise point + ! them to ia and ja. ! TODO: not handled yet for reduced system !this%iausr => this%ia !this%jausr => this%ja @@ -1013,14 +1018,15 @@ end subroutine dislconnections !> @brief Fill the connections object for a disl package from vertices !! - !! todo: No handling yet of cl1, cl2, hwva, etc. for disl as they are not needed - !! and only unreduced disl grids are allowed at the moment + !! todo: Still need to handle hwva + !! todo: Only unreduced disl grids are allowed at the moment !! !< subroutine dislconnections_verts(this, name_model, nodes, nodesuser, & nrsize, nvert, & vertices, iavert, javert, & - cellxyz, cellfdc, nodereduced, nodeuser) + cellxyz, cellfdc, nodereduced, nodeuser, & + reach_length) ! -- modules use ConstantsModule, only: DHALF, DZERO, DTHREE, DTWO, DPI use SparseModule, only: sparsematrix @@ -1041,6 +1047,7 @@ subroutine dislconnections_verts(this, name_model, nodes, nodesuser, & real(DP), dimension(nodesuser), intent(in) :: cellfdc integer(I4B), dimension(:), intent(in) :: nodereduced integer(I4B), dimension(:), intent(in) :: nodeuser + real(DP), dimension(:), intent(in) :: reach_length !< length of each reach ! -- local integer(I4B), dimension(:), allocatable :: itemp integer(I4B), dimension(:), allocatable :: iavertcells @@ -1098,6 +1105,12 @@ subroutine dislconnections_verts(this, name_model, nodes, nodesuser, & ! -- fill the isym and jas arrays call fillisym(this%nodes, this%nja, this%ia, this%ja, this%isym) call filljas(this%nodes, this%nja, this%ia, this%ja, this%isym, this%jas) + + ! Fill disl symmetric arrays + ! todo: need to handle cell center shifted from center of reach + call fill_disl_symarrays(this%ia, this%ja, this%jas, reach_length, & + this%ihc, this%cl1, this%cl2) + ! ! -- Fill symmetric discretization arrays (ihc,cl1,cl2,hwva,anglex) ! do n = 1, this%nodes @@ -1152,6 +1165,36 @@ subroutine sparse_from_toreach(toreach, spm) return end subroutine sparse_from_toreach + !> @brief Fill symmetric connection arrays for disl + !< + subroutine fill_disl_symarrays(ia, ja, jas, reach_length, ihc, cl1, cl2) + ! dummy + integer(I4B), dimension(:), intent(in) :: ia !< csr pointer array + integer(I4B), dimension(:), intent(in) :: ja !< csr array + integer(I4B), dimension(:), intent(in) :: jas !< csr symmetric array + real(DP), dimension(:), intent(in) :: reach_length !< length of each reach + integer(I4B), dimension(:), intent(out) :: ihc !< horizontal connection flag + real(DP), dimension(:), intent(out) :: cl1 !< distance from n to shared face with m + real(DP), dimension(:), intent(out) :: cl2 !< distance from m to shared face with n + ! local + integer(I4B) :: n + integer(I4B) :: m + integer(I4B) :: ipos + integer(I4B) :: isympos + + ! loop through and set array values + do n = 1, size(reach_length) + do ipos = ia(n) + 1, ia(n + 1) - 1 + m = ja(ipos) + if (m < n) cycle + isympos = jas(ipos) + ihc(isympos) = 1 + cl1(isympos) = DHALF * reach_length(n) + cl2(isympos) = DHALF * reach_length(m) + end do + end do + end subroutine fill_disl_symarrays + !> @brief Fill iausr and jausr if reduced grid, otherwise point them to ia !! and ja. !< diff --git a/src/Model/ModelUtilities/DiscretizationBase.f90 b/src/Model/ModelUtilities/DiscretizationBase.f90 index 927b49c6926..30b2b26944e 100644 --- a/src/Model/ModelUtilities/DiscretizationBase.f90 +++ b/src/Model/ModelUtilities/DiscretizationBase.f90 @@ -110,6 +110,7 @@ module BaseDisModule procedure, public :: highest_active procedure, public :: get_area procedure, public :: get_area_factor + procedure, public :: get_flow_width end type DisBaseType @@ -1120,4 +1121,29 @@ function get_area_factor(this, node, idx_conn) result(area_factor) area_factor = area_conn / area_node end function get_area_factor + !> @ brief Calculate the flow width between two cells + !! + !! This should only be called for connections with IHC > 0. + !! Routine is needed, so it can be overridden by the linear + !! network discretization, which allows for a separate flow + !< width for each cell. + !< + subroutine get_flow_width(this, n, m, idx_conn, width_n, width_m) + ! dummy + class(DisBaseType) :: this + integer(I4B), intent(in) :: n !< cell node number + integer(I4B), intent(in) :: m !< cell node number + integer(I4B), intent(in) :: idx_conn !< connection index + real(DP), intent(out) :: width_n !< flow width for cell n + real(DP), intent(out) :: width_m !< flow width for cell m + ! local + integer(I4B) :: isympos + + ! For general case, width_n = width_m + isympos = this%con%jas(idx_conn) + width_n = this%con%hwva(isympos) + width_m = width_n + + end subroutine get_flow_width + end module BaseDisModule diff --git a/src/Model/SurfaceWaterFlow/swf-dfw.f90 b/src/Model/SurfaceWaterFlow/swf-dfw.f90 index 3dc2801a889..01e84d3f189 100644 --- a/src/Model/SurfaceWaterFlow/swf-dfw.f90 +++ b/src/Model/SurfaceWaterFlow/swf-dfw.f90 @@ -6,13 +6,10 @@ !< ! todo: -! Implement length convert and time convert for mannings -! Use cl1 and cl2 in DFW calculations ! Move Newton to FN routines ! Implement a proper perturbation epsilon ! Is slope input parameter needed? ! Parameterize the smoothing depth? -! test ATS ! module SwfDfwModule @@ -28,7 +25,6 @@ module SwfDfwModule store_error_filename use NumericalPackageModule, only: NumericalPackageType use BaseDisModule, only: DisBaseType - use SwfDislModule, only: SwfDislType use SwfCxsModule, only: SwfCxsType use ObsModule, only: ObsType, obs_cr use ObsModule, only: DefaultObsIdProcessor @@ -46,16 +42,12 @@ module SwfDfwModule real(DP), pointer :: unitconv !< conversion factor used in mannings equation; calculated from timeconv and lengthconv real(DP), pointer :: timeconv !< conversion factor from model length units to meters (1.0 if model uses meters for length) real(DP), pointer :: lengthconv !< conversion factor frommodel time units to seconds (1.0 if model uses seconds for time) - real(DP), dimension(:), pointer, contiguous :: width => null() !< reach width real(DP), dimension(:), pointer, contiguous :: manningsn => null() !< mannings roughness for each reach real(DP), dimension(:), pointer, contiguous :: slope => null() !< slope for each reach integer(I4B), dimension(:), pointer, contiguous :: idcxs => null() !< cross section id for each reach integer(I4B), dimension(:), pointer, contiguous :: ibound => null() !< pointer to model ibound integer(I4B), dimension(:), pointer, contiguous :: icelltype => null() !< set to 1 and is accessed by chd for checking - ! -- pointer to concrete disl subclass of DisBaseType - type(SwfDislType), pointer :: disl - ! -- observation data integer(I4B), pointer :: inobspkg => null() !< unit number for obs package type(ObsType), pointer :: obs => null() !< observation package @@ -65,6 +57,7 @@ module SwfDfwModule contains + procedure :: dfw_df procedure :: allocate_scalars procedure :: allocate_arrays procedure :: dfw_load @@ -101,7 +94,7 @@ module SwfDfwModule !> @brief create package !< subroutine dfw_cr(dfwobj, name_model, input_mempath, inunit, iout, & - dis, cxs) + cxs) ! -- modules use MemoryManagerExtModule, only: mem_set_value ! -- dummy @@ -110,7 +103,6 @@ subroutine dfw_cr(dfwobj, name_model, input_mempath, inunit, iout, & character(len=*), intent(in) :: input_mempath integer(I4B), intent(in) :: inunit integer(I4B), intent(in) :: iout - class(DisBaseType), pointer, intent(inout) :: dis !< the pointer to the discretization type(SwfCxsType), pointer, intent(in) :: cxs !< the pointer to the cxs package ! -- locals logical(LGP) :: found_fname @@ -137,16 +129,7 @@ subroutine dfw_cr(dfwobj, name_model, input_mempath, inunit, iout, & call mem_set_value(dfwobj%input_fname, 'INPUT_FNAME', dfwobj%input_mempath, & found_fname) - ! -- store pointer to disl - ! Not normally good practice, but since SWF only works with DISL - ! may be okay - dfwobj%dis => dis - select type (dis) - type is (SwfDislType) - dfwobj%disl => dis - end select - - ! -- Set a pointer to the cxs package + ! -- Set a pointers to passed in objects dfwobj%cxs => cxs ! -- create obs package @@ -158,18 +141,37 @@ subroutine dfw_cr(dfwobj, name_model, input_mempath, inunit, iout, & ! -- Print a message identifying the package. write (iout, fmtheader) input_mempath - ! -- allocate arrays - call dfwobj%allocate_arrays() - - ! -- load dfw - call dfwobj%dfw_load() - end if ! -- Return return end subroutine dfw_cr + !> @brief load data from IDM to package + !< + subroutine dfw_df(this, dis) + ! -- dummy + class(SwfDfwType) :: this + class(DisBaseType), pointer, intent(inout) :: dis !< the pointer to the discretization + ! -- locals + + ! -- Set a pointers to passed in objects + this%dis => dis + + ! -- check if dfw is enabled + ! this will need to become if (.not. present(dfw_options)) then + !if (inunit > 0) then + + ! -- allocate arrays + call this%allocate_arrays() + + ! -- load dfw + call this%dfw_load() + + !end if + + end subroutine dfw_df + !> @ brief Allocate scalars !! !! Allocate and initialize scalars for the package. The base model @@ -209,8 +211,6 @@ subroutine allocate_arrays(this) integer(I4B) :: n ! ! -- user-provided input - call mem_allocate(this%width, this%dis%nodes, & - 'WIDTH', this%memoryPath) call mem_allocate(this%manningsn, this%dis%nodes, & 'MANNINGSN', this%memoryPath) call mem_allocate(this%slope, this%dis%nodes, & @@ -221,7 +221,6 @@ subroutine allocate_arrays(this) 'ICELLTYPE', this%memoryPath) do n = 1, this%dis%nodes - this%width(n) = DZERO this%manningsn(n) = DZERO this%slope(n) = DZERO this%idcxs(n) = 0 @@ -385,18 +384,11 @@ subroutine source_griddata(this) if (this%dis%nodes < this%dis%nodesuser) map => this%dis%nodeuser ! ! -- update defaults with idm sourced values - call mem_set_value(this%width, 'WIDTH', idmMemoryPath, map, found%width) call mem_set_value(this%manningsn, 'MANNINGSN', & idmMemoryPath, map, found%manningsn) call mem_set_value(this%slope, 'SLOPE', idmMemoryPath, map, found%slope) call mem_set_value(this%idcxs, 'IDCXS', idmMemoryPath, map, found%idcxs) ! - ! -- ensure WIDTH was found - if (.not. found%width) then - write (errmsg, '(a)') 'Error in GRIDDATA block: WIDTH not found.' - call store_error(errmsg) - end if - ! ! -- ensure MANNINGSN was found if (.not. found%manningsn) then write (errmsg, '(a)') 'Error in GRIDDATA block: MANNINGSN not found.' @@ -408,7 +400,11 @@ subroutine source_griddata(this) write (errmsg, '(a)') 'Error in GRIDDATA block: SLOPE not found.' call store_error(errmsg) end if - ! + + if (count_errors() > 0) then + call store_error_filename(this%input_fname) + end if + ! -- log griddata if (this%iout > 0) then call this%log_griddata(found) @@ -427,10 +423,6 @@ subroutine log_griddata(this, found) write (this%iout, '(1x,a)') 'Setting DFW Griddata' - if (found%width) then - write (this%iout, '(4x,a)') 'WIDTH set from input file' - end if - if (found%manningsn) then write (this%iout, '(4x,a)') 'MANNINGSN set from input file' end if @@ -579,17 +571,17 @@ subroutine dfw_qnm_fc_nr(this, kiter, matrix_sln, idxglo, rhs, stage, stage_old) m = this%dis%con%ja(ii) ! ! -- Fill the qnm term on the right hand side - qnm = this%qcalc(n, m, stage(n), stage(m)) + qnm = this%qcalc(n, m, stage(n), stage(m), ii) rhs(n) = rhs(n) - qnm ! ! -- Derivative calculation and fill of n terms - qeps = this%qcalc(n, m, stage(n) + eps, stage(m)) + qeps = this%qcalc(n, m, stage(n) + eps, stage(m), ii) derv = (qeps - qnm) / eps call matrix_sln%add_value_pos(idxglo(idiag), derv) rhs(n) = rhs(n) + derv * stage(n) ! ! -- Derivative calculation and fill of m terms - qeps = this%qcalc(n, m, stage(n), stage(m) + eps) + qeps = this%qcalc(n, m, stage(n), stage(m) + eps, ii) derv = (qeps - qnm) / eps call matrix_sln%add_value_pos(idxglo(ii), derv) rhs(n) = rhs(n) + derv * stage(m) @@ -619,35 +611,52 @@ subroutine dfw_fn(this, kiter, matrix_sln, idxglo, rhs, stage) return end subroutine dfw_fn - function qcalc(this, n, m, stage_n, stage_m) result(qnm) + function qcalc(this, n, m, stage_n, stage_m, ipos) result(qnm) ! -- dummy class(SwfDfwType) :: this - integer(I4B), intent(in) :: n - integer(I4B), intent(in) :: m - real(DP), intent(in) :: stage_n - real(DP), intent(in) :: stage_m + integer(I4B), intent(in) :: n !< number for cell n + integer(I4B), intent(in) :: m !< number for cell m + real(DP), intent(in) :: stage_n !< stage in reach n + real(DP), intent(in) :: stage_m !< stage in reach m + integer(I4B), intent(in) :: ipos !< connection number ! -- local + integer(I4B) :: isympos real(DP) :: qnm real(DP) :: cond + real(DP) :: cl1 + real(DP) :: cl2 ! - cond = this%get_cond(n, m, stage_n, stage_m) + isympos = this%dis%con%jas(ipos) + if (n < m) then + cl1 = this%dis%con%cl1(isympos) + cl2 = this%dis%con%cl2(isympos) + else + cl1 = this%dis%con%cl2(isympos) + cl2 = this%dis%con%cl1(isympos) + end if + cond = this%get_cond(n, m, ipos, stage_n, stage_m, cl1, cl2) qnm = cond * (stage_m - stage_n) return end function qcalc - function get_cond(this, n, m, stage_n, stage_m) result(cond) + function get_cond(this, n, m, ipos, stage_n, stage_m, cln, clm) result(cond) ! -- modules use SmoothingModule, only: sQuadratic ! -- dummy class(SwfDfwType) :: this - integer(I4B), intent(in) :: n - integer(I4B), intent(in) :: m - real(DP), intent(in) :: stage_n - real(DP), intent(in) :: stage_m + integer(I4B), intent(in) :: n !< number for cell n + integer(I4B), intent(in) :: m !< number for cell m + integer(I4B), intent(in) :: ipos !< connection number + real(DP), intent(in) :: stage_n !< stage in reach n + real(DP), intent(in) :: stage_m !< stage in reach m + real(DP), intent(in) :: cln !< distance from cell n to shared face with m + real(DP), intent(in) :: clm !< distance from cell m to shared face with n ! -- local real(DP) :: absdhdxsqr real(DP) :: depth_n real(DP) :: depth_m + real(DP) :: width_n + real(DP) :: width_m real(DP) :: range = 1.d-2 real(DP) :: dydx real(DP) :: smooth_factor @@ -655,13 +664,11 @@ function get_cond(this, n, m, stage_n, stage_m) result(cond) real(DP) :: cond real(DP) :: cn real(DP) :: cm - ! + ! we are using a harmonic conductance approach here; however ! the SWR Process for MODFLOW-2005/NWT uses length-weighted ! average areas and hydraulic radius instead. - ! - denom = DHALF * this%disl%reach_length(n) + & - DHALF * this%disl%reach_length(m) + denom = cln + clm cond = DZERO if (denom > DPREC) then absdhdxsqr = abs((stage_n - stage_m) / denom)**DHALF @@ -669,11 +676,11 @@ function get_cond(this, n, m, stage_n, stage_m) result(cond) ! TODO: Set this differently somehow? absdhdxsqr = 1.e-7 end if - ! + ! -- Calculate depth in each reach - depth_n = stage_n - this%disl%reach_bottom(n) - depth_m = stage_m - this%disl%reach_bottom(m) - ! + depth_n = stage_n - this%dis%bot(n) + depth_m = stage_m - this%dis%bot(m) + ! -- Assign upstream depth, if not central if (this%icentral == 0) then ! -- use upstream weighting @@ -683,19 +690,22 @@ function get_cond(this, n, m, stage_n, stage_m) result(cond) depth_n = depth_m end if end if - ! + ! -- Calculate a smoothed depth that goes to zero over ! the specified range call sQuadratic(depth_n, range, dydx, smooth_factor) depth_n = depth_n * smooth_factor call sQuadratic(depth_m, range, dydx, smooth_factor) depth_m = depth_m * smooth_factor - ! + + ! Get the flow widths for n and m from dis package + call this%dis%get_flow_width(n, m, ipos, width_n, width_m) + ! -- Calculate half-cell conductance for reach ! n and m - cn = this%get_cond_n(n, depth_n, absdhdxsqr) - cm = this%get_cond_n(m, depth_m, absdhdxsqr) - ! + cn = this%get_cond_n(n, depth_n, absdhdxsqr, cln, width_n) + cm = this%get_cond_n(m, depth_m, absdhdxsqr, clm, width_m) + ! -- Use harmonic mean to calculated weighted ! conductance bewteen the centers of reaches ! n and m @@ -712,44 +722,27 @@ end function get_cond !> @brief Calculate half reach conductance !! !! Calculate half reach conductance for reach n - !! using Manning's equation - !! - !< - function get_cond_n(this, n, depth, absdhdxsq) result(c) + !< using conveyance and Manning's equation + function get_cond_n(this, n, depth, absdhdxsq, dx, width) result(c) ! -- modules ! -- dummy class(SwfDfwType) :: this integer(I4B), intent(in) :: n !< reach number real(DP), intent(in) :: depth !< simulated depth (stage - elevation) in reach n for this iteration real(DP), intent(in) :: absdhdxsq !< absolute value of simulated hydraulic gradient + real(DP), intent(in) :: dx !< half-cell distance + real(DP), intent(in) :: width !< width of the reach perpendicular to flow ! -- return real(DP) :: c ! -- local - real(DP) :: width real(DP) :: rough - real(DP) :: slope - real(DP) :: dx - real(DP) :: roughc - real(DP) :: a - real(DP) :: r real(DP) :: conveyance - ! - width = this%width(n) - rough = this%manningsn(n) - slope = this%slope(n) - - ! -- TODO: this should probably come from cl1/cl2 in case the cell - ! center does not correspond to the middle of the reach. - dx = DHALF * this%disl%reach_length(n) - roughc = this%cxs%get_roughness(this%idcxs(n), width, depth, rough, & - slope) - a = this%cxs%get_area(this%idcxs(n), width, depth) - r = this%cxs%get_hydraulic_radius(this%idcxs(n), width, depth, area=a) - - ! -- conductance from manning's equation - !conveyance = a * r**DTWOTHIRDS / roughc + ! Calculate conveyance, which a * r**DTWOTHIRDS / roughc + rough = this%manningsn(n) conveyance = this%cxs%get_conveyance(this%idcxs(n), width, depth, rough) + + ! Multiply by unitconv and divide conveyance by sqrt of friction slope and dx c = this%unitconv * conveyance / absdhdxsq / dx end function get_cond_n @@ -779,7 +772,7 @@ subroutine dfw_nur(this, neqmod, x, xtemp, dx, inewtonur, dxmax, locmax) do n = 1, this%dis%nodes if (this%ibound(n) < 1) cycle if (this%icelltype(n) > 0) then - botm = this%disl%reach_bottom(n) + botm = this%dis%bot(n) ! -- only apply Newton-Raphson under-relaxation if ! solution head is below the bottom of the model if (x(n) < botm) then @@ -815,7 +808,7 @@ subroutine dfw_cq(this, stage, stage_old, flowja) do ipos = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1 m = this%dis%con%ja(ipos) if (m < n) cycle - qnm = this%qcalc(n, m, stage(n), stage(m)) + qnm = this%qcalc(n, m, stage(n), stage(m), ipos) flowja(ipos) = qnm flowja(this%dis%con%isym(ipos)) = -qnm end do @@ -943,7 +936,6 @@ subroutine dfw_da(this) call mem_deallocate(this%timeconv) ! ! -- Deallocate arrays - call mem_deallocate(this%width) call mem_deallocate(this%manningsn) call mem_deallocate(this%slope) call mem_deallocate(this%idcxs) @@ -954,7 +946,6 @@ subroutine dfw_da(this) call this%obs%obs_da() deallocate (this%obs) nullify (this%obs) - nullify (this%disl) nullify (this%cxs) ! -- deallocate parent @@ -1078,11 +1069,11 @@ subroutine dfw_rp_obs(this) ! ! -- get node number 1 nn1 = obsrv%NodeNumber - if (nn1 < 1 .or. nn1 > this%disl%nodes) then + if (nn1 < 1 .or. nn1 > this%dis%nodes) then write (errmsg, '(a,1x,a,1x,i0,1x,a,1x,i0,a)') & trim(adjustl(obsrv%ObsTypeId)), & 'reach must be greater than 0 and less than or equal to', & - this%disl%nodes, '(specified value is ', nn1, ')' + this%dis%nodes, '(specified value is ', nn1, ')' call store_error(errmsg) else if (obsrv%indxbnds_count == 0) then @@ -1096,11 +1087,11 @@ subroutine dfw_rp_obs(this) ! -- check that node number 1 is valid; call store_error if not do j = 1, obsrv%indxbnds_count nn1 = obsrv%indxbnds(j) - if (nn1 < 1 .or. nn1 > this%disl%nodes) then + if (nn1 < 1 .or. nn1 > this%dis%nodes) then write (errmsg, '(a,1x,a,1x,i0,1x,a,1x,i0,a)') & trim(adjustl(obsrv%ObsTypeId)), & 'reach must be greater than 0 and less than or equal to', & - this%disl%nodes, '(specified value is ', nn1, ')' + this%dis%nodes, '(specified value is ', nn1, ')' call store_error(errmsg) end if end do diff --git a/src/Model/SurfaceWaterFlow/swf-disl.f90 b/src/Model/SurfaceWaterFlow/swf-disl.f90 index 7b75220ac7b..e9762c35058 100644 --- a/src/Model/SurfaceWaterFlow/swf-disl.f90 +++ b/src/Model/SurfaceWaterFlow/swf-disl.f90 @@ -6,7 +6,7 @@ module SwfDislModule use MemoryHelperModule, only: create_mem_path use MemoryManagerModule, only: mem_allocate use SimModule, only: count_errors, store_error, store_error_unit, & - store_warning + store_warning, store_error_filename use InputOutputModule, only: urword use BaseDisModule, only: DisBaseType use DislGeom, only: calcdist @@ -22,6 +22,7 @@ module SwfDislModule real(DP), pointer :: convlength => null() !< conversion factor for length real(DP), pointer :: convtime => null() !< conversion factor for time real(DP), dimension(:), pointer, contiguous :: reach_length => null() !< length of each reach + real(DP), dimension(:), pointer, contiguous :: reach_width => null() !< reach width real(DP), dimension(:), pointer, contiguous :: reach_bottom => null() !< reach bottom elevation integer(I4B), dimension(:), pointer, contiguous :: toreach => null() !< downstream reach index (nodes) integer(I4B), dimension(:), pointer, contiguous :: idomain => null() !< idomain (nodes) @@ -33,7 +34,10 @@ module SwfDislModule logical(LGP) :: toreachConnectivity = .false. !< flag to indicate build connectivity from toreach instead of vertices contains procedure :: disl_load + procedure :: dis_df => disl_df procedure :: dis_da => disl_da + procedure :: get_dis_type => get_dis_type + procedure :: get_flow_width => get_flow_width procedure, public :: record_array procedure, public :: record_srcdst_list_header ! -- private @@ -95,15 +99,38 @@ subroutine disl_cr(dis, name_model, input_mempath, inunit, iout) write (iout, fmtheader) dis%input_mempath end if - ! -- load disl - call disnew%disl_load() - end if ! ! -- Return return end subroutine disl_cr + !> @brief Define the discretization + !< + subroutine disl_df(this) + ! -- dummy + class(SwfDislType) :: this + ! + ! -- Transfer the data from the memory manager into this package object + if (this%inunit /= 0) then + call this%disl_load() + end if + + ! create connectivity using toreach or vertices and cell2d + call this%create_connections() + + ! finalize the grid + call this%grid_finalize() + + end subroutine disl_df + + !> @brief Get the discretization type (DIS, DISV, DISU, DISL) + subroutine get_dis_type(this, dis_type) + class(SwfDislType), intent(in) :: this + character(len=*), intent(out) :: dis_type + dis_type = "DISL" + end subroutine get_dis_type + !> @brief Allocate scalar variables !< subroutine allocate_scalars(this, name_model, input_mempath) @@ -149,14 +176,6 @@ subroutine disl_load(this) call this%source_cell2d() end if - ! create connectivity using toreach or vertices and cell2d - call this%create_connections() - - ! finalize the grid - call this%grid_finalize() - ! - ! -- Return - return end subroutine disl_load !> @brief Copy options from IDM into package @@ -291,6 +310,8 @@ subroutine source_dimensions(this) ! -- Allocate non-reduced vectors for disl call mem_allocate(this%reach_length, this%nodesuser, & 'REACH_LENGTH', this%memoryPath) + call mem_allocate(this%reach_width, this%nodesuser, & + 'REACH_WIDTH', this%memoryPath) call mem_allocate(this%reach_bottom, this%nodesuser, & 'REACH_BOTTOM', this%memoryPath) call mem_allocate(this%toreach, this%nodesuser, & @@ -311,6 +332,7 @@ subroutine source_dimensions(this) ! -- initialize all cells to be active (idomain = 1) do n = 1, this%nodesuser this%reach_length(n) = DZERO + this%reach_width(n) = DZERO this%reach_bottom(n) = DZERO this%toreach(n) = 0 this%idomain(n) = 1 @@ -359,6 +381,8 @@ subroutine source_griddata(this) ! -- update defaults with idm sourced values call mem_set_value(this%reach_length, 'REACH_LENGTH', idmMemoryPath, & found%reach_length) + call mem_set_value(this%reach_width, 'REACH_WIDTH', idmMemoryPath, & + found%reach_width) call mem_set_value(this%reach_bottom, 'REACH_BOTTOM', idmMemoryPath, & found%reach_bottom) call mem_set_value(this%toreach, 'TOREACH', idmMemoryPath, & @@ -367,7 +391,26 @@ subroutine source_griddata(this) this%toreachConnectivity = .true. end if call mem_set_value(this%idomain, 'IDOMAIN', idmMemoryPath, found%idomain) - ! + + if (.not. found%reach_length) then + write (errmsg, '(a)') 'Error in GRIDDATA block: REACH_LENGTH not found.' + call store_error(errmsg) + end if + + if (.not. found%reach_width) then + write (errmsg, '(a)') 'Error in GRIDDATA block: REACH_WIDTH not found.' + call store_error(errmsg) + end if + + if (.not. found%reach_bottom) then + write (errmsg, '(a)') 'Error in GRIDDATA block: REACH_BOTTOM not found.' + call store_error(errmsg) + end if + + if (count_errors() > 0) then + call store_error_filename(this%input_fname) + end if + ! -- log simulation values if (this%iout > 0) then call this%log_griddata(found) @@ -390,6 +433,10 @@ subroutine log_griddata(this, found) write (this%iout, '(4x,a)') 'REACH_LENGTH set from input file' end if + if (found%reach_width) then + write (this%iout, '(4x,a)') 'REACH_WIDTH set from input file' + end if + if (found%reach_bottom) then write (this%iout, '(4x,a)') 'REACH_BOTTOM set from input file' end if @@ -620,27 +667,24 @@ end subroutine calculate_cellxyz !> @brief Finalize grid construction !< subroutine grid_finalize(this) - ! -- modules + ! modules use SimModule, only: ustop, count_errors, store_error use ConstantsModule, only: LINELENGTH, DZERO, DONE - ! -- dummy + ! dummy class(SwfDislType) :: this - ! -- locals + ! local integer(I4B) :: node, noder, k - ! -- formats - ! -- data - ! - ! -- count active cells + + ! count active cells this%nodes = 0 do k = 1, this%nodesuser if (this%idomain(k) > 0) this%nodes = this%nodes + 1 end do ! - ! -- Check to make sure nodes is a valid number + ! Check to make sure nodes is a valid number if (this%nodes == 0) then - call store_error('MODEL DOES NOT HAVE ANY ACTIVE NODES.') - call store_error('MAKE SURE IDOMAIN ARRAY HAS SOME VALUES GREATER & - &THAN ZERO.') + call store_error('Model does not have any active nodes. Make sure & + &IDOMAIN has some values greater than zero.') call this%parser%StoreErrorUnit() call ustop() end if @@ -649,14 +693,14 @@ subroutine grid_finalize(this) call this%parser%StoreErrorUnit() call ustop() end if - ! - ! -- Array size is now known, so allocate + + ! Array size is now known, so allocate call this%allocate_arrays() - ! - ! -- Fill the nodereduced array with the reduced nodenumber, or - ! a negative number to indicate it is a pass-through cell, or - ! a zero to indicate that the cell is excluded from the - ! solution. + + ! Fill the nodereduced array with the reduced nodenumber, or + ! a negative number to indicate it is a pass-through cell, or + ! a zero to indicate that the cell is excluded from the + ! solution. if (this%nodes < this%nodesuser) then node = 1 noder = 1 @@ -672,8 +716,8 @@ subroutine grid_finalize(this) node = node + 1 end do end if - ! - ! -- allocate and fill nodeuser if a reduced grid + + ! allocate and fill nodeuser if a reduced grid if (this%nodes < this%nodesuser) then node = 1 noder = 1 @@ -685,12 +729,17 @@ subroutine grid_finalize(this) node = node + 1 end do end if - ! - ! -- Move reach_bottom into bot + + ! Copy reach_bottom into bot do node = 1, this%nodesuser this%bot(node) = this%reach_bottom(node) end do + ! Assign area in DisBaseType as reach_length + do node = 1, this%nodesuser + this%area(node) = this%reach_length(node) + end do + ! -- Return return end subroutine grid_finalize @@ -739,14 +788,16 @@ subroutine create_connections(this) ! -- Create connectivity if (this%toreachConnectivity) then ! -- build connectivity based on toreach - call this%con%dislconnections(this%name_model, this%toreach) + call this%con%dislconnections(this%name_model, this%toreach, & + this%reach_length) else ! -- build connectivity based on vertices call this%con%dislconnections_verts(this%name_model, this%nodes, & this%nodesuser, nrsize, this%nvert, & this%vertices, this%iavert, & this%javert, this%cellxyz, this%fdc, & - this%nodereduced, this%nodeuser) + this%nodereduced, this%nodeuser, & + this%reach_length) end if this%nja = this%con%nja @@ -1011,6 +1062,7 @@ subroutine disl_da(this) call mem_deallocate(this%nodeuser) call mem_deallocate(this%nodereduced) call mem_deallocate(this%reach_length) + call mem_deallocate(this%reach_width) call mem_deallocate(this%reach_bottom) call mem_deallocate(this%toreach) call mem_deallocate(this%idomain) @@ -1164,4 +1216,25 @@ subroutine record_srcdst_list_header(this, text, textmodel, textpackage, & return end subroutine record_srcdst_list_header + !> @ brief Calculate the flow width between two cells + !! + !! This should only be called for connections with IHC > 0. + !! Routine is needed, so it can be overridden by the linear + !! network discretization, which allows for a separate flow + !< width for each cell. + subroutine get_flow_width(this, n, m, idx_conn, width_n, width_m) + ! dummy + class(SwfDislType) :: this + integer(I4B), intent(in) :: n !< cell node number + integer(I4B), intent(in) :: m !< cell node number + integer(I4B), intent(in) :: idx_conn !< connection index + real(DP), intent(out) :: width_n !< flow width for cell n + real(DP), intent(out) :: width_m !< flow width for cell m + + ! For disl case, width_n and width_m can be different + width_n = this%reach_width(n) + width_m = this%reach_width(m) + + end subroutine get_flow_width + end module SwfDislModule diff --git a/src/Model/SurfaceWaterFlow/swf-ic.f90 b/src/Model/SurfaceWaterFlow/swf-ic.f90 index add3abb220f..e12a6d1a7c8 100644 --- a/src/Model/SurfaceWaterFlow/swf-ic.f90 +++ b/src/Model/SurfaceWaterFlow/swf-ic.f90 @@ -1,11 +1,7 @@ -! -- SWF Initial Conditions Module -! replicated from GwfIcModule to use IDM - module SwfIcModule use KindModule, only: DP, I4B, LGP - use ConstantsModule, only: LENMEMPATH - use SimVariablesModule, only: errmsg + use ConstantsModule, only: LINELENGTH use NumericalPackageModule, only: NumericalPackageType use BlockParserModule, only: BlockParserType use BaseDisModule, only: DisBaseType @@ -15,21 +11,23 @@ module SwfIcModule public :: SwfIcType public :: ic_cr - ! -- Most of the SwfIcType functionality is replicated from GWF type, extends(NumericalPackageType) :: SwfIcType - real(DP), dimension(:), pointer, contiguous :: strt => null() ! starting stage + + real(DP), dimension(:), pointer, contiguous :: strt => null() ! starting head + contains + procedure :: ic_ar procedure :: ic_da - procedure :: ic_load - procedure :: source_griddata - procedure :: log_griddata + procedure, private :: ic_load procedure, private :: allocate_arrays + procedure, private :: source_griddata + end type SwfIcType contains - !> @brief create package + !> @brief Create a new initial conditions object !< subroutine ic_cr(ic, name_model, input_mempath, inunit, iout, dis) ! -- modules @@ -41,75 +39,68 @@ subroutine ic_cr(ic, name_model, input_mempath, inunit, iout, dis) integer(I4B), intent(in) :: inunit integer(I4B), intent(in) :: iout class(DisBaseType), pointer, intent(in) :: dis - ! -- local - logical(LGP) :: found_fname ! -- formats - character(len=*), parameter :: fmtheader = & - "(1x, /1x, 'IC -- INITIAL CONDITIONS (IC) PACKAGE, VERSION 1, 10/10/2023', & - &' INPUT READ FROM MEMPATH: ', A, /)" + character(len=*), parameter :: fmtic = & + "(1x, /1x, 'IC -- Initial Conditions Package, Version 8, 3/28/2015', & + &' input read from mempath: ', A, //)" ! - ! -- Create the object + ! -- create IC object allocate (ic) ! ! -- create name and memory path - call ic%set_names(1, name_model, 'IC', 'IC') + call ic%set_names(1, name_model, 'IC', 'IC', input_mempath) ! - ! -- Allocate scalars + ! -- allocate scalars call ic%allocate_scalars() ! - ! -- Set variables - ic%input_mempath = input_mempath + ! -- set variables ic%inunit = inunit ic%iout = iout ! - ! -- set name of input file - call mem_set_value(ic%input_fname, 'INPUT_FNAME', ic%input_mempath, & - found_fname) - ! ! -- set pointers ic%dis => dis ! - ! -- check if ic is enabled + ! -- check if pkg is enabled, if (inunit > 0) then - - ! -- Print a message identifying the package. - write (iout, fmtheader) input_mempath - - ! -- allocate arrays - call ic%allocate_arrays() - - ! -- load ic - call ic%ic_load() - + ! print message identifying pkg + write (ic%iout, fmtic) input_mempath end if - ! - ! -- Return - return end subroutine ic_cr - !> @brief allocate and read - !! - !! Set model dependent variable to initial conditions - !! + !> @brief Load data from IDM into package !< - subroutine ic_ar(this, x) + subroutine ic_load(this) ! -- modules - use SimModule, only: store_error + use BaseDisModule, only: DisBaseType + ! -- dummy + class(SwfIcType) :: this + ! + call this%source_griddata() + end subroutine ic_load + + !> @brief Allocate arrays, load from IDM, and assign head + !< + subroutine ic_ar(this, x) ! -- dummy class(SwfIcType) :: this real(DP), dimension(:), intent(inout) :: x - ! -- locals + ! -- local integer(I4B) :: n ! - ! -- Assign x equal to strt + ! -- allocate arrays + call this%allocate_arrays(this%dis%nodes) + ! + ! -- load from IDM + call this%ic_load() + ! + ! -- assign starting head do n = 1, this%dis%nodes x(n) = this%strt(n) end do - ! - ! -- Return - return end subroutine ic_ar + !> @brief Deallocate + !< subroutine ic_da(this) ! -- modules use MemoryManagerModule, only: mem_deallocate @@ -118,107 +109,58 @@ subroutine ic_da(this) ! -- dummy class(SwfIcType) :: this ! - ! -- Deallocate input memory + ! -- deallocate IDM memory call memorylist_remove(this%name_model, 'IC', idm_context) ! - ! -- deallocate parent - call this%NumericalPackageType%da() - ! - ! -- Scalars - ! - ! -- Arrays + ! -- deallocate arrays call mem_deallocate(this%strt) ! - ! -- Return - return + ! -- deallocate parent + call this%NumericalPackageType%da() end subroutine ic_da - !> @brief load data from IDM to package + !> @brief Allocate arrays !< - subroutine ic_load(this) + subroutine allocate_arrays(this, nodes) + ! -- modules + use MemoryManagerModule, only: mem_allocate ! -- dummy class(SwfIcType) :: this - ! -- locals - ! - ! -- source input data - call this%source_griddata() + integer(I4B), intent(in) :: nodes ! - ! -- Return - return - end subroutine ic_load + ! -- Allocate + call mem_allocate(this%strt, nodes, 'STRT', this%memoryPath) + end subroutine allocate_arrays - !> @brief copy griddata from IDM to package + !> @brief Copy grid data from IDM into package !< subroutine source_griddata(this) ! -- modules - use SimModule, only: count_errors, store_error - use MemoryHelperModule, only: create_mem_path - use MemoryManagerModule, only: mem_reallocate + use SimModule, only: store_error, store_error_filename use MemoryManagerExtModule, only: mem_set_value - use SimVariablesModule, only: idm_context use SwfIcInputModule, only: SwfIcParamFoundType ! -- dummy class(SwfIcType) :: this - ! -- locals - character(len=LENMEMPATH) :: idmMemoryPath + ! -- local + character(len=LINELENGTH) :: errmsg type(SwfIcParamFoundType) :: found integer(I4B), dimension(:), pointer, contiguous :: map - ! -- formats ! - ! -- set memory path - idmMemoryPath = create_mem_path(this%name_model, 'IC', idm_context) - ! - ! -- set map to convert user input data into reduced data + ! -- set map to convert user to reduced node data map => null() if (this%dis%nodes < this%dis%nodesuser) map => this%dis%nodeuser ! - ! -- update defaults with idm sourced values - call mem_set_value(this%strt, 'STRT', idmMemoryPath, map, found%strt) + ! -- set values + call mem_set_value(this%strt, 'STRT', this%input_mempath, map, found%strt) ! ! -- ensure STRT was found if (.not. found%strt) then write (errmsg, '(a)') 'Error in GRIDDATA block: STRT not found.' - call store_error(errmsg) - end if - ! - ! -- log griddata - if (this%iout > 0) then - call this%log_griddata(found) - end if - ! - ! -- Return - return - end subroutine source_griddata - - !> @brief log griddata to list file - !< - subroutine log_griddata(this, found) - use SwfIcInputModule, only: SwfIcParamFoundType - class(SwfIcType) :: this - type(SwfIcParamFoundType), intent(in) :: found - - write (this%iout, '(1x,a)') 'Setting IC Griddata' - - if (found%strt) then + call store_error(errmsg, terminate=.false.) + call store_error_filename(this%input_fname) + else if (this%iout > 0) then write (this%iout, '(4x,a)') 'STRT set from input file' end if - - write (this%iout, '(1x,a,/)') 'End Setting IC Griddata' - - end subroutine log_griddata - - subroutine allocate_arrays(this) - ! -- modules - use MemoryManagerModule, only: mem_allocate - ! -- dummy - class(SwfIcType) :: this - ! -- local - ! - ! -- Allocate - call mem_allocate(this%strt, this%dis%nodes, 'STRT', this%memoryPath) - ! - ! -- Return - return - end subroutine allocate_arrays + end subroutine source_griddata end module SwfIcModule diff --git a/src/Model/SurfaceWaterFlow/swf-sto.f90 b/src/Model/SurfaceWaterFlow/swf-sto.f90 index 45542330ae2..9c02b563ac5 100644 --- a/src/Model/SurfaceWaterFlow/swf-sto.f90 +++ b/src/Model/SurfaceWaterFlow/swf-sto.f90 @@ -33,10 +33,8 @@ module SwfStoModule ! -- pointers to information in dfw package integer(I4B), dimension(:), pointer, contiguous :: idcxs => null() !< pointer to cross section id vector in dfw - real(DP), dimension(:), pointer, contiguous :: width => null() !< pointer to width vector in dfw ! -- pointer to packages needed for calculations - type(SwfDislType), pointer :: disl type(SwfCxsType), pointer :: cxs contains @@ -44,6 +42,8 @@ module SwfStoModule procedure :: sto_rp procedure :: sto_ad procedure :: sto_fc + procedure :: sto_fc_dis1d + procedure :: sto_fc_dis2d !procedure :: sto_fn procedure :: sto_cq procedure :: sto_bd @@ -54,6 +54,9 @@ module SwfStoModule procedure, private :: read_options procedure, private :: read_data procedure, private :: set_dfw_pointers + procedure, private :: reach_length_pointer + procedure, private :: calc_storage_dis1d + procedure, private :: calc_storage_dis2d end type contains @@ -63,13 +66,12 @@ module SwfStoModule !! Create a new storage (STO) object !! !< - subroutine sto_cr(stoobj, name_model, inunit, iout, dis, cxs) + subroutine sto_cr(stoobj, name_model, inunit, iout, cxs) ! -- dummy variables type(SwfStoType), pointer :: stoobj !< SwfStoType object character(len=*), intent(in) :: name_model !< name of model integer(I4B), intent(in) :: inunit !< package input file unit integer(I4B), intent(in) :: iout !< model listing file unit - class(DisBaseType), pointer, intent(inout) :: dis !< the pointer to the discretization type(SwfCxsType), pointer, intent(in) :: cxs !< the pointer to the cxs package ! ! -- Create the object @@ -85,25 +87,12 @@ subroutine sto_cr(stoobj, name_model, inunit, iout, dis, cxs) stoobj%inunit = inunit stoobj%iout = iout - ! -- store pointer to disl - ! Not normally good practice, but since SWF only works with DISL - ! may be okay - stoobj%dis => dis - select type (dis) - type is (SwfDislType) - stoobj%disl => dis - end select + ! -- store pointers stoobj%cxs => cxs ! -- Initialize block parser call stoobj%parser%Initialize(stoobj%inunit, stoobj%iout) - ! -- set pointers to data in dfw package - call stoobj%set_dfw_pointers() - - ! - ! -- return - return end subroutine sto_cr !> @ brief Allocate and read method for package @@ -127,6 +116,10 @@ subroutine sto_ar(this, dis, ibound) ! ! --print a message identifying the storage package. write (this%iout, fmtsto) this%inunit + + ! -- set pointers to data in dfw package + call this%set_dfw_pointers() + ! ! -- store pointers to arguments that were passed in this%dis => dis @@ -250,8 +243,6 @@ end subroutine sto_ad !< subroutine sto_fc(this, kiter, stage_old, stage_new, matrix_sln, idxglo, rhs) ! -- modules - use ConstantsModule, only: DONE - use SwfCxsUtilsModule, only: get_cross_section_area use TdisModule, only: delt ! -- dummy class(SwfStoType) :: this @@ -262,18 +253,7 @@ subroutine sto_fc(this, kiter, stage_old, stage_new, matrix_sln, idxglo, rhs) integer(I4B), intent(in), dimension(:) :: idxglo real(DP), intent(inout), dimension(:) :: rhs ! -- local - integer(I4B) :: n, idiag - real(DP) :: depth_old - real(DP) :: depth_new - real(DP) :: area_old - real(DP) :: area_new - real(DP) :: area_eps - real(DP) :: volume_old - real(DP) :: volume_new - real(DP) :: dx - real(DP) :: eps - real(DP) :: derv - real(DP) :: qsto + character(len=LINELENGTH) :: distype = '' ! -- formats character(len=*), parameter :: fmtsperror = & &"('Detected time step length of zero. SWF Storage Package cannot be ', & @@ -287,29 +267,50 @@ subroutine sto_fc(this, kiter, stage_old, stage_new, matrix_sln, idxglo, rhs) write (errmsg, fmtsperror) call store_error(errmsg, terminate=.TRUE.) end if - ! + + call this%dis%get_dis_type(distype) + if (distype == 'DISL') then + call this%sto_fc_dis1d(kiter, stage_old, stage_new, matrix_sln, idxglo, rhs) + else + call this%sto_fc_dis2d(kiter, stage_old, stage_new, matrix_sln, idxglo, rhs) + end if + + end subroutine sto_fc + + !> @ brief Fill A and right-hand side for the package + !! + !! Fill the coefficient matrix and right-hand side with the STO package terms. + !! + !< + subroutine sto_fc_dis1d(this, kiter, stage_old, stage_new, matrix_sln, & + idxglo, rhs) + ! -- modules + ! -- dummy + class(SwfStoType) :: this + integer(I4B) :: kiter + real(DP), intent(inout), dimension(:) :: stage_old + real(DP), intent(inout), dimension(:) :: stage_new + class(MatrixBaseType), pointer :: matrix_sln + integer(I4B), intent(in), dimension(:) :: idxglo + real(DP), intent(inout), dimension(:) :: rhs + ! -- local + integer(I4B) :: n, idiag + real(DP) :: derv + real(DP) :: qsto + real(DP), dimension(:), pointer :: reach_length + + ! Set pointer to reach_length for 1d + reach_length => this%reach_length_pointer() + ! -- Calculate coefficients and put into amat - eps = 1.D-8 do n = 1, this%dis%nodes - ! + ! -- skip if constant stage if (this%ibound(n) < 0) cycle - ! - ! qsto = (v_new - v_old) / dt - ! v_new = a_new * dx - ! a_new = get_area(stage_new - bottom_elev) - dx = this%disl%reach_length(n) - depth_old = stage_old(n) - this%disl%reach_bottom(n) - area_old = this%cxs%get_area(this%idcxs(n), this%width(n), depth_old) - volume_old = area_old * dx - depth_new = stage_new(n) - this%disl%reach_bottom(n) - area_new = this%cxs%get_area(this%idcxs(n), this%width(n), depth_new) - volume_new = area_new * dx - qsto = (volume_new - volume_old) / delt - - area_eps = this%cxs%get_area(this%idcxs(n), this%width(n), depth_new + eps) - derv = (area_eps - area_new) * dx / delt / eps - ! + + call this%calc_storage_dis1d(n, stage_new(n), stage_old(n), & + reach_length(n), qsto, derv) + ! -- Fill amat and rhs idiag = this%dis%con%ia(n) call matrix_sln%add_value_pos(idxglo(idiag), -derv) @@ -319,50 +320,84 @@ subroutine sto_fc(this, kiter, stage_old, stage_new, matrix_sln, idxglo, rhs) ! ! -- Return return - end subroutine sto_fc + end subroutine sto_fc_dis1d - !> @ brief Calculate flows for package + !> @ brief Fill A and right-hand side for the package !! - !! Flow calculation for the STO package components. Components include - !! specific storage and specific yield storage. + !! Fill the coefficient matrix and right-hand side with the STO package terms. !! !< + subroutine sto_fc_dis2d(this, kiter, stage_old, stage_new, matrix_sln, & + idxglo, rhs) + ! -- modules + ! -- dummy + class(SwfStoType) :: this + integer(I4B) :: kiter + real(DP), intent(inout), dimension(:) :: stage_old + real(DP), intent(inout), dimension(:) :: stage_new + class(MatrixBaseType), pointer :: matrix_sln + integer(I4B), intent(in), dimension(:) :: idxglo + real(DP), intent(inout), dimension(:) :: rhs + ! -- local + integer(I4B) :: n, idiag + real(DP) :: derv + real(DP) :: qsto + + ! -- Calculate coefficients and put into amat + do n = 1, this%dis%nodes + ! + ! -- skip if constant stage + if (this%ibound(n) < 0) cycle + + ! Calculate storage and derivative term + call this%calc_storage_dis2d(n, stage_new(n), stage_old(n), & + qsto, derv) + + ! -- Fill amat and rhs + idiag = this%dis%con%ia(n) + call matrix_sln%add_value_pos(idxglo(idiag), -derv) + rhs(n) = rhs(n) + qsto - derv * stage_new(n) + + end do + + end subroutine sto_fc_dis2d + + !> @ brief Calculate flows for package + !< subroutine sto_cq(this, flowja, stage_new, stage_old) - use TdisModule, only: delt ! -- dummy class(SwfStoType) :: this real(DP), intent(inout), dimension(:) :: flowja real(DP), intent(inout), dimension(:) :: stage_new real(DP), intent(inout), dimension(:) :: stage_old ! -- local + real(DP), dimension(:), pointer :: reach_length integer(I4B) :: n integer(I4B) :: idiag real(DP) :: dx - real(DP) :: depth_old - real(DP) :: area_old - real(DP) :: volume_old - real(DP) :: depth_new - real(DP) :: area_new - real(DP) :: volume_new - ! + real(DP) :: q + ! -- test if steady-state stress period if (this%iss /= 0) return - ! + + ! Set pointer to reach_length for 1d + reach_length => this%reach_length_pointer() + ! -- Calculate storage term do n = 1, this%dis%nodes ! ! -- skip if constant stage if (this%ibound(n) < 0) cycle - ! - dx = this%disl%reach_length(n) - depth_old = stage_old(n) - this%disl%reach_bottom(n) - area_old = this%cxs%get_area(this%idcxs(n), this%width(n), depth_old) - volume_old = area_old * dx - depth_new = stage_new(n) - this%disl%reach_bottom(n) - area_new = this%cxs%get_area(this%idcxs(n), this%width(n), depth_new) - volume_new = area_new * dx - this%qsto(n) = -(volume_new - volume_old) / delt + ! Calculate storage for either the DIS1D or DIS2D cases and + ! add to flowja + if (associated(reach_length)) then + dx = reach_length(n) + call this%calc_storage_dis1d(n, stage_new(n), stage_old(n), dx, q) + else + call this%calc_storage_dis2d(n, stage_new(n), stage_old(n), q) + end if + this%qsto(n) = -q idiag = this%dis%con%ia(n) flowja(idiag) = flowja(idiag) + this%qsto(n) @@ -372,6 +407,73 @@ subroutine sto_cq(this, flowja, stage_new, stage_old) return end subroutine sto_cq + subroutine calc_storage_dis1d(this, n, stage_new, stage_old, dx, qsto, derv) + ! module + use TdisModule, only: delt + ! dummy + class(SwfStoType) :: this + integer(I4B), intent(in) :: n + real(DP), intent(in) :: stage_new + real(DP), intent(in) :: stage_old + real(DP), intent(in) :: dx + real(DP), intent(inout) :: qsto + real(DP), intent(inout), optional :: derv + ! local + real(DP) :: depth_new + real(DP) :: depth_old + real(DP) :: width_n + real(DP) :: width_m + real(DP) :: cxs_area_new + real(DP) :: cxs_area_old + real(DP) :: cxs_area_eps + real(DP) :: eps = 1.d-8 + + call this%dis%get_flow_width(n, n, 0, width_n, width_m) + depth_new = stage_new - this%dis%bot(n) + depth_old = stage_old - this%dis%bot(n) + cxs_area_new = this%cxs%get_area(this%idcxs(n), width_n, depth_new) + cxs_area_old = this%cxs%get_area(this%idcxs(n), width_n, depth_old) + qsto = (cxs_area_new - cxs_area_old) * dx / delt + if (present(derv)) then + cxs_area_eps = this%cxs%get_area(this%idcxs(n), width_n, depth_new + eps) + derv = (cxs_area_eps - cxs_area_new) * dx / delt / eps + end if + + end subroutine calc_storage_dis1d + + subroutine calc_storage_dis2d(this, n, stage_new, stage_old, qsto, derv) + ! module + use TdisModule, only: delt + ! dummy + class(SwfStoType) :: this + integer(I4B), intent(in) :: n + real(DP), intent(in) :: stage_new + real(DP), intent(in) :: stage_old + real(DP), intent(inout) :: qsto + real(DP), intent(inout), optional :: derv + ! local + real(DP) :: area + real(DP) :: depth_new + real(DP) :: depth_old + real(DP) :: depth_eps + real(DP) :: volume_new + real(DP) :: volume_old + real(DP) :: eps = 1.d-8 + + area = this%dis%get_area(n) + depth_new = stage_new - this%dis%bot(n) + depth_old = stage_old - this%dis%bot(n) + volume_new = area * depth_new + volume_old = area * depth_old + qsto = (volume_new - volume_old) / delt + + if (present(derv)) then + depth_eps = depth_new + eps + derv = (depth_eps - depth_new) * area / delt / eps + end if + + end subroutine calc_storage_dis2d + !> @ brief Model budget calculation for package !! !! Budget calculation for the STO package components. Components include @@ -455,7 +557,6 @@ subroutine sto_da(this) if (this%inunit > 0) then call mem_deallocate(this%qsto) nullify (this%idcxs) - nullify (this%width) end if ! ! -- Deallocate scalars @@ -634,8 +735,24 @@ subroutine set_dfw_pointers(this) dfw_mem_path = create_mem_path(this%name_model, 'DFW') call mem_setptr(this%idcxs, 'IDCXS', dfw_mem_path) - call mem_setptr(this%width, 'WIDTH', dfw_mem_path) end subroutine set_dfw_pointers + function reach_length_pointer(this) result(ptr) + ! dummy + class(SwfStoType) :: this !< this instance + ! return + real(DP), dimension(:), pointer :: ptr + ! local + class(DisBaseType), pointer :: dis + + ptr => null() + dis => this%dis + select type (dis) + type is (SwfDislType) + ptr => dis%reach_length + end select + + end function reach_length_pointer + end module SwfStoModule diff --git a/src/Model/SurfaceWaterFlow/swf-zdg.f90 b/src/Model/SurfaceWaterFlow/swf-zdg.f90 index 670e7f656c5..d1f404cad4a 100644 --- a/src/Model/SurfaceWaterFlow/swf-zdg.f90 +++ b/src/Model/SurfaceWaterFlow/swf-zdg.f90 @@ -332,7 +332,7 @@ subroutine zdg_cf(this) ! -- calculate terms and add to hcof and rhs absdhdxsq = this%slope(i)**DHALF - depth = this%xnew(node) - this%disl%reach_bottom(node) + depth = this%xnew(node) - this%dis%bot(node) ! -- calculate unperturbed q cond = this%get_cond(i, depth, absdhdxsq, this%unitconv) diff --git a/src/Model/SurfaceWaterFlow/swf.f90 b/src/Model/SurfaceWaterFlow/swf.f90 index afa5175eac5..8d75efe9821 100644 --- a/src/Model/SurfaceWaterFlow/swf.f90 +++ b/src/Model/SurfaceWaterFlow/swf.f90 @@ -116,7 +116,7 @@ module SwfModule !< integer(I4B), parameter :: SWF_NBASEPKG = 50 character(len=LENPACKAGETYPE), dimension(SWF_NBASEPKG) :: SWF_BASEPKG - data SWF_BASEPKG/'DISL6', 'DFW6 ', ' ', ' ', 'CXS6 ', & ! 5 + data SWF_BASEPKG/'DISL6', 'DIS6 ', 'DISV6', 'DFW6 ', 'CXS6 ', & ! 5 &'OC6 ', 'IC6 ', 'OBS6 ', 'STO6 ', ' ', & ! 10 &40*' '/ ! 50 @@ -290,6 +290,8 @@ subroutine swf_df(this) class(BndType), pointer :: packobj ! ! + call this%dis%dis_df() + call this%dfw%dfw_df(this%dis) call this%oc%oc_df() call this%budget%budget_df(NIUNIT_SWF, 'VOLUME', 'L**3') ! @@ -1126,6 +1128,8 @@ subroutine create_packages(this) use MemoryHelperModule, only: create_mem_path use SimVariablesModule, only: idm_context use SwfDislModule, only: disl_cr + use DisModule, only: dis_cr + use DisvModule, only: disv_cr use SwfDfWModule, only: dfw_cr use SwfCxsModule, only: cxs_cr use SwfStoModule, only: sto_cr @@ -1176,6 +1180,12 @@ subroutine create_packages(this) case ('DISL6') indis = 1 call disl_cr(this%dis, this%name, mempath, indis, this%iout) + case ('DIS6') + indis = 1 + call dis_cr(this%dis, this%name, mempath, indis, this%iout) + case ('DISV6') + indis = 1 + call disv_cr(this%dis, this%name, mempath, indis, this%iout) case ('DFW6') this%indfw = 1 mempathdfw = mempath @@ -1208,11 +1218,10 @@ subroutine create_packages(this) this%dis) if (this%indfw > 0) then call dfw_cr(this%dfw, this%name, mempathdfw, this%indfw, this%iout, & - this%dis, this%cxs) + this%cxs) end if if (this%insto > 0) then - call sto_cr(this%sto, this%name, this%insto, this%iout, this%dis, & - this%cxs) + call sto_cr(this%sto, this%name, this%insto, this%iout, this%cxs) end if call oc_cr(this%oc, this%name, this%inoc, this%iout) call swf_obs_cr(this%obs, this%inobs) diff --git a/src/meson.build b/src/meson.build index d2bb50bc27d..160b4dfb4a0 100644 --- a/src/meson.build +++ b/src/meson.build @@ -76,6 +76,8 @@ modflow_sources = files( 'Idm' / 'gwt-icidm.f90', 'Idm' / 'gwt-namidm.f90', 'Idm' / 'swf-dislidm.f90', + 'Idm' / 'swf-disidm.f90', + 'Idm' / 'swf-disvidm.f90', 'Idm' / 'swf-namidm.f90', 'Idm' / 'swf-cxsidm.f90', 'Idm' / 'swf-dfwidm.f90', diff --git a/utils/idmloader/dfns.txt b/utils/idmloader/dfns.txt index f67efab0ab0..e233a63dd2b 100644 --- a/utils/idmloader/dfns.txt +++ b/utils/idmloader/dfns.txt @@ -44,6 +44,8 @@ gwe-dis.dfn # swf model swf-nam.dfn swf-disl.dfn +swf-dis.dfn +swf-disv.dfn swf-cxs.dfn swf-dfw.dfn swf-ic.dfn diff --git a/utils/mf5to6/make/makedefaults b/utils/mf5to6/make/makedefaults index 90b934de204..6f41e3e6199 100644 --- a/utils/mf5to6/make/makedefaults +++ b/utils/mf5to6/make/makedefaults @@ -57,11 +57,11 @@ OPTLEVEL ?= -O2 # set the fortran flags ifeq ($(detected_OS), Windows) ifeq ($(FC), gfortran) - FFLAGS ?= -static -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid $(OS_macro) -cpp + FFLAGS ?= -static -fbacktrace $(OS_macro) -cpp endif else ifeq ($(FC), gfortran) - FFLAGS ?= -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid $(OS_macro) -cpp + FFLAGS ?= -fbacktrace $(OS_macro) -cpp endif ifeq ($(FC), $(filter $(FC), ifort mpiifort)) FFLAGS ?= -no-heap-arrays -fpe0 -traceback -Qdiag-disable:7416 -Qdiag-disable:7025 -Qdiag-disable:5268 -fpp diff --git a/utils/mf5to6/make/makefile b/utils/mf5to6/make/makefile index dc152caa230..7be8104af54 100644 --- a/utils/mf5to6/make/makefile +++ b/utils/mf5to6/make/makefile @@ -5,10 +5,10 @@ include ./makedefaults # Define the source file directories SOURCEDIR1=../src -SOURCEDIR2=../src/MF2005 -SOURCEDIR3=../src/NWT -SOURCEDIR4=../src/LGR -SOURCEDIR5=../src/Preproc +SOURCEDIR2=../src/NWT +SOURCEDIR3=../src/LGR +SOURCEDIR4=../src/Preproc +SOURCEDIR5=../src/MF2005 SOURCEDIR6=../../../src/Utilities/Memory SOURCEDIR7=../../../src/Utilities/TimeSeries SOURCEDIR8=../../../src/Utilities diff --git a/utils/zonebudget/make/makedefaults b/utils/zonebudget/make/makedefaults index bdcd84dddbf..16a46abbb63 100644 --- a/utils/zonebudget/make/makedefaults +++ b/utils/zonebudget/make/makedefaults @@ -57,11 +57,11 @@ OPTLEVEL ?= -O2 # set the fortran flags ifeq ($(detected_OS), Windows) ifeq ($(FC), gfortran) - FFLAGS ?= -static -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid -fall-intrinsics -pedantic -Wcharacter-truncation $(OS_macro) -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -std=f2008 -cpp + FFLAGS ?= -static -fbacktrace $(OS_macro) -fall-intrinsics -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -pedantic -std=f2008 -Wcharacter-truncation -cpp endif else ifeq ($(FC), gfortran) - FFLAGS ?= -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid -fall-intrinsics -pedantic -Wcharacter-truncation $(OS_macro) -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -std=f2008 -cpp + FFLAGS ?= -fbacktrace $(OS_macro) -fall-intrinsics -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -pedantic -std=f2008 -Wcharacter-truncation -cpp endif ifeq ($(FC), $(filter $(FC), ifort mpiifort)) FFLAGS ?= -no-heap-arrays -fpe0 -traceback -Qdiag-disable:7416 -Qdiag-disable:7025 -Qdiag-disable:5268 -fpp From 9aeeaa4c20ed0946fbd46516160b15bbe175d7de Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Sun, 17 Mar 2024 11:18:50 -0400 Subject: [PATCH 066/199] ci(parallel): fix windows parallel mf6 build (#1677) * libpetsc.dll wasn't found if PETSc cache miss, maybe interference from cygwin setup? setup PETSc environment after building PETSc to workaround * simplify ONEAPI_ROOT usages --- .github/actions/test-par-win/action.yml | 31 +++++++++++-------------- .github/common/test_modflow6.bat | 1 + .github/workflows/ci.yml | 2 +- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/.github/actions/test-par-win/action.yml b/.github/actions/test-par-win/action.yml index b5b85de8863..7fdf470c1c4 100644 --- a/.github/actions/test-par-win/action.yml +++ b/.github/actions/test-par-win/action.yml @@ -26,7 +26,6 @@ runs: run: echo "date=$(/bin/date -u "+%Y%m%d")" >> "$GITHUB_OUTPUT" - name: Set oneAPI install dir - id: oneapi-root shell: bash run: echo "ONEAPI_ROOT=C:\Program Files (x86)\Intel\oneAPI" >> "$GITHUB_ENV" @@ -71,15 +70,6 @@ runs: path: petsc key: petsc-${{ runner.os }}-${{ steps.get-date.outputs.date }} - - name: Configure environment - shell: bash - run: | - PETSC_DIR=$GITHUB_WORKSPACE/petsc - PETSC_ARCH=arch-mswin-c-opt - echo "PETSC_DIR=$PETSC_DIR" >> $GITHUB_ENV - echo "PETSC_ARCH=$PETSC_ARCH" >> $GITHUB_ENV - echo "$PETSC_DIR/$PETSC_ARCH/lib" >> $GITHUB_PATH - - name: Download PETSc if: steps.petsc-cache.outputs.cache-hit != 'true' shell: bash @@ -97,21 +87,19 @@ runs: - name: Hide Cygwin linker if: steps.petsc-cache.outputs.cache-hit != 'true' shell: C:\tools\cygwin\bin\bash.exe --login --norc -eo pipefail -o igncr '{0}' - run: | - mv /usr/bin/link.exe /usr/bin/link-cygwin.exe - which link + run: mv /usr/bin/link.exe /usr/bin/link-cygwin.exe - name: Configure PETSc if: steps.petsc-cache.outputs.cache-hit != 'true' shell: cmd run: | - "${{ env.ONEAPI_ROOT }}\setvars.bat" intel64 vs2022 && "C:\tools\cygwin\bin\bash.exe" --login --norc -eo pipefail -o igncr "%TEMP%\configure_petsc.sh" + "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "C:\tools\cygwin\bin\bash.exe" --login --norc -eo pipefail -o igncr "%TEMP%\configure_petsc.sh" - name: Build PETSc if: steps.petsc-cache.outputs.cache-hit != 'true' shell: cmd run: | - "${{ env.ONEAPI_ROOT }}\setvars.bat" intel64 vs2022 && "C:\tools\cygwin\bin\bash.exe" --login --norc -eo pipefail -o igncr "%TEMP%\compile_petsc.sh" + "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "C:\tools\cygwin\bin\bash.exe" --login --norc -eo pipefail -o igncr "%TEMP%\compile_petsc.sh" - name: Save PETSc cache if: steps.petsc-cache.outputs.cache-hit != 'true' @@ -120,10 +108,19 @@ runs: path: petsc key: petsc-${{ runner.os }}-${{ steps.get-date.outputs.date }} + - name: Setup PETSC environment + shell: cmd + run: | + set PETSC_DIR=%GITHUB_WORKSPACE%\petsc + set PETSC_ARCH=arch-mswin-c-opt + echo PETSC_DIR=%PETSC_DIR%>>%GITHUB_ENV% + echo PETSC_ARCH=%PETSC_ARCH%>>%GITHUB_ENV% + echo %PETSC_DIR%\%PETSC_ARCH%\lib>>%GITHUB_PATH% + - name: Build modflow6 shell: cmd run: | - "${{ env.ONEAPI_ROOT }}\setvars.bat" intel64 vs2022 && "%TEMP%\compile_modflow6.bat" + "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "%TEMP%\compile_modflow6.bat" - name: Show Meson logs if: failure() @@ -149,4 +146,4 @@ runs: env: REPOS_PATH: ${{ github.workspace }} run: | - "${{ env.ONEAPI_ROOT }}\setvars.bat" intel64 vs2022 && "%TEMP%\test_modflow6.bat" \ No newline at end of file + "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "%TEMP%\test_modflow6.bat" \ No newline at end of file diff --git a/.github/common/test_modflow6.bat b/.github/common/test_modflow6.bat index af180d981ae..8fe57923c32 100644 --- a/.github/common/test_modflow6.bat +++ b/.github/common/test_modflow6.bat @@ -1,3 +1,4 @@ cd "%GITHUB_WORKSPACE%\modflow6\autotest" +where libpetsc.dll ldd ..\bin\mf6 micromamba run -r "C:\Users\runneradmin\micromamba" -n modflow6 pytest -v -n auto --parallel -k "test_par" --durations 0 --keep-failed .failed \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f713859309a..9d54c6a6fb7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -422,7 +422,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-22.04, macos-12, windows-2022 ] + os: [ windows-2022 ] # ubuntu-22.04, macos-12, windows-2022 ] defaults: run: shell: bash -l {0} From 743c4ea2604e5ed7228ea0e02303e06d64e4256d Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Sun, 17 Mar 2024 22:53:13 -0400 Subject: [PATCH 067/199] ci(parallel): re-enable linux/mac, forgot to restore after debugging (#1679) --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9d54c6a6fb7..f713859309a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -422,7 +422,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ windows-2022 ] # ubuntu-22.04, macos-12, windows-2022 ] + os: [ ubuntu-22.04, macos-12, windows-2022 ] defaults: run: shell: bash -l {0} From 563a201aec8bc48f5eed8f94d7dc3ebba856ebd8 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 18 Mar 2024 10:09:46 -0400 Subject: [PATCH 068/199] ci: test oldest supported python (currently 3.9) (#1680) * probably want to maintain compatibility until version EOL * catch syntax usages only supported on newer versions * update print format syntax in test_swf_dfw_bowl.py (no nested quotes) --- .github/workflows/ci.yml | 4 ++++ autotest/test_swf_dfw_bowl.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f713859309a..cf4337f7b43 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -230,6 +230,8 @@ jobs: uses: mamba-org/setup-micromamba@v1 with: environment-file: modflow6/environment.yml + create-args: >- + python=3.9 init-shell: >- bash powershell @@ -438,6 +440,8 @@ jobs: uses: mamba-org/setup-micromamba@v1 with: environment-file: modflow6/environment.yml + create-args: >- + python=3.9 init-shell: >- bash powershell diff --git a/autotest/test_swf_dfw_bowl.py b/autotest/test_swf_dfw_bowl.py index ece2695443e..7941129411b 100644 --- a/autotest/test_swf_dfw_bowl.py +++ b/autotest/test_swf_dfw_bowl.py @@ -253,7 +253,7 @@ def check_output(idx, test): # print out the answer in a form that can be # dropped into this script, if necessary, as the answer for v in stage_all[-1].flatten(): - print(f"{2*" "}{v:.8f},") + print(f"{v:18.8f},") msg = ( "Simulated stage does not match with the answer " From a015e682324e4722d9a2f65557153d0237858db9 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 19 Mar 2024 15:27:57 -0400 Subject: [PATCH 069/199] fix(PRT): fix conditionals controlling particle advance (#1681) * conditions to determine whether particle should continue advancing were not independent * set cell when initializing subcell methods, not currently needed but might be in future * minor cleanup in test_prt_budget.py --- autotest/test_prt_budget.py | 2 +- src/Solution/ParticleTracker/Method.f90 | 10 ++++++++-- src/Solution/ParticleTracker/MethodCellPollock.f90 | 1 + .../ParticleTracker/MethodCellPollockQuad.f90 | 1 + src/Solution/ParticleTracker/MethodCellTernary.f90 | 1 + src/Solution/ParticleTracker/MethodDis.f90 | 11 ++++++----- 6 files changed, 18 insertions(+), 8 deletions(-) diff --git a/autotest/test_prt_budget.py b/autotest/test_prt_budget.py index 7c65a3f45ec..59357810112 100644 --- a/autotest/test_prt_budget.py +++ b/autotest/test_prt_budget.py @@ -87,7 +87,7 @@ def build_prt_sim(name, gwf_ws, prt_ws, mf6): perioddata={0: ["FIRST"]}, track_filerecord=[prp_track_file], trackcsv_filerecord=[prp_track_csv_file], - stop_at_weak_sink="saws" in prt_name, + stop_at_weak_sink=False, boundnames=True, ) diff --git a/src/Solution/ParticleTracker/Method.f90 b/src/Solution/ParticleTracker/Method.f90 index 5a0820bc11a..10ae60d5532 100644 --- a/src/Solution/ParticleTracker/Method.f90 +++ b/src/Solution/ParticleTracker/Method.f90 @@ -173,21 +173,27 @@ subroutine update(this, particle, cell_defn) particle%istatus = 6 call this%trackfilectl%save(particle, kper=kper, & kstp=kstp, reason=3) ! reason=3: termination + return end if - else if (cell_defn%inoexitface .ne. 0) then + end if + if (cell_defn%inoexitface .ne. 0) then particle%advancing = .false. particle%istatus = 5 call this%trackfilectl%save(particle, kper=kper, & kstp=kstp, reason=3) ! reason=3: termination - else if (cell_defn%iweaksink .ne. 0) then + return + end if + if (cell_defn%iweaksink .ne. 0) then if (particle%istopweaksink .ne. 0) then particle%advancing = .false. particle%istatus = 3 call this%trackfilectl%save(particle, kper=kper, & kstp=kstp, reason=3) ! reason=3: termination + return else call this%trackfilectl%save(particle, kper=kper, & kstp=kstp, reason=4) ! reason=4: exited weak sink + return end if end if end subroutine update diff --git a/src/Solution/ParticleTracker/MethodCellPollock.f90 b/src/Solution/ParticleTracker/MethodCellPollock.f90 index 08cecf422a6..357fde67c7c 100644 --- a/src/Solution/ParticleTracker/MethodCellPollock.f90 +++ b/src/Solution/ParticleTracker/MethodCellPollock.f90 @@ -64,6 +64,7 @@ subroutine load_mcp(this, particle, next_level, submethod) call this%load_subcell(particle, subcell) end select call method_subcell_plck%init( & + cell=this%cell, & subcell=this%subcell, & trackfilectl=this%trackfilectl, & tracktimes=this%tracktimes) diff --git a/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 b/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 index 8834de4ed6f..9335731fe9c 100644 --- a/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 +++ b/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 @@ -62,6 +62,7 @@ subroutine load_mcpq(this, particle, next_level, submethod) call this%load_subcell(particle, subcell) end select call method_subcell_plck%init( & + cell=this%cell, & subcell=this%subcell, & trackfilectl=this%trackfilectl, & tracktimes=this%tracktimes) diff --git a/src/Solution/ParticleTracker/MethodCellTernary.f90 b/src/Solution/ParticleTracker/MethodCellTernary.f90 index b84a86d78d2..53765297b91 100644 --- a/src/Solution/ParticleTracker/MethodCellTernary.f90 +++ b/src/Solution/ParticleTracker/MethodCellTernary.f90 @@ -80,6 +80,7 @@ subroutine load_mct(this, particle, next_level, submethod) call this%load_subcell(particle, subcell) end select call method_subcell_tern%init( & + cell=this%cell, & subcell=this%subcell, & trackfilectl=this%trackfilectl, & tracktimes=this%tracktimes) diff --git a/src/Solution/ParticleTracker/MethodDis.f90 b/src/Solution/ParticleTracker/MethodDis.f90 index 91c87a61864..47a606a06ad 100644 --- a/src/Solution/ParticleTracker/MethodDis.f90 +++ b/src/Solution/ParticleTracker/MethodDis.f90 @@ -383,9 +383,7 @@ subroutine load_flows_to_defn(this, defn) ! -- allocate faceflow array call ExpandArray(defn%faceflow, npolyverts + 3) - ! -- Load face flows. Note that the faceflow array - ! -- does not get reallocated if it is already allocated - ! -- to a size greater than or equal to npolyverts+3. + ! -- Load face flows. defn%faceflow = 0d0 ! kluge note: eventually use DZERO for 0d0 throughout ! -- As with polygon nbrs, polygon face flows wrap around for ! -- convenience at position npolyverts+1, and bot and top flows @@ -394,8 +392,8 @@ subroutine load_flows_to_defn(this, defn) n = defn%facenbr(m) if (n > 0) & defn%faceflow(m) = this%fmi%gwfflowja(this%fmi%dis%con%ia(ic) + n) - ! if (cellDefn%faceflow(m) < 0d0) defn%inoexitface = 0 end do + ! -- Add BoundaryFlows to face flows call this%load_boundary_flows_to_defn(defn) ! -- Set inoexitface flag @@ -414,6 +412,7 @@ subroutine load_flows_to_defn(this, defn) else defn%iweaksink = 0 end if + end subroutine load_flows_to_defn !> @brief Add boundary flows to the cell definition faceflow array. @@ -423,9 +422,11 @@ subroutine load_boundary_flows_to_defn(this, defn) class(MethodDisType), intent(inout) :: this type(CellDefnType), intent(inout) :: defn ! -- local + integer(I4B) :: ic integer(I4B) :: ioffset - ioffset = (defn%icell - 1) * 10 + ic = defn%icell + ioffset = (ic - 1) * 10 defn%faceflow(1) = defn%faceflow(1) + & this%fmi%BoundaryFlows(ioffset + 1) ! kluge note: should these be additive (seems so)??? defn%faceflow(2) = defn%faceflow(2) + & From bb3763c21dc939370366798433c7492eba0a1953 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 22 Mar 2024 15:12:20 -0400 Subject: [PATCH 070/199] ci(parallel): add parallel windows distribution (#1682) Add a parallel Windows distribution to the release workflow, making it available both on the nightly build and in official releases. The archive is named win64par.zip and contains all non-system dependencies. This avoids the need for software installations or other actions requiring elevation for the end user. Bundled dependencies include: - MSVC runtime * ucrtbase.dll * msvcrt.dll * msvcp_win.dll * MSVCP140.dll * VCRUNTIME140.dll * VCRUNTIME140_1.dll - oneAPI (Fortran compiler, MKL, MPI) * libifcoremd.dll * libmmd.dll * mkl_mc3.2.dll * mkl_core.2.dll * mkl_avx512.2.dll * mkl_avx2.2.dll * mkl_def.2.dll * mkl_sequential.2.dll * libfabric.dll * impi.dll * mpiexec.exe * hydra_bstrap_proxy.exe * hydra_pmi_proxy.exe * hydra_service.exe - PETSc * libpetsc.dll Miscellaneous: - factor out action to build mf6 parallel on windows - add developmode toggle to release_dispatch.yml --- .github/actions/build-par-win/action.yml | 129 +++++++++++++++++++++++ .github/actions/test-par-win/action.yml | 125 +--------------------- .github/workflows/release.yml | 107 ++++++++++++------- .github/workflows/release_dispatch.yml | 7 +- README.md | 2 +- 5 files changed, 209 insertions(+), 161 deletions(-) create mode 100644 .github/actions/build-par-win/action.yml diff --git a/.github/actions/build-par-win/action.yml b/.github/actions/build-par-win/action.yml new file mode 100644 index 00000000000..f92c6d83079 --- /dev/null +++ b/.github/actions/build-par-win/action.yml @@ -0,0 +1,129 @@ +name: Build parallel MF6 (Windows) +description: Build parallel MODFLOW 6 on Windows +runs: + using: "composite" + steps: + + - name: Convert line endings + shell: cmd + run: | + unix2dos -n "modflow6\.github\common\configure_petsc.sh" "%TEMP%\configure_petsc.sh" + unix2dos -n "modflow6\.github\common\compile_petsc.sh" "%TEMP%\compile_petsc.sh" + unix2dos -n "modflow6\.github\common\compile_modflow6.bat" "%TEMP%\compile_modflow6.bat" + unix2dos -n "modflow6\.github\common\test_modflow6.bat" "%TEMP%\test_modflow6.bat" + + - name: Hide Strawberry programs + shell: bash + run: | + mkdir "$RUNNER_TEMP/strawberry" + mv /c/Strawberry/c/bin/gmake "$RUNNER_TEMP/strawberry/gmake" + mv /c/Strawberry/perl/bin/pkg-config "$RUNNER_TEMP/strawberry/pkg-config" + mv /c/Strawberry/perl/bin/pkg-config.bat "$RUNNER_TEMP/strawberry/pkg-config.bat" + + - name: Get date + id: get-date + shell: bash + run: echo "date=$(/bin/date -u "+%Y%m%d")" >> "$GITHUB_OUTPUT" + + - name: Set oneAPI install dir + shell: bash + run: echo "ONEAPI_ROOT=C:\Program Files (x86)\Intel\oneAPI" >> "$GITHUB_ENV" + + - name: Restore oneAPI cache + id: oneapi-cache + uses: actions/cache/restore@v3 + with: + path: ${{ env.ONEAPI_ROOT }} + key: oneapi-${{ runner.os }}-${{ steps.get-date.outputs.date }} + + - name: Install oneAPI BaseKit + shell: bash + if: steps.oneapi-cache.outputs.cache-hit != 'true' + run: | + url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/5cb30fb9-21e9-47e8-82da-a91e00191670/w_BaseKit_p_2024.0.1.45_offline.exe" + cmp="intel.oneapi.win.mkl.devel" + "modflow6/.github/common/install_intel_windows.bat" $url $cmp + rm -rf $TEMP/webimage.exe + rm -rf $TEMP/webimage_extracted + + - name: Install oneAPI HPCKit + shell: bash + if: steps.oneapi-cache.outputs.cache-hit != 'true' + run: | + url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/7a6db8a1-a8b9-4043-8e8e-ca54b56c34e4/w_HPCKit_p_2024.0.1.35_offline.exe" + cmp="intel.oneapi.win.cpp-dpcpp-common:intel.oneapi.win.ifort-compiler:intel.oneapi.win.mpi.devel" + "modflow6/.github/common/install_intel_windows.bat" $url $cmp + rm -rf $TEMP/webimage.exe + rm -rf $TEMP/webimage_extracted + + - name: Save oneAPI cache + if: steps.oneapi-cache.outputs.cache-hit != 'true' + uses: actions/cache/save@v3 + with: + path: ${{ env.ONEAPI_ROOT }} + key: oneapi-${{ runner.os }}-${{ steps.get-date.outputs.date }} + + - name: Restore PETSc cache + id: petsc-cache + uses: actions/cache/restore@v3 + with: + path: petsc + key: petsc-${{ runner.os }}-${{ steps.get-date.outputs.date }} + + - name: Download PETSc + if: steps.petsc-cache.outputs.cache-hit != 'true' + shell: bash + run: | + curl https://web.cels.anl.gov/projects/petsc/download/release-snapshots/petsc-3.20.5.tar.gz -O -J + mkdir petsc + tar -xzf petsc-3.20.5.tar.gz -C petsc --strip-components=1 + + - name: Setup Cygwin + if: steps.petsc-cache.outputs.cache-hit != 'true' + uses: egor-tensin/setup-cygwin@v4 + with: + packages: python3 make gcc-core gcc-g++ pkg-config + + - name: Hide Cygwin linker + if: steps.petsc-cache.outputs.cache-hit != 'true' + shell: C:\tools\cygwin\bin\bash.exe --login --norc -eo pipefail -o igncr '{0}' + run: mv /usr/bin/link.exe /usr/bin/link-cygwin.exe + + - name: Configure PETSc + if: steps.petsc-cache.outputs.cache-hit != 'true' + shell: cmd + run: | + "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "C:\tools\cygwin\bin\bash.exe" --login --norc -eo pipefail -o igncr "%TEMP%\configure_petsc.sh" + + - name: Build PETSc + if: steps.petsc-cache.outputs.cache-hit != 'true' + shell: cmd + run: | + "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "C:\tools\cygwin\bin\bash.exe" --login --norc -eo pipefail -o igncr "%TEMP%\compile_petsc.sh" + + - name: Save PETSc cache + if: steps.petsc-cache.outputs.cache-hit != 'true' + uses: actions/cache/save@v3 + with: + path: petsc + key: petsc-${{ runner.os }}-${{ steps.get-date.outputs.date }} + + - name: Setup PETSC environment + shell: cmd + run: | + set PETSC_DIR=%GITHUB_WORKSPACE%\petsc + set PETSC_ARCH=arch-mswin-c-opt + echo PETSC_DIR=%PETSC_DIR%>>%GITHUB_ENV% + echo PETSC_ARCH=%PETSC_ARCH%>>%GITHUB_ENV% + echo %PETSC_DIR%\%PETSC_ARCH%\lib>>%GITHUB_PATH% + + - name: Build modflow6 + shell: cmd + run: | + "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "%TEMP%\compile_modflow6.bat" + + - name: Show Meson logs + if: failure() + shell: bash + working-directory: modflow6 + run: cat builddir/meson-logs/meson-log.txt \ No newline at end of file diff --git a/.github/actions/test-par-win/action.yml b/.github/actions/test-par-win/action.yml index 7fdf470c1c4..10766d9749b 100644 --- a/.github/actions/test-par-win/action.yml +++ b/.github/actions/test-par-win/action.yml @@ -4,129 +4,8 @@ runs: using: "composite" steps: - - name: Convert line endings - shell: cmd - run: | - unix2dos -n "modflow6\.github\common\configure_petsc.sh" "%TEMP%\configure_petsc.sh" - unix2dos -n "modflow6\.github\common\compile_petsc.sh" "%TEMP%\compile_petsc.sh" - unix2dos -n "modflow6\.github\common\compile_modflow6.bat" "%TEMP%\compile_modflow6.bat" - unix2dos -n "modflow6\.github\common\test_modflow6.bat" "%TEMP%\test_modflow6.bat" - - - name: Hide Strawberry programs - shell: bash - run: | - mkdir "$RUNNER_TEMP/strawberry" - mv /c/Strawberry/c/bin/gmake "$RUNNER_TEMP/strawberry/gmake" - mv /c/Strawberry/perl/bin/pkg-config "$RUNNER_TEMP/strawberry/pkg-config" - mv /c/Strawberry/perl/bin/pkg-config.bat "$RUNNER_TEMP/strawberry/pkg-config.bat" - - - name: Get date - id: get-date - shell: bash - run: echo "date=$(/bin/date -u "+%Y%m%d")" >> "$GITHUB_OUTPUT" - - - name: Set oneAPI install dir - shell: bash - run: echo "ONEAPI_ROOT=C:\Program Files (x86)\Intel\oneAPI" >> "$GITHUB_ENV" - - - name: Restore oneAPI cache - id: oneapi-cache - uses: actions/cache/restore@v3 - with: - path: ${{ env.ONEAPI_ROOT }} - key: oneapi-${{ runner.os }}-${{ steps.get-date.outputs.date }} - - - name: Install oneAPI BaseKit - shell: bash - if: steps.oneapi-cache.outputs.cache-hit != 'true' - run: | - url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/5cb30fb9-21e9-47e8-82da-a91e00191670/w_BaseKit_p_2024.0.1.45_offline.exe" - cmp="intel.oneapi.win.mkl.devel" - "modflow6/.github/common/install_intel_windows.bat" $url $cmp - rm -rf $TEMP/webimage.exe - rm -rf $TEMP/webimage_extracted - - - name: Install oneAPI HPCKit - shell: bash - if: steps.oneapi-cache.outputs.cache-hit != 'true' - run: | - url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/7a6db8a1-a8b9-4043-8e8e-ca54b56c34e4/w_HPCKit_p_2024.0.1.35_offline.exe" - cmp="intel.oneapi.win.cpp-dpcpp-common:intel.oneapi.win.ifort-compiler:intel.oneapi.win.mpi.devel" - "modflow6/.github/common/install_intel_windows.bat" $url $cmp - rm -rf $TEMP/webimage.exe - rm -rf $TEMP/webimage_extracted - - - name: Save oneAPI cache - if: steps.oneapi-cache.outputs.cache-hit != 'true' - uses: actions/cache/save@v3 - with: - path: ${{ env.ONEAPI_ROOT }} - key: oneapi-${{ runner.os }}-${{ steps.get-date.outputs.date }} - - - name: Restore PETSc cache - id: petsc-cache - uses: actions/cache/restore@v3 - with: - path: petsc - key: petsc-${{ runner.os }}-${{ steps.get-date.outputs.date }} - - - name: Download PETSc - if: steps.petsc-cache.outputs.cache-hit != 'true' - shell: bash - run: | - curl https://web.cels.anl.gov/projects/petsc/download/release-snapshots/petsc-3.20.5.tar.gz -O -J - mkdir petsc - tar -xzf petsc-3.20.5.tar.gz -C petsc --strip-components=1 - - - name: Setup Cygwin - if: steps.petsc-cache.outputs.cache-hit != 'true' - uses: egor-tensin/setup-cygwin@v4 - with: - packages: python3 make gcc-core gcc-g++ pkg-config - - - name: Hide Cygwin linker - if: steps.petsc-cache.outputs.cache-hit != 'true' - shell: C:\tools\cygwin\bin\bash.exe --login --norc -eo pipefail -o igncr '{0}' - run: mv /usr/bin/link.exe /usr/bin/link-cygwin.exe - - - name: Configure PETSc - if: steps.petsc-cache.outputs.cache-hit != 'true' - shell: cmd - run: | - "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "C:\tools\cygwin\bin\bash.exe" --login --norc -eo pipefail -o igncr "%TEMP%\configure_petsc.sh" - - - name: Build PETSc - if: steps.petsc-cache.outputs.cache-hit != 'true' - shell: cmd - run: | - "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "C:\tools\cygwin\bin\bash.exe" --login --norc -eo pipefail -o igncr "%TEMP%\compile_petsc.sh" - - - name: Save PETSc cache - if: steps.petsc-cache.outputs.cache-hit != 'true' - uses: actions/cache/save@v3 - with: - path: petsc - key: petsc-${{ runner.os }}-${{ steps.get-date.outputs.date }} - - - name: Setup PETSC environment - shell: cmd - run: | - set PETSC_DIR=%GITHUB_WORKSPACE%\petsc - set PETSC_ARCH=arch-mswin-c-opt - echo PETSC_DIR=%PETSC_DIR%>>%GITHUB_ENV% - echo PETSC_ARCH=%PETSC_ARCH%>>%GITHUB_ENV% - echo %PETSC_DIR%\%PETSC_ARCH%\lib>>%GITHUB_PATH% - - - name: Build modflow6 - shell: cmd - run: | - "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "%TEMP%\compile_modflow6.bat" - - - name: Show Meson logs - if: failure() - shell: bash - working-directory: modflow6 - run: cat builddir/meson-logs/meson-log.txt + - name: Build MF6 parallel + uses: ./modflow6/.github/actions/build-par-win - name: Update flopy working-directory: modflow6/autotest diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6737e9d9359..b06f1eeef4e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -56,7 +56,7 @@ on: value: ${{ jobs.build.outputs.distname }} jobs: build: - name: Build binaries (${{ matrix.os }}) + name: Build binaries (${{ matrix.os }}, parallel=${{ matrix.parallel }}) runs-on: ${{ matrix.os }} strategy: fail-fast: false @@ -65,15 +65,23 @@ jobs: - os: ${{ inputs.linux_version }} compiler: ${{ inputs.compiler_toolchain }} version: ${{ inputs.compiler_version }} + parallel: false - os: macos-13 compiler: ${{ inputs.compiler_toolchain }} version: ${{ inputs.compiler_version }} + parallel: false - os: macos-14 compiler: gcc version: 13 + parallel: false - os: windows-2022 compiler: ${{ inputs.compiler_toolchain }} version: ${{ inputs.compiler_version }} + parallel: false + - os: windows-2022 + compiler: intel-classic + version: "2021.7" + parallel: true defaults: run: shell: bash -l {0} @@ -99,6 +107,7 @@ jobs: powershell - name: Setup ${{ matrix.compiler }} ${{ matrix.version }} + if: (!(runner.os == 'Windows' && matrix.parallel)) id: setup-fortran uses: fortran-lang/setup-fortran@v1 with: @@ -131,6 +140,15 @@ jobs: fi eval "$cmd" + - name: Get OS tag + id: ostag + run: | + ostag=$(python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") + if [[ "${{ matrix.parallel }}" == "true" ]]; then + ostag="${ostag}par" + fi + echo "ostag=$ostag" >> $GITHUB_OUTPUT + # for statically linked gfortran ARM mac build - name: Hide dylibs (macOS) if: matrix.os == 'macos-14' @@ -148,34 +166,59 @@ jobs: fi - name: Build binaries - if: runner.os != 'Windows' - working-directory: modflow6 - run: | - meson setup builddir -Ddebug=false --prefix=$(pwd) --libdir=bin - meson install -C builddir - meson test --verbose --no-rebuild -C builddir - - - name: Build binaries (Windows) - if: runner.os == 'Windows' + if: (!(runner.os == 'Windows' && matrix.parallel)) working-directory: modflow6 - shell: pwsh run: | meson setup builddir -Ddebug=false --prefix=$(pwd) --libdir=bin meson install -C builddir meson test --verbose --no-rebuild -C builddir - - name: Get OS tag - id: ostag - run: | - ostag=$(python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") - echo "ostag=$ostag" >> $GITHUB_OUTPUT - - name: Check architecture (macOS) working-directory: modflow6/bin if: runner.os == 'macOS' run: | otool -L mf6 - lipo -info mf6 + lipo -info mf6 + + - name: Build binaries (Windows) + if: runner.os == 'Windows' && matrix.parallel && !inputs.run_tests + uses: ./modflow6/.github/actions/build-par-win + + - name: Build and test binaries (Windows) + if: runner.os == 'Windows' && matrix.parallel && inputs.run_tests + uses: ./modflow6/.github/actions/test-par-win + + - name: Copy deps to bin dir + if: runner.os == 'Windows' && matrix.parallel + working-directory: modflow6/bin + shell: cmd + run: | + :: copy dependencies + copy "C:\Windows\System32\ucrtbase.dll" . + copy "C:\Windows\System32\msvcrt.dll" . + copy "C:\Windows\System32\msvcp_win.dll" . + copy "C:\Windows\SYSTEM32\MSVCP140.dll" . + copy "C:\Windows\SYSTEM32\VCRUNTIME140.dll" . + copy "C:\Windows\SYSTEM32\VCRUNTIME140_1.dll" . + copy "C:\Program Files (x86)\Intel\oneAPI\compiler\latest\bin\libifcoremd.dll" . + copy "C:\Program Files (x86)\Intel\oneAPI\compiler\latest\bin\libmmd.dll" . + copy "C:\Program Files (x86)\Intel\oneAPI\mkl\latest\bin\mkl_sequential.2.dll" . + copy "C:\Program Files (x86)\Intel\oneAPI\mkl\latest\bin\mkl_core.2.dll" . + copy "C:\Program Files (x86)\Intel\oneAPI\mkl\latest\bin\mkl_def.2.dll" . + copy "C:\Program Files (x86)\Intel\oneAPI\mkl\latest\bin\mkl_avx2.2.dll" . + copy "C:\Program Files (x86)\Intel\oneAPI\mkl\latest\bin\mkl_avx512.2.dll" . + copy "C:\Program Files (x86)\Intel\oneAPI\mkl\latest\bin\mkl_mc3.2.dll" . + copy "C:\Program Files (x86)\Intel\oneAPI\mpi\latest\bin\impi.dll" . + copy "C:\Program Files (x86)\Intel\oneAPI\mpi\latest\opt\mpi\libfabric\bin\libfabric.dll" . + copy "C:\Program Files (x86)\Intel\oneAPI\mpi\latest\bin\mpiexec.exe" . + copy "C:\Program Files (x86)\Intel\oneAPI\mpi\latest\bin\hydra_bstrap_proxy.exe" . + copy "C:\Program Files (x86)\Intel\oneAPI\mpi\latest\bin\hydra_pmi_proxy.exe" . + copy "C:\Program Files (x86)\Intel\oneAPI\mpi\latest\bin\hydra_service.exe" . + copy "D:\a\modflow6\modflow6\petsc\arch-mswin-c-opt\lib\libpetsc.dll" . + + :: remove rebuilt and downloaded dirs + if exist rebuilt rd /s /q rebuilt + if exist rebuilt rd /s /q downloaded - name: Upload binaries uses: actions/upload-artifact@v3 @@ -183,28 +226,27 @@ jobs: name: bin-${{ steps.ostag.outputs.ostag }} path: modflow6/bin - # only run steps below if inputs.run_tests is true - name: Checkout modflow6-testmodels - if: inputs.run_tests == true + if: inputs.run_tests == true && runner.os != 'Windows' uses: actions/checkout@v4 with: repository: MODFLOW-USGS/modflow6-testmodels path: modflow6-testmodels - name: Checkout modflow6-examples - if: inputs.run_tests == true + if: inputs.run_tests == true && runner.os != 'Windows' uses: actions/checkout@v4 with: repository: MODFLOW-USGS/modflow6-examples path: modflow6-examples - name: Update flopy - if: inputs.run_tests == true + if: inputs.run_tests == true && runner.os != 'Windows' working-directory: modflow6/autotest run: python update_flopy.py - name: Get executables - if: inputs.run_tests == true + if: inputs.run_tests == true && runner.os != 'Windows' working-directory: modflow6/autotest env: GITHUB_TOKEN: ${{ github.token }} @@ -222,19 +264,6 @@ jobs: fi pytest -v -n auto --durations 0 -m "$markers" - - name: Test modflow6 (Windows) - if: inputs.run_tests == true && runner.os == 'Windows' - working-directory: modflow6/autotest - shell: pwsh - env: - REPOS_PATH: ${{ github.workspace }} - run: | - $markers="not large" - if ("${{ inputs.developmode }}" -eq "false") { - $markers="$markers and not developmode" - } - pytest -v -n auto --durations 0 -m "$markers" --keep-failed .failed - - name: Upload failed test output if: failure() uses: actions/upload-artifact@v4 @@ -447,6 +476,9 @@ jobs: - os: macos-13 - os: macos-14 - os: windows-2022 + parallel: false + - os: windows-2022 + parallel: true defaults: run: shell: bash -l {0} @@ -498,6 +530,9 @@ jobs: id: ostag run: | ostag=$(python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") + if [[ "${{ matrix.parallel }}" == "true" ]]; then + ostag="${ostag}par" + fi echo "ostag=$ostag" >> $GITHUB_OUTPUT - name: Download artifacts diff --git a/.github/workflows/release_dispatch.yml b/.github/workflows/release_dispatch.yml index 4c7cb5679fd..77d159d0f46 100644 --- a/.github/workflows/release_dispatch.yml +++ b/.github/workflows/release_dispatch.yml @@ -34,6 +34,11 @@ on: required: false type: string default: '2021.7' + developmode: + description: 'Build binaries in develop mode. If false, IDEVELOPMODE is set to 0.' + required: false + type: boolean + default: true run_tests: description: 'Run tests after building binaries.' required: false @@ -128,7 +133,7 @@ jobs: compiler_toolchain: ${{ needs.set_options.outputs.compiler_toolchain }} compiler_version: ${{ needs.set_options.outputs.compiler_version }} branch: ${{ needs.set_options.outputs.branch }} - developmode: false + developmode: ${{ inputs.developmode }} full: true run_tests: ${{ inputs.run_tests }} version: ${{ needs.set_options.outputs.version }} diff --git a/README.md b/README.md index afe5cbddce0..f2d96047b8f 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ This is the development repository for the USGS MODFLOW 6 Hydrologic Model. The [![MODFLOW 6 continuous integration](https://github.com/MODFLOW-USGS/modflow6/actions/workflows/ci.yml/badge.svg)](https://github.com/MODFLOW-USGS/modflow6/actions/workflows/ci.yml) [![MODFLOW 6 documentation](https://github.com/MODFLOW-USGS/modflow6/actions/workflows/docs.yml/badge.svg)](https://github.com/MODFLOW-USGS/modflow6/actions/workflows/docs.yml) [![MODFLOW 6 large models](https://github.com/MODFLOW-USGS/modflow6/actions/workflows/large.yml/badge.svg)](https://github.com/MODFLOW-USGS/modflow6/actions/workflows/large.yml) -[![MODFLOW 6 intel nightly build](https://github.com/MODFLOW-USGS/modflow6-nightly-build/actions/workflows/nightly-build-intel.yml/badge.svg)](https://github.com/MODFLOW-USGS/modflow6-nightly-build/actions/workflows/nightly-build-intel.yml) +[![MODFLOW 6 nightly build](https://github.com/MODFLOW-USGS/modflow6-nightly-build/actions/workflows/nightly-build.yml/badge.svg)](https://github.com/MODFLOW-USGS/modflow6-nightly-build/actions/workflows/nightly-build.yml) ## Branches From 0153b73edb1eb498707701af427c6778b4c6142d Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Sat, 23 Mar 2024 23:27:49 -0400 Subject: [PATCH 071/199] ci(parallel): use GITHUB_WORKSPACE for petsc dll path (#1683) * previously hardcoded which broke the nightly build --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b06f1eeef4e..733c8cfa7d8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -214,7 +214,7 @@ jobs: copy "C:\Program Files (x86)\Intel\oneAPI\mpi\latest\bin\hydra_bstrap_proxy.exe" . copy "C:\Program Files (x86)\Intel\oneAPI\mpi\latest\bin\hydra_pmi_proxy.exe" . copy "C:\Program Files (x86)\Intel\oneAPI\mpi\latest\bin\hydra_service.exe" . - copy "D:\a\modflow6\modflow6\petsc\arch-mswin-c-opt\lib\libpetsc.dll" . + copy "%GITHUB_WORKSPACE%\petsc\arch-mswin-c-opt\lib\libpetsc.dll" . :: remove rebuilt and downloaded dirs if exist rebuilt rd /s /q rebuilt From 79c5ff0c83b83d3ba6d9b39d699cb6cf45478057 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Tue, 26 Mar 2024 14:58:27 -0500 Subject: [PATCH 072/199] test(vcatch): add v-catchment overland flow test for SWF (#1684) * test(vcatch): add v-catchment overland flow test for SWF * adjust range for quadratic smoothing function * test fails on CI but not locally: adjusting solver tolerance --- autotest/test_swf_dfw_bowl.py | 30 +-- autotest/test_swf_dfw_swrt2dis.py | 5 +- autotest/test_swf_vcatch.py | 277 +++++++++++++++++++++++++ src/Model/SurfaceWaterFlow/swf-cxs.f90 | 7 +- src/Model/SurfaceWaterFlow/swf-dfw.f90 | 103 ++++++++- 5 files changed, 397 insertions(+), 25 deletions(-) create mode 100644 autotest/test_swf_vcatch.py diff --git a/autotest/test_swf_dfw_bowl.py b/autotest/test_swf_dfw_bowl.py index 7941129411b..5ea344204a2 100644 --- a/autotest/test_swf_dfw_bowl.py +++ b/autotest/test_swf_dfw_bowl.py @@ -228,25 +228,25 @@ def check_output(idx, test): if inflow_location[idx] == "middle": stage_answer = [ 0.00610977, - 1.00848343, - 2.00848545, - 2.00848562, - 2.00848566, - 2.00848562, - 2.00848545, - 1.00848343, + 1.00610977, + 2.00610977, + 2.00610995, + 2.00610998, + 2.00610995, + 2.00610977, + 1.00610977, 0.00610977, ] elif inflow_location[idx] == "left": stage_answer = [ - 2.03027679, - 2.03027665, - 2.03027599, - 2.00975688, - 2.00975618, - 2.00975605, - 2.00975535, - 1.00975489, + 2.03013084, + 2.03013070, + 2.03013004, + 2.00928540, + 2.00928470, + 2.00928457, + 2.00928387, + 1.00928387, 0.00928387, ] diff --git a/autotest/test_swf_dfw_swrt2dis.py b/autotest/test_swf_dfw_swrt2dis.py index 909bb041e90..71ca29cec0e 100644 --- a/autotest/test_swf_dfw_swrt2dis.py +++ b/autotest/test_swf_dfw_swrt2dis.py @@ -24,7 +24,6 @@ def build_models(idx, test): dx = 500.0 - nreach = 11 nper = 1 perlen = [5040 * 2 * 60.0] # 7 days (in seconds) nstp = [50] # In SWR report nstp = [5040] and tsmult is 1. @@ -51,7 +50,7 @@ def build_models(idx, test): swf = flopy.mf6.ModflowSwf(sim, modelname=swfname, save_flows=True) nouter, ninner = 100, 50 - hclose, rclose, relax = 1e-8, 1e-8, 1.0 + hclose, rclose, relax = 1e-6, 1e-8, 1.0 imsswf = flopy.mf6.ModflowIms( sim, print_option="SUMMARY", @@ -235,7 +234,7 @@ def check_output(idx, test): # at end of simulation, water depth should be 1.0 for all reaches swf = mfsim.get_model(swfname) depth = stage_all[-1] - swf.dis.botm.array - np.allclose( + assert np.allclose( depth, 1.0 ), f"Simulated depth at end should be 1, but found {depth}" diff --git a/autotest/test_swf_vcatch.py b/autotest/test_swf_vcatch.py new file mode 100644 index 00000000000..c4bf3413b18 --- /dev/null +++ b/autotest/test_swf_vcatch.py @@ -0,0 +1,277 @@ +""" + +This problem tests the SWF capability to simulate overland flow +on a regular grid. The problem is based on the tilted +v-catchment problem described by Panday and Huyakorn (2004): +Advances in Water Resources 27 (2004) 361-382. + +""" + +import os + +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +cases = [ + "swf-swr-vcatch", +] + + +def build_models(idx, test): + Lx = 800.0 + 800.0 + 20.0 + Ly = 1000.0 + dx = 20.0 + nrow = int(Ly / dx) + ncol = int(Lx / dx) + nlay = 1 + + slope_x = 0.05 + slope_y = 0.02 + + x = np.linspace(-Lx / 2 + dx / 2, Lx / 2 - dx / 2, ncol) + y = np.linspace(Ly - dx / 2, dx / 2, nrow) + X, Y = np.meshgrid(x, y) + land_surface = np.abs(X) * slope_x + Y * slope_y + + rough_overland = 0.015 + rough_channel = 0.15 + + rainfall = 3.0e-6 # meters per second + time_rainfall = 90 # minutes + dt0 = 5 # seconds + dtmin = 5 + dtmax = 100.0 # seconds + dtadj = 2.0 + dtfailadj = 5.0 + + nper = 2 + perlen = nper * [ + time_rainfall * 60.0 + ] # convert time_rainfall from minutes to seconds + nstp = nper * [1] + tsmult = nper * [1] + + tdis_rc = [] + for i in range(nper): + tdis_rc.append((perlen[i], nstp[i], tsmult[i])) + + name = "swf" + + # build MODFLOW 6 files + ws = test.workspace + sim = flopy.mf6.MFSimulation( + sim_name=f"{name}_sim", + version="mf6", + exe_name="mf6", + sim_ws=ws, + ) + + # create tdis package + ats_filerecord = None + tdis = flopy.mf6.ModflowTdis( + sim, + ats_filerecord=ats_filerecord, + time_units="SECONDS", + nper=nper, + perioddata=tdis_rc, + ) + + # setup ats + ats_filerecord = name + ".ats" + atsperiod = [ + (0, dt0, dtmin, dtmax, dtadj, dtfailadj), + (1, dt0, dtmin, dtmax, dtadj, dtfailadj), + ] + tdis.ats.initialize( + maxats=len(atsperiod), + perioddata=atsperiod, + filename=ats_filerecord, + ) + + # surface water model + swfname = f"{name}_model" + swf = flopy.mf6.ModflowSwf(sim, modelname=swfname, save_flows=True) + + nouter, ninner = 15, 100 + hclose, rclose, relax = 1e-8, 1e-8, 1.0 + imsswf = flopy.mf6.ModflowIms( + sim, + print_option="SUMMARY", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="DBD", + under_relaxation_theta=0.9, + under_relaxation_kappa=0.0001, + under_relaxation_gamma=0.0, + inner_maximum=ninner, + inner_dvclose=hclose, + linear_acceleration="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + # backtracking_number=5, + # backtracking_tolerance=1.0, + # backtracking_reduction_factor=0.3, + # backtracking_residual_limit=100.0, + filename=f"{swfname}.ims", + ) + sim.register_ims_package(imsswf, [swf.name]) + + botm = land_surface.reshape((nlay, nrow, ncol)) + dis = flopy.mf6.ModflowSwfdis( + swf, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=dx, + delc=dx, + top=100.0, + botm=botm, + xorigin=-810, + ) + + rough = rough_overland * np.ones((nlay, nrow, ncol), dtype=float) + rough[0, :, int(ncol / 2)] = rough_channel + + dfw = flopy.mf6.ModflowSwfdfw( + swf, + print_flows=False, + save_flows=True, + manningsn=rough, + slope=-3e30, # todo: this is reason to get rid of slope as input + idcxs=None, + ) + + sto = flopy.mf6.ModflowSwfsto( + swf, + save_flows=True, + steady_state={0: False, 1: False}, + transient={0: True, 1: True}, + ) + + ic = flopy.mf6.ModflowSwfic( + swf, + strt=botm, + ) + + # output control + oc = flopy.mf6.ModflowSwfoc( + swf, + budget_filerecord=f"{swfname}.bud", + stage_filerecord=f"{swfname}.stage", + saverecord=[ + ("STAGE", "ALL"), + ("BUDGET", "ALL"), + ], + printrecord=[ + ("BUDGET", "ALL"), + ], + ) + + # flw + qinflow = rainfall * dx * dx + spd = [(0, i, j, qinflow) for j in range(ncol) for i in range(nrow)] + flw = flopy.mf6.ModflowSwfflw( + swf, + maxbound=len(spd), + print_input=True, + print_flows=True, + stress_period_data={0: spd, 1: []}, + ) + + # note: for specifying zero-based reach number, put reach number in tuple + fname = f"{swfname}.zdg.obs.csv" + zdg_obs = { + fname: [ + ("OUTFLOW", "ZDG", (0, nrow - 1, int(ncol / 2))), + ], + "digits": 10, + } + + idcxs = -1 # use cross section 0 + width = dx + spd = [ + ((0, nrow - 1, int(ncol / 2)), idcxs, width, slope_y, rough_channel) + ] + zdg = flopy.mf6.ModflowSwfzdg( + swf, + observations=zdg_obs, + print_input=True, + maxbound=len(spd), + stress_period_data=spd, + ) + + return sim, None + + +def make_plot(test, mfsim): + print("making plots...") + import matplotlib.pyplot as plt + + fpth = test.workspace / f"swf_model.zdg.obs.csv" + obsvals = np.genfromtxt(fpth, names=True, delimiter=",") + + fig = plt.figure(figsize=(6, 4)) + ax = fig.add_subplot(1, 1, 1) + ax.plot( + obsvals["time"] / 60.0, + -obsvals["OUTFLOW"], + marker="o", + mfc="none", + mec="k", + lw=0.0, + label=f"MODFLOW 6 Simulated Outflow", + ) + ax.plot([90, 90], [0, 5], "k--") + ax.set_xlim(0, 180.0) + ax.set_ylim(0, 5) + plt.xlabel("time, in minutes") + plt.ylabel("flow, in meters per second") + plt.legend() + fname = test.workspace / "swf_model.zdg.obs.png" + plt.savefig(fname) + + return + + +def check_output(idx, test): + print(f"evaluating model for case {idx}...") + + swfname = "swf_model" + ws = test.workspace + mfsim = flopy.mf6.MFSimulation.load(sim_ws=ws) + + makeplot = False + if makeplot: + make_plot(test, mfsim) + + # read binary stage file + fpth = test.workspace / f"{swfname}.stage" + sobj = flopy.utils.HeadFile(fpth, precision="double", text="STAGE") + stage_all = sobj.get_alldata() + + # read outflow observation + fpth = test.workspace / f"swf_model.zdg.obs.csv" + obsvals = np.genfromtxt(fpth, names=True, delimiter=",") + + outflow_answer = 4.859497719 # outflow value at end of first period + idx = np.where(obsvals["time"] == 5400.0) + outflow_sim = -obsvals["OUTFLOW"][idx] + msg = (f"Simulated outflow at end of period should be {outflow_answer} " + f"but found {outflow_sim}") + assert np.allclose(outflow_answer, outflow_sim, atol=0.001), msg + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + ) + test.run() diff --git a/src/Model/SurfaceWaterFlow/swf-cxs.f90 b/src/Model/SurfaceWaterFlow/swf-cxs.f90 index b42f396665f..e4bc39a1909 100644 --- a/src/Model/SurfaceWaterFlow/swf-cxs.f90 +++ b/src/Model/SurfaceWaterFlow/swf-cxs.f90 @@ -678,6 +678,11 @@ function get_roughness(this, idcxs, width, depth, rough, & end if end function get_roughness + !> @brief Calculate and return conveyance + !! + !! Conveyance = area * hydraulic_radius ** (2/3) / mannings_roughness + !! If idcxs = 0 (no cross section specified) then reach is + !< hydraulically wide and hydraulic radius is equal to depth. function cxs_conveyance(this, idcxs, width, depth, & rough) result(conveyance) ! -- modules @@ -700,7 +705,7 @@ function cxs_conveyance(this, idcxs, width, depth, & call this%get_cross_section_info(idcxs, i0, i1, npts, icalcmeth) if (npts == 0) then a = depth * width - rh = a / width + rh = depth conveyance = a * rh**DTWOTHIRDS / rough else conveyance = get_conveyance(npts, & diff --git a/src/Model/SurfaceWaterFlow/swf-dfw.f90 b/src/Model/SurfaceWaterFlow/swf-dfw.f90 index 01e84d3f189..ed34d36747e 100644 --- a/src/Model/SurfaceWaterFlow/swf-dfw.f90 +++ b/src/Model/SurfaceWaterFlow/swf-dfw.f90 @@ -83,7 +83,7 @@ module SwfDfwModule procedure :: dfw_bd_obs procedure :: qcalc procedure :: get_cond - !procedure :: get_cond_swr + procedure :: get_cond_swr procedure :: get_cond_n procedure :: write_cxs_tables @@ -657,10 +657,10 @@ function get_cond(this, n, m, ipos, stage_n, stage_m, cln, clm) result(cond) real(DP) :: depth_m real(DP) :: width_n real(DP) :: width_m - real(DP) :: range = 1.d-2 + real(DP) :: range = 1.d-6 real(DP) :: dydx real(DP) :: smooth_factor - real(DP) :: denom + real(DP) :: length_nm real(DP) :: cond real(DP) :: cn real(DP) :: cm @@ -668,10 +668,10 @@ function get_cond(this, n, m, ipos, stage_n, stage_m, cln, clm) result(cond) ! we are using a harmonic conductance approach here; however ! the SWR Process for MODFLOW-2005/NWT uses length-weighted ! average areas and hydraulic radius instead. - denom = cln + clm + length_nm = cln + clm cond = DZERO - if (denom > DPREC) then - absdhdxsqr = abs((stage_n - stage_m) / denom)**DHALF + if (length_nm > DPREC) then + absdhdxsqr = abs((stage_n - stage_m) / length_nm)**DHALF if (absdhdxsqr < DPREC) then ! TODO: Set this differently somehow? absdhdxsqr = 1.e-7 @@ -719,6 +719,97 @@ function get_cond(this, n, m, ipos, stage_n, stage_m, cln, clm) result(cond) end function get_cond + function get_cond_swr(this, n, m, ipos, stage_n, stage_m, cln, clm) result(cond) + ! -- modules + use SmoothingModule, only: sQuadratic + ! -- dummy + class(SwfDfwType) :: this + integer(I4B), intent(in) :: n !< number for cell n + integer(I4B), intent(in) :: m !< number for cell m + integer(I4B), intent(in) :: ipos !< connection number + real(DP), intent(in) :: stage_n !< stage in reach n + real(DP), intent(in) :: stage_m !< stage in reach m + real(DP), intent(in) :: cln !< distance from cell n to shared face with m + real(DP), intent(in) :: clm !< distance from cell m to shared face with n + ! -- local + real(DP) :: absdhdxsqr + real(DP) :: depth_n + real(DP) :: depth_m + real(DP) :: width_n + real(DP) :: width_m + real(DP) :: range = 1.d-10 + real(DP) :: dydx + real(DP) :: smooth_factor + real(DP) :: length_nm + real(DP) :: cond + real(DP) :: rinvn, rinvm, rinv_avg + real(DP) :: area_n, area_m, area_avg + real(DP) :: rhn, rhm, rhavg + real(DP) :: weight_n + real(DP) :: weight_m + + ! Use harmonic weighting for 1/manningsn, but using length-weighted + ! averaging for other terms + length_nm = cln + clm + cond = DZERO + if (length_nm > DPREC) then + absdhdxsqr = abs((stage_n - stage_m) / length_nm)**DHALF + if (absdhdxsqr < DPREC) then + ! TODO: Set this differently somehow? + absdhdxsqr = 1.e-7 + end if + + ! -- Calculate depth in each reach + depth_n = stage_n - this%dis%bot(n) + depth_m = stage_m - this%dis%bot(m) + + ! -- Assign upstream depth, if not central + if (this%icentral == 0) then + ! -- use upstream weighting + if (stage_n > stage_m) then + depth_m = depth_n + else + depth_n = depth_m + end if + end if + + ! -- Calculate a smoothed depth that goes to zero over + ! the specified range + call sQuadratic(depth_n, range, dydx, smooth_factor) + depth_n = depth_n * smooth_factor + call sQuadratic(depth_m, range, dydx, smooth_factor) + depth_m = depth_m * smooth_factor + + ! Get the flow widths for n and m from dis package + call this%dis%get_flow_width(n, m, ipos, width_n, width_m) + + ! harmonic average for inverse mannings value + rinvn = DONE / this%manningsn(n) + rinvm = DONE / this%manningsn(m) + rinv_avg = DTWO * rinvn * rinvm * (length_nm) / & + (rinvn * clm + rinvm * cln) + + ! linear weight toward node closer to shared face + weight_n = clm / length_nm + weight_m = DONE - weight_n + + ! average cross sectional flow area + area_n = this%cxs%get_area(this%idcxs(n), width_n, depth_n) + area_m = this%cxs%get_area(this%idcxs(m), width_m, depth_m) + area_avg = weight_n * area_n + weight_m * area_m + + ! average hydraulic radius + rhn = depth_n + rhm = depth_m + rhavg = weight_n * rhn + weight_m * rhm + rhavg = rhavg**DTWOTHIRDS + + cond = rinv_avg * area_avg * rhavg / absdhdxsqr / length_nm + + end if + + end function get_cond_swr + !> @brief Calculate half reach conductance !! !! Calculate half reach conductance for reach n From a2bdd9ee8bd192f87b612e4d69c9af8267fdfa59 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Tue, 26 Mar 2024 17:29:37 -0500 Subject: [PATCH 073/199] refactor(swf-dfw): remove slope as input variable (#1686) --- autotest/test_swf_dfw.py | 1 - autotest/test_swf_dfw_beg2022.py | 1 - autotest/test_swf_dfw_bowl.py | 1 - autotest/test_swf_dfw_gwf.py | 1 - autotest/test_swf_dfw_loop.py | 1 - autotest/test_swf_dfw_swrt2.py | 1 - autotest/test_swf_dfw_swrt2b.py | 1 - autotest/test_swf_dfw_swrt2dis.py | 1 - autotest/test_swf_vcatch.py | 1 - doc/mf6io/mf6ivar/dfn/swf-dfw.dfn | 11 ----------- doc/mf6io/mf6ivar/md/mf6ivar.md | 1 - doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex | 2 -- doc/mf6io/mf6ivar/tex/swf-dfw-griddata.dat | 2 -- src/Idm/swf-dfwidm.f90 | 19 ------------------- src/Model/SurfaceWaterFlow/swf-dfw.f90 | 19 +------------------ 15 files changed, 1 insertion(+), 62 deletions(-) diff --git a/autotest/test_swf_dfw.py b/autotest/test_swf_dfw.py index a455f24beef..d4ea3bfdf60 100644 --- a/autotest/test_swf_dfw.py +++ b/autotest/test_swf_dfw.py @@ -82,7 +82,6 @@ def build_models(idx, test): print_flows=True, save_flows=True, manningsn=0.035, - slope=0.001, idcxs=0, ) diff --git a/autotest/test_swf_dfw_beg2022.py b/autotest/test_swf_dfw_beg2022.py index 6cf5221d7a5..568a127a984 100644 --- a/autotest/test_swf_dfw_beg2022.py +++ b/autotest/test_swf_dfw_beg2022.py @@ -100,7 +100,6 @@ def build_models(idx, test): print_flows=True, save_flows=True, manningsn=1.0 / 80.0, - slope=slope, idcxs=0, ) diff --git a/autotest/test_swf_dfw_bowl.py b/autotest/test_swf_dfw_bowl.py index 5ea344204a2..1317a985c81 100644 --- a/autotest/test_swf_dfw_bowl.py +++ b/autotest/test_swf_dfw_bowl.py @@ -117,7 +117,6 @@ def build_models(idx, test): print_flows=True, save_flows=True, manningsn=0.035, - slope=1 / dx, idcxs=0, ) diff --git a/autotest/test_swf_dfw_gwf.py b/autotest/test_swf_dfw_gwf.py index 9c36d6cb3b3..bae9f77fa2d 100644 --- a/autotest/test_swf_dfw_gwf.py +++ b/autotest/test_swf_dfw_gwf.py @@ -114,7 +114,6 @@ def add_swf_model(sim): length_conversion=1.0, time_conversion=86400.0, manningsn=0.035, - slope=0.001, idcxs=0, ) diff --git a/autotest/test_swf_dfw_loop.py b/autotest/test_swf_dfw_loop.py index 7a2dc0520cd..3af13d4700d 100644 --- a/autotest/test_swf_dfw_loop.py +++ b/autotest/test_swf_dfw_loop.py @@ -249,7 +249,6 @@ def build_models(idx, test): print_flows=True, save_flows=True, manningsn=0.03, - slope=0.001, idcxs=idcxs, ) diff --git a/autotest/test_swf_dfw_swrt2.py b/autotest/test_swf_dfw_swrt2.py index b270fcf99e5..414570a6e06 100644 --- a/autotest/test_swf_dfw_swrt2.py +++ b/autotest/test_swf_dfw_swrt2.py @@ -104,7 +104,6 @@ def build_models(idx, test): print_flows=True, save_flows=True, manningsn=0.30, - slope=0.05 / 500.0, idcxs=None, ) diff --git a/autotest/test_swf_dfw_swrt2b.py b/autotest/test_swf_dfw_swrt2b.py index 7ed893c8d91..76d1f2c76e2 100644 --- a/autotest/test_swf_dfw_swrt2b.py +++ b/autotest/test_swf_dfw_swrt2b.py @@ -114,7 +114,6 @@ def build_models(idx, test): print_flows=True, save_flows=True, manningsn=0.30, - slope=0.05 / 500.0, idcxs=None, ) diff --git a/autotest/test_swf_dfw_swrt2dis.py b/autotest/test_swf_dfw_swrt2dis.py index 71ca29cec0e..d0aefc378d8 100644 --- a/autotest/test_swf_dfw_swrt2dis.py +++ b/autotest/test_swf_dfw_swrt2dis.py @@ -117,7 +117,6 @@ def build_models(idx, test): print_flows=True, save_flows=True, manningsn=0.30, - slope=0.05 / 500.0, idcxs=None, ) diff --git a/autotest/test_swf_vcatch.py b/autotest/test_swf_vcatch.py index c4bf3413b18..0627f5ba9d6 100644 --- a/autotest/test_swf_vcatch.py +++ b/autotest/test_swf_vcatch.py @@ -141,7 +141,6 @@ def build_models(idx, test): print_flows=False, save_flows=True, manningsn=rough, - slope=-3e30, # todo: this is reason to get rid of slope as input idcxs=None, ) diff --git a/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn b/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn index 9a00dd3e6ce..06eacba6744 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn @@ -101,17 +101,6 @@ optional longname mannings roughness coefficient description mannings roughness coefficient -block griddata -name slope -type double precision -shape (nodes) -valid -reader readarray -layered false -optional -longname bottom slope -description bottom slope of the river bed - block griddata name idcxs type integer diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 187d584f141..39e5a6ee5b8 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -1578,7 +1578,6 @@ | SWF | DFW | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | | SWF | DFW | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the DFW package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the DFW package. | | SWF | DFW | GRIDDATA | MANNINGSN | DOUBLE PRECISION (NODES) | mannings roughness coefficient | -| SWF | DFW | GRIDDATA | SLOPE | DOUBLE PRECISION (NODES) | bottom slope of the river bed | | SWF | DFW | GRIDDATA | IDCXS | INTEGER (NODES) | integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide. | | SWF | CXS | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of stream reach information will be written to the listing file immediately after it is read. | | SWF | CXS | DIMENSIONS | NSECTIONS | INTEGER | integer value specifying the number of cross sections that will be defined. There must be NSECTIONS entries in the PACKAGEDATA block. | diff --git a/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex b/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex index 51abe6802f7..e2fe42e2e1b 100644 --- a/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex @@ -25,8 +25,6 @@ \begin{description} \item \texttt{manningsn}---mannings roughness coefficient -\item \texttt{slope}---bottom slope of the river bed - \item \texttt{idcxs}---integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide. \end{description} diff --git a/doc/mf6io/mf6ivar/tex/swf-dfw-griddata.dat b/doc/mf6io/mf6ivar/tex/swf-dfw-griddata.dat index 959b5b72cf2..0c0b189d738 100644 --- a/doc/mf6io/mf6ivar/tex/swf-dfw-griddata.dat +++ b/doc/mf6io/mf6ivar/tex/swf-dfw-griddata.dat @@ -1,8 +1,6 @@ BEGIN GRIDDATA MANNINGSN -- READARRAY - SLOPE - -- READARRAY [IDCXS -- READARRAY] END GRIDDATA diff --git a/src/Idm/swf-dfwidm.f90 b/src/Idm/swf-dfwidm.f90 index 15729b20e03..8bb197fb7cb 100644 --- a/src/Idm/swf-dfwidm.f90 +++ b/src/Idm/swf-dfwidm.f90 @@ -21,7 +21,6 @@ module SwfDfwInputModule logical :: filein = .false. logical :: obs6_filename = .false. logical :: manningsn = .false. - logical :: slope = .false. logical :: idcxs = .false. end type SwfDfwParamFoundType @@ -197,23 +196,6 @@ module SwfDfwInputModule .false. & ! timeseries ) - type(InputParamDefinitionType), parameter :: & - swfdfw_slope = InputParamDefinitionType & - ( & - 'SWF', & ! component - 'DFW', & ! subcomponent - 'GRIDDATA', & ! block - 'SLOPE', & ! tag name - 'SLOPE', & ! fortran variable - 'DOUBLE1D', & ! type - 'NODES', & ! shape - .true., & ! required - .false., & ! multi-record - .false., & ! preserve case - .false., & ! layered - .false. & ! timeseries - ) - type(InputParamDefinitionType), parameter :: & swfdfw_idcxs = InputParamDefinitionType & ( & @@ -244,7 +226,6 @@ module SwfDfwInputModule swfdfw_filein, & swfdfw_obs6_filename, & swfdfw_manningsn, & - swfdfw_slope, & swfdfw_idcxs & ] diff --git a/src/Model/SurfaceWaterFlow/swf-dfw.f90 b/src/Model/SurfaceWaterFlow/swf-dfw.f90 index ed34d36747e..344d0d5f41d 100644 --- a/src/Model/SurfaceWaterFlow/swf-dfw.f90 +++ b/src/Model/SurfaceWaterFlow/swf-dfw.f90 @@ -8,7 +8,6 @@ ! todo: ! Move Newton to FN routines ! Implement a proper perturbation epsilon -! Is slope input parameter needed? ! Parameterize the smoothing depth? ! module SwfDfwModule @@ -41,9 +40,8 @@ module SwfDfwModule integer(I4B), pointer :: icentral => null() !< flag to use central in space weighting (default is upstream weighting) real(DP), pointer :: unitconv !< conversion factor used in mannings equation; calculated from timeconv and lengthconv real(DP), pointer :: timeconv !< conversion factor from model length units to meters (1.0 if model uses meters for length) - real(DP), pointer :: lengthconv !< conversion factor frommodel time units to seconds (1.0 if model uses seconds for time) + real(DP), pointer :: lengthconv !< conversion factor from model time units to seconds (1.0 if model uses seconds for time) real(DP), dimension(:), pointer, contiguous :: manningsn => null() !< mannings roughness for each reach - real(DP), dimension(:), pointer, contiguous :: slope => null() !< slope for each reach integer(I4B), dimension(:), pointer, contiguous :: idcxs => null() !< cross section id for each reach integer(I4B), dimension(:), pointer, contiguous :: ibound => null() !< pointer to model ibound integer(I4B), dimension(:), pointer, contiguous :: icelltype => null() !< set to 1 and is accessed by chd for checking @@ -213,8 +211,6 @@ subroutine allocate_arrays(this) ! -- user-provided input call mem_allocate(this%manningsn, this%dis%nodes, & 'MANNINGSN', this%memoryPath) - call mem_allocate(this%slope, this%dis%nodes, & - 'SLOPE', this%memoryPath) call mem_allocate(this%idcxs, this%dis%nodes, & 'IDCXS', this%memoryPath) call mem_allocate(this%icelltype, this%dis%nodes, & @@ -222,7 +218,6 @@ subroutine allocate_arrays(this) do n = 1, this%dis%nodes this%manningsn(n) = DZERO - this%slope(n) = DZERO this%idcxs(n) = 0 this%icelltype(n) = 1 end do @@ -386,7 +381,6 @@ subroutine source_griddata(this) ! -- update defaults with idm sourced values call mem_set_value(this%manningsn, 'MANNINGSN', & idmMemoryPath, map, found%manningsn) - call mem_set_value(this%slope, 'SLOPE', idmMemoryPath, map, found%slope) call mem_set_value(this%idcxs, 'IDCXS', idmMemoryPath, map, found%idcxs) ! ! -- ensure MANNINGSN was found @@ -394,12 +388,6 @@ subroutine source_griddata(this) write (errmsg, '(a)') 'Error in GRIDDATA block: MANNINGSN not found.' call store_error(errmsg) end if - ! - ! -- ensure SLOPE was found - if (.not. found%slope) then - write (errmsg, '(a)') 'Error in GRIDDATA block: SLOPE not found.' - call store_error(errmsg) - end if if (count_errors() > 0) then call store_error_filename(this%input_fname) @@ -427,10 +415,6 @@ subroutine log_griddata(this, found) write (this%iout, '(4x,a)') 'MANNINGSN set from input file' end if - if (found%slope) then - write (this%iout, '(4x,a)') 'SLOPE set from input file' - end if - if (found%idcxs) then write (this%iout, '(4x,a)') 'IDCXS set from input file' end if @@ -1028,7 +1012,6 @@ subroutine dfw_da(this) ! ! -- Deallocate arrays call mem_deallocate(this%manningsn) - call mem_deallocate(this%slope) call mem_deallocate(this%idcxs) call mem_deallocate(this%icelltype) From 0a3aa985766e6e9c2c3b8848fdf0591b7ae33521 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 27 Mar 2024 14:16:20 -0400 Subject: [PATCH 074/199] ci(parallel): nightly cache warming for mf6 parallel oneapi components (#1687) * installs can take 30+ min and not handled by setup-fortran, so need to cache manually * factor out an action for mf6 parallel oneapi install --- .github/actions/build-par-win/action.yml | 35 +-------------- .github/actions/setup-par-oneapi/action.yml | 48 +++++++++++++++++++++ .github/workflows/large.yml | 13 ++++++ 3 files changed, 63 insertions(+), 33 deletions(-) create mode 100644 .github/actions/setup-par-oneapi/action.yml diff --git a/.github/actions/build-par-win/action.yml b/.github/actions/build-par-win/action.yml index f92c6d83079..c413a28287b 100644 --- a/.github/actions/build-par-win/action.yml +++ b/.github/actions/build-par-win/action.yml @@ -29,39 +29,8 @@ runs: shell: bash run: echo "ONEAPI_ROOT=C:\Program Files (x86)\Intel\oneAPI" >> "$GITHUB_ENV" - - name: Restore oneAPI cache - id: oneapi-cache - uses: actions/cache/restore@v3 - with: - path: ${{ env.ONEAPI_ROOT }} - key: oneapi-${{ runner.os }}-${{ steps.get-date.outputs.date }} - - - name: Install oneAPI BaseKit - shell: bash - if: steps.oneapi-cache.outputs.cache-hit != 'true' - run: | - url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/5cb30fb9-21e9-47e8-82da-a91e00191670/w_BaseKit_p_2024.0.1.45_offline.exe" - cmp="intel.oneapi.win.mkl.devel" - "modflow6/.github/common/install_intel_windows.bat" $url $cmp - rm -rf $TEMP/webimage.exe - rm -rf $TEMP/webimage_extracted - - - name: Install oneAPI HPCKit - shell: bash - if: steps.oneapi-cache.outputs.cache-hit != 'true' - run: | - url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/7a6db8a1-a8b9-4043-8e8e-ca54b56c34e4/w_HPCKit_p_2024.0.1.35_offline.exe" - cmp="intel.oneapi.win.cpp-dpcpp-common:intel.oneapi.win.ifort-compiler:intel.oneapi.win.mpi.devel" - "modflow6/.github/common/install_intel_windows.bat" $url $cmp - rm -rf $TEMP/webimage.exe - rm -rf $TEMP/webimage_extracted - - - name: Save oneAPI cache - if: steps.oneapi-cache.outputs.cache-hit != 'true' - uses: actions/cache/save@v3 - with: - path: ${{ env.ONEAPI_ROOT }} - key: oneapi-${{ runner.os }}-${{ steps.get-date.outputs.date }} + - name: Setup oneAPI + uses: ./modflow6/.github/actions/setup-par-oneapi - name: Restore PETSc cache id: petsc-cache diff --git a/.github/actions/setup-par-oneapi/action.yml b/.github/actions/setup-par-oneapi/action.yml new file mode 100644 index 00000000000..73c0a892e6d --- /dev/null +++ b/.github/actions/setup-par-oneapi/action.yml @@ -0,0 +1,48 @@ +name: Setup oneAPI for parallel MF6 +description: Setup oneAPI components for parallel MODFLOW 6 +runs: + using: "composite" + steps: + + - name: Get date + id: get-date + shell: bash + run: echo "date=$(/bin/date -u "+%Y%m%d")" >> "$GITHUB_OUTPUT" + + - name: Set oneAPI install dir + shell: bash + run: echo "ONEAPI_ROOT=C:\Program Files (x86)\Intel\oneAPI" >> "$GITHUB_ENV" + + - name: Restore oneAPI cache + id: oneapi-cache + uses: actions/cache/restore@v3 + with: + path: ${{ env.ONEAPI_ROOT }} + key: oneapi-${{ runner.os }}-${{ steps.get-date.outputs.date }} + + - name: Install oneAPI BaseKit + shell: bash + if: steps.oneapi-cache.outputs.cache-hit != 'true' + run: | + url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/5cb30fb9-21e9-47e8-82da-a91e00191670/w_BaseKit_p_2024.0.1.45_offline.exe" + cmp="intel.oneapi.win.mkl.devel" + "modflow6/.github/common/install_intel_windows.bat" $url $cmp + rm -rf $TEMP/webimage.exe + rm -rf $TEMP/webimage_extracted + + - name: Install oneAPI HPCKit + shell: bash + if: steps.oneapi-cache.outputs.cache-hit != 'true' + run: | + url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/7a6db8a1-a8b9-4043-8e8e-ca54b56c34e4/w_HPCKit_p_2024.0.1.35_offline.exe" + cmp="intel.oneapi.win.cpp-dpcpp-common:intel.oneapi.win.ifort-compiler:intel.oneapi.win.mpi.devel" + "modflow6/.github/common/install_intel_windows.bat" $url $cmp + rm -rf $TEMP/webimage.exe + rm -rf $TEMP/webimage_extracted + + - name: Save oneAPI cache + if: steps.oneapi-cache.outputs.cache-hit != 'true' + uses: actions/cache/save@v3 + with: + path: ${{ env.ONEAPI_ROOT }} + key: oneapi-${{ runner.os }}-${{ steps.get-date.outputs.date }} diff --git a/.github/workflows/large.yml b/.github/workflows/large.yml index 9408c458888..e143ef1fcdb 100644 --- a/.github/workflows/large.yml +++ b/.github/workflows/large.yml @@ -17,6 +17,8 @@ jobs: include: # ifx - {os: windows-2022, compiler: intel, version: 2022.2} + # use this combo to install and cache oneapi components for mf6 parallel (compilers + mkl/mpi) + - {os: windows-2022, compiler: intel, version: 2024.0} # ifort - {os: windows-2022, compiler: intel-classic, version: "2021.10"} - {os: windows-2022, compiler: intel-classic, version: 2021.9} @@ -25,10 +27,21 @@ jobs: - {os: windows-2022, compiler: intel-classic, version: 2021.6} steps: - name: Setup ${{ matrix.compiler }} ${{ matrix.version }} + if: (!(matrix.compiler == 'intel' && matrix.version == '2024.0')) uses: fortran-lang/setup-fortran@v1 with: compiler: ${{ matrix.compiler }} version: ${{ matrix.version }} + + - name: Checkout modflow6 + if: matrix.compiler == 'intel' && matrix.version == '2024.0' + uses: actions/checkout@v4 + with: + path: modflow6 + + - name: Setup oneAPI + if: matrix.compiler == 'intel' && matrix.version == '2024.0' + uses: ./modflow6/.github/actions/setup-par-oneapi test: name: Test runs-on: ubuntu-22.04 From 23306af3a639b873e5eefd6b7dfcfa0fd8c6f5b6 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Thu, 28 Mar 2024 16:32:10 -0500 Subject: [PATCH 075/199] feat(cdb): add critical depth boundary (CDB) package for SWF (#1689) --- doc/mf6io/mf6ivar/dfn/swf-cdb.dfn | 183 ++++++ .../mf6ivar/examples/swf-cdb-example.dat | 13 + doc/mf6io/mf6ivar/md/mf6ivar.md | 15 + doc/mf6io/mf6ivar/mf6ivar.py | 1 + doc/mf6io/mf6ivar/tex/appendixA.tex | 4 + doc/mf6io/mf6ivar/tex/swf-cdb-desc.tex | 45 ++ doc/mf6io/mf6ivar/tex/swf-cdb-dimensions.dat | 3 + doc/mf6io/mf6ivar/tex/swf-cdb-options.dat | 8 + doc/mf6io/mf6ivar/tex/swf-cdb-period.dat | 5 + doc/mf6io/swf/cdb.tex | 47 ++ doc/mf6io/swf/namefile.tex | 1 + doc/mf6io/swf/swf.tex | 4 + make/makefile | 2 + msvs/mf6core.vfproj | 2 + src/Idm/selector/IdmSwfDfnSelector.f90 | 11 + src/Idm/swf-cdbidm.f90 | 335 ++++++++++ src/Model/SurfaceWaterFlow/swf-cdb.f90 | 603 ++++++++++++++++++ src/Model/SurfaceWaterFlow/swf-zdg.f90 | 1 + src/Model/SurfaceWaterFlow/swf.f90 | 9 +- src/meson.build | 2 + utils/idmloader/dfns.txt | 1 + 21 files changed, 1293 insertions(+), 2 deletions(-) create mode 100644 doc/mf6io/mf6ivar/dfn/swf-cdb.dfn create mode 100644 doc/mf6io/mf6ivar/examples/swf-cdb-example.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-cdb-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/swf-cdb-dimensions.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-cdb-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-cdb-period.dat create mode 100644 doc/mf6io/swf/cdb.tex create mode 100644 src/Idm/swf-cdbidm.f90 create mode 100644 src/Model/SurfaceWaterFlow/swf-cdb.f90 diff --git a/doc/mf6io/mf6ivar/dfn/swf-cdb.dfn b/doc/mf6io/mf6ivar/dfn/swf-cdb.dfn new file mode 100644 index 00000000000..dea9e181497 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/swf-cdb.dfn @@ -0,0 +1,183 @@ +# --------------------- swf cdb options --------------------- +# flopy multi-package + +block options +name auxiliary +type string +shape (naux) +reader urword +optional true +longname keyword to specify aux variables +description REPLACE auxnames {'{#1}': 'Surface Water Flow'} + +block options +name boundnames +type keyword +shape +reader urword +optional true +longname +description REPLACE boundnames {'{#1}': 'critical depth boundary'} + +block options +name print_input +type keyword +reader urword +optional true +longname print input to listing file +description REPLACE print_input {'{#1}': 'critical depth boundary'} +mf6internal iprpak + +block options +name print_flows +type keyword +reader urword +optional true +longname print calculated flows to listing file +description REPLACE print_flows {'{#1}': 'critical depth boundary'} +mf6internal iprflow + +block options +name save_flows +type keyword +reader urword +optional true +longname save flows to budget file +description REPLACE save_flows {'{#1}': 'critical depth boundary'} +mf6internal ipakcb + +block options +name filein +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an input filename is expected next. + +block options +name obs_filerecord +type record obs6 filein obs6_filename +shape +reader urword +tagged true +optional true +longname +description + +block options +name obs6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname obs keyword +description keyword to specify that record corresponds to an observations file. + +block options +name obs6_filename +type string +preserve_case true +in_record true +tagged false +reader urword +optional false +longname obs6 input filename +description REPLACE obs6_filename {'{#1}': 'Zero-Depth-Gradient Boundary'} + + +# --------------------- swf cdb dimensions --------------------- + +block dimensions +name maxbound +type integer +reader urword +optional false +longname maximum number of critical depth boundaries +description REPLACE maxbound {'{#1}': 'critical depth boundary'} + + +# --------------------- swf cdb period --------------------- + +block period +name iper +type integer +block_variable True +in_record true +tagged false +shape +valid +reader urword +optional false +longname stress period number +description REPLACE iper {} + +block period +name stress_period_data +type recarray cellid idcxs width aux boundname +shape (maxbound) +reader urword +longname +description +mf6internal spd + +block period +name cellid +type integer +shape (ncelldim) +tagged false +in_record true +reader urword +longname cell identifier +description REPLACE cellid {} + +block period +name idcxs +type integer +shape +tagged false +in_record true +reader urword +time_series false +longname cross section identifier +description is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel. +numeric_index true + +block period +name width +type double precision +shape +tagged false +in_record true +reader urword +time_series true +longname width of the zero-depth gradient boundary +description is the channel width of the zero-depth gradient boundary. If a cross section is associated with this boundary, the width will be scaled by the cross section information. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. + +block period +name aux +type double precision +in_record true +tagged false +shape (naux) +reader urword +optional true +time_series true +longname auxiliary variables +description REPLACE aux {'{#1}': 'zero-depth-gradient boundary'} +mf6internal auxvar + +block period +name boundname +type string +shape +tagged false +in_record true +reader urword +optional true +longname zero-depth-gradient boundary name +description REPLACE boundname {'{#1}': 'zero-depth-gradient boundary'} diff --git a/doc/mf6io/mf6ivar/examples/swf-cdb-example.dat b/doc/mf6io/mf6ivar/examples/swf-cdb-example.dat new file mode 100644 index 00000000000..1b6beeea513 --- /dev/null +++ b/doc/mf6io/mf6ivar/examples/swf-cdb-example.dat @@ -0,0 +1,13 @@ +BEGIN options + PRINT_INPUT + OBS6 FILEIN swf_model.cdb.obs +END options + +BEGIN dimensions + MAXBOUND 1 +END dimensions + +BEGIN period 1 + 1 50 41 0 20.00000000 +END period 1 + diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 39e5a6ee5b8..2d99fa8f82c 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -1633,6 +1633,21 @@ | SWF | CHD | PERIOD | HEAD | DOUBLE PRECISION | is the head at the boundary. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | | SWF | CHD | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each constant head. The values of auxiliary variables must be present for each constant head. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | | SWF | CHD | PERIOD | BOUNDNAME | STRING | name of the constant head boundary cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | +| SWF | CDB | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | +| SWF | CDB | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of critical depth boundary cells. | +| SWF | CDB | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of critical depth boundary information will be written to the listing file immediately after it is read. | +| SWF | CDB | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of critical depth boundary flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| SWF | CDB | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that critical depth boundary flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| SWF | CDB | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| SWF | CDB | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | +| SWF | CDB | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the Zero-Depth-Gradient Boundary package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the Zero-Depth-Gradient Boundary package. | +| SWF | CDB | DIMENSIONS | MAXBOUND | INTEGER | integer value specifying the maximum number of critical depth boundary cells that will be specified for use during any stress period. | +| SWF | CDB | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| SWF | CDB | PERIOD | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | +| SWF | CDB | PERIOD | IDCXS | INTEGER | is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel. | +| SWF | CDB | PERIOD | WIDTH | DOUBLE PRECISION | is the channel width of the zero-depth gradient boundary. If a cross section is associated with this boundary, the width will be scaled by the cross section information. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| SWF | CDB | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each zero-depth-gradient boundary. The values of auxiliary variables must be present for each zero-depth-gradient boundary. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| SWF | CDB | PERIOD | BOUNDNAME | STRING | name of the zero-depth-gradient boundary cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | | SWF | FLW | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | | SWF | FLW | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of flow rate. | | SWF | FLW | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of inflow cells. | diff --git a/doc/mf6io/mf6ivar/mf6ivar.py b/doc/mf6io/mf6ivar/mf6ivar.py index cff367816d5..3824312e24a 100644 --- a/doc/mf6io/mf6ivar/mf6ivar.py +++ b/doc/mf6io/mf6ivar/mf6ivar.py @@ -769,6 +769,7 @@ def write_appendix(texdir, allblocks): "swf-sto", "swf-oc", "swf-chd", + "swf-cdb", "swf-flw", "swf-zdg", 'prt-nam', diff --git a/doc/mf6io/mf6ivar/tex/appendixA.tex b/doc/mf6io/mf6ivar/tex/appendixA.tex index ad1d2529469..7e73cb1e766 100644 --- a/doc/mf6io/mf6ivar/tex/appendixA.tex +++ b/doc/mf6io/mf6ivar/tex/appendixA.tex @@ -355,6 +355,10 @@ SWF & CHD & DIMENSIONS & yes \\ SWF & CHD & PERIOD & yes \\ \hline +SWF & CDB & OPTIONS & yes \\ +SWF & CDB & DIMENSIONS & yes \\ +SWF & CDB & PERIOD & yes \\ +\hline SWF & FLW & OPTIONS & yes \\ SWF & FLW & DIMENSIONS & yes \\ SWF & FLW & PERIOD & yes \\ diff --git a/doc/mf6io/mf6ivar/tex/swf-cdb-desc.tex b/doc/mf6io/mf6ivar/tex/swf-cdb-desc.tex new file mode 100644 index 00000000000..373cd51e83c --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-cdb-desc.tex @@ -0,0 +1,45 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{auxiliary}---defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. + +\item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of critical depth boundary cells. + +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of critical depth boundary information will be written to the listing file immediately after it is read. + +\item \texttt{PRINT\_FLOWS}---keyword to indicate that the list of critical depth boundary flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that critical depth boundary flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{OBS6}---keyword to specify that record corresponds to an observations file. + +\item \texttt{obs6\_filename}---name of input file to define observations for the Zero-Depth-Gradient Boundary package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the Zero-Depth-Gradient Boundary package. + +\end{description} +\item \textbf{Block: DIMENSIONS} + +\begin{description} +\item \texttt{maxbound}---integer value specifying the maximum number of critical depth boundary cells that will be specified for use during any stress period. + +\end{description} +\item \textbf{Block: PERIOD} + +\begin{description} +\item \texttt{iper}---integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. + +\item \texttt{cellid}---is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. + +\item \texttt{idcxs}---is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel. + +\item \textcolor{blue}{\texttt{width}---is the channel width of the zero-depth gradient boundary. If a cross section is associated with this boundary, the width will be scaled by the cross section information. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \textcolor{blue}{\texttt{aux}---represents the values of the auxiliary variables for each zero-depth-gradient boundary. The values of auxiliary variables must be present for each zero-depth-gradient boundary. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + +\item \texttt{boundname}---name of the zero-depth-gradient boundary cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/swf-cdb-dimensions.dat b/doc/mf6io/mf6ivar/tex/swf-cdb-dimensions.dat new file mode 100644 index 00000000000..7b4c7bf6ec7 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-cdb-dimensions.dat @@ -0,0 +1,3 @@ +BEGIN DIMENSIONS + MAXBOUND +END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-cdb-options.dat b/doc/mf6io/mf6ivar/tex/swf-cdb-options.dat new file mode 100644 index 00000000000..3b0cf02d1bd --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-cdb-options.dat @@ -0,0 +1,8 @@ +BEGIN OPTIONS + [AUXILIARY ] + [BOUNDNAMES] + [PRINT_INPUT] + [PRINT_FLOWS] + [SAVE_FLOWS] + [OBS6 FILEIN ] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-cdb-period.dat b/doc/mf6io/mf6ivar/tex/swf-cdb-period.dat new file mode 100644 index 00000000000..121e8336927 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-cdb-period.dat @@ -0,0 +1,5 @@ +BEGIN PERIOD + <@width@> [<@aux(naux)@>] [] + <@width@> [<@aux(naux)@>] [] + ... +END PERIOD diff --git a/doc/mf6io/swf/cdb.tex b/doc/mf6io/swf/cdb.tex new file mode 100644 index 00000000000..07ae5a012c6 --- /dev/null +++ b/doc/mf6io/swf/cdb.tex @@ -0,0 +1,47 @@ +Input to the Critical Depth Boundary (CDB) Package is read from the file that has type ``CDB6'' in the Name File. Any number of CDB Packages can be specified for a single surface water flow model. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\vspace{5mm} + +\noindent \textit{FOR EACH SIMULATION} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-cdb-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-cdb-dimensions.dat} +\vspace{5mm} +\noindent \textit{FOR ANY STRESS PERIOD} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-cdb-period.dat} +\packageperioddescription + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/swf-cdb-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/swf-cdb-example.dat} + +%\vspace{5mm} +%\subsubsection{Available observation types} +%Well Package observations include the simulated well rates (\texttt{wel}), the well discharge that is available for the MVR package (\texttt{to-mvr}), and the reduction in the specified \texttt{q} when the \texttt{AUTO\_FLOW\_REDUCE} option is enabled. The data required for each WEL Package observation type is defined in table~\ref{table:gwf-welobstype}. The sum of \texttt{wel} and \texttt{to-mvr} is equal to the simulated well discharge rate, which may be less than the specified \texttt{q} if the \texttt{AUTO\_FLOW\_REDUCE} option is enabled. The \texttt{DNODATA} value is returned if the \texttt{wel-reduction} observation is specified but the \texttt{AUTO\_FLOW\_REDUCE} option is not enabled. Negative and positive values for an observation represent a loss from and gain to the GWF model, respectively. + +%\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} +%\caption{Available WEL Package observation types} \tabularnewline + +%\hline +%\hline +%\textbf{Stress Package} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ +%\hline +%\endhead + +%\hline +%\endfoot + +%\input{../Common/gwf-welobs.tex} +%\label{table:gwf-welobstype} +%\end{longtable} + +%\vspace{5mm} +%\subsubsection{Example Observation Input File} +%\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwf-wel-example-obs.dat} diff --git a/doc/mf6io/swf/namefile.tex b/doc/mf6io/swf/namefile.tex index 9cadf7e30a3..fa7dfcc12bc 100644 --- a/doc/mf6io/swf/namefile.tex +++ b/doc/mf6io/swf/namefile.tex @@ -33,6 +33,7 @@ \subsubsection{Explanation of Variables} CHD6 & Constant Head Package & * \\ FLW6 & Inflow Package & * \\ ZDG6 & Zero-Depth Gradient Package & * \\ +CDB6 & Critical Depth Boundary Package & * \\ OBS6 & Observations Option \\ \hline \end{tabular*} diff --git a/doc/mf6io/swf/swf.tex b/doc/mf6io/swf/swf.tex index 0dd100074e7..b889ff7ab2c 100644 --- a/doc/mf6io/swf/swf.tex +++ b/doc/mf6io/swf/swf.tex @@ -50,6 +50,10 @@ \subsection{Inflow (FLW) Package} \subsection{Zero-Depth Gradient (ZDG) Package} \input{swf/zdg} +\newpage +\subsection{Critical Depth Boundary (CDB) Package} +\input{swf/cdb} + \newpage \subsection{Observation (OBS) Utility for a SWF Model} \input{swf/swf-obs} diff --git a/make/makefile b/make/makefile index 6813456df50..ea69070e37e 100644 --- a/make/makefile +++ b/make/makefile @@ -104,6 +104,7 @@ $(OBJDIR)/InputDefinition.o \ $(OBJDIR)/Memory.o \ $(OBJDIR)/List.o \ $(OBJDIR)/swf-zdgidm.o \ +$(OBJDIR)/swf-cdbidm.o \ $(OBJDIR)/swf-namidm.o \ $(OBJDIR)/swf-icidm.o \ $(OBJDIR)/swf-flwidm.o \ @@ -376,6 +377,7 @@ $(OBJDIR)/LoadMf6File.o \ $(OBJDIR)/BoundInputContext.o \ $(OBJDIR)/AsciiInputLoadType.o \ $(OBJDIR)/swf-zdg.o \ +$(OBJDIR)/swf-cdb.o \ $(OBJDIR)/swf-sto.o \ $(OBJDIR)/swf-oc.o \ $(OBJDIR)/swf-obs.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index 2e13e476422..96c78baecf2 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -174,6 +174,7 @@ + @@ -293,6 +294,7 @@ + diff --git a/src/Idm/selector/IdmSwfDfnSelector.f90 b/src/Idm/selector/IdmSwfDfnSelector.f90 index 9fd24a5146a..7baabf3bcd2 100644 --- a/src/Idm/selector/IdmSwfDfnSelector.f90 +++ b/src/Idm/selector/IdmSwfDfnSelector.f90 @@ -12,6 +12,7 @@ module IdmSwfDfnSelectorModule use SwfCxsInputModule use SwfDfwInputModule use SwfIcInputModule + use SwfCdbInputModule use SwfChdInputModule use SwfFlwInputModule use SwfZdgInputModule @@ -57,6 +58,8 @@ function swf_param_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, swf_dfw_param_definitions) case ('IC') call set_param_pointer(input_definition, swf_ic_param_definitions) + case ('CDB') + call set_param_pointer(input_definition, swf_cdb_param_definitions) case ('CHD') call set_param_pointer(input_definition, swf_chd_param_definitions) case ('FLW') @@ -87,6 +90,8 @@ function swf_aggregate_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, swf_dfw_aggregate_definitions) case ('IC') call set_param_pointer(input_definition, swf_ic_aggregate_definitions) + case ('CDB') + call set_param_pointer(input_definition, swf_cdb_aggregate_definitions) case ('CHD') call set_param_pointer(input_definition, swf_chd_aggregate_definitions) case ('FLW') @@ -117,6 +122,8 @@ function swf_block_definitions(subcomponent) result(input_definition) call set_block_pointer(input_definition, swf_dfw_block_definitions) case ('IC') call set_block_pointer(input_definition, swf_ic_block_definitions) + case ('CDB') + call set_block_pointer(input_definition, swf_cdb_block_definitions) case ('CHD') call set_block_pointer(input_definition, swf_chd_block_definitions) case ('FLW') @@ -146,6 +153,8 @@ function swf_idm_multi_package(subcomponent) result(multi_package) multi_package = swf_dfw_multi_package case ('IC') multi_package = swf_ic_multi_package + case ('CDB') + multi_package = swf_cdb_multi_package case ('CHD') multi_package = swf_chd_multi_package case ('FLW') @@ -179,6 +188,8 @@ function swf_idm_integrated(subcomponent) result(integrated) integrated = .true. case ('IC') integrated = .true. + case ('CDB') + integrated = .true. case ('CHD') integrated = .true. case ('FLW') diff --git a/src/Idm/swf-cdbidm.f90 b/src/Idm/swf-cdbidm.f90 new file mode 100644 index 00000000000..573ed552d99 --- /dev/null +++ b/src/Idm/swf-cdbidm.f90 @@ -0,0 +1,335 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module SwfCdbInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public swf_cdb_param_definitions + public swf_cdb_aggregate_definitions + public swf_cdb_block_definitions + public SwfCdbParamFoundType + public swf_cdb_multi_package + + type SwfCdbParamFoundType + logical :: auxiliary = .false. + logical :: boundnames = .false. + logical :: iprpak = .false. + logical :: iprflow = .false. + logical :: ipakcb = .false. + logical :: obs_filerecord = .false. + logical :: obs6 = .false. + logical :: obs6_filename = .false. + logical :: maxbound = .false. + logical :: cellid = .false. + logical :: idcxs = .false. + logical :: width = .false. + logical :: auxvar = .false. + logical :: boundname = .false. + end type SwfCdbParamFoundType + + logical :: swf_cdb_multi_package = .true. + + type(InputParamDefinitionType), parameter :: & + swfcdb_auxiliary = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CDB', & ! subcomponent + 'OPTIONS', & ! block + 'AUXILIARY', & ! tag name + 'AUXILIARY', & ! fortran variable + 'STRING', & ! type + 'NAUX', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcdb_boundnames = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CDB', & ! subcomponent + 'OPTIONS', & ! block + 'BOUNDNAMES', & ! tag name + 'BOUNDNAMES', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcdb_iprpak = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CDB', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_INPUT', & ! tag name + 'IPRPAK', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcdb_iprflow = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CDB', & ! subcomponent + 'OPTIONS', & ! block + 'PRINT_FLOWS', & ! tag name + 'IPRFLOW', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcdb_ipakcb = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CDB', & ! subcomponent + 'OPTIONS', & ! block + 'SAVE_FLOWS', & ! tag name + 'IPAKCB', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcdb_obs_filerecord = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CDB', & ! subcomponent + 'OPTIONS', & ! block + 'OBS_FILERECORD', & ! tag name + 'OBS_FILERECORD', & ! fortran variable + 'RECORD OBS6 FILEIN OBS6_FILENAME', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcdb_obs6 = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CDB', & ! subcomponent + 'OPTIONS', & ! block + 'OBS6', & ! tag name + 'OBS6', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcdb_obs6_filename = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CDB', & ! subcomponent + 'OPTIONS', & ! block + 'OBS6_FILENAME', & ! tag name + 'OBS6_FILENAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcdb_maxbound = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CDB', & ! subcomponent + 'DIMENSIONS', & ! block + 'MAXBOUND', & ! tag name + 'MAXBOUND', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcdb_cellid = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CDB', & ! subcomponent + 'PERIOD', & ! block + 'CELLID', & ! tag name + 'CELLID', & ! fortran variable + 'INTEGER1D', & ! type + 'NCELLDIM', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcdb_idcxs = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CDB', & ! subcomponent + 'PERIOD', & ! block + 'IDCXS', & ! tag name + 'IDCXS', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcdb_width = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CDB', & ! subcomponent + 'PERIOD', & ! block + 'WIDTH', & ! tag name + 'WIDTH', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .true. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcdb_auxvar = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CDB', & ! subcomponent + 'PERIOD', & ! block + 'AUX', & ! tag name + 'AUXVAR', & ! fortran variable + 'DOUBLE1D', & ! type + 'NAUX', & ! shape + .false., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .true. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfcdb_boundname = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CDB', & ! subcomponent + 'PERIOD', & ! block + 'BOUNDNAME', & ! tag name + 'BOUNDNAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_cdb_param_definitions(*) = & + [ & + swfcdb_auxiliary, & + swfcdb_boundnames, & + swfcdb_iprpak, & + swfcdb_iprflow, & + swfcdb_ipakcb, & + swfcdb_obs_filerecord, & + swfcdb_obs6, & + swfcdb_obs6_filename, & + swfcdb_maxbound, & + swfcdb_cellid, & + swfcdb_idcxs, & + swfcdb_width, & + swfcdb_auxvar, & + swfcdb_boundname & + ] + + type(InputParamDefinitionType), parameter :: & + swfcdb_spd = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CDB', & ! subcomponent + 'PERIOD', & ! block + 'STRESS_PERIOD_DATA', & ! tag name + 'SPD', & ! fortran variable + 'RECARRAY CELLID IDCXS WIDTH AUX BOUNDNAME', & ! type + 'MAXBOUND', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_cdb_aggregate_definitions(*) = & + [ & + swfcdb_spd & + ] + + type(InputBlockDefinitionType), parameter :: & + swf_cdb_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'PERIOD', & ! blockname + .true., & ! required + .true., & ! aggregate + .true. & ! block_variable + ) & + ] + +end module SwfCdbInputModule diff --git a/src/Model/SurfaceWaterFlow/swf-cdb.f90 b/src/Model/SurfaceWaterFlow/swf-cdb.f90 new file mode 100644 index 00000000000..10d69a71020 --- /dev/null +++ b/src/Model/SurfaceWaterFlow/swf-cdb.f90 @@ -0,0 +1,603 @@ +!> @brief This module contains the CDB package methods +!! +!! This module can be used to represent outflow from streams using +!! a critical depth boundary. +!! +!< +module SwfCdbModule + ! -- modules + use KindModule, only: DP, I4B + use ConstantsModule, only: DZERO, LENFTYPE, DNODATA, & + DPREC, DHALF, DTWO, DGRAVITY + use SimVariablesModule, only: errmsg + use SimModule, only: store_error, store_error_filename + use MemoryHelperModule, only: create_mem_path + use BndModule, only: BndType + use BndExtModule, only: BndExtType + use ObsModule, only: DefaultObsIdProcessor + use SmoothingModule, only: sQSaturation, sQSaturationDerivative + use ObserveModule, only: ObserveType + use TimeSeriesLinkModule, only: TimeSeriesLinkType, & + GetTimeSeriesLinkFromList + use BlockParserModule, only: BlockParserType + use InputOutputModule, only: GetUnit, openfile + use MatrixBaseModule + use BaseDisModule, only: DisBaseType + use SwfDislModule, only: SwfDislType + use SwfCxsModule, only: SwfCxsType + ! + implicit none + ! + private + public :: cdb_create + ! + character(len=LENFTYPE) :: ftype = 'CDB' !< package ftype + character(len=16) :: text = ' CDB' !< package flow text string + ! + type, extends(BndExtType) :: SwfCdbType + + integer(I4B), dimension(:), pointer, contiguous :: idcxs => null() !< cross section id + real(DP), dimension(:), pointer, contiguous :: width => null() !< channel width + real(DP), pointer :: gravconv => null() !< conversion factor gravity in m/s^2 to model units + + ! -- pointers other objects + type(SwfDislType), pointer :: disl + type(SwfCxsType), pointer :: cxs + + contains + procedure :: allocate_scalars => cdb_allocate_scalars + procedure :: allocate_arrays => cdb_allocate_arrays + procedure :: source_options => cdb_options + procedure :: log_cdb_options + procedure :: bnd_rp => cdb_rp + procedure :: bnd_cf => cdb_cf + procedure :: bnd_fc => cdb_fc + procedure :: bnd_da => cdb_da + procedure :: define_listlabel + procedure :: bound_value => cdb_bound_value + ! -- methods for observations + procedure, public :: bnd_obs_supported => cdb_obs_supported + procedure, public :: bnd_df_obs => cdb_df_obs + procedure, public :: bnd_bd_obs => cdb_bd_obs + ! -- methods for time series + procedure, public :: bnd_rp_ts => cdb_rp_ts + ! -- private + procedure, private :: qcalc + end type SwfCdbType + +contains + + !> @ brief Create a new package object + !! + !! Create a new CDB Package object + !! + !< + subroutine cdb_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, & + mempath, dis, cxs, lengthconv, timeconv) + ! -- dummy variables + class(BndType), pointer :: packobj !< pointer to default package type + integer(I4B), intent(in) :: id !< package id + integer(I4B), intent(in) :: ibcnum !< boundary condition number + integer(I4B), intent(in) :: inunit !< unit number of CDB package input file + integer(I4B), intent(in) :: iout !< unit number of model listing file + character(len=*), intent(in) :: namemodel !< model name + character(len=*), intent(in) :: pakname !< package name + character(len=*), intent(in) :: mempath !< input mempath + class(DisBaseType), pointer, intent(inout) :: dis !< the pointer to the discretization + type(SwfCxsType), pointer, intent(in) :: cxs !< the pointer to the cxs package + real(DP), intent(in) :: lengthconv !< conversion factor from model length to meters + real(DP), intent(in) :: timeconv !< conversion factor from model time units to seconds + ! -- local variables + type(SwfCdbType), pointer :: cdbobj + ! + ! -- allocate the object and assign values to object variables + allocate (cdbobj) + packobj => cdbobj + ! + ! -- create name and memory path + call packobj%set_names(ibcnum, namemodel, pakname, ftype, mempath) + packobj%text = text + ! + ! -- allocate scalars + call cdbobj%allocate_scalars() + ! + ! -- initialize package + call packobj%pack_initialize() + + packobj%inunit = inunit + packobj%iout = iout + packobj%id = id + packobj%ibcnum = ibcnum + packobj%ncolbnd = 1 + packobj%iscloc = 1 + packobj%ictMemPath = create_mem_path(namemodel, 'DFW') + ! + ! -- store pointer to disl + select type (dis) + type is (SwfDislType) + cdbobj%disl => dis + end select + ! + ! -- store pointer to cxs + cdbobj%cxs => cxs + ! + ! -- store unit conversion + cdbobj%gravconv = DGRAVITY * lengthconv * timeconv**2 + ! + ! -- return + return + end subroutine cdb_create + + !> @ brief Allocate scalars + !! + !! Allocate and initialize scalars for the CDB package. The base model + !! allocate scalars method is also called. + !! + !< + subroutine cdb_allocate_scalars(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy variables + class(SwfCdbType) :: this !< SwfcdbType object + ! + ! -- call base type allocate scalars + call this%BndExtType%allocate_scalars() + ! + ! -- allocate the object and assign values to object variables + call mem_allocate(this%gravconv, 'GRAVCONV', this%memoryPath) + ! + ! -- Set values + this%gravconv = DZERO + ! + ! -- return + return + end subroutine cdb_allocate_scalars + + !> @ brief Allocate arrays + !! + !! Allocate and initialize arrays for the SWF package + !! + !< + subroutine cdb_allocate_arrays(this, nodelist, auxvar) + ! -- modules + use MemoryManagerModule, only: mem_allocate, mem_setptr, mem_checkin + ! -- dummy + class(SwfCdbType) :: this + integer(I4B), dimension(:), pointer, contiguous, optional :: nodelist + real(DP), dimension(:, :), pointer, contiguous, optional :: auxvar + ! -- local + ! + ! -- call BndExtType allocate scalars + call this%BndExtType%allocate_arrays(nodelist, auxvar) + ! + ! -- set array input context pointer + call mem_setptr(this%idcxs, 'IDCXS', this%input_mempath) + call mem_setptr(this%width, 'WIDTH', this%input_mempath) + ! + ! -- checkin array input context pointer + call mem_checkin(this%idcxs, 'IDCXS', this%memoryPath, & + 'IDCXS', this%input_mempath) + call mem_checkin(this%width, 'WIDTH', this%memoryPath, & + 'WIDTH', this%input_mempath) + ! + ! -- return + return + end subroutine cdb_allocate_arrays + + !> @ brief Deallocate package memory + !! + !! Deallocate SWF package scalars and arrays. + !! + !< + subroutine cdb_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + ! -- dummy variables + class(SwfCdbType) :: this !< SwfcdbType object + ! + ! -- Deallocate parent package + call this%BndExtType%bnd_da() + ! + ! -- arrays + call mem_deallocate(this%idcxs, 'IDCXS', this%memoryPath) + call mem_deallocate(this%width, 'WIDTH', this%memoryPath) + ! + ! -- scalars + call mem_deallocate(this%gravconv) + ! + ! -- return + return + end subroutine cdb_da + + !> @ brief Source additional options for package + !! + !! Source additional options for SWF package. + !! + !< + subroutine cdb_options(this) + ! -- modules + use InputOutputModule, only: urword + use MemoryManagerExtModule, only: mem_set_value + use SwfCdbInputModule, only: SwfCdbParamFoundType + ! -- dummy variables + class(SwfCdbType), intent(inout) :: this !< SwfCdbType object + ! -- local variables + type(SwfCdbParamFoundType) :: found + ! -- formats + ! + ! -- source base BndExtType options + call this%BndExtType%source_options() + ! + ! -- source options from input context + ! none + ! + ! -- log SWF specific options + call this%log_cdb_options(found) + ! + ! -- return + return + end subroutine cdb_options + + !> @ brief Log SWF specific package options + !< + subroutine log_cdb_options(this, found) + ! -- modules + use SwfCdbInputModule, only: SwfCdbParamFoundType + ! -- dummy variables + class(SwfCdbType), intent(inout) :: this !< BndExtType object + type(SwfCdbParamFoundType), intent(in) :: found + ! -- local variables + ! -- format + ! + ! -- log found options + write (this%iout, '(/1x,a)') 'PROCESSING '//trim(adjustl(this%text)) & + //' OPTIONS' + ! + ! if (found%mover) then + ! write (this%iout, '(4x,A)') 'MOVER OPTION ENABLED' + ! end if + ! + ! -- close logging block + write (this%iout, '(1x,a)') & + 'END OF '//trim(adjustl(this%text))//' OPTIONS' + ! + ! -- return + return + end subroutine log_cdb_options + + !> @ brief SWF read and prepare + !! + !< + subroutine cdb_rp(this) + use TdisModule, only: kper + ! -- dummy + class(SwfCdbType), intent(inout) :: this + ! -- local + ! + if (this%iper /= kper) return + ! + ! -- Call the parent class read and prepare + call this%BndExtType%bnd_rp() + ! + ! -- Write the list to iout if requested + if (this%iprpak /= 0) then + call this%write_list() + end if + ! + ! -- return + return + end subroutine cdb_rp + + !> @ brief Formulate the package hcof and rhs terms. + !! + !! Formulate the hcof and rhs terms for the CDB package that will be + !! added to the coefficient matrix and right-hand side vector. + !! + !< + subroutine cdb_cf(this) + ! -- dummy variables + class(SwfCdbType) :: this !< SwfCdbType object + ! -- local variables + integer(I4B) :: i, node + real(DP) :: q + real(DP) :: qeps + real(DP) :: depth + real(DP) :: derv + real(DP) :: eps + ! + ! -- Return if no inflows + if (this%nbound == 0) return + ! + ! -- Calculate hcof and rhs for each cdb entry + eps = 1.D-8 + do i = 1, this%nbound + + node = this%nodelist(i) + if (this%ibound(node) <= 0) then + this%hcof(i) = DZERO + this%rhs(i) = DZERO + cycle + end if + + ! -- calculate terms and add to hcof and rhs + depth = this%xnew(node) - this%dis%bot(node) + + ! -- calculate unperturbed q + q = this%qcalc(i, depth) + + ! -- calculate perturbed q + qeps = this%qcalc(i, depth + eps) + + ! -- calculate derivative + derv = (qeps - q) / eps + + ! -- add terms to hcof and rhs + this%hcof(i) = derv + this%rhs(i) = -q + derv * this%xnew(node) + + end do + ! + return + end subroutine cdb_cf + + !> @brief Calculate critical depth boundary flow + !< + function qcalc(this, i, depth) result(q) + ! modules + ! dummy + class(SwfCdbType) :: this + integer(I4B), intent(in) :: i !< boundary number + real(DP), intent(in) :: depth !< simulated depth (stage - elevation) in reach n for this iteration + ! return + real(DP) :: q + ! local + integer(I4B) :: idcxs + real(DP) :: width + real(DP) :: a + real(DP) :: r + + idcxs = this%idcxs(i) + width = this%width(i) + a = this%cxs%get_area(idcxs, width, depth) + r = this%cxs%get_hydraulic_radius(idcxs, width, depth, area=a) + + q = this%gravconv * a**DTWO * r + if (q > DPREC) then + q = q**DHALF + else + q = DZERO + end if + q = -q + + end function qcalc + + !> @ brief Copy hcof and rhs terms into solution. + !! + !! Add the hcof and rhs terms for the CDB package to the + !! coefficient matrix and right-hand side vector. + !! + !< + subroutine cdb_fc(this, rhs, ia, idxglo, matrix_sln) + ! -- dummy variables + class(SwfCdbType) :: this !< SwfCdbType object + real(DP), dimension(:), intent(inout) :: rhs !< right-hand side vector for model + integer(I4B), dimension(:), intent(in) :: ia !< solution CRS row pointers + integer(I4B), dimension(:), intent(in) :: idxglo !< mapping vector for model (local) to solution (global) + class(MatrixBaseType), pointer :: matrix_sln !< solution coefficient matrix + ! -- local variables + integer(I4B) :: i + integer(I4B) :: n + integer(I4B) :: ipos + ! + ! -- pakmvrobj fc + if (this%imover == 1) then + call this%pakmvrobj%fc() + end if + ! + ! -- Copy package rhs and hcof into solution rhs and amat + do i = 1, this%nbound + n = this%nodelist(i) + rhs(n) = rhs(n) + this%rhs(i) + ipos = ia(n) + call matrix_sln%add_value_pos(idxglo(ipos), this%hcof(i)) + ! + ! -- If mover is active and this cdb item is discharging, + ! store available water (as positive value). + if (this%imover == 1 .and. this%rhs(i) > DZERO) then + call this%pakmvrobj%accumulate_qformvr(i, this%rhs(i)) + end if + end do + ! + ! -- return + return + end subroutine cdb_fc + + !> @ brief Define the list label for the package + !! + !! Method defined the list label for the CDB package. The list label is + !! the heading that is written to iout when PRINT_INPUT option is used. + !! + !< + subroutine define_listlabel(this) + ! -- dummy variables + class(SwfCdbType), intent(inout) :: this !< SwfCdbType object + ! + ! -- create the header list label + this%listlabel = trim(this%filtyp)//' NO.' + if (this%dis%ndim == 3) then + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'ROW' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'COL' + elseif (this%dis%ndim == 2) then + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER' + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'CELL2D' + else + write (this%listlabel, '(a, a7)') trim(this%listlabel), 'NODE' + end if + write (this%listlabel, '(a, a16)') trim(this%listlabel), 'FLOW RATE' + if (this%inamedbound == 1) then + write (this%listlabel, '(a, a16)') trim(this%listlabel), 'BOUNDARY NAME' + end if + ! + ! -- return + return + end subroutine define_listlabel + + ! -- Procedures related to observations + + !> @brief Determine if observations are supported. + !! + !! Function to determine if observations are supported by the CDB package. + !! Observations are supported by the CDB package. + !! + !! @return cdb_obs_supported boolean indicating if observations are supported + !! + !< + logical function cdb_obs_supported(this) + ! -- dummy variables + class(SwfCdbType) :: this !< SwfCdbType object + ! + ! -- set boolean + cdb_obs_supported = .true. + ! + ! -- return + return + end function cdb_obs_supported + + !> @brief Define the observation types available in the package + !! + !! Method to define the observation types available in the CDB package. + !! + !< + subroutine cdb_df_obs(this) + ! -- dummy variables + class(SwfCdbType) :: this !< SwfCdbType object + ! -- local variables + integer(I4B) :: indx + ! + ! -- initialize observations + call this%obs%StoreObsType('cdb', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => DefaultObsIdProcessor + ! + ! -- Store obs type and assign procedure pointer + ! for to-mvr observation type. + call this%obs%StoreObsType('to-mvr', .true., indx) + this%obs%obsData(indx)%ProcessIdPtr => DefaultObsIdProcessor + ! + ! -- return + return + end subroutine cdb_df_obs + + !> @brief Save observations for the package + !! + !! Method to save simulated values for the CDB package. + !! + !< + subroutine cdb_bd_obs(this) + ! -- dummy variables + class(SwfCdbType) :: this !< SwfCdbType object + ! -- local variables + integer(I4B) :: i + integer(I4B) :: n + integer(I4B) :: jj + real(DP) :: v + type(ObserveType), pointer :: obsrv => null() + ! + ! -- clear the observations + call this%obs%obs_bd_clear() + ! + ! -- Save simulated values for all of package's observations. + do i = 1, this%obs%npakobs + obsrv => this%obs%pakobs(i)%obsrv + if (obsrv%BndFound) then + do n = 1, obsrv%indxbnds_count + v = DNODATA + jj = obsrv%indxbnds(n) + select case (obsrv%ObsTypeId) + case ('TO-MVR') + if (this%imover == 1) then + v = this%pakmvrobj%get_qtomvr(jj) + if (v > DZERO) then + v = -v + end if + end if + case ('CDB') + v = this%simvals(jj) + case default + errmsg = 'Unrecognized observation type: '//trim(obsrv%ObsTypeId) + call store_error(errmsg) + end select + call this%obs%SaveOneSimval(obsrv, v) + end do + else + call this%obs%SaveOneSimval(obsrv, DNODATA) + end if + end do + ! + ! -- return + return + end subroutine cdb_bd_obs + + ! -- Procedure related to time series + + !> @brief Assign time series links for the package + !! + !! Assign the time series links for the CDB package. Only + !! the Q variable can be defined with time series. + !! + !< + subroutine cdb_rp_ts(this) + ! -- dummy variables + class(SwfCdbType), intent(inout) :: this !< SwfCdbType object + ! -- local variables + integer(I4B) :: i, nlinks + type(TimeSeriesLinkType), pointer :: tslink => null() + ! + ! -- set up the time series links + nlinks = this%TsManager%boundtslinks%Count() + do i = 1, nlinks + tslink => GetTimeSeriesLinkFromList(this%TsManager%boundtslinks, i) + if (associated(tslink)) then + if (tslink%JCol == 1) then + tslink%Text = 'Q' + end if + end if + end do + ! + ! -- return + return + end subroutine cdb_rp_ts + + !> @ brief Return a bound value + !! + !! Return a bound value associated with an ncolbnd index + !! and row. + !! + !< + function cdb_bound_value(this, col, row) result(bndval) + ! -- modules + use ConstantsModule, only: DZERO + ! -- dummy variables + class(SwfCdbType), intent(inout) :: this !< BndExtType object + integer(I4B), intent(in) :: col + integer(I4B), intent(in) :: row + ! -- result + real(DP) :: bndval + ! + select case (col) + case (1) + bndval = this%idcxs(row) + case (2) + bndval = this%width(row) + case default + errmsg = 'Programming error. CDB bound value requested column '& + &'outside range of ncolbnd (1).' + call store_error(errmsg) + call store_error_filename(this%input_fname) + end select + ! + ! -- return + return + end function cdb_bound_value + +end module SwfCdbModule diff --git a/src/Model/SurfaceWaterFlow/swf-zdg.f90 b/src/Model/SurfaceWaterFlow/swf-zdg.f90 index d1f404cad4a..bda1f70580c 100644 --- a/src/Model/SurfaceWaterFlow/swf-zdg.f90 +++ b/src/Model/SurfaceWaterFlow/swf-zdg.f90 @@ -335,6 +335,7 @@ subroutine zdg_cf(this) depth = this%xnew(node) - this%dis%bot(node) ! -- calculate unperturbed q + ! TODO: UNITCONV?! cond = this%get_cond(i, depth, absdhdxsq, this%unitconv) q = -cond * this%slope(i) diff --git a/src/Model/SurfaceWaterFlow/swf.f90 b/src/Model/SurfaceWaterFlow/swf.f90 index 8d75efe9821..48e5a973a54 100644 --- a/src/Model/SurfaceWaterFlow/swf.f90 +++ b/src/Model/SurfaceWaterFlow/swf.f90 @@ -127,7 +127,7 @@ module SwfModule !< integer(I4B), parameter :: SWF_NMULTIPKG = 50 character(len=LENPACKAGETYPE), dimension(SWF_NMULTIPKG) :: SWF_MULTIPKG - data SWF_MULTIPKG/'FLW6 ', 'CHD6 ', 'ZDG6 ', ' ', ' ', & ! 5 + data SWF_MULTIPKG/'FLW6 ', 'CHD6 ', 'CDB6 ', 'ZDG6 ', ' ', & ! 5 &45*' '/ ! 50 ! -- size of supported model package arrays @@ -976,6 +976,7 @@ subroutine package_create(this, filtyp, ipakid, ipaknum, pakname, mempath, & use MemoryHelperModule, only: create_mem_path use SwfFlwModule, only: flw_create use ChdModule, only: chd_create + use SwfCdbModule, only: cdb_create use SwfZdgModule, only: zdg_create ! -- dummy class(SwfModelType) :: this @@ -1001,6 +1002,10 @@ subroutine package_create(this, filtyp, ipakid, ipaknum, pakname, mempath, & call chd_create(packobj, ipakid, ipaknum, inunit, iout, this%name, & pakname, mempath) packobj%ictMemPath = create_mem_path(this%name, 'DFW') + case ('CDB6') + call cdb_create(packobj, ipakid, ipaknum, inunit, iout, this%name, & + pakname, mempath, this%dis, this%cxs, & + this%dfw%lengthconv, this%dfw%timeconv) case ('ZDG6') call zdg_create(packobj, ipakid, ipaknum, inunit, iout, this%name, & pakname, mempath, this%dis, this%cxs, this%dfw%unitconv) @@ -1201,7 +1206,7 @@ subroutine create_packages(this) this%inoc = inunit case ('OBS6') this%inobs = inunit - case ('CHD6', 'FLW6', 'ZDG6') + case ('CHD6', 'FLW6', 'CDB6', 'ZDG6') call expandarray(bndpkgs) bndpkgs(size(bndpkgs)) = n case default diff --git a/src/meson.build b/src/meson.build index 160b4dfb4a0..525a6b942df 100644 --- a/src/meson.build +++ b/src/meson.build @@ -84,6 +84,7 @@ modflow_sources = files( 'Idm' / 'swf-icidm.f90', 'Idm' / 'swf-flwidm.f90', 'Idm' / 'swf-chdidm.f90', + 'Idm' / 'swf-cdbidm.f90', 'Idm' / 'swf-zdgidm.f90', 'Idm' / 'sim-namidm.f90', 'Idm' / 'sim-tdisidm.f90', @@ -172,6 +173,7 @@ modflow_sources = files( 'Model' / 'SurfaceWaterFlow' / 'swf-oc.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-flw.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-sto.f90', + 'Model' / 'SurfaceWaterFlow' / 'swf-cdb.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-zdg.f90', 'Model' / 'ParticleTracking' / 'prt.f90', 'Model' / 'ParticleTracking' / 'prt-fmi.f90', diff --git a/utils/idmloader/dfns.txt b/utils/idmloader/dfns.txt index e233a63dd2b..28688587b03 100644 --- a/utils/idmloader/dfns.txt +++ b/utils/idmloader/dfns.txt @@ -49,6 +49,7 @@ swf-disv.dfn swf-cxs.dfn swf-dfw.dfn swf-ic.dfn +swf-cdb.dfn swf-chd.dfn swf-flw.dfn swf-zdg.dfn From 75c66a94b33cabb1e8d067903549b9bf1c260b37 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Tue, 2 Apr 2024 07:35:35 -0500 Subject: [PATCH 076/199] feat(dis2d): New 2D discretization package for SWF overland flow (#1693) --- autotest/test_swf_dfw_swrt2dis.py | 37 +- autotest/test_swf_vcatch.py | 12 +- .../dfn/{swf-dis.dfn => swf-dis2d.dfn} | 32 +- .../mf6ivar/examples/swf-dis2d-example.dat | 20 + doc/mf6io/mf6ivar/md/mf6ivar.md | 24 +- doc/mf6io/mf6ivar/mf6ivar.py | 2 +- doc/mf6io/mf6ivar/tex/appendixA.tex | 6 +- doc/mf6io/mf6ivar/tex/swf-dis-griddata.dat | 12 - .../{swf-dis-desc.tex => swf-dis2d-desc.tex} | 4 - ...imensions.dat => swf-dis2d-dimensions.dat} | 1 - doc/mf6io/mf6ivar/tex/swf-dis2d-griddata.dat | 10 + ...-dis-options.dat => swf-dis2d-options.dat} | 0 doc/mf6io/swf/dis2d.tex | 18 + doc/mf6io/swf/swf.tex | 4 + make/makedefaults | 6 +- make/makefile | 12 +- msvs/mf6core.vfproj | 9 +- src/Idm/selector/IdmSwfDfnSelector.f90 | 20 +- src/Idm/swf-cdbidm.f90 | 19 + src/Idm/swf-dis2didm.f90 | 275 ++++ src/Model/Discretization/Dis2d.f90 | 1390 +++++++++++++++++ src/Model/SurfaceWaterFlow/swf.f90 | 25 +- src/Utilities/Idm/SourceCommon.f90 | 31 + src/Utilities/Idm/SourceLoad.F90 | 3 + src/meson.build | 3 +- utils/idmloader/dfns.txt | 2 +- utils/mf5to6/make/makedefaults | 6 +- utils/mf5to6/make/makefile | 2 +- utils/zonebudget/make/makedefaults | 6 +- utils/zonebudget/make/makefile | 2 +- 30 files changed, 1854 insertions(+), 139 deletions(-) rename doc/mf6io/mf6ivar/dfn/{swf-dis.dfn => swf-dis2d.dfn} (84%) create mode 100644 doc/mf6io/mf6ivar/examples/swf-dis2d-example.dat delete mode 100644 doc/mf6io/mf6ivar/tex/swf-dis-griddata.dat rename doc/mf6io/mf6ivar/tex/{swf-dis-desc.tex => swf-dis2d-desc.tex} (94%) rename doc/mf6io/mf6ivar/tex/{swf-dis-dimensions.dat => swf-dis2d-dimensions.dat} (81%) create mode 100644 doc/mf6io/mf6ivar/tex/swf-dis2d-griddata.dat rename doc/mf6io/mf6ivar/tex/{swf-dis-options.dat => swf-dis2d-options.dat} (100%) create mode 100644 doc/mf6io/swf/dis2d.tex create mode 100644 src/Idm/swf-dis2didm.f90 create mode 100644 src/Model/Discretization/Dis2d.f90 diff --git a/autotest/test_swf_dfw_swrt2dis.py b/autotest/test_swf_dfw_swrt2dis.py index d0aefc378d8..3a0187a976b 100644 --- a/autotest/test_swf_dfw_swrt2dis.py +++ b/autotest/test_swf_dfw_swrt2dis.py @@ -74,44 +74,21 @@ def build_models(idx, test): ) sim.register_ims_package(imsswf, [swf.name]) - # vertices = [] - # vertices = [[j, j * dx, 0.0, 0.0] for j in range(nreach + 1)] - # cell2d = [] - # for j in range(nreach): - # cell2d.append([j, 0.5, 2, j, j + 1]) - # nodes = len(cell2d) - # nvert = len(vertices) - - nlay = 1 nrow = 11 ncol = 11 - botm = np.empty((nlay, nrow, ncol), dtype=float) + botm = np.empty((nrow, ncol), dtype=float) for i in range(nrow): - botm[0, i, :] = np.linspace(1.05, 0.05, nrow) + botm[i, :] = np.linspace(1.05, 0.05, nrow) - dis = flopy.mf6.ModflowSwfdis( + dis = flopy.mf6.ModflowSwfdis2D( swf, - nlay=1, - nrow=11, - ncol=11, + nrow=nrow, + ncol=ncol, delr=dx, delc=dx, - top=100., botm=botm, ) - # disl = flopy.mf6.ModflowSwfdisl( - # swf, - # nodes=nodes, - # nvert=nvert, - # reach_length=dx, - # reach_width=dx, - # reach_bottom=reach_bottom, - # idomain=1, - # vertices=vertices, - # cell2d=cell2d, - # ) - dfw = flopy.mf6.ModflowSwfdfw( swf, print_flows=True, @@ -147,7 +124,7 @@ def build_models(idx, test): # flw qinflow = 23.570 - spd = [(0, i, 0, qinflow) for i in range(nrow)] + spd = [(i, 0, qinflow) for i in range(nrow)] flw = flopy.mf6.ModflowSwfflw( swf, maxbound=len(spd), @@ -156,7 +133,7 @@ def build_models(idx, test): stress_period_data=spd, ) - spd = [(0, i, ncol - 1, 1.05) for i in range(nrow)] + spd = [(i, ncol - 1, 1.05) for i in range(nrow)] chd = flopy.mf6.ModflowSwfchd( swf, maxbound=len(spd), diff --git a/autotest/test_swf_vcatch.py b/autotest/test_swf_vcatch.py index 0627f5ba9d6..2a24ee2ee9e 100644 --- a/autotest/test_swf_vcatch.py +++ b/autotest/test_swf_vcatch.py @@ -120,15 +120,13 @@ def build_models(idx, test): ) sim.register_ims_package(imsswf, [swf.name]) - botm = land_surface.reshape((nlay, nrow, ncol)) - dis = flopy.mf6.ModflowSwfdis( + botm = land_surface.reshape((nrow, ncol)) + dis = flopy.mf6.ModflowSwfdis2D( swf, - nlay=nlay, nrow=nrow, ncol=ncol, delr=dx, delc=dx, - top=100.0, botm=botm, xorigin=-810, ) @@ -172,7 +170,7 @@ def build_models(idx, test): # flw qinflow = rainfall * dx * dx - spd = [(0, i, j, qinflow) for j in range(ncol) for i in range(nrow)] + spd = [(i, j, qinflow) for j in range(ncol) for i in range(nrow)] flw = flopy.mf6.ModflowSwfflw( swf, maxbound=len(spd), @@ -185,7 +183,7 @@ def build_models(idx, test): fname = f"{swfname}.zdg.obs.csv" zdg_obs = { fname: [ - ("OUTFLOW", "ZDG", (0, nrow - 1, int(ncol / 2))), + ("OUTFLOW", "ZDG", (nrow - 1, int(ncol / 2))), ], "digits": 10, } @@ -193,7 +191,7 @@ def build_models(idx, test): idcxs = -1 # use cross section 0 width = dx spd = [ - ((0, nrow - 1, int(ncol / 2)), idcxs, width, slope_y, rough_channel) + ((nrow - 1, int(ncol / 2)), idcxs, width, slope_y, rough_channel) ] zdg = flopy.mf6.ModflowSwfzdg( swf, diff --git a/doc/mf6io/mf6ivar/dfn/swf-dis.dfn b/doc/mf6io/mf6ivar/dfn/swf-dis2d.dfn similarity index 84% rename from doc/mf6io/mf6ivar/dfn/swf-dis.dfn rename to doc/mf6io/mf6ivar/dfn/swf-dis2d.dfn index bb77bac782e..02b82dc0b2c 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-dis.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-dis2d.dfn @@ -1,4 +1,4 @@ -# --------------------- gwe dis options --------------------- +# --------------------- swf dis2d options --------------------- block options name length_units @@ -41,16 +41,7 @@ longname rotation angle description counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. -# --------------------- gwe dis dimensions --------------------- - -block dimensions -name nlay -type integer -reader urword -optional false -longname number of layers -description is the number of layers in the model grid. -default_value 1 +# --------------------- swf dis2d dimensions --------------------- block dimensions name nrow @@ -70,7 +61,7 @@ longname number of columns description is the number of columns in the model grid. default_value 2 -# --------------------- gwe dis griddata --------------------- +# --------------------- swf dis2d griddata --------------------- block griddata name delr @@ -90,21 +81,12 @@ longname spacing along a column description is the row spacing in the column direction. default_value 1.0 -block griddata -name top -type double precision -shape (ncol, nrow) -reader readarray -longname cell top elevation -description is the top elevation for each cell in the top model layer. -default_value 1.0 - block griddata name botm type double precision -shape (ncol, nrow, nlay) +shape (ncol, nrow) reader readarray -layered true +layered false longname cell bottom elevation description is the bottom elevation for each cell. default_value 0. @@ -112,9 +94,9 @@ default_value 0. block griddata name idomain type integer -shape (ncol, nrow, nlay) +shape (ncol, nrow) reader readarray -layered true +layered false optional true longname idomain existence array description is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. diff --git a/doc/mf6io/mf6ivar/examples/swf-dis2d-example.dat b/doc/mf6io/mf6ivar/examples/swf-dis2d-example.dat new file mode 100644 index 00000000000..c16e43c07a6 --- /dev/null +++ b/doc/mf6io/mf6ivar/examples/swf-dis2d-example.dat @@ -0,0 +1,20 @@ +BEGIN options +END options + +BEGIN dimensions + NROW 3 + NCOL 3 +END dimensions + +BEGIN griddata + delr + CONSTANT 500.0 + delc + CONSTANT 500.0 + botm + INTERNAL FACTOR 1.0 + 1.05 0.95 0.85 + 1.05 0.95 0.85 + 1.05 0.95 0.85 +END griddata + diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 2d99fa8f82c..8de9f79dc2b 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -1537,19 +1537,17 @@ | SWF | DISL | CELL2D | FDC | DOUBLE PRECISION | is the fractional distance to the cell center. FDC is relative to the first vertex in the ICVERT array. In most cases FDC should be 0.5, which would place the center of the line segment that defines the cell. If the value of FDC is 1, the cell center would located at the last vertex. FDC values of 0 and 1 can be used to place the node at either end of the cell which can be useful for cells with boundary conditions. | | SWF | DISL | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | | SWF | DISL | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC. | -| SWF | DIS | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | -| SWF | DIS | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | -| SWF | DIS | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| SWF | DIS | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| SWF | DIS | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| SWF | DIS | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | -| SWF | DIS | DIMENSIONS | NROW | INTEGER | is the number of rows in the model grid. | -| SWF | DIS | DIMENSIONS | NCOL | INTEGER | is the number of columns in the model grid. | -| SWF | DIS | GRIDDATA | DELR | DOUBLE PRECISION (NCOL) | is the column spacing in the row direction. | -| SWF | DIS | GRIDDATA | DELC | DOUBLE PRECISION (NROW) | is the row spacing in the column direction. | -| SWF | DIS | GRIDDATA | TOP | DOUBLE PRECISION (NCOL, NROW) | is the top elevation for each cell in the top model layer. | -| SWF | DIS | GRIDDATA | BOTM | DOUBLE PRECISION (NCOL, NROW, NLAY) | is the bottom elevation for each cell. | -| SWF | DIS | GRIDDATA | IDOMAIN | INTEGER (NCOL, NROW, NLAY) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. | +| SWF | DIS2D | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | +| SWF | DIS2D | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | +| SWF | DIS2D | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DIS2D | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DIS2D | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DIS2D | DIMENSIONS | NROW | INTEGER | is the number of rows in the model grid. | +| SWF | DIS2D | DIMENSIONS | NCOL | INTEGER | is the number of columns in the model grid. | +| SWF | DIS2D | GRIDDATA | DELR | DOUBLE PRECISION (NCOL) | is the column spacing in the row direction. | +| SWF | DIS2D | GRIDDATA | DELC | DOUBLE PRECISION (NROW) | is the row spacing in the column direction. | +| SWF | DIS2D | GRIDDATA | BOTM | DOUBLE PRECISION (NCOL, NROW) | is the bottom elevation for each cell. | +| SWF | DIS2D | GRIDDATA | IDOMAIN | INTEGER (NCOL, NROW) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. | | SWF | DISV | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | | SWF | DISV | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | | SWF | DISV | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | diff --git a/doc/mf6io/mf6ivar/mf6ivar.py b/doc/mf6io/mf6ivar/mf6ivar.py index 3824312e24a..db9fa515871 100644 --- a/doc/mf6io/mf6ivar/mf6ivar.py +++ b/doc/mf6io/mf6ivar/mf6ivar.py @@ -761,7 +761,7 @@ def write_appendix(texdir, allblocks): "gwe-fmi", "swf-nam", "swf-disl", - "swf-dis", + "swf-dis2d", "swf-disv", "swf-dfw", "swf-cxs", diff --git a/doc/mf6io/mf6ivar/tex/appendixA.tex b/doc/mf6io/mf6ivar/tex/appendixA.tex index 7e73cb1e766..672031d2378 100644 --- a/doc/mf6io/mf6ivar/tex/appendixA.tex +++ b/doc/mf6io/mf6ivar/tex/appendixA.tex @@ -325,9 +325,9 @@ SWF & DISL & VERTICES & yes \\ SWF & DISL & CELL2D & yes \\ \hline -SWF & DIS & OPTIONS & yes \\ -SWF & DIS & DIMENSIONS & yes \\ -SWF & DIS & GRIDDATA & no \\ +SWF & DIS2D & OPTIONS & yes \\ +SWF & DIS2D & DIMENSIONS & yes \\ +SWF & DIS2D & GRIDDATA & no \\ \hline SWF & DISV & OPTIONS & yes \\ SWF & DISV & DIMENSIONS & yes \\ diff --git a/doc/mf6io/mf6ivar/tex/swf-dis-griddata.dat b/doc/mf6io/mf6ivar/tex/swf-dis-griddata.dat deleted file mode 100644 index daae94c0ee3..00000000000 --- a/doc/mf6io/mf6ivar/tex/swf-dis-griddata.dat +++ /dev/null @@ -1,12 +0,0 @@ -BEGIN GRIDDATA - DELR - -- READARRAY - DELC - -- READARRAY - TOP - -- READARRAY - BOTM [LAYERED] - -- READARRAY - [IDOMAIN [LAYERED] - -- READARRAY] -END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/swf-dis-desc.tex b/doc/mf6io/mf6ivar/tex/swf-dis2d-desc.tex similarity index 94% rename from doc/mf6io/mf6ivar/tex/swf-dis-desc.tex rename to doc/mf6io/mf6ivar/tex/swf-dis2d-desc.tex index afef5a5fa76..aa27a254ab5 100644 --- a/doc/mf6io/mf6ivar/tex/swf-dis-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-dis2d-desc.tex @@ -17,8 +17,6 @@ \item \textbf{Block: DIMENSIONS} \begin{description} -\item \texttt{nlay}---is the number of layers in the model grid. - \item \texttt{nrow}---is the number of rows in the model grid. \item \texttt{ncol}---is the number of columns in the model grid. @@ -31,8 +29,6 @@ \item \texttt{delc}---is the row spacing in the column direction. -\item \texttt{top}---is the top elevation for each cell in the top model layer. - \item \texttt{botm}---is the bottom elevation for each cell. \item \texttt{idomain}---is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. diff --git a/doc/mf6io/mf6ivar/tex/swf-dis-dimensions.dat b/doc/mf6io/mf6ivar/tex/swf-dis2d-dimensions.dat similarity index 81% rename from doc/mf6io/mf6ivar/tex/swf-dis-dimensions.dat rename to doc/mf6io/mf6ivar/tex/swf-dis2d-dimensions.dat index 227d0e1f799..454142f44ea 100644 --- a/doc/mf6io/mf6ivar/tex/swf-dis-dimensions.dat +++ b/doc/mf6io/mf6ivar/tex/swf-dis2d-dimensions.dat @@ -1,5 +1,4 @@ BEGIN DIMENSIONS - NLAY NROW NCOL END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-dis2d-griddata.dat b/doc/mf6io/mf6ivar/tex/swf-dis2d-griddata.dat new file mode 100644 index 00000000000..5850e1a8139 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-dis2d-griddata.dat @@ -0,0 +1,10 @@ +BEGIN GRIDDATA + DELR + -- READARRAY + DELC + -- READARRAY + BOTM + -- READARRAY + [IDOMAIN + -- READARRAY] +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/swf-dis-options.dat b/doc/mf6io/mf6ivar/tex/swf-dis2d-options.dat similarity index 100% rename from doc/mf6io/mf6ivar/tex/swf-dis-options.dat rename to doc/mf6io/mf6ivar/tex/swf-dis2d-options.dat diff --git a/doc/mf6io/swf/dis2d.tex b/doc/mf6io/swf/dis2d.tex new file mode 100644 index 00000000000..9bd3c67aaff --- /dev/null +++ b/doc/mf6io/swf/dis2d.tex @@ -0,0 +1,18 @@ +Input to the Two Dimensional Structured Discretization (DIS2D) Package is read from the file that has type ``DIS2D6'' in the Name File. Only one discretization package can be specified for a SWF Model. + + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-dis2d-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-dis2d-dimensions.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-dis2d-griddata.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/swf-dis2d-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/swf-dis2d-example.dat} diff --git a/doc/mf6io/swf/swf.tex b/doc/mf6io/swf/swf.tex index b889ff7ab2c..99b802a3d97 100644 --- a/doc/mf6io/swf/swf.tex +++ b/doc/mf6io/swf/swf.tex @@ -18,6 +18,10 @@ \subsection{SWF Model Name File} \subsection{Discretization by Lines (DISL) Package} \input{swf/disl} +\newpage +\subsection{Structured Discretization in Two Dimensions (DIS2D) Package} +\input{swf/dis2d} + \newpage \subsection{Diffusive Wave (DFW) Package} \input{swf/dfw} diff --git a/make/makedefaults b/make/makedefaults index 3890e49c6ca..995cca74c8a 100644 --- a/make/makedefaults +++ b/make/makedefaults @@ -1,4 +1,4 @@ -# makedefaults created by pymake (version 1.2.9) for the 'mf6' executable. +# makedefaults created by pymake (version 1.2.10.dev0) for the 'mf6' executable. # determine OS ifeq ($(OS), Windows_NT) @@ -57,11 +57,11 @@ OPTLEVEL ?= -O2 # set the fortran flags ifeq ($(detected_OS), Windows) ifeq ($(FC), gfortran) - FFLAGS ?= -static -fbacktrace $(OS_macro) -fall-intrinsics -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -pedantic -std=f2008 -Wcharacter-truncation -cpp + FFLAGS ?= -static -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid -fall-intrinsics -pedantic -Wcharacter-truncation $(OS_macro) -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -std=f2008 -cpp endif else ifeq ($(FC), gfortran) - FFLAGS ?= -fbacktrace $(OS_macro) -fall-intrinsics -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -pedantic -std=f2008 -Wcharacter-truncation -cpp + FFLAGS ?= -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid -fall-intrinsics -pedantic -Wcharacter-truncation $(OS_macro) -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -std=f2008 -cpp endif ifeq ($(FC), $(filter $(FC), ifort mpiifort)) FFLAGS ?= -no-heap-arrays -fpe0 -traceback -Qdiag-disable:7416 -Qdiag-disable:7025 -Qdiag-disable:5268 -fpp diff --git a/make/makefile b/make/makefile index ea69070e37e..12855d9cb22 100644 --- a/make/makefile +++ b/make/makefile @@ -1,4 +1,4 @@ -# makefile created by pymake (version 1.2.9) for the 'mf6' executable. +# makefile created by pymake (version 1.2.10.dev0) for the 'mf6' executable. include ./makedefaults @@ -104,16 +104,16 @@ $(OBJDIR)/InputDefinition.o \ $(OBJDIR)/Memory.o \ $(OBJDIR)/List.o \ $(OBJDIR)/swf-zdgidm.o \ -$(OBJDIR)/swf-cdbidm.o \ $(OBJDIR)/swf-namidm.o \ $(OBJDIR)/swf-icidm.o \ $(OBJDIR)/swf-flwidm.o \ $(OBJDIR)/swf-disvidm.o \ $(OBJDIR)/swf-dislidm.o \ -$(OBJDIR)/swf-disidm.o \ +$(OBJDIR)/swf-dis2didm.o \ $(OBJDIR)/swf-dfwidm.o \ $(OBJDIR)/swf-cxsidm.o \ $(OBJDIR)/swf-chdidm.o \ +$(OBJDIR)/swf-cdbidm.o \ $(OBJDIR)/sim-tdisidm.o \ $(OBJDIR)/sim-namidm.o \ $(OBJDIR)/prt-namidm.o \ @@ -377,12 +377,13 @@ $(OBJDIR)/LoadMf6File.o \ $(OBJDIR)/BoundInputContext.o \ $(OBJDIR)/AsciiInputLoadType.o \ $(OBJDIR)/swf-zdg.o \ -$(OBJDIR)/swf-cdb.o \ $(OBJDIR)/swf-sto.o \ $(OBJDIR)/swf-oc.o \ $(OBJDIR)/swf-obs.o \ $(OBJDIR)/swf-flw.o \ $(OBJDIR)/swf-dfw.o \ +$(OBJDIR)/swf-cdb.o \ +$(OBJDIR)/Dis2d.o \ $(OBJDIR)/prt-prp.o \ $(OBJDIR)/prt-oc.o \ $(OBJDIR)/prt-obs.o \ @@ -441,7 +442,8 @@ $(OBJDIR)/blas1_d.o \ $(OBJDIR)/Iunit.o \ $(OBJDIR)/RectangularGeometry.o \ $(OBJDIR)/CircularGeometry.o \ -$(OBJDIR)/ExplicitModel.o +$(OBJDIR)/ExplicitModel.o \ +$(OBJDIR)/swf-disidm.o # Define the objects that make up the program $(PROGRAM) : $(OBJECTS) diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index 96c78baecf2..400a4f4459b 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -178,6 +178,7 @@ + @@ -216,9 +217,6 @@ - - - @@ -286,6 +284,11 @@ + + + + + diff --git a/src/Idm/selector/IdmSwfDfnSelector.f90 b/src/Idm/selector/IdmSwfDfnSelector.f90 index 7baabf3bcd2..cc449bc306c 100644 --- a/src/Idm/selector/IdmSwfDfnSelector.f90 +++ b/src/Idm/selector/IdmSwfDfnSelector.f90 @@ -7,7 +7,7 @@ module IdmSwfDfnSelectorModule InputBlockDefinitionType use SwfNamInputModule use SwfDislInputModule - use SwfDisInputModule + use SwfDis2DInputModule use SwfDisvInputModule use SwfCxsInputModule use SwfDfwInputModule @@ -48,8 +48,8 @@ function swf_param_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, swf_nam_param_definitions) case ('DISL') call set_param_pointer(input_definition, swf_disl_param_definitions) - case ('DIS') - call set_param_pointer(input_definition, swf_dis_param_definitions) + case ('DIS2D') + call set_param_pointer(input_definition, swf_dis2d_param_definitions) case ('DISV') call set_param_pointer(input_definition, swf_disv_param_definitions) case ('CXS') @@ -80,8 +80,8 @@ function swf_aggregate_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, swf_nam_aggregate_definitions) case ('DISL') call set_param_pointer(input_definition, swf_disl_aggregate_definitions) - case ('DIS') - call set_param_pointer(input_definition, swf_dis_aggregate_definitions) + case ('DIS2D') + call set_param_pointer(input_definition, swf_dis2d_aggregate_definitions) case ('DISV') call set_param_pointer(input_definition, swf_disv_aggregate_definitions) case ('CXS') @@ -112,8 +112,8 @@ function swf_block_definitions(subcomponent) result(input_definition) call set_block_pointer(input_definition, swf_nam_block_definitions) case ('DISL') call set_block_pointer(input_definition, swf_disl_block_definitions) - case ('DIS') - call set_block_pointer(input_definition, swf_dis_block_definitions) + case ('DIS2D') + call set_block_pointer(input_definition, swf_dis2d_block_definitions) case ('DISV') call set_block_pointer(input_definition, swf_disv_block_definitions) case ('CXS') @@ -143,8 +143,8 @@ function swf_idm_multi_package(subcomponent) result(multi_package) multi_package = swf_nam_multi_package case ('DISL') multi_package = swf_disl_multi_package - case ('DIS') - multi_package = swf_dis_multi_package + case ('DIS2D') + multi_package = swf_dis2d_multi_package case ('DISV') multi_package = swf_disv_multi_package case ('CXS') @@ -178,7 +178,7 @@ function swf_idm_integrated(subcomponent) result(integrated) integrated = .true. case ('DISL') integrated = .true. - case ('DIS') + case ('DIS2D') integrated = .true. case ('DISV') integrated = .true. diff --git a/src/Idm/swf-cdbidm.f90 b/src/Idm/swf-cdbidm.f90 index 573ed552d99..6ecfa6ad2b2 100644 --- a/src/Idm/swf-cdbidm.f90 +++ b/src/Idm/swf-cdbidm.f90 @@ -16,6 +16,7 @@ module SwfCdbInputModule logical :: iprpak = .false. logical :: iprflow = .false. logical :: ipakcb = .false. + logical :: filein = .false. logical :: obs_filerecord = .false. logical :: obs6 = .false. logical :: obs6_filename = .false. @@ -114,6 +115,23 @@ module SwfCdbInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + swfcdb_filein = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'CDB', & ! subcomponent + 'OPTIONS', & ! block + 'FILEIN', & ! tag name + 'FILEIN', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & swfcdb_obs_filerecord = InputParamDefinitionType & ( & @@ -275,6 +293,7 @@ module SwfCdbInputModule swfcdb_iprpak, & swfcdb_iprflow, & swfcdb_ipakcb, & + swfcdb_filein, & swfcdb_obs_filerecord, & swfcdb_obs6, & swfcdb_obs6_filename, & diff --git a/src/Idm/swf-dis2didm.f90 b/src/Idm/swf-dis2didm.f90 new file mode 100644 index 00000000000..48026dafad9 --- /dev/null +++ b/src/Idm/swf-dis2didm.f90 @@ -0,0 +1,275 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module SwfDis2DInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public swf_dis2d_param_definitions + public swf_dis2d_aggregate_definitions + public swf_dis2d_block_definitions + public SwfDis2dParamFoundType + public swf_dis2d_multi_package + + type SwfDis2dParamFoundType + logical :: length_units = .false. + logical :: nogrb = .false. + logical :: xorigin = .false. + logical :: yorigin = .false. + logical :: angrot = .false. + logical :: nrow = .false. + logical :: ncol = .false. + logical :: delr = .false. + logical :: delc = .false. + logical :: botm = .false. + logical :: idomain = .false. + end type SwfDis2dParamFoundType + + logical :: swf_dis2d_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + swfdis2d_length_units = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS2D', & ! subcomponent + 'OPTIONS', & ! block + 'LENGTH_UNITS', & ! tag name + 'LENGTH_UNITS', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis2d_nogrb = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS2D', & ! subcomponent + 'OPTIONS', & ! block + 'NOGRB', & ! tag name + 'NOGRB', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis2d_xorigin = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS2D', & ! subcomponent + 'OPTIONS', & ! block + 'XORIGIN', & ! tag name + 'XORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis2d_yorigin = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS2D', & ! subcomponent + 'OPTIONS', & ! block + 'YORIGIN', & ! tag name + 'YORIGIN', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis2d_angrot = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS2D', & ! subcomponent + 'OPTIONS', & ! block + 'ANGROT', & ! tag name + 'ANGROT', & ! fortran variable + 'DOUBLE', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis2d_nrow = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS2D', & ! subcomponent + 'DIMENSIONS', & ! block + 'NROW', & ! tag name + 'NROW', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis2d_ncol = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS2D', & ! subcomponent + 'DIMENSIONS', & ! block + 'NCOL', & ! tag name + 'NCOL', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis2d_delr = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS2D', & ! subcomponent + 'GRIDDATA', & ! block + 'DELR', & ! tag name + 'DELR', & ! fortran variable + 'DOUBLE1D', & ! type + 'NCOL', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis2d_delc = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS2D', & ! subcomponent + 'GRIDDATA', & ! block + 'DELC', & ! tag name + 'DELC', & ! fortran variable + 'DOUBLE1D', & ! type + 'NROW', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis2d_botm = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS2D', & ! subcomponent + 'GRIDDATA', & ! block + 'BOTM', & ! tag name + 'BOTM', & ! fortran variable + 'DOUBLE2D', & ! type + 'NCOL NROW', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swfdis2d_idomain = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS2D', & ! subcomponent + 'GRIDDATA', & ! block + 'IDOMAIN', & ! tag name + 'IDOMAIN', & ! fortran variable + 'INTEGER2D', & ! type + 'NCOL NROW', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + swf_dis2d_param_definitions(*) = & + [ & + swfdis2d_length_units, & + swfdis2d_nogrb, & + swfdis2d_xorigin, & + swfdis2d_yorigin, & + swfdis2d_angrot, & + swfdis2d_nrow, & + swfdis2d_ncol, & + swfdis2d_delr, & + swfdis2d_delc, & + swfdis2d_botm, & + swfdis2d_idomain & + ] + + type(InputParamDefinitionType), parameter :: & + swf_dis2d_aggregate_definitions(*) = & + [ & + InputParamDefinitionType & + ( & + '', & ! component + '', & ! subcomponent + '', & ! block + '', & ! tag name + '', & ! fortran variable + '', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) & + ] + + type(InputBlockDefinitionType), parameter :: & + swf_dis2d_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'DIMENSIONS', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'GRIDDATA', & ! blockname + .true., & ! required + .false., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module SwfDis2DInputModule diff --git a/src/Model/Discretization/Dis2d.f90 b/src/Model/Discretization/Dis2d.f90 new file mode 100644 index 00000000000..77cfe361700 --- /dev/null +++ b/src/Model/Discretization/Dis2d.f90 @@ -0,0 +1,1390 @@ +module Dis2dModule + + use ArrayReadersModule, only: ReadArray + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: LINELENGTH, DHALF, DONE, DZERO, & + LENMEMPATH, LENVARNAME + use BaseDisModule, only: DisBaseType + use GeomUtilModule, only: get_node, get_ijk + use InputOutputModule, only: URWORD, ulasav, ulaprufw, & + ubdsv1, ubdsv06, urword, getunit, openfile + use SimModule, only: count_errors, store_error, store_error_unit, & + store_error_filename + use SimVariablesModule, only: errmsg, idm_context + use MemoryManagerModule, only: mem_allocate, mem_deallocate + use MemoryManagerExtModule, only: mem_set_value, memorylist_remove + use TdisModule, only: kstp, kper, pertim, totim, delt + + implicit none + private + public dis2d_cr, Dis2dType + + !> @brief Structured grid discretization + type, extends(DisBaseType) :: Dis2dType + integer(I4B), pointer :: nrow => null() !< number of rows + integer(I4B), pointer :: ncol => null() !< number of columns + real(DP), dimension(:), pointer, contiguous :: delr => null() !< spacing along a row + real(DP), dimension(:), pointer, contiguous :: delc => null() !< spacing along a column + real(DP), dimension(:, :), pointer, contiguous :: botm => null() !< bottom elevations for each cell (ncol, nrow) + integer(I4B), dimension(:, :), pointer, contiguous :: idomain => null() !< idomain (ncol, nrow) + real(DP), dimension(:), pointer, contiguous :: cellx => null() !< cell center x coordinate for column j + real(DP), dimension(:), pointer, contiguous :: celly => null() !< cell center y coordinate for row i + + contains + + procedure :: dis_df => dis3d_df + procedure :: dis_da => dis3d_da + procedure :: get_dis_type => get_dis_type + procedure, public :: record_array + procedure, public :: read_layer_array + procedure, public :: record_srcdst_list_header + procedure, public :: nlarray_to_nodelist + ! -- helper functions + procedure :: get_nodenumber_idx1 + procedure :: get_nodenumber_idx2 + procedure :: nodeu_to_string + procedure :: nodeu_to_array + procedure :: nodeu_from_string + procedure :: nodeu_from_cellid + procedure :: supports_layers + procedure :: get_ncpl + procedure :: get_polyverts + procedure :: connection_vector + procedure :: connection_normal + ! -- private + procedure :: source_options + procedure :: source_dimensions + procedure :: source_griddata + procedure :: log_options + procedure :: log_dimensions + procedure :: log_griddata + procedure :: grid_finalize + procedure :: write_grb + procedure :: allocate_scalars + procedure :: allocate_arrays + ! + ! -- Read a node-sized model array (reduced or not) + procedure :: read_int_array + procedure :: read_dbl_array + end type Dis2dType + + !> @brief Simplifies tracking parameters sourced from the input context. + type DisFoundType + logical :: length_units = .false. + logical :: nogrb = .false. + logical :: xorigin = .false. + logical :: yorigin = .false. + logical :: angrot = .false. + logical :: nrow = .false. + logical :: ncol = .false. + logical :: delr = .false. + logical :: delc = .false. + logical :: top = .false. + logical :: botm = .false. + logical :: idomain = .false. + end type DisFoundtype + +contains + + !> @brief Create a new structured discretization object + !< + subroutine dis2d_cr(dis, name_model, input_mempath, inunit, iout) + ! -- dummy + class(DisBaseType), pointer :: dis + character(len=*), intent(in) :: name_model + character(len=*), intent(in) :: input_mempath + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + ! -- locals + type(Dis2dType), pointer :: disnew + ! -- formats + character(len=*), parameter :: fmtheader = & + "(1X, /1X, 'DIS -- STRUCTURED GRID DISCRETIZATION PACKAGE,', & + &' VERSION 2 : 3/27/2014 - INPUT READ FROM MEMPATH: ', A, /)" + ! + allocate (disnew) + dis => disnew + call disnew%allocate_scalars(name_model, input_mempath) + dis%inunit = inunit + dis%iout = iout + ! + ! -- If dis enabled + if (inunit > 0) then + ! + ! -- Identify package + if (iout > 0) then + write (iout, fmtheader) dis%input_mempath + end if + end if + ! + end subroutine dis2d_cr + + !> @brief Define the discretization + !< + subroutine dis3d_df(this) + ! -- dummy + class(Dis2dType) :: this + ! + ! -- Transfer the data from the memory manager into this package object + if (this%inunit /= 0) then + ! + ! -- source input options + call this%source_options() + ! + ! -- source input dimensions + call this%source_dimensions() + ! + ! -- source input griddata + call this%source_griddata() + end if + ! + ! -- Final grid initialization + call this%grid_finalize() + ! + end subroutine dis3d_df + + !> @brief Deallocate variables + !< + subroutine dis3d_da(this) + ! -- dummy + class(Dis2dType) :: this + ! + ! -- Deallocate idm memory + call memorylist_remove(this%name_model, 'DIS2D', idm_context) + ! + ! -- DisBaseType deallocate + call this%DisBaseType%dis_da() + ! + ! -- Deallocate scalars + call mem_deallocate(this%nrow) + call mem_deallocate(this%ncol) + call mem_deallocate(this%delr) + call mem_deallocate(this%delc) + call mem_deallocate(this%cellx) + call mem_deallocate(this%celly) + ! + ! -- Deallocate Arrays + call mem_deallocate(this%nodereduced) + call mem_deallocate(this%nodeuser) + call mem_deallocate(this%botm) + call mem_deallocate(this%idomain) + ! + end subroutine dis3d_da + + !> @brief Copy options from IDM into package + !< + subroutine source_options(this) + ! -- dummy + class(Dis2dType) :: this + ! -- locals + character(len=LENVARNAME), dimension(3) :: lenunits = & + &[character(len=LENVARNAME) :: 'FEET', 'METERS', 'CENTIMETERS'] + type(DisFoundType) :: found + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%lenuni, 'LENGTH_UNITS', this%input_mempath, & + lenunits, found%length_units) + call mem_set_value(this%nogrb, 'NOGRB', this%input_mempath, found%nogrb) + call mem_set_value(this%xorigin, 'XORIGIN', this%input_mempath, found%xorigin) + call mem_set_value(this%yorigin, 'YORIGIN', this%input_mempath, found%yorigin) + call mem_set_value(this%angrot, 'ANGROT', this%input_mempath, found%angrot) + ! + ! -- log values to list file + if (this%iout > 0) then + call this%log_options(found) + end if + ! + end subroutine source_options + + !> @brief Write user options to list file + !< + subroutine log_options(this, found) + ! -- dummy + class(Dis2dType) :: this + type(DisFoundType), intent(in) :: found + ! + write (this%iout, '(1x,a)') 'Setting Discretization Options' + ! + if (found%length_units) then + write (this%iout, '(4x,a,i0)') 'Model length unit [0=UND, 1=FEET, & + &2=METERS, 3=CENTIMETERS] set as ', this%lenuni + end if + ! + if (found%nogrb) then + write (this%iout, '(4x,a,i0)') 'Binary grid file [0=GRB, 1=NOGRB] & + &set as ', this%nogrb + end if + ! + if (found%xorigin) then + write (this%iout, '(4x,a,G0)') 'XORIGIN = ', this%xorigin + end if + ! + if (found%yorigin) then + write (this%iout, '(4x,a,G0)') 'YORIGIN = ', this%yorigin + end if + ! + if (found%angrot) then + write (this%iout, '(4x,a,G0)') 'ANGROT = ', this%angrot + end if + ! + write (this%iout, '(1x,a,/)') 'End Setting Discretization Options' + ! + end subroutine log_options + + !> @brief Copy dimensions from IDM into package + !< + subroutine source_dimensions(this) + ! -- dummy + class(Dis2dType) :: this + ! -- locals + integer(I4B) :: i, j + type(DisFoundType) :: found + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%nrow, 'NROW', this%input_mempath, found%nrow) + call mem_set_value(this%ncol, 'NCOL', this%input_mempath, found%ncol) + ! + ! -- log simulation values + if (this%iout > 0) then + call this%log_dimensions(found) + end if + ! + ! -- verify dimensions were set + if (this%nrow < 1) then + call store_error( & + 'NROW was not specified or was specified incorrectly.') + call store_error_filename(this%input_fname) + end if + if (this%ncol < 1) then + call store_error( & + 'NCOL was not specified or was specified incorrectly.') + call store_error_filename(this%input_fname) + end if + ! + ! -- calculate nodesuser + this%nodesuser = this%nrow * this%ncol + ! + ! -- Allocate delr, delc, and non-reduced vectors for dis + call mem_allocate(this%delr, this%ncol, 'DELR', this%memoryPath) + call mem_allocate(this%delc, this%nrow, 'DELC', this%memoryPath) + call mem_allocate(this%idomain, this%ncol, this%nrow, 'IDOMAIN', & + this%memoryPath) + call mem_allocate(this%botm, this%ncol, this%nrow, 'BOTM', & + this%memoryPath) + call mem_allocate(this%cellx, this%ncol, 'CELLX', this%memoryPath) + call mem_allocate(this%celly, this%nrow, 'CELLY', this%memoryPath) + ! + ! -- initialize all cells to be active (idomain = 1) + do i = 1, this%nrow + do j = 1, this%ncol + this%idomain(j, i) = 1 + end do + end do + ! + end subroutine source_dimensions + + !> @brief Write dimensions to list file + !< + subroutine log_dimensions(this, found) + ! -- dummy + class(Dis2dType) :: this + type(DisFoundType), intent(in) :: found + ! + write (this%iout, '(1x,a)') 'Setting Discretization Dimensions' + ! + if (found%nrow) then + write (this%iout, '(4x,a,i0)') 'NROW = ', this%nrow + end if + ! + if (found%ncol) then + write (this%iout, '(4x,a,i0)') 'NCOL = ', this%ncol + end if + ! + write (this%iout, '(1x,a,/)') 'End Setting Discretization Dimensions' + ! + end subroutine log_dimensions + + !> @brief Copy grid data from IDM into package + !< + subroutine source_griddata(this) + ! -- dummy + class(Dis2dType) :: this + type(DisFoundType) :: found + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%delr, 'DELR', this%input_mempath, found%delr) + call mem_set_value(this%delc, 'DELC', this%input_mempath, found%delc) + call mem_set_value(this%botm, 'BOTM', this%input_mempath, found%botm) + call mem_set_value(this%idomain, 'IDOMAIN', this%input_mempath, found%idomain) + ! + ! -- log simulation values + if (this%iout > 0) then + call this%log_griddata(found) + end if + ! + end subroutine source_griddata + + !> @brief Write dimensions to list file + !< + subroutine log_griddata(this, found) + ! -- dummy + class(Dis2dType) :: this + type(DisFoundType), intent(in) :: found + ! + write (this%iout, '(1x,a)') 'Setting Discretization Griddata' + ! + if (found%delr) then + write (this%iout, '(4x,a)') 'DELR set from input file' + end if + ! + if (found%delc) then + write (this%iout, '(4x,a)') 'DELC set from input file' + end if + ! + if (found%top) then + write (this%iout, '(4x,a)') 'TOP set from input file' + end if + ! + if (found%botm) then + write (this%iout, '(4x,a)') 'BOTM set from input file' + end if + ! + if (found%idomain) then + write (this%iout, '(4x,a)') 'IDOMAIN set from input file' + end if + ! + write (this%iout, '(1x,a,/)') 'End Setting Discretization Griddata' + ! + end subroutine log_griddata + + !> @brief Finalize grid (check properties, allocate arrays, compute connections) + !< + subroutine grid_finalize(this) + ! -- modules + use MemoryManagerModule, only: mem_allocate + ! -- dummy + class(Dis2dType) :: this + ! -- locals + integer(I4B) :: i, j + integer(I4B) :: node + integer(I4B) :: noder + integer(I4B) :: nrsize + ! -- formats + character(len=*), parameter :: fmtdz = & + "('CELL (',i0,',',i0,',',i0,') THICKNESS <= 0. ', & + &'TOP, BOT: ',2(1pg24.15))" + character(len=*), parameter :: fmtnr = & + "(/1x, 'The specified IDOMAIN results in a reduced number of cells.',& + &/1x, 'Number of user nodes: ',I0,& + &/1X, 'Number of nodes in solution: ', I0, //)" + ! + ! -- count active cells + this%nodes = 0 + do i = 1, this%nrow + do j = 1, this%ncol + if (this%idomain(j, i) > 0) this%nodes = this%nodes + 1 + end do + end do + ! + ! -- Check to make sure nodes is a valid number + if (this%nodes == 0) then + call store_error('Model does not have any active nodes. & + &Ensure IDOMAIN array has some values greater & + &than zero.') + call store_error_filename(this%input_fname) + end if + ! + ! -- Write message if reduced grid + if (this%nodes < this%nodesuser) then + write (this%iout, fmtnr) this%nodesuser, this%nodes + end if + ! + ! -- Array size is now known, so allocate + call this%allocate_arrays() + ! + ! -- Fill the nodereduced array with the reduced nodenumber, or + ! a negative number to indicate it is a pass-through cell, or + ! a zero to indicate that the cell is excluded from the + ! solution. + if (this%nodes < this%nodesuser) then + node = 1 + noder = 1 + do i = 1, this%nrow + do j = 1, this%ncol + if (this%idomain(j, i) > 0) then + this%nodereduced(node) = noder + noder = noder + 1 + elseif (this%idomain(j, i) < 0) then + this%nodereduced(node) = -1 + else + this%nodereduced(node) = 0 + end if + node = node + 1 + end do + end do + end if + ! + ! -- allocate and fill nodeuser if a reduced grid + if (this%nodes < this%nodesuser) then + node = 1 + noder = 1 + do i = 1, this%nrow + do j = 1, this%ncol + if (this%idomain(j, i) > 0) then + this%nodeuser(noder) = node + noder = noder + 1 + end if + node = node + 1 + end do + end do + end if + ! + ! -- fill x,y coordinate arrays + this%cellx(1) = DHALF * this%delr(1) + this%celly(this%nrow) = DHALF * this%delc(this%nrow) + do j = 2, this%ncol + this%cellx(j) = this%cellx(j - 1) + DHALF * this%delr(j - 1) + & + DHALF * this%delr(j) + end do + ! -- row number increases in negative y direction: + do i = this%nrow - 1, 1, -1 + this%celly(i) = this%celly(i + 1) + DHALF * this%delc(i + 1) + & + DHALF * this%delc(i) + end do + ! + ! -- Move botm into bot, and calculate area + node = 0 + do i = 1, this%nrow + do j = 1, this%ncol + node = node + 1 + noder = node + if (this%nodes < this%nodesuser) noder = this%nodereduced(node) + if (noder <= 0) cycle + this%bot(noder) = this%botm(j, i) + this%area(noder) = this%delr(j) * this%delc(i) + this%xc(noder) = this%cellx(j) + this%yc(noder) = this%celly(i) + end do + end do + ! + ! -- create and fill the connections object + nrsize = 0 + if (this%nodes < this%nodesuser) nrsize = this%nodes + allocate (this%con) + call this%con%disconnections(this%name_model, this%nodes, & + this%ncol, this%nrow, 1, & + nrsize, this%delr, this%delc, & + this%top, this%bot, this%nodereduced, & + this%nodeuser) + this%nja = this%con%nja + this%njas = this%con%njas + ! + end subroutine grid_finalize + + !> @brief Write a binary grid file + !< + subroutine write_grb(this, icelltype) + ! -- modules + use OpenSpecModule, only: access, form + ! -- dummy + class(Dis2dType) :: this + integer(I4B), dimension(:), intent(in) :: icelltype + ! -- local + integer(I4B) :: iunit, ntxt, ncpl + integer(I4B), parameter :: lentxt = 100 + character(len=50) :: txthdr + character(len=lentxt) :: txt + character(len=LINELENGTH) :: fname + character(len=*), parameter :: fmtgrdsave = & + "(4X,'BINARY GRID INFORMATION WILL BE WRITTEN TO:', & + &/,6X,'UNIT NUMBER: ', I0,/,6X, 'FILE NAME: ', A)" + ! + ! -- Initialize + ntxt = 16 + ncpl = this%nrow * this%ncol + ! + ! -- Open the file + fname = trim(this%input_fname)//'.grb' + iunit = getunit() + write (this%iout, fmtgrdsave) iunit, trim(adjustl(fname)) + call openfile(iunit, this%iout, trim(adjustl(fname)), 'DATA(BINARY)', & + form, access, 'REPLACE') + ! + ! -- write header information + write (txthdr, '(a)') 'GRID DIS2D' + txthdr(50:50) = new_line('a') + write (iunit) txthdr + write (txthdr, '(a)') 'VERSION 1' + txthdr(50:50) = new_line('a') + write (iunit) txthdr + write (txthdr, '(a, i0)') 'NTXT ', ntxt + txthdr(50:50) = new_line('a') + write (iunit) txthdr + write (txthdr, '(a, i0)') 'LENTXT ', lentxt + txthdr(50:50) = new_line('a') + write (iunit) txthdr + ! + ! -- write variable definitions + write (txt, '(3a, i0)') 'NCELLS ', 'INTEGER ', 'NDIM 0 # ', this%nodesuser + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'NROW ', 'INTEGER ', 'NDIM 0 # ', this%nrow + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'NCOL ', 'INTEGER ', 'NDIM 0 # ', this%ncol + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'NJA ', 'INTEGER ', 'NDIM 0 # ', this%nja + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, 1pg24.15)') 'XORIGIN ', 'DOUBLE ', 'NDIM 0 # ', this%xorigin + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, 1pg24.15)') 'YORIGIN ', 'DOUBLE ', 'NDIM 0 # ', this%yorigin + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, 1pg24.15)') 'ANGROT ', 'DOUBLE ', 'NDIM 0 # ', this%angrot + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'DELR ', 'DOUBLE ', 'NDIM 1 ', this%ncol + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'DELC ', 'DOUBLE ', 'NDIM 1 ', this%nrow + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'BOTM ', 'DOUBLE ', 'NDIM 1 ', this%nodesuser + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'IA ', 'INTEGER ', 'NDIM 1 ', this%nodesuser + 1 + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'JA ', 'INTEGER ', 'NDIM 1 ', size(this%con%jausr) + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'IDOMAIN ', 'INTEGER ', 'NDIM 1 ', this%nodesuser + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'ICELLTYPE ', 'INTEGER ', 'NDIM 1 ', this%nodesuser + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + ! + ! -- write data + write (iunit) this%nodesuser ! ncells + write (iunit) this%nrow ! nrow + write (iunit) this%ncol ! ncol + write (iunit) this%nja ! nja + write (iunit) this%xorigin ! xorigin + write (iunit) this%yorigin ! yorigin + write (iunit) this%angrot ! angrot + write (iunit) this%delr ! delr + write (iunit) this%delc ! delc + write (iunit) this%botm ! botm + write (iunit) this%con%iausr ! iausr + write (iunit) this%con%jausr ! jausr + write (iunit) this%idomain ! idomain + write (iunit) icelltype ! icelltype + ! + ! -- Close the file + close (iunit) + ! + end subroutine write_grb + + !> @brief Convert a user nodenumber to a string (nodenumber) or (k,i,j) + !< + subroutine nodeu_to_string(this, nodeu, str) + ! -- dummy + class(Dis2dType) :: this + integer(I4B), intent(in) :: nodeu + character(len=*), intent(inout) :: str + ! -- local + integer(I4B) :: i, j, k + character(len=10) :: istr, jstr + ! + call get_ijk(nodeu, this%nrow, this%ncol, 1, i, j, k) + write (istr, '(i10)') i + write (jstr, '(i10)') j + str = '('//trim(adjustl(istr))//','// & + trim(adjustl(jstr))//')' + ! + end subroutine nodeu_to_string + + !> @brief Convert a user nodenumber to an array (nodenumber) or (i,j) + !< + subroutine nodeu_to_array(this, nodeu, arr) + ! -- dummy + class(Dis2dType) :: this + integer(I4B), intent(in) :: nodeu + integer(I4B), dimension(:), intent(inout) :: arr + ! -- local + integer(I4B) :: isize + integer(I4B) :: i, j, k + ! + ! -- check the size of arr + isize = size(arr) + if (isize /= this%ndim) then + write (errmsg, '(a,i0,a,i0,a)') & + 'Program error: nodeu_to_array size of array (', isize, & + ') is not equal to the discretization dimension (', this%ndim, ')' + call store_error(errmsg, terminate=.TRUE.) + end if + ! + ! -- get k, i, j + call get_ijk(nodeu, this%nrow, this%ncol, 1, i, j, k) + ! + ! -- fill array + arr(1) = i + arr(2) = j + ! + end subroutine nodeu_to_array + + !> @brief Get reduced node number from user node number + !< + function get_nodenumber_idx1(this, nodeu, icheck) result(nodenumber) + ! -- return + integer(I4B) :: nodenumber + ! -- dummy + class(Dis2dType), intent(in) :: this + integer(I4B), intent(in) :: nodeu + integer(I4B), intent(in) :: icheck + ! + ! -- check the node number if requested + if (icheck /= 0) then + ! + ! -- If within valid range, convert to reduced nodenumber + if (nodeu < 1 .or. nodeu > this%nodesuser) then + write (errmsg, '(a,i0,a)') & + 'Node number (', nodeu, & + ') less than 1 or greater than the number of nodes.' + call store_error(errmsg) + nodenumber = 0 + else + nodenumber = nodeu + if (this%nodes < this%nodesuser) nodenumber = this%nodereduced(nodeu) + end if + else + nodenumber = nodeu + if (this%nodes < this%nodesuser) nodenumber = this%nodereduced(nodeu) + end if + ! + end function get_nodenumber_idx1 + + !> @brief Get reduced node number from layer, row and column indices + !< + function get_nodenumber_idx2(this, k, j, icheck) result(nodenumber) + ! -- return + integer(I4B) :: nodenumber + ! -- dummy + class(Dis2dType), intent(in) :: this + integer(I4B), intent(in) :: k, j + integer(I4B), intent(in) :: icheck + ! -- local + integer(I4B) :: nodeu, i + ! formats + character(len=*), parameter :: fmterr = & + "('Error in structured-grid cell indices: row = ',i0,& + &', column = ',i0)" + ! + i = k + nodeu = get_node(1, i, j, 1, this%nrow, this%ncol) + if (nodeu < 1) then + write (errmsg, fmterr) i, j + call store_error(errmsg, terminate=.TRUE.) + end if + nodenumber = nodeu + if (this%nodes < this%nodesuser) nodenumber = this%nodereduced(nodeu) + ! + ! -- check the node number if requested + if (icheck /= 0) then + ! + if (i < 1 .or. i > this%nrow) & + call store_error('Row less than one or greater than nrow') + if (j < 1 .or. j > this%ncol) & + call store_error('Column less than one or greater than ncol') + ! + ! -- Error if outside of range + if (nodeu < 1 .or. nodeu > this%nodesuser) then + write (errmsg, '(a,i0,a)') & + 'Node number (', nodeu, ')less than 1 or greater than nodes.' + call store_error(errmsg) + end if + end if + ! + end function get_nodenumber_idx2 + + !> @brief Allocate and initialize scalar variables + !< + subroutine allocate_scalars(this, name_model, input_mempath) + ! -- dummy + class(Dis2dType) :: this + character(len=*), intent(in) :: name_model + character(len=*), intent(in) :: input_mempath + ! + ! -- Allocate parent scalars + call this%DisBaseType%allocate_scalars(name_model, input_mempath) + ! + ! -- Allocate + call mem_allocate(this%nrow, 'NROW', this%memoryPath) + call mem_allocate(this%ncol, 'NCOL', this%memoryPath) + ! + ! -- Initialize + this%nrow = 0 + this%ncol = 0 + this%ndim = 2 + ! + end subroutine allocate_scalars + + !> @brief Allocate and initialize arrays + !< + subroutine allocate_arrays(this) + ! -- dummy + class(Dis2dType) :: this + ! + ! -- Allocate arrays in DisBaseType (mshape, top, bot, area) + call this%DisBaseType%allocate_arrays() + ! + ! -- Allocate arrays for DisType + if (this%nodes < this%nodesuser) then + call mem_allocate(this%nodeuser, this%nodes, 'NODEUSER', this%memoryPath) + call mem_allocate(this%nodereduced, this%nodesuser, 'NODEREDUCED', & + this%memoryPath) + else + call mem_allocate(this%nodeuser, 1, 'NODEUSER', this%memoryPath) + call mem_allocate(this%nodereduced, 1, 'NODEREDUCED', this%memoryPath) + end if + ! + ! -- Initialize + this%mshape(1) = this%nrow + this%mshape(2) = this%ncol + ! + end subroutine allocate_arrays + + !> @brief Convert a string to a user nodenumber + !! + !! Parse layer, row and column and return user nodenumber. + !! If flag_string is present and true, the first token may be + !! non-numeric (e.g. boundary name). In this case, return -2. + !< + function nodeu_from_string(this, lloc, istart, istop, in, iout, line, & + flag_string, allow_zero) result(nodeu) + ! -- dummy + class(Dis2dType) :: this + integer(I4B), intent(inout) :: lloc + integer(I4B), intent(inout) :: istart + integer(I4B), intent(inout) :: istop + integer(I4B), intent(in) :: in + integer(I4B), intent(in) :: iout + character(len=*), intent(inout) :: line + logical, optional, intent(in) :: flag_string + logical, optional, intent(in) :: allow_zero + integer(I4B) :: nodeu + ! -- local + integer(I4B) :: i, j, nrow, ncol + integer(I4B) :: lloclocal, ndum, istat, n + real(DP) :: r + ! + if (present(flag_string)) then + if (flag_string) then + ! Check to see if first token in line can be read as an integer. + lloclocal = lloc + call urword(line, lloclocal, istart, istop, 1, ndum, r, iout, in) + read (line(istart:istop), *, iostat=istat) n + if (istat /= 0) then + ! First token in line is not an integer; return flag to this effect. + nodeu = -2 + return + end if + end if + end if + ! + nrow = this%mshape(1) + ncol = this%mshape(2) + ! + call urword(line, lloc, istart, istop, 2, i, r, iout, in) + call urword(line, lloc, istart, istop, 2, j, r, iout, in) + ! + if (i == 0 .and. j == 0) then + if (present(allow_zero)) then + if (allow_zero) then + nodeu = 0 + return + end if + end if + end if + ! + errmsg = "" + ! + if (i < 1 .or. i > nrow) then + write (errmsg, '(a,1x,a,i0,a)') & + trim(adjustl(errmsg)), 'Row number in list (', i, & + ') is outside of the grid.' + end if + if (j < 1 .or. j > ncol) then + write (errmsg, '(a,1x,a,i0,a)') & + trim(adjustl(errmsg)), 'Column number in list (', j, & + ') is outside of the grid.' + end if + ! + nodeu = get_node(1, i, j, 1, nrow, ncol) + ! + if (nodeu < 1 .or. nodeu > this%nodesuser) then + write (errmsg, '(a,1x,a,i0,a)') & + trim(adjustl(errmsg)), & + "Node number in list (", nodeu, ") is outside of the grid. "// & + "Cell number cannot be determined in line '"// & + trim(adjustl(line))//"'." + end if + ! + if (len_trim(adjustl(errmsg)) > 0) then + call store_error(errmsg) + call store_error_unit(in) + end if + ! + end function nodeu_from_string + + !> @brief Convert a cellid string to a user nodenumber + !! + !! If flag_string is present and true, the first token may be + !! non-numeric (e.g. boundary name). In this case, return -2. + !! + !! If allow_zero is present and true, and all indices are zero, the + !! result can be zero. If allow_zero is false, a zero in any index is an error. + !< + function nodeu_from_cellid(this, cellid, inunit, iout, flag_string, & + allow_zero) result(nodeu) + ! -- return + integer(I4B) :: nodeu + ! -- dummy + class(Dis2dType) :: this + character(len=*), intent(inout) :: cellid + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + logical, optional, intent(in) :: flag_string + logical, optional, intent(in) :: allow_zero + ! -- local + integer(I4B) :: lloclocal, istart, istop, ndum, n + integer(I4B) :: i, j, nrow, ncol + integer(I4B) :: istat + real(DP) :: r + ! + if (present(flag_string)) then + if (flag_string) then + ! Check to see if first token in cellid can be read as an integer. + lloclocal = 1 + call urword(cellid, lloclocal, istart, istop, 1, ndum, r, iout, inunit) + read (cellid(istart:istop), *, iostat=istat) n + if (istat /= 0) then + ! First token in cellid is not an integer; return flag to this effect. + nodeu = -2 + return + end if + end if + end if + ! + nrow = this%mshape(1) + ncol = this%mshape(2) + ! + lloclocal = 1 + call urword(cellid, lloclocal, istart, istop, 2, i, r, iout, inunit) + call urword(cellid, lloclocal, istart, istop, 2, j, r, iout, inunit) + ! + if (i == 0 .and. j == 0) then + if (present(allow_zero)) then + if (allow_zero) then + nodeu = 0 + return + end if + end if + end if + ! + errmsg = "" + ! + if (i < 1 .or. i > nrow) then + write (errmsg, '(a,1x,a,i0,a)') & + trim(adjustl(errmsg)), 'Row number in list (', i, & + ') is outside of the grid.' + end if + if (j < 1 .or. j > ncol) then + write (errmsg, '(a,1x,a,i0,a)') & + trim(adjustl(errmsg)), 'Column number in list (', j, & + ') is outside of the grid.' + end if + ! + nodeu = get_node(1, i, j, 1, nrow, ncol) + ! + if (nodeu < 1 .or. nodeu > this%nodesuser) then + write (errmsg, '(a,1x,a,i0,a)') & + trim(adjustl(errmsg)), & + "Cell number cannot be determined for cellid ("// & + trim(adjustl(cellid))//") and results in a user "// & + "node number (", nodeu, ") that is outside of the grid." + end if + ! + if (len_trim(adjustl(errmsg)) > 0) then + call store_error(errmsg) + call store_error_unit(inunit) + end if + ! + end function nodeu_from_cellid + + !> @brief Indicates whether the grid discretization supports layers + !< + logical function supports_layers(this) + ! -- dummy + class(Dis2dType) :: this + ! + supports_layers = .true. + ! + end function supports_layers + + !> @brief Return number of cells per layer (nrow * ncol) + !< + function get_ncpl(this) + integer(I4B) :: get_ncpl + class(Dis2dType) :: this + get_ncpl = this%nrow * this%ncol + end function get_ncpl + + !> @brief Get normal vector components between the cell and a given neighbor + !! + !! The normal points outward from the shared face between noden and nodem. + !< + subroutine connection_normal(this, noden, nodem, ihc, xcomp, ycomp, zcomp, & + ipos) + ! -- dummy + class(Dis2dType) :: this + integer(I4B), intent(in) :: noden !< cell (reduced nn) + integer(I4B), intent(in) :: nodem !< neighbor (reduced nn) + integer(I4B), intent(in) :: ihc !< horizontal connection flag + real(DP), intent(inout) :: xcomp + real(DP), intent(inout) :: ycomp + real(DP), intent(inout) :: zcomp + integer(I4B), intent(in) :: ipos + ! -- local + integer(I4B) :: nodeu1, i1, j1, k1 + integer(I4B) :: nodeu2, i2, j2, k2 + ! + ! -- Set vector components based on ihc + if (ihc == 0) then + xcomp = DZERO + ycomp = DZERO + if (nodem < noden) then + ! + ! -- nodem must be above noden, so upward connection + zcomp = DONE + else + ! + ! -- nodem must be below noden, so downward connection + zcomp = -DONE + end if + else + xcomp = DZERO + ycomp = DZERO + zcomp = DZERO + nodeu1 = this%get_nodeuser(noden) + nodeu2 = this%get_nodeuser(nodem) + call get_ijk(nodeu1, this%nrow, this%ncol, 1, i1, j1, k1) + call get_ijk(nodeu2, this%nrow, this%ncol, 1, i2, j2, k2) + if (i2 < i1) then ! back + ycomp = DONE + elseif (j2 < j1) then ! left + xcomp = -DONE + elseif (j2 > j1) then ! right + xcomp = DONE + else ! front + ycomp = -DONE + end if + ! + end if + ! + end subroutine connection_normal + + !> @brief Get unit vector components between the cell and a given neighbor + !! + !! Saturation must be provided to compute cell center vertical coordinates. + !! Also return the straight-line connection length. + !< + subroutine connection_vector(this, noden, nodem, nozee, satn, satm, ihc, & + xcomp, ycomp, zcomp, conlen) + ! -- modules + use DisvGeom, only: line_unit_vector + ! -- dummy + class(Dis2dType) :: this + integer(I4B), intent(in) :: noden !< cell (reduced nn) + integer(I4B), intent(in) :: nodem !< neighbor (reduced nn) + logical, intent(in) :: nozee + real(DP), intent(in) :: satn + real(DP), intent(in) :: satm + integer(I4B), intent(in) :: ihc !< horizontal connection flag + real(DP), intent(inout) :: xcomp + real(DP), intent(inout) :: ycomp + real(DP), intent(inout) :: zcomp + real(DP), intent(inout) :: conlen + ! -- local + real(DP) :: z1, z2 + real(DP) :: x1, y1, x2, y2 + real(DP) :: ds + integer(I4B) :: i1, i2, j1, j2, k1, k2 + integer(I4B) :: nodeu1, nodeu2, ipos + ! + ! -- Set vector components based on ihc + if (ihc == 0) then + ! + ! -- vertical connection; set zcomp positive upward + xcomp = DZERO + ycomp = DZERO + if (nodem < noden) then + zcomp = DONE + else + zcomp = -DONE + end if + z1 = this%bot(noden) + DHALF * (this%top(noden) - this%bot(noden)) + z2 = this%bot(nodem) + DHALF * (this%top(nodem) - this%bot(nodem)) + conlen = abs(z2 - z1) + else + ! + if (nozee) then + z1 = DZERO + z2 = DZERO + else + z1 = this%bot(noden) + DHALF * satn * (this%top(noden) - this%bot(noden)) + z2 = this%bot(nodem) + DHALF * satm * (this%top(nodem) - this%bot(nodem)) + end if + ipos = this%con%getjaindex(noden, nodem) + ds = this%con%cl1(this%con%jas(ipos)) + this%con%cl2(this%con%jas(ipos)) + nodeu1 = this%get_nodeuser(noden) + nodeu2 = this%get_nodeuser(nodem) + call get_ijk(nodeu1, this%nrow, this%ncol, 1, i1, j1, k1) + call get_ijk(nodeu2, this%nrow, this%ncol, 1, i2, j2, k2) + x1 = DZERO + x2 = DZERO + y1 = DZERO + y2 = DZERO + if (i2 < i1) then ! back + y2 = ds + elseif (j2 < j1) then ! left + x2 = -ds + elseif (j2 > j1) then ! right + x2 = ds + else ! front + y2 = -ds + end if + call line_unit_vector(x1, y1, z1, x2, y2, z2, xcomp, ycomp, zcomp, conlen) + end if + ! + end subroutine + + !> @brief Get the discretization type + !< + subroutine get_dis_type(this, dis_type) + ! -- dummy + class(Dis2dType), intent(in) :: this + character(len=*), intent(out) :: dis_type + ! + dis_type = "DIS2D" + ! + end subroutine get_dis_type + + !> @brief Get a 2D array of polygon vertices, listed in + !! + !! clockwise order beginning with the lower left corner + !< + subroutine get_polyverts(this, ic, polyverts, closed) + ! -- dummy + class(Dis2dType), intent(inout) :: this + integer(I4B), intent(in) :: ic !< cell number (reduced) + real(DP), allocatable, intent(out) :: polyverts(:, :) !< polygon vertices (column-major indexing) + logical(LGP), intent(in), optional :: closed !< whether to close the polygon, duplicating a vertex + ! -- local + integer(I4B) :: icu, nverts, irow, jcol, klay + real(DP) :: cellx, celly, dxhalf, dyhalf + logical(LGP) :: lclosed + ! + nverts = 4 + ! + ! check closed option + if (.not. (present(closed))) then + lclosed = .false. + else + lclosed = closed + end if + ! + ! allocate vertices array + if (lclosed) then + allocate (polyverts(2, nverts + 1)) + else + allocate (polyverts(2, nverts)) + end if + ! + ! set vertices + icu = this%get_nodeuser(ic) + call get_ijk(icu, this%nrow, this%ncol, 1, irow, jcol, klay) + cellx = this%cellx(jcol) + celly = this%celly(irow) + dxhalf = DHALF * this%delr(jcol) + dyhalf = DHALF * this%delc(irow) + polyverts(:, 1) = (/cellx - dxhalf, celly - dyhalf/) ! SW + polyverts(:, 2) = (/cellx - dxhalf, celly + dyhalf/) ! NW + polyverts(:, 3) = (/cellx + dxhalf, celly + dyhalf/) ! NE + polyverts(:, 4) = (/cellx + dxhalf, celly - dyhalf/) ! SE + ! + ! close if enabled + if (lclosed) & + polyverts(:, nverts + 1) = polyverts(:, 1) + ! + end subroutine + + !> @brief Read an integer array + !< TODO: REMOVE? + subroutine read_int_array(this, line, lloc, istart, istop, iout, in, & + iarray, aname) + ! -- dummy + class(Dis2dType), intent(inout) :: this + character(len=*), intent(inout) :: line + integer(I4B), intent(inout) :: lloc + integer(I4B), intent(inout) :: istart + integer(I4B), intent(inout) :: istop + integer(I4B), intent(in) :: in + integer(I4B), intent(in) :: iout + integer(I4B), dimension(:), pointer, contiguous, intent(inout) :: iarray + character(len=*), intent(in) :: aname + ! -- local + + ! + end subroutine read_int_array + + !> @brief Read a double precision array + !< TODO: REMOVE? + subroutine read_dbl_array(this, line, lloc, istart, istop, iout, in, & + darray, aname) + ! -- dummy + class(Dis2dType), intent(inout) :: this + character(len=*), intent(inout) :: line + integer(I4B), intent(inout) :: lloc + integer(I4B), intent(inout) :: istart + integer(I4B), intent(inout) :: istop + integer(I4B), intent(in) :: in + integer(I4B), intent(in) :: iout + real(DP), dimension(:), pointer, contiguous, intent(inout) :: darray + character(len=*), intent(in) :: aname + ! + end subroutine read_dbl_array + + !> @brief Read a 2d double array into col icolbnd of darray + !! + !! For cells that are outside of the active domain, + !! do not copy the array value into darray. + !< TODO: REMOVE? + subroutine read_layer_array(this, nodelist, darray, ncolbnd, maxbnd, & + icolbnd, aname, inunit, iout) + ! -- dummy + class(Dis2dType) :: this + integer(I4B), intent(in) :: maxbnd + integer(I4B), dimension(maxbnd) :: nodelist + integer(I4B), intent(in) :: ncolbnd + real(DP), dimension(ncolbnd, maxbnd), intent(inout) :: darray + integer(I4B), intent(in) :: icolbnd + character(len=*), intent(in) :: aname + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + ! + end subroutine read_layer_array + + !> @brief Record a double precision array. + !! + !! The array is written to a formatted or unformatted external file + !! depending on the arguments. + !< + subroutine record_array(this, darray, iout, iprint, idataun, aname, & + cdatafmp, nvaluesp, nwidthp, editdesc, dinact) + ! -- dummy + class(Dis2dType), intent(inout) :: this + real(DP), dimension(:), pointer, contiguous, intent(inout) :: darray !< double precision array to record + integer(I4B), intent(in) :: iout !< ascii output unit number + integer(I4B), intent(in) :: iprint !< whether to print the array + integer(I4B), intent(in) :: idataun !< binary output unit number, if negative don't write by layers, write entire array + character(len=*), intent(in) :: aname !< text descriptor + character(len=*), intent(in) :: cdatafmp !< write format + integer(I4B), intent(in) :: nvaluesp !< values per line + integer(I4B), intent(in) :: nwidthp !< number width + character(len=*), intent(in) :: editdesc !< format type (I, G, F, S, E) + real(DP), intent(in) :: dinact !< double precision value for cells excluded from model domain + ! -- local + integer(I4B) :: k, ifirst + integer(I4B) :: nlay + integer(I4B) :: nrow + integer(I4B) :: ncol + integer(I4B) :: nval + integer(I4B) :: nodeu, noder + integer(I4B) :: istart, istop + real(DP), dimension(:), pointer, contiguous :: dtemp + ! -- formats + character(len=*), parameter :: fmthsv = & + "(1X,/1X,a,' WILL BE SAVED ON UNIT ',I4, & + &' AT END OF TIME STEP',I5,', STRESS PERIOD ',I4)" + ! + ! -- set variables + nlay = 1 + nrow = this%mshape(1) + ncol = this%mshape(2) + ! + ! -- If this is a reduced model, then copy the values from darray into + ! dtemp. + if (this%nodes < this%nodesuser) then + nval = this%nodes + dtemp => this%dbuff + do nodeu = 1, this%nodesuser + noder = this%get_nodenumber(nodeu, 0) + if (noder <= 0) then + dtemp(nodeu) = dinact + cycle + end if + dtemp(nodeu) = darray(noder) + end do + else + nval = this%nodes + dtemp => darray + end if + ! + ! -- Print to iout if iprint /= 0 + if (iprint /= 0) then + istart = 1 + do k = 1, nlay + istop = istart + nrow * ncol - 1 + call ulaprufw(ncol, nrow, kstp, kper, k, iout, dtemp(istart:istop), & + aname, cdatafmp, nvaluesp, nwidthp, editdesc) + istart = istop + 1 + end do + end if + ! + ! -- Save array to an external file. + if (idataun > 0) then + ! -- write to binary file by layer + ifirst = 1 + istart = 1 + do k = 1, nlay + istop = istart + nrow * ncol - 1 + if (ifirst == 1) write (iout, fmthsv) & + trim(adjustl(aname)), idataun, & + kstp, kper + ifirst = 0 + call ulasav(dtemp(istart:istop), aname, kstp, kper, & + pertim, totim, ncol, nrow, k, idataun) + istart = istop + 1 + end do + elseif (idataun < 0) then + ! + ! -- write entire array as one record + call ubdsv1(kstp, kper, aname, -idataun, dtemp, ncol, nrow, nlay, & + iout, delt, pertim, totim) + end if + ! + end subroutine record_array + + !> @brief Record list header for imeth=6 + !< + subroutine record_srcdst_list_header(this, text, textmodel, textpackage, & + dstmodel, dstpackage, naux, auxtxt, & + ibdchn, nlist, iout) + ! -- dummy + class(Dis2dType) :: this + character(len=16), intent(in) :: text + character(len=16), intent(in) :: textmodel + character(len=16), intent(in) :: textpackage + character(len=16), intent(in) :: dstmodel + character(len=16), intent(in) :: dstpackage + integer(I4B), intent(in) :: naux + character(len=16), dimension(:), intent(in) :: auxtxt + integer(I4B), intent(in) :: ibdchn + integer(I4B), intent(in) :: nlist + integer(I4B), intent(in) :: iout + ! -- local + integer(I4B) :: nlay, nrow, ncol + ! + nlay = 1 + nrow = this%mshape(1) + ncol = this%mshape(2) + ! + ! -- Use ubdsv06 to write list header + call ubdsv06(kstp, kper, text, textmodel, textpackage, dstmodel, dstpackage, & + ibdchn, naux, auxtxt, ncol, nrow, nlay, & + nlist, iout, delt, pertim, totim) + ! + end subroutine record_srcdst_list_header + + !> @brief Convert an integer array (layer numbers) to nodelist + !< + subroutine nlarray_to_nodelist(this, darray, nodelist, maxbnd, nbound, aname) + ! -- dummy + class(Dis2dType) :: this + integer(I4B), intent(in) :: maxbnd + integer(I4B), dimension(:), pointer, contiguous :: darray + integer(I4B), dimension(maxbnd), intent(inout) :: nodelist + integer(I4B), intent(inout) :: nbound + character(len=*), intent(in) :: aname + ! -- local + integer(I4B) :: il, ir, ic, ncol, nrow, nlay, nval, nodeu, noder, ipos, ierr + ! + ! -- set variables + nlay = 1 + nrow = this%mshape(1) + ncol = this%mshape(2) + ! + if (this%ndim > 1) then + ! + nval = ncol * nrow + ! + ! -- Copy array into nodelist + ipos = 1 + ierr = 0 + do ir = 1, nrow + do ic = 1, ncol + nodeu = get_node(1, ir, ic, nlay, nrow, ncol) + il = darray(nodeu) + if (il < 1 .or. il > nlay) then + write (errmsg, '(a,1x,i0)') 'Invalid layer number:', il + call store_error(errmsg, terminate=.TRUE.) + end if + nodeu = get_node(il, ir, ic, nlay, nrow, ncol) + noder = this%get_nodenumber(nodeu, 0) + if (ipos > maxbnd) then + ierr = ipos + else + nodelist(ipos) = noder + end if + ipos = ipos + 1 + end do + end do + ! + ! -- Check for errors + nbound = ipos - 1 + if (ierr > 0) then + write (errmsg, '(a,1x,i0)') & + 'MAXBOUND dimension is too small.'// & + 'INCREASE MAXBOUND TO:', ierr + call store_error(errmsg, terminate=.TRUE.) + end if + ! + ! -- If nbound < maxbnd, then initialize nodelist to zero in this range + if (nbound < maxbnd) then + do ipos = nbound + 1, maxbnd + nodelist(ipos) = 0 + end do + end if + ! + else + ! + ! -- For unstructured, read nodelist directly, then check node numbers + nodelist = darray + do noder = 1, maxbnd + if (noder < 1 .or. noder > this%nodes) then + write (errmsg, '(a,1x,i0)') 'Invalid node number:', noder + call store_error(errmsg, terminate=.TRUE.) + end if + end do + nbound = maxbnd + ! + end if + ! + end subroutine nlarray_to_nodelist + +end module Dis2dModule diff --git a/src/Model/SurfaceWaterFlow/swf.f90 b/src/Model/SurfaceWaterFlow/swf.f90 index 48e5a973a54..bb8a60202c0 100644 --- a/src/Model/SurfaceWaterFlow/swf.f90 +++ b/src/Model/SurfaceWaterFlow/swf.f90 @@ -114,11 +114,11 @@ module SwfModule !! SWF model base package types. Only listed packages are candidates !! for input and these will be loaded in the order specified. !< - integer(I4B), parameter :: SWF_NBASEPKG = 50 - character(len=LENPACKAGETYPE), dimension(SWF_NBASEPKG) :: SWF_BASEPKG - data SWF_BASEPKG/'DISL6', 'DIS6 ', 'DISV6', 'DFW6 ', 'CXS6 ', & ! 5 - &'OC6 ', 'IC6 ', 'OBS6 ', 'STO6 ', ' ', & ! 10 - &40*' '/ ! 50 + integer(I4B), parameter :: SWF_NBASEPKG = 9 + character(len=LENPACKAGETYPE), dimension(SWF_NBASEPKG) :: & + SWF_BASEPKG = ['DISL6 ', 'DIS2D6 ', 'DISV6 ', & + 'DFW6 ', 'CXS6 ', 'OC6 ', & + 'IC6 ', 'OBS6 ', 'STO6 '] !> @brief SWF multi package array descriptors !! @@ -1041,8 +1041,8 @@ subroutine ftype_check(this, indis) ! ! -- Check for required packages. Stop if not present. if (indis == 0) then - write (errmsg, '(1x,a)') & - 'Discretization (DISL6) Package not specified.' + write (errmsg, '(a)') & + 'Discretization Package (DISL6 or DIS2D6) not specified.' call store_error(errmsg) end if if (this%inic == 0 .and. this%indfw /= 0) then @@ -1057,8 +1057,9 @@ subroutine ftype_check(this, indis) call store_error(errmsg) end if if (count_errors() > 0) then - write (errmsg, '(1x,a)') 'One or more required package(s) not specified.' + write (errmsg, '(a)') 'One or more required package(s) not specified.' call store_error(errmsg) + call store_error_filename(this%filename) end if ! ! -- return @@ -1133,7 +1134,7 @@ subroutine create_packages(this) use MemoryHelperModule, only: create_mem_path use SimVariablesModule, only: idm_context use SwfDislModule, only: disl_cr - use DisModule, only: dis_cr + use Dis2dModule, only: dis2d_cr use DisvModule, only: disv_cr use SwfDfWModule, only: dfw_cr use SwfCxsModule, only: cxs_cr @@ -1152,7 +1153,7 @@ subroutine create_packages(this) integer(I4B), dimension(:), contiguous, & pointer :: inunits => null() character(len=LENMEMPATH) :: model_mempath - character(len=LENFTYPE) :: pkgtype + character(len=LENPACKAGETYPE) :: pkgtype character(len=LENPACKAGENAME) :: pkgname character(len=LENMEMPATH) :: mempath integer(I4B), pointer :: inunit @@ -1185,9 +1186,9 @@ subroutine create_packages(this) case ('DISL6') indis = 1 call disl_cr(this%dis, this%name, mempath, indis, this%iout) - case ('DIS6') + case ('DIS2D6') indis = 1 - call dis_cr(this%dis, this%name, mempath, indis, this%iout) + call dis2d_cr(this%dis, this%name, mempath, indis, this%iout) case ('DISV6') indis = 1 call disv_cr(this%dis, this%name, mempath, indis, this%iout) diff --git a/src/Utilities/Idm/SourceCommon.f90 b/src/Utilities/Idm/SourceCommon.f90 index 67d50c1aac8..2e63d7457aa 100644 --- a/src/Utilities/Idm/SourceCommon.f90 +++ b/src/Utilities/Idm/SourceCommon.f90 @@ -282,6 +282,32 @@ subroutine set_model_shape(ftype, fname, model_mempath, dis_mempath, & call store_error_filename(fname) end if ! + case ('DIS2D6') + ! + call get_isize('NROW', dis_mempath, dim1_size) + call get_isize('NCOL', dis_mempath, dim2_size) + ! + if (dim1_size <= 0) then + write (errmsg, '(a)') & + 'Required input dimension "NROW" not found.' + call store_error(errmsg) + end if + ! + if (dim2_size <= 0) then + write (errmsg, '(a)') & + 'Required input dimension "NCOL" not found.' + call store_error(errmsg) + end if + ! + if (dim1_size >= 1 .and. dim2_size >= 1) then + call mem_allocate(model_shape, 2, 'MODEL_SHAPE', model_mempath) + call mem_setptr(ndim1, 'NROW', dis_mempath) + call mem_setptr(ndim2, 'NCOL', dis_mempath) + model_shape = [ndim1, ndim2] + else + call store_error_filename(fname) + end if + ! case ('DISV6') ! call get_isize('NLAY', dis_mempath, dim1_size) @@ -321,6 +347,11 @@ subroutine set_model_shape(ftype, fname, model_mempath, dis_mempath, & call mem_allocate(model_shape, 1, 'MODEL_SHAPE', model_mempath) call mem_setptr(ndim1, 'NODES', dis_mempath) model_shape = [ndim1] + case default + errmsg = 'Unknown discretization type. IDM cannot set shape for "' & + //trim(ftype)//"'" + call store_error(errmsg) + call store_error_filename(fname) end select ! ! -- allocate and set ncelldim in model input context diff --git a/src/Utilities/Idm/SourceLoad.F90 b/src/Utilities/Idm/SourceLoad.F90 index 812b6681175..603bdc6d3d7 100644 --- a/src/Utilities/Idm/SourceLoad.F90 +++ b/src/Utilities/Idm/SourceLoad.F90 @@ -288,6 +288,9 @@ function remote_model_ndim(mtype, mfname) result(ncelldim) case ('DIS6') ncelldim = 3 exit + case ('DIS2D6') + ncelldim = 2 + exit case ('DISV6') ncelldim = 2 exit diff --git a/src/meson.build b/src/meson.build index 525a6b942df..763246d0761 100644 --- a/src/meson.build +++ b/src/meson.build @@ -76,7 +76,7 @@ modflow_sources = files( 'Idm' / 'gwt-icidm.f90', 'Idm' / 'gwt-namidm.f90', 'Idm' / 'swf-dislidm.f90', - 'Idm' / 'swf-disidm.f90', + 'Idm' / 'swf-dis2didm.f90', 'Idm' / 'swf-disvidm.f90', 'Idm' / 'swf-namidm.f90', 'Idm' / 'swf-cxsidm.f90', @@ -114,6 +114,7 @@ modflow_sources = files( 'Model' / 'Connection' / 'SpatialModelConnection.f90', 'Model' / 'Connection' / 'DistributedVariable.f90', 'Model' / 'Discretization' / 'Dis.f90', + 'Model' / 'Discretization' / 'Dis2d.f90', 'Model' / 'Discretization' / 'Disu.f90', 'Model' / 'Discretization' / 'Disv.f90', 'Model' / 'Geometry' / 'BaseGeometry.f90', diff --git a/utils/idmloader/dfns.txt b/utils/idmloader/dfns.txt index 28688587b03..7ae3c44ad4d 100644 --- a/utils/idmloader/dfns.txt +++ b/utils/idmloader/dfns.txt @@ -44,7 +44,7 @@ gwe-dis.dfn # swf model swf-nam.dfn swf-disl.dfn -swf-dis.dfn +swf-dis2d.dfn swf-disv.dfn swf-cxs.dfn swf-dfw.dfn diff --git a/utils/mf5to6/make/makedefaults b/utils/mf5to6/make/makedefaults index 6f41e3e6199..482562ab0b7 100644 --- a/utils/mf5to6/make/makedefaults +++ b/utils/mf5to6/make/makedefaults @@ -1,4 +1,4 @@ -# makedefaults created by pymake (version 1.2.9) for the 'mf5to6' executable. +# makedefaults created by pymake (version 1.2.10.dev0) for the 'mf5to6' executable. # determine OS ifeq ($(OS), Windows_NT) @@ -57,11 +57,11 @@ OPTLEVEL ?= -O2 # set the fortran flags ifeq ($(detected_OS), Windows) ifeq ($(FC), gfortran) - FFLAGS ?= -static -fbacktrace $(OS_macro) -cpp + FFLAGS ?= -static -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid $(OS_macro) -cpp endif else ifeq ($(FC), gfortran) - FFLAGS ?= -fbacktrace $(OS_macro) -cpp + FFLAGS ?= -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid $(OS_macro) -cpp endif ifeq ($(FC), $(filter $(FC), ifort mpiifort)) FFLAGS ?= -no-heap-arrays -fpe0 -traceback -Qdiag-disable:7416 -Qdiag-disable:7025 -Qdiag-disable:5268 -fpp diff --git a/utils/mf5to6/make/makefile b/utils/mf5to6/make/makefile index 7be8104af54..f99194fe0b9 100644 --- a/utils/mf5to6/make/makefile +++ b/utils/mf5to6/make/makefile @@ -1,4 +1,4 @@ -# makefile created by pymake (version 1.2.9) for the 'mf5to6' executable. +# makefile created by pymake (version 1.2.10.dev0) for the 'mf5to6' executable. include ./makedefaults diff --git a/utils/zonebudget/make/makedefaults b/utils/zonebudget/make/makedefaults index 16a46abbb63..dbbf549c9db 100644 --- a/utils/zonebudget/make/makedefaults +++ b/utils/zonebudget/make/makedefaults @@ -1,4 +1,4 @@ -# makedefaults created by pymake (version 1.2.9) for the 'zbud6' executable. +# makedefaults created by pymake (version 1.2.10.dev0) for the 'zbud6' executable. # determine OS ifeq ($(OS), Windows_NT) @@ -57,11 +57,11 @@ OPTLEVEL ?= -O2 # set the fortran flags ifeq ($(detected_OS), Windows) ifeq ($(FC), gfortran) - FFLAGS ?= -static -fbacktrace $(OS_macro) -fall-intrinsics -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -pedantic -std=f2008 -Wcharacter-truncation -cpp + FFLAGS ?= -static -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid -fall-intrinsics -pedantic -Wcharacter-truncation $(OS_macro) -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -std=f2008 -cpp endif else ifeq ($(FC), gfortran) - FFLAGS ?= -fbacktrace $(OS_macro) -fall-intrinsics -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -pedantic -std=f2008 -Wcharacter-truncation -cpp + FFLAGS ?= -fbacktrace -ffpe-summary=overflow -ffpe-trap=overflow,zero,invalid -fall-intrinsics -pedantic -Wcharacter-truncation $(OS_macro) -Wtabs -Wline-truncation -Wunused-label -Wunused-variable -std=f2008 -cpp endif ifeq ($(FC), $(filter $(FC), ifort mpiifort)) FFLAGS ?= -no-heap-arrays -fpe0 -traceback -Qdiag-disable:7416 -Qdiag-disable:7025 -Qdiag-disable:5268 -fpp diff --git a/utils/zonebudget/make/makefile b/utils/zonebudget/make/makefile index 9e53c7daa9d..69fa6b73c71 100644 --- a/utils/zonebudget/make/makefile +++ b/utils/zonebudget/make/makefile @@ -1,4 +1,4 @@ -# makefile created by pymake (version 1.2.9) for the 'zbud6' executable. +# makefile created by pymake (version 1.2.10.dev0) for the 'zbud6' executable. include ./makedefaults From c4bdc11aa21827d6d1924a0889928e72af89091d Mon Sep 17 00:00:00 2001 From: mjreno Date: Tue, 2 Apr 2024 08:36:45 -0400 Subject: [PATCH 077/199] fix(idm) fix fortran definition file path (#1691) Co-authored-by: mjreno --- utils/idmloader/scripts/dfn2f90.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/idmloader/scripts/dfn2f90.py b/utils/idmloader/scripts/dfn2f90.py index ab032f3d20f..287cf6e8b21 100644 --- a/utils/idmloader/scripts/dfn2f90.py +++ b/utils/idmloader/scripts/dfn2f90.py @@ -11,7 +11,7 @@ DEFAULT_DFNS_PATH = Path(__file__).parents[1] / "dfns.txt" DFN_PATH = PROJ_ROOT_PATH / "doc" / "mf6io" / "mf6ivar" / "dfn" SRC_PATH = PROJ_ROOT_PATH / "src" -IDM_PATH = SRC_PATH / "IDM" +IDM_PATH = SRC_PATH / "Idm" class Dfn2F90: From ac659c2daf5893fc2c02b6d34a3da339785f7ce0 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 2 Apr 2024 08:52:53 -0400 Subject: [PATCH 078/199] perf(PRT): allocate cell defn arrays lazily (#1690) Performance issue discovered while working on MP7/PRT examples. Previously cell definition arrays (face flows, face neighbors, etc) were reallocated for each subcell regardless of tracking method. This introduced overhead for each subcell solve, scaling with the total particle count. Reallocation can be skipped for structured grids since subcells are guaranteed to be 4-sided, and can happen lazily for unstructured grids. Removing the unnecessary allocations speeds up the relevant example model from a minute or more to subsecond runtime on my machine --- autotest/test_prt_voronoi1.py | 4 ++-- src/Model/ParticleTracking/prt-oc.f90 | 1 - src/Solution/ParticleTracker/CellDefn.f90 | 5 +++++ src/Solution/ParticleTracker/CellPoly.f90 | 4 ++-- src/Solution/ParticleTracker/CellRect.f90 | 4 ++-- src/Solution/ParticleTracker/CellRectQuad.f90 | 4 ++-- .../ParticleTracker/MethodCellTernary.f90 | 1 - src/Solution/ParticleTracker/MethodDis.f90 | 8 -------- src/Solution/ParticleTracker/MethodDisv.f90 | 16 ++++++++++------ 9 files changed, 23 insertions(+), 24 deletions(-) diff --git a/autotest/test_prt_voronoi1.py b/autotest/test_prt_voronoi1.py index fd32f856ba3..05b408fce40 100644 --- a/autotest/test_prt_voronoi1.py +++ b/autotest/test_prt_voronoi1.py @@ -535,7 +535,7 @@ def callback(mesh, value): @pytest.mark.parametrize("idx, name", enumerate(cases)) -def test_mf6model(idx, name, function_tmpdir, targets): +def test_mf6model(idx, name, function_tmpdir, targets, benchmark): if ( "weli" in name and system() == "Darwin" @@ -552,4 +552,4 @@ def test_mf6model(idx, name, function_tmpdir, targets): targets=targets, compare=None, ) - test.run() + benchmark(test.run) diff --git a/src/Model/ParticleTracking/prt-oc.f90 b/src/Model/ParticleTracking/prt-oc.f90 index 5eabcc00c28..295455acb92 100644 --- a/src/Model/ParticleTracking/prt-oc.f90 +++ b/src/Model/ParticleTracking/prt-oc.f90 @@ -8,7 +8,6 @@ module PrtOcModule use SimVariablesModule, only: errmsg, warnmsg use MemoryManagerModule, only: mem_allocate, mem_deallocate, mem_reallocate use MemoryHelperModule, only: create_mem_path - use ArrayHandlersModule, only: ExpandArray use BlockParserModule, only: BlockParserType use InputOutputModule, only: urword, openfile use TimeSelectModule, only: TimeSelectType diff --git a/src/Solution/ParticleTracker/CellDefn.f90 b/src/Solution/ParticleTracker/CellDefn.f90 index 82db0209cb0..6f4551ce946 100644 --- a/src/Solution/ParticleTracker/CellDefn.f90 +++ b/src/Solution/ParticleTracker/CellDefn.f90 @@ -41,6 +41,11 @@ module CellDefnModule subroutine create_defn(cellDefn) type(CellDefnType), pointer :: cellDefn allocate (cellDefn) + ! Initially, allocate arrays to size for structured grid tracking method. + ! They can be (lazily) expanded as necessary for the unstructured method. + allocate (cellDefn%ispv180(5)) + allocate (cellDefn%facenbr(7)) + allocate (cellDefn%faceflow(7)) end subroutine create_defn !> @brief Return the number of polygon vertices diff --git a/src/Solution/ParticleTracker/CellPoly.f90 b/src/Solution/ParticleTracker/CellPoly.f90 index 2f83e508aae..46ac9bd8a19 100644 --- a/src/Solution/ParticleTracker/CellPoly.f90 +++ b/src/Solution/ParticleTracker/CellPoly.f90 @@ -1,7 +1,7 @@ module CellPolyModule use CellModule, only: CellType - use CellDefnModule, only: CellDefnType + use CellDefnModule, only: CellDefnType, create_defn implicit none private @@ -19,7 +19,7 @@ module CellPolyModule subroutine create_cell_poly(cell) type(CellPolyType), pointer :: cell allocate (cell) - allocate (cell%defn) + call create_defn(cell%defn) allocate (cell%type) cell%type = 'poly' end subroutine create_cell_poly diff --git a/src/Solution/ParticleTracker/CellRect.f90 b/src/Solution/ParticleTracker/CellRect.f90 index b359135917f..0105fcd5568 100644 --- a/src/Solution/ParticleTracker/CellRect.f90 +++ b/src/Solution/ParticleTracker/CellRect.f90 @@ -1,7 +1,7 @@ module CellRectModule use CellModule, only: CellType - use CellDefnModule, only: CellDefnType + use CellDefnModule, only: CellDefnType, create_defn implicit none private @@ -39,7 +39,7 @@ module CellRectModule subroutine create_cell_rect(cell) type(CellRectType), pointer :: cell allocate (cell) - allocate (cell%defn) + call create_defn(cell%defn) allocate (cell%type) cell%type = 'rect' end subroutine create_cell_rect diff --git a/src/Solution/ParticleTracker/CellRectQuad.f90 b/src/Solution/ParticleTracker/CellRectQuad.f90 index b8dc00c3020..0ea00c9752f 100644 --- a/src/Solution/ParticleTracker/CellRectQuad.f90 +++ b/src/Solution/ParticleTracker/CellRectQuad.f90 @@ -1,7 +1,7 @@ module CellRectQuadModule use CellModule, only: CellType - use CellDefnModule, only: CellDefnType + use CellDefnModule, only: CellDefnType, create_defn implicit none private @@ -43,7 +43,7 @@ module CellRectQuadModule subroutine create_cell_rect_quad(cell) type(CellRectQuadType), pointer :: cell allocate (cell) - allocate (cell%defn) + call create_defn(cell%defn) allocate (cell%irectvert(5)) allocate (cell%ipv4irv(2, 4)) allocate (cell%rectflow(2, 4)) diff --git a/src/Solution/ParticleTracker/MethodCellTernary.f90 b/src/Solution/ParticleTracker/MethodCellTernary.f90 index 53765297b91..bee0f1edac1 100644 --- a/src/Solution/ParticleTracker/MethodCellTernary.f90 +++ b/src/Solution/ParticleTracker/MethodCellTernary.f90 @@ -9,7 +9,6 @@ module MethodCellTernaryModule use SubcellTriModule, only: SubcellTriType, create_subcell_tri use ParticleModule use TrackModule, only: TrackFileControlType - use ArrayHandlersModule, only: ExpandArray implicit none private diff --git a/src/Solution/ParticleTracker/MethodDis.f90 b/src/Solution/ParticleTracker/MethodDis.f90 index 47a606a06ad..dc8a35d0ffd 100644 --- a/src/Solution/ParticleTracker/MethodDis.f90 +++ b/src/Solution/ParticleTracker/MethodDis.f90 @@ -11,7 +11,6 @@ module MethodDisModule use DisModule, only: DisType use TrackModule, only: TrackFileControlType use GeomUtilModule, only: get_ijk, get_jk - use ArrayHandlersModule, only: ExpandArray implicit none private @@ -285,7 +284,6 @@ subroutine load_cell_defn(this, ic, defn) call this%load_nbrs_to_defn(defn) ! -- Load 180 degree face indicators - call ExpandArray(defn%ispv180, defn%npolyverts + 1) defn%ispv180(1:defn%npolyverts + 1) = .false. ! -- Load flows (assumes face neighbors already loaded) @@ -315,9 +313,6 @@ subroutine load_nbrs_to_defn(this, defn) integer(I4B) :: klay2 integer(I4B) :: iedgeface - ! -- Allocate facenbr array - call ExpandArray(defn%facenbr, defn%npolyverts + 3) - select type (dis => this%fmi%dis) type is (DisType) ! -- Load face neighbors @@ -380,9 +375,6 @@ subroutine load_flows_to_defn(this, defn) ic = defn%icell npolyverts = defn%npolyverts - ! -- allocate faceflow array - call ExpandArray(defn%faceflow, npolyverts + 3) - ! -- Load face flows. defn%faceflow = 0d0 ! kluge note: eventually use DZERO for 0d0 throughout ! -- As with polygon nbrs, polygon face flows wrap around for diff --git a/src/Solution/ParticleTracker/MethodDisv.f90 b/src/Solution/ParticleTracker/MethodDisv.f90 index c19017cce95..f7da0e7fe7d 100644 --- a/src/Solution/ParticleTracker/MethodDisv.f90 +++ b/src/Solution/ParticleTracker/MethodDisv.f90 @@ -378,8 +378,9 @@ subroutine load_nbrs_to_defn(this, defn) ic = defn%icell npolyverts = defn%npolyverts - ! -- allocate facenbr array - call ExpandArray(defn%facenbr, npolyverts + 3) + ! -- expand facenbr array if needed + if (size(defn%facenbr) < npolyverts + 3) & + call ExpandArray(defn%facenbr, npolyverts + 3) select type (dis => this%fmi%dis) type is (DisvType) @@ -403,6 +404,7 @@ subroutine load_nbrs_to_defn(this, defn) dis%javert(istart2:istop2), & iedgeface) if (iedgeface /= 0) then + ! -- Edge (polygon) face neighbor defn%facenbr(iedgeface) = int(iloc, 1) else @@ -476,8 +478,9 @@ subroutine load_flows_to_defn(this, defn) ic = defn%icell npolyverts = defn%npolyverts - ! -- allocate faceflow array - call ExpandArray(defn%faceflow, npolyverts + 3) + ! -- expand faceflow array if needed + if (size(defn%faceflow) < npolyverts + 3) & + call ExpandArray(defn%faceflow, npolyverts + 3) ! -- Load face flows. Note that the faceflow array ! -- does not get reallocated if it is already allocated @@ -687,8 +690,9 @@ subroutine load_flags_to_defn(this, defn) ! kluge note: rename??? ic = defn%icell npolyverts = defn%npolyverts - ! -- allocate ispv180 array - call ExpandArray(defn%ispv180, npolyverts + 1) + ! -- expand ispv180 array if needed + if (size(defn%ispv180) < npolyverts + 3) & + call ExpandArray(defn%ispv180, npolyverts + 1) ! -- Load 180-degree indicator. ! -- Also, set flags that indicate how cell can be represented. From 89c8e7568a276dc088c09e507ebb0abfcaeb3010 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 2 Apr 2024 11:25:44 -0400 Subject: [PATCH 079/199] ci(parallel): factor out petsc action, save petsc cache nightly (#1697) --- .github/actions/build-par-win/action.yml | 84 +-------------------- .github/actions/build-petsc-win/action.yml | 81 ++++++++++++++++++++ .github/actions/setup-par-oneapi/action.yml | 4 +- .github/actions/test-par-win/action.yml | 2 +- .github/workflows/large.yml | 8 +- 5 files changed, 91 insertions(+), 88 deletions(-) create mode 100644 .github/actions/build-petsc-win/action.yml diff --git a/.github/actions/build-par-win/action.yml b/.github/actions/build-par-win/action.yml index c413a28287b..abc9a39b19d 100644 --- a/.github/actions/build-par-win/action.yml +++ b/.github/actions/build-par-win/action.yml @@ -4,91 +4,13 @@ runs: using: "composite" steps: - - name: Convert line endings - shell: cmd - run: | - unix2dos -n "modflow6\.github\common\configure_petsc.sh" "%TEMP%\configure_petsc.sh" - unix2dos -n "modflow6\.github\common\compile_petsc.sh" "%TEMP%\compile_petsc.sh" - unix2dos -n "modflow6\.github\common\compile_modflow6.bat" "%TEMP%\compile_modflow6.bat" - unix2dos -n "modflow6\.github\common\test_modflow6.bat" "%TEMP%\test_modflow6.bat" - - - name: Hide Strawberry programs - shell: bash - run: | - mkdir "$RUNNER_TEMP/strawberry" - mv /c/Strawberry/c/bin/gmake "$RUNNER_TEMP/strawberry/gmake" - mv /c/Strawberry/perl/bin/pkg-config "$RUNNER_TEMP/strawberry/pkg-config" - mv /c/Strawberry/perl/bin/pkg-config.bat "$RUNNER_TEMP/strawberry/pkg-config.bat" - - - name: Get date - id: get-date - shell: bash - run: echo "date=$(/bin/date -u "+%Y%m%d")" >> "$GITHUB_OUTPUT" - - - name: Set oneAPI install dir - shell: bash - run: echo "ONEAPI_ROOT=C:\Program Files (x86)\Intel\oneAPI" >> "$GITHUB_ENV" - - - name: Setup oneAPI - uses: ./modflow6/.github/actions/setup-par-oneapi - - - name: Restore PETSc cache - id: petsc-cache - uses: actions/cache/restore@v3 - with: - path: petsc - key: petsc-${{ runner.os }}-${{ steps.get-date.outputs.date }} - - - name: Download PETSc - if: steps.petsc-cache.outputs.cache-hit != 'true' - shell: bash - run: | - curl https://web.cels.anl.gov/projects/petsc/download/release-snapshots/petsc-3.20.5.tar.gz -O -J - mkdir petsc - tar -xzf petsc-3.20.5.tar.gz -C petsc --strip-components=1 - - - name: Setup Cygwin - if: steps.petsc-cache.outputs.cache-hit != 'true' - uses: egor-tensin/setup-cygwin@v4 - with: - packages: python3 make gcc-core gcc-g++ pkg-config - - - name: Hide Cygwin linker - if: steps.petsc-cache.outputs.cache-hit != 'true' - shell: C:\tools\cygwin\bin\bash.exe --login --norc -eo pipefail -o igncr '{0}' - run: mv /usr/bin/link.exe /usr/bin/link-cygwin.exe - - - name: Configure PETSc - if: steps.petsc-cache.outputs.cache-hit != 'true' - shell: cmd - run: | - "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "C:\tools\cygwin\bin\bash.exe" --login --norc -eo pipefail -o igncr "%TEMP%\configure_petsc.sh" - - - name: Build PETSc - if: steps.petsc-cache.outputs.cache-hit != 'true' - shell: cmd - run: | - "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "C:\tools\cygwin\bin\bash.exe" --login --norc -eo pipefail -o igncr "%TEMP%\compile_petsc.sh" - - - name: Save PETSc cache - if: steps.petsc-cache.outputs.cache-hit != 'true' - uses: actions/cache/save@v3 - with: - path: petsc - key: petsc-${{ runner.os }}-${{ steps.get-date.outputs.date }} - - - name: Setup PETSC environment - shell: cmd - run: | - set PETSC_DIR=%GITHUB_WORKSPACE%\petsc - set PETSC_ARCH=arch-mswin-c-opt - echo PETSC_DIR=%PETSC_DIR%>>%GITHUB_ENV% - echo PETSC_ARCH=%PETSC_ARCH%>>%GITHUB_ENV% - echo %PETSC_DIR%\%PETSC_ARCH%\lib>>%GITHUB_PATH% + - name: Setup PETSc + uses: ./modflow6/.github/actions/build-petsc-win - name: Build modflow6 shell: cmd run: | + unix2dos -n "%GITHUB_WORKSPACE%\modflow6\.github\common\compile_modflow6.bat" "%TEMP%\compile_modflow6.bat" "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "%TEMP%\compile_modflow6.bat" - name: Show Meson logs diff --git a/.github/actions/build-petsc-win/action.yml b/.github/actions/build-petsc-win/action.yml new file mode 100644 index 00000000000..19090b8a8d4 --- /dev/null +++ b/.github/actions/build-petsc-win/action.yml @@ -0,0 +1,81 @@ +name: Build PETSc (Windows) +description: Build PETSc on Windows with Cygwin +runs: + using: "composite" + steps: + + - name: Convert line endings + shell: cmd + run: | + unix2dos -n "%GITHUB_WORKSPACE%\modflow6\.github\common\configure_petsc.sh" "%TEMP%\configure_petsc.sh" + unix2dos -n "%GITHUB_WORKSPACE%\modflow6\.github\common\compile_petsc.sh" "%TEMP%\compile_petsc.sh" + + - name: Hide Strawberry programs + shell: bash + run: | + mkdir "$RUNNER_TEMP/strawberry" + mv /c/Strawberry/c/bin/gmake "$RUNNER_TEMP/strawberry/gmake" + mv /c/Strawberry/perl/bin/pkg-config "$RUNNER_TEMP/strawberry/pkg-config" + mv /c/Strawberry/perl/bin/pkg-config.bat "$RUNNER_TEMP/strawberry/pkg-config.bat" + + - name: Get date + id: get-date + shell: bash + run: echo "date=$(/bin/date -u "+%Y%m%d")" >> "$GITHUB_OUTPUT" + + - name: Setup oneAPI + uses: ./modflow6/.github/actions/setup-par-oneapi + + - name: Restore PETSc cache + id: petsc-cache + uses: actions/cache/restore@v3 + with: + path: petsc + key: petsc-${{ runner.os }}-${{ steps.get-date.outputs.date }} + + - name: Download PETSc + if: steps.petsc-cache.outputs.cache-hit != 'true' + shell: bash + run: | + curl https://web.cels.anl.gov/projects/petsc/download/release-snapshots/petsc-3.20.5.tar.gz -O -J + mkdir petsc + tar -xzf petsc-3.20.5.tar.gz -C petsc --strip-components=1 + + - name: Setup Cygwin + if: steps.petsc-cache.outputs.cache-hit != 'true' + uses: egor-tensin/setup-cygwin@v4 + with: + packages: python3 make gcc-core gcc-g++ pkg-config + + - name: Hide Cygwin linker + if: steps.petsc-cache.outputs.cache-hit != 'true' + shell: C:\tools\cygwin\bin\bash.exe --login --norc -eo pipefail -o igncr '{0}' + run: mv /usr/bin/link.exe /usr/bin/link-cygwin.exe + + - name: Configure PETSc + if: steps.petsc-cache.outputs.cache-hit != 'true' + shell: cmd + run: | + "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "C:\tools\cygwin\bin\bash.exe" --login --norc -eo pipefail -o igncr "%TEMP%\configure_petsc.sh" + + - name: Build PETSc + if: steps.petsc-cache.outputs.cache-hit != 'true' + shell: cmd + run: | + "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "C:\tools\cygwin\bin\bash.exe" --login --norc -eo pipefail -o igncr "%TEMP%\compile_petsc.sh" + + - name: Save PETSc cache + if: steps.petsc-cache.outputs.cache-hit != 'true' + uses: actions/cache/save@v3 + with: + path: petsc + key: petsc-${{ runner.os }}-${{ steps.get-date.outputs.date }} + + - name: Setup PETSC environment + shell: cmd + run: | + set PETSC_DIR=%GITHUB_WORKSPACE%\petsc + set PETSC_ARCH=arch-mswin-c-opt + echo PETSC_DIR=%PETSC_DIR%>>%GITHUB_ENV% + echo PETSC_ARCH=%PETSC_ARCH%>>%GITHUB_ENV% + echo %PETSC_DIR%\%PETSC_ARCH%\lib>>%GITHUB_PATH% \ No newline at end of file diff --git a/.github/actions/setup-par-oneapi/action.yml b/.github/actions/setup-par-oneapi/action.yml index 73c0a892e6d..bda95818cbf 100644 --- a/.github/actions/setup-par-oneapi/action.yml +++ b/.github/actions/setup-par-oneapi/action.yml @@ -26,7 +26,7 @@ runs: run: | url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/5cb30fb9-21e9-47e8-82da-a91e00191670/w_BaseKit_p_2024.0.1.45_offline.exe" cmp="intel.oneapi.win.mkl.devel" - "modflow6/.github/common/install_intel_windows.bat" $url $cmp + "$GITHUB_WORKSPACE/modflow6/.github/common/install_intel_windows.bat" $url $cmp rm -rf $TEMP/webimage.exe rm -rf $TEMP/webimage_extracted @@ -36,7 +36,7 @@ runs: run: | url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/7a6db8a1-a8b9-4043-8e8e-ca54b56c34e4/w_HPCKit_p_2024.0.1.35_offline.exe" cmp="intel.oneapi.win.cpp-dpcpp-common:intel.oneapi.win.ifort-compiler:intel.oneapi.win.mpi.devel" - "modflow6/.github/common/install_intel_windows.bat" $url $cmp + "$GITHUB_WORKSPACE/modflow6/.github/common/install_intel_windows.bat" $url $cmp rm -rf $TEMP/webimage.exe rm -rf $TEMP/webimage_extracted diff --git a/.github/actions/test-par-win/action.yml b/.github/actions/test-par-win/action.yml index 10766d9749b..643805d4f45 100644 --- a/.github/actions/test-par-win/action.yml +++ b/.github/actions/test-par-win/action.yml @@ -20,9 +20,9 @@ runs: run: micromamba run -r "C:\Users\runneradmin\micromamba" -n modflow6 pytest -v --durations 0 get_exes.py - name: Test programs - working-directory: modflow6/autotest shell: cmd env: REPOS_PATH: ${{ github.workspace }} run: | + unix2dos -n "%GITHUB_WORKSPACE%\modflow6\.github\common\test_modflow6.bat" "%TEMP%\test_modflow6.bat" "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "%TEMP%\test_modflow6.bat" \ No newline at end of file diff --git a/.github/workflows/large.yml b/.github/workflows/large.yml index e143ef1fcdb..950c4738d2b 100644 --- a/.github/workflows/large.yml +++ b/.github/workflows/large.yml @@ -17,7 +17,7 @@ jobs: include: # ifx - {os: windows-2022, compiler: intel, version: 2022.2} - # use this combo to install and cache oneapi components for mf6 parallel (compilers + mkl/mpi) + # use this combo to install and cache oneapi components (compilers + mkl/mpi) and petsc for mf6 parallel - {os: windows-2022, compiler: intel, version: 2024.0} # ifort - {os: windows-2022, compiler: intel-classic, version: "2021.10"} @@ -33,15 +33,15 @@ jobs: compiler: ${{ matrix.compiler }} version: ${{ matrix.version }} + # cache oneapi and petsc for mf6 parallel - name: Checkout modflow6 if: matrix.compiler == 'intel' && matrix.version == '2024.0' uses: actions/checkout@v4 with: path: modflow6 - - - name: Setup oneAPI + - name: Cache oneAPI and PETSc if: matrix.compiler == 'intel' && matrix.version == '2024.0' - uses: ./modflow6/.github/actions/setup-par-oneapi + uses: ./modflow6/.github/actions/build-petsc-win test: name: Test runs-on: ubuntu-22.04 From 147cd618fd114db3cf85fc08fd1fea9e4669e6e0 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Tue, 2 Apr 2024 18:40:42 -0500 Subject: [PATCH 080/199] feat(disv1d): simplify and replace DISL with DISV1D (#1699) * feat(disv1d): simplify and replace DISL with DISV1D * No more support for the TOREACH option in DISL * DISV1D is a generalized version of DISL * fprettify --- .gitignore | 4 + autotest/test_swf_dfw.py | 14 +- autotest/test_swf_dfw_beg2022.py | 14 +- autotest/test_swf_dfw_bowl.py | 10 +- autotest/test_swf_dfw_gwf.py | 14 +- autotest/test_swf_dfw_loop.py | 53 ++- autotest/test_swf_dfw_swrt2.py | 14 +- autotest/test_swf_dfw_swrt2b.py | 12 +- .../dfn/{swf-disl.dfn => swf-disv1d.dfn} | 69 +--- .../mf6ivar/examples/swf-disl-example.dat | 33 -- .../mf6ivar/examples/swf-disv1d-example.dat | 32 ++ .../mf6ivar/examples/swf-nam-example.dat | 2 +- doc/mf6io/mf6ivar/md/mf6ivar.md | 40 +- doc/mf6io/mf6ivar/mf6ivar.py | 2 +- doc/mf6io/mf6ivar/tex/appendixA.tex | 10 +- doc/mf6io/mf6ivar/tex/swf-disl-griddata.dat | 12 - doc/mf6io/mf6ivar/tex/swf-disl-vertices.dat | 5 - doc/mf6io/mf6ivar/tex/swf-disv1d-cell2d.dat | 5 + ...{swf-disl-desc.tex => swf-disv1d-desc.tex} | 14 +- ...mensions.dat => swf-disv1d-dimensions.dat} | 0 doc/mf6io/mf6ivar/tex/swf-disv1d-griddata.dat | 10 + ...isl-options.dat => swf-disv1d-options.dat} | 2 - doc/mf6io/mf6ivar/tex/swf-disv1d-vertices.dat | 5 + doc/mf6io/swf/disl.tex | 22 -- doc/mf6io/swf/disv1d.tex | 19 + doc/mf6io/swf/namefile.tex | 5 +- doc/mf6io/swf/swf.tex | 4 +- make/makefile | 6 +- msvs/mf6core.vfproj | 16 +- src/Idm/selector/IdmSwfDfnSelector.f90 | 20 +- .../{swf-dislidm.f90 => swf-disv1didm.f90} | 242 +++++------- .../Disv1d.f90} | 352 ++++++++---------- src/Model/ModelUtilities/Connections.f90 | 128 +------ .../{DislGeom.f90 => Disv1dGeom.f90} | 32 +- src/Model/SurfaceWaterFlow/swf-cdb.f90 | 10 +- src/Model/SurfaceWaterFlow/swf-sto.f90 | 8 +- src/Model/SurfaceWaterFlow/swf-zdg.f90 | 10 +- src/Model/SurfaceWaterFlow/swf.f90 | 14 +- src/Utilities/Idm/SourceCommon.f90 | 2 +- .../Idm/mf6blockfile/LoadMf6File.f90 | 2 +- src/meson.build | 6 +- utils/idmloader/dfns.txt | 2 +- 42 files changed, 499 insertions(+), 777 deletions(-) rename doc/mf6io/mf6ivar/dfn/{swf-disl.dfn => swf-disv1d.dfn} (73%) delete mode 100644 doc/mf6io/mf6ivar/examples/swf-disl-example.dat create mode 100644 doc/mf6io/mf6ivar/examples/swf-disv1d-example.dat delete mode 100644 doc/mf6io/mf6ivar/tex/swf-disl-griddata.dat delete mode 100644 doc/mf6io/mf6ivar/tex/swf-disl-vertices.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-disv1d-cell2d.dat rename doc/mf6io/mf6ivar/tex/{swf-disl-desc.tex => swf-disv1d-desc.tex} (76%) rename doc/mf6io/mf6ivar/tex/{swf-disl-dimensions.dat => swf-disv1d-dimensions.dat} (100%) create mode 100644 doc/mf6io/mf6ivar/tex/swf-disv1d-griddata.dat rename doc/mf6io/mf6ivar/tex/{swf-disl-options.dat => swf-disv1d-options.dat} (66%) create mode 100644 doc/mf6io/mf6ivar/tex/swf-disv1d-vertices.dat delete mode 100644 doc/mf6io/swf/disl.tex create mode 100644 doc/mf6io/swf/disv1d.tex rename src/Idm/{swf-dislidm.f90 => swf-disv1didm.f90} (64%) rename src/Model/{SurfaceWaterFlow/swf-disl.f90 => Discretization/Disv1d.f90} (78%) rename src/Model/ModelUtilities/{DislGeom.f90 => Disv1dGeom.f90} (54%) diff --git a/.gitignore b/.gitignore index 959f560e70f..67be4780390 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,10 @@ Release/ *.lot *.synctex.gz *.toc +*.fdb_latexmk +*.fls +*.ilg +*.ind *_genmod.f90 .idea/ diff --git a/autotest/test_swf_dfw.py b/autotest/test_swf_dfw.py index d4ea3bfdf60..cdc6d393f89 100644 --- a/autotest/test_swf_dfw.py +++ b/autotest/test_swf_dfw.py @@ -56,22 +56,20 @@ def build_models(idx, test): nreach = 3 total_length = dx * nreach vertices = [] - vertices = [[j, j * dx, 0.0, 0.0] for j in range(nreach + 1)] + vertices = [[j, j * dx, 0.0] for j in range(nreach + 1)] cell2d = [] for j in range(nreach): cell2d.append([j, 0.5, 2, j, j + 1]) - toreach = [j + 1 for j in range(nreach - 1)] + [-1] nodes = len(cell2d) nvert = len(vertices) - disl = flopy.mf6.ModflowSwfdisl( + disv1d = flopy.mf6.ModflowSwfdisv1D( swf, nodes=nodes, nvert=nvert, - reach_length=dx, - reach_width=50., - reach_bottom=0.0, - toreach=toreach, # -1 gives 0 in one-based, which means outflow cell + length=dx, + width=50., + bottom=0.0, idomain=1, vertices=vertices, cell2d=cell2d, @@ -163,7 +161,7 @@ def check_output(idx, test): name = cases[idx] # read the binary grid file - fpth = test.workspace / f"{name}.disl.grb" + fpth = test.workspace / f"{name}.disv1d.grb" grb = flopy.mf6.utils.MfGrdFile(fpth) ia = grb.ia ja = grb.ja diff --git a/autotest/test_swf_dfw_beg2022.py b/autotest/test_swf_dfw_beg2022.py index 568a127a984..f2d79fe40b3 100644 --- a/autotest/test_swf_dfw_beg2022.py +++ b/autotest/test_swf_dfw_beg2022.py @@ -69,11 +69,10 @@ def build_models(idx, test): dx = 1000.0 nreach = int(total_length / dx) vertices = [] - vertices = [[j, j * dx, 0.0, 0.0] for j in range(nreach + 1)] + vertices = [[j, j * dx, 0.0] for j in range(nreach + 1)] cell2d = [] for j in range(nreach): cell2d.append([j, 0.5, 2, j, j + 1]) - toreach = [j + 1 for j in range(nreach - 1)] + [-1] nodes = len(cell2d) nvert = len(vertices) @@ -81,14 +80,13 @@ def build_models(idx, test): x = np.linspace(dx / 2, total_length - dx / 2, nreach) z = (total_length - x) * slope - disl = flopy.mf6.ModflowSwfdisl( + disv1d = flopy.mf6.ModflowSwfdisv1D( swf, nodes=nodes, nvert=nvert, - reach_length=dx, - reach_width=40., - reach_bottom=z, - # toreach=toreach, # -1 gives 0 in one-based, which means outflow cell + length=dx, + width=40., + bottom=z, idomain=1, vertices=vertices, cell2d=cell2d, @@ -275,7 +273,7 @@ def check_output(idx, test): name = "swfmodel" # read the binary grid file - fpth = test.workspace / f"{name}.disl.grb" + fpth = test.workspace / f"{name}.disv1d.grb" grb = flopy.mf6.utils.MfGrdFile(fpth) ia = grb.ia ja = grb.ja diff --git a/autotest/test_swf_dfw_bowl.py b/autotest/test_swf_dfw_bowl.py index 1317a985c81..062dcb490b5 100644 --- a/autotest/test_swf_dfw_bowl.py +++ b/autotest/test_swf_dfw_bowl.py @@ -93,20 +93,20 @@ def build_models(idx, test): sim.register_ims_package(imsswf, [swf.name]) vertices = [] - vertices = [[j, j * dx, 0.0, 0.0] for j in range(nreach + 1)] + vertices = [[j, j * dx, 0.0] for j in range(nreach + 1)] cell2d = [] for j in range(nreach): cell2d.append([j, 0.5, 2, j, j + 1]) nodes = len(cell2d) nvert = len(vertices) - disl = flopy.mf6.ModflowSwfdisl( + disv1d = flopy.mf6.ModflowSwfdisv1D( swf, nodes=nodes, nvert=nvert, - reach_length=dx, - reach_width=1., - reach_bottom=reach_bottom, + length=dx, + width=1., + bottom=reach_bottom, idomain=1, vertices=vertices, cell2d=cell2d, diff --git a/autotest/test_swf_dfw_gwf.py b/autotest/test_swf_dfw_gwf.py index bae9f77fa2d..e953a480d07 100644 --- a/autotest/test_swf_dfw_gwf.py +++ b/autotest/test_swf_dfw_gwf.py @@ -86,22 +86,20 @@ def add_swf_model(sim): nreach = 3 total_length = dx * nreach vertices = [] - vertices = [[j, j * dx, 0.0, 0.0] for j in range(nreach + 1)] + vertices = [[j, j * dx, 0.0] for j in range(nreach + 1)] cell2d = [] for j in range(nreach): cell2d.append([j, 0.5, 2, j, j + 1]) - toreach = [j + 1 for j in range(nreach - 1)] + [-1] nodes = len(cell2d) nvert = len(vertices) - disl = flopy.mf6.ModflowSwfdisl( + disv1d = flopy.mf6.ModflowSwfdisv1D( swf, nodes=nodes, nvert=nvert, - reach_length=dx, - reach_width=50., - reach_bottom=0.0, - toreach=toreach, # -1 gives 0 in one-based, which means outflow cell + length=dx, + width=50., + bottom=0.0, idomain=1, vertices=vertices, cell2d=cell2d, @@ -235,7 +233,7 @@ def check_output(idx, test): name = "swfmodel" # read the binary grid file - fpth = test.workspace / f"{name}.disl.grb" + fpth = test.workspace / f"{name}.disv1d.grb" grb = flopy.mf6.utils.MfGrdFile(fpth) ia = grb.ia ja = grb.ja diff --git a/autotest/test_swf_dfw_loop.py b/autotest/test_swf_dfw_loop.py index 3af13d4700d..0485807401e 100644 --- a/autotest/test_swf_dfw_loop.py +++ b/autotest/test_swf_dfw_loop.py @@ -64,26 +64,26 @@ def build_models(idx, test): ) vertices = [ - [0, 500.0, 6000.0, 0.0], - [1, 500.0, 5000.0, 0.0], - [2, 500.0, 4500.0, 0.0], - [3, 1000.0, 4500.0, 0.0], - [4, 2000.0, 4500.0, 0.0], - [5, 3000.0, 4500.0, 0.0], - [6, 3500.0, 4500.0, 0.0], - [7, 3500.0, 4000.0, 0.0], - [8, 3500.0, 3000.0, 0.0], - [9, 3500.0, 2500.0, 0.0], - [10, 3500.0, 2000.0, 0.0], - [11, 3500.0, 1000.0, 0.0], - [12, 3500.0, 500.0, 0.0], - [13, 4000.0, 500.0, 0.0], - [14, 5000.0, 500.0, 0.0], - [15, 6000.0, 500.0, 0.0], - [16, 500.0, 4000.0, 0.0], - [17, 1000.0, 3000.0, 0.0], - [18, 2000.0, 2500.0, 0.0], - [19, 3000.0, 2500.0, 0.0], + [0, 500.0, 6000.0], + [1, 500.0, 5000.0], + [2, 500.0, 4500.0], + [3, 1000.0, 4500.0], + [4, 2000.0, 4500.0], + [5, 3000.0, 4500.0], + [6, 3500.0, 4500.0], + [7, 3500.0, 4000.0], + [8, 3500.0, 3000.0], + [9, 3500.0, 2500.0], + [10, 3500.0, 2000.0], + [11, 3500.0, 1000.0], + [12, 3500.0, 500.0], + [13, 4000.0, 500.0], + [14, 5000.0, 500.0], + [15, 6000.0, 500.0], + [16, 500.0, 4000.0], + [17, 1000.0, 3000.0], + [18, 2000.0, 2500.0], + [19, 3000.0, 2500.0], ] cell2d = [ @@ -107,8 +107,6 @@ def build_models(idx, test): [17, 0.5, 2, 14, 15], ] - toreach = [1, 2, 3, 4, 5, 6, 7, 13, 9, 10, 11, 12, 13, 14, 15, 16, 17, -1] - reach_length = [ 1000.0, 500.0, @@ -227,14 +225,13 @@ def build_models(idx, test): nodes = len(cell2d) nvert = len(vertices) - disl = flopy.mf6.ModflowSwfdisl( + disv1d = flopy.mf6.ModflowSwfdisv1D( swf, nodes=nodes, nvert=nvert, - reach_length=reach_length, - reach_width=1., - reach_bottom=reach_bottom, - # toreach=toreach, # -1 gives 0 in one-based, which means outflow cell + length=reach_length, + width=1., + bottom=reach_bottom, idomain=1, vertices=vertices, cell2d=cell2d, @@ -442,7 +439,7 @@ def check_output(idx, test): ), f"Max diff with swr is {diff.min(), diff.max()}" # read the binary grid file - fpth = test.workspace / f"{name}.disl.grb" + fpth = test.workspace / f"{name}.disv1d.grb" grb = flopy.mf6.utils.MfGrdFile(fpth) ia = grb.ia assert ia.shape[0] == grb.nodes + 1, "ia in grb file is not correct size" diff --git a/autotest/test_swf_dfw_swrt2.py b/autotest/test_swf_dfw_swrt2.py index 414570a6e06..2f9beaf092d 100644 --- a/autotest/test_swf_dfw_swrt2.py +++ b/autotest/test_swf_dfw_swrt2.py @@ -3,7 +3,7 @@ SWR Test Problem 2 simulates two-dimensional overland flow using a grid of rows and columns. The SWR code was compared with results from SWIFT2D, a USGS 2D overland flow simulator. Because the DFW -Package in MF6 presently works only with the DISL Package, it cannot +Package in MF6 presently works only with the DISV1D Package, it cannot represent flow on a grid, so it is used here to simulate a one- dimensional version of this same problem. The problem is set up so that once steady conditions are achieved, the depth in each reach @@ -78,7 +78,7 @@ def build_models(idx, test): sim.register_ims_package(imsswf, [swf.name]) vertices = [] - vertices = [[j, j * dx, 0.0, 0.0] for j in range(nreach + 1)] + vertices = [[j, j * dx, 0.0] for j in range(nreach + 1)] cell2d = [] for j in range(nreach): cell2d.append([j, 0.5, 2, j, j + 1]) @@ -87,13 +87,13 @@ def build_models(idx, test): reach_bottom = np.linspace(1.05, 0.05, nreach) - disl = flopy.mf6.ModflowSwfdisl( + disv1d = flopy.mf6.ModflowSwfdisv1D( swf, nodes=nodes, nvert=nvert, - reach_length=dx, - reach_width=dx, - reach_bottom=reach_bottom, + length=dx, + width=dx, + bottom=reach_bottom, idomain=1, vertices=vertices, cell2d=cell2d, @@ -218,7 +218,7 @@ def check_output(idx, test): # at end of simulation, water depth should be 1.0 for all reaches swf = mfsim.get_model(swfname) - depth = stage_all[-1] - swf.disl.reach_bottom.array + depth = stage_all[-1] - swf.disv1d.bottom.array np.allclose( depth, 1.0 ), f"Simulated depth at end should be 1, but found {depth}" diff --git a/autotest/test_swf_dfw_swrt2b.py b/autotest/test_swf_dfw_swrt2b.py index 76d1f2c76e2..22158f4785f 100644 --- a/autotest/test_swf_dfw_swrt2b.py +++ b/autotest/test_swf_dfw_swrt2b.py @@ -88,7 +88,7 @@ def build_models(idx, test): sim.register_ims_package(imsswf, [swf.name]) vertices = [] - vertices = [[j, j * dx, 0.0, 0.0] for j in range(nreach + 1)] + vertices = [[j, j * dx, 0.0] for j in range(nreach + 1)] cell2d = [] for j in range(nreach): cell2d.append([j, 0.5, 2, j, j + 1]) @@ -97,13 +97,13 @@ def build_models(idx, test): reach_bottom = np.linspace(1.05, 0.05, nreach) - disl = flopy.mf6.ModflowSwfdisl( + disv1d = flopy.mf6.ModflowSwfdisv1D( swf, nodes=nodes, nvert=nvert, - reach_length=dx, - reach_width=dx, - reach_bottom=reach_bottom, + length=dx, + width=dx, + bottom=reach_bottom, idomain=1, vertices=vertices, cell2d=cell2d, @@ -230,7 +230,7 @@ def check_output(idx, test): # at end of simulation, water depth should be 1.0 for all reaches swf = mfsim.get_model(swfname) - depth = stage_all[-1] - swf.disl.reach_bottom.array + depth = stage_all[-1] - swf.disv1d.bottom.array np.allclose( depth, 1.0 ), f"Simulated depth at end should be 1, but found {depth}" diff --git a/doc/mf6io/mf6ivar/dfn/swf-disl.dfn b/doc/mf6io/mf6ivar/dfn/swf-disv1d.dfn similarity index 73% rename from doc/mf6io/mf6ivar/dfn/swf-disl.dfn rename to doc/mf6io/mf6ivar/dfn/swf-disv1d.dfn index 800e3bf2e9b..0ce04347669 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-disl.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-disv1d.dfn @@ -1,4 +1,4 @@ -# --------------------- swf disl options --------------------- +# --------------------- swf disv1d options --------------------- block options name length_units @@ -8,22 +8,6 @@ optional true longname model length units description is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. -block options -name length_convert -type double precision -reader urword -optional true -longname length conversion factor -description conversion factor that is used in converting constants used by MODFLOW into model length units. All constants are by default in units of ``meters''. Constants that use length\_conversion include GRAVITY and STORAGE COEFFICIENT values. - -block options -name time_convert -type double precision -reader urword -optional true -longname time conversion factor -description conversion factor that is used in converting constants used by MODFLOW into model time units. All constants are by default in units of ``seconds''. TIME\_CONVERSION is used to convert the GRAVITY constant from seconds to the model's units. - block options name nogrb type keyword @@ -56,7 +40,7 @@ optional true longname rotation angle description counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. -# --------------------- swf disl dimensions --------------------- +# --------------------- swf disv1d dimensions --------------------- block dimensions name nodes @@ -74,52 +58,40 @@ optional true longname number of columns description is the total number of (x, y, z) vertex pairs used to characterize the model grid. -# --------------------- swf disl griddata --------------------- +# --------------------- swf disv1d griddata --------------------- block griddata -name reach_length +name length type double precision shape (nodes) valid reader readarray layered false optional -longname reach length -description length for each reach +longname length +description length for each one-dimensional cell block griddata -name reach_width +name width type double precision shape (nodes) valid reader readarray layered false optional -longname reach width -description real value that defines the reach width. REACH\_WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the REACH\_WIDTH value will be multiplied by the specified cross section x-fraction values. +longname width +description real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values. block griddata -name reach_bottom +name bottom type double precision shape (nodes) valid reader readarray layered false optional -longname reach bottom -description bottom elevation of surface water channel - -block griddata -name toreach -type integer -shape (nodes) -valid -reader readarray -layered false -optional true -longname index of the downstream reach -description index of the downstream reach. Flow from this reach is passed into the dowstream reach. For reaches that do not flow to another reach enter a 0 to toreach. -numeric_index true +longname bottom elevation for the one-dimensional cell +description bottom elevation for the one-dimensional cell. block griddata name idomain @@ -132,11 +104,11 @@ longname idomain existence array description is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. -# --------------------- swf disl vertices --------------------- +# --------------------- swf disv1d vertices --------------------- block vertices name vertices -type recarray iv xv yv zv +type recarray iv xv yv shape (nvert) reader urword optional false @@ -174,18 +146,7 @@ optional false longname y-coordinate for vertex description is the y-coordinate for the vertex. -block vertices -name zv -type double precision -in_record true -tagged false -reader urword -optional false -longname z-coordinate for vertex -description is the z-coordinate for the vertex. - - -# --------------------- swf disl cell2d --------------------- +# --------------------- swf disv1d cell2d --------------------- block cell2d name cell2d diff --git a/doc/mf6io/mf6ivar/examples/swf-disl-example.dat b/doc/mf6io/mf6ivar/examples/swf-disl-example.dat deleted file mode 100644 index e7aec0f8697..00000000000 --- a/doc/mf6io/mf6ivar/examples/swf-disl-example.dat +++ /dev/null @@ -1,33 +0,0 @@ -BEGIN OPTIONS -END OPTIONS - -BEGIN DIMENSIONS - NODES 4 - NVERT 5 -END DIMENSIONS - -BEGIN GRIDDATA - segment_length - CONSTANT 1000.00000000 - tosegment - INTERNAL FACTOR 1 - 3 3 4 0 - idomain - CONSTANT 1 -END GRIDDATA - -BEGIN VERTICES - 1 0.00000000 0.00000000 0.00000000 - 2 0.00000000 1.00000000 0.00000000 - 3 1.00000000 0.00000000 0.00000000 - 4 2.00000000 0.00000000 0.00000000 - 5 3.00000000 0.00000000 0.00000000 -END VERTICES - -BEGIN CELL2D - 1 0.50000000 2 2 3 - 2 0.50000000 2 1 3 - 3 0.50000000 2 3 4 - 4 0.50000000 2 4 5 -END CELL2D - diff --git a/doc/mf6io/mf6ivar/examples/swf-disv1d-example.dat b/doc/mf6io/mf6ivar/examples/swf-disv1d-example.dat new file mode 100644 index 00000000000..de3aeeb2c61 --- /dev/null +++ b/doc/mf6io/mf6ivar/examples/swf-disv1d-example.dat @@ -0,0 +1,32 @@ +BEGIN OPTIONS +END OPTIONS + +BEGIN DIMENSIONS + NODES 4 + NVERT 5 +END DIMENSIONS + +BEGIN GRIDDATA + length + CONSTANT 1.0 + width + CONSTANT 0.5 + idomain + CONSTANT 1 +END GRIDDATA + +BEGIN VERTICES + 1 0.0 0.0 + 2 0.0 1.0 + 3 1.0 0.0 + 4 2.0 0.0 + 5 3.0 0.0 +END VERTICES + +BEGIN CELL2D + 1 0.5 2 2 3 + 2 0.5 2 1 3 + 3 0.5 2 3 4 + 4 0.5 2 4 5 +END CELL2D + diff --git a/doc/mf6io/mf6ivar/examples/swf-nam-example.dat b/doc/mf6io/mf6ivar/examples/swf-nam-example.dat index e1b5eba1886..65dbb6d538f 100644 --- a/doc/mf6io/mf6ivar/examples/swf-nam-example.dat +++ b/doc/mf6io/mf6ivar/examples/swf-nam-example.dat @@ -3,7 +3,7 @@ BEGIN options END options BEGIN packages - DISL6 swfmodel.disl + DISV1D6 swfmodel.disv1d DFW6 swfmodel.dfw STO6 swfmodel.sto IC6 swfmodel.ic diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 8de9f79dc2b..8fe8f099b6e 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -1515,28 +1515,24 @@ | SWF | NAM | PACKAGES | FTYPE | STRING | is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. | | SWF | NAM | PACKAGES | FNAME | STRING | is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. | | SWF | NAM | PACKAGES | PNAME | STRING | is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single SWF Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. | -| SWF | DISL | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | -| SWF | DISL | OPTIONS | LENGTH_CONVERT | DOUBLE PRECISION | conversion factor that is used in converting constants used by MODFLOW into model length units. All constants are by default in units of ``meters''. Constants that use length\_conversion include GRAVITY and STORAGE COEFFICIENT values. | -| SWF | DISL | OPTIONS | TIME_CONVERT | DOUBLE PRECISION | conversion factor that is used in converting constants used by MODFLOW into model time units. All constants are by default in units of ``seconds''. TIME\_CONVERSION is used to convert the GRAVITY constant from seconds to the model's units. | -| SWF | DISL | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | -| SWF | DISL | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| SWF | DISL | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| SWF | DISL | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| SWF | DISL | DIMENSIONS | NODES | INTEGER | is the number of linear cells. | -| SWF | DISL | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y, z) vertex pairs used to characterize the model grid. | -| SWF | DISL | GRIDDATA | REACH_LENGTH | DOUBLE PRECISION (NODES) | length for each reach | -| SWF | DISL | GRIDDATA | REACH_WIDTH | DOUBLE PRECISION (NODES) | real value that defines the reach width. REACH\_WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the REACH\_WIDTH value will be multiplied by the specified cross section x-fraction values. | -| SWF | DISL | GRIDDATA | REACH_BOTTOM | DOUBLE PRECISION (NODES) | bottom elevation of surface water channel | -| SWF | DISL | GRIDDATA | TOREACH | INTEGER (NODES) | index of the downstream reach. Flow from this reach is passed into the dowstream reach. For reaches that do not flow to another reach enter a 0 to toreach. | -| SWF | DISL | GRIDDATA | IDOMAIN | INTEGER (NODES) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. | -| SWF | DISL | VERTICES | IV | INTEGER | is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. | -| SWF | DISL | VERTICES | XV | DOUBLE PRECISION | is the x-coordinate for the vertex. | -| SWF | DISL | VERTICES | YV | DOUBLE PRECISION | is the y-coordinate for the vertex. | -| SWF | DISL | VERTICES | ZV | DOUBLE PRECISION | is the z-coordinate for the vertex. | -| SWF | DISL | CELL2D | ICELL2D | INTEGER | is the cell2d number. Records in the cell2d block must be listed in consecutive order from the first to the last. | -| SWF | DISL | CELL2D | FDC | DOUBLE PRECISION | is the fractional distance to the cell center. FDC is relative to the first vertex in the ICVERT array. In most cases FDC should be 0.5, which would place the center of the line segment that defines the cell. If the value of FDC is 1, the cell center would located at the last vertex. FDC values of 0 and 1 can be used to place the node at either end of the cell which can be useful for cells with boundary conditions. | -| SWF | DISL | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | -| SWF | DISL | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC. | +| SWF | DISV1D | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | +| SWF | DISV1D | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | +| SWF | DISV1D | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DISV1D | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DISV1D | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DISV1D | DIMENSIONS | NODES | INTEGER | is the number of linear cells. | +| SWF | DISV1D | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y, z) vertex pairs used to characterize the model grid. | +| SWF | DISV1D | GRIDDATA | LENGTH | DOUBLE PRECISION (NODES) | length for each one-dimensional cell | +| SWF | DISV1D | GRIDDATA | WIDTH | DOUBLE PRECISION (NODES) | real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values. | +| SWF | DISV1D | GRIDDATA | BOTTOM | DOUBLE PRECISION (NODES) | bottom elevation for the one-dimensional cell. | +| SWF | DISV1D | GRIDDATA | IDOMAIN | INTEGER (NODES) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. | +| SWF | DISV1D | VERTICES | IV | INTEGER | is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. | +| SWF | DISV1D | VERTICES | XV | DOUBLE PRECISION | is the x-coordinate for the vertex. | +| SWF | DISV1D | VERTICES | YV | DOUBLE PRECISION | is the y-coordinate for the vertex. | +| SWF | DISV1D | CELL2D | ICELL2D | INTEGER | is the cell2d number. Records in the cell2d block must be listed in consecutive order from the first to the last. | +| SWF | DISV1D | CELL2D | FDC | DOUBLE PRECISION | is the fractional distance to the cell center. FDC is relative to the first vertex in the ICVERT array. In most cases FDC should be 0.5, which would place the center of the line segment that defines the cell. If the value of FDC is 1, the cell center would located at the last vertex. FDC values of 0 and 1 can be used to place the node at either end of the cell which can be useful for cells with boundary conditions. | +| SWF | DISV1D | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | +| SWF | DISV1D | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC. | | SWF | DIS2D | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | | SWF | DIS2D | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | | SWF | DIS2D | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | diff --git a/doc/mf6io/mf6ivar/mf6ivar.py b/doc/mf6io/mf6ivar/mf6ivar.py index db9fa515871..9b7874c24b9 100644 --- a/doc/mf6io/mf6ivar/mf6ivar.py +++ b/doc/mf6io/mf6ivar/mf6ivar.py @@ -760,7 +760,7 @@ def write_appendix(texdir, allblocks): "gwe-uze", "gwe-fmi", "swf-nam", - "swf-disl", + "swf-disv1d", "swf-dis2d", "swf-disv", "swf-dfw", diff --git a/doc/mf6io/mf6ivar/tex/appendixA.tex b/doc/mf6io/mf6ivar/tex/appendixA.tex index 672031d2378..8b561661796 100644 --- a/doc/mf6io/mf6ivar/tex/appendixA.tex +++ b/doc/mf6io/mf6ivar/tex/appendixA.tex @@ -319,11 +319,11 @@ SWF & NAM & OPTIONS & yes \\ SWF & NAM & PACKAGES & yes \\ \hline -SWF & DISL & OPTIONS & yes \\ -SWF & DISL & DIMENSIONS & yes \\ -SWF & DISL & GRIDDATA & no \\ -SWF & DISL & VERTICES & yes \\ -SWF & DISL & CELL2D & yes \\ +SWF & DISV1D & OPTIONS & yes \\ +SWF & DISV1D & DIMENSIONS & yes \\ +SWF & DISV1D & GRIDDATA & no \\ +SWF & DISV1D & VERTICES & yes \\ +SWF & DISV1D & CELL2D & yes \\ \hline SWF & DIS2D & OPTIONS & yes \\ SWF & DIS2D & DIMENSIONS & yes \\ diff --git a/doc/mf6io/mf6ivar/tex/swf-disl-griddata.dat b/doc/mf6io/mf6ivar/tex/swf-disl-griddata.dat deleted file mode 100644 index da2a23a4e67..00000000000 --- a/doc/mf6io/mf6ivar/tex/swf-disl-griddata.dat +++ /dev/null @@ -1,12 +0,0 @@ -BEGIN GRIDDATA - REACH_LENGTH - -- READARRAY - REACH_WIDTH - -- READARRAY - REACH_BOTTOM - -- READARRAY - [TOREACH - -- READARRAY] - [IDOMAIN - -- READARRAY] -END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/swf-disl-vertices.dat b/doc/mf6io/mf6ivar/tex/swf-disl-vertices.dat deleted file mode 100644 index 76c179add38..00000000000 --- a/doc/mf6io/mf6ivar/tex/swf-disl-vertices.dat +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN VERTICES - - - ... -END VERTICES diff --git a/doc/mf6io/mf6ivar/tex/swf-disv1d-cell2d.dat b/doc/mf6io/mf6ivar/tex/swf-disv1d-cell2d.dat new file mode 100644 index 00000000000..f8ad1f65f50 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-disv1d-cell2d.dat @@ -0,0 +1,5 @@ +BEGIN CELL2D + + + ... +END CELL2D diff --git a/doc/mf6io/mf6ivar/tex/swf-disl-desc.tex b/doc/mf6io/mf6ivar/tex/swf-disv1d-desc.tex similarity index 76% rename from doc/mf6io/mf6ivar/tex/swf-disl-desc.tex rename to doc/mf6io/mf6ivar/tex/swf-disv1d-desc.tex index b5b55f90221..b89b7eeff1f 100644 --- a/doc/mf6io/mf6ivar/tex/swf-disl-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-disv1d-desc.tex @@ -5,10 +5,6 @@ \begin{description} \item \texttt{length\_units}---is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. -\item \texttt{length\_convert}---conversion factor that is used in converting constants used by MODFLOW into model length units. All constants are by default in units of ``meters''. Constants that use length\_conversion include GRAVITY and STORAGE COEFFICIENT values. - -\item \texttt{time\_convert}---conversion factor that is used in converting constants used by MODFLOW into model time units. All constants are by default in units of ``seconds''. TIME\_CONVERSION is used to convert the GRAVITY constant from seconds to the model's units. - \item \texttt{NOGRB}---keyword to deactivate writing of the binary grid file. \item \texttt{xorigin}---x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. @@ -29,13 +25,11 @@ \item \textbf{Block: GRIDDATA} \begin{description} -\item \texttt{reach\_length}---length for each reach +\item \texttt{length}---length for each one-dimensional cell -\item \texttt{reach\_width}---real value that defines the reach width. REACH\_WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the REACH\_WIDTH value will be multiplied by the specified cross section x-fraction values. +\item \texttt{width}---real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values. -\item \texttt{reach\_bottom}---bottom elevation of surface water channel - -\item \texttt{toreach}---index of the downstream reach. Flow from this reach is passed into the dowstream reach. For reaches that do not flow to another reach enter a 0 to toreach. +\item \texttt{bottom}---bottom elevation for the one-dimensional cell. \item \texttt{idomain}---is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. @@ -49,8 +43,6 @@ \item \texttt{yv}---is the y-coordinate for the vertex. -\item \texttt{zv}---is the z-coordinate for the vertex. - \end{description} \item \textbf{Block: CELL2D} diff --git a/doc/mf6io/mf6ivar/tex/swf-disl-dimensions.dat b/doc/mf6io/mf6ivar/tex/swf-disv1d-dimensions.dat similarity index 100% rename from doc/mf6io/mf6ivar/tex/swf-disl-dimensions.dat rename to doc/mf6io/mf6ivar/tex/swf-disv1d-dimensions.dat diff --git a/doc/mf6io/mf6ivar/tex/swf-disv1d-griddata.dat b/doc/mf6io/mf6ivar/tex/swf-disv1d-griddata.dat new file mode 100644 index 00000000000..5546fcef230 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-disv1d-griddata.dat @@ -0,0 +1,10 @@ +BEGIN GRIDDATA + LENGTH + -- READARRAY + WIDTH + -- READARRAY + BOTTOM + -- READARRAY + [IDOMAIN + -- READARRAY] +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/swf-disl-options.dat b/doc/mf6io/mf6ivar/tex/swf-disv1d-options.dat similarity index 66% rename from doc/mf6io/mf6ivar/tex/swf-disl-options.dat rename to doc/mf6io/mf6ivar/tex/swf-disv1d-options.dat index 7293142029f..67e3ed895ae 100644 --- a/doc/mf6io/mf6ivar/tex/swf-disl-options.dat +++ b/doc/mf6io/mf6ivar/tex/swf-disv1d-options.dat @@ -1,7 +1,5 @@ BEGIN OPTIONS [LENGTH_UNITS ] - [LENGTH_CONVERT ] - [TIME_CONVERT ] [NOGRB] [XORIGIN ] [YORIGIN ] diff --git a/doc/mf6io/mf6ivar/tex/swf-disv1d-vertices.dat b/doc/mf6io/mf6ivar/tex/swf-disv1d-vertices.dat new file mode 100644 index 00000000000..6831f23b5ff --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-disv1d-vertices.dat @@ -0,0 +1,5 @@ +BEGIN VERTICES + + + ... +END VERTICES diff --git a/doc/mf6io/swf/disl.tex b/doc/mf6io/swf/disl.tex deleted file mode 100644 index 605c779ff04..00000000000 --- a/doc/mf6io/swf/disl.tex +++ /dev/null @@ -1,22 +0,0 @@ -Input to the Line Discretization (DISL) Package is read from the file that has type ``DISL6'' in the Name File. Only one DISL Package can be specified for a SWF Model. - -The DISL VERTICES and CELL2D blocks are not required. In general, it is recommended to include the VERTICES and CELL2D blocks so that external programs can plot the line network. - - -\vspace{5mm} -\subsubsection{Structure of Blocks} -\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disl-options.dat} -\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disl-dimensions.dat} -\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disl-griddata.dat} -\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disl-vertices.dat} -\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disl-cell2d.dat} - -\vspace{5mm} -\subsubsection{Explanation of Variables} -\begin{description} -\input{./mf6ivar/tex/swf-disl-desc.tex} -\end{description} - -\vspace{5mm} -\subsubsection{Example Input File} -\lstinputlisting[style=inputfile]{./mf6ivar/examples/swf-disl-example.dat} diff --git a/doc/mf6io/swf/disv1d.tex b/doc/mf6io/swf/disv1d.tex new file mode 100644 index 00000000000..e7f6bf7c742 --- /dev/null +++ b/doc/mf6io/swf/disv1d.tex @@ -0,0 +1,19 @@ +Input to the Discretization by Vertices in One Dimension (DISV1D) Package is read from the file that has type ``DISV1D6'' in the Name File. Only one discretization package (either DIS2D or DISV1D) can be specified for a SWF Model. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disv1d-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disv1d-dimensions.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disv1d-griddata.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disv1d-vertices.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disv1d-cell2d.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/swf-disv1d-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/swf-disv1d-example.dat} diff --git a/doc/mf6io/swf/namefile.tex b/doc/mf6io/swf/namefile.tex index fa7dfcc12bc..922e8a23b52 100644 --- a/doc/mf6io/swf/namefile.tex +++ b/doc/mf6io/swf/namefile.tex @@ -22,9 +22,8 @@ \subsubsection{Explanation of Variables} \hline Ftype & Input File Description & \texttt{Pname}\\ \hline -DISL6 & Line Network Discretization Input File \\ -DIS6 & Structured Grid Discretization Input File \\ -DISV6 & Discretization by Vertices Input File \\ +DISV1D6 & Discretization by Vertices in 1D Input File \\ +DIS2D6 & Structured Grid Discretization Input File \\ DFW6 & Diffusive Wave Package \\ CXS6 & Cross Section Package \\ OC6 & Output Control Option \\ diff --git a/doc/mf6io/swf/swf.tex b/doc/mf6io/swf/swf.tex index 99b802a3d97..6a4be6f7dbc 100644 --- a/doc/mf6io/swf/swf.tex +++ b/doc/mf6io/swf/swf.tex @@ -15,8 +15,8 @@ \subsection{SWF Model Name File} \input{swf/namefile.tex} \newpage -\subsection{Discretization by Lines (DISL) Package} -\input{swf/disl} +\subsection{Discretization by Vertices in One Dimension (DISV1D) Package} +\input{swf/disv1d} \newpage \subsection{Structured Discretization in Two Dimensions (DIS2D) Package} diff --git a/make/makefile b/make/makefile index 12855d9cb22..d4ddf455844 100644 --- a/make/makefile +++ b/make/makefile @@ -108,7 +108,7 @@ $(OBJDIR)/swf-namidm.o \ $(OBJDIR)/swf-icidm.o \ $(OBJDIR)/swf-flwidm.o \ $(OBJDIR)/swf-disvidm.o \ -$(OBJDIR)/swf-dislidm.o \ +$(OBJDIR)/swf-disv1didm.o \ $(OBJDIR)/swf-dis2didm.o \ $(OBJDIR)/swf-dfwidm.o \ $(OBJDIR)/swf-cxsidm.o \ @@ -311,8 +311,8 @@ $(OBJDIR)/Integer1dReader.o \ $(OBJDIR)/Double2dReader.o \ $(OBJDIR)/Double1dReader.o \ $(OBJDIR)/DefinitionSelect.o \ -$(OBJDIR)/DislGeom.o \ $(OBJDIR)/SwfCxsUtils.o \ +$(OBJDIR)/Disv1dGeom.o \ $(OBJDIR)/MethodCellPool.o \ $(OBJDIR)/CellUtil.o \ $(OBJDIR)/VirtualExchange.o \ @@ -356,8 +356,8 @@ $(OBJDIR)/StructArray.o \ $(OBJDIR)/LayeredArrayReader.o \ $(OBJDIR)/DynamicPackageParams.o \ $(OBJDIR)/InputLoadType.o \ -$(OBJDIR)/swf-disl.o \ $(OBJDIR)/swf-cxs.o \ +$(OBJDIR)/Disv1d.o \ $(OBJDIR)/swf-ic.o \ $(OBJDIR)/MethodDisv.o \ $(OBJDIR)/MethodDis.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index 400a4f4459b..e11c9d8d5a3 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -180,7 +180,7 @@ - + @@ -202,6 +202,12 @@ + + + + + + @@ -259,7 +265,7 @@ - + @@ -284,11 +290,6 @@ - - - - - @@ -300,7 +301,6 @@ - diff --git a/src/Idm/selector/IdmSwfDfnSelector.f90 b/src/Idm/selector/IdmSwfDfnSelector.f90 index cc449bc306c..21b1c2b4ca7 100644 --- a/src/Idm/selector/IdmSwfDfnSelector.f90 +++ b/src/Idm/selector/IdmSwfDfnSelector.f90 @@ -6,7 +6,7 @@ module IdmSwfDfnSelectorModule use InputDefinitionModule, only: InputParamDefinitionType, & InputBlockDefinitionType use SwfNamInputModule - use SwfDislInputModule + use SwfDisv1DInputModule use SwfDis2DInputModule use SwfDisvInputModule use SwfCxsInputModule @@ -46,8 +46,8 @@ function swf_param_definitions(subcomponent) result(input_definition) select case (subcomponent) case ('NAM') call set_param_pointer(input_definition, swf_nam_param_definitions) - case ('DISL') - call set_param_pointer(input_definition, swf_disl_param_definitions) + case ('DISV1D') + call set_param_pointer(input_definition, swf_disv1d_param_definitions) case ('DIS2D') call set_param_pointer(input_definition, swf_dis2d_param_definitions) case ('DISV') @@ -78,8 +78,8 @@ function swf_aggregate_definitions(subcomponent) result(input_definition) select case (subcomponent) case ('NAM') call set_param_pointer(input_definition, swf_nam_aggregate_definitions) - case ('DISL') - call set_param_pointer(input_definition, swf_disl_aggregate_definitions) + case ('DISV1D') + call set_param_pointer(input_definition, swf_disv1d_aggregate_definitions) case ('DIS2D') call set_param_pointer(input_definition, swf_dis2d_aggregate_definitions) case ('DISV') @@ -110,8 +110,8 @@ function swf_block_definitions(subcomponent) result(input_definition) select case (subcomponent) case ('NAM') call set_block_pointer(input_definition, swf_nam_block_definitions) - case ('DISL') - call set_block_pointer(input_definition, swf_disl_block_definitions) + case ('DISV1D') + call set_block_pointer(input_definition, swf_disv1d_block_definitions) case ('DIS2D') call set_block_pointer(input_definition, swf_dis2d_block_definitions) case ('DISV') @@ -141,8 +141,8 @@ function swf_idm_multi_package(subcomponent) result(multi_package) select case (subcomponent) case ('NAM') multi_package = swf_nam_multi_package - case ('DISL') - multi_package = swf_disl_multi_package + case ('DISV1D') + multi_package = swf_disv1d_multi_package case ('DIS2D') multi_package = swf_dis2d_multi_package case ('DISV') @@ -176,7 +176,7 @@ function swf_idm_integrated(subcomponent) result(integrated) select case (subcomponent) case ('NAM') integrated = .true. - case ('DISL') + case ('DISV1D') integrated = .true. case ('DIS2D') integrated = .true. diff --git a/src/Idm/swf-dislidm.f90 b/src/Idm/swf-disv1didm.f90 similarity index 64% rename from src/Idm/swf-dislidm.f90 rename to src/Idm/swf-disv1didm.f90 index 18e31b2bfb1..4c1b963cf10 100644 --- a/src/Idm/swf-dislidm.f90 +++ b/src/Idm/swf-disv1didm.f90 @@ -1,47 +1,43 @@ ! ** Do Not Modify! MODFLOW 6 system generated file. ** -module SwfDislInputModule +module SwfDisv1DInputModule use ConstantsModule, only: LENVARNAME use InputDefinitionModule, only: InputParamDefinitionType, & InputBlockDefinitionType private - public swf_disl_param_definitions - public swf_disl_aggregate_definitions - public swf_disl_block_definitions - public SwfDislParamFoundType - public swf_disl_multi_package + public swf_disv1d_param_definitions + public swf_disv1d_aggregate_definitions + public swf_disv1d_block_definitions + public SwfDisv1dParamFoundType + public swf_disv1d_multi_package - type SwfDislParamFoundType + type SwfDisv1dParamFoundType logical :: length_units = .false. - logical :: length_convert = .false. - logical :: time_convert = .false. logical :: nogrb = .false. logical :: xorigin = .false. logical :: yorigin = .false. logical :: angrot = .false. logical :: nodes = .false. logical :: nvert = .false. - logical :: reach_length = .false. - logical :: reach_width = .false. - logical :: reach_bottom = .false. - logical :: toreach = .false. + logical :: length = .false. + logical :: width = .false. + logical :: bottom = .false. logical :: idomain = .false. logical :: iv = .false. logical :: xv = .false. logical :: yv = .false. - logical :: zv = .false. logical :: icell2d = .false. logical :: fdc = .false. logical :: ncvert = .false. logical :: icvert = .false. - end type SwfDislParamFoundType + end type SwfDisv1dParamFoundType - logical :: swf_disl_multi_package = .false. + logical :: swf_disv1d_multi_package = .false. type(InputParamDefinitionType), parameter :: & - swfdisl_length_units = InputParamDefinitionType & + swfdisv1d_length_units = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'OPTIONS', & ! block 'LENGTH_UNITS', & ! tag name 'LENGTH_UNITS', & ! fortran variable @@ -55,44 +51,10 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_length_convert = InputParamDefinitionType & + swfdisv1d_nogrb = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent - 'OPTIONS', & ! block - 'LENGTH_CONVERT', & ! tag name - 'LENGTH_CONVERT', & ! fortran variable - 'DOUBLE', & ! type - '', & ! shape - .false., & ! required - .false., & ! multi-record - .false., & ! preserve case - .false., & ! layered - .false. & ! timeseries - ) - - type(InputParamDefinitionType), parameter :: & - swfdisl_time_convert = InputParamDefinitionType & - ( & - 'SWF', & ! component - 'DISL', & ! subcomponent - 'OPTIONS', & ! block - 'TIME_CONVERT', & ! tag name - 'TIME_CONVERT', & ! fortran variable - 'DOUBLE', & ! type - '', & ! shape - .false., & ! required - .false., & ! multi-record - .false., & ! preserve case - .false., & ! layered - .false. & ! timeseries - ) - - type(InputParamDefinitionType), parameter :: & - swfdisl_nogrb = InputParamDefinitionType & - ( & - 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'OPTIONS', & ! block 'NOGRB', & ! tag name 'NOGRB', & ! fortran variable @@ -106,10 +68,10 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_xorigin = InputParamDefinitionType & + swfdisv1d_xorigin = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'OPTIONS', & ! block 'XORIGIN', & ! tag name 'XORIGIN', & ! fortran variable @@ -123,10 +85,10 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_yorigin = InputParamDefinitionType & + swfdisv1d_yorigin = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'OPTIONS', & ! block 'YORIGIN', & ! tag name 'YORIGIN', & ! fortran variable @@ -140,10 +102,10 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_angrot = InputParamDefinitionType & + swfdisv1d_angrot = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'OPTIONS', & ! block 'ANGROT', & ! tag name 'ANGROT', & ! fortran variable @@ -157,10 +119,10 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_nodes = InputParamDefinitionType & + swfdisv1d_nodes = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'DIMENSIONS', & ! block 'NODES', & ! tag name 'NODES', & ! fortran variable @@ -174,10 +136,10 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_nvert = InputParamDefinitionType & + swfdisv1d_nvert = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'DIMENSIONS', & ! block 'NVERT', & ! tag name 'NVERT', & ! fortran variable @@ -191,13 +153,13 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_reach_length = InputParamDefinitionType & + swfdisv1d_length = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'GRIDDATA', & ! block - 'REACH_LENGTH', & ! tag name - 'REACH_LENGTH', & ! fortran variable + 'LENGTH', & ! tag name + 'LENGTH', & ! fortran variable 'DOUBLE1D', & ! type 'NODES', & ! shape .true., & ! required @@ -208,13 +170,13 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_reach_width = InputParamDefinitionType & + swfdisv1d_width = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'GRIDDATA', & ! block - 'REACH_WIDTH', & ! tag name - 'REACH_WIDTH', & ! fortran variable + 'WIDTH', & ! tag name + 'WIDTH', & ! fortran variable 'DOUBLE1D', & ! type 'NODES', & ! shape .true., & ! required @@ -225,13 +187,13 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_reach_bottom = InputParamDefinitionType & + swfdisv1d_bottom = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'GRIDDATA', & ! block - 'REACH_BOTTOM', & ! tag name - 'REACH_BOTTOM', & ! fortran variable + 'BOTTOM', & ! tag name + 'BOTTOM', & ! fortran variable 'DOUBLE1D', & ! type 'NODES', & ! shape .true., & ! required @@ -242,27 +204,10 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_toreach = InputParamDefinitionType & + swfdisv1d_idomain = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent - 'GRIDDATA', & ! block - 'TOREACH', & ! tag name - 'TOREACH', & ! fortran variable - 'INTEGER1D', & ! type - 'NODES', & ! shape - .false., & ! required - .false., & ! multi-record - .false., & ! preserve case - .false., & ! layered - .false. & ! timeseries - ) - - type(InputParamDefinitionType), parameter :: & - swfdisl_idomain = InputParamDefinitionType & - ( & - 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'GRIDDATA', & ! block 'IDOMAIN', & ! tag name 'IDOMAIN', & ! fortran variable @@ -276,10 +221,10 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_iv = InputParamDefinitionType & + swfdisv1d_iv = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'VERTICES', & ! block 'IV', & ! tag name 'IV', & ! fortran variable @@ -293,10 +238,10 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_xv = InputParamDefinitionType & + swfdisv1d_xv = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'VERTICES', & ! block 'XV', & ! tag name 'XV', & ! fortran variable @@ -310,10 +255,10 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_yv = InputParamDefinitionType & + swfdisv1d_yv = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'VERTICES', & ! block 'YV', & ! tag name 'YV', & ! fortran variable @@ -327,27 +272,10 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_zv = InputParamDefinitionType & - ( & - 'SWF', & ! component - 'DISL', & ! subcomponent - 'VERTICES', & ! block - 'ZV', & ! tag name - 'ZV', & ! fortran variable - 'DOUBLE', & ! type - '', & ! shape - .true., & ! required - .true., & ! multi-record - .false., & ! preserve case - .false., & ! layered - .false. & ! timeseries - ) - - type(InputParamDefinitionType), parameter :: & - swfdisl_icell2d = InputParamDefinitionType & + swfdisv1d_icell2d = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'CELL2D', & ! block 'ICELL2D', & ! tag name 'ICELL2D', & ! fortran variable @@ -361,10 +289,10 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_fdc = InputParamDefinitionType & + swfdisv1d_fdc = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'CELL2D', & ! block 'FDC', & ! tag name 'FDC', & ! fortran variable @@ -378,10 +306,10 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_ncvert = InputParamDefinitionType & + swfdisv1d_ncvert = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'CELL2D', & ! block 'NCVERT', & ! tag name 'NCVERT', & ! fortran variable @@ -395,10 +323,10 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_icvert = InputParamDefinitionType & + swfdisv1d_icvert = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'CELL2D', & ! block 'ICVERT', & ! tag name 'ICVERT', & ! fortran variable @@ -412,41 +340,37 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swf_disl_param_definitions(*) = & + swf_disv1d_param_definitions(*) = & [ & - swfdisl_length_units, & - swfdisl_length_convert, & - swfdisl_time_convert, & - swfdisl_nogrb, & - swfdisl_xorigin, & - swfdisl_yorigin, & - swfdisl_angrot, & - swfdisl_nodes, & - swfdisl_nvert, & - swfdisl_reach_length, & - swfdisl_reach_width, & - swfdisl_reach_bottom, & - swfdisl_toreach, & - swfdisl_idomain, & - swfdisl_iv, & - swfdisl_xv, & - swfdisl_yv, & - swfdisl_zv, & - swfdisl_icell2d, & - swfdisl_fdc, & - swfdisl_ncvert, & - swfdisl_icvert & + swfdisv1d_length_units, & + swfdisv1d_nogrb, & + swfdisv1d_xorigin, & + swfdisv1d_yorigin, & + swfdisv1d_angrot, & + swfdisv1d_nodes, & + swfdisv1d_nvert, & + swfdisv1d_length, & + swfdisv1d_width, & + swfdisv1d_bottom, & + swfdisv1d_idomain, & + swfdisv1d_iv, & + swfdisv1d_xv, & + swfdisv1d_yv, & + swfdisv1d_icell2d, & + swfdisv1d_fdc, & + swfdisv1d_ncvert, & + swfdisv1d_icvert & ] type(InputParamDefinitionType), parameter :: & - swfdisl_vertices = InputParamDefinitionType & + swfdisv1d_vertices = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'VERTICES', & ! block 'VERTICES', & ! tag name 'VERTICES', & ! fortran variable - 'RECARRAY IV XV YV ZV', & ! type + 'RECARRAY IV XV YV', & ! type 'NVERT', & ! shape .true., & ! required .false., & ! multi-record @@ -456,10 +380,10 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisl_cell2d = InputParamDefinitionType & + swfdisv1d_cell2d = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISL', & ! subcomponent + 'DISV1D', & ! subcomponent 'CELL2D', & ! block 'CELL2D', & ! tag name 'CELL2D', & ! fortran variable @@ -473,14 +397,14 @@ module SwfDislInputModule ) type(InputParamDefinitionType), parameter :: & - swf_disl_aggregate_definitions(*) = & + swf_disv1d_aggregate_definitions(*) = & [ & - swfdisl_vertices, & - swfdisl_cell2d & + swfdisv1d_vertices, & + swfdisv1d_cell2d & ] type(InputBlockDefinitionType), parameter :: & - swf_disl_block_definitions(*) = & + swf_disv1d_block_definitions(*) = & [ & InputBlockDefinitionType( & 'OPTIONS', & ! blockname @@ -514,4 +438,4 @@ module SwfDislInputModule ) & ] -end module SwfDislInputModule +end module SwfDisv1DInputModule diff --git a/src/Model/SurfaceWaterFlow/swf-disl.f90 b/src/Model/Discretization/Disv1d.f90 similarity index 78% rename from src/Model/SurfaceWaterFlow/swf-disl.f90 rename to src/Model/Discretization/Disv1d.f90 index e9762c35058..7f3756cc4f9 100644 --- a/src/Model/SurfaceWaterFlow/swf-disl.f90 +++ b/src/Model/Discretization/Disv1d.f90 @@ -1,4 +1,4 @@ -module SwfDislModule +module Disv1dModule use KindModule, only: DP, I4B, LGP use ConstantsModule, only: LENMEMPATH, LENVARNAME, DZERO, DONE, LINELENGTH @@ -9,33 +9,29 @@ module SwfDislModule store_warning, store_error_filename use InputOutputModule, only: urword use BaseDisModule, only: DisBaseType - use DislGeom, only: calcdist + use Disv1dGeom, only: calcdist implicit none private - public :: disl_cr - public :: SwfDislType + public :: disv1d_cr + public :: Disv1dType - type, extends(DisBaseType) :: SwfDislType + type, extends(DisBaseType) :: Disv1dType integer(I4B), pointer :: nvert => null() !< number of x,y vertices - real(DP), pointer :: convlength => null() !< conversion factor for length - real(DP), pointer :: convtime => null() !< conversion factor for time - real(DP), dimension(:), pointer, contiguous :: reach_length => null() !< length of each reach - real(DP), dimension(:), pointer, contiguous :: reach_width => null() !< reach width - real(DP), dimension(:), pointer, contiguous :: reach_bottom => null() !< reach bottom elevation - integer(I4B), dimension(:), pointer, contiguous :: toreach => null() !< downstream reach index (nodes) + real(DP), dimension(:), pointer, contiguous :: length => null() !< length of each reach + real(DP), dimension(:), pointer, contiguous :: width => null() !< reach width + real(DP), dimension(:), pointer, contiguous :: bottom => null() !< reach bottom elevation integer(I4B), dimension(:), pointer, contiguous :: idomain => null() !< idomain (nodes) - real(DP), dimension(:, :), pointer, contiguous :: vertices => null() !< cell vertices stored as 2d array with columns of x, y, and z - real(DP), dimension(:, :), pointer, contiguous :: cellxyz => null() !< reach midpoints stored as 2d array with columns of x, y, and z + real(DP), dimension(:, :), pointer, contiguous :: vertices => null() !< cell vertices stored as 2d array with columns of x, y + real(DP), dimension(:, :), pointer, contiguous :: cellxy => null() !< reach midpoints stored as 2d array with columns of x, y real(DP), dimension(:), pointer, contiguous :: fdc => null() !< fdc stored as array integer(I4B), dimension(:), pointer, contiguous :: iavert => null() !< cell vertex pointer ia array integer(I4B), dimension(:), pointer, contiguous :: javert => null() !< cell vertex pointer ja array - logical(LGP) :: toreachConnectivity = .false. !< flag to indicate build connectivity from toreach instead of vertices contains - procedure :: disl_load - procedure :: dis_df => disl_df - procedure :: dis_da => disl_da + procedure :: disv1d_load => disv1d_load + procedure :: dis_df => disv1d_df + procedure :: dis_da => disv1d_da procedure :: get_dis_type => get_dis_type procedure :: get_flow_width => get_flow_width procedure, public :: record_array @@ -60,11 +56,33 @@ module SwfDislModule procedure :: nodeu_to_string procedure :: nodeu_from_string - end type SwfDislType + end type Disv1dType + + !> @brief Simplifies tracking parameters sourced from the input context. + type DisFoundType + logical :: length_units = .false. + logical :: nogrb = .false. + logical :: xorigin = .false. + logical :: yorigin = .false. + logical :: angrot = .false. + logical :: nodes = .false. + logical :: nvert = .false. + logical :: length = .false. + logical :: width = .false. + logical :: bottom = .false. + logical :: idomain = .false. + logical :: iv = .false. + logical :: xv = .false. + logical :: yv = .false. + logical :: icell2d = .false. + logical :: fdc = .false. + logical :: ncvert = .false. + logical :: icvert = .false. + end type DisFoundType contains - subroutine disl_cr(dis, name_model, input_mempath, inunit, iout) + subroutine disv1d_cr(dis, name_model, input_mempath, inunit, iout) ! -- modules use KindModule, only: LGP use MemoryManagerExtModule, only: mem_set_value @@ -75,11 +93,11 @@ subroutine disl_cr(dis, name_model, input_mempath, inunit, iout) integer(I4B), intent(in) :: inunit integer(I4B), intent(in) :: iout ! -- locals - type(SwfDislType), pointer :: disnew + type(Disv1dType), pointer :: disnew logical(LGP) :: found_fname character(len=*), parameter :: fmtheader = & - "(1X, /1X, 'DISL -- LINE NETWORK DISCRETIZATION PACKAGE,', & - &' VERSION 1 : 3/30/2023 - INPUT READ FROM MEMPATH: ', A, /)" + "(1X, /1X, 'DISV1D -- DISCRETIZATION BY VERTICES IN 1D PACKAGE,', & + &' VERSION 1 : 4/2/2024 - INPUT READ FROM MEMPATH: ', A, /)" allocate (disnew) dis => disnew call disnew%allocate_scalars(name_model, input_mempath) @@ -103,32 +121,32 @@ subroutine disl_cr(dis, name_model, input_mempath, inunit, iout) ! ! -- Return return - end subroutine disl_cr + end subroutine disv1d_cr !> @brief Define the discretization !< - subroutine disl_df(this) + subroutine disv1d_df(this) ! -- dummy - class(SwfDislType) :: this + class(Disv1dType) :: this ! ! -- Transfer the data from the memory manager into this package object if (this%inunit /= 0) then - call this%disl_load() + call this%disv1d_load() end if - ! create connectivity using toreach or vertices and cell2d + ! create connectivity using vertices and cell2d call this%create_connections() ! finalize the grid call this%grid_finalize() - end subroutine disl_df + end subroutine disv1d_df - !> @brief Get the discretization type (DIS, DISV, DISU, DISL) + !> @brief Get the discretization type (DIS, DIS2D, DISV, DISV2D, DISU) subroutine get_dis_type(this, dis_type) - class(SwfDislType), intent(in) :: this + class(Disv1dType), intent(in) :: this character(len=*), intent(out) :: dis_type - dis_type = "DISL" + dis_type = "DISV1D" end subroutine get_dis_type !> @brief Allocate scalar variables @@ -138,7 +156,7 @@ subroutine allocate_scalars(this, name_model, input_mempath) use MemoryManagerModule, only: mem_allocate use ConstantsModule, only: DONE ! -- dummy - class(SwfDislType) :: this + class(Disv1dType) :: this character(len=*), intent(in) :: name_model character(len=*), intent(in) :: input_mempath ! @@ -147,22 +165,18 @@ subroutine allocate_scalars(this, name_model, input_mempath) ! ! -- Allocate call mem_allocate(this%nvert, 'NVERT', this%memoryPath) - call mem_allocate(this%convlength, 'CONVLENGTH', this%memoryPath) - call mem_allocate(this%convtime, 'CONVTIME', this%memoryPath) ! ! -- Initialize this%nvert = 0 this%ndim = 1 - this%convlength = DONE - this%convtime = DONE ! ! -- Return return end subroutine allocate_scalars - subroutine disl_load(this) + subroutine disv1d_load(this) ! -- dummy - class(SwfDislType) :: this + class(Disv1dType) :: this ! -- locals ! ! -- source input data @@ -176,7 +190,7 @@ subroutine disl_load(this) call this%source_cell2d() end if - end subroutine disl_load + end subroutine disv1d_load !> @brief Copy options from IDM into package !< @@ -185,25 +199,20 @@ subroutine source_options(this) use KindModule, only: LGP use MemoryManagerExtModule, only: mem_set_value use SimVariablesModule, only: idm_context - use SwfDislInputModule, only: SwfDislParamFoundType ! -- dummy - class(SwfDislType) :: this + class(Disv1dType) :: this ! -- locals - character(len=LENMEMPATH) :: idmMemoryPath character(len=LENVARNAME), dimension(3) :: lenunits = & &[character(len=LENVARNAME) :: 'FEET', 'METERS', 'CENTIMETERS'] - type(SwfDislParamFoundType) :: found + character(len=LENMEMPATH) :: idmMemoryPath + type(DisFoundType) :: found ! ! -- set memory path - idmMemoryPath = create_mem_path(this%name_model, 'DISL', idm_context) + idmMemoryPath = create_mem_path(this%name_model, 'DISV1D', idm_context) ! ! -- update defaults with idm sourced values call mem_set_value(this%lenuni, 'LENGTH_UNITS', & idmMemoryPath, lenunits, found%length_units) - call mem_set_value(this%convlength, 'CONVLENGTH', & - idmMemoryPath, found%length_convert) - call mem_set_value(this%convtime, 'CONVTIME', & - idmMemoryPath, found%time_convert) call mem_set_value(this%nogrb, 'NOGRB', & idmMemoryPath, found%nogrb) call mem_set_value(this%xorigin, 'XORIGIN', & @@ -225,9 +234,8 @@ end subroutine source_options !> @brief Write user options to list file !< subroutine log_options(this, found) - use SwfDislInputModule, only: SwfDislParamFoundType - class(SwfDislType) :: this - type(SwfDislParamFoundType), intent(in) :: found + class(Disv1dType) :: this + type(DisFoundType), intent(in) :: found write (this%iout, '(1x,a)') 'Setting Discretization Options' @@ -253,14 +261,6 @@ subroutine log_options(this, found) write (this%iout, '(4x,a,G0)') 'ANGROT = ', this%angrot end if - if (found%length_convert) then - write (this%iout, '(4x,a,G0)') 'LENGTH_CONVERSION = ', this%convlength - end if - - if (found%time_convert) then - write (this%iout, '(4x,a,G0)') 'TIME_CONVERSION = ', this%convtime - end if - write (this%iout, '(1x,a,/)') 'End Setting Discretization Options' end subroutine log_options @@ -271,16 +271,15 @@ subroutine source_dimensions(this) use KindModule, only: LGP use MemoryManagerExtModule, only: mem_set_value use SimVariablesModule, only: idm_context - use SwfDislInputModule, only: SwfDislParamFoundType ! -- dummy - class(SwfDislType) :: this + class(Disv1dType) :: this ! -- locals character(len=LENMEMPATH) :: idmMemoryPath integer(I4B) :: n - type(SwfDislParamFoundType) :: found + type(DisFoundType) :: found ! ! -- set memory path - idmMemoryPath = create_mem_path(this%name_model, 'DISL', idm_context) + idmMemoryPath = create_mem_path(this%name_model, 'DISV1D', idm_context) ! ! -- update defaults with idm sourced values call mem_set_value(this%nodes, 'NODES', idmMemoryPath, found%nodes) @@ -303,19 +302,17 @@ subroutine source_dimensions(this) if (this%nvert < 1) then call store_warning( & 'NVERT was not specified or was specified as zero. The & - &VERTICES and CELL2D blocks will not be read for the DISL6 & + &VERTICES and CELL2D blocks will not be read for the DISV1D6 & &Package in model '//trim(this%memoryPath)//'.') end if ! - ! -- Allocate non-reduced vectors for disl - call mem_allocate(this%reach_length, this%nodesuser, & - 'REACH_LENGTH', this%memoryPath) - call mem_allocate(this%reach_width, this%nodesuser, & - 'REACH_WIDTH', this%memoryPath) - call mem_allocate(this%reach_bottom, this%nodesuser, & - 'REACH_BOTTOM', this%memoryPath) - call mem_allocate(this%toreach, this%nodesuser, & - 'TOREACH', this%memoryPath) + ! -- Allocate non-reduced vectors for disv1d + call mem_allocate(this%length, this%nodesuser, & + 'LENGTH', this%memoryPath) + call mem_allocate(this%width, this%nodesuser, & + 'WIDTH', this%memoryPath) + call mem_allocate(this%bottom, this%nodesuser, & + 'BOTTOM', this%memoryPath) call mem_allocate(this%idomain, this%nodesuser, & 'IDOMAIN', this%memoryPath) ! @@ -325,16 +322,15 @@ subroutine source_dimensions(this) 'VERTICES', this%memoryPath) call mem_allocate(this%fdc, this%nodesuser, & 'FDC', this%memoryPath) - call mem_allocate(this%cellxyz, 3, this%nodesuser, & + call mem_allocate(this%cellxy, 3, this%nodesuser, & 'CELLXYZ', this%memoryPath) end if ! ! -- initialize all cells to be active (idomain = 1) do n = 1, this%nodesuser - this%reach_length(n) = DZERO - this%reach_width(n) = DZERO - this%reach_bottom(n) = DZERO - this%toreach(n) = 0 + this%length(n) = DZERO + this%width(n) = DZERO + this%bottom(n) = DZERO this%idomain(n) = 1 end do ! @@ -345,9 +341,8 @@ end subroutine source_dimensions !> @brief Write dimensions to list file !< subroutine log_dimensions(this, found) - use SwfDislInputModule, only: SwfDislParamFoundType - class(SwfDislType) :: this - type(SwfDislParamFoundType), intent(in) :: found + class(Disv1dType) :: this + type(DisFoundType), intent(in) :: found write (this%iout, '(1x,a)') 'Setting Discretization Dimensions' @@ -367,43 +362,37 @@ subroutine source_griddata(this) ! -- modules use MemoryManagerExtModule, only: mem_set_value use SimVariablesModule, only: idm_context - use SwfDislInputModule, only: SwfDislParamFoundType ! -- dummy - class(SwfDislType) :: this + class(Disv1dType) :: this ! -- locals character(len=LENMEMPATH) :: idmMemoryPath - type(SwfDislParamFoundType) :: found + type(DisFoundType) :: found ! -- formats ! ! -- set memory path - idmMemoryPath = create_mem_path(this%name_model, 'DISL', idm_context) + idmMemoryPath = create_mem_path(this%name_model, 'DISV1D', idm_context) ! ! -- update defaults with idm sourced values - call mem_set_value(this%reach_length, 'REACH_LENGTH', idmMemoryPath, & - found%reach_length) - call mem_set_value(this%reach_width, 'REACH_WIDTH', idmMemoryPath, & - found%reach_width) - call mem_set_value(this%reach_bottom, 'REACH_BOTTOM', idmMemoryPath, & - found%reach_bottom) - call mem_set_value(this%toreach, 'TOREACH', idmMemoryPath, & - found%toreach) - if (found%toreach) then - this%toreachConnectivity = .true. - end if + call mem_set_value(this%length, 'LENGTH', idmMemoryPath, & + found%length) + call mem_set_value(this%width, 'WIDTH', idmMemoryPath, & + found%width) + call mem_set_value(this%bottom, 'BOTTOM', idmMemoryPath, & + found%bottom) call mem_set_value(this%idomain, 'IDOMAIN', idmMemoryPath, found%idomain) - if (.not. found%reach_length) then - write (errmsg, '(a)') 'Error in GRIDDATA block: REACH_LENGTH not found.' + if (.not. found%length) then + write (errmsg, '(a)') 'Error in GRIDDATA block: LENGTH not found.' call store_error(errmsg) end if - if (.not. found%reach_width) then - write (errmsg, '(a)') 'Error in GRIDDATA block: REACH_WIDTH not found.' + if (.not. found%width) then + write (errmsg, '(a)') 'Error in GRIDDATA block: WIDTH not found.' call store_error(errmsg) end if - if (.not. found%reach_bottom) then - write (errmsg, '(a)') 'Error in GRIDDATA block: REACH_BOTTOM not found.' + if (.not. found%bottom) then + write (errmsg, '(a)') 'Error in GRIDDATA block: BOTTOM not found.' call store_error(errmsg) end if @@ -423,26 +412,21 @@ end subroutine source_griddata !> @brief Write griddata found to list file !< subroutine log_griddata(this, found) - use SwfDislInputModule, only: SwfDislParamFoundType - class(SwfDislType) :: this - type(SwfDislParamFoundType), intent(in) :: found + class(Disv1dType) :: this + type(DisFoundType), intent(in) :: found write (this%iout, '(1x,a)') 'Setting Discretization Griddata' - if (found%reach_length) then - write (this%iout, '(4x,a)') 'REACH_LENGTH set from input file' - end if - - if (found%reach_width) then - write (this%iout, '(4x,a)') 'REACH_WIDTH set from input file' + if (found%length) then + write (this%iout, '(4x,a)') 'LENGTH set from input file' end if - if (found%reach_bottom) then - write (this%iout, '(4x,a)') 'REACH_BOTTOM set from input file' + if (found%width) then + write (this%iout, '(4x,a)') 'WIDTH set from input file' end if - if (found%toreach) then - write (this%iout, '(4x,a)') 'TOREACH set from input file' + if (found%bottom) then + write (this%iout, '(4x,a)') 'BOTTOM set from input file' end if if (found%idomain) then @@ -462,30 +446,26 @@ subroutine source_vertices(this) use MemoryManagerExtModule, only: mem_set_value use SimVariablesModule, only: idm_context ! -- dummy - class(SwfDislType) :: this + class(Disv1dType) :: this ! -- local integer(I4B) :: i character(len=LENMEMPATH) :: idmMemoryPath real(DP), dimension(:), contiguous, pointer :: vert_x => null() real(DP), dimension(:), contiguous, pointer :: vert_y => null() - real(DP), dimension(:), contiguous, pointer :: vert_z => null() ! -- formats ! ! -- set memory path - idmMemoryPath = create_mem_path(this%name_model, 'DISL', idm_context) + idmMemoryPath = create_mem_path(this%name_model, 'DISV1D', idm_context) ! ! -- set pointers to memory manager input arrays call mem_setptr(vert_x, 'XV', idmMemoryPath) call mem_setptr(vert_y, 'YV', idmMemoryPath) - call mem_setptr(vert_z, 'ZV', idmMemoryPath) ! ! -- set vertices 3d array - if (associated(vert_x) .and. associated(vert_y) .and. & - associated(vert_z)) then + if (associated(vert_x) .and. associated(vert_y)) then do i = 1, this%nvert this%vertices(1, i) = vert_x(i) this%vertices(2, i) = vert_y(i) - this%vertices(3, i) = vert_z(i) end do else call store_error('Required Vertex arrays not found.') @@ -511,7 +491,7 @@ subroutine source_cell2d(this) use MemoryManagerExtModule, only: mem_set_value use SimVariablesModule, only: idm_context ! -- dummy - class(SwfDislType) :: this + class(Disv1dType) :: this ! -- locals character(len=LENMEMPATH) :: idmMemoryPath integer(I4B), dimension(:), contiguous, pointer :: icell2d => null() @@ -522,7 +502,7 @@ subroutine source_cell2d(this) ! -- formats ! ! -- set memory path - idmMemoryPath = create_mem_path(this%name_model, 'DISL', idm_context) + idmMemoryPath = create_mem_path(this%name_model, 'DISV1D', idm_context) ! ! -- set pointers to input path ncvert and icvert call mem_setptr(icell2d, 'ICELL2D', idmMemoryPath) @@ -545,8 +525,8 @@ subroutine source_cell2d(this) do i = 1, this%nodesuser this%fdc(i) = fdc(i) end do - call calculate_cellxyz(this%vertices, this%fdc, this%iavert, & - this%javert, this%cellxyz) + call calculate_cellxy(this%vertices, this%fdc, this%iavert, & + this%javert, this%cellxy) else call store_error('Required fdc array not found.') end if @@ -569,7 +549,7 @@ subroutine define_cellverts(this, icell2d, ncvert, icvert) ! -- modules use SparseModule, only: sparsematrix ! -- dummy - class(SwfDislType) :: this + class(Disv1dType) :: this integer(I4B), dimension(:), contiguous, pointer, intent(in) :: icell2d integer(I4B), dimension(:), contiguous, pointer, intent(in) :: ncvert integer(I4B), dimension(:), contiguous, pointer, intent(in) :: icvert @@ -604,23 +584,23 @@ subroutine define_cellverts(this, icell2d, ncvert, icvert) return end subroutine define_cellverts - !> @brief Calculate x, y, z coordinates of reach midpoint + !> @brief Calculate x, y, coordinates of reach midpoint !< - subroutine calculate_cellxyz(vertices, fdc, iavert, javert, cellxyz) + subroutine calculate_cellxy(vertices, fdc, iavert, javert, cellxy) ! -- dummy - real(DP), dimension(:, :), intent(in) :: vertices !< 2d array of vertices with x, y, and z as columns + real(DP), dimension(:, :), intent(in) :: vertices !< 2d array of vertices with x, y as columns real(DP), dimension(:), intent(in) :: fdc !< fractional distance to reach midpoint (normally 0.5) integer(I4B), dimension(:), intent(in) :: iavert !< csr mapping of vertices to cell reaches integer(I4B), dimension(:), intent(in) :: javert !< csr mapping of vertices to cell reaches - real(DP), dimension(:, :), intent(inout) :: cellxyz !< 2d array of reach midpoint with x, y, and z as columns + real(DP), dimension(:, :), intent(inout) :: cellxy !< 2d array of reach midpoint with x, y as columns ! -- local integer(I4B) :: nodes !< number of nodes integer(I4B) :: n !< node index integer(I4B) :: j !< vertex index integer(I4B) :: iv0 !< index for line reach start integer(I4B) :: iv1 !< index for linen reach end - integer(I4B) :: ixyz !< x, y, z column index - real(DP) :: reach_length !< reach length = sum of individual line reaches + integer(I4B) :: ixy !< x, y column index + real(DP) :: length !< reach length = sum of individual line reaches real(DP) :: fd0 !< fractional distance to start of this line reach real(DP) :: fd1 !< fractional distance to end fo this line reach real(DP) :: fd !< fractional distance where midpoint (defined by fdc) is located @@ -630,10 +610,10 @@ subroutine calculate_cellxyz(vertices, fdc, iavert, javert, cellxyz) do n = 1, nodes ! calculate length of this reach - reach_length = DZERO + length = DZERO do j = iavert(n), iavert(n + 1) - 2 - reach_length = reach_length + & - calcdist(vertices, javert(j), javert(j + 1)) + length = length + & + calcdist(vertices, javert(j), javert(j + 1)) end do ! find vertices that span midpoint @@ -642,7 +622,7 @@ subroutine calculate_cellxyz(vertices, fdc, iavert, javert, cellxyz) fd0 = DZERO do j = iavert(n), iavert(n + 1) - 2 d = calcdist(vertices, javert(j), javert(j + 1)) - fd1 = fd0 + d / reach_length + fd1 = fd0 + d / length ! if true, then we know the midpoint is some fractional distance (fd) ! from vertex j to vertex j + 1 @@ -655,14 +635,14 @@ subroutine calculate_cellxyz(vertices, fdc, iavert, javert, cellxyz) fd0 = fd1 end do - ! find x, y, z position of point on line - do ixyz = 1, 3 - cellxyz(ixyz, n) = (DONE - fd) * vertices(ixyz, iv0) + & - fd * vertices(ixyz, iv1) + ! find x, y position of point on line + do ixy = 1, 3 + cellxy(ixy, n) = (DONE - fd) * vertices(ixy, iv0) + & + fd * vertices(ixy, iv1) end do end do - end subroutine calculate_cellxyz + end subroutine calculate_cellxy !> @brief Finalize grid construction !< @@ -671,7 +651,7 @@ subroutine grid_finalize(this) use SimModule, only: ustop, count_errors, store_error use ConstantsModule, only: LINELENGTH, DZERO, DONE ! dummy - class(SwfDislType) :: this + class(Disv1dType) :: this ! local integer(I4B) :: node, noder, k @@ -730,14 +710,14 @@ subroutine grid_finalize(this) end do end if - ! Copy reach_bottom into bot + ! Copy bottom into bot do node = 1, this%nodesuser - this%bot(node) = this%reach_bottom(node) + this%bot(node) = this%bottom(node) end do - ! Assign area in DisBaseType as reach_length + ! Assign area in DisBaseType as length do node = 1, this%nodesuser - this%area(node) = this%reach_length(node) + this%area(node) = this%length(node) end do ! -- Return @@ -748,7 +728,7 @@ subroutine allocate_arrays(this) ! -- modules use MemoryManagerModule, only: mem_allocate ! -- dummy - class(SwfDislType) :: this + class(Disv1dType) :: this ! ! -- Allocate arrays in DisBaseType (mshape, top, bot, area) ! todo: disbasetype will have memory allocated for unneeded arrays @@ -774,7 +754,7 @@ end subroutine allocate_arrays subroutine create_connections(this) ! -- modules ! -- dummy - class(SwfDislType) :: this + class(Disv1dType) :: this ! -- local integer(I4B) :: nrsize ! @@ -785,28 +765,17 @@ subroutine create_connections(this) ! -- Allocate connections object allocate (this%con) ! - ! -- Create connectivity - if (this%toreachConnectivity) then - ! -- build connectivity based on toreach - call this%con%dislconnections(this%name_model, this%toreach, & - this%reach_length) - else - ! -- build connectivity based on vertices - call this%con%dislconnections_verts(this%name_model, this%nodes, & + ! Build connectivity based on vertices + call this%con%disv1dconnections_verts(this%name_model, this%nodes, & this%nodesuser, nrsize, this%nvert, & this%vertices, this%iavert, & - this%javert, this%cellxyz, this%fdc, & + this%javert, this%cellxy, this%fdc, & this%nodereduced, this%nodeuser, & - this%reach_length) - end if + this%length) this%nja = this%con%nja this%njas = this%con%njas - ! - ! - ! -- return - return end subroutine create_connections !> @brief Write binary grid file @@ -816,7 +785,7 @@ subroutine write_grb(this, icelltype) use InputOutputModule, only: getunit, openfile use OpenSpecModule, only: access, form ! -- dummy - class(SwfDislType) :: this + class(Disv1dType) :: this integer(I4B), dimension(:), intent(in) :: icelltype ! -- local integer(I4B) :: i, iunit, ntxt @@ -830,7 +799,7 @@ subroutine write_grb(this, icelltype) ! ! -- Initialize ntxt = 9 - if (this%nvert > 0) ntxt = ntxt + 6 + if (this%nvert > 0) ntxt = ntxt + 5 ! ! -- Open the file fname = trim(this%input_fname)//'.grb' @@ -840,7 +809,7 @@ subroutine write_grb(this, icelltype) form, access, 'REPLACE') ! ! -- write header information - write (txthdr, '(a)') 'GRID DISL' + write (txthdr, '(a)') 'GRID DISV1D' txthdr(50:50) = new_line('a') write (iunit) txthdr write (txthdr, '(a)') 'VERSION 1' @@ -884,7 +853,7 @@ subroutine write_grb(this, icelltype) ! ! -- if vertices have been read then write additional header information if (this%nvert > 0) then - write (txt, '(3a, i0)') 'VERTICES ', 'DOUBLE ', 'NDIM 2 3 ', this%nvert + write (txt, '(3a, i0)') 'VERTICES ', 'DOUBLE ', 'NDIM 2 2 ', this%nvert txt(lentxt:lentxt) = new_line('a') write (iunit) txt write (txt, '(3a, i0)') 'CELLX ', 'DOUBLE ', 'NDIM 1 ', this%nodesuser @@ -893,9 +862,6 @@ subroutine write_grb(this, icelltype) write (txt, '(3a, i0)') 'CELLY ', 'DOUBLE ', 'NDIM 1 ', this%nodesuser txt(lentxt:lentxt) = new_line('a') write (iunit) txt - write (txt, '(3a, i0)') 'CELLZ ', 'DOUBLE ', 'NDIM 1 ', this%nodesuser - txt(lentxt:lentxt) = new_line('a') - write (iunit) txt write (txt, '(3a, i0)') 'IAVERT ', 'INTEGER ', 'NDIM 1 ', this%nodesuser + 1 txt(lentxt:lentxt) = new_line('a') write (iunit) txt @@ -918,9 +884,8 @@ subroutine write_grb(this, icelltype) ! -- if vertices have been read then write additional data if (this%nvert > 0) then write (iunit) this%vertices ! vertices - write (iunit) (this%cellxyz(1, i), i=1, this%nodesuser) ! cellx - write (iunit) (this%cellxyz(2, i), i=1, this%nodesuser) ! celly - write (iunit) (this%cellxyz(3, i), i=1, this%nodesuser) ! cellz + write (iunit) (this%cellxy(1, i), i=1, this%nodesuser) ! cellx + write (iunit) (this%cellxy(2, i), i=1, this%nodesuser) ! celly write (iunit) this%iavert ! iavert write (iunit) this%javert ! javert end if @@ -938,7 +903,7 @@ end subroutine write_grb !! child classes to perform mapping to a model node number !< function get_nodenumber_idx1(this, nodeu, icheck) result(nodenumber) - class(SwfDislType), intent(in) :: this + class(Disv1dType), intent(in) :: this integer(I4B), intent(in) :: nodeu integer(I4B), intent(in) :: icheck integer(I4B) :: nodenumber @@ -964,7 +929,7 @@ end function get_nodenumber_idx1 subroutine nodeu_to_string(this, nodeu, str) ! -- dummy - class(SwfDislType) :: this + class(Disv1dType) :: this integer(I4B), intent(in) :: nodeu character(len=*), intent(inout) :: str ! -- local @@ -987,7 +952,7 @@ end subroutine nodeu_to_string function nodeu_from_string(this, lloc, istart, istop, in, iout, line, & flag_string, allow_zero) result(nodeu) ! -- dummy - class(SwfDislType) :: this + class(Disv1dType) :: this integer(I4B), intent(inout) :: lloc integer(I4B), intent(inout) :: istart integer(I4B), intent(inout) :: istop @@ -1039,39 +1004,36 @@ function nodeu_from_string(this, lloc, istart, istop, in, iout, line, & end function nodeu_from_string - subroutine disl_da(this) + subroutine disv1d_da(this) ! -- modules use MemoryManagerModule, only: mem_deallocate use MemoryManagerExtModule, only: memorylist_remove use SimVariablesModule, only: idm_context ! -- dummy - class(SwfDislType) :: this + class(Disv1dType) :: this ! -- local logical(LGP) :: deallocate_vertices ! ! -- Deallocate idm memory - call memorylist_remove(this%name_model, 'DISL', idm_context) + call memorylist_remove(this%name_model, 'DISV1D', idm_context) ! ! -- scalars deallocate_vertices = (this%nvert > 0) call mem_deallocate(this%nvert) - call mem_deallocate(this%convlength) - call mem_deallocate(this%convtime) ! ! -- arrays call mem_deallocate(this%nodeuser) call mem_deallocate(this%nodereduced) - call mem_deallocate(this%reach_length) - call mem_deallocate(this%reach_width) - call mem_deallocate(this%reach_bottom) - call mem_deallocate(this%toreach) + call mem_deallocate(this%length) + call mem_deallocate(this%width) + call mem_deallocate(this%bottom) call mem_deallocate(this%idomain) ! ! -- cdl hack for arrays for vertices and cell2d blocks if (deallocate_vertices) then call mem_deallocate(this%vertices) call mem_deallocate(this%fdc) - call mem_deallocate(this%cellxyz) + call mem_deallocate(this%cellxy) call mem_deallocate(this%iavert) call mem_deallocate(this%javert) end if @@ -1081,7 +1043,7 @@ subroutine disl_da(this) ! ! -- Return return - end subroutine disl_da + end subroutine disv1d_da !> @brief Record a double precision array !! @@ -1095,7 +1057,7 @@ subroutine record_array(this, darray, iout, iprint, idataun, aname, & use TdisModule, only: kstp, kper, pertim, totim, delt use InputOutputModule, only: ulasav, ulaprufw, ubdsv1 ! -- dummy - class(SwfDislType), intent(inout) :: this + class(Disv1dType), intent(inout) :: this real(DP), dimension(:), pointer, contiguous, intent(inout) :: darray !< double precision array to record integer(I4B), intent(in) :: iout !< unit number for ascii output integer(I4B), intent(in) :: iprint !< flag indicating whether or not to print the array @@ -1189,7 +1151,7 @@ subroutine record_srcdst_list_header(this, text, textmodel, textpackage, & use TdisModule, only: kstp, kper, pertim, totim, delt use InputOutputModule, only: ubdsv06 ! -- dummy - class(SwfDislType) :: this + class(Disv1dType) :: this character(len=16), intent(in) :: text character(len=16), intent(in) :: textmodel character(len=16), intent(in) :: textpackage @@ -1224,17 +1186,17 @@ end subroutine record_srcdst_list_header !< width for each cell. subroutine get_flow_width(this, n, m, idx_conn, width_n, width_m) ! dummy - class(SwfDislType) :: this + class(Disv1dType) :: this integer(I4B), intent(in) :: n !< cell node number integer(I4B), intent(in) :: m !< cell node number integer(I4B), intent(in) :: idx_conn !< connection index real(DP), intent(out) :: width_n !< flow width for cell n real(DP), intent(out) :: width_m !< flow width for cell m - ! For disl case, width_n and width_m can be different - width_n = this%reach_width(n) - width_m = this%reach_width(m) + ! For disv1d case, width_n and width_m can be different + width_n = this%width(n) + width_m = this%width(m) end subroutine get_flow_width -end module SwfDislModule +end module Disv1dModule diff --git a/src/Model/ModelUtilities/Connections.f90 b/src/Model/ModelUtilities/Connections.f90 index f865d0373b2..350f209531c 100644 --- a/src/Model/ModelUtilities/Connections.f90 +++ b/src/Model/ModelUtilities/Connections.f90 @@ -48,8 +48,7 @@ module ConnectionsModule procedure :: disconnections procedure :: disvconnections procedure :: disuconnections - procedure :: dislconnections - procedure :: dislconnections_verts + procedure :: disv1dconnections_verts procedure :: iajausr procedure :: getjaindex procedure :: set_mask @@ -953,80 +952,17 @@ subroutine disuconnections(this, name_model, nodes, nodesuser, nrsize, & return end subroutine disuconnections - !> @brief procedure to fill the connections object for a disl package + !> @brief Fill the connections object for a disv1d package from vertices !! !! todo: Still need to handle hwva - !! todo: Only unreduced disl grids are allowed at the moment + !! todo: Only unreduced disv1d grids are allowed at the moment !! !< - subroutine dislconnections(this, name_model, toreach, reach_length) - ! -- modules - use MemoryManagerModule, only: mem_deallocate, mem_setptr - use SparseModule, only: sparsematrix - ! -- dummy - class(ConnectionsType) :: this !< object - character(len=*), intent(in) :: name_model !< name of model - integer(I4B), dimension(:), intent(in) :: toreach !< dowstream reach number - real(DP), dimension(:), intent(in) :: reach_length !< length of each reach - ! -- local - type(sparsematrix) :: sparse - integer(I4B) :: ierror - - ! Allocate scalars - call this%allocate_scalars(name_model) - - ! Set scalars - this%nodes = size(toreach) - this%ianglex = 0 - - ! Create sparse matrix object using toreach - ! and fill ia and ja - call sparse_from_toreach(toreach, sparse) - this%nja = sparse%nnz - this%njas = (this%nja - this%nodes) / 2 - - ! Allocate index arrays of size nja and symmetric arrays - call this%allocate_arrays() - - ! Fill the IA and JA arrays from sparse, then destroy sparse - call sparse%sort() - call sparse%filliaja(this%ia, this%ja, ierror) - call sparse%destroy() - - ! Fill the isym and jas arrays - call fillisym(this%nodes, this%nja, this%ia, this%ja, this%isym) - call filljas(this%nodes, this%nja, this%ia, this%ja, this%isym, this%jas) - - ! Fill disl symmetric arrays - call fill_disl_symarrays(this%ia, this%ja, this%jas, reach_length, & - this%ihc, this%cl1, this%cl2) - - ! If reduced system, then need to build iausr and jausr, otherwise point - ! them to ia and ja. - ! TODO: not handled yet for reduced system - !this%iausr => this%ia - !this%jausr => this%ja - !call this%iajausr(nrsize, nodesuser, nodereduced, nodeuser) - ! -- iausr and jausr will be pointers - call mem_deallocate(this%iausr) - call mem_deallocate(this%jausr) - call mem_setptr(this%iausr, 'IA', this%memoryPath) - call mem_setptr(this%jausr, 'JA', this%memoryPath) - - return - end subroutine dislconnections - - !> @brief Fill the connections object for a disl package from vertices - !! - !! todo: Still need to handle hwva - !! todo: Only unreduced disl grids are allowed at the moment - !! - !< - subroutine dislconnections_verts(this, name_model, nodes, nodesuser, & - nrsize, nvert, & - vertices, iavert, javert, & - cellxyz, cellfdc, nodereduced, nodeuser, & - reach_length) + subroutine disv1dconnections_verts(this, name_model, nodes, nodesuser, & + nrsize, nvert, & + vertices, iavert, javert, & + cellxyz, cellfdc, nodereduced, nodeuser, & + reach_length) ! -- modules use ConstantsModule, only: DHALF, DZERO, DTHREE, DTWO, DPI use SparseModule, only: sparsematrix @@ -1106,10 +1042,10 @@ subroutine dislconnections_verts(this, name_model, nodes, nodesuser, & call fillisym(this%nodes, this%nja, this%ia, this%ja, this%isym) call filljas(this%nodes, this%nja, this%ia, this%ja, this%isym, this%jas) - ! Fill disl symmetric arrays + ! Fill disv1d symmetric arrays ! todo: need to handle cell center shifted from center of reach - call fill_disl_symarrays(this%ia, this%ja, this%jas, reach_length, & - this%ihc, this%cl1, this%cl2) + call fill_disv1d_symarrays(this%ia, this%ja, this%jas, reach_length, & + this%ihc, this%cl1, this%cl2) ! ! -- Fill symmetric discretization arrays (ihc,cl1,cl2,hwva,anglex) @@ -1129,45 +1065,11 @@ subroutine dislconnections_verts(this, name_model, nodes, nodesuser, & ! ! -- Return return - end subroutine dislconnections_verts - - !> @brief Using toreach, fill the sparse object - !< - subroutine sparse_from_toreach(toreach, spm) - ! -- modules - use SparseModule, only: sparsematrix - ! -- dummy - integer(I4B), dimension(:), contiguous :: toreach - type(sparsematrix), intent(inout) :: spm - ! -- local - integer(I4B) :: nodes - integer(I4B) :: n - integer(I4B) :: j - - nodes = size(toreach) - call spm%init(nodes, nodes, 3) - ! - ! -- insert diagonal so it stays in front - do n = 1, size(toreach) - call spm%addconnection(n, n, 1) - end do - ! - ! -- add toreach connections for non-zero - ! reaches (0 indicates no downstream reach) - do n = 1, size(toreach) - j = toreach(n) - if (j > 0) then - call spm%addconnection(n, j, 1) - call spm%addconnection(j, n, 1) - end if - end do - - return - end subroutine sparse_from_toreach + end subroutine disv1dconnections_verts - !> @brief Fill symmetric connection arrays for disl + !> @brief Fill symmetric connection arrays for disv1d !< - subroutine fill_disl_symarrays(ia, ja, jas, reach_length, ihc, cl1, cl2) + subroutine fill_disv1d_symarrays(ia, ja, jas, reach_length, ihc, cl1, cl2) ! dummy integer(I4B), dimension(:), intent(in) :: ia !< csr pointer array integer(I4B), dimension(:), intent(in) :: ja !< csr array @@ -1193,7 +1095,7 @@ subroutine fill_disl_symarrays(ia, ja, jas, reach_length, ihc, cl1, cl2) cl2(isympos) = DHALF * reach_length(m) end do end do - end subroutine fill_disl_symarrays + end subroutine fill_disv1d_symarrays !> @brief Fill iausr and jausr if reduced grid, otherwise point them to ia !! and ja. diff --git a/src/Model/ModelUtilities/DislGeom.f90 b/src/Model/ModelUtilities/Disv1dGeom.f90 similarity index 54% rename from src/Model/ModelUtilities/DislGeom.f90 rename to src/Model/ModelUtilities/Disv1dGeom.f90 index 9c5fca3ba46..aa64167fd76 100644 --- a/src/Model/ModelUtilities/DislGeom.f90 +++ b/src/Model/ModelUtilities/Disv1dGeom.f90 @@ -1,4 +1,4 @@ -module DislGeom +module Disv1dGeom use KindModule, only: DP, I4B implicit none @@ -9,19 +9,18 @@ module DislGeom !> @brief Calculate distance bewteen two vertices !< - function calcdist(vertices, vert1, vert2) result(dist) + function calcdist(vertices, ivert1, ivert2) result(dist) ! -- dummy real(DP), dimension(:, :), intent(in) :: vertices - integer(I4B), intent(in) :: vert1 - integer(I4B), intent(in) :: vert2 - real(DP) :: dist, xdist, ydist, zdist + integer(I4B), intent(in) :: ivert1 + integer(I4B), intent(in) :: ivert2 + real(DP) :: dist, xdist, ydist ! -- local ! ! -- calc distance - xdist = abs(vertices(1, vert1) - vertices(1, vert2)) - ydist = abs(vertices(2, vert1) - vertices(2, vert2)) - zdist = abs(vertices(3, vert1) - vertices(3, vert2)) - dist = sqrt(xdist * xdist + ydist * ydist + zdist * zdist) + xdist = abs(vertices(1, ivert1) - vertices(1, ivert2)) + ydist = abs(vertices(2, ivert1) - vertices(2, ivert2)) + dist = sqrt(xdist * xdist + ydist * ydist) ! -- return return @@ -34,27 +33,22 @@ end function calcdist !! return the magnitude of the original vector, vmag. !! !< - subroutine line_unit_vector(x0, y0, z0, x1, y1, z1, & - xcomp, ycomp, zcomp, vmag) + subroutine line_unit_vector(x0, y0, x1, y1, & + xcomp, ycomp, vmag) real(DP), intent(in) :: x0 real(DP), intent(in) :: y0 - real(DP), intent(in) :: z0 real(DP), intent(in) :: x1 real(DP), intent(in) :: y1 - real(DP), intent(in) :: z1 real(DP), intent(out) :: xcomp real(DP), intent(out) :: ycomp - real(DP), intent(out) :: zcomp - real(DP) :: dx, dy, dz, vmag + real(DP) :: dx, dy, vmag ! dx = x1 - x0 dy = y1 - y0 - dz = z1 - z0 - vmag = sqrt(dx**2 + dy**2 + dz**2) + vmag = sqrt(dx**2 + dy**2) xcomp = dx / vmag ycomp = dy / vmag - zcomp = dz / vmag return end subroutine line_unit_vector -end module DislGeom +end module Disv1dGeom diff --git a/src/Model/SurfaceWaterFlow/swf-cdb.f90 b/src/Model/SurfaceWaterFlow/swf-cdb.f90 index 10d69a71020..fff076a427b 100644 --- a/src/Model/SurfaceWaterFlow/swf-cdb.f90 +++ b/src/Model/SurfaceWaterFlow/swf-cdb.f90 @@ -23,7 +23,7 @@ module SwfCdbModule use InputOutputModule, only: GetUnit, openfile use MatrixBaseModule use BaseDisModule, only: DisBaseType - use SwfDislModule, only: SwfDislType + use Disv1dModule, only: Disv1dType use SwfCxsModule, only: SwfCxsType ! implicit none @@ -41,7 +41,7 @@ module SwfCdbModule real(DP), pointer :: gravconv => null() !< conversion factor gravity in m/s^2 to model units ! -- pointers other objects - type(SwfDislType), pointer :: disl + type(Disv1dType), pointer :: disv1d type(SwfCxsType), pointer :: cxs contains @@ -112,10 +112,10 @@ subroutine cdb_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, & packobj%iscloc = 1 packobj%ictMemPath = create_mem_path(namemodel, 'DFW') ! - ! -- store pointer to disl + ! -- store pointer to disv1d select type (dis) - type is (SwfDislType) - cdbobj%disl => dis + type is (Disv1dType) + cdbobj%disv1d => dis end select ! ! -- store pointer to cxs diff --git a/src/Model/SurfaceWaterFlow/swf-sto.f90 b/src/Model/SurfaceWaterFlow/swf-sto.f90 index 9c02b563ac5..91b807a3694 100644 --- a/src/Model/SurfaceWaterFlow/swf-sto.f90 +++ b/src/Model/SurfaceWaterFlow/swf-sto.f90 @@ -17,7 +17,7 @@ module SwfStoModule use BlockParserModule, only: BlockParserType use InputOutputModule, only: GetUnit, openfile use MatrixBaseModule - use SwfDislModule, only: SwfDislType + use Disv1dModule, only: Disv1dType use SwfCxsModule, only: SwfCxsType implicit none @@ -269,7 +269,7 @@ subroutine sto_fc(this, kiter, stage_old, stage_new, matrix_sln, idxglo, rhs) end if call this%dis%get_dis_type(distype) - if (distype == 'DISL') then + if (distype == 'DISV1D') then call this%sto_fc_dis1d(kiter, stage_old, stage_new, matrix_sln, idxglo, rhs) else call this%sto_fc_dis2d(kiter, stage_old, stage_new, matrix_sln, idxglo, rhs) @@ -749,8 +749,8 @@ function reach_length_pointer(this) result(ptr) ptr => null() dis => this%dis select type (dis) - type is (SwfDislType) - ptr => dis%reach_length + type is (Disv1dType) + ptr => dis%length end select end function reach_length_pointer diff --git a/src/Model/SurfaceWaterFlow/swf-zdg.f90 b/src/Model/SurfaceWaterFlow/swf-zdg.f90 index bda1f70580c..fc053d2d7ca 100644 --- a/src/Model/SurfaceWaterFlow/swf-zdg.f90 +++ b/src/Model/SurfaceWaterFlow/swf-zdg.f90 @@ -23,7 +23,7 @@ module SwfZdgModule use InputOutputModule, only: GetUnit, openfile use MatrixBaseModule use BaseDisModule, only: DisBaseType - use SwfDislModule, only: SwfDislType + use Disv1dModule, only: Disv1dType use SwfCxsModule, only: SwfCxsType ! implicit none @@ -43,7 +43,7 @@ module SwfZdgModule real(DP), pointer :: unitconv => null() !< conversion factor for roughness to length and time units of meters and seconds ! -- pointers other objects - type(SwfDislType), pointer :: disl + type(Disv1dType), pointer :: disv1d type(SwfCxsType), pointer :: cxs contains @@ -113,10 +113,10 @@ subroutine zdg_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, & packobj%iscloc = 1 packobj%ictMemPath = create_mem_path(namemodel, 'DFW') ! - ! -- store pointer to disl + ! -- store pointer to disv1d select type (dis) - type is (SwfDislType) - zdgobj%disl => dis + type is (Disv1dType) + zdgobj%disv1d => dis end select ! ! -- store pointer to cxs diff --git a/src/Model/SurfaceWaterFlow/swf.f90 b/src/Model/SurfaceWaterFlow/swf.f90 index bb8a60202c0..75ade14ed92 100644 --- a/src/Model/SurfaceWaterFlow/swf.f90 +++ b/src/Model/SurfaceWaterFlow/swf.f90 @@ -6,7 +6,7 @@ !! Status and remaining tasks !! ONGOING -- Implement SWF infrastructure !! DONE -- Implement Explicit Model Solution (EMS6) to handle explicit models -!! DONE -- Implement DISL Package +!! DONE -- Implement DISV1D Package !! DONE -- Implement FLW Package to handle lateral and point inflows !! DONE -- Transfer results into the flowja vector !! DONE -- Implement strategy for storing outflow terms and getting them into budget @@ -27,7 +27,7 @@ !! We may need subcells and subtiming to improve accuracy !! Add support for nonlinear Muskingum Cunge !! Deal with the timestep and subtiming issues -!! Flopy support for DISL and DISL binary grid file +!! Flopy support for DISV1D and DISV1D binary grid file !! Flopy support for .output() method for SWF !! Mover support? !! SWF-SWF Exchange @@ -116,7 +116,7 @@ module SwfModule !< integer(I4B), parameter :: SWF_NBASEPKG = 9 character(len=LENPACKAGETYPE), dimension(SWF_NBASEPKG) :: & - SWF_BASEPKG = ['DISL6 ', 'DIS2D6 ', 'DISV6 ', & + SWF_BASEPKG = ['DISV1D6', 'DIS2D6 ', 'DISV6 ', & 'DFW6 ', 'CXS6 ', 'OC6 ', & 'IC6 ', 'OBS6 ', 'STO6 '] @@ -1042,7 +1042,7 @@ subroutine ftype_check(this, indis) ! -- Check for required packages. Stop if not present. if (indis == 0) then write (errmsg, '(a)') & - 'Discretization Package (DISL6 or DIS2D6) not specified.' + 'Discretization Package (DISV1D6 or DIS2D6) not specified.' call store_error(errmsg) end if if (this%inic == 0 .and. this%indfw /= 0) then @@ -1133,7 +1133,7 @@ subroutine create_packages(this) use MemoryManagerModule, only: mem_setptr use MemoryHelperModule, only: create_mem_path use SimVariablesModule, only: idm_context - use SwfDislModule, only: disl_cr + use Disv1dModule, only: disv1d_cr use Dis2dModule, only: dis2d_cr use DisvModule, only: disv_cr use SwfDfWModule, only: dfw_cr @@ -1183,9 +1183,9 @@ subroutine create_packages(this) ! ! -- create dis package as it is a prerequisite for other packages select case (pkgtype) - case ('DISL6') + case ('DISV1D6') indis = 1 - call disl_cr(this%dis, this%name, mempath, indis, this%iout) + call disv1d_cr(this%dis, this%name, mempath, indis, this%iout) case ('DIS2D6') indis = 1 call dis2d_cr(this%dis, this%name, mempath, indis, this%iout) diff --git a/src/Utilities/Idm/SourceCommon.f90 b/src/Utilities/Idm/SourceCommon.f90 index 2e63d7457aa..ad8ecc29268 100644 --- a/src/Utilities/Idm/SourceCommon.f90 +++ b/src/Utilities/Idm/SourceCommon.f90 @@ -333,7 +333,7 @@ subroutine set_model_shape(ftype, fname, model_mempath, dis_mempath, & else call store_error_filename(fname) end if - case ('DISU6', 'DISL6') + case ('DISU6', 'DISV1D6') ! call get_isize('NODES', dis_mempath, dim1_size) ! diff --git a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 index 60f1e82f8e1..d1a682b06bf 100644 --- a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 +++ b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 @@ -269,7 +269,7 @@ recursive subroutine parse_block(this, iblk, recursive_call) ! ! -- disu vertices/cell2d blocks are contingent on NVERT dimension if (this%mf6_input%pkgtype == 'DISU6' .or. & - this%mf6_input%pkgtype == 'DISL6') then + this%mf6_input%pkgtype == 'DISV1D6') then if (this%mf6_input%block_dfns(iblk)%blockname == 'VERTICES' .or. & this%mf6_input%block_dfns(iblk)%blockname == 'CELL2D') then call get_from_memorylist('NVERT', this%mf6_input%mempath, mt, found, & diff --git a/src/meson.build b/src/meson.build index 763246d0761..11f328c6ebb 100644 --- a/src/meson.build +++ b/src/meson.build @@ -75,7 +75,7 @@ modflow_sources = files( 'Idm' / 'gwt-dspidm.f90', 'Idm' / 'gwt-icidm.f90', 'Idm' / 'gwt-namidm.f90', - 'Idm' / 'swf-dislidm.f90', + 'Idm' / 'swf-disv1didm.f90', 'Idm' / 'swf-dis2didm.f90', 'Idm' / 'swf-disvidm.f90', 'Idm' / 'swf-namidm.f90', @@ -117,6 +117,7 @@ modflow_sources = files( 'Model' / 'Discretization' / 'Dis2d.f90', 'Model' / 'Discretization' / 'Disu.f90', 'Model' / 'Discretization' / 'Disv.f90', + 'Model' / 'Discretization' / 'Disv1d.f90', 'Model' / 'Geometry' / 'BaseGeometry.f90', 'Model' / 'Geometry' / 'CircularGeometry.f90', 'Model' / 'Geometry' / 'RectangularGeometry.f90', @@ -166,7 +167,6 @@ modflow_sources = files( 'Model' / 'GroundWaterTransport' / 'gwt-src.f90', 'Model' / 'GroundWaterTransport' / 'gwt-uzt.f90', 'Model' / 'SurfaceWaterFlow' / 'swf.f90', - 'Model' / 'SurfaceWaterFlow' / 'swf-disl.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-cxs.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-dfw.f90', 'Model' / 'SurfaceWaterFlow' / 'swf-ic.f90', @@ -188,7 +188,7 @@ modflow_sources = files( 'Model' / 'ModelUtilities' / 'Connections.f90', 'Model' / 'ModelUtilities' / 'DiscretizationBase.f90', 'Model' / 'ModelUtilities' / 'DisvGeom.f90', - 'Model' / 'ModelUtilities' / 'DislGeom.f90', + 'Model' / 'ModelUtilities' / 'Disv1dGeom.f90', 'Model' / 'ModelUtilities' / 'FlowModelInterface.f90', 'Model' / 'ModelUtilities' / 'GweInputData.f90', 'Model' / 'ModelUtilities' / 'GwfBuyInputData.f90', diff --git a/utils/idmloader/dfns.txt b/utils/idmloader/dfns.txt index 7ae3c44ad4d..c1545782f1e 100644 --- a/utils/idmloader/dfns.txt +++ b/utils/idmloader/dfns.txt @@ -43,7 +43,7 @@ gwe-dis.dfn # swf model swf-nam.dfn -swf-disl.dfn +swf-disv1d.dfn swf-dis2d.dfn swf-disv.dfn swf-cxs.dfn From 02052a9c2eb111e7d4b501db2cf030212e1657c9 Mon Sep 17 00:00:00 2001 From: mjreno Date: Wed, 3 Apr 2024 09:16:42 -0400 Subject: [PATCH 081/199] feat(input): add package export option for layered input parameters (#1557) * add echo file option for layered input params * some naming adjustments * use per package export option to control writing variable layer array files * restore mf6ivar.py * silently create export files * post rebase definition update * add release note for export files --------- Co-authored-by: mjreno Co-authored-by: mjreno --- doc/ReleaseNotes/develop.tex | 2 +- doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn | 9 + doc/mf6io/mf6ivar/dfn/gwe-dis.dfn | 8 + doc/mf6io/mf6ivar/dfn/gwe-disv.dfn | 9 + doc/mf6io/mf6ivar/dfn/gwe-ic.dfn | 11 + doc/mf6io/mf6ivar/dfn/gwf-dis.dfn | 8 + doc/mf6io/mf6ivar/dfn/gwf-disv.dfn | 9 + doc/mf6io/mf6ivar/dfn/gwf-ic.dfn | 11 + doc/mf6io/mf6ivar/dfn/gwf-npf.dfn | 9 + doc/mf6io/mf6ivar/dfn/gwt-dis.dfn | 8 + doc/mf6io/mf6ivar/dfn/gwt-disv.dfn | 9 + doc/mf6io/mf6ivar/dfn/gwt-dsp.dfn | 9 + doc/mf6io/mf6ivar/dfn/gwt-ic.dfn | 11 + doc/mf6io/mf6ivar/dfn/prt-dis.dfn | 8 + doc/mf6io/mf6ivar/dfn/prt-disv.dfn | 9 + doc/mf6io/mf6ivar/dfn/prt-mip.dfn | 9 + doc/mf6io/mf6ivar/dfn/swf-dis2d.dfn | 8 + doc/mf6io/mf6ivar/dfn/swf-disv.dfn | 9 + doc/mf6io/mf6ivar/dfn/swf-ic.dfn | 13 +- src/Idm/gwe-cndidm.f90 | 19 ++ src/Idm/gwe-disidm.f90 | 19 ++ src/Idm/gwe-disvidm.f90 | 19 ++ src/Idm/gwe-icidm.f90 | 19 ++ src/Idm/gwf-disidm.f90 | 19 ++ src/Idm/gwf-disvidm.f90 | 19 ++ src/Idm/gwf-icidm.f90 | 19 ++ src/Idm/gwf-npfidm.f90 | 19 ++ src/Idm/gwt-disidm.f90 | 19 ++ src/Idm/gwt-disvidm.f90 | 19 ++ src/Idm/gwt-dspidm.f90 | 19 ++ src/Idm/gwt-icidm.f90 | 19 ++ src/Idm/prt-disidm.f90 | 19 ++ src/Idm/prt-disvidm.f90 | 19 ++ src/Idm/prt-mipidm.f90 | 19 ++ src/Idm/swf-dis2didm.f90 | 19 ++ src/Idm/swf-disidm.f90 | 19 ++ src/Idm/swf-disvidm.f90 | 19 ++ src/Idm/swf-icidm.f90 | 19 ++ src/Utilities/Idm/IdmLogger.f90 | 240 ++++++++++++++++++ .../Idm/mf6blockfile/LoadMf6File.f90 | 78 +++++- 40 files changed, 832 insertions(+), 16 deletions(-) diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index 2c84d5886a8..fbab15b296b 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -6,7 +6,7 @@ \underline{NEW FUNCTIONALITY} \begin{itemize} \item A new Groundwater Energy (GWE) transport model is introduced to the code base for simulating heat transport in the subsurface. Additional information for activating the GWE model type within a MODFLOW 6 simulation is available within the mf6io.pdf document. New example problems have been developed for testing and demonstrating GWE capabilities (in addition to other internal tests that help verify the accuracy of GWE); however, additional changes to the code and input may be necessary in response to user needs and further testing. - % \item xxx + \item A new capability has been introduced to create parameter layer export files of user input data for packages including DIS, DISV, IC, NPF, DSP(GWT), MIP(PRT), and CND(GWE). The number of supported packages is expected to increase in the future. The capability can be turned on with the package EXPORT\_ARRAY\_ASCII option. The package parameter export set is pre-defined and currently focuses on griddata. The number of parameters per package may also increase in the future. % \item xxx \end{itemize} diff --git a/doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn b/doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn index e49626edf32..28d0865f51a 100644 --- a/doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn @@ -18,6 +18,15 @@ optional true longname xt3d on right-hand side description add xt3d terms to right-hand side, when possible. This option uses less memory, but may require more iterations. +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + # --------------------- gwe cnd griddata --------------------- block griddata diff --git a/doc/mf6io/mf6ivar/dfn/gwe-dis.dfn b/doc/mf6io/mf6ivar/dfn/gwe-dis.dfn index bb77bac782e..c3284d4a918 100644 --- a/doc/mf6io/mf6ivar/dfn/gwe-dis.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwe-dis.dfn @@ -40,6 +40,14 @@ optional true longname rotation angle description counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. # --------------------- gwe dis dimensions --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/gwe-disv.dfn b/doc/mf6io/mf6ivar/dfn/gwe-disv.dfn index b752a40b03c..05b46f96241 100644 --- a/doc/mf6io/mf6ivar/dfn/gwe-disv.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwe-disv.dfn @@ -40,6 +40,15 @@ optional true longname rotation angle description counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + # --------------------- gwe disv dimensions --------------------- block dimensions diff --git a/doc/mf6io/mf6ivar/dfn/gwe-ic.dfn b/doc/mf6io/mf6ivar/dfn/gwe-ic.dfn index 0cda10416ba..1b3d08ec490 100644 --- a/doc/mf6io/mf6ivar/dfn/gwe-ic.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwe-ic.dfn @@ -1,3 +1,14 @@ +# --------------------- gwe ic options --------------------- + +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + # --------------------- gwe ic griddata --------------------- block griddata diff --git a/doc/mf6io/mf6ivar/dfn/gwf-dis.dfn b/doc/mf6io/mf6ivar/dfn/gwf-dis.dfn index aa3316f38e3..26569f3d701 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-dis.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-dis.dfn @@ -40,6 +40,14 @@ optional true longname rotation angle description counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. # --------------------- gwf dis dimensions --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/gwf-disv.dfn b/doc/mf6io/mf6ivar/dfn/gwf-disv.dfn index c6bab33389e..ec685f7ba84 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-disv.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-disv.dfn @@ -40,6 +40,15 @@ optional true longname rotation angle description counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + # --------------------- gwf disv dimensions --------------------- block dimensions diff --git a/doc/mf6io/mf6ivar/dfn/gwf-ic.dfn b/doc/mf6io/mf6ivar/dfn/gwf-ic.dfn index be93d342caa..dd4560f6ccb 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-ic.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-ic.dfn @@ -1,3 +1,14 @@ +# --------------------- gwf ic options --------------------- + +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + # --------------------- gwf ic griddata --------------------- block griddata diff --git a/doc/mf6io/mf6ivar/dfn/gwf-npf.dfn b/doc/mf6io/mf6ivar/dfn/gwf-npf.dfn index 8da4e40e484..f35b3527877 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-npf.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-npf.dfn @@ -224,6 +224,15 @@ tagged false longname file name of TVK information description defines a time-varying hydraulic conductivity (TVK) input file. Records in the TVK file can be used to change hydraulic conductivity properties at specified times or stress periods. +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + # dev options block options diff --git a/doc/mf6io/mf6ivar/dfn/gwt-dis.dfn b/doc/mf6io/mf6ivar/dfn/gwt-dis.dfn index d36f24ed837..4c8a94de344 100644 --- a/doc/mf6io/mf6ivar/dfn/gwt-dis.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwt-dis.dfn @@ -40,6 +40,14 @@ optional true longname rotation angle description counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. # --------------------- gwt dis dimensions --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/gwt-disv.dfn b/doc/mf6io/mf6ivar/dfn/gwt-disv.dfn index 376c0e2d532..062fb01f169 100644 --- a/doc/mf6io/mf6ivar/dfn/gwt-disv.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwt-disv.dfn @@ -40,6 +40,15 @@ optional true longname rotation angle description counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + # --------------------- gwt disv dimensions --------------------- block dimensions diff --git a/doc/mf6io/mf6ivar/dfn/gwt-dsp.dfn b/doc/mf6io/mf6ivar/dfn/gwt-dsp.dfn index ff97e20f478..1ec2fec57a7 100644 --- a/doc/mf6io/mf6ivar/dfn/gwt-dsp.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwt-dsp.dfn @@ -18,6 +18,15 @@ optional true longname xt3d on right-hand side description add xt3d terms to right-hand side, when possible. This option uses less memory, but may require more iterations. +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + # --------------------- gwt dsp griddata --------------------- block griddata diff --git a/doc/mf6io/mf6ivar/dfn/gwt-ic.dfn b/doc/mf6io/mf6ivar/dfn/gwt-ic.dfn index 35dc565f24e..51605cefdd8 100644 --- a/doc/mf6io/mf6ivar/dfn/gwt-ic.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwt-ic.dfn @@ -1,3 +1,14 @@ +# --------------------- gwt ic options --------------------- + +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + # --------------------- gwt ic griddata --------------------- block griddata diff --git a/doc/mf6io/mf6ivar/dfn/prt-dis.dfn b/doc/mf6io/mf6ivar/dfn/prt-dis.dfn index c749650c064..9a37d7a4f61 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-dis.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-dis.dfn @@ -40,6 +40,14 @@ optional true longname rotation angle description counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. # --------------------- prt dis dimensions --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/prt-disv.dfn b/doc/mf6io/mf6ivar/dfn/prt-disv.dfn index 8ff2a422132..d2f238c644c 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-disv.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-disv.dfn @@ -40,6 +40,15 @@ optional true longname rotation angle description counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + # --------------------- prt disv dimensions --------------------- block dimensions diff --git a/doc/mf6io/mf6ivar/dfn/prt-mip.dfn b/doc/mf6io/mf6ivar/dfn/prt-mip.dfn index 34f0e6048a9..a993a10d410 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-mip.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-mip.dfn @@ -8,6 +8,15 @@ optional true longname zero method description the root finding algorithm to solve ternary subcells. 0 euler, 1 brent, 2 chandrupatla, 3 test. +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + # --------------------- prt mip griddata --------------------- block griddata diff --git a/doc/mf6io/mf6ivar/dfn/swf-dis2d.dfn b/doc/mf6io/mf6ivar/dfn/swf-dis2d.dfn index 02b82dc0b2c..b82e31abc93 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-dis2d.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-dis2d.dfn @@ -40,6 +40,14 @@ optional true longname rotation angle description counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. # --------------------- swf dis2d dimensions --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/swf-disv.dfn b/doc/mf6io/mf6ivar/dfn/swf-disv.dfn index 376c0e2d532..062fb01f169 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-disv.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-disv.dfn @@ -40,6 +40,15 @@ optional true longname rotation angle description counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + # --------------------- gwt disv dimensions --------------------- block dimensions diff --git a/doc/mf6io/mf6ivar/dfn/swf-ic.dfn b/doc/mf6io/mf6ivar/dfn/swf-ic.dfn index 9cff10a3247..a06580e3ed8 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-ic.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-ic.dfn @@ -1,4 +1,15 @@ -# --------------------- gwt ic griddata --------------------- +# --------------------- swf ic options --------------------- + +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + +# --------------------- swf ic griddata --------------------- block griddata name strt diff --git a/src/Idm/gwe-cndidm.f90 b/src/Idm/gwe-cndidm.f90 index 9757a46bcc1..43beafaa1c6 100644 --- a/src/Idm/gwe-cndidm.f90 +++ b/src/Idm/gwe-cndidm.f90 @@ -13,6 +13,7 @@ module GweCndInputModule type GweCndParamFoundType logical :: xt3d_off = .false. logical :: xt3d_rhs = .false. + logical :: export_ascii = .false. logical :: alh = .false. logical :: alv = .false. logical :: ath1 = .false. @@ -58,6 +59,23 @@ module GweCndInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + gwecnd_export_ascii = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'CND', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & gwecnd_alh = InputParamDefinitionType & ( & @@ -182,6 +200,7 @@ module GweCndInputModule [ & gwecnd_xt3d_off, & gwecnd_xt3d_rhs, & + gwecnd_export_ascii, & gwecnd_alh, & gwecnd_alv, & gwecnd_ath1, & diff --git a/src/Idm/gwe-disidm.f90 b/src/Idm/gwe-disidm.f90 index cda16809731..b9c538328fe 100644 --- a/src/Idm/gwe-disidm.f90 +++ b/src/Idm/gwe-disidm.f90 @@ -16,6 +16,7 @@ module GweDisInputModule logical :: xorigin = .false. logical :: yorigin = .false. logical :: angrot = .false. + logical :: export_ascii = .false. logical :: nlay = .false. logical :: nrow = .false. logical :: ncol = .false. @@ -113,6 +114,23 @@ module GweDisInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + gwedis_export_ascii = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & gwedis_nlay = InputParamDefinitionType & ( & @@ -257,6 +275,7 @@ module GweDisInputModule gwedis_xorigin, & gwedis_yorigin, & gwedis_angrot, & + gwedis_export_ascii, & gwedis_nlay, & gwedis_nrow, & gwedis_ncol, & diff --git a/src/Idm/gwe-disvidm.f90 b/src/Idm/gwe-disvidm.f90 index e109482271f..bf36ed545a6 100644 --- a/src/Idm/gwe-disvidm.f90 +++ b/src/Idm/gwe-disvidm.f90 @@ -16,6 +16,7 @@ module GweDisvInputModule logical :: xorigin = .false. logical :: yorigin = .false. logical :: angrot = .false. + logical :: export_ascii = .false. logical :: nlay = .false. logical :: ncpl = .false. logical :: nvert = .false. @@ -119,6 +120,23 @@ module GweDisvInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + gwedisv_export_ascii = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & gwedisv_nlay = InputParamDefinitionType & ( & @@ -365,6 +383,7 @@ module GweDisvInputModule gwedisv_xorigin, & gwedisv_yorigin, & gwedisv_angrot, & + gwedisv_export_ascii, & gwedisv_nlay, & gwedisv_ncpl, & gwedisv_nvert, & diff --git a/src/Idm/gwe-icidm.f90 b/src/Idm/gwe-icidm.f90 index 95dd79e256d..ba5694bb75f 100644 --- a/src/Idm/gwe-icidm.f90 +++ b/src/Idm/gwe-icidm.f90 @@ -11,11 +11,29 @@ module GweIcInputModule public gwe_ic_multi_package type GweIcParamFoundType + logical :: export_ascii = .false. logical :: strt = .false. end type GweIcParamFoundType logical :: gwe_ic_multi_package = .false. + type(InputParamDefinitionType), parameter :: & + gweic_export_ascii = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'IC', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & gweic_strt = InputParamDefinitionType & ( & @@ -36,6 +54,7 @@ module GweIcInputModule type(InputParamDefinitionType), parameter :: & gwe_ic_param_definitions(*) = & [ & + gweic_export_ascii, & gweic_strt & ] diff --git a/src/Idm/gwf-disidm.f90 b/src/Idm/gwf-disidm.f90 index 35a4db3f326..358df5e544b 100644 --- a/src/Idm/gwf-disidm.f90 +++ b/src/Idm/gwf-disidm.f90 @@ -16,6 +16,7 @@ module GwfDisInputModule logical :: xorigin = .false. logical :: yorigin = .false. logical :: angrot = .false. + logical :: export_ascii = .false. logical :: nlay = .false. logical :: nrow = .false. logical :: ncol = .false. @@ -113,6 +114,23 @@ module GwfDisInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + gwfdis_export_ascii = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & gwfdis_nlay = InputParamDefinitionType & ( & @@ -257,6 +275,7 @@ module GwfDisInputModule gwfdis_xorigin, & gwfdis_yorigin, & gwfdis_angrot, & + gwfdis_export_ascii, & gwfdis_nlay, & gwfdis_nrow, & gwfdis_ncol, & diff --git a/src/Idm/gwf-disvidm.f90 b/src/Idm/gwf-disvidm.f90 index 657d138186f..5f028cd764a 100644 --- a/src/Idm/gwf-disvidm.f90 +++ b/src/Idm/gwf-disvidm.f90 @@ -16,6 +16,7 @@ module GwfDisvInputModule logical :: xorigin = .false. logical :: yorigin = .false. logical :: angrot = .false. + logical :: export_ascii = .false. logical :: nlay = .false. logical :: ncpl = .false. logical :: nvert = .false. @@ -119,6 +120,23 @@ module GwfDisvInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + gwfdisv_export_ascii = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & gwfdisv_nlay = InputParamDefinitionType & ( & @@ -365,6 +383,7 @@ module GwfDisvInputModule gwfdisv_xorigin, & gwfdisv_yorigin, & gwfdisv_angrot, & + gwfdisv_export_ascii, & gwfdisv_nlay, & gwfdisv_ncpl, & gwfdisv_nvert, & diff --git a/src/Idm/gwf-icidm.f90 b/src/Idm/gwf-icidm.f90 index f943a35dc98..ec39a109cc6 100644 --- a/src/Idm/gwf-icidm.f90 +++ b/src/Idm/gwf-icidm.f90 @@ -11,11 +11,29 @@ module GwfIcInputModule public gwf_ic_multi_package type GwfIcParamFoundType + logical :: export_ascii = .false. logical :: strt = .false. end type GwfIcParamFoundType logical :: gwf_ic_multi_package = .false. + type(InputParamDefinitionType), parameter :: & + gwfic_export_ascii = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'IC', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & gwfic_strt = InputParamDefinitionType & ( & @@ -36,6 +54,7 @@ module GwfIcInputModule type(InputParamDefinitionType), parameter :: & gwf_ic_param_definitions(*) = & [ & + gwfic_export_ascii, & gwfic_strt & ] diff --git a/src/Idm/gwf-npfidm.f90 b/src/Idm/gwf-npfidm.f90 index 1915c11a9f3..0587978e09f 100644 --- a/src/Idm/gwf-npfidm.f90 +++ b/src/Idm/gwf-npfidm.f90 @@ -35,6 +35,7 @@ module GwfNpfInputModule logical :: tvk6 = .false. logical :: filein = .false. logical :: tvk6_filename = .false. + logical :: export_ascii = .false. logical :: inewton = .false. logical :: satomega = .false. logical :: icelltype = .false. @@ -457,6 +458,23 @@ module GwfNpfInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + gwfnpf_export_ascii = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'NPF', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & gwfnpf_inewton = InputParamDefinitionType & ( & @@ -654,6 +672,7 @@ module GwfNpfInputModule gwfnpf_tvk6, & gwfnpf_filein, & gwfnpf_tvk6_filename, & + gwfnpf_export_ascii, & gwfnpf_inewton, & gwfnpf_satomega, & gwfnpf_icelltype, & diff --git a/src/Idm/gwt-disidm.f90 b/src/Idm/gwt-disidm.f90 index 9a0330c9461..90ee1241e21 100644 --- a/src/Idm/gwt-disidm.f90 +++ b/src/Idm/gwt-disidm.f90 @@ -16,6 +16,7 @@ module GwtDisInputModule logical :: xorigin = .false. logical :: yorigin = .false. logical :: angrot = .false. + logical :: export_ascii = .false. logical :: nlay = .false. logical :: nrow = .false. logical :: ncol = .false. @@ -113,6 +114,23 @@ module GwtDisInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + gwtdis_export_ascii = InputParamDefinitionType & + ( & + 'GWT', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & gwtdis_nlay = InputParamDefinitionType & ( & @@ -257,6 +275,7 @@ module GwtDisInputModule gwtdis_xorigin, & gwtdis_yorigin, & gwtdis_angrot, & + gwtdis_export_ascii, & gwtdis_nlay, & gwtdis_nrow, & gwtdis_ncol, & diff --git a/src/Idm/gwt-disvidm.f90 b/src/Idm/gwt-disvidm.f90 index 615cc025374..96b1d58bb37 100644 --- a/src/Idm/gwt-disvidm.f90 +++ b/src/Idm/gwt-disvidm.f90 @@ -16,6 +16,7 @@ module GwtDisvInputModule logical :: xorigin = .false. logical :: yorigin = .false. logical :: angrot = .false. + logical :: export_ascii = .false. logical :: nlay = .false. logical :: ncpl = .false. logical :: nvert = .false. @@ -119,6 +120,23 @@ module GwtDisvInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + gwtdisv_export_ascii = InputParamDefinitionType & + ( & + 'GWT', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & gwtdisv_nlay = InputParamDefinitionType & ( & @@ -365,6 +383,7 @@ module GwtDisvInputModule gwtdisv_xorigin, & gwtdisv_yorigin, & gwtdisv_angrot, & + gwtdisv_export_ascii, & gwtdisv_nlay, & gwtdisv_ncpl, & gwtdisv_nvert, & diff --git a/src/Idm/gwt-dspidm.f90 b/src/Idm/gwt-dspidm.f90 index 8b7a4e74332..ccab6b36aef 100644 --- a/src/Idm/gwt-dspidm.f90 +++ b/src/Idm/gwt-dspidm.f90 @@ -13,6 +13,7 @@ module GwtDspInputModule type GwtDspParamFoundType logical :: xt3d_off = .false. logical :: xt3d_rhs = .false. + logical :: export_ascii = .false. logical :: diffc = .false. logical :: alh = .false. logical :: alv = .false. @@ -57,6 +58,23 @@ module GwtDspInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + gwtdsp_export_ascii = InputParamDefinitionType & + ( & + 'GWT', & ! component + 'DSP', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & gwtdsp_diffc = InputParamDefinitionType & ( & @@ -164,6 +182,7 @@ module GwtDspInputModule [ & gwtdsp_xt3d_off, & gwtdsp_xt3d_rhs, & + gwtdsp_export_ascii, & gwtdsp_diffc, & gwtdsp_alh, & gwtdsp_alv, & diff --git a/src/Idm/gwt-icidm.f90 b/src/Idm/gwt-icidm.f90 index a2fa79f8d63..91a37592efc 100644 --- a/src/Idm/gwt-icidm.f90 +++ b/src/Idm/gwt-icidm.f90 @@ -11,11 +11,29 @@ module GwtIcInputModule public gwt_ic_multi_package type GwtIcParamFoundType + logical :: export_ascii = .false. logical :: strt = .false. end type GwtIcParamFoundType logical :: gwt_ic_multi_package = .false. + type(InputParamDefinitionType), parameter :: & + gwtic_export_ascii = InputParamDefinitionType & + ( & + 'GWT', & ! component + 'IC', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & gwtic_strt = InputParamDefinitionType & ( & @@ -36,6 +54,7 @@ module GwtIcInputModule type(InputParamDefinitionType), parameter :: & gwt_ic_param_definitions(*) = & [ & + gwtic_export_ascii, & gwtic_strt & ] diff --git a/src/Idm/prt-disidm.f90 b/src/Idm/prt-disidm.f90 index ff9c3ffc1c7..c178966bee7 100644 --- a/src/Idm/prt-disidm.f90 +++ b/src/Idm/prt-disidm.f90 @@ -16,6 +16,7 @@ module PrtDisInputModule logical :: xorigin = .false. logical :: yorigin = .false. logical :: angrot = .false. + logical :: export_ascii = .false. logical :: nlay = .false. logical :: nrow = .false. logical :: ncol = .false. @@ -113,6 +114,23 @@ module PrtDisInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + prtdis_export_ascii = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & prtdis_nlay = InputParamDefinitionType & ( & @@ -257,6 +275,7 @@ module PrtDisInputModule prtdis_xorigin, & prtdis_yorigin, & prtdis_angrot, & + prtdis_export_ascii, & prtdis_nlay, & prtdis_nrow, & prtdis_ncol, & diff --git a/src/Idm/prt-disvidm.f90 b/src/Idm/prt-disvidm.f90 index 69cfdcc58bf..e1f2f3fe063 100644 --- a/src/Idm/prt-disvidm.f90 +++ b/src/Idm/prt-disvidm.f90 @@ -16,6 +16,7 @@ module PrtDisvInputModule logical :: xorigin = .false. logical :: yorigin = .false. logical :: angrot = .false. + logical :: export_ascii = .false. logical :: nlay = .false. logical :: ncpl = .false. logical :: nvert = .false. @@ -119,6 +120,23 @@ module PrtDisvInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + prtdisv_export_ascii = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & prtdisv_nlay = InputParamDefinitionType & ( & @@ -365,6 +383,7 @@ module PrtDisvInputModule prtdisv_xorigin, & prtdisv_yorigin, & prtdisv_angrot, & + prtdisv_export_ascii, & prtdisv_nlay, & prtdisv_ncpl, & prtdisv_nvert, & diff --git a/src/Idm/prt-mipidm.f90 b/src/Idm/prt-mipidm.f90 index 6548c358481..d7fbb1b6bc7 100644 --- a/src/Idm/prt-mipidm.f90 +++ b/src/Idm/prt-mipidm.f90 @@ -12,6 +12,7 @@ module PrtMipInputModule type PrtMipParamFoundType logical :: zero_method = .false. + logical :: export_ascii = .false. logical :: porosity = .false. logical :: retfactor = .false. logical :: izone = .false. @@ -36,6 +37,23 @@ module PrtMipInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + prtmip_export_ascii = InputParamDefinitionType & + ( & + 'PRT', & ! component + 'MIP', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & prtmip_porosity = InputParamDefinitionType & ( & @@ -91,6 +109,7 @@ module PrtMipInputModule prt_mip_param_definitions(*) = & [ & prtmip_zero_method, & + prtmip_export_ascii, & prtmip_porosity, & prtmip_retfactor, & prtmip_izone & diff --git a/src/Idm/swf-dis2didm.f90 b/src/Idm/swf-dis2didm.f90 index 48026dafad9..38857f34ab8 100644 --- a/src/Idm/swf-dis2didm.f90 +++ b/src/Idm/swf-dis2didm.f90 @@ -16,6 +16,7 @@ module SwfDis2DInputModule logical :: xorigin = .false. logical :: yorigin = .false. logical :: angrot = .false. + logical :: export_ascii = .false. logical :: nrow = .false. logical :: ncol = .false. logical :: delr = .false. @@ -111,6 +112,23 @@ module SwfDis2DInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + swfdis2d_export_ascii = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS2D', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & swfdis2d_nrow = InputParamDefinitionType & ( & @@ -221,6 +239,7 @@ module SwfDis2DInputModule swfdis2d_xorigin, & swfdis2d_yorigin, & swfdis2d_angrot, & + swfdis2d_export_ascii, & swfdis2d_nrow, & swfdis2d_ncol, & swfdis2d_delr, & diff --git a/src/Idm/swf-disidm.f90 b/src/Idm/swf-disidm.f90 index 5f903c4b5ed..1433a6bf4bc 100644 --- a/src/Idm/swf-disidm.f90 +++ b/src/Idm/swf-disidm.f90 @@ -16,6 +16,7 @@ module SwfDisInputModule logical :: xorigin = .false. logical :: yorigin = .false. logical :: angrot = .false. + logical :: export_ascii = .false. logical :: nlay = .false. logical :: nrow = .false. logical :: ncol = .false. @@ -113,6 +114,23 @@ module SwfDisInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + swfdis_export_ascii = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DIS', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & swfdis_nlay = InputParamDefinitionType & ( & @@ -257,6 +275,7 @@ module SwfDisInputModule swfdis_xorigin, & swfdis_yorigin, & swfdis_angrot, & + swfdis_export_ascii, & swfdis_nlay, & swfdis_nrow, & swfdis_ncol, & diff --git a/src/Idm/swf-disvidm.f90 b/src/Idm/swf-disvidm.f90 index 8a368e23f3d..0896e9b410c 100644 --- a/src/Idm/swf-disvidm.f90 +++ b/src/Idm/swf-disvidm.f90 @@ -16,6 +16,7 @@ module SwfDisvInputModule logical :: xorigin = .false. logical :: yorigin = .false. logical :: angrot = .false. + logical :: export_ascii = .false. logical :: nlay = .false. logical :: ncpl = .false. logical :: nvert = .false. @@ -119,6 +120,23 @@ module SwfDisvInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + swfdisv_export_ascii = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & swfdisv_nlay = InputParamDefinitionType & ( & @@ -365,6 +383,7 @@ module SwfDisvInputModule swfdisv_xorigin, & swfdisv_yorigin, & swfdisv_angrot, & + swfdisv_export_ascii, & swfdisv_nlay, & swfdisv_ncpl, & swfdisv_nvert, & diff --git a/src/Idm/swf-icidm.f90 b/src/Idm/swf-icidm.f90 index 3de7dc50ebe..1cc90e5bdfb 100644 --- a/src/Idm/swf-icidm.f90 +++ b/src/Idm/swf-icidm.f90 @@ -11,11 +11,29 @@ module SwfIcInputModule public swf_ic_multi_package type SwfIcParamFoundType + logical :: export_ascii = .false. logical :: strt = .false. end type SwfIcParamFoundType logical :: swf_ic_multi_package = .false. + type(InputParamDefinitionType), parameter :: & + swfic_export_ascii = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'IC', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & swfic_strt = InputParamDefinitionType & ( & @@ -36,6 +54,7 @@ module SwfIcInputModule type(InputParamDefinitionType), parameter :: & swf_ic_param_definitions(*) = & [ & + swfic_export_ascii, & swfic_strt & ] diff --git a/src/Utilities/Idm/IdmLogger.f90 b/src/Utilities/Idm/IdmLogger.f90 index b5a52f6cdf5..908c347fa4f 100644 --- a/src/Utilities/Idm/IdmLogger.f90 +++ b/src/Utilities/Idm/IdmLogger.f90 @@ -16,6 +16,7 @@ module IdmLoggerModule public :: idm_log_close public :: idm_log_period_header public :: idm_log_period_close + public :: idm_export public :: idm_log_var interface idm_log_var @@ -27,6 +28,12 @@ module IdmLoggerModule idm_log_var_ts end interface idm_log_var + interface idm_export + module procedure idm_export_int1d, idm_export_int2d, & + idm_export_int3d, idm_export_dbl1d, & + idm_export_dbl2d, idm_export_dbl3d + end interface idm_export + contains !> @ brief log a header message @@ -324,4 +331,237 @@ subroutine idm_log_var_str(p_mem, varname, mempath, iout) end if end subroutine idm_log_var_str + !> @brief Create export file int1d + !! + !! export layered int1d parameters with NODES shape + !! + !< + subroutine idm_export_int1d(p_mem, varname, mempath, iout) + use SimVariablesModule, only: idm_context + use ConstantsModule, only: LENMEMPATH, LENCOMPONENTNAME + use MemoryManagerModule, only: mem_setptr + use MemoryHelperModule, only: create_mem_path, split_mem_path + integer(I4B), dimension(:), contiguous, intent(in) :: p_mem !< 1d integer array + character(len=*), intent(in) :: varname !< variable name + character(len=*), intent(in) :: mempath !< variable memory path + integer(I4B), intent(in) :: iout + ! -- dummy + integer(I4B), dimension(:), pointer, contiguous :: model_shape + integer(I4B), dimension(:, :, :), pointer, contiguous :: int3d + integer(I4B), dimension(:, :), pointer, contiguous :: int2d + integer(I4B), dimension(3) :: dis_shape + integer(I4B), dimension(2) :: disv_shape + character(LENMEMPATH) :: input_mempath + character(LENCOMPONENTNAME) :: comp, subcomp + integer(I4B) :: i, j, k, inunit + ! + call split_mem_path(mempath, comp, subcomp) + input_mempath = create_mem_path(component=comp, context=idm_context) + call mem_setptr(model_shape, 'MODEL_SHAPE', input_mempath) + ! + if (size(model_shape) == 3) then + dis_shape(1) = model_shape(3) + dis_shape(2) = model_shape(2) + dis_shape(3) = model_shape(1) + allocate (int3d(dis_shape(1), dis_shape(2), dis_shape(3))) + int3d = reshape(p_mem, dis_shape) + do k = 1, dis_shape(3) + inunit = create_export_file(varname, mempath, k, iout) + do i = 1, model_shape(2) + write (inunit, '(*(i0, " "))') (int3d(j, i, k), j=1, & + dis_shape(1)) + end do + close (inunit) + end do + deallocate (int3d) + else if (size(model_shape) == 2) then + disv_shape(1) = model_shape(2) + disv_shape(2) = model_shape(1) + allocate (int2d(disv_shape(1), disv_shape(2))) + int2d = reshape(p_mem, disv_shape) + do i = 1, disv_shape(2) + inunit = create_export_file(varname, mempath, i, iout) + write (inunit, '(*(i0, " "))') (int2d(j, i), j=1, disv_shape(1)) + close (inunit) + end do + else if (size(model_shape) == 1) then + inunit = create_export_file(varname, mempath, 0, iout) + write (inunit, '(*(i0, " "))') p_mem + close (inunit) + end if + end subroutine idm_export_int1d + + !> @brief Create export file int2d + !< + subroutine idm_export_int2d(p_mem, varname, mempath, iout) + integer(I4B), dimension(:, :), contiguous, intent(in) :: p_mem !< 2d dbl array + character(len=*), intent(in) :: varname !< variable name + character(len=*), intent(in) :: mempath !< variable memory path + integer(I4B), intent(in) :: iout + ! -- dummy + integer(I4B) :: i, j, inunit + ! + do i = 1, size(p_mem, dim=2) + inunit = create_export_file(varname, mempath, i, iout) + write (inunit, '(*(i0, " "))') (p_mem(j, i), j=1, size(p_mem, dim=1)) + close (inunit) + end do + end subroutine idm_export_int2d + + !> @brief Create export file int3d + !< + subroutine idm_export_int3d(p_mem, varname, mempath, iout) + integer(I4B), dimension(:, :, :), contiguous, intent(in) :: p_mem !< 2d dbl array + character(len=*), intent(in) :: varname !< variable name + character(len=*), intent(in) :: mempath !< variable memory path + integer(I4B), intent(in) :: iout + ! -- dummy + integer(I4B) :: i, j, k, inunit + ! + do k = 1, size(p_mem, dim=3) + inunit = create_export_file(varname, mempath, k, iout) + do i = 1, size(p_mem, dim=2) + write (inunit, '(*(i0, " "))') (p_mem(j, i, k), j=1, size(p_mem, dim=1)) + end do + close (inunit) + end do + end subroutine idm_export_int3d + + !> @brief Create export file dbl1d + !! + !! export layered dbl1d parameters with NODES shape + !! + !< + subroutine idm_export_dbl1d(p_mem, varname, mempath, iout) + use SimVariablesModule, only: idm_context + use ConstantsModule, only: LENMEMPATH, LENCOMPONENTNAME + use MemoryManagerModule, only: mem_setptr + use MemoryHelperModule, only: create_mem_path, split_mem_path + real(DP), dimension(:), contiguous, intent(in) :: p_mem !< 1d dbl array + character(len=*), intent(in) :: varname !< variable name + character(len=*), intent(in) :: mempath !< variable memory path + integer(I4B), intent(in) :: iout + ! -- dummy + integer(I4B), dimension(:), pointer, contiguous :: model_shape + real(DP), dimension(:, :, :), pointer, contiguous :: dbl3d + real(DP), dimension(:, :), pointer, contiguous :: dbl2d + integer(I4B), dimension(3) :: dis_shape + integer(I4B), dimension(2) :: disv_shape + character(LENMEMPATH) :: input_mempath + character(LENCOMPONENTNAME) :: comp, subcomp + integer(I4B) :: i, j, k, inunit + ! + call split_mem_path(mempath, comp, subcomp) + input_mempath = create_mem_path(component=comp, context=idm_context) + call mem_setptr(model_shape, 'MODEL_SHAPE', input_mempath) + ! + if (size(model_shape) == 3) then + dis_shape(1) = model_shape(3) + dis_shape(2) = model_shape(2) + dis_shape(3) = model_shape(1) + allocate (dbl3d(dis_shape(1), dis_shape(2), dis_shape(3))) + dbl3d = reshape(p_mem, dis_shape) + do k = 1, dis_shape(3) + inunit = create_export_file(varname, mempath, k, iout) + do i = 1, model_shape(2) + write (inunit, '(*(G0.10, " "))') (dbl3d(j, i, k), j=1, & + dis_shape(1)) + end do + close (inunit) + end do + deallocate (dbl3d) + else if (size(model_shape) == 2) then + disv_shape(1) = model_shape(2) + disv_shape(2) = model_shape(1) + allocate (dbl2d(disv_shape(1), disv_shape(2))) + dbl2d = reshape(p_mem, disv_shape) + do i = 1, disv_shape(2) + inunit = create_export_file(varname, mempath, i, iout) + write (inunit, '(*(G0.10, " "))') (dbl2d(j, i), j=1, disv_shape(1)) + close (inunit) + end do + else if (size(model_shape) == 1) then + inunit = create_export_file(varname, mempath, 0, iout) + write (inunit, '(*(G0.10, " "))') p_mem + close (inunit) + end if + end subroutine idm_export_dbl1d + + !> @brief Create export file dbl2d + !< + subroutine idm_export_dbl2d(p_mem, varname, mempath, iout) + real(DP), dimension(:, :), contiguous, intent(in) :: p_mem !< 2d dbl array + character(len=*), intent(in) :: varname !< variable name + character(len=*), intent(in) :: mempath !< variable memory path + integer(I4B), intent(in) :: iout + ! -- dummy + integer(I4B) :: i, j, inunit + ! + do i = 1, size(p_mem, dim=2) + inunit = create_export_file(varname, mempath, i, iout) + write (inunit, '(*(G0.10, " "))') (p_mem(j, i), j=1, size(p_mem, dim=1)) + close (inunit) + end do + end subroutine idm_export_dbl2d + + !> @brief Create export file dbl3d + !< + subroutine idm_export_dbl3d(p_mem, varname, mempath, iout) + real(DP), dimension(:, :, :), contiguous, intent(in) :: p_mem !< 2d dbl array + character(len=*), intent(in) :: varname !< variable name + character(len=*), intent(in) :: mempath !< variable memory path + integer(I4B), intent(in) :: iout + ! -- dummy + integer(I4B) :: i, j, k, inunit + ! + do k = 1, size(p_mem, dim=3) + inunit = create_export_file(varname, mempath, k, iout) + do i = 1, size(p_mem, dim=2) + write (inunit, '(*(G0.10, " "))') (p_mem(j, i, k), j=1, & + size(p_mem, dim=1)) + end do + close (inunit) + end do + end subroutine idm_export_dbl3d + + !> @brief Create export file + !! + !! Name format: -.varname.[layer].txt + !! + !< + function create_export_file(varname, mempath, layer, iout) result(inunit) + use ConstantsModule, only: LENCOMPONENTNAME, LENVARNAME + use InputOutputModule, only: openfile, getunit + use InputOutputModule, only: upcase, lowcase + use MemoryHelperModule, only: create_mem_path, split_mem_path + character(len=*), intent(in) :: varname !< variable name + character(len=*), intent(in) :: mempath !< variable memory path + integer(I4B), intent(in) :: layer + integer(I4B), intent(in) :: iout + integer(I4B) :: inunit + ! -- dummy + character(len=LENCOMPONENTNAME) :: comp, subcomp + character(len=LINELENGTH) :: filename, suffix + ! + ! -- split the mempath + call split_mem_path(mempath, comp, subcomp) + call lowcase(comp) + call lowcase(subcomp) + ! + ! -- build suffix + suffix = varname + call lowcase(suffix) + if (layer > 0) then + write (suffix, '(a,i0)') trim(suffix)//'.l', layer + end if + suffix = trim(suffix)//'.txt' + ! + ! -- set filename + filename = trim(comp)//'-'//trim(subcomp)//'.'//trim(suffix) + ! + ! -- silently create the array file + inunit = getunit() + call openfile(inunit, 0, filename, 'EXPORT', filstat_opt='REPLACE') + end function create_export_file + end module IdmLoggerModule diff --git a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 index d1a682b06bf..bd06ac99dc9 100644 --- a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 +++ b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 @@ -30,7 +30,8 @@ module LoadMf6FileModule use MemoryManagerModule, only: mem_allocate, mem_setptr use MemoryHelperModule, only: create_mem_path use StructArrayModule, only: StructArrayType - use IdmLoggerModule, only: idm_log_var, idm_log_header, idm_log_close + use IdmLoggerModule, only: idm_log_var, idm_log_header, idm_log_close, & + idm_export implicit none private @@ -49,6 +50,7 @@ module LoadMf6FileModule type(ModflowInputType) :: mf6_input !< description of input character(len=LINELENGTH) :: filename !< name of ascii input file logical(LGP) :: ts_active !< is timeseries active + logical(LGP) :: export !< is array export active integer(I4B) :: iout !< inunit for list log contains procedure :: load @@ -126,6 +128,7 @@ subroutine init(this, parser, mf6_input, filename, iout) this%mf6_input = mf6_input this%filename = filename this%ts_active = .false. + this%export = .false. this%iout = iout ! call get_isize('MODEL_SHAPE', mf6_input%component_mempath, isize) @@ -212,7 +215,7 @@ subroutine block_post_process(this, iblk) integer(I4B), intent(in) :: iblk ! -- local type(InputParamDefinitionType), pointer :: idt - integer(I4B) :: iparam, ts6_size + integer(I4B) :: iparam, ts6_size, export_size ! select case (this%mf6_input%block_dfns(iblk)%blockname) case ('OPTIONS') @@ -234,6 +237,13 @@ subroutine block_post_process(this, iblk) this%ts_active = .true. end if ! + ! -- determine if EXPORT options were provided + call get_isize('EXPORT_ASCII', this%mf6_input%mempath, export_size) + ! + if (export_size > 0) then + this%export = .true. + end if + ! case ('DIMENSIONS') ! -- set model shape if discretization dimensions have been read if (this%mf6_input%pkgtype(1:3) == 'DIS') then @@ -462,24 +472,24 @@ recursive subroutine parse_tag(this, iblk, recursive_call) call load_integer_type(this%parser, idt, this%mf6_input%mempath, this%iout) case ('INTEGER1D') call load_integer1d_type(this%parser, idt, this%mf6_input%mempath, & - this%mshape, this%iout) + this%mshape, this%export, this%iout) case ('INTEGER2D') call load_integer2d_type(this%parser, idt, this%mf6_input%mempath, & - this%mshape, this%iout) + this%mshape, this%export, this%iout) case ('INTEGER3D') call load_integer3d_type(this%parser, idt, this%mf6_input%mempath, & - this%mshape, this%iout) + this%mshape, this%export, this%iout) case ('DOUBLE') call load_double_type(this%parser, idt, this%mf6_input%mempath, this%iout) case ('DOUBLE1D') call load_double1d_type(this%parser, idt, this%mf6_input%mempath, & - this%mshape, this%iout) + this%mshape, this%export, this%iout) case ('DOUBLE2D') call load_double2d_type(this%parser, idt, this%mf6_input%mempath, & - this%mshape, this%iout) + this%mshape, this%export, this%iout) case ('DOUBLE3D') call load_double3d_type(this%parser, idt, this%mf6_input%mempath, & - this%mshape, this%iout) + this%mshape, this%export, this%iout) case default write (errmsg, '(a,a)') 'Failure reading data for tag: ', trim(tag) call store_error(errmsg) @@ -751,12 +761,13 @@ end subroutine load_integer_type !> @brief load type 1d integer !< - subroutine load_integer1d_type(parser, idt, memoryPath, mshape, iout) + subroutine load_integer1d_type(parser, idt, memoryPath, mshape, export, iout) use SourceCommonModule, only: get_shape_from_string type(BlockParserType), intent(inout) :: parser !< block parser type(InputParamDefinitionType), intent(in) :: idt !< input data type object describing this record character(len=*), intent(in) :: memoryPath !< memorypath to put loaded information integer(I4B), dimension(:), contiguous, pointer, intent(in) :: mshape !< model shape + logical(LGP), intent(in) :: export !< export to ascii layer files integer(I4B), intent(in) :: iout !< unit number for output integer(I4B), dimension(:), pointer, contiguous :: int1d !integer(I4B), pointer :: nsize1 @@ -794,17 +805,24 @@ subroutine load_integer1d_type(parser, idt, memoryPath, mshape, iout) ! log information on the loaded array to the list file call idm_log_var(int1d, idt%tagname, memoryPath, iout) + + ! create export file for layered parameters if optioned + if (export .and. idt%layered) then + call idm_export(int1d, idt%tagname, memoryPath, iout) + end if + return end subroutine load_integer1d_type !> @brief load type 2d integer !< - subroutine load_integer2d_type(parser, idt, memoryPath, mshape, iout) + subroutine load_integer2d_type(parser, idt, memoryPath, mshape, export, iout) use SourceCommonModule, only: get_shape_from_string type(BlockParserType), intent(inout) :: parser !< block parser type(InputParamDefinitionType), intent(in) :: idt !< input data type object describing this record character(len=*), intent(in) :: memoryPath !< memorypath to put loaded information integer(I4B), dimension(:), contiguous, pointer, intent(in) :: mshape !< model shape + logical(LGP), intent(in) :: export !< export to ascii layer files integer(I4B), intent(in) :: iout !< unit number for output integer(I4B), dimension(:, :), pointer, contiguous :: int2d integer(I4B) :: nlay @@ -838,17 +856,24 @@ subroutine load_integer2d_type(parser, idt, memoryPath, mshape, iout) ! log information on the loaded array to the list file call idm_log_var(int2d, idt%tagname, memoryPath, iout) + + ! create export file for layered parameters if optioned + if (export .and. idt%layered) then + call idm_export(int2d, idt%tagname, memoryPath, iout) + end if + return end subroutine load_integer2d_type !> @brief load type 3d integer !< - subroutine load_integer3d_type(parser, idt, memoryPath, mshape, iout) + subroutine load_integer3d_type(parser, idt, memoryPath, mshape, export, iout) use SourceCommonModule, only: get_shape_from_string type(BlockParserType), intent(inout) :: parser !< block parser type(InputParamDefinitionType), intent(in) :: idt !< input data type object describing this record character(len=*), intent(in) :: memoryPath !< memorypath to put loaded information integer(I4B), dimension(:), contiguous, pointer, intent(in) :: mshape !< model shape + logical(LGP), intent(in) :: export !< export to ascii layer files integer(I4B), intent(in) :: iout !< unit number for output integer(I4B), dimension(:, :, :), pointer, contiguous :: int3d integer(I4B) :: nlay @@ -888,6 +913,11 @@ subroutine load_integer3d_type(parser, idt, memoryPath, mshape, iout) ! log information on the loaded array to the list file call idm_log_var(int3d, idt%tagname, memoryPath, iout) + ! create export file for layered parameters if optioned + if (export .and. idt%layered) then + call idm_export(int3d, idt%tagname, memoryPath, iout) + end if + return end subroutine load_integer3d_type @@ -907,12 +937,13 @@ end subroutine load_double_type !> @brief load type 1d double !< - subroutine load_double1d_type(parser, idt, memoryPath, mshape, iout) + subroutine load_double1d_type(parser, idt, memoryPath, mshape, export, iout) use SourceCommonModule, only: get_shape_from_string type(BlockParserType), intent(inout) :: parser !< block parser type(InputParamDefinitionType), intent(in) :: idt !< input data type object describing this record character(len=*), intent(in) :: memoryPath !< memorypath to put loaded information integer(I4B), dimension(:), contiguous, pointer, intent(in) :: mshape !< model shape + logical(LGP), intent(in) :: export !< export to ascii layer files integer(I4B), intent(in) :: iout !< unit number for output real(DP), dimension(:), pointer, contiguous :: dbl1d !integer(I4B), pointer :: nsize1 @@ -949,17 +980,24 @@ subroutine load_double1d_type(parser, idt, memoryPath, mshape, iout) ! log information on the loaded array to the list file call idm_log_var(dbl1d, idt%tagname, memoryPath, iout) + + ! create export file for layered parameters if optioned + if (export .and. idt%layered) then + call idm_export(dbl1d, idt%tagname, memoryPath, iout) + end if + return end subroutine load_double1d_type !> @brief load type 2d double !< - subroutine load_double2d_type(parser, idt, memoryPath, mshape, iout) + subroutine load_double2d_type(parser, idt, memoryPath, mshape, export, iout) use SourceCommonModule, only: get_shape_from_string type(BlockParserType), intent(inout) :: parser !< block parser type(InputParamDefinitionType), intent(in) :: idt !< input data type object describing this record character(len=*), intent(in) :: memoryPath !< memorypath to put loaded information integer(I4B), dimension(:), contiguous, pointer, intent(in) :: mshape !< model shape + logical(LGP), intent(in) :: export !< export to ascii layer files integer(I4B), intent(in) :: iout !< unit number for output real(DP), dimension(:, :), pointer, contiguous :: dbl2d integer(I4B) :: nlay @@ -993,17 +1031,24 @@ subroutine load_double2d_type(parser, idt, memoryPath, mshape, iout) ! log information on the loaded array to the list file call idm_log_var(dbl2d, idt%tagname, memoryPath, iout) + + ! create export file for layered parameters if optioned + if (export .and. idt%layered) then + call idm_export(dbl2d, idt%tagname, memoryPath, iout) + end if + return end subroutine load_double2d_type !> @brief load type 3d double !< - subroutine load_double3d_type(parser, idt, memoryPath, mshape, iout) + subroutine load_double3d_type(parser, idt, memoryPath, mshape, export, iout) use SourceCommonModule, only: get_shape_from_string type(BlockParserType), intent(inout) :: parser !< block parser type(InputParamDefinitionType), intent(in) :: idt !< input data type object describing this record character(len=*), intent(in) :: memoryPath !< memorypath to put loaded information integer(I4B), dimension(:), contiguous, pointer, intent(in) :: mshape !< model shape + logical(LGP), intent(in) :: export !< export to ascii layer files integer(I4B), intent(in) :: iout !< unit number for output real(DP), dimension(:, :, :), pointer, contiguous :: dbl3d integer(I4B) :: nlay @@ -1043,6 +1088,11 @@ subroutine load_double3d_type(parser, idt, memoryPath, mshape, iout) ! log information on the loaded array to the list file call idm_log_var(dbl3d, idt%tagname, memoryPath, iout) + ! create export file for layered parameters if optioned + if (export .and. idt%layered) then + call idm_export(dbl3d, idt%tagname, memoryPath, iout) + end if + return end subroutine load_double3d_type From b548242fd6d81c8984c0bd96845ae86db0d2a924 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 3 Apr 2024 11:29:43 -0400 Subject: [PATCH 082/199] ci: trim cached oneapi versions (#1700) * only need to cache intel-classic 2021.7 and intel 2024.0 --- .github/workflows/large.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/large.yml b/.github/workflows/large.yml index 950c4738d2b..25aad3fd825 100644 --- a/.github/workflows/large.yml +++ b/.github/workflows/large.yml @@ -15,16 +15,10 @@ jobs: fail-fast: false matrix: include: - # ifx - - {os: windows-2022, compiler: intel, version: 2022.2} - # use this combo to install and cache oneapi components (compilers + mkl/mpi) and petsc for mf6 parallel + # this combo is for windows parallel oneapi components (compilers + mkl/mpi) and petsc - {os: windows-2022, compiler: intel, version: 2024.0} - # ifort - - {os: windows-2022, compiler: intel-classic, version: "2021.10"} - - {os: windows-2022, compiler: intel-classic, version: 2021.9} - - {os: windows-2022, compiler: intel-classic, version: 2021.8} + # ifort 2021.7 currently used for all other CI testing - {os: windows-2022, compiler: intel-classic, version: 2021.7} - - {os: windows-2022, compiler: intel-classic, version: 2021.6} steps: - name: Setup ${{ matrix.compiler }} ${{ matrix.version }} if: (!(matrix.compiler == 'intel' && matrix.version == '2024.0')) From 972187785da883c2e1d21bc0a5a88123095871ff Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Wed, 3 Apr 2024 13:51:17 -0500 Subject: [PATCH 083/199] refactor(export_array): testing (#1702) * add export array testing to autotest/test_gwf_npf01_75x75.py * update tex files There is still an unresolved issue in that export_array only works for "layered" variables, but if we add "layered true" to disv1d variables, then the io guide says "layered" for these variables. Also, for the swf-dis2d grid, if we include support for export_array, then we get nrow files created, each with ncol values in it. So there is some work left to do in supporting disv1d, dis2d, and other variables, such as gwf-dis-top, that might be considered "layered". --- autotest/TestList.f90 | 1 - autotest/test_gwf_npf01_75x75.py | 38 +++++++++++++++++++-- doc/mf6io/mf6ivar/md/mf6ivar.md | 18 ++++++++++ doc/mf6io/mf6ivar/tex/appendixA.tex | 4 +++ doc/mf6io/mf6ivar/tex/gwe-cnd-desc.tex | 2 ++ doc/mf6io/mf6ivar/tex/gwe-cnd-options.dat | 1 + doc/mf6io/mf6ivar/tex/gwe-dis-desc.tex | 2 ++ doc/mf6io/mf6ivar/tex/gwe-dis-options.dat | 1 + doc/mf6io/mf6ivar/tex/gwe-disv-desc.tex | 2 ++ doc/mf6io/mf6ivar/tex/gwe-disv-options.dat | 1 + doc/mf6io/mf6ivar/tex/gwe-ic-desc.tex | 6 ++++ doc/mf6io/mf6ivar/tex/gwe-ic-options.dat | 3 ++ doc/mf6io/mf6ivar/tex/gwf-dis-desc.tex | 2 ++ doc/mf6io/mf6ivar/tex/gwf-dis-options.dat | 1 + doc/mf6io/mf6ivar/tex/gwf-disv-desc.tex | 2 ++ doc/mf6io/mf6ivar/tex/gwf-disv-options.dat | 1 + doc/mf6io/mf6ivar/tex/gwf-ic-desc.tex | 6 ++++ doc/mf6io/mf6ivar/tex/gwf-ic-options.dat | 3 ++ doc/mf6io/mf6ivar/tex/gwf-npf-desc.tex | 2 ++ doc/mf6io/mf6ivar/tex/gwf-npf-options.dat | 1 + doc/mf6io/mf6ivar/tex/gwt-dis-desc.tex | 2 ++ doc/mf6io/mf6ivar/tex/gwt-dis-options.dat | 1 + doc/mf6io/mf6ivar/tex/gwt-disv-desc.tex | 2 ++ doc/mf6io/mf6ivar/tex/gwt-disv-options.dat | 1 + doc/mf6io/mf6ivar/tex/gwt-dsp-desc.tex | 2 ++ doc/mf6io/mf6ivar/tex/gwt-dsp-options.dat | 1 + doc/mf6io/mf6ivar/tex/gwt-ic-desc.tex | 6 ++++ doc/mf6io/mf6ivar/tex/gwt-ic-options.dat | 3 ++ doc/mf6io/mf6ivar/tex/prt-dis-desc.tex | 2 ++ doc/mf6io/mf6ivar/tex/prt-dis-options.dat | 1 + doc/mf6io/mf6ivar/tex/prt-disv-desc.tex | 2 ++ doc/mf6io/mf6ivar/tex/prt-disv-options.dat | 1 + doc/mf6io/mf6ivar/tex/prt-mip-desc.tex | 2 ++ doc/mf6io/mf6ivar/tex/prt-mip-options.dat | 1 + doc/mf6io/mf6ivar/tex/swf-dis2d-desc.tex | 2 ++ doc/mf6io/mf6ivar/tex/swf-dis2d-options.dat | 1 + doc/mf6io/mf6ivar/tex/swf-disv-desc.tex | 2 ++ doc/mf6io/mf6ivar/tex/swf-disv-options.dat | 1 + doc/mf6io/mf6ivar/tex/swf-ic-desc.tex | 6 ++++ doc/mf6io/mf6ivar/tex/swf-ic-options.dat | 3 ++ 40 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 doc/mf6io/mf6ivar/tex/gwe-ic-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwf-ic-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwt-ic-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/swf-ic-options.dat diff --git a/autotest/TestList.f90 b/autotest/TestList.f90 index 605460ec9d2..0de78859e14 100644 --- a/autotest/TestList.f90 +++ b/autotest/TestList.f90 @@ -112,7 +112,6 @@ subroutine test_get_next_previous_item_reset(error) type(ListType), pointer :: list type(IntNodeType), pointer :: n1, n2, n3 class(*), pointer :: p - integer(I4B) :: i allocate (list) allocate (n1) diff --git a/autotest/test_gwf_npf01_75x75.py b/autotest/test_gwf_npf01_75x75.py index e787036849a..9e125f7dfec 100644 --- a/autotest/test_gwf_npf01_75x75.py +++ b/autotest/test_gwf_npf01_75x75.py @@ -1,5 +1,5 @@ import os - +import pathlib as pl import flopy import numpy as np import pytest @@ -94,6 +94,7 @@ def build_models(idx, test): dis = flopy.mf6.ModflowGwfdis( gwf, + export_array_ascii=True, nlay=nlay, nrow=nrow, ncol=ncol, @@ -106,11 +107,21 @@ def build_models(idx, test): ) # initial conditions - ic = flopy.mf6.ModflowGwfic(gwf, strt=strt, filename=f"{name}.ic") + ic = flopy.mf6.ModflowGwfic( + gwf, + export_array_ascii=True, + strt=strt, + filename=f"{name}.ic" + ) # node property flow npf = flopy.mf6.ModflowGwfnpf( - gwf, save_flows=False, icelltype=laytyp[idx], k=hk, k33=hk + gwf, + export_array_ascii=True, + save_flows=False, + icelltype=laytyp[idx], + k=hk, + k33=hk ) # storage sto = flopy.mf6.ModflowGwfsto( @@ -193,6 +204,26 @@ def build_models(idx, test): return sim, mc +def check_output(idx, test): + print("evaluating model...") + ws = test.workspace + + # ensure export array is working properly + name = cases[idx] + flist = ["dis.botm", "dis.idomain", "ic.strt", "npf.icelltype", "npf.k", "npf.k33"] + files = [pl.Path(ws / f"{name}-{f}.l1.txt") for f in flist] + gwf = test.sims[0].gwf[0] + for i, fpth in enumerate(files): + assert fpth.is_file(), f"Expected file does not exist: {fpth.name}" + a = np.loadtxt(fpth) + array_name = flist[i][flist[i].index(".") + 1:] + package_name = flist[i][0:flist[i].index(".")] + package = getattr(gwf, package_name) + b = getattr(package, array_name).array + assert np.allclose(a, b) + return + + @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( @@ -200,5 +231,6 @@ def test_mf6model(idx, name, function_tmpdir, targets): workspace=function_tmpdir, targets=targets, build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), ) test.run() diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 8fe8f099b6e..4ebf683b069 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -179,6 +179,7 @@ | GWF | DIS | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWF | DIS | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWF | DIS | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWF | DIS | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | GWF | DIS | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | GWF | DIS | DIMENSIONS | NROW | INTEGER | is the number of rows in the model grid. | | GWF | DIS | DIMENSIONS | NCOL | INTEGER | is the number of columns in the model grid. | @@ -192,6 +193,7 @@ | GWF | DISV | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWF | DISV | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWF | DISV | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWF | DISV | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | GWF | DISV | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | GWF | DISV | DIMENSIONS | NCPL | INTEGER | is the number of cells per layer. This is a constant value for the grid and it applies to all layers. | | GWF | DISV | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. | @@ -233,6 +235,7 @@ | GWF | DISU | CELL2D | YC | DOUBLE PRECISION | is the y-coordinate for the cell center. | | GWF | DISU | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | | GWF | DISU | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. | +| GWF | IC | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | GWF | IC | GRIDDATA | STRT | DOUBLE PRECISION (NODES) | is the initial (starting) head---that is, head at the beginning of the GWF Model simulation. STRT must be specified for all simulations, including steady-state simulations. One value is read for every model cell. For simulations in which the first stress period is steady state, the values used for STRT generally do not affect the simulation (exceptions may occur if cells go dry and (or) rewet). The execution time, however, will be less if STRT includes hydraulic heads that are close to the steady-state solution. A head value lower than the cell bottom can be provided if a cell should start as dry. | | GWF | NPF | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that budget flow terms will be written to the file specified with ``BUDGET SAVE FILE'' in Output Control. | | GWF | NPF | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that calculated flows between cells will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. This option can produce extremely large list files because all cell-by-cell flows are printed. It should only be used with the NPF Package for models that have a small number of cells. | @@ -254,6 +257,7 @@ | GWF | NPF | OPTIONS | TVK6 | KEYWORD | keyword to specify that record corresponds to a time-varying hydraulic conductivity (TVK) file. The behavior of TVK and a description of the input file is provided separately. | | GWF | NPF | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | | GWF | NPF | OPTIONS | TVK6_FILENAME | STRING | defines a time-varying hydraulic conductivity (TVK) input file. Records in the TVK file can be used to change hydraulic conductivity properties at specified times or stress periods. | +| GWF | NPF | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | GWF | NPF | OPTIONS | DEV_NO_NEWTON | KEYWORD | turn off Newton for unconfined cells | | GWF | NPF | OPTIONS | DEV_OMEGA | DOUBLE PRECISION | set saturation omega value | | GWF | NPF | GRIDDATA | ICELLTYPE | INTEGER (NODES) | flag for each cell that specifies how saturated thickness is treated. 0 means saturated thickness is held constant; $>$0 means saturated thickness varies with computed head when head is below the cell top; $<$0 means saturated thickness varies with computed head unless the THICKSTRT option is in effect. When THICKSTRT is in effect, a negative value for ICELLTYPE indicates that the saturated thickness value used in conductance calculations in the NPF Package will be computed as STRT-BOT and held constant. If the THICKSTRT option is not in effect, then negative values provided by the user for ICELLTYPE are automatically reassigned by the program to a value of one. | @@ -869,6 +873,7 @@ | GWT | ADV | OPTIONS | SCHEME | STRING | scheme used to solve the advection term. Can be upstream, central, or TVD. If not specified, upstream weighting is the default weighting scheme. | | GWT | DSP | OPTIONS | XT3D_OFF | KEYWORD | deactivate the xt3d method and use the faster and less accurate approximation. This option may provide a fast and accurate solution under some circumstances, such as when flow aligns with the model grid, there is no mechanical dispersion, or when the longitudinal and transverse dispersivities are equal. This option may also be used to assess the computational demand of the XT3D approach by noting the run time differences with and without this option on. | | GWT | DSP | OPTIONS | XT3D_RHS | KEYWORD | add xt3d terms to right-hand side, when possible. This option uses less memory, but may require more iterations. | +| GWT | DSP | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | GWT | DSP | GRIDDATA | DIFFC | DOUBLE PRECISION (NODES) | effective molecular diffusion coefficient. | | GWT | DSP | GRIDDATA | ALH | DOUBLE PRECISION (NODES) | longitudinal dispersivity in horizontal direction. If flow is strictly horizontal, then this is the longitudinal dispersivity that will be used. If flow is not strictly horizontal or strictly vertical, then the longitudinal dispersivity is a function of both ALH and ALV. If mechanical dispersion is represented (by specifying any dispersivity values) then this array is required. | | GWT | DSP | GRIDDATA | ALV | DOUBLE PRECISION (NODES) | longitudinal dispersivity in vertical direction. If flow is strictly vertical, then this is the longitudinal dispsersivity value that will be used. If flow is not strictly horizontal or strictly vertical, then the longitudinal dispersivity is a function of both ALH and ALV. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ALH. | @@ -897,6 +902,7 @@ | GWT | DIS | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWT | DIS | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWT | DIS | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWT | DIS | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | GWT | DIS | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | GWT | DIS | DIMENSIONS | NROW | INTEGER | is the number of rows in the model grid. | | GWT | DIS | DIMENSIONS | NCOL | INTEGER | is the number of columns in the model grid. | @@ -910,6 +916,7 @@ | GWT | DISV | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWT | DISV | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWT | DISV | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWT | DISV | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | GWT | DISV | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | GWT | DISV | DIMENSIONS | NCPL | INTEGER | is the number of cells per layer. This is a constant value for the grid and it applies to all layers. | | GWT | DISV | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. | @@ -951,6 +958,7 @@ | GWT | DISU | CELL2D | YC | DOUBLE PRECISION | is the y-coordinate for the cell center. | | GWT | DISU | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | | GWT | DISU | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. | +| GWT | IC | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | GWT | IC | GRIDDATA | STRT | DOUBLE PRECISION (NODES) | is the initial (starting) concentration---that is, concentration at the beginning of the GWT Model simulation. STRT must be specified for all GWT Model simulations. One value is read for every model cell. | | GWT | NAM | OPTIONS | LIST | STRING | is name of the listing file to create for this GWT model. If not specified, then the name of the list file will be the basename of the GWT model name file and the '.lst' extension. For example, if the GWT name file is called ``my.model.nam'' then the list file will be called ``my.model.lst''. | | GWT | NAM | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of all model stress package information will be written to the listing file immediately after it is read. | @@ -1206,6 +1214,7 @@ | GWE | ADV | OPTIONS | SCHEME | STRING | scheme used to solve the advection term. Can be upstream, central, or TVD. If not specified, upstream weighting is the default weighting scheme. | | GWE | CND | OPTIONS | XT3D_OFF | KEYWORD | deactivate the xt3d method and use the faster and less accurate approximation. This option may provide a fast and accurate solution under some circumstances, such as when flow aligns with the model grid, there is no mechanical dispersion, or when the longitudinal and transverse dispersivities are equal. This option may also be used to assess the computational demand of the XT3D approach by noting the run time differences with and without this option on. | | GWE | CND | OPTIONS | XT3D_RHS | KEYWORD | add xt3d terms to right-hand side, when possible. This option uses less memory, but may require more iterations. | +| GWE | CND | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | GWE | CND | GRIDDATA | ALH | DOUBLE PRECISION (NODES) | longitudinal dispersivity in horizontal direction. If flow is strictly horizontal, then this is the longitudinal dispersivity that will be used. If flow is not strictly horizontal or strictly vertical, then the longitudinal dispersivity is a function of both ALH and ALV. If mechanical dispersion is represented (by specifying any dispersivity values) then this array is required. | | GWE | CND | GRIDDATA | ALV | DOUBLE PRECISION (NODES) | longitudinal dispersivity in vertical direction. If flow is strictly vertical, then this is the longitudinal dispsersivity value that will be used. If flow is not strictly horizontal or strictly vertical, then the longitudinal dispersivity is a function of both ALH and ALV. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ALH. | | GWE | CND | GRIDDATA | ATH1 | DOUBLE PRECISION (NODES) | transverse dispersivity in horizontal direction. This is the transverse dispersivity value for the second ellipsoid axis. If flow is strictly horizontal and directed in the x direction (along a row for a regular grid), then this value controls spreading in the y direction. If mechanical dispersion is represented (by specifying any dispersivity values) then this array is required. | @@ -1235,6 +1244,7 @@ | GWE | DIS | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWE | DIS | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWE | DIS | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWE | DIS | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | GWE | DIS | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | GWE | DIS | DIMENSIONS | NROW | INTEGER | is the number of rows in the model grid. | | GWE | DIS | DIMENSIONS | NCOL | INTEGER | is the number of columns in the model grid. | @@ -1248,6 +1258,7 @@ | GWE | DISV | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWE | DISV | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWE | DISV | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWE | DISV | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | GWE | DISV | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | GWE | DISV | DIMENSIONS | NCPL | INTEGER | is the number of cells per layer. This is a constant value for the grid and it applies to all layers. | | GWE | DISV | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. | @@ -1316,6 +1327,7 @@ | GWE | EST | PACKAGEDATA | CPW | DOUBLE PRECISION | is the mass-based heat capacity of the simulated fluid. For example, units of J/kg/C may be used (or equivalent). | | GWE | EST | PACKAGEDATA | RHOW | DOUBLE PRECISION | is a user-specified value of the density of water. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kg/m3. | | GWE | EST | PACKAGEDATA | LATHEATVAP | DOUBLE PRECISION | is the user-specified value for the latent heat of vaporization. For example, if working in SI units, values may be entered as kJ/kg. | +| GWE | IC | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | GWE | IC | GRIDDATA | STRT | DOUBLE PRECISION (NODES) | is the initial (starting) temperature---that is, the temperature at the beginning of the GWE Model simulation. STRT must be specified for all GWE Model simulations. One value is read for every model cell. | | GWE | LKE | OPTIONS | FLOW_PACKAGE_NAME | STRING | keyword to specify the name of the corresponding flow package. If not specified, then the corresponding flow package must have the same name as this advanced transport package (the name associated with this package in the GWE name file). | | GWE | LKE | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | @@ -1538,6 +1550,7 @@ | SWF | DIS2D | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | SWF | DIS2D | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | SWF | DIS2D | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DIS2D | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | SWF | DIS2D | DIMENSIONS | NROW | INTEGER | is the number of rows in the model grid. | | SWF | DIS2D | DIMENSIONS | NCOL | INTEGER | is the number of columns in the model grid. | | SWF | DIS2D | GRIDDATA | DELR | DOUBLE PRECISION (NCOL) | is the column spacing in the row direction. | @@ -1549,6 +1562,7 @@ | SWF | DISV | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | SWF | DISV | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | SWF | DISV | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DISV | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | SWF | DISV | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | SWF | DISV | DIMENSIONS | NCPL | INTEGER | is the number of cells per layer. This is a constant value for the grid and it applies to all layers. | | SWF | DISV | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. | @@ -1581,6 +1595,7 @@ | SWF | CXS | CROSSSECTIONDATA | XFRACTION | DOUBLE PRECISION | real value that defines the station (x) data for the cross-section as a fraction of the width (WIDTH) of the reach. XFRACTION must be greater than or equal to zero but can be greater than one. XFRACTION values can be used to decrease or increase the width of a reach from the specified reach width (WIDTH). | | SWF | CXS | CROSSSECTIONDATA | HEIGHT | DOUBLE PRECISION | real value that is the height relative to the top of the lowest elevation of the streambed (ELEVATION) and corresponding to the station data on the same line. HEIGHT must be greater than or equal to zero and at least one cross-section height must be equal to zero. | | SWF | CXS | CROSSSECTIONDATA | MANFRACTION | DOUBLE PRECISION | real value that defines the Manning's roughness coefficient data for the cross-section as a fraction of the Manning's roughness coefficient for the reach (MANNINGSN) and corresponding to the station data on the same line. MANFRACTION must be greater than zero. MANFRACTION is applied from the XFRACTION value on the same line to the XFRACTION value on the next line. | +| SWF | IC | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | SWF | IC | GRIDDATA | STRT | DOUBLE PRECISION (NODES) | is the initial (starting) stage---that is, stage at the beginning of the SWF Model simulation. STRT must be specified for all SWF Model simulations. One value is read for every model reach. | | SWF | STO | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that cell-by-cell flow terms will be written to the file specified with ``BUDGET SAVE FILE'' in Output Control. | | SWF | STO | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | @@ -1690,6 +1705,7 @@ | PRT | DIS | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | PRT | DIS | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | PRT | DIS | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| PRT | DIS | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | PRT | DIS | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | PRT | DIS | DIMENSIONS | NROW | INTEGER | is the number of rows in the model grid. | | PRT | DIS | DIMENSIONS | NCOL | INTEGER | is the number of columns in the model grid. | @@ -1703,6 +1719,7 @@ | PRT | DISV | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | PRT | DISV | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | PRT | DISV | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| PRT | DISV | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | PRT | DISV | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | PRT | DISV | DIMENSIONS | NCPL | INTEGER | is the number of cells per layer. This is a constant value for the grid and it applies to all layers. | | PRT | DISV | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. | @@ -1718,6 +1735,7 @@ | PRT | DISV | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | | PRT | DISV | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices. | | PRT | MIP | OPTIONS | ZERO_METHOD | INTEGER | the root finding algorithm to solve ternary subcells. 0 euler, 1 brent, 2 chandrupatla, 3 test. | +| PRT | MIP | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | PRT | MIP | GRIDDATA | POROSITY | DOUBLE PRECISION (NODES) | is the aquifer porosity. | | PRT | MIP | GRIDDATA | RETFACTOR | DOUBLE PRECISION (NODES) | is a real value by which velocity is divided within a given cell. RETFACTOR can be used to account for solute retardation, i.e., the apparent effect of linear sorption on the velocity of particles that track solute advection. RETFACTOR may be assigned any real value. A RETFACTOR value greater than 1 represents particle retardation (slowing), and a value of 1 represents no retardation. The effect of specifying a RETFACTOR value for each cell is the same as the effect of directly multiplying the POROSITY in each cell by the proposed RETFACTOR value for each cell. RETFACTOR allows conceptual isolation of effects such as retardation from the effect of porosity. The default value is 1. | | PRT | MIP | GRIDDATA | IZONE | INTEGER (NODES) | is an integer zone number assigned to each cell. IZONE may be positive, negative, or zero. The current cell's zone number is recorded with each particle track datum. If the ISTOPZONE option is set to any value other than zero in a PRP Package, particles released by that PRP Package terminate if they enter a cell whose IZONE value matches ISTOPZONE. If ISTOPZONE is not specified or is set to zero in a PRP Package, IZONE has no effect on the termination of particles released by that PRP Package. | diff --git a/doc/mf6io/mf6ivar/tex/appendixA.tex b/doc/mf6io/mf6ivar/tex/appendixA.tex index 8b561661796..4fe5ef129c3 100644 --- a/doc/mf6io/mf6ivar/tex/appendixA.tex +++ b/doc/mf6io/mf6ivar/tex/appendixA.tex @@ -76,6 +76,7 @@ GWF & DISU & VERTICES & yes \\ GWF & DISU & CELL2D & yes \\ \hline +GWF & IC & OPTIONS & yes \\ GWF & IC & GRIDDATA & no \\ \hline GWF & NPF & OPTIONS & yes \\ @@ -205,6 +206,7 @@ GWT & DISU & VERTICES & yes \\ GWT & DISU & CELL2D & yes \\ \hline +GWT & IC & OPTIONS & yes \\ GWT & IC & GRIDDATA & no \\ \hline GWT & NAM & OPTIONS & yes \\ @@ -285,6 +287,7 @@ GWE & EST & GRIDDATA & no \\ GWE & EST & PACKAGEDATA & yes \\ \hline +GWE & IC & OPTIONS & yes \\ GWE & IC & GRIDDATA & no \\ \hline GWE & LKE & OPTIONS & yes \\ @@ -343,6 +346,7 @@ SWF & CXS & PACKAGEDATA & yes \\ SWF & CXS & CROSSSECTIONDATA & yes \\ \hline +SWF & IC & OPTIONS & yes \\ SWF & IC & GRIDDATA & no \\ \hline SWF & STO & OPTIONS & yes \\ diff --git a/doc/mf6io/mf6ivar/tex/gwe-cnd-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-cnd-desc.tex index c1d37b1c117..36bbc177bd2 100644 --- a/doc/mf6io/mf6ivar/tex/gwe-cnd-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwe-cnd-desc.tex @@ -7,6 +7,8 @@ \item \texttt{XT3D\_RHS}---add xt3d terms to right-hand side, when possible. This option uses less memory, but may require more iterations. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + \end{description} \item \textbf{Block: GRIDDATA} diff --git a/doc/mf6io/mf6ivar/tex/gwe-cnd-options.dat b/doc/mf6io/mf6ivar/tex/gwe-cnd-options.dat index 8fd75f9d224..406dd34271a 100644 --- a/doc/mf6io/mf6ivar/tex/gwe-cnd-options.dat +++ b/doc/mf6io/mf6ivar/tex/gwe-cnd-options.dat @@ -1,4 +1,5 @@ BEGIN OPTIONS [XT3D_OFF] [XT3D_RHS] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-dis-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-dis-desc.tex index afef5a5fa76..7bab97a07e7 100644 --- a/doc/mf6io/mf6ivar/tex/gwe-dis-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwe-dis-desc.tex @@ -13,6 +13,8 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/gwe-dis-options.dat b/doc/mf6io/mf6ivar/tex/gwe-dis-options.dat index 67e3ed895ae..965538a5ef9 100644 --- a/doc/mf6io/mf6ivar/tex/gwe-dis-options.dat +++ b/doc/mf6io/mf6ivar/tex/gwe-dis-options.dat @@ -4,4 +4,5 @@ BEGIN OPTIONS [XORIGIN ] [YORIGIN ] [ANGROT ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-disv-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-disv-desc.tex index dac7917328f..f8680fc27b7 100644 --- a/doc/mf6io/mf6ivar/tex/gwe-disv-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwe-disv-desc.tex @@ -13,6 +13,8 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/gwe-disv-options.dat b/doc/mf6io/mf6ivar/tex/gwe-disv-options.dat index 67e3ed895ae..965538a5ef9 100644 --- a/doc/mf6io/mf6ivar/tex/gwe-disv-options.dat +++ b/doc/mf6io/mf6ivar/tex/gwe-disv-options.dat @@ -4,4 +4,5 @@ BEGIN OPTIONS [XORIGIN ] [YORIGIN ] [ANGROT ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-ic-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-ic-desc.tex index 7cf8d73b07a..2bfbdda2a4e 100644 --- a/doc/mf6io/mf6ivar/tex/gwe-ic-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwe-ic-desc.tex @@ -1,5 +1,11 @@ % DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + +\end{description} \item \textbf{Block: GRIDDATA} \begin{description} diff --git a/doc/mf6io/mf6ivar/tex/gwe-ic-options.dat b/doc/mf6io/mf6ivar/tex/gwe-ic-options.dat new file mode 100644 index 00000000000..abaebbae7b1 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-ic-options.dat @@ -0,0 +1,3 @@ +BEGIN OPTIONS + [EXPORT_ARRAY_ASCII] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwf-dis-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-dis-desc.tex index 373e8d7dc02..9cf82ab73e2 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-dis-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-dis-desc.tex @@ -13,6 +13,8 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/gwf-dis-options.dat b/doc/mf6io/mf6ivar/tex/gwf-dis-options.dat index 67e3ed895ae..965538a5ef9 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-dis-options.dat +++ b/doc/mf6io/mf6ivar/tex/gwf-dis-options.dat @@ -4,4 +4,5 @@ BEGIN OPTIONS [XORIGIN ] [YORIGIN ] [ANGROT ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwf-disv-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-disv-desc.tex index 0a7eaecef44..ea97558391d 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-disv-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-disv-desc.tex @@ -13,6 +13,8 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/gwf-disv-options.dat b/doc/mf6io/mf6ivar/tex/gwf-disv-options.dat index 67e3ed895ae..965538a5ef9 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-disv-options.dat +++ b/doc/mf6io/mf6ivar/tex/gwf-disv-options.dat @@ -4,4 +4,5 @@ BEGIN OPTIONS [XORIGIN ] [YORIGIN ] [ANGROT ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwf-ic-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-ic-desc.tex index 687deda12d0..78b1934e42a 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-ic-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-ic-desc.tex @@ -1,5 +1,11 @@ % DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + +\end{description} \item \textbf{Block: GRIDDATA} \begin{description} diff --git a/doc/mf6io/mf6ivar/tex/gwf-ic-options.dat b/doc/mf6io/mf6ivar/tex/gwf-ic-options.dat new file mode 100644 index 00000000000..abaebbae7b1 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwf-ic-options.dat @@ -0,0 +1,3 @@ +BEGIN OPTIONS + [EXPORT_ARRAY_ASCII] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwf-npf-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-npf-desc.tex index ef8953febf6..440d574a1e7 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-npf-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-npf-desc.tex @@ -43,6 +43,8 @@ \item \texttt{tvk6\_filename}---defines a time-varying hydraulic conductivity (TVK) input file. Records in the TVK file can be used to change hydraulic conductivity properties at specified times or stress periods. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + \end{description} \item \textbf{Block: GRIDDATA} diff --git a/doc/mf6io/mf6ivar/tex/gwf-npf-options.dat b/doc/mf6io/mf6ivar/tex/gwf-npf-options.dat index e5f2534b933..2eb7610bb9e 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-npf-options.dat +++ b/doc/mf6io/mf6ivar/tex/gwf-npf-options.dat @@ -12,4 +12,5 @@ BEGIN OPTIONS [K22OVERK] [K33OVERK] [TVK6 FILEIN ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwt-dis-desc.tex b/doc/mf6io/mf6ivar/tex/gwt-dis-desc.tex index afef5a5fa76..7bab97a07e7 100644 --- a/doc/mf6io/mf6ivar/tex/gwt-dis-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwt-dis-desc.tex @@ -13,6 +13,8 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/gwt-dis-options.dat b/doc/mf6io/mf6ivar/tex/gwt-dis-options.dat index 67e3ed895ae..965538a5ef9 100644 --- a/doc/mf6io/mf6ivar/tex/gwt-dis-options.dat +++ b/doc/mf6io/mf6ivar/tex/gwt-dis-options.dat @@ -4,4 +4,5 @@ BEGIN OPTIONS [XORIGIN ] [YORIGIN ] [ANGROT ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwt-disv-desc.tex b/doc/mf6io/mf6ivar/tex/gwt-disv-desc.tex index dac7917328f..f8680fc27b7 100644 --- a/doc/mf6io/mf6ivar/tex/gwt-disv-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwt-disv-desc.tex @@ -13,6 +13,8 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/gwt-disv-options.dat b/doc/mf6io/mf6ivar/tex/gwt-disv-options.dat index 67e3ed895ae..965538a5ef9 100644 --- a/doc/mf6io/mf6ivar/tex/gwt-disv-options.dat +++ b/doc/mf6io/mf6ivar/tex/gwt-disv-options.dat @@ -4,4 +4,5 @@ BEGIN OPTIONS [XORIGIN ] [YORIGIN ] [ANGROT ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwt-dsp-desc.tex b/doc/mf6io/mf6ivar/tex/gwt-dsp-desc.tex index 698e321ef06..961e98c08d5 100644 --- a/doc/mf6io/mf6ivar/tex/gwt-dsp-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwt-dsp-desc.tex @@ -7,6 +7,8 @@ \item \texttt{XT3D\_RHS}---add xt3d terms to right-hand side, when possible. This option uses less memory, but may require more iterations. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + \end{description} \item \textbf{Block: GRIDDATA} diff --git a/doc/mf6io/mf6ivar/tex/gwt-dsp-options.dat b/doc/mf6io/mf6ivar/tex/gwt-dsp-options.dat index 8fd75f9d224..406dd34271a 100644 --- a/doc/mf6io/mf6ivar/tex/gwt-dsp-options.dat +++ b/doc/mf6io/mf6ivar/tex/gwt-dsp-options.dat @@ -1,4 +1,5 @@ BEGIN OPTIONS [XT3D_OFF] [XT3D_RHS] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwt-ic-desc.tex b/doc/mf6io/mf6ivar/tex/gwt-ic-desc.tex index 67081326c60..3321b676f90 100644 --- a/doc/mf6io/mf6ivar/tex/gwt-ic-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwt-ic-desc.tex @@ -1,5 +1,11 @@ % DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + +\end{description} \item \textbf{Block: GRIDDATA} \begin{description} diff --git a/doc/mf6io/mf6ivar/tex/gwt-ic-options.dat b/doc/mf6io/mf6ivar/tex/gwt-ic-options.dat new file mode 100644 index 00000000000..abaebbae7b1 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwt-ic-options.dat @@ -0,0 +1,3 @@ +BEGIN OPTIONS + [EXPORT_ARRAY_ASCII] +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/prt-dis-desc.tex b/doc/mf6io/mf6ivar/tex/prt-dis-desc.tex index afef5a5fa76..7bab97a07e7 100644 --- a/doc/mf6io/mf6ivar/tex/prt-dis-desc.tex +++ b/doc/mf6io/mf6ivar/tex/prt-dis-desc.tex @@ -13,6 +13,8 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/prt-dis-options.dat b/doc/mf6io/mf6ivar/tex/prt-dis-options.dat index 67e3ed895ae..965538a5ef9 100644 --- a/doc/mf6io/mf6ivar/tex/prt-dis-options.dat +++ b/doc/mf6io/mf6ivar/tex/prt-dis-options.dat @@ -4,4 +4,5 @@ BEGIN OPTIONS [XORIGIN ] [YORIGIN ] [ANGROT ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/prt-disv-desc.tex b/doc/mf6io/mf6ivar/tex/prt-disv-desc.tex index dac7917328f..f8680fc27b7 100644 --- a/doc/mf6io/mf6ivar/tex/prt-disv-desc.tex +++ b/doc/mf6io/mf6ivar/tex/prt-disv-desc.tex @@ -13,6 +13,8 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/prt-disv-options.dat b/doc/mf6io/mf6ivar/tex/prt-disv-options.dat index 67e3ed895ae..965538a5ef9 100644 --- a/doc/mf6io/mf6ivar/tex/prt-disv-options.dat +++ b/doc/mf6io/mf6ivar/tex/prt-disv-options.dat @@ -4,4 +4,5 @@ BEGIN OPTIONS [XORIGIN ] [YORIGIN ] [ANGROT ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/prt-mip-desc.tex b/doc/mf6io/mf6ivar/tex/prt-mip-desc.tex index ce3aa30f51a..7393d31be29 100644 --- a/doc/mf6io/mf6ivar/tex/prt-mip-desc.tex +++ b/doc/mf6io/mf6ivar/tex/prt-mip-desc.tex @@ -5,6 +5,8 @@ \begin{description} \item \texttt{zero\_method}---the root finding algorithm to solve ternary subcells. 0 euler, 1 brent, 2 chandrupatla, 3 test. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + \end{description} \item \textbf{Block: GRIDDATA} diff --git a/doc/mf6io/mf6ivar/tex/prt-mip-options.dat b/doc/mf6io/mf6ivar/tex/prt-mip-options.dat index daa82b4bb0a..b386552209c 100644 --- a/doc/mf6io/mf6ivar/tex/prt-mip-options.dat +++ b/doc/mf6io/mf6ivar/tex/prt-mip-options.dat @@ -1,3 +1,4 @@ BEGIN OPTIONS [ZERO_METHOD ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-dis2d-desc.tex b/doc/mf6io/mf6ivar/tex/swf-dis2d-desc.tex index aa27a254ab5..17b291ddbf0 100644 --- a/doc/mf6io/mf6ivar/tex/swf-dis2d-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-dis2d-desc.tex @@ -13,6 +13,8 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/swf-dis2d-options.dat b/doc/mf6io/mf6ivar/tex/swf-dis2d-options.dat index 67e3ed895ae..965538a5ef9 100644 --- a/doc/mf6io/mf6ivar/tex/swf-dis2d-options.dat +++ b/doc/mf6io/mf6ivar/tex/swf-dis2d-options.dat @@ -4,4 +4,5 @@ BEGIN OPTIONS [XORIGIN ] [YORIGIN ] [ANGROT ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-disv-desc.tex b/doc/mf6io/mf6ivar/tex/swf-disv-desc.tex index dac7917328f..f8680fc27b7 100644 --- a/doc/mf6io/mf6ivar/tex/swf-disv-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-disv-desc.tex @@ -13,6 +13,8 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/swf-disv-options.dat b/doc/mf6io/mf6ivar/tex/swf-disv-options.dat index 67e3ed895ae..965538a5ef9 100644 --- a/doc/mf6io/mf6ivar/tex/swf-disv-options.dat +++ b/doc/mf6io/mf6ivar/tex/swf-disv-options.dat @@ -4,4 +4,5 @@ BEGIN OPTIONS [XORIGIN ] [YORIGIN ] [ANGROT ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-ic-desc.tex b/doc/mf6io/mf6ivar/tex/swf-ic-desc.tex index 861ed3a4d65..bd98c108cc1 100644 --- a/doc/mf6io/mf6ivar/tex/swf-ic-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-ic-desc.tex @@ -1,5 +1,11 @@ % DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + +\end{description} \item \textbf{Block: GRIDDATA} \begin{description} diff --git a/doc/mf6io/mf6ivar/tex/swf-ic-options.dat b/doc/mf6io/mf6ivar/tex/swf-ic-options.dat new file mode 100644 index 00000000000..abaebbae7b1 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-ic-options.dat @@ -0,0 +1,3 @@ +BEGIN OPTIONS + [EXPORT_ARRAY_ASCII] +END OPTIONS From 7bca1de46f1d83a45998662ef46e6f2a8a5a13e4 Mon Sep 17 00:00:00 2001 From: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> Date: Wed, 3 Apr 2024 21:58:39 +0200 Subject: [PATCH 084/199] ci: move from mamba to pixi (#1696) * add pixi.toml environment file, equivalent to conda environment.yml * pixi.toml also defines tasks: aliases for development commands * checkin pixi lock file, add ci workflow to update it monthly * use pixi tasks in ci actions, scripts, workflows * update developer docs with pixi info --- .build_rtd_docs/update_doxyfile_version.py | 14 + .gitattributes | 3 + .github/actions/test-par-win/action.yml | 8 +- .github/actions/test-par/action.yml | 26 +- .github/common/compile_modflow6.bat | 6 +- .github/common/test_modflow6.bat | 2 +- .github/workflows/ci.yml | 180 +- .github/workflows/compilers.yml | 33 +- .github/workflows/docs.yml | 79 +- .github/workflows/large.yml | 30 +- .github/workflows/pixi_auto_update.yml | 32 + .github/workflows/release.yml | 109 +- .github/workflows/release_dispatch.yml | 35 +- .gitignore | 3 + .vscode/README.md | 4 +- .vscode/build_vscode.py | 18 +- .vscode/run_python.cmd | 3 +- .vscode/run_python.sh | 5 +- CONTRIBUTING.md | 2 +- DEVELOPER.md | 68 +- distribution/README.md | 4 +- pixi.lock | 9495 ++++++++++++++++++++ pixi.toml | 72 + 23 files changed, 9915 insertions(+), 316 deletions(-) create mode 100644 .build_rtd_docs/update_doxyfile_version.py create mode 100644 .github/workflows/pixi_auto_update.yml create mode 100644 pixi.lock create mode 100644 pixi.toml diff --git a/.build_rtd_docs/update_doxyfile_version.py b/.build_rtd_docs/update_doxyfile_version.py new file mode 100644 index 00000000000..8755cc54c9e --- /dev/null +++ b/.build_rtd_docs/update_doxyfile_version.py @@ -0,0 +1,14 @@ +import sys +import os +sys.path.insert(0, os.path.abspath(os.path.join("..", "doc"))) +from version import __version__ +print("Update the Doxyfile with the latest version number") +with open("Doxyfile", "r") as fp: + lines = fp.readlines() + +tag = "PROJECT_NUMBER" +with open("Doxyfile", "w") as fp: + for line in lines: + if tag in line: + line = '{} = "version {}"\n'.format(tag, __version__) + fp.write(line) diff --git a/.gitattributes b/.gitattributes index 9134554730d..36ea1f56347 100644 --- a/.gitattributes +++ b/.gitattributes @@ -18,3 +18,6 @@ *.inc linguist-language=Fortran .build_rtd_docs/** linguist-documentation .doc/** linguist-documentation +# GitHub syntax highlighting +pixi.lock linguist-language=YAML + diff --git a/.github/actions/test-par-win/action.yml b/.github/actions/test-par-win/action.yml index 643805d4f45..7710c058b70 100644 --- a/.github/actions/test-par-win/action.yml +++ b/.github/actions/test-par-win/action.yml @@ -8,16 +8,16 @@ runs: uses: ./modflow6/.github/actions/build-par-win - name: Update flopy - working-directory: modflow6/autotest + working-directory: modflow6 shell: cmd - run: micromamba run -r "C:\Users\runneradmin\micromamba" -n modflow6 python update_flopy.py + run: pixi run update-flopy - name: Get executables working-directory: modflow6/autotest shell: cmd env: GITHUB_TOKEN: ${{ github.token }} - run: micromamba run -r "C:\Users\runneradmin\micromamba" -n modflow6 pytest -v --durations 0 get_exes.py + run: pixi run get-exes - name: Test programs shell: cmd @@ -25,4 +25,4 @@ runs: REPOS_PATH: ${{ github.workspace }} run: | unix2dos -n "%GITHUB_WORKSPACE%\modflow6\.github\common\test_modflow6.bat" "%TEMP%\test_modflow6.bat" - "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "%TEMP%\test_modflow6.bat" \ No newline at end of file + "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "%TEMP%\test_modflow6.bat" diff --git a/.github/actions/test-par/action.yml b/.github/actions/test-par/action.yml index fb643ca9f81..b68a6da3137 100644 --- a/.github/actions/test-par/action.yml +++ b/.github/actions/test-par/action.yml @@ -48,12 +48,12 @@ runs: sudo make all - name: Build modflow6 - shell: bash -l {0} + shell: bash working-directory: modflow6 run: | - meson setup builddir -Ddebug=false -Dparallel=true --prefix=$(pwd) --libdir=bin - meson install -C builddir - meson test --verbose --no-rebuild -C builddir + pixi run setup-release-parallel builddir + pixi run install-build builddir + pixi run test-build builddir - name: Show Meson logs if: failure() @@ -62,20 +62,20 @@ runs: run: cat builddir/meson-logs/meson-log.txt - name: Update flopy - shell: bash -l {0} - working-directory: modflow6/autotest - run: python update_flopy.py + shell: bash + working-directory: modflow6 + run: pixi run update-flopy - name: Get executables - shell: bash -l {0} - working-directory: modflow6/autotest + shell: bash + working-directory: modflow6 env: GITHUB_TOKEN: ${{ github.token }} - run: pytest -v --durations 0 get_exes.py + run: pixi run get-exes - name: Test programs - shell: bash -l {0} - working-directory: modflow6/autotest + shell: bash + working-directory: modflow6 env: REPOS_PATH: ${{ github.workspace }} - run: pytest -v -n auto --parallel --durations 0 -k "test_par" --keep-failed .failed \ No newline at end of file + run: pixi run autotest-parallel diff --git a/.github/common/compile_modflow6.bat b/.github/common/compile_modflow6.bat index 874a255488b..179bbc01959 100644 --- a/.github/common/compile_modflow6.bat +++ b/.github/common/compile_modflow6.bat @@ -1,5 +1,5 @@ set FC=ifort cd "%GITHUB_WORKSPACE%\modflow6" -micromamba run -r "C:\Users\runneradmin\micromamba" -n modflow6 meson setup builddir -Ddebug=false -Dparallel=true --prefix=%CD% --libdir=bin -micromamba run -r "C:\Users\runneradmin\micromamba" -n modflow6 meson install -C builddir -micromamba run -r "C:\Users\runneradmin\micromamba" -n modflow6 meson test --verbose --no-rebuild -C builddir \ No newline at end of file +pixi run setup-release-parallel builddir +pixi run install-build builddir +pixi run test-build builddir diff --git a/.github/common/test_modflow6.bat b/.github/common/test_modflow6.bat index 8fe57923c32..68dcf45f727 100644 --- a/.github/common/test_modflow6.bat +++ b/.github/common/test_modflow6.bat @@ -1,4 +1,4 @@ cd "%GITHUB_WORKSPACE%\modflow6\autotest" where libpetsc.dll ldd ..\bin\mf6 -micromamba run -r "C:\Users\runneradmin\micromamba" -n modflow6 pytest -v -n auto --parallel -k "test_par" --durations 0 --keep-failed .failed \ No newline at end of file +pixi run autotest-parallel diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cf4337f7b43..ae52964dc0d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,8 @@ name: MODFLOW 6 continuous integration on: push: + branches: [master, develop, update/pixi-lock] + tags: ["*"] paths-ignore: - '**.md' - '**.pdf' @@ -35,30 +37,27 @@ on: - 'doc/**.sh' - 'doc/**.xlsx' - '.hpc/**' +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true jobs: lint: name: Check format runs-on: ubuntu-latest - defaults: - run: - shell: bash -l {0} steps: - name: Checkout modflow6 uses: actions/checkout@v4 - - name: Setup Micromamba - uses: mamba-org/setup-micromamba@v1 + - uses: prefix-dev/setup-pixi@v0.5.1 with: - environment-file: environment.yml - cache-environment: true - cache-downloads: true + pixi-version: "latest" - name: Check Fortran source formatting - run: python .github/common/fortran_format_check.py + run: pixi run fortran-format-check - name: Check MSVS project files - run: python .github/common/msvs_vfproj_check.py + run: pixi run msvs-vfproj-check - name: Check CITATION.cff uses: dieghernan/cff-validator@v3 @@ -66,9 +65,6 @@ jobs: build: name: Build runs-on: ubuntu-22.04 - defaults: - run: - shell: bash -l {0} env: FC: gfortran FC_V: 13 @@ -83,32 +79,29 @@ jobs: compiler: gcc version: ${{ env.FC_V }} - - name: Setup Micromamba - uses: mamba-org/setup-micromamba@v1 + - uses: prefix-dev/setup-pixi@v0.5.1 with: - environment-file: environment.yml - cache-environment: true - cache-downloads: true + pixi-version: "latest" - name: Meson setup - run: meson setup builddir -Ddebug=false -Dwerror=true + run: pixi run setup-strict builddir - name: Meson compile - run: meson compile -C builddir + run: pixi run compile-build builddir - name: Show build log if: failure() run: cat builddir/meson-logs/meson-log.txt - name: Meson test - run: meson test --verbose --no-rebuild -C builddir + run: pixi run test-build builddir smoke_test: name: Smoke test runs-on: ubuntu-22.04 defaults: run: - shell: bash -l {0} + shell: bash env: FC: gfortran FC_V: 13 @@ -130,25 +123,27 @@ jobs: compiler: gcc version: ${{ env.FC_V }} - - name: Setup Micromamba - uses: mamba-org/setup-micromamba@v1 + - uses: prefix-dev/setup-pixi@v0.5.1 with: - environment-file: modflow6/environment.yml - cache-environment: true - cache-downloads: true + pixi-version: "latest" + manifest-path: "modflow6/pixi.toml" + + - name: Setup pixi + working-directory: modflow6 + run: pixi run install - name: Build test-drive working-directory: test-drive run: | - meson setup builddir --prefix=$(pwd) --libdir=lib - meson install -C builddir + pixi run --manifest-path=../modflow6/pixi.toml meson setup builddir --prefix=$(pwd) --libdir=lib + pixi run --manifest-path=../modflow6/pixi.toml meson install -C builddir echo "PKG_CONFIG_PATH=$(pwd)/lib/pkgconfig:$PKG_CONFIG_PATH" >> $GITHUB_ENV - name: Build modflow6 working-directory: modflow6 run: | - meson setup builddir -Ddebug=false --prefix=$(pwd) --libdir=bin - meson install -C builddir + pixi run setup-release builddir + pixi run install-build builddir - name: Show build log if: failure() @@ -157,25 +152,25 @@ jobs: - name: Unit test programs working-directory: modflow6 - run: meson test --verbose --no-rebuild -C builddir + run: pixi run test-build builddir - name: Update flopy - working-directory: modflow6/autotest - run: python update_flopy.py + working-directory: modflow6 + run: pixi run update-flopy - name: Get executables - working-directory: modflow6/autotest + working-directory: modflow6 env: GITHUB_TOKEN: ${{ github.token }} - run: pytest -v --durations 0 get_exes.py + run: pixi run get-exes - name: Test programs - working-directory: modflow6/autotest + working-directory: modflow6 run: | if [ "${{ github.ref_name }}" == "master" ]; then - pytest -v -n auto --durations 0 -m "not slow and not regression and not developmode" --keep-failed .failed + pixi run autotest-marker "not slow and not regression and not developmode" else - pytest -v -n auto --durations 0 -S --keep-failed .failed + pixi run autotest fi - name: Upload failed test output @@ -198,7 +193,7 @@ jobs: os: [ ubuntu-22.04, macos-12, windows-2022 ] defaults: run: - shell: bash -l {0} + shell: bash env: FC: gfortran FC_V: 13 @@ -226,23 +221,20 @@ jobs: compiler: gcc version: ${{ env.FC_V }} - - name: Setup Micromamba - uses: mamba-org/setup-micromamba@v1 + - uses: prefix-dev/setup-pixi@v0.5.1 with: - environment-file: modflow6/environment.yml - create-args: >- - python=3.9 - init-shell: >- - bash - powershell - cache-environment: true - cache-downloads: true + pixi-version: "latest" + manifest-path: "modflow6/pixi.toml" + + - name: Setup pixi + working-directory: modflow6 + run: pixi run install - name: Build modflow6 working-directory: modflow6 run: | - meson setup builddir -Ddebug=false --prefix=$(pwd) --libdir=bin - meson install -C builddir + pixi run setup-release builddir + pixi run install-build builddir - name: Show build log if: failure() @@ -251,27 +243,27 @@ jobs: - name: Unit test programs working-directory: modflow6 - run: meson test --verbose --no-rebuild -C builddir + run: pixi run test-build builddir - name: Update flopy - working-directory: modflow6/autotest - run: python update_flopy.py + working-directory: modflow6 + run: pixi run update-flopy - name: Get executables working-directory: modflow6/autotest env: GITHUB_TOKEN: ${{ github.token }} - run: pytest -v --durations 0 get_exes.py + run: pixi run get-exes - name: Test modflow6 - working-directory: modflow6/autotest + working-directory: modflow6 env: REPOS_PATH: ${{ github.workspace }} run: | if [ "${{ github.ref_name }}" == "master" ]; then - pytest -v -n auto --durations 0 -m "not large and not developmode" --keep-failed .failed + pixi run autotest-marker "not large and not developmode" else - pytest -v -n auto --durations 0 -m "not large" --keep-failed .failed + pixi run autotest-marker "not large" fi - name: Upload failed test output @@ -304,10 +296,10 @@ jobs: run: sudo ./install.sh --all-users - name: Test distribution scripts - working-directory: modflow6/distribution + working-directory: modflow6 env: GITHUB_TOKEN: ${{ github.token }} - run: pytest -v --durations 0 + run: pixi run test-distribution test_intel_fortran: name: Test intel fortran @@ -325,7 +317,7 @@ jobs: os: [ubuntu-22.04, macos-12, windows-2022] defaults: run: - shell: bash -l {0} + shell: bash steps: - name: Checkout modflow6 @@ -345,15 +337,14 @@ jobs: repository: MODFLOW-USGS/modflow6-examples path: modflow6-examples - - name: Setup Micromamba - uses: mamba-org/setup-micromamba@v1 + - uses: prefix-dev/setup-pixi@v0.5.1 with: - environment-file: modflow6/environment.yml - init-shell: >- - bash - powershell - cache-environment: true - cache-downloads: true + pixi-version: "latest" + manifest-path: "modflow6/pixi.toml" + + - name: Setup pixi + working-directory: modflow6 + run: pixi run install - name: Setup ${{ env.FC }} ${{ env.FC_V }} uses: fortran-lang/setup-fortran@v1 @@ -362,14 +353,14 @@ jobs: version: ${{ env.FC_V }} - name: Update version files - working-directory: modflow6/distribution - run: python update_version.py + working-directory: modflow6 + run: pixi run update-version - name: Build modflow6 working-directory: modflow6 run: | - meson setup builddir -Ddebug=false --prefix=$(pwd) --libdir=bin - meson install -C builddir + pixi run setup-release builddir + pixi run install-build builddir - name: Show build log if: failure() @@ -378,27 +369,27 @@ jobs: - name: Unit test programs working-directory: modflow6 - run: meson test --verbose --no-rebuild -C builddir + run: pixi run test-build builddir - name: Update flopy - working-directory: modflow6/autotest - run: python update_flopy.py + working-directory: modflow6 + run: pixi run update-flopy - name: Get executables - working-directory: modflow6/autotest + working-directory: modflow6 env: GITHUB_TOKEN: ${{ github.token }} - run: pytest -v --durations 0 get_exes.py + run: pixi run get-exes - name: Test programs - working-directory: modflow6/autotest + working-directory: modflow6 env: REPOS_PATH: ${{ github.workspace }} run: | if [ "${{ github.ref_name }}" == "master" ]; then - pytest -v -n auto --durations 0 -m "not large and not developmode" --keep-failed .failed + pixi run autotest-marker "not large and not developmode" else - pytest -v -n auto --durations 0 -m "not large" --keep-failed .failed + pixi run autotest-marker "not large" fi - name: Upload failed test output @@ -409,10 +400,10 @@ jobs: path: modflow6/autotest/.failed - name: Test scripts - working-directory: modflow6/distribution + working-directory: modflow6 env: GITHUB_TOKEN: ${{ github.token }} - run: pytest -v --durations 0 + run: pixi run test-distribution parallel_test: name: Parallel testing @@ -427,7 +418,7 @@ jobs: os: [ ubuntu-22.04, macos-12, windows-2022 ] defaults: run: - shell: bash -l {0} + shell: bash steps: @@ -436,17 +427,14 @@ jobs: with: path: modflow6 - - name: Setup Micromamba - uses: mamba-org/setup-micromamba@v1 + - uses: prefix-dev/setup-pixi@v0.5.1 with: - environment-file: modflow6/environment.yml - create-args: >- - python=3.9 - init-shell: >- - bash - powershell - cache-environment: true - cache-downloads: true + pixi-version: "latest" + manifest-path: "modflow6/pixi.toml" + + - name: Setup pixi + working-directory: modflow6 + run: pixi run install - name: Test parallel MF6 if: runner.os != 'Windows' @@ -461,4 +449,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: failed-${{ matrix.os }} - path: modflow6/autotest/.failed \ No newline at end of file + path: modflow6/autotest/.failed diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index 4f91d47df30..bf73aa7d719 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -132,7 +132,7 @@ jobs: - {os: windows-2022, compiler: intel-classic, version: 2021.6} defaults: run: - shell: bash -l {0} + shell: bash steps: - name: Checkout modflow6 uses: actions/checkout@v4 @@ -157,21 +157,20 @@ jobs: compiler: ${{ matrix.compiler}} version: ${{ matrix.version }} - - name: Setup Micromamba - uses: mamba-org/setup-micromamba@v1 + - uses: prefix-dev/setup-pixi@v0.5.1 with: - environment-file: modflow6/environment.yml - init-shell: >- - bash - powershell - cache-environment: true - cache-downloads: true + pixi-version: "latest" + manifest-path: "modflow6/pixi.toml" + + - name: Setup pixi + working-directory: modflow6 + run: pixi run install - name: Build modflow6 working-directory: modflow6 run: | - meson setup builddir -Ddebug=false --prefix=$(pwd) --libdir=bin - meson install -C builddir + pixi run setup-release builddir + pixi run install-build builddir - name: Show build log if: failure() @@ -188,7 +187,7 @@ jobs: - name: Unit test programs if: success() working-directory: modflow6 - run: meson test --verbose --no-rebuild -C builddir + run: pixi run test-build builddir - name: Create compile report if: success() || failure() @@ -207,21 +206,21 @@ jobs: - name: Update flopy if: success() working-directory: modflow6/autotest - run: python update_flopy.py + run: pixi run update-flopy - name: Get executables if: success() working-directory: modflow6/autotest env: GITHUB_TOKEN: ${{ github.token }} - run: pytest -v --durations 0 get_exes.py + run: pixi run get-exes - name: Test modflow6 if: success() - working-directory: modflow6/autotest + working-directory: modflow6 env: REPOS_PATH: ${{ github.workspace }} - run: pytest -v -n auto --durations 0 + run: pixi run autotest - name: Create test report if: success() || failure() @@ -354,4 +353,4 @@ jobs: # open PR cat <(echo '### Compile') <(echo) .github/compat/comp.md <(echo) <(echo '### Test') <(echo) .github/compat/test.md > compat.md - gh pr create -B "${{ github.event.repository.default_branch }}" -H "$head" --title "Update compile/test compatibility tables" --body-file compat.md \ No newline at end of file + gh pr create -B "${{ github.event.repository.default_branch }}" -H "$head" --title "Update compile/test compatibility tables" --body-file compat.md diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 37743f39fc4..d31b26d4e12 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -40,19 +40,22 @@ jobs: repository: MODFLOW-USGS/usgslatex path: usgslatex - - name: Install Conda environment from environment.yml - uses: mamba-org/setup-micromamba@v1 + - uses: prefix-dev/setup-pixi@v0.5.1 with: - environment-file: modflow6/environment.yml - cache-environment: true - cache-downloads: true - + pixi-version: "latest" + manifest-path: "modflow6/pixi.toml" + + - name: Setup pixi + working-directory: modflow6 + run: pixi run install + - name: Install additional packages for Sphinx using pip working-directory: modflow6/.build_rtd_docs - run: pip install -r requirements.rtd.txt + run: pixi run pip install -r requirements.rtd.txt - name: Print python package versions - run: pip list + working-directory: modflow6 + run: pixi run pip list - name: Install TeX Live run: | @@ -65,7 +68,7 @@ jobs: - name: Test building files from dfn's for LaTeX working-directory: modflow6/autotest - run: pytest -v build_mfio_tex.py + run: pixi run pytest -v build_mfio_tex.py - name: Setup ${{ env.FC }} ${{ env.FC_V }} uses: fortran-lang/setup-fortran@v1 @@ -82,26 +85,26 @@ jobs: - name: Install extra Python packages if: steps.cache-examples.outputs.cache-hit != 'true' - working-directory: modflow6-examples/etc + working-directory: modflow6 run: | - pip install -r requirements.pip.txt - pip install -r requirements.usgs.txt + pixi run pip install -r ../modflow6-examples/etc/requirements.pip.txt + pixi run pip install -r ../modflow6-examples/etc/requirements.usgs.txt - name: Update FloPy if: steps.cache-examples.outputs.cache-hit != 'true' working-directory: modflow6/autotest - run: python update_flopy.py + run: pixi run update-flopy - name: Build example models if: steps.cache-examples.outputs.cache-hit != 'true' working-directory: modflow6-examples/autotest run: | - pytest -v -n auto test_scripts.py --init + pixi run pytest -v -n auto test_scripts.py --init ls -lh ../examples/ - name: Run benchmarks - working-directory: modflow6/distribution - run: python benchmark.py + working-directory: modflow6 + run: pixi run benchmark env: GITHUB_TOKEN: ${{ github.token }} @@ -116,8 +119,8 @@ jobs: path: modflow6/distribution/run-time-comparison.md - name: Collect deprecations - working-directory: modflow6/doc/mf6io/mf6ivar - run: python deprecations.py + working-directory: modflow6 + run: pixi run deprecations - name: Show deprecations working-directory: modflow6/doc/mf6io/mf6ivar/md @@ -130,8 +133,8 @@ jobs: path: modflow6/doc/mf6io/mf6ivar/md/deprecations.md - name: Run sphinx - working-directory: modflow6/.build_rtd_docs - run: make html + working-directory: modflow6 + run: pixi run sphinx - name: Upload results uses: actions/upload-artifact@v3 @@ -165,12 +168,11 @@ jobs: runs-on: ubuntu-22.04 env: working-directory: .build_rtd_docs - distribution-directory: distribution common-directory: .github/common branch-name: ${GITHUB_REF##*/} defaults: run: - shell: bash -l {0} + shell: bash steps: - uses: actions/checkout@v4 @@ -183,38 +185,21 @@ jobs: sudo apt-get update sudo apt-get install doxygen graphviz - - name: Install Conda environment from environment.yml - uses: mamba-org/setup-micromamba@v1 + - uses: prefix-dev/setup-pixi@v0.5.1 with: - environment-file: environment.yml - cache-environment: true - cache-downloads: true + pixi-version: "latest" + + - name: Setup pixi + run: pixi run install - name: Print python package versions - run: pip list + run: pixi run pip list - name: update MODFLOW 6 version - run: python update_version.py - working-directory: ${{env.distribution-directory}} + run: pixi run update-version - name: update MODFLOW 6 version in Doxyfile - run: | - import sys - import os - sys.path.insert(0, os.path.abspath(os.path.join("..", "doc"))) - from version import __version__ - print("Update the Doxyfile with the latest version number") - with open("Doxyfile", "r") as fp: - lines = fp.readlines() - - tag = "PROJECT_NUMBER" - with open("Doxyfile", "w") as fp: - for line in lines: - if tag in line: - line = '{} = "version {}"\n'.format(tag, __version__) - fp.write(line) - shell: python - working-directory: ${{env.working-directory}} + run: pixi run update-doxyfile-version - name: run doxygen run: doxygen diff --git a/.github/workflows/large.yml b/.github/workflows/large.yml index 25aad3fd825..a52b35b20c3 100644 --- a/.github/workflows/large.yml +++ b/.github/workflows/large.yml @@ -64,12 +64,14 @@ jobs: repository: MODFLOW-USGS/modflow6-largetestmodels path: modflow6-largetestmodels - - name: Setup Micromamba - uses: mamba-org/setup-micromamba@v1 + - uses: prefix-dev/setup-pixi@v0.5.1 with: - environment-file: modflow6/environment.yml - cache-downloads: true - cache-environment: true + pixi-version: "latest" + manifest-path: "modflow6/pixi.toml" + + - name: Setup pixi + working-directory: modflow6 + run: pixi run install - name: Setup ${{ matrix.compiler }} ${{ matrix.version }} uses: fortran-lang/setup-fortran@v1 @@ -80,26 +82,26 @@ jobs: - name: Build modflow6 working-directory: modflow6 run: | - meson setup builddir --prefix=$(pwd) --libdir=bin - meson install -C builddir + pixi run setup-release builddir + pixi run install-build builddir - name: Get executables - working-directory: modflow6/autotest + working-directory: modflow6 env: GITHUB_TOKEN: ${{ github.token }} - run: pytest -v --durations 0 get_exes.py + run: pixi run get-exes - name: Update flopy - working-directory: modflow6/autotest - run: python update_flopy.py + working-directory: modflow6 + run: pixi run update-flopy - name: Run tests - working-directory: modflow6/autotest - run: pytest -v -n auto --durations 0 test_largetestmodels.py --keep-failed .failed + working-directory: modflow6 + run: pixi run autotest-large - name: Upload failed test output if: failure() uses: actions/upload-artifact@v4 with: name: failed-${{ runner.os }}-${{ matrix.compiler }}-${{ matrix.version }} - path: modflow6/autotest/.failed \ No newline at end of file + path: modflow6/autotest/.failed diff --git a/.github/workflows/pixi_auto_update.yml b/.github/workflows/pixi_auto_update.yml new file mode 100644 index 00000000000..0b909659944 --- /dev/null +++ b/.github/workflows/pixi_auto_update.yml @@ -0,0 +1,32 @@ +name: Pixi auto update + +on: + schedule: + # At 03:00 on day 3 of the month + - cron: "0 3 3 * *" + # on demand + workflow_dispatch: + +jobs: + auto-update: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ssh-key: ${{ secrets.SSH_PRIVATE_KEY }} + - uses: prefix-dev/setup-pixi@v0.5.1 + with: + pixi-version: "latest" + cache: false + - name: Update pixi lock file + run: | + rm pixi.lock + pixi install + - uses: peter-evans/create-pull-request@v6 + with: + token: ${{ secrets.GITHUB_TOKEN }} + branch: update/pixi-lock + title: Update pixi lock file + commit-message: "Update `pixi.lock`" + body: Update pixi dependencies to the latest version. + author: "GitHub " diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 733c8cfa7d8..59b91e24e46 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -96,15 +96,14 @@ jobs: path: modflow6 ref: ${{ inputs.branch }} - - name: Setup Micromamba - uses: mamba-org/setup-micromamba@v1 + - uses: prefix-dev/setup-pixi@v0.5.1 with: - environment-file: modflow6/environment.yml - cache-downloads: true - cache-environment: true - init-shell: >- - bash - powershell + pixi-version: "latest" + manifest-path: "modflow6/pixi.toml" + + - name: Setup pixi + working-directory: modflow6 + run: pixi run install - name: Setup ${{ matrix.compiler }} ${{ matrix.version }} if: (!(runner.os == 'Windows' && matrix.parallel)) @@ -129,6 +128,7 @@ jobs: - name: Update version id: update_version working-directory: modflow6/distribution + shell: pixi run bash -e {0} run: | ver="${{ steps.set_version.outputs.version }}" cmd="python update_version.py -v $ver" @@ -142,6 +142,7 @@ jobs: - name: Get OS tag id: ostag + shell: pixi run bash -e {0} run: | ostag=$(python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") if [[ "${{ matrix.parallel }}" == "true" ]]; then @@ -169,9 +170,9 @@ jobs: if: (!(runner.os == 'Windows' && matrix.parallel)) working-directory: modflow6 run: | - meson setup builddir -Ddebug=false --prefix=$(pwd) --libdir=bin - meson install -C builddir - meson test --verbose --no-rebuild -C builddir + pixi run setup-release builddir + pixi run install-build builddir + pixi run test-build builddir - name: Check architecture (macOS) working-directory: modflow6/bin @@ -242,19 +243,19 @@ jobs: - name: Update flopy if: inputs.run_tests == true && runner.os != 'Windows' - working-directory: modflow6/autotest - run: python update_flopy.py + working-directory: modflow6 + run: pixi run update-flopy - name: Get executables if: inputs.run_tests == true && runner.os != 'Windows' working-directory: modflow6/autotest env: GITHUB_TOKEN: ${{ github.token }} - run: pytest -v --durations 0 get_exes.py + run: pixi run get-exes - name: Test modflow6 if: inputs.run_tests == true && runner.os != 'Windows' - working-directory: modflow6/autotest + working-directory: modflow6 env: REPOS_PATH: ${{ github.workspace }} run: | @@ -262,7 +263,7 @@ jobs: if [[ "${{ inputs.developmode }}" == "false" ]]; then markers="$markers and not developmode" fi - pytest -v -n auto --durations 0 -m "$markers" + pixi run autotest-markers "$markers" - name: Upload failed test output if: failure() @@ -300,7 +301,7 @@ jobs: working-directory: modflow6/distribution env: GITHUB_TOKEN: ${{ github.token }} - run: pytest -v --durations 0 + run: pixi run test-distribution docs: name: Build docs @@ -343,12 +344,14 @@ jobs: working-directory: usgslatex/usgsLaTeX run: sudo ./install.sh --all-users - - name: Setup Micromamba - uses: mamba-org/setup-micromamba@v1 + - uses: prefix-dev/setup-pixi@v0.5.1 with: - environment-file: modflow6/environment.yml - cache-downloads: true - cache-environment: true + pixi-version: "latest" + manifest-path: "modflow6/pixi.toml" + + - name: Setup pixi + working-directory: modflow6 + run: pixi run install - name: Setup ${{ inputs.compiler_toolchain }} ${{ inputs.compiler_version }} uses: fortran-lang/setup-fortran@v1 @@ -359,6 +362,7 @@ jobs: - name: Update version id: update_version working-directory: modflow6/distribution + shell: pixi run bash -e {0} run: | ver="${{ needs.build.outputs.version }}" cmd="python update_version.py -v $ver" @@ -371,8 +375,8 @@ jobs: eval "$cmd" - name: Update FloPy classes - working-directory: modflow6/autotest - run: python update_flopy.py + working-directory: modflow6 + run: pixi run update-flopy - name: Get OS tag id: ostag @@ -396,18 +400,23 @@ jobs: - name: Install dependencies for building models if: inputs.full == true - working-directory: modflow6-examples/etc + shell: pixi run bash -e {0} + working-directory: modflow6 env: GITHUB_TOKEN: ${{ github.token }} run: | + cd ../modflow6-examples/etc pip install -r requirements.pip.txt echo "${{ github.workspace }}/bin" >> $GITHUB_PATH get-modflow "${{ github.workspace }}/bin" --subset mf2005,triangle,gridgen - name: Build example models if: inputs.full == true - working-directory: modflow6-examples/autotest - run: pytest -v -n auto test_scripts.py --init + working-directory: modflow6 + shell: pixi run bash -e {0} + run: | + cd ../modflow6-examples/autotest + pytest -v -n auto test_scripts.py --init - name: Create folder structure if: inputs.full == true @@ -426,13 +435,12 @@ jobs: cp -r modflow6/utils/zonebudget "$distname/utils/zonebudget" # create LaTeX file describing the folder structure - cd modflow6/doc/ReleaseNotes - python mk_folder_struct.py -dp "${{ github.workspace }}/$distname" + pixi run mk-folder-struct -dp "${{ github.workspace }}/$distname" - name: Collect deprecations working-directory: modflow6/doc/mf6io/mf6ivar run: | - python deprecations.py + pixi run deprecations cat md/deprecations.md - name: Upload deprecations @@ -442,12 +450,15 @@ jobs: path: modflow6/doc/mf6io/mf6ivar/md/deprecations.md - name: Build documentation + working-directory: modflow6 + shell: pixi run bash -e {0} env: # this step is lazy about building the mf6 examples PDF document, first # trying to download a prebuilt PDF from MODFLOW-USGS/modflow6-examples, # so it needs a GITHUB_TOKEN. GITHUB_TOKEN: ${{ github.token }} run: | + cd .. mkdir -p "${{ needs.build.outputs.distname }}/doc" cmd="python modflow6/distribution/build_docs.py -b bin -o doc" if [[ "${{ inputs.full }}" == "true" ]]; then @@ -496,15 +507,14 @@ jobs: repository: MODFLOW-USGS/modflow6-examples path: modflow6-examples - - name: Setup Micromamba - uses: mamba-org/setup-micromamba@v1 + - uses: prefix-dev/setup-pixi@v0.5.1 with: - environment-file: modflow6/environment.yml - cache-downloads: true - cache-environment: true - init-shell: >- - bash - powershell + pixi-version: "latest" + manifest-path: "modflow6/pixi.toml" + + - name: Setup pixi + working-directory: modflow6 + run: pixi run install - name: Setup ${{ inputs.compiler_toolchain }} ${{ inputs.compiler_version }} uses: fortran-lang/setup-fortran@v1 @@ -514,8 +524,10 @@ jobs: - name: Update version id: update_version - working-directory: modflow6/distribution + working-directory: modflow6 + shell: pixi run bash -e {0} run: | + cd distribution ver="${{ needs.build.outputs.version }}" cmd="python update_version.py -v $ver" if [[ "${{ inputs.approve }}" == "true" ]]; then @@ -528,7 +540,10 @@ jobs: - name: Get OS tag id: ostag + working-directory: modflow6 + shell: pixi run bash -e {0} run: | + cd .. ostag=$(python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") if [[ "${{ matrix.parallel }}" == "true" ]]; then ostag="${ostag}par" @@ -559,7 +574,10 @@ jobs: - name: Install dependencies for example models env: GITHUB_TOKEN: ${{ github.token }} + working-directory: modflow6 + shell: pixi run bash -e {0} run: | + cd .. pip install -r modflow6-examples/etc/requirements.pip.txt distname="${{ needs.build.outputs.distname }}_${{ steps.ostag.outputs.ostag }}" echo "$distname/bin" >> $GITHUB_PATH @@ -576,14 +594,19 @@ jobs: - name: Update Flopy working-directory: modflow6/autotest - run: python update_flopy.py + run: pixi run update-flopy - name: Build example models if: inputs.full == true - working-directory: modflow6-examples/autotest - run: pytest -v -n auto test_scripts.py --init + working-directory: modflow6 + shell: pixi run bash -e {0} + run: | + cd ../modflow6-examples/autotest + pytest -v -n auto test_scripts.py --init - name: Build distribution + working-directory: modflow6 + shell: pixi run bash -e {0} env: GITHUB_TOKEN: ${{ github.token }} run: | @@ -704,4 +727,4 @@ jobs: if [[ "${{ inputs.full }}" == "true" ]]; then cmd="$cmd --full" fi - eval "$cmd" \ No newline at end of file + eval "$cmd" diff --git a/.github/workflows/release_dispatch.yml b/.github/workflows/release_dispatch.yml index 77d159d0f46..e889d1c2486 100644 --- a/.github/workflows/release_dispatch.yml +++ b/.github/workflows/release_dispatch.yml @@ -149,7 +149,7 @@ jobs: pull-requests: write defaults: run: - shell: bash -l {0} + shell: bash steps: - name: Checkout modflow6 uses: actions/checkout@v4 @@ -157,12 +157,14 @@ jobs: repository: ${{ github.repository_owner }}/modflow6 ref: ${{ github.ref }} - - name: Setup Micromamba - uses: mamba-org/setup-micromamba@v1 + - uses: prefix-dev/setup-pixi@v0.5.1 with: - environment-file: environment.yml - cache-downloads: true - cache-environment: true + pixi-version: "latest" + manifest-path: "modflow6/pixi.toml" + + - name: Setup pixi + working-directory: modflow6 + run: pixi run install - name: Update version working-directory: distribution @@ -172,13 +174,13 @@ jobs: # approve will be empty if workflow was triggered by pushing a release branch # todo: pull approve into set_options job/output? if [[ ("${{ inputs.approve }}" == "true") || ("${{ inputs.approve }}" == "") ]]; then - python update_version.py -v "$ver" --approve + pixi run update-version -v "$ver" --approve else - python update_version.py -v "$ver" + pixi run update-version -v "$ver" fi # lint version.f90 - fprettify -c ../.fprettify.yaml ../src/Utilities/version.f90 + pixi run fprettify -c ../.fprettify.yaml ../src/Utilities/version.f90 # commit and push git config core.sharedRepository true @@ -209,7 +211,7 @@ jobs: runs-on: ubuntu-22.04 defaults: run: - shell: bash -l {0} + shell: bash steps: - name: Checkout modflow6 uses: actions/checkout@v4 @@ -217,12 +219,14 @@ jobs: repository: ${{ github.repository_owner }}/modflow6 path: modflow6 - - name: Setup Micromamba - uses: mamba-org/setup-micromamba@v1 + - uses: prefix-dev/setup-pixi@v0.5.1 with: - environment-file: modflow6/environment.yml - cache-downloads: true - cache-environment: true + pixi-version: "latest" + manifest-path: "modflow6/pixi.toml" + + - name: Setup pixi + working-directory: modflow6 + run: pixi run install - name: Download artifacts uses: dawidd6/action-download-artifact@v3 @@ -231,6 +235,7 @@ jobs: working-directory: modflow6 env: GITHUB_TOKEN: ${{ github.token }} + shell: pixi run bash -e {0} run: | # create draft release version=$(python distribution/update_version.py -g) diff --git a/.gitignore b/.gitignore index 67be4780390..a45b2864baa 100644 --- a/.gitignore +++ b/.gitignore @@ -134,6 +134,7 @@ modflow6.code-workspace # unittests unittests/ +autotest/.failed **/__pycache__ **/.benchmarks @@ -142,3 +143,5 @@ unittests/ .github/compat/*.md **.DS_Store +# pixi environments +.pixi diff --git a/.vscode/README.md b/.vscode/README.md index 962fe1d07b2..93941be54b3 100644 --- a/.vscode/README.md +++ b/.vscode/README.md @@ -41,10 +41,10 @@ In general, to determine the path of an installed tool in your environment run: - cmd: `where `, e.g. `where python` - PowerShell: `Get-Command ` e.g. `Get-Command fprettify` -1. Activate the conda environment: +1. Activate the pixi environment: ```bash -conda activate modflow6 +pixi shell ``` 2. Determine the path of `fortls` and `fprettify` diff --git a/.vscode/build_vscode.py b/.vscode/build_vscode.py index d222cc7c772..654e70fca42 100644 --- a/.vscode/build_vscode.py +++ b/.vscode/build_vscode.py @@ -21,22 +21,8 @@ if args.action == "rebuild" and os.path.isdir(builddir): shutil.rmtree(builddir) -if args.buildtype == "release": - setup_flag = ["-Doptimization=2"] -elif args.buildtype == "debug": - setup_flag = ["-Ddebug=true", "-Doptimization=0"] - if not os.path.isdir(builddir): - command = [ - "meson", - "setup", - builddir, - "--prefix", - os.getcwd(), - "--libdir", - "bin", - arg_parallel, - ] + setup_flag + command = ["pixi", "run", f"setup-{args.buildtype}", builddir, arg_parallel] print("Run:", shlex.join(command)) subprocess.run( command, @@ -51,6 +37,6 @@ if os.path.isfile(path): os.remove(path) -command = ["meson", "install", "-C", builddir] +command = ["pixi", "run", "install-build", builddir] print("Run:", shlex.join(command)) subprocess.run(command, check=True) diff --git a/.vscode/run_python.cmd b/.vscode/run_python.cmd index 87c6f3de58b..43318bc5015 100644 --- a/.vscode/run_python.cmd +++ b/.vscode/run_python.cmd @@ -4,7 +4,6 @@ if "%3" == "ifort" ( call "C:\Program Files (x86)\Intel\oneAPI\setvars.bat" ) -call conda activate modflow6 rem run python script -python %1 %2 %3 %4 %5 %6 +pixi run python %1 %2 %3 %4 %5 %6 diff --git a/.vscode/run_python.sh b/.vscode/run_python.sh index cbd3b27fcc9..6977d7a2fe1 100755 --- a/.vscode/run_python.sh +++ b/.vscode/run_python.sh @@ -5,8 +5,5 @@ then source /opt/intel/oneapi/setvars.sh fi -eval "$(conda shell.bash hook)" -conda activate modflow6 - # run python script -python $1 $2 $3 $4 $5 $6 +pixi run python $1 $2 $3 $4 $5 $6 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e751d48539d..5845a06f4b6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -141,7 +141,7 @@ To ensure consistency throughout the source code, keep these rules in mind as yo ## Format Rules Fortran souce code format rules are met by running the -[fprettify formatter](https://github.com/pseewald/fprettify) while specifying the [MODFLOW 6 fprettify configuration](.fprettify.yaml). `fprettify` is included in the Conda `environment.yml` and can be run on the command line or integrated into a [VSCode](.vscode/README.md) or Visual Studio environment. +[fprettify formatter](https://github.com/pseewald/fprettify) while specifying the [MODFLOW 6 fprettify configuration](.fprettify.yaml). `fprettify` is included in the pixi environment and can be run on the command line or integrated into a [VSCode](.vscode/README.md) or Visual Studio environment. The configuration file reflects the current minimum standard for Fortran source formatting. The main goal, however, is consistent and readable Fortran source code and as such pay particular attention to consistency within and across files. As the formatting tool may at times shift code in unexpected ways, check for formatting consistency after running. diff --git a/DEVELOPER.md b/DEVELOPER.md index cc6c233b2df..61d5f3ec853 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -51,7 +51,6 @@ To build and test a parallel version of the program, first read the instructions - [Updating extra and excluded files](#updating-extra-and-excluded-files) - [Testing makefiles](#testing-makefiles) - [Installing `make` on Windows](#installing-make-on-windows) - - [Using Conda from Git Bash](#using-conda-from-git-bash) - [Branching model](#branching-model) - [Overview](#overview) - [Managing long-lived branches](#managing-long-lived-branches) @@ -180,16 +179,12 @@ The following tables are automatically generated by [a CI workflow](.github/work ### Python -Python 3.8+ is required to run MODFLOW 6 tests. A Conda distribution (e.g. [miniconda](https://docs.conda.io/en/latest/miniconda.html) or [Anaconda](https://www.anaconda.com/products/individual) is recommended. Python dependencies are specified in `environment.yml`. To create an environment, run from the project root: +Python 3.8+ is required to run MODFLOW 6 tests. Using Python from the pixi environment is recommended. +The installation docs can be found [here](https://pixi.sh). +After installing pixi, you can trigger the installation process as follows: ``` -conda env create -f environment.yml -``` - -To update an existing environment: - -```shell -conda env update -f environment.yml +pixi run install ``` #### Dependencies @@ -201,19 +196,19 @@ This project depends critically on a few Python packages for building, linting a - `pymake` - `flopy` -These are each described briefly below. The Conda `environment.yml` contains a number of other dependencies also required for various development tasks, but they are not described in detail here. +These are each described briefly below. The `pixi.toml` contains a number of other dependencies also required for various development tasks, but they are not described in detail here. ##### `meson` -[Meson](https://mesonbuild.com/index.html) is recommended for building MODFLOW 6 and is included in `environment.yml`. It can also be [installed independently](https://mesonbuild.com/Getting-meson.html) — note that if you do so you will need to manually add the executable to the [PATH](https://en.wikipedia.org/wiki/PATH_(variable)). +[Meson](https://mesonbuild.com/index.html) is recommended for building MODFLOW 6 and is included in `pixi.toml`. It can also be [installed independently](https://mesonbuild.com/Getting-meson.html) — note that if you do so you will need to manually add the executable to the [PATH](https://en.wikipedia.org/wiki/PATH_(variable)). ##### `fprettify` -[`fprettify`](https://github.com/pseewald/fprettify) can be used to format Fortran source code and in combination with the [MODFLOW 6 fprettify configuration](.fprettify.yaml) establishes a contribution standard for properly formatted MODFLOW 6 Fortran source. This tool can be installed with `pip` or `conda` and used from the command line or integrated with a [VSCode](.vscode/README.md) or Visual Studio development environment. The `fprettify` package is included in the Conda environment in `environment.yml`. See [contribution guidelines](CONTRIBUTING.md) for additional information. +[`fprettify`](https://github.com/pseewald/fprettify) can be used to format Fortran source code and in combination with the [MODFLOW 6 fprettify configuration](.fprettify.yaml) establishes a contribution standard for properly formatted MODFLOW 6 Fortran source. This tool can be installed with `pip` or `conda` and used from the command line or integrated with a [VSCode](.vscode/README.md) or Visual Studio development environment. The `fprettify` package is included in the Pixi environment in `pixi.toml`. See [contribution guidelines](CONTRIBUTING.md) for additional information. ##### `mfpymake` -The `mfpymake` package can build MODFLOW 6 and related programs and artifacts (e.g. makefiles), and is used in particular by the `distribution/build_makefiles.py` script. `mfpymake` is included in the Conda environment in `environment.yml`. To install separately, follow the instructions as explained on the README of the [repository](https://github.com/modflowpy/pymake). The README also demonstrates basic usage. +The `mfpymake` package can build MODFLOW 6 and related programs and artifacts (e.g. makefiles), and is used in particular by the `distribution/build_makefiles.py` script. `mfpymake` is included in `pixi.toml`. To install separately, follow the instructions as explained on the README of the [repository](https://github.com/modflowpy/pymake). The README also demonstrates basic usage. ##### `flopy` @@ -223,7 +218,7 @@ Like MODFLOW 6, `flopy` is modular — for each MODFLOW 6 package there is g ##### `modflow-devtools` -The tests use a set of shared fixtures and utilities provided by the [`modflow-devtools`](https://github/com/MODFLOW-USGS/modflow-devtools) package. This package is included in the Conda environment in `environment.yml`. +The tests use a set of shared fixtures and utilities provided by the [`modflow-devtools`](https://github/com/MODFLOW-USGS/modflow-devtools) package. This package is included in the Pixi environment in `pixi.toml`. ### Optional tools @@ -264,7 +259,7 @@ git remote add upstream https://github.com/MODFLOW-USGS/modflow6.git ## Building -Meson is the recommended build tool for MODFLOW 6. [Meson](https://mesonbuild.com/Getting-meson.html) must be installed and on your [PATH](https://en.wikipedia.org/wiki/PATH_(variable)). Creating and activating the Conda environment `environment.yml` should be sufficient for this. +Meson is the recommended build tool for MODFLOW 6. [Meson](https://mesonbuild.com/Getting-meson.html) must be installed and on your [PATH](https://en.wikipedia.org/wiki/PATH_(variable)). Creating and activating the Pixi environment `pixi.toml` should be sufficient for this. Meson build configuration files are provided for MODFLOW 6, for the ZONEBUDGET and MODFLOW 2005 to 6 converter utility programs, and for Fortran unit tests (see [Testing](#testing) section below). @@ -273,28 +268,29 @@ Meson build configuration files are provided for MODFLOW 6, for the ZONEBUDGET a - `utils/mf5to6/meson.build` - `autotest/meson.build` -To build MODFLOW 6, first configure the build directory. By default Meson uses compiler flags for a release build. To create a debug build, add `-Doptimization=0` to the following `setup` command. +To build MODFLOW 6, first configure the build directory. +Depending on which task you use, meson will configure a debug or release build. -Meson `setup` on linux and macOS: +Setup a debug build: ```shell -meson setup builddir --prefix=$(pwd) --libdir=bin +pixi run setup-debug builddir ``` -Meson `setup` on windows: +Or alternatively, setup a release build ```shell -meson setup builddir --prefix=%CD% --libdir=bin +pixi run setup-release builddir ``` Compile MODFLOW 6 by executing: ```shell -meson compile -C builddir +pixi run compile-build builddir ``` In order to run the tests the binaries have to be installed: ```shell -meson install -C builddir +pixi run install-build builddir ``` The binaries can then be found in the `bin` folder. `meson install` also triggers a compilation if necessary, so executing `meson install` is enough to get up-to-date binaries in the `bin` folder. @@ -305,7 +301,7 @@ The binaries can then be found in the `bin` folder. `meson install` also trigger MODFLOW 6 unit tests are written in Fortran with [`test-drive`](https://github.com/fortran-lang/test-drive). -MODFLOW 6 integration tests are written in Python with [`pytest`](https://docs.pytest.org/en/7.1.x/). Integration testing dependencies are included in the Conda environment `environment.yml`. +MODFLOW 6 integration tests are written in Python with [`pytest`](https://docs.pytest.org/en/7.1.x/). Integration testing dependencies are included in the Pixi environment `pixi.toml`. **Note:** the entire test suite should pass before a pull request is submitted. Tests run in GitHub Actions CI and a PR can only be merged with passing tests. See [`CONTRIBUTING.md`](CONTRIBUTING.md) for more information. @@ -359,13 +355,7 @@ As mentioned above, binaries live in the `bin` subdirectory of the project root. Tests require the latest official MODFLOW 6 release to be compiled in develop mode with the same Fortran compiler as the development version. A number of binaries distributed from the [executables repo](https://github.com/MODFLOW-USGS/executables) must also be installed. The script `autotest/get_exes.py` does both of these things. It can be run from the project root with: ```shell -python autotest/get_exes.py -``` - -Alternatively, with `pytest` from the `autotest` directory: - -```shell -pytest get_exes.py +pixi run get-exes ``` As above, binaries are placed in the `bin` subdirectory of the project root, with nested `bin/downloaded` and `bin/rebuilt` subdirectories containing the rebuilt latest release and downloaded binaries, respectively. @@ -379,8 +369,8 @@ FloPy packages should be regenerated from DFN files before running tests for the There is a single optional argument, the path to the folder containing definition files. By default DFN files are assumed to live in `doc/mf6io/mf6ivar/dfn`, making the following functionally identical: ```shell -python autotest/update_flopy.py -python autotest/update_flopy.py doc/mf6io/mf6ivar/dfn +pixi run update-flopy +pixi run update-flopy doc/mf6io/mf6ivar/dfn ``` ##### Installing external models @@ -402,15 +392,14 @@ MODFLOW 6 has two kinds of tests: Fortran unit tests, driven with Meson, and Pyt Unit tests must be run from the project root. To run unit tests in verbose mode: ```shell -meson test -C builddir --no-rebuild --verbose +pixi run test-build builddir ``` -Without the `--no-rebuild` options, Meson will rebuild the project before running tests. Unit tests can be selected by module name (as listed in `autotest/tester.f90`). For instance, to test the `ArrayHandlersModule`: ```shell -meson test -C builddir --no-rebuild --verbose ArrayHandlers +pixi run test-build builddir --verbose ArrayHandlers ``` To run a test module in the `gdb` debugger, just add the `--gdb` flag to the test command. @@ -420,12 +409,14 @@ To run a test module in the `gdb` debugger, just add the `--gdb` flag to the tes Integration tests must be run from the `autotest/` folder. To run tests in a particular file, showing verbose output, use: ```shell +pixi shell pytest -v ``` Tests can be run in parallel with the `-n` option, which accepts an integer argument for the number of parallel processes. If the value `auto` is provided, `pytest-xdist` will use one worker per available processor. ```shell +pixi shell pytest -v -n auto ``` @@ -441,12 +432,14 @@ Markers can be used to select subsets of tests. Markers provided in `pytest.ini` Markers can be used with the `-m ` option, and can be applied in boolean combinations with `and`, `or` and `not`. For instance, to run fast tests in parallel, excluding regression tests: ```shell +pixi shell pytest -v -n auto -m "not slow and not regression" ``` The `--smoke` (short `-S`) flag, provided by `modflow-devtools` is an alias for the above: ```shell +pixi shell pytest -v -n auto -S ``` @@ -455,12 +448,14 @@ pytest -v -n auto -S Tests using models from external repositories can be selected with the `repo` marker: ```shell +pixi shell pytest -v -n auto -m "repo" ``` The `large` marker is a subset of the `repo` marker. To test models excluded from commit-triggered CI and only run on GitHub Actions nightly: ```shell +pixi shell pytest -v -n auto -m "large" ``` @@ -596,7 +591,7 @@ After running the reference and comparison models, the framework will try to fin Run `build_makefiles.py` in the `distribution/` directory after adding, removing, or renaming source files. This script uses [Pymake](https://github.com/modflowpy/pymake) to regenerate makefiles. For instance: ```shell -python build_makefiles.py +pixi run build-makefiles ``` ### Updating extra and excluded files @@ -610,6 +605,7 @@ Module dependencies for features still under development should be added to `exc Makefile generation and usage can be tested from the `distribution` directory by running the `build_makefiles.py` script with Pytest: ```shell +pixi shell pytest -v build_makefiles.py ``` diff --git a/distribution/README.md b/distribution/README.md index 66d74f805fb..7bafeb8d437 100644 --- a/distribution/README.md +++ b/distribution/README.md @@ -58,7 +58,7 @@ Both nightly builds and official distributions are created automatically with Gi ## Requirements -This document assumes a MODFLOW 6 development environment has been configured as per the [developer documentation](../DEVELOPER.md), including a Fortran compiler (either `ifort` or `gfortran`) as well as a Conda environment as specified in `environment.yml`. Official distributions are currently prepared with Intel Fortran (`ifort`). +This document assumes a MODFLOW 6 development environment has been configured as per the [developer documentation](../DEVELOPER.md), including a Fortran compiler (either `ifort` or `gfortran`) as well as a Pixi environment as specified in `pixi.toml`. Official distributions are currently prepared with Intel Fortran (`ifort`). ## Steps @@ -242,4 +242,4 @@ To dispatch the release workflow, navigate to the Actions tab of this repository - `branch`: the branch to release from - `development`: whether to build a minimal development distribution or a full distribution - `run_tests`: whether to run autotests after building binaries -- `version`: the version number of the release \ No newline at end of file +- `version`: the version number of the release diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 00000000000..adf4f04e1ca --- /dev/null +++ b/pixi.lock @@ -0,0 +1,9495 @@ +version: 4 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/black-24.3.0-py39hf3d152e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bmipy-2.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39h3d6467e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.50.0-py39hd1e30aa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fortran-language-server-1.12.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fprettify-0.3.7-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-2.50.0-h5abf519_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-hfa15dee_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.9-h98fc4e7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.7.2-py39hf3d152e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp15-15.0.7-default_h127d8a8_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.2-default_h5d6823c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.48-h71f35ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.2-h2448989_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtool-2.4.7-h27087fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.3-py39hf3d152e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py39he9076e7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.4-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-hf1915f5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-hca2cd23_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.98-h1d7d5a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.1-py39hddac248_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39had0adad_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pydotplus-2.0.2-pyhaef67bd_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py39h52134e7_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py39h3d6467e_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-dotenv-0.5.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-order-1.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-4_cp39.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h112747c_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.18.0-py39h9fdd4d6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h474f0d3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py39h6404dd3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py39h3d6467e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py39hd1e30aa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.41-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xmipy-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f98852_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda + osx-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/atk-1.0-2.38.0-h1d18e73_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/black-24.3.0-py39h6e9494a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bmipy-2.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h0dc2134_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h0dc2134_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py39h840bb9f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.2.2-h8857fd0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cairo-1.18.0-h99e66fa_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.0-py39h6be1789_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/expat-2.6.2-h73e2aa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.14.2-h5bb23bf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.50.0-py39ha09f3b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fortran-language-server-1.12.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fprettify-0.3.7-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.10-hbcb3906_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.42.10-hd9e0ca3_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/geos-3.12.1-h93d8f39_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gettext-0.21.1-h8a4c099_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.1-hb7f2c08_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.13-h73e2aa4_1003.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-2.50.0-ha5baa68_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk2-2.24.33-h8ca4665_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-8.3.0-hf45c392_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-73.2-hf5e326d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/jupyter_core-5.7.1-py39h6e9494a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.5-py39h8ee36c8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.16-ha2f27b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-21_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h0dc2134_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h0dc2134_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h0dc2134_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-21_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-16.0.6-hd57cbcb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.20-h49d49c5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-h0dceb68_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.0-h81c1438_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-21_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.26-openmp_hfef2a42_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.43-h92b6c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.56.3-h1877882_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.2-h92b6c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.6.0-h129831d_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libtool-2.4.7-hf0c8a7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-1.3.2-h44782d1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.3.2-h0dc2134_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.15-hb7f2c08_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.6-hc0ae0f7_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.2-hb6ac08f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.5-py39ha09f3b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.3-py39h6e9494a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.3-py39h7070ae8_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4.20240210-h73e2aa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py39h28c39a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.2-h7310d3a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.2.1-hd75f5a5_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.1-py39haf03413_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.50.14-h19c1c8a_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.43-h0ad2156_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.2.0-py39hdd30358_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.43.4-h73e2aa4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-hc929b4f_1001.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pydotplus-2.0.2-pyhaef67bd_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-dotenv-0.5.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-order-1.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.9.19-h7a9c478_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.9-4_cp39.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.1-py39hdc70f33_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.18.0-py39hcf47035_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.12.0-py39h0ed1e0f_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.3-py39h19e25c1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4-py39ha09f3b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-15.1.0-py39hdc70f33_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xmipy-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.11-h0dc2134_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.3-h35c211d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h8a1eda9_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.5-h829000d_0.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hcb7b3dd_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.3.0-py39h2804cbe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bmipy-2.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py39hb198ff7_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.0-hd1e100b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.2.0-py39he9de807_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.6.2-hebf3989_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.14.2-h82840c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.50.0-py39h17cfd9d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fortran-language-server-1.12.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fprettify-0.3.7-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.10-h27ca646_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.42.10-hcea6d13_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/geos-3.12.1-h965bd2d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-0.21.1-h0186832_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.1-h1a8c8d9_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.13-hebf3989_1003.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-2.50.0-hc7d6d94_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk2-2.24.33-h7895bb2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-8.3.0-h8f0ba13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jupyter_core-5.7.2-py39h2804cbe_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.5-py39hbd775c9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-21_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-21_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-16.0.6-h4653b0c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.20-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-hfdf3952_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.0-hfc324ee_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-21_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.26-openmp_h6c19121_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.43-h091b4b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.56.3-h55a2576_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.2-h091b4b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.6.0-h07db509_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtool-2.4.7-hb7217d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-1.3.2-hf30222e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.3.2-hb547adb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.15-hf346824_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.2-hcd81f8e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.5-py39h17cfd9d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.3-py39hdf13c20_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.3-py39hbab7938_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4.20240210-h078ce10_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py39h7aa2656_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.1-h0d3ecfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.1-py39h47e51b9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.50.14-hcf40dda_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.43-h26f9a81_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.2.0-py39h755f0b7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.43.4-hebf3989_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-h27ca646_1001.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pydotplus-2.0.2-pyhaef67bd_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-dotenv-0.5.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-order-1.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.9.19-hd7ebdb9_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.9-4_cp39.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.1-py39h0f82c59_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.18.0-py39h9a407ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.12.0-py39hcc04109_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.0.3-py39ha70ab96_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4-py39h17cfd9d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-15.1.0-py39h0f82c59_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xmipy-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.11-hb547adb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.3-h27ca646_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-h53f4e23_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.5-h4f39d0f_0.conda + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/black-24.3.0-py39hcbf5309_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bmipy-2.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.1.0-hcfcfb64_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-hcfcfb64_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py39h99910a6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.0-h1fef639_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.2.0-py39h1f6ef14_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/expat-2.6.2-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.14.2-hbde0cde_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.50.0-py39ha55989b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fortran-language-server-1.12.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fprettify-0.3.7-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-hdaf720e_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fribidi-1.0.10-h8d14728_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.12.1-h1537add_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/getopt-win32-0.1-hcfcfb64_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gettext-0.21.1-h5728263_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.13-h63175ca_1003.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-2.50.0-had6c3a3_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.22.9-h001b923_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.22.9-hb4038d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-8.3.0-h7ab893a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-73.2-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.0.0-h57928b3_49841.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/jupyter_core-5.7.2-py39hcbf5309_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.5-py39h1f6ef14_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.2-heb0366b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-21_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-hcfcfb64_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-hcfcfb64_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-hcfcfb64_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-21_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.2-default_hf64faad_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.20-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h312136b_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.9.3-default_haede6df_1009.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-21_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libogg-1.3.4-h8ffe710_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.43-h19919ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.2-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.6.0-hddb2be6_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libvorbis-1.3.7-h0e60522_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-1.3.2-hcfcfb64_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.3.2-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.15-hcd874cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.6-hc3477c8_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py39ha55989b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.3-py39hcbf5309_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.3-py39hf19769e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.0.0-h66d3029_49657.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py39hddb5d58_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.2-h3d672ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.2.1-py39h32e6231_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.50.14-h07c897b_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.43-h17e33f8_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-10.2.0-py39h368b509_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.43.4-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-hfa6e2cd_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pydotplus-2.0.2-pyhaef67bd_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyqt-5.15.9-py39hb77abff_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyqt5-sip-12.12.2-py39h99910a6_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh0701188_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-dotenv-0.5.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-order-1.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.9.19-h4de0772_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.9-4_cp39.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-306-py39h99910a6_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.1-py39ha55989b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/qt-main-5.15.8-h9e85ed6_20.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.18.0-py39hf21820d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.12.0-py39hddb5d58_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/shapely-2.0.3-py39h61a8cf5_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/sip-6.7.12-py39h99910a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.11.0-h91493d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.4-py39ha55989b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-15.1.0-py39ha55989b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyhd8ed1ab_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/xmipy-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-kbproto-1.0.7-hcd874cb_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libice-1.1.1-hcd874cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libsm-1.2.4-hcd874cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libx11-1.8.7-hefa74cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.11-hcd874cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.3-hcd874cb_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.4-hcd874cb_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.17-hcd874cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.0-hcd874cb_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-xextproto-7.3.0-hcd874cb_1003.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-xproto-7.0.31-hcd874cb_1007.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.2.13-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.5-h12be248_0.conda +packages: +- kind: conda + name: _libgcc_mutex + version: '0.1' + build: conda_forge + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + size: 2562 + timestamp: 1578324546067 +- kind: conda + name: _openmp_mutex + version: '4.5' + build: 2_gnu + build_number: 16 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- kind: conda + name: alsa-lib + version: 1.2.11 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda + sha256: 0e2b75b9834a6e520b13db516f7cf5c9cea8f0bbc9157c978444173dacb98fec + md5: 0bb492cca54017ea314b809b1ee3a176 + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + license_family: GPL + size: 554699 + timestamp: 1709396557528 +- kind: conda + name: appdirs + version: 1.4.4 + build: pyh9f0ad1d_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 + sha256: ae9fb8f68281f84482f2c234379aa12405a9e365151d43af20b3ae1f17312111 + md5: 5f095bc6454094e96f146491fd03633b + depends: + - python + license: MIT + license_family: MIT + size: 12840 + timestamp: 1603108499239 +- kind: conda + name: atk-1.0 + version: 2.38.0 + build: h1d18e73_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/atk-1.0-2.38.0-h1d18e73_1.tar.bz2 + sha256: 7af1f86cfc85b1e57547e2a81c069095545ff6a52f3f8e15184df954dce446dd + md5: 5a538295f97a484ee332aacc131718b5 + depends: + - libcxx >=14.0.4 + - libglib >=2.74.1,<3.0a0 + constrains: + - atk-1.0 2.38.0 + license: LGPL-2.0-or-later + license_family: LGPL + size: 367515 + timestamp: 1667421223751 +- kind: conda + name: atk-1.0 + version: 2.38.0 + build: hcb7b3dd_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hcb7b3dd_1.tar.bz2 + sha256: d40f103467fd2fa426072691919fd135a4fed4a2b03cd12256ff0fee37a98249 + md5: 3c98bfeed7717a9cf5af18c295f49f3a + depends: + - libcxx >=14.0.4 + - libglib >=2.74.1,<3.0a0 + constrains: + - atk-1.0 2.38.0 + license: LGPL-2.0-or-later + license_family: LGPL + size: 373158 + timestamp: 1667421529784 +- kind: conda + name: atk-1.0 + version: 2.38.0 + build: hd4edc92_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2 + sha256: 2f9314de13c1f0b54510a2afa0cdc02c0e3f828fccfc4277734f9590b11a65f1 + md5: 6c72ec3e660a51736913ef6ea68c454b + depends: + - libgcc-ng >=12 + - libglib >=2.74.1,<3.0a0 + - libstdcxx-ng >=12 + constrains: + - atk-1.0 2.38.0 + license: LGPL-2.0-or-later + license_family: LGPL + size: 551928 + timestamp: 1667420962627 +- kind: conda + name: attr + version: 2.5.1 + build: h166bdaf_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 + sha256: 82c13b1772c21fc4a17441734de471d3aabf82b61db9b11f4a1bd04a9c4ac324 + md5: d9c69a24ad678ffce24c6543a0176b00 + depends: + - libgcc-ng >=12 + license: GPL-2.0-or-later + license_family: GPL + size: 71042 + timestamp: 1660065501192 +- kind: conda + name: attrs + version: 23.2.0 + build: pyh71513ae_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda + sha256: 77c7d03bdb243a048fff398cedc74327b7dc79169ebe3b4c8448b0331ea55fea + md5: 5e4c0743c70186509d1412e03c2d8dfa + depends: + - python >=3.7 + license: MIT + license_family: MIT + size: 54582 + timestamp: 1704011393776 +- kind: conda + name: black + version: 24.3.0 + build: py39h2804cbe_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.3.0-py39h2804cbe_0.conda + sha256: 8e14d423a9613ad2763949d9ecc8c0e740a46dfac2dba7307f2c6790796c7f49 + md5: c86e0fc313a494cc855e80c02959fbff + depends: + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9 + - platformdirs >=2 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + - tomli >=1.1.0 + - typing_extensions >=4.0.1 + license: MIT + license_family: MIT + size: 296255 + timestamp: 1710785014536 +- kind: conda + name: black + version: 24.3.0 + build: py39h6e9494a_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/black-24.3.0-py39h6e9494a_0.conda + sha256: 03d2486854754203540352e2ff94d9ddc4a25674c450f2a3cacaa682faf23b90 + md5: d1fd38166a4edfc6b81ca209ac7393d2 + depends: + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9 + - platformdirs >=2 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - tomli >=1.1.0 + - typing_extensions >=4.0.1 + license: MIT + license_family: MIT + size: 296034 + timestamp: 1710785156011 +- kind: conda + name: black + version: 24.3.0 + build: py39hcbf5309_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/black-24.3.0-py39hcbf5309_0.conda + sha256: 82c559179f6a4ea004c6b98bc3e1b9be73eb0d18dbdfa21db0a42967052d8fe4 + md5: 4dd94090f57c252ca7a8c7204171d52b + depends: + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9 + - platformdirs >=2 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - tomli >=1.1.0 + - typing_extensions >=4.0.1 + license: MIT + license_family: MIT + size: 310810 + timestamp: 1710785196689 +- kind: conda + name: black + version: 24.3.0 + build: py39hf3d152e_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/black-24.3.0-py39hf3d152e_0.conda + sha256: 7a4d9a43600c24ac29845689e24465b6c15819ad53d35e7120197aaf0badd1bb + md5: 831bcbaf689b20fc85bf87eab3b5ee29 + depends: + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9 + - platformdirs >=2 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - tomli >=1.1.0 + - typing_extensions >=4.0.1 + license: MIT + license_family: MIT + size: 295298 + timestamp: 1710784875392 +- kind: conda + name: bmipy + version: 2.0.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/bmipy-2.0.1-pyhd8ed1ab_0.conda + sha256: 2eaaa2a70871f608d074f445596bfc7cc7ecf36d9354c5e607b517d1408d16bd + md5: 686cb5c54d3a3a028f4bce356b3e0030 + depends: + - black + - click + - jinja2 + - numpy + - python >=3 + license: MIT + license_family: MIT + size: 14075 + timestamp: 1698243713437 +- kind: conda + name: brotli + version: 1.1.0 + build: h0dc2134_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h0dc2134_1.conda + sha256: 4bf66d450be5d3f9ebe029b50f818d088b1ef9666b1f19e90c85479c77bbdcde + md5: 9272dd3b19c4e8212f8542cefd5c3d67 + depends: + - brotli-bin 1.1.0 h0dc2134_1 + - libbrotlidec 1.1.0 h0dc2134_1 + - libbrotlienc 1.1.0 h0dc2134_1 + license: MIT + license_family: MIT + size: 19530 + timestamp: 1695990310168 +- kind: conda + name: brotli + version: 1.1.0 + build: hb547adb_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-hb547adb_1.conda + sha256: 62d1587deab752fcee07adc371eb20fcadc09f72c0c85399c22b637ca858020f + md5: a33aa58d448cbc054f887e39dd1dfaea + depends: + - brotli-bin 1.1.0 hb547adb_1 + - libbrotlidec 1.1.0 hb547adb_1 + - libbrotlienc 1.1.0 hb547adb_1 + license: MIT + license_family: MIT + size: 19506 + timestamp: 1695990588610 +- kind: conda + name: brotli + version: 1.1.0 + build: hcfcfb64_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/brotli-1.1.0-hcfcfb64_1.conda + sha256: b927c95121c5f3d82fe084730281739fb04621afebf2d9f05711a0f42d27e326 + md5: f47f6db2528e38321fb00ae31674c133 + depends: + - brotli-bin 1.1.0 hcfcfb64_1 + - libbrotlidec 1.1.0 hcfcfb64_1 + - libbrotlienc 1.1.0 hcfcfb64_1 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 19772 + timestamp: 1695990547936 +- kind: conda + name: brotli + version: 1.1.0 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda + sha256: f2d918d351edd06c55a6c2d84b488fe392f85ea018ff227daac07db22b408f6b + md5: f27a24d46e3ea7b70a1f98e50c62508f + depends: + - brotli-bin 1.1.0 hd590300_1 + - libbrotlidec 1.1.0 hd590300_1 + - libbrotlienc 1.1.0 hd590300_1 + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 19383 + timestamp: 1695990069230 +- kind: conda + name: brotli-bin + version: 1.1.0 + build: h0dc2134_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h0dc2134_1.conda + sha256: 7ca3cfb4c5df314ed481301335387ab2b2ee651e2c74fbb15bacc795c664a5f1 + md5: ece565c215adcc47fc1db4e651ee094b + depends: + - libbrotlidec 1.1.0 h0dc2134_1 + - libbrotlienc 1.1.0 h0dc2134_1 + license: MIT + license_family: MIT + size: 16660 + timestamp: 1695990286737 +- kind: conda + name: brotli-bin + version: 1.1.0 + build: hb547adb_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-hb547adb_1.conda + sha256: 8fbfc2834606292016f2faffac67deea4c5cdbc21a61169f0b355e1600105a24 + md5: 990d04f8c017b1b77103f9a7730a5f12 + depends: + - libbrotlidec 1.1.0 hb547adb_1 + - libbrotlienc 1.1.0 hb547adb_1 + license: MIT + license_family: MIT + size: 17001 + timestamp: 1695990551239 +- kind: conda + name: brotli-bin + version: 1.1.0 + build: hcfcfb64_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-hcfcfb64_1.conda + sha256: 4fbcb8f94acc97b2b04adbc64e304acd7c06fa0cf01953527bddae46091cc942 + md5: 0105229d7c5fabaa840043a86c10ec64 + depends: + - libbrotlidec 1.1.0 hcfcfb64_1 + - libbrotlienc 1.1.0 hcfcfb64_1 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 20885 + timestamp: 1695990517506 +- kind: conda + name: brotli-bin + version: 1.1.0 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda + sha256: a641abfbaec54f454c8434061fffa7fdaa9c695e8a5a400ed96b4f07c0c00677 + md5: 39f910d205726805a958da408ca194ba + depends: + - libbrotlidec 1.1.0 hd590300_1 + - libbrotlienc 1.1.0 hd590300_1 + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 18980 + timestamp: 1695990054140 +- kind: conda + name: brotli-python + version: 1.1.0 + build: py39h3d6467e_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py39h3d6467e_1.conda + sha256: e22afb19527a93da24c1108c3e91532811f9c3df64a9473989faf332c98af082 + md5: c48418c8b35f1d59ae9ae1174812b40a + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + constrains: + - libbrotlicommon 1.1.0 hd590300_1 + license: MIT + license_family: MIT + size: 350065 + timestamp: 1695990113673 +- kind: conda + name: brotli-python + version: 1.1.0 + build: py39h840bb9f_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.1.0-py39h840bb9f_1.conda + sha256: e19de8f5d9e1fe650b49eff6b0111eebd3b98368b5ae82733b90ec0abea5062a + md5: bf1edb07835e15685718843f7e71bab1 + depends: + - libcxx >=15.0.7 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + constrains: + - libbrotlicommon 1.1.0 h0dc2134_1 + license: MIT + license_family: MIT + size: 367262 + timestamp: 1695990623703 +- kind: conda + name: brotli-python + version: 1.1.0 + build: py39h99910a6_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py39h99910a6_1.conda + sha256: 076f6ac7dc00cfca25e11fd42bfd3cc3395307d9a3aa3958a13d14bc8ea610ec + md5: f24ba3942ece1e5d3dcde934f0532998 + depends: + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - libbrotlicommon 1.1.0 hcfcfb64_1 + license: MIT + license_family: MIT + size: 321654 + timestamp: 1695990742536 +- kind: conda + name: brotli-python + version: 1.1.0 + build: py39hb198ff7_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.1.0-py39hb198ff7_1.conda + sha256: 014639c1f57be1dadf7b5c17e53df562e7e6bab71d3435fdd5bd56213dece9df + md5: ddf01dd9a743bd3ec9cf829d18bb8002 + depends: + - libcxx >=15.0.7 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + constrains: + - libbrotlicommon 1.1.0 hb547adb_1 + license: MIT + license_family: MIT + size: 344364 + timestamp: 1695991093404 +- kind: conda + name: bzip2 + version: 1.0.8 + build: h10d778d_5 + build_number: 5 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda + sha256: 61fb2b488928a54d9472113e1280b468a309561caa54f33825a3593da390b242 + md5: 6097a6ca9ada32699b5fc4312dd6ef18 + license: bzip2-1.0.6 + license_family: BSD + size: 127885 + timestamp: 1699280178474 +- kind: conda + name: bzip2 + version: 1.0.8 + build: h93a5062_5 + build_number: 5 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda + sha256: bfa84296a638bea78a8bb29abc493ee95f2a0218775642474a840411b950fe5f + md5: 1bbc659ca658bfd49a481b5ef7a0f40f + license: bzip2-1.0.6 + license_family: BSD + size: 122325 + timestamp: 1699280294368 +- kind: conda + name: bzip2 + version: 1.0.8 + build: hcfcfb64_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda + sha256: ae5f47a5c86fd6db822931255dcf017eb12f60c77f07dc782ccb477f7808aab2 + md5: 26eb8ca6ea332b675e11704cce84a3be + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: bzip2-1.0.6 + license_family: BSD + size: 124580 + timestamp: 1699280668742 +- kind: conda + name: bzip2 + version: 1.0.8 + build: hd590300_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda + sha256: 242c0c324507ee172c0e0dd2045814e746bb303d1eb78870d182ceb0abc726a8 + md5: 69b8b6202a07720f448be700e300ccf4 + depends: + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + size: 254228 + timestamp: 1699279927352 +- kind: conda + name: ca-certificates + version: 2024.2.2 + build: h56e8100_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda + sha256: 4d587088ecccd393fec3420b64f1af4ee1a0e6897a45cfd5ef38055322cea5d0 + md5: 63da060240ab8087b60d1357051ea7d6 + license: ISC + size: 155886 + timestamp: 1706843918052 +- kind: conda + name: ca-certificates + version: 2024.2.2 + build: h8857fd0_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.2.2-h8857fd0_0.conda + sha256: 54a794aedbb4796afeabdf54287b06b1d27f7b13b3814520925f4c2c80f58ca9 + md5: f2eacee8c33c43692f1ccfd33d0f50b1 + license: ISC + size: 155665 + timestamp: 1706843838227 +- kind: conda + name: ca-certificates + version: 2024.2.2 + build: hbcca054_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda + sha256: 91d81bfecdbb142c15066df70cc952590ae8991670198f92c66b62019b251aeb + md5: 2f4327a1cbe7f022401b236e915a5fef + license: ISC + size: 155432 + timestamp: 1706843687645 +- kind: conda + name: ca-certificates + version: 2024.2.2 + build: hf0a4a13_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda + sha256: 49bc3439816ac72d0c0e0f144b8cc870fdcc4adec2e861407ec818d8116b2204 + md5: fb416a1795f18dcc5a038bc2dc54edf9 + license: ISC + size: 155725 + timestamp: 1706844034242 +- kind: conda + name: cairo + version: 1.18.0 + build: h1fef639_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.0-h1fef639_0.conda + sha256: 451e714f065b5dd0c11169058be56b10973dfd7d9a0fccf9c6a05d1e09995730 + md5: b3fe2c6381ec74afe8128e16a11eee02 + depends: + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=73.2,<74.0a0 + - libglib >=2.78.0,<3.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - pixman >=0.42.2,<1.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - zlib + license: LGPL-2.1-only or MPL-1.1 + size: 1520159 + timestamp: 1697029136038 +- kind: conda + name: cairo + version: 1.18.0 + build: h3faef2a_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda + sha256: 142e2639a5bc0e99c44d76f4cc8dce9c6a2d87330c4beeabb128832cd871a86e + md5: f907bb958910dc404647326ca80c263e + depends: + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=73.2,<74.0a0 + - libgcc-ng >=12 + - libglib >=2.78.0,<3.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libstdcxx-ng >=12 + - libxcb >=1.15,<1.16.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - pixman >=0.42.2,<1.0a0 + - xorg-libice >=1.1.1,<2.0a0 + - xorg-libsm >=1.2.4,<2.0a0 + - xorg-libx11 >=1.8.6,<2.0a0 + - xorg-libxext >=1.3.4,<2.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + - zlib + license: LGPL-2.1-only or MPL-1.1 + size: 982351 + timestamp: 1697028423052 +- kind: conda + name: cairo + version: 1.18.0 + build: h99e66fa_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/cairo-1.18.0-h99e66fa_0.conda + sha256: f8d1142cf244eadcbc44e8ca2266aa61a05b6cda5571f9b745ba32c7ebbfdfba + md5: 13f830b1bf46018f7062d1b798d53eca + depends: + - __osx >=10.9 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=73.2,<74.0a0 + - libcxx >=16.0.6 + - libglib >=2.78.0,<3.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - pixman >=0.42.2,<1.0a0 + - zlib + license: LGPL-2.1-only or MPL-1.1 + size: 885311 + timestamp: 1697028802967 +- kind: conda + name: cairo + version: 1.18.0 + build: hd1e100b_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.0-hd1e100b_0.conda + sha256: 599f8820553b3a3405706d9cad390ac199e24515a0a82c87153c9b5b5fdba3b8 + md5: 3fa6eebabb77f65e82f86b72b95482db + depends: + - __osx >=10.9 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=73.2,<74.0a0 + - libcxx >=16.0.6 + - libglib >=2.78.0,<3.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - pixman >=0.42.2,<1.0a0 + - zlib + license: LGPL-2.1-only or MPL-1.1 + size: 897919 + timestamp: 1697028755150 +- kind: conda + name: certifi + version: 2024.2.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + sha256: f1faca020f988696e6b6ee47c82524c7806380b37cfdd1def32f92c326caca54 + md5: 0876280e409658fc6f9e75d035960333 + depends: + - python >=3.7 + license: ISC + size: 160559 + timestamp: 1707022289175 +- kind: conda + name: charset-normalizer + version: 3.3.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + sha256: 20cae47d31fdd58d99c4d2e65fbdcefa0b0de0c84e455ba9d6356a4bdbc4b5b9 + md5: 7f4a9e3fcff3f6356ae99244a014da6a + depends: + - python >=3.7 + license: MIT + license_family: MIT + size: 46597 + timestamp: 1698833765762 +- kind: conda + name: click + version: 8.1.7 + build: unix_pyh707e725_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec + md5: f3ad426304898027fc619827ff428eca + depends: + - __unix + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + size: 84437 + timestamp: 1692311973840 +- kind: conda + name: click + version: 8.1.7 + build: win_pyh7428d3b_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda + sha256: 90236b113b9a20041736e80b80ee965167f9aac0468315c55e2bad902d673fb0 + md5: 3549ecbceb6cd77b91a105511b7d0786 + depends: + - __win + - colorama + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + size: 85051 + timestamp: 1692312207348 +- kind: conda + name: colorama + version: 0.4.6 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + md5: 3faab06a954c2a04039983f2c4a50d99 + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + size: 25170 + timestamp: 1666700778190 +- kind: conda + name: configargparse + version: '1.7' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda + sha256: 23f7283b59d20a895c5fa41aa5d276155cedf257418db7f952d615d6a2e5fa43 + md5: 0d07dc29b1c1cc973f76b74beb44915f + depends: + - python >=3.5 + license: MIT + license_family: MIT + size: 39491 + timestamp: 1690138171226 +- kind: conda + name: contourpy + version: 1.2.0 + build: py39h1f6ef14_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.2.0-py39h1f6ef14_0.conda + sha256: c1120879081e81d03a5086fd68d4e01e316b69a5230da9ff1f2e17479f6ce109 + md5: 9eeea323eacb6549cbb3df3d81181cb2 + depends: + - numpy >=1.20,<2 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 185949 + timestamp: 1699042094923 +- kind: conda + name: contourpy + version: 1.2.0 + build: py39h6be1789_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.0-py39h6be1789_0.conda + sha256: cd0808189a10f45b41ef8eee2f373ae870673b0fe49d17ecee4e401445f17ea6 + md5: f612db80986ecdc867662b9dc4e46f11 + depends: + - __osx >=10.9 + - libcxx >=16.0.6 + - numpy >=1.20,<2 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 230650 + timestamp: 1699041727321 +- kind: conda + name: contourpy + version: 1.2.0 + build: py39h7633fee_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda + sha256: 7a85421667d97132c5d23575da63c2da850775c81832607e56bfd881c9750f3a + md5: ed71ad3e30eb03da363fb797419cce98 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - numpy >=1.20,<2 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 237856 + timestamp: 1699042102939 +- kind: conda + name: contourpy + version: 1.2.0 + build: py39he9de807_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.2.0-py39he9de807_0.conda + sha256: ac729314c46e04b455e0b1e08b2c223fe92c4f89e3e13c2ae42e1e349ad3958b + md5: 1cf7d8ee627725a514622c863dd8821b + depends: + - __osx >=10.9 + - libcxx >=16.0.6 + - numpy >=1.20,<2 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 223476 + timestamp: 1699042196671 +- kind: conda + name: cycler + version: 0.12.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda + sha256: f221233f21b1d06971792d491445fd548224641af9443739b4b7b6d5d72954a8 + md5: 5cd86562580f274031ede6aa6aa24441 + depends: + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + size: 13458 + timestamp: 1696677888423 +- kind: conda + name: dbus + version: 1.13.6 + build: h5008d03_3 + build_number: 3 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + sha256: 8f5f995699a2d9dbdd62c61385bfeeb57c82a681a7c8c5313c395aa0ccab68a5 + md5: ecfff944ba3960ecb334b9a2663d708d + depends: + - expat >=2.4.2,<3.0a0 + - libgcc-ng >=9.4.0 + - libglib >=2.70.2,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 618596 + timestamp: 1640112124844 +- kind: conda + name: editables + version: '0.5' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + sha256: de160a7494e7bc72360eea6a29cbddf194d0a79f45ff417a4de20e6858cf79a9 + md5: 9873878e2a069bc358b69e9a29c1ecd5 + depends: + - python >=3.7 + license: MIT + license_family: MIT + size: 10988 + timestamp: 1705857085102 +- kind: conda + name: exceptiongroup + version: 1.2.0 + build: pyhd8ed1ab_2 + build_number: 2 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + sha256: a6ae416383bda0e3ed14eaa187c653e22bec94ff2aa3b56970cdf0032761e80d + md5: 8d652ea2ee8eaee02ed8dc820bc794aa + depends: + - python >=3.7 + license: MIT and PSF-2.0 + size: 20551 + timestamp: 1704921321122 +- kind: conda + name: execnet + version: 2.0.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda + sha256: 88ea68a360198af39368beecf057af6b31f0ae38071b2bdb2aa961b6ae5427c0 + md5: 67de0d8241e1060a479e3c37793e26f9 + depends: + - python >=3.7 + license: MIT + license_family: MIT + size: 36534 + timestamp: 1688933537234 +- kind: conda + name: expat + version: 2.6.2 + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda + sha256: 89916c536ae5b85bb8bf0cfa27d751e274ea0911f04e4a928744735c14ef5155 + md5: 53fb86322bdb89496d7579fe3f02fd61 + depends: + - libexpat 2.6.2 h59595ed_0 + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 137627 + timestamp: 1710362144873 +- kind: conda + name: expat + version: 2.6.2 + build: h63175ca_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/expat-2.6.2-h63175ca_0.conda + sha256: f5a13d4bc591a4dc210954f492dd59a0ecf9b9d2ab28bf2ece755ca8f69ec1b4 + md5: 52f9dec6758ceb8ce0ea8af9fa13eb1a + depends: + - libexpat 2.6.2 h63175ca_0 + license: MIT + license_family: MIT + size: 229627 + timestamp: 1710362661692 +- kind: conda + name: expat + version: 2.6.2 + build: h73e2aa4_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/expat-2.6.2-h73e2aa4_0.conda + sha256: 0fd1befb18d9d937358a90d5b8f97ac2402761e9d4295779cbad9d7adfb47976 + md5: dc0882915da2ec74696ad87aa2350f27 + depends: + - libexpat 2.6.2 h73e2aa4_0 + license: MIT + license_family: MIT + size: 126612 + timestamp: 1710362607162 +- kind: conda + name: expat + version: 2.6.2 + build: hebf3989_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.6.2-hebf3989_0.conda + sha256: 9ac22553a4d595d7e4c9ca9aa09a0b38da65314529a7a7008edc73d3f9e7904a + md5: de0cff0ec74f273c4b6aa281479906c3 + depends: + - libexpat 2.6.2 hebf3989_0 + license: MIT + license_family: MIT + size: 124594 + timestamp: 1710362455984 +- kind: conda + name: filelock + version: 3.13.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda + sha256: 3bb2b4b8b97160ee7d2ed40b9dbc78555932274e82ef314c8a400a1d17aa4626 + md5: ff15f46b0d34308f4d40c1c51df07592 + depends: + - python >=3.7 + license: Unlicense + size: 15611 + timestamp: 1711394721380 +- kind: conda + name: flaky + version: 3.8.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_0.conda + sha256: 57434214a3c5e33f06688896981d27262d823ae75b7b496e2d9c40c14f500c97 + md5: 4673657910db1d7914dc272124fe03ae + depends: + - python >=3.6 + license: Apache-2.0 + license_family: Apache + size: 22156 + timestamp: 1710293112378 +- kind: conda + name: font-ttf-dejavu-sans-mono + version: '2.37' + build: hab24e00_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b + md5: 0c96522c6bdaed4b1566d11387caaf45 + license: BSD-3-Clause + license_family: BSD + size: 397370 + timestamp: 1566932522327 +- kind: conda + name: font-ttf-inconsolata + version: '3.000' + build: h77eed37_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c + md5: 34893075a5c9e55cdafac56607368fc6 + license: OFL-1.1 + license_family: Other + size: 96530 + timestamp: 1620479909603 +- kind: conda + name: font-ttf-source-code-pro + version: '2.038' + build: h77eed37_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 + md5: 4d59c254e01d9cde7957100457e2d5fb + license: OFL-1.1 + license_family: Other + size: 700814 + timestamp: 1620479612257 +- kind: conda + name: font-ttf-ubuntu + version: '0.83' + build: h77eed37_1 + build_number: 1 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda + sha256: 056c85b482d58faab5fd4670b6c1f5df0986314cca3bc831d458b22e4ef2c792 + md5: 6185f640c43843e5ad6fd1c5372c3f80 + license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 + license_family: Other + size: 1619820 + timestamp: 1700944216729 +- kind: conda + name: fontconfig + version: 2.14.2 + build: h14ed4e7_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda + sha256: 155d534c9037347ea7439a2c6da7c24ffec8e5dd278889b4c57274a1d91e0a83 + md5: 0f69b688f52ff6da70bccb7ff7001d1d + depends: + - expat >=2.5.0,<3.0a0 + - freetype >=2.12.1,<3.0a0 + - libgcc-ng >=12 + - libuuid >=2.32.1,<3.0a0 + - libzlib >=1.2.13,<1.3.0a0 + license: MIT + license_family: MIT + size: 272010 + timestamp: 1674828850194 +- kind: conda + name: fontconfig + version: 2.14.2 + build: h5bb23bf_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.14.2-h5bb23bf_0.conda + sha256: f63e6d1d6aef8ba6de4fc54d3d7898a153479888d40ffdf2e4cfad6f92679d34 + md5: 86cc5867dfbee4178118392bae4a3c89 + depends: + - expat >=2.5.0,<3.0a0 + - freetype >=2.12.1,<3.0a0 + - libzlib >=1.2.13,<1.3.0a0 + license: MIT + license_family: MIT + size: 237068 + timestamp: 1674829100063 +- kind: conda + name: fontconfig + version: 2.14.2 + build: h82840c6_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.14.2-h82840c6_0.conda + sha256: 7094917fc6758186e17c61d8ee8fd2bbbe9f303b4addac61d918fa415c497e2b + md5: f77d47ddb6d3cc5b39b9bdf65635afbb + depends: + - expat >=2.5.0,<3.0a0 + - freetype >=2.12.1,<3.0a0 + - libzlib >=1.2.13,<1.3.0a0 + license: MIT + license_family: MIT + size: 237668 + timestamp: 1674829263740 +- kind: conda + name: fontconfig + version: 2.14.2 + build: hbde0cde_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.14.2-hbde0cde_0.conda + sha256: 643f2b95be68abeb130c53d543dcd0c1244bebabd58c774a21b31e4b51ac3c96 + md5: 08767992f1a4f1336a257af1241034bd + depends: + - expat >=2.5.0,<3.0a0 + - freetype >=2.12.1,<3.0a0 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vs2015_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 190111 + timestamp: 1674829354122 +- kind: conda + name: fonts-conda-ecosystem + version: '1' + build: '0' + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 + md5: fee5683a3f04bd15cbd8318b096a27ab + depends: + - fonts-conda-forge + license: BSD-3-Clause + license_family: BSD + size: 3667 + timestamp: 1566974674465 +- kind: conda + name: fonts-conda-forge + version: '1' + build: '0' + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + sha256: 53f23a3319466053818540bcdf2091f253cbdbab1e0e9ae7b9e509dcaa2a5e38 + md5: f766549260d6815b0c52253f1fb1bb29 + depends: + - font-ttf-dejavu-sans-mono + - font-ttf-inconsolata + - font-ttf-source-code-pro + - font-ttf-ubuntu + license: BSD-3-Clause + license_family: BSD + size: 4102 + timestamp: 1566932280397 +- kind: conda + name: fonttools + version: 4.50.0 + build: py39h17cfd9d_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.50.0-py39h17cfd9d_0.conda + sha256: 2f40b1ae9cb965f7683dd69af3db71d9575d4b7363a74e230651a669f25d1abd + md5: 9cf95b92068842801c4237e7a799c330 + depends: + - brotli + - munkres + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + - unicodedata2 >=14.0.0 + license: MIT + license_family: MIT + size: 2180527 + timestamp: 1710865966262 +- kind: conda + name: fonttools + version: 4.50.0 + build: py39ha09f3b3_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.50.0-py39ha09f3b3_0.conda + sha256: 6f319ed091af3d14df5165ceba659869569e6827da9ca084f17237b7e440eee7 + md5: a575dd8aa43e8b7e2e1da6bd6acbddc0 + depends: + - brotli + - munkres + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - unicodedata2 >=14.0.0 + license: MIT + license_family: MIT + size: 2218023 + timestamp: 1710866172054 +- kind: conda + name: fonttools + version: 4.50.0 + build: py39ha55989b_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.50.0-py39ha55989b_0.conda + sha256: bf597dd671fccce939f2d046c32a3d3cc9cba84d0c06aba381f84817a106ac29 + md5: 10eb7013528a70b240bc2297c5dbfbc1 + depends: + - brotli + - munkres + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - ucrt >=10.0.20348.0 + - unicodedata2 >=14.0.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 1877377 + timestamp: 1710866233893 +- kind: conda + name: fonttools + version: 4.50.0 + build: py39hd1e30aa_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.50.0-py39hd1e30aa_0.conda + sha256: 22a510a2cc44444668f995ce0c8a7ac9653a6442c7f45dc903fa598962066593 + md5: 8b689d531a6f99ef71212081c0126147 + depends: + - brotli + - libgcc-ng >=12 + - munkres + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - unicodedata2 >=14.0.0 + license: MIT + license_family: MIT + size: 2287520 + timestamp: 1710865721782 +- kind: conda + name: fortran-language-server + version: 1.12.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/fortran-language-server-1.12.0-pyhd8ed1ab_0.tar.bz2 + sha256: 81b9b5d3508563f10dae99d2819042e5737fea1a8bfa6f281c1d1b81100b48ad + md5: 6d2677b354c9596e77d4583ddc15aa00 + depends: + - python >=3.6 + license: MIT + license_family: MIT + size: 62350 + timestamp: 1637570882364 +- kind: conda + name: fprettify + version: 0.3.7 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/fprettify-0.3.7-pyhd8ed1ab_0.tar.bz2 + sha256: d3242d15d46b7c101b468859e4c6d63b867e24b5f05f0afacc29945a4ee24aa8 + md5: 153742a29b4c22ee54442fb93a0e9127 + depends: + - configargparse + - python >=3.5 + license: GPL-3.0-or-later + license_family: GPL + size: 137690 + timestamp: 1637859635697 +- kind: conda + name: freetype + version: 2.12.1 + build: h267a509_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda + sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 + md5: 9ae35c3d96db2c94ce0cef86efdfa2cb + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<1.3.0a0 + license: GPL-2.0-only OR FTL + size: 634972 + timestamp: 1694615932610 +- kind: conda + name: freetype + version: 2.12.1 + build: h60636b9_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda + sha256: b292cf5a25f094eeb4b66e37d99a97894aafd04a5683980852a8cbddccdc8e4e + md5: 25152fce119320c980e5470e64834b50 + depends: + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<1.3.0a0 + license: GPL-2.0-only OR FTL + size: 599300 + timestamp: 1694616137838 +- kind: conda + name: freetype + version: 2.12.1 + build: hadb7bae_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 + md5: e6085e516a3e304ce41a8ee08b9b89ad + depends: + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<1.3.0a0 + license: GPL-2.0-only OR FTL + size: 596430 + timestamp: 1694616332835 +- kind: conda + name: freetype + version: 2.12.1 + build: hdaf720e_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-hdaf720e_2.conda + sha256: 2c53ee8879e05e149a9e525481d36adfd660a6abda26fd731376fa64ff03e728 + md5: 3761b23693f768dc75a8fd0a73ca053f + depends: + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: GPL-2.0-only OR FTL + size: 510306 + timestamp: 1694616398888 +- kind: conda + name: fribidi + version: 1.0.10 + build: h27ca646_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.10-h27ca646_0.tar.bz2 + sha256: 4b37ea851a2cf85edf0a63d2a63266847ec3dcbba4a31156d430cdd6aa811303 + md5: c64443234ff91d70cb9c7dc926c58834 + license: LGPL-2.1 + size: 60255 + timestamp: 1604417405528 +- kind: conda + name: fribidi + version: 1.0.10 + build: h36c2ea0_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 + sha256: 5d7b6c0ee7743ba41399e9e05a58ccc1cfc903942e49ff6f677f6e423ea7a627 + md5: ac7bc6a654f8f41b352b38f4051135f8 + depends: + - libgcc-ng >=7.5.0 + license: LGPL-2.1 + size: 114383 + timestamp: 1604416621168 +- kind: conda + name: fribidi + version: 1.0.10 + build: h8d14728_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/fribidi-1.0.10-h8d14728_0.tar.bz2 + sha256: e0323e6d7b6047042970812ee810c6b1e1a11a3af4025db26d0965ae5d206104 + md5: 807e81d915f2bb2e49951648615241f6 + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: LGPL-2.1 + size: 64567 + timestamp: 1604417122064 +- kind: conda + name: fribidi + version: 1.0.10 + build: hbcb3906_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.10-hbcb3906_0.tar.bz2 + sha256: 4f6db86ecc4984cd4ac88ca52030726c3cfd11a64dfb15c8602025ee3001a2b5 + md5: f1c6b41e0f56998ecd9a3e210faa1dc0 + license: LGPL-2.1 + size: 65388 + timestamp: 1604417213 +- kind: conda + name: gdk-pixbuf + version: 2.42.10 + build: h829c605_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_5.conda + sha256: bacd1cc3ed77699dec11ea5a670160db3cf701f1b19f34f1a19be36cae25c396 + md5: 8fdb82e5d9694dd8e9ed9ac8fdf48a26 + depends: + - libglib >=2.78.4,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + size: 573339 + timestamp: 1710203544212 +- kind: conda + name: gdk-pixbuf + version: 2.42.10 + build: hcea6d13_5 + build_number: 5 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.42.10-hcea6d13_5.conda + sha256: 1259c6a32269074b85e870a2afaa426f96cba6ebad547c3e152c941e46036e3a + md5: bbf4bb664dedbec6d3a8fb8b6d90b710 + depends: + - libglib >=2.78.4,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + size: 548239 + timestamp: 1710203926272 +- kind: conda + name: gdk-pixbuf + version: 2.42.10 + build: hd9e0ca3_5 + build_number: 5 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.42.10-hd9e0ca3_5.conda + sha256: e15a0923d2640020dc7f2ff2b04f09face4ddce6484e09f78752cd0e65ad1cdf + md5: 308cefd960b6ba51bdbdc5ba9e9b2377 + depends: + - libglib >=2.78.4,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + size: 550156 + timestamp: 1710203904195 +- kind: conda + name: geos + version: 3.12.1 + build: h1537add_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/geos-3.12.1-h1537add_0.conda + sha256: d7a6bb89063df38b24843e5b4c99da602333ac4e1c1e39c069f2021827d3c98d + md5: 02fdccc66ed44a8f9f3731d15f445724 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.1-only + size: 1561705 + timestamp: 1699778438983 +- kind: conda + name: geos + version: 3.12.1 + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda + sha256: 2593b255cb9c4639d6ea261c47aaed1380216a366546f0468e95c36c2afd1c1a + md5: 8c0f4f71f5a59ceb0c6fa9f51501066d + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: LGPL-2.1-only + size: 1736070 + timestamp: 1699778102442 +- kind: conda + name: geos + version: 3.12.1 + build: h93d8f39_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/geos-3.12.1-h93d8f39_0.conda + sha256: 6feffb0d1999a22c5f94d2168b1af9c5fbdd25c9a963a6825ee32cf05e5c07f5 + md5: d13f05ed3985f57456b610bab66366db + depends: + - __osx >=10.9 + - libcxx >=16.0.6 + license: LGPL-2.1-only + size: 1462098 + timestamp: 1699778844758 +- kind: conda + name: geos + version: 3.12.1 + build: h965bd2d_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/geos-3.12.1-h965bd2d_0.conda + sha256: 9cabd90e43caf8fe63a80909775f1ac76814f0666bf6fe7ba836d077a6d4dcf3 + md5: 0f28efe509ee998b3a09e571191d406a + depends: + - __osx >=10.9 + - libcxx >=16.0.6 + license: LGPL-2.1-only + size: 1376991 + timestamp: 1699778806863 +- kind: conda + name: getopt-win32 + version: '0.1' + build: hcfcfb64_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/getopt-win32-0.1-hcfcfb64_1.conda + sha256: f3b6e689724a62f36591f6f0e4657db5507feca78e7ef08690a6b2a384216a5c + md5: 714d0882dc5e692ca4683d8e520f73c6 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-3.0-only + license_family: GPL + size: 21903 + timestamp: 1694400856979 +- kind: conda + name: gettext + version: 0.21.1 + build: h0186832_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-0.21.1-h0186832_0.tar.bz2 + sha256: 093b2f96dc4b48e4952ab8946facec98b34b708a056251fc19c23c3aad30039e + md5: 63d2ff6fddfa74e5458488fd311bf635 + depends: + - libiconv >=1.17,<2.0a0 + license: LGPL-2.1-or-later AND GPL-3.0-or-later + size: 4021036 + timestamp: 1665674192347 +- kind: conda + name: gettext + version: 0.21.1 + build: h27087fc_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2 + sha256: 4fcfedc44e4c9a053f0416f9fc6ab6ed50644fca3a761126dbd00d09db1f546a + md5: 14947d8770185e5153fdd04d4673ed37 + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later AND GPL-3.0-or-later + size: 4320628 + timestamp: 1665673494324 +- kind: conda + name: gettext + version: 0.21.1 + build: h5728263_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/gettext-0.21.1-h5728263_0.tar.bz2 + sha256: 71c75b0a4dc2cf95d2860ea0076edf9f5558baeb4dacaeecb32643b199074616 + md5: 299d4fd6798a45337042ff5a48219e5f + depends: + - libiconv >=1.17,<2.0a0 + license: LGPL-2.1-or-later AND GPL-3.0-or-later + size: 5579416 + timestamp: 1665676022441 +- kind: conda + name: gettext + version: 0.21.1 + build: h8a4c099_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/gettext-0.21.1-h8a4c099_0.tar.bz2 + sha256: 915d3cd2d777b9b3fc2e87a25901b8e4a6aa1b2b33cf2ba54e9e9ed4f6b67d94 + md5: 1e3aff29ce703d421c43f371ad676cc5 + depends: + - libiconv >=1.17,<2.0a0 + license: LGPL-2.1-or-later AND GPL-3.0-or-later + size: 4153781 + timestamp: 1665674106245 +- kind: conda + name: giflib + version: 5.2.1 + build: h0b41bf4_3 + build_number: 3 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda + sha256: 41ec165704ccce2faa0437f4f53c03c06261a2cc9ff7614828e51427d9261f4b + md5: 96f3b11872ef6fad973eac856cd2624f + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 77385 + timestamp: 1678717794467 +- kind: conda + name: giflib + version: 5.2.1 + build: h1a8c8d9_3 + build_number: 3 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.1-h1a8c8d9_3.conda + sha256: dbf1e431d3e5e03f8eeb77ec08a4c5d6d5d9af84dbef13d4365e397dd389beb8 + md5: f39a05d3dbb0e5024b7deabb2c0993f1 + license: MIT + license_family: MIT + size: 71963 + timestamp: 1678718059849 +- kind: conda + name: giflib + version: 5.2.1 + build: hb7f2c08_3 + build_number: 3 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.1-hb7f2c08_3.conda + sha256: 47515e0874bcf67e438e1d5d093b074c1781f055067195f0d00a7790a56d446d + md5: aca150b0186836f893ebac79019e5498 + license: MIT + license_family: MIT + size: 76514 + timestamp: 1678717973971 +- kind: conda + name: glib + version: 2.80.0 + build: h39d0aa6_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_1.conda + sha256: a76ad2d20164be5425269ac9c65dc8a071ea6dbd5ac3090f9b16dc29a7af1dbc + md5: 0384fcbea19fea38cdbf4b3b8924e436 + depends: + - glib-tools 2.80.0 h0a98069_1 + - libglib 2.80.0 h39d0aa6_1 + - python * + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.1-or-later + size: 491857 + timestamp: 1710939590211 +- kind: conda + name: glib + version: 2.80.0 + build: hf2295e7_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_1.conda + sha256: 92e0344072050dafd9f478498a2662cb6e309697b58283793145fd05c413a921 + md5: d3bcc5c186f78feba6f39ea047c35950 + depends: + - glib-tools 2.80.0 hde27a5a_1 + - libgcc-ng >=12 + - libglib 2.80.0 hf2295e7_1 + - python * + license: LGPL-2.1-or-later + size: 503830 + timestamp: 1710939217743 +- kind: conda + name: glib-tools + version: 2.80.0 + build: h0a98069_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_1.conda + sha256: 079b56c014b5f70381924db7a70000676e616079045e7a70081e2f3cf69bc969 + md5: b6a4948e65ee42739ce14967e4cacdca + depends: + - libglib 2.80.0 h39d0aa6_1 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.1-or-later + size: 94114 + timestamp: 1710939517930 +- kind: conda + name: glib-tools + version: 2.80.0 + build: hde27a5a_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_1.conda + sha256: 8d736e120bb1fe3b57f957d8f6b90c9bb035ee1dac167714c9afba395af6878c + md5: 939ddd853b1d98bf6fd22cc0adeda317 + depends: + - libgcc-ng >=12 + - libglib 2.80.0 hf2295e7_1 + license: LGPL-2.1-or-later + size: 112852 + timestamp: 1710939161164 +- kind: conda + name: graphite2 + version: 1.3.13 + build: h59595ed_1003 + build_number: 1003 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda + sha256: 0595b009f20f8f60f13a6398e7cdcbd2acea5f986633adcf85f5a2283c992add + md5: f87c7b7c2cb45f323ffbce941c78ab7c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: LGPL-2.0-or-later + license_family: LGPL + size: 96855 + timestamp: 1711634169756 +- kind: conda + name: graphite2 + version: 1.3.13 + build: h63175ca_1003 + build_number: 1003 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.13-h63175ca_1003.conda + sha256: 25040a4f371b9b51663f546bac620122c237fa1d5d32968e21b0751af9b7f56f + md5: 3194499ee7d1a67404a87d0eefdd92c6 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.0-or-later + license_family: LGPL + size: 95406 + timestamp: 1711634622644 +- kind: conda + name: graphite2 + version: 1.3.13 + build: h73e2aa4_1003 + build_number: 1003 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.13-h73e2aa4_1003.conda + sha256: b71db966e47cd83b16bfcc2099b8fa87c07286f24a0742078fede4c84314f91a + md5: fc7124f86e1d359fc5d878accd9e814c + depends: + - libcxx >=16 + license: LGPL-2.0-or-later + license_family: LGPL + size: 84384 + timestamp: 1711634311095 +- kind: conda + name: graphite2 + version: 1.3.13 + build: hebf3989_1003 + build_number: 1003 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.13-hebf3989_1003.conda + sha256: 2eadafbfc52f5e7df3da3c3b7e5bbe34d970bea1d645ffe60b0b1c3a216657f5 + md5: 339991336eeddb70076d8ca826dac625 + depends: + - libcxx >=16 + license: LGPL-2.0-or-later + license_family: LGPL + size: 79774 + timestamp: 1711634444608 +- kind: conda + name: graphviz + version: 2.50.0 + build: h5abf519_3 + build_number: 3 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/graphviz-2.50.0-h5abf519_3.tar.bz2 + sha256: f3e2c487b545506ff20eb0dd48a1ec34e97d48357d98158326b743e1c790f3b8 + md5: b3270521ce5733ce016ee094ef2e8d27 + depends: + - cairo >=1.16.0,<2.0.0a0 + - expat >=2.4.8,<3.0a0 + - fontconfig >=2.13.96,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.10.4,<3.0a0 + - gdk-pixbuf >=2.42.8,<3.0a0 + - gtk2 + - gts >=0.7.6,<0.8.0a0 + - libgcc-ng >=12 + - libgd >=2.3.3,<2.4.0a0 + - libglib >=2.70.2,<3.0a0 + - librsvg >=2.54.4,<3.0a0 + - libstdcxx-ng >=12 + - libtool + - libwebp-base + - libzlib >=1.2.12,<1.3.0a0 + - pango >=1.50.8,<1.51.0a0 + - zlib >=1.2.12,<1.3.0a0 + license: EPL-1.0 + license_family: Other + size: 3101737 + timestamp: 1657298141011 +- kind: conda + name: graphviz + version: 2.50.0 + build: ha5baa68_3 + build_number: 3 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/graphviz-2.50.0-ha5baa68_3.tar.bz2 + sha256: 8c98ae0d99a756a5551ca192211588fc6f812cc411c0e20a13ad89b32c7540db + md5: edf6407c328dc71d699da7cc25fb2e17 + depends: + - cairo >=1.16.0,<2.0.0a0 + - expat >=2.4.8,<3.0a0 + - fontconfig >=2.13.96,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.10.4,<3.0a0 + - gdk-pixbuf >=2.42.8,<3.0a0 + - gtk2 + - gts >=0.7.6,<0.8.0a0 + - libcxx >=13.0.1 + - libgd >=2.3.3,<2.4.0a0 + - libglib >=2.70.2,<3.0a0 + - librsvg >=2.54.4,<3.0a0 + - libtool + - libwebp-base + - libzlib >=1.2.12,<1.3.0a0 + - pango >=1.50.8,<1.51.0a0 + - zlib >=1.2.12,<1.3.0a0 + license: EPL-1.0 + license_family: Other + size: 3143040 + timestamp: 1657298531555 +- kind: conda + name: graphviz + version: 2.50.0 + build: had6c3a3_3 + build_number: 3 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/graphviz-2.50.0-had6c3a3_3.tar.bz2 + sha256: efd04d88d2951771c57e78bfe7335c945645e7fe3b3501dd963f93e56895e002 + md5: 77a30e29d9b7980092597245a1a13ce1 + depends: + - cairo >=1.16.0,<2.0.0a0 + - expat >=2.4.8,<3.0a0 + - getopt-win32 >=0.1,<0.2.0a0 + - gts >=0.7.6,<0.8.0a0 + - libgd >=2.3.3,<2.4.0a0 + - libglib >=2.70.2,<3.0a0 + - pango >=1.50.8,<1.51.0a0 + - vc >=14.1,<15 + - vs2015_runtime >=14.16.27033 + license: EPL-1.0 + license_family: Other + size: 1112429 + timestamp: 1657298699584 +- kind: conda + name: graphviz + version: 2.50.0 + build: hc7d6d94_3 + build_number: 3 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-2.50.0-hc7d6d94_3.tar.bz2 + sha256: 3f285cc1d9af7a116cc988e0b03dc18efb16e501662c0221563ed1a1df0c9c5c + md5: 6dfdcc31332b1d93206888208cfc234d + depends: + - cairo >=1.16.0,<2.0.0a0 + - expat >=2.4.8,<3.0a0 + - fontconfig >=2.13.96,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.10.4,<3.0a0 + - gdk-pixbuf >=2.42.8,<3.0a0 + - gtk2 + - gts >=0.7.6,<0.8.0a0 + - libcxx >=13.0.1 + - libgd >=2.3.3,<2.4.0a0 + - libglib >=2.70.2,<3.0a0 + - librsvg >=2.54.4,<3.0a0 + - libtool + - libwebp-base + - libzlib >=1.2.12,<1.3.0a0 + - pango >=1.50.8,<1.51.0a0 + - zlib >=1.2.12,<1.3.0a0 + license: EPL-1.0 + license_family: Other + size: 2851615 + timestamp: 1657298551055 +- kind: conda + name: gst-plugins-base + version: 1.22.9 + build: h001b923_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.22.9-h001b923_1.conda + sha256: e2c37128de5bdc12e3656c9c50e7b1459d8890ea656b866e68293e334356b652 + md5: ef961ec5b46ac75cebd3d68460691c27 + depends: + - gettext >=0.21.1,<1.0a0 + - gstreamer 1.22.9 hb4038d2_1 + - libglib >=2.78.4,<3.0a0 + - libogg >=1.3.4,<1.4.0a0 + - libvorbis >=1.3.7,<1.4.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.0-or-later + license_family: LGPL + size: 2035564 + timestamp: 1711211913043 +- kind: conda + name: gst-plugins-base + version: 1.22.9 + build: hfa15dee_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-hfa15dee_1.conda + sha256: 58fda05d33182b29e0524d684f626aad5208fb21e0622bc4b9013791dc105417 + md5: b66ddd883308a836ed86c247231aab82 + depends: + - __glibc >=2.17,<3.0.a0 + - alsa-lib >=1.2.11,<1.3.0a0 + - gettext >=0.21.1,<1.0a0 + - gstreamer 1.22.9 h98fc4e7_1 + - libexpat >=2.6.2,<3.0a0 + - libgcc-ng >=12 + - libglib >=2.80.0,<3.0a0 + - libogg >=1.3.4,<1.4.0a0 + - libopus >=1.3.1,<2.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libstdcxx-ng >=12 + - libvorbis >=1.3.7,<1.4.0a0 + - libxcb >=1.15,<1.16.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - xorg-libx11 >=1.8.7,<2.0a0 + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxext >=1.3.4,<2.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + size: 2709720 + timestamp: 1711211314174 +- kind: conda + name: gstreamer + version: 1.22.9 + build: h98fc4e7_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.9-h98fc4e7_1.conda + sha256: 13cbc0ee5fa4a61f6f06e223d23d3c179dfbede51faf87cd2a4821efa2c249f2 + md5: f502076ed4db50d9ee5c907036a5a172 + depends: + - __glibc >=2.17,<3.0.a0 + - gettext >=0.21.1,<1.0a0 + - glib >=2.80.0,<3.0a0 + - libgcc-ng >=12 + - libglib >=2.80.0,<3.0a0 + - libiconv >=1.17,<2.0a0 + - libstdcxx-ng >=12 + license: LGPL-2.0-or-later + license_family: LGPL + size: 1982967 + timestamp: 1711211168691 +- kind: conda + name: gstreamer + version: 1.22.9 + build: hb4038d2_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.22.9-hb4038d2_1.conda + sha256: 4d42bc24434db62c093748ea3ad0b6ba3872b6810b761363585513ebd79b4f87 + md5: 70557ab875e72c1f21e8d2351aeb9c54 + depends: + - gettext >=0.21.1,<1.0a0 + - glib >=2.78.4,<3.0a0 + - libglib >=2.78.4,<3.0a0 + - libiconv >=1.17,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.0-or-later + license_family: LGPL + size: 1936661 + timestamp: 1711211717228 +- kind: conda + name: gtk2 + version: 2.24.33 + build: h280cfa0_4 + build_number: 4 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda + sha256: b946ba60d177d72157cad8af51723f1d081a4794741d35debe53f8b2c807f3af + md5: 410f86e58e880dcc7b0e910a8e89c05c + depends: + - atk-1.0 >=2.38.0 + - cairo >=1.18.0,<2.0a0 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - gdk-pixbuf >=2.42.10,<3.0a0 + - harfbuzz >=8.3.0,<9.0a0 + - libgcc-ng >=12 + - libglib >=2.78.4,<3.0a0 + - pango >=1.50.14,<2.0a0 + - xorg-libx11 >=1.8.7,<2.0a0 + - xorg-libxext >=1.3.4,<2.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + license: LGPL-2.1-or-later + size: 6478240 + timestamp: 1710142047337 +- kind: conda + name: gtk2 + version: 2.24.33 + build: h7895bb2_4 + build_number: 4 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/gtk2-2.24.33-h7895bb2_4.conda + sha256: fab8403a67273f69780b1e9b5f1db1aff74ff9472acc9f6df6d9b50fc252bd50 + md5: 9c1ba062d59f3f49a2d32d9611d72686 + depends: + - atk-1.0 >=2.38.0 + - cairo >=1.18.0,<2.0a0 + - gdk-pixbuf >=2.42.10,<3.0a0 + - gettext >=0.21.1,<1.0a0 + - libglib >=2.78.4,<3.0a0 + - pango >=1.50.14,<2.0a0 + license: LGPL-2.1-or-later + size: 6159912 + timestamp: 1710143969442 +- kind: conda + name: gtk2 + version: 2.24.33 + build: h8ca4665_4 + build_number: 4 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/gtk2-2.24.33-h8ca4665_4.conda + sha256: 5283dfb9a96d78a67e0cbf6e4592411bb19eaf27f2c7c14b47e63162e71317d2 + md5: ff451625250bf843393ca3d660accab3 + depends: + - atk-1.0 >=2.38.0 + - cairo >=1.18.0,<2.0a0 + - gdk-pixbuf >=2.42.10,<3.0a0 + - gettext >=0.21.1,<1.0a0 + - libglib >=2.78.4,<3.0a0 + - pango >=1.50.14,<2.0a0 + license: LGPL-2.1-or-later + size: 6137964 + timestamp: 1710142524166 +- kind: conda + name: gts + version: 0.7.6 + build: h53e17e3_4 + build_number: 4 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda + sha256: d5b82a36f7e9d7636b854e56d1b4fe01c4d895128a7b73e2ec6945b691ff3314 + md5: 848cc963fcfbd063c7a023024aa3bec0 + depends: + - libcxx >=15.0.7 + - libglib >=2.76.3,<3.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + size: 280972 + timestamp: 1686545425074 +- kind: conda + name: gts + version: 0.7.6 + build: h6b5321d_4 + build_number: 4 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda + sha256: b79755d2f9fc2113b6949bfc170c067902bc776e2c20da26e746e780f4f5a2d4 + md5: a41f14768d5e377426ad60c613f2923b + depends: + - libglib >=2.76.3,<3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.0-or-later + license_family: LGPL + size: 188688 + timestamp: 1686545648050 +- kind: conda + name: gts + version: 0.7.6 + build: h977cf35_4 + build_number: 4 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda + sha256: b5cd16262fefb836f69dc26d879b6508d29f8a5c5948a966c47fe99e2e19c99b + md5: 4d8df0b0db060d33c9a702ada998a8fe + depends: + - libgcc-ng >=12 + - libglib >=2.76.3,<3.0a0 + - libstdcxx-ng >=12 + license: LGPL-2.0-or-later + license_family: LGPL + size: 318312 + timestamp: 1686545244763 +- kind: conda + name: gts + version: 0.7.6 + build: he42f4ea_4 + build_number: 4 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda + sha256: e0f8c7bc1b9ea62ded78ffa848e37771eeaaaf55b3146580513c7266862043ba + md5: 21b4dd3098f63a74cf2aa9159cbef57d + depends: + - libcxx >=15.0.7 + - libglib >=2.76.3,<3.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + size: 304331 + timestamp: 1686545503242 +- kind: conda + name: harfbuzz + version: 8.3.0 + build: h3d44ed6_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda + sha256: 4b55aea03b18a4084b750eee531ad978d4a3690f63019132c26c6ad26bbe3aed + md5: 5a6f6c00ef982a9bc83558d9ac8f64a0 + depends: + - cairo >=1.18.0,<2.0a0 + - freetype >=2.12.1,<3.0a0 + - graphite2 + - icu >=73.2,<74.0a0 + - libgcc-ng >=12 + - libglib >=2.78.1,<3.0a0 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + size: 1547473 + timestamp: 1699925311766 +- kind: conda + name: harfbuzz + version: 8.3.0 + build: h7ab893a_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-8.3.0-h7ab893a_0.conda + sha256: 5365595303d95810d10662b46f9e857cedc82757cc7b5576bda30e15d66bb3ad + md5: b8ef0beb91df83c5e6038c9509b9f730 + depends: + - cairo >=1.18.0,<2.0a0 + - freetype >=2.12.1,<3.0a0 + - graphite2 + - icu >=73.2,<74.0a0 + - libglib >=2.78.1,<3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 1070592 + timestamp: 1699926990335 +- kind: conda + name: harfbuzz + version: 8.3.0 + build: h8f0ba13_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-8.3.0-h8f0ba13_0.conda + sha256: 55e95aee9e5be7ada5a1cccedf1bb74c1362a7504cb0251fb48bcfa8bbd7cae3 + md5: 71e7f9ba27feae122733bb9f1bfe594c + depends: + - __osx >=10.9 + - cairo >=1.18.0,<2.0a0 + - freetype >=2.12.1,<3.0a0 + - graphite2 + - icu >=73.2,<74.0a0 + - libcxx >=16.0.6 + - libglib >=2.78.1,<3.0a0 + license: MIT + license_family: MIT + size: 1295036 + timestamp: 1699925935335 +- kind: conda + name: harfbuzz + version: 8.3.0 + build: hf45c392_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-8.3.0-hf45c392_0.conda + sha256: c6ea14e4f4869bc78b27276c09832af845dfa415585362ed6064e37a1b5fe9c5 + md5: 41d890485f909e4ecdc608741718c75e + depends: + - __osx >=10.9 + - cairo >=1.18.0,<2.0a0 + - freetype >=2.12.1,<3.0a0 + - graphite2 + - icu >=73.2,<74.0a0 + - libcxx >=16.0.6 + - libglib >=2.78.1,<3.0a0 + license: MIT + license_family: MIT + size: 1342172 + timestamp: 1699925847743 +- kind: conda + name: hatchling + version: 1.22.4 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.4-pyhd8ed1ab_0.conda + sha256: e047a6fb6dd790f0cb5dd904809c81d38bdeee974726442f9274f6ac367f68a3 + md5: 8320faf2e07543de1e3968b733c44da1 + depends: + - editables >=0.3 + - importlib-metadata + - packaging >=21.3 + - pathspec >=0.10.1 + - pluggy >=1.0.0 + - python >=3.7 + - tomli >=1.2.2 + - trove-classifiers + license: MIT + license_family: MIT + size: 62671 + timestamp: 1711286880652 +- kind: conda + name: icu + version: '73.2' + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda + sha256: e12fd90ef6601da2875ebc432452590bc82a893041473bc1c13ef29001a73ea8 + md5: cc47e1facc155f91abd89b11e48e72ff + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + size: 12089150 + timestamp: 1692900650789 +- kind: conda + name: icu + version: '73.2' + build: h63175ca_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/icu-73.2-h63175ca_0.conda + sha256: 423aaa2b69d713520712f55c7c71994b7e6f967824bb39b59ad968e7b209ce8c + md5: 0f47d9e3192d9e09ae300da0d28e0f56 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 13422193 + timestamp: 1692901469029 +- kind: conda + name: icu + version: '73.2' + build: hc8870d7_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda + sha256: ff9cd0c6cd1349954c801fb443c94192b637e1b414514539f3c49c56a39f51b1 + md5: 8521bd47c0e11c5902535bb1a17c565f + license: MIT + license_family: MIT + size: 11997841 + timestamp: 1692902104771 +- kind: conda + name: icu + version: '73.2' + build: hf5e326d_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/icu-73.2-hf5e326d_0.conda + sha256: f66362dc36178ac9b7c7a9b012948a9d2d050b3debec24bbd94aadbc44854185 + md5: 5cc301d759ec03f28328428e28f65591 + license: MIT + license_family: MIT + size: 11787527 + timestamp: 1692901622519 +- kind: conda + name: idna + version: '3.6' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + sha256: 6ee4c986d69ce61e60a20b2459b6f2027baeba153f0a64995fd3cb47c2cc7e07 + md5: 1a76f09108576397c41c0b0c5bd84134 + depends: + - python >=3.6 + license: BSD-3-Clause + license_family: BSD + size: 50124 + timestamp: 1701027126206 +- kind: conda + name: importlib-metadata + version: 7.1.0 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda + sha256: cc2e7d1f7f01cede30feafc1118b7aefa244d0a12224513734e24165ae12ba49 + md5: 0896606848b2dc5cebdf111b6543aa04 + depends: + - python >=3.8 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + size: 27043 + timestamp: 1710971498183 +- kind: conda + name: importlib-resources + version: 6.4.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda + sha256: 38db827f445ae437a15d50a94816ae67a48285d0700f736af3eb90800a71f079 + md5: dcbadab7a68738a028e195ab68ab2d2e + depends: + - importlib_resources >=6.4.0,<6.4.1.0a0 + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 9657 + timestamp: 1711041029062 +- kind: conda + name: importlib_resources + version: 6.4.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda + sha256: c6ae80c0beaeabb342c5b041f19669992ae6e937dbec56ced766cb035900f9de + md5: c5d3907ad8bd7bf557521a1833cf7e6d + depends: + - python >=3.8 + - zipp >=3.1.0 + constrains: + - importlib-resources >=6.4.0,<6.4.1.0a0 + license: Apache-2.0 + license_family: APACHE + size: 33056 + timestamp: 1711041009039 +- kind: conda + name: iniconfig + version: 2.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + sha256: 38740c939b668b36a50ef455b077e8015b8c9cf89860d421b3fff86048f49666 + md5: f800d2da156d08e289b14e87e43c1ae5 + depends: + - python >=3.7 + license: MIT + license_family: MIT + size: 11101 + timestamp: 1673103208955 +- kind: conda + name: intel-openmp + version: 2024.0.0 + build: h57928b3_49841 + build_number: 49841 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.0.0-h57928b3_49841.conda + sha256: 6ee8eb9080bb3268654e015dd17ad79d0c1ea98b2eee6b928ecd27f01d6b38e8 + md5: e3255c8cdaf1d52f15816d1970f9c77a + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + size: 2325424 + timestamp: 1706182537883 +- kind: conda + name: jinja2 + version: 3.1.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda + sha256: fd517b7dd3a61eca34f8a6f9f92f306397149cae1204fce72ac3d227107dafdc + md5: e7d8df6509ba635247ff9aea31134262 + depends: + - markupsafe >=2.0 + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + size: 111589 + timestamp: 1704967140287 +- kind: conda + name: jsonschema + version: 4.21.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda + sha256: c5c1b4e08e91fdd697289015be1a176409b4e63942899a43b276f1f250be8129 + md5: 8a3a3d01629da20befa340919e3dd2c4 + depends: + - attrs >=22.2.0 + - importlib_resources >=1.4.0 + - jsonschema-specifications >=2023.03.6 + - pkgutil-resolve-name >=1.3.10 + - python >=3.8 + - referencing >=0.28.4 + - rpds-py >=0.7.1 + license: MIT + license_family: MIT + size: 72817 + timestamp: 1705707712082 +- kind: conda + name: jsonschema-specifications + version: 2023.12.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda + sha256: a9630556ddc3121c0be32f4cbf792dd9102bd380d5cd81d57759d172cf0c2da2 + md5: a0e4efb5f35786a05af4809a2fb1f855 + depends: + - importlib_resources >=1.4.0 + - python >=3.8 + - referencing >=0.31.0 + license: MIT + license_family: MIT + size: 16431 + timestamp: 1703778502971 +- kind: conda + name: jupyter_core + version: 5.7.1 + build: py39h6e9494a_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/jupyter_core-5.7.1-py39h6e9494a_0.conda + sha256: f30dc74ac083f9c97d5287b335ea193e0ddc27f02195f677436df84d6ccdf59e + md5: 9611b1806866adc1693cfb5a323f16e4 + depends: + - platformdirs >=2.5 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 80149 + timestamp: 1704727554036 +- kind: conda + name: jupyter_core + version: 5.7.2 + build: py39h2804cbe_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/jupyter_core-5.7.2-py39h2804cbe_0.conda + sha256: 8f76dc3754b315d16b1c3a64e387477c4ea4556358b87c80b4b7f37314a25ea9 + md5: 4466162887415f41a30c5c70776bee76 + depends: + - platformdirs >=2.5 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 79895 + timestamp: 1710257881036 +- kind: conda + name: jupyter_core + version: 5.7.2 + build: py39hcbf5309_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/jupyter_core-5.7.2-py39hcbf5309_0.conda + sha256: 1e02685a2bc5f2805da3236897db1eeb56d5b5f4501a9e1b6b0fe1da44745ec3 + md5: 78ec20214b67efe5caebb4f08bdee094 + depends: + - platformdirs >=2.5 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - pywin32 >=300 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 96366 + timestamp: 1710257842034 +- kind: conda + name: jupyter_core + version: 5.7.2 + build: py39hf3d152e_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.7.2-py39hf3d152e_0.conda + sha256: fbe43f4db84cd4eb0b3eed971a197237c9a0d53fa90b695a7fa82e4ccd193cbf + md5: 612f7a003a8a407955572c0d53952ceb + depends: + - platformdirs >=2.5 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 79658 + timestamp: 1710257600539 +- kind: conda + name: jupytext + version: 1.16.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.1-pyhd8ed1ab_0.conda + sha256: 450d03ec711a5cbd643f99f4fb2f08aa167db7a0cb54dcbb53700c81b290c316 + md5: 14a45070afec994235a23ae09b098cce + depends: + - markdown-it-py >=1.0 + - mdit-py-plugins + - nbformat + - packaging + - python >=3.8 + - pyyaml + - toml + license: MIT + license_family: MIT + size: 102909 + timestamp: 1705172248226 +- kind: conda + name: keyutils + version: 1.6.1 + build: h166bdaf_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- kind: conda + name: kiwisolver + version: 1.4.5 + build: py39h1f6ef14_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.5-py39h1f6ef14_1.conda + sha256: 2d6167d4c67b26d2363266b2fa6805e12da920fe5682847d8a5d9250e76dd833 + md5: 4fc5bd0a7b535252028c647cc27d6c87 + depends: + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 55660 + timestamp: 1695380433980 +- kind: conda + name: kiwisolver + version: 1.4.5 + build: py39h7633fee_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda + sha256: 620d2aa2c3f016aa569b4a679688cb34f27c05e08555e4860099cf001bd740e4 + md5: c9f74d717e5a2847a9f8b779c54130f2 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 73457 + timestamp: 1695380118523 +- kind: conda + name: kiwisolver + version: 1.4.5 + build: py39h8ee36c8_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.5-py39h8ee36c8_1.conda + sha256: 1ef89b03dd04951e0d78dd36e678b276f18b94326a85b271251e41465aded09b + md5: 6072db04642b21329b0502a177ec18bf + depends: + - libcxx >=15.0.7 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 60498 + timestamp: 1695380322018 +- kind: conda + name: kiwisolver + version: 1.4.5 + build: py39hbd775c9_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.5-py39hbd775c9_1.conda + sha256: ef29cfa7a05431f89f0bcf456d2d094dc3ff3cdbfebf7210a1fd55755ef61926 + md5: 6a5917bf932fcaae394baaf72cc11edb + depends: + - libcxx >=15.0.7 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 62080 + timestamp: 1695380521068 +- kind: conda + name: krb5 + version: 1.21.2 + build: h659d440_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda + sha256: 259bfaae731989b252b7d2228c1330ef91b641c9d68ff87dae02cbae682cb3e4 + md5: cd95826dbd331ed1be26bdf401432844 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.1.2,<4.0a0 + license: MIT + license_family: MIT + size: 1371181 + timestamp: 1692097755782 +- kind: conda + name: krb5 + version: 1.21.2 + build: heb0366b_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.2-heb0366b_0.conda + sha256: 6002adff9e3dcfc9732b861730cb9e33d45fd76b2035b2cdb4e6daacb8262c0b + md5: 6e8b0f22b4eef3b3cb3849bb4c3d47f9 + depends: + - openssl >=3.1.2,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 710894 + timestamp: 1692098129546 +- kind: conda + name: lame + version: '3.100' + build: h166bdaf_1003 + build_number: 1003 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab + md5: a8832b479f93521a9e7b5b743803be51 + depends: + - libgcc-ng >=12 + license: LGPL-2.0-only + license_family: LGPL + size: 508258 + timestamp: 1664996250081 +- kind: conda + name: lcms2 + version: '2.16' + build: h67d730c_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda + sha256: f9fd9e80e46358a57d9bb97b1e37a03da4022143b019aa3c4476d8a7795de290 + md5: d3592435917b62a8becff3a60db674f6 + depends: + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 507632 + timestamp: 1701648249706 +- kind: conda + name: lcms2 + version: '2.16' + build: ha0e7c42_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda + sha256: 151e0c84feb7e0747fabcc85006b8973b22f5abbc3af76a9add0b0ef0320ebe4 + md5: 66f6c134e76fe13cce8a9ea5814b5dd5 + depends: + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.7.0a0 + license: MIT + license_family: MIT + size: 211959 + timestamp: 1701647962657 +- kind: conda + name: lcms2 + version: '2.16' + build: ha2f27b4_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.16-ha2f27b4_0.conda + sha256: 222ebc0a55544b9922f61e75015d02861e65b48f12113af41d48ba0814e14e4e + md5: 1442db8f03517834843666c422238c9b + depends: + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.7.0a0 + license: MIT + license_family: MIT + size: 224432 + timestamp: 1701648089496 +- kind: conda + name: lcms2 + version: '2.16' + build: hb7c19ff_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda + sha256: 5c878d104b461b7ef922abe6320711c0d01772f4cd55de18b674f88547870041 + md5: 51bb7010fc86f70eee639b4bb7a894f5 + depends: + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.7.0a0 + license: MIT + license_family: MIT + size: 245247 + timestamp: 1701647787198 +- kind: conda + name: ld_impl_linux-64 + version: '2.40' + build: h41732ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda + sha256: f6cc89d887555912d6c61b295d398cff9ec982a3417d38025c45d5dd9b9e79cd + md5: 7aca3059a1729aa76c597603f10b0dd3 + constrains: + - binutils_impl_linux-64 2.40 + license: GPL-3.0-only + license_family: GPL + size: 704696 + timestamp: 1674833944779 +- kind: conda + name: lerc + version: 4.0.0 + build: h27087fc_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 + md5: 76bbff344f0134279f225174e9064c8f + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: Apache-2.0 + license_family: Apache + size: 281798 + timestamp: 1657977462600 +- kind: conda + name: lerc + version: 4.0.0 + build: h63175ca_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 + sha256: f4f39d7f6a2f9b407f8fb567a6c25755270421731d70f0ff331f5de4fa367488 + md5: 1900cb3cab5055833cfddb0ba233b074 + depends: + - vc >=14.2,<15 + - vs2015_runtime >=14.29.30037 + license: Apache-2.0 + license_family: Apache + size: 194365 + timestamp: 1657977692274 +- kind: conda + name: lerc + version: 4.0.0 + build: h9a09cb3_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + sha256: 6f068bb53dfb6147d3147d981bb851bb5477e769407ad4e6a68edf482fdcb958 + md5: de462d5aacda3b30721b512c5da4e742 + depends: + - libcxx >=13.0.1 + license: Apache-2.0 + license_family: Apache + size: 215721 + timestamp: 1657977558796 +- kind: conda + name: lerc + version: 4.0.0 + build: hb486fe8_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 + sha256: e41790fc0f4089726369b3c7f813117bbc14b533e0ed8b94cf75aba252e82497 + md5: f9d6a4c82889d5ecedec1d90eb673c55 + depends: + - libcxx >=13.0.1 + license: Apache-2.0 + license_family: Apache + size: 290319 + timestamp: 1657977526749 +- kind: conda + name: libblas + version: 3.9.0 + build: 21_linux64_openblas + build_number: 21 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda + sha256: ebd5c91f029f779fb88a1fcbd1e499559a9c258e3674ff58a2fbb4e375ae56d9 + md5: 0ac9f44fc096772b0aa092119b00c3ca + depends: + - libopenblas >=0.3.26,<0.3.27.0a0 + - libopenblas >=0.3.26,<1.0a0 + constrains: + - liblapacke 3.9.0 21_linux64_openblas + - blas * openblas + - libcblas 3.9.0 21_linux64_openblas + - liblapack 3.9.0 21_linux64_openblas + license: BSD-3-Clause + license_family: BSD + size: 14691 + timestamp: 1705979549006 +- kind: conda + name: libblas + version: 3.9.0 + build: 21_osx64_openblas + build_number: 21 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-21_osx64_openblas.conda + sha256: 5381eab20f4793996cf22e58461ea8a3a4dff1442bb45663b5920f2d26288688 + md5: 23286066c595986aa0df6452a8416c08 + depends: + - libopenblas >=0.3.26,<0.3.27.0a0 + - libopenblas >=0.3.26,<1.0a0 + constrains: + - libcblas 3.9.0 21_osx64_openblas + - liblapacke 3.9.0 21_osx64_openblas + - blas * openblas + - liblapack 3.9.0 21_osx64_openblas + license: BSD-3-Clause + license_family: BSD + size: 14822 + timestamp: 1705979699547 +- kind: conda + name: libblas + version: 3.9.0 + build: 21_osxarm64_openblas + build_number: 21 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-21_osxarm64_openblas.conda + sha256: 9a553af92af9f241457f4d14eabb872bc341cd0ddea1da6e7939e9c6a7ee1a25 + md5: b3804f4af39eca9d77360b12811e6d1d + depends: + - libopenblas >=0.3.26,<0.3.27.0a0 + - libopenblas >=0.3.26,<1.0a0 + constrains: + - libcblas 3.9.0 21_osxarm64_openblas + - liblapack 3.9.0 21_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 21_osxarm64_openblas + license: BSD-3-Clause + license_family: BSD + size: 14915 + timestamp: 1705980172730 +- kind: conda + name: libblas + version: 3.9.0 + build: 21_win64_mkl + build_number: 21 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-21_win64_mkl.conda + sha256: ad47053cee17802df875203aba191b04d97a50d820dbf75a114a50972c517334 + md5: ebba3846d11201fe54277e4965ba5250 + depends: + - mkl 2024.0.0 h66d3029_49657 + constrains: + - liblapack 3.9.0 21_win64_mkl + - blas * mkl + - libcblas 3.9.0 21_win64_mkl + - liblapacke 3.9.0 21_win64_mkl + license: BSD-3-Clause + license_family: BSD + size: 5017135 + timestamp: 1705980415163 +- kind: conda + name: libbrotlicommon + version: 1.1.0 + build: h0dc2134_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h0dc2134_1.conda + sha256: f57c57c442ef371982619f82af8735f93a4f50293022cfd1ffaf2ff89c2e0b2a + md5: 9e6c31441c9aa24e41ace40d6151aab6 + license: MIT + license_family: MIT + size: 67476 + timestamp: 1695990207321 +- kind: conda + name: libbrotlicommon + version: 1.1.0 + build: hb547adb_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hb547adb_1.conda + sha256: 556f0fddf4bd4d35febab404d98cb6862ce3b7ca843e393da0451bfc4654cf07 + md5: cd68f024df0304be41d29a9088162b02 + license: MIT + license_family: MIT + size: 68579 + timestamp: 1695990426128 +- kind: conda + name: libbrotlicommon + version: 1.1.0 + build: hcfcfb64_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-hcfcfb64_1.conda + sha256: f75fed29b0cc503d1b149a4945eaa32df56e19da5e2933de29e8f03947203709 + md5: f77f319fb82980166569e1280d5b2864 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 70598 + timestamp: 1695990405143 +- kind: conda + name: libbrotlicommon + version: 1.1.0 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda + sha256: 40f29d1fab92c847b083739af86ad2f36d8154008cf99b64194e4705a1725d78 + md5: aec6c91c7371c26392a06708a73c70e5 + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 69403 + timestamp: 1695990007212 +- kind: conda + name: libbrotlidec + version: 1.1.0 + build: h0dc2134_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h0dc2134_1.conda + sha256: b11939c4c93c29448660ab5f63273216969d1f2f315dd9be60f3c43c4e61a50c + md5: 9ee0bab91b2ca579e10353738be36063 + depends: + - libbrotlicommon 1.1.0 h0dc2134_1 + license: MIT + license_family: MIT + size: 30327 + timestamp: 1695990232422 +- kind: conda + name: libbrotlidec + version: 1.1.0 + build: hb547adb_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hb547adb_1.conda + sha256: c1c85937828ad3bc434ac60b7bcbde376f4d2ea4ee42d15d369bf2a591775b4a + md5: ee1a519335cc10d0ec7e097602058c0a + depends: + - libbrotlicommon 1.1.0 hb547adb_1 + license: MIT + license_family: MIT + size: 28928 + timestamp: 1695990463780 +- kind: conda + name: libbrotlidec + version: 1.1.0 + build: hcfcfb64_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-hcfcfb64_1.conda + sha256: 1b352ee05931ea24c11cd4a994d673890fd1cc690c21e023e736bdaac2632e93 + md5: 19ce3e1dacc7912b3d6ff40690ba9ae0 + depends: + - libbrotlicommon 1.1.0 hcfcfb64_1 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 32788 + timestamp: 1695990443165 +- kind: conda + name: libbrotlidec + version: 1.1.0 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda + sha256: 86fc861246fbe5ad85c1b6b3882aaffc89590a48b42d794d3d5c8e6d99e5f926 + md5: f07002e225d7a60a694d42a7bf5ff53f + depends: + - libbrotlicommon 1.1.0 hd590300_1 + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 32775 + timestamp: 1695990022788 +- kind: conda + name: libbrotlienc + version: 1.1.0 + build: h0dc2134_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h0dc2134_1.conda + sha256: bc964c23e1a60ca1afe7bac38a9c1f2af3db4a8072c9f2eac4e4de537a844ac7 + md5: 8a421fe09c6187f0eb5e2338a8a8be6d + depends: + - libbrotlicommon 1.1.0 h0dc2134_1 + license: MIT + license_family: MIT + size: 299092 + timestamp: 1695990259225 +- kind: conda + name: libbrotlienc + version: 1.1.0 + build: hb547adb_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hb547adb_1.conda + sha256: 690dfc98e891ee1871c54166d30f6e22edfc2d7d6b29e7988dde5f1ce271c81a + md5: d7e077f326a98b2cc60087eaff7c730b + depends: + - libbrotlicommon 1.1.0 hb547adb_1 + license: MIT + license_family: MIT + size: 280943 + timestamp: 1695990509392 +- kind: conda + name: libbrotlienc + version: 1.1.0 + build: hcfcfb64_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-hcfcfb64_1.conda + sha256: eae6b76154e594c6d211160c6d1aeed848672618152a562e0eabdfa641d34aca + md5: 71e890a0b361fd58743a13f77e1506b7 + depends: + - libbrotlicommon 1.1.0 hcfcfb64_1 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 246515 + timestamp: 1695990479484 +- kind: conda + name: libbrotlienc + version: 1.1.0 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda + sha256: f751b8b1c4754a2a8dfdc3b4040fa7818f35bbf6b10e905a47d3a194b746b071 + md5: 5fc11c6020d421960607d821310fcd4d + depends: + - libbrotlicommon 1.1.0 hd590300_1 + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 282523 + timestamp: 1695990038302 +- kind: conda + name: libcap + version: '2.69' + build: h0f662aa_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda + sha256: 942f9564b4228609f017b6617425d29a74c43b8a030e12239fa4458e5cb6323c + md5: 25cb5999faa414e5ccb2c1388f62d3d5 + depends: + - attr >=2.5.1,<2.6.0a0 + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 100582 + timestamp: 1684162447012 +- kind: conda + name: libcblas + version: 3.9.0 + build: 21_linux64_openblas + build_number: 21 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda + sha256: 467bbfbfe1a1aeb8b1f9f6485eedd8ed1b6318941bf3702da72336ccf4dc25a6 + md5: 4a3816d06451c4946e2db26b86472cb6 + depends: + - libblas 3.9.0 21_linux64_openblas + constrains: + - liblapacke 3.9.0 21_linux64_openblas + - blas * openblas + - liblapack 3.9.0 21_linux64_openblas + license: BSD-3-Clause + license_family: BSD + size: 14614 + timestamp: 1705979564122 +- kind: conda + name: libcblas + version: 3.9.0 + build: 21_osx64_openblas + build_number: 21 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-21_osx64_openblas.conda + sha256: e2b1455612d4cfb3ac3170f0c538516ebd0b113780ac6603338245354e1b2f02 + md5: 7a1b54774bad723e8ba01ca48eb301b5 + depends: + - libblas 3.9.0 21_osx64_openblas + constrains: + - liblapacke 3.9.0 21_osx64_openblas + - blas * openblas + - liblapack 3.9.0 21_osx64_openblas + license: BSD-3-Clause + license_family: BSD + size: 14715 + timestamp: 1705979715508 +- kind: conda + name: libcblas + version: 3.9.0 + build: 21_osxarm64_openblas + build_number: 21 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-21_osxarm64_openblas.conda + sha256: 4510e3e4824693c3f80fc54e72d81dd89acaa6e6d68cd948af0870a640ea7eeb + md5: 48e9d42c65ce664d8fccef2ac6af853c + depends: + - libblas 3.9.0 21_osxarm64_openblas + constrains: + - liblapack 3.9.0 21_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 21_osxarm64_openblas + license: BSD-3-Clause + license_family: BSD + size: 14800 + timestamp: 1705980195551 +- kind: conda + name: libcblas + version: 3.9.0 + build: 21_win64_mkl + build_number: 21 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-21_win64_mkl.conda + sha256: 886505d0a4a5b508b2255991395aadecdad140719ba0d413411fec86491a9283 + md5: 38e5ec23bc2b62f9dd971143aa9dddb7 + depends: + - libblas 3.9.0 21_win64_mkl + constrains: + - liblapack 3.9.0 21_win64_mkl + - blas * mkl + - liblapacke 3.9.0 21_win64_mkl + license: BSD-3-Clause + license_family: BSD + size: 5017024 + timestamp: 1705980469944 +- kind: conda + name: libclang-cpp15 + version: 15.0.7 + build: default_h127d8a8_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp15-15.0.7-default_h127d8a8_5.conda + sha256: 9b0238e705a33da74ca82efd03974f499550f7dada1340cc9cb7c35a92411ed8 + md5: d0a9633b53cdc319b8a1a532ae7822b8 + depends: + - libgcc-ng >=12 + - libllvm15 >=15.0.7,<15.1.0a0 + - libstdcxx-ng >=12 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 17206402 + timestamp: 1711063711931 +- kind: conda + name: libclang13 + version: 18.1.2 + build: default_h5d6823c_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.2-default_h5d6823c_1.conda + sha256: fd1bb5fb2cd65526e1c67ea20efbbe8c1b1bf8ff61465af591d7b25f0c037b06 + md5: 7aa3c2bbedb583b81e1efc997cb22073 + depends: + - libgcc-ng >=12 + - libllvm18 >=18.1.2,<18.2.0a0 + - libstdcxx-ng >=12 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 11070109 + timestamp: 1711067889145 +- kind: conda + name: libclang13 + version: 18.1.2 + build: default_hf64faad_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.2-default_hf64faad_1.conda + sha256: 847dc28280d6564a02ef971a232f30c84fcb5d366a54e59de35fae33e096c8cc + md5: ece5a1b226db1000b2c479694c1ae265 + depends: + - libzlib >=1.2.13,<1.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - zstd >=1.5.5,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 25310297 + timestamp: 1711069468740 +- kind: conda + name: libcups + version: 2.3.3 + build: h4637d8d_4 + build_number: 4 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda + sha256: bc67b9b21078c99c6bd8595fe7e1ed6da1f721007726e717f0449de7032798c4 + md5: d4529f4dff3057982a7617c7ac58fde3 + depends: + - krb5 >=1.21.1,<1.22.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<1.3.0a0 + license: Apache-2.0 + license_family: Apache + size: 4519402 + timestamp: 1689195353551 +- kind: conda + name: libcxx + version: 16.0.6 + build: h4653b0c_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-16.0.6-h4653b0c_0.conda + sha256: 11d3fb51c14832d9e4f6d84080a375dec21ea8a3a381a1910e67ff9cedc20355 + md5: 9d7d724faf0413bf1dbc5a85935700c8 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 1160232 + timestamp: 1686896993785 +- kind: conda + name: libcxx + version: 16.0.6 + build: hd57cbcb_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libcxx-16.0.6-hd57cbcb_0.conda + sha256: 9063271847cf05f3a6cc6cae3e7f0ced032ab5f3a3c9d3f943f876f39c5c2549 + md5: 7d6972792161077908b62971802f289a + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 1142172 + timestamp: 1686896907750 +- kind: conda + name: libdeflate + version: '1.20' + build: h49d49c5_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.20-h49d49c5_0.conda + sha256: 8c2087952db55c4118dd2e29381176a54606da47033fd61ebb1b0f4391fcd28d + md5: d46104f6a896a0bc6a1d37b88b2edf5c + license: MIT + license_family: MIT + size: 70364 + timestamp: 1711196727346 +- kind: conda + name: libdeflate + version: '1.20' + build: h93a5062_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.20-h93a5062_0.conda + sha256: 6d16cccb141b6bb05c38107b335089046664ea1d6611601d3f6e7e4227a99925 + md5: 97efeaeba2a9a82bdf46fc6d025e3a57 + license: MIT + license_family: MIT + size: 54481 + timestamp: 1711196723486 +- kind: conda + name: libdeflate + version: '1.20' + build: hcfcfb64_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.20-hcfcfb64_0.conda + sha256: 6628a5b76ad70c1a0909563c637ddc446ee824739ba7c348d4da2f0aa6ac9527 + md5: b12b5bde5eb201a1df75e49320cc938a + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 155358 + timestamp: 1711197066985 +- kind: conda + name: libdeflate + version: '1.20' + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda + sha256: f8e0f25c382b1d0b87a9b03887a34dbd91485453f1ea991fef726dba57373612 + md5: 8e88f9389f1165d7c0936fe40d9a9a79 + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 71500 + timestamp: 1711196523408 +- kind: conda + name: libedit + version: 3.1.20191231 + build: he28a2e2_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 + sha256: a57d37c236d8f7c886e01656f4949d9dcca131d2a0728609c6f7fa338b65f1cf + md5: 4d331e44109e3f0e19b4cb8f9b82f3e1 + depends: + - libgcc-ng >=7.5.0 + - ncurses >=6.2,<7.0.0a0 + license: BSD-2-Clause + license_family: BSD + size: 123878 + timestamp: 1597616541093 +- kind: conda + name: libevent + version: 2.1.12 + build: hf998b51_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 427426 + timestamp: 1685725977222 +- kind: conda + name: libexpat + version: 2.6.2 + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda + sha256: 331bb7c7c05025343ebd79f86ae612b9e1e74d2687b8f3179faec234f986ce19 + md5: e7ba12deb7020dd080c6c70e7b6f6a3d + depends: + - libgcc-ng >=12 + constrains: + - expat 2.6.2.* + license: MIT + license_family: MIT + size: 73730 + timestamp: 1710362120304 +- kind: conda + name: libexpat + version: 2.6.2 + build: h63175ca_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda + sha256: 79f612f75108f3e16bbdc127d4885bb74729cf66a8702fca0373dad89d40c4b7 + md5: bc592d03f62779511d392c175dcece64 + constrains: + - expat 2.6.2.* + license: MIT + license_family: MIT + size: 139224 + timestamp: 1710362609641 +- kind: conda + name: libexpat + version: 2.6.2 + build: h73e2aa4_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda + sha256: a188a77b275d61159a32ab547f7d17892226e7dac4518d2c6ac3ac8fc8dfde92 + md5: 3d1d51c8f716d97c864d12f7af329526 + constrains: + - expat 2.6.2.* + license: MIT + license_family: MIT + size: 69246 + timestamp: 1710362566073 +- kind: conda + name: libexpat + version: 2.6.2 + build: hebf3989_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda + sha256: ba7173ac30064ea901a4c9fb5a51846dcc25512ceb565759be7d18cbf3e5415e + md5: e3cde7cfa87f82f7cb13d482d5e0ad09 + constrains: + - expat 2.6.2.* + license: MIT + license_family: MIT + size: 63655 + timestamp: 1710362424980 +- kind: conda + name: libffi + version: 3.4.2 + build: h0d85af4_5 + build_number: 5 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 + sha256: 7a2d27a936ceee6942ea4d397f9c7d136f12549d86f7617e8b6bad51e01a941f + md5: ccb34fb14960ad8b125962d3d79b31a9 + license: MIT + license_family: MIT + size: 51348 + timestamp: 1636488394370 +- kind: conda + name: libffi + version: 3.4.2 + build: h3422bc3_5 + build_number: 5 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + license: MIT + license_family: MIT + size: 39020 + timestamp: 1636488587153 +- kind: conda + name: libffi + version: 3.4.2 + build: h7f98852_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + size: 58292 + timestamp: 1636488182923 +- kind: conda + name: libffi + version: 3.4.2 + build: h8ffe710_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 + md5: 2c96d1b6915b408893f9472569dee135 + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: MIT + license_family: MIT + size: 42063 + timestamp: 1636489106777 +- kind: conda + name: libflac + version: 1.4.3 + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + sha256: 65908b75fa7003167b8a8f0001e11e58ed5b1ef5e98b96ab2ba66d7c1b822c7d + md5: ee48bf17cc83a00f59ca1494d5646869 + depends: + - gettext >=0.21.1,<1.0a0 + - libgcc-ng >=12 + - libogg 1.3.* + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 394383 + timestamp: 1687765514062 +- kind: conda + name: libgcc-ng + version: 13.2.0 + build: h807b86a_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda + sha256: d32f78bfaac282cfe5205f46d558704ad737b8dbf71f9227788a5ca80facaba4 + md5: d4ff227c46917d3b4565302a2bbb276b + depends: + - _libgcc_mutex 0.1 conda_forge + - _openmp_mutex >=4.5 + constrains: + - libgomp 13.2.0 h807b86a_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 770506 + timestamp: 1706819192021 +- kind: conda + name: libgcrypt + version: 1.10.3 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda + sha256: d1bd47faa29fec7288c7b212198432b07f890d3d6f646078da93b059c2e9daff + md5: 32d16ad533c59bb0a3c5ffaf16110829 + depends: + - libgcc-ng >=12 + - libgpg-error >=1.47,<2.0a0 + license: LGPL-2.1-or-later AND GPL-2.0-or-later + license_family: GPL + size: 634887 + timestamp: 1701383493365 +- kind: conda + name: libgd + version: 2.3.3 + build: h0dceb68_9 + build_number: 9 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-h0dceb68_9.conda + sha256: 4ed8546ff3356fc42f0e155446a060b14ee4aa96802e2da586532861deb3b917 + md5: 1feb43971521d430bf826f8398598c5b + depends: + - expat + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=73.2,<74.0a0 + - libexpat >=2.5.0,<3.0a0 + - libiconv >=1.17,<2.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp + - libwebp-base >=1.3.2,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - zlib + license: GD + license_family: BSD + size: 202884 + timestamp: 1696161058863 +- kind: conda + name: libgd + version: 2.3.3 + build: h119a65a_9 + build_number: 9 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda + sha256: b74f95a6e1f3b31a74741b39cba83ed99fc82d17243c0fd3b5ab16ddd48ab89d + md5: cfebc557e54905dadc355c0e9f003004 + depends: + - expat + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=73.2,<74.0a0 + - libexpat >=2.5.0,<3.0a0 + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp + - libwebp-base >=1.3.2,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - zlib + license: GD + license_family: BSD + size: 224448 + timestamp: 1696160785971 +- kind: conda + name: libgd + version: 2.3.3 + build: h312136b_9 + build_number: 9 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h312136b_9.conda + sha256: fa75f4206eb9cd8e5e24fe1b6381a7450cfcb507c42813fd028a924a4872bc76 + md5: 69c987e1f9268d9ade86497c4ab8cc45 + depends: + - expat + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=73.2,<74.0a0 + - libexpat >=2.5.0,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp + - libwebp-base >=1.3.2,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - xorg-libxpm >=3.5.16,<4.0a0 + - zlib + license: GD + license_family: BSD + size: 344848 + timestamp: 1696161193894 +- kind: conda + name: libgd + version: 2.3.3 + build: hfdf3952_9 + build_number: 9 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-hfdf3952_9.conda + sha256: cfdecfaa27807abc2728bd8c60b923ce1b44020553e122e9a56fc3acb77acaec + md5: 0d847466f115fbdaaf2b6926f2e33278 + depends: + - expat + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=73.2,<74.0a0 + - libexpat >=2.5.0,<3.0a0 + - libiconv >=1.17,<2.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp + - libwebp-base >=1.3.2,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - zlib + license: GD + license_family: BSD + size: 206783 + timestamp: 1696161158189 +- kind: conda + name: libgfortran + version: 5.0.0 + build: 13_2_0_h97931a8_3 + build_number: 3 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda + sha256: 4874422e567b68334705c135c17e5acdca1404de8255673ce30ad3510e00be0d + md5: 0b6e23a012ee7a9a5f6b244f5a92c1d5 + depends: + - libgfortran5 13.2.0 h2873a65_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110106 + timestamp: 1707328956438 +- kind: conda + name: libgfortran + version: 5.0.0 + build: 13_2_0_hd922786_3 + build_number: 3 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda + sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b + md5: 4a55d9e169114b2b90d3ec4604cd7bbf + depends: + - libgfortran5 13.2.0 hf226fd6_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 110233 + timestamp: 1707330749033 +- kind: conda + name: libgfortran-ng + version: 13.2.0 + build: h69a702a_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda + sha256: 238c16c84124d58307376715839aa152bd4a1bf5a043052938ad6c3137d30245 + md5: e73e9cfd1191783392131e6238bdb3e9 + depends: + - libgfortran5 13.2.0 ha4646dd_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 23829 + timestamp: 1706819413770 +- kind: conda + name: libgfortran5 + version: 13.2.0 + build: h2873a65_3 + build_number: 3 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda + sha256: da3db4b947e30aec7596a3ef92200d17e774cccbbf7efc47802529a4ca5ca31b + md5: e4fb4d23ec2870ff3c40d10afe305aec + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1571379 + timestamp: 1707328880361 +- kind: conda + name: libgfortran5 + version: 13.2.0 + build: ha4646dd_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda + sha256: ba8d94e8493222ce155bb264d9de4200e41498a458e866fedf444de809bde8b6 + md5: 7a6bd7a12a4bd359e2afe6c0fa1acace + depends: + - libgcc-ng >=13.2.0 + constrains: + - libgfortran-ng 13.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1442769 + timestamp: 1706819209473 +- kind: conda + name: libgfortran5 + version: 13.2.0 + build: hf226fd6_3 + build_number: 3 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + sha256: bafc679eedb468a86aa4636061c55966186399ee0a04b605920d208d97ac579a + md5: 66ac81d54e95c534ae488726c1f698ea + depends: + - llvm-openmp >=8.0.0 + constrains: + - libgfortran 5.0.0 13_2_0_*_3 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 997381 + timestamp: 1707330687590 +- kind: conda + name: libglib + version: 2.80.0 + build: h39d0aa6_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_1.conda + sha256: 326fb2d1c8789660cec01eda3eec2fa15dd816d291126df13f1c34d80ffda6aa + md5: 6160439f169ec670951460024751b2ae + depends: + - libffi >=3.4,<4.0a0 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - pcre2 >=10.43,<10.44.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - glib 2.80.0 *_1 + license: LGPL-2.1-or-later + size: 2805065 + timestamp: 1710939443433 +- kind: conda + name: libglib + version: 2.80.0 + build: h81c1438_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.0-h81c1438_1.conda + sha256: 5bc911f8c29878252f14dfc08fcf72cf550038a7102f9c03612fee9f7ccf6234 + md5: e1c7ad2617b7ebe7589e87024d90ddda + depends: + - gettext >=0.21.1,<1.0a0 + - libffi >=3.4,<4.0a0 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - pcre2 >=10.43,<10.44.0a0 + constrains: + - glib 2.80.0 *_1 + license: LGPL-2.1-or-later + size: 2641391 + timestamp: 1710939600553 +- kind: conda + name: libglib + version: 2.80.0 + build: hf2295e7_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_1.conda + sha256: 636d984568a1e5d915098a5020712f82bb3988635015765c3caf70f1a91340c5 + md5: 0725f6081030c29b109088639824ff90 + depends: + - libffi >=3.4,<4.0a0 + - libgcc-ng >=12 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - pcre2 >=10.43,<10.44.0a0 + constrains: + - glib 2.80.0 *_1 + license: LGPL-2.1-or-later + size: 2888982 + timestamp: 1710939100254 +- kind: conda + name: libglib + version: 2.80.0 + build: hfc324ee_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.0-hfc324ee_1.conda + sha256: b7411c3b19681fea1a33c093364cb2d8a021a408133399b23c947231aac157d9 + md5: 3d8a5773a6ba1be1db8dc23ea9f44a0a + depends: + - gettext >=0.21.1,<1.0a0 + - libffi >=3.4,<4.0a0 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - pcre2 >=10.43,<10.44.0a0 + constrains: + - glib 2.80.0 *_1 + license: LGPL-2.1-or-later + size: 2630397 + timestamp: 1710939388253 +- kind: conda + name: libgomp + version: 13.2.0 + build: h807b86a_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda + sha256: 0d3d4b1b0134283ea02d58e8eb5accf3655464cf7159abf098cc694002f8d34e + md5: d211c42b9ce49aee3734fdc828731689 + depends: + - _libgcc_mutex 0.1 conda_forge + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 419751 + timestamp: 1706819107383 +- kind: conda + name: libgpg-error + version: '1.48' + build: h71f35ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.48-h71f35ed_0.conda + sha256: c448c6d86d27e10b9e844172000540e9cbfe9c28f968db87f949ba05add9bd50 + md5: 4d18d86916705d352d5f4adfb7f0edd3 + depends: + - gettext >=0.21.1,<1.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: GPL-2.0-only + license_family: GPL + size: 266447 + timestamp: 1708702470365 +- kind: conda + name: libhwloc + version: 2.9.3 + build: default_haede6df_1009 + build_number: 1009 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.9.3-default_haede6df_1009.conda + sha256: 2e8c4bb7173f281a8e13f333a23c9fb7a1c86d342d7dccdd74f2eb583ddde450 + md5: 87da045f6d26ce9fe20ad76a18f6a18a + depends: + - libxml2 >=2.11.5,<3.0.0a0 + - pthreads-win32 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 2578462 + timestamp: 1694533393675 +- kind: conda + name: libiconv + version: '1.17' + build: h0d3ecfb_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda + sha256: bc7de5097b97bcafcf7deaaed505f7ce02f648aac8eccc0d5a47cc599a1d0304 + md5: 69bda57310071cf6d2b86caf11573d2d + license: LGPL-2.1-only + size: 676469 + timestamp: 1702682458114 +- kind: conda + name: libiconv + version: '1.17' + build: hcfcfb64_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda + sha256: 5f844dd19b046d43174ad80c6ea75b5d504020e3b63cfbc4ace97b8730d35c7b + md5: e1eb10b1cca179f2baa3601e4efc8712 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.1-only + size: 636146 + timestamp: 1702682547199 +- kind: conda + name: libiconv + version: '1.17' + build: hd590300_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda + sha256: 8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9 + md5: d66573916ffcf376178462f1b61c941e + depends: + - libgcc-ng >=12 + license: LGPL-2.1-only + size: 705775 + timestamp: 1702682170569 +- kind: conda + name: libiconv + version: '1.17' + build: hd75f5a5_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda + sha256: 23d4923baeca359423a7347c2ed7aaf48c68603df0cf8b87cc94a10b0d4e9a23 + md5: 6c3628d047e151efba7cf08c5e54d1ca + license: LGPL-2.1-only + size: 666538 + timestamp: 1702682713201 +- kind: conda + name: libjpeg-turbo + version: 3.0.0 + build: h0dc2134_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda + sha256: d9572fd1024adc374aae7c247d0f29fdf4b122f1e3586fe62acc18067f40d02f + md5: 72507f8e3961bc968af17435060b6dd6 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + size: 579748 + timestamp: 1694475265912 +- kind: conda + name: libjpeg-turbo + version: 3.0.0 + build: hb547adb_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 + md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + size: 547541 + timestamp: 1694475104253 +- kind: conda + name: libjpeg-turbo + version: 3.0.0 + build: hcfcfb64_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda + sha256: 4e7808e3098b4b4ed7e287f63bb24f9045cc4d95bfd39f0db870fc2837d74dff + md5: 3f1b948619c45b1ca714d60c7389092c + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + size: 822966 + timestamp: 1694475223854 +- kind: conda + name: libjpeg-turbo + version: 3.0.0 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f + md5: ea25936bb4080d843790b586850f82b8 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + size: 618575 + timestamp: 1694474974816 +- kind: conda + name: liblapack + version: 3.9.0 + build: 21_linux64_openblas + build_number: 21 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda + sha256: 64b5c35dce00dd6f9f53178b2fe87116282e00967970bd6551a5a42923806ded + md5: 1a42f305615c3867684e049e85927531 + depends: + - libblas 3.9.0 21_linux64_openblas + constrains: + - liblapacke 3.9.0 21_linux64_openblas + - libcblas 3.9.0 21_linux64_openblas + - blas * openblas + license: BSD-3-Clause + license_family: BSD + size: 14599 + timestamp: 1705979579648 +- kind: conda + name: liblapack + version: 3.9.0 + build: 21_osx64_openblas + build_number: 21 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-21_osx64_openblas.conda + sha256: 5d0ef4743e8684ad436e31bd3c378d48642815a20c260d358668ba29cd80987a + md5: cf0e4d82cfca6cd9d6c9ed3df45907c9 + depends: + - libblas 3.9.0 21_osx64_openblas + constrains: + - libcblas 3.9.0 21_osx64_openblas + - liblapacke 3.9.0 21_osx64_openblas + - blas * openblas + license: BSD-3-Clause + license_family: BSD + size: 14738 + timestamp: 1705979734819 +- kind: conda + name: liblapack + version: 3.9.0 + build: 21_osxarm64_openblas + build_number: 21 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-21_osxarm64_openblas.conda + sha256: a917e99f26d205df1ec22d7a9fff0d2f2f3c7ba06ea2be886dc220a8340d5917 + md5: a4510e3913ef552d69ab2080a0048523 + depends: + - libblas 3.9.0 21_osxarm64_openblas + constrains: + - libcblas 3.9.0 21_osxarm64_openblas + - blas * openblas + - liblapacke 3.9.0 21_osxarm64_openblas + license: BSD-3-Clause + license_family: BSD + size: 14829 + timestamp: 1705980215575 +- kind: conda + name: liblapack + version: 3.9.0 + build: 21_win64_mkl + build_number: 21 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-21_win64_mkl.conda + sha256: 3fa7c08dd4edf59cb0907d2e5b74e6be890e0671f845e1bae892d212d118a7e9 + md5: c4740f091cb75987390087934354a621 + depends: + - libblas 3.9.0 21_win64_mkl + constrains: + - blas * mkl + - libcblas 3.9.0 21_win64_mkl + - liblapacke 3.9.0 21_win64_mkl + license: BSD-3-Clause + license_family: BSD + size: 5017043 + timestamp: 1705980523462 +- kind: conda + name: libllvm15 + version: 15.0.7 + build: hb3ce162_4 + build_number: 4 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda + sha256: e71584c0f910140630580fdd0a013029a52fd31e435192aea2aa8d29005262d1 + md5: 8a35df3cbc0c8b12cc8af9473ae75eef + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libxml2 >=2.12.1,<3.0.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - zstd >=1.5.5,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 33321457 + timestamp: 1701375836233 +- kind: conda + name: libllvm18 + version: 18.1.2 + build: h2448989_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.2-h2448989_0.conda + sha256: 231b3edb7650786fd9fc6ac8d7ecf38d663a0ae63eeb1f19c4c1c17d2eb98d51 + md5: fae7780457e00a07d068417d9dbdb24b + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libxml2 >=2.12.6,<3.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - zstd >=1.5.5,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 38407510 + timestamp: 1710943474854 +- kind: conda + name: libnsl + version: 2.0.1 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + license: LGPL-2.1-only + license_family: GPL + size: 33408 + timestamp: 1697359010159 +- kind: conda + name: libogg + version: 1.3.4 + build: h7f98852_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2 + sha256: b88afeb30620b11bed54dac4295aa57252321446ba4e6babd7dce4b9ffde9b25 + md5: 6e8cc2173440d77708196c5b93771680 + depends: + - libgcc-ng >=9.3.0 + license: BSD-3-Clause + license_family: BSD + size: 210550 + timestamp: 1610382007814 +- kind: conda + name: libogg + version: 1.3.4 + build: h8ffe710_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libogg-1.3.4-h8ffe710_1.tar.bz2 + sha256: ef20f04ad2121a07e074b34bfc211587df18180e680963f5c02c54d1951b9ee6 + md5: 04286d905a0dcb7f7d4a12bdfe02516d + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: BSD-3-Clause + license_family: BSD + size: 35187 + timestamp: 1610382533961 +- kind: conda + name: libopenblas + version: 0.3.26 + build: openmp_h6c19121_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.26-openmp_h6c19121_0.conda + sha256: 2a59b92c412fd0f59a8079dfa21c561ae17e72e72e47d4d7aee474bf6fd642e1 + md5: 000970261d954431ccca3cce68d873d8 + depends: + - libgfortran 5.* + - libgfortran5 >=12.3.0 + - llvm-openmp >=16.0.6 + constrains: + - openblas >=0.3.26,<0.3.27.0a0 + license: BSD-3-Clause + license_family: BSD + size: 2917606 + timestamp: 1704950245195 +- kind: conda + name: libopenblas + version: 0.3.26 + build: openmp_hfef2a42_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.26-openmp_hfef2a42_0.conda + sha256: 4a5994cc608708eca19b90b642a144bb073e4a1cd27b824281dfcae67917204e + md5: 9df60162aea811087267b515f359536c + depends: + - libgfortran 5.* + - libgfortran5 >=12.3.0 + - llvm-openmp >=16.0.6 + constrains: + - openblas >=0.3.26,<0.3.27.0a0 + license: BSD-3-Clause + license_family: BSD + size: 6044576 + timestamp: 1704951566923 +- kind: conda + name: libopenblas + version: 0.3.26 + build: pthreads_h413a1c8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda + sha256: b626954b5a1113dafec8df89fa8bf18ce9b4701464d9f084ddd7fc9fac404bbd + md5: 760ae35415f5ba8b15d09df5afe8b23a + depends: + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=12.3.0 + constrains: + - openblas >=0.3.26,<0.3.27.0a0 + license: BSD-3-Clause + license_family: BSD + size: 5578031 + timestamp: 1704950143521 +- kind: conda + name: libopus + version: 1.3.1 + build: h7f98852_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 + sha256: 0e1c2740ebd1c93226dc5387461bbcf8142c518f2092f3ea7551f77755decc8f + md5: 15345e56d527b330e1cacbdf58676e8f + depends: + - libgcc-ng >=9.3.0 + license: BSD-3-Clause + license_family: BSD + size: 260658 + timestamp: 1606823578035 +- kind: conda + name: libpng + version: 1.6.43 + build: h091b4b1_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.43-h091b4b1_0.conda + sha256: 66c4713b07408398f2221229a1c1d5df57d65dc0902258113f2d9ecac4772495 + md5: 77e684ca58d82cae9deebafb95b1a2b8 + depends: + - libzlib >=1.2.13,<1.3.0a0 + license: zlib-acknowledgement + size: 264177 + timestamp: 1708780447187 +- kind: conda + name: libpng + version: 1.6.43 + build: h19919ed_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.43-h19919ed_0.conda + sha256: 6ad31bf262a114de5bbe0c6ba73b29ed25239d0f46f9d59700310d2ea0b3c142 + md5: 77e398acc32617a0384553aea29e866b + depends: + - libzlib >=1.2.13,<1.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: zlib-acknowledgement + size: 347514 + timestamp: 1708780763195 +- kind: conda + name: libpng + version: 1.6.43 + build: h2797004_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda + sha256: 502f6ff148ac2777cc55ae4ade01a8fc3543b4ffab25c4e0eaa15f94e90dd997 + md5: 009981dd9cfcaa4dbfa25ffaed86bcae + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<1.3.0a0 + license: zlib-acknowledgement + size: 288221 + timestamp: 1708780443939 +- kind: conda + name: libpng + version: 1.6.43 + build: h92b6c6a_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.43-h92b6c6a_0.conda + sha256: 13e646d24b5179e6b0a5ece4451a587d759f55d9a360b7015f8f96eff4524b8f + md5: 65dcddb15965c9de2c0365cb14910532 + depends: + - libzlib >=1.2.13,<1.3.0a0 + license: zlib-acknowledgement + size: 268524 + timestamp: 1708780496420 +- kind: conda + name: libpq + version: '16.2' + build: h33b98f1_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_1.conda + sha256: e03a8439b79e013840c44c957d37dbce10316888b2b5dc7dcfcfc0cfe3a3b128 + md5: 9e49ec2a61d02623b379dc332eb6889d + depends: + - krb5 >=1.21.2,<1.22.0a0 + - libgcc-ng >=12 + - openssl >=3.2.1,<4.0a0 + license: PostgreSQL + size: 2601973 + timestamp: 1710863646063 +- kind: conda + name: librsvg + version: 2.56.3 + build: h1877882_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.56.3-h1877882_1.conda + sha256: 29c94b30363cdcae427a2a303de3c634db05f1e28101b6e865e135e72fa8b7ec + md5: 43b31ab0e9cf3538fb3ab138ee663a0b + depends: + - cairo >=1.18.0,<2.0a0 + - gdk-pixbuf >=2.42.10,<3.0a0 + - gettext >=0.21.1,<1.0a0 + - libglib >=2.78.1,<3.0a0 + - libxml2 >=2.12.1,<3.0.0a0 + - pango >=1.50.14,<2.0a0 + license: LGPL-2.1-or-later + size: 3978990 + timestamp: 1701547214362 +- kind: conda + name: librsvg + version: 2.56.3 + build: h55a2576_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.56.3-h55a2576_1.conda + sha256: 59043f2536d61a32378553c4fa7f56e97bca12165c37a45de9e7439a06f5ac16 + md5: d9624ec11650aa93e0b2c2612c3548f5 + depends: + - cairo >=1.18.0,<2.0a0 + - gdk-pixbuf >=2.42.10,<3.0a0 + - gettext >=0.21.1,<1.0a0 + - libglib >=2.78.1,<3.0a0 + - libxml2 >=2.12.1,<3.0.0a0 + - pango >=1.50.14,<2.0a0 + license: LGPL-2.1-or-later + size: 3832300 + timestamp: 1701547781584 +- kind: conda + name: librsvg + version: 2.56.3 + build: he3f83f7_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda + sha256: b82d0c60376da88a2bf15d35d17c176aa923917ad7de4bc62ddef6d02f3518fb + md5: 03bd1ddcc942867a19528877143b9852 + depends: + - cairo >=1.18.0,<2.0a0 + - gdk-pixbuf >=2.42.10,<3.0a0 + - gettext >=0.21.1,<1.0a0 + - libgcc-ng >=12 + - libglib >=2.78.1,<3.0a0 + - libxml2 >=2.12.1,<3.0.0a0 + - pango >=1.50.14,<2.0a0 + license: LGPL-2.1-or-later + size: 5897732 + timestamp: 1701546864628 +- kind: conda + name: libsndfile + version: 1.2.2 + build: hc60ed4a_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + sha256: f709cbede3d4f3aee4e2f8d60bd9e256057f410bd60b8964cb8cf82ec1457573 + md5: ef1910918dd895516a769ed36b5b3a4e + depends: + - lame >=3.100,<3.101.0a0 + - libflac >=1.4.3,<1.5.0a0 + - libgcc-ng >=12 + - libogg >=1.3.4,<1.4.0a0 + - libopus >=1.3.1,<2.0a0 + - libstdcxx-ng >=12 + - libvorbis >=1.3.7,<1.4.0a0 + - mpg123 >=1.32.1,<1.33.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + size: 354372 + timestamp: 1695747735668 +- kind: conda + name: libsqlite + version: 3.45.2 + build: h091b4b1_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.2-h091b4b1_0.conda + sha256: 7c234320a1a2132b9cc972aaa06bb215bb220a5b1addb0bed7a5a321c805920e + md5: 9d07427ee5bd9afd1e11ce14368a48d6 + depends: + - libzlib >=1.2.13,<1.3.0a0 + license: Unlicense + size: 825300 + timestamp: 1710255078823 +- kind: conda + name: libsqlite + version: 3.45.2 + build: h2797004_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda + sha256: 8cdbeb7902729e319510a82d7c642402981818702b58812af265ef55d1315473 + md5: 866983a220e27a80cb75e85cb30466a1 + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<1.3.0a0 + license: Unlicense + size: 857489 + timestamp: 1710254744982 +- kind: conda + name: libsqlite + version: 3.45.2 + build: h92b6c6a_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.2-h92b6c6a_0.conda + sha256: 320ec73a4e3dd377757a2595770b8137ec4583df4d7782472d76377cdbdc4543 + md5: 086f56e13a96a6cfb1bf640505ae6b70 + depends: + - libzlib >=1.2.13,<1.3.0a0 + license: Unlicense + size: 902355 + timestamp: 1710254991672 +- kind: conda + name: libsqlite + version: 3.45.2 + build: hcfcfb64_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.2-hcfcfb64_0.conda + sha256: 4bb24b986550275a6d02835150d943c4c675808d05c0efc5c2a22154d007a69f + md5: f95359f8dc5abf7da7776ece9ef10bc5 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Unlicense + size: 869606 + timestamp: 1710255095740 +- kind: conda + name: libstdcxx-ng + version: 13.2.0 + build: h7e041cc_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda + sha256: a56c5b11f1e73a86e120e6141a42d9e935a99a2098491ac9e15347a1476ce777 + md5: f6f6600d18a4047b54f803cf708b868a + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3834139 + timestamp: 1706819252496 +- kind: conda + name: libsystemd0 + version: '255' + build: h3516f8a_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda + sha256: af27b0d225435d03f378a119f8eab6b280c53557a3c84cdb3bb8fd3167615aed + md5: 3366af27f0b593544a6cd453c7932ac5 + depends: + - __glibc >=2.17,<3.0.a0 + - libcap >=2.69,<2.70.0a0 + - libgcc-ng >=12 + - libgcrypt >=1.10.3,<2.0a0 + - lz4-c >=1.9.3,<1.10.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.5,<1.6.0a0 + license: LGPL-2.1-or-later + size: 402592 + timestamp: 1709568499820 +- kind: conda + name: libtiff + version: 4.6.0 + build: h07db509_3 + build_number: 3 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.6.0-h07db509_3.conda + sha256: 6df3e129682f6dc43826e5028e1807624b2a7634c4becbb50e56be9f77167f25 + md5: 28c9f8c6dd75666dfb296aea06c49cb8 + depends: + - lerc >=4.0.0,<5.0a0 + - libcxx >=16 + - libdeflate >=1.20,<1.21.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libwebp-base >=1.3.2,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.5,<1.6.0a0 + license: HPND + size: 238349 + timestamp: 1711218119201 +- kind: conda + name: libtiff + version: 4.6.0 + build: h129831d_3 + build_number: 3 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.6.0-h129831d_3.conda + sha256: f9b35c5ec1aea9a2cc20e9275a0bb8f056482faa8c5a62feb243ed780755ea30 + md5: 568593071d2e6cea7b5fc1f75bfa10ca + depends: + - lerc >=4.0.0,<5.0a0 + - libcxx >=16 + - libdeflate >=1.20,<1.21.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libwebp-base >=1.3.2,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.5,<1.6.0a0 + license: HPND + size: 257489 + timestamp: 1711218113053 +- kind: conda + name: libtiff + version: 4.6.0 + build: h1dd3fc0_3 + build_number: 3 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda + sha256: fc3b210f9584a92793c07396cb93e72265ff3f1fa7ca629128bf0a50d5cb15e4 + md5: 66f03896ffbe1a110ffda05c7a856504 + depends: + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.20,<1.21.0a0 + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libstdcxx-ng >=12 + - libwebp-base >=1.3.2,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.5,<1.6.0a0 + license: HPND + size: 282688 + timestamp: 1711217970425 +- kind: conda + name: libtiff + version: 4.6.0 + build: hddb2be6_3 + build_number: 3 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.6.0-hddb2be6_3.conda + sha256: 2e04844865cfe0286d70482c129f159542b325f4e45774aaff5fbe5027b30b0a + md5: 6d1828c9039929e2f185c5fa9d133018 + depends: + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.20,<1.21.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.5,<1.6.0a0 + license: HPND + size: 787198 + timestamp: 1711218639912 +- kind: conda + name: libtool + version: 2.4.7 + build: h27087fc_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libtool-2.4.7-h27087fc_0.conda + sha256: 345b3b580ef91557a82425ea3f432a70a8748c040deb14570b9f4dca4af3e3d1 + md5: f204c8ba400ec475452737094fb81d52 + depends: + - libgcc-ng >=12 + license: GPL-2.0-or-later + license_family: GPL + size: 411817 + timestamp: 1672361825713 +- kind: conda + name: libtool + version: 2.4.7 + build: hb7217d7_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libtool-2.4.7-hb7217d7_0.conda + sha256: efe50471d2baea151f2a93f1f99c05553f8c88e3f0065cdc267e1aa2e8c42449 + md5: fe8efc3385f58f0055e8100b07225055 + license: GPL-2.0-or-later + license_family: GPL + size: 408403 + timestamp: 1672362003513 +- kind: conda + name: libtool + version: 2.4.7 + build: hf0c8a7f_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libtool-2.4.7-hf0c8a7f_0.conda + sha256: 0827bcf84a243ca6dd47901caa607262a0184d6048a7cf444b26aa8ee80eb066 + md5: 1f87b8f56ae1210c77f6133705ef24af + license: GPL-2.0-or-later + license_family: GPL + size: 407170 + timestamp: 1672362058438 +- kind: conda + name: libuuid + version: 2.38.1 + build: h0b41bf4_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 33601 + timestamp: 1680112270483 +- kind: conda + name: libvorbis + version: 1.3.7 + build: h0e60522_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libvorbis-1.3.7-h0e60522_0.tar.bz2 + sha256: 6cdc018a024908270205d8512d92f92cf0adaaa5401c2b403757189b138bf56a + md5: e1a22282de0169c93e4ffe6ce6acc212 + depends: + - libogg >=1.3.4,<1.4.0a0 + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: BSD-3-Clause + license_family: BSD + size: 273721 + timestamp: 1610610022421 +- kind: conda + name: libvorbis + version: 1.3.7 + build: h9c3ff4c_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 + sha256: 53080d72388a57b3c31ad5805c93a7328e46ff22fab7c44ad2a86d712740af33 + md5: 309dec04b70a3cc0f1e84a4013683bc0 + depends: + - libgcc-ng >=9.3.0 + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=9.3.0 + license: BSD-3-Clause + license_family: BSD + size: 286280 + timestamp: 1610609811627 +- kind: conda + name: libwebp + version: 1.3.2 + build: h44782d1_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libwebp-1.3.2-h44782d1_1.conda + sha256: 4d7e1efb76e398f578c5a3d0905c5eca1e4a93298aed6e2f7a10854f6671dfe8 + md5: 46d48ff2cd600a82db18d7b83471aa86 + depends: + - giflib >=5.2.1,<5.3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp-base 1.3.2.* + - libwebp-base >=1.3.2,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 79587 + timestamp: 1696116409146 +- kind: conda + name: libwebp + version: 1.3.2 + build: h658648e_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda + sha256: cc5e55531d8067ea379b145861aea8c749a545912bc016372f5e3c69cc925efd + md5: 0ebb65e8d86843865796c7c95a941f34 + depends: + - giflib >=5.2.1,<5.3.0a0 + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp-base 1.3.2.* + - libwebp-base >=1.3.2,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 84938 + timestamp: 1696116247718 +- kind: conda + name: libwebp + version: 1.3.2 + build: hcfcfb64_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libwebp-1.3.2-hcfcfb64_1.conda + sha256: 7b4f95d1e9756fe81186309113188195fbac164687b96ad443a243a0ca59ec8f + md5: 6202a1ba6be2713084cf0452d4e8c10c + depends: + - libwebp-base 1.3.2.* + - libwebp-base >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 71143 + timestamp: 1696116489561 +- kind: conda + name: libwebp + version: 1.3.2 + build: hf30222e_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-1.3.2-hf30222e_1.conda + sha256: 5ee611009277c8aaef1a5355df6a05100e563735ec33ef019f6415db0b83d548 + md5: a07cf7f5425eb51b79880fb66837200f + depends: + - giflib >=5.2.1,<5.3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp-base 1.3.2.* + - libwebp-base >=1.3.2,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 81880 + timestamp: 1696116440536 +- kind: conda + name: libwebp-base + version: 1.3.2 + build: h0dc2134_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.3.2-h0dc2134_0.conda + sha256: fa7580f26fec4c28321ec2ece1257f3293e0c646c635e9904679f4a8369be401 + md5: 4e7e9d244e87d66c18d36894fd6a8ae5 + constrains: + - libwebp 1.3.2 + license: BSD-3-Clause + license_family: BSD + size: 346599 + timestamp: 1694709233836 +- kind: conda + name: libwebp-base + version: 1.3.2 + build: hb547adb_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.3.2-hb547adb_0.conda + sha256: a159b848193043fb58465ae6a449361615dadcf27babfe0b18db2bd3eb59e958 + md5: 85dbc11098cdbe4244cd73f29a3ab795 + constrains: + - libwebp 1.3.2 + license: BSD-3-Clause + license_family: BSD + size: 273844 + timestamp: 1694709510635 +- kind: conda + name: libwebp-base + version: 1.3.2 + build: hcfcfb64_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.3.2-hcfcfb64_0.conda + sha256: af1453fab10d1fb8b379c61a78882614051a8bac37307d7ac4fb58eac667709e + md5: dcde8820959e64378d4e06147ffecfdd + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - libwebp 1.3.2 + license: BSD-3-Clause + license_family: BSD + size: 268870 + timestamp: 1694709461733 +- kind: conda + name: libwebp-base + version: 1.3.2 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda + sha256: 68764a760fa81ef35dacb067fe8ace452bbb41476536a4a147a1051df29525f0 + md5: 30de3fd9b3b602f7473f30e684eeea8c + depends: + - libgcc-ng >=12 + constrains: + - libwebp 1.3.2 + license: BSD-3-Clause + license_family: BSD + size: 401830 + timestamp: 1694709121323 +- kind: conda + name: libxcb + version: '1.15' + build: h0b41bf4_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda + sha256: a670902f0a3173a466c058d2ac22ca1dd0df0453d3a80e0212815c20a16b0485 + md5: 33277193f5b92bad9fdd230eb700929c + depends: + - libgcc-ng >=12 + - pthread-stubs + - xorg-libxau + - xorg-libxdmcp + license: MIT + license_family: MIT + size: 384238 + timestamp: 1682082368177 +- kind: conda + name: libxcb + version: '1.15' + build: hb7f2c08_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.15-hb7f2c08_0.conda + sha256: f41904f466acc8b3197f37f2dd3a08da75720c7f7464d9267635debc4ac1902b + md5: 5513f57e0238c87c12dffedbcc9c1a4a + depends: + - pthread-stubs + - xorg-libxau + - xorg-libxdmcp + license: MIT + license_family: MIT + size: 313793 + timestamp: 1682083036825 +- kind: conda + name: libxcb + version: '1.15' + build: hcd874cb_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.15-hcd874cb_0.conda + sha256: d01322c693580f53f8d07a7420cd6879289f5ddad5531b372c3efd1c37cac3bf + md5: 090d91b69396f14afef450c285f9758c + depends: + - m2w64-gcc-libs + - m2w64-gcc-libs-core + - pthread-stubs + - xorg-libxau + - xorg-libxdmcp + license: MIT + license_family: MIT + size: 969788 + timestamp: 1682083087243 +- kind: conda + name: libxcb + version: '1.15' + build: hf346824_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.15-hf346824_0.conda + sha256: 6eaa87760ff3e91bb5524189700139db46f8946ff6331f4e571e4a9356edbb0d + md5: 988d5f86ab60fa6de91b3ee3a88a3af9 + depends: + - pthread-stubs + - xorg-libxau + - xorg-libxdmcp + license: MIT + license_family: MIT + size: 334770 + timestamp: 1682082734262 +- kind: conda + name: libxcrypt + version: 4.4.36 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + size: 100393 + timestamp: 1702724383534 +- kind: conda + name: libxkbcommon + version: 1.7.0 + build: h662e7e4_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda + sha256: 3d97d7f964237f42452295d461afdbc51e93f72e2c80be516f56de80e3bb6621 + md5: b32c0da42b1f24a98577bb3d7fc0b995 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libxcb >=1.15,<1.16.0a0 + - libxml2 >=2.12.6,<3.0a0 + - xkeyboard-config + - xorg-libxau >=1.0.11,<2.0a0 + license: MIT/X11 Derivative + license_family: MIT + size: 593534 + timestamp: 1711303445595 +- kind: conda + name: libxml2 + version: 2.12.6 + build: h0d0cfa8_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_1.conda + sha256: f18775ca8494ead5451d4acfc53fa7ebf7a8b5ed04c43bcc50fab847c9780cb3 + md5: c08526c957192192e1e7b4f622761144 + depends: + - icu >=73.2,<74.0a0 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - xz >=5.2.6,<6.0a0 + license: MIT + license_family: MIT + size: 588539 + timestamp: 1711318256840 +- kind: conda + name: libxml2 + version: 2.12.6 + build: h232c23b_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda + sha256: c0bd693bb1a7e5aba388a0c79be16ff92e2411e03aaa920f94b4b33bf099e254 + md5: 6853448e9ca1cfd5f15382afd2a6d123 + depends: + - icu >=73.2,<74.0a0 + - libgcc-ng >=12 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - xz >=5.2.6,<6.0a0 + license: MIT + license_family: MIT + size: 705994 + timestamp: 1711318087106 +- kind: conda + name: libxml2 + version: 2.12.6 + build: hc0ae0f7_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.6-hc0ae0f7_1.conda + sha256: 07a5dc7316d4c1ff3d924df6a76e6a13380d702fa5b3b1889e56d0672e5b8201 + md5: bd85e0ca9e1ffaadc3b56079fd956035 + depends: + - icu >=73.2,<74.0a0 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - xz >=5.2.6,<6.0a0 + license: MIT + license_family: MIT + size: 620164 + timestamp: 1711318305209 +- kind: conda + name: libxml2 + version: 2.12.6 + build: hc3477c8_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.6-hc3477c8_1.conda + sha256: 1846c1318a5987e7315ca3648b55b38e5cfd9853370803a0f5159bc0071609c1 + md5: eb9f59dd51f50f5aa369813fa63ba569 + depends: + - libiconv >=1.17,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 1640801 + timestamp: 1711318467301 +- kind: conda + name: libzlib + version: 1.2.13 + build: h53f4e23_5 + build_number: 5 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda + sha256: ab1c8aefa2d54322a63aaeeefe9cf877411851738616c4068e0dccc66b9c758a + md5: 1a47f5236db2e06a320ffa0392f81bd8 + constrains: + - zlib 1.2.13 *_5 + license: Zlib + license_family: Other + size: 48102 + timestamp: 1686575426584 +- kind: conda + name: libzlib + version: 1.2.13 + build: h8a1eda9_5 + build_number: 5 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda + sha256: fc58ad7f47ffea10df1f2165369978fba0a1cc32594aad778f5eec725f334867 + md5: 4a3ad23f6e16f99c04e166767193d700 + constrains: + - zlib 1.2.13 *_5 + license: Zlib + license_family: Other + size: 59404 + timestamp: 1686575566695 +- kind: conda + name: libzlib + version: 1.2.13 + build: hcfcfb64_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda + sha256: c161822ee8130b71e08b6d282b9919c1de2c5274b29921a867bca0f7d30cad26 + md5: 5fdb9c6a113b6b6cb5e517fd972d5f41 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.2.13 *_5 + license: Zlib + license_family: Other + size: 55800 + timestamp: 1686575452215 +- kind: conda + name: libzlib + version: 1.2.13 + build: hd590300_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda + sha256: 370c7c5893b737596fd6ca0d9190c9715d89d888b8c88537ae1ef168c25e82e4 + md5: f36c115f1ee199da648e0597ec2047ad + depends: + - libgcc-ng >=12 + constrains: + - zlib 1.2.13 *_5 + license: Zlib + license_family: Other + size: 61588 + timestamp: 1686575217516 +- kind: conda + name: llvm-openmp + version: 18.1.2 + build: hb6ac08f_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.2-hb6ac08f_0.conda + sha256: dc40b678f5be2caf4e89ee3dc9037399d0bcd46543bc258dc46e1b92d241c6a6 + md5: e7f7e91cfabd8c7172c9ae405214dd68 + constrains: + - openmp 18.1.2|18.1.2.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 300480 + timestamp: 1711010792383 +- kind: conda + name: llvm-openmp + version: 18.1.2 + build: hcd81f8e_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.2-hcd81f8e_0.conda + sha256: 2ed8ae5a4c6122d542564a9bb9d4961ed7d2fb9581f0ea8bd81e3a83e614b110 + md5: 34646dc152f3949a2f8a67136d406dce + constrains: + - openmp 18.1.2|18.1.2.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + size: 276238 + timestamp: 1711010656300 +- kind: conda + name: lz4-c + version: 1.9.4 + build: hcb278e6_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda + sha256: 1b4c105a887f9b2041219d57036f72c4739ab9e9fe5a1486f094e58c76b31f5f + md5: 318b08df404f9c9be5712aaa5a6f0bb0 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: BSD-2-Clause + license_family: BSD + size: 143402 + timestamp: 1674727076728 +- kind: conda + name: m2w64-gcc-libgfortran + version: 5.3.0 + build: '6' + build_number: 6 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 + sha256: 9de95a7996d5366ae0808eef2acbc63f9b11b874aa42375f55379e6715845dc6 + md5: 066552ac6b907ec6d72c0ddab29050dc + depends: + - m2w64-gcc-libs-core + - msys2-conda-epoch ==20160418 + license: GPL, LGPL, FDL, custom + size: 350687 + timestamp: 1608163451316 +- kind: conda + name: m2w64-gcc-libs + version: 5.3.0 + build: '7' + build_number: 7 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 + sha256: 3bd1ab02b7c89a5b153a17be03b36d833f1517ff2a6a77ead7c4a808b88196aa + md5: fe759119b8b3bfa720b8762c6fdc35de + depends: + - m2w64-gcc-libgfortran + - m2w64-gcc-libs-core + - m2w64-gmp + - m2w64-libwinpthread-git + - msys2-conda-epoch ==20160418 + license: GPL3+, partial:GCCRLE, partial:LGPL2+ + size: 532390 + timestamp: 1608163512830 +- kind: conda + name: m2w64-gcc-libs-core + version: 5.3.0 + build: '7' + build_number: 7 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 + sha256: 58afdfe859ed2e9a9b1cc06bc408720cb2c3a6a132e59d4805b090d7574f4ee0 + md5: 4289d80fb4d272f1f3b56cfe87ac90bd + depends: + - m2w64-gmp + - m2w64-libwinpthread-git + - msys2-conda-epoch ==20160418 + license: GPL3+, partial:GCCRLE, partial:LGPL2+ + size: 219240 + timestamp: 1608163481341 +- kind: conda + name: m2w64-gmp + version: 6.1.0 + build: '2' + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 + sha256: 7e3cd95f554660de45f8323fca359e904e8d203efaf07a4d311e46d611481ed1 + md5: 53a1c73e1e3d185516d7e3af177596d9 + depends: + - msys2-conda-epoch ==20160418 + license: LGPL3 + size: 743501 + timestamp: 1608163782057 +- kind: conda + name: m2w64-libwinpthread-git + version: 5.0.0.4634.697f757 + build: '2' + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 + sha256: f63a09b2cae7defae0480f1740015d6235f1861afa6fe2e2d3e10bd0d1314ee0 + md5: 774130a326dee16f1ceb05cc687ee4f0 + depends: + - msys2-conda-epoch ==20160418 + license: MIT, BSD + size: 31928 + timestamp: 1608166099896 +- kind: conda + name: markdown-it-py + version: 3.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + sha256: c041b0eaf7a6af3344d5dd452815cdc148d6284fec25a4fa3f4263b3a021e962 + md5: 93a8e71256479c62074356ef6ebf501b + depends: + - mdurl >=0.1,<1 + - python >=3.8 + license: MIT + license_family: MIT + size: 64356 + timestamp: 1686175179621 +- kind: conda + name: markupsafe + version: 2.1.5 + build: py39h17cfd9d_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.5-py39h17cfd9d_0.conda + sha256: e18591162cb401bc651a69bd2545a679b69c54405d778d05778f43ba76c6a4dd + md5: 554a0bcb046e1bac7887a92f33b96acc + depends: + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + size: 23827 + timestamp: 1706900341193 +- kind: conda + name: markupsafe + version: 2.1.5 + build: py39ha09f3b3_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.5-py39ha09f3b3_0.conda + sha256: 2fbc1105e680dd34e44f59c67ad30b5e5fbbed65ce4dfb09dac0df811bc24f73 + md5: db347b50af50d030b73be1d1e457cac2 + depends: + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + size: 23107 + timestamp: 1706900243497 +- kind: conda + name: markupsafe + version: 2.1.5 + build: py39ha55989b_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py39ha55989b_0.conda + sha256: 6318073ed42b6186ef4ac0feba54b9da7aa1c7e59d848bb81ac2ac372730f095 + md5: f8b7e33c8bf98901925817b7f4436c7e + depends: + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + size: 26856 + timestamp: 1706900665492 +- kind: conda + name: markupsafe + version: 2.1.5 + build: py39hd1e30aa_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda + sha256: 855d305ceda4751cdd495923104dd34da5a6be45e4fd50a4e80361d9f95bcb38 + md5: 9a9a22eb1f83c44953319ee3b027769f + depends: + - libgcc-ng >=12 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + size: 24314 + timestamp: 1706900151453 +- kind: conda + name: matplotlib + version: 3.8.3 + build: py39h6e9494a_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.3-py39h6e9494a_0.conda + sha256: 7c30a0bb64950a02a041d1df4cc4e5b9ee8ca10d911205c8c1b6601207b4565c + md5: b791c477f73c4c3c727c755bc49b7afd + depends: + - matplotlib-base >=3.8.3,<3.8.4.0a0 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + size: 8603 + timestamp: 1708027078271 +- kind: conda + name: matplotlib + version: 3.8.3 + build: py39hcbf5309_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.3-py39hcbf5309_0.conda + sha256: ac11616904ed43f420f660f028e637707a71274bc2676d54fc7eb571f540b93c + md5: a4b5946f68ecaed034fa849b8d639e63 + depends: + - matplotlib-base >=3.8.3,<3.8.4.0a0 + - pyqt >=5.10 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + size: 8853 + timestamp: 1708027216310 +- kind: conda + name: matplotlib + version: 3.8.3 + build: py39hdf13c20_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.3-py39hdf13c20_0.conda + sha256: 84063109220687e32fad40d9471660c013dca576de6776655d325154ba572d5c + md5: b656fafa897e9e4fdbf42dd6540ec01f + depends: + - matplotlib-base >=3.8.3,<3.8.4.0a0 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + size: 8676 + timestamp: 1708027219022 +- kind: conda + name: matplotlib + version: 3.8.3 + build: py39hf3d152e_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.3-py39hf3d152e_0.conda + sha256: c94914aa4b66b770a6118f3b80f8bda7843535f12fbcacaeb915eb5c03255372 + md5: 983f5b77540eb5aa00238e72ec9b1dfb + depends: + - matplotlib-base >=3.8.3,<3.8.4.0a0 + - pyqt >=5.10 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + size: 8553 + timestamp: 1708026739384 +- kind: conda + name: matplotlib-base + version: 3.8.3 + build: py39h7070ae8_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.3-py39h7070ae8_0.conda + sha256: 4173787e0ff755e25ebe1c4bb9e0a64fd397cd0fa18f28e54a592cc1af2b6049 + md5: 241e91172dfaa6ad66e3c838a6185641 + depends: + - __osx >=10.12 + - certifi >=2020.06.20 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype >=2.12.1,<3.0a0 + - importlib-resources >=3.2.0 + - kiwisolver >=1.3.1 + - libcxx >=16 + - numpy >=1.21,<2 + - numpy >=1.22.4,<2.0a0 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.9,<3.10.0a0 + - python-dateutil >=2.7 + - python_abi 3.9.* *_cp39 + license: PSF-2.0 + license_family: PSF + size: 6910833 + timestamp: 1708027042126 +- kind: conda + name: matplotlib-base + version: 3.8.3 + build: py39hbab7938_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.3-py39hbab7938_0.conda + sha256: 698ac01f950fb5646275c94c2719782e3a77d26164a5491c4ad4dfc6d9be1b71 + md5: c8a05fdf66e3f0bfc087d29461da56e5 + depends: + - certifi >=2020.06.20 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype >=2.12.1,<3.0a0 + - importlib-resources >=3.2.0 + - kiwisolver >=1.3.1 + - libcxx >=16 + - numpy >=1.21,<2 + - numpy >=1.22.4,<2.0a0 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python-dateutil >=2.7 + - python_abi 3.9.* *_cp39 + license: PSF-2.0 + license_family: PSF + size: 6825567 + timestamp: 1708027174151 +- kind: conda + name: matplotlib-base + version: 3.8.3 + build: py39he9076e7_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py39he9076e7_0.conda + sha256: 6a430a5816f189b7277182b6c251236c5af22e254b8253eeb6ffcb06a8ea7087 + md5: 5456bdfe5809ebf5689eda6c808b686e + depends: + - certifi >=2020.06.20 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype >=2.12.1,<3.0a0 + - importlib-resources >=3.2.0 + - kiwisolver >=1.3.1 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - numpy >=1.21,<2 + - numpy >=1.22.4,<2.0a0 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.9,<3.10.0a0 + - python-dateutil >=2.7 + - python_abi 3.9.* *_cp39 + - tk >=8.6.13,<8.7.0a0 + license: PSF-2.0 + license_family: PSF + size: 6931092 + timestamp: 1708026713643 +- kind: conda + name: matplotlib-base + version: 3.8.3 + build: py39hf19769e_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.3-py39hf19769e_0.conda + sha256: 42935a85bd54684b1796350ab55fdf161e620885b76c2e34ab63a17cb0748e18 + md5: e7a42adb568586ff4035d7ef2d06c4b1 + depends: + - certifi >=2020.06.20 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype >=2.12.1,<3.0a0 + - importlib-resources >=3.2.0 + - kiwisolver >=1.3.1 + - numpy >=1.21,<2 + - numpy >=1.22.4,<2.0a0 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.9,<3.10.0a0 + - python-dateutil >=2.7 + - python_abi 3.9.* *_cp39 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: PSF-2.0 + license_family: PSF + size: 6754973 + timestamp: 1708027177507 +- kind: conda + name: mdit-py-plugins + version: 0.4.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda + sha256: 1ddac8d2be448cd1fbe49d2ca09df7e10d99679d53146a917f8bb4899f76d0ca + md5: 6c5358a10873a15398b6f15f60cb5e1f + depends: + - markdown-it-py >=1.0.0,<4.0.0 + - python >=3.8 + license: MIT + license_family: MIT + size: 41197 + timestamp: 1686175527330 +- kind: conda + name: mdurl + version: 0.1.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + sha256: 64073dfb6bb429d52fff30891877b48c7ec0f89625b1bf844905b66a81cce6e1 + md5: 776a8dd9e824f77abac30e6ef43a8f7a + depends: + - python >=3.6 + license: MIT + license_family: MIT + size: 14680 + timestamp: 1704317789138 +- kind: conda + name: meson + version: 1.3.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda + sha256: d9fe5a31b301c662a7410d477257932a76149430acaf760131a35a1476956e96 + md5: 48fa9fd8e4226d71cdbef619f2402572 + depends: + - ninja >=1.8.2 + - python >=3.5.2 + - setuptools + license: Apache-2.0 + license_family: APACHE + size: 628242 + timestamp: 1700451735019 +- kind: conda + name: mkl + version: 2024.0.0 + build: h66d3029_49657 + build_number: 49657 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.0.0-h66d3029_49657.conda + sha256: 928bed978827e4c891d0879d79ecda6c9104ed7df1f1d4e2e392c9c80b471be7 + md5: 006b65d9cd436247dfe053df772e041d + depends: + - intel-openmp 2024.* + - tbb 2021.* + license: LicenseRef-ProprietaryIntel + license_family: Proprietary + size: 108505947 + timestamp: 1701973497498 +- kind: conda + name: mpg123 + version: 1.32.4 + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.4-h59595ed_0.conda + sha256: 512f4ad7eda3b2c9a1cc9f7931932aefa6e79567e35b76de03895e769cb3b43c + md5: 3f1017b4141e943d9bc8739237f749e8 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: LGPL-2.1-only + license_family: LGPL + size: 491061 + timestamp: 1704980200966 +- kind: conda + name: msys2-conda-epoch + version: '20160418' + build: '1' + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 + sha256: 99358d58d778abee4dca82ad29fb58058571f19b0f86138363c260049d4ac7f1 + md5: b0309b72560df66f71a9d5e34a5efdfa + size: 3227 + timestamp: 1608166968312 +- kind: conda + name: munkres + version: 1.1.4 + build: pyh9f0ad1d_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 + sha256: f86fb22b58e93d04b6f25e0d811b56797689d598788b59dcb47f59045b568306 + md5: 2ba8498c1018c1e9c61eb99b973dfe19 + depends: + - python + license: Apache-2.0 + license_family: Apache + size: 12452 + timestamp: 1600387789153 +- kind: conda + name: mypy_extensions + version: 1.0.0 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + sha256: f240217476e148e825420c6bc3a0c0efb08c0718b7042fae960400c02af858a3 + md5: 4eccaeba205f0aed9ac3a9ea58568ca3 + depends: + - python >=3.5 + license: MIT + license_family: MIT + size: 10492 + timestamp: 1675543414256 +- kind: conda + name: mysql-common + version: 8.3.0 + build: hf1915f5_4 + build_number: 4 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-hf1915f5_4.conda + sha256: 4cf6d29e091398735348550cb74cfd5006e04892d54b6b1ba916935f1af1a151 + md5: 784a4df6676c581ca624fbe460703a6d + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.2.1,<4.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 784844 + timestamp: 1709910607121 +- kind: conda + name: mysql-libs + version: 8.3.0 + build: hca2cd23_4 + build_number: 4 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-hca2cd23_4.conda + sha256: c39cdd1a5829aeffc611f789bdfd4dbd4ce1aa829c73d728defec180b5265d91 + md5: 1b50eebe2a738a3146c154d2eceaa8b6 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<1.3.0a0 + - mysql-common 8.3.0 hf1915f5_4 + - openssl >=3.2.1,<4.0a0 + - zstd >=1.5.5,<1.6.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 1537884 + timestamp: 1709910705541 +- kind: conda + name: nbformat + version: 5.10.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda + sha256: 774ba7f0f175851723d9e1524ca5246b431eca1b1e22387b58a80ad0dcd7acd8 + md5: ca3d437c0ef2e87f63d085822c74c49a + depends: + - jsonschema >=2.6 + - jupyter_core + - python >=3.8 + - python-fastjsonschema + - traitlets >=5.1 + license: BSD-3-Clause + license_family: BSD + size: 100844 + timestamp: 1710502340495 +- kind: conda + name: ncurses + version: 6.4.20240210 + build: h078ce10_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4.20240210-h078ce10_0.conda + sha256: 06f0905791575e2cd3aa961493c56e490b3d82ad9eb49f1c332bd338b0216911 + md5: 616ae8691e6608527d0071e6766dcb81 + license: X11 AND BSD-3-Clause + size: 820249 + timestamp: 1710866874348 +- kind: conda + name: ncurses + version: 6.4.20240210 + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda + sha256: aa0f005b6727aac6507317ed490f0904430584fa8ca722657e7f0fb94741de81 + md5: 97da8860a0da5413c7c98a3b3838a645 + depends: + - libgcc-ng >=12 + license: X11 AND BSD-3-Clause + size: 895669 + timestamp: 1710866638986 +- kind: conda + name: ncurses + version: 6.4.20240210 + build: h73e2aa4_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4.20240210-h73e2aa4_0.conda + sha256: 50b72acf08acbc4e5332807653e2ca6b26d4326e8af16fad1fd3f2ce9ea55503 + md5: 50f28c512e9ad78589e3eab34833f762 + license: X11 AND BSD-3-Clause + size: 823010 + timestamp: 1710866856626 +- kind: conda + name: networkx + version: 3.2.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda + sha256: 7629aa4f9f8cdff45ea7a4701fe58dccce5bf2faa01c26eb44cbb27b7e15ca9d + md5: 425fce3b531bed6ec3c74fab3e5f0a1c + depends: + - python >=3.9 + constrains: + - matplotlib >=3.5 + - scipy >=1.9,!=1.11.0,!=1.11.1 + - numpy >=1.22 + - pandas >=1.4 + license: BSD-3-Clause + license_family: BSD + size: 1149552 + timestamp: 1698504905258 +- kind: conda + name: ninja + version: 1.11.1 + build: h91493d7_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda + sha256: 0ffb1912768af8354a930f482368ef170bf3d8217db328dfea1c8b09772c8c71 + md5: 44a99ef26178ea98626ff8e027702795 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vs2015_runtime >=14.29.30139 + license: Apache-2.0 + license_family: Apache + size: 279200 + timestamp: 1676838681615 +- kind: conda + name: ninja + version: 1.11.1 + build: h924138e_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda + sha256: b555247ac8859b4ff311e3d708a0640f1bfe9fae7125c485b444072474a84c41 + md5: 73a4953a2d9c115bdc10ff30a52f675f + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: Apache-2.0 + license_family: Apache + size: 2251263 + timestamp: 1676837602636 +- kind: conda + name: ninja + version: 1.11.1 + build: hb8565cd_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda + sha256: 6f738d9a26fa275317b95b2b96832daab9059ef64af9a338f904a3cb684ae426 + md5: 49ad513efe39447aa51affd47e3aa68f + depends: + - libcxx >=14.0.6 + license: Apache-2.0 + license_family: Apache + size: 121284 + timestamp: 1676837793132 +- kind: conda + name: ninja + version: 1.11.1 + build: hffc8910_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda + sha256: a594e90b0ed8202c280fff4a008f6a355d0db54a62b17067dc4a950370ddffc0 + md5: fdecec4002f41cf6ea1eea5b52947ee0 + depends: + - libcxx >=14.0.6 + license: Apache-2.0 + license_family: Apache + size: 107047 + timestamp: 1676837935565 +- kind: conda + name: nspr + version: '4.35' + build: h27087fc_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda + sha256: 8fadeebb2b7369a4f3b2c039a980d419f65c7b18267ba0c62588f9f894396d0c + md5: da0ec11a6454ae19bff5b02ed881a2b1 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MPL-2.0 + license_family: MOZILLA + size: 226848 + timestamp: 1669784948267 +- kind: conda + name: nss + version: '3.98' + build: h1d7d5a4_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/nss-3.98-h1d7d5a4_0.conda + sha256: a9bc94d03df48014011cf6caaf447f2ef86a5edf7c70d70002ec4b59f5a4e198 + md5: 54b56c2fdf973656b748e0378900ec13 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libsqlite >=3.45.1,<4.0a0 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<1.3.0a0 + - nspr >=4.35,<5.0a0 + license: MPL-2.0 + license_family: MOZILLA + size: 2019716 + timestamp: 1708065114928 +- kind: conda + name: numpy + version: 1.26.4 + build: py39h28c39a1_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py39h28c39a1_0.conda + sha256: 47f75135f6f85225709d5a8f05a0ac2c6a437c8a4cc53ce0f70e9b8766f23b1b + md5: 1b07000dc6aed4a69e91107dac4464d3 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 6481665 + timestamp: 1707226262838 +- kind: conda + name: numpy + version: 1.26.4 + build: py39h474f0d3_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda + sha256: fa792c330e1d18854e4ca1ea8bf90ffae6787c133ebdc331f1ba6f565d28b599 + md5: aa265f5697237aa13cc10f53fa8acc4f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 7039431 + timestamp: 1707225726227 +- kind: conda + name: numpy + version: 1.26.4 + build: py39h7aa2656_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py39h7aa2656_0.conda + sha256: e7adae3f0ffdc319ce32ea10484d9cc36db4317ce5b525cfdcb97651786a928a + md5: c027ed77947314469686cff520a71e5f + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=16 + - liblapack >=3.9.0,<4.0a0 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 5492058 + timestamp: 1707226364958 +- kind: conda + name: numpy + version: 1.26.4 + build: py39hddb5d58_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py39hddb5d58_0.conda + sha256: 25473fb10de8e3d92ea07777fce90508b5fce76fd942b333625ae27f7c50d74d + md5: 6e30ff8f2d3f59f45347dfba8bc22a04 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 5920615 + timestamp: 1707226471242 +- kind: conda + name: openjpeg + version: 2.5.2 + build: h3d672ee_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.2-h3d672ee_0.conda + sha256: dda71cbe094234ab208f3552dec1f4ca6f2e614175d010808d6cb66ecf0bc753 + md5: 7e7099ad94ac3b599808950cec30ad4e + depends: + - libpng >=1.6.43,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + size: 237974 + timestamp: 1709159764160 +- kind: conda + name: openjpeg + version: 2.5.2 + build: h488ebb8_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda + sha256: 5600a0b82df042bd27d01e4e687187411561dfc11cc05143a08ce29b64bf2af2 + md5: 7f2e286780f072ed750df46dc2631138 + depends: + - libgcc-ng >=12 + - libpng >=1.6.43,<1.7.0a0 + - libstdcxx-ng >=12 + - libtiff >=4.6.0,<4.7.0a0 + - libzlib >=1.2.13,<1.3.0a0 + license: BSD-2-Clause + license_family: BSD + size: 341592 + timestamp: 1709159244431 +- kind: conda + name: openjpeg + version: 2.5.2 + build: h7310d3a_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.2-h7310d3a_0.conda + sha256: dc9c405119b9b54f8ca5984da27ba498bd848ab4f0f580da6f293009ca5adc13 + md5: 05a14cc9d725dd74995927968d6547e3 + depends: + - libcxx >=16 + - libpng >=1.6.43,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libzlib >=1.2.13,<1.3.0a0 + license: BSD-2-Clause + license_family: BSD + size: 331273 + timestamp: 1709159538792 +- kind: conda + name: openjpeg + version: 2.5.2 + build: h9f1df11_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda + sha256: 472d6eaffc1996e6af35ec8e91c967f472a536a470079bfa56383cc0dbf4d463 + md5: 5029846003f0bc14414b9128a1f7c84b + depends: + - libcxx >=16 + - libpng >=1.6.43,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libzlib >=1.2.13,<1.3.0a0 + license: BSD-2-Clause + license_family: BSD + size: 316603 + timestamp: 1709159627299 +- kind: conda + name: openssl + version: 3.2.1 + build: h0d3ecfb_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.1-h0d3ecfb_1.conda + sha256: 519dc941d7ab0ebf31a2878d85c2f444450e7c5f6f41c4d07252c6bb3417b78b + md5: eb580fb888d93d5d550c557323ac5cee + depends: + - ca-certificates + constrains: + - pyopenssl >=22.1 + license: Apache-2.0 + license_family: Apache + size: 2855250 + timestamp: 1710793435903 +- kind: conda + name: openssl + version: 3.2.1 + build: hcfcfb64_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_1.conda + sha256: 61ce4e11c3c26ed4e4d9b7e7e2483121a1741ad0f9c8db0a91a28b6e05182ce6 + md5: 958e0418e93e50c575bff70fbcaa12d8 + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - pyopenssl >=22.1 + license: Apache-2.0 + license_family: Apache + size: 8230112 + timestamp: 1710796158475 +- kind: conda + name: openssl + version: 3.2.1 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda + sha256: 2c689444ed19a603be457284cf2115ee728a3fafb7527326e96054dee7cdc1a7 + md5: 9d731343cff6ee2e5a25c4a091bf8e2a + depends: + - ca-certificates + - libgcc-ng >=12 + constrains: + - pyopenssl >=22.1 + license: Apache-2.0 + license_family: Apache + size: 2865379 + timestamp: 1710793235846 +- kind: conda + name: openssl + version: 3.2.1 + build: hd75f5a5_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.2.1-hd75f5a5_1.conda + sha256: 7ae0ac6a1673584a8a380c2ff3d46eca48ed53bc7174c0d4eaa0dd2f247a0984 + md5: 570a6f04802df580be529f3a72d2bbf7 + depends: + - ca-certificates + constrains: + - pyopenssl >=22.1 + license: Apache-2.0 + license_family: Apache + size: 2506344 + timestamp: 1710793930515 +- kind: conda + name: packaging + version: '24.0' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + sha256: a390182d74c31dfd713c16db888c92c277feeb6d1fe96ff9d9c105f9564be48a + md5: 248f521b64ce055e7feae3105e7abeb8 + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 49832 + timestamp: 1710076089469 +- kind: conda + name: pandas + version: 2.2.1 + build: py39h32e6231_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pandas-2.2.1-py39h32e6231_0.conda + sha256: d247dd5fcd58608a66b1cfed74a962e77818e5acd654dededc95cda0d1526a31 + md5: 7ca03abc7f2f9c91a9fdc02780bfa572 + depends: + - numpy >=1.22.4,<2.0a0 + - python >=3.9,<3.10.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.9.* *_cp39 + - pytz >=2020.1 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 11830380 + timestamp: 1708710136935 +- kind: conda + name: pandas + version: 2.2.1 + build: py39h47e51b9_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.1-py39h47e51b9_0.conda + sha256: 08970c57a208e75ab99312ef27401ad76399669f2cc4bb3b5850ea21560393cb + md5: be545eb72baf10c37f3ca5c974586abe + depends: + - libcxx >=16 + - numpy >=1.22.4,<2.0a0 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.9.* *_cp39 + - pytz >=2020.1 + license: BSD-3-Clause + license_family: BSD + size: 11987027 + timestamp: 1708709608466 +- kind: conda + name: pandas + version: 2.2.1 + build: py39haf03413_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.1-py39haf03413_0.conda + sha256: f6651dbf55da899a4e2590c910bee764b6f3ead78eb5e35e104ccaeb884f9fc7 + md5: d29dc35b665029951dae988810f84508 + depends: + - libcxx >=16 + - numpy >=1.22.4,<2.0a0 + - python >=3.9,<3.10.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.9.* *_cp39 + - pytz >=2020.1 + license: BSD-3-Clause + license_family: BSD + size: 12136682 + timestamp: 1708709770431 +- kind: conda + name: pandas + version: 2.2.1 + build: py39hddac248_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.1-py39hddac248_0.conda + sha256: 91a2f8062d905f65548a5f3e9cf91e4acd70ac151d9e9fcbb32af9980643c1d7 + md5: 85293a042c24a08e71b7608ee66b6134 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - numpy >=1.22.4,<2.0a0 + - python >=3.9,<3.10.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.9.* *_cp39 + - pytz >=2020.1 + license: BSD-3-Clause + license_family: BSD + size: 12832936 + timestamp: 1708709133691 +- kind: conda + name: pango + version: 1.50.14 + build: h07c897b_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pango-1.50.14-h07c897b_2.conda + sha256: e9c0ae76cd2860d0fc35162c17bb2fc8808d390ee2ab2f583f4997ae8d824f00 + md5: 455617d3c3f5fef2e859bb07da8b1dec + depends: + - cairo >=1.16.0,<2.0a0 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - fribidi >=1.0.10,<2.0a0 + - harfbuzz >=8.1.1,<9.0a0 + - libglib >=2.76.4,<3.0a0 + - libpng >=1.6.39,<1.7.0a0 + license: LGPL-2.1-or-later + size: 442093 + timestamp: 1693056497295 +- kind: conda + name: pango + version: 1.50.14 + build: h19c1c8a_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pango-1.50.14-h19c1c8a_2.conda + sha256: 639abd1c1d383fe047462ab7233b6857702d1bf40f229c337d3b59d1e5476a71 + md5: bf0d46d9e97cb3ae5ad7ee4b688929a9 + depends: + - cairo >=1.16.0,<2.0a0 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - fribidi >=1.0.10,<2.0a0 + - harfbuzz >=8.1.1,<9.0a0 + - libglib >=2.76.4,<3.0a0 + - libpng >=1.6.39,<1.7.0a0 + license: LGPL-2.1-or-later + size: 418656 + timestamp: 1693056392103 +- kind: conda + name: pango + version: 1.50.14 + build: ha41ecd1_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda + sha256: 6ecce306b7ac4acf1184eb5b045e57e613e19e99c27d57f33eb255f8a9120a93 + md5: 1a66c10f6a0da3dbd2f3a68127e7f6a0 + depends: + - cairo >=1.16.0,<2.0a0 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - fribidi >=1.0.10,<2.0a0 + - harfbuzz >=8.1.1,<9.0a0 + - libgcc-ng >=12 + - libglib >=2.76.4,<3.0a0 + - libpng >=1.6.39,<1.7.0a0 + license: LGPL-2.1-or-later + size: 443648 + timestamp: 1693056071824 +- kind: conda + name: pango + version: 1.50.14 + build: hcf40dda_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.50.14-hcf40dda_2.conda + sha256: e17f649192ce06c68893b50fa2492db87d2d82ae6d3c6058cc62dcc44dde8b2e + md5: 79026cbb74d69b444e5dc2be0fb4b4a9 + depends: + - cairo >=1.16.0,<2.0a0 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - fribidi >=1.0.10,<2.0a0 + - harfbuzz >=8.1.1,<9.0a0 + - libglib >=2.76.4,<3.0a0 + - libpng >=1.6.39,<1.7.0a0 + license: LGPL-2.1-or-later + size: 426303 + timestamp: 1693056536154 +- kind: conda + name: pathspec + version: 0.12.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda + sha256: 4e534e66bfe8b1e035d2169d0e5b185450546b17e36764272863e22e0370be4d + md5: 17064acba08d3686f1135b5ec1b32b12 + depends: + - python >=3.7 + license: MPL-2.0 + license_family: MOZILLA + size: 41173 + timestamp: 1702250135032 +- kind: conda + name: pcre2 + version: '10.43' + build: h0ad2156_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.43-h0ad2156_0.conda + sha256: 226714bbf89d45bf7da4c7551e21b8a833f51d33379fe3dfbfe31b72832d4dba + md5: 9c8651803886ce9d5983e107a0df4ea8 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + license: BSD-3-Clause + license_family: BSD + size: 836581 + timestamp: 1708118455741 +- kind: conda + name: pcre2 + version: '10.43' + build: h17e33f8_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.43-h17e33f8_0.conda + sha256: 9a82c7d49c4771342b398661862975efb9c30e7af600b5d2e08a0bf416fda492 + md5: d0485b8aa2cedb141a7bd27b4efa4c9c + depends: + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 818317 + timestamp: 1708118868321 +- kind: conda + name: pcre2 + version: '10.43' + build: h26f9a81_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.43-h26f9a81_0.conda + sha256: 4bf7b5fa091f5e7ab0b78778458be1e81c1ffa182b63795734861934945a63a7 + md5: 1ddc87f00014612830f3235b5ad6d821 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + license: BSD-3-Clause + license_family: BSD + size: 615219 + timestamp: 1708118184900 +- kind: conda + name: pcre2 + version: '10.43' + build: hcad00b1_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda + sha256: 766dd986a7ed6197676c14699000bba2625fd26c8a890fcb7a810e5cf56155bc + md5: 8292dea9e022d9610a11fce5e0896ed8 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libgcc-ng >=12 + - libzlib >=1.2.13,<1.3.0a0 + license: BSD-3-Clause + license_family: BSD + size: 950847 + timestamp: 1708118050286 +- kind: conda + name: pillow + version: 10.2.0 + build: py39h368b509_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pillow-10.2.0-py39h368b509_0.conda + sha256: fc08925521c8839ace0b0b62f37757ab95d3934c63bb6b7da10c1f10917be002 + md5: 706d6e5bbc4b5d2ac7b8a6077319294d + depends: + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp-base >=1.3.2,<2.0a0 + - libxcb >=1.15,<1.16.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - openjpeg >=2.5.0,<3.0a0 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - tk >=8.6.13,<8.7.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: HPND + size: 42054784 + timestamp: 1704252779681 +- kind: conda + name: pillow + version: 10.2.0 + build: py39h755f0b7_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.2.0-py39h755f0b7_0.conda + sha256: 0e91b5467c3994760832fca4a45ed084853061b5c42a8015da4e19fed7e5b7aa + md5: 9309cdb83d6c1617a58e57b61c556105 + depends: + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp-base >=1.3.2,<2.0a0 + - libxcb >=1.15,<1.16.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - openjpeg >=2.5.0,<3.0a0 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + - tk >=8.6.13,<8.7.0a0 + license: HPND + size: 41621811 + timestamp: 1704252739541 +- kind: conda + name: pillow + version: 10.2.0 + build: py39had0adad_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39had0adad_0.conda + sha256: 6936d54f9830ac66bee7b26187eb2297d80febe110e978cd9ae6a54e62ec6aaf + md5: 2972754dc054bb079d1d121918b5126f + depends: + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp-base >=1.3.2,<2.0a0 + - libxcb >=1.15,<1.16.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - openjpeg >=2.5.0,<3.0a0 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - tk >=8.6.13,<8.7.0a0 + license: HPND + size: 41860107 + timestamp: 1704252210593 +- kind: conda + name: pillow + version: 10.2.0 + build: py39hdd30358_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.2.0-py39hdd30358_0.conda + sha256: 70d5e8c36b1ac538d212816474594cf87aaa0c2e8f98308e952357df1b6b1c4f + md5: 38aef4e0b3355d32485cd4a199296a5b + depends: + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp-base >=1.3.2,<2.0a0 + - libxcb >=1.15,<1.16.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - openjpeg >=2.5.0,<3.0a0 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - tk >=8.6.13,<8.7.0a0 + license: HPND + size: 41418500 + timestamp: 1704252471264 +- kind: conda + name: pip + version: '24.0' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda + sha256: b7c1c5d8f13e8cb491c4bd1d0d1896a4cf80fc47de01059ad77509112b664a4a + md5: f586ac1e56c8638b64f9c8122a7b8a67 + depends: + - python >=3.7 + - setuptools + - wheel + license: MIT + license_family: MIT + size: 1398245 + timestamp: 1706960660581 +- kind: conda + name: pixman + version: 0.43.2 + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda + sha256: 366d28e2a0a191d6c535e234741e0cd1d94d713f76073d8af4a5ccb2a266121e + md5: 71004cbf7924e19c02746ccde9fd7123 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + size: 386826 + timestamp: 1706549500138 +- kind: conda + name: pixman + version: 0.43.4 + build: h63175ca_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pixman-0.43.4-h63175ca_0.conda + sha256: 51de4d7fb41597b06d60f1b82e269dafcb55e994e08fdcca8e4d6f7d42bedd07 + md5: b98135614135d5f458b75ab9ebb9558c + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 461854 + timestamp: 1709239971654 +- kind: conda + name: pixman + version: 0.43.4 + build: h73e2aa4_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.43.4-h73e2aa4_0.conda + sha256: 3ab44e12e566c67a6e9fd831f557ab195456aa996b8dd9af19787ca80caa5cd1 + md5: cb134c1e03fd32f4e6bea3f6de2614fd + depends: + - libcxx >=16 + license: MIT + license_family: MIT + size: 323904 + timestamp: 1709239931160 +- kind: conda + name: pixman + version: 0.43.4 + build: hebf3989_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.43.4-hebf3989_0.conda + sha256: df0ba2710ccdea5c909b63635529797f6eb3635b6fb77ae9cb2f183d08818409 + md5: 0308c68e711cd295aaa026a4f8c4b1e5 + depends: + - libcxx >=16 + license: MIT + license_family: MIT + size: 198755 + timestamp: 1709239846651 +- kind: conda + name: pkgutil-resolve-name + version: 1.3.10 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda + sha256: fecf95377134b0e8944762d92ecf7b0149c07d8186fb5db583125a2705c7ea0a + md5: 405678b942f2481cecdb3e010f4925d9 + depends: + - python >=3.6 + license: MIT AND PSF-2.0 + size: 10778 + timestamp: 1694617398467 +- kind: conda + name: platformdirs + version: 4.2.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda + sha256: 2ebfb971236ab825dd79dd6086ea742a9901008ffb9c6222c1f2b5172a8039d3 + md5: a0bc3eec34b0fab84be6b2da94e98e20 + depends: + - python >=3.8 + license: MIT + license_family: MIT + size: 20210 + timestamp: 1706713564353 +- kind: conda + name: pluggy + version: 1.4.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda + sha256: 6edfd2c41938ea772096c674809bfcf2ebb9bef7e82de6c7ea0b966b86bfb4d0 + md5: 139e9feb65187e916162917bb2484976 + depends: + - python >=3.8 + license: MIT + license_family: MIT + size: 23384 + timestamp: 1706116931972 +- kind: conda + name: ply + version: '3.11' + build: py_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2 + sha256: 2cd6fae8f9cbc806b7f828f006ae4a83c23fac917cacfd73c37ce322d4324e53 + md5: 7205635cd71531943440fbfe3b6b5727 + depends: + - python + license: BSD 3-clause + license_family: BSD + size: 44837 + timestamp: 1530963184592 +- kind: conda + name: pthread-stubs + version: '0.4' + build: h27ca646_1001 + build_number: 1001 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-h27ca646_1001.tar.bz2 + sha256: 9da9e6f5d51dff6ad2e4ee0874791437ba952e0a6249942273f0fedfd07ea826 + md5: d3f26c6494d4105d4ecb85203d687102 + license: MIT + license_family: MIT + size: 5696 + timestamp: 1606147608402 +- kind: conda + name: pthread-stubs + version: '0.4' + build: h36c2ea0_1001 + build_number: 1001 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2 + sha256: 67c84822f87b641d89df09758da498b2d4558d47b920fd1d3fe6d3a871e000ff + md5: 22dad4df6e8630e8dff2428f6f6a7036 + depends: + - libgcc-ng >=7.5.0 + license: MIT + license_family: MIT + size: 5625 + timestamp: 1606147468727 +- kind: conda + name: pthread-stubs + version: '0.4' + build: hc929b4f_1001 + build_number: 1001 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-hc929b4f_1001.tar.bz2 + sha256: 6e3900bb241bcdec513d4e7180fe9a19186c1a38f0b4080ed619d26014222c53 + md5: addd19059de62181cd11ae8f4ef26084 + license: MIT + license_family: MIT + size: 5653 + timestamp: 1606147699844 +- kind: conda + name: pthread-stubs + version: '0.4' + build: hcd874cb_1001 + build_number: 1001 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2 + sha256: bb5a6ddf1a609a63addd6d7b488b0f58d05092ea84e9203283409bff539e202a + md5: a1f820480193ea83582b13249a7e7bd9 + depends: + - m2w64-gcc-libs + license: MIT + license_family: MIT + size: 6417 + timestamp: 1606147814351 +- kind: conda + name: pthreads-win32 + version: 2.9.1 + build: hfa6e2cd_3 + build_number: 3 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-hfa6e2cd_3.tar.bz2 + sha256: 576a228630a72f25d255a5e345e5f10878e153221a96560f2498040cd6f54005 + md5: e2da8758d7d51ff6aa78a14dfb9dbed4 + depends: + - vc 14.* + license: LGPL 2 + size: 144301 + timestamp: 1537755684331 +- kind: conda + name: pulseaudio-client + version: '17.0' + build: hb77b528_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda + sha256: b27c0c8671bd95c205a61aeeac807c095b60bc76eb5021863f919036d7a964fc + md5: 07f45f1be1c25345faddb8db0de8039b + depends: + - dbus >=1.13.6,<2.0a0 + - libgcc-ng >=12 + - libglib >=2.78.3,<3.0a0 + - libsndfile >=1.2.2,<1.3.0a0 + - libsystemd0 >=255 + constrains: + - pulseaudio 17.0 *_0 + license: LGPL-2.1-or-later + license_family: LGPL + size: 757633 + timestamp: 1705690081905 +- kind: conda + name: py-cpuinfo + version: 9.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 + sha256: 1bb0459fdebf2f3155ee511e99097c5506ef206acbdd871b74ae9fc4b0c4a019 + md5: 6f6d42b894118f8378fce11887ccdaff + depends: + - python >=3.7 + license: MIT + license_family: MIT + size: 24947 + timestamp: 1666774595872 +- kind: conda + name: pydotplus + version: 2.0.2 + build: pyhaef67bd_5 + build_number: 5 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pydotplus-2.0.2-pyhaef67bd_5.tar.bz2 + sha256: c811e85f0de51306eb10026110b38c6b977e8260ef974816506e5045506804dc + md5: 8af781cbb9222f0da55f8b9e504f0bdc + depends: + - graphviz >=2.47.2,<3.0a0 + - pyparsing >=2.0.1 + - python >=3.6 + license: MIT + license_family: MIT + size: 24847 + timestamp: 1622588237763 +- kind: conda + name: pyparsing + version: 3.1.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda + sha256: 06c77cb03e5dde2d939b216c99dd2db52ea93a4c7c599f3882f136005c359c7b + md5: b9a4dacf97241704529131a0dfc0494f + depends: + - python >=3.6 + license: MIT + license_family: MIT + size: 89455 + timestamp: 1709721146886 +- kind: conda + name: pyqt + version: 5.15.9 + build: py39h52134e7_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py39h52134e7_5.conda + sha256: a0d0662c73b343931dbd66d9c25ec74f40115512568a87bf4d01af8d1a8ddf1c + md5: e1f148e57d071b09187719df86f513c1 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - pyqt5-sip 12.12.2 py39h3d6467e_5 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - qt-main >=5.15.8,<5.16.0a0 + - sip >=6.7.11,<6.8.0a0 + license: GPL-3.0-only + license_family: GPL + size: 5227659 + timestamp: 1695420723753 +- kind: conda + name: pyqt + version: 5.15.9 + build: py39hb77abff_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pyqt-5.15.9-py39hb77abff_5.conda + sha256: 9aee5ab6f2c5a71f2eb399e5fec175f79498648ff8e4be6f815cf0ca803201c4 + md5: 5ed899124a51958336371ff01482b8fd + depends: + - pyqt5-sip 12.12.2 py39h99910a6_5 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - qt-main >=5.15.8,<5.16.0a0 + - sip >=6.7.11,<6.8.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: GPL-3.0-only + license_family: GPL + size: 3876568 + timestamp: 1695421679054 +- kind: conda + name: pyqt5-sip + version: 12.12.2 + build: py39h3d6467e_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py39h3d6467e_5.conda + sha256: 86efec5e57111794e039bb14dfce23d9df6ed8df139ab1404086140eba6d4d7c + md5: 93aff412f3e49fdb43361c0215cbd72d + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - packaging + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - sip + - toml + license: GPL-3.0-only + license_family: GPL + size: 85034 + timestamp: 1695418081052 +- kind: conda + name: pyqt5-sip + version: 12.12.2 + build: py39h99910a6_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pyqt5-sip-12.12.2-py39h99910a6_5.conda + sha256: c352489404b993ee0de4a068fd766229dd759a8d7fbc825bf8820073c2ff12d7 + md5: dffbcea794c524c471772a5f697c2aea + depends: + - packaging + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - sip + - toml + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: GPL-3.0-only + license_family: GPL + size: 79633 + timestamp: 1695418442270 +- kind: conda + name: pyshp + version: 2.3.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2 + sha256: 41eced0d5e855bc52018f200b239d627daa38ad78a655ffa2f1efd95b07b6bce + md5: 92a889dc236a5197612bc85bee6d7174 + depends: + - python >=3.6 + license: MIT + license_family: MIT + size: 964060 + timestamp: 1659003065197 +- kind: conda + name: pysocks + version: 1.7.1 + build: pyh0701188_6 + build_number: 6 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh0701188_6.tar.bz2 + sha256: b3a612bc887f3dd0fb7c4199ad8e342bd148cf69a9b74fd9468a18cf2bef07b7 + md5: 56cd9fe388baac0e90c7149cfac95b60 + depends: + - __win + - python >=3.8 + - win_inet_pton + license: BSD-3-Clause + license_family: BSD + size: 19348 + timestamp: 1661605138291 +- kind: conda + name: pysocks + version: 1.7.1 + build: pyha2e5f31_6 + build_number: 6 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b + md5: 2a7de29fb590ca14b5243c4c812c8025 + depends: + - __unix + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + size: 18981 + timestamp: 1661604969727 +- kind: conda + name: pytest + version: 8.1.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda + sha256: 3c481d6b54af1a33c32a3f3eaa3e0971955431e7023db55808740cd062271c73 + md5: 94ff09cdedcb7b17e9cd5097ee2cfcff + depends: + - colorama + - exceptiongroup >=1.0.0rc8 + - iniconfig + - packaging + - pluggy <2.0,>=1.4 + - python >=3.8 + - tomli >=1 + constrains: + - pytest-faulthandler >=2 + license: MIT + license_family: MIT + size: 255523 + timestamp: 1709992719691 +- kind: conda + name: pytest-benchmark + version: 4.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 + sha256: e08bba57295c6ca9cbc265347c312aaab1f0cf66f4e8ff53a2461f32c397536f + md5: 8c3168375e2ac100c17b133f4e2eb536 + depends: + - py-cpuinfo + - pytest >=3.8 + - python >=3.5 + license: BSD-2-Clause + license_family: BSD + size: 39571 + timestamp: 1666782598879 +- kind: conda + name: pytest-dotenv + version: 0.5.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pytest-dotenv-0.5.2-pyhd8ed1ab_0.tar.bz2 + sha256: 43ab7de6af7b298a9199aea2bf6fa481a3059ba1068dd0967fe3a040ff6e9303 + md5: 11b16b526f60cc18748c3fe45d10315a + depends: + - pytest >=5.0.0 + - python >=3.6 + - python-dotenv >=0.9.1 + license: MIT + license_family: MIT + size: 7383 + timestamp: 1606859705188 +- kind: conda + name: pytest-order + version: 1.0.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pytest-order-1.0.1-pyhd8ed1ab_0.tar.bz2 + sha256: 8d4f0c70f66dfeb4f857e2b92b30713b7b6b475b748dcb2b47ef7d0f18346752 + md5: d66820a0d1d10f6731b101d36dc38ad9 + depends: + - pytest >=3.7 + - python >=3.6 + license: MIT + license_family: MIT + size: 15851 + timestamp: 1641771678634 +- kind: conda + name: pytest-xdist + version: 3.5.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda + sha256: 8dc1d422e48e5a80eb72e26ed0135bb4843cf508d3b1cb006c3257c8639784d1 + md5: d5f595da2daead898ca958ac62f0307b + depends: + - execnet >=1.1 + - pytest >=6.2.0 + - python >=3.7 + constrains: + - psutil >=3.0 + license: MIT + license_family: MIT + size: 36516 + timestamp: 1700593072448 +- kind: conda + name: python + version: 3.9.19 + build: h0755675_0_cpython + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.9.19-h0755675_0_cpython.conda + sha256: b9253ca9ca5427e6da4b1d43353a110e0f2edfab9c951afb4bf01cbae2825b31 + md5: d9ee3647fbd9e8595b8df759b2bbefb8 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libffi >=3.4,<4.0a0 + - libgcc-ng >=12 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.2.13,<1.3.0a0 + - ncurses >=6.4.20240210,<7.0a0 + - openssl >=3.2.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.9.* *_cp39 + license: Python-2.0 + size: 23800555 + timestamp: 1710940120866 +- kind: conda + name: python + version: 3.9.19 + build: h4de0772_0_cpython + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/python-3.9.19-h4de0772_0_cpython.conda + sha256: 92d847bc9e79a60c1d139aa4ca0385d283b90aa2d7421bb3ffcb5dc0678fd72f + md5: b6999bc275e0e6beae7b1c8ea0be1e85 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - openssl >=3.2.1,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - vc >=14.1,<15 + - vc14_runtime >=14.16.27033 + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.9.* *_cp39 + license: Python-2.0 + size: 16906240 + timestamp: 1710938565297 +- kind: conda + name: python + version: 3.9.19 + build: h7a9c478_0_cpython + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/python-3.9.19-h7a9c478_0_cpython.conda + sha256: 58b76be84683bc03112b3ed7e377e99af24844ebf7d7568f6466a2dae7a887fe + md5: 7d53d366acd9dbfb498c69326ccb520a + depends: + - bzip2 >=1.0.8,<2.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - ncurses >=6.4.20240210,<7.0a0 + - openssl >=3.2.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.9.* *_cp39 + license: Python-2.0 + size: 12372436 + timestamp: 1710940037648 +- kind: conda + name: python + version: 3.9.19 + build: hd7ebdb9_0_cpython + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.9.19-hd7ebdb9_0_cpython.conda + sha256: 3b93f7a405f334043758dfa8aaca050429a954a37721a6462ebd20e94ef7c5a0 + md5: 45c4d173b12154f746be3b49b1190634 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - ncurses >=6.4.20240210,<7.0a0 + - openssl >=3.2.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.9.* *_cp39 + license: Python-2.0 + size: 11847835 + timestamp: 1710939779164 +- kind: conda + name: python-dateutil + version: 2.9.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + sha256: f3ceef02ac164a8d3a080d0d32f8e2ebe10dd29e3a685d240e38b3599e146320 + md5: 2cf4264fffb9e6eff6031c5b6884d61c + depends: + - python >=3.7 + - six >=1.5 + license: Apache-2.0 + license_family: APACHE + size: 222742 + timestamp: 1709299922152 +- kind: conda + name: python-dotenv + version: 1.0.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_0.conda + sha256: 2d4c80364f03315d606a50eddd493dbacc078e21412c2462c0f781eec49b572c + md5: c2997ea9360ac4e015658804a7a84f94 + depends: + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + size: 24278 + timestamp: 1706018281544 +- kind: conda + name: python-fastjsonschema + version: 2.19.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.1-pyhd8ed1ab_0.conda + sha256: 38b2db169d65cc5595e3ce63294c4fdb6a242ecf71f70b3ad8cad3bd4230d82f + md5: 4d3ceee3af4b0f9a1f48f57176bf8625 + depends: + - python >=3.3 + license: BSD-3-Clause + license_family: BSD + size: 225250 + timestamp: 1703781171097 +- kind: conda + name: python-tzdata + version: '2024.1' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda + sha256: 9da9a849d53705dee450b83507df1ca8ffea5f83bd21a215202221f1c492f8ad + md5: 98206ea9954216ee7540f0c773f2104d + depends: + - python >=3.6 + license: Apache-2.0 + license_family: APACHE + size: 144024 + timestamp: 1707747742930 +- kind: conda + name: python_abi + version: '3.9' + build: 4_cp39 + build_number: 4 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-4_cp39.conda + sha256: 7e0157e35929711e1a986c18a8bfb7a38a2209cfada16b541ebb0481f74376d6 + md5: bfe4b3259a8ac6cdf0037752904da6a7 + constrains: + - python 3.9.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 6378 + timestamp: 1695147399237 +- kind: conda + name: python_abi + version: '3.9' + build: 4_cp39 + build_number: 4 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.9-4_cp39.conda + sha256: a2b38ce566d9f48a49369f46c50912300a6ac09bf1c58a0d6c2caab074ee551e + md5: 2d9f6c00555127a9058cfa955adf1090 + constrains: + - python 3.9.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 6486 + timestamp: 1695147714523 +- kind: conda + name: python_abi + version: '3.9' + build: 4_cp39 + build_number: 4 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.9-4_cp39.conda + sha256: 2ae06dcd1a03f023b6accf5bd989f42b689f708d3495affa22c2ed9f1d127726 + md5: be9e11a37bbab9cfdbcb36e52d8d73cb + constrains: + - python 3.9.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 6484 + timestamp: 1695147719187 +- kind: conda + name: python_abi + version: '3.9' + build: 4_cp39 + build_number: 4 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.9-4_cp39.conda + sha256: 3bf150eb6fc99f459210065973fc79b5974a9142672f6dd92eba6ed97697e0ed + md5: 948b0d93d4ab1372d8fd45e1560afd47 + constrains: + - python 3.9.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 6776 + timestamp: 1695147727582 +- kind: conda + name: pytz + version: '2024.1' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + sha256: 1a7d6b233f7e6e3bbcbad054c8fd51e690a67b129a899a056a5e45dd9f00cb41 + md5: 3eeeeb9e4827ace8c0c1419c85d590ad + depends: + - python >=3.7 + license: MIT + license_family: MIT + size: 188538 + timestamp: 1706886944988 +- kind: conda + name: pywin32 + version: '306' + build: py39h99910a6_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pywin32-306-py39h99910a6_2.conda + sha256: bae89555b73c8bbbb9efe88490f2d16c010188dd078ed3aa39c2ba3084e31608 + md5: eab91442160b49994dd2e224e6082770 + depends: + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: PSF-2.0 + license_family: PSF + size: 5808124 + timestamp: 1695974471118 +- kind: conda + name: pyyaml + version: 6.0.1 + build: py39h0f82c59_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.1-py39h0f82c59_1.conda + sha256: 96ef332c1199bed9779f6b5bf7671dd00654208a6fadb7b89d744e66286326dc + md5: b4f3bbf710410751f687ac04544c12b1 + depends: + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + size: 159929 + timestamp: 1695373838385 +- kind: conda + name: pyyaml + version: 6.0.1 + build: py39ha55989b_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.1-py39ha55989b_1.conda + sha256: 8e18f428c944dc08e34b78dad56af00852bc416b4be9ba528144389ac61bf123 + md5: 5c3a9da77fc79c21c5c1fd7ea06306a2 + depends: + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + size: 151118 + timestamp: 1695373930963 +- kind: conda + name: pyyaml + version: 6.0.1 + build: py39hd1e30aa_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda + sha256: 28b147c50ad48215f9427a52811848223ac0371be7caae88522e661a3bfb1448 + md5: 37218233bcdc310e4fde6453bc1b40d8 + depends: + - libgcc-ng >=12 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + size: 178391 + timestamp: 1695373606953 +- kind: conda + name: pyyaml + version: 6.0.1 + build: py39hdc70f33_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.1-py39hdc70f33_1.conda + sha256: 4a8d084617571ecb8d816fe4c46b672d8b9b4bd354cbfdbb6c843143abe3896f + md5: 542378f49240a94056b50ab1385b3bfb + depends: + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + size: 162428 + timestamp: 1695373824922 +- kind: conda + name: qt-main + version: 5.15.8 + build: h112747c_20 + build_number: 20 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h112747c_20.conda + sha256: 14f9075640d1abc7f8834420564f80aeaaf4da75e40dc3e4187f93d39f952418 + md5: cea58006ee5e891fc2a70c6b64d41363 + depends: + - __glibc >=2.17,<3.0.a0 + - alsa-lib >=1.2.11,<1.3.0a0 + - dbus >=1.13.6,<2.0a0 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - gst-plugins-base >=1.22.9,<1.23.0a0 + - gstreamer >=1.22.9,<1.23.0a0 + - harfbuzz >=8.3.0,<9.0a0 + - icu >=73.2,<74.0a0 + - krb5 >=1.21.2,<1.22.0a0 + - libclang-cpp15 >=15.0.7,<15.1.0a0 + - libclang13 >=15.0.7 + - libcups >=2.3.3,<2.4.0a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libexpat >=2.6.2,<3.0a0 + - libgcc-ng >=12 + - libglib >=2.80.0,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libllvm15 >=15.0.7,<15.1.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libpq >=16.2,<17.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libstdcxx-ng >=12 + - libxcb >=1.15,<1.16.0a0 + - libxkbcommon >=1.6.0,<2.0a0 + - libxml2 >=2.12.6,<3.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - mysql-libs >=8.3.0,<8.4.0a0 + - nspr >=4.35,<5.0a0 + - nss >=3.98,<4.0a0 + - openssl >=3.2.1,<4.0a0 + - pulseaudio-client >=17.0,<17.1.0a0 + - xcb-util >=0.4.0,<0.5.0a0 + - xcb-util-image >=0.4.0,<0.5.0a0 + - xcb-util-keysyms >=0.4.0,<0.5.0a0 + - xcb-util-renderutil >=0.3.9,<0.4.0a0 + - xcb-util-wm >=0.4.1,<0.5.0a0 + - xorg-libice >=1.1.1,<2.0a0 + - xorg-libsm >=1.2.4,<2.0a0 + - xorg-libx11 >=1.8.7,<2.0a0 + - xorg-libxext >=1.3.4,<2.0a0 + - xorg-xf86vidmodeproto + - zstd >=1.5.5,<1.6.0a0 + constrains: + - qt 5.15.8 + license: LGPL-3.0-only + license_family: LGPL + size: 60849352 + timestamp: 1711304658310 +- kind: conda + name: qt-main + version: 5.15.8 + build: h9e85ed6_20 + build_number: 20 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/qt-main-5.15.8-h9e85ed6_20.conda + sha256: 548e948eb70174dad20151714a70319b9b2d220b75d407a88f4f5812f14fcdd2 + md5: 312511ef95bf1418f20dd50041a4bc85 + depends: + - gst-plugins-base >=1.22.9,<1.23.0a0 + - gstreamer >=1.22.9,<1.23.0a0 + - icu >=73.2,<74.0a0 + - krb5 >=1.21.2,<1.22.0a0 + - libclang13 >=15.0.7 + - libglib >=2.80.0,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - openssl >=3.2.1,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - zstd >=1.5.5,<1.6.0a0 + constrains: + - qt 5.15.8 + license: LGPL-3.0-only + license_family: LGPL + size: 60012507 + timestamp: 1711306247296 +- kind: conda + name: readline + version: '8.2' + build: h8228510_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 + md5: 47d31b792659ce70f470b5c82fdfb7a4 + depends: + - libgcc-ng >=12 + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 281456 + timestamp: 1679532220005 +- kind: conda + name: readline + version: '8.2' + build: h92ec313_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 + md5: 8cbb776a2f641b943d413b3e19df71f4 + depends: + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 250351 + timestamp: 1679532511311 +- kind: conda + name: readline + version: '8.2' + build: h9e318b2_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + sha256: 41e7d30a097d9b060037f0c6a2b1d4c4ae7e942c06c943d23f9d481548478568 + md5: f17f77f2acf4d344734bda76829ce14e + depends: + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 255870 + timestamp: 1679532707590 +- kind: conda + name: referencing + version: 0.34.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda + sha256: 2e631e9e1d49280770573f7acc7441b70181b2dc21948bb1be15eaae80550672 + md5: e4492c22e314be5c75db3469e3bbf3d9 + depends: + - attrs >=22.2.0 + - python >=3.8 + - rpds-py >=0.7.0 + license: MIT + license_family: MIT + size: 42071 + timestamp: 1710763821612 +- kind: conda + name: requests + version: 2.31.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + sha256: 9f629d6fd3c8ac5f2a198639fe7af87c4db2ac9235279164bfe0fcb49d8c4bad + md5: a30144e4156cdbb236f99ebb49828f8b + depends: + - certifi >=2017.4.17 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - python >=3.7 + - urllib3 >=1.21.1,<3 + constrains: + - chardet >=3.0.2,<6 + license: Apache-2.0 + license_family: APACHE + size: 56690 + timestamp: 1684774408600 +- kind: conda + name: rpds-py + version: 0.18.0 + build: py39h9a407ce_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.18.0-py39h9a407ce_0.conda + sha256: d3b2f8ca759237fea4acde58d94871970795e8617752a4a0c373717282000926 + md5: a247149173eb156a430bea00738d91f1 + depends: + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 292859 + timestamp: 1707923214688 +- kind: conda + name: rpds-py + version: 0.18.0 + build: py39h9fdd4d6_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.18.0-py39h9fdd4d6_0.conda + sha256: 1bc9bdf6f4a14f38f8decf967fc40bfcd1ab069f012ef0f109163d1ef7b7c633 + md5: ca1e1ff2be5c41142e412c83b88960e4 + depends: + - libgcc-ng >=12 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: MIT + license_family: MIT + size: 915925 + timestamp: 1707923007058 +- kind: conda + name: rpds-py + version: 0.18.0 + build: py39hcf47035_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.18.0-py39hcf47035_0.conda + sha256: 02f4bc23980602a53243f46ec08e4bf8f3fb9e53c09322624af38ff4aebc0056 + md5: 0e8641e9f0d42d844cf17f5520225e6e + depends: + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + constrains: + - __osx >=10.12 + license: MIT + license_family: MIT + size: 300083 + timestamp: 1707923366326 +- kind: conda + name: rpds-py + version: 0.18.0 + build: py39hf21820d_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.18.0-py39hf21820d_0.conda + sha256: daccdfd59f82b8767f71dc492d117bc2a5329748db3921eb66d752ffb86baf4f + md5: 32fa6863c2216dbe787adaf874433713 + depends: + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 202481 + timestamp: 1707923894221 +- kind: conda + name: scipy + version: 1.12.0 + build: py39h0ed1e0f_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.12.0-py39h0ed1e0f_2.conda + sha256: 3a721490dff7c37d6e516ab3991761afa5586e3722f97a793dba538ee9cfa310 + md5: dcc2e3dd279432335b58f986d91dd9fd + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=15 + - libgfortran 5.* + - libgfortran5 >=12.3.0 + - libgfortran5 >=13.2.0 + - liblapack >=3.9.0,<4.0a0 + - numpy >=1.22.4,<1.28 + - numpy >=1.22.4,<2.0a0 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 15911980 + timestamp: 1706064557722 +- kind: conda + name: scipy + version: 1.12.0 + build: py39h474f0d3_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h474f0d3_2.conda + sha256: 8b2312d5be30bfb226e83af8e070c65df6816d0a9b179f51b9f915990bfd86ee + md5: 6ab241b2023730f6b41712dc1b503afa + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=12.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - numpy >=1.22.4,<1.28 + - numpy >=1.22.4,<2.0a0 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 16387698 + timestamp: 1706042473639 +- kind: conda + name: scipy + version: 1.12.0 + build: py39hcc04109_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.12.0-py39hcc04109_2.conda + sha256: b319c34eb72aa97a9775c14ed64af02398f9e4d3b563453b4a0225cd4d5903eb + md5: d11014867a62eb349f91d65b31e6a322 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=15 + - libgfortran 5.* + - libgfortran5 >=12.3.0 + - libgfortran5 >=13.2.0 + - liblapack >=3.9.0,<4.0a0 + - numpy >=1.22.4,<1.28 + - numpy >=1.22.4,<2.0a0 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 14695040 + timestamp: 1706043583427 +- kind: conda + name: scipy + version: 1.12.0 + build: py39hddb5d58_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/scipy-1.12.0-py39hddb5d58_2.conda + sha256: 2cc049ee282ec1face95e102ee936858019eb567c7d613b4956345f41a52df79 + md5: e421d27a09f9131514436f8233125766 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - numpy >=1.22.4,<1.28 + - numpy >=1.22.4,<2.0a0 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 15016838 + timestamp: 1706044178953 +- kind: conda + name: setuptools + version: 69.2.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + sha256: 78a75c75a5dacda6de5f4056c9c990141bdaf4f64245673a590594d00bc63713 + md5: da214ecd521a720a9d521c68047682dc + depends: + - python >=3.8 + license: MIT + license_family: MIT + size: 471183 + timestamp: 1710344615844 +- kind: conda + name: shapely + version: 2.0.3 + build: py39h19e25c1_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.3-py39h19e25c1_0.conda + sha256: ef82124eacdccc7109306fab623a130689e0e2efa65b5930aafe9de67ecdbfe3 + md5: 139065ace3542c37f2f6c2def6a7248f + depends: + - geos >=3.12.1,<3.12.2.0a0 + - numpy >=1.22.4,<2.0a0 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 449167 + timestamp: 1708368412520 +- kind: conda + name: shapely + version: 2.0.3 + build: py39h61a8cf5_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/shapely-2.0.3-py39h61a8cf5_0.conda + sha256: e9c852f2c0b1bd060e5eb840401981c33306f34f09d0c1f5d98ffa138ee1103c + md5: 47fbc5da424f3b8c4853b126e5ae8766 + depends: + - geos >=3.12.1,<3.12.2.0a0 + - numpy >=1.22.4,<2.0a0 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 450564 + timestamp: 1708368463948 +- kind: conda + name: shapely + version: 2.0.3 + build: py39h6404dd3_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py39h6404dd3_0.conda + sha256: 43af6c106ff55be27be3be99b7f313fa3becee9aeeb826e31257c1159416f53a + md5: 1520f039123452cd2de847068449a618 + depends: + - geos >=3.12.1,<3.12.2.0a0 + - libgcc-ng >=12 + - numpy >=1.22.4,<2.0a0 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 479182 + timestamp: 1708368191201 +- kind: conda + name: shapely + version: 2.0.3 + build: py39ha70ab96_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.0.3-py39ha70ab96_0.conda + sha256: 2bd385c02e2ef0a9a15bf3a1e79ab40119a441d03ffa72339ac2f5c73c583eed + md5: 6f1f893210f9daa0fe5e0634c0e0d2b6 + depends: + - geos >=3.12.1,<3.12.2.0a0 + - numpy >=1.22.4,<2.0a0 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 446351 + timestamp: 1708368614890 +- kind: conda + name: sip + version: 6.7.12 + build: py39h3d6467e_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py39h3d6467e_0.conda + sha256: fd50c71dc05daf9d28663d448d17f150b3eb79ae629198c73e2186b5b1e990dc + md5: e667a3ab0df62c54e60e1843d2e6defb + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - packaging + - ply + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - tomli + license: GPL-3.0-only + license_family: GPL + size: 491742 + timestamp: 1697300599649 +- kind: conda + name: sip + version: 6.7.12 + build: py39h99910a6_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/sip-6.7.12-py39h99910a6_0.conda + sha256: 541840bcd849c6c745f537987d0009695ef14c8fd9ad4721333a30bf3c49e018 + md5: 0cc5774390ada632ed7975203057c91c + depends: + - packaging + - ply + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - tomli + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: GPL-3.0-only + license_family: GPL + size: 502390 + timestamp: 1697300934198 +- kind: conda + name: six + version: 1.16.0 + build: pyh6c4a22f_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 + md5: e5f25f8dbc060e9a8d912e432202afc2 + depends: + - python + license: MIT + license_family: MIT + size: 14259 + timestamp: 1620240338595 +- kind: conda + name: tbb + version: 2021.11.0 + build: h91493d7_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.11.0-h91493d7_1.conda + sha256: aa30c089fdd6f66c7808592362e29963586e094159964a5fb61fb8efa9e349bc + md5: 21069f3ed16812f9f4f2700667b6ec86 + depends: + - libhwloc >=2.9.3,<2.9.4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: APACHE + size: 161382 + timestamp: 1706164225098 +- kind: conda + name: tk + version: 8.6.13 + build: h1abcd95_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + sha256: 30412b2e9de4ff82d8c2a7e5d06a15f4f4fef1809a72138b6ccb53a33b26faf5 + md5: bf830ba5afc507c6232d4ef0fb1a882d + depends: + - libzlib >=1.2.13,<1.3.0a0 + license: TCL + license_family: BSD + size: 3270220 + timestamp: 1699202389792 +- kind: conda + name: tk + version: 8.6.13 + build: h5083fa2_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<1.3.0a0 + license: TCL + license_family: BSD + size: 3145523 + timestamp: 1699202432999 +- kind: conda + name: tk + version: 8.6.13 + build: h5226925_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + sha256: 2c4e914f521ccb2718946645108c9bd3fc3216ba69aea20c2c3cedbd8db32bb1 + md5: fc048363eb8f03cd1737600a5d08aafe + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + size: 3503410 + timestamp: 1699202577803 +- kind: conda + name: tk + version: 8.6.13 + build: noxft_h4845f30_101 + build_number: 101 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<1.3.0a0 + license: TCL + license_family: BSD + size: 3318875 + timestamp: 1699202167581 +- kind: conda + name: toml + version: 0.10.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 + sha256: f0f3d697349d6580e4c2f35ba9ce05c65dc34f9f049e85e45da03800b46139c1 + md5: f832c45a477c78bebd107098db465095 + depends: + - python >=2.7 + license: MIT + license_family: MIT + size: 18433 + timestamp: 1604308660817 +- kind: conda + name: tomli + version: 2.0.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + sha256: 4cd48aba7cd026d17e86886af48d0d2ebc67ed36f87f6534f4b67138f5a5a58f + md5: 5844808ffab9ebdb694585b50ba02a96 + depends: + - python >=3.7 + license: MIT + license_family: MIT + size: 15940 + timestamp: 1644342331069 +- kind: conda + name: tornado + version: '6.4' + build: py39h17cfd9d_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4-py39h17cfd9d_0.conda + sha256: 656b39d76d0a50b307a0c4876ab5d51ec03bc2b03570b236e79db7d1e12c4611 + md5: 38274b171136956ae2edc0dd2772ab20 + depends: + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + license: Apache-2.0 + license_family: Apache + size: 641216 + timestamp: 1708363746873 +- kind: conda + name: tornado + version: '6.4' + build: py39ha09f3b3_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4-py39ha09f3b3_0.conda + sha256: 4466eabed63d4a979b8f1aefc3241b91a70ee186e69ce23e5fbe23c122033c16 + md5: 4541517b5a605bf45d4a5fb074bb4cf5 + depends: + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: Apache-2.0 + license_family: Apache + size: 641481 + timestamp: 1708363543532 +- kind: conda + name: tornado + version: '6.4' + build: py39ha55989b_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/tornado-6.4-py39ha55989b_0.conda + sha256: c62ebbd6e0fea0381dd1b377b41a39b1288269b28d8044c3b9abe92b5654f961 + md5: d8f52e8e1d02f9a5901f9224e2ddf98f + depends: + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: Apache + size: 644981 + timestamp: 1708363806202 +- kind: conda + name: tornado + version: '6.4' + build: py39hd1e30aa_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py39hd1e30aa_0.conda + sha256: 27ab8f208c9a8fef7341d8f603059073f445de39c52eed73218f5823212ca73c + md5: 1e865e9188204cdfb1fd2531780add88 + depends: + - libgcc-ng >=12 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: Apache-2.0 + license_family: Apache + size: 639959 + timestamp: 1708363320529 +- kind: conda + name: traitlets + version: 5.14.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda + sha256: 9ea6073091c130470a51b51703c8d2d959434992e29c4aa4abeba07cd56533a3 + md5: af5fa2d2186003472e766a23c46cae04 + depends: + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + size: 110288 + timestamp: 1710254564088 +- kind: conda + name: trove-classifiers + version: 2024.3.25 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda + sha256: 909b4288bd2be8566f6d0a311d75a7e0e1cf81c42c19c97b1fc7d043c3db3301 + md5: e565e537d9760fc5d6d02ae4521a144b + depends: + - python >=3.7 + license: Apache-2.0 + license_family: Apache + size: 18393 + timestamp: 1711440195159 +- kind: conda + name: typing_extensions + version: 4.10.0 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + sha256: 4be24d557897b2f6609f5d5f7c437833c62f4d4a96581e39530067e96a2d0451 + md5: 16ae769069b380646c47142d719ef466 + depends: + - python >=3.8 + license: PSF-2.0 + license_family: PSF + size: 37018 + timestamp: 1708904796013 +- kind: conda + name: tzdata + version: 2024a + build: h0c530f3_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 + md5: 161081fc7cec0bfda0d86d7cb595f8d8 + license: LicenseRef-Public-Domain + size: 119815 + timestamp: 1706886945727 +- kind: conda + name: ucrt + version: 10.0.22621.0 + build: h57928b3_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 + sha256: f29cdaf8712008f6b419b8b1a403923b00ab2504bfe0fb2ba8eb60e72d4f14c6 + md5: 72608f6cd3e5898229c3ea16deb1ac43 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-Proprietary + license_family: PROPRIETARY + size: 1283972 + timestamp: 1666630199266 +- kind: conda + name: unicodedata2 + version: 15.1.0 + build: py39h0f82c59_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-15.1.0-py39h0f82c59_0.conda + sha256: 31d33f967f0db811b25a9315bef727cb12a24c76d8ded8947188cc04535b06b0 + md5: 39c745ba9443da902afa7f5a9e9dfcac + depends: + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + license: Apache-2.0 + license_family: Apache + size: 376309 + timestamp: 1695848358752 +- kind: conda + name: unicodedata2 + version: 15.1.0 + build: py39ha55989b_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-15.1.0-py39ha55989b_0.conda + sha256: 7abe28f2a0604018448abf1e3e566e0b6ae45fc8719f908308137d9ab637c68a + md5: 20ec896e8d97f2ff8be1124e624dc8f2 + depends: + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: Apache + size: 373257 + timestamp: 1695848310896 +- kind: conda + name: unicodedata2 + version: 15.1.0 + build: py39hd1e30aa_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda + sha256: 90077cbf116112d5112b7beedf896e59c98416d09860ba98c06a770c014829b2 + md5: 1da984bbb6e765743e13388ba7b7b2c8 + depends: + - libgcc-ng >=12 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: Apache-2.0 + license_family: Apache + size: 373822 + timestamp: 1695848128416 +- kind: conda + name: unicodedata2 + version: 15.1.0 + build: py39hdc70f33_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-15.1.0-py39hdc70f33_0.conda + sha256: 2c3049ec6ffd44beb61964bf109993f654a7316fa6a368c634d603e8347f9fdf + md5: ede122e9ef2775a8879063d9d3ee819f + depends: + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: Apache-2.0 + license_family: Apache + size: 369843 + timestamp: 1695848310939 +- kind: conda + name: urllib3 + version: 2.2.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda + sha256: d4009dcc9327684d6409706ce17656afbeae690d8522d3c9bc4df57649a352cd + md5: 08807a87fa7af10754d46f63b368e016 + depends: + - brotli-python >=1.0.9 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.7 + license: MIT + license_family: MIT + size: 94669 + timestamp: 1708239595549 +- kind: conda + name: vc + version: '14.3' + build: hcf57466_18 + build_number: 18 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda + sha256: 447a8d8292a7b2107dcc18afb67f046824711a652725fc0f522c368e7a7b8318 + md5: 20e1e652a4c740fa719002a8449994a2 + depends: + - vc14_runtime >=14.38.33130 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 16977 + timestamp: 1702511255313 +- kind: conda + name: vc14_runtime + version: 14.38.33130 + build: h82b7239_18 + build_number: 18 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda + sha256: bf94c9af4b2e9cba88207001197e695934eadc96a5c5e4cd7597e950aae3d8ff + md5: 8be79fdd2725ddf7bbf8a27a4c1f79ba + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.38.33130.* *_18 + license: LicenseRef-ProprietaryMicrosoft + license_family: Proprietary + size: 749868 + timestamp: 1702511239004 +- kind: conda + name: vs2015_runtime + version: 14.38.33130 + build: hcb4865c_18 + build_number: 18 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda + sha256: a2fec221f361d6263c117f4ea6d772b21c90a2f8edc6f3eb0eadec6bfe8843db + md5: 10d42885e3ed84e575b454db30f1aa93 + depends: + - vc14_runtime >=14.38.33130 + license: BSD-3-Clause + license_family: BSD + size: 16988 + timestamp: 1702511261442 +- kind: conda + name: wheel + version: 0.43.0 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda + sha256: cb318f066afd6fd64619f14c030569faf3f53e6f50abf743b4c865e7d95b96bc + md5: 0b5293a157c2b5cd513dd1b03d8d3aae + depends: + - python >=3.8 + license: MIT + license_family: MIT + size: 57963 + timestamp: 1711546009410 +- kind: conda + name: win_inet_pton + version: 1.1.0 + build: pyhd8ed1ab_6 + build_number: 6 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyhd8ed1ab_6.tar.bz2 + sha256: a11ae693a0645bf6c7b8a47bac030be9c0967d0b1924537b9ff7458e832c0511 + md5: 30878ecc4bd36e8deeea1e3c151b2e0b + depends: + - __win + - python >=3.6 + license: PUBLIC-DOMAIN + size: 8191 + timestamp: 1667051294134 +- kind: conda + name: xcb-util + version: 0.4.0 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda + sha256: 0c91d87f0efdaadd4e56a5f024f8aab20ec30f90aa2ce9e4ebea05fbc20f71ad + md5: 9bfac7ccd94d54fd21a0501296d60424 + depends: + - libgcc-ng >=12 + - libxcb >=1.13 + - libxcb >=1.15,<1.16.0a0 + license: MIT + license_family: MIT + size: 19728 + timestamp: 1684639166048 +- kind: conda + name: xcb-util-image + version: 0.4.0 + build: h8ee46fc_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda + sha256: 92ffd68d2801dbc27afe223e04ae7e78ef605fc8575f107113c93c7bafbd15b0 + md5: 9d7bcddf49cbf727730af10e71022c73 + depends: + - libgcc-ng >=12 + - libxcb >=1.15,<1.16.0a0 + - xcb-util >=0.4.0,<0.5.0a0 + license: MIT + license_family: MIT + size: 24474 + timestamp: 1684679894554 +- kind: conda + name: xcb-util-keysyms + version: 0.4.0 + build: h8ee46fc_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda + sha256: 8451d92f25d6054a941b962179180728c48c62aab5bf20ac10fef713d5da6a9a + md5: 632413adcd8bc16b515cab87a2932913 + depends: + - libgcc-ng >=12 + - libxcb >=1.15,<1.16.0a0 + license: MIT + license_family: MIT + size: 14186 + timestamp: 1684680497805 +- kind: conda + name: xcb-util-renderutil + version: 0.3.9 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda + sha256: 6987588e6fff5892056021c2ea52f7a0deefb2c7348e70d24750e2d60dabf009 + md5: e995b155d938b6779da6ace6c6b13816 + depends: + - libgcc-ng >=12 + - libxcb >=1.13 + - libxcb >=1.15,<1.16.0a0 + license: MIT + license_family: MIT + size: 16955 + timestamp: 1684639112393 +- kind: conda + name: xcb-util-wm + version: 0.4.1 + build: h8ee46fc_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda + sha256: 08ba7147c7579249b6efd33397dc1a8c2404278053165aaecd39280fee705724 + md5: 90108a432fb5c6150ccfee3f03388656 + depends: + - libgcc-ng >=12 + - libxcb >=1.15,<1.16.0a0 + license: MIT + license_family: MIT + size: 52114 + timestamp: 1684679248466 +- kind: conda + name: xkeyboard-config + version: '2.41' + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.41-hd590300_0.conda + sha256: 56955610c0747ea7cb026bb8aa9ef165ff41d616e89894538173b8b7dd2ee49a + md5: 81f740407b45e3f9047b3174fa94eb9e + depends: + - libgcc-ng >=12 + - xorg-libx11 >=1.8.7,<2.0a0 + license: MIT + license_family: MIT + size: 898045 + timestamp: 1707104384997 +- kind: conda + name: xmipy + version: 1.3.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/xmipy-1.3.1-pyhd8ed1ab_0.conda + sha256: d702574ef63e5e44085c390b46090380097b3d63bbcbfe8d9e85f1828663d04c + md5: a3c8465bfc71004064a30c0238a74ea3 + depends: + - bmipy + - numpy + - python >=3.8 + license: CC0-1.0 + size: 18460 + timestamp: 1681486998644 +- kind: conda + name: xorg-kbproto + version: 1.0.7 + build: h7f98852_1002 + build_number: 1002 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2 + sha256: e90b0a6a5d41776f11add74aa030f789faf4efd3875c31964d6f9cfa63a10dd1 + md5: 4b230e8381279d76131116660f5a241a + depends: + - libgcc-ng >=9.3.0 + license: MIT + license_family: MIT + size: 27338 + timestamp: 1610027759842 +- kind: conda + name: xorg-kbproto + version: 1.0.7 + build: hcd874cb_1002 + build_number: 1002 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xorg-kbproto-1.0.7-hcd874cb_1002.tar.bz2 + sha256: 5b16e1ca1ecc0d2907f236bc4d8e6ecfd8417db013c862a01afb7f9d78e48c09 + md5: 8d11c1dac4756ca57e78c1bfe173bba4 + depends: + - m2w64-gcc-libs + license: MIT + license_family: MIT + size: 28166 + timestamp: 1610028297505 +- kind: conda + name: xorg-libice + version: 1.1.1 + build: hcd874cb_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xorg-libice-1.1.1-hcd874cb_0.conda + sha256: 353e07e311eb10e934f03e0123d0f05d9b3770a70b0c3993e6d11cf74d85689f + md5: 5271e3af4791170e2c55d02818366916 + depends: + - m2w64-gcc-libs + - m2w64-gcc-libs-core + - xorg-libx11 >=1.8.4,<2.0a0 + license: MIT + license_family: MIT + size: 158086 + timestamp: 1685308072189 +- kind: conda + name: xorg-libice + version: 1.1.1 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda + sha256: 5aa9b3682285bb2bf1a8adc064cb63aff76ef9178769740d855abb42b0d24236 + md5: b462a33c0be1421532f28bfe8f4a7514 + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 58469 + timestamp: 1685307573114 +- kind: conda + name: xorg-libsm + version: 1.2.4 + build: h7391055_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda + sha256: 089ad5f0453c604e18985480218a84b27009e9e6de9a0fa5f4a20b8778ede1f1 + md5: 93ee23f12bc2e684548181256edd2cf6 + depends: + - libgcc-ng >=12 + - libuuid >=2.38.1,<3.0a0 + - xorg-libice >=1.1.1,<2.0a0 + license: MIT + license_family: MIT + size: 27433 + timestamp: 1685453649160 +- kind: conda + name: xorg-libsm + version: 1.2.4 + build: hcd874cb_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xorg-libsm-1.2.4-hcd874cb_0.conda + sha256: 3a8cc151142c379d3ec3ec4420395d3a273873d3a45a94cd3038d143f5a519e8 + md5: 25926681339df15918243d9a7cec25a1 + depends: + - m2w64-gcc-libs + - m2w64-gcc-libs-core + - xorg-libice >=1.1.1,<2.0a0 + license: MIT + license_family: MIT + size: 86397 + timestamp: 1685454296879 +- kind: conda + name: xorg-libx11 + version: 1.8.7 + build: h8ee46fc_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda + sha256: 7a02a7beac472ae2759498550b5fc5261bf5be7a9a2b4648a3f67818a7bfefcf + md5: 49e482d882669206653b095f5206c05b + depends: + - libgcc-ng >=12 + - libxcb >=1.15,<1.16.0a0 + - xorg-kbproto + - xorg-xextproto >=7.3.0,<8.0a0 + - xorg-xproto + license: MIT + license_family: MIT + size: 828692 + timestamp: 1697056910935 +- kind: conda + name: xorg-libx11 + version: 1.8.7 + build: hefa74cf_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xorg-libx11-1.8.7-hefa74cf_0.conda + sha256: 9592f89804787267dce5bc2da6e3173d47b5b90a7adb2c5987aabfee398f5199 + md5: f655c68ee958deb0d9cba7c75490cc45 + depends: + - libxcb >=1.15,<1.16.0a0 + - m2w64-gcc-libs + - m2w64-gcc-libs-core + - xorg-kbproto + - xorg-xextproto >=7.3.0,<8.0a0 + - xorg-xproto + license: MIT + license_family: MIT + size: 816347 + timestamp: 1697057853346 +- kind: conda + name: xorg-libxau + version: 1.0.11 + build: h0dc2134_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.11-h0dc2134_0.conda + sha256: 8a2e398c4f06f10c64e69f56bcf3ddfa30b432201446a0893505e735b346619a + md5: 9566b4c29274125b0266d0177b5eb97b + license: MIT + license_family: MIT + size: 13071 + timestamp: 1684638167647 +- kind: conda + name: xorg-libxau + version: 1.0.11 + build: hb547adb_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.11-hb547adb_0.conda + sha256: 02c313a1cada46912e5b9bdb355cfb4534bfe22143b4ea4ecc419690e793023b + md5: ca73dc4f01ea91e44e3ed76602c5ea61 + license: MIT + license_family: MIT + size: 13667 + timestamp: 1684638272445 +- kind: conda + name: xorg-libxau + version: 1.0.11 + build: hcd874cb_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.11-hcd874cb_0.conda + sha256: 8c5b976e3b36001bdefdb41fb70415f9c07eff631f1f0155f3225a7649320e77 + md5: c46ba8712093cb0114404ae8a7582e1a + depends: + - m2w64-gcc-libs + - m2w64-gcc-libs-core + license: MIT + license_family: MIT + size: 51297 + timestamp: 1684638355740 +- kind: conda + name: xorg-libxau + version: 1.0.11 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda + sha256: 309751371d525ce50af7c87811b435c176915239fc9e132b99a25d5e1703f2d4 + md5: 2c80dc38fface310c9bd81b17037fee5 + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 14468 + timestamp: 1684637984591 +- kind: conda + name: xorg-libxdmcp + version: 1.1.3 + build: h27ca646_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.3-h27ca646_0.tar.bz2 + sha256: d9a2fb4762779994718832f05a7d62ab2dcf6103a312235267628b5187ce88f7 + md5: 6738b13f7fadc18725965abdd4129c36 + license: MIT + license_family: MIT + size: 18164 + timestamp: 1610071737668 +- kind: conda + name: xorg-libxdmcp + version: 1.1.3 + build: h35c211d_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.3-h35c211d_0.tar.bz2 + sha256: 485421c16f03a01b8ed09984e0b2ababdbb3527e1abf354ff7646f8329be905f + md5: 86ac76d6bf1cbb9621943eb3bd9ae36e + license: MIT + license_family: MIT + size: 17225 + timestamp: 1610071995461 +- kind: conda + name: xorg-libxdmcp + version: 1.1.3 + build: h7f98852_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2 + sha256: 4df7c5ee11b8686d3453e7f3f4aa20ceef441262b49860733066c52cfd0e4a77 + md5: be93aabceefa2fac576e971aef407908 + depends: + - libgcc-ng >=9.3.0 + license: MIT + license_family: MIT + size: 19126 + timestamp: 1610071769228 +- kind: conda + name: xorg-libxdmcp + version: 1.1.3 + build: hcd874cb_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.3-hcd874cb_0.tar.bz2 + sha256: f51205d33c07d744ec177243e5d9b874002910c731954f2c8da82459be462b93 + md5: 46878ebb6b9cbd8afcf8088d7ef00ece + depends: + - m2w64-gcc-libs + license: MIT + license_family: MIT + size: 67908 + timestamp: 1610072296570 +- kind: conda + name: xorg-libxext + version: 1.3.4 + build: h0b41bf4_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda + sha256: 73e5cfbdff41ef8a844441f884412aa5a585a0f0632ec901da035a03e1fe1249 + md5: 82b6df12252e6f32402b96dacc656fec + depends: + - libgcc-ng >=12 + - xorg-libx11 >=1.7.2,<2.0a0 + - xorg-xextproto + license: MIT + license_family: MIT + size: 50143 + timestamp: 1677036907815 +- kind: conda + name: xorg-libxext + version: 1.3.4 + build: hcd874cb_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.4-hcd874cb_2.conda + sha256: 829320f05866ea1cc51924828427f215f4d0db093e748a662e3bb68b764785a4 + md5: 2aa695ac3c56193fd8d526e3b511e021 + depends: + - m2w64-gcc-libs + - xorg-libx11 >=1.7.2,<2.0a0 + - xorg-xextproto + license: MIT + license_family: MIT + size: 221821 + timestamp: 1677038179908 +- kind: conda + name: xorg-libxpm + version: 3.5.17 + build: hcd874cb_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.17-hcd874cb_0.conda + sha256: d5cc2f026658e8b85679813bff35c16c857f873ba02489e6eb6e30d5865dacc4 + md5: 029be9b667bf3896fa28bc32adb1bfc3 + depends: + - m2w64-gcc-libs + - m2w64-gcc-libs-core + - xorg-libx11 >=1.8.6,<2.0a0 + - xorg-libxext >=1.3.4,<2.0a0 + - xorg-libxt >=1.3.0,<2.0a0 + - xorg-xextproto >=7.3.0,<8.0a0 + - xorg-xproto + license: MIT + license_family: MIT + size: 195881 + timestamp: 1696449889560 +- kind: conda + name: xorg-libxrender + version: 0.9.11 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda + sha256: 26da4d1911473c965c32ce2b4ff7572349719eaacb88a066db8d968a4132c3f7 + md5: ed67c36f215b310412b2af935bf3e530 + depends: + - libgcc-ng >=12 + - xorg-libx11 >=1.8.6,<2.0a0 + - xorg-renderproto + license: MIT + license_family: MIT + size: 37770 + timestamp: 1688300707994 +- kind: conda + name: xorg-libxt + version: 1.3.0 + build: hcd874cb_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.0-hcd874cb_1.conda + sha256: d513e0c627f098ef6655ce188eca79a672eaf763b0bbf37b228cb46dc82a66ca + md5: 511a29edd2ff3d973f63e54f19dcc06e + depends: + - m2w64-gcc-libs + - m2w64-gcc-libs-core + - xorg-kbproto + - xorg-libice >=1.1.1,<2.0a0 + - xorg-libsm >=1.2.4,<2.0a0 + - xorg-libx11 >=1.8.6,<2.0a0 + - xorg-xproto + license: MIT + license_family: MIT + size: 671704 + timestamp: 1690289114426 +- kind: conda + name: xorg-renderproto + version: 0.11.1 + build: h7f98852_1002 + build_number: 1002 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2 + sha256: 38942930f233d1898594dd9edf4b0c0786f3dbc12065a0c308634c37fd936034 + md5: 06feff3d2634e3097ce2fe681474b534 + depends: + - libgcc-ng >=9.3.0 + license: MIT + license_family: MIT + size: 9621 + timestamp: 1614866326326 +- kind: conda + name: xorg-xextproto + version: 7.3.0 + build: h0b41bf4_1003 + build_number: 1003 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda + sha256: b8dda3b560e8a7830fe23be1c58cc41f407b2e20ae2f3b6901eb5842ba62b743 + md5: bce9f945da8ad2ae9b1d7165a64d0f87 + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 30270 + timestamp: 1677036833037 +- kind: conda + name: xorg-xextproto + version: 7.3.0 + build: hcd874cb_1003 + build_number: 1003 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xorg-xextproto-7.3.0-hcd874cb_1003.conda + sha256: 04c0a08fd34fa33406c20f729e8f9cc40e8fd898072b952a5c14280fcf26f2e6 + md5: 6e6c2639620e436bddb7c040cd4f3adb + depends: + - m2w64-gcc-libs + license: MIT + license_family: MIT + size: 31034 + timestamp: 1677037259999 +- kind: conda + name: xorg-xf86vidmodeproto + version: 2.3.1 + build: h7f98852_1002 + build_number: 1002 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f98852_1002.tar.bz2 + sha256: 43398aeacad5b8753b7a1c12cb6bca36124e0c842330372635879c350c430791 + md5: 3ceea9668625c18f19530de98b15d5b0 + depends: + - libgcc-ng >=9.3.0 + license: MIT + license_family: MIT + size: 23875 + timestamp: 1620067286978 +- kind: conda + name: xorg-xproto + version: 7.0.31 + build: h7f98852_1007 + build_number: 1007 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2 + sha256: f197bb742a17c78234c24605ad1fe2d88b1d25f332b75d73e5ba8cf8fbc2a10d + md5: b4a4381d54784606820704f7b5f05a15 + depends: + - libgcc-ng >=9.3.0 + license: MIT + license_family: MIT + size: 74922 + timestamp: 1607291557628 +- kind: conda + name: xorg-xproto + version: 7.0.31 + build: hcd874cb_1007 + build_number: 1007 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xorg-xproto-7.0.31-hcd874cb_1007.tar.bz2 + sha256: b84cacba8479fa14199c9255fb62e005cacc619e90198c53b1653973709ec331 + md5: 88f3c65d2ad13826a9e0b162063be023 + depends: + - m2w64-gcc-libs + license: MIT + license_family: MIT + size: 75708 + timestamp: 1607292254607 +- kind: conda + name: xz + version: 5.2.6 + build: h166bdaf_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 + md5: 2161070d867d1b1204ea749c8eec4ef0 + depends: + - libgcc-ng >=12 + license: LGPL-2.1 and GPL-2.0 + size: 418368 + timestamp: 1660346797927 +- kind: conda + name: xz + version: 5.2.6 + build: h57fd34a_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + sha256: 59d78af0c3e071021cfe82dc40134c19dab8cdf804324b62940f5c8cd71803ec + md5: 39c6b54e94014701dd157f4f576ed211 + license: LGPL-2.1 and GPL-2.0 + size: 235693 + timestamp: 1660346961024 +- kind: conda + name: xz + version: 5.2.6 + build: h775f41a_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 + sha256: eb09823f34cc2dd663c0ec4ab13f246f45dcd52e5b8c47b9864361de5204a1c8 + md5: a72f9d4ea13d55d745ff1ed594747f10 + license: LGPL-2.1 and GPL-2.0 + size: 238119 + timestamp: 1660346964847 +- kind: conda + name: xz + version: 5.2.6 + build: h8d14728_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + sha256: 54d9778f75a02723784dc63aff4126ff6e6749ba21d11a6d03c1f4775f269fe0 + md5: 515d77642eaa3639413c6b1bc3f94219 + depends: + - vc >=14.1,<15 + - vs2015_runtime >=14.16.27033 + license: LGPL-2.1 and GPL-2.0 + size: 217804 + timestamp: 1660346976440 +- kind: conda + name: yaml + version: 0.2.5 + build: h0d85af4_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2 + sha256: 5301417e2c8dea45b401ffee8df3957d2447d4ce80c83c5ff151fc6bfe1c4148 + md5: d7e08fcf8259d742156188e8762b4d20 + license: MIT + license_family: MIT + size: 84237 + timestamp: 1641347062780 +- kind: conda + name: yaml + version: 0.2.5 + build: h3422bc3_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h3422bc3_2.tar.bz2 + sha256: 93181a04ba8cfecfdfb162fc958436d868cc37db504c58078eab4c1a3e57fbb7 + md5: 4bb3f014845110883a3c5ee811fd84b4 + license: MIT + license_family: MIT + size: 88016 + timestamp: 1641347076660 +- kind: conda + name: yaml + version: 0.2.5 + build: h7f98852_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + size: 89141 + timestamp: 1641346969816 +- kind: conda + name: yaml + version: 0.2.5 + build: h8ffe710_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 + sha256: 4e2246383003acbad9682c7c63178e2e715ad0eb84f03a8df1fbfba455dfedc5 + md5: adbfb9f45d1004a26763652246a33764 + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: MIT + license_family: MIT + size: 63274 + timestamp: 1641347623319 +- kind: conda + name: zipp + version: 3.17.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + sha256: bced1423fdbf77bca0a735187d05d9b9812d2163f60ab426fc10f11f92ecbe26 + md5: 2e4d6bc0b14e10f895fc6791a7d9b26a + depends: + - python >=3.8 + license: MIT + license_family: MIT + size: 18954 + timestamp: 1695255262261 +- kind: conda + name: zlib + version: 1.2.13 + build: h53f4e23_5 + build_number: 5 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-h53f4e23_5.conda + sha256: de0ee1e24aa6867058d3b852a15c8d7f49f262f5828772700c647186d4a96bbe + md5: a08383f223b10b71492d27566fafbf6c + depends: + - libzlib 1.2.13 h53f4e23_5 + license: Zlib + license_family: Other + size: 79577 + timestamp: 1686575471024 +- kind: conda + name: zlib + version: 1.2.13 + build: h8a1eda9_5 + build_number: 5 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h8a1eda9_5.conda + sha256: d1f4c82fd7bd240a78ce8905e931e68dca5f523c7da237b6b63c87d5625c5b35 + md5: 75a8a98b1c4671c5d2897975731da42d + depends: + - libzlib 1.2.13 h8a1eda9_5 + license: Zlib + license_family: Other + size: 90764 + timestamp: 1686575574678 +- kind: conda + name: zlib + version: 1.2.13 + build: hcfcfb64_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/zlib-1.2.13-hcfcfb64_5.conda + sha256: 0f91b719c7558046bcd37fdc7ae4b9eb2b7a8e335beb8b59ae7ccb285a46aa46 + md5: a318e8622e11663f645cc7fa3260f462 + depends: + - libzlib 1.2.13 hcfcfb64_5 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Zlib + license_family: Other + size: 107711 + timestamp: 1686575474476 +- kind: conda + name: zlib + version: 1.2.13 + build: hd590300_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda + sha256: 9887a04d7e7cb14bd2b52fa01858f05a6d7f002c890f618d9fcd864adbfecb1b + md5: 68c34ec6149623be41a1933ab996a209 + depends: + - libgcc-ng >=12 + - libzlib 1.2.13 hd590300_5 + license: Zlib + license_family: Other + size: 92825 + timestamp: 1686575231103 +- kind: conda + name: zstd + version: 1.5.5 + build: h12be248_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.5-h12be248_0.conda + sha256: d540dd56c5ec772b60e4ce7d45f67f01c6614942225885911964ea1e70bb99e3 + md5: 792bb5da68bf0a6cac6a6072ecb8dbeb + depends: + - libzlib >=1.2.13,<1.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 343428 + timestamp: 1693151615801 +- kind: conda + name: zstd + version: 1.5.5 + build: h4f39d0f_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.5-h4f39d0f_0.conda + sha256: 7e1fe6057628bbb56849a6741455bbb88705bae6d6646257e57904ac5ee5a481 + md5: 5b212cfb7f9d71d603ad891879dc7933 + depends: + - libzlib >=1.2.13,<1.3.0a0 + license: BSD-3-Clause + license_family: BSD + size: 400508 + timestamp: 1693151393180 +- kind: conda + name: zstd + version: 1.5.5 + build: h829000d_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.5-h829000d_0.conda + sha256: d54e31d3d8de5e254c0804abd984807b8ae5cd3708d758a8bf1adff1f5df166c + md5: 80abc41d0c48b82fe0f04e7f42f5cb7e + depends: + - libzlib >=1.2.13,<1.3.0a0 + license: BSD-3-Clause + license_family: BSD + size: 499383 + timestamp: 1693151312586 +- kind: conda + name: zstd + version: 1.5.5 + build: hfc55251_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda + sha256: 607cbeb1a533be98ba96cf5cdf0ddbb101c78019f1fda063261871dad6248609 + md5: 04b88013080254850d6c01ed54810589 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<1.3.0a0 + license: BSD-3-Clause + license_family: BSD + size: 545199 + timestamp: 1693151163452 diff --git a/pixi.toml b/pixi.toml new file mode 100644 index 00000000000..88227d2033d --- /dev/null +++ b/pixi.toml @@ -0,0 +1,72 @@ +[project] +name = "modflow6" +channels = ["conda-forge"] +platforms = ["win-64", "linux-64", "osx-arm64", "osx-64"] + +[tasks] +# Install +install-flopy = "pip install --no-build-isolation --no-deps --disable-pip-version-check git+https://github.com/modflowpy/flopy.git" +install-pymake = "pip install --no-build-isolation --no-deps --disable-pip-version-check git+https://github.com/modflowpy/pymake.git" +install-modflowapi = "pip install --no-build-isolation --no-deps --disable-pip-version-check git+https://github.com/MODFLOW-USGS/modflowapi.git" +install-modflow-devtools = "pip install --no-build-isolation --no-deps --disable-pip-version-check git+https://github.com/MODFLOW-USGS/modflow-devtools.git" +install = { depends_on = [ + "install-flopy", + "install-pymake", + "install-modflowapi", + "install-modflow-devtools", +] } + +# Utils +fortran-format-check = "python .github/common/fortran_format_check.py" +msvs-vfproj-check = "python .github/common/msvs_vfproj_check.py" +update-flopy = { cmd = "python update_flopy.py", cwd = "autotest" } +update-version = { cmd = "python update_version.py", cwd = "distribution" } +update-doxyfile-version = { cmd = "python update_doxyfile_version.py", cwd = ".build_rtd_docs" } +get-exes = { cmd = "pytest -v --durations 0 get_exes.py", cwd = "autotest" } +build-makefiles = "python build_makefiles.py" +deprecations = { cmd = "python deprecations.py", cwd = "doc/mf6io/mf6ivar" } +benchmark = { cmd = "python benchmark.py", cwd = "distribution" } +mk-folder-struct = { cmd = "python mk_folder_struct.py", cwd = "doc/ReleaseNotes" } + +# CI +setup-strict = "meson setup -Ddebug=false -Dwerror=true" +setup-debug = "meson setup -Doptimization=0 --prefix=$(pwd) --libdir=bin" +setup-release = "meson setup -Ddebug=false --prefix=$(pwd) --libdir=bin" +setup-release-parallel = "meson setup -Ddebug=false -Dparallel=true --prefix=$(pwd) --libdir=bin" +compile-build = "meson compile -C" +install-build = "meson install -C" +test-build = "meson test --verbose --no-rebuild -C" +test-distribution = { cmd = "pytest -v --durations 0", cwd = "distribution" } +autotest = { cmd = "pytest -v -n auto --durations 0 --keep-failed .failed", cwd = "autotest" } +autotest-marker = { cmd = "pytest -v -n auto --durations 0 --keep-failed .failed -m", cwd = "autotest" } +autotest-parallel = { cmd = "pytest -v -n auto --parallel --durations 0 -k \"test_par\" --keep-failed .failed", cwd = "autotest" } +autotest-large = { cmd = "pytest -v -n auto --durations 0 test_largetestmodels.py --keep-failed .failed", cwd = "autotest" } +sphinx = { cmd = "make html", cwd = ".build_rtd_docs" } + +[dependencies] +appdirs = "*" +filelock = "*" +flaky = "*" +fortran-language-server = "*" +fprettify = "*" +hatchling = "*" +jupytext = "*" +matplotlib = "*" +meson = "1.3.0" +networkx = "*" +ninja = "*" +numpy = "*" +pandas = "*" +pip = "*" +pydotplus = "*" +pyshp = "*" +pytest = "!=8.1.0" +pytest-benchmark = "*" +pytest-dotenv = "*" +pytest-order = "*" +pytest-xdist = "*" +python = "3.9.*" +requests = "*" +scipy = "*" +shapely = "*" +xmipy = "*" From f31f84f26b21eda2fd160c32c2ab2657a91d351d Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 3 Apr 2024 22:18:35 -0400 Subject: [PATCH 085/199] ci: refactor pixi config and usages (#1703) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add version to pixi.toml * include doc/Doxyfile and pixi.toml in update_version.py * consolidate tasks * refactor custom install as pypi dependencies * remove branch filters from push trigger in commit.yml * update dev docs: keep conda language, tidying * ignore pixi beta feature warning in ci * restore vscode config to avoid breaking contributor workflow — when vscode python * supports pixi I think we can update the tasks to use "command": "${command:python.interpreterPath}" --- .build_rtd_docs/update_doxyfile_version.py | 14 - .github/actions/test-par/action.yml | 8 +- .github/common/compile_modflow6.bat | 6 +- .github/common/test_modflow6.bat | 2 +- .github/workflows/ci.yml | 70 ++-- .github/workflows/compilers.yml | 15 +- .github/workflows/docs.yml | 18 +- .github/workflows/large.yml | 15 +- .github/workflows/pixi_auto_update.yml | 6 +- .github/workflows/release.yml | 33 +- .github/workflows/release_dispatch.yml | 14 +- .vscode/README.md | 4 +- .vscode/build_vscode.py | 18 +- .vscode/run_python.cmd | 3 +- .vscode/run_python.sh | 5 +- CONTRIBUTING.md | 2 +- DEVELOPER.md | 42 +- distribution/update_version.py | 24 ++ pixi.lock | 446 ++++++++++++++++++--- pixi.toml | 71 ++-- 20 files changed, 565 insertions(+), 251 deletions(-) delete mode 100644 .build_rtd_docs/update_doxyfile_version.py diff --git a/.build_rtd_docs/update_doxyfile_version.py b/.build_rtd_docs/update_doxyfile_version.py deleted file mode 100644 index 8755cc54c9e..00000000000 --- a/.build_rtd_docs/update_doxyfile_version.py +++ /dev/null @@ -1,14 +0,0 @@ -import sys -import os -sys.path.insert(0, os.path.abspath(os.path.join("..", "doc"))) -from version import __version__ -print("Update the Doxyfile with the latest version number") -with open("Doxyfile", "r") as fp: - lines = fp.readlines() - -tag = "PROJECT_NUMBER" -with open("Doxyfile", "w") as fp: - for line in lines: - if tag in line: - line = '{} = "version {}"\n'.format(tag, __version__) - fp.write(line) diff --git a/.github/actions/test-par/action.yml b/.github/actions/test-par/action.yml index b68a6da3137..9ff0ad8dc98 100644 --- a/.github/actions/test-par/action.yml +++ b/.github/actions/test-par/action.yml @@ -51,9 +51,9 @@ runs: shell: bash working-directory: modflow6 run: | - pixi run setup-release-parallel builddir - pixi run install-build builddir - pixi run test-build builddir + pixi run setup -Dparallel=true builddir + pixi run build builddir + pixi run test builddir - name: Show Meson logs if: failure() @@ -78,4 +78,4 @@ runs: working-directory: modflow6 env: REPOS_PATH: ${{ github.workspace }} - run: pixi run autotest-parallel + run: pixi run autotest --parallel -k "test_par" diff --git a/.github/common/compile_modflow6.bat b/.github/common/compile_modflow6.bat index 179bbc01959..fa61f33885f 100644 --- a/.github/common/compile_modflow6.bat +++ b/.github/common/compile_modflow6.bat @@ -1,5 +1,5 @@ set FC=ifort cd "%GITHUB_WORKSPACE%\modflow6" -pixi run setup-release-parallel builddir -pixi run install-build builddir -pixi run test-build builddir +pixi run setup -Dparallel=true builddir +pixi run build builddir +pixi run test builddir diff --git a/.github/common/test_modflow6.bat b/.github/common/test_modflow6.bat index 68dcf45f727..1ea8626f126 100644 --- a/.github/common/test_modflow6.bat +++ b/.github/common/test_modflow6.bat @@ -1,4 +1,4 @@ cd "%GITHUB_WORKSPACE%\modflow6\autotest" where libpetsc.dll ldd ..\bin\mf6 -pixi run autotest-parallel +pixi run autotest --parallel -k "test_par" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ae52964dc0d..dcd7632e787 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,8 +1,6 @@ name: MODFLOW 6 continuous integration on: push: - branches: [master, develop, update/pixi-lock] - tags: ["*"] paths-ignore: - '**.md' - '**.pdf' @@ -40,6 +38,8 @@ on: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true +env: + PIXI_BETA_WARNING_OFF: true jobs: lint: name: Check format @@ -84,17 +84,17 @@ jobs: pixi-version: "latest" - name: Meson setup - run: pixi run setup-strict builddir + run: pixi run setup -Dwerror=true builddir - name: Meson compile - run: pixi run compile-build builddir + run: pixi run build builddir - name: Show build log if: failure() run: cat builddir/meson-logs/meson-log.txt - name: Meson test - run: pixi run test-build builddir + run: pixi run test builddir smoke_test: name: Smoke test @@ -123,14 +123,11 @@ jobs: compiler: gcc version: ${{ env.FC_V }} - - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup pixi + uses: prefix-dev/setup-pixi@v0.5.1 with: pixi-version: "latest" manifest-path: "modflow6/pixi.toml" - - - name: Setup pixi - working-directory: modflow6 - run: pixi run install - name: Build test-drive working-directory: test-drive @@ -142,8 +139,8 @@ jobs: - name: Build modflow6 working-directory: modflow6 run: | - pixi run setup-release builddir - pixi run install-build builddir + pixi run setup builddir + pixi run build builddir - name: Show build log if: failure() @@ -152,7 +149,7 @@ jobs: - name: Unit test programs working-directory: modflow6 - run: pixi run test-build builddir + run: pixi run test builddir - name: Update flopy working-directory: modflow6 @@ -168,7 +165,7 @@ jobs: working-directory: modflow6 run: | if [ "${{ github.ref_name }}" == "master" ]; then - pixi run autotest-marker "not slow and not regression and not developmode" + pixi run autotest -m "not slow and not regression and not developmode" else pixi run autotest fi @@ -221,20 +218,17 @@ jobs: compiler: gcc version: ${{ env.FC_V }} - - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup pixi + uses: prefix-dev/setup-pixi@v0.5.1 with: pixi-version: "latest" manifest-path: "modflow6/pixi.toml" - - name: Setup pixi - working-directory: modflow6 - run: pixi run install - - name: Build modflow6 working-directory: modflow6 run: | - pixi run setup-release builddir - pixi run install-build builddir + pixi run setup builddir + pixi run build builddir - name: Show build log if: failure() @@ -243,7 +237,7 @@ jobs: - name: Unit test programs working-directory: modflow6 - run: pixi run test-build builddir + run: pixi run test builddir - name: Update flopy working-directory: modflow6 @@ -261,9 +255,9 @@ jobs: REPOS_PATH: ${{ github.workspace }} run: | if [ "${{ github.ref_name }}" == "master" ]; then - pixi run autotest-marker "not large and not developmode" + pixi run autotest -m "not large and not developmode" else - pixi run autotest-marker "not large" + pixi run autotest -m "not large" fi - name: Upload failed test output @@ -299,7 +293,7 @@ jobs: working-directory: modflow6 env: GITHUB_TOKEN: ${{ github.token }} - run: pixi run test-distribution + run: pixi run test-dist-scripts test_intel_fortran: name: Test intel fortran @@ -337,14 +331,11 @@ jobs: repository: MODFLOW-USGS/modflow6-examples path: modflow6-examples - - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup pixi + uses: prefix-dev/setup-pixi@v0.5.1 with: pixi-version: "latest" manifest-path: "modflow6/pixi.toml" - - - name: Setup pixi - working-directory: modflow6 - run: pixi run install - name: Setup ${{ env.FC }} ${{ env.FC_V }} uses: fortran-lang/setup-fortran@v1 @@ -359,8 +350,8 @@ jobs: - name: Build modflow6 working-directory: modflow6 run: | - pixi run setup-release builddir - pixi run install-build builddir + pixi run setup builddir + pixi run build builddir - name: Show build log if: failure() @@ -369,7 +360,7 @@ jobs: - name: Unit test programs working-directory: modflow6 - run: pixi run test-build builddir + run: pixi run test builddir - name: Update flopy working-directory: modflow6 @@ -387,9 +378,9 @@ jobs: REPOS_PATH: ${{ github.workspace }} run: | if [ "${{ github.ref_name }}" == "master" ]; then - pixi run autotest-marker "not large and not developmode" + pixi run autotest -m "not large and not developmode" else - pixi run autotest-marker "not large" + pixi run autotest -m "not large" fi - name: Upload failed test output @@ -403,7 +394,7 @@ jobs: working-directory: modflow6 env: GITHUB_TOKEN: ${{ github.token }} - run: pixi run test-distribution + run: pixi run test-dist-scripts parallel_test: name: Parallel testing @@ -427,14 +418,11 @@ jobs: with: path: modflow6 - - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup pixi + uses: prefix-dev/setup-pixi@v0.5.1 with: pixi-version: "latest" manifest-path: "modflow6/pixi.toml" - - - name: Setup pixi - working-directory: modflow6 - run: pixi run install - name: Test parallel MF6 if: runner.os != 'Windows' diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index bf73aa7d719..79220b01909 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -3,6 +3,8 @@ on: # workflow_dispatch trigger to start release via GitHub UI or CLI, see # https://docs.github.com/en/actions/managing-workflow-runs/manually-running-a-workflow workflow_dispatch: +env: + PIXI_BETA_WARNING_OFF: true jobs: test: name: Test @@ -157,20 +159,17 @@ jobs: compiler: ${{ matrix.compiler}} version: ${{ matrix.version }} - - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup pixi + uses: prefix-dev/setup-pixi@v0.5.1 with: pixi-version: "latest" manifest-path: "modflow6/pixi.toml" - - - name: Setup pixi - working-directory: modflow6 - run: pixi run install - name: Build modflow6 working-directory: modflow6 run: | - pixi run setup-release builddir - pixi run install-build builddir + pixi run setup builddir + pixi run build builddir - name: Show build log if: failure() @@ -187,7 +186,7 @@ jobs: - name: Unit test programs if: success() working-directory: modflow6 - run: pixi run test-build builddir + run: pixi run test builddir - name: Create compile report if: success() || failure() diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index d31b26d4e12..62884e7a075 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -12,6 +12,8 @@ on: paths-ignore: - '.github/workflows/release.yml' - '.hpc/**' +env: + PIXI_BETA_WARNING_OFF: true jobs: rtd_build: name: Build ReadTheDocs @@ -40,14 +42,11 @@ jobs: repository: MODFLOW-USGS/usgslatex path: usgslatex - - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup pixi + uses: prefix-dev/setup-pixi@v0.5.1 with: pixi-version: "latest" manifest-path: "modflow6/pixi.toml" - - - name: Setup pixi - working-directory: modflow6 - run: pixi run install - name: Install additional packages for Sphinx using pip working-directory: modflow6/.build_rtd_docs @@ -185,12 +184,10 @@ jobs: sudo apt-get update sudo apt-get install doxygen graphviz - - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup pixi + uses: prefix-dev/setup-pixi@v0.5.1 with: pixi-version: "latest" - - - name: Setup pixi - run: pixi run install - name: Print python package versions run: pixi run pip list @@ -198,9 +195,6 @@ jobs: - name: update MODFLOW 6 version run: pixi run update-version - - name: update MODFLOW 6 version in Doxyfile - run: pixi run update-doxyfile-version - - name: run doxygen run: doxygen working-directory: ${{env.working-directory}} diff --git a/.github/workflows/large.yml b/.github/workflows/large.yml index a52b35b20c3..fd58cf75676 100644 --- a/.github/workflows/large.yml +++ b/.github/workflows/large.yml @@ -6,6 +6,8 @@ on: # workflow_dispatch trigger to run tests via GitHub UI or CLI, # see https://docs.github.com/en/actions/managing-workflow-runs/manually-running-a-workflow workflow_dispatch: +env: + PIXI_BETA_WARNING_OFF: true jobs: # caching only necessary on Windows cache_ifort: @@ -64,14 +66,11 @@ jobs: repository: MODFLOW-USGS/modflow6-largetestmodels path: modflow6-largetestmodels - - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup pixi + uses: prefix-dev/setup-pixi@v0.5.1 with: pixi-version: "latest" manifest-path: "modflow6/pixi.toml" - - - name: Setup pixi - working-directory: modflow6 - run: pixi run install - name: Setup ${{ matrix.compiler }} ${{ matrix.version }} uses: fortran-lang/setup-fortran@v1 @@ -82,8 +81,8 @@ jobs: - name: Build modflow6 working-directory: modflow6 run: | - pixi run setup-release builddir - pixi run install-build builddir + pixi run setup builddir + pixi run build builddir - name: Get executables working-directory: modflow6 @@ -97,7 +96,7 @@ jobs: - name: Run tests working-directory: modflow6 - run: pixi run autotest-large + run: pixi run autotest -m "large" - name: Upload failed test output if: failure() diff --git a/.github/workflows/pixi_auto_update.yml b/.github/workflows/pixi_auto_update.yml index 0b909659944..200ae9da00b 100644 --- a/.github/workflows/pixi_auto_update.yml +++ b/.github/workflows/pixi_auto_update.yml @@ -1,19 +1,17 @@ name: Pixi auto update - on: schedule: # At 03:00 on day 3 of the month - cron: "0 3 3 * *" # on demand workflow_dispatch: - +env: + PIXI_BETA_WARNING_OFF: true jobs: auto-update: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - with: - ssh-key: ${{ secrets.SSH_PRIVATE_KEY }} - uses: prefix-dev/setup-pixi@v0.5.1 with: pixi-version: "latest" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 59b91e24e46..027117d9307 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -54,6 +54,8 @@ on: distname: description: 'Distribution name used for release' value: ${{ jobs.build.outputs.distname }} +env: + PIXI_BETA_WARNING_OFF: true jobs: build: name: Build binaries (${{ matrix.os }}, parallel=${{ matrix.parallel }}) @@ -96,14 +98,11 @@ jobs: path: modflow6 ref: ${{ inputs.branch }} - - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup pixi + uses: prefix-dev/setup-pixi@v0.5.1 with: pixi-version: "latest" manifest-path: "modflow6/pixi.toml" - - - name: Setup pixi - working-directory: modflow6 - run: pixi run install - name: Setup ${{ matrix.compiler }} ${{ matrix.version }} if: (!(runner.os == 'Windows' && matrix.parallel)) @@ -170,9 +169,9 @@ jobs: if: (!(runner.os == 'Windows' && matrix.parallel)) working-directory: modflow6 run: | - pixi run setup-release builddir - pixi run install-build builddir - pixi run test-build builddir + pixi run setup builddir + pixi run build builddir + pixi run test builddir - name: Check architecture (macOS) working-directory: modflow6/bin @@ -263,7 +262,7 @@ jobs: if [[ "${{ inputs.developmode }}" == "false" ]]; then markers="$markers and not developmode" fi - pixi run autotest-markers "$markers" + pixi run autotest -m "$markers" - name: Upload failed test output if: failure() @@ -301,7 +300,7 @@ jobs: working-directory: modflow6/distribution env: GITHUB_TOKEN: ${{ github.token }} - run: pixi run test-distribution + run: pixi run test-dist-scripts docs: name: Build docs @@ -344,14 +343,11 @@ jobs: working-directory: usgslatex/usgsLaTeX run: sudo ./install.sh --all-users - - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup pixi + uses: prefix-dev/setup-pixi@v0.5.1 with: pixi-version: "latest" manifest-path: "modflow6/pixi.toml" - - - name: Setup pixi - working-directory: modflow6 - run: pixi run install - name: Setup ${{ inputs.compiler_toolchain }} ${{ inputs.compiler_version }} uses: fortran-lang/setup-fortran@v1 @@ -507,14 +503,11 @@ jobs: repository: MODFLOW-USGS/modflow6-examples path: modflow6-examples - - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup pixi + uses: prefix-dev/setup-pixi@v0.5.1 with: pixi-version: "latest" manifest-path: "modflow6/pixi.toml" - - - name: Setup pixi - working-directory: modflow6 - run: pixi run install - name: Setup ${{ inputs.compiler_toolchain }} ${{ inputs.compiler_version }} uses: fortran-lang/setup-fortran@v1 diff --git a/.github/workflows/release_dispatch.yml b/.github/workflows/release_dispatch.yml index e889d1c2486..f033b38c84f 100644 --- a/.github/workflows/release_dispatch.yml +++ b/.github/workflows/release_dispatch.yml @@ -157,14 +157,11 @@ jobs: repository: ${{ github.repository_owner }}/modflow6 ref: ${{ github.ref }} - - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup pixi + uses: prefix-dev/setup-pixi@v0.5.1 with: pixi-version: "latest" manifest-path: "modflow6/pixi.toml" - - - name: Setup pixi - working-directory: modflow6 - run: pixi run install - name: Update version working-directory: distribution @@ -219,14 +216,11 @@ jobs: repository: ${{ github.repository_owner }}/modflow6 path: modflow6 - - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup pixi + uses: prefix-dev/setup-pixi@v0.5.1 with: pixi-version: "latest" manifest-path: "modflow6/pixi.toml" - - - name: Setup pixi - working-directory: modflow6 - run: pixi run install - name: Download artifacts uses: dawidd6/action-download-artifact@v3 diff --git a/.vscode/README.md b/.vscode/README.md index 93941be54b3..962fe1d07b2 100644 --- a/.vscode/README.md +++ b/.vscode/README.md @@ -41,10 +41,10 @@ In general, to determine the path of an installed tool in your environment run: - cmd: `where `, e.g. `where python` - PowerShell: `Get-Command ` e.g. `Get-Command fprettify` -1. Activate the pixi environment: +1. Activate the conda environment: ```bash -pixi shell +conda activate modflow6 ``` 2. Determine the path of `fortls` and `fprettify` diff --git a/.vscode/build_vscode.py b/.vscode/build_vscode.py index 654e70fca42..d222cc7c772 100644 --- a/.vscode/build_vscode.py +++ b/.vscode/build_vscode.py @@ -21,8 +21,22 @@ if args.action == "rebuild" and os.path.isdir(builddir): shutil.rmtree(builddir) +if args.buildtype == "release": + setup_flag = ["-Doptimization=2"] +elif args.buildtype == "debug": + setup_flag = ["-Ddebug=true", "-Doptimization=0"] + if not os.path.isdir(builddir): - command = ["pixi", "run", f"setup-{args.buildtype}", builddir, arg_parallel] + command = [ + "meson", + "setup", + builddir, + "--prefix", + os.getcwd(), + "--libdir", + "bin", + arg_parallel, + ] + setup_flag print("Run:", shlex.join(command)) subprocess.run( command, @@ -37,6 +51,6 @@ if os.path.isfile(path): os.remove(path) -command = ["pixi", "run", "install-build", builddir] +command = ["meson", "install", "-C", builddir] print("Run:", shlex.join(command)) subprocess.run(command, check=True) diff --git a/.vscode/run_python.cmd b/.vscode/run_python.cmd index 43318bc5015..87c6f3de58b 100644 --- a/.vscode/run_python.cmd +++ b/.vscode/run_python.cmd @@ -4,6 +4,7 @@ if "%3" == "ifort" ( call "C:\Program Files (x86)\Intel\oneAPI\setvars.bat" ) +call conda activate modflow6 rem run python script -pixi run python %1 %2 %3 %4 %5 %6 +python %1 %2 %3 %4 %5 %6 diff --git a/.vscode/run_python.sh b/.vscode/run_python.sh index 6977d7a2fe1..cbd3b27fcc9 100755 --- a/.vscode/run_python.sh +++ b/.vscode/run_python.sh @@ -5,5 +5,8 @@ then source /opt/intel/oneapi/setvars.sh fi +eval "$(conda shell.bash hook)" +conda activate modflow6 + # run python script -pixi run python $1 $2 $3 $4 $5 $6 +python $1 $2 $3 $4 $5 $6 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5845a06f4b6..0882133457c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -141,7 +141,7 @@ To ensure consistency throughout the source code, keep these rules in mind as yo ## Format Rules Fortran souce code format rules are met by running the -[fprettify formatter](https://github.com/pseewald/fprettify) while specifying the [MODFLOW 6 fprettify configuration](.fprettify.yaml). `fprettify` is included in the pixi environment and can be run on the command line or integrated into a [VSCode](.vscode/README.md) or Visual Studio environment. +[fprettify formatter](https://github.com/pseewald/fprettify) while specifying the [MODFLOW 6 fprettify configuration](.fprettify.yaml). `fprettify` is included in the conda and pixi environments and can be run on the command line or integrated into a [VSCode](.vscode/README.md) or Visual Studio environment. The configuration file reflects the current minimum standard for Fortran source formatting. The main goal, however, is consistent and readable Fortran source code and as such pay particular attention to consistency within and across files. As the formatting tool may at times shift code in unexpected ways, check for formatting consistency after running. diff --git a/DEVELOPER.md b/DEVELOPER.md index 61d5f3ec853..a8b194bef1d 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -179,12 +179,10 @@ The following tables are automatically generated by [a CI workflow](.github/work ### Python -Python 3.8+ is required to run MODFLOW 6 tests. Using Python from the pixi environment is recommended. -The installation docs can be found [here](https://pixi.sh). -After installing pixi, you can trigger the installation process as follows: +Python 3.8+ is required to run MODFLOW 6 tests. Using Python via Pixi is recommended. Pixi installation docs can be found [here](https://pixi.sh). After installing `pixi`, to set up an environment with all development dependencies, run: ``` -pixi run install +pixi install ``` #### Dependencies @@ -195,20 +193,21 @@ This project depends critically on a few Python packages for building, linting a - `fprettify` - `pymake` - `flopy` +- `modflow-devtools` -These are each described briefly below. The `pixi.toml` contains a number of other dependencies also required for various development tasks, but they are not described in detail here. +These are each described briefly below. These and a number of other dependencies are build-, test-, or release-time dependencies are included the Pixi environment `pixi.toml` as well as the Conda `environment.yml` file in this repository. ##### `meson` -[Meson](https://mesonbuild.com/index.html) is recommended for building MODFLOW 6 and is included in `pixi.toml`. It can also be [installed independently](https://mesonbuild.com/Getting-meson.html) — note that if you do so you will need to manually add the executable to the [PATH](https://en.wikipedia.org/wiki/PATH_(variable)). +[Meson](https://mesonbuild.com/index.html) is the recommended build system for MODFLOW 6. ##### `fprettify` -[`fprettify`](https://github.com/pseewald/fprettify) can be used to format Fortran source code and in combination with the [MODFLOW 6 fprettify configuration](.fprettify.yaml) establishes a contribution standard for properly formatted MODFLOW 6 Fortran source. This tool can be installed with `pip` or `conda` and used from the command line or integrated with a [VSCode](.vscode/README.md) or Visual Studio development environment. The `fprettify` package is included in the Pixi environment in `pixi.toml`. See [contribution guidelines](CONTRIBUTING.md) for additional information. +[`fprettify`](https://github.com/pseewald/fprettify) can be used to format Fortran source code and in combination with the [MODFLOW 6 fprettify configuration](.fprettify.yaml) establishes a contribution standard for properly formatted MODFLOW 6 Fortran source. This tool can be used from the command line or integrated with a [VSCode](.vscode/README.md) or Visual Studio development environment. See [contribution guidelines](CONTRIBUTING.md) for additional information. ##### `mfpymake` -The `mfpymake` package can build MODFLOW 6 and related programs and artifacts (e.g. makefiles), and is used in particular by the `distribution/build_makefiles.py` script. `mfpymake` is included in `pixi.toml`. To install separately, follow the instructions as explained on the README of the [repository](https://github.com/modflowpy/pymake). The README also demonstrates basic usage. +The `mfpymake` package can build MODFLOW 6 and related programs and artifacts (e.g. makefiles), and is used in particular by the `distribution/build_makefiles.py` script. ##### `flopy` @@ -218,7 +217,7 @@ Like MODFLOW 6, `flopy` is modular — for each MODFLOW 6 package there is g ##### `modflow-devtools` -The tests use a set of shared fixtures and utilities provided by the [`modflow-devtools`](https://github/com/MODFLOW-USGS/modflow-devtools) package. This package is included in the Pixi environment in `pixi.toml`. +The tests use a set of shared fixtures and utilities provided by the [`modflow-devtools`](https://github/com/MODFLOW-USGS/modflow-devtools) package. ### Optional tools @@ -259,7 +258,7 @@ git remote add upstream https://github.com/MODFLOW-USGS/modflow6.git ## Building -Meson is the recommended build tool for MODFLOW 6. [Meson](https://mesonbuild.com/Getting-meson.html) must be installed and on your [PATH](https://en.wikipedia.org/wiki/PATH_(variable)). Creating and activating the Pixi environment `pixi.toml` should be sufficient for this. +Meson is the recommended build tool for MODFLOW 6. [Meson](https://mesonbuild.com/Getting-meson.html) must be installed and on your [PATH](https://en.wikipedia.org/wiki/PATH_(variable)). Creating and activating the provided Pixi or Conda environment should be sufficient for this. Meson build configuration files are provided for MODFLOW 6, for the ZONEBUDGET and MODFLOW 2005 to 6 converter utility programs, and for Fortran unit tests (see [Testing](#testing) section below). @@ -272,36 +271,29 @@ To build MODFLOW 6, first configure the build directory. Depending on which task you use, meson will configure a debug or release build. Setup a debug build: -```shell -pixi run setup-debug builddir -``` -Or alternatively, setup a release build ```shell -pixi run setup-release builddir +pixi run setup -Ddebug=true -Doptimization=0 builddir ``` -Compile MODFLOW 6 by executing: - +Or alternatively, setup a release build ```shell -pixi run compile-build builddir +pixi run setup builddir ``` -In order to run the tests the binaries have to be installed: +Compile MODFLOW 6 and install binaries to the `bin` folder by executing: ```shell -pixi run install-build builddir +pixi run build builddir ``` -The binaries can then be found in the `bin` folder. `meson install` also triggers a compilation if necessary, so executing `meson install` is enough to get up-to-date binaries in the `bin` folder. - **Note:** If using Visual Studio Code, you can use tasks as described [here](.vscode/README.md) to automate the above. ## Testing MODFLOW 6 unit tests are written in Fortran with [`test-drive`](https://github.com/fortran-lang/test-drive). -MODFLOW 6 integration tests are written in Python with [`pytest`](https://docs.pytest.org/en/7.1.x/). Integration testing dependencies are included in the Pixi environment `pixi.toml`. +MODFLOW 6 integration tests are written in Python with [`pytest`](https://docs.pytest.org/en/7.1.x/). Integration testing dependencies are included in Pixi and Conda environments. **Note:** the entire test suite should pass before a pull request is submitted. Tests run in GitHub Actions CI and a PR can only be merged with passing tests. See [`CONTRIBUTING.md`](CONTRIBUTING.md) for more information. @@ -392,14 +384,14 @@ MODFLOW 6 has two kinds of tests: Fortran unit tests, driven with Meson, and Pyt Unit tests must be run from the project root. To run unit tests in verbose mode: ```shell -pixi run test-build builddir +pixi run test builddir ``` Unit tests can be selected by module name (as listed in `autotest/tester.f90`). For instance, to test the `ArrayHandlersModule`: ```shell -pixi run test-build builddir --verbose ArrayHandlers +pixi run test builddir --verbose ArrayHandlers ``` To run a test module in the `gdb` debugger, just add the `--gdb` flag to the test command. diff --git a/distribution/update_version.py b/distribution/update_version.py index 282c53593b4..7f1cd33f8f0 100755 --- a/distribution/update_version.py +++ b/distribution/update_version.py @@ -316,6 +316,28 @@ def update_codejson(version: Version, timestamp: datetime, approved: bool = Fals log_update(path, version) +def update_doxyfile(version: Version): + path = project_root_path / ".build_rtd_docs" / "Doxyfile" + lines = open(path, "r").readlines() + tag = "PROJECT_NUMBER" + with open(path, "w") as fp: + for line in lines: + if tag in line: + line = f'{tag} = "version {version}"\n' + fp.write(line) + + +def update_pixi(version: Version): + path = project_root_path / "pixi.toml" + lines = open(path, "r").readlines() + tag = "version =" + with open(path, "w") as fp: + for line in lines: + if tag in line: + line = f'{tag} "{version}"\n' + fp.write(line) + + def update_version( version: Version = None, timestamp: datetime = datetime.now(), @@ -345,6 +367,8 @@ def update_version( update_readme_and_disclaimer(version, approved) update_citation_cff(version, timestamp) update_codejson(version, timestamp, approved) + update_doxyfile(version) + update_pixi(version) finally: lock_path.unlink(missing_ok=True) diff --git a/pixi.lock b/pixi.lock index adf4f04e1ca..d12811c8759 100644 --- a/pixi.lock +++ b/pixi.lock @@ -136,6 +136,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mfpymake-1.2.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.4-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda @@ -155,7 +156,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39had0adad_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py39h90c7501_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda @@ -229,6 +230,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda + - pypi: git+https://github.com/modflowpy/flopy.git@4c44cb0d9d6ef02c092938dad943cdb8285f82a7 + - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@e65c4d3304f0230345d6f1d4d8f911e0c2eb7c64 + - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@c6811fded7d832506c8bf98cef9ffffa31e2da3b osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/atk-1.0-2.38.0-h1d18e73_1.tar.bz2 @@ -325,6 +329,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mfpymake-1.2.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda @@ -339,7 +344,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.50.14-h19c1c8a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.43-h0ad2156_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.2.0-py39hdd30358_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.3.0-py39h9dabb2a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.43.4-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda @@ -391,6 +396,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h8a1eda9_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.5-h829000d_0.conda + - pypi: git+https://github.com/modflowpy/flopy.git@4c44cb0d9d6ef02c092938dad943cdb8285f82a7 + - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@e65c4d3304f0230345d6f1d4d8f911e0c2eb7c64 + - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@c6811fded7d832506c8bf98cef9ffffa31e2da3b osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hcb7b3dd_1.tar.bz2 @@ -487,6 +495,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mfpymake-1.2.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda @@ -501,7 +510,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.50.14-hcf40dda_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.43-h26f9a81_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.2.0-py39h755f0b7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.3.0-py39h3352c98_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.43.4-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda @@ -553,6 +562,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-h53f4e23_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.5-h4f39d0f_0.conda + - pypi: git+https://github.com/modflowpy/flopy.git@4c44cb0d9d6ef02c092938dad943cdb8285f82a7 + - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@e65c4d3304f0230345d6f1d4d8f911e0c2eb7c64 + - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@c6811fded7d832506c8bf98cef9ffffa31e2da3b win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda @@ -607,7 +619,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.0.0-h57928b3_49841.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_964.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda @@ -654,6 +666,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mfpymake-1.2.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.0.0-h66d3029_49657.conda - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 @@ -669,7 +682,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.50.14-h07c897b_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.43-h17e33f8_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-10.2.0-py39h368b509_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-10.3.0-py39h9ee4981_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.43.4-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda @@ -742,6 +755,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.2.13-hcfcfb64_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.5-h12be248_0.conda + - pypi: git+https://github.com/modflowpy/flopy.git@4c44cb0d9d6ef02c092938dad943cdb8285f82a7 + - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@e65c4d3304f0230345d6f1d4d8f911e0c2eb7c64 + - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@c6811fded7d832506c8bf98cef9ffffa31e2da3b packages: - kind: conda name: _libgcc_mutex @@ -800,6 +816,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/appdirs size: 12840 timestamp: 1603108499239 - kind: conda @@ -885,6 +903,8 @@ packages: - python >=3.7 license: MIT license_family: MIT + purls: + - pkg:pypi/attrs size: 54582 timestamp: 1704011393776 - kind: conda @@ -1443,6 +1463,8 @@ packages: - python >=3.7 license: MIT license_family: MIT + purls: + - pkg:pypi/charset-normalizer size: 46597 timestamp: 1698833765762 - kind: conda @@ -1459,6 +1481,8 @@ packages: - python >=3.8 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/click size: 84437 timestamp: 1692311973840 - kind: conda @@ -1476,6 +1500,8 @@ packages: - python >=3.8 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/click size: 85051 timestamp: 1692312207348 - kind: conda @@ -1491,6 +1517,8 @@ packages: - python >=3.7 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/colorama size: 25170 timestamp: 1666700778190 - kind: conda @@ -1506,6 +1534,8 @@ packages: - python >=3.5 license: MIT license_family: MIT + purls: + - pkg:pypi/configargparse size: 39491 timestamp: 1690138171226 - kind: conda @@ -1525,6 +1555,8 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/contourpy size: 185949 timestamp: 1699042094923 - kind: conda @@ -1543,6 +1575,8 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/contourpy size: 230650 timestamp: 1699041727321 - kind: conda @@ -1561,6 +1595,8 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/contourpy size: 237856 timestamp: 1699042102939 - kind: conda @@ -1580,6 +1616,8 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/contourpy size: 223476 timestamp: 1699042196671 - kind: conda @@ -1595,6 +1633,8 @@ packages: - python >=3.8 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/cycler size: 13458 timestamp: 1696677888423 - kind: conda @@ -1627,6 +1667,8 @@ packages: - python >=3.7 license: MIT license_family: MIT + purls: + - pkg:pypi/editables size: 10988 timestamp: 1705857085102 - kind: conda @@ -1642,6 +1684,8 @@ packages: depends: - python >=3.7 license: MIT and PSF-2.0 + purls: + - pkg:pypi/exceptiongroup size: 20551 timestamp: 1704921321122 - kind: conda @@ -1657,6 +1701,8 @@ packages: - python >=3.7 license: MIT license_family: MIT + purls: + - pkg:pypi/execnet size: 36534 timestamp: 1688933537234 - kind: conda @@ -1728,6 +1774,8 @@ packages: depends: - python >=3.7 license: Unlicense + purls: + - pkg:pypi/filelock size: 15611 timestamp: 1711394721380 - kind: conda @@ -1743,8 +1791,62 @@ packages: - python >=3.6 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/flaky size: 22156 timestamp: 1710293112378 +- kind: pypi + name: flopy + version: 3.7.0.dev0 + url: git+https://github.com/modflowpy/flopy.git@4c44cb0d9d6ef02c092938dad943cdb8285f82a7 + requires_dist: + - numpy <2.0.0, >=1.15.0 + - matplotlib >=1.4.0 + - pandas >=2.0.0 + - flopy[doc,lint,optional,test] ; extra == 'dev' + - flopy[optional] ; extra == 'doc' + - ipython[kernel] ; extra == 'doc' + - jupytext ; extra == 'doc' + - myst-parser ; extra == 'doc' + - nbconvert <7.14.0 ; extra == 'doc' + - nbsphinx ; extra == 'doc' + - pyyaml ; extra == 'doc' + - rtds-action ; extra == 'doc' + - sphinx ==7.1.2 ; extra == 'doc' + - sphinx-rtd-theme >=1 ; extra == 'doc' + - cffconvert ; extra == 'lint' + - ruff ; extra == 'lint' + - affine ; extra == 'optional' + - descartes ; extra == 'optional' + - fiona ; extra == 'optional' + - geojson ; extra == 'optional' + - geopandas ; extra == 'optional' + - imageio ; extra == 'optional' + - netcdf4 ; extra == 'optional' + - pyproj ; extra == 'optional' + - pyshp ; extra == 'optional' + - pyvista ; extra == 'optional' + - rasterio ; extra == 'optional' + - rasterstats ; extra == 'optional' + - scipy ; extra == 'optional' + - shapely >=1.8 ; extra == 'optional' + - vtk ; extra == 'optional' + - xmipy ; extra == 'optional' + - pymetis ; platform_system != 'Windows' and extra == 'optional' + - flopy[lint] ; extra == 'test' + - coverage ; extra == 'test' + - flaky ; extra == 'test' + - filelock ; extra == 'test' + - jupyter ; extra == 'test' + - jupytext ; extra == 'test' + - modflow-devtools ; extra == 'test' + - pytest !=8.1.0 ; extra == 'test' + - pytest-benchmark ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-dotenv ; extra == 'test' + - pytest-xdist ; extra == 'test' + - virtualenv ; extra == 'test' + requires_python: '>=3.8' - kind: conda name: font-ttf-dejavu-sans-mono version: '2.37' @@ -1918,6 +2020,8 @@ packages: - unicodedata2 >=14.0.0 license: MIT license_family: MIT + purls: + - pkg:pypi/fonttools size: 2180527 timestamp: 1710865966262 - kind: conda @@ -1936,6 +2040,8 @@ packages: - unicodedata2 >=14.0.0 license: MIT license_family: MIT + purls: + - pkg:pypi/fonttools size: 2218023 timestamp: 1710866172054 - kind: conda @@ -1957,6 +2063,8 @@ packages: - vc14_runtime >=14.29.30139 license: MIT license_family: MIT + purls: + - pkg:pypi/fonttools size: 1877377 timestamp: 1710866233893 - kind: conda @@ -1976,6 +2084,8 @@ packages: - unicodedata2 >=14.0.0 license: MIT license_family: MIT + purls: + - pkg:pypi/fonttools size: 2287520 timestamp: 1710865721782 - kind: conda @@ -2920,6 +3030,8 @@ packages: - trove-classifiers license: MIT license_family: MIT + purls: + - pkg:pypi/hatchling size: 62671 timestamp: 1711286880652 - kind: conda @@ -2990,6 +3102,8 @@ packages: - python >=3.6 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/idna size: 50124 timestamp: 1701027126206 - kind: conda @@ -3040,6 +3154,8 @@ packages: - importlib-resources >=6.4.0,<6.4.1.0a0 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/importlib-resources size: 33056 timestamp: 1711041009039 - kind: conda @@ -3055,21 +3171,23 @@ packages: - python >=3.7 license: MIT license_family: MIT + purls: + - pkg:pypi/iniconfig size: 11101 timestamp: 1673103208955 - kind: conda name: intel-openmp - version: 2024.0.0 - build: h57928b3_49841 - build_number: 49841 + version: 2024.1.0 + build: h57928b3_964 + build_number: 964 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.0.0-h57928b3_49841.conda - sha256: 6ee8eb9080bb3268654e015dd17ad79d0c1ea98b2eee6b928ecd27f01d6b38e8 - md5: e3255c8cdaf1d52f15816d1970f9c77a + url: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_964.conda + sha256: bea54e995cd79b0961ded5f0d6d1b8a55513283ccda74cedb3421a3764f7d679 + md5: 30ebb9fd99666d8b8675fcee541a09f3 license: LicenseRef-ProprietaryIntel license_family: Proprietary - size: 2325424 - timestamp: 1706182537883 + size: 1616281 + timestamp: 1712153179165 - kind: conda name: jinja2 version: 3.1.3 @@ -3084,6 +3202,8 @@ packages: - python >=3.7 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/jinja2 size: 111589 timestamp: 1704967140287 - kind: conda @@ -3122,6 +3242,8 @@ packages: - referencing >=0.31.0 license: MIT license_family: MIT + purls: + - pkg:pypi/jsonschema-specifications size: 16431 timestamp: 1703778502971 - kind: conda @@ -3213,6 +3335,8 @@ packages: - toml license: MIT license_family: MIT + purls: + - pkg:pypi/jupytext size: 102909 timestamp: 1705172248226 - kind: conda @@ -3245,6 +3369,8 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/kiwisolver size: 55660 timestamp: 1695380433980 - kind: conda @@ -3263,6 +3389,8 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/kiwisolver size: 73457 timestamp: 1695380118523 - kind: conda @@ -3280,6 +3408,8 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/kiwisolver size: 60498 timestamp: 1695380322018 - kind: conda @@ -3298,6 +3428,8 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/kiwisolver size: 62080 timestamp: 1695380521068 - kind: conda @@ -5806,6 +5938,8 @@ packages: - python >=3.8 license: MIT license_family: MIT + purls: + - pkg:pypi/markdown-it-py size: 64356 timestamp: 1686175179621 - kind: conda @@ -5824,6 +5958,8 @@ packages: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/markupsafe size: 23827 timestamp: 1706900341193 - kind: conda @@ -5841,6 +5977,8 @@ packages: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/markupsafe size: 23107 timestamp: 1706900243497 - kind: conda @@ -5861,6 +5999,8 @@ packages: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/markupsafe size: 26856 timestamp: 1706900665492 - kind: conda @@ -5879,6 +6019,8 @@ packages: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/markupsafe size: 24314 timestamp: 1706900151453 - kind: conda @@ -5979,6 +6121,8 @@ packages: - python_abi 3.9.* *_cp39 license: PSF-2.0 license_family: PSF + purls: + - pkg:pypi/matplotlib size: 6910833 timestamp: 1708027042126 - kind: conda @@ -6009,6 +6153,8 @@ packages: - python_abi 3.9.* *_cp39 license: PSF-2.0 license_family: PSF + purls: + - pkg:pypi/matplotlib size: 6825567 timestamp: 1708027174151 - kind: conda @@ -6040,6 +6186,8 @@ packages: - tk >=8.6.13,<8.7.0a0 license: PSF-2.0 license_family: PSF + purls: + - pkg:pypi/matplotlib size: 6931092 timestamp: 1708026713643 - kind: conda @@ -6071,6 +6219,8 @@ packages: - vc14_runtime >=14.29.30139 license: PSF-2.0 license_family: PSF + purls: + - pkg:pypi/matplotlib size: 6754973 timestamp: 1708027177507 - kind: conda @@ -6087,6 +6237,8 @@ packages: - python >=3.8 license: MIT license_family: MIT + purls: + - pkg:pypi/mdit-py-plugins size: 41197 timestamp: 1686175527330 - kind: conda @@ -6102,6 +6254,8 @@ packages: - python >=3.6 license: MIT license_family: MIT + purls: + - pkg:pypi/mdurl size: 14680 timestamp: 1704317789138 - kind: conda @@ -6121,6 +6275,28 @@ packages: license_family: APACHE size: 628242 timestamp: 1700451735019 +- kind: conda + name: mfpymake + version: 1.2.9 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/mfpymake-1.2.9-pyhd8ed1ab_0.conda + sha256: 2fcd9fe875010d94c4b74ea45f0a25a91f46527b9b5f4a29875194c0b33d6a70 + md5: b34f31d00ff11d8baa25cda984196e1e + depends: + - meson + - networkx >=2.6.3 + - ninja + - numpy + - pydotplus + - python >=3.8 + - requests + license: CC0-1.0 + purls: + - pkg:pypi/mfpymake + size: 59409 + timestamp: 1707761286555 - kind: conda name: mkl version: 2024.0.0 @@ -6137,6 +6313,44 @@ packages: license_family: Proprietary size: 108505947 timestamp: 1701973497498 +- kind: pypi + name: modflow-devtools + version: 1.5.0.dev0 + url: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@e65c4d3304f0230345d6f1d4d8f911e0c2eb7c64 + requires_dist: + - sphinx ; extra == 'docs' + - sphinx-rtd-theme ; extra == 'docs' + - myst-parser ; extra == 'docs' + - ruff ; extra == 'lint' + - modflow-devtools[lint] ; extra == 'test' + - coverage ; extra == 'test' + - flaky ; extra == 'test' + - filelock ; extra == 'test' + - meson !=0.63.0 ; extra == 'test' + - ninja ; extra == 'test' + - numpy ; extra == 'test' + - pytest !=8.1.0 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-dotenv ; extra == 'test' + - pytest-xdist ; extra == 'test' + - pyyaml ; extra == 'test' + requires_python: '>=3.8' +- kind: pypi + name: modflowapi + version: 0.3.0.dev0 + url: git+https://github.com/MODFLOW-USGS/modflowapi.git@c6811fded7d832506c8bf98cef9ffffa31e2da3b + requires_dist: + - numpy <2.0.0 + - pandas + - xmipy + - modflowapi[lint,test] ; extra == 'dev' + - ruff ; extra == 'lint' + - filelock ; extra == 'test' + - modflow-devtools ; extra == 'test' + - pytest !=8.1.0 ; extra == 'test' + - pytest-order ; extra == 'test' + - pytest-xdist ; extra == 'test' + requires_python: '>=3.9' - kind: conda name: mpg123 version: 1.32.4 @@ -6191,6 +6405,8 @@ packages: - python >=3.5 license: MIT license_family: MIT + purls: + - pkg:pypi/mypy-extensions size: 10492 timestamp: 1675543414256 - kind: conda @@ -6247,6 +6463,8 @@ packages: - traitlets >=5.1 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/nbformat size: 100844 timestamp: 1710502340495 - kind: conda @@ -6302,6 +6520,8 @@ packages: - pandas >=1.4 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/networkx size: 1149552 timestamp: 1698504905258 - kind: conda @@ -6416,6 +6636,8 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/numpy size: 6481665 timestamp: 1707226262838 - kind: conda @@ -6438,6 +6660,8 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/numpy size: 7039431 timestamp: 1707225726227 - kind: conda @@ -6460,6 +6684,8 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/numpy size: 5492058 timestamp: 1707226364958 - kind: conda @@ -6483,6 +6709,8 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/numpy size: 5920615 timestamp: 1707226471242 - kind: conda @@ -6641,6 +6869,8 @@ packages: - python >=3.8 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/packaging size: 49832 timestamp: 1710076089469 - kind: conda @@ -6825,6 +7055,8 @@ packages: - python >=3.7 license: MPL-2.0 license_family: MOZILLA + purls: + - pkg:pypi/pathspec size: 41173 timestamp: 1702250135032 - kind: conda @@ -6893,12 +7125,12 @@ packages: timestamp: 1708118050286 - kind: conda name: pillow - version: 10.2.0 - build: py39h368b509_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/pillow-10.2.0-py39h368b509_0.conda - sha256: fc08925521c8839ace0b0b62f37757ab95d3934c63bb6b7da10c1f10917be002 - md5: 706d6e5bbc4b5d2ac7b8a6077319294d + version: 10.3.0 + build: py39h3352c98_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.3.0-py39h3352c98_0.conda + sha256: ec1a6fed0b5e114c79ecdbe195f1a1c9ace94ccb61379e59781afb68cba0f463 + md5: ae81c249c46d2c8e37770a72f7568aaa depends: - freetype >=2.12.1,<3.0a0 - lcms2 >=2.16,<3.0a0 @@ -6907,72 +7139,69 @@ packages: - libwebp-base >=1.3.2,<2.0a0 - libxcb >=1.15,<1.16.0a0 - libzlib >=1.2.13,<1.3.0a0 - - openjpeg >=2.5.0,<3.0a0 + - openjpeg >=2.5.2,<3.0a0 - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython - python_abi 3.9.* *_cp39 - tk >=8.6.13,<8.7.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 license: HPND - size: 42054784 - timestamp: 1704252779681 + size: 40576213 + timestamp: 1712155121473 - kind: conda name: pillow - version: 10.2.0 - build: py39h755f0b7_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.2.0-py39h755f0b7_0.conda - sha256: 0e91b5467c3994760832fca4a45ed084853061b5c42a8015da4e19fed7e5b7aa - md5: 9309cdb83d6c1617a58e57b61c556105 + version: 10.3.0 + build: py39h90c7501_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py39h90c7501_0.conda + sha256: 1fa684d3f431f98a3e10f972025fc63fc81882e775059b358f5ff58cc46a951d + md5: 1e3b6af9592be71ce19f0a6aae05d97b depends: - freetype >=2.12.1,<3.0a0 - lcms2 >=2.16,<3.0a0 + - libgcc-ng >=12 - libjpeg-turbo >=3.0.0,<4.0a0 - libtiff >=4.6.0,<4.7.0a0 - libwebp-base >=1.3.2,<2.0a0 - libxcb >=1.15,<1.16.0a0 - libzlib >=1.2.13,<1.3.0a0 - - openjpeg >=2.5.0,<3.0a0 + - openjpeg >=2.5.2,<3.0a0 - python >=3.9,<3.10.0a0 - - python >=3.9,<3.10.0a0 *_cpython - python_abi 3.9.* *_cp39 - tk >=8.6.13,<8.7.0a0 license: HPND - size: 41621811 - timestamp: 1704252739541 + size: 42433427 + timestamp: 1712154625243 - kind: conda name: pillow - version: 10.2.0 - build: py39had0adad_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py39had0adad_0.conda - sha256: 6936d54f9830ac66bee7b26187eb2297d80febe110e978cd9ae6a54e62ec6aaf - md5: 2972754dc054bb079d1d121918b5126f + version: 10.3.0 + build: py39h9dabb2a_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.3.0-py39h9dabb2a_0.conda + sha256: b2478cf4fc318a1be5b3287bf426b34d0b2cc2b0cb7a435e6ad7f9637c8e5f53 + md5: e385068c9511542eff20422f7e799064 depends: - freetype >=2.12.1,<3.0a0 - lcms2 >=2.16,<3.0a0 - - libgcc-ng >=12 - libjpeg-turbo >=3.0.0,<4.0a0 - libtiff >=4.6.0,<4.7.0a0 - libwebp-base >=1.3.2,<2.0a0 - libxcb >=1.15,<1.16.0a0 - libzlib >=1.2.13,<1.3.0a0 - - openjpeg >=2.5.0,<3.0a0 + - openjpeg >=2.5.2,<3.0a0 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 - tk >=8.6.13,<8.7.0a0 license: HPND - size: 41860107 - timestamp: 1704252210593 + size: 42224219 + timestamp: 1712154790265 - kind: conda name: pillow - version: 10.2.0 - build: py39hdd30358_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.2.0-py39hdd30358_0.conda - sha256: 70d5e8c36b1ac538d212816474594cf87aaa0c2e8f98308e952357df1b6b1c4f - md5: 38aef4e0b3355d32485cd4a199296a5b + version: 10.3.0 + build: py39h9ee4981_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pillow-10.3.0-py39h9ee4981_0.conda + sha256: 06e75a5a56d104dee181ef9e0dd78fd0998ee7f9cf6a1ee56308ecf035236404 + md5: 6d69d57c41867acc162ef0205a8efaef depends: - freetype >=2.12.1,<3.0a0 - lcms2 >=2.16,<3.0a0 @@ -6981,13 +7210,16 @@ packages: - libwebp-base >=1.3.2,<2.0a0 - libxcb >=1.15,<1.16.0a0 - libzlib >=1.2.13,<1.3.0a0 - - openjpeg >=2.5.0,<3.0a0 + - openjpeg >=2.5.2,<3.0a0 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 - tk >=8.6.13,<8.7.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: HPND - size: 41418500 - timestamp: 1704252471264 + size: 42541715 + timestamp: 1712155039095 - kind: conda name: pip version: '24.0' @@ -7003,6 +7235,8 @@ packages: - wheel license: MIT license_family: MIT + purls: + - pkg:pypi/pip size: 1398245 timestamp: 1706960660581 - kind: conda @@ -7077,6 +7311,8 @@ packages: depends: - python >=3.6 license: MIT AND PSF-2.0 + purls: + - pkg:pypi/pkgutil-resolve-name size: 10778 timestamp: 1694617398467 - kind: conda @@ -7092,6 +7328,8 @@ packages: - python >=3.8 license: MIT license_family: MIT + purls: + - pkg:pypi/platformdirs size: 20210 timestamp: 1706713564353 - kind: conda @@ -7107,6 +7345,8 @@ packages: - python >=3.8 license: MIT license_family: MIT + purls: + - pkg:pypi/pluggy size: 23384 timestamp: 1706116931972 - kind: conda @@ -7123,6 +7363,8 @@ packages: - python license: BSD 3-clause license_family: BSD + purls: + - pkg:pypi/ply size: 44837 timestamp: 1530963184592 - kind: conda @@ -7228,6 +7470,8 @@ packages: - python >=3.7 license: MIT license_family: MIT + purls: + - pkg:pypi/py-cpuinfo size: 24947 timestamp: 1666774595872 - kind: conda @@ -7246,6 +7490,8 @@ packages: - python >=3.6 license: MIT license_family: MIT + purls: + - pkg:pypi/pydotplus size: 24847 timestamp: 1622588237763 - kind: conda @@ -7261,6 +7507,8 @@ packages: - python >=3.6 license: MIT license_family: MIT + purls: + - pkg:pypi/pyparsing size: 89455 timestamp: 1709721146886 - kind: conda @@ -7282,6 +7530,8 @@ packages: - sip >=6.7.11,<6.8.0a0 license: GPL-3.0-only license_family: GPL + purls: + - pkg:pypi/pyqt5 size: 5227659 timestamp: 1695420723753 - kind: conda @@ -7304,6 +7554,8 @@ packages: - vc14_runtime >=14.29.30139 license: GPL-3.0-only license_family: GPL + purls: + - pkg:pypi/pyqt5 size: 3876568 timestamp: 1695421679054 - kind: conda @@ -7380,6 +7632,8 @@ packages: - win_inet_pton license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/pysocks size: 19348 timestamp: 1661605138291 - kind: conda @@ -7397,6 +7651,8 @@ packages: - python >=3.8 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/pysocks size: 18981 timestamp: 1661604969727 - kind: conda @@ -7420,6 +7676,8 @@ packages: - pytest-faulthandler >=2 license: MIT license_family: MIT + purls: + - pkg:pypi/pytest size: 255523 timestamp: 1709992719691 - kind: conda @@ -7437,6 +7695,8 @@ packages: - python >=3.5 license: BSD-2-Clause license_family: BSD + purls: + - pkg:pypi/pytest-benchmark size: 39571 timestamp: 1666782598879 - kind: conda @@ -7454,6 +7714,8 @@ packages: - python-dotenv >=0.9.1 license: MIT license_family: MIT + purls: + - pkg:pypi/pytest-dotenv size: 7383 timestamp: 1606859705188 - kind: conda @@ -7470,6 +7732,8 @@ packages: - python >=3.6 license: MIT license_family: MIT + purls: + - pkg:pypi/pytest-order size: 15851 timestamp: 1641771678634 - kind: conda @@ -7489,6 +7753,8 @@ packages: - psutil >=3.0 license: MIT license_family: MIT + purls: + - pkg:pypi/pytest-xdist size: 36516 timestamp: 1700593072448 - kind: conda @@ -7606,6 +7872,8 @@ packages: - six >=1.5 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/python-dateutil size: 222742 timestamp: 1709299922152 - kind: conda @@ -7636,6 +7904,8 @@ packages: - python >=3.3 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/fastjsonschema size: 225250 timestamp: 1703781171097 - kind: conda @@ -7651,6 +7921,8 @@ packages: - python >=3.6 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/tzdata size: 144024 timestamp: 1707747742930 - kind: conda @@ -7726,6 +7998,8 @@ packages: - python >=3.7 license: MIT license_family: MIT + purls: + - pkg:pypi/pytz size: 188538 timestamp: 1706886944988 - kind: conda @@ -7972,6 +8246,8 @@ packages: - rpds-py >=0.7.0 license: MIT license_family: MIT + purls: + - pkg:pypi/referencing size: 42071 timestamp: 1710763821612 - kind: conda @@ -7993,6 +8269,8 @@ packages: - chardet >=3.0.2,<6 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/requests size: 56690 timestamp: 1684774408600 - kind: conda @@ -8011,6 +8289,8 @@ packages: - __osx >=11.0 license: MIT license_family: MIT + purls: + - pkg:pypi/rpds-py size: 292859 timestamp: 1707923214688 - kind: conda @@ -8027,6 +8307,8 @@ packages: - python_abi 3.9.* *_cp39 license: MIT license_family: MIT + purls: + - pkg:pypi/rpds-py size: 915925 timestamp: 1707923007058 - kind: conda @@ -8044,6 +8326,8 @@ packages: - __osx >=10.12 license: MIT license_family: MIT + purls: + - pkg:pypi/rpds-py size: 300083 timestamp: 1707923366326 - kind: conda @@ -8062,6 +8346,8 @@ packages: - vc14_runtime >=14.29.30139 license: MIT license_family: MIT + purls: + - pkg:pypi/rpds-py size: 202481 timestamp: 1707923894221 - kind: conda @@ -8177,6 +8463,8 @@ packages: - python >=3.8 license: MIT license_family: MIT + purls: + - pkg:pypi/setuptools size: 471183 timestamp: 1710344615844 - kind: conda @@ -8194,6 +8482,8 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/shapely size: 449167 timestamp: 1708368412520 - kind: conda @@ -8214,6 +8504,8 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/shapely size: 450564 timestamp: 1708368463948 - kind: conda @@ -8232,6 +8524,8 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/shapely size: 479182 timestamp: 1708368191201 - kind: conda @@ -8250,6 +8544,8 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/shapely size: 446351 timestamp: 1708368614890 - kind: conda @@ -8270,6 +8566,8 @@ packages: - tomli license: GPL-3.0-only license_family: GPL + purls: + - pkg:pypi/sip size: 491742 timestamp: 1697300599649 - kind: conda @@ -8291,6 +8589,8 @@ packages: - vc14_runtime >=14.29.30139 license: GPL-3.0-only license_family: GPL + purls: + - pkg:pypi/sip size: 502390 timestamp: 1697300934198 - kind: conda @@ -8306,6 +8606,8 @@ packages: - python license: MIT license_family: MIT + purls: + - pkg:pypi/six size: 14259 timestamp: 1620240338595 - kind: conda @@ -8402,6 +8704,8 @@ packages: - python >=2.7 license: MIT license_family: MIT + purls: + - pkg:pypi/toml size: 18433 timestamp: 1604308660817 - kind: conda @@ -8417,6 +8721,8 @@ packages: - python >=3.7 license: MIT license_family: MIT + purls: + - pkg:pypi/tomli size: 15940 timestamp: 1644342331069 - kind: conda @@ -8433,6 +8739,8 @@ packages: - python_abi 3.9.* *_cp39 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/tornado size: 641216 timestamp: 1708363746873 - kind: conda @@ -8448,6 +8756,8 @@ packages: - python_abi 3.9.* *_cp39 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/tornado size: 641481 timestamp: 1708363543532 - kind: conda @@ -8466,6 +8776,8 @@ packages: - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/tornado size: 644981 timestamp: 1708363806202 - kind: conda @@ -8482,6 +8794,8 @@ packages: - python_abi 3.9.* *_cp39 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/tornado size: 639959 timestamp: 1708363320529 - kind: conda @@ -8497,6 +8811,8 @@ packages: - python >=3.8 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/traitlets size: 110288 timestamp: 1710254564088 - kind: conda @@ -8512,6 +8828,8 @@ packages: - python >=3.7 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/trove-classifiers size: 18393 timestamp: 1711440195159 - kind: conda @@ -8527,6 +8845,8 @@ packages: - python >=3.8 license: PSF-2.0 license_family: PSF + purls: + - pkg:pypi/typing-extensions size: 37018 timestamp: 1708904796013 - kind: conda @@ -8569,6 +8889,8 @@ packages: - python_abi 3.9.* *_cp39 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/unicodedata2 size: 376309 timestamp: 1695848358752 - kind: conda @@ -8587,6 +8909,8 @@ packages: - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/unicodedata2 size: 373257 timestamp: 1695848310896 - kind: conda @@ -8603,6 +8927,8 @@ packages: - python_abi 3.9.* *_cp39 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/unicodedata2 size: 373822 timestamp: 1695848128416 - kind: conda @@ -8618,6 +8944,8 @@ packages: - python_abi 3.9.* *_cp39 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/unicodedata2 size: 369843 timestamp: 1695848310939 - kind: conda @@ -8635,6 +8963,8 @@ packages: - python >=3.7 license: MIT license_family: MIT + purls: + - pkg:pypi/urllib3 size: 94669 timestamp: 1708239595549 - kind: conda @@ -8700,6 +9030,8 @@ packages: - python >=3.8 license: MIT license_family: MIT + purls: + - pkg:pypi/wheel size: 57963 timestamp: 1711546009410 - kind: conda @@ -8716,6 +9048,8 @@ packages: - __win - python >=3.6 license: PUBLIC-DOMAIN + purls: + - pkg:pypi/win-inet-pton size: 8191 timestamp: 1667051294134 - kind: conda @@ -8830,6 +9164,8 @@ packages: - numpy - python >=3.8 license: CC0-1.0 + purls: + - pkg:pypi/xmipy size: 18460 timestamp: 1681486998644 - kind: conda @@ -9366,6 +9702,8 @@ packages: - python >=3.8 license: MIT license_family: MIT + purls: + - pkg:pypi/zipp size: 18954 timestamp: 1695255262261 - kind: conda diff --git a/pixi.toml b/pixi.toml index 88227d2033d..766b352a163 100644 --- a/pixi.toml +++ b/pixi.toml @@ -2,46 +2,7 @@ name = "modflow6" channels = ["conda-forge"] platforms = ["win-64", "linux-64", "osx-arm64", "osx-64"] - -[tasks] -# Install -install-flopy = "pip install --no-build-isolation --no-deps --disable-pip-version-check git+https://github.com/modflowpy/flopy.git" -install-pymake = "pip install --no-build-isolation --no-deps --disable-pip-version-check git+https://github.com/modflowpy/pymake.git" -install-modflowapi = "pip install --no-build-isolation --no-deps --disable-pip-version-check git+https://github.com/MODFLOW-USGS/modflowapi.git" -install-modflow-devtools = "pip install --no-build-isolation --no-deps --disable-pip-version-check git+https://github.com/MODFLOW-USGS/modflow-devtools.git" -install = { depends_on = [ - "install-flopy", - "install-pymake", - "install-modflowapi", - "install-modflow-devtools", -] } - -# Utils -fortran-format-check = "python .github/common/fortran_format_check.py" -msvs-vfproj-check = "python .github/common/msvs_vfproj_check.py" -update-flopy = { cmd = "python update_flopy.py", cwd = "autotest" } -update-version = { cmd = "python update_version.py", cwd = "distribution" } -update-doxyfile-version = { cmd = "python update_doxyfile_version.py", cwd = ".build_rtd_docs" } -get-exes = { cmd = "pytest -v --durations 0 get_exes.py", cwd = "autotest" } -build-makefiles = "python build_makefiles.py" -deprecations = { cmd = "python deprecations.py", cwd = "doc/mf6io/mf6ivar" } -benchmark = { cmd = "python benchmark.py", cwd = "distribution" } -mk-folder-struct = { cmd = "python mk_folder_struct.py", cwd = "doc/ReleaseNotes" } - -# CI -setup-strict = "meson setup -Ddebug=false -Dwerror=true" -setup-debug = "meson setup -Doptimization=0 --prefix=$(pwd) --libdir=bin" -setup-release = "meson setup -Ddebug=false --prefix=$(pwd) --libdir=bin" -setup-release-parallel = "meson setup -Ddebug=false -Dparallel=true --prefix=$(pwd) --libdir=bin" -compile-build = "meson compile -C" -install-build = "meson install -C" -test-build = "meson test --verbose --no-rebuild -C" -test-distribution = { cmd = "pytest -v --durations 0", cwd = "distribution" } -autotest = { cmd = "pytest -v -n auto --durations 0 --keep-failed .failed", cwd = "autotest" } -autotest-marker = { cmd = "pytest -v -n auto --durations 0 --keep-failed .failed -m", cwd = "autotest" } -autotest-parallel = { cmd = "pytest -v -n auto --parallel --durations 0 -k \"test_par\" --keep-failed .failed", cwd = "autotest" } -autotest-large = { cmd = "pytest -v -n auto --durations 0 test_largetestmodels.py --keep-failed .failed", cwd = "autotest" } -sphinx = { cmd = "make html", cwd = ".build_rtd_docs" } +version = "6.5.0.dev2" [dependencies] appdirs = "*" @@ -53,6 +14,7 @@ hatchling = "*" jupytext = "*" matplotlib = "*" meson = "1.3.0" +mfpymake = "*" networkx = "*" ninja = "*" numpy = "*" @@ -70,3 +32,32 @@ requests = "*" scipy = "*" shapely = "*" xmipy = "*" + +[pypi-dependencies] +flopy = { git = "https://github.com/modflowpy/flopy.git" } +modflowapi = { git = "https://github.com/MODFLOW-USGS/modflowapi.git" } +modflow-devtools = { git = "https://github.com/MODFLOW-USGS/modflow-devtools.git" } + +[tasks] +# format +fortran-format-check = "python .github/common/fortran_format_check.py" +msvs-vfproj-check = "python .github/common/msvs_vfproj_check.py" + +# build/test +setup = "meson setup --prefix=$(pwd) --libdir=bin" +build = "meson install -C" +test = "meson test --verbose --no-rebuild -C" +update-flopy = { cmd = "python update_flopy.py", cwd = "autotest" } +get-exes = { cmd = "pytest -v --durations 0 get_exes.py", cwd = "autotest" } +autotest = { cmd = "pytest -v -n auto --durations 0 --keep-failed .failed", cwd = "autotest" } + +# dist/docs +benchmark = { cmd = "python benchmark.py", cwd = "distribution" } +build-docs = { cmd = "python build_docs.py", cwd = "distribution" } +build-dist = { cmd = "python build_dist.py", cwd = "distribution" } +build-makefiles = { cmd = "python build_makefiles.py", cwd = "distribution" } +test-dist-scripts = { cmd = "pytest -v --durations 0", cwd = "distribution" } +update-version = { cmd = "python update_version.py", cwd = "distribution" } +mk-folder-struct = { cmd = "python mk_folder_struct.py", cwd = "doc/ReleaseNotes" } +deprecations = { cmd = "python deprecations.py", cwd = "doc/mf6io/mf6ivar" } +sphinx = { cmd = "make html", cwd = ".build_rtd_docs" } \ No newline at end of file From 5ba14e9c90632fe365580a8f0a33bc5a557f600a Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 4 Apr 2024 12:33:18 -0400 Subject: [PATCH 086/199] ci(release): pixi fix in os tag step (#1705) --- .github/workflows/release.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 027117d9307..50f949cde18 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -141,9 +141,9 @@ jobs: - name: Get OS tag id: ostag - shell: pixi run bash -e {0} + working-directory: modflow6 run: | - ostag=$(python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") + ostag=$(pixi run python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") if [[ "${{ matrix.parallel }}" == "true" ]]; then ostag="${ostag}par" fi @@ -376,8 +376,9 @@ jobs: - name: Get OS tag id: ostag + working-directory: modflow6 run: | - ostag=$(python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") + ostag=$(pixi run python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") echo "ostag=$ostag" >> $GITHUB_OUTPUT - name: Download pre-built binaries @@ -534,10 +535,8 @@ jobs: - name: Get OS tag id: ostag working-directory: modflow6 - shell: pixi run bash -e {0} run: | - cd .. - ostag=$(python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") + ostag=$(pixi run python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") if [[ "${{ matrix.parallel }}" == "true" ]]; then ostag="${ostag}par" fi From 9d3ca95ea6e73807058bdab091f6831102510059 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 5 Apr 2024 11:39:42 -0400 Subject: [PATCH 087/199] ci(compilers): add intel 2024, trim intel versions, drop gcc 7-10 (#1707) * add intel 2024.0 and 2024.1 to compiler test matrix * remove incompatible intel versions 2021.1 - 2022.1 * remove gcc 7 - 10 --- .github/workflows/compilers.yml | 38 +++++++-------------------------- 1 file changed, 8 insertions(+), 30 deletions(-) diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index 79220b01909..824b35afb39 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -15,72 +15,50 @@ jobs: # combinations from https://github.com/fortran-lang/setup-fortran#runner-compatibility include: # gfortran - - {os: ubuntu-20.04, compiler: gcc, version: 7} - - {os: ubuntu-20.04, compiler: gcc, version: 8} - - {os: ubuntu-20.04, compiler: gcc, version: 9} - - {os: ubuntu-20.04, compiler: gcc, version: 10} - {os: ubuntu-20.04, compiler: gcc, version: 11} - - {os: ubuntu-22.04, compiler: gcc, version: 9} - - {os: ubuntu-22.04, compiler: gcc, version: 10} - {os: ubuntu-22.04, compiler: gcc, version: 11} - {os: ubuntu-22.04, compiler: gcc, version: 12} - {os: ubuntu-22.04, compiler: gcc, version: 13} - - {os: macos-11, compiler: gcc, version: 7} - - {os: macos-11, compiler: gcc, version: 8} - - {os: macos-11, compiler: gcc, version: 9} - - {os: macos-11, compiler: gcc, version: 10} - {os: macos-11, compiler: gcc, version: 11} - {os: macos-11, compiler: gcc, version: 12} - {os: macos-11, compiler: gcc, version: 13} - - {os: macos-12, compiler: gcc, version: 7} - - {os: macos-12, compiler: gcc, version: 8} - - {os: macos-12, compiler: gcc, version: 9} - - {os: macos-12, compiler: gcc, version: 10} - {os: macos-12, compiler: gcc, version: 11} - {os: macos-12, compiler: gcc, version: 12} - {os: macos-12, compiler: gcc, version: 13} - - {os: windows-2019, compiler: gcc, version: 9} - - {os: windows-2019, compiler: gcc, version: 10} - {os: windows-2019, compiler: gcc, version: 11} - {os: windows-2019, compiler: gcc, version: 12} - {os: windows-2019, compiler: gcc, version: 13} - - {os: windows-2022, compiler: gcc, version: 9} - - {os: windows-2022, compiler: gcc, version: 10} - {os: windows-2022, compiler: gcc, version: 11} - {os: windows-2022, compiler: gcc, version: 12} - {os: windows-2022, compiler: gcc, version: 13} # ifx + - {os: ubuntu-20.04, compiler: intel, version: 2024.1} + - {os: ubuntu-20.04, compiler: intel, version: "2024.0"} - {os: ubuntu-20.04, compiler: intel, version: 2023.2} - {os: ubuntu-20.04, compiler: intel, version: 2023.1} - {os: ubuntu-20.04, compiler: intel, version: "2023.0"} - {os: ubuntu-20.04, compiler: intel, version: 2022.2.1} - {os: ubuntu-20.04, compiler: intel, version: 2022.2} - - {os: ubuntu-20.04, compiler: intel, version: 2022.1} - - {os: ubuntu-20.04, compiler: intel, version: "2022.0"} - - {os: ubuntu-20.04, compiler: intel, version: 2021.4} - - {os: ubuntu-20.04, compiler: intel, version: 2021.2} - - {os: ubuntu-20.04, compiler: intel, version: 2021.1} + - {os: ubuntu-22.04, compiler: intel, version: 2024.1} + - {os: ubuntu-22.04, compiler: intel, version: "2024.0"} - {os: ubuntu-22.04, compiler: intel, version: 2023.2} - {os: ubuntu-22.04, compiler: intel, version: 2023.1} - {os: ubuntu-22.04, compiler: intel, version: "2023.0"} - {os: ubuntu-22.04, compiler: intel, version: 2022.2.1} - {os: ubuntu-22.04, compiler: intel, version: 2022.2} - - {os: ubuntu-22.04, compiler: intel, version: 2022.1} - - {os: ubuntu-22.04, compiler: intel, version: "2022.0"} - - {os: ubuntu-22.04, compiler: intel, version: 2021.4} - - {os: ubuntu-22.04, compiler: intel, version: 2021.2} - - {os: ubuntu-22.04, compiler: intel, version: 2021.1} # no ifx on mac + - {os: windows-2019, compiler: intel, version: 2024.1} + - {os: windows-2019, compiler: intel, version: "2024.0"} - {os: windows-2019, compiler: intel, version: 2023.2} - {os: windows-2019, compiler: intel, version: 2023.1} - {os: windows-2019, compiler: intel, version: "2023.0"} - {os: windows-2019, compiler: intel, version: 2022.2} - - {os: windows-2019, compiler: intel, version: 2022.1} + - {os: windows-2022, compiler: intel, version: 2024.1} + - {os: windows-2022, compiler: intel, version: "2024.0"} - {os: windows-2022, compiler: intel, version: 2023.2} - {os: windows-2022, compiler: intel, version: 2023.1} - {os: windows-2022, compiler: intel, version: "2023.0"} - {os: windows-2022, compiler: intel, version: 2022.2} - - {os: windows-2022, compiler: intel, version: 2022.1} # ifort - {os: ubuntu-20.04, compiler: intel-classic, version: "2021.10"} - {os: ubuntu-20.04, compiler: intel-classic, version: 2021.9} From d928fe48f336879253e5d76f4a08cef09ba81a5f Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 5 Apr 2024 18:02:48 -0400 Subject: [PATCH 088/199] ci(release): restore pre-pixi release workflows (#1708) * until refactored and better tested --- .github/workflows/release.yml | 103 ++++++++++++------------- .github/workflows/release_dispatch.yml | 29 +++---- 2 files changed, 63 insertions(+), 69 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 50f949cde18..b847f228ca5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -104,6 +104,16 @@ jobs: pixi-version: "latest" manifest-path: "modflow6/pixi.toml" + - name: Setup Micromamba + uses: mamba-org/setup-micromamba@v1 + with: + environment-file: modflow6/environment.yml + cache-downloads: true + cache-environment: true + init-shell: >- + bash + powershell + - name: Setup ${{ matrix.compiler }} ${{ matrix.version }} if: (!(runner.os == 'Windows' && matrix.parallel)) id: setup-fortran @@ -127,7 +137,6 @@ jobs: - name: Update version id: update_version working-directory: modflow6/distribution - shell: pixi run bash -e {0} run: | ver="${{ steps.set_version.outputs.version }}" cmd="python update_version.py -v $ver" @@ -141,9 +150,8 @@ jobs: - name: Get OS tag id: ostag - working-directory: modflow6 run: | - ostag=$(pixi run python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") + ostag=$(python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") if [[ "${{ matrix.parallel }}" == "true" ]]; then ostag="${ostag}par" fi @@ -169,9 +177,9 @@ jobs: if: (!(runner.os == 'Windows' && matrix.parallel)) working-directory: modflow6 run: | - pixi run setup builddir - pixi run build builddir - pixi run test builddir + meson setup builddir -Ddebug=false --prefix=$(pwd) --libdir=bin + meson install -C builddir + meson test --verbose --no-rebuild -C builddir - name: Check architecture (macOS) working-directory: modflow6/bin @@ -242,19 +250,19 @@ jobs: - name: Update flopy if: inputs.run_tests == true && runner.os != 'Windows' - working-directory: modflow6 - run: pixi run update-flopy + working-directory: modflow6/autotest + run: python update_flopy.py - name: Get executables if: inputs.run_tests == true && runner.os != 'Windows' working-directory: modflow6/autotest env: GITHUB_TOKEN: ${{ github.token }} - run: pixi run get-exes + run: pytest -v --durations 0 get_exes.py - name: Test modflow6 if: inputs.run_tests == true && runner.os != 'Windows' - working-directory: modflow6 + working-directory: modflow6/autotest env: REPOS_PATH: ${{ github.workspace }} run: | @@ -262,7 +270,7 @@ jobs: if [[ "${{ inputs.developmode }}" == "false" ]]; then markers="$markers and not developmode" fi - pixi run autotest -m "$markers" + pytest -v -n auto --durations 0 -m "$markers" - name: Upload failed test output if: failure() @@ -300,7 +308,7 @@ jobs: working-directory: modflow6/distribution env: GITHUB_TOKEN: ${{ github.token }} - run: pixi run test-dist-scripts + run: pytest -v --durations 0 docs: name: Build docs @@ -343,11 +351,12 @@ jobs: working-directory: usgslatex/usgsLaTeX run: sudo ./install.sh --all-users - - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup Micromamba + uses: mamba-org/setup-micromamba@v1 with: - pixi-version: "latest" - manifest-path: "modflow6/pixi.toml" + environment-file: modflow6/environment.yml + cache-downloads: true + cache-environment: true - name: Setup ${{ inputs.compiler_toolchain }} ${{ inputs.compiler_version }} uses: fortran-lang/setup-fortran@v1 @@ -358,7 +367,6 @@ jobs: - name: Update version id: update_version working-directory: modflow6/distribution - shell: pixi run bash -e {0} run: | ver="${{ needs.build.outputs.version }}" cmd="python update_version.py -v $ver" @@ -371,14 +379,13 @@ jobs: eval "$cmd" - name: Update FloPy classes - working-directory: modflow6 - run: pixi run update-flopy + working-directory: modflow6/autotest + run: python update_flopy.py - name: Get OS tag id: ostag - working-directory: modflow6 run: | - ostag=$(pixi run python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") + ostag=$(python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") echo "ostag=$ostag" >> $GITHUB_OUTPUT - name: Download pre-built binaries @@ -397,23 +404,18 @@ jobs: - name: Install dependencies for building models if: inputs.full == true - shell: pixi run bash -e {0} - working-directory: modflow6 + working-directory: modflow6-examples/etc env: GITHUB_TOKEN: ${{ github.token }} run: | - cd ../modflow6-examples/etc pip install -r requirements.pip.txt echo "${{ github.workspace }}/bin" >> $GITHUB_PATH get-modflow "${{ github.workspace }}/bin" --subset mf2005,triangle,gridgen - name: Build example models if: inputs.full == true - working-directory: modflow6 - shell: pixi run bash -e {0} - run: | - cd ../modflow6-examples/autotest - pytest -v -n auto test_scripts.py --init + working-directory: modflow6-examples/autotest + run: pytest -v -n auto test_scripts.py --init - name: Create folder structure if: inputs.full == true @@ -432,12 +434,13 @@ jobs: cp -r modflow6/utils/zonebudget "$distname/utils/zonebudget" # create LaTeX file describing the folder structure - pixi run mk-folder-struct -dp "${{ github.workspace }}/$distname" + cd modflow6/doc/ReleaseNotes + python mk_folder_struct.py -dp "${{ github.workspace }}/$distname" - name: Collect deprecations working-directory: modflow6/doc/mf6io/mf6ivar run: | - pixi run deprecations + python deprecations.py cat md/deprecations.md - name: Upload deprecations @@ -447,15 +450,12 @@ jobs: path: modflow6/doc/mf6io/mf6ivar/md/deprecations.md - name: Build documentation - working-directory: modflow6 - shell: pixi run bash -e {0} env: # this step is lazy about building the mf6 examples PDF document, first # trying to download a prebuilt PDF from MODFLOW-USGS/modflow6-examples, # so it needs a GITHUB_TOKEN. GITHUB_TOKEN: ${{ github.token }} run: | - cd .. mkdir -p "${{ needs.build.outputs.distname }}/doc" cmd="python modflow6/distribution/build_docs.py -b bin -o doc" if [[ "${{ inputs.full }}" == "true" ]]; then @@ -504,11 +504,15 @@ jobs: repository: MODFLOW-USGS/modflow6-examples path: modflow6-examples - - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup Micromamba + uses: mamba-org/setup-micromamba@v1 with: - pixi-version: "latest" - manifest-path: "modflow6/pixi.toml" + environment-file: modflow6/environment.yml + cache-downloads: true + cache-environment: true + init-shell: >- + bash + powershell - name: Setup ${{ inputs.compiler_toolchain }} ${{ inputs.compiler_version }} uses: fortran-lang/setup-fortran@v1 @@ -518,10 +522,8 @@ jobs: - name: Update version id: update_version - working-directory: modflow6 - shell: pixi run bash -e {0} + working-directory: modflow6/distribution run: | - cd distribution ver="${{ needs.build.outputs.version }}" cmd="python update_version.py -v $ver" if [[ "${{ inputs.approve }}" == "true" ]]; then @@ -534,9 +536,8 @@ jobs: - name: Get OS tag id: ostag - working-directory: modflow6 run: | - ostag=$(pixi run python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") + ostag=$(python -c "from modflow_devtools.ostags import get_ostag; print(get_ostag())") if [[ "${{ matrix.parallel }}" == "true" ]]; then ostag="${ostag}par" fi @@ -566,10 +567,7 @@ jobs: - name: Install dependencies for example models env: GITHUB_TOKEN: ${{ github.token }} - working-directory: modflow6 - shell: pixi run bash -e {0} run: | - cd .. pip install -r modflow6-examples/etc/requirements.pip.txt distname="${{ needs.build.outputs.distname }}_${{ steps.ostag.outputs.ostag }}" echo "$distname/bin" >> $GITHUB_PATH @@ -586,19 +584,14 @@ jobs: - name: Update Flopy working-directory: modflow6/autotest - run: pixi run update-flopy + run: python update_flopy.py - name: Build example models if: inputs.full == true - working-directory: modflow6 - shell: pixi run bash -e {0} - run: | - cd ../modflow6-examples/autotest - pytest -v -n auto test_scripts.py --init + working-directory: modflow6-examples/autotest + run: pytest -v -n auto test_scripts.py --init - name: Build distribution - working-directory: modflow6 - shell: pixi run bash -e {0} env: GITHUB_TOKEN: ${{ github.token }} run: | @@ -719,4 +712,4 @@ jobs: if [[ "${{ inputs.full }}" == "true" ]]; then cmd="$cmd --full" fi - eval "$cmd" + eval "$cmd" \ No newline at end of file diff --git a/.github/workflows/release_dispatch.yml b/.github/workflows/release_dispatch.yml index f033b38c84f..77d159d0f46 100644 --- a/.github/workflows/release_dispatch.yml +++ b/.github/workflows/release_dispatch.yml @@ -149,7 +149,7 @@ jobs: pull-requests: write defaults: run: - shell: bash + shell: bash -l {0} steps: - name: Checkout modflow6 uses: actions/checkout@v4 @@ -157,11 +157,12 @@ jobs: repository: ${{ github.repository_owner }}/modflow6 ref: ${{ github.ref }} - - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup Micromamba + uses: mamba-org/setup-micromamba@v1 with: - pixi-version: "latest" - manifest-path: "modflow6/pixi.toml" + environment-file: environment.yml + cache-downloads: true + cache-environment: true - name: Update version working-directory: distribution @@ -171,13 +172,13 @@ jobs: # approve will be empty if workflow was triggered by pushing a release branch # todo: pull approve into set_options job/output? if [[ ("${{ inputs.approve }}" == "true") || ("${{ inputs.approve }}" == "") ]]; then - pixi run update-version -v "$ver" --approve + python update_version.py -v "$ver" --approve else - pixi run update-version -v "$ver" + python update_version.py -v "$ver" fi # lint version.f90 - pixi run fprettify -c ../.fprettify.yaml ../src/Utilities/version.f90 + fprettify -c ../.fprettify.yaml ../src/Utilities/version.f90 # commit and push git config core.sharedRepository true @@ -208,7 +209,7 @@ jobs: runs-on: ubuntu-22.04 defaults: run: - shell: bash + shell: bash -l {0} steps: - name: Checkout modflow6 uses: actions/checkout@v4 @@ -216,11 +217,12 @@ jobs: repository: ${{ github.repository_owner }}/modflow6 path: modflow6 - - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.1 + - name: Setup Micromamba + uses: mamba-org/setup-micromamba@v1 with: - pixi-version: "latest" - manifest-path: "modflow6/pixi.toml" + environment-file: modflow6/environment.yml + cache-downloads: true + cache-environment: true - name: Download artifacts uses: dawidd6/action-download-artifact@v3 @@ -229,7 +231,6 @@ jobs: working-directory: modflow6 env: GITHUB_TOKEN: ${{ github.token }} - shell: pixi run bash -e {0} run: | # create draft release version=$(python distribution/update_version.py -g) From fcf8e39ff9aa846cc66f1887943d6ea6c6f56a1f Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 8 Apr 2024 11:20:03 -0400 Subject: [PATCH 089/199] ci(docs): install exes to build examples, fix pixi usage (#1711) --- .github/workflows/docs.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 62884e7a075..48bcb1b13e7 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -94,11 +94,20 @@ jobs: working-directory: modflow6/autotest run: pixi run update-flopy + # the example models also need mf2005, triangle and gridgen + - name: Install extra executables + if: steps.cache-examples.outputs.cache-hit != 'true' + uses: modflowpy/install-modflow-action@v1 + with: + subset: mf2005,triangle,gridgen + - name: Build example models if: steps.cache-examples.outputs.cache-hit != 'true' - working-directory: modflow6-examples/autotest + working-directory: modflow6 + shell: pixi run bash -e {0} run: | - pixi run pytest -v -n auto test_scripts.py --init + cd ../modflow6-examples/autotest + pytest -v -n auto test_scripts.py --init ls -lh ../examples/ - name: Run benchmarks From f5edfadf38d88869e2319d86a95d750c8f1e5333 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 8 Apr 2024 17:45:06 -0400 Subject: [PATCH 090/199] fix(prt): fix timing-related issues (#1709) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * maximum tracking time was set incorrectly, particles were solved beyond the end of the time step for multi-step simulations — max time within the tracking loop should be end of time step unless it's the last time step in the simulation, in which case it should be particle stop time * if, on recording a particle datum, the tracking time fell exactly on the boundary between time steps, the datum was assigned to the subsequent time step and stress period, while MODPATH 7 assigns it the previous — factor out a routine in the base MethodType to save particle data, with some extra logic for an inclusive upper bound on the time step like MP7 --- autotest/test_prt_disv1.py | 42 +++++++++++----- src/Model/ModelUtilities/TrackData.f90 | 6 +-- src/Model/ParticleTracking/prt.f90 | 21 ++++---- src/Solution/ParticleTracker/Method.f90 | 49 ++++++++++++++----- .../ParticleTracker/MethodCellPassToBot.f90 | 7 +-- .../ParticleTracker/MethodCellPollock.f90 | 4 +- .../ParticleTracker/MethodCellPollockQuad.f90 | 4 +- .../ParticleTracker/MethodCellTernary.f90 | 4 +- src/Solution/ParticleTracker/MethodDis.f90 | 5 +- src/Solution/ParticleTracker/MethodDisv.f90 | 4 +- .../ParticleTracker/MethodSubcellPollock.f90 | 9 ++-- .../ParticleTracker/MethodSubcellTernary.f90 | 8 +-- 12 files changed, 92 insertions(+), 71 deletions(-) diff --git a/autotest/test_prt_disv1.py b/autotest/test_prt_disv1.py index d879ae12be0..d668d29cfbd 100644 --- a/autotest/test_prt_disv1.py +++ b/autotest/test_prt_disv1.py @@ -1,11 +1,26 @@ """ Tests particle tracking on a vertex (DISV) grid -that reduces to a regular grid. - -Two cases are provided, one with valid release -position and cell correspondences, and another -with mismatching cell IDs; expect PRT to catch -these and reject them. +that reduces to a regular grid. This exercises +PRT's ability to detect when a vertex grid can +be solved via Pollock's method applied to quad- +refined cells, instead of the new ternary method +which applies more generally to polygonal cells. + +The simulation includes a single stress period +with multiple time steps. This serves to test +whether PRT properly solves trajectories over +"internal" time steps, i.e. within the step's +slice of simulation time, as well as extending +tracking to termination or particle stop times +during the simulation's final time step. + +Several cases are provided: + - default: No user-specified tracking times, MP7 in pathline mode. + - bprp: Mismatching cell IDs in PRP input, expect PRT to catch and reject these. + - trts: User-specified tracking times, some falling exactly on boundaries between + time steps. PRT and MP7 should both assign the datum to the prior time step. + - trtf: Same as trts, except tracking times are provided to PRT in a separate file, + rather than inline in the OC input file. """ from pathlib import Path @@ -52,7 +67,7 @@ nouter, ninner = 100, 300 hclose, rclose, relax = 1e-9, 1e-3, 0.97 porosity = 0.1 -tracktimes = list(np.linspace(0, 11, 10)) +tracktimes = list(np.linspace(0, 19, 20)) def tracktimes_file(path) -> Path: @@ -225,6 +240,7 @@ def build_prt_sim(idx, gwf_ws, prt_ws, mf6): trackcsv_filerecord=[prt_track_csv_file], track_release=True, track_terminate=True, + track_transit=True, track_usertime=True, track_timesrecord=tracktimes if "trts" in name else None, track_timesfilerecord=( @@ -266,6 +282,7 @@ def build_prt_sim(idx, gwf_ws, prt_ws, mf6): def build_mp7_sim(idx, ws, mp7, gwf): + name = cases[idx] partdata = get_partdata(gwf.modelgrid, releasepts_mp7) mp7_name = f"{cases[idx]}_mp7" pg = flopy.modpath.ParticleGroup( @@ -287,10 +304,13 @@ def build_mp7_sim(idx, ws, mp7, gwf): ) mpsim = flopy.modpath.Modpath7Sim( mp, - simulationtype="pathline", + simulationtype="combined" + if ("trts" in name or "trtf" in name) + else "pathline", trackingdirection="forward", budgetoutputoption="summary", - stoptimeoption="total", + stoptimeoption="extend", + timepointdata=[20, tracktimes], particlegroups=[pg], ) @@ -360,8 +380,6 @@ def check_output(idx, test): # load mf6 pathline results mf6_pls = pd.read_csv(prt_ws / prt_track_csv_file, na_filter=False) - if "trts" in name or "trtf" in name: - assert len(mf6_pls) == 100 # make sure pathline df has "name" (boundname) column and default values assert "name" in mf6_pls @@ -466,7 +484,7 @@ def check_output(idx, test): del mp7_pls["node"] # compare mf6 / mp7 pathline data - if "trts" in name or "trtf" in name: + if "bprp" in name: pass else: assert mf6_pls.shape == mp7_pls.shape diff --git a/src/Model/ModelUtilities/TrackData.f90 b/src/Model/ModelUtilities/TrackData.f90 index b9b6006ebd6..bf2230d6b83 100644 --- a/src/Model/ModelUtilities/TrackData.f90 +++ b/src/Model/ModelUtilities/TrackData.f90 @@ -23,10 +23,8 @@ module TrackModule !> @brief Manages particle track (i.e. pathline) files. !! - !! Optionally filters events ("ireason" codes), e.g. release - !! or cell-to-cell transitions. Events ("ireason" codes) are: + !! Optionally filters events ("ireason" codes, selectable in the PRT-OC pkg): !! - !! -1: ALL !! 0: RELEASE: particle is released !! 1: TRANSIT: particle moves from cell to cell !! 2: TIMESTEP: timestep ends @@ -34,7 +32,7 @@ module TrackModule !! 4: WEAKSINK: particle exits a weak sink !! 5: USERTIME: user-specified tracking time !! - !! An arbitrary number of files can be managed. internal arrays + !! An arbitrary number of files can be managed. Internal arrays !! are resized as needed. !< type :: TrackFileControlType diff --git a/src/Model/ParticleTracking/prt.f90 b/src/Model/ParticleTracking/prt.f90 index 94462f0b940..ac3af4f9f4c 100644 --- a/src/Model/ParticleTracking/prt.f90 +++ b/src/Model/ParticleTracking/prt.f90 @@ -928,7 +928,7 @@ end subroutine ftype_check !> @brief Solve the model subroutine prt_solve(this) ! -- modules - use TdisModule, only: kper, kstp, totimc, totim, nper, nstp + use TdisModule, only: kper, kstp, totimc, nper, nstp, delt use PrtPrpModule, only: PrtPrpType ! -- dummy variables class(PrtModelType) :: this @@ -972,8 +972,7 @@ subroutine prt_solve(this) ! -- If particle is permanently unreleased, record its initial/terminal state if (particle%istatus == 8) & - call this%trackfilectl%save(particle, kper=kper, & - kstp=kstp, reason=3) ! reason=3: termination + call this%method%save(particle, reason=3) ! reason=3: termination ! -- If particle is inactive or not yet to be released, cycle if (particle%istatus > 1) cycle @@ -981,14 +980,14 @@ subroutine prt_solve(this) ! -- If particle released this time step, record its initial state particle%istatus = 1 if (particle%trelease >= totimc) & - call this%trackfilectl%save(particle, kper=kper, & - kstp=kstp, reason=0) ! reason=0: release - - ! -- Unless in last stress period and it has only one time step, - ! -- limit max time to no later than end of time step - tmax = particle%tstop - if (kper == nper .and. nstp(kper) /= 1 .and. totim < particle%tstop) & - tmax = totim + call this%method%save(particle, reason=0) ! reason=0: release + + ! -- Maximum time is end of time step unless this is the last + ! time step in the simulation, which case it's the particle + ! stop time. + tmax = totimc + delt + if (nper == kper .and. nstp(kper) == kstp) & + tmax = particle%tstop ! -- Get and apply the tracking method call this%method%apply(particle, tmax) diff --git a/src/Solution/ParticleTracker/Method.f90 b/src/Solution/ParticleTracker/Method.f90 index 10ae60d5532..55ac806a35f 100644 --- a/src/Solution/ParticleTracker/Method.f90 +++ b/src/Solution/ParticleTracker/Method.f90 @@ -45,8 +45,9 @@ module MethodModule ! Overridden in subtypes that delegate procedure :: pass procedure :: load - ! Implemented in this class + ! Implemented here procedure :: init + procedure :: save procedure :: track procedure :: try_pass procedure :: update @@ -151,6 +152,38 @@ subroutine pass(this, particle) call pstop(1, "pass must be overridden") end subroutine pass + !> @brief Save a particle's current state. + subroutine save(this, particle, reason) + use TdisModule, only: kper, kstp, totimc + ! dummy + class(MethodType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + integer(I4B), intent(in) :: reason + ! local + integer(I4B) :: per, stp + + per = kper + stp = kstp + + ! If tracking time falls exactly on a boundary between time steps, + ! report the previous time step for this datum. This is to follow + ! MP7's behavior, and because the particle will have been tracked + ! up to this instant under the previous time step's conditions, so + ! the time step we're about to start shouldn't get "credit" for it. + if (particle%ttrack == totimc .and. (per > 1 .or. stp > 1)) then + if (stp > 1) then + stp = stp - 1 + else if (per > 1) then + per = per - 1 + stp = 1 + end if + end if + + ! Save the particle's state to any registered tracking output files + call this%trackfilectl%save(particle, kper=per, & + kstp=stp, reason=reason) + end subroutine save + !> @brief Update particle state and check termination conditions !! !! Update the particle's properties (e.g. advancing flag, zone number, @@ -159,8 +192,6 @@ end subroutine pass !! conditions apply, save particle state with the proper reason code. !< subroutine update(this, particle, cell_defn) - ! -- modules - use TdisModule, only: kper, kstp ! -- dummy class(MethodType), intent(inout) :: this type(ParticleType), pointer, intent(inout) :: particle @@ -171,28 +202,24 @@ subroutine update(this, particle, cell_defn) if (particle%istopzone .eq. cell_defn%izone) then particle%advancing = .false. particle%istatus = 6 - call this%trackfilectl%save(particle, kper=kper, & - kstp=kstp, reason=3) ! reason=3: termination + call this%save(particle, reason=3) ! reason=3: termination return end if end if if (cell_defn%inoexitface .ne. 0) then particle%advancing = .false. particle%istatus = 5 - call this%trackfilectl%save(particle, kper=kper, & - kstp=kstp, reason=3) ! reason=3: termination + call this%save(particle, reason=3) ! reason=3: termination return end if if (cell_defn%iweaksink .ne. 0) then if (particle%istopweaksink .ne. 0) then particle%advancing = .false. particle%istatus = 3 - call this%trackfilectl%save(particle, kper=kper, & - kstp=kstp, reason=3) ! reason=3: termination + call this%save(particle, reason=3) ! reason=3: termination return else - call this%trackfilectl%save(particle, kper=kper, & - kstp=kstp, reason=4) ! reason=4: exited weak sink + call this%save(particle, reason=4) ! reason=4: exited weak sink return end if end if diff --git a/src/Solution/ParticleTracker/MethodCellPassToBot.f90 b/src/Solution/ParticleTracker/MethodCellPassToBot.f90 index ce28718113a..cb41dc4ca9f 100644 --- a/src/Solution/ParticleTracker/MethodCellPassToBot.f90 +++ b/src/Solution/ParticleTracker/MethodCellPassToBot.f90 @@ -5,7 +5,7 @@ module MethodCellPassToBotModule use CellDefnModule, only: CellDefnType, create_defn use PrtFmiModule, only: PrtFmiType use BaseDisModule, only: DisBaseType - use ParticleModule + use ParticleModule, only: ParticleType use CellModule, only: CellType use SubcellModule, only: SubcellType use TrackModule, only: TrackFileControlType @@ -43,8 +43,6 @@ end subroutine destroy !> @brief Pass particle vertically and instantaneously to the cell bottom subroutine apply_ptb(this, particle, tmax) - ! -- modules - use TdisModule, only: kper, kstp ! -- dummy class(MethodCellPassToBotType), intent(inout) :: this type(ParticleType), pointer, intent(inout) :: particle @@ -54,8 +52,7 @@ subroutine apply_ptb(this, particle, tmax) if (.not. particle%advancing) return particle%z = this%defn%bot particle%iboundary(2) = this%defn%npolyverts + 2 - call this%trackfilectl%save(particle, kper=kper, & - kstp=kstp, reason=1) ! reason=1: cell transition + call this%save(particle, reason=1) ! reason=1: cell transition end subroutine apply_ptb end module MethodCellPassToBotModule diff --git a/src/Solution/ParticleTracker/MethodCellPollock.f90 b/src/Solution/ParticleTracker/MethodCellPollock.f90 index 357fde67c7c..ad2bdbe5642 100644 --- a/src/Solution/ParticleTracker/MethodCellPollock.f90 +++ b/src/Solution/ParticleTracker/MethodCellPollock.f90 @@ -117,7 +117,6 @@ end subroutine pass_mcp !> @brief Apply Pollock's method to a rectangular cell subroutine apply_mcp(this, particle, tmax) - use TdisModule, only: kper, kstp ! -- dummy class(MethodCellPollockType), intent(inout) :: this type(ParticleType), pointer, intent(inout) :: particle @@ -144,8 +143,7 @@ subroutine apply_mcp(this, particle, tmax) ! -- the particle state to output file(s). if (particle%z > cell%defn%top) then particle%z = cell%defn%top - call this%trackfilectl%save(particle, kper=kper, & - kstp=kstp, reason=1) ! reason=1: cell transition + call this%save(particle, reason=1) ! reason=1: cell transition end if ! Transform particle location into local cell coordinates diff --git a/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 b/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 index 9335731fe9c..fd033cdcb5d 100644 --- a/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 +++ b/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 @@ -197,7 +197,6 @@ end subroutine pass_mcpq !> @brief Solve the quad-rectangular cell via Pollock's method subroutine apply_mcpq(this, particle, tmax) - use TdisModule, only: kper, kstp ! -- dummy class(MethodCellPollockQuadType), intent(inout) :: this type(ParticleType), pointer, intent(inout) :: particle @@ -217,8 +216,7 @@ subroutine apply_mcpq(this, particle, tmax) ! -- the particle state to output file(s). if (particle%z > cell%defn%top) then particle%z = cell%defn%top - call this%trackfilectl%save(particle, kper=kper, & - kstp=kstp, reason=1) ! reason=1: cell transition + call this%save(particle, reason=1) ! reason=1: cell transition end if ! -- Transform particle location into local cell coordinates, diff --git a/src/Solution/ParticleTracker/MethodCellTernary.f90 b/src/Solution/ParticleTracker/MethodCellTernary.f90 index bee0f1edac1..e7deaadb7cd 100644 --- a/src/Solution/ParticleTracker/MethodCellTernary.f90 +++ b/src/Solution/ParticleTracker/MethodCellTernary.f90 @@ -146,7 +146,6 @@ end subroutine pass_mct !> @brief Apply the ternary method to a polygonal cell subroutine apply_mct(this, particle, tmax) use ConstantsModule, only: DZERO, DONE, DHALF - use TdisModule, only: kper, kstp ! dummy class(MethodCellTernaryType), intent(inout) :: this type(ParticleType), pointer, intent(inout) :: particle @@ -193,8 +192,7 @@ subroutine apply_mct(this, particle, tmax) ! -- particle state to file if (particle%z > cell%defn%top) then particle%z = cell%defn%top - call this%trackfilectl%save(particle, kper=kper, & - kstp=kstp, reason=1) ! reason=1: cell transition + call this%save(particle, reason=1) ! reason=1: cell transition end if npolyverts = cell%defn%npolyverts diff --git a/src/Solution/ParticleTracker/MethodDis.f90 b/src/Solution/ParticleTracker/MethodDis.f90 index dc8a35d0ffd..b80c715492e 100644 --- a/src/Solution/ParticleTracker/MethodDis.f90 +++ b/src/Solution/ParticleTracker/MethodDis.f90 @@ -135,8 +135,6 @@ end subroutine load_dis !> @brief Pass a particle to the next cell, if there is one subroutine pass_dis(this, particle) - ! -- modules - use TdisModule, only: kper, kstp ! -- dummy class(MethodDisType), intent(inout) :: this type(ParticleType), pointer, intent(inout) :: particle @@ -174,8 +172,7 @@ subroutine pass_dis(this, particle) ! particle%idomain(2) = -abs(particle%idomain(2)) ! kluge??? particle%istatus = 2 ! kluge note: use -2 to allow check for transfer to another model??? particle%advancing = .false. - call this%trackfilectl%save(particle, kper=kper, & - kstp=kstp, reason=3) ! reason=3: termination + call this%save(particle, reason=3) ! reason=3: termination ! particle%iboundary(2) = -1 else idiag = dis%con%ia(cell%defn%icell) diff --git a/src/Solution/ParticleTracker/MethodDisv.f90 b/src/Solution/ParticleTracker/MethodDisv.f90 index f7da0e7fe7d..7eb45c76cfe 100644 --- a/src/Solution/ParticleTracker/MethodDisv.f90 +++ b/src/Solution/ParticleTracker/MethodDisv.f90 @@ -127,7 +127,6 @@ end subroutine load_disv subroutine pass_disv(this, particle) ! -- modules use DisvModule, only: DisvType - use TdisModule, only: kper, kstp ! -- dummy class(MethodDisvType), intent(inout) :: this type(ParticleType), pointer, intent(inout) :: particle @@ -158,8 +157,7 @@ subroutine pass_disv(this, particle) ! particle%idomain(2) = -abs(particle%idomain(2)) ! kluge??? particle%istatus = 2 ! kluge note, todo: use -2 to check for transfer to another model??? particle%advancing = .false. - call this%trackfilectl%save(particle, kper=kper, & - kstp=kstp, reason=3) ! reason=3: termination + call this%save(particle, reason=3) ! reason=3: termination ! particle%iboundary(2) = -1 else idiag = dis%con%ia(cell%defn%icell) diff --git a/src/Solution/ParticleTracker/MethodSubcellPollock.f90 b/src/Solution/ParticleTracker/MethodSubcellPollock.f90 index f4d54e37b99..3b122739c61 100644 --- a/src/Solution/ParticleTracker/MethodSubcellPollock.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellPollock.f90 @@ -86,7 +86,6 @@ end subroutine apply_msp subroutine track_subcell(this, subcell, particle, tmax) ! modules use ParticleModule, only: get_particle_id - use TdisModule, only: kper, kstp ! dummy class(MethodSubcellPollockType), intent(inout) :: this class(SubcellRectType), intent(in) :: subcell @@ -186,6 +185,7 @@ subroutine track_subcell(this, subcell, particle, tmax) ! within the current period and time step only. call this%tracktimes%try_advance() tslice = this%tracktimes%selection + if (all(tslice > 0)) then do i = tslice(1), tslice(2) t = this%tracktimes%times(i) @@ -202,8 +202,7 @@ subroutine track_subcell(this, subcell, particle, tmax) particle%z = z * subcell%dz particle%ttrack = t particle%istatus = 1 - call this%trackfilectl%save(particle, kper=kper, & - kstp=kstp, reason=5) + call this%save(particle, reason=5) end do end if @@ -266,9 +265,7 @@ subroutine track_subcell(this, subcell, particle, tmax) particle%iboundary(3) = exitFace ! -- Save particle track record - if (reason > -1) & - call this%trackfilectl%save(particle, kper=kper, & - kstp=kstp, reason=reason) + if (reason >= 0) call this%save(particle, reason=reason) end subroutine track_subcell diff --git a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 index 33721911b10..edf31873aa7 100644 --- a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 @@ -64,8 +64,6 @@ end subroutine apply_mst !> @brief Track a particle across a triangular subcell using the ternary method subroutine track_subcell(this, subcell, particle, tmax) - ! modules - use TdisModule, only: kper, kstp ! dummy class(MethodSubcellTernaryType), intent(inout) :: this class(SubcellTriType), intent(in) :: subcell @@ -283,8 +281,7 @@ subroutine track_subcell(this, subcell, particle, tmax) particle%z = z particle%ttrack = t particle%istatus = 1 - call this%trackfilectl%save(particle, kper=kper, & - kstp=kstp, reason=5) + call this%save(particle, reason=5) end do end if @@ -349,8 +346,7 @@ subroutine track_subcell(this, subcell, particle, tmax) ! -- Save particle track record if (reason > -1) & - call this%trackfilectl%save(particle, kper=kper, & - kstp=kstp, reason=reason) ! reason=2: timestep + call this%save(particle, reason=reason) ! reason=2: timestep end subroutine track_subcell !> @brief Do calculations related to analytical z solution From 7d1e1835a319b1d97356c43fd6e9b8654d539a59 Mon Sep 17 00:00:00 2001 From: mjr-deltares <45555666+mjr-deltares@users.noreply.github.com> Date: Thu, 11 Apr 2024 10:48:37 +0200 Subject: [PATCH 091/199] fix(ci): update pixi.lock (modified from #1713) (#1715) * ci: set pixi-setup frozen to true * update pixi.lock file * make sure smoke test is a smoke test * exclude test001h_rch_array4 and test001h_evt_array4 * fix openmpi version for Linux --------- Co-authored-by: Joseph Hughes --- .github/actions/test-par/action.yml | 3 +- .github/workflows/ci.yml | 2 +- .github/workflows/pixi_auto_update.yml | 1 + autotest/test_testmodels_mf6.py | 3 + pixi.lock | 2545 ++++++++++++++++-------- 5 files changed, 1686 insertions(+), 868 deletions(-) diff --git a/.github/actions/test-par/action.yml b/.github/actions/test-par/action.yml index 9ff0ad8dc98..03827818ecd 100644 --- a/.github/actions/test-par/action.yml +++ b/.github/actions/test-par/action.yml @@ -36,7 +36,8 @@ runs: shell: bash working-directory: petsc run: | - sudo ./configure PETSC_ARCH=linux-gnu --download-fblaslapack --download-openmpi + sudo wget -P $GITHUB_WORKSPACE/petsc https://download.open-mpi.org/release/open-mpi/v5.0/openmpi-5.0.2.tar.gz + sudo ./configure PETSC_ARCH=linux-gnu --download-fblaslapack --download-openmpi=$GITHUB_WORKSPACE/petsc/openmpi-5.0.2.tar.gz sudo make all - name: Configure PETSc diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dcd7632e787..80b6c6dbe90 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -167,7 +167,7 @@ jobs: if [ "${{ github.ref_name }}" == "master" ]; then pixi run autotest -m "not slow and not regression and not developmode" else - pixi run autotest + pixi run autotest --smoke fi - name: Upload failed test output diff --git a/.github/workflows/pixi_auto_update.yml b/.github/workflows/pixi_auto_update.yml index 200ae9da00b..d7ef5275ace 100644 --- a/.github/workflows/pixi_auto_update.yml +++ b/.github/workflows/pixi_auto_update.yml @@ -16,6 +16,7 @@ jobs: with: pixi-version: "latest" cache: false + - name: Update pixi lock file run: | rm pixi.lock diff --git a/autotest/test_testmodels_mf6.py b/autotest/test_testmodels_mf6.py index a40a5280000..717c831b4be 100644 --- a/autotest/test_testmodels_mf6.py +++ b/autotest/test_testmodels_mf6.py @@ -28,6 +28,9 @@ "test016_Keating_disu_dev", "test053_npf-a-nwt_dev", "test053_npf-b-nwt_dev", + # todo reinstate when flopy fixed: https://github.com/modflowpy/flopy/issues/2145 + "test001h_evt_array4", + "test001h_rch_array4", ] diff --git a/pixi.lock b/pixi.lock index d12811c8759..f1d216326eb 100644 --- a/pixi.lock +++ b/pixi.lock @@ -25,14 +25,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py39h7633fee_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -41,25 +41,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.50.0-py39hd1e30aa_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py39hd1e30aa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fortran-language-server-1.12.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fprettify-0.3.7-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-2.50.0-h5abf519_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-hfa15dee_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.9-h98fc4e7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.1-hfa15dee_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.1-h98fc4e7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda @@ -78,14 +79,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp15-15.0.7-default_h127d8a8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.2-default_h5d6823c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.3-default_h5d6823c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 @@ -96,23 +99,25 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.48-h71f35ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.2-h2448989_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.3-h2448989_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.0-hce6bd6c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda @@ -122,7 +127,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda @@ -131,18 +136,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py39hd1e30aa_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.3-py39hf3d152e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py39he9076e7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.4-py39hf3d152e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py39he9076e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mfpymake-1.2.9-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.4-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-hf1915f5_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-hca2cd23_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda @@ -162,7 +167,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 @@ -185,12 +190,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-4_cp39.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h112747c_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-hc9dc06e_21.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.18.0-py39h9fdd4d6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h474f0d3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py39h474f0d3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py39h6404dd3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py39h3d6467e_0.conda @@ -201,7 +206,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py39hd1e30aa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda @@ -216,7 +221,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda @@ -230,9 +235,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda - - pypi: git+https://github.com/modflowpy/flopy.git@4c44cb0d9d6ef02c092938dad943cdb8285f82a7 - - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@e65c4d3304f0230345d6f1d4d8f911e0c2eb7c64 - - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@c6811fded7d832506c8bf98cef9ffffa31e2da3b + - pypi: https://files.pythonhosted.org/packages/31/a2/2f12e3a6e45935ff694654b710961b03310b0e1ec997ee9f416d3c873f87/contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: git+https://github.com/modflowpy/flopy.git@9e87acddcf0740aac491826ef86fd45ae2304dac + - pypi: https://files.pythonhosted.org/packages/8b/c6/636f008104908a93b80419f756be755bb91df4b8a0c88d5158bb52c82c3a/fonttools-4.51.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5e/2c/513395a63a9e1124a5648addbf73be23cc603f955af026b04416da98dc96/matplotlib-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@08eff72b73da66541f7a08ddf398298210ce3758 + - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/atk-1.0-2.38.0-h1d18e73_1.tar.bz2 @@ -250,13 +258,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.0-py39h6be1789_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.1-py39h0ca7971_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/expat-2.6.2-h73e2aa4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -265,21 +273,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.14.2-h5bb23bf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.50.0-py39ha09f3b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.51.0-py39ha09f3b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fortran-language-server-1.12.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fprettify-0.3.7-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.10-hbcb3906_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.42.10-hd9e0ca3_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/geos-3.12.1-h93d8f39_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/gettext-0.21.1-h8a4c099_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.1-hb7f2c08_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gettext-0.22.5-h5ff76d1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gettext-tools-0.22.5-h5ff76d1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.13-h73e2aa4_1003.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-2.50.0-ha5baa68_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk2-2.24.33-h8ca4665_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-8.3.0-hf45c392_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-73.2-hf5e326d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda @@ -294,45 +303,51 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.5-py39h8ee36c8_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.16-ha2f27b4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-21_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libasprintf-0.22.5-h5ff76d1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libasprintf-devel-0.22.5-h5ff76d1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.1.0-h0dc2134_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.1.0-h0dc2134_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.1.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-21_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-16.0.6-hd57cbcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.20-h49d49c5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libgd-2.3.3-h0dceb68_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-0.22.5-h5ff76d1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-devel-0.22.5-h5ff76d1_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.0-h81c1438_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.0-h81c1438_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.22.5-h5ff76d1_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-devel-0.22.5-h5ff76d1_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-21_osx64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.26-openmp_hfef2a42_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_hfef2a42_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.43-h92b6c6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.56.3-h1877882_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.58.0-h7b06fc5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.2-h92b6c6a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.6.0-h129831d_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtool-2.4.7-hf0c8a7f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-1.3.2-h44782d1_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.3.2-h0dc2134_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.3.2-h10d778d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.15-hb7f2c08_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.6-hc0ae0f7_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.2-hb6ac08f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.3-hb6ac08f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.5-py39ha09f3b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.3-py39h6e9494a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.3-py39h7070ae8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.4-py39h6e9494a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.4-py39h7070ae8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mfpymake-1.2.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4.20240210-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda @@ -373,7 +388,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.18.0-py39hcf47035_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.12.0-py39h0ed1e0f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.0-py39h0ed1e0f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.3-py39h19e25c1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 @@ -383,7 +398,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4-py39ha09f3b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-15.1.0-py39hdc70f33_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda @@ -396,9 +411,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h8a1eda9_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.5-h829000d_0.conda - - pypi: git+https://github.com/modflowpy/flopy.git@4c44cb0d9d6ef02c092938dad943cdb8285f82a7 - - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@e65c4d3304f0230345d6f1d4d8f911e0c2eb7c64 - - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@c6811fded7d832506c8bf98cef9ffffa31e2da3b + - pypi: https://files.pythonhosted.org/packages/e9/1e/09f0fdf21d3a71e298cfbc1944eb1f74c1f025ca6193f6c75caa35e27b10/contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl + - pypi: git+https://github.com/modflowpy/flopy.git@9e87acddcf0740aac491826ef86fd45ae2304dac + - pypi: https://files.pythonhosted.org/packages/bb/4c/16629110b4fccedd985a9fd953490a99e2449a120f065a093dea2898dad8/fonttools-4.51.0-cp39-cp39-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/84/5f/a0c7a4ce9cc96d3e592c44d1c0f2ebdf5f101e25ced2c14902ae7faa4ff4/matplotlib-3.8.4-cp39-cp39-macosx_10_12_x86_64.whl + - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@08eff72b73da66541f7a08ddf398298210ce3758 + - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hcb7b3dd_1.tar.bz2 @@ -416,13 +434,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.2.0-py39he9de807_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.2.1-py39h48c5dd5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.6.2-hebf3989_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -431,21 +449,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.14.2-h82840c6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.50.0-py39h17cfd9d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.51.0-py39h17cfd9d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fortran-language-server-1.12.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fprettify-0.3.7-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.10-h27ca646_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.42.10-hcea6d13_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/geos-3.12.1-h965bd2d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-0.21.1-h0186832_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.1-h1a8c8d9_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-0.22.5-h8fbad5d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-tools-0.22.5-h8fbad5d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.13-hebf3989_1003.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-2.50.0-hc7d6d94_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk2-2.24.33-h7895bb2_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-8.3.0-h8f0ba13_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda @@ -460,45 +479,51 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.5-py39hbd775c9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-21_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-0.22.5-h8fbad5d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-devel-0.22.5-h8fbad5d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-22_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hb547adb_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hb547adb_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-21_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-22_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-16.0.6-h4653b0c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.20-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-hfdf3952_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-0.22.5-h8fbad5d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-devel-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.0-hfc324ee_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.0-hfc324ee_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8fbad5d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-21_osxarm64_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.26-openmp_h6c19121_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-22_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h6c19121_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.43-h091b4b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.56.3-h55a2576_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.58.0-hb3d354b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.2-h091b4b1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.6.0-h07db509_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtool-2.4.7-hb7217d7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-1.3.2-hf30222e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.3.2-hb547adb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.3.2-h93a5062_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.15-hf346824_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.2-hcd81f8e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.3-hcd81f8e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.5-py39h17cfd9d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.3-py39hdf13c20_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.3-py39hbab7938_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.4-py39hdf13c20_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.4-py39hbab7938_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mfpymake-1.2.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4.20240210-h078ce10_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda @@ -539,7 +564,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.18.0-py39h9a407ce_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.12.0-py39hcc04109_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.0-py39hcc04109_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.0.3-py39ha70ab96_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 @@ -549,7 +574,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4-py39h17cfd9d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-15.1.0-py39h0f82c59_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda @@ -562,9 +587,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-h53f4e23_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.5-h4f39d0f_0.conda - - pypi: git+https://github.com/modflowpy/flopy.git@4c44cb0d9d6ef02c092938dad943cdb8285f82a7 - - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@e65c4d3304f0230345d6f1d4d8f911e0c2eb7c64 - - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@c6811fded7d832506c8bf98cef9ffffa31e2da3b + - pypi: https://files.pythonhosted.org/packages/1e/f5/8a0e688c3a6098a358fa359da6a09a7b9afd8f3f6c9b83e9898c29e87b95/contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl + - pypi: git+https://github.com/modflowpy/flopy.git@9e87acddcf0740aac491826ef86fd45ae2304dac + - pypi: https://files.pythonhosted.org/packages/3e/d8/db820b6243325f29e93de36273fdd48f3c1dce7fa859be5ed3708e174eba/fonttools-4.51.0-cp39-cp39-macosx_10_9_universal2.whl + - pypi: https://files.pythonhosted.org/packages/d5/88/83aee628339486de57fcc8c1387e28de816182edcfc42928cff02c364664/matplotlib-3.8.4-cp39-cp39-macosx_11_0_arm64.whl + - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@08eff72b73da66541f7a08ddf398298210ce3758 + - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda @@ -581,13 +609,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.2.0-py39h1f6ef14_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.2.1-py39h1f6ef14_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/expat-2.6.2-h63175ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -596,23 +624,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.14.2-hbde0cde_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.50.0-py39ha55989b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.51.0-py39ha55989b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fortran-language-server-1.12.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fprettify-0.3.7-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-hdaf720e_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/fribidi-1.0.10-h8d14728_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.12.1-h1537add_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/getopt-win32-0.1-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/gettext-0.21.1-h5728263_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gettext-0.22.5-h5728263_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gettext-tools-0.22.5-h7d00a51_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.13-h63175ca_1003.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-2.50.0-had6c3a3_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.22.9-h001b923_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.22.9-hb4038d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.24.1-h001b923_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.1-hb4038d2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-8.3.0-h7ab893a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-73.2-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda @@ -629,28 +658,34 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.2-heb0366b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-21_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libasprintf-0.22.5-h5728263_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libasprintf-devel-0.22.5-h5728263_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-22_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-hcfcfb64_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-hcfcfb64_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-21_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.2-default_hf64faad_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-22_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.3-default_hf64faad_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.20-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h312136b_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-0.22.5-h5728263_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-devel-0.22.5-h5728263_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.9.3-default_haede6df_1009.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-devel-0.22.5-h5728263_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-21_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-22_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libogg-1.3.4-h8ffe710_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.43-h19919ed_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.2-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.6.0-hddb2be6_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libvorbis-1.3.7-h0e60522_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-1.3.2-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.3.2-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.3.2-hcfcfb64_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.15-hcd874cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.6-hc3477c8_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda @@ -661,17 +696,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py39ha55989b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.3-py39hcbf5309_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.3-py39hf19769e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.4-py39hcbf5309_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.4-py39hf19769e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mfpymake-1.2.9-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.0.0-h66d3029_49657.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_692.conda - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py39hddb5d58_0.conda @@ -688,7 +723,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-hfa6e2cd_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 @@ -712,11 +747,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-306-py39h99910a6_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.1-py39ha55989b_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/qt-main-5.15.8-h9e85ed6_20.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/qt-main-5.15.8-hcef0176_21.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.18.0-py39hf21820d_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.12.0-py39hddb5d58_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.0-py39hddb5d58_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/shapely-2.0.3-py39h61a8cf5_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/sip-6.7.12-py39h99910a6_0.conda @@ -728,7 +763,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.4-py39ha55989b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-15.1.0-py39ha55989b_0.conda @@ -742,7 +777,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-kbproto-1.0.7-hcd874cb_1002.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libice-1.1.1-hcd874cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libsm-1.2.4-hcd874cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libx11-1.8.7-hefa74cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libx11-1.8.9-hefa74cf_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.11-hcd874cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.3-hcd874cb_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.4-hcd874cb_2.conda @@ -755,9 +790,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.2.13-hcfcfb64_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.5-h12be248_0.conda - - pypi: git+https://github.com/modflowpy/flopy.git@4c44cb0d9d6ef02c092938dad943cdb8285f82a7 - - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@e65c4d3304f0230345d6f1d4d8f911e0c2eb7c64 - - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@c6811fded7d832506c8bf98cef9ffffa31e2da3b + - pypi: https://files.pythonhosted.org/packages/62/5c/08e3a7a35762c8decb6be01c7ec1f4b5f85ef2e2fbb44af87e9caf25a879/contourpy-1.2.1-cp39-cp39-win_amd64.whl + - pypi: git+https://github.com/modflowpy/flopy.git@9e87acddcf0740aac491826ef86fd45ae2304dac + - pypi: https://files.pythonhosted.org/packages/5e/62/ec6247534b077c9627e745d8046027ae363ed6d6407f8010650439ecbda1/fonttools-4.51.0-cp39-cp39-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/54/af/17195cf1f43cd3be79b15aecc5b7e44ea08456bd0048ad8dcd3a5fd45c45/matplotlib-3.8.4-cp39-cp39-win_amd64.whl + - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@08eff72b73da66541f7a08ddf398298210ce3758 + - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f packages: - kind: conda name: _libgcc_mutex @@ -817,7 +855,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/appdirs + - pkg:pypi/appdirs@1.4.4 size: 12840 timestamp: 1603108499239 - kind: conda @@ -904,7 +942,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/attrs + - pkg:pypi/attrs@23.2.0 size: 54582 timestamp: 1704011393776 - kind: conda @@ -928,6 +966,8 @@ packages: - typing_extensions >=4.0.1 license: MIT license_family: MIT + purls: + - pkg:pypi/black@24.3.0 size: 296255 timestamp: 1710785014536 - kind: conda @@ -950,6 +990,8 @@ packages: - typing_extensions >=4.0.1 license: MIT license_family: MIT + purls: + - pkg:pypi/black@24.3.0 size: 296034 timestamp: 1710785156011 - kind: conda @@ -972,6 +1014,8 @@ packages: - typing_extensions >=4.0.1 license: MIT license_family: MIT + purls: + - pkg:pypi/black@24.3.0 size: 310810 timestamp: 1710785196689 - kind: conda @@ -994,6 +1038,8 @@ packages: - typing_extensions >=4.0.1 license: MIT license_family: MIT + purls: + - pkg:pypi/black@24.3.0 size: 295298 timestamp: 1710784875392 - kind: conda @@ -1013,6 +1059,8 @@ packages: - python >=3 license: MIT license_family: MIT + purls: + - pkg:pypi/bmipy@2.0.1 size: 14075 timestamp: 1698243713437 - kind: conda @@ -1173,6 +1221,8 @@ packages: - libbrotlicommon 1.1.0 hd590300_1 license: MIT license_family: MIT + purls: + - pkg:pypi/brotli@1.1.0 size: 350065 timestamp: 1695990113673 - kind: conda @@ -1192,6 +1242,8 @@ packages: - libbrotlicommon 1.1.0 h0dc2134_1 license: MIT license_family: MIT + purls: + - pkg:pypi/brotli@1.1.0 size: 367262 timestamp: 1695990623703 - kind: conda @@ -1213,6 +1265,8 @@ packages: - libbrotlicommon 1.1.0 hcfcfb64_1 license: MIT license_family: MIT + purls: + - pkg:pypi/brotli@1.1.0 size: 321654 timestamp: 1695990742536 - kind: conda @@ -1233,6 +1287,8 @@ packages: - libbrotlicommon 1.1.0 hb547adb_1 license: MIT license_family: MIT + purls: + - pkg:pypi/brotli@1.1.0 size: 344364 timestamp: 1695991093404 - kind: conda @@ -1448,6 +1504,8 @@ packages: depends: - python >=3.7 license: ISC + purls: + - pkg:pypi/certifi@2024.2.2 size: 160559 timestamp: 1707022289175 - kind: conda @@ -1464,7 +1522,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/charset-normalizer + - pkg:pypi/charset-normalizer@3.3.2 size: 46597 timestamp: 1698833765762 - kind: conda @@ -1482,7 +1540,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/click + - pkg:pypi/click@8.1.7 size: 84437 timestamp: 1692311973840 - kind: conda @@ -1501,7 +1559,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/click + - pkg:pypi/click@8.1.7 size: 85051 timestamp: 1692312207348 - kind: conda @@ -1518,7 +1576,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/colorama + - pkg:pypi/colorama@0.4.6 size: 25170 timestamp: 1666700778190 - kind: conda @@ -1535,19 +1593,132 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/configargparse + - pkg:pypi/configargparse@1.7 size: 39491 timestamp: 1690138171226 +- kind: pypi + name: contourpy + version: 1.2.1 + url: https://files.pythonhosted.org/packages/e9/1e/09f0fdf21d3a71e298cfbc1944eb1f74c1f025ca6193f6c75caa35e27b10/contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl + sha256: bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b + requires_dist: + - numpy >=1.20 + - furo ; extra == 'docs' + - sphinx >=7.2 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - bokeh ; extra == 'bokeh' + - selenium ; extra == 'bokeh' + - contourpy[bokeh,docs] ; extra == 'mypy' + - docutils-stubs ; extra == 'mypy' + - mypy ==1.8.0 ; extra == 'mypy' + - types-pillow ; extra == 'mypy' + - contourpy[test-no-images] ; extra == 'test' + - matplotlib ; extra == 'test' + - pillow ; extra == 'test' + - pytest ; extra == 'test-no-images' + - pytest-cov ; extra == 'test-no-images' + - pytest-xdist ; extra == 'test-no-images' + - wurlitzer ; extra == 'test-no-images' + requires_python: '>=3.9' +- kind: pypi + name: contourpy + version: 1.2.1 + url: https://files.pythonhosted.org/packages/31/a2/2f12e3a6e45935ff694654b710961b03310b0e1ec997ee9f416d3c873f87/contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445 + requires_dist: + - numpy >=1.20 + - furo ; extra == 'docs' + - sphinx >=7.2 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - bokeh ; extra == 'bokeh' + - selenium ; extra == 'bokeh' + - contourpy[bokeh,docs] ; extra == 'mypy' + - docutils-stubs ; extra == 'mypy' + - mypy ==1.8.0 ; extra == 'mypy' + - types-pillow ; extra == 'mypy' + - contourpy[test-no-images] ; extra == 'test' + - matplotlib ; extra == 'test' + - pillow ; extra == 'test' + - pytest ; extra == 'test-no-images' + - pytest-cov ; extra == 'test-no-images' + - pytest-xdist ; extra == 'test-no-images' + - wurlitzer ; extra == 'test-no-images' + requires_python: '>=3.9' +- kind: pypi + name: contourpy + version: 1.2.1 + url: https://files.pythonhosted.org/packages/62/5c/08e3a7a35762c8decb6be01c7ec1f4b5f85ef2e2fbb44af87e9caf25a879/contourpy-1.2.1-cp39-cp39-win_amd64.whl + sha256: 10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9 + requires_dist: + - numpy >=1.20 + - furo ; extra == 'docs' + - sphinx >=7.2 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - bokeh ; extra == 'bokeh' + - selenium ; extra == 'bokeh' + - contourpy[bokeh,docs] ; extra == 'mypy' + - docutils-stubs ; extra == 'mypy' + - mypy ==1.8.0 ; extra == 'mypy' + - types-pillow ; extra == 'mypy' + - contourpy[test-no-images] ; extra == 'test' + - matplotlib ; extra == 'test' + - pillow ; extra == 'test' + - pytest ; extra == 'test-no-images' + - pytest-cov ; extra == 'test-no-images' + - pytest-xdist ; extra == 'test-no-images' + - wurlitzer ; extra == 'test-no-images' + requires_python: '>=3.9' +- kind: pypi + name: contourpy + version: 1.2.1 + url: https://files.pythonhosted.org/packages/1e/f5/8a0e688c3a6098a358fa359da6a09a7b9afd8f3f6c9b83e9898c29e87b95/contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl + sha256: 1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f + requires_dist: + - numpy >=1.20 + - furo ; extra == 'docs' + - sphinx >=7.2 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - bokeh ; extra == 'bokeh' + - selenium ; extra == 'bokeh' + - contourpy[bokeh,docs] ; extra == 'mypy' + - docutils-stubs ; extra == 'mypy' + - mypy ==1.8.0 ; extra == 'mypy' + - types-pillow ; extra == 'mypy' + - contourpy[test-no-images] ; extra == 'test' + - matplotlib ; extra == 'test' + - pillow ; extra == 'test' + - pytest ; extra == 'test-no-images' + - pytest-cov ; extra == 'test-no-images' + - pytest-xdist ; extra == 'test-no-images' + - wurlitzer ; extra == 'test-no-images' + requires_python: '>=3.9' - kind: conda name: contourpy - version: 1.2.0 + version: 1.2.1 + build: py39h0ca7971_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.1-py39h0ca7971_0.conda + sha256: 2ed1f40e016afaeb705297d6ce5b474c3570890bf972d3425c37bf45e196d088 + md5: a4c478d3b64c81d1742dc8073e4996b6 + depends: + - libcxx >=16 + - numpy >=1.20 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 232611 + timestamp: 1712430213507 +- kind: conda + name: contourpy + version: 1.2.1 build: py39h1f6ef14_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.2.0-py39h1f6ef14_0.conda - sha256: c1120879081e81d03a5086fd68d4e01e316b69a5230da9ff1f2e17479f6ce109 - md5: 9eeea323eacb6549cbb3df3d81181cb2 + url: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.2.1-py39h1f6ef14_0.conda + sha256: 32820a069906394d10bd908a0cfdbb60b940fb81e71aef3303ab9ab93c4625e6 + md5: 03e25c6bae87f4f9595337255b44b0fb depends: - - numpy >=1.20,<2 + - numpy >=1.20 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 - ucrt >=10.0.20348.0 @@ -1555,71 +1726,44 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/contourpy - size: 185949 - timestamp: 1699042094923 + size: 186813 + timestamp: 1712430556544 - kind: conda name: contourpy - version: 1.2.0 - build: py39h6be1789_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.0-py39h6be1789_0.conda - sha256: cd0808189a10f45b41ef8eee2f373ae870673b0fe49d17ecee4e401445f17ea6 - md5: f612db80986ecdc867662b9dc4e46f11 + version: 1.2.1 + build: py39h48c5dd5_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.2.1-py39h48c5dd5_0.conda + sha256: a0a42c5195a621ec86bb20b0f36e5406047bd655219cfab824ec20a2c6a0836d + md5: 2c4998473ca34fa4df959bd90eb9247a depends: - - __osx >=10.9 - - libcxx >=16.0.6 - - numpy >=1.20,<2 + - libcxx >=16 + - numpy >=1.20 - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/contourpy - size: 230650 - timestamp: 1699041727321 + size: 225466 + timestamp: 1712430376578 - kind: conda name: contourpy - version: 1.2.0 + version: 1.2.1 build: py39h7633fee_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py39h7633fee_0.conda - sha256: 7a85421667d97132c5d23575da63c2da850775c81832607e56bfd881c9750f3a - md5: ed71ad3e30eb03da363fb797419cce98 + url: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py39h7633fee_0.conda + sha256: 7799c6cd8425ac69b2495b2acf938d85e6776c0c9129de86d18ec55e53bcfefc + md5: bdc188e59857d6efab332714e0d01d93 depends: - libgcc-ng >=12 - libstdcxx-ng >=12 - - numpy >=1.20,<2 - - python >=3.9,<3.10.0a0 - - python_abi 3.9.* *_cp39 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/contourpy - size: 237856 - timestamp: 1699042102939 -- kind: conda - name: contourpy - version: 1.2.0 - build: py39he9de807_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.2.0-py39he9de807_0.conda - sha256: ac729314c46e04b455e0b1e08b2c223fe92c4f89e3e13c2ae42e1e349ad3958b - md5: 1cf7d8ee627725a514622c863dd8821b - depends: - - __osx >=10.9 - - libcxx >=16.0.6 - - numpy >=1.20,<2 + - numpy >=1.20 - python >=3.9,<3.10.0a0 - - python >=3.9,<3.10.0a0 *_cpython - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/contourpy - size: 223476 - timestamp: 1699042196671 + size: 241771 + timestamp: 1712430062056 - kind: conda name: cycler version: 0.12.1 @@ -1634,7 +1778,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/cycler + - pkg:pypi/cycler@0.12.1 size: 13458 timestamp: 1696677888423 - kind: conda @@ -1668,7 +1812,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/editables + - pkg:pypi/editables@0.5 size: 10988 timestamp: 1705857085102 - kind: conda @@ -1685,26 +1829,24 @@ packages: - python >=3.7 license: MIT and PSF-2.0 purls: - - pkg:pypi/exceptiongroup + - pkg:pypi/exceptiongroup@1.2.0 size: 20551 timestamp: 1704921321122 - kind: conda name: execnet - version: 2.0.2 + version: 2.1.1 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda - sha256: 88ea68a360198af39368beecf057af6b31f0ae38071b2bdb2aa961b6ae5427c0 - md5: 67de0d8241e1060a479e3c37793e26f9 + url: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda + sha256: 564bc012d73ca29964e7acca18d60b2fa8d20eea6d258d98cfc24df5167beaf0 + md5: 15dda3cdbf330abfe9f555d22f66db46 depends: - - python >=3.7 + - python >=3.8 license: MIT license_family: MIT - purls: - - pkg:pypi/execnet - size: 36534 - timestamp: 1688933537234 + size: 38883 + timestamp: 1712591929944 - kind: conda name: expat version: 2.6.2 @@ -1764,20 +1906,18 @@ packages: timestamp: 1710362455984 - kind: conda name: filelock - version: 3.13.3 + version: 3.13.4 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.3-pyhd8ed1ab_0.conda - sha256: 3bb2b4b8b97160ee7d2ed40b9dbc78555932274e82ef314c8a400a1d17aa4626 - md5: ff15f46b0d34308f4d40c1c51df07592 + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda + sha256: 2eef860d5ad6ef1fac5002a3b75661f765d448e9f997f64482b0e51a097e037f + md5: 6baa2e7fc09bd2c7c82cb6662d5f1d36 depends: - python >=3.7 license: Unlicense - purls: - - pkg:pypi/filelock - size: 15611 - timestamp: 1711394721380 + size: 15707 + timestamp: 1712686250786 - kind: conda name: flaky version: 3.8.1 @@ -1792,13 +1932,13 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/flaky + - pkg:pypi/flaky@3.8.1 size: 22156 timestamp: 1710293112378 - kind: pypi name: flopy version: 3.7.0.dev0 - url: git+https://github.com/modflowpy/flopy.git@4c44cb0d9d6ef02c092938dad943cdb8285f82a7 + url: git+https://github.com/modflowpy/flopy.git@9e87acddcf0740aac491826ef86fd45ae2304dac requires_dist: - numpy <2.0.0, >=1.15.0 - matplotlib >=1.4.0 @@ -1845,6 +1985,7 @@ packages: - pytest-cov ; extra == 'test' - pytest-dotenv ; extra == 'test' - pytest-xdist ; extra == 'test' + - pyzmq >=25.1.2 ; extra == 'test' - virtualenv ; extra == 'test' requires_python: '>=3.8' - kind: conda @@ -2003,14 +2144,162 @@ packages: license_family: BSD size: 4102 timestamp: 1566932280397 +- kind: pypi + name: fonttools + version: 4.51.0 + url: https://files.pythonhosted.org/packages/bb/4c/16629110b4fccedd985a9fd953490a99e2449a120f065a093dea2898dad8/fonttools-4.51.0-cp39-cp39-macosx_10_9_x86_64.whl + sha256: f7e89853d8bea103c8e3514b9f9dc86b5b4120afb4583b57eb10dfa5afbe0936 + requires_dist: + - fs <3, >=2.2.0 ; extra == 'all' + - lxml >=4.0 ; extra == 'all' + - zopfli >=0.1.4 ; extra == 'all' + - lz4 >=1.7.4.2 ; extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - skia-pathops >=0.5.0 ; extra == 'all' + - uharfbuzz >=0.23.0 ; extra == 'all' + - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - lz4 >=1.7.4.2 ; extra == 'graphite' + - pycairo ; extra == 'interpolatable' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - lxml >=4.0 ; extra == 'lxml' + - skia-pathops >=0.5.0 ; extra == 'pathops' + - matplotlib ; extra == 'plot' + - uharfbuzz >=0.23.0 ; extra == 'repacker' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - fs <3, >=2.2.0 ; extra == 'ufo' + - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - zopfli >=0.1.4 ; extra == 'woff' + - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + requires_python: '>=3.8' +- kind: pypi + name: fonttools + version: 4.51.0 + url: https://files.pythonhosted.org/packages/8b/c6/636f008104908a93b80419f756be755bb91df4b8a0c88d5158bb52c82c3a/fonttools-4.51.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 0d145976194a5242fdd22df18a1b451481a88071feadf251221af110ca8f00ce + requires_dist: + - fs <3, >=2.2.0 ; extra == 'all' + - lxml >=4.0 ; extra == 'all' + - zopfli >=0.1.4 ; extra == 'all' + - lz4 >=1.7.4.2 ; extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - skia-pathops >=0.5.0 ; extra == 'all' + - uharfbuzz >=0.23.0 ; extra == 'all' + - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - lz4 >=1.7.4.2 ; extra == 'graphite' + - pycairo ; extra == 'interpolatable' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - lxml >=4.0 ; extra == 'lxml' + - skia-pathops >=0.5.0 ; extra == 'pathops' + - matplotlib ; extra == 'plot' + - uharfbuzz >=0.23.0 ; extra == 'repacker' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - fs <3, >=2.2.0 ; extra == 'ufo' + - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - zopfli >=0.1.4 ; extra == 'woff' + - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + requires_python: '>=3.8' +- kind: pypi + name: fonttools + version: 4.51.0 + url: https://files.pythonhosted.org/packages/5e/62/ec6247534b077c9627e745d8046027ae363ed6d6407f8010650439ecbda1/fonttools-4.51.0-cp39-cp39-win_amd64.whl + sha256: 599bdb75e220241cedc6faebfafedd7670335d2e29620d207dd0378a4e9ccc5a + requires_dist: + - fs <3, >=2.2.0 ; extra == 'all' + - lxml >=4.0 ; extra == 'all' + - zopfli >=0.1.4 ; extra == 'all' + - lz4 >=1.7.4.2 ; extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - skia-pathops >=0.5.0 ; extra == 'all' + - uharfbuzz >=0.23.0 ; extra == 'all' + - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - lz4 >=1.7.4.2 ; extra == 'graphite' + - pycairo ; extra == 'interpolatable' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - lxml >=4.0 ; extra == 'lxml' + - skia-pathops >=0.5.0 ; extra == 'pathops' + - matplotlib ; extra == 'plot' + - uharfbuzz >=0.23.0 ; extra == 'repacker' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - fs <3, >=2.2.0 ; extra == 'ufo' + - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - zopfli >=0.1.4 ; extra == 'woff' + - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + requires_python: '>=3.8' +- kind: pypi + name: fonttools + version: 4.51.0 + url: https://files.pythonhosted.org/packages/3e/d8/db820b6243325f29e93de36273fdd48f3c1dce7fa859be5ed3708e174eba/fonttools-4.51.0-cp39-cp39-macosx_10_9_universal2.whl + sha256: 60a3409c9112aec02d5fb546f557bca6efa773dcb32ac147c6baf5f742e6258b + requires_dist: + - fs <3, >=2.2.0 ; extra == 'all' + - lxml >=4.0 ; extra == 'all' + - zopfli >=0.1.4 ; extra == 'all' + - lz4 >=1.7.4.2 ; extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - skia-pathops >=0.5.0 ; extra == 'all' + - uharfbuzz >=0.23.0 ; extra == 'all' + - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - lz4 >=1.7.4.2 ; extra == 'graphite' + - pycairo ; extra == 'interpolatable' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - lxml >=4.0 ; extra == 'lxml' + - skia-pathops >=0.5.0 ; extra == 'pathops' + - matplotlib ; extra == 'plot' + - uharfbuzz >=0.23.0 ; extra == 'repacker' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - fs <3, >=2.2.0 ; extra == 'ufo' + - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'unicode' + - zopfli >=0.1.4 ; extra == 'woff' + - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + requires_python: '>=3.8' - kind: conda name: fonttools - version: 4.50.0 + version: 4.51.0 build: py39h17cfd9d_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.50.0-py39h17cfd9d_0.conda - sha256: 2f40b1ae9cb965f7683dd69af3db71d9575d4b7363a74e230651a669f25d1abd - md5: 9cf95b92068842801c4237e7a799c330 + url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.51.0-py39h17cfd9d_0.conda + sha256: bd20cea14440723d9dba287266fba0b31e96045d1e3d5d488fd4ad198cfd63bd + md5: 6596abf82afe59739e34c930e68f862a depends: - brotli - munkres @@ -2020,18 +2309,16 @@ packages: - unicodedata2 >=14.0.0 license: MIT license_family: MIT - purls: - - pkg:pypi/fonttools - size: 2180527 - timestamp: 1710865966262 + size: 2182509 + timestamp: 1712345020380 - kind: conda name: fonttools - version: 4.50.0 + version: 4.51.0 build: py39ha09f3b3_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.50.0-py39ha09f3b3_0.conda - sha256: 6f319ed091af3d14df5165ceba659869569e6827da9ca084f17237b7e440eee7 - md5: a575dd8aa43e8b7e2e1da6bd6acbddc0 + url: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.51.0-py39ha09f3b3_0.conda + sha256: 52a283f3c1dee76694dd65cea473a594b84f1616f9062630c09b472eedd76fa0 + md5: 713f4aa3625e861796da39bbeb112675 depends: - brotli - munkres @@ -2040,18 +2327,16 @@ packages: - unicodedata2 >=14.0.0 license: MIT license_family: MIT - purls: - - pkg:pypi/fonttools - size: 2218023 - timestamp: 1710866172054 + size: 2200498 + timestamp: 1712344949132 - kind: conda name: fonttools - version: 4.50.0 + version: 4.51.0 build: py39ha55989b_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.50.0-py39ha55989b_0.conda - sha256: bf597dd671fccce939f2d046c32a3d3cc9cba84d0c06aba381f84817a106ac29 - md5: 10eb7013528a70b240bc2297c5dbfbc1 + url: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.51.0-py39ha55989b_0.conda + sha256: 83a225b623e06cf77ee193726b01903db61fef917fcd9e7e7b98c336a509d2cc + md5: 5d19302bab29e347116b743e793aa7d6 depends: - brotli - munkres @@ -2063,18 +2348,16 @@ packages: - vc14_runtime >=14.29.30139 license: MIT license_family: MIT - purls: - - pkg:pypi/fonttools - size: 1877377 - timestamp: 1710866233893 + size: 1888597 + timestamp: 1712345179196 - kind: conda name: fonttools - version: 4.50.0 + version: 4.51.0 build: py39hd1e30aa_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.50.0-py39hd1e30aa_0.conda - sha256: 22a510a2cc44444668f995ce0c8a7ac9653a6442c7f45dc903fa598962066593 - md5: 8b689d531a6f99ef71212081c0126147 + url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.51.0-py39hd1e30aa_0.conda + sha256: 28f93d872710b57ac952e82cd0da53ffda8ee54507cce60f3237f9df1dd0725a + md5: 79f5dd8778873faa54e8f7b2729fe8a6 depends: - brotli - libgcc-ng >=12 @@ -2084,10 +2367,8 @@ packages: - unicodedata2 >=14.0.0 license: MIT license_family: MIT - purls: - - pkg:pypi/fonttools - size: 2287520 - timestamp: 1710865721782 + size: 2291843 + timestamp: 1712344796788 - kind: conda name: fortran-language-server version: 1.12.0 @@ -2101,6 +2382,8 @@ packages: - python >=3.6 license: MIT license_family: MIT + purls: + - pkg:pypi/fortran-language-server@1.12.0 size: 62350 timestamp: 1637570882364 - kind: conda @@ -2117,6 +2400,8 @@ packages: - python >=3.5 license: GPL-3.0-or-later license_family: GPL + purls: + - pkg:pypi/fprettify@0.3.7 size: 137690 timestamp: 1637859635697 - kind: conda @@ -2362,165 +2647,264 @@ packages: timestamp: 1694400856979 - kind: conda name: gettext - version: 0.21.1 - build: h0186832_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-0.21.1-h0186832_0.tar.bz2 - sha256: 093b2f96dc4b48e4952ab8946facec98b34b708a056251fc19c23c3aad30039e - md5: 63d2ff6fddfa74e5458488fd311bf635 - depends: + version: 0.22.5 + build: h5728263_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/gettext-0.22.5-h5728263_2.conda + sha256: cd4ef93fd052a4fe89a4db963c9d69e60c8a434d41968fc9dc8726db67191582 + md5: da84216f88a8c89eb943c683ceb34d7d + depends: + - gettext-tools 0.22.5 h7d00a51_2 + - libasprintf 0.22.5 h5728263_2 + - libasprintf-devel 0.22.5 h5728263_2 + - libgettextpo 0.22.5 h5728263_2 + - libgettextpo-devel 0.22.5 h5728263_2 - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h5728263_2 + - libintl-devel 0.22.5 h5728263_2 license: LGPL-2.1-or-later AND GPL-3.0-or-later - size: 4021036 - timestamp: 1665674192347 + size: 34028 + timestamp: 1712517225377 - kind: conda name: gettext - version: 0.21.1 - build: h27087fc_0 + version: 0.22.5 + build: h59595ed_2 + build_number: 2 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2 - sha256: 4fcfedc44e4c9a053f0416f9fc6ab6ed50644fca3a761126dbd00d09db1f546a - md5: 14947d8770185e5153fdd04d4673ed37 + url: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda + sha256: 386181254ddd2aed1fccdfc217da5b6545f6df4e9979ad8e08f5e91e22eaf7dc + md5: 219ba82e95d7614cf7140d2a4afc0926 depends: + - gettext-tools 0.22.5 h59595ed_2 + - libasprintf 0.22.5 h661eb56_2 + - libasprintf-devel 0.22.5 h661eb56_2 - libgcc-ng >=12 + - libgettextpo 0.22.5 h59595ed_2 + - libgettextpo-devel 0.22.5 h59595ed_2 + - libstdcxx-ng >=12 license: LGPL-2.1-or-later AND GPL-3.0-or-later - size: 4320628 - timestamp: 1665673494324 + size: 475058 + timestamp: 1712512357949 - kind: conda name: gettext - version: 0.21.1 - build: h5728263_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/gettext-0.21.1-h5728263_0.tar.bz2 - sha256: 71c75b0a4dc2cf95d2860ea0076edf9f5558baeb4dacaeecb32643b199074616 - md5: 299d4fd6798a45337042ff5a48219e5f + version: 0.22.5 + build: h5ff76d1_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/gettext-0.22.5-h5ff76d1_2.conda + sha256: ba9a4680b018a4ca517ec20beb25b09c97e293ecd16b931075e689db10291712 + md5: c09b3dcf2adc5a2a32d11ab90289b8fa depends: + - gettext-tools 0.22.5 h5ff76d1_2 + - libasprintf 0.22.5 h5ff76d1_2 + - libasprintf-devel 0.22.5 h5ff76d1_2 + - libcxx >=16 + - libgettextpo 0.22.5 h5ff76d1_2 + - libgettextpo-devel 0.22.5 h5ff76d1_2 - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h5ff76d1_2 + - libintl-devel 0.22.5 h5ff76d1_2 license: LGPL-2.1-or-later AND GPL-3.0-or-later - size: 5579416 - timestamp: 1665676022441 + size: 481687 + timestamp: 1712513003915 - kind: conda name: gettext - version: 0.21.1 - build: h8a4c099_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/gettext-0.21.1-h8a4c099_0.tar.bz2 - sha256: 915d3cd2d777b9b3fc2e87a25901b8e4a6aa1b2b33cf2ba54e9e9ed4f6b67d94 - md5: 1e3aff29ce703d421c43f371ad676cc5 + version: 0.22.5 + build: h8fbad5d_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-0.22.5-h8fbad5d_2.conda + sha256: 7188b466071698759b125aaed9b4d78940e72e6299b0c6dbad6f35c85cf3d27b + md5: 404e2894e9cb2835246cef47317ff763 depends: + - gettext-tools 0.22.5 h8fbad5d_2 + - libasprintf 0.22.5 h8fbad5d_2 + - libasprintf-devel 0.22.5 h8fbad5d_2 + - libcxx >=16 + - libgettextpo 0.22.5 h8fbad5d_2 + - libgettextpo-devel 0.22.5 h8fbad5d_2 - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h8fbad5d_2 + - libintl-devel 0.22.5 h8fbad5d_2 license: LGPL-2.1-or-later AND GPL-3.0-or-later - size: 4153781 - timestamp: 1665674106245 + size: 482649 + timestamp: 1712512963023 - kind: conda - name: giflib - version: 5.2.1 - build: h0b41bf4_3 - build_number: 3 + name: gettext-tools + version: 0.22.5 + build: h59595ed_2 + build_number: 2 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda - sha256: 41ec165704ccce2faa0437f4f53c03c06261a2cc9ff7614828e51427d9261f4b - md5: 96f3b11872ef6fad973eac856cd2624f + url: https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda + sha256: 67d7b1d6fe4f1c516df2000640ec7dcfebf3ff6ea0785f0276870e730c403d33 + md5: 985f2f453fb72408d6b6f1be0f324033 depends: - libgcc-ng >=12 + license: GPL-3.0-or-later + license_family: GPL + size: 2728420 + timestamp: 1712512328692 +- kind: conda + name: gettext-tools + version: 0.22.5 + build: h5ff76d1_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/gettext-tools-0.22.5-h5ff76d1_2.conda + sha256: 4db71a66340d068c57e16c574c356db6df54ac0147b5b26d3313093f7854ee6d + md5: 37e1cb0efeff4d4623a6357e37e0105d + depends: + - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h5ff76d1_2 + license: GPL-3.0-or-later + license_family: GPL + size: 2501207 + timestamp: 1712512940076 +- kind: conda + name: gettext-tools + version: 0.22.5 + build: h7d00a51_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/gettext-tools-0.22.5-h7d00a51_2.conda + sha256: e3621dc3d48399c89bf0dd512a6a398d354429b3b84219473d674aa56e0feef2 + md5: ef1c3bb48c013099c4872640a5f2096c + depends: + - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h5728263_2 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: GPL-3.0-or-later + license_family: GPL + size: 3415835 + timestamp: 1712516856107 +- kind: conda + name: gettext-tools + version: 0.22.5 + build: h8fbad5d_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-tools-0.22.5-h8fbad5d_2.conda + sha256: f60d1671e30ac60598396c11fcec4426f7ddb281bf9e37af2262016b4d812cce + md5: 31117a80d73f4fac856ab09fd9f3c6b5 + depends: + - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h8fbad5d_2 + license: GPL-3.0-or-later + license_family: GPL + size: 2482262 + timestamp: 1712512901194 +- kind: conda + name: giflib + version: 5.2.2 + build: h10d778d_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda + sha256: 2c825df829097536314a195ae5cacaa8695209da6b4400135a65d8e23c008ff8 + md5: 03e8c9b4d3da5f3d6eabdd020c2d63ac license: MIT license_family: MIT - size: 77385 - timestamp: 1678717794467 + size: 74516 + timestamp: 1712692686914 - kind: conda name: giflib - version: 5.2.1 - build: h1a8c8d9_3 - build_number: 3 + version: 5.2.2 + build: h93a5062_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.1-h1a8c8d9_3.conda - sha256: dbf1e431d3e5e03f8eeb77ec08a4c5d6d5d9af84dbef13d4365e397dd389beb8 - md5: f39a05d3dbb0e5024b7deabb2c0993f1 + url: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda + sha256: 843b3f364ff844137e37d5c0a181f11f6d51adcedd216f019d074e5aa5d7e09c + md5: 95fa1486c77505330c20f7202492b913 license: MIT license_family: MIT - size: 71963 - timestamp: 1678718059849 + size: 71613 + timestamp: 1712692611426 - kind: conda name: giflib - version: 5.2.1 - build: hb7f2c08_3 - build_number: 3 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.1-hb7f2c08_3.conda - sha256: 47515e0874bcf67e438e1d5d093b074c1781f055067195f0d00a7790a56d446d - md5: aca150b0186836f893ebac79019e5498 + version: 5.2.2 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + sha256: aac402a8298f0c0cc528664249170372ef6b37ac39fdc92b40601a6aed1e32ff + md5: 3bf7b9fd5a7136126e0234db4b87c8b6 + depends: + - libgcc-ng >=12 license: MIT license_family: MIT - size: 76514 - timestamp: 1678717973971 + size: 77248 + timestamp: 1712692454246 - kind: conda name: glib version: 2.80.0 - build: h39d0aa6_1 - build_number: 1 + build: h39d0aa6_4 + build_number: 4 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_1.conda - sha256: a76ad2d20164be5425269ac9c65dc8a071ea6dbd5ac3090f9b16dc29a7af1dbc - md5: 0384fcbea19fea38cdbf4b3b8924e436 - depends: - - glib-tools 2.80.0 h0a98069_1 - - libglib 2.80.0 h39d0aa6_1 + url: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_4.conda + sha256: 2fc5808143c904a6c33c4521a993fdadf18431f27063af6a7e90e3366a6f57f5 + md5: d0a05e8a76abb68b2beb7b16c6d49213 + depends: + - glib-tools 2.80.0 h0a98069_4 + - libglib 2.80.0 h39d0aa6_4 + - libintl >=0.22.5,<1.0a0 + - libintl-devel - python * - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LGPL-2.1-or-later - size: 491857 - timestamp: 1710939590211 + size: 490761 + timestamp: 1712590680323 - kind: conda name: glib version: 2.80.0 - build: hf2295e7_1 - build_number: 1 + build: hf2295e7_4 + build_number: 4 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_1.conda - sha256: 92e0344072050dafd9f478498a2662cb6e309697b58283793145fd05c413a921 - md5: d3bcc5c186f78feba6f39ea047c35950 + url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_4.conda + sha256: bc874908cc8b0ce26a20f09500aa2617114e72f5251ca4739fc6fd18a6196514 + md5: 5521382ee30b96b35eb0037fc3c4f2b4 depends: - - glib-tools 2.80.0 hde27a5a_1 + - glib-tools 2.80.0 hde27a5a_4 - libgcc-ng >=12 - - libglib 2.80.0 hf2295e7_1 + - libglib 2.80.0 hf2295e7_4 - python * license: LGPL-2.1-or-later - size: 503830 - timestamp: 1710939217743 + size: 503571 + timestamp: 1712590029172 - kind: conda name: glib-tools version: 2.80.0 - build: h0a98069_1 - build_number: 1 + build: h0a98069_4 + build_number: 4 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_1.conda - sha256: 079b56c014b5f70381924db7a70000676e616079045e7a70081e2f3cf69bc969 - md5: b6a4948e65ee42739ce14967e4cacdca + url: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_4.conda + sha256: 319a2c785a992eaecc37d2280b4bb80096020e59382ec7193356f124d987aef1 + md5: 44cd44c004db728bf5788c1d46ce7334 depends: - - libglib 2.80.0 h39d0aa6_1 + - libglib 2.80.0 h39d0aa6_4 + - libintl >=0.22.5,<1.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LGPL-2.1-or-later - size: 94114 - timestamp: 1710939517930 + size: 94161 + timestamp: 1712590633592 - kind: conda name: glib-tools version: 2.80.0 - build: hde27a5a_1 - build_number: 1 + build: hde27a5a_4 + build_number: 4 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_1.conda - sha256: 8d736e120bb1fe3b57f957d8f6b90c9bb035ee1dac167714c9afba395af6878c - md5: 939ddd853b1d98bf6fd22cc0adeda317 + url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_4.conda + sha256: 758e81f0460e273f5c44f5e84ba3fdec734a1cac65b2dde54c58c7f9f853964e + md5: c9deba4959ea5b5f72f1e3e4a71ae014 depends: - libgcc-ng >=12 - - libglib 2.80.0 hf2295e7_1 + - libglib 2.80.0 hf2295e7_4 license: LGPL-2.1-or-later - size: 112852 - timestamp: 1710939161164 + size: 113192 + timestamp: 1712589995868 - kind: conda name: graphite2 version: 1.3.13 @@ -2703,16 +3087,16 @@ packages: timestamp: 1657298551055 - kind: conda name: gst-plugins-base - version: 1.22.9 + version: 1.24.1 build: h001b923_1 build_number: 1 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.22.9-h001b923_1.conda - sha256: e2c37128de5bdc12e3656c9c50e7b1459d8890ea656b866e68293e334356b652 - md5: ef961ec5b46ac75cebd3d68460691c27 + url: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.24.1-h001b923_1.conda + sha256: 14cdc32e1adf2876d23623cc2047489d7bad122b7020e2b23357bd2416744b80 + md5: 7900eb39e6203249accb52fb705a2fb0 depends: - gettext >=0.21.1,<1.0a0 - - gstreamer 1.22.9 hb4038d2_1 + - gstreamer 1.24.1 hb4038d2_1 - libglib >=2.78.4,<3.0a0 - libogg >=1.3.4,<1.4.0a0 - libvorbis >=1.3.7,<1.4.0a0 @@ -2722,22 +3106,22 @@ packages: - vc14_runtime >=14.29.30139 license: LGPL-2.0-or-later license_family: LGPL - size: 2035564 - timestamp: 1711211913043 + size: 2090953 + timestamp: 1711319124984 - kind: conda name: gst-plugins-base - version: 1.22.9 + version: 1.24.1 build: hfa15dee_1 build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-hfa15dee_1.conda - sha256: 58fda05d33182b29e0524d684f626aad5208fb21e0622bc4b9013791dc105417 - md5: b66ddd883308a836ed86c247231aab82 + url: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.1-hfa15dee_1.conda + sha256: 4228bb9b568a09f8e31f0d52d6ccf06e7752dfa1d72af15ee11fd347e6795bca + md5: a6dd2bbc684913e2bef0a54ce56fcbfb depends: - __glibc >=2.17,<3.0.a0 - alsa-lib >=1.2.11,<1.3.0a0 - gettext >=0.21.1,<1.0a0 - - gstreamer 1.22.9 h98fc4e7_1 + - gstreamer 1.24.1 h98fc4e7_1 - libexpat >=2.6.2,<3.0a0 - libgcc-ng >=12 - libglib >=2.80.0,<3.0a0 @@ -2754,17 +3138,17 @@ packages: - xorg-libxrender >=0.9.11,<0.10.0a0 license: LGPL-2.0-or-later license_family: LGPL - size: 2709720 - timestamp: 1711211314174 + size: 2789211 + timestamp: 1711318581613 - kind: conda name: gstreamer - version: 1.22.9 + version: 1.24.1 build: h98fc4e7_1 build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.9-h98fc4e7_1.conda - sha256: 13cbc0ee5fa4a61f6f06e223d23d3c179dfbede51faf87cd2a4821efa2c249f2 - md5: f502076ed4db50d9ee5c907036a5a172 + url: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.1-h98fc4e7_1.conda + sha256: a341496165602c8de4e537e596ba8f5070232d0362a9fe36b3591116a0f0752d + md5: b04b5cdf3ba01430db27979250bc5a1d depends: - __glibc >=2.17,<3.0.a0 - gettext >=0.21.1,<1.0a0 @@ -2775,17 +3159,17 @@ packages: - libstdcxx-ng >=12 license: LGPL-2.0-or-later license_family: LGPL - size: 1982967 - timestamp: 1711211168691 + size: 2010273 + timestamp: 1711318435463 - kind: conda name: gstreamer - version: 1.22.9 + version: 1.24.1 build: hb4038d2_1 build_number: 1 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.22.9-hb4038d2_1.conda - sha256: 4d42bc24434db62c093748ea3ad0b6ba3872b6810b761363585513ebd79b4f87 - md5: 70557ab875e72c1f21e8d2351aeb9c54 + url: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.1-hb4038d2_1.conda + sha256: f2ee66bb1ef3d12f9c2d6784d2c4bf19bb9d4e99c55c96ca4df53c9bd308c084 + md5: 8a6dfe53ad02a3b151e6383a950043ee depends: - gettext >=0.21.1,<1.0a0 - glib >=2.78.4,<3.0a0 @@ -2796,8 +3180,8 @@ packages: - vc14_runtime >=14.29.30139 license: LGPL-2.0-or-later license_family: LGPL - size: 1936661 - timestamp: 1711211717228 + size: 2069365 + timestamp: 1711318923388 - kind: conda name: gtk2 version: 2.24.33 @@ -3012,13 +3396,13 @@ packages: timestamp: 1699925847743 - kind: conda name: hatchling - version: 1.22.4 + version: 1.22.5 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.4-pyhd8ed1ab_0.conda - sha256: e047a6fb6dd790f0cb5dd904809c81d38bdeee974726442f9274f6ac367f68a3 - md5: 8320faf2e07543de1e3968b733c44da1 + url: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.5-pyhd8ed1ab_0.conda + sha256: 885d9070e97d17c07c003c1f346bf7e2efd41e301631bcc1a6fe348843491ed3 + md5: da3efaad48161b8e423a4e25842cb5f5 depends: - editables >=0.3 - importlib-metadata @@ -3030,10 +3414,8 @@ packages: - trove-classifiers license: MIT license_family: MIT - purls: - - pkg:pypi/hatchling - size: 62671 - timestamp: 1711286880652 + size: 62871 + timestamp: 1712264371126 - kind: conda name: icu version: '73.2' @@ -3103,7 +3485,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/idna + - pkg:pypi/idna@3.6 size: 50124 timestamp: 1701027126206 - kind: conda @@ -3120,6 +3502,8 @@ packages: - zipp >=0.5 license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/importlib-metadata@7.1.0 size: 27043 timestamp: 1710971498183 - kind: conda @@ -3155,7 +3539,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/importlib-resources + - pkg:pypi/importlib-resources@6.4.0 size: 33056 timestamp: 1711041009039 - kind: conda @@ -3172,7 +3556,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/iniconfig + - pkg:pypi/iniconfig@2.0.0 size: 11101 timestamp: 1673103208955 - kind: conda @@ -3203,7 +3587,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/jinja2 + - pkg:pypi/jinja2@3.1.3 size: 111589 timestamp: 1704967140287 - kind: conda @@ -3225,6 +3609,8 @@ packages: - rpds-py >=0.7.1 license: MIT license_family: MIT + purls: + - pkg:pypi/jsonschema@4.21.1 size: 72817 timestamp: 1705707712082 - kind: conda @@ -3243,7 +3629,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/jsonschema-specifications + - pkg:pypi/jsonschema-specifications@2023.12.1 size: 16431 timestamp: 1703778502971 - kind: conda @@ -3261,6 +3647,8 @@ packages: - traitlets >=5.3 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/jupyter-core@5.7.1 size: 80149 timestamp: 1704727554036 - kind: conda @@ -3279,6 +3667,8 @@ packages: - traitlets >=5.3 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/jupyter-core@5.7.2 size: 79895 timestamp: 1710257881036 - kind: conda @@ -3297,6 +3687,8 @@ packages: - traitlets >=5.3 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/jupyter-core@5.7.2 size: 96366 timestamp: 1710257842034 - kind: conda @@ -3314,6 +3706,8 @@ packages: - traitlets >=5.3 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/jupyter-core@5.7.2 size: 79658 timestamp: 1710257600539 - kind: conda @@ -3336,7 +3730,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/jupytext + - pkg:pypi/jupytext@1.16.1 size: 102909 timestamp: 1705172248226 - kind: conda @@ -3370,7 +3764,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/kiwisolver + - pkg:pypi/kiwisolver@1.4.5 size: 55660 timestamp: 1695380433980 - kind: conda @@ -3390,7 +3784,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/kiwisolver + - pkg:pypi/kiwisolver@1.4.5 size: 73457 timestamp: 1695380118523 - kind: conda @@ -3409,7 +3803,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/kiwisolver + - pkg:pypi/kiwisolver@1.4.5 size: 60498 timestamp: 1695380322018 - kind: conda @@ -3429,7 +3823,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/kiwisolver + - pkg:pypi/kiwisolver@1.4.5 size: 62080 timestamp: 1695380521068 - kind: conda @@ -3619,89 +4013,197 @@ packages: license_family: Apache size: 290319 timestamp: 1657977526749 +- kind: conda + name: libasprintf + version: 0.22.5 + build: h5728263_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libasprintf-0.22.5-h5728263_2.conda + sha256: 5722a4a260355c9233680a3424a977433f25826ca0a1c05af403d62b805681bc + md5: 75a6982b9ff0a8db0f53303527b07af8 + license: LGPL-2.1-or-later + size: 49778 + timestamp: 1712515968238 +- kind: conda + name: libasprintf + version: 0.22.5 + build: h5ff76d1_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libasprintf-0.22.5-h5ff76d1_2.conda + sha256: 4babb29b8d39ae8b341c094c134a1917c595846e5f974c9d0cb64d3f734b46b1 + md5: ad803793d7168331f1395685cbdae212 + license: LGPL-2.1-or-later + size: 40438 + timestamp: 1712512749697 +- kind: conda + name: libasprintf + version: 0.22.5 + build: h661eb56_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda + sha256: 31d58af7eb54e2938123200239277f14893c5fa4b5d0280c8cf55ae10000638b + md5: dd197c968bf9760bba0031888d431ede + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: LGPL-2.1-or-later + size: 43226 + timestamp: 1712512265295 +- kind: conda + name: libasprintf + version: 0.22.5 + build: h8fbad5d_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-0.22.5-h8fbad5d_2.conda + sha256: 04bbe4374719906cd08b639a3f34828030f405c33b47c757b47fd55aa7310179 + md5: 1b27402397a76115679c4855ab2ece41 + license: LGPL-2.1-or-later + size: 40630 + timestamp: 1712512727388 +- kind: conda + name: libasprintf-devel + version: 0.22.5 + build: h5728263_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libasprintf-devel-0.22.5-h5728263_2.conda + sha256: d5c711d9da4e35d29f4f2191664075c64cbf8cd481a35bf7ef3a527018eb0184 + md5: 8377da2cc31200d7181d2e48d60e4c7b + depends: + - libasprintf 0.22.5 h5728263_2 + license: LGPL-2.1-or-later + size: 36272 + timestamp: 1712516175913 +- kind: conda + name: libasprintf-devel + version: 0.22.5 + build: h5ff76d1_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libasprintf-devel-0.22.5-h5ff76d1_2.conda + sha256: 39fa757378b49993142013c1f69dd56248cc3703c2f04c5bcf4cc4acdc644ae3 + md5: c7182eda3bc727384e2f98f4d680fa7d + depends: + - libasprintf 0.22.5 h5ff76d1_2 + license: LGPL-2.1-or-later + size: 34702 + timestamp: 1712512806211 +- kind: conda + name: libasprintf-devel + version: 0.22.5 + build: h661eb56_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda + sha256: 99d26d272a8203d30b3efbe734a99c823499884d7759b4291674438137c4b5ca + md5: 02e41ab5834dcdcc8590cf29d9526f50 + depends: + - libasprintf 0.22.5 h661eb56_2 + - libgcc-ng >=12 + license: LGPL-2.1-or-later + size: 34225 + timestamp: 1712512295117 +- kind: conda + name: libasprintf-devel + version: 0.22.5 + build: h8fbad5d_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libasprintf-devel-0.22.5-h8fbad5d_2.conda + sha256: f5331486854a5fe80bb837891efb28a28623f762327372cb4cbc264c9c4bf9e2 + md5: 480c106e87d4c4791e6b55a6d1678866 + depends: + - libasprintf 0.22.5 h8fbad5d_2 + license: LGPL-2.1-or-later + size: 34625 + timestamp: 1712512769736 - kind: conda name: libblas version: 3.9.0 - build: 21_linux64_openblas - build_number: 21 + build: 22_linux64_openblas + build_number: 22 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda - sha256: ebd5c91f029f779fb88a1fcbd1e499559a9c258e3674ff58a2fbb4e375ae56d9 - md5: 0ac9f44fc096772b0aa092119b00c3ca + url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda + sha256: 082b8ac20d43a7bbcdc28b3b1cd40e4df3a8b5daf0a2d23d68953a44d2d12c1b + md5: 1a2a0cd3153464fee6646f3dd6dad9b8 depends: - - libopenblas >=0.3.26,<0.3.27.0a0 - - libopenblas >=0.3.26,<1.0a0 + - libopenblas >=0.3.27,<0.3.28.0a0 + - libopenblas >=0.3.27,<1.0a0 constrains: - - liblapacke 3.9.0 21_linux64_openblas + - libcblas 3.9.0 22_linux64_openblas - blas * openblas - - libcblas 3.9.0 21_linux64_openblas - - liblapack 3.9.0 21_linux64_openblas + - liblapacke 3.9.0 22_linux64_openblas + - liblapack 3.9.0 22_linux64_openblas license: BSD-3-Clause license_family: BSD - size: 14691 - timestamp: 1705979549006 + size: 14537 + timestamp: 1712542250081 - kind: conda name: libblas version: 3.9.0 - build: 21_osx64_openblas - build_number: 21 + build: 22_osx64_openblas + build_number: 22 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-21_osx64_openblas.conda - sha256: 5381eab20f4793996cf22e58461ea8a3a4dff1442bb45663b5920f2d26288688 - md5: 23286066c595986aa0df6452a8416c08 + url: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda + sha256: d72060239f904b3a81d2329efcf84dc62c2dfd66dbc4efc8dcae1afdf8f02b59 + md5: b80966a8c8dd0b531f8e65f709d732e8 depends: - - libopenblas >=0.3.26,<0.3.27.0a0 - - libopenblas >=0.3.26,<1.0a0 + - libopenblas >=0.3.27,<0.3.28.0a0 + - libopenblas >=0.3.27,<1.0a0 constrains: - - libcblas 3.9.0 21_osx64_openblas - - liblapacke 3.9.0 21_osx64_openblas + - liblapacke 3.9.0 22_osx64_openblas - blas * openblas - - liblapack 3.9.0 21_osx64_openblas + - libcblas 3.9.0 22_osx64_openblas + - liblapack 3.9.0 22_osx64_openblas license: BSD-3-Clause license_family: BSD - size: 14822 - timestamp: 1705979699547 + size: 14749 + timestamp: 1712542279018 - kind: conda name: libblas version: 3.9.0 - build: 21_osxarm64_openblas - build_number: 21 + build: 22_osxarm64_openblas + build_number: 22 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-21_osxarm64_openblas.conda - sha256: 9a553af92af9f241457f4d14eabb872bc341cd0ddea1da6e7939e9c6a7ee1a25 - md5: b3804f4af39eca9d77360b12811e6d1d + url: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-22_osxarm64_openblas.conda + sha256: 8620e13366076011cfcc6b2565c7a2d362c5d3f0423f54b9ef9bfc17b1a012a4 + md5: aeaf35355ef0f37c7c1ba35b7b7db55f depends: - - libopenblas >=0.3.26,<0.3.27.0a0 - - libopenblas >=0.3.26,<1.0a0 + - libopenblas >=0.3.27,<0.3.28.0a0 + - libopenblas >=0.3.27,<1.0a0 constrains: - - libcblas 3.9.0 21_osxarm64_openblas - - liblapack 3.9.0 21_osxarm64_openblas - blas * openblas - - liblapacke 3.9.0 21_osxarm64_openblas + - liblapack 3.9.0 22_osxarm64_openblas + - liblapacke 3.9.0 22_osxarm64_openblas + - libcblas 3.9.0 22_osxarm64_openblas license: BSD-3-Clause license_family: BSD - size: 14915 - timestamp: 1705980172730 + size: 14824 + timestamp: 1712542396471 - kind: conda name: libblas version: 3.9.0 - build: 21_win64_mkl - build_number: 21 + build: 22_win64_mkl + build_number: 22 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-21_win64_mkl.conda - sha256: ad47053cee17802df875203aba191b04d97a50d820dbf75a114a50972c517334 - md5: ebba3846d11201fe54277e4965ba5250 + url: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-22_win64_mkl.conda + sha256: 4faab445cbd9a13736a206b98fde962d0a9fa80dcbd38300951a8b2863e7c35c + md5: 65c56ecdeceffd6c32d3d54db7e02c6e depends: - - mkl 2024.0.0 h66d3029_49657 + - mkl 2024.1.0 h66d3029_692 constrains: - - liblapack 3.9.0 21_win64_mkl + - liblapacke 3.9.0 22_win64_mkl - blas * mkl - - libcblas 3.9.0 21_win64_mkl - - liblapacke 3.9.0 21_win64_mkl + - libcblas 3.9.0 22_win64_mkl + - liblapack 3.9.0 22_win64_mkl license: BSD-3-Clause license_family: BSD - size: 5017135 - timestamp: 1705980415163 + size: 5182602 + timestamp: 1712542984136 - kind: conda name: libbrotlicommon version: 1.1.0 @@ -3906,79 +4408,79 @@ packages: - kind: conda name: libcblas version: 3.9.0 - build: 21_linux64_openblas - build_number: 21 + build: 22_linux64_openblas + build_number: 22 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda - sha256: 467bbfbfe1a1aeb8b1f9f6485eedd8ed1b6318941bf3702da72336ccf4dc25a6 - md5: 4a3816d06451c4946e2db26b86472cb6 + url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda + sha256: da1b2faa017663c8f5555c1c5518e96ac4cd8e0be2a673c1c9e2cb8507c8fe46 + md5: 4b31699e0ec5de64d5896e580389c9a1 depends: - - libblas 3.9.0 21_linux64_openblas + - libblas 3.9.0 22_linux64_openblas constrains: - - liblapacke 3.9.0 21_linux64_openblas + - liblapack 3.9.0 22_linux64_openblas - blas * openblas - - liblapack 3.9.0 21_linux64_openblas + - liblapacke 3.9.0 22_linux64_openblas license: BSD-3-Clause license_family: BSD - size: 14614 - timestamp: 1705979564122 + size: 14438 + timestamp: 1712542270166 - kind: conda name: libcblas version: 3.9.0 - build: 21_osx64_openblas - build_number: 21 + build: 22_osx64_openblas + build_number: 22 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-21_osx64_openblas.conda - sha256: e2b1455612d4cfb3ac3170f0c538516ebd0b113780ac6603338245354e1b2f02 - md5: 7a1b54774bad723e8ba01ca48eb301b5 + url: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda + sha256: 6a2ba9198e2320c3e22fe3d121310cf8a8ac663e94100c5693b34523fcb3cc04 + md5: b9fef82772330f61b2b0201c72d2c29b depends: - - libblas 3.9.0 21_osx64_openblas + - libblas 3.9.0 22_osx64_openblas constrains: - - liblapacke 3.9.0 21_osx64_openblas + - liblapacke 3.9.0 22_osx64_openblas - blas * openblas - - liblapack 3.9.0 21_osx64_openblas + - liblapack 3.9.0 22_osx64_openblas license: BSD-3-Clause license_family: BSD - size: 14715 - timestamp: 1705979715508 + size: 14636 + timestamp: 1712542311437 - kind: conda name: libcblas version: 3.9.0 - build: 21_osxarm64_openblas - build_number: 21 + build: 22_osxarm64_openblas + build_number: 22 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-21_osxarm64_openblas.conda - sha256: 4510e3e4824693c3f80fc54e72d81dd89acaa6e6d68cd948af0870a640ea7eeb - md5: 48e9d42c65ce664d8fccef2ac6af853c + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-22_osxarm64_openblas.conda + sha256: 2c7902985dc77db1d7252b4e838d92a34b1729799ae402988d62d077868f6cca + md5: 37b3682240a69874a22658dedbca37d9 depends: - - libblas 3.9.0 21_osxarm64_openblas + - libblas 3.9.0 22_osxarm64_openblas constrains: - - liblapack 3.9.0 21_osxarm64_openblas - blas * openblas - - liblapacke 3.9.0 21_osxarm64_openblas + - liblapack 3.9.0 22_osxarm64_openblas + - liblapacke 3.9.0 22_osxarm64_openblas license: BSD-3-Clause license_family: BSD - size: 14800 - timestamp: 1705980195551 + size: 14741 + timestamp: 1712542420590 - kind: conda name: libcblas version: 3.9.0 - build: 21_win64_mkl - build_number: 21 + build: 22_win64_mkl + build_number: 22 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-21_win64_mkl.conda - sha256: 886505d0a4a5b508b2255991395aadecdad140719ba0d413411fec86491a9283 - md5: 38e5ec23bc2b62f9dd971143aa9dddb7 + url: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-22_win64_mkl.conda + sha256: 5503273924650330dc03edd1eb01ec4020b9967b5a4cafc377ba20b976d15590 + md5: 336c93ab102846c6131cf68e722a68f1 depends: - - libblas 3.9.0 21_win64_mkl + - libblas 3.9.0 22_win64_mkl constrains: - - liblapack 3.9.0 21_win64_mkl + - liblapacke 3.9.0 22_win64_mkl - blas * mkl - - liblapacke 3.9.0 21_win64_mkl + - liblapack 3.9.0 22_win64_mkl license: BSD-3-Clause license_family: BSD - size: 5017024 - timestamp: 1705980469944 + size: 5191513 + timestamp: 1712543043641 - kind: conda name: libclang-cpp15 version: 15.0.7 @@ -3998,30 +4500,28 @@ packages: timestamp: 1711063711931 - kind: conda name: libclang13 - version: 18.1.2 - build: default_h5d6823c_1 - build_number: 1 + version: 18.1.3 + build: default_h5d6823c_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.2-default_h5d6823c_1.conda - sha256: fd1bb5fb2cd65526e1c67ea20efbbe8c1b1bf8ff61465af591d7b25f0c037b06 - md5: 7aa3c2bbedb583b81e1efc997cb22073 + url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.3-default_h5d6823c_0.conda + sha256: 8490f8ca051e80d0f79279d75dabb93e0cadf046984b96bfaeb4c9d6146857fb + md5: 5fff487759736b275dc3e4a263cac666 depends: - libgcc-ng >=12 - - libllvm18 >=18.1.2,<18.2.0a0 + - libllvm18 >=18.1.3,<18.2.0a0 - libstdcxx-ng >=12 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 11070109 - timestamp: 1711067889145 + size: 11054286 + timestamp: 1712569057776 - kind: conda name: libclang13 - version: 18.1.2 - build: default_hf64faad_1 - build_number: 1 + version: 18.1.3 + build: default_hf64faad_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.2-default_hf64faad_1.conda - sha256: 847dc28280d6564a02ef971a232f30c84fcb5d366a54e59de35fae33e096c8cc - md5: ece5a1b226db1000b2c479694c1ae265 + url: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.3-default_hf64faad_0.conda + sha256: 7ccb5fefe1ca2c8341e402fa726e5b9cea1939feb87b5335b3c4581589ba86d5 + md5: 9217c37b478ec601af909aafc954a6fc depends: - libzlib >=1.2.13,<1.3.0a0 - ucrt >=10.0.20348.0 @@ -4030,8 +4530,8 @@ packages: - zstd >=1.5.5,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 25310297 - timestamp: 1711069468740 + size: 25293651 + timestamp: 1712568643856 - kind: conda name: libcups version: 2.3.3 @@ -4441,6 +4941,136 @@ packages: license_family: BSD size: 206783 timestamp: 1696161158189 +- kind: conda + name: libgettextpo + version: 0.22.5 + build: h5728263_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-0.22.5-h5728263_2.conda + sha256: 445ecfc4bf5b474c2ac79f716dcb8459a08a532ab13a785744665f086ef94c95 + md5: f4c826b19bf1ccee2a63a2c685039728 + depends: + - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h5728263_2 + license: GPL-3.0-or-later + license_family: GPL + size: 171210 + timestamp: 1712516290149 +- kind: conda + name: libgettextpo + version: 0.22.5 + build: h59595ed_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.conda + sha256: e2f784564a2bdc6f753f00f63cc77c97601eb03bc89dccc4413336ec6d95490b + md5: 172bcc51059416e7ce99e7b528cede83 + depends: + - libgcc-ng >=12 + license: GPL-3.0-or-later + license_family: GPL + size: 170582 + timestamp: 1712512286907 +- kind: conda + name: libgettextpo + version: 0.22.5 + build: h5ff76d1_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-0.22.5-h5ff76d1_2.conda + sha256: 139d1861e21c41b950ebf9e395db2492839337a3b481ad2901a4a6800c555e37 + md5: 54cc9d12c29c2f0516f2ef4987de53ae + depends: + - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h5ff76d1_2 + license: GPL-3.0-or-later + license_family: GPL + size: 172506 + timestamp: 1712512827340 +- kind: conda + name: libgettextpo + version: 0.22.5 + build: h8fbad5d_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-0.22.5-h8fbad5d_2.conda + sha256: c3f5580e172c3fc03d33e8994024f08b709a239bd599792e51435fa7a06beb64 + md5: a66fad933e22d22599a6dd149d359d25 + depends: + - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h8fbad5d_2 + license: GPL-3.0-or-later + license_family: GPL + size: 159856 + timestamp: 1712512788407 +- kind: conda + name: libgettextpo-devel + version: 0.22.5 + build: h5728263_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-devel-0.22.5-h5728263_2.conda + sha256: bcee730b2be23ba9aa5de3471b78c4644d3b17d5a71e7fdc59bb40e252edb2f7 + md5: 6f42ec61abc6d52a4079800a640319c5 + depends: + - libgettextpo 0.22.5 h5728263_2 + - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h5728263_2 + license: GPL-3.0-or-later + license_family: GPL + size: 40312 + timestamp: 1712516436925 +- kind: conda + name: libgettextpo-devel + version: 0.22.5 + build: h59595ed_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda + sha256: 695eb2439ad4a89e4205dd675cc52fba5cef6b5d41b83f07cdbf4770a336cc15 + md5: b63d9b6da3653179a278077f0de20014 + depends: + - libgcc-ng >=12 + - libgettextpo 0.22.5 h59595ed_2 + license: GPL-3.0-or-later + license_family: GPL + size: 36758 + timestamp: 1712512303244 +- kind: conda + name: libgettextpo-devel + version: 0.22.5 + build: h5ff76d1_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-devel-0.22.5-h5ff76d1_2.conda + sha256: 57940f6a872ffcf5a3406e96bdbd9d25854943e4dd84acee56178ffb728a9671 + md5: 1e0384c52cd8b54812912e7234e66056 + depends: + - libgettextpo 0.22.5 h5ff76d1_2 + - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h5ff76d1_2 + license: GPL-3.0-or-later + license_family: GPL + size: 37189 + timestamp: 1712512859854 +- kind: conda + name: libgettextpo-devel + version: 0.22.5 + build: h8fbad5d_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-devel-0.22.5-h8fbad5d_2.conda + sha256: b1be0bb8a726e2c47a025ff348e6ba8b51ef668f6ace06694657025d84ae66e2 + md5: 1113aa220b042b7ce8d077ea8f696f98 + depends: + - libgettextpo 0.22.5 h8fbad5d_2 + - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h8fbad5d_2 + license: GPL-3.0-or-later + license_family: GPL + size: 37221 + timestamp: 1712512820461 - kind: conda name: libgfortran version: 5.0.0 @@ -4540,54 +5170,55 @@ packages: - kind: conda name: libglib version: 2.80.0 - build: h39d0aa6_1 - build_number: 1 + build: h39d0aa6_4 + build_number: 4 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_1.conda - sha256: 326fb2d1c8789660cec01eda3eec2fa15dd816d291126df13f1c34d80ffda6aa - md5: 6160439f169ec670951460024751b2ae + url: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_4.conda + sha256: d10bdffc193b37060598ddfe1840252aba6feca591f81a072eb1a801a3a635f2 + md5: 9baf04fc7002450a932cf97cb9625ebb depends: - libffi >=3.4,<4.0a0 - libiconv >=1.17,<2.0a0 + - libintl >=0.22.5,<1.0a0 - libzlib >=1.2.13,<1.3.0a0 - pcre2 >=10.43,<10.44.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - - glib 2.80.0 *_1 + - glib 2.80.0 *_4 license: LGPL-2.1-or-later - size: 2805065 - timestamp: 1710939443433 + size: 2762416 + timestamp: 1712590564683 - kind: conda name: libglib version: 2.80.0 - build: h81c1438_1 - build_number: 1 + build: h81c1438_4 + build_number: 4 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.0-h81c1438_1.conda - sha256: 5bc911f8c29878252f14dfc08fcf72cf550038a7102f9c03612fee9f7ccf6234 - md5: e1c7ad2617b7ebe7589e87024d90ddda + url: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.0-h81c1438_4.conda + sha256: d950fa60ec4e27419b029f77ffb690abfc49cc8fb50cadb12930f802c9fee0b8 + md5: eb94cd8fdcb676d17a5119189f87c4ae depends: - - gettext >=0.21.1,<1.0a0 - libffi >=3.4,<4.0a0 - libiconv >=1.17,<2.0a0 + - libintl >=0.22.5,<1.0a0 - libzlib >=1.2.13,<1.3.0a0 - pcre2 >=10.43,<10.44.0a0 constrains: - - glib 2.80.0 *_1 + - glib 2.80.0 *_4 license: LGPL-2.1-or-later - size: 2641391 - timestamp: 1710939600553 + size: 2652294 + timestamp: 1712590118182 - kind: conda name: libglib version: 2.80.0 - build: hf2295e7_1 - build_number: 1 + build: hf2295e7_4 + build_number: 4 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_1.conda - sha256: 636d984568a1e5d915098a5020712f82bb3988635015765c3caf70f1a91340c5 - md5: 0725f6081030c29b109088639824ff90 + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_4.conda + sha256: 99983c2514dd99da1bab50e9a25ed16cfc1d46aca0385c3be177c8e299731b51 + md5: 0269d2b7fa89f4a37cdee5ad6161f6cc depends: - libffi >=3.4,<4.0a0 - libgcc-ng >=12 @@ -4595,30 +5226,30 @@ packages: - libzlib >=1.2.13,<1.3.0a0 - pcre2 >=10.43,<10.44.0a0 constrains: - - glib 2.80.0 *_1 + - glib 2.80.0 *_4 license: LGPL-2.1-or-later - size: 2888982 - timestamp: 1710939100254 + size: 2900260 + timestamp: 1712589943666 - kind: conda name: libglib version: 2.80.0 - build: hfc324ee_1 - build_number: 1 + build: hfc324ee_4 + build_number: 4 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.0-hfc324ee_1.conda - sha256: b7411c3b19681fea1a33c093364cb2d8a021a408133399b23c947231aac157d9 - md5: 3d8a5773a6ba1be1db8dc23ea9f44a0a + url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.0-hfc324ee_4.conda + sha256: 48f371fcb374020c140b26dbfc9a6ef3fbc834334e8cca984120be7bffa6d1bf + md5: c0de76b2c1f1bee86ca8660684ab6ec4 depends: - - gettext >=0.21.1,<1.0a0 - libffi >=3.4,<4.0a0 - libiconv >=1.17,<2.0a0 + - libintl >=0.22.5,<1.0a0 - libzlib >=1.2.13,<1.3.0a0 - pcre2 >=10.43,<10.44.0a0 constrains: - - glib 2.80.0 *_1 + - glib 2.80.0 *_4 license: LGPL-2.1-or-later - size: 2630397 - timestamp: 1710939388253 + size: 2638588 + timestamp: 1712590361453 - kind: conda name: libgomp version: 13.2.0 @@ -4723,6 +5354,93 @@ packages: license: LGPL-2.1-only size: 666538 timestamp: 1702682713201 +- kind: conda + name: libintl + version: 0.22.5 + build: h5728263_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_2.conda + sha256: 1b95335af0a3e278b31e16667fa4e51d1c3f5e22d394d982539dfd5d34c5ae19 + md5: aa622c938af057adc119f8b8eecada01 + depends: + - libiconv >=1.17,<2.0a0 + license: LGPL-2.1-or-later + size: 95745 + timestamp: 1712516102666 +- kind: conda + name: libintl + version: 0.22.5 + build: h5ff76d1_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.22.5-h5ff76d1_2.conda + sha256: 280aaef0ed84637ee869012ad9ad9ed208e068dd9b8cf010dafeea717dad7203 + md5: 3fb6774cb8cdbb93a6013b67bcf9716d + depends: + - libiconv >=1.17,<2.0a0 + license: LGPL-2.1-or-later + size: 74307 + timestamp: 1712512790983 +- kind: conda + name: libintl + version: 0.22.5 + build: h8fbad5d_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8fbad5d_2.conda + sha256: 21bc79bdf34ffd20cb84d2a8bd82d7d0e2a1b94b9e72773f0fb207e5b4f1ff63 + md5: 3d216d0add050129007de3342be7b8c5 + depends: + - libiconv >=1.17,<2.0a0 + license: LGPL-2.1-or-later + size: 81206 + timestamp: 1712512755390 +- kind: conda + name: libintl-devel + version: 0.22.5 + build: h5728263_2 + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libintl-devel-0.22.5-h5728263_2.conda + sha256: 6164fd51abfc7294477c58da77ee1ff9ebc63b9a33404b646407f7fbc3cc7d0d + md5: a2ad82fae23975e4ccbfab2847d31d48 + depends: + - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h5728263_2 + license: LGPL-2.1-or-later + size: 40772 + timestamp: 1712516363413 +- kind: conda + name: libintl-devel + version: 0.22.5 + build: h5ff76d1_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libintl-devel-0.22.5-h5ff76d1_2.conda + sha256: e3f15a85c6e63633a5ff503d56366bab31cd2e07ea21559889bc7eb19564106d + md5: ea0a07e556d6b238db685cae6e3585d0 + depends: + - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h5ff76d1_2 + license: LGPL-2.1-or-later + size: 38422 + timestamp: 1712512843420 +- kind: conda + name: libintl-devel + version: 0.22.5 + build: h8fbad5d_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.22.5-h8fbad5d_2.conda + sha256: e52b2d0c5711f64b523756ccd9b800ee6f10a6317432b20a417dc3792e0a794a + md5: 962b3348c68efd25da253e94590ea9a2 + depends: + - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h8fbad5d_2 + license: LGPL-2.1-or-later + size: 38616 + timestamp: 1712512805567 - kind: conda name: libjpeg-turbo version: 3.0.0 @@ -4788,79 +5506,79 @@ packages: - kind: conda name: liblapack version: 3.9.0 - build: 21_linux64_openblas - build_number: 21 + build: 22_linux64_openblas + build_number: 22 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda - sha256: 64b5c35dce00dd6f9f53178b2fe87116282e00967970bd6551a5a42923806ded - md5: 1a42f305615c3867684e049e85927531 + url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda + sha256: db246341d42f9100d45adeb1a7ba8b1ef5b51ceb9056fd643e98046a3259fde6 + md5: b083767b6c877e24ee597d93b87ab838 depends: - - libblas 3.9.0 21_linux64_openblas + - libblas 3.9.0 22_linux64_openblas constrains: - - liblapacke 3.9.0 21_linux64_openblas - - libcblas 3.9.0 21_linux64_openblas + - libcblas 3.9.0 22_linux64_openblas - blas * openblas + - liblapacke 3.9.0 22_linux64_openblas license: BSD-3-Clause license_family: BSD - size: 14599 - timestamp: 1705979579648 + size: 14471 + timestamp: 1712542277696 - kind: conda name: liblapack version: 3.9.0 - build: 21_osx64_openblas - build_number: 21 + build: 22_osx64_openblas + build_number: 22 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-21_osx64_openblas.conda - sha256: 5d0ef4743e8684ad436e31bd3c378d48642815a20c260d358668ba29cd80987a - md5: cf0e4d82cfca6cd9d6c9ed3df45907c9 + url: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda + sha256: e36744f3e780564d6748b5dd05e15ad6a1af9184cf32ab9d1304c13a6bc3e16b + md5: f21b282ff7ba14df6134a0fe6ab42b1b depends: - - libblas 3.9.0 21_osx64_openblas + - libblas 3.9.0 22_osx64_openblas constrains: - - libcblas 3.9.0 21_osx64_openblas - - liblapacke 3.9.0 21_osx64_openblas + - liblapacke 3.9.0 22_osx64_openblas - blas * openblas + - libcblas 3.9.0 22_osx64_openblas license: BSD-3-Clause license_family: BSD - size: 14738 - timestamp: 1705979734819 + size: 14657 + timestamp: 1712542322711 - kind: conda name: liblapack version: 3.9.0 - build: 21_osxarm64_openblas - build_number: 21 + build: 22_osxarm64_openblas + build_number: 22 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-21_osxarm64_openblas.conda - sha256: a917e99f26d205df1ec22d7a9fff0d2f2f3c7ba06ea2be886dc220a8340d5917 - md5: a4510e3913ef552d69ab2080a0048523 + url: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-22_osxarm64_openblas.conda + sha256: 2b1b24c98d15a6a3ad54cf7c8fef1ddccf84b7c557cde08235aaeffd1ff50ee8 + md5: f2794950bc005e123b2c21f7fa3d7a6e depends: - - libblas 3.9.0 21_osxarm64_openblas + - libblas 3.9.0 22_osxarm64_openblas constrains: - - libcblas 3.9.0 21_osxarm64_openblas - blas * openblas - - liblapacke 3.9.0 21_osxarm64_openblas + - liblapacke 3.9.0 22_osxarm64_openblas + - libcblas 3.9.0 22_osxarm64_openblas license: BSD-3-Clause license_family: BSD - size: 14829 - timestamp: 1705980215575 + size: 14730 + timestamp: 1712542435551 - kind: conda name: liblapack version: 3.9.0 - build: 21_win64_mkl - build_number: 21 + build: 22_win64_mkl + build_number: 22 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-21_win64_mkl.conda - sha256: 3fa7c08dd4edf59cb0907d2e5b74e6be890e0671f845e1bae892d212d118a7e9 - md5: c4740f091cb75987390087934354a621 + url: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-22_win64_mkl.conda + sha256: 8b28b361a13819ed83a67d3bfdde750a13bc8b50b9af26d94fd61616d0f2d703 + md5: c752cc2af9f3d8d7b2fdebb915a33ef7 depends: - - libblas 3.9.0 21_win64_mkl + - libblas 3.9.0 22_win64_mkl constrains: + - liblapacke 3.9.0 22_win64_mkl - blas * mkl - - libcblas 3.9.0 21_win64_mkl - - liblapacke 3.9.0 21_win64_mkl + - libcblas 3.9.0 22_win64_mkl license: BSD-3-Clause license_family: BSD - size: 5017043 - timestamp: 1705980523462 + size: 5182500 + timestamp: 1712543085027 - kind: conda name: libllvm15 version: 15.0.7 @@ -4882,12 +5600,12 @@ packages: timestamp: 1701375836233 - kind: conda name: libllvm18 - version: 18.1.2 + version: 18.1.3 build: h2448989_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.2-h2448989_0.conda - sha256: 231b3edb7650786fd9fc6ac8d7ecf38d663a0ae63eeb1f19c4c1c17d2eb98d51 - md5: fae7780457e00a07d068417d9dbdb24b + url: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.3-h2448989_0.conda + sha256: 4f213da12c893451b21db33ab9eb7637378b79da3747e4ba70db482f7310c5ae + md5: 927b6d6e80b2c0d4405a58b61ca248a3 depends: - libgcc-ng >=12 - libstdcxx-ng >=12 @@ -4896,8 +5614,8 @@ packages: - zstd >=1.5.5,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 38407510 - timestamp: 1710943474854 + size: 38422113 + timestamp: 1712517638355 - kind: conda name: libnsl version: 2.0.1 @@ -4945,58 +5663,58 @@ packages: timestamp: 1610382533961 - kind: conda name: libopenblas - version: 0.3.26 + version: 0.3.27 build: openmp_h6c19121_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.26-openmp_h6c19121_0.conda - sha256: 2a59b92c412fd0f59a8079dfa21c561ae17e72e72e47d4d7aee474bf6fd642e1 - md5: 000970261d954431ccca3cce68d873d8 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h6c19121_0.conda + sha256: feb2662444fc98a4842fe54cc70b1f109b2146108e7bac2b3bbad1f219cede90 + md5: 82eba59f4eca26a9fc904d584f8761c0 depends: - libgfortran 5.* - libgfortran5 >=12.3.0 - llvm-openmp >=16.0.6 constrains: - - openblas >=0.3.26,<0.3.27.0a0 + - openblas >=0.3.27,<0.3.28.0a0 license: BSD-3-Clause license_family: BSD - size: 2917606 - timestamp: 1704950245195 + size: 2925015 + timestamp: 1712364212874 - kind: conda name: libopenblas - version: 0.3.26 + version: 0.3.27 build: openmp_hfef2a42_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.26-openmp_hfef2a42_0.conda - sha256: 4a5994cc608708eca19b90b642a144bb073e4a1cd27b824281dfcae67917204e - md5: 9df60162aea811087267b515f359536c + url: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_hfef2a42_0.conda + sha256: 45519189c0295296268cb7eabeeaa03ef54d780416c9a24be1d2a21db63a7848 + md5: 00237c9c7f2cb6725fe2960680a6e225 depends: - libgfortran 5.* - libgfortran5 >=12.3.0 - llvm-openmp >=16.0.6 constrains: - - openblas >=0.3.26,<0.3.27.0a0 + - openblas >=0.3.27,<0.3.28.0a0 license: BSD-3-Clause license_family: BSD - size: 6044576 - timestamp: 1704951566923 + size: 6047531 + timestamp: 1712366254156 - kind: conda name: libopenblas - version: 0.3.26 + version: 0.3.27 build: pthreads_h413a1c8_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda - sha256: b626954b5a1113dafec8df89fa8bf18ce9b4701464d9f084ddd7fc9fac404bbd - md5: 760ae35415f5ba8b15d09df5afe8b23a + url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda + sha256: 2ae7559aed0705deb3f716c7b247c74fd1b5e35b64e39834ce8b95f7564d4a3e + md5: a356024784da6dfd4683dc5ecf45b155 depends: - libgcc-ng >=12 - libgfortran-ng - libgfortran5 >=12.3.0 constrains: - - openblas >=0.3.26,<0.3.27.0a0 + - openblas >=0.3.27,<0.3.28.0a0 license: BSD-3-Clause license_family: BSD - size: 5578031 - timestamp: 1704950143521 + size: 5598747 + timestamp: 1712364444346 - kind: conda name: libopus version: 1.3.1 @@ -5086,62 +5804,65 @@ packages: timestamp: 1710863646063 - kind: conda name: librsvg - version: 2.56.3 - build: h1877882_1 - build_number: 1 + version: 2.58.0 + build: h7b06fc5_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.56.3-h1877882_1.conda - sha256: 29c94b30363cdcae427a2a303de3c634db05f1e28101b6e865e135e72fa8b7ec - md5: 43b31ab0e9cf3538fb3ab138ee663a0b + url: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.58.0-h7b06fc5_0.conda + sha256: 4bd11494357eac8f9b71945bdaf55a5868d65829b05224dd6c3b0a51d6d974c8 + md5: 3ad98f9e1ad2b0c9b202b9d5212752d2 depends: + - __osx >=10.12 - cairo >=1.18.0,<2.0a0 - gdk-pixbuf >=2.42.10,<3.0a0 - gettext >=0.21.1,<1.0a0 - - libglib >=2.78.1,<3.0a0 - - libxml2 >=2.12.1,<3.0.0a0 + - libglib >=2.80.0,<3.0a0 + - libxml2 >=2.12.6,<3.0a0 - pango >=1.50.14,<2.0a0 + constrains: + - __osx >=10.12 license: LGPL-2.1-or-later - size: 3978990 - timestamp: 1701547214362 + size: 4963394 + timestamp: 1712271256465 - kind: conda name: librsvg - version: 2.56.3 - build: h55a2576_1 - build_number: 1 + version: 2.58.0 + build: hb3d354b_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.56.3-h55a2576_1.conda - sha256: 59043f2536d61a32378553c4fa7f56e97bca12165c37a45de9e7439a06f5ac16 - md5: d9624ec11650aa93e0b2c2612c3548f5 + url: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.58.0-hb3d354b_0.conda + sha256: d948ebcbf6acc30b81b61f074662582d2560130463da25bb7d7a724836d55a37 + md5: a62815a3ebaf337a2747afa6a69efa0a depends: + - __osx >=11.0 - cairo >=1.18.0,<2.0a0 - gdk-pixbuf >=2.42.10,<3.0a0 - gettext >=0.21.1,<1.0a0 - - libglib >=2.78.1,<3.0a0 - - libxml2 >=2.12.1,<3.0.0a0 + - libglib >=2.80.0,<3.0a0 + - libxml2 >=2.12.6,<3.0a0 - pango >=1.50.14,<2.0a0 + constrains: + - __osx >=11.0 license: LGPL-2.1-or-later - size: 3832300 - timestamp: 1701547781584 + size: 4797834 + timestamp: 1712272013941 - kind: conda name: librsvg - version: 2.56.3 - build: he3f83f7_1 - build_number: 1 + version: 2.58.0 + build: hce6bd6c_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-he3f83f7_1.conda - sha256: b82d0c60376da88a2bf15d35d17c176aa923917ad7de4bc62ddef6d02f3518fb - md5: 03bd1ddcc942867a19528877143b9852 + url: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.0-hce6bd6c_0.conda + sha256: 3f69e1350821426598688de0db7834f303dd05fd5c9ceb5e4c27c93889a24413 + md5: 0891de8980ee29828542dbf9578838b9 depends: - cairo >=1.18.0,<2.0a0 - gdk-pixbuf >=2.42.10,<3.0a0 - gettext >=0.21.1,<1.0a0 - libgcc-ng >=12 - - libglib >=2.78.1,<3.0a0 - - libxml2 >=2.12.1,<3.0.0a0 + - libglib >=2.80.0,<3.0a0 + - libxml2 >=2.12.6,<3.0a0 - pango >=1.50.14,<2.0a0 license: LGPL-2.1-or-later - size: 5897732 - timestamp: 1701546864628 + size: 6004734 + timestamp: 1712270439751 - kind: conda name: libsndfile version: 1.2.2 @@ -5505,39 +6226,42 @@ packages: - kind: conda name: libwebp-base version: 1.3.2 - build: h0dc2134_0 + build: h10d778d_1 + build_number: 1 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.3.2-h0dc2134_0.conda - sha256: fa7580f26fec4c28321ec2ece1257f3293e0c646c635e9904679f4a8369be401 - md5: 4e7e9d244e87d66c18d36894fd6a8ae5 + url: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.3.2-h10d778d_1.conda + sha256: cd2d651e90b93b03e4e38617aa15ddf8e5537b2bd22dd2628784e4c80bc107eb + md5: 1ff09ca6e85ee516442a6a94cdfc7065 constrains: - libwebp 1.3.2 license: BSD-3-Clause license_family: BSD - size: 346599 - timestamp: 1694709233836 + size: 350825 + timestamp: 1712602583307 - kind: conda name: libwebp-base version: 1.3.2 - build: hb547adb_0 + build: h93a5062_1 + build_number: 1 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.3.2-hb547adb_0.conda - sha256: a159b848193043fb58465ae6a449361615dadcf27babfe0b18db2bd3eb59e958 - md5: 85dbc11098cdbe4244cd73f29a3ab795 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.3.2-h93a5062_1.conda + sha256: 4336a22660ba77e9d2f5940ba184a85bb1da1b2f5488ba11b486dceca0b39aa1 + md5: ce4e2ea0aa859a8796b1437fe5cb07ed constrains: - libwebp 1.3.2 license: BSD-3-Clause license_family: BSD - size: 273844 - timestamp: 1694709510635 + size: 283775 + timestamp: 1712602560769 - kind: conda name: libwebp-base version: 1.3.2 - build: hcfcfb64_0 + build: hcfcfb64_1 + build_number: 1 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.3.2-hcfcfb64_0.conda - sha256: af1453fab10d1fb8b379c61a78882614051a8bac37307d7ac4fb58eac667709e - md5: dcde8820959e64378d4e06147ffecfdd + url: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.3.2-hcfcfb64_1.conda + sha256: bf8d80cb9ed5092742aefc963dc200454b8ecbecf3656a813df295ba2d97336c + md5: fdf80cb33c32d4d002bb89c37cfff5b7 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 @@ -5546,24 +6270,25 @@ packages: - libwebp 1.3.2 license: BSD-3-Clause license_family: BSD - size: 268870 - timestamp: 1694709461733 + size: 269593 + timestamp: 1712603180071 - kind: conda name: libwebp-base version: 1.3.2 - build: hd590300_0 + build: hd590300_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda - sha256: 68764a760fa81ef35dacb067fe8ace452bbb41476536a4a147a1051df29525f0 - md5: 30de3fd9b3b602f7473f30e684eeea8c + url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_1.conda + sha256: c230e238646d0481851a44086767581cf7e112f27e97bb1c0b89175a079d961d + md5: 049b7df8bae5e184d1de42cdf64855f8 depends: - libgcc-ng >=12 constrains: - libwebp 1.3.2 license: BSD-3-Clause license_family: BSD - size: 401830 - timestamp: 1694709121323 + size: 434659 + timestamp: 1712602397804 - kind: conda name: libxcb version: '1.15' @@ -5806,32 +6531,32 @@ packages: timestamp: 1686575217516 - kind: conda name: llvm-openmp - version: 18.1.2 + version: 18.1.3 build: hb6ac08f_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.2-hb6ac08f_0.conda - sha256: dc40b678f5be2caf4e89ee3dc9037399d0bcd46543bc258dc46e1b92d241c6a6 - md5: e7f7e91cfabd8c7172c9ae405214dd68 + url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.3-hb6ac08f_0.conda + sha256: 997e4169ea474a7bc137fed3b5f4d94b1175162b3318e8cb3943003e460fe458 + md5: 506f270f4f00980d27cc1fc127e0ed37 constrains: - - openmp 18.1.2|18.1.2.* + - openmp 18.1.3|18.1.3.* license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 300480 - timestamp: 1711010792383 + size: 300597 + timestamp: 1712603382363 - kind: conda name: llvm-openmp - version: 18.1.2 + version: 18.1.3 build: hcd81f8e_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.2-hcd81f8e_0.conda - sha256: 2ed8ae5a4c6122d542564a9bb9d4961ed7d2fb9581f0ea8bd81e3a83e614b110 - md5: 34646dc152f3949a2f8a67136d406dce + url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.3-hcd81f8e_0.conda + sha256: 4cb4eadd633669496ed70c580c965f5f2ed29336890636c61a53e9c1c1541073 + md5: 24cbf1fb1b83056f8ba1beaac0619bf8 constrains: - - openmp 18.1.2|18.1.2.* + - openmp 18.1.3|18.1.3.* license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 276238 - timestamp: 1711010656300 + size: 276320 + timestamp: 1712603367897 - kind: conda name: lz4-c version: 1.9.4 @@ -5939,7 +6664,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/markdown-it-py + - pkg:pypi/markdown-it-py@3.0.0 size: 64356 timestamp: 1686175179621 - kind: conda @@ -5959,7 +6684,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/markupsafe + - pkg:pypi/markupsafe@2.1.5 size: 23827 timestamp: 1706900341193 - kind: conda @@ -5978,7 +6703,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/markupsafe + - pkg:pypi/markupsafe@2.1.5 size: 23107 timestamp: 1706900243497 - kind: conda @@ -6000,7 +6725,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/markupsafe + - pkg:pypi/markupsafe@2.1.5 size: 26856 timestamp: 1706900665492 - kind: conda @@ -6020,87 +6745,155 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/markupsafe + - pkg:pypi/markupsafe@2.1.5 size: 24314 timestamp: 1706900151453 +- kind: pypi + name: matplotlib + version: 3.8.4 + url: https://files.pythonhosted.org/packages/84/5f/a0c7a4ce9cc96d3e592c44d1c0f2ebdf5f101e25ced2c14902ae7faa4ff4/matplotlib-3.8.4-cp39-cp39-macosx_10_12_x86_64.whl + sha256: 843cbde2f0946dadd8c5c11c6d91847abd18ec76859dc319362a0964493f0ba6 + requires_dist: + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - kiwisolver >=1.3.1 + - numpy >=1.21 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python-dateutil >=2.7 + - importlib-resources >=3.2.0 ; python_version < '3.10' + requires_python: '>=3.9' +- kind: pypi + name: matplotlib + version: 3.8.4 + url: https://files.pythonhosted.org/packages/5e/2c/513395a63a9e1124a5648addbf73be23cc603f955af026b04416da98dc96/matplotlib-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + sha256: 606e3b90897554c989b1e38a258c626d46c873523de432b1462f295db13de6f9 + requires_dist: + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - kiwisolver >=1.3.1 + - numpy >=1.21 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python-dateutil >=2.7 + - importlib-resources >=3.2.0 ; python_version < '3.10' + requires_python: '>=3.9' +- kind: pypi + name: matplotlib + version: 3.8.4 + url: https://files.pythonhosted.org/packages/54/af/17195cf1f43cd3be79b15aecc5b7e44ea08456bd0048ad8dcd3a5fd45c45/matplotlib-3.8.4-cp39-cp39-win_amd64.whl + sha256: 6209e5c9aaccc056e63b547a8152661324404dd92340a6e479b3a7f24b42a5d0 + requires_dist: + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - kiwisolver >=1.3.1 + - numpy >=1.21 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python-dateutil >=2.7 + - importlib-resources >=3.2.0 ; python_version < '3.10' + requires_python: '>=3.9' +- kind: pypi + name: matplotlib + version: 3.8.4 + url: https://files.pythonhosted.org/packages/d5/88/83aee628339486de57fcc8c1387e28de816182edcfc42928cff02c364664/matplotlib-3.8.4-cp39-cp39-macosx_11_0_arm64.whl + sha256: 1c13f041a7178f9780fb61cc3a2b10423d5e125480e4be51beaf62b172413b67 + requires_dist: + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - kiwisolver >=1.3.1 + - numpy >=1.21 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python-dateutil >=2.7 + - importlib-resources >=3.2.0 ; python_version < '3.10' + requires_python: '>=3.9' - kind: conda name: matplotlib - version: 3.8.3 + version: 3.8.4 build: py39h6e9494a_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.3-py39h6e9494a_0.conda - sha256: 7c30a0bb64950a02a041d1df4cc4e5b9ee8ca10d911205c8c1b6601207b4565c - md5: b791c477f73c4c3c727c755bc49b7afd + url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.4-py39h6e9494a_0.conda + sha256: f2cf3182df2e4bb45bf15d6d0fe6c078db66202b2267a07935832795e85c58c8 + md5: 371fe0f738d9f3baa20cf06656b78b0a depends: - - matplotlib-base >=3.8.3,<3.8.4.0a0 + - matplotlib-base >=3.8.4,<3.8.5.0a0 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 - tornado >=5 license: PSF-2.0 license_family: PSF - size: 8603 - timestamp: 1708027078271 + size: 8542 + timestamp: 1712606369335 - kind: conda name: matplotlib - version: 3.8.3 + version: 3.8.4 build: py39hcbf5309_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.3-py39hcbf5309_0.conda - sha256: ac11616904ed43f420f660f028e637707a71274bc2676d54fc7eb571f540b93c - md5: a4b5946f68ecaed034fa849b8d639e63 + url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.4-py39hcbf5309_0.conda + sha256: aecfe3cb990657c3e228216c666f7e66f5c280b2b68363a78d35e47eb7aa2330 + md5: cc66c372d5eb745665da06ce56b7d72b depends: - - matplotlib-base >=3.8.3,<3.8.4.0a0 + - matplotlib-base >=3.8.4,<3.8.5.0a0 - pyqt >=5.10 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 - tornado >=5 license: PSF-2.0 license_family: PSF - size: 8853 - timestamp: 1708027216310 + size: 8815 + timestamp: 1712606845279 - kind: conda name: matplotlib - version: 3.8.3 + version: 3.8.4 build: py39hdf13c20_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.3-py39hdf13c20_0.conda - sha256: 84063109220687e32fad40d9471660c013dca576de6776655d325154ba572d5c - md5: b656fafa897e9e4fdbf42dd6540ec01f + url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.4-py39hdf13c20_0.conda + sha256: f03064f3fdcca12dfae987b227112e88fa33da66620e8a2b40369f77a14cc7cf + md5: 0a57baf9ffffe00397ec4d01d9540df4 depends: - - matplotlib-base >=3.8.3,<3.8.4.0a0 + - matplotlib-base >=3.8.4,<3.8.5.0a0 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 - tornado >=5 license: PSF-2.0 license_family: PSF - size: 8676 - timestamp: 1708027219022 + size: 8616 + timestamp: 1712606853268 - kind: conda name: matplotlib - version: 3.8.3 + version: 3.8.4 build: py39hf3d152e_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.3-py39hf3d152e_0.conda - sha256: c94914aa4b66b770a6118f3b80f8bda7843535f12fbcacaeb915eb5c03255372 - md5: 983f5b77540eb5aa00238e72ec9b1dfb + url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.4-py39hf3d152e_0.conda + sha256: 7de2886d742f30b338111142eef6d764303b05fd1274248b65e7a76dca741827 + md5: c66d2da2669fddc657b679bccab95775 depends: - - matplotlib-base >=3.8.3,<3.8.4.0a0 + - matplotlib-base >=3.8.4,<3.8.5.0a0 - pyqt >=5.10 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 - tornado >=5 license: PSF-2.0 license_family: PSF - size: 8553 - timestamp: 1708026739384 + size: 8430 + timestamp: 1712606110087 - kind: conda name: matplotlib-base - version: 3.8.3 + version: 3.8.4 build: py39h7070ae8_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.3-py39h7070ae8_0.conda - sha256: 4173787e0ff755e25ebe1c4bb9e0a64fd397cd0fa18f28e54a592cc1af2b6049 - md5: 241e91172dfaa6ad66e3c838a6185641 + url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.4-py39h7070ae8_0.conda + sha256: 4d48e1826a03d65650bf5c79883c05f28a88a56759a0d0c5f21a815fef10ff09 + md5: cb9e1f8aff1f759b9685e908f9dc0a5b depends: - __osx >=10.12 - certifi >=2020.06.20 @@ -6121,18 +6914,16 @@ packages: - python_abi 3.9.* *_cp39 license: PSF-2.0 license_family: PSF - purls: - - pkg:pypi/matplotlib - size: 6910833 - timestamp: 1708027042126 + size: 6946151 + timestamp: 1712606316061 - kind: conda name: matplotlib-base - version: 3.8.3 + version: 3.8.4 build: py39hbab7938_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.3-py39hbab7938_0.conda - sha256: 698ac01f950fb5646275c94c2719782e3a77d26164a5491c4ad4dfc6d9be1b71 - md5: c8a05fdf66e3f0bfc087d29461da56e5 + url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.4-py39hbab7938_0.conda + sha256: cb9e48efec82ca08b04251f18300f20c5f8d6656ba0c4c9f181202bb34de2361 + md5: 95750a5aeb81a136d204e2747de59a18 depends: - certifi >=2020.06.20 - contourpy >=1.0.1 @@ -6153,18 +6944,16 @@ packages: - python_abi 3.9.* *_cp39 license: PSF-2.0 license_family: PSF - purls: - - pkg:pypi/matplotlib - size: 6825567 - timestamp: 1708027174151 + size: 6942468 + timestamp: 1712606780360 - kind: conda name: matplotlib-base - version: 3.8.3 + version: 3.8.4 build: py39he9076e7_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.3-py39he9076e7_0.conda - sha256: 6a430a5816f189b7277182b6c251236c5af22e254b8253eeb6ffcb06a8ea7087 - md5: 5456bdfe5809ebf5689eda6c808b686e + url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py39he9076e7_0.conda + sha256: 20fa30a3c683a78975114f7132e1e0db3def81a3cf1952078f0da18ce533fc2b + md5: 1919384a8420e7bb25f6c3a582e0857c depends: - certifi >=2020.06.20 - contourpy >=1.0.1 @@ -6186,18 +6975,16 @@ packages: - tk >=8.6.13,<8.7.0a0 license: PSF-2.0 license_family: PSF - purls: - - pkg:pypi/matplotlib - size: 6931092 - timestamp: 1708026713643 + size: 6722721 + timestamp: 1712606079317 - kind: conda name: matplotlib-base - version: 3.8.3 + version: 3.8.4 build: py39hf19769e_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.3-py39hf19769e_0.conda - sha256: 42935a85bd54684b1796350ab55fdf161e620885b76c2e34ab63a17cb0748e18 - md5: e7a42adb568586ff4035d7ef2d06c4b1 + url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.4-py39hf19769e_0.conda + sha256: 973ad73b6058aad370492a7f0dca4cb70f6ae1b0f2052846ad31acf2191b8da2 + md5: 7836c3dc5814f6d55a7392657c576e88 depends: - certifi >=2020.06.20 - contourpy >=1.0.1 @@ -6219,10 +7006,8 @@ packages: - vc14_runtime >=14.29.30139 license: PSF-2.0 license_family: PSF - purls: - - pkg:pypi/matplotlib - size: 6754973 - timestamp: 1708027177507 + size: 6849548 + timestamp: 1712606786181 - kind: conda name: mdit-py-plugins version: 0.4.0 @@ -6238,7 +7023,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/mdit-py-plugins + - pkg:pypi/mdit-py-plugins@0.4.0 size: 41197 timestamp: 1686175527330 - kind: conda @@ -6255,7 +7040,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/mdurl + - pkg:pypi/mdurl@0.1.2 size: 14680 timestamp: 1704317789138 - kind: conda @@ -6273,6 +7058,8 @@ packages: - setuptools license: Apache-2.0 license_family: APACHE + purls: + - pkg:pypi/meson@1.3.0 size: 628242 timestamp: 1700451735019 - kind: conda @@ -6294,29 +7081,29 @@ packages: - requests license: CC0-1.0 purls: - - pkg:pypi/mfpymake + - pkg:pypi/mfpymake@1.2.9 size: 59409 timestamp: 1707761286555 - kind: conda name: mkl - version: 2024.0.0 - build: h66d3029_49657 - build_number: 49657 + version: 2024.1.0 + build: h66d3029_692 + build_number: 692 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.0.0-h66d3029_49657.conda - sha256: 928bed978827e4c891d0879d79ecda6c9104ed7df1f1d4e2e392c9c80b471be7 - md5: 006b65d9cd436247dfe053df772e041d + url: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_692.conda + sha256: abfdb5eb3a17af59a827ea49fcb4d2bf18e70b62498bf3720351962e636cb5b7 + md5: b43ec7ed045323edeff31e348eea8652 depends: - intel-openmp 2024.* - tbb 2021.* license: LicenseRef-ProprietaryIntel license_family: Proprietary - size: 108505947 - timestamp: 1701973497498 + size: 109491063 + timestamp: 1712153746272 - kind: pypi name: modflow-devtools version: 1.5.0.dev0 - url: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@e65c4d3304f0230345d6f1d4d8f911e0c2eb7c64 + url: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@08eff72b73da66541f7a08ddf398298210ce3758 requires_dist: - sphinx ; extra == 'docs' - sphinx-rtd-theme ; extra == 'docs' @@ -6338,7 +7125,7 @@ packages: - kind: pypi name: modflowapi version: 0.3.0.dev0 - url: git+https://github.com/MODFLOW-USGS/modflowapi.git@c6811fded7d832506c8bf98cef9ffffa31e2da3b + url: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f requires_dist: - numpy <2.0.0 - pandas @@ -6353,19 +7140,19 @@ packages: requires_python: '>=3.9' - kind: conda name: mpg123 - version: 1.32.4 + version: 1.32.6 build: h59595ed_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.4-h59595ed_0.conda - sha256: 512f4ad7eda3b2c9a1cc9f7931932aefa6e79567e35b76de03895e769cb3b43c - md5: 3f1017b4141e943d9bc8739237f749e8 + url: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda + sha256: 8895a5ce5122a3b8f59afcba4b032f198e8a690a0efc95ef61f2135357ef0d72 + md5: 9160cdeb523a1b20cf8d2a0bf821f45d depends: - libgcc-ng >=12 - libstdcxx-ng >=12 license: LGPL-2.1-only license_family: LGPL - size: 491061 - timestamp: 1704980200966 + size: 491811 + timestamp: 1712327176955 - kind: conda name: msys2-conda-epoch version: '20160418' @@ -6390,6 +7177,8 @@ packages: - python license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/munkres@1.1.4 size: 12452 timestamp: 1600387789153 - kind: conda @@ -6406,7 +7195,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/mypy-extensions + - pkg:pypi/mypy-extensions@1.0.0 size: 10492 timestamp: 1675543414256 - kind: conda @@ -6448,25 +7237,25 @@ packages: timestamp: 1709910705541 - kind: conda name: nbformat - version: 5.10.3 + version: 5.10.4 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.3-pyhd8ed1ab_0.conda - sha256: 774ba7f0f175851723d9e1524ca5246b431eca1b1e22387b58a80ad0dcd7acd8 - md5: ca3d437c0ef2e87f63d085822c74c49a + url: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda + sha256: 36fe73da4d37bc7ac2d1540526ecd294fbd09acda04e096181ab8f1ccd2b464c + md5: 0b57b5368ab7fc7cdc9e3511fa867214 depends: - jsonschema >=2.6 - - jupyter_core + - jupyter_core >=4.12,!=5.0.* - python >=3.8 - - python-fastjsonschema + - python-fastjsonschema >=2.15 - traitlets >=5.1 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/nbformat - size: 100844 - timestamp: 1710502340495 + - pkg:pypi/nbformat@5.10.4 + size: 101232 + timestamp: 1712239122969 - kind: conda name: ncurses version: 6.4.20240210 @@ -6521,7 +7310,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/networkx + - pkg:pypi/networkx@3.2.1 size: 1149552 timestamp: 1698504905258 - kind: conda @@ -6637,7 +7426,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy + - pkg:pypi/numpy@1.26.4 size: 6481665 timestamp: 1707226262838 - kind: conda @@ -6661,7 +7450,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy + - pkg:pypi/numpy@1.26.4 size: 7039431 timestamp: 1707225726227 - kind: conda @@ -6685,7 +7474,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy + - pkg:pypi/numpy@1.26.4 size: 5492058 timestamp: 1707226364958 - kind: conda @@ -6710,7 +7499,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy + - pkg:pypi/numpy@1.26.4 size: 5920615 timestamp: 1707226471242 - kind: conda @@ -6870,7 +7659,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/packaging + - pkg:pypi/packaging@24.0 size: 49832 timestamp: 1710076089469 - kind: conda @@ -6893,6 +7682,8 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/pandas@2.2.1 size: 11830380 timestamp: 1708710136935 - kind: conda @@ -6914,6 +7705,8 @@ packages: - pytz >=2020.1 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/pandas@2.2.1 size: 11987027 timestamp: 1708709608466 - kind: conda @@ -6934,6 +7727,8 @@ packages: - pytz >=2020.1 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/pandas@2.2.1 size: 12136682 timestamp: 1708709770431 - kind: conda @@ -6955,6 +7750,8 @@ packages: - pytz >=2020.1 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/pandas@2.2.1 size: 12832936 timestamp: 1708709133691 - kind: conda @@ -7056,7 +7853,7 @@ packages: license: MPL-2.0 license_family: MOZILLA purls: - - pkg:pypi/pathspec + - pkg:pypi/pathspec@0.12.1 size: 41173 timestamp: 1702250135032 - kind: conda @@ -7145,6 +7942,8 @@ packages: - python_abi 3.9.* *_cp39 - tk >=8.6.13,<8.7.0a0 license: HPND + purls: + - pkg:pypi/pillow@10.3.0 size: 40576213 timestamp: 1712155121473 - kind: conda @@ -7169,6 +7968,8 @@ packages: - python_abi 3.9.* *_cp39 - tk >=8.6.13,<8.7.0a0 license: HPND + purls: + - pkg:pypi/pillow@10.3.0 size: 42433427 timestamp: 1712154625243 - kind: conda @@ -7192,6 +7993,8 @@ packages: - python_abi 3.9.* *_cp39 - tk >=8.6.13,<8.7.0a0 license: HPND + purls: + - pkg:pypi/pillow@10.3.0 size: 42224219 timestamp: 1712154790265 - kind: conda @@ -7218,6 +8021,8 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: HPND + purls: + - pkg:pypi/pillow@10.3.0 size: 42541715 timestamp: 1712155039095 - kind: conda @@ -7236,7 +8041,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pip + - pkg:pypi/pip@24.0 size: 1398245 timestamp: 1706960660581 - kind: conda @@ -7312,7 +8117,7 @@ packages: - python >=3.6 license: MIT AND PSF-2.0 purls: - - pkg:pypi/pkgutil-resolve-name + - pkg:pypi/pkgutil-resolve-name@1.3.10 size: 10778 timestamp: 1694617398467 - kind: conda @@ -7329,7 +8134,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/platformdirs + - pkg:pypi/platformdirs@4.2.0 size: 20210 timestamp: 1706713564353 - kind: conda @@ -7346,27 +8151,25 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pluggy + - pkg:pypi/pluggy@1.4.0 size: 23384 timestamp: 1706116931972 - kind: conda name: ply version: '3.11' - build: py_1 - build_number: 1 + build: pyhd8ed1ab_2 + build_number: 2 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2 - sha256: 2cd6fae8f9cbc806b7f828f006ae4a83c23fac917cacfd73c37ce322d4324e53 - md5: 7205635cd71531943440fbfe3b6b5727 + url: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda + sha256: d8faaf4dcc13caed560fa32956523b35928a70499a2d08c51320947d637e3a41 + md5: 18c6deb6f9602e32446398203c8f0e91 depends: - - python - license: BSD 3-clause + - python >=2.6 + license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/ply - size: 44837 - timestamp: 1530963184592 + size: 49196 + timestamp: 1712243121626 - kind: conda name: pthread-stubs version: '0.4' @@ -7471,7 +8274,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/py-cpuinfo + - pkg:pypi/py-cpuinfo@9.0.0 size: 24947 timestamp: 1666774595872 - kind: conda @@ -7491,7 +8294,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pydotplus + - pkg:pypi/pydotplus@2.0.2 size: 24847 timestamp: 1622588237763 - kind: conda @@ -7508,7 +8311,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pyparsing + - pkg:pypi/pyparsing@3.1.2 size: 89455 timestamp: 1709721146886 - kind: conda @@ -7531,7 +8334,7 @@ packages: license: GPL-3.0-only license_family: GPL purls: - - pkg:pypi/pyqt5 + - pkg:pypi/pyqt5@5.15.9 size: 5227659 timestamp: 1695420723753 - kind: conda @@ -7555,7 +8358,7 @@ packages: license: GPL-3.0-only license_family: GPL purls: - - pkg:pypi/pyqt5 + - pkg:pypi/pyqt5@5.15.9 size: 3876568 timestamp: 1695421679054 - kind: conda @@ -7577,6 +8380,8 @@ packages: - toml license: GPL-3.0-only license_family: GPL + purls: + - pkg:pypi/pyqt5-sip@12.12.2 size: 85034 timestamp: 1695418081052 - kind: conda @@ -7599,6 +8404,8 @@ packages: - vc14_runtime >=14.29.30139 license: GPL-3.0-only license_family: GPL + purls: + - pkg:pypi/pyqt5-sip@12.12.2 size: 79633 timestamp: 1695418442270 - kind: conda @@ -7633,7 +8440,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/pysocks + - pkg:pypi/pysocks@1.7.1 size: 19348 timestamp: 1661605138291 - kind: conda @@ -7652,7 +8459,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/pysocks + - pkg:pypi/pysocks@1.7.1 size: 18981 timestamp: 1661604969727 - kind: conda @@ -7677,7 +8484,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pytest + - pkg:pypi/pytest@8.1.1 size: 255523 timestamp: 1709992719691 - kind: conda @@ -7696,7 +8503,7 @@ packages: license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/pytest-benchmark + - pkg:pypi/pytest-benchmark@4.0.0 size: 39571 timestamp: 1666782598879 - kind: conda @@ -7715,7 +8522,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pytest-dotenv + - pkg:pypi/pytest-dotenv@0.5.2 size: 7383 timestamp: 1606859705188 - kind: conda @@ -7733,7 +8540,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pytest-order + - pkg:pypi/pytest-order@1.0.1 size: 15851 timestamp: 1641771678634 - kind: conda @@ -7754,7 +8561,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pytest-xdist + - pkg:pypi/pytest-xdist@3.5.0 size: 36516 timestamp: 1700593072448 - kind: conda @@ -7873,7 +8680,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/python-dateutil + - pkg:pypi/python-dateutil@2.9.0 size: 222742 timestamp: 1709299922152 - kind: conda @@ -7889,6 +8696,8 @@ packages: - python >=3.8 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/python-dotenv@1.0.1 size: 24278 timestamp: 1706018281544 - kind: conda @@ -7905,7 +8714,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/fastjsonschema + - pkg:pypi/fastjsonschema@2.19.1 size: 225250 timestamp: 1703781171097 - kind: conda @@ -7922,7 +8731,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/tzdata + - pkg:pypi/tzdata@2024.1 size: 144024 timestamp: 1707747742930 - kind: conda @@ -7999,7 +8808,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pytz + - pkg:pypi/pytz@2024.1 size: 188538 timestamp: 1706886944988 - kind: conda @@ -8019,6 +8828,8 @@ packages: - vc14_runtime >=14.29.30139 license: PSF-2.0 license_family: PSF + purls: + - pkg:pypi/pywin32@306 size: 5808124 timestamp: 1695974471118 - kind: conda @@ -8037,6 +8848,8 @@ packages: - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT + purls: + - pkg:pypi/pyyaml@6.0.1 size: 159929 timestamp: 1695373838385 - kind: conda @@ -8057,6 +8870,8 @@ packages: - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT + purls: + - pkg:pypi/pyyaml@6.0.1 size: 151118 timestamp: 1695373930963 - kind: conda @@ -8075,6 +8890,8 @@ packages: - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT + purls: + - pkg:pypi/pyyaml@6.0.1 size: 178391 timestamp: 1695373606953 - kind: conda @@ -8092,17 +8909,19 @@ packages: - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT + purls: + - pkg:pypi/pyyaml@6.0.1 size: 162428 timestamp: 1695373824922 - kind: conda name: qt-main version: 5.15.8 - build: h112747c_20 - build_number: 20 + build: hc9dc06e_21 + build_number: 21 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h112747c_20.conda - sha256: 14f9075640d1abc7f8834420564f80aeaaf4da75e40dc3e4187f93d39f952418 - md5: cea58006ee5e891fc2a70c6b64d41363 + url: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-hc9dc06e_21.conda + sha256: 6b4594f6f2fad65a7ed52993f602e3ab183193755fe4a492aaa48e463b23105b + md5: b325046180590c868ce0dbf267b82eb8 depends: - __glibc >=2.17,<3.0.a0 - alsa-lib >=1.2.11,<1.3.0a0 @@ -8110,8 +8929,8 @@ packages: - fontconfig >=2.14.2,<3.0a0 - fonts-conda-ecosystem - freetype >=2.12.1,<3.0a0 - - gst-plugins-base >=1.22.9,<1.23.0a0 - - gstreamer >=1.22.9,<1.23.0a0 + - gst-plugins-base >=1.24.1,<1.25.0a0 + - gstreamer >=1.24.1,<1.25.0a0 - harfbuzz >=8.3.0,<9.0a0 - icu >=73.2,<74.0a0 - krb5 >=1.21.2,<1.22.0a0 @@ -8129,7 +8948,7 @@ packages: - libsqlite >=3.45.2,<4.0a0 - libstdcxx-ng >=12 - libxcb >=1.15,<1.16.0a0 - - libxkbcommon >=1.6.0,<2.0a0 + - libxkbcommon >=1.7.0,<2.0a0 - libxml2 >=2.12.6,<3.0a0 - libzlib >=1.2.13,<1.3.0a0 - mysql-libs >=8.3.0,<8.4.0a0 @@ -8144,7 +8963,7 @@ packages: - xcb-util-wm >=0.4.1,<0.5.0a0 - xorg-libice >=1.1.1,<2.0a0 - xorg-libsm >=1.2.4,<2.0a0 - - xorg-libx11 >=1.8.7,<2.0a0 + - xorg-libx11 >=1.8.9,<2.0a0 - xorg-libxext >=1.3.4,<2.0a0 - xorg-xf86vidmodeproto - zstd >=1.5.5,<1.6.0a0 @@ -8152,20 +8971,20 @@ packages: - qt 5.15.8 license: LGPL-3.0-only license_family: LGPL - size: 60849352 - timestamp: 1711304658310 + size: 61305384 + timestamp: 1712549380352 - kind: conda name: qt-main version: 5.15.8 - build: h9e85ed6_20 - build_number: 20 + build: hcef0176_21 + build_number: 21 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/qt-main-5.15.8-h9e85ed6_20.conda - sha256: 548e948eb70174dad20151714a70319b9b2d220b75d407a88f4f5812f14fcdd2 - md5: 312511ef95bf1418f20dd50041a4bc85 + url: https://conda.anaconda.org/conda-forge/win-64/qt-main-5.15.8-hcef0176_21.conda + sha256: 7eb717efea95fb0f8384f7c59b709dbe3c7a2c1fabca60c8792760211c430251 + md5: 76544d3dfeff8fd52250df168cb0005b depends: - - gst-plugins-base >=1.22.9,<1.23.0a0 - - gstreamer >=1.22.9,<1.23.0a0 + - gst-plugins-base >=1.24.1,<1.25.0a0 + - gstreamer >=1.24.1,<1.25.0a0 - icu >=73.2,<74.0a0 - krb5 >=1.21.2,<1.22.0a0 - libclang13 >=15.0.7 @@ -8183,8 +9002,8 @@ packages: - qt 5.15.8 license: LGPL-3.0-only license_family: LGPL - size: 60012507 - timestamp: 1711306247296 + size: 59806644 + timestamp: 1712551057454 - kind: conda name: readline version: '8.2' @@ -8247,7 +9066,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/referencing + - pkg:pypi/referencing@0.34.0 size: 42071 timestamp: 1710763821612 - kind: conda @@ -8270,7 +9089,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/requests + - pkg:pypi/requests@2.31.0 size: 56690 timestamp: 1684774408600 - kind: conda @@ -8290,7 +9109,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/rpds-py + - pkg:pypi/rpds-py@0.18.0 size: 292859 timestamp: 1707923214688 - kind: conda @@ -8308,7 +9127,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/rpds-py + - pkg:pypi/rpds-py@0.18.0 size: 915925 timestamp: 1707923007058 - kind: conda @@ -8327,7 +9146,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/rpds-py + - pkg:pypi/rpds-py@0.18.0 size: 300083 timestamp: 1707923366326 - kind: conda @@ -8347,22 +9166,21 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/rpds-py + - pkg:pypi/rpds-py@0.18.0 size: 202481 timestamp: 1707923894221 - kind: conda name: scipy - version: 1.12.0 - build: py39h0ed1e0f_2 - build_number: 2 + version: 1.13.0 + build: py39h0ed1e0f_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.12.0-py39h0ed1e0f_2.conda - sha256: 3a721490dff7c37d6e516ab3991761afa5586e3722f97a793dba538ee9cfa310 - md5: dcc2e3dd279432335b58f986d91dd9fd + url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.0-py39h0ed1e0f_0.conda + sha256: 3dea9d2501faed932014f79d546467e905840dd60163fb54e1a4786fca3e5e82 + md5: 3a4d0af4fe2006bedc33ca61e9a0b4d6 depends: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - - libcxx >=15 + - libcxx >=16 - libgfortran 5.* - libgfortran5 >=12.3.0 - libgfortran5 >=13.2.0 @@ -8373,17 +9191,16 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - size: 15911980 - timestamp: 1706064557722 + size: 15767508 + timestamp: 1712257544134 - kind: conda name: scipy - version: 1.12.0 - build: py39h474f0d3_2 - build_number: 2 + version: 1.13.0 + build: py39h474f0d3_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py39h474f0d3_2.conda - sha256: 8b2312d5be30bfb226e83af8e070c65df6816d0a9b179f51b9f915990bfd86ee - md5: 6ab241b2023730f6b41712dc1b503afa + url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py39h474f0d3_0.conda + sha256: 7eb1a6d883514f5f88fda702fe81a6e63d84c8a7076b2cbbd009bed21986f82a + md5: 46ae0ecba9726ab4fa44c78fefa522cf depends: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 @@ -8398,21 +9215,20 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - size: 16387698 - timestamp: 1706042473639 + size: 16360934 + timestamp: 1712256688151 - kind: conda name: scipy - version: 1.12.0 - build: py39hcc04109_2 - build_number: 2 + version: 1.13.0 + build: py39hcc04109_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.12.0-py39hcc04109_2.conda - sha256: b319c34eb72aa97a9775c14ed64af02398f9e4d3b563453b4a0225cd4d5903eb - md5: d11014867a62eb349f91d65b31e6a322 + url: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.0-py39hcc04109_0.conda + sha256: 3f5d5453aa7f295e501052c5bceab6626dd820b7e1e727d5ec3c1dfe46bcee21 + md5: 72a666030ab05e9de0d2eec63ffbc5cc depends: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - - libcxx >=15 + - libcxx >=16 - libgfortran 5.* - libgfortran5 >=12.3.0 - libgfortran5 >=13.2.0 @@ -8424,17 +9240,16 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - size: 14695040 - timestamp: 1706043583427 + size: 14629900 + timestamp: 1712257309832 - kind: conda name: scipy - version: 1.12.0 - build: py39hddb5d58_2 - build_number: 2 + version: 1.13.0 + build: py39hddb5d58_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/scipy-1.12.0-py39hddb5d58_2.conda - sha256: 2cc049ee282ec1face95e102ee936858019eb567c7d613b4956345f41a52df79 - md5: e421d27a09f9131514436f8233125766 + url: https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.0-py39hddb5d58_0.conda + sha256: 571d5a522b997c52193a991ec99cc1e971b80beb73fa0db2307d96fa1518c0af + md5: cfe749056fb9ed9dbc096b5751becf34 depends: - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 @@ -8448,8 +9263,8 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD - size: 15016838 - timestamp: 1706044178953 + size: 14849543 + timestamp: 1712257711116 - kind: conda name: setuptools version: 69.2.0 @@ -8464,7 +9279,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/setuptools + - pkg:pypi/setuptools@69.2.0 size: 471183 timestamp: 1710344615844 - kind: conda @@ -8483,7 +9298,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/shapely + - pkg:pypi/shapely@2.0.3 size: 449167 timestamp: 1708368412520 - kind: conda @@ -8505,7 +9320,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/shapely + - pkg:pypi/shapely@2.0.3 size: 450564 timestamp: 1708368463948 - kind: conda @@ -8525,7 +9340,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/shapely + - pkg:pypi/shapely@2.0.3 size: 479182 timestamp: 1708368191201 - kind: conda @@ -8545,7 +9360,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/shapely + - pkg:pypi/shapely@2.0.3 size: 446351 timestamp: 1708368614890 - kind: conda @@ -8567,7 +9382,7 @@ packages: license: GPL-3.0-only license_family: GPL purls: - - pkg:pypi/sip + - pkg:pypi/sip@6.7.12 size: 491742 timestamp: 1697300599649 - kind: conda @@ -8590,7 +9405,7 @@ packages: license: GPL-3.0-only license_family: GPL purls: - - pkg:pypi/sip + - pkg:pypi/sip@6.7.12 size: 502390 timestamp: 1697300934198 - kind: conda @@ -8607,7 +9422,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/six + - pkg:pypi/six@1.16.0 size: 14259 timestamp: 1620240338595 - kind: conda @@ -8705,7 +9520,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/toml + - pkg:pypi/toml@0.10.2 size: 18433 timestamp: 1604308660817 - kind: conda @@ -8722,7 +9537,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/tomli + - pkg:pypi/tomli@2.0.1 size: 15940 timestamp: 1644342331069 - kind: conda @@ -8740,7 +9555,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado + - pkg:pypi/tornado@6.4 size: 641216 timestamp: 1708363746873 - kind: conda @@ -8757,7 +9572,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado + - pkg:pypi/tornado@6.4 size: 641481 timestamp: 1708363543532 - kind: conda @@ -8777,7 +9592,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado + - pkg:pypi/tornado@6.4 size: 644981 timestamp: 1708363806202 - kind: conda @@ -8795,7 +9610,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado + - pkg:pypi/tornado@6.4 size: 639959 timestamp: 1708363320529 - kind: conda @@ -8812,7 +9627,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/traitlets + - pkg:pypi/traitlets@5.14.2 size: 110288 timestamp: 1710254564088 - kind: conda @@ -8829,26 +9644,24 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/trove-classifiers + - pkg:pypi/trove-classifiers@2024.3.25 size: 18393 timestamp: 1711440195159 - kind: conda name: typing_extensions - version: 4.10.0 + version: 4.11.0 build: pyha770c72_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.10.0-pyha770c72_0.conda - sha256: 4be24d557897b2f6609f5d5f7c437833c62f4d4a96581e39530067e96a2d0451 - md5: 16ae769069b380646c47142d719ef466 + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda + sha256: a7e8714d14f854058e971a6ed44f18cc37cc685f98ddefb2e6b7899a0cc4d1a2 + md5: 6ef2fc37559256cf682d8b3375e89b80 depends: - python >=3.8 license: PSF-2.0 license_family: PSF - purls: - - pkg:pypi/typing-extensions - size: 37018 - timestamp: 1708904796013 + size: 37583 + timestamp: 1712330089194 - kind: conda name: tzdata version: 2024a @@ -8890,7 +9703,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/unicodedata2 + - pkg:pypi/unicodedata2@15.1.0 size: 376309 timestamp: 1695848358752 - kind: conda @@ -8910,7 +9723,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/unicodedata2 + - pkg:pypi/unicodedata2@15.1.0 size: 373257 timestamp: 1695848310896 - kind: conda @@ -8928,7 +9741,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/unicodedata2 + - pkg:pypi/unicodedata2@15.1.0 size: 373822 timestamp: 1695848128416 - kind: conda @@ -8945,7 +9758,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/unicodedata2 + - pkg:pypi/unicodedata2@15.1.0 size: 369843 timestamp: 1695848310939 - kind: conda @@ -8964,7 +9777,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/urllib3 + - pkg:pypi/urllib3@2.2.1 size: 94669 timestamp: 1708239595549 - kind: conda @@ -9031,7 +9844,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/wheel + - pkg:pypi/wheel@0.43.0 size: 57963 timestamp: 1711546009410 - kind: conda @@ -9049,7 +9862,7 @@ packages: - python >=3.6 license: PUBLIC-DOMAIN purls: - - pkg:pypi/win-inet-pton + - pkg:pypi/win-inet-pton@1.1.0 size: 8191 timestamp: 1667051294134 - kind: conda @@ -9165,7 +9978,7 @@ packages: - python >=3.8 license: CC0-1.0 purls: - - pkg:pypi/xmipy + - pkg:pypi/xmipy@1.3.1 size: 18460 timestamp: 1681486998644 - kind: conda @@ -9262,12 +10075,12 @@ packages: timestamp: 1685454296879 - kind: conda name: xorg-libx11 - version: 1.8.7 + version: 1.8.9 build: h8ee46fc_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda - sha256: 7a02a7beac472ae2759498550b5fc5261bf5be7a9a2b4648a3f67818a7bfefcf - md5: 49e482d882669206653b095f5206c05b + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda + sha256: 3e53ba247f1ad68353f18aceba5bf8ce87e3dea930de85d36946844a7658c9fb + md5: 077b6e8ad6a3ddb741fce2496dd01bec depends: - libgcc-ng >=12 - libxcb >=1.15,<1.16.0a0 @@ -9276,16 +10089,16 @@ packages: - xorg-xproto license: MIT license_family: MIT - size: 828692 - timestamp: 1697056910935 + size: 828060 + timestamp: 1712415742569 - kind: conda name: xorg-libx11 - version: 1.8.7 + version: 1.8.9 build: hefa74cf_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/xorg-libx11-1.8.7-hefa74cf_0.conda - sha256: 9592f89804787267dce5bc2da6e3173d47b5b90a7adb2c5987aabfee398f5199 - md5: f655c68ee958deb0d9cba7c75490cc45 + url: https://conda.anaconda.org/conda-forge/win-64/xorg-libx11-1.8.9-hefa74cf_0.conda + sha256: 15217b9180ff7d6840762363647fabcb79636517454d2c05dd69cb3fc38a1001 + md5: 3672e991346895f332af1ebc60b8bca9 depends: - libxcb >=1.15,<1.16.0a0 - m2w64-gcc-libs @@ -9295,8 +10108,8 @@ packages: - xorg-xproto license: MIT license_family: MIT - size: 816347 - timestamp: 1697057853346 + size: 814566 + timestamp: 1712416687331 - kind: conda name: xorg-libxau version: 1.0.11 @@ -9703,7 +10516,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/zipp + - pkg:pypi/zipp@3.17.0 size: 18954 timestamp: 1695255262261 - kind: conda From 69aeca1b0a21f90af70bdb19234769da12aa557b Mon Sep 17 00:00:00 2001 From: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> Date: Thu, 11 Apr 2024 11:02:00 +0200 Subject: [PATCH 092/199] Update pixi.lock file (#1716) The last attempt apparently didn't work --- pixi.lock | 456 ++++++++++-------------------------------------------- 1 file changed, 84 insertions(+), 372 deletions(-) diff --git a/pixi.lock b/pixi.lock index f1d216326eb..df1b0216e6a 100644 --- a/pixi.lock +++ b/pixi.lock @@ -157,7 +157,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.1-py39hddac248_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py39hddac248_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda @@ -205,7 +205,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py39hd1e30aa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.4.10-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda @@ -235,10 +235,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda - - pypi: https://files.pythonhosted.org/packages/31/a2/2f12e3a6e45935ff694654b710961b03310b0e1ec997ee9f416d3c873f87/contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: git+https://github.com/modflowpy/flopy.git@9e87acddcf0740aac491826ef86fd45ae2304dac - - pypi: https://files.pythonhosted.org/packages/8b/c6/636f008104908a93b80419f756be755bb91df4b8a0c88d5158bb52c82c3a/fonttools-4.51.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/5e/2c/513395a63a9e1124a5648addbf73be23cc603f955af026b04416da98dc96/matplotlib-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@08eff72b73da66541f7a08ddf398298210ce3758 - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f osx-64: @@ -355,7 +352,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.2-h7310d3a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.2.1-hd75f5a5_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.1-py39haf03413_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.2-py39haf03413_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.50.14-h19c1c8a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.43-h0ad2156_0.conda @@ -397,7 +394,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4-py39ha09f3b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.4.10-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-15.1.0-py39hdc70f33_0.conda @@ -411,10 +408,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h8a1eda9_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.5-h829000d_0.conda - - pypi: https://files.pythonhosted.org/packages/e9/1e/09f0fdf21d3a71e298cfbc1944eb1f74c1f025ca6193f6c75caa35e27b10/contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl - pypi: git+https://github.com/modflowpy/flopy.git@9e87acddcf0740aac491826ef86fd45ae2304dac - - pypi: https://files.pythonhosted.org/packages/bb/4c/16629110b4fccedd985a9fd953490a99e2449a120f065a093dea2898dad8/fonttools-4.51.0-cp39-cp39-macosx_10_9_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/84/5f/a0c7a4ce9cc96d3e592c44d1c0f2ebdf5f101e25ced2c14902ae7faa4ff4/matplotlib-3.8.4-cp39-cp39-macosx_10_12_x86_64.whl - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@08eff72b73da66541f7a08ddf398298210ce3758 - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f osx-arm64: @@ -531,7 +525,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.1-h0d3ecfb_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.1-py39h47e51b9_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.2-py39h47e51b9_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.50.14-hcf40dda_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.43-h26f9a81_0.conda @@ -573,7 +567,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4-py39h17cfd9d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.4.10-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-15.1.0-py39h0f82c59_0.conda @@ -587,10 +581,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-h53f4e23_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.5-h4f39d0f_0.conda - - pypi: https://files.pythonhosted.org/packages/1e/f5/8a0e688c3a6098a358fa359da6a09a7b9afd8f3f6c9b83e9898c29e87b95/contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl - pypi: git+https://github.com/modflowpy/flopy.git@9e87acddcf0740aac491826ef86fd45ae2304dac - - pypi: https://files.pythonhosted.org/packages/3e/d8/db820b6243325f29e93de36273fdd48f3c1dce7fa859be5ed3708e174eba/fonttools-4.51.0-cp39-cp39-macosx_10_9_universal2.whl - - pypi: https://files.pythonhosted.org/packages/d5/88/83aee628339486de57fcc8c1387e28de816182edcfc42928cff02c364664/matplotlib-3.8.4-cp39-cp39-macosx_11_0_arm64.whl - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@08eff72b73da66541f7a08ddf398298210ce3758 - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f win-64: @@ -713,7 +704,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.2-h3d672ee_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.2.1-py39h32e6231_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.2.2-py39h32e6231_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.50.14-h07c897b_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.43-h17e33f8_0.conda @@ -762,7 +753,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.4-py39ha55989b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.4.10-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 @@ -790,10 +781,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.2.13-hcfcfb64_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.5-h12be248_0.conda - - pypi: https://files.pythonhosted.org/packages/62/5c/08e3a7a35762c8decb6be01c7ec1f4b5f85ef2e2fbb44af87e9caf25a879/contourpy-1.2.1-cp39-cp39-win_amd64.whl - pypi: git+https://github.com/modflowpy/flopy.git@9e87acddcf0740aac491826ef86fd45ae2304dac - - pypi: https://files.pythonhosted.org/packages/5e/62/ec6247534b077c9627e745d8046027ae363ed6d6407f8010650439ecbda1/fonttools-4.51.0-cp39-cp39-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/54/af/17195cf1f43cd3be79b15aecc5b7e44ea08456bd0048ad8dcd3a5fd45c45/matplotlib-3.8.4-cp39-cp39-win_amd64.whl - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@08eff72b73da66541f7a08ddf398298210ce3758 - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f packages: @@ -1596,102 +1584,6 @@ packages: - pkg:pypi/configargparse@1.7 size: 39491 timestamp: 1690138171226 -- kind: pypi - name: contourpy - version: 1.2.1 - url: https://files.pythonhosted.org/packages/e9/1e/09f0fdf21d3a71e298cfbc1944eb1f74c1f025ca6193f6c75caa35e27b10/contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl - sha256: bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b - requires_dist: - - numpy >=1.20 - - furo ; extra == 'docs' - - sphinx >=7.2 ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - bokeh ; extra == 'bokeh' - - selenium ; extra == 'bokeh' - - contourpy[bokeh,docs] ; extra == 'mypy' - - docutils-stubs ; extra == 'mypy' - - mypy ==1.8.0 ; extra == 'mypy' - - types-pillow ; extra == 'mypy' - - contourpy[test-no-images] ; extra == 'test' - - matplotlib ; extra == 'test' - - pillow ; extra == 'test' - - pytest ; extra == 'test-no-images' - - pytest-cov ; extra == 'test-no-images' - - pytest-xdist ; extra == 'test-no-images' - - wurlitzer ; extra == 'test-no-images' - requires_python: '>=3.9' -- kind: pypi - name: contourpy - version: 1.2.1 - url: https://files.pythonhosted.org/packages/31/a2/2f12e3a6e45935ff694654b710961b03310b0e1ec997ee9f416d3c873f87/contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445 - requires_dist: - - numpy >=1.20 - - furo ; extra == 'docs' - - sphinx >=7.2 ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - bokeh ; extra == 'bokeh' - - selenium ; extra == 'bokeh' - - contourpy[bokeh,docs] ; extra == 'mypy' - - docutils-stubs ; extra == 'mypy' - - mypy ==1.8.0 ; extra == 'mypy' - - types-pillow ; extra == 'mypy' - - contourpy[test-no-images] ; extra == 'test' - - matplotlib ; extra == 'test' - - pillow ; extra == 'test' - - pytest ; extra == 'test-no-images' - - pytest-cov ; extra == 'test-no-images' - - pytest-xdist ; extra == 'test-no-images' - - wurlitzer ; extra == 'test-no-images' - requires_python: '>=3.9' -- kind: pypi - name: contourpy - version: 1.2.1 - url: https://files.pythonhosted.org/packages/62/5c/08e3a7a35762c8decb6be01c7ec1f4b5f85ef2e2fbb44af87e9caf25a879/contourpy-1.2.1-cp39-cp39-win_amd64.whl - sha256: 10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9 - requires_dist: - - numpy >=1.20 - - furo ; extra == 'docs' - - sphinx >=7.2 ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - bokeh ; extra == 'bokeh' - - selenium ; extra == 'bokeh' - - contourpy[bokeh,docs] ; extra == 'mypy' - - docutils-stubs ; extra == 'mypy' - - mypy ==1.8.0 ; extra == 'mypy' - - types-pillow ; extra == 'mypy' - - contourpy[test-no-images] ; extra == 'test' - - matplotlib ; extra == 'test' - - pillow ; extra == 'test' - - pytest ; extra == 'test-no-images' - - pytest-cov ; extra == 'test-no-images' - - pytest-xdist ; extra == 'test-no-images' - - wurlitzer ; extra == 'test-no-images' - requires_python: '>=3.9' -- kind: pypi - name: contourpy - version: 1.2.1 - url: https://files.pythonhosted.org/packages/1e/f5/8a0e688c3a6098a358fa359da6a09a7b9afd8f3f6c9b83e9898c29e87b95/contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl - sha256: 1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f - requires_dist: - - numpy >=1.20 - - furo ; extra == 'docs' - - sphinx >=7.2 ; extra == 'docs' - - sphinx-copybutton ; extra == 'docs' - - bokeh ; extra == 'bokeh' - - selenium ; extra == 'bokeh' - - contourpy[bokeh,docs] ; extra == 'mypy' - - docutils-stubs ; extra == 'mypy' - - mypy ==1.8.0 ; extra == 'mypy' - - types-pillow ; extra == 'mypy' - - contourpy[test-no-images] ; extra == 'test' - - matplotlib ; extra == 'test' - - pillow ; extra == 'test' - - pytest ; extra == 'test-no-images' - - pytest-cov ; extra == 'test-no-images' - - pytest-xdist ; extra == 'test-no-images' - - wurlitzer ; extra == 'test-no-images' - requires_python: '>=3.9' - kind: conda name: contourpy version: 1.2.1 @@ -1707,6 +1599,8 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/contourpy@1.2.1 size: 232611 timestamp: 1712430213507 - kind: conda @@ -1726,6 +1620,8 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/contourpy@1.2.1 size: 186813 timestamp: 1712430556544 - kind: conda @@ -1744,6 +1640,8 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/contourpy@1.2.1 size: 225466 timestamp: 1712430376578 - kind: conda @@ -1762,6 +1660,8 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/contourpy@1.2.1 size: 241771 timestamp: 1712430062056 - kind: conda @@ -1845,6 +1745,8 @@ packages: - python >=3.8 license: MIT license_family: MIT + purls: + - pkg:pypi/execnet@2.1.1 size: 38883 timestamp: 1712591929944 - kind: conda @@ -1916,6 +1818,8 @@ packages: depends: - python >=3.7 license: Unlicense + purls: + - pkg:pypi/filelock@3.13.4 size: 15707 timestamp: 1712686250786 - kind: conda @@ -2144,154 +2048,6 @@ packages: license_family: BSD size: 4102 timestamp: 1566932280397 -- kind: pypi - name: fonttools - version: 4.51.0 - url: https://files.pythonhosted.org/packages/bb/4c/16629110b4fccedd985a9fd953490a99e2449a120f065a093dea2898dad8/fonttools-4.51.0-cp39-cp39-macosx_10_9_x86_64.whl - sha256: f7e89853d8bea103c8e3514b9f9dc86b5b4120afb4583b57eb10dfa5afbe0936 - requires_dist: - - fs <3, >=2.2.0 ; extra == 'all' - - lxml >=4.0 ; extra == 'all' - - zopfli >=0.1.4 ; extra == 'all' - - lz4 >=1.7.4.2 ; extra == 'all' - - pycairo ; extra == 'all' - - matplotlib ; extra == 'all' - - sympy ; extra == 'all' - - skia-pathops >=0.5.0 ; extra == 'all' - - uharfbuzz >=0.23.0 ; extra == 'all' - - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'all' - - xattr ; sys_platform == 'darwin' and extra == 'all' - - lz4 >=1.7.4.2 ; extra == 'graphite' - - pycairo ; extra == 'interpolatable' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' - - lxml >=4.0 ; extra == 'lxml' - - skia-pathops >=0.5.0 ; extra == 'pathops' - - matplotlib ; extra == 'plot' - - uharfbuzz >=0.23.0 ; extra == 'repacker' - - sympy ; extra == 'symfont' - - xattr ; sys_platform == 'darwin' and extra == 'type1' - - fs <3, >=2.2.0 ; extra == 'ufo' - - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'unicode' - - zopfli >=0.1.4 ; extra == 'woff' - - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' - requires_python: '>=3.8' -- kind: pypi - name: fonttools - version: 4.51.0 - url: https://files.pythonhosted.org/packages/8b/c6/636f008104908a93b80419f756be755bb91df4b8a0c88d5158bb52c82c3a/fonttools-4.51.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 0d145976194a5242fdd22df18a1b451481a88071feadf251221af110ca8f00ce - requires_dist: - - fs <3, >=2.2.0 ; extra == 'all' - - lxml >=4.0 ; extra == 'all' - - zopfli >=0.1.4 ; extra == 'all' - - lz4 >=1.7.4.2 ; extra == 'all' - - pycairo ; extra == 'all' - - matplotlib ; extra == 'all' - - sympy ; extra == 'all' - - skia-pathops >=0.5.0 ; extra == 'all' - - uharfbuzz >=0.23.0 ; extra == 'all' - - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'all' - - xattr ; sys_platform == 'darwin' and extra == 'all' - - lz4 >=1.7.4.2 ; extra == 'graphite' - - pycairo ; extra == 'interpolatable' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' - - lxml >=4.0 ; extra == 'lxml' - - skia-pathops >=0.5.0 ; extra == 'pathops' - - matplotlib ; extra == 'plot' - - uharfbuzz >=0.23.0 ; extra == 'repacker' - - sympy ; extra == 'symfont' - - xattr ; sys_platform == 'darwin' and extra == 'type1' - - fs <3, >=2.2.0 ; extra == 'ufo' - - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'unicode' - - zopfli >=0.1.4 ; extra == 'woff' - - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' - requires_python: '>=3.8' -- kind: pypi - name: fonttools - version: 4.51.0 - url: https://files.pythonhosted.org/packages/5e/62/ec6247534b077c9627e745d8046027ae363ed6d6407f8010650439ecbda1/fonttools-4.51.0-cp39-cp39-win_amd64.whl - sha256: 599bdb75e220241cedc6faebfafedd7670335d2e29620d207dd0378a4e9ccc5a - requires_dist: - - fs <3, >=2.2.0 ; extra == 'all' - - lxml >=4.0 ; extra == 'all' - - zopfli >=0.1.4 ; extra == 'all' - - lz4 >=1.7.4.2 ; extra == 'all' - - pycairo ; extra == 'all' - - matplotlib ; extra == 'all' - - sympy ; extra == 'all' - - skia-pathops >=0.5.0 ; extra == 'all' - - uharfbuzz >=0.23.0 ; extra == 'all' - - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'all' - - xattr ; sys_platform == 'darwin' and extra == 'all' - - lz4 >=1.7.4.2 ; extra == 'graphite' - - pycairo ; extra == 'interpolatable' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' - - lxml >=4.0 ; extra == 'lxml' - - skia-pathops >=0.5.0 ; extra == 'pathops' - - matplotlib ; extra == 'plot' - - uharfbuzz >=0.23.0 ; extra == 'repacker' - - sympy ; extra == 'symfont' - - xattr ; sys_platform == 'darwin' and extra == 'type1' - - fs <3, >=2.2.0 ; extra == 'ufo' - - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'unicode' - - zopfli >=0.1.4 ; extra == 'woff' - - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' - requires_python: '>=3.8' -- kind: pypi - name: fonttools - version: 4.51.0 - url: https://files.pythonhosted.org/packages/3e/d8/db820b6243325f29e93de36273fdd48f3c1dce7fa859be5ed3708e174eba/fonttools-4.51.0-cp39-cp39-macosx_10_9_universal2.whl - sha256: 60a3409c9112aec02d5fb546f557bca6efa773dcb32ac147c6baf5f742e6258b - requires_dist: - - fs <3, >=2.2.0 ; extra == 'all' - - lxml >=4.0 ; extra == 'all' - - zopfli >=0.1.4 ; extra == 'all' - - lz4 >=1.7.4.2 ; extra == 'all' - - pycairo ; extra == 'all' - - matplotlib ; extra == 'all' - - sympy ; extra == 'all' - - skia-pathops >=0.5.0 ; extra == 'all' - - uharfbuzz >=0.23.0 ; extra == 'all' - - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' - - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' - - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'all' - - xattr ; sys_platform == 'darwin' and extra == 'all' - - lz4 >=1.7.4.2 ; extra == 'graphite' - - pycairo ; extra == 'interpolatable' - - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' - - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' - - lxml >=4.0 ; extra == 'lxml' - - skia-pathops >=0.5.0 ; extra == 'pathops' - - matplotlib ; extra == 'plot' - - uharfbuzz >=0.23.0 ; extra == 'repacker' - - sympy ; extra == 'symfont' - - xattr ; sys_platform == 'darwin' and extra == 'type1' - - fs <3, >=2.2.0 ; extra == 'ufo' - - unicodedata2 >=15.1.0 ; python_version <= '3.12' and extra == 'unicode' - - zopfli >=0.1.4 ; extra == 'woff' - - brotlicffi >=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' - - brotli >=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' - requires_python: '>=3.8' - kind: conda name: fonttools version: 4.51.0 @@ -2309,6 +2065,8 @@ packages: - unicodedata2 >=14.0.0 license: MIT license_family: MIT + purls: + - pkg:pypi/fonttools@4.51.0 size: 2182509 timestamp: 1712345020380 - kind: conda @@ -2327,6 +2085,8 @@ packages: - unicodedata2 >=14.0.0 license: MIT license_family: MIT + purls: + - pkg:pypi/fonttools@4.51.0 size: 2200498 timestamp: 1712344949132 - kind: conda @@ -2348,6 +2108,8 @@ packages: - vc14_runtime >=14.29.30139 license: MIT license_family: MIT + purls: + - pkg:pypi/fonttools@4.51.0 size: 1888597 timestamp: 1712345179196 - kind: conda @@ -2367,6 +2129,8 @@ packages: - unicodedata2 >=14.0.0 license: MIT license_family: MIT + purls: + - pkg:pypi/fonttools@4.51.0 size: 2291843 timestamp: 1712344796788 - kind: conda @@ -3414,6 +3178,8 @@ packages: - trove-classifiers license: MIT license_family: MIT + purls: + - pkg:pypi/hatchling@1.22.5 size: 62871 timestamp: 1712264371126 - kind: conda @@ -6748,74 +6514,6 @@ packages: - pkg:pypi/markupsafe@2.1.5 size: 24314 timestamp: 1706900151453 -- kind: pypi - name: matplotlib - version: 3.8.4 - url: https://files.pythonhosted.org/packages/84/5f/a0c7a4ce9cc96d3e592c44d1c0f2ebdf5f101e25ced2c14902ae7faa4ff4/matplotlib-3.8.4-cp39-cp39-macosx_10_12_x86_64.whl - sha256: 843cbde2f0946dadd8c5c11c6d91847abd18ec76859dc319362a0964493f0ba6 - requires_dist: - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - kiwisolver >=1.3.1 - - numpy >=1.21 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python-dateutil >=2.7 - - importlib-resources >=3.2.0 ; python_version < '3.10' - requires_python: '>=3.9' -- kind: pypi - name: matplotlib - version: 3.8.4 - url: https://files.pythonhosted.org/packages/5e/2c/513395a63a9e1124a5648addbf73be23cc603f955af026b04416da98dc96/matplotlib-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - sha256: 606e3b90897554c989b1e38a258c626d46c873523de432b1462f295db13de6f9 - requires_dist: - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - kiwisolver >=1.3.1 - - numpy >=1.21 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python-dateutil >=2.7 - - importlib-resources >=3.2.0 ; python_version < '3.10' - requires_python: '>=3.9' -- kind: pypi - name: matplotlib - version: 3.8.4 - url: https://files.pythonhosted.org/packages/54/af/17195cf1f43cd3be79b15aecc5b7e44ea08456bd0048ad8dcd3a5fd45c45/matplotlib-3.8.4-cp39-cp39-win_amd64.whl - sha256: 6209e5c9aaccc056e63b547a8152661324404dd92340a6e479b3a7f24b42a5d0 - requires_dist: - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - kiwisolver >=1.3.1 - - numpy >=1.21 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python-dateutil >=2.7 - - importlib-resources >=3.2.0 ; python_version < '3.10' - requires_python: '>=3.9' -- kind: pypi - name: matplotlib - version: 3.8.4 - url: https://files.pythonhosted.org/packages/d5/88/83aee628339486de57fcc8c1387e28de816182edcfc42928cff02c364664/matplotlib-3.8.4-cp39-cp39-macosx_11_0_arm64.whl - sha256: 1c13f041a7178f9780fb61cc3a2b10423d5e125480e4be51beaf62b172413b67 - requires_dist: - - contourpy >=1.0.1 - - cycler >=0.10 - - fonttools >=4.22.0 - - kiwisolver >=1.3.1 - - numpy >=1.21 - - packaging >=20.0 - - pillow >=8 - - pyparsing >=2.3.1 - - python-dateutil >=2.7 - - importlib-resources >=3.2.0 ; python_version < '3.10' - requires_python: '>=3.9' - kind: conda name: matplotlib version: 3.8.4 @@ -6914,6 +6612,8 @@ packages: - python_abi 3.9.* *_cp39 license: PSF-2.0 license_family: PSF + purls: + - pkg:pypi/matplotlib@3.8.4 size: 6946151 timestamp: 1712606316061 - kind: conda @@ -6944,6 +6644,8 @@ packages: - python_abi 3.9.* *_cp39 license: PSF-2.0 license_family: PSF + purls: + - pkg:pypi/matplotlib@3.8.4 size: 6942468 timestamp: 1712606780360 - kind: conda @@ -6975,6 +6677,8 @@ packages: - tk >=8.6.13,<8.7.0a0 license: PSF-2.0 license_family: PSF + purls: + - pkg:pypi/matplotlib@3.8.4 size: 6722721 timestamp: 1712606079317 - kind: conda @@ -7006,6 +6710,8 @@ packages: - vc14_runtime >=14.29.30139 license: PSF-2.0 license_family: PSF + purls: + - pkg:pypi/matplotlib@3.8.4 size: 6849548 timestamp: 1712606786181 - kind: conda @@ -7664,12 +7370,12 @@ packages: timestamp: 1710076089469 - kind: conda name: pandas - version: 2.2.1 + version: 2.2.2 build: py39h32e6231_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/pandas-2.2.1-py39h32e6231_0.conda - sha256: d247dd5fcd58608a66b1cfed74a962e77818e5acd654dededc95cda0d1526a31 - md5: 7ca03abc7f2f9c91a9fdc02780bfa572 + url: https://conda.anaconda.org/conda-forge/win-64/pandas-2.2.2-py39h32e6231_0.conda + sha256: 5bc2bc63c9921aaae3290fe0ed662ba57a75058d1777acd93d4fd978e9dc3aed + md5: 0df69e098aa54373d4edb3eaaa2338ba depends: - numpy >=1.22.4,<2.0a0 - python >=3.9,<3.10.0a0 @@ -7681,19 +7387,18 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-3-Clause - license_family: BSD purls: - - pkg:pypi/pandas@2.2.1 - size: 11830380 - timestamp: 1708710136935 + - pkg:pypi/pandas@2.2.2 + size: 11789934 + timestamp: 1712783141414 - kind: conda name: pandas - version: 2.2.1 + version: 2.2.2 build: py39h47e51b9_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.1-py39h47e51b9_0.conda - sha256: 08970c57a208e75ab99312ef27401ad76399669f2cc4bb3b5850ea21560393cb - md5: be545eb72baf10c37f3ca5c974586abe + url: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.2-py39h47e51b9_0.conda + sha256: 283f3d212548adead03bf32d18b350954e853c990e0571e35a7d740e553709f1 + md5: 5c4d68b2806d00c0a3607d77c7fb6a0d depends: - libcxx >=16 - numpy >=1.22.4,<2.0a0 @@ -7704,19 +7409,18 @@ packages: - python_abi 3.9.* *_cp39 - pytz >=2020.1 license: BSD-3-Clause - license_family: BSD purls: - - pkg:pypi/pandas@2.2.1 - size: 11987027 - timestamp: 1708709608466 + - pkg:pypi/pandas@2.2.2 + size: 12044460 + timestamp: 1712783178045 - kind: conda name: pandas - version: 2.2.1 + version: 2.2.2 build: py39haf03413_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.1-py39haf03413_0.conda - sha256: f6651dbf55da899a4e2590c910bee764b6f3ead78eb5e35e104ccaeb884f9fc7 - md5: d29dc35b665029951dae988810f84508 + url: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.2-py39haf03413_0.conda + sha256: 3bd1746a24132f641b8a72a849c5f4629decb405ba28045645646ca5f3c8afe3 + md5: 11225cf1f769af217ffc01f0a21d40fa depends: - libcxx >=16 - numpy >=1.22.4,<2.0a0 @@ -7726,19 +7430,18 @@ packages: - python_abi 3.9.* *_cp39 - pytz >=2020.1 license: BSD-3-Clause - license_family: BSD purls: - - pkg:pypi/pandas@2.2.1 - size: 12136682 - timestamp: 1708709770431 + - pkg:pypi/pandas@2.2.2 + size: 12117482 + timestamp: 1712783081291 - kind: conda name: pandas - version: 2.2.1 + version: 2.2.2 build: py39hddac248_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.1-py39hddac248_0.conda - sha256: 91a2f8062d905f65548a5f3e9cf91e4acd70ac151d9e9fcbb32af9980643c1d7 - md5: 85293a042c24a08e71b7608ee66b6134 + url: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py39hddac248_0.conda + sha256: 14510984ff19843471468d2ef250e51200bd603fbf909e7bc6f1f57d02a43bea + md5: 259c4e76e6bda8888aefc098ae1ba749 depends: - libgcc-ng >=12 - libstdcxx-ng >=12 @@ -7749,11 +7452,10 @@ packages: - python_abi 3.9.* *_cp39 - pytz >=2020.1 license: BSD-3-Clause - license_family: BSD purls: - - pkg:pypi/pandas@2.2.1 - size: 12832936 - timestamp: 1708709133691 + - pkg:pypi/pandas@2.2.2 + size: 12972826 + timestamp: 1712782503380 - kind: conda name: pango version: 1.50.14 @@ -8168,6 +7870,8 @@ packages: - python >=2.6 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/ply@3.11 size: 49196 timestamp: 1712243121626 - kind: conda @@ -9191,6 +8895,8 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/scipy@1.13.0 size: 15767508 timestamp: 1712257544134 - kind: conda @@ -9215,6 +8921,8 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/scipy@1.13.0 size: 16360934 timestamp: 1712256688151 - kind: conda @@ -9240,6 +8948,8 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/scipy@1.13.0 size: 14629900 timestamp: 1712257309832 - kind: conda @@ -9263,6 +8973,8 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD + purls: + - pkg:pypi/scipy@1.13.0 size: 14849543 timestamp: 1712257711116 - kind: conda @@ -9632,21 +9344,19 @@ packages: timestamp: 1710254564088 - kind: conda name: trove-classifiers - version: 2024.3.25 + version: 2024.4.10 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.3.25-pyhd8ed1ab_0.conda - sha256: 909b4288bd2be8566f6d0a311d75a7e0e1cf81c42c19c97b1fc7d043c3db3301 - md5: e565e537d9760fc5d6d02ae4521a144b + url: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.4.10-pyhd8ed1ab_0.conda + sha256: cbc8e5c5f82b1eeff7aa21aaff77757336c1e6d64a4255b071c783acd60f4618 + md5: 9622d541e2314c0207bebdc0359fa478 depends: - python >=3.7 license: Apache-2.0 license_family: Apache - purls: - - pkg:pypi/trove-classifiers@2024.3.25 - size: 18393 - timestamp: 1711440195159 + size: 18444 + timestamp: 1712814840654 - kind: conda name: typing_extensions version: 4.11.0 @@ -9660,6 +9370,8 @@ packages: - python >=3.8 license: PSF-2.0 license_family: PSF + purls: + - pkg:pypi/typing-extensions@4.11.0 size: 37583 timestamp: 1712330089194 - kind: conda From 7fb4b26a49462bedb526f7534d33089094bf660d Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Thu, 11 Apr 2024 14:02:46 -0500 Subject: [PATCH 093/199] fix(ats-budget): fix cumulative budget for failed/retried ATS timesteps (#1714) * fix(ats-budget): cumulative budget incorrect with failed/retried ATS timesteps * add and require a finalize_step method for the budget object * cumulative terms are calculated only when the finalize_step method is called * required adding calls to budget%finalize_step() before any budget_ot() calls were made * update release notes --- autotest/test_gwf_ats_lak01.py | 71 +++++++++++++++++++++- doc/ReleaseNotes/develop.tex | 10 +-- src/Model/GroundWaterFlow/gwf-lak.f90 | 4 +- src/Model/GroundWaterFlow/gwf-maw.f90 | 4 +- src/Model/GroundWaterFlow/gwf-mvr.f90 | 1 + src/Model/GroundWaterFlow/gwf-sfr.f90 | 4 +- src/Model/GroundWaterFlow/gwf-uzf.f90 | 4 +- src/Model/GroundWaterFlow/gwf.f90 | 3 +- src/Model/GroundWaterTransport/gwt-ist.f90 | 1 + src/Model/ParticleTracking/prt.f90 | 3 +- src/Model/SurfaceWaterFlow/swf.f90 | 3 +- src/Model/TransportModel/tsp-apt.f90 | 4 +- src/Model/TransportModel/tsp-mvt.f90 | 2 +- src/Model/TransportModel/tsp.f90 | 3 +- src/Utilities/Budget.f90 | 38 ++++++++---- src/Utilities/BudgetObject.f90 | 4 +- utils/zonebudget/src/zoneoutput.f90 | 1 + 17 files changed, 125 insertions(+), 35 deletions(-) diff --git a/autotest/test_gwf_ats_lak01.py b/autotest/test_gwf_ats_lak01.py index 90d9a0ad55d..70dbac9a2fd 100644 --- a/autotest/test_gwf_ats_lak01.py +++ b/autotest/test_gwf_ats_lak01.py @@ -5,7 +5,7 @@ """ import os - +import pathlib as pl import flopy import numpy as np import pytest @@ -212,6 +212,7 @@ def build_models(idx, test): oc = flopy.mf6.ModflowGwfoc( gwf, budget_filerecord=f"{gwfname}.cbc", + budgetcsv_filerecord=f"{gwfname}.bud.csv", head_filerecord=f"{gwfname}.hds", headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], @@ -290,6 +291,67 @@ def get_kij_from_node(node, nrow, ncol): return k, i, j +def budcsv_to_cumulative(fpth): + budcsv = np.genfromtxt(fpth, names=True, delimiter=",", deletechars="") + nrow = budcsv.shape[0] + budcsv_cumulative = budcsv.copy() + budcsv_cumulative.resize(nrow + 1) + budcsv_cumulative["time"][0] = 0. + budcsv_cumulative["time"][1:] = budcsv["time"][:] + for name in budcsv.dtype.names[1:]: + budcsv_cumulative[name][0] = 0. + for i in range(nrow): + dt = budcsv_cumulative["time"][i + 1] - budcsv_cumulative["time"][i] + budcsv_cumulative[name][i + 1] = budcsv_cumulative[name][i] + budcsv[name][i] * dt + return budcsv_cumulative + + +def listfile_to_cumulative(listfile): + import flopy + mflist = flopy.utils.Mf6ListBudget(listfile) + return mflist.get_cumulative() + + +def compare_listbudget_and_budgetcsv(listfile, budcsvfile, verbose, check, atol): + """Read a budgetcsv file, convert it to a cumulative budget + and then compare it with the cumulative budget in a list file""" + + if verbose: + print(f"Comparing {listfile} with {budcsvfile}") + + # get a cumulative budget from the budcsv file + budcsvcum = budcsv_to_cumulative(budcsvfile) + + # get the cumulative budget from the list file + budlstcum = listfile_to_cumulative(listfile) + + # if print budget is not active for every time step, then the list file + # budget may not be complete and comparable to budcsvfile + assert budcsvcum.shape[0] - 1 == budlstcum.shape[0], "File sizes are different." + + allclose_list = [] + for name1 in budlstcum.dtype.names[3:]: + nl = name1.split("_") + if len(nl) > 1: + for name2 in budcsvcum.dtype.names: + if nl[0] in name2 and nl[1] in name2: + # print(f"Found match: {name1} and {name2}") + diff = budcsvcum[name2][1:] - budlstcum[name1] + mindiff = diff.min() + maxdiff = diff.max() + allclose = np.allclose(budcsvcum[name2][1:], budlstcum[name1], atol=atol) + msg = f"{name2} is same: {allclose}. Min diff: {mindiff} Max diff {maxdiff}" + if verbose: + print(msg) + allclose_list.append((allclose, name1, mindiff, maxdiff, msg)) + + if check: + for rec in allclose_list: + assert rec[0], rec[-1] + + return allclose_list + + def check_output(idx, test): # calculate volume of water and make sure it is conserved fname = test.name + ".lak.bin" @@ -407,6 +469,13 @@ def check_output(idx, test): # make_plot(sim, times, head, stage) # make_plot_xsect(sim, head, stage) + listfile = pl.Path(test.workspace) / f"{test.name}.lst" + budcsvfile = pl.Path(test.workspace) / f"{test.name}.bud.csv" + verbose = True + check = True + atol = 0.001 + compare_listbudget_and_budgetcsv(listfile, budcsvfile, verbose, check, atol) + @pytest.mark.slow @pytest.mark.parametrize("idx, name", enumerate(cases)) diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index fbab15b296b..4fd7e1b877d 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -18,12 +18,12 @@ %\end{itemize} \textbf{\underline{BUG FIXES AND OTHER CHANGES TO EXISTING FUNCTIONALITY}} \\ - %\underline{BASIC FUNCTIONALITY} - %\begin{itemize} - % \item xxx - % \item xxx + \underline{BASIC FUNCTIONALITY} + \begin{itemize} + \item When the Adaptive Time Step (ATS) Package was activated, and failed time steps were rerun successfully using a shorter time step, the cumulative budgets reported in the listing files were incorrect. Cumulative budgets included contributions from the failed time steps. The program was fixed so that cumulative budgets are not tallied until the time step is finalized. + \item For multi-model groundwater flow simulations that use the Buoyancy (BUY) Package, variable-density terms were not included, in all cases, along the interface between two GWF models. The program was corrected so that flows between two GWF models include the variable-density terms when the BUY Package is active. % \item xxx - %\end{itemize} + \end{itemize} %\underline{INTERNAL FLOW PACKAGES} %\begin{itemize} diff --git a/src/Model/GroundWaterFlow/gwf-lak.f90 b/src/Model/GroundWaterFlow/gwf-lak.f90 index 4218ca8d3f2..e6386e6fcd5 100644 --- a/src/Model/GroundWaterFlow/gwf-lak.f90 +++ b/src/Model/GroundWaterFlow/gwf-lak.f90 @@ -4305,7 +4305,7 @@ end subroutine lak_ot_dv !< subroutine lak_ot_bdsummary(this, kstp, kper, iout, ibudfl) ! -- module - use TdisModule, only: totim + use TdisModule, only: totim, delt ! -- dummy class(LakType) :: this !< LakType object integer(I4B), intent(in) :: kstp !< time step number @@ -4313,7 +4313,7 @@ subroutine lak_ot_bdsummary(this, kstp, kper, iout, ibudfl) integer(I4B), intent(in) :: iout !< flag and unit number for the model listing file integer(I4B), intent(in) :: ibudfl !< flag indicating budget should be written ! - call this%budobj%write_budtable(kstp, kper, iout, ibudfl, totim) + call this%budobj%write_budtable(kstp, kper, iout, ibudfl, totim, delt) ! ! -- Return return diff --git a/src/Model/GroundWaterFlow/gwf-maw.f90 b/src/Model/GroundWaterFlow/gwf-maw.f90 index df40289b0d3..cf603f6ce42 100644 --- a/src/Model/GroundWaterFlow/gwf-maw.f90 +++ b/src/Model/GroundWaterFlow/gwf-maw.f90 @@ -2792,7 +2792,7 @@ end subroutine maw_ot_dv !< subroutine maw_ot_bdsummary(this, kstp, kper, iout, ibudfl) ! -- module - use TdisModule, only: totim + use TdisModule, only: totim, delt ! -- dummy class(MawType) :: this !< MawType object integer(I4B), intent(in) :: kstp !< time step number @@ -2800,7 +2800,7 @@ subroutine maw_ot_bdsummary(this, kstp, kper, iout, ibudfl) integer(I4B), intent(in) :: iout !< flag and unit number for the model listing file integer(I4B), intent(in) :: ibudfl !< flag indicating budget should be written ! - call this%budobj%write_budtable(kstp, kper, iout, ibudfl, totim) + call this%budobj%write_budtable(kstp, kper, iout, ibudfl, totim, delt) ! ! -- Return return diff --git a/src/Model/GroundWaterFlow/gwf-mvr.f90 b/src/Model/GroundWaterFlow/gwf-mvr.f90 index 0e9fd9594ce..8f35a23414f 100644 --- a/src/Model/GroundWaterFlow/gwf-mvr.f90 +++ b/src/Model/GroundWaterFlow/gwf-mvr.f90 @@ -638,6 +638,7 @@ subroutine mvr_ot_bdsummary(this, ibudfl) end do ! ! -- Write the budget + call this%budget%finalize_step(delt) if (ibudfl /= 0) then call this%budget%budget_ot(kstp, kper, this%iout) end if diff --git a/src/Model/GroundWaterFlow/gwf-sfr.f90 b/src/Model/GroundWaterFlow/gwf-sfr.f90 index 27fc3e60f67..7c42b81742e 100644 --- a/src/Model/GroundWaterFlow/gwf-sfr.f90 +++ b/src/Model/GroundWaterFlow/gwf-sfr.f90 @@ -2591,7 +2591,7 @@ end subroutine sfr_ot_dv !< subroutine sfr_ot_bdsummary(this, kstp, kper, iout, ibudfl) ! -- module - use TdisModule, only: totim + use TdisModule, only: totim, delt ! -- dummy class(SfrType) :: this !< SfrType object integer(I4B), intent(in) :: kstp !< time step number @@ -2599,7 +2599,7 @@ subroutine sfr_ot_bdsummary(this, kstp, kper, iout, ibudfl) integer(I4B), intent(in) :: iout !< flag and unit number for the model listing file integer(I4B), intent(in) :: ibudfl !< flag indicating budget should be written ! - call this%budobj%write_budtable(kstp, kper, iout, ibudfl, totim) + call this%budobj%write_budtable(kstp, kper, iout, ibudfl, totim, delt) ! ! -- return return diff --git a/src/Model/GroundWaterFlow/gwf-uzf.f90 b/src/Model/GroundWaterFlow/gwf-uzf.f90 index d8b7019fc6a..1ed322dcd92 100644 --- a/src/Model/GroundWaterFlow/gwf-uzf.f90 +++ b/src/Model/GroundWaterFlow/gwf-uzf.f90 @@ -1670,7 +1670,7 @@ end subroutine uzf_ot_dv !< subroutine uzf_ot_bdsummary(this, kstp, kper, iout, ibudfl) ! -- module - use TdisModule, only: totim + use TdisModule, only: totim, delt ! -- dummy class(UzfType) :: this !< UzfType object integer(I4B), intent(in) :: kstp !< time step number @@ -1678,7 +1678,7 @@ subroutine uzf_ot_bdsummary(this, kstp, kper, iout, ibudfl) integer(I4B), intent(in) :: iout !< flag and unit number for the model listing file integer(I4B), intent(in) :: ibudfl !< flag indicating budget should be written ! - call this%budobj%write_budtable(kstp, kper, iout, ibudfl, totim) + call this%budobj%write_budtable(kstp, kper, iout, ibudfl, totim, delt) ! ! -- Return return diff --git a/src/Model/GroundWaterFlow/gwf.f90 b/src/Model/GroundWaterFlow/gwf.f90 index 1caed0d0fec..5b7d6ee90c0 100644 --- a/src/Model/GroundWaterFlow/gwf.f90 +++ b/src/Model/GroundWaterFlow/gwf.f90 @@ -1032,7 +1032,7 @@ subroutine gwf_ot_dv(this, idvsave, idvprint, ipflag) end subroutine gwf_ot_dv subroutine gwf_ot_bdsummary(this, ibudfl, ipflag) - use TdisModule, only: kstp, kper, totim + use TdisModule, only: kstp, kper, totim, delt class(GwfModelType) :: this integer(I4B), intent(in) :: ibudfl integer(I4B), intent(inout) :: ipflag @@ -1052,6 +1052,7 @@ subroutine gwf_ot_bdsummary(this, ibudfl, ipflag) end if ! -- model budget summary + call this%budget%finalize_step(delt) if (ibudfl /= 0) then ipflag = 1 call this%budget%budget_ot(kstp, kper, this%iout) diff --git a/src/Model/GroundWaterTransport/gwt-ist.f90 b/src/Model/GroundWaterTransport/gwt-ist.f90 index ad0a91ee4a0..88c975823b7 100644 --- a/src/Model/GroundWaterTransport/gwt-ist.f90 +++ b/src/Model/GroundWaterTransport/gwt-ist.f90 @@ -634,6 +634,7 @@ subroutine ist_ot_bdsummary(this, kstp, kper, iout, ibudfl) call this%budget%addentry(this%budterm, delt, budtxt, isuppress_output) ! ! -- Write budget to list file + call this%budget%finalize_step(delt) if (ibudfl /= 0) then call this%budget%budget_ot(kstp, kper, iout) end if diff --git a/src/Model/ParticleTracking/prt.f90 b/src/Model/ParticleTracking/prt.f90 index ac3af4f9f4c..9dc4c1f1aee 100644 --- a/src/Model/ParticleTracking/prt.f90 +++ b/src/Model/ParticleTracking/prt.f90 @@ -689,7 +689,7 @@ end subroutine prt_ot_dv !> @brief Print budget summary subroutine prt_ot_bdsummary(this, ibudfl, ipflag) ! -- modules - use TdisModule, only: kstp, kper, totim + use TdisModule, only: kstp, kper, totim, delt ! -- dummy class(PrtModelType) :: this integer(I4B), intent(in) :: ibudfl @@ -705,6 +705,7 @@ subroutine prt_ot_bdsummary(this, ibudfl, ipflag) end do ! -- model budget summary + call this%budget%finalize_step(delt) if (ibudfl /= 0) then ipflag = 1 ! -- model budget summary diff --git a/src/Model/SurfaceWaterFlow/swf.f90 b/src/Model/SurfaceWaterFlow/swf.f90 index 75ade14ed92..d592696906d 100644 --- a/src/Model/SurfaceWaterFlow/swf.f90 +++ b/src/Model/SurfaceWaterFlow/swf.f90 @@ -855,7 +855,7 @@ subroutine swf_ot_dv(this, idvsave, idvprint, ipflag) end subroutine swf_ot_dv subroutine swf_ot_bdsummary(this, ibudfl, ipflag) - use TdisModule, only: kstp, kper, totim + use TdisModule, only: kstp, kper, totim, delt class(SwfModelType) :: this integer(I4B), intent(in) :: ibudfl integer(I4B), intent(inout) :: ipflag @@ -875,6 +875,7 @@ subroutine swf_ot_bdsummary(this, ibudfl, ipflag) ! end if ! -- model budget summary + call this%budget%finalize_step(delt) if (ibudfl /= 0) then ipflag = 1 call this%budget%budget_ot(kstp, kper, this%iout) diff --git a/src/Model/TransportModel/tsp-apt.f90 b/src/Model/TransportModel/tsp-apt.f90 index b63a3b70569..47fa4611c35 100644 --- a/src/Model/TransportModel/tsp-apt.f90 +++ b/src/Model/TransportModel/tsp-apt.f90 @@ -1067,7 +1067,7 @@ end subroutine apt_ot_dv !< subroutine apt_ot_bdsummary(this, kstp, kper, iout, ibudfl) ! -- module - use TdisModule, only: totim + use TdisModule, only: totim, delt ! -- dummy class(TspAptType) :: this !< TspAptType object integer(I4B), intent(in) :: kstp !< time step number @@ -1075,7 +1075,7 @@ subroutine apt_ot_bdsummary(this, kstp, kper, iout, ibudfl) integer(I4B), intent(in) :: iout !< flag and unit number for the model listing file integer(I4B), intent(in) :: ibudfl !< flag indicating budget should be written ! - call this%budobj%write_budtable(kstp, kper, iout, ibudfl, totim) + call this%budobj%write_budtable(kstp, kper, iout, ibudfl, totim, delt) ! ! -- Return return diff --git a/src/Model/TransportModel/tsp-mvt.f90 b/src/Model/TransportModel/tsp-mvt.f90 index f16961666b2..8a52a1b50c2 100644 --- a/src/Model/TransportModel/tsp-mvt.f90 +++ b/src/Model/TransportModel/tsp-mvt.f90 @@ -484,7 +484,6 @@ subroutine mvt_ot_bdsummary(this, ibudfl) ! -- locals integer(I4B) :: i, j, n real(DP), allocatable, dimension(:) :: ratin, ratout -! ------------------------------------------------------------------------------ ! ! -- Allocate and initialize ratin/ratout allocate (ratin(this%maxpackages), ratout(this%maxpackages)) @@ -525,6 +524,7 @@ subroutine mvt_ot_bdsummary(this, ibudfl) end do ! ! -- Write the budget + call this%budget%finalize_step(delt) if (ibudfl /= 0) then call this%budget%budget_ot(kstp, kper, this%iout) end if diff --git a/src/Model/TransportModel/tsp.f90 b/src/Model/TransportModel/tsp.f90 index 15f997bff07..a3eb1f70589 100644 --- a/src/Model/TransportModel/tsp.f90 +++ b/src/Model/TransportModel/tsp.f90 @@ -509,7 +509,7 @@ end subroutine tsp_ot_dv !! Loop through attached packages and write budget summaries !< subroutine tsp_ot_bdsummary(this, ibudfl, ipflag) - use TdisModule, only: kstp, kper, totim + use TdisModule, only: kstp, kper, totim, delt class(TransportModelType) :: this integer(I4B), intent(in) :: ibudfl integer(I4B), intent(inout) :: ipflag @@ -528,6 +528,7 @@ subroutine tsp_ot_bdsummary(this, ibudfl, ipflag) end if ! ! -- Model budget summary + call this%budget%finalize_step(delt) if (ibudfl /= 0) then ipflag = 1 call this%budget%budget_ot(kstp, kper, this%iout) diff --git a/src/Utilities/Budget.f90 b/src/Utilities/Budget.f90 index e3947909e80..b91f52d398a 100644 --- a/src/Utilities/Budget.f90 +++ b/src/Utilities/Budget.f90 @@ -64,6 +64,7 @@ module BudgetModule procedure :: add_single_entry procedure :: add_multi_entry generic :: addentry => add_single_entry, add_multi_entry + procedure :: finalize_step procedure :: writecsv ! -- private procedure :: allocate_scalars @@ -84,7 +85,6 @@ subroutine budget_cr(this, name_model) ! -- dummy type(BudgetType), pointer :: this !< BudgetType object character(len=*), intent(in) :: name_model !< name of the model -! ------------------------------------------------------------------------------ ! ! -- Create the object allocate (this) @@ -363,12 +363,11 @@ subroutine reset(this) integer(I4B) :: i ! this%msum = 1 - ! do i = 1, this%maxsize this%vbvl(3, i) = DZERO this%vbvl(4, i) = DZERO end do - ! + ! -- Return return end subroutine reset @@ -425,11 +424,6 @@ subroutine add_single_entry(this, rin, rout, delt, text, & end if end if ! - if (iscv == 0) then - this%vbvl(1, this%msum) = this%vbvl(1, this%msum) + rin * delt - this%vbvl(2, this%msum) = this%vbvl(2, this%msum) + rout * delt - end if - ! this%vbvl(3, this%msum) = rin this%vbvl(4, this%msum) = rout this%vbnm(this%msum) = adjustr(text) @@ -499,11 +493,6 @@ subroutine add_multi_entry(this, budterm, delt, budtxt, & end if end if ! - if (iscv == 0) then - this%vbvl(1, this%msum) = this%vbvl(1, this%msum) + budterm(1, i) * delt - this%vbvl(2, this%msum) = this%vbvl(2, this%msum) + budterm(2, i) * delt - end if - ! this%vbvl(3, this%msum) = budterm(1, i) this%vbvl(4, this%msum) = budterm(2, i) this%vbnm(this%msum) = adjustr(budtxt(i)) @@ -524,6 +513,29 @@ subroutine add_multi_entry(this, budterm, delt, budtxt, & return end subroutine add_multi_entry + !> @ brief Update accumulators + !! + !! This must be called before any output is written + !! in order to update the accumulators in vbvl(1,:) + !! and vbl(2,:). + !< + subroutine finalize_step(this, delt) + ! -- modules + ! -- dummy + class(BudgetType) :: this !< BudgetType object + real(DP), intent(in) :: delt + ! -- local + integer(I4B) :: i + ! + do i = 1, this%msum - 1 + this%vbvl(1, i) = this%vbvl(1, i) + this%vbvl(3, i) * delt + this%vbvl(2, i) = this%vbvl(2, i) + this%vbvl(4, i) * delt + end do + ! + ! -- Return + return + end subroutine finalize_step + !> @ brief allocate scalar variables !! !! Allocate scalar variables of this budget object diff --git a/src/Utilities/BudgetObject.f90 b/src/Utilities/BudgetObject.f90 index 87819b7dd10..83cced41090 100644 --- a/src/Utilities/BudgetObject.f90 +++ b/src/Utilities/BudgetObject.f90 @@ -459,7 +459,7 @@ end subroutine write_flowtable !> @brief Write the budget table !< - subroutine write_budtable(this, kstp, kper, iout, ibudfl, totim) + subroutine write_budtable(this, kstp, kper, iout, ibudfl, totim, delt) ! -- dummy class(BudgetObjectType) :: this integer(I4B), intent(in) :: kstp @@ -467,8 +467,10 @@ subroutine write_budtable(this, kstp, kper, iout, ibudfl, totim) integer(I4B), intent(in) :: iout integer(I4B), intent(in) :: ibudfl real(DP), intent(in) :: totim + real(DP), intent(in) :: delt ! ! -- Write the table + call this%budtable%finalize_step(delt) if (ibudfl /= 0) then call this%budtable%budget_ot(kstp, kper, iout) end if diff --git a/utils/zonebudget/src/zoneoutput.f90 b/utils/zonebudget/src/zoneoutput.f90 index 8e3c556d48b..6e304940632 100644 --- a/utils/zonebudget/src/zoneoutput.f90 +++ b/utils/zonebudget/src/zoneoutput.f90 @@ -216,6 +216,7 @@ subroutine zoneoutput_write(itime, kstp, kper, delt, totim, nbudterms, & call budobj(izone)%addentry(rin, rout, delt, txt) end if end do + call budobj(izone)%finalize_step(delt) call budobj(izone)%budget_ot(kstp, kper, iout) ! ! -- write line ending after each zone From e3761d3890fe6c030c437a8c68d3fd1741240ba8 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Thu, 11 Apr 2024 14:23:19 -0500 Subject: [PATCH 094/199] patch(swf): coordinate invariant flow calculations (#1712) * refactor(swf): working on coordinate invariant overland flow * using dhds in denominator of conductance * working to get swr conductance in as a dev option * added capability to save velocity * updates to gradient implementation and to swr conductance dev option * fprettify * rebuild makefiles * tighter tolerance; fix to dev_swr_conductance * trying to get test to pass --- autotest/test_swf_dfw_loop.py | 5 +- doc/mf6io/mf6ivar/dfn/swf-dfw.dfn | 21 + make/makefile | 1 + msvs/mf6core.vfproj | 1 + src/Idm/swf-dfwidm.f90 | 38 + src/Model/Discretization/Dis2d.f90 | 96 +-- src/Model/Discretization/Disv1d.f90 | 77 +- src/Model/GroundWaterFlow/gwf-npf.f90 | 9 +- .../ModelUtilities/VectorInterpolation.f90 | 295 +++++++ src/Model/SurfaceWaterFlow/swf-dfw.f90 | 718 ++++++++++++++++-- src/Model/SurfaceWaterFlow/swf.f90 | 10 +- src/meson.build | 1 + 12 files changed, 1129 insertions(+), 143 deletions(-) create mode 100644 src/Model/ModelUtilities/VectorInterpolation.f90 diff --git a/autotest/test_swf_dfw_loop.py b/autotest/test_swf_dfw_loop.py index 0485807401e..590ab24b4ae 100644 --- a/autotest/test_swf_dfw_loop.py +++ b/autotest/test_swf_dfw_loop.py @@ -44,7 +44,7 @@ def build_models(idx, test): ) ims = flopy.mf6.ModflowIms( sim, - outer_maximum=100, + outer_maximum=200, inner_maximum=50, print_option="all", outer_dvclose=1.0e-6, @@ -243,6 +243,7 @@ def build_models(idx, test): dfw = flopy.mf6.ModflowSwfdfw( swf, central_in_space=True, + #dev_swr_conductance=True, print_flows=True, save_flows=True, manningsn=0.03, @@ -463,7 +464,7 @@ def check_output(idx, test): fja = flowja[itime].flatten() qresidual = fja[ia[:-1]] - atol = 0.03 + atol = 0.1 for n in range(grb.nodes): passfail = "FAIL" if abs(qresidual[n]) > atol else "" print( diff --git a/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn b/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn index 06eacba6744..0d82a2eb352 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn @@ -45,6 +45,15 @@ longname keyword to print DFW flows to listing file description keyword to indicate that calculated flows between cells will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. This option can produce extremely large list files because all cell-by-cell flows are printed. It should only be used with the DFW Package for models that have a small number of cells. mf6internal iprflow +block options +name save_velocity +type keyword +reader urword +optional true +longname keyword to save velocity +description keyword to indicate that x, y, and z components of velocity will be calculated at cell centers and written to the budget file, which is specified with ``BUDGET SAVE FILE'' in Output Control. If this option is activated, then additional information may be required in the discretization packages and the GWF Exchange package (if GWF models are coupled). Specifically, ANGLDEGX must be specified in the CONNECTIONDATA block of the DISU Package; ANGLDEGX must also be specified for the GWF Exchange as an auxiliary variable. +mf6internal isavvelocity + block options name obs_filerecord type record obs6 filein obs6_filename @@ -88,6 +97,18 @@ optional false longname obs6 input filename description REPLACE obs6_filename {'{#1}': 'DFW'} +# dev options + +block options +name dev_swr_conductance +type keyword +reader urword +optional true +longname use SWR conductance formulation +description use the conductance formulation in the Surface Water Routing (SWR) Process for MODFLOW-2005. +mf6internal iswrcond + + # --------------------- swf dfw griddata --------------------- block griddata diff --git a/make/makefile b/make/makefile index d4ddf455844..cb20fed9cf0 100644 --- a/make/makefile +++ b/make/makefile @@ -359,6 +359,7 @@ $(OBJDIR)/InputLoadType.o \ $(OBJDIR)/swf-cxs.o \ $(OBJDIR)/Disv1d.o \ $(OBJDIR)/swf-ic.o \ +$(OBJDIR)/VectorInterpolation.o \ $(OBJDIR)/MethodDisv.o \ $(OBJDIR)/MethodDis.o \ $(OBJDIR)/GridConnection.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index e11c9d8d5a3..c9d9046c877 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -288,6 +288,7 @@ + diff --git a/src/Idm/swf-dfwidm.f90 b/src/Idm/swf-dfwidm.f90 index 8bb197fb7cb..4e07411b58f 100644 --- a/src/Idm/swf-dfwidm.f90 +++ b/src/Idm/swf-dfwidm.f90 @@ -16,10 +16,12 @@ module SwfDfwInputModule logical :: timeconv = .false. logical :: ipakcb = .false. logical :: iprflow = .false. + logical :: isavvelocity = .false. logical :: obs_filerecord = .false. logical :: obs6 = .false. logical :: filein = .false. logical :: obs6_filename = .false. + logical :: iswrcond = .false. logical :: manningsn = .false. logical :: idcxs = .false. end type SwfDfwParamFoundType @@ -111,6 +113,23 @@ module SwfDfwInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + swfdfw_isavvelocity = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DFW', & ! subcomponent + 'OPTIONS', & ! block + 'SAVE_VELOCITY', & ! tag name + 'ISAVVELOCITY', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & swfdfw_obs_filerecord = InputParamDefinitionType & ( & @@ -179,6 +198,23 @@ module SwfDfwInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + swfdfw_iswrcond = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DFW', & ! subcomponent + 'OPTIONS', & ! block + 'DEV_SWR_CONDUCTANCE', & ! tag name + 'ISWRCOND', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & swfdfw_manningsn = InputParamDefinitionType & ( & @@ -221,10 +257,12 @@ module SwfDfwInputModule swfdfw_timeconv, & swfdfw_ipakcb, & swfdfw_iprflow, & + swfdfw_isavvelocity, & swfdfw_obs_filerecord, & swfdfw_obs6, & swfdfw_filein, & swfdfw_obs6_filename, & + swfdfw_iswrcond, & swfdfw_manningsn, & swfdfw_idcxs & ] diff --git a/src/Model/Discretization/Dis2d.f90 b/src/Model/Discretization/Dis2d.f90 index 77cfe361700..adc3698354a 100644 --- a/src/Model/Discretization/Dis2d.f90 +++ b/src/Model/Discretization/Dis2d.f90 @@ -1000,78 +1000,54 @@ end subroutine connection_normal !> @brief Get unit vector components between the cell and a given neighbor !! - !! Saturation must be provided to compute cell center vertical coordinates. - !! Also return the straight-line connection length. - !< + !< For dis2d there is no z component subroutine connection_vector(this, noden, nodem, nozee, satn, satm, ihc, & xcomp, ycomp, zcomp, conlen) - ! -- modules + ! modules use DisvGeom, only: line_unit_vector - ! -- dummy + ! dummy class(Dis2dType) :: this integer(I4B), intent(in) :: noden !< cell (reduced nn) integer(I4B), intent(in) :: nodem !< neighbor (reduced nn) - logical, intent(in) :: nozee - real(DP), intent(in) :: satn - real(DP), intent(in) :: satm - integer(I4B), intent(in) :: ihc !< horizontal connection flag - real(DP), intent(inout) :: xcomp - real(DP), intent(inout) :: ycomp - real(DP), intent(inout) :: zcomp - real(DP), intent(inout) :: conlen - ! -- local + logical, intent(in) :: nozee !< not used for dis2d + real(DP), intent(in) :: satn !< not used for dis2d + real(DP), intent(in) :: satm !< not used for dis2d + integer(I4B), intent(in) :: ihc !< not used for dis2d (always horizontal) + real(DP), intent(inout) :: xcomp !< x component of the connection vector + real(DP), intent(inout) :: ycomp !< y componenet of the connection vector + real(DP), intent(inout) :: zcomp !< z component, which is always zero + real(DP), intent(inout) :: conlen !< calculated connection length + ! local real(DP) :: z1, z2 real(DP) :: x1, y1, x2, y2 real(DP) :: ds integer(I4B) :: i1, i2, j1, j2, k1, k2 integer(I4B) :: nodeu1, nodeu2, ipos - ! - ! -- Set vector components based on ihc - if (ihc == 0) then - ! - ! -- vertical connection; set zcomp positive upward - xcomp = DZERO - ycomp = DZERO - if (nodem < noden) then - zcomp = DONE - else - zcomp = -DONE - end if - z1 = this%bot(noden) + DHALF * (this%top(noden) - this%bot(noden)) - z2 = this%bot(nodem) + DHALF * (this%top(nodem) - this%bot(nodem)) - conlen = abs(z2 - z1) - else - ! - if (nozee) then - z1 = DZERO - z2 = DZERO - else - z1 = this%bot(noden) + DHALF * satn * (this%top(noden) - this%bot(noden)) - z2 = this%bot(nodem) + DHALF * satm * (this%top(nodem) - this%bot(nodem)) - end if - ipos = this%con%getjaindex(noden, nodem) - ds = this%con%cl1(this%con%jas(ipos)) + this%con%cl2(this%con%jas(ipos)) - nodeu1 = this%get_nodeuser(noden) - nodeu2 = this%get_nodeuser(nodem) - call get_ijk(nodeu1, this%nrow, this%ncol, 1, i1, j1, k1) - call get_ijk(nodeu2, this%nrow, this%ncol, 1, i2, j2, k2) - x1 = DZERO - x2 = DZERO - y1 = DZERO - y2 = DZERO - if (i2 < i1) then ! back - y2 = ds - elseif (j2 < j1) then ! left - x2 = -ds - elseif (j2 > j1) then ! right - x2 = ds - else ! front - y2 = -ds - end if - call line_unit_vector(x1, y1, z1, x2, y2, z2, xcomp, ycomp, zcomp, conlen) + + ! Calculate vector components + z1 = DZERO + z2 = DZERO + ipos = this%con%getjaindex(noden, nodem) + ds = this%con%cl1(this%con%jas(ipos)) + this%con%cl2(this%con%jas(ipos)) + nodeu1 = this%get_nodeuser(noden) + nodeu2 = this%get_nodeuser(nodem) + call get_ijk(nodeu1, this%nrow, this%ncol, 1, i1, j1, k1) + call get_ijk(nodeu2, this%nrow, this%ncol, 1, i2, j2, k2) + x1 = DZERO + x2 = DZERO + y1 = DZERO + y2 = DZERO + if (i2 < i1) then ! back + y2 = ds + elseif (j2 < j1) then ! left + x2 = -ds + elseif (j2 > j1) then ! right + x2 = ds + else ! front + y2 = -ds end if - ! - end subroutine + call line_unit_vector(x1, y1, z1, x2, y2, z2, xcomp, ycomp, zcomp, conlen) + end subroutine connection_vector !> @brief Get the discretization type !< diff --git a/src/Model/Discretization/Disv1d.f90 b/src/Model/Discretization/Disv1d.f90 index 7f3756cc4f9..4d3b2e0ee14 100644 --- a/src/Model/Discretization/Disv1d.f90 +++ b/src/Model/Discretization/Disv1d.f90 @@ -10,6 +10,7 @@ module Disv1dModule use InputOutputModule, only: urword use BaseDisModule, only: DisBaseType use Disv1dGeom, only: calcdist + use DisvGeom, only: line_unit_vector implicit none @@ -55,6 +56,8 @@ module Disv1dModule procedure :: get_nodenumber_idx1 procedure :: nodeu_to_string procedure :: nodeu_from_string + procedure :: connection_normal + procedure :: connection_vector end type Disv1dType @@ -142,7 +145,79 @@ subroutine disv1d_df(this) end subroutine disv1d_df - !> @brief Get the discretization type (DIS, DIS2D, DISV, DISV2D, DISU) + !> @brief Get normal vector components between the cell and a given neighbor + !! + !! The normal points outward from the shared face between noden and nodem. + !< + subroutine connection_normal(this, noden, nodem, ihc, xcomp, ycomp, zcomp, & + ipos) + ! -- dummy + class(Disv1dType) :: this + integer(I4B), intent(in) :: noden !< cell (reduced nn) + integer(I4B), intent(in) :: nodem !< neighbor (reduced nn) + integer(I4B), intent(in) :: ihc !< horizontal connection flag (not used) + real(DP), intent(inout) :: xcomp !< x component of outward normal vector + real(DP), intent(inout) :: ycomp !< y component of outward normal vector + real(DP), intent(inout) :: zcomp !< z component of outward normal vector + integer(I4B), intent(in) :: ipos !< connection position + ! -- local + real(DP) :: angle, dmult + + ! find from anglex, since anglex is symmetric, need to flip vector + ! for lower triangle (nodem < noden) + angle = this%con%anglex(this%con%jas(ipos)) + dmult = DONE + if (nodem < noden) dmult = -DONE + xcomp = cos(angle) * dmult + ycomp = sin(angle) * dmult + zcomp = DZERO + ! + end subroutine connection_normal + + !> @brief Get unit vector components between the cell and a given neighbor + !! + !! Saturation must be provided to compute cell center vertical coordinates. + !! Also return the straight-line connection length. + !< + subroutine connection_vector(this, noden, nodem, nozee, satn, satm, ihc, & + xcomp, ycomp, zcomp, conlen) + ! -- dummy + class(Disv1dType) :: this + integer(I4B), intent(in) :: noden !< cell (reduced nn) + integer(I4B), intent(in) :: nodem !< neighbor (reduced nn) + logical, intent(in) :: nozee !< do not use z in calculations + real(DP), intent(in) :: satn !< not used for disv1d + real(DP), intent(in) :: satm !< not used for disv1d + integer(I4B), intent(in) :: ihc !< horizontal connection flag + real(DP), intent(inout) :: xcomp !< x component of connection vector + real(DP), intent(inout) :: ycomp !< y component of connection vector + real(DP), intent(inout) :: zcomp !< z component of connection vector + real(DP), intent(inout) :: conlen !< calculated straight-line distance between cell centers + ! -- local + integer(I4B) :: nodeun, nodeum + real(DP) :: xn, xm, yn, ym, zn, zm + + ! horizontal connection, with possible z component due to cell offsets + ! and/or water table conditions + if (nozee) then + zn = DZERO + zm = DZERO + else + zn = this%bot(noden) + zm = this%bot(nodem) + end if + nodeun = this%get_nodeuser(noden) + nodeum = this%get_nodeuser(nodem) + xn = this%cellxy(1, nodeun) + yn = this%cellxy(2, nodeun) + xm = this%cellxy(1, nodeum) + ym = this%cellxy(2, nodeum) + call line_unit_vector(xn, yn, zn, xm, ym, zm, xcomp, ycomp, zcomp, & + conlen) + + end subroutine connection_vector + + !> @brief Get the discretization type (DIS, DIS2D, DISV, DISV1D, DISU) subroutine get_dis_type(this, dis_type) class(Disv1dType), intent(in) :: this character(len=*), intent(out) :: dis_type diff --git a/src/Model/GroundWaterFlow/gwf-npf.f90 b/src/Model/GroundWaterFlow/gwf-npf.f90 index 8c62e6d67a3..4d0f3e15d0d 100644 --- a/src/Model/GroundWaterFlow/gwf-npf.f90 +++ b/src/Model/GroundWaterFlow/gwf-npf.f90 @@ -1055,9 +1055,10 @@ subroutine npf_da(this) ! ! -- deallocate parent call this%NumericalPackageType%da() - ! - ! -- Return - return + + ! pointers + this%hnew => null() + end subroutine npf_da !> @ brief Allocate scalars @@ -2425,7 +2426,7 @@ function hy_eff(this, n, m, ihc, ipos, vg) result(hy) return end function hy_eff - !> @brief Calculate the 3 conmponents of specific discharge at the cell center + !> @brief Calculate the 3 components of specific discharge at the cell center !< subroutine calc_spdis(this, flowja) ! -- modules diff --git a/src/Model/ModelUtilities/VectorInterpolation.f90 b/src/Model/ModelUtilities/VectorInterpolation.f90 new file mode 100644 index 00000000000..0bc7165aab0 --- /dev/null +++ b/src/Model/ModelUtilities/VectorInterpolation.f90 @@ -0,0 +1,295 @@ +module VectorInterpolationModule + + use KindModule, only: I4B, DP + use ConstantsModule, only: DZERO, DONE, DEM10 + use BaseDisModule, only: DisBaseType + + implicit none + + public :: vector_interpolation_2d + +contains + + !> @brief Interpolate 2D vector components at cell center + !! + !! Given a component of a vector on the edges of all cells, assumed to be + !! normal to the edge, interpolate a 2d vector using an XT3D-like + !! interpolation. Can be used to calculate a cell-center velocity given + !! face flows. Routine can optionally divide the edge flow by area, + !! if provided, to interpolate velocity, for example. Sign on flowja is + !! assumed to be positive into the cell. + !! + !! Routine requires that dis%connection_vector() and dis%connection_normal() + !! are available. + !< + subroutine vector_interpolation_2d(dis, flowja, nedges, nodedge, & + propsedge, vcomp, vmag, flowareaja) + ! modules + ! dummy + class(DisBaseType), intent(in) :: dis !< discretization package object + real(DP), intent(in), dimension(:) :: flowja !< flow across each face in model grid (size njas) + integer(I4B), intent(in), optional :: nedges !< number of external edges for which a flow is provided + integer(I4B), dimension(:), intent(in), optional :: nodedge !< array of node numbers that have edges + real(DP), dimension(:, :), intent(in), optional :: propsedge !< edge properties (Q, area, nx, ny, distance) + real(DP), dimension(:, :), intent(inout), optional :: vcomp !< vector components: vx, vy, vz (nodes, 3) + real(DP), dimension(:), intent(inout), optional :: vmag !< vector magnitude (nodes) + real(DP), intent(in), dimension(:), optional :: flowareaja !< flow area across each face in model grid + ! local + integer(I4B) :: n + integer(I4B) :: m + integer(I4B) :: ipos + integer(I4B) :: isympos + integer(I4B) :: ihc + integer(I4B) :: ic + integer(I4B) :: iz + integer(I4B) :: nc + real(DP) :: vx + real(DP) :: vy + real(DP) :: vz + real(DP) :: xn + real(DP) :: yn + real(DP) :: zn + real(DP) :: xc + real(DP) :: yc + real(DP) :: zc + real(DP) :: cl1 + real(DP) :: cl2 + real(DP) :: dltot + real(DP) :: ooclsum + real(DP) :: q + real(DP) :: dsumx + real(DP) :: dsumy + real(DP) :: dsumz + real(DP) :: denom + real(DP) :: area + real(DP) :: axy + real(DP) :: ayx + real(DP), allocatable, dimension(:) :: vi + real(DP), allocatable, dimension(:) :: di + real(DP), allocatable, dimension(:) :: viz + real(DP), allocatable, dimension(:) :: diz + real(DP), allocatable, dimension(:) :: nix + real(DP), allocatable, dimension(:) :: niy + real(DP), allocatable, dimension(:) :: wix + real(DP), allocatable, dimension(:) :: wiy + real(DP), allocatable, dimension(:) :: wiz + real(DP), allocatable, dimension(:) :: bix + real(DP), allocatable, dimension(:) :: biy + logical :: nozee = .true. + ! + ! -- Ensure dis has necessary information + ! todo: do we need this? this needs to be done outside of this routine + ! if (this%icalcvelocity /= 0 .and. this%dis%con%ianglex == 0) then + ! call store_error('Error. ANGLDEGX not provided in '// & + ! 'discretization file. ANGLDEGX required for '// & + ! 'calculation of velocity.', terminate=.TRUE.) + ! end if + ! + ! -- Find max number of connections and allocate weight arrays + nc = 0 + do n = 1, dis%nodes + ! + ! -- Count internal model connections + ic = dis%con%ia(n + 1) - dis%con%ia(n) - 1 + ! + ! -- Count edge connections + if (present(nedges)) then + do m = 1, nedges + if (nodedge(m) == n) then + ic = ic + 1 + end if + end do + end if + ! + ! -- Set max number of connections for any cell + if (ic > nc) nc = ic + end do + ! + ! -- Allocate storage arrays needed for cell-centered calculation + allocate (vi(nc)) + allocate (di(nc)) + allocate (viz(nc)) + allocate (diz(nc)) + allocate (nix(nc)) + allocate (niy(nc)) + allocate (wix(nc)) + allocate (wiy(nc)) + allocate (wiz(nc)) + allocate (bix(nc)) + allocate (biy(nc)) + ! + ! -- Go through each cell and calculate specific discharge + do n = 1, dis%nodes + ! + ! -- first calculate geometric properties for x and y directions and + ! the specific discharge at a face (vi) + ic = 0 + iz = 0 + vi(:) = DZERO + di(:) = DZERO + viz(:) = DZERO + diz(:) = DZERO + nix(:) = DZERO + niy(:) = DZERO + do ipos = dis%con%ia(n) + 1, dis%con%ia(n + 1) - 1 + m = dis%con%ja(ipos) + isympos = dis%con%jas(ipos) + ihc = 1 + ic = ic + 1 + + ! Find the normal components (xn, yn, zn) for this connection + call dis%connection_normal(n, m, ihc, xn, yn, zn, ipos) + + ! Find the straight-line distance between n and m and put + ! in dltot + call dis%connection_vector(n, m, nozee, DONE, DONE, & + ihc, xc, yc, zc, dltot) + + ! Find the connection lengths, cl1 and cl2, adjusting for the + ! n, m symmetry + cl1 = dis%con%cl1(isympos) + cl2 = dis%con%cl2(isympos) + if (m < n) then + cl1 = dis%con%cl2(isympos) + cl2 = dis%con%cl1(isympos) + end if + + ! Set the normal components and distance for this connection + ooclsum = DONE / (cl1 + cl2) + nix(ic) = -xn + niy(ic) = -yn + di(ic) = dltot * cl1 * ooclsum + + ! Set vi to flow area and divide by area if present + q = flowja(isympos) + if (n < m) then + vi(ic) = q + else + vi(ic) = -q + end if + if (present(flowareaja)) then + area = flowareaja(isympos) + if (area > DZERO) then + vi(ic) = vi(ic) / area + else + vi(ic) = DZERO + end if + end if + + end do + ! + ! -- Look through edge flows that may have been provided by an exchange + ! and incorporate them into the averaging arrays + if (present(nedges)) then + do m = 1, nedges + if (nodedge(m) == n) then + ic = ic + 1 + nix(ic) = -propsedge(3, m) + niy(ic) = -propsedge(4, m) + di(ic) = propsedge(5, m) + vi(ic) = propsedge(1, m) + if (present(flowareaja)) then + area = propsedge(2, m) + if (area > DZERO) then + vi(ic) = vi(ic) / area + else + vi(ic) = DZERO + end if + end if + end if + end do + end if + + ! Set vz to zero + vz = DZERO + + ! -- distance-based weighting + nc = ic + dsumx = DZERO + dsumy = DZERO + dsumz = DZERO + do ic = 1, nc + wix(ic) = di(ic) * abs(nix(ic)) + wiy(ic) = di(ic) * abs(niy(ic)) + dsumx = dsumx + wix(ic) + dsumy = dsumy + wiy(ic) + end do + ! + ! -- Finish computing omega weights. Add a tiny bit + ! to dsum so that the normalized omega weight later + ! evaluates to (essentially) 1 in the case of a single + ! relevant connection, avoiding 0/0. + dsumx = dsumx + DEM10 * dsumx + dsumy = dsumy + DEM10 * dsumy + do ic = 1, nc + wix(ic) = (dsumx - wix(ic)) * abs(nix(ic)) + wiy(ic) = (dsumy - wiy(ic)) * abs(niy(ic)) + end do + ! + ! -- compute B weights + dsumx = DZERO + dsumy = DZERO + do ic = 1, nc + bix(ic) = wix(ic) * sign(DONE, nix(ic)) + biy(ic) = wiy(ic) * sign(DONE, niy(ic)) + dsumx = dsumx + wix(ic) * abs(nix(ic)) + dsumy = dsumy + wiy(ic) * abs(niy(ic)) + end do + if (dsumx > DZERO) dsumx = DONE / dsumx + if (dsumy > DZERO) dsumy = DONE / dsumy + axy = DZERO + ayx = DZERO + do ic = 1, nc + bix(ic) = bix(ic) * dsumx + biy(ic) = biy(ic) * dsumy + axy = axy + bix(ic) * niy(ic) + ayx = ayx + biy(ic) * nix(ic) + end do + ! + ! -- Calculate vector components at cell center. The divide by zero checking + ! below is problematic for cells with only one flow, such as can happen + ! with triangular cells in corners. In this case, the resulting + ! cell velocity will be calculated as zero. The method should be + ! improved so that edge flows of zero are included in these + ! calculations. But this needs to be done with consideration for LGR + ! cases in which flows are submitted from an exchange. + vx = DZERO + vy = DZERO + do ic = 1, nc + vx = vx + (bix(ic) - axy * biy(ic)) * vi(ic) + vy = vy + (biy(ic) - ayx * bix(ic)) * vi(ic) + end do + denom = DONE - axy * ayx + if (denom /= DZERO) then + vx = vx / denom + vy = vy / denom + end if + + ! Store velocity components + if (present(vcomp)) then + vcomp(1, n) = vx + vcomp(2, n) = vy + vcomp(3, n) = vz + end if + + ! Store velocity magnitude + if (present(vmag)) then + vmag(n) = sqrt(vx**2 + vy**2 + vz**2) + end if + + end do + + ! cleanup + deallocate (vi) + deallocate (di) + deallocate (nix) + deallocate (niy) + deallocate (wix) + deallocate (wiy) + deallocate (wiz) + deallocate (bix) + deallocate (biy) + + end subroutine vector_interpolation_2d + +end module VectorInterpolationModule diff --git a/src/Model/SurfaceWaterFlow/swf-dfw.f90 b/src/Model/SurfaceWaterFlow/swf-dfw.f90 index 344d0d5f41d..8071e46a5eb 100644 --- a/src/Model/SurfaceWaterFlow/swf-dfw.f90 +++ b/src/Model/SurfaceWaterFlow/swf-dfw.f90 @@ -16,8 +16,9 @@ module SwfDfwModule use ConstantsModule, only: LENMEMPATH, LENVARNAME, LINELENGTH, & DZERO, DHALF, DONE, DTWO, DTHREE, & DNODATA, DEM5, DTWOTHIRDS, DP9, DONETHIRD, & - DPREC + DPREC, DEM10 use MemoryHelperModule, only: create_mem_path + use MemoryManagerModule, only: mem_reallocate use MemoryManagerModule, only: mem_allocate, mem_setptr, get_isize use SimVariablesModule, only: errmsg, warnmsg use SimModule, only: count_errors, store_error, store_error_unit, & @@ -37,15 +38,31 @@ module SwfDfwModule type, extends(NumericalPackageType) :: SwfDfwType ! -- user-provided input + integer(I4B), pointer :: is2d => null() !< flag to indicate this model is 2D overland flow and not 1d channel flow integer(I4B), pointer :: icentral => null() !< flag to use central in space weighting (default is upstream weighting) + integer(I4B), pointer :: iswrcond => null() !< flag to activate the dev SWR conductance formulation real(DP), pointer :: unitconv !< conversion factor used in mannings equation; calculated from timeconv and lengthconv real(DP), pointer :: timeconv !< conversion factor from model length units to meters (1.0 if model uses meters for length) real(DP), pointer :: lengthconv !< conversion factor from model time units to seconds (1.0 if model uses seconds for time) + real(DP), dimension(:), pointer, contiguous :: hnew => null() !< pointer to model xnew real(DP), dimension(:), pointer, contiguous :: manningsn => null() !< mannings roughness for each reach integer(I4B), dimension(:), pointer, contiguous :: idcxs => null() !< cross section id for each reach integer(I4B), dimension(:), pointer, contiguous :: ibound => null() !< pointer to model ibound integer(I4B), dimension(:), pointer, contiguous :: icelltype => null() !< set to 1 and is accessed by chd for checking + ! velocity + integer(I4B), pointer :: icalcvelocity => null() !< flag to indicate velocity will be calculated (always on) + integer(I4B), pointer :: isavvelocity => null() !< flag to indicate velocity will be saved + real(DP), dimension(:, :), pointer, contiguous :: vcomp => null() !< velocity components: vx, vy, vz (nodes, 3) + real(DP), dimension(:), pointer, contiguous :: vmag => null() !< velocity magnitude (of size nodes) + integer(I4B), pointer :: nedges => null() !< number of cell edges + integer(I4B), pointer :: lastedge => null() !< last edge number + integer(I4B), dimension(:), pointer, contiguous :: nodedge => null() !< array of node numbers that have edges + integer(I4B), dimension(:), pointer, contiguous :: ihcedge => null() !< edge type (horizontal or vertical) + real(DP), dimension(:, :), pointer, contiguous :: propsedge => null() !< edge properties (Q, area, nx, ny, distance) + real(DP), dimension(:), pointer, contiguous :: grad_dhds_mag => null() !< magnitude of the gradient (of size nodes) + real(DP), dimension(:), pointer, contiguous :: dhdsja => null() !< gradient for each connection (of size njas) + ! -- observation data integer(I4B), pointer :: inobspkg => null() !< unit number for obs package type(ObsType), pointer :: obs => null() !< observation package @@ -83,6 +100,11 @@ module SwfDfwModule procedure :: get_cond procedure :: get_cond_swr procedure :: get_cond_n + procedure :: calc_velocity + procedure :: sav_velocity + procedure, public :: increase_edge_count + procedure, public :: set_edge_properties + procedure :: calc_dhds procedure :: write_cxs_tables end type SwfDfwType @@ -152,10 +174,17 @@ subroutine dfw_df(this, dis) class(SwfDfwType) :: this class(DisBaseType), pointer, intent(inout) :: dis !< the pointer to the discretization ! -- locals + character(len=10) :: distype = '' ! -- Set a pointers to passed in objects this%dis => dis + ! Set the distype (either DISV1D or DIS2D) + call this%dis%get_dis_type(distype) + if (distype == "DIS2D") then + this%is2d = 1 + end if + ! -- check if dfw is enabled ! this will need to become if (.not. present(dfw_options)) then !if (inunit > 0) then @@ -185,17 +214,29 @@ subroutine allocate_scalars(this) call this%NumericalPackageType%allocate_scalars() ! ! -- Allocate scalars + call mem_allocate(this%is2d, 'IS2D', this%memoryPath) call mem_allocate(this%icentral, 'ICENTRAL', this%memoryPath) + call mem_allocate(this%iswrcond, 'ISWRCOND', this%memoryPath) call mem_allocate(this%unitconv, 'UNITCONV', this%memoryPath) call mem_allocate(this%lengthconv, 'LENGTHCONV', this%memoryPath) call mem_allocate(this%timeconv, 'TIMECONV', this%memoryPath) call mem_allocate(this%inobspkg, 'INOBSPKG', this%memoryPath) + call mem_allocate(this%icalcvelocity, 'ICALCVELOCITY', this%memoryPath) + call mem_allocate(this%isavvelocity, 'ISAVVELOCITY', this%memoryPath) + call mem_allocate(this%nedges, 'NEDGES', this%memoryPath) + call mem_allocate(this%lastedge, 'LASTEDGE', this%memoryPath) + this%is2d = 0 this%icentral = 0 + this%iswrcond = 0 this%unitconv = DONE this%lengthconv = DONE this%timeconv = DONE this%inobspkg = 0 + this%icalcvelocity = 0 + this%isavvelocity = 0 + this%nedges = 0 + this%lastedge = 0 return end subroutine allocate_scalars @@ -203,12 +244,12 @@ end subroutine allocate_scalars !> @brief allocate memory for arrays !< subroutine allocate_arrays(this) - ! -- dummy + ! dummy class(SwfDfwType) :: this - ! -- locals + ! locals integer(I4B) :: n ! - ! -- user-provided input + ! user-provided input call mem_allocate(this%manningsn, this%dis%nodes, & 'MANNINGSN', this%memoryPath) call mem_allocate(this%idcxs, this%dis%nodes, & @@ -216,12 +257,35 @@ subroutine allocate_arrays(this) call mem_allocate(this%icelltype, this%dis%nodes, & 'ICELLTYPE', this%memoryPath) + ! optional arrays + call mem_allocate(this%nodedge, 0, 'NODEDGE', this%memoryPath) + call mem_allocate(this%ihcedge, 0, 'IHCEDGE', this%memoryPath) + call mem_allocate(this%propsedge, 0, 0, 'PROPSEDGE', this%memoryPath) + + ! Specific discharge is (re-)allocated when nedges is known + call mem_allocate(this%vcomp, 3, 0, 'VCOMP', this%memoryPath) + call mem_allocate(this%vmag, 0, 'VMAG', this%memoryPath) + do n = 1, this%dis%nodes this%manningsn(n) = DZERO this%idcxs(n) = 0 this%icelltype(n) = 1 end do + ! for 2d models, need to calculate and store dhds magnitude + if (this%is2d == 1) then + call mem_allocate(this%grad_dhds_mag, this%dis%nodes, & + 'GRAD_DHDS_MAG', this%memoryPath) + call mem_allocate(this%dhdsja, this%dis%njas, & + 'DHDSJA', this%memoryPath) + do n = 1, this%dis%nodes + this%grad_dhds_mag(n) = DZERO + end do + do n = 1, this%dis%njas + this%dhdsja(n) = DZERO + end do + end if + ! -- Return return end subroutine allocate_arrays @@ -261,6 +325,8 @@ subroutine source_options(this) ! -- update defaults with idm sourced values call mem_set_value(this%icentral, 'ICENTRAL', & this%input_mempath, found%icentral) + call mem_set_value(this%iswrcond, 'ISWRCOND', & + this%input_mempath, found%iswrcond) call mem_set_value(this%lengthconv, 'LENGTHCONV', & this%input_mempath, found%lengthconv) call mem_set_value(this%timeconv, 'TIMECONV', & @@ -269,16 +335,21 @@ subroutine source_options(this) this%input_mempath, found%iprflow) call mem_set_value(this%ipakcb, 'IPAKCB', & this%input_mempath, found%ipakcb) - ! - ! -- save flows option active + call mem_set_value(this%isavvelocity, 'ISAVVELOCITY', & + this%input_mempath, found%isavvelocity) + + ! save flows option active if (found%icentral) this%icentral = 1 if (found%ipakcb) this%ipakcb = -1 - ! - ! -- calculate unit conversion + + ! calculate unit conversion this%unitconv = this%lengthconv**DONETHIRD this%unitconv = this%unitconv * this%timeconv - ! - ! -- check for obs6_filename + + ! save velocity active + if (found%isavvelocity) this%icalcvelocity = this%isavvelocity + + ! check for obs6_filename call get_isize('OBS6_FILENAME', this%input_mempath, isize) if (isize > 0) then ! @@ -349,6 +420,16 @@ subroutine log_options(this, found) write (this%iout, '(4x,a)') 'Observation package is active.' end if + if (found%isavvelocity) & + write (this%iout, '(4x,a)') 'Velocity will be calculated at cell & + ¢ers and written to DATA-VCOMP in budget & + &file when requested.' + + if (found%iswrcond) then + write (this%iout, '(4x,a, G0)') 'Conductance will be calculated using & + &the SWR development option.' + end if + write (this%iout, '(1x,a,/)') 'End Setting DFW Options' end subroutine log_options @@ -359,7 +440,6 @@ subroutine source_griddata(this) ! -- modules use SimModule, only: count_errors, store_error use MemoryHelperModule, only: create_mem_path - use MemoryManagerModule, only: mem_reallocate use MemoryManagerExtModule, only: mem_set_value use SimVariablesModule, only: idm_context use SwfDfwInputModule, only: SwfDfwParamFoundType @@ -445,16 +525,33 @@ end subroutine write_cxs_tables !> @brief allocate memory !< - subroutine dfw_ar(this, ibound) + subroutine dfw_ar(this, ibound, hnew) ! -- modules ! -- dummy class(SwfDfwType) :: this !< this instance integer(I4B), dimension(:), pointer, contiguous :: ibound !< model ibound array + real(DP), dimension(:), pointer, contiguous, intent(inout) :: hnew !< pointer to model head array + ! local + integer(I4B) :: n - ! -- store pointer to ibound + ! store pointer to ibound this%ibound => ibound + this%hnew => hnew + + if (this%icalcvelocity == 1) then + call mem_reallocate(this%vcomp, 3, this%dis%nodes, 'VCOMP', this%memoryPath) + call mem_reallocate(this%vmag, this%dis%nodes, 'VMAG', this%memoryPath) + call mem_reallocate(this%nodedge, this%nedges, 'NODEDGE', this%memoryPath) + call mem_reallocate(this%ihcedge, this%nedges, 'IHCEDGE', this%memoryPath) + call mem_reallocate(this%propsedge, 5, this%nedges, 'PROPSEDGE', & + this%memoryPath) + do n = 1, this%dis%nodes + this%vcomp(:, n) = DZERO + this%vmag(n) = DZERO + end do + end if - ! - observation data + ! observation data call this%obs%obs_ar() return @@ -506,6 +603,11 @@ subroutine dfw_fc(this, kiter, matrix_sln, idxglo, rhs, stage, stage_old) real(DP), intent(inout), dimension(:) :: stage_old ! -- local ! + ! calculate dhds at cell center for 2d case + if (this%is2d == 1) then + call this%calc_dhds() + end if + ! -- add qnm contributions to matrix equations call this%dfw_qnm_fc_nr(kiter, matrix_sln, idxglo, rhs, stage, stage_old) ! @@ -609,7 +711,8 @@ function qcalc(this, n, m, stage_n, stage_m, ipos) result(qnm) real(DP) :: cond real(DP) :: cl1 real(DP) :: cl2 - ! + + ! Set connection lengths isympos = this%dis%con%jas(ipos) if (n < m) then cl1 = this%dis%con%cl1(isympos) @@ -618,8 +721,17 @@ function qcalc(this, n, m, stage_n, stage_m, ipos) result(qnm) cl1 = this%dis%con%cl2(isympos) cl2 = this%dis%con%cl1(isympos) end if - cond = this%get_cond(n, m, ipos, stage_n, stage_m, cl1, cl2) + + ! Calculate conductance + if (this%iswrcond == 0) then + cond = this%get_cond(n, m, ipos, stage_n, stage_m, cl1, cl2) + else if (this%iswrcond == 1) then + cond = this%get_cond_swr(n, m, ipos, stage_n, stage_m, cl1, cl2) + end if + + ! calculate flow between n and m qnm = cond * (stage_m - stage_n) + return end function qcalc @@ -636,9 +748,10 @@ function get_cond(this, n, m, ipos, stage_n, stage_m, cln, clm) result(cond) real(DP), intent(in) :: cln !< distance from cell n to shared face with m real(DP), intent(in) :: clm !< distance from cell m to shared face with n ! -- local - real(DP) :: absdhdxsqr real(DP) :: depth_n real(DP) :: depth_m + real(DP) :: dhds_n + real(DP) :: dhds_m real(DP) :: width_n real(DP) :: width_m real(DP) :: range = 1.d-6 @@ -655,16 +768,20 @@ function get_cond(this, n, m, ipos, stage_n, stage_m, cln, clm) result(cond) length_nm = cln + clm cond = DZERO if (length_nm > DPREC) then - absdhdxsqr = abs((stage_n - stage_m) / length_nm)**DHALF - if (absdhdxsqr < DPREC) then - ! TODO: Set this differently somehow? - absdhdxsqr = 1.e-7 - end if ! -- Calculate depth in each reach depth_n = stage_n - this%dis%bot(n) depth_m = stage_m - this%dis%bot(m) + ! assign gradients + if (this%is2d == 0) then + dhds_n = abs(stage_m - stage_n) / (cln + clm) + dhds_m = dhds_n + else + dhds_n = this%grad_dhds_mag(n) + dhds_m = this%grad_dhds_mag(m) + end if + ! -- Assign upstream depth, if not central if (this%icentral == 0) then ! -- use upstream weighting @@ -687,8 +804,8 @@ function get_cond(this, n, m, ipos, stage_n, stage_m, cln, clm) result(cond) ! -- Calculate half-cell conductance for reach ! n and m - cn = this%get_cond_n(n, depth_n, absdhdxsqr, cln, width_n) - cm = this%get_cond_n(m, depth_m, absdhdxsqr, clm, width_m) + cn = this%get_cond_n(n, depth_n, cln, width_n, dhds_n) + cm = this%get_cond_n(m, depth_m, clm, width_m, dhds_m) ! -- Use harmonic mean to calculated weighted ! conductance bewteen the centers of reaches @@ -703,6 +820,39 @@ function get_cond(this, n, m, ipos, stage_n, stage_m, cln, clm) result(cond) end function get_cond + !> @brief Calculate half reach conductance + !! + !! Calculate half reach conductance for reach n + !< using conveyance and Manning's equation + function get_cond_n(this, n, depth, dx, width, dhds) result(c) + ! -- modules + ! -- dummy + class(SwfDfwType) :: this + integer(I4B), intent(in) :: n !< reach number + real(DP), intent(in) :: depth !< simulated depth (stage - elevation) in reach n for this iteration + real(DP), intent(in) :: dx !< half-cell distance + real(DP), intent(in) :: width !< width of the reach perpendicular to flow + real(DP), intent(in) :: dhds !< gradient + ! -- return + real(DP) :: c + ! -- local + real(DP) :: rough + real(DP) :: dhds_sqr + real(DP) :: conveyance + + ! Calculate conveyance, which is a * r**DTWOTHIRDS / roughc + rough = this%manningsn(n) + conveyance = this%cxs%get_conveyance(this%idcxs(n), width, depth, rough) + dhds_sqr = dhds**DHALF + if (dhds_sqr < DEM10) then + dhds_sqr = DEM10 + end if + + ! Multiply by unitconv and divide conveyance by sqrt of friction slope and dx + c = this%unitconv * conveyance / dx / dhds_sqr + + end function get_cond_n + function get_cond_swr(this, n, m, ipos, stage_n, stage_m, cln, clm) result(cond) ! -- modules use SmoothingModule, only: sQuadratic @@ -716,32 +866,33 @@ function get_cond_swr(this, n, m, ipos, stage_n, stage_m, cln, clm) result(cond) real(DP), intent(in) :: cln !< distance from cell n to shared face with m real(DP), intent(in) :: clm !< distance from cell m to shared face with n ! -- local - real(DP) :: absdhdxsqr real(DP) :: depth_n real(DP) :: depth_m + real(DP) :: dhds_n + real(DP) :: dhds_m + real(DP) :: dhds_nm + real(DP) :: dhds_sqr real(DP) :: width_n real(DP) :: width_m - real(DP) :: range = 1.d-10 + real(DP) :: range = 1.d-6 real(DP) :: dydx real(DP) :: smooth_factor real(DP) :: length_nm real(DP) :: cond - real(DP) :: rinvn, rinvm, rinv_avg + real(DP) :: ravg + real(DP) :: rinv_avg real(DP) :: area_n, area_m, area_avg real(DP) :: rhn, rhm, rhavg real(DP) :: weight_n real(DP) :: weight_m + real(DP) :: rough_n + real(DP) :: rough_m ! Use harmonic weighting for 1/manningsn, but using length-weighted ! averaging for other terms length_nm = cln + clm cond = DZERO if (length_nm > DPREC) then - absdhdxsqr = abs((stage_n - stage_m) / length_nm)**DHALF - if (absdhdxsqr < DPREC) then - ! TODO: Set this differently somehow? - absdhdxsqr = 1.e-7 - end if ! -- Calculate depth in each reach depth_n = stage_n - this%dis%bot(n) @@ -767,12 +918,6 @@ function get_cond_swr(this, n, m, ipos, stage_n, stage_m, cln, clm) result(cond) ! Get the flow widths for n and m from dis package call this%dis%get_flow_width(n, m, ipos, width_n, width_m) - ! harmonic average for inverse mannings value - rinvn = DONE / this%manningsn(n) - rinvm = DONE / this%manningsn(m) - rinv_avg = DTWO * rinvn * rinvm * (length_nm) / & - (rinvn * clm + rinvm * cln) - ! linear weight toward node closer to shared face weight_n = clm / length_nm weight_m = DONE - weight_n @@ -783,44 +928,92 @@ function get_cond_swr(this, n, m, ipos, stage_n, stage_m, cln, clm) result(cond) area_avg = weight_n * area_n + weight_m * area_m ! average hydraulic radius - rhn = depth_n - rhm = depth_m - rhavg = weight_n * rhn + weight_m * rhm + if (this%is2d == 0) then + rhn = this%cxs%get_hydraulic_radius(this%idcxs(n), width_n, & + depth_n, area_n) + rhm = this%cxs%get_hydraulic_radius(this%idcxs(m), width_m, & + depth_m, area_m) + rhavg = weight_n * rhn + weight_m * rhm + else + rhavg = area_avg / width_n + end if rhavg = rhavg**DTWOTHIRDS - cond = rinv_avg * area_avg * rhavg / absdhdxsqr / length_nm + ! average gradient + if (this%is2d == 0) then + dhds_nm = abs(stage_m - stage_n) / (length_nm) + else + dhds_n = this%grad_dhds_mag(n) + dhds_m = this%grad_dhds_mag(m) + dhds_nm = weight_n * dhds_n + weight_m * dhds_m + end if + dhds_sqr = dhds_nm**DHALF + if (dhds_sqr < DEM10) then + dhds_sqr = DEM10 + end if + + ! weighted harmonic mean for inverse mannings value + weight_n = cln / length_nm + weight_m = DONE - weight_n + rough_n = this%cxs%get_roughness(this%idcxs(n), width_n, depth_n, & + this%manningsn(n), dhds_nm) + rough_m = this%cxs%get_roughness(this%idcxs(m), width_m, depth_m, & + this%manningsn(m), dhds_nm) + ravg = (weight_n + weight_m) / & + (weight_n / rough_n + weight_m / rough_m) + rinv_avg = DONE / ravg + + ! calculate conductance using averaged values + cond = this%unitconv * rinv_avg * area_avg * rhavg / dhds_sqr / length_nm end if end function get_cond_swr - !> @brief Calculate half reach conductance - !! - !! Calculate half reach conductance for reach n - !< using conveyance and Manning's equation - function get_cond_n(this, n, depth, absdhdxsq, dx, width) result(c) - ! -- modules - ! -- dummy + subroutine calc_dhds(this) + ! modules + use VectorInterpolationModule, only: vector_interpolation_2d + ! dummy class(SwfDfwType) :: this - integer(I4B), intent(in) :: n !< reach number - real(DP), intent(in) :: depth !< simulated depth (stage - elevation) in reach n for this iteration - real(DP), intent(in) :: absdhdxsq !< absolute value of simulated hydraulic gradient - real(DP), intent(in) :: dx !< half-cell distance - real(DP), intent(in) :: width !< width of the reach perpendicular to flow - ! -- return - real(DP) :: c - ! -- local - real(DP) :: rough - real(DP) :: conveyance + ! local + integer(I4B) :: n + integer(I4B) :: m + integer(I4B) :: ipos + integer(I4B) :: isympos + real(DP) :: cl1 + real(DP) :: cl2 - ! Calculate conveyance, which a * r**DTWOTHIRDS / roughc - rough = this%manningsn(n) - conveyance = this%cxs%get_conveyance(this%idcxs(n), width, depth, rough) + do n = 1, this%dis%nodes + this%grad_dhds_mag(n) = DZERO + do ipos = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1 + m = this%dis%con%ja(ipos) + isympos = this%dis%con%jas(ipos) - ! Multiply by unitconv and divide conveyance by sqrt of friction slope and dx - c = this%unitconv * conveyance / absdhdxsq / dx + ! determine cl1 and cl2 + if (n < m) then + cl1 = this%dis%con%cl1(isympos) + cl2 = this%dis%con%cl2(isympos) + else + cl1 = this%dis%con%cl2(isympos) + cl2 = this%dis%con%cl1(isympos) + end if - end function get_cond_n + ! store for n < m in upper right triangular part of symmetric dhdsja array + if (n < m) then + if (cl1 + cl2 > DPREC) then + this%dhdsja(isympos) = (this%hnew(m) - this%hnew(n)) / (cl1 + cl2) + else + this%dhdsja(isympos) = DZERO + end if + end if + end do + end do + + ! pass dhdsja into the vector interpolation to get the components + ! of the gradient at the cell center + call vector_interpolation_2d(this%dis, this%dhdsja, vmag=this%grad_dhds_mag) + + end subroutine calc_dhds !> @ brief Newton under relaxation !! @@ -943,7 +1136,11 @@ subroutine dfw_save_model_flows(this, flowja, icbcfl, icbcun) ! ! -- flowja call this%dis%record_connection_array(flowja, ibinun, this%iout) - + end if + ! + ! -- Calculate velocities at cell centers and write, if requested + if (this%isavvelocity /= 0) then + if (ibinun /= 0) call this%sav_velocity(ibinun) end if ! ! -- Return @@ -1001,19 +1198,34 @@ subroutine dfw_da(this) ! -- dummy class(SwfDfwType) :: this ! - ! -- Deallocate input memory + ! Deallocate input memory call memorylist_remove(this%name_model, 'DFW', idm_context) - ! - ! -- Scalars + + ! Deallocate arrays + call mem_deallocate(this%manningsn) + call mem_deallocate(this%idcxs) + call mem_deallocate(this%icelltype) + call mem_deallocate(this%nodedge) + call mem_deallocate(this%ihcedge) + call mem_deallocate(this%propsedge) + call mem_deallocate(this%vcomp) + call mem_deallocate(this%vmag) + if (this%is2d == 1) then + call mem_deallocate(this%grad_dhds_mag) + call mem_deallocate(this%dhdsja) + end if + + ! Scalars + call mem_deallocate(this%is2d) call mem_deallocate(this%icentral) + call mem_deallocate(this%iswrcond) call mem_deallocate(this%unitconv) call mem_deallocate(this%lengthconv) call mem_deallocate(this%timeconv) - ! - ! -- Deallocate arrays - call mem_deallocate(this%manningsn) - call mem_deallocate(this%idcxs) - call mem_deallocate(this%icelltype) + call mem_deallocate(this%isavvelocity) + call mem_deallocate(this%icalcvelocity) + call mem_deallocate(this%nedges) + call mem_deallocate(this%lastedge) ! -- obs package call mem_deallocate(this%inobspkg) @@ -1024,10 +1236,366 @@ subroutine dfw_da(this) ! -- deallocate parent call this%NumericalPackageType%da() + + ! pointers + this%hnew => null() + + end subroutine dfw_da + + !> @brief Calculate the 3 components of velocity at the cell center + !< + subroutine calc_velocity(this, flowja) + ! -- modules + use SimModule, only: store_error + ! -- dummy + class(SwfDfwType) :: this + real(DP), intent(in), dimension(:) :: flowja + ! -- local + integer(I4B) :: n + integer(I4B) :: m + integer(I4B) :: ipos + integer(I4B) :: isympos + integer(I4B) :: ihc + integer(I4B) :: ic + integer(I4B) :: iz + integer(I4B) :: nc + integer(I4B) :: ncz + real(DP) :: vx + real(DP) :: vy + real(DP) :: vz + real(DP) :: xn + real(DP) :: yn + real(DP) :: zn + real(DP) :: xc + real(DP) :: yc + real(DP) :: zc + real(DP) :: cl1 + real(DP) :: cl2 + real(DP) :: dltot + real(DP) :: ooclsum + real(DP) :: dsumx + real(DP) :: dsumy + real(DP) :: dsumz + real(DP) :: denom + real(DP) :: area + real(DP) :: dz + real(DP) :: axy + real(DP) :: ayx + real(DP), allocatable, dimension(:) :: vi + real(DP), allocatable, dimension(:) :: di + real(DP), allocatable, dimension(:) :: viz + real(DP), allocatable, dimension(:) :: diz + real(DP), allocatable, dimension(:) :: nix + real(DP), allocatable, dimension(:) :: niy + real(DP), allocatable, dimension(:) :: wix + real(DP), allocatable, dimension(:) :: wiy + real(DP), allocatable, dimension(:) :: wiz + real(DP), allocatable, dimension(:) :: bix + real(DP), allocatable, dimension(:) :: biy + logical :: nozee = .true. + ! + ! -- Ensure dis has necessary information + ! todo: do we need this? + if (this%icalcvelocity /= 0 .and. this%dis%con%ianglex == 0) then + call store_error('Error. ANGLDEGX not provided in '// & + 'discretization file. ANGLDEGX required for '// & + 'calculation of velocity.', terminate=.TRUE.) + end if + ! + ! -- Find max number of connections and allocate weight arrays + nc = 0 + do n = 1, this%dis%nodes + ! + ! -- Count internal model connections + ic = this%dis%con%ia(n + 1) - this%dis%con%ia(n) - 1 + ! + ! -- Count edge connections + do m = 1, this%nedges + if (this%nodedge(m) == n) then + ic = ic + 1 + end if + end do + ! + ! -- Set max number of connections for any cell + if (ic > nc) nc = ic + end do + ! + ! -- Allocate storage arrays needed for cell-centered calculation + allocate (vi(nc)) + allocate (di(nc)) + allocate (viz(nc)) + allocate (diz(nc)) + allocate (nix(nc)) + allocate (niy(nc)) + allocate (wix(nc)) + allocate (wiy(nc)) + allocate (wiz(nc)) + allocate (bix(nc)) + allocate (biy(nc)) + ! + ! -- Go through each cell and calculate specific discharge + do n = 1, this%dis%nodes + ! + ! -- first calculate geometric properties for x and y directions and + ! the specific discharge at a face (vi) + ic = 0 + iz = 0 + vi(:) = DZERO + di(:) = DZERO + viz(:) = DZERO + diz(:) = DZERO + nix(:) = DZERO + niy(:) = DZERO + do ipos = this%dis%con%ia(n) + 1, this%dis%con%ia(n + 1) - 1 + m = this%dis%con%ja(ipos) + isympos = this%dis%con%jas(ipos) + ihc = this%dis%con%ihc(isympos) + area = this%dis%con%hwva(isympos) + + ! -- horizontal connection + ic = ic + 1 + if (this%hnew(n) > this%hnew(m)) then + dz = this%hnew(n) - this%dis%bot(n) + else + dz = this%hnew(m) - this%dis%bot(m) + end if + area = area * dz + call this%dis%connection_normal(n, m, ihc, xn, yn, zn, ipos) + call this%dis%connection_vector(n, m, nozee, DONE, DONE, & + ihc, xc, yc, zc, dltot) + cl1 = this%dis%con%cl1(isympos) + cl2 = this%dis%con%cl2(isympos) + if (m < n) then + cl1 = this%dis%con%cl2(isympos) + cl2 = this%dis%con%cl1(isympos) + end if + ooclsum = DONE / (cl1 + cl2) + nix(ic) = -xn + niy(ic) = -yn + di(ic) = dltot * cl1 * ooclsum + if (area > DZERO) then + vi(ic) = flowja(ipos) / area + else + vi(ic) = DZERO + end if + + end do + ! + ! -- Look through edge flows that may have been provided by an exchange + ! and incorporate them into the averaging arrays + do m = 1, this%nedges + if (this%nodedge(m) == n) then + ! + ! -- propsedge: (Q, area, nx, ny, distance) + ihc = this%ihcedge(m) + area = this%propsedge(2, m) + + ic = ic + 1 + nix(ic) = -this%propsedge(3, m) + niy(ic) = -this%propsedge(4, m) + di(ic) = this%propsedge(5, m) + if (area > DZERO) then + vi(ic) = this%propsedge(1, m) / area + else + vi(ic) = DZERO + end if + + end if + end do + ! + ! -- Assign number of vertical and horizontal connections + ncz = iz + nc = ic + ! + ! -- calculate z weight (wiz) and z velocity + if (ncz == 1) then + wiz(1) = DONE + else + dsumz = DZERO + do iz = 1, ncz + dsumz = dsumz + diz(iz) + end do + denom = (ncz - DONE) + if (denom < DZERO) denom = DZERO + dsumz = dsumz + DEM10 * dsumz + do iz = 1, ncz + if (dsumz > DZERO) wiz(iz) = DONE - diz(iz) / dsumz + if (denom > 0) then + wiz(iz) = wiz(iz) / denom + else + wiz(iz) = DZERO + end if + end do + end if + vz = DZERO + do iz = 1, ncz + vz = vz + wiz(iz) * viz(iz) + end do + ! + ! -- distance-based weighting + nc = ic + dsumx = DZERO + dsumy = DZERO + dsumz = DZERO + do ic = 1, nc + wix(ic) = di(ic) * abs(nix(ic)) + wiy(ic) = di(ic) * abs(niy(ic)) + dsumx = dsumx + wix(ic) + dsumy = dsumy + wiy(ic) + end do + ! + ! -- Finish computing omega weights. Add a tiny bit + ! to dsum so that the normalized omega weight later + ! evaluates to (essentially) 1 in the case of a single + ! relevant connection, avoiding 0/0. + dsumx = dsumx + DEM10 * dsumx + dsumy = dsumy + DEM10 * dsumy + do ic = 1, nc + wix(ic) = (dsumx - wix(ic)) * abs(nix(ic)) + wiy(ic) = (dsumy - wiy(ic)) * abs(niy(ic)) + end do + ! + ! -- compute B weights + dsumx = DZERO + dsumy = DZERO + do ic = 1, nc + bix(ic) = wix(ic) * sign(DONE, nix(ic)) + biy(ic) = wiy(ic) * sign(DONE, niy(ic)) + dsumx = dsumx + wix(ic) * abs(nix(ic)) + dsumy = dsumy + wiy(ic) * abs(niy(ic)) + end do + if (dsumx > DZERO) dsumx = DONE / dsumx + if (dsumy > DZERO) dsumy = DONE / dsumy + axy = DZERO + ayx = DZERO + do ic = 1, nc + bix(ic) = bix(ic) * dsumx + biy(ic) = biy(ic) * dsumy + axy = axy + bix(ic) * niy(ic) + ayx = ayx + biy(ic) * nix(ic) + end do + ! + ! -- Calculate specific discharge. The divide by zero checking below + ! is problematic for cells with only one flow, such as can happen + ! with triangular cells in corners. In this case, the resulting + ! cell velocity will be calculated as zero. The method should be + ! improved so that edge flows of zero are included in these + ! calculations. But this needs to be done with consideration for LGR + ! cases in which flows are submitted from an exchange. + vx = DZERO + vy = DZERO + do ic = 1, nc + vx = vx + (bix(ic) - axy * biy(ic)) * vi(ic) + vy = vy + (biy(ic) - ayx * bix(ic)) * vi(ic) + end do + denom = DONE - axy * ayx + if (denom /= DZERO) then + vx = vx / denom + vy = vy / denom + end if + ! + this%vcomp(1, n) = vx + this%vcomp(2, n) = vy + this%vcomp(3, n) = vz + this%vmag(n) = sqrt(vx**2 + vy**2 + vz**2) + ! + end do + ! + ! -- cleanup + deallocate (vi) + deallocate (di) + deallocate (nix) + deallocate (niy) + deallocate (wix) + deallocate (wiy) + deallocate (wiz) + deallocate (bix) + deallocate (biy) ! ! -- Return return - end subroutine dfw_da + end subroutine calc_velocity + + !> @brief Reserve space for nedges cells that have an edge on them. + !! + !! This must be called before the npf%allocate_arrays routine, which is + !! called from npf%ar. + !< + subroutine increase_edge_count(this, nedges) + ! -- dummy + class(SwfDfwType) :: this + integer(I4B), intent(in) :: nedges + ! + this%nedges = this%nedges + nedges + ! + ! -- Return + return + end subroutine increase_edge_count + + !> @brief Provide the npf package with edge properties + !< + subroutine set_edge_properties(this, nodedge, ihcedge, q, area, nx, ny, & + distance) + ! -- dummy + class(SwfDfwType) :: this + integer(I4B), intent(in) :: nodedge + integer(I4B), intent(in) :: ihcedge + real(DP), intent(in) :: q + real(DP), intent(in) :: area + real(DP), intent(in) :: nx + real(DP), intent(in) :: ny + real(DP), intent(in) :: distance + ! -- local + integer(I4B) :: lastedge + ! + this%lastedge = this%lastedge + 1 + lastedge = this%lastedge + this%nodedge(lastedge) = nodedge + this%ihcedge(lastedge) = ihcedge + this%propsedge(1, lastedge) = q + this%propsedge(2, lastedge) = area + this%propsedge(3, lastedge) = nx + this%propsedge(4, lastedge) = ny + this%propsedge(5, lastedge) = distance + ! + ! -- If this is the last edge, then the next call must be starting a new + ! edge properties assignment loop, so need to reset lastedge to 0 + if (this%lastedge == this%nedges) this%lastedge = 0 + ! + ! -- Return + return + end subroutine set_edge_properties + + !> @brief Save specific discharge in binary format to ibinun + !< + subroutine sav_velocity(this, ibinun) + ! -- dummy + class(SwfDfwType) :: this + integer(I4B), intent(in) :: ibinun + ! -- local + character(len=16) :: text + character(len=16), dimension(3) :: auxtxt + integer(I4B) :: n + integer(I4B) :: naux + ! + ! -- Write the header + text = ' DATA-VCOMP' + naux = 3 + auxtxt(:) = [' vx', ' vy', ' vz'] + call this%dis%record_srcdst_list_header(text, this%name_model, & + this%packName, this%name_model, & + this%packName, naux, auxtxt, ibinun, & + this%dis%nodes, this%iout) + ! + ! -- Write a zero for Q, and then write qx, qy, qz as aux variables + do n = 1, this%dis%nodes + call this%dis%record_mf6_list_entry(ibinun, n, n, DZERO, naux, & + this%vcomp(:, n)) + end do + ! + ! -- Return + return + end subroutine sav_velocity !> @brief Define the observation types available in the package !! diff --git a/src/Model/SurfaceWaterFlow/swf.f90 b/src/Model/SurfaceWaterFlow/swf.f90 index d592696906d..b4825144e0e 100644 --- a/src/Model/SurfaceWaterFlow/swf.f90 +++ b/src/Model/SurfaceWaterFlow/swf.f90 @@ -391,7 +391,7 @@ subroutine swf_ar(this) ! ! -- Call dis_ar to write binary grid file call this%dis%dis_ar(itemp) - if (this%indfw > 0) call this%dfw%dfw_ar(this%ibound) + if (this%indfw > 0) call this%dfw%dfw_ar(this%ibound, this%x) if (this%insto > 0) call this%sto%sto_ar(this%dis, this%ibound) if (this%inobs > 0) call this%obs%swf_obs_ar(this%ic, this%x, this%flowja) deallocate (itemp) @@ -704,6 +704,14 @@ subroutine swf_bd(this, icnvg, isuppress_output) call packobj%bnd_bd(this%budget) end do ! + ! -- dfw velocities have to be calculated here, after swf-swf exchanges + ! have passed in their contributions from exg_cq() + if (this%indfw > 0) then + if (this%dfw%icalcvelocity /= 0) then + call this%dfw%calc_velocity(this%flowja) + end if + end if + ! ! -- Return return end subroutine swf_bd diff --git a/src/meson.build b/src/meson.build index 11f328c6ebb..92e13ea4e4c 100644 --- a/src/meson.build +++ b/src/meson.build @@ -209,6 +209,7 @@ modflow_sources = files( 'Model' / 'ModelUtilities' / 'TimeSelect.f90', 'Model' / 'ModelUtilities' / 'TrackData.f90', 'Model' / 'ModelUtilities' / 'UzfCellGroup.f90', + 'Model' / 'ModelUtilities' / 'VectorInterpolation.f90', 'Model' / 'ModelUtilities' / 'Xt3dAlgorithm.f90', 'Model' / 'ModelUtilities' / 'Xt3dInterface.f90', 'Model' / 'TransportModel' / 'tsp.f90', From a7fed8639b43db074d91f29252183bc0a58de293 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 11 Apr 2024 16:49:18 -0400 Subject: [PATCH 095/199] ci(pixi): pin pixi to 0.19.1, setup-pixi to 0.5.2 for now (#1718) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * pin pixi version to 0.19.1 * bump setup-pixi to 0.5.2 * avoid breaking changes while pixi matures — pinning the action alone leaves us exposed to regressions in pixi itself --- .github/workflows/ci.yml | 24 ++++++++++++------------ .github/workflows/compilers.yml | 4 ++-- .github/workflows/docs.yml | 8 ++++---- .github/workflows/large.yml | 4 ++-- .github/workflows/pixi_auto_update.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 80b6c6dbe90..c5fc92ae9e6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,9 +49,9 @@ jobs: - name: Checkout modflow6 uses: actions/checkout@v4 - - uses: prefix-dev/setup-pixi@v0.5.1 + - uses: prefix-dev/setup-pixi@v0.5.2 with: - pixi-version: "latest" + pixi-version: v0.19.1 - name: Check Fortran source formatting run: pixi run fortran-format-check @@ -79,9 +79,9 @@ jobs: compiler: gcc version: ${{ env.FC_V }} - - uses: prefix-dev/setup-pixi@v0.5.1 + - uses: prefix-dev/setup-pixi@v0.5.2 with: - pixi-version: "latest" + pixi-version: v0.19.1 - name: Meson setup run: pixi run setup -Dwerror=true builddir @@ -124,9 +124,9 @@ jobs: version: ${{ env.FC_V }} - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.1 + uses: prefix-dev/setup-pixi@v0.5.2 with: - pixi-version: "latest" + pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" - name: Build test-drive @@ -219,9 +219,9 @@ jobs: version: ${{ env.FC_V }} - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.1 + uses: prefix-dev/setup-pixi@v0.5.2 with: - pixi-version: "latest" + pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" - name: Build modflow6 @@ -332,9 +332,9 @@ jobs: path: modflow6-examples - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.1 + uses: prefix-dev/setup-pixi@v0.5.2 with: - pixi-version: "latest" + pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" - name: Setup ${{ env.FC }} ${{ env.FC_V }} @@ -419,9 +419,9 @@ jobs: path: modflow6 - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.1 + uses: prefix-dev/setup-pixi@v0.5.2 with: - pixi-version: "latest" + pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" - name: Test parallel MF6 diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index 824b35afb39..f5983d5c190 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -138,9 +138,9 @@ jobs: version: ${{ matrix.version }} - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.1 + uses: prefix-dev/setup-pixi@v0.5.2 with: - pixi-version: "latest" + pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" - name: Build modflow6 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 48bcb1b13e7..5c35d47ba19 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -43,9 +43,9 @@ jobs: path: usgslatex - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.1 + uses: prefix-dev/setup-pixi@v0.5.2 with: - pixi-version: "latest" + pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" - name: Install additional packages for Sphinx using pip @@ -194,9 +194,9 @@ jobs: sudo apt-get install doxygen graphviz - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.1 + uses: prefix-dev/setup-pixi@v0.5.2 with: - pixi-version: "latest" + pixi-version: v0.19.1 - name: Print python package versions run: pixi run pip list diff --git a/.github/workflows/large.yml b/.github/workflows/large.yml index fd58cf75676..419bf74581d 100644 --- a/.github/workflows/large.yml +++ b/.github/workflows/large.yml @@ -67,9 +67,9 @@ jobs: path: modflow6-largetestmodels - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.1 + uses: prefix-dev/setup-pixi@v0.5.2 with: - pixi-version: "latest" + pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" - name: Setup ${{ matrix.compiler }} ${{ matrix.version }} diff --git a/.github/workflows/pixi_auto_update.yml b/.github/workflows/pixi_auto_update.yml index d7ef5275ace..ec7b55a54ed 100644 --- a/.github/workflows/pixi_auto_update.yml +++ b/.github/workflows/pixi_auto_update.yml @@ -12,9 +12,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: prefix-dev/setup-pixi@v0.5.1 + - uses: prefix-dev/setup-pixi@v0.5.2 with: - pixi-version: "latest" + pixi-version: v0.19.1 cache: false - name: Update pixi lock file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b847f228ca5..b4dce98d250 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -99,9 +99,9 @@ jobs: ref: ${{ inputs.branch }} - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.1 + uses: prefix-dev/setup-pixi@v0.5.2 with: - pixi-version: "latest" + pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" - name: Setup Micromamba From 6e283e497ed59231ce72709a69584f6f07d5d960 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Thu, 11 Apr 2024 18:34:34 -0500 Subject: [PATCH 096/199] fix(test): numpy resize not reliable in test_gwf_ats_lak01.py (#1722) * test works in mf6 CI but not in flopy CI * allocate budget array instead --- autotest/test_gwf_ats_lak01.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/autotest/test_gwf_ats_lak01.py b/autotest/test_gwf_ats_lak01.py index 70dbac9a2fd..2a9f5481eda 100644 --- a/autotest/test_gwf_ats_lak01.py +++ b/autotest/test_gwf_ats_lak01.py @@ -294,12 +294,9 @@ def get_kij_from_node(node, nrow, ncol): def budcsv_to_cumulative(fpth): budcsv = np.genfromtxt(fpth, names=True, delimiter=",", deletechars="") nrow = budcsv.shape[0] - budcsv_cumulative = budcsv.copy() - budcsv_cumulative.resize(nrow + 1) - budcsv_cumulative["time"][0] = 0. + budcsv_cumulative = np.zeros((nrow + 1), dtype=budcsv.dtype) budcsv_cumulative["time"][1:] = budcsv["time"][:] for name in budcsv.dtype.names[1:]: - budcsv_cumulative[name][0] = 0. for i in range(nrow): dt = budcsv_cumulative["time"][i + 1] - budcsv_cumulative["time"][i] budcsv_cumulative[name][i + 1] = budcsv_cumulative[name][i] + budcsv[name][i] * dt From b2b9c47750fd7400cb9f9561d4f85a7e6ca47b12 Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Fri, 12 Apr 2024 06:26:32 -0700 Subject: [PATCH 097/199] fix(tsp-apt): pair the user-specified concentration for finf with rej. infiltration (#1719) * fix(tsp-apt): pair the user-specified concentration for finf with rej. infiltration * missing an escape character in the latex * apply same change to gwe-uze.f90 as was applied to gwt-uzt.f90 * change new function name to get_mvr_depvar for improved consistency --- autotest/test_gwt_uztmvt2x2.py | 648 +++++++++++++++++++++ doc/ReleaseNotes/develop.tex | 2 +- src/Model/GroundWaterEnergy/gwe-uze.f90 | 15 + src/Model/GroundWaterTransport/gwt-uzt.f90 | 15 + src/Model/TransportModel/tsp-apt.f90 | 17 +- 5 files changed, 694 insertions(+), 3 deletions(-) create mode 100644 autotest/test_gwt_uztmvt2x2.py diff --git a/autotest/test_gwt_uztmvt2x2.py b/autotest/test_gwt_uztmvt2x2.py new file mode 100644 index 00000000000..c3d12ed8f78 --- /dev/null +++ b/autotest/test_gwt_uztmvt2x2.py @@ -0,0 +1,648 @@ +""" +2x2 test problem for GWE + +Test the rejected infiltration mover transport values + +Model configuration: 2 SFR reaches exist in the first row. + 2 UZF objects exist in the second row + 2 MVR/MVT connections transfer rejected infiltration + from UZF to SFR + + Col 1 Col 2 + +-------+-------+ + Row 1 / / /| + SFR / / / | +Channel-> ========================= + / / ^ / | + +-------+---+---+ | + / / | /| + + Row 2 / / rej. / | / + / / inf. / | / + / / / | / + +-------+-------+ |/ + | | | + + | | | / + | | | / + | | | / + | | |/ + +-------+-------+ + + Profile View: + ------------ + +---- rej inf. + v +---------+ + +---------+ | + | | | + | +---------+ + +---------+ Row 2 + Row 1 +""" + +# Imports + +import os +import numpy as np +import pytest +import flopy + +from framework import TestFramework + +# Base simulation and model name and workspace + +scheme = "UPSTREAM" +# scheme = "TVD" + +cases = [ + "uztmvt" +] # 2-cell model, horizontally connected with staggered alignment + +nrow = 2 +ncol = 2 +nlay = 1 +top = np.array([[[1.0, 1.0], [1.5, 1.5]]], dtype=float) +bot = np.array([[[0.0, 0.0], [0.5, 0.5]]], dtype=float) +strthd = np.array([[[0.01, 0.01], [0.51, 0.51]]], dtype=float) + +# Model units +length_units = "meters" +time_units = "days" + +# Table MODFLOW 6 GWE comparison to MT3DMS + +delr = 1.0 # Column width ($m$) +delc = 1.0 # Row width ($m$) +k11 = 1.0e3 # Horizontal hydraulic conductivity ($m/d$) +vks = 0.01 # vertical hydraulic conductivity of the unsaturated zone +ss = 1e-6 # Specific storage +sy = 0.30 # Specific Yield +prsity = 0.20 # Porosity +nper = 2 # Number of periods +perlen = [1, 1] # Simulation time ($days$) +nstp = [1, 1] # 10 day transient time steps +ttsmult = 1.0 +steady = {0: False} +transient = {0: True} + +# Set some static model parameter values + +k33 = k11 # Vertical hydraulic conductivity ($m/d$) +idomain = 1 # All cells included in the simulation +iconvert = 1 # All cells are convertible + +icelltype = 1 # Cell conversion type (>1: unconfined) + +chdlist = [] +chdlist.append([(0, 0, 0), 0.51]) +chdlist.append([(0, 0, 1), 0.51]) + +# Set some static transport related model parameter values +strt_conc = 10.0 +strt_uz_conc = 1.0 +dispersivity = 0.0 + +# UZF related parameters +thtr = 0.05 # Residual water content +thts = sy # Saturated water content +thti = 0.05 # Initial water content (unsaturated zone) +eps = 7.1 # Brooks-Corey epsilon + +# GWT related parameters +al = 0.0 # Longitudinal dispersivity ($m$) +rhob = 1.5 # Bulk density of layer 1 ($g/cm^3$) +Kd = 0.176 # Distribution coefficient ($cm^3/g$) + +# UZF/UZT related input +surfdep = 1.0e-5 +finf1 = 1.01 +finf2 = 2.01 +pet = 0.0 +extdp = 0.5 + +uzf_pkdat = [ + [0, (0, 1, 0), 1, -1, surfdep, vks, thtr, thts, thti, eps], + [1, (0, 1, 1), 1, -1, surfdep, vks, thtr, thts, thti, eps], +] +uzf_spd = { + 0: [ + [0, finf1, pet, extdp, thtr, 0.0, 0.0, 0.0], + [1, finf1, pet, extdp, thtr, 0.0, 0.0, 0.0], + ], + 1: [ + [0, finf2, pet, extdp, thtr, 0.0, 0.0, 0.0], + [1, finf2, pet, extdp, thtr, 0.0, 0.0, 0.0], + ], +} +concCell = [] +concCell.append(11.1) +concCell.append(22.2) +uzt_pkdat = [(0, strt_uz_conc), (1, strt_uz_conc)] # ifno, strt_conc +uzt_perdat = [ + (0, "INFILTRATION", concCell[0]), + (1, "INFILTRATION", concCell[1]), +] + +# SFR/SFT related input +conn_dat = [[0, -1], [1, 0]] +sfr_pkdat = [] +nreaches = 2 +rlen = 1.0 +rwid = 1.0 +roughness = 0.03 +rbth = 0.1 +rhk = 0.0 +slope = 0.001 +ustrf = 1.0 +ndv = 0 +# reach 1 +rp = [ + 0, + (0, 0, 0), + rlen, + rwid, + slope, + top[0, 0, 0], + rbth, + rhk, + roughness, + 1, + ustrf, + 0, +] +sfr_pkdat.append(rp) +# reach 2 +rp = [ + 1, + (0, 0, 1), + rlen, + rwid, + slope, + top[0, 0, 1], + rbth, + rhk, + roughness, + 1, + ustrf, + 0, +] +sfr_pkdat.append(rp) + +sfr_perdat = {0: [0, "INFLOW", 1.0]} +sft_pkdat = [[0, 0.0], [1, 0.0]] +sft_perdat = { + 0: [[0, "STATUS", "ACTIVE"], [0, "INFLOW", 0.0]], + 1: [[0, "STATUS", "ACTIVE"], [0, "INFLOW", 1.0]], +} + +# MVR input +mvr_pkdat = [] +mvr_pkdat.append(["UZF-1", 0, "SFR-1", 0, "FACTOR", 1.0]) +mvr_pkdat.append(["UZF-1", 1, "SFR-1", 1, "FACTOR", 1.0]) +mvr_packages = [ + ("UZF-1",), + ("SFR-1",), + # ("DRN-1",), +] + +# Set solver parameter values (and related) +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-10, 1e-10, 1.0 + +# Set up temporal data used by TDIS file +tdis_rc = [] +for i in np.arange(nper): + tdis_rc.append((perlen[i], nstp[i], ttsmult)) + +# ### Create MODFLOW 6 GWT +# +# No GWF, only Heat conduction simulated + + +def build_models(idx, test): + + # Base MF6 GWF model type + ws = test.workspace + name = cases[idx] + + print("Building MF6 model...()".format(name)) + + # generate names for each model + gwfname = "gwf-" + name + gwtname = "gwt-" + name + + sim = flopy.mf6.MFSimulation( + sim_name=name, sim_ws=ws, exe_name="mf6", version="mf6" + ) + + # Instantiating MODFLOW 6 time discretization + flopy.mf6.ModflowTdis( + sim, nper=nper, perioddata=tdis_rc, time_units=time_units + ) + + # Instantiating MODFLOW 6 groundwater flow model + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=gwfname, + save_flows=True, + model_nam_file="{}.nam".format(gwfname), + ) + + # Instantiating MODFLOW 6 solver for flow model + imsgwf = 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, + filename="{}.ims".format(gwfname), + ) + sim.register_ims_package(imsgwf, [gwfname]) + + # Instantiating MODFLOW 6 discretization package + flopy.mf6.ModflowGwfdis( + gwf, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=bot, + idomain=1, + pname="DIS-1", + filename="{}.dis".format(gwfname), + ) + + # Instantiating MODFLOW 6 storage package + # flopy.mf6.ModflowGwfsto( + # gwf, + # ss=ss, + # sy=sy, + # iconvert=iconvert, + # steady_state=steady, + # transient=transient, + # pname="STO", + # filename="{}.sto".format(gwfname), + # ) + + # CHD + flopy.mf6.ModflowGwfchd( + gwf, + stress_period_data=chdlist, + pname="CHD", + filename="{}.chd".format(gwfname), + ) + + # Instantiating MODFLOW 6 node-property flow package + flopy.mf6.ModflowGwfnpf( + gwf, + save_flows=True, + icelltype=icelltype, + k=k11, + k33=k33, + save_specific_discharge=True, + pname="NPF-1", + filename="{}.npf".format(gwfname), + ) + + flopy.mf6.ModflowGwfsto( + gwf, + ss=ss, + sy=sy, + transient={0: True}, + pname="STO", + filename="{}.sto".format(gwfname), + ) + + # Instantiating MODFLOW 6 initial conditions package for flow model + flopy.mf6.ModflowGwfic( + gwf, + strt=strthd, + filename="{}.ic".format(gwfname), + ) + + # UZF + flopy.mf6.ModflowGwfuzf( + gwf, + mover=True, + print_input=True, + print_flows=True, + save_flows=True, + boundnames=False, + simulate_et=False, + unsat_etwc=False, + ntrailwaves=15, + nwavesets=40, + nuzfcells=len(uzf_pkdat), + packagedata=uzf_pkdat, + perioddata=uzf_spd, + budget_filerecord=f"{gwfname}.uzf.bud", + pname="UZF-1", + filename=f"{gwfname}.uzf", + ) + + # SFR + flopy.mf6.ModflowGwfsfr( + gwf, + save_flows=True, + print_stage=True, + print_flows=True, + print_input=True, + length_conversion=1.0, + time_conversion=86400.0, + budget_filerecord=f"{gwfname}.sfr.bud", + mover=True, + nreaches=nreaches, + packagedata=sfr_pkdat, + connectiondata=conn_dat, + perioddata=sfr_perdat, + pname="SFR-1", + filename="{}.sfr".format(gwfname), + ) + + # MVR + flopy.mf6.ModflowGwfmvr( + gwf, + maxmvr=len(mvr_pkdat), + budget_filerecord=f"{gwfname}.mvr.bud", + maxpackages=len(mvr_packages), + print_flows=True, + packages=mvr_packages, + perioddata=mvr_pkdat, + ) + + # Instantiating MODFLOW 6 output control package for flow model + flopy.mf6.ModflowGwfoc( + gwf, + pname="OC-1", + head_filerecord="{}.hds".format(gwfname), + budget_filerecord="{}.cbc".format(gwfname), + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + printrecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + ) + + # ---------------------------------------------------- + # Instantiating MODFLOW 6 GWT model + # ---------------------------------------------------- + gwt = flopy.mf6.ModflowGwt( + sim, modelname=gwtname, model_nam_file="{}.nam".format(gwtname) + ) + gwt.name_file.save_flows = True + imsgwt = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwtname), + ) + sim.register_ims_package(imsgwt, [gwt.name]) + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwtdis( + gwt, + nogrb=True, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=bot, + idomain=1, + pname="DIS-1", + filename="{}.dis".format(gwtname), + ) + + # Instantiating MODFLOW 6 transport initial concentrations + flopy.mf6.ModflowGwtic( + gwt, strt=strt_conc, pname="IC-1", filename="{}.ic".format(gwtname) + ) + + # Instantiating MODFLOW 6 transport advection package + flopy.mf6.ModflowGwtadv( + gwt, scheme=scheme, pname="ADV-2", filename="{}.adv".format(gwtname) + ) + + # Instantiating MODFLOW 6 transport dispersion package + flopy.mf6.ModflowGwtdsp( + gwt, + xt3d_off=True, + alh=dispersivity, + alv=dispersivity, + ath1=dispersivity, + atv=dispersivity, + pname="CND-1", + filename="{}.cnd".format(gwtname), + ) + + # Instantiating MODFLOW 6 transport mass storage package (formerly "reaction" package in MT3DMS) + flopy.mf6.ModflowGwtmst( + gwt, + save_flows=True, + porosity=prsity, + sorption="linear", + bulk_density=rhob, + distcoef=Kd, + pname="MST-1", + filename="{}.mst".format(gwtname), + ) + + flopy.mf6.modflow.ModflowGwtuzt( + gwt, + boundnames=False, + save_flows=True, + print_input=True, + print_flows=True, + print_concentration=True, + concentration_filerecord=gwtname + ".uzt.bin", + budget_filerecord=gwtname + ".uzt.bud", + packagedata=uzt_pkdat, + uztperioddata=uzt_perdat, + flow_package_name="UZF-1", + pname="UZT-1", + filename="{}.uzt".format(gwtname), + ) + + flopy.mf6.modflow.ModflowGwtsft( + gwt, + boundnames=False, + flow_package_name="SFR-1", + print_concentration=True, + save_flows=True, + print_flows=True, + concentration_filerecord=gwtname + ".sft.bin", + budget_filerecord=gwtname + ".sft.bud", + packagedata=sft_pkdat, + reachperioddata=sft_perdat, + pname="SFT-1", + filename="{}.sft".format(gwtname), + ) + + flopy.mf6.modflow.ModflowGwtmvt( + gwt, + save_flows=True, + budget_filerecord=gwtname + ".mvt.bud", + filename="{}.mvt".format(gwtname), + ) + + # Instantiate MODFLOW 6 heat transport output control package + flopy.mf6.ModflowGwtoc( + gwt, + pname="OC-2", + budget_filerecord="{}.cbc".format(gwtname), + concentration_filerecord="{}.ucn".format(gwtname), + concentrationprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("CONCENTRATION", "ALL"), ("BUDGET", "ALL")], + printrecord=[("CONCENTRATION", "ALL"), ("BUDGET", "ALL")], + ) + + sourcerecarray = [[]] + flopy.mf6.ModflowGwessm( + gwt, sources=sourcerecarray, filename="{}.ssm".format(gwtname) + ) + + # Instantiating MODFLOW 6 flow-transport exchange mechanism + flopy.mf6.ModflowGwfgwt( + sim, + exgtype="GWF6-GWT6", + exgmnamea=gwfname, + exgmnameb=gwtname, + pname="GWFGWT", + filename="{}.gwfgwt".format(gwtname), + ) + + return sim, None + + +def check_output(idx, test): + print("evaluating results...") + + # read transport results from GWE model + name = cases[idx] + gwfname = "gwf-" + name + gwtname = "gwt-" + name + + # overland flow + fpth = os.path.join(test.workspace, f"{gwfname}.mvr.bud") + + try: + # load mover flows + fobj = flopy.utils.CellBudgetFile(fpth, precision="double") + txtnames = fobj.get_unique_record_names() + times = fobj.get_times() + mvrdat = {} + for tm in times: + for txtname in txtnames: + # "MOVER-FLOW" should be the only text name + flowX = fobj.get_data(totim=tm, text=txtname) + mvrdat.update({tm: flowX}) + except: + assert False, f'could not load flow data from "{fpth}"' + + fpth = os.path.join(test.workspace, f"{gwtname}.mvt.bud") + try: + # load transport mover results + mobj = flopy.utils.CellBudgetFile(fpth, precision="double") + txtnames = mobj.get_unique_record_names() + times = fobj.get_times() + mvtdat = {} + for tm in times: + for txtname in txtnames: + massX = mobj.get_data(totim=tm, text=txtname) + mvtdat.update({tm: massX}) + except: + assert False, f'could not load transport data from "{fpth}"' + + # Mover amounts are representative of rejected infiltration only + # (there are no other MVR connections established). A known amount of + # water will be transferred based on the infiltration and VKS: 1 unit + # of water in stress period 1 and 2 units in the 2nd stress period + msg0 = "Rejected infiltration transfer amount not as expected" + for x in np.arange(len(mvrdat)): + for y in np.arange(len(mvrdat[x + 1])): + if len(mvrdat[x + 1][y]) == 0: + continue + else: + for z in np.arange(len(mvrdat[x + 1][y])): + assert np.isclose( + abs(mvrdat[x + 1][y][z][-1]), x + 1.0 + ), msg0 + + # Transport mover (MVT) amounts are known quantities + msg1 = "Rejected infiltration transfer mass amount not as expected" + for x in np.arange(len(mvtdat)): + for y in np.arange(len(mvtdat[x + 1])): + if len(mvtdat[x + 1][y]) == 0: + continue + else: + for z in np.arange(len(mvtdat[x + 1][y])): + assert np.isclose( + mvtdat[x + 1][y][z][-1], (x + 1.0) * concCell[z] + ), msg1 + + # Stream mass flows should be known + fpth = os.path.join(test.workspace, f"{gwtname}.sft.bud") + try: + # load mover flows + sfrobj = flopy.utils.CellBudgetFile(fpth, precision="double") + txtnames = sfrobj.get_unique_record_names() + txtnames = [nm.decode("utf-8").strip() for nm in txtnames] + times = sfrobj.get_times() + JAdat = {} + fromMvrDat = {} + for tm in times: + for txtname in txtnames: + if txtname == "FLOW-JA-FACE": + dat = sfrobj.get_data(totim=tm, text=txtname) + JAdat.update({tm: dat}) + if txtname == "FROM-MVR": + dat = sfrobj.get_data(totim=tm, text=txtname) + fromMvrDat.update({tm: dat}) + + except: + assert False, f'could not load flow data from "{fpth}"' + + msg2 = "Mass received by SFR ('FROM-MVR') not as expected" + for x in np.arange(len(fromMvrDat)): + for y in np.arange(len(fromMvrDat[x + 1][0])): + if fromMvrDat[x + 1][0][y][-1] == concCell[y]: + continue + else: + for z in np.arange(len(mvtdat[x + 1][y])): + assert np.isclose( + mvtdat[x + 1][y][z][-1], (x + 1.0) * concCell[z] + ), msg2 + + +# - No need to change any code below +@pytest.mark.parametrize( + "idx, name", + list(enumerate(cases)), +) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index 4fd7e1b877d..b35e255a65b 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -42,7 +42,7 @@ \underline{ADVANCED STRESS PACKAGES} \begin{itemize} \item A divide by zero error would occur in the Streamflow Routing package when reaches were deactivated during a simulation. This bug was fixed by checking if the downstream reach is inactive before calculating the flow to the downstream reach. - % \item xxx + \item When using the mover transport (MVT) package with UZF and UZT, rejected infiltration was paired with the calculated concentration of the UZF object rather than the user-specified concentration assigned to the infiltration. This bug was fixed by instead pairing the rejected infiltration transferred by the MVR and MVT packages with the user-specified concentration assigned in UZTSETTING with the keyword ``INFILTRATION.'' With this change, MODFLOW 6 simulations that use UZF with the ``SIMULATE\_GWSEEP'' option will not transfer this particular source of water with the correct concentration. Instead, the DRN package should be used to simulate groundwater discharge to land surface. By simulating groundwater discharge to land surface with the DRN package and rejected infiltration with the UZF package, the correct concentrations will be assigned to the water transferred by the MVR package. % \item xxx \end{itemize} diff --git a/src/Model/GroundWaterEnergy/gwe-uze.f90 b/src/Model/GroundWaterEnergy/gwe-uze.f90 index 64231abc2ff..a1d2e4c9d13 100644 --- a/src/Model/GroundWaterEnergy/gwe-uze.f90 +++ b/src/Model/GroundWaterEnergy/gwe-uze.f90 @@ -81,6 +81,7 @@ module GweUzeModule procedure :: pak_set_stressperiod => uze_set_stressperiod procedure :: bnd_ac => uze_ac procedure :: bnd_mc => uze_mc + procedure :: get_mvr_depvar end type GweUzeType @@ -649,6 +650,20 @@ function uze_get_nbudterms(this) result(nbudterms) return end function uze_get_nbudterms + !> @brief Override similarly named function in APT + !! + !! Set the temperature to be used by MVE as the user-specified + !! temperature applied to the infiltration + !< + function get_mvr_depvar(this) + ! -- dummy + class(GweUzeType) :: this + ! -- return + real(dp), dimension(:), contiguous, pointer :: get_mvr_depvar + ! + get_mvr_depvar => this%tempinfl + end function get_mvr_depvar + !> @brief Setup budget object !! !! Set up the budget object that stores all the unsaturated-zone diff --git a/src/Model/GroundWaterTransport/gwt-uzt.f90 b/src/Model/GroundWaterTransport/gwt-uzt.f90 index bd67facdf71..9229dd016c2 100644 --- a/src/Model/GroundWaterTransport/gwt-uzt.f90 +++ b/src/Model/GroundWaterTransport/gwt-uzt.f90 @@ -72,6 +72,7 @@ module GwtUztModule procedure :: pak_rp_obs => uzt_rp_obs procedure :: pak_bd_obs => uzt_bd_obs procedure :: pak_set_stressperiod => uzt_set_stressperiod + procedure :: get_mvr_depvar end type GwtUztType @@ -391,6 +392,20 @@ function uzt_get_nbudterms(this) result(nbudterms) return end function uzt_get_nbudterms + !> @brief Override similarly named function in APT + !! + !! Set the concentration to be used by MVT as the user-specified + !! concentration applied to the infiltration + !< + function get_mvr_depvar(this) + ! -- dummy + class(GwtUztType) :: this + ! -- return + real(dp), dimension(:), contiguous, pointer :: get_mvr_depvar + ! + get_mvr_depvar => this%concinfl + end function get_mvr_depvar + !> @brief Set up the budget object that stores all the unsaturated-zone flows !< subroutine uzt_setup_budobj(this, idx) diff --git a/src/Model/TransportModel/tsp-apt.f90 b/src/Model/TransportModel/tsp-apt.f90 index 47fa4611c35..14d7280a14a 100644 --- a/src/Model/TransportModel/tsp-apt.f90 +++ b/src/Model/TransportModel/tsp-apt.f90 @@ -182,6 +182,7 @@ module TspAptModule procedure, public :: apt_fjf_term ! Made public for uze procedure, private :: apt_copy2flowp procedure, private :: apt_setup_tableobj + procedure, public :: get_mvr_depvar end type TspAptType @@ -335,7 +336,7 @@ subroutine apt_ar(this) ! SSM would handle the flows into GWT from this pack. Then point the ! fmi data for an advanced package to xnewpak and qmfrommvr this%fmi%iatp(this%igwfaptpak) = 1 - this%fmi%datp(this%igwfaptpak)%concpack => this%xnewpak + this%fmi%datp(this%igwfaptpak)%concpack => this%get_mvr_depvar() this%fmi%datp(this%igwfaptpak)%qmfrommvr => this%qmfrommvr ! ! -- If there is an associated flow package and the user wishes to put @@ -624,7 +625,6 @@ function apt_check_valid(this, itemno) result(ierr) ! -- dummy class(TspAptType), intent(inout) :: this integer(I4B), intent(in) :: itemno - ! -- local ! -- formats ierr = 0 if (itemno < 1 .or. itemno > this%ncv) then @@ -635,6 +635,19 @@ function apt_check_valid(this, itemno) result(ierr) end if end function apt_check_valid + !> @brief Advanced package transport utility function + !! + !! Set the concentration (or temperature) to be used by either MVT or MVE + !< + function get_mvr_depvar(this) + ! -- dummy + class(TspAptType) :: this + ! -- return + real(dp), dimension(:), contiguous, pointer :: get_mvr_depvar + ! + get_mvr_depvar => this%xnewpak + end function get_mvr_depvar + !> @brief Advanced package transport routine !! !! Add package connections to matrix From 4a08efc93573bf12e7ca9d867ab7c4595596f895 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 12 Apr 2024 12:27:28 -0400 Subject: [PATCH 098/199] test(distribution): use no_parallel marker for dist tests, update pixi.lock (#1724) * use no_parallel marker in distribution tests * upgrade modflow-devtools and flopy for pixi --- distribution/build_dist.py | 6 +- distribution/build_docs.py | 9 +- distribution/build_makefiles.py | 8 +- distribution/check_dist.py | 9 + distribution/update_version.py | 4 + pixi.lock | 316 ++++++++++++++++---------------- 6 files changed, 194 insertions(+), 158 deletions(-) diff --git a/distribution/build_dist.py b/distribution/build_dist.py index 3014ebbc381..759691333c3 100644 --- a/distribution/build_dist.py +++ b/distribution/build_dist.py @@ -11,7 +11,7 @@ import pytest from modflow_devtools.build import meson_build from modflow_devtools.download import download_and_unzip, get_release -from modflow_devtools.markers import requires_exe +from modflow_devtools.markers import no_parallel, requires_exe from modflow_devtools.misc import get_model_paths from build_docs import build_documentation @@ -84,6 +84,7 @@ def copy_sources(output_path: PathLike): copytree(src_path, dst_path, ignore=ignore_patterns(*ignored)) +@no_parallel def test_copy_sources(tmp_path): copy_sources(tmp_path) @@ -202,6 +203,7 @@ def build_programs_meson( print(f"Execute permission set for {target}") +@no_parallel def test_build_programs_meson(tmp_path): build_programs_meson(tmp_path / "builddir", tmp_path / "bin") @@ -245,6 +247,7 @@ def build_makefiles(output_path: PathLike): ) +@no_parallel def test_build_makefiles(tmp_path): build_makefiles(tmp_path) @@ -307,6 +310,7 @@ def build_distribution( ) +@no_parallel @requires_exe("pdflatex") @pytest.mark.skip(reason="manual testing") @pytest.mark.parametrize("full", [True, False]) diff --git a/distribution/build_docs.py b/distribution/build_docs.py index 0135753816c..991329a2848 100644 --- a/distribution/build_docs.py +++ b/distribution/build_docs.py @@ -22,7 +22,7 @@ get_release, list_artifacts, ) -from modflow_devtools.markers import requires_exe, requires_github +from modflow_devtools.markers import no_parallel, requires_exe, requires_github from modflow_devtools.misc import is_in_ci, run_cmd, set_dir from benchmark import run_benchmarks @@ -141,6 +141,7 @@ def github_user() -> Optional[str]: @flaky +@no_parallel @requires_github def test_download_benchmarks(tmp_path, github_user): path = download_benchmarks( @@ -189,6 +190,7 @@ def build_benchmark_tex( @flaky +@no_parallel @requires_github def test_build_benchmark_tex(tmp_path): benchmarks_path = _benchmarks_dir_path / "run-time-comparison.md" @@ -266,6 +268,7 @@ def files_match(tex_path, dfn_path, ignored): assert files_match(tex_pth, dfn_pth, ignored) +@no_parallel @pytest.mark.parametrize("overwrite", [True, False]) def test_build_mf6io_tex_from_dfn(overwrite): mf6ivar_path = _project_root_path / "doc" / "mf6io" / "mf6ivar" @@ -311,6 +314,7 @@ def build_tex_folder_structure(overwrite: bool = False): assert path.is_file(), f"Failed to create {path}" +@no_parallel def test_build_tex_folder_structure(): path = _project_root_path / "doc" / "ReleaseNotes" / "folder_struct.tex" try: @@ -384,6 +388,7 @@ def build_mf6io_tex_example( f.write("}\n") +@no_parallel @pytest.mark.skip(reason="todo") def test_build_mf6io_tex_example(): pass @@ -439,6 +444,7 @@ def build_pdfs_from_tex( built_paths.add(tgt_path) +@no_parallel @requires_exe("pdflatex") def test_build_pdfs_from_tex(tmp_path): tex_paths = [ @@ -540,6 +546,7 @@ def build_documentation( assert (output_path / "mf6examples.pdf").is_file() +@no_parallel @requires_exe("pdflatex") # skip if in CI so we don't have to build/process example models, # example model docs can be tested in the modflow6-examples repo diff --git a/distribution/build_makefiles.py b/distribution/build_makefiles.py index e9fb09645db..0bf6a23dc25 100644 --- a/distribution/build_makefiles.py +++ b/distribution/build_makefiles.py @@ -6,7 +6,7 @@ import pymake import pytest from flaky import flaky -from modflow_devtools.markers import requires_exe +from modflow_devtools.markers import no_parallel, requires_exe from modflow_devtools.misc import set_dir from utils import get_modified_time, get_project_root_path @@ -104,6 +104,7 @@ def build_mf5to6_makefile(): @flaky +@no_parallel @pytest.mark.skipif(FC == "ifort", reason=_fc_reason) def test_build_mf6_makefile(): makefile_paths = [ @@ -124,6 +125,7 @@ def test_build_mf6_makefile(): @flaky +@no_parallel @pytest.mark.skipif(FC == "ifort", reason=_fc_reason) def test_build_zbud6_makefile(): util_path = _project_root_path / "utils" / "zonebudget" @@ -145,6 +147,7 @@ def test_build_zbud6_makefile(): @flaky +@no_parallel @pytest.mark.skipif(FC == "ifort", reason=_fc_reason) def test_build_mf5to6_makefile(): util_path = _project_root_path / "utils" / "mf5to6" @@ -166,6 +169,7 @@ def test_build_mf5to6_makefile(): @flaky +@no_parallel @requires_exe("make") @pytest.mark.skipif(FC == "ifort", reason=_fc_reason) def test_build_mf6_with_make(): @@ -185,6 +189,7 @@ def test_build_mf6_with_make(): @flaky +@no_parallel @requires_exe("make") @pytest.mark.skipif(FC == "ifort", reason=_fc_reason) def test_build_zbud6_with_make(): @@ -204,6 +209,7 @@ def test_build_zbud6_with_make(): @flaky +@no_parallel @requires_exe("make") @pytest.mark.skipif(FC == "ifort", reason=_fc_reason) def test_build_mf5to6_with_make(): diff --git a/distribution/check_dist.py b/distribution/check_dist.py index f8eab4355d6..17c0198e4e2 100644 --- a/distribution/check_dist.py +++ b/distribution/check_dist.py @@ -6,6 +6,8 @@ import pytest +from modflow_devtools.markers import no_parallel + # OS-specific extensions _system = platform.system() @@ -66,11 +68,13 @@ def skip(): return path +@no_parallel def test_directories(dist_dir_path, full): for dir_path in _included_dir_paths["full" if full else "minimal"]: assert (dist_dir_path / dir_path).is_dir() +@no_parallel def test_sources(dist_dir_path, releasemode, full): if not full: pytest.skip(reason="sources not included in minimal distribution") @@ -102,6 +106,7 @@ def test_sources(dist_dir_path, releasemode, full): assert not (dist_dir_path / "utils" / "idmloader").is_dir() +@no_parallel @pytest.mark.skipif(not _fc, reason="needs Fortran compiler") def test_makefiles(dist_dir_path, full): if not full: @@ -129,6 +134,7 @@ def test_makefiles(dist_dir_path, full): ) +@no_parallel def test_msvs(dist_dir_path, full): if not full: pytest.skip(reason="MSVS files not included in minimal distribution") @@ -140,6 +146,7 @@ def test_msvs(dist_dir_path, full): assert (dist_dir_path / "msvs" / "mf6core.vfproj").is_file() +@no_parallel def test_docs(dist_dir_path, full): # mf6io should always be included assert (dist_dir_path / "doc" / "mf6io.pdf").is_file() @@ -163,6 +170,7 @@ def test_docs(dist_dir_path, full): assert (dist_dir_path / "doc" / f"{pub}.pdf").is_file() +@no_parallel def test_examples(dist_dir_path, full): if not full: pytest.skip(reason="examples not included in minimal distribution") @@ -183,6 +191,7 @@ def test_examples(dist_dir_path, full): break +@no_parallel def test_binaries(dist_dir_path, approved): bin_path = dist_dir_path / "bin" assert (bin_path / f"mf6{_eext}").is_file() diff --git a/distribution/update_version.py b/distribution/update_version.py index 7f1cd33f8f0..dcf3c904195 100755 --- a/distribution/update_version.py +++ b/distribution/update_version.py @@ -44,6 +44,9 @@ from utils import get_modified_time +from modflow_devtools.markers import no_parallel + + project_name = "MODFLOW 6" project_root_path = Path(__file__).resolve().parent.parent version_file_path = project_root_path / "version.txt" @@ -377,6 +380,7 @@ def update_version( _current_version = Version(version_file_path.read_text().strip()) +@no_parallel @pytest.mark.skip(reason="reverts repo files on cleanup, tread carefully") @pytest.mark.parametrize( "version", diff --git a/pixi.lock b/pixi.lock index df1b0216e6a..b7f989653fb 100644 --- a/pixi.lock +++ b/pixi.lock @@ -235,8 +235,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda - - pypi: git+https://github.com/modflowpy/flopy.git@9e87acddcf0740aac491826ef86fd45ae2304dac - - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@08eff72b73da66541f7a08ddf398298210ce3758 + - pypi: git+https://github.com/modflowpy/flopy.git@99b88848b4d18c1fb0ceb8424f5e056d3406b397 + - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@1f358de2bc721c1000c3d0823b9440776432e3b0 - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 @@ -408,8 +408,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h8a1eda9_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.5-h829000d_0.conda - - pypi: git+https://github.com/modflowpy/flopy.git@9e87acddcf0740aac491826ef86fd45ae2304dac - - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@08eff72b73da66541f7a08ddf398298210ce3758 + - pypi: git+https://github.com/modflowpy/flopy.git@99b88848b4d18c1fb0ceb8424f5e056d3406b397 + - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@1f358de2bc721c1000c3d0823b9440776432e3b0 - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 @@ -581,8 +581,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-h53f4e23_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.5-h4f39d0f_0.conda - - pypi: git+https://github.com/modflowpy/flopy.git@9e87acddcf0740aac491826ef86fd45ae2304dac - - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@08eff72b73da66541f7a08ddf398298210ce3758 + - pypi: git+https://github.com/modflowpy/flopy.git@99b88848b4d18c1fb0ceb8424f5e056d3406b397 + - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@1f358de2bc721c1000c3d0823b9440776432e3b0 - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 @@ -781,8 +781,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.2.13-hcfcfb64_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.5-h12be248_0.conda - - pypi: git+https://github.com/modflowpy/flopy.git@9e87acddcf0740aac491826ef86fd45ae2304dac - - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@08eff72b73da66541f7a08ddf398298210ce3758 + - pypi: git+https://github.com/modflowpy/flopy.git@99b88848b4d18c1fb0ceb8424f5e056d3406b397 + - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@1f358de2bc721c1000c3d0823b9440776432e3b0 - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f packages: - kind: conda @@ -843,7 +843,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/appdirs@1.4.4 + - pkg:pypi/appdirs size: 12840 timestamp: 1603108499239 - kind: conda @@ -930,7 +930,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/attrs@23.2.0 + - pkg:pypi/attrs size: 54582 timestamp: 1704011393776 - kind: conda @@ -955,7 +955,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/black@24.3.0 + - pkg:pypi/black size: 296255 timestamp: 1710785014536 - kind: conda @@ -979,7 +979,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/black@24.3.0 + - pkg:pypi/black size: 296034 timestamp: 1710785156011 - kind: conda @@ -1003,7 +1003,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/black@24.3.0 + - pkg:pypi/black size: 310810 timestamp: 1710785196689 - kind: conda @@ -1027,7 +1027,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/black@24.3.0 + - pkg:pypi/black size: 295298 timestamp: 1710784875392 - kind: conda @@ -1048,7 +1048,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/bmipy@2.0.1 + - pkg:pypi/bmipy size: 14075 timestamp: 1698243713437 - kind: conda @@ -1210,7 +1210,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/brotli@1.1.0 + - pkg:pypi/brotli size: 350065 timestamp: 1695990113673 - kind: conda @@ -1231,7 +1231,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/brotli@1.1.0 + - pkg:pypi/brotli size: 367262 timestamp: 1695990623703 - kind: conda @@ -1254,7 +1254,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/brotli@1.1.0 + - pkg:pypi/brotli size: 321654 timestamp: 1695990742536 - kind: conda @@ -1276,7 +1276,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/brotli@1.1.0 + - pkg:pypi/brotli size: 344364 timestamp: 1695991093404 - kind: conda @@ -1493,7 +1493,7 @@ packages: - python >=3.7 license: ISC purls: - - pkg:pypi/certifi@2024.2.2 + - pkg:pypi/certifi size: 160559 timestamp: 1707022289175 - kind: conda @@ -1510,7 +1510,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/charset-normalizer@3.3.2 + - pkg:pypi/charset-normalizer size: 46597 timestamp: 1698833765762 - kind: conda @@ -1528,7 +1528,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/click@8.1.7 + - pkg:pypi/click size: 84437 timestamp: 1692311973840 - kind: conda @@ -1547,7 +1547,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/click@8.1.7 + - pkg:pypi/click size: 85051 timestamp: 1692312207348 - kind: conda @@ -1564,7 +1564,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/colorama@0.4.6 + - pkg:pypi/colorama size: 25170 timestamp: 1666700778190 - kind: conda @@ -1581,7 +1581,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/configargparse@1.7 + - pkg:pypi/configargparse size: 39491 timestamp: 1690138171226 - kind: conda @@ -1600,7 +1600,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/contourpy@1.2.1 + - pkg:pypi/contourpy size: 232611 timestamp: 1712430213507 - kind: conda @@ -1621,7 +1621,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/contourpy@1.2.1 + - pkg:pypi/contourpy size: 186813 timestamp: 1712430556544 - kind: conda @@ -1641,7 +1641,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/contourpy@1.2.1 + - pkg:pypi/contourpy size: 225466 timestamp: 1712430376578 - kind: conda @@ -1661,7 +1661,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/contourpy@1.2.1 + - pkg:pypi/contourpy size: 241771 timestamp: 1712430062056 - kind: conda @@ -1678,7 +1678,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/cycler@0.12.1 + - pkg:pypi/cycler size: 13458 timestamp: 1696677888423 - kind: conda @@ -1712,7 +1712,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/editables@0.5 + - pkg:pypi/editables size: 10988 timestamp: 1705857085102 - kind: conda @@ -1729,7 +1729,7 @@ packages: - python >=3.7 license: MIT and PSF-2.0 purls: - - pkg:pypi/exceptiongroup@1.2.0 + - pkg:pypi/exceptiongroup size: 20551 timestamp: 1704921321122 - kind: conda @@ -1746,7 +1746,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/execnet@2.1.1 + - pkg:pypi/execnet size: 38883 timestamp: 1712591929944 - kind: conda @@ -1819,7 +1819,7 @@ packages: - python >=3.7 license: Unlicense purls: - - pkg:pypi/filelock@3.13.4 + - pkg:pypi/filelock size: 15707 timestamp: 1712686250786 - kind: conda @@ -1836,13 +1836,13 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/flaky@3.8.1 + - pkg:pypi/flaky size: 22156 timestamp: 1710293112378 - kind: pypi name: flopy version: 3.7.0.dev0 - url: git+https://github.com/modflowpy/flopy.git@9e87acddcf0740aac491826ef86fd45ae2304dac + url: git+https://github.com/modflowpy/flopy.git@99b88848b4d18c1fb0ceb8424f5e056d3406b397 requires_dist: - numpy <2.0.0, >=1.15.0 - matplotlib >=1.4.0 @@ -2066,7 +2066,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/fonttools@4.51.0 + - pkg:pypi/fonttools size: 2182509 timestamp: 1712345020380 - kind: conda @@ -2086,7 +2086,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/fonttools@4.51.0 + - pkg:pypi/fonttools size: 2200498 timestamp: 1712344949132 - kind: conda @@ -2109,7 +2109,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/fonttools@4.51.0 + - pkg:pypi/fonttools size: 1888597 timestamp: 1712345179196 - kind: conda @@ -2130,7 +2130,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/fonttools@4.51.0 + - pkg:pypi/fonttools size: 2291843 timestamp: 1712344796788 - kind: conda @@ -2147,7 +2147,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/fortran-language-server@1.12.0 + - pkg:pypi/fortran-language-server size: 62350 timestamp: 1637570882364 - kind: conda @@ -2165,7 +2165,7 @@ packages: license: GPL-3.0-or-later license_family: GPL purls: - - pkg:pypi/fprettify@0.3.7 + - pkg:pypi/fprettify size: 137690 timestamp: 1637859635697 - kind: conda @@ -3179,7 +3179,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/hatchling@1.22.5 + - pkg:pypi/hatchling size: 62871 timestamp: 1712264371126 - kind: conda @@ -3251,7 +3251,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/idna@3.6 + - pkg:pypi/idna size: 50124 timestamp: 1701027126206 - kind: conda @@ -3269,7 +3269,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/importlib-metadata@7.1.0 + - pkg:pypi/importlib-metadata size: 27043 timestamp: 1710971498183 - kind: conda @@ -3305,7 +3305,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/importlib-resources@6.4.0 + - pkg:pypi/importlib-resources size: 33056 timestamp: 1711041009039 - kind: conda @@ -3322,7 +3322,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/iniconfig@2.0.0 + - pkg:pypi/iniconfig size: 11101 timestamp: 1673103208955 - kind: conda @@ -3353,7 +3353,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/jinja2@3.1.3 + - pkg:pypi/jinja2 size: 111589 timestamp: 1704967140287 - kind: conda @@ -3376,7 +3376,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/jsonschema@4.21.1 + - pkg:pypi/jsonschema size: 72817 timestamp: 1705707712082 - kind: conda @@ -3395,7 +3395,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/jsonschema-specifications@2023.12.1 + - pkg:pypi/jsonschema-specifications size: 16431 timestamp: 1703778502971 - kind: conda @@ -3414,7 +3414,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/jupyter-core@5.7.1 + - pkg:pypi/jupyter-core size: 80149 timestamp: 1704727554036 - kind: conda @@ -3434,7 +3434,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/jupyter-core@5.7.2 + - pkg:pypi/jupyter-core size: 79895 timestamp: 1710257881036 - kind: conda @@ -3454,7 +3454,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/jupyter-core@5.7.2 + - pkg:pypi/jupyter-core size: 96366 timestamp: 1710257842034 - kind: conda @@ -3473,7 +3473,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/jupyter-core@5.7.2 + - pkg:pypi/jupyter-core size: 79658 timestamp: 1710257600539 - kind: conda @@ -3496,7 +3496,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/jupytext@1.16.1 + - pkg:pypi/jupytext size: 102909 timestamp: 1705172248226 - kind: conda @@ -3530,7 +3530,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/kiwisolver@1.4.5 + - pkg:pypi/kiwisolver size: 55660 timestamp: 1695380433980 - kind: conda @@ -3550,7 +3550,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/kiwisolver@1.4.5 + - pkg:pypi/kiwisolver size: 73457 timestamp: 1695380118523 - kind: conda @@ -3569,7 +3569,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/kiwisolver@1.4.5 + - pkg:pypi/kiwisolver size: 60498 timestamp: 1695380322018 - kind: conda @@ -3589,7 +3589,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/kiwisolver@1.4.5 + - pkg:pypi/kiwisolver size: 62080 timestamp: 1695380521068 - kind: conda @@ -6430,7 +6430,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/markdown-it-py@3.0.0 + - pkg:pypi/markdown-it-py size: 64356 timestamp: 1686175179621 - kind: conda @@ -6450,7 +6450,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/markupsafe@2.1.5 + - pkg:pypi/markupsafe size: 23827 timestamp: 1706900341193 - kind: conda @@ -6469,7 +6469,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/markupsafe@2.1.5 + - pkg:pypi/markupsafe size: 23107 timestamp: 1706900243497 - kind: conda @@ -6491,7 +6491,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/markupsafe@2.1.5 + - pkg:pypi/markupsafe size: 26856 timestamp: 1706900665492 - kind: conda @@ -6511,7 +6511,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/markupsafe@2.1.5 + - pkg:pypi/markupsafe size: 24314 timestamp: 1706900151453 - kind: conda @@ -6613,7 +6613,7 @@ packages: license: PSF-2.0 license_family: PSF purls: - - pkg:pypi/matplotlib@3.8.4 + - pkg:pypi/matplotlib size: 6946151 timestamp: 1712606316061 - kind: conda @@ -6645,7 +6645,7 @@ packages: license: PSF-2.0 license_family: PSF purls: - - pkg:pypi/matplotlib@3.8.4 + - pkg:pypi/matplotlib size: 6942468 timestamp: 1712606780360 - kind: conda @@ -6678,7 +6678,7 @@ packages: license: PSF-2.0 license_family: PSF purls: - - pkg:pypi/matplotlib@3.8.4 + - pkg:pypi/matplotlib size: 6722721 timestamp: 1712606079317 - kind: conda @@ -6711,7 +6711,7 @@ packages: license: PSF-2.0 license_family: PSF purls: - - pkg:pypi/matplotlib@3.8.4 + - pkg:pypi/matplotlib size: 6849548 timestamp: 1712606786181 - kind: conda @@ -6729,7 +6729,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/mdit-py-plugins@0.4.0 + - pkg:pypi/mdit-py-plugins size: 41197 timestamp: 1686175527330 - kind: conda @@ -6746,7 +6746,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/mdurl@0.1.2 + - pkg:pypi/mdurl size: 14680 timestamp: 1704317789138 - kind: conda @@ -6765,7 +6765,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/meson@1.3.0 + - pkg:pypi/meson size: 628242 timestamp: 1700451735019 - kind: conda @@ -6787,7 +6787,7 @@ packages: - requests license: CC0-1.0 purls: - - pkg:pypi/mfpymake@1.2.9 + - pkg:pypi/mfpymake size: 59409 timestamp: 1707761286555 - kind: conda @@ -6809,7 +6809,7 @@ packages: - kind: pypi name: modflow-devtools version: 1.5.0.dev0 - url: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@08eff72b73da66541f7a08ddf398298210ce3758 + url: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@1f358de2bc721c1000c3d0823b9440776432e3b0 requires_dist: - sphinx ; extra == 'docs' - sphinx-rtd-theme ; extra == 'docs' @@ -6884,7 +6884,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/munkres@1.1.4 + - pkg:pypi/munkres size: 12452 timestamp: 1600387789153 - kind: conda @@ -6901,7 +6901,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/mypy-extensions@1.0.0 + - pkg:pypi/mypy-extensions size: 10492 timestamp: 1675543414256 - kind: conda @@ -6959,7 +6959,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/nbformat@5.10.4 + - pkg:pypi/nbformat size: 101232 timestamp: 1712239122969 - kind: conda @@ -7016,7 +7016,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/networkx@3.2.1 + - pkg:pypi/networkx size: 1149552 timestamp: 1698504905258 - kind: conda @@ -7132,7 +7132,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy@1.26.4 + - pkg:pypi/numpy size: 6481665 timestamp: 1707226262838 - kind: conda @@ -7156,7 +7156,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy@1.26.4 + - pkg:pypi/numpy size: 7039431 timestamp: 1707225726227 - kind: conda @@ -7180,7 +7180,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy@1.26.4 + - pkg:pypi/numpy size: 5492058 timestamp: 1707226364958 - kind: conda @@ -7205,7 +7205,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy@1.26.4 + - pkg:pypi/numpy size: 5920615 timestamp: 1707226471242 - kind: conda @@ -7365,7 +7365,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/packaging@24.0 + - pkg:pypi/packaging size: 49832 timestamp: 1710076089469 - kind: conda @@ -7387,8 +7387,9 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-3-Clause + license_family: BSD purls: - - pkg:pypi/pandas@2.2.2 + - pkg:pypi/pandas size: 11789934 timestamp: 1712783141414 - kind: conda @@ -7409,8 +7410,9 @@ packages: - python_abi 3.9.* *_cp39 - pytz >=2020.1 license: BSD-3-Clause + license_family: BSD purls: - - pkg:pypi/pandas@2.2.2 + - pkg:pypi/pandas size: 12044460 timestamp: 1712783178045 - kind: conda @@ -7430,8 +7432,9 @@ packages: - python_abi 3.9.* *_cp39 - pytz >=2020.1 license: BSD-3-Clause + license_family: BSD purls: - - pkg:pypi/pandas@2.2.2 + - pkg:pypi/pandas size: 12117482 timestamp: 1712783081291 - kind: conda @@ -7452,8 +7455,9 @@ packages: - python_abi 3.9.* *_cp39 - pytz >=2020.1 license: BSD-3-Clause + license_family: BSD purls: - - pkg:pypi/pandas@2.2.2 + - pkg:pypi/pandas size: 12972826 timestamp: 1712782503380 - kind: conda @@ -7555,7 +7559,7 @@ packages: license: MPL-2.0 license_family: MOZILLA purls: - - pkg:pypi/pathspec@0.12.1 + - pkg:pypi/pathspec size: 41173 timestamp: 1702250135032 - kind: conda @@ -7645,7 +7649,7 @@ packages: - tk >=8.6.13,<8.7.0a0 license: HPND purls: - - pkg:pypi/pillow@10.3.0 + - pkg:pypi/pillow size: 40576213 timestamp: 1712155121473 - kind: conda @@ -7671,7 +7675,7 @@ packages: - tk >=8.6.13,<8.7.0a0 license: HPND purls: - - pkg:pypi/pillow@10.3.0 + - pkg:pypi/pillow size: 42433427 timestamp: 1712154625243 - kind: conda @@ -7696,7 +7700,7 @@ packages: - tk >=8.6.13,<8.7.0a0 license: HPND purls: - - pkg:pypi/pillow@10.3.0 + - pkg:pypi/pillow size: 42224219 timestamp: 1712154790265 - kind: conda @@ -7724,7 +7728,7 @@ packages: - vc14_runtime >=14.29.30139 license: HPND purls: - - pkg:pypi/pillow@10.3.0 + - pkg:pypi/pillow size: 42541715 timestamp: 1712155039095 - kind: conda @@ -7743,7 +7747,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pip@24.0 + - pkg:pypi/pip size: 1398245 timestamp: 1706960660581 - kind: conda @@ -7819,7 +7823,7 @@ packages: - python >=3.6 license: MIT AND PSF-2.0 purls: - - pkg:pypi/pkgutil-resolve-name@1.3.10 + - pkg:pypi/pkgutil-resolve-name size: 10778 timestamp: 1694617398467 - kind: conda @@ -7836,7 +7840,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/platformdirs@4.2.0 + - pkg:pypi/platformdirs size: 20210 timestamp: 1706713564353 - kind: conda @@ -7853,7 +7857,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pluggy@1.4.0 + - pkg:pypi/pluggy size: 23384 timestamp: 1706116931972 - kind: conda @@ -7871,7 +7875,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/ply@3.11 + - pkg:pypi/ply size: 49196 timestamp: 1712243121626 - kind: conda @@ -7978,7 +7982,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/py-cpuinfo@9.0.0 + - pkg:pypi/py-cpuinfo size: 24947 timestamp: 1666774595872 - kind: conda @@ -7998,7 +8002,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pydotplus@2.0.2 + - pkg:pypi/pydotplus size: 24847 timestamp: 1622588237763 - kind: conda @@ -8015,7 +8019,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pyparsing@3.1.2 + - pkg:pypi/pyparsing size: 89455 timestamp: 1709721146886 - kind: conda @@ -8038,7 +8042,7 @@ packages: license: GPL-3.0-only license_family: GPL purls: - - pkg:pypi/pyqt5@5.15.9 + - pkg:pypi/pyqt5 size: 5227659 timestamp: 1695420723753 - kind: conda @@ -8062,7 +8066,7 @@ packages: license: GPL-3.0-only license_family: GPL purls: - - pkg:pypi/pyqt5@5.15.9 + - pkg:pypi/pyqt5 size: 3876568 timestamp: 1695421679054 - kind: conda @@ -8085,7 +8089,7 @@ packages: license: GPL-3.0-only license_family: GPL purls: - - pkg:pypi/pyqt5-sip@12.12.2 + - pkg:pypi/pyqt5-sip size: 85034 timestamp: 1695418081052 - kind: conda @@ -8109,7 +8113,7 @@ packages: license: GPL-3.0-only license_family: GPL purls: - - pkg:pypi/pyqt5-sip@12.12.2 + - pkg:pypi/pyqt5-sip size: 79633 timestamp: 1695418442270 - kind: conda @@ -8144,7 +8148,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/pysocks@1.7.1 + - pkg:pypi/pysocks size: 19348 timestamp: 1661605138291 - kind: conda @@ -8163,7 +8167,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/pysocks@1.7.1 + - pkg:pypi/pysocks size: 18981 timestamp: 1661604969727 - kind: conda @@ -8188,7 +8192,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pytest@8.1.1 + - pkg:pypi/pytest size: 255523 timestamp: 1709992719691 - kind: conda @@ -8207,7 +8211,7 @@ packages: license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/pytest-benchmark@4.0.0 + - pkg:pypi/pytest-benchmark size: 39571 timestamp: 1666782598879 - kind: conda @@ -8226,7 +8230,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pytest-dotenv@0.5.2 + - pkg:pypi/pytest-dotenv size: 7383 timestamp: 1606859705188 - kind: conda @@ -8244,7 +8248,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pytest-order@1.0.1 + - pkg:pypi/pytest-order size: 15851 timestamp: 1641771678634 - kind: conda @@ -8265,7 +8269,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pytest-xdist@3.5.0 + - pkg:pypi/pytest-xdist size: 36516 timestamp: 1700593072448 - kind: conda @@ -8384,7 +8388,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/python-dateutil@2.9.0 + - pkg:pypi/python-dateutil size: 222742 timestamp: 1709299922152 - kind: conda @@ -8401,7 +8405,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/python-dotenv@1.0.1 + - pkg:pypi/python-dotenv size: 24278 timestamp: 1706018281544 - kind: conda @@ -8418,7 +8422,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/fastjsonschema@2.19.1 + - pkg:pypi/fastjsonschema size: 225250 timestamp: 1703781171097 - kind: conda @@ -8435,7 +8439,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/tzdata@2024.1 + - pkg:pypi/tzdata size: 144024 timestamp: 1707747742930 - kind: conda @@ -8512,7 +8516,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pytz@2024.1 + - pkg:pypi/pytz size: 188538 timestamp: 1706886944988 - kind: conda @@ -8533,7 +8537,7 @@ packages: license: PSF-2.0 license_family: PSF purls: - - pkg:pypi/pywin32@306 + - pkg:pypi/pywin32 size: 5808124 timestamp: 1695974471118 - kind: conda @@ -8553,7 +8557,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pyyaml@6.0.1 + - pkg:pypi/pyyaml size: 159929 timestamp: 1695373838385 - kind: conda @@ -8575,7 +8579,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pyyaml@6.0.1 + - pkg:pypi/pyyaml size: 151118 timestamp: 1695373930963 - kind: conda @@ -8595,7 +8599,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pyyaml@6.0.1 + - pkg:pypi/pyyaml size: 178391 timestamp: 1695373606953 - kind: conda @@ -8614,7 +8618,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pyyaml@6.0.1 + - pkg:pypi/pyyaml size: 162428 timestamp: 1695373824922 - kind: conda @@ -8770,7 +8774,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/referencing@0.34.0 + - pkg:pypi/referencing size: 42071 timestamp: 1710763821612 - kind: conda @@ -8793,7 +8797,7 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/requests@2.31.0 + - pkg:pypi/requests size: 56690 timestamp: 1684774408600 - kind: conda @@ -8813,7 +8817,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/rpds-py@0.18.0 + - pkg:pypi/rpds-py size: 292859 timestamp: 1707923214688 - kind: conda @@ -8831,7 +8835,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/rpds-py@0.18.0 + - pkg:pypi/rpds-py size: 915925 timestamp: 1707923007058 - kind: conda @@ -8850,7 +8854,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/rpds-py@0.18.0 + - pkg:pypi/rpds-py size: 300083 timestamp: 1707923366326 - kind: conda @@ -8870,7 +8874,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/rpds-py@0.18.0 + - pkg:pypi/rpds-py size: 202481 timestamp: 1707923894221 - kind: conda @@ -8896,7 +8900,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/scipy@1.13.0 + - pkg:pypi/scipy size: 15767508 timestamp: 1712257544134 - kind: conda @@ -8922,7 +8926,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/scipy@1.13.0 + - pkg:pypi/scipy size: 16360934 timestamp: 1712256688151 - kind: conda @@ -8949,7 +8953,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/scipy@1.13.0 + - pkg:pypi/scipy size: 14629900 timestamp: 1712257309832 - kind: conda @@ -8974,7 +8978,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/scipy@1.13.0 + - pkg:pypi/scipy size: 14849543 timestamp: 1712257711116 - kind: conda @@ -8991,7 +8995,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/setuptools@69.2.0 + - pkg:pypi/setuptools size: 471183 timestamp: 1710344615844 - kind: conda @@ -9010,7 +9014,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/shapely@2.0.3 + - pkg:pypi/shapely size: 449167 timestamp: 1708368412520 - kind: conda @@ -9032,7 +9036,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/shapely@2.0.3 + - pkg:pypi/shapely size: 450564 timestamp: 1708368463948 - kind: conda @@ -9052,7 +9056,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/shapely@2.0.3 + - pkg:pypi/shapely size: 479182 timestamp: 1708368191201 - kind: conda @@ -9072,7 +9076,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/shapely@2.0.3 + - pkg:pypi/shapely size: 446351 timestamp: 1708368614890 - kind: conda @@ -9094,7 +9098,7 @@ packages: license: GPL-3.0-only license_family: GPL purls: - - pkg:pypi/sip@6.7.12 + - pkg:pypi/sip size: 491742 timestamp: 1697300599649 - kind: conda @@ -9117,7 +9121,7 @@ packages: license: GPL-3.0-only license_family: GPL purls: - - pkg:pypi/sip@6.7.12 + - pkg:pypi/sip size: 502390 timestamp: 1697300934198 - kind: conda @@ -9134,7 +9138,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/six@1.16.0 + - pkg:pypi/six size: 14259 timestamp: 1620240338595 - kind: conda @@ -9232,7 +9236,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/toml@0.10.2 + - pkg:pypi/toml size: 18433 timestamp: 1604308660817 - kind: conda @@ -9249,7 +9253,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/tomli@2.0.1 + - pkg:pypi/tomli size: 15940 timestamp: 1644342331069 - kind: conda @@ -9267,7 +9271,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado@6.4 + - pkg:pypi/tornado size: 641216 timestamp: 1708363746873 - kind: conda @@ -9284,7 +9288,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado@6.4 + - pkg:pypi/tornado size: 641481 timestamp: 1708363543532 - kind: conda @@ -9304,7 +9308,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado@6.4 + - pkg:pypi/tornado size: 644981 timestamp: 1708363806202 - kind: conda @@ -9322,7 +9326,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/tornado@6.4 + - pkg:pypi/tornado size: 639959 timestamp: 1708363320529 - kind: conda @@ -9339,7 +9343,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/traitlets@5.14.2 + - pkg:pypi/traitlets size: 110288 timestamp: 1710254564088 - kind: conda @@ -9355,6 +9359,8 @@ packages: - python >=3.7 license: Apache-2.0 license_family: Apache + purls: + - pkg:pypi/trove-classifiers size: 18444 timestamp: 1712814840654 - kind: conda @@ -9371,7 +9377,7 @@ packages: license: PSF-2.0 license_family: PSF purls: - - pkg:pypi/typing-extensions@4.11.0 + - pkg:pypi/typing-extensions size: 37583 timestamp: 1712330089194 - kind: conda @@ -9415,7 +9421,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/unicodedata2@15.1.0 + - pkg:pypi/unicodedata2 size: 376309 timestamp: 1695848358752 - kind: conda @@ -9435,7 +9441,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/unicodedata2@15.1.0 + - pkg:pypi/unicodedata2 size: 373257 timestamp: 1695848310896 - kind: conda @@ -9453,7 +9459,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/unicodedata2@15.1.0 + - pkg:pypi/unicodedata2 size: 373822 timestamp: 1695848128416 - kind: conda @@ -9470,7 +9476,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/unicodedata2@15.1.0 + - pkg:pypi/unicodedata2 size: 369843 timestamp: 1695848310939 - kind: conda @@ -9489,7 +9495,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/urllib3@2.2.1 + - pkg:pypi/urllib3 size: 94669 timestamp: 1708239595549 - kind: conda @@ -9556,7 +9562,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/wheel@0.43.0 + - pkg:pypi/wheel size: 57963 timestamp: 1711546009410 - kind: conda @@ -9574,7 +9580,7 @@ packages: - python >=3.6 license: PUBLIC-DOMAIN purls: - - pkg:pypi/win-inet-pton@1.1.0 + - pkg:pypi/win-inet-pton size: 8191 timestamp: 1667051294134 - kind: conda @@ -9690,7 +9696,7 @@ packages: - python >=3.8 license: CC0-1.0 purls: - - pkg:pypi/xmipy@1.3.1 + - pkg:pypi/xmipy size: 18460 timestamp: 1681486998644 - kind: conda @@ -10228,7 +10234,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/zipp@3.17.0 + - pkg:pypi/zipp size: 18954 timestamp: 1695255262261 - kind: conda From 10e3a7f724abf210f77e0857a4e10584784622af Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 12 Apr 2024 12:50:36 -0400 Subject: [PATCH 099/199] ci: add test job for arm mac with gfortran (#1721) --- .github/workflows/ci.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c5fc92ae9e6..4408aa19091 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -187,7 +187,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-22.04, macos-12, windows-2022 ] + os: [ ubuntu-22.04, macos-12, macos-14, windows-2022 ] defaults: run: shell: bash @@ -224,6 +224,15 @@ jobs: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" + - name: Set LDFLAGS (macOS) + if: matrix.os == 'macos-14' + run: | + os_ver=$(sw_vers -productVersion | cut -d'.' -f1) + if (( "$os_ver" > 12 )); then + ldflags="$LDFLAGS -Wl,-ld_classic" + echo "LDFLAGS=$ldflags" >> $GITHUB_ENV + fi + - name: Build modflow6 working-directory: modflow6 run: | From edea4f19ddec6cd4f081930d2224d970860e5a27 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Fri, 12 Apr 2024 16:15:10 -0500 Subject: [PATCH 100/199] fix(sfr): fix groundwater discharge to reach issue (#1717) * add test that evaluates groundwater discharge with reach inflow equal to zero --- .vscode/build_vscode.py | 3 +- autotest/test_gwe_sfe_strmbedcond.py | 11 +-- autotest/test_gwf_sfr_gwdischarge.py | 120 ++++++++++++++++++++++++++ doc/ReleaseNotes/develop.tex | 1 + src/Model/GroundWaterFlow/gwf-sfr.f90 | 31 +++++-- 5 files changed, 150 insertions(+), 16 deletions(-) create mode 100644 autotest/test_gwf_sfr_gwdischarge.py diff --git a/.vscode/build_vscode.py b/.vscode/build_vscode.py index d222cc7c772..208d0fdc538 100644 --- a/.vscode/build_vscode.py +++ b/.vscode/build_vscode.py @@ -1,6 +1,7 @@ import subprocess import os import argparse +import platform import shutil import shlex @@ -11,7 +12,7 @@ args = parser.parse_args() os.environ["FC"] = args.compiler -builddir = f"builddir_{args.compiler}_{args.buildtype}" +builddir = f"builddir_{platform.system()}_{args.compiler}_{args.buildtype}" arg_parallel = "-Dparallel=false" if os.getenv("BUILD_PARALLEL_MF6") is not None: diff --git a/autotest/test_gwe_sfe_strmbedcond.py b/autotest/test_gwe_sfe_strmbedcond.py index 6c9deb027e8..ce390dab2e7 100644 --- a/autotest/test_gwe_sfe_strmbedcond.py +++ b/autotest/test_gwe_sfe_strmbedcond.py @@ -1,7 +1,6 @@ # Test conduction between an advanced package feature, in this case stream # reaches with varying channel geometries and the host GWE gw cells. # This test should include: -# - no gw-sw interaction # - with gw-sw interaction # - hot gw cell warming an upstream reach # - thermally hot stream water warming host gw cells @@ -623,15 +622,9 @@ def check_output(idx, test): + str(j) + "in stress period 1 does not match explicitly-calculated answer" ) - assert np.isclose(wa, shared_area[0, j], atol=1e-4), msg - - msg = ( - "Wetted streambed area of all reaches should be zero in stess " - "period 2" - ) - for val in list(sfrstg[1])[1:]: - assert val == 0.0, msg + assert np.isclose(wa, shared_area[0, j], atol=1e-4), msg + # Sub-scenario checks # initialize search term srchStr = "SFE-1 BUDGET FOR ENTIRE MODEL AT END OF TIME STEP 1, STRESS PERIOD 1" diff --git a/autotest/test_gwf_sfr_gwdischarge.py b/autotest/test_gwf_sfr_gwdischarge.py new file mode 100644 index 00000000000..16dcf16785f --- /dev/null +++ b/autotest/test_gwf_sfr_gwdischarge.py @@ -0,0 +1,120 @@ +# Test evap in SFR reaches (no interaction with gwf) + +import math +import pathlib as pl + +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +cases = ["sfr-gwfout"] + + +def build_models(idx, test): + # Base simulation and model name and workspace + ws = test.workspace + name = cases[idx] + + length_units = "m" + time_units = "sec" + + nrow = 1 + ncol = 1 + nlay = 1 + delr = delc = 1.0 + + sim = flopy.mf6.MFSimulation( + sim_name=name, sim_ws=ws, exe_name="mf6", version="mf6" + ) + flopy.mf6.ModflowTdis(sim, time_units=time_units) + flopy.mf6.ModflowIms( + sim, + inner_dvclose=1e-5, + inner_hclose=1e-6, + ) + + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=name, + ) + flopy.mf6.ModflowGwfdis( + gwf, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=0.0, + botm=-100.0, + ) + flopy.mf6.ModflowGwfnpf( + gwf, + icelltype=1, # >0 means saturated thickness varies with computed head + ) + flopy.mf6.ModflowGwfic(gwf, strt=1.0) + flopy.mf6.ModflowGwfghb(gwf, stress_period_data=[((0, 0, 0), 1.0, 1e6)]) + + # sfr data + # + package_data = [ + (0, (0, 0, 0), delr, 1.0, 1e-3, 0.0, 1.0, 1.0, 0.001, 0, 0.0, 0) + ] + connection_data = [(0)] + + sfr_obs = { + f"{name}.sfr.obs.csv": [ + ("gwf", "sfr", (0,)), + ("outflow", "ext-outflow", (0,)), + ("depth", "depth", (0,)), + ], + "filename": name + ".sfr.obs", + } + + flopy.mf6.ModflowGwfsfr( + gwf, + save_flows=True, + print_stage=True, + print_flows=True, + print_input=True, + length_conversion=1.0, + time_conversion=1.0, + nreaches=1, + packagedata=package_data, + connectiondata=connection_data, + observations=sfr_obs, + ) + + return sim, None + + +def check_output(idx, test): + answer = np.array( + [ + 1.0, + -0.92094535738673577, + -0.92094535738673577, + 0.79053721667952215e-1, + ] + ) + obs_pth = pl.Path(f"{test.workspace}/{cases[idx]}.sfr.obs.csv") + sim_data = flopy.utils.Mf6Obs(obs_pth).get_data() + data_names = sim_data.dtype.names + for idx, name in enumerate(data_names): + assert np.allclose( + sim_data[name][0], answer[idx] + ), f"simulated sfr {name} results do not match answer" + + +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index b35e255a65b..7af8377f5cf 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -43,6 +43,7 @@ \begin{itemize} \item A divide by zero error would occur in the Streamflow Routing package when reaches were deactivated during a simulation. This bug was fixed by checking if the downstream reach is inactive before calculating the flow to the downstream reach. \item When using the mover transport (MVT) package with UZF and UZT, rejected infiltration was paired with the calculated concentration of the UZF object rather than the user-specified concentration assigned to the infiltration. This bug was fixed by instead pairing the rejected infiltration transferred by the MVR and MVT packages with the user-specified concentration assigned in UZTSETTING with the keyword ``INFILTRATION.'' With this change, MODFLOW 6 simulations that use UZF with the ``SIMULATE\_GWSEEP'' option will not transfer this particular source of water with the correct concentration. Instead, the DRN package should be used to simulate groundwater discharge to land surface. By simulating groundwater discharge to land surface with the DRN package and rejected infiltration with the UZF package, the correct concentrations will be assigned to the water transferred by the MVR package. + \item The Streamflow Routing package would not calculate groundwater discharge to a reach in cases where the groundwater head is above the top of the reach and the inflow to the reach from upstream reaches, specified inflows, rainfall, and runoff is zero. This bug has been fixed by eliminating the requirement that the conductance calculated based on the initial calculated stage is greater than zero in order to solve for groundwater . Instead, .As a result, differences in groundwater and surface-water exchange and groundwater heads in existing models may occur. % \item xxx \end{itemize} diff --git a/src/Model/GroundWaterFlow/gwf-sfr.f90 b/src/Model/GroundWaterFlow/gwf-sfr.f90 index 7c42b81742e..70f4021d499 100644 --- a/src/Model/GroundWaterFlow/gwf-sfr.f90 +++ b/src/Model/GroundWaterFlow/gwf-sfr.f90 @@ -184,6 +184,7 @@ module SfrModule procedure, private :: sfr_solve procedure, private :: sfr_update_flows procedure, private :: sfr_calc_qgwf + procedure, private :: sfr_gwf_conn procedure, private :: sfr_calc_cond procedure, private :: sfr_calc_qman procedure, private :: sfr_calc_qd @@ -3372,7 +3373,6 @@ subroutine sfr_solve(this, n, h, hcof, rhs, update) real(DP) :: tp real(DP) :: bt real(DP) :: hsfr - real(DP) :: cstr real(DP) :: qd real(DP) :: en1 real(DP) :: en2 @@ -3499,15 +3499,11 @@ subroutine sfr_solve(this, n, h, hcof, rhs, update) qd = MAX(qsrc, DZERO) qgwf = DZERO ! - ! -- calculate reach conductance for a unit depth of water - ! if equal to zero will skip iterations - call this%sfr_calc_cond(n, d1, cstr, hsfr, hgwf) - ! ! -- set flag to skip iterations isolve = 1 if (hsfr <= tp .and. hgwf <= tp) isolve = 0 if (hgwf <= tp .and. qc < DEM30) isolve = 0 - if (cstr < DEM30) isolve = 0 + if (this%sfr_gwf_conn(n) == 0) isolve = 0 if (this%iboundpak(n) < 0) isolve = 0 ! ! -- iterate to achieve solution @@ -4100,6 +4096,28 @@ subroutine sfr_calc_qgwf(this, n, depth, hgwf, qgwf, gwfhcof, gwfrhs) return end subroutine sfr_calc_qgwf + !> @brief Determine if a reach is connected to a gwf cell + !! + !! Function to determine if a reach is connected to a gwf cell. If connected, + !! the return value is 1. Otherwise, the return value is 0. + !! + !< + function sfr_gwf_conn(this, n) + ! -- return variable + integer(I4B) :: sfr_gwf_conn !< flag indicating if reach is connected to a gwf cell + ! -- dummy variables + class(SfrType) :: this !< SfrType object + integer(I4B), intent(in) :: n !< reach number + ! -- local variables + integer(I4B) :: node + + sfr_gwf_conn = 0 + node = this%igwfnode(n) + if (node > 0 .and. this%hk(n) > DZERO) then + sfr_gwf_conn = 1 + end if + end function sfr_gwf_conn + !> @brief Calculate reach-aquifer conductance !! !! Method to calculate the reach-aquifer conductance for a SFR package reach. @@ -4125,6 +4143,7 @@ subroutine sfr_calc_cond(this, n, depth, cond, hsfr, htmp) vscratio = DONE ! ! -- calculate conductance if GWF cell is active + ! rch-gwf flow will not occur if reach connected to an constant head cell node = this%igwfnode(n) if (node > 0) then if (this%ibound(node) > 0) then From b8bdf6106fdae5c290389fdfbbac30c117b03b67 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Mon, 15 Apr 2024 14:40:12 -0500 Subject: [PATCH 101/199] feat(disv2d): add DISV2D grid support for SWF overland flow (#1726) * feat(disv2d): introduce limited 2D vertex grid (for overland flow) * needs testing * add io guide docs for disv2d * msvs proj and makefile updates * remove unnecessary files --- doc/mf6io/mf6ivar/dfn/swf-disv1d.dfn | 9 + .../dfn/{swf-disv.dfn => swf-disv2d.dfn} | 53 +- .../mf6ivar/examples/swf-disv2d-example.dat | 31 + doc/mf6io/mf6ivar/md/mf6ivar.md | 41 +- doc/mf6io/mf6ivar/mf6ivar.py | 2 +- doc/mf6io/mf6ivar/tex/appendixA.tex | 10 +- doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex | 2 + doc/mf6io/mf6ivar/tex/swf-dfw-options.dat | 1 + doc/mf6io/mf6ivar/tex/swf-disl-cell2d.dat | 5 - doc/mf6io/mf6ivar/tex/swf-disv-griddata.dat | 8 - doc/mf6io/mf6ivar/tex/swf-disv1d-desc.tex | 2 + doc/mf6io/mf6ivar/tex/swf-disv1d-options.dat | 1 + ...-disv-cell2d.dat => swf-disv2d-cell2d.dat} | 0 ...{swf-disv-desc.tex => swf-disv2d-desc.tex} | 16 +- ...mensions.dat => swf-disv2d-dimensions.dat} | 3 +- doc/mf6io/mf6ivar/tex/swf-disv2d-griddata.dat | 6 + ...isv-options.dat => swf-disv2d-options.dat} | 0 ...v-vertices.dat => swf-disv2d-vertices.dat} | 0 doc/mf6io/swf/disv2d.tex | 19 + doc/mf6io/swf/namefile.tex | 1 + doc/mf6io/swf/swf.tex | 4 + make/makefile | 3 +- msvs/mf6core.vfproj | 5 +- src/Idm/selector/IdmSwfDfnSelector.f90 | 20 +- src/Idm/swf-disv1didm.f90 | 19 + .../{swf-disvidm.f90 => swf-disv2didm.f90} | 206 +-- src/Model/Discretization/Disv2d.f90 | 1387 +++++++++++++++++ src/Model/SurfaceWaterFlow/swf-cdb.f90 | 13 +- src/Model/SurfaceWaterFlow/swf-dfw.f90 | 3 + src/Model/SurfaceWaterFlow/swf.f90 | 8 +- src/Utilities/Idm/SourceCommon.f90 | 17 + .../Idm/mf6blockfile/LoadMf6File.f90 | 3 +- src/meson.build | 3 +- utils/idmloader/dfns.txt | 2 +- 34 files changed, 1666 insertions(+), 237 deletions(-) rename doc/mf6io/mf6ivar/dfn/{swf-disv.dfn => swf-disv2d.dfn} (66%) create mode 100644 doc/mf6io/mf6ivar/examples/swf-disv2d-example.dat delete mode 100644 doc/mf6io/mf6ivar/tex/swf-disl-cell2d.dat delete mode 100644 doc/mf6io/mf6ivar/tex/swf-disv-griddata.dat rename doc/mf6io/mf6ivar/tex/{swf-disv-cell2d.dat => swf-disv2d-cell2d.dat} (100%) rename doc/mf6io/mf6ivar/tex/{swf-disv-desc.tex => swf-disv2d-desc.tex} (57%) rename doc/mf6io/mf6ivar/tex/{swf-disv-dimensions.dat => swf-disv2d-dimensions.dat} (63%) create mode 100644 doc/mf6io/mf6ivar/tex/swf-disv2d-griddata.dat rename doc/mf6io/mf6ivar/tex/{swf-disv-options.dat => swf-disv2d-options.dat} (100%) rename doc/mf6io/mf6ivar/tex/{swf-disv-vertices.dat => swf-disv2d-vertices.dat} (100%) create mode 100644 doc/mf6io/swf/disv2d.tex rename src/Idm/{swf-disvidm.f90 => swf-disv2didm.f90} (70%) create mode 100644 src/Model/Discretization/Disv2d.f90 diff --git a/doc/mf6io/mf6ivar/dfn/swf-disv1d.dfn b/doc/mf6io/mf6ivar/dfn/swf-disv1d.dfn index 0ce04347669..84fcc63e939 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-disv1d.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-disv1d.dfn @@ -40,6 +40,15 @@ optional true longname rotation angle description counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + # --------------------- swf disv1d dimensions --------------------- block dimensions diff --git a/doc/mf6io/mf6ivar/dfn/swf-disv.dfn b/doc/mf6io/mf6ivar/dfn/swf-disv2d.dfn similarity index 66% rename from doc/mf6io/mf6ivar/dfn/swf-disv.dfn rename to doc/mf6io/mf6ivar/dfn/swf-disv2d.dfn index 062fb01f169..e9b41acabc4 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-disv.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-disv2d.dfn @@ -1,4 +1,4 @@ -# --------------------- gwt disv options --------------------- +# --------------------- swf disv2d options --------------------- block options name length_units @@ -21,16 +21,16 @@ name xorigin type double precision reader urword optional true -longname x-position origin of the model grid coordinate system -description x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +longname x-position of the model grid origin +description x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. block options name yorigin type double precision reader urword optional true -longname y-position origin of the model grid coordinate system -description y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +longname y-position of the model grid origin +description y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. block options name angrot @@ -38,7 +38,7 @@ type double precision reader urword optional true longname rotation angle -description counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +description counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. block options name export_array_ascii @@ -49,18 +49,10 @@ mf6internal export_ascii longname export array variables to layered ascii files. description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. -# --------------------- gwt disv dimensions --------------------- +# --------------------- swf disv2d dimensions --------------------- block dimensions -name nlay -type integer -reader urword -optional false -longname number of layers -description is the number of layers in the model grid. - -block dimensions -name ncpl +name nodes type integer reader urword optional false @@ -75,37 +67,28 @@ optional false longname number of columns description is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. -# --------------------- gwt disv griddata --------------------- +# --------------------- swf disv2d griddata --------------------- block griddata -name top +name bottom type double precision -shape (ncpl) +shape (nodes) reader readarray -longname model top elevation -description is the top elevation for each cell in the top model layer. - -block griddata -name botm -type double precision -shape (ncpl, nlay) -reader readarray -layered true +layered false longname model bottom elevation description is the bottom elevation for each cell. block griddata name idomain type integer -shape (ncpl, nlay) +shape (nodes) reader readarray -layered true +layered false optional true longname idomain existence array -description is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. - +description is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1 or greater, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. -# --------------------- gwt disv vertices --------------------- +# --------------------- swf disv2d vertices --------------------- block vertices name vertices @@ -148,12 +131,12 @@ longname y-coordinate for vertex description is the y-coordinate for the vertex. -# --------------------- gwt disv cell2d --------------------- +# --------------------- swf disv cell2d --------------------- block cell2d name cell2d type recarray icell2d xc yc ncvert icvert -shape (ncpl) +shape (nodes) reader urword optional false longname cell2d data diff --git a/doc/mf6io/mf6ivar/examples/swf-disv2d-example.dat b/doc/mf6io/mf6ivar/examples/swf-disv2d-example.dat new file mode 100644 index 00000000000..6551a59ee78 --- /dev/null +++ b/doc/mf6io/mf6ivar/examples/swf-disv2d-example.dat @@ -0,0 +1,31 @@ +BEGIN OPTIONS +END OPTIONS + +BEGIN DIMENSIONS + NODES 4 + NVERT 9 +END DIMENSIONS + +BEGIN GRIDDATA + bottom + CONSTANT 0.0 +END GRIDDATA + +BEGIN VERTICES + 1 0.0 0.0 + 2 1.0 0.0 + 3 2.0 0.0 + 4 0.0 1.0 + 5 1.0 1.0 + 6 2.0 1.0 + 7 0.0 2.0 + 8 1.0 2.0 + 9 2.0 2.0 +END VERTICES + +BEGIN CELL2D + 1 0.5 0.5 4 1 2 5 4 + 2 1.5 0.5 4 2 3 6 5 + 3 0.5 1.5 4 4 5 8 7 + 4 1.5 1.5 4 5 6 9 8 +END CELL2D \ No newline at end of file diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 4ebf683b069..afc0fb00eec 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -1532,6 +1532,7 @@ | SWF | DISV1D | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | SWF | DISV1D | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | SWF | DISV1D | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DISV1D | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | | SWF | DISV1D | DIMENSIONS | NODES | INTEGER | is the number of linear cells. | | SWF | DISV1D | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y, z) vertex pairs used to characterize the model grid. | | SWF | DISV1D | GRIDDATA | LENGTH | DOUBLE PRECISION (NODES) | length for each one-dimensional cell | @@ -1557,34 +1558,34 @@ | SWF | DIS2D | GRIDDATA | DELC | DOUBLE PRECISION (NROW) | is the row spacing in the column direction. | | SWF | DIS2D | GRIDDATA | BOTM | DOUBLE PRECISION (NCOL, NROW) | is the bottom elevation for each cell. | | SWF | DIS2D | GRIDDATA | IDOMAIN | INTEGER (NCOL, NROW) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. | -| SWF | DISV | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | -| SWF | DISV | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | -| SWF | DISV | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| SWF | DISV | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| SWF | DISV | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| SWF | DISV | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | -| SWF | DISV | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | -| SWF | DISV | DIMENSIONS | NCPL | INTEGER | is the number of cells per layer. This is a constant value for the grid and it applies to all layers. | -| SWF | DISV | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. | -| SWF | DISV | GRIDDATA | TOP | DOUBLE PRECISION (NCPL) | is the top elevation for each cell in the top model layer. | -| SWF | DISV | GRIDDATA | BOTM | DOUBLE PRECISION (NCPL, NLAY) | is the bottom elevation for each cell. | -| SWF | DISV | GRIDDATA | IDOMAIN | INTEGER (NCPL, NLAY) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. | -| SWF | DISV | VERTICES | IV | INTEGER | is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. | -| SWF | DISV | VERTICES | XV | DOUBLE PRECISION | is the x-coordinate for the vertex. | -| SWF | DISV | VERTICES | YV | DOUBLE PRECISION | is the y-coordinate for the vertex. | -| SWF | DISV | CELL2D | ICELL2D | INTEGER | is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. | -| SWF | DISV | CELL2D | XC | DOUBLE PRECISION | is the x-coordinate for the cell center. | -| SWF | DISV | CELL2D | YC | DOUBLE PRECISION | is the y-coordinate for the cell center. | -| SWF | DISV | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | -| SWF | DISV | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices. | +| SWF | DISV2D | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | +| SWF | DISV2D | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | +| SWF | DISV2D | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DISV2D | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DISV2D | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| SWF | DISV2D | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| SWF | DISV2D | DIMENSIONS | NODES | INTEGER | is the number of cells per layer. This is a constant value for the grid and it applies to all layers. | +| SWF | DISV2D | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. | +| SWF | DISV2D | GRIDDATA | BOTTOM | DOUBLE PRECISION (NODES) | is the bottom elevation for each cell. | +| SWF | DISV2D | GRIDDATA | IDOMAIN | INTEGER (NODES) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1 or greater, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. | +| SWF | DISV2D | VERTICES | IV | INTEGER | is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. | +| SWF | DISV2D | VERTICES | XV | DOUBLE PRECISION | is the x-coordinate for the vertex. | +| SWF | DISV2D | VERTICES | YV | DOUBLE PRECISION | is the y-coordinate for the vertex. | +| SWF | DISV2D | CELL2D | ICELL2D | INTEGER | is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. | +| SWF | DISV2D | CELL2D | XC | DOUBLE PRECISION | is the x-coordinate for the cell center. | +| SWF | DISV2D | CELL2D | YC | DOUBLE PRECISION | is the y-coordinate for the cell center. | +| SWF | DISV2D | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | +| SWF | DISV2D | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices. | | SWF | DFW | OPTIONS | CENTRAL_IN_SPACE | KEYWORD | keyword to indicate conductance should be calculated using central-in-space weighting instead of the default upstream weighting approach. This option should be used with caution as it does not work well unless all of the stream reaches are saturated. With this option, there is no way for water to flow into a dry reach from connected reaches. | | SWF | DFW | OPTIONS | LENGTH_CONVERSION | DOUBLE PRECISION | real value that is used to convert user-specified Manning's roughness coefficients from meters to model length units. LENGTH\_CONVERSION should be set to 3.28081, 1.0, and 100.0 when using length units (LENGTH\_UNITS) of feet, meters, or centimeters in the simulation, respectively. LENGTH\_CONVERSION does not need to be specified if LENGTH\_UNITS are meters. | | SWF | DFW | OPTIONS | TIME_CONVERSION | DOUBLE PRECISION | real value that is used to convert user-specified Manning's roughness coefficients from seconds to model time units. TIME\_CONVERSION should be set to 1.0, 60.0, 3,600.0, 86,400.0, and 31,557,600.0 when using time units (TIME\_UNITS) of seconds, minutes, hours, days, or years in the simulation, respectively. TIME\_CONVERSION does not need to be specified if TIME\_UNITS are seconds. | | SWF | DFW | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that budget flow terms will be written to the file specified with ``BUDGET SAVE FILE'' in Output Control. | | SWF | DFW | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that calculated flows between cells will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. This option can produce extremely large list files because all cell-by-cell flows are printed. It should only be used with the DFW Package for models that have a small number of cells. | +| SWF | DFW | OPTIONS | SAVE_VELOCITY | KEYWORD | keyword to indicate that x, y, and z components of velocity will be calculated at cell centers and written to the budget file, which is specified with ``BUDGET SAVE FILE'' in Output Control. If this option is activated, then additional information may be required in the discretization packages and the GWF Exchange package (if GWF models are coupled). Specifically, ANGLDEGX must be specified in the CONNECTIONDATA block of the DISU Package; ANGLDEGX must also be specified for the GWF Exchange as an auxiliary variable. | | SWF | DFW | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | | SWF | DFW | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | | SWF | DFW | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the DFW package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the DFW package. | +| SWF | DFW | OPTIONS | DEV_SWR_CONDUCTANCE | KEYWORD | use the conductance formulation in the Surface Water Routing (SWR) Process for MODFLOW-2005. | | SWF | DFW | GRIDDATA | MANNINGSN | DOUBLE PRECISION (NODES) | mannings roughness coefficient | | SWF | DFW | GRIDDATA | IDCXS | INTEGER (NODES) | integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide. | | SWF | CXS | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of stream reach information will be written to the listing file immediately after it is read. | diff --git a/doc/mf6io/mf6ivar/mf6ivar.py b/doc/mf6io/mf6ivar/mf6ivar.py index 9b7874c24b9..1d82ce971cb 100644 --- a/doc/mf6io/mf6ivar/mf6ivar.py +++ b/doc/mf6io/mf6ivar/mf6ivar.py @@ -762,7 +762,7 @@ def write_appendix(texdir, allblocks): "swf-nam", "swf-disv1d", "swf-dis2d", - "swf-disv", + "swf-disv2d", "swf-dfw", "swf-cxs", "swf-ic", diff --git a/doc/mf6io/mf6ivar/tex/appendixA.tex b/doc/mf6io/mf6ivar/tex/appendixA.tex index 4fe5ef129c3..1108af6ba01 100644 --- a/doc/mf6io/mf6ivar/tex/appendixA.tex +++ b/doc/mf6io/mf6ivar/tex/appendixA.tex @@ -332,11 +332,11 @@ SWF & DIS2D & DIMENSIONS & yes \\ SWF & DIS2D & GRIDDATA & no \\ \hline -SWF & DISV & OPTIONS & yes \\ -SWF & DISV & DIMENSIONS & yes \\ -SWF & DISV & GRIDDATA & no \\ -SWF & DISV & VERTICES & yes \\ -SWF & DISV & CELL2D & yes \\ +SWF & DISV2D & OPTIONS & yes \\ +SWF & DISV2D & DIMENSIONS & yes \\ +SWF & DISV2D & GRIDDATA & no \\ +SWF & DISV2D & VERTICES & yes \\ +SWF & DISV2D & CELL2D & yes \\ \hline SWF & DFW & OPTIONS & yes \\ SWF & DFW & GRIDDATA & no \\ diff --git a/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex b/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex index e2fe42e2e1b..24c3c05eb63 100644 --- a/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex @@ -13,6 +13,8 @@ \item \texttt{PRINT\_FLOWS}---keyword to indicate that calculated flows between cells will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. This option can produce extremely large list files because all cell-by-cell flows are printed. It should only be used with the DFW Package for models that have a small number of cells. +\item \texttt{SAVE\_VELOCITY}---keyword to indicate that x, y, and z components of velocity will be calculated at cell centers and written to the budget file, which is specified with ``BUDGET SAVE FILE'' in Output Control. If this option is activated, then additional information may be required in the discretization packages and the GWF Exchange package (if GWF models are coupled). Specifically, ANGLDEGX must be specified in the CONNECTIONDATA block of the DISU Package; ANGLDEGX must also be specified for the GWF Exchange as an auxiliary variable. + \item \texttt{OBS6}---keyword to specify that record corresponds to an observations file. \item \texttt{FILEIN}---keyword to specify that an input filename is expected next. diff --git a/doc/mf6io/mf6ivar/tex/swf-dfw-options.dat b/doc/mf6io/mf6ivar/tex/swf-dfw-options.dat index fb2a386b7c5..126bc5c9f27 100644 --- a/doc/mf6io/mf6ivar/tex/swf-dfw-options.dat +++ b/doc/mf6io/mf6ivar/tex/swf-dfw-options.dat @@ -4,5 +4,6 @@ BEGIN OPTIONS [TIME_CONVERSION ] [SAVE_FLOWS] [PRINT_FLOWS] + [SAVE_VELOCITY] [OBS6 FILEIN ] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-disl-cell2d.dat b/doc/mf6io/mf6ivar/tex/swf-disl-cell2d.dat deleted file mode 100644 index f8ad1f65f50..00000000000 --- a/doc/mf6io/mf6ivar/tex/swf-disl-cell2d.dat +++ /dev/null @@ -1,5 +0,0 @@ -BEGIN CELL2D - - - ... -END CELL2D diff --git a/doc/mf6io/mf6ivar/tex/swf-disv-griddata.dat b/doc/mf6io/mf6ivar/tex/swf-disv-griddata.dat deleted file mode 100644 index e263cb1d7bb..00000000000 --- a/doc/mf6io/mf6ivar/tex/swf-disv-griddata.dat +++ /dev/null @@ -1,8 +0,0 @@ -BEGIN GRIDDATA - TOP - -- READARRAY - BOTM [LAYERED] - -- READARRAY - [IDOMAIN [LAYERED] - -- READARRAY] -END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/swf-disv1d-desc.tex b/doc/mf6io/mf6ivar/tex/swf-disv1d-desc.tex index b89b7eeff1f..e20a304428a 100644 --- a/doc/mf6io/mf6ivar/tex/swf-disv1d-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-disv1d-desc.tex @@ -13,6 +13,8 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. + \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/swf-disv1d-options.dat b/doc/mf6io/mf6ivar/tex/swf-disv1d-options.dat index 67e3ed895ae..965538a5ef9 100644 --- a/doc/mf6io/mf6ivar/tex/swf-disv1d-options.dat +++ b/doc/mf6io/mf6ivar/tex/swf-disv1d-options.dat @@ -4,4 +4,5 @@ BEGIN OPTIONS [XORIGIN ] [YORIGIN ] [ANGROT ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-disv-cell2d.dat b/doc/mf6io/mf6ivar/tex/swf-disv2d-cell2d.dat similarity index 100% rename from doc/mf6io/mf6ivar/tex/swf-disv-cell2d.dat rename to doc/mf6io/mf6ivar/tex/swf-disv2d-cell2d.dat diff --git a/doc/mf6io/mf6ivar/tex/swf-disv-desc.tex b/doc/mf6io/mf6ivar/tex/swf-disv2d-desc.tex similarity index 57% rename from doc/mf6io/mf6ivar/tex/swf-disv-desc.tex rename to doc/mf6io/mf6ivar/tex/swf-disv2d-desc.tex index f8680fc27b7..7ccc0793f5e 100644 --- a/doc/mf6io/mf6ivar/tex/swf-disv-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-disv2d-desc.tex @@ -7,11 +7,11 @@ \item \texttt{NOGRB}---keyword to deactivate writing of the binary grid file. -\item \texttt{xorigin}---x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +\item \texttt{xorigin}---x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. -\item \texttt{yorigin}---y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +\item \texttt{yorigin}---y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. -\item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. +\item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. \item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. @@ -19,9 +19,7 @@ \item \textbf{Block: DIMENSIONS} \begin{description} -\item \texttt{nlay}---is the number of layers in the model grid. - -\item \texttt{ncpl}---is the number of cells per layer. This is a constant value for the grid and it applies to all layers. +\item \texttt{nodes}---is the number of cells per layer. This is a constant value for the grid and it applies to all layers. \item \texttt{nvert}---is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. @@ -29,11 +27,9 @@ \item \textbf{Block: GRIDDATA} \begin{description} -\item \texttt{top}---is the top elevation for each cell in the top model layer. - -\item \texttt{botm}---is the bottom elevation for each cell. +\item \texttt{bottom}---is the bottom elevation for each cell. -\item \texttt{idomain}---is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. +\item \texttt{idomain}---is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1 or greater, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. \end{description} \item \textbf{Block: VERTICES} diff --git a/doc/mf6io/mf6ivar/tex/swf-disv-dimensions.dat b/doc/mf6io/mf6ivar/tex/swf-disv2d-dimensions.dat similarity index 63% rename from doc/mf6io/mf6ivar/tex/swf-disv-dimensions.dat rename to doc/mf6io/mf6ivar/tex/swf-disv2d-dimensions.dat index b05791a77b3..b4954718a77 100644 --- a/doc/mf6io/mf6ivar/tex/swf-disv-dimensions.dat +++ b/doc/mf6io/mf6ivar/tex/swf-disv2d-dimensions.dat @@ -1,5 +1,4 @@ BEGIN DIMENSIONS - NLAY - NCPL + NODES NVERT END DIMENSIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-disv2d-griddata.dat b/doc/mf6io/mf6ivar/tex/swf-disv2d-griddata.dat new file mode 100644 index 00000000000..da1f967582c --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/swf-disv2d-griddata.dat @@ -0,0 +1,6 @@ +BEGIN GRIDDATA + BOTTOM + -- READARRAY + [IDOMAIN + -- READARRAY] +END GRIDDATA diff --git a/doc/mf6io/mf6ivar/tex/swf-disv-options.dat b/doc/mf6io/mf6ivar/tex/swf-disv2d-options.dat similarity index 100% rename from doc/mf6io/mf6ivar/tex/swf-disv-options.dat rename to doc/mf6io/mf6ivar/tex/swf-disv2d-options.dat diff --git a/doc/mf6io/mf6ivar/tex/swf-disv-vertices.dat b/doc/mf6io/mf6ivar/tex/swf-disv2d-vertices.dat similarity index 100% rename from doc/mf6io/mf6ivar/tex/swf-disv-vertices.dat rename to doc/mf6io/mf6ivar/tex/swf-disv2d-vertices.dat diff --git a/doc/mf6io/swf/disv2d.tex b/doc/mf6io/swf/disv2d.tex new file mode 100644 index 00000000000..115782fc63c --- /dev/null +++ b/doc/mf6io/swf/disv2d.tex @@ -0,0 +1,19 @@ +Input to the Discretization by Vertices in Two Dimensions (DISV2D) Package is read from the file that has type ``DISV2D6'' in the Name File. Only one discretization package (either DIS2D, DISV1D, or DISV2D) can be specified for a SWF Model. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disv2d-options.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disv2d-dimensions.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disv2d-griddata.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disv2d-vertices.dat} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/swf-disv2d-cell2d.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/swf-disv2d-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/swf-disv2d-example.dat} diff --git a/doc/mf6io/swf/namefile.tex b/doc/mf6io/swf/namefile.tex index 922e8a23b52..6bae5913123 100644 --- a/doc/mf6io/swf/namefile.tex +++ b/doc/mf6io/swf/namefile.tex @@ -24,6 +24,7 @@ \subsubsection{Explanation of Variables} \hline DISV1D6 & Discretization by Vertices in 1D Input File \\ DIS2D6 & Structured Grid Discretization Input File \\ +DISV2D6 & Discretization by Vertices in 2D Input File \\ DFW6 & Diffusive Wave Package \\ CXS6 & Cross Section Package \\ OC6 & Output Control Option \\ diff --git a/doc/mf6io/swf/swf.tex b/doc/mf6io/swf/swf.tex index 6a4be6f7dbc..c351be0e11b 100644 --- a/doc/mf6io/swf/swf.tex +++ b/doc/mf6io/swf/swf.tex @@ -22,6 +22,10 @@ \subsection{Discretization by Vertices in One Dimension (DISV1D) Package} \subsection{Structured Discretization in Two Dimensions (DIS2D) Package} \input{swf/dis2d} +\newpage +\subsection{Discretization by Vertices in Two Dimensions (DISV2D) Package} +\input{swf/disv2d} + \newpage \subsection{Diffusive Wave (DFW) Package} \input{swf/dfw} diff --git a/make/makefile b/make/makefile index cb20fed9cf0..6f75627e51a 100644 --- a/make/makefile +++ b/make/makefile @@ -107,7 +107,7 @@ $(OBJDIR)/swf-zdgidm.o \ $(OBJDIR)/swf-namidm.o \ $(OBJDIR)/swf-icidm.o \ $(OBJDIR)/swf-flwidm.o \ -$(OBJDIR)/swf-disvidm.o \ +$(OBJDIR)/swf-disv2didm.o \ $(OBJDIR)/swf-disv1didm.o \ $(OBJDIR)/swf-dis2didm.o \ $(OBJDIR)/swf-dfwidm.o \ @@ -384,6 +384,7 @@ $(OBJDIR)/swf-obs.o \ $(OBJDIR)/swf-flw.o \ $(OBJDIR)/swf-dfw.o \ $(OBJDIR)/swf-cdb.o \ +$(OBJDIR)/Disv2d.o \ $(OBJDIR)/Dis2d.o \ $(OBJDIR)/prt-prp.o \ $(OBJDIR)/prt-oc.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index c9d9046c877..9a1a862c927 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -181,7 +181,7 @@ - + @@ -207,7 +207,8 @@ - + + diff --git a/src/Idm/selector/IdmSwfDfnSelector.f90 b/src/Idm/selector/IdmSwfDfnSelector.f90 index 21b1c2b4ca7..95f32f646b8 100644 --- a/src/Idm/selector/IdmSwfDfnSelector.f90 +++ b/src/Idm/selector/IdmSwfDfnSelector.f90 @@ -8,7 +8,7 @@ module IdmSwfDfnSelectorModule use SwfNamInputModule use SwfDisv1DInputModule use SwfDis2DInputModule - use SwfDisvInputModule + use SwfDisv2DInputModule use SwfCxsInputModule use SwfDfwInputModule use SwfIcInputModule @@ -50,8 +50,8 @@ function swf_param_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, swf_disv1d_param_definitions) case ('DIS2D') call set_param_pointer(input_definition, swf_dis2d_param_definitions) - case ('DISV') - call set_param_pointer(input_definition, swf_disv_param_definitions) + case ('DISV2D') + call set_param_pointer(input_definition, swf_disv2d_param_definitions) case ('CXS') call set_param_pointer(input_definition, swf_cxs_param_definitions) case ('DFW') @@ -82,8 +82,8 @@ function swf_aggregate_definitions(subcomponent) result(input_definition) call set_param_pointer(input_definition, swf_disv1d_aggregate_definitions) case ('DIS2D') call set_param_pointer(input_definition, swf_dis2d_aggregate_definitions) - case ('DISV') - call set_param_pointer(input_definition, swf_disv_aggregate_definitions) + case ('DISV2D') + call set_param_pointer(input_definition, swf_disv2d_aggregate_definitions) case ('CXS') call set_param_pointer(input_definition, swf_cxs_aggregate_definitions) case ('DFW') @@ -114,8 +114,8 @@ function swf_block_definitions(subcomponent) result(input_definition) call set_block_pointer(input_definition, swf_disv1d_block_definitions) case ('DIS2D') call set_block_pointer(input_definition, swf_dis2d_block_definitions) - case ('DISV') - call set_block_pointer(input_definition, swf_disv_block_definitions) + case ('DISV2D') + call set_block_pointer(input_definition, swf_disv2d_block_definitions) case ('CXS') call set_block_pointer(input_definition, swf_cxs_block_definitions) case ('DFW') @@ -145,8 +145,8 @@ function swf_idm_multi_package(subcomponent) result(multi_package) multi_package = swf_disv1d_multi_package case ('DIS2D') multi_package = swf_dis2d_multi_package - case ('DISV') - multi_package = swf_disv_multi_package + case ('DISV2D') + multi_package = swf_disv2d_multi_package case ('CXS') multi_package = swf_cxs_multi_package case ('DFW') @@ -180,7 +180,7 @@ function swf_idm_integrated(subcomponent) result(integrated) integrated = .true. case ('DIS2D') integrated = .true. - case ('DISV') + case ('DISV2D') integrated = .true. case ('CXS') integrated = .true. diff --git a/src/Idm/swf-disv1didm.f90 b/src/Idm/swf-disv1didm.f90 index 4c1b963cf10..3534fe20b3c 100644 --- a/src/Idm/swf-disv1didm.f90 +++ b/src/Idm/swf-disv1didm.f90 @@ -16,6 +16,7 @@ module SwfDisv1DInputModule logical :: xorigin = .false. logical :: yorigin = .false. logical :: angrot = .false. + logical :: export_ascii = .false. logical :: nodes = .false. logical :: nvert = .false. logical :: length = .false. @@ -118,6 +119,23 @@ module SwfDisv1DInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + swfdisv1d_export_ascii = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DISV1D', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & swfdisv1d_nodes = InputParamDefinitionType & ( & @@ -347,6 +365,7 @@ module SwfDisv1DInputModule swfdisv1d_xorigin, & swfdisv1d_yorigin, & swfdisv1d_angrot, & + swfdisv1d_export_ascii, & swfdisv1d_nodes, & swfdisv1d_nvert, & swfdisv1d_length, & diff --git a/src/Idm/swf-disvidm.f90 b/src/Idm/swf-disv2didm.f90 similarity index 70% rename from src/Idm/swf-disvidm.f90 rename to src/Idm/swf-disv2didm.f90 index 0896e9b410c..d119a1866a2 100644 --- a/src/Idm/swf-disvidm.f90 +++ b/src/Idm/swf-disv2didm.f90 @@ -1,27 +1,25 @@ ! ** Do Not Modify! MODFLOW 6 system generated file. ** -module SwfDisvInputModule +module SwfDisv2DInputModule use ConstantsModule, only: LENVARNAME use InputDefinitionModule, only: InputParamDefinitionType, & InputBlockDefinitionType private - public swf_disv_param_definitions - public swf_disv_aggregate_definitions - public swf_disv_block_definitions - public SwfDisvParamFoundType - public swf_disv_multi_package + public swf_disv2d_param_definitions + public swf_disv2d_aggregate_definitions + public swf_disv2d_block_definitions + public SwfDisv2dParamFoundType + public swf_disv2d_multi_package - type SwfDisvParamFoundType + type SwfDisv2dParamFoundType logical :: length_units = .false. logical :: nogrb = .false. logical :: xorigin = .false. logical :: yorigin = .false. logical :: angrot = .false. logical :: export_ascii = .false. - logical :: nlay = .false. - logical :: ncpl = .false. + logical :: nodes = .false. logical :: nvert = .false. - logical :: top = .false. - logical :: botm = .false. + logical :: bottom = .false. logical :: idomain = .false. logical :: iv = .false. logical :: xv = .false. @@ -31,15 +29,15 @@ module SwfDisvInputModule logical :: yc = .false. logical :: ncvert = .false. logical :: icvert = .false. - end type SwfDisvParamFoundType + end type SwfDisv2dParamFoundType - logical :: swf_disv_multi_package = .false. + logical :: swf_disv2d_multi_package = .false. type(InputParamDefinitionType), parameter :: & - swfdisv_length_units = InputParamDefinitionType & + swfdisv2d_length_units = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'OPTIONS', & ! block 'LENGTH_UNITS', & ! tag name 'LENGTH_UNITS', & ! fortran variable @@ -53,10 +51,10 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_nogrb = InputParamDefinitionType & + swfdisv2d_nogrb = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'OPTIONS', & ! block 'NOGRB', & ! tag name 'NOGRB', & ! fortran variable @@ -70,10 +68,10 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_xorigin = InputParamDefinitionType & + swfdisv2d_xorigin = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'OPTIONS', & ! block 'XORIGIN', & ! tag name 'XORIGIN', & ! fortran variable @@ -87,10 +85,10 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_yorigin = InputParamDefinitionType & + swfdisv2d_yorigin = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'OPTIONS', & ! block 'YORIGIN', & ! tag name 'YORIGIN', & ! fortran variable @@ -104,10 +102,10 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_angrot = InputParamDefinitionType & + swfdisv2d_angrot = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'OPTIONS', & ! block 'ANGROT', & ! tag name 'ANGROT', & ! fortran variable @@ -121,10 +119,10 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_export_ascii = InputParamDefinitionType & + swfdisv2d_export_ascii = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'OPTIONS', & ! block 'EXPORT_ARRAY_ASCII', & ! tag name 'EXPORT_ASCII', & ! fortran variable @@ -138,13 +136,13 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_nlay = InputParamDefinitionType & + swfdisv2d_nodes = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'DIMENSIONS', & ! block - 'NLAY', & ! tag name - 'NLAY', & ! fortran variable + 'NODES', & ! tag name + 'NODES', & ! fortran variable 'INTEGER', & ! type '', & ! shape .true., & ! required @@ -155,27 +153,10 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_ncpl = InputParamDefinitionType & + swfdisv2d_nvert = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent - 'DIMENSIONS', & ! block - 'NCPL', & ! tag name - 'NCPL', & ! fortran variable - 'INTEGER', & ! type - '', & ! shape - .true., & ! required - .false., & ! multi-record - .false., & ! preserve case - .false., & ! layered - .false. & ! timeseries - ) - - type(InputParamDefinitionType), parameter :: & - swfdisv_nvert = InputParamDefinitionType & - ( & - 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'DIMENSIONS', & ! block 'NVERT', & ! tag name 'NVERT', & ! fortran variable @@ -189,15 +170,15 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_top = InputParamDefinitionType & + swfdisv2d_bottom = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'GRIDDATA', & ! block - 'TOP', & ! tag name - 'TOP', & ! fortran variable + 'BOTTOM', & ! tag name + 'BOTTOM', & ! fortran variable 'DOUBLE1D', & ! type - 'NCPL', & ! shape + 'NODES', & ! shape .true., & ! required .false., & ! multi-record .false., & ! preserve case @@ -206,44 +187,27 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_botm = InputParamDefinitionType & + swfdisv2d_idomain = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent - 'GRIDDATA', & ! block - 'BOTM', & ! tag name - 'BOTM', & ! fortran variable - 'DOUBLE2D', & ! type - 'NCPL NLAY', & ! shape - .true., & ! required - .false., & ! multi-record - .false., & ! preserve case - .true., & ! layered - .false. & ! timeseries - ) - - type(InputParamDefinitionType), parameter :: & - swfdisv_idomain = InputParamDefinitionType & - ( & - 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'GRIDDATA', & ! block 'IDOMAIN', & ! tag name 'IDOMAIN', & ! fortran variable - 'INTEGER2D', & ! type - 'NCPL NLAY', & ! shape + 'INTEGER1D', & ! type + 'NODES', & ! shape .false., & ! required .false., & ! multi-record .false., & ! preserve case - .true., & ! layered + .false., & ! layered .false. & ! timeseries ) type(InputParamDefinitionType), parameter :: & - swfdisv_iv = InputParamDefinitionType & + swfdisv2d_iv = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'VERTICES', & ! block 'IV', & ! tag name 'IV', & ! fortran variable @@ -257,10 +221,10 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_xv = InputParamDefinitionType & + swfdisv2d_xv = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'VERTICES', & ! block 'XV', & ! tag name 'XV', & ! fortran variable @@ -274,10 +238,10 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_yv = InputParamDefinitionType & + swfdisv2d_yv = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'VERTICES', & ! block 'YV', & ! tag name 'YV', & ! fortran variable @@ -291,10 +255,10 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_icell2d = InputParamDefinitionType & + swfdisv2d_icell2d = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'CELL2D', & ! block 'ICELL2D', & ! tag name 'ICELL2D', & ! fortran variable @@ -308,10 +272,10 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_xc = InputParamDefinitionType & + swfdisv2d_xc = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'CELL2D', & ! block 'XC', & ! tag name 'XC', & ! fortran variable @@ -325,10 +289,10 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_yc = InputParamDefinitionType & + swfdisv2d_yc = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'CELL2D', & ! block 'YC', & ! tag name 'YC', & ! fortran variable @@ -342,10 +306,10 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_ncvert = InputParamDefinitionType & + swfdisv2d_ncvert = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'CELL2D', & ! block 'NCVERT', & ! tag name 'NCVERT', & ! fortran variable @@ -359,10 +323,10 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_icvert = InputParamDefinitionType & + swfdisv2d_icvert = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'CELL2D', & ! block 'ICVERT', & ! tag name 'ICVERT', & ! fortran variable @@ -376,35 +340,33 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swf_disv_param_definitions(*) = & + swf_disv2d_param_definitions(*) = & [ & - swfdisv_length_units, & - swfdisv_nogrb, & - swfdisv_xorigin, & - swfdisv_yorigin, & - swfdisv_angrot, & - swfdisv_export_ascii, & - swfdisv_nlay, & - swfdisv_ncpl, & - swfdisv_nvert, & - swfdisv_top, & - swfdisv_botm, & - swfdisv_idomain, & - swfdisv_iv, & - swfdisv_xv, & - swfdisv_yv, & - swfdisv_icell2d, & - swfdisv_xc, & - swfdisv_yc, & - swfdisv_ncvert, & - swfdisv_icvert & + swfdisv2d_length_units, & + swfdisv2d_nogrb, & + swfdisv2d_xorigin, & + swfdisv2d_yorigin, & + swfdisv2d_angrot, & + swfdisv2d_export_ascii, & + swfdisv2d_nodes, & + swfdisv2d_nvert, & + swfdisv2d_bottom, & + swfdisv2d_idomain, & + swfdisv2d_iv, & + swfdisv2d_xv, & + swfdisv2d_yv, & + swfdisv2d_icell2d, & + swfdisv2d_xc, & + swfdisv2d_yc, & + swfdisv2d_ncvert, & + swfdisv2d_icvert & ] type(InputParamDefinitionType), parameter :: & - swfdisv_vertices = InputParamDefinitionType & + swfdisv2d_vertices = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'VERTICES', & ! block 'VERTICES', & ! tag name 'VERTICES', & ! fortran variable @@ -418,15 +380,15 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swfdisv_cell2d = InputParamDefinitionType & + swfdisv2d_cell2d = InputParamDefinitionType & ( & 'SWF', & ! component - 'DISV', & ! subcomponent + 'DISV2D', & ! subcomponent 'CELL2D', & ! block 'CELL2D', & ! tag name 'CELL2D', & ! fortran variable 'RECARRAY ICELL2D XC YC NCVERT ICVERT', & ! type - 'NCPL', & ! shape + 'NODES', & ! shape .true., & ! required .false., & ! multi-record .false., & ! preserve case @@ -435,14 +397,14 @@ module SwfDisvInputModule ) type(InputParamDefinitionType), parameter :: & - swf_disv_aggregate_definitions(*) = & + swf_disv2d_aggregate_definitions(*) = & [ & - swfdisv_vertices, & - swfdisv_cell2d & + swfdisv2d_vertices, & + swfdisv2d_cell2d & ] type(InputBlockDefinitionType), parameter :: & - swf_disv_block_definitions(*) = & + swf_disv2d_block_definitions(*) = & [ & InputBlockDefinitionType( & 'OPTIONS', & ! blockname @@ -476,4 +438,4 @@ module SwfDisvInputModule ) & ] -end module SwfDisvInputModule +end module SwfDisv2DInputModule diff --git a/src/Model/Discretization/Disv2d.f90 b/src/Model/Discretization/Disv2d.f90 new file mode 100644 index 00000000000..63d9490b371 --- /dev/null +++ b/src/Model/Discretization/Disv2d.f90 @@ -0,0 +1,1387 @@ +module Disv2dModule + + use ArrayReadersModule, only: ReadArray + use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: LINELENGTH, LENMEMPATH, LENVARNAME, & + DZERO, DONE, DHALF + use BaseDisModule, only: DisBaseType + use GeomUtilModule, only: get_node, get_ijk, get_jk + use InputOutputModule, only: URWORD, ulasav, & + ulaprufw, ubdsv1, ubdsv06, getunit, openfile + use SimModule, only: count_errors, store_error, store_error_unit, & + store_error_filename + use SimVariablesModule, only: errmsg, idm_context + use DisvGeom, only: DisvGeomType, line_unit_vector + use MemoryManagerModule, only: mem_allocate, mem_deallocate, mem_setptr + use MemoryManagerExtModule, only: mem_set_value, memorylist_remove + use TdisModule, only: kstp, kper, pertim, totim, delt + + implicit none + private + public disv2d_cr, Disv2dType + + !> @brief Vertex grid discretization + type, extends(DisBaseType) :: Disv2dType + integer(I4B), pointer :: nvert => null() !< number of x,y vertices + real(DP), dimension(:, :), pointer, contiguous :: vertices => null() !< cell vertices stored as 2d array of x and y + real(DP), dimension(:, :), pointer, contiguous :: cellxy => null() !< cell center stored as 2d array of x and y + integer(I4B), dimension(:), pointer, contiguous :: iavert => null() !< cell vertex pointer ia array + integer(I4B), dimension(:), pointer, contiguous :: javert => null() !< cell vertex pointer ja array + real(DP), dimension(:), pointer, contiguous :: bottom => null() !< bottom elevations for each cell (nodes) + integer(I4B), dimension(:), pointer, contiguous :: idomain => null() !< idomain (nodes) + + contains + + procedure :: dis_df => disv2d_df + procedure :: dis_da => disv2d_da + procedure :: disv2d_load + procedure :: get_dis_type => get_dis_type + procedure, public :: record_array + procedure, public :: record_srcdst_list_header + ! -- helper functions + procedure :: get_nodenumber_idx1 + procedure :: nodeu_to_string + procedure :: nodeu_to_array + procedure :: nodeu_from_string + procedure :: nodeu_from_cellid + procedure :: connection_normal + procedure :: connection_vector + procedure :: get_polyverts + ! -- private + procedure :: source_options + procedure :: source_dimensions + procedure :: source_griddata + procedure :: log_options + procedure :: log_dimensions + procedure :: log_griddata + procedure :: source_vertices + procedure :: source_cell2d + procedure :: define_cellverts + procedure :: grid_finalize + procedure :: connect + procedure :: write_grb + procedure :: allocate_scalars + procedure :: allocate_arrays + procedure :: get_cell2d_area + + end type Disv2dType + + type DisvFoundType + logical :: length_units = .false. + logical :: nogrb = .false. + logical :: xorigin = .false. + logical :: yorigin = .false. + logical :: angrot = .false. + logical :: nodes = .false. + logical :: nvert = .false. + logical :: bottom = .false. + logical :: idomain = .false. + logical :: iv = .false. + logical :: xv = .false. + logical :: yv = .false. + logical :: icell2d = .false. + logical :: xc = .false. + logical :: yc = .false. + logical :: ncvert = .false. + logical :: icvert = .false. + end type DisvFoundType + +contains + + !> @brief Create a new discretization by vertices object + !< + subroutine disv2d_cr(dis, name_model, input_mempath, inunit, iout) + ! -- dummy + class(DisBaseType), pointer :: dis + character(len=*), intent(in) :: name_model + character(len=*), intent(in) :: input_mempath + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + ! -- local + type(Disv2dType), pointer :: disnew + ! -- formats + character(len=*), parameter :: fmtheader = & + "(1X, /1X, 'DISV -- VERTEX GRID DISCRETIZATION PACKAGE,', & + &' VERSION 1 : 12/23/2015 - INPUT READ FROM MEMPATH: ', A, //)" + ! + allocate (disnew) + dis => disnew + call disnew%allocate_scalars(name_model, input_mempath) + dis%inunit = inunit + dis%iout = iout + ! + ! -- If disv enabled + if (inunit > 0) then + ! + ! -- Identify package + if (iout > 0) then + write (iout, fmtheader) dis%input_mempath + end if + ! + ! -- load disv + call disnew%disv2d_load() + end if + ! + end subroutine disv2d_cr + + !> @brief Transfer IDM data into this discretization object + !< + subroutine disv2d_load(this) + ! -- dummy + class(Disv2dType) :: this + ! + ! -- source input data + call this%source_options() + call this%source_dimensions() + call this%source_griddata() + call this%source_vertices() + call this%source_cell2d() + ! + end subroutine disv2d_load + + !> @brief Define the discretization + !< + subroutine disv2d_df(this) + ! -- dummy + class(Disv2dType) :: this + ! + call this%grid_finalize() + ! + end subroutine disv2d_df + + subroutine disv2d_da(this) + ! -- modules + use MemoryManagerModule, only: mem_deallocate + use MemoryManagerExtModule, only: memorylist_remove + use SimVariablesModule, only: idm_context + ! -- dummy + class(Disv2dType) :: this + ! -- local + + ! -- Deallocate idm memory + call memorylist_remove(this%name_model, 'DISV2D', idm_context) + + ! -- scalars + call mem_deallocate(this%nvert) + + ! -- arrays + call mem_deallocate(this%nodeuser) + call mem_deallocate(this%nodereduced) + call mem_deallocate(this%bottom) + call mem_deallocate(this%idomain) + + ! -- cdl hack for arrays for vertices and cell2d blocks + call mem_deallocate(this%vertices) + call mem_deallocate(this%cellxy) + call mem_deallocate(this%iavert) + call mem_deallocate(this%javert) + ! + ! -- DisBaseType deallocate + call this%DisBaseType%dis_da() + ! + ! -- Return + return + end subroutine disv2d_da + + ! !> @brief Deallocate variables + ! !< + ! subroutine disv2d_da(this) + ! ! -- dummy + ! class(Disv2dType) :: this + ! ! + ! ! -- Deallocate idm memory + ! call memorylist_remove(this%name_model, 'DISV', idm_context) + ! call memorylist_remove(component=this%name_model, & + ! context=idm_context) + ! ! + ! ! -- DisBaseType deallocate + ! call this%DisBaseType%dis_da() + ! ! + ! ! -- Deallocate scalars + ! call mem_deallocate(this%nvert) + ! ! + ! ! -- Deallocate Arrays + ! call mem_deallocate(this%nodereduced) + ! call mem_deallocate(this%nodeuser) + ! call mem_deallocate(this%vertices) + ! call mem_deallocate(this%cellxy) + ! call mem_deallocate(this%iavert) + ! call mem_deallocate(this%javert) + ! call mem_deallocate(this%bottom) + ! call mem_deallocate(this%idomain) + ! ! + ! end subroutine disv2d_da + + !> @brief Copy options from IDM into package + !< + subroutine source_options(this) + ! -- dummy + class(Disv2dType) :: this + ! -- locals + character(len=LENVARNAME), dimension(3) :: lenunits = & + &[character(len=LENVARNAME) :: 'FEET', 'METERS', 'CENTIMETERS'] + type(DisvFoundType) :: found + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%lenuni, 'LENGTH_UNITS', this%input_mempath, & + lenunits, found%length_units) + call mem_set_value(this%nogrb, 'NOGRB', this%input_mempath, found%nogrb) + call mem_set_value(this%xorigin, 'XORIGIN', this%input_mempath, found%xorigin) + call mem_set_value(this%yorigin, 'YORIGIN', this%input_mempath, found%yorigin) + call mem_set_value(this%angrot, 'ANGROT', this%input_mempath, found%angrot) + ! + ! -- log values to list file + if (this%iout > 0) then + call this%log_options(found) + end if + ! + end subroutine source_options + + !> @brief Write user options to list file + !< + subroutine log_options(this, found) + ! -- dummy + class(Disv2dType) :: this + type(DisvFoundType), intent(in) :: found + ! + write (this%iout, '(1x,a)') 'Setting Discretization Options' + ! + if (found%length_units) then + write (this%iout, '(4x,a,i0)') 'Model length unit [0=UND, 1=FEET, & + &2=METERS, 3=CENTIMETERS] set as ', this%lenuni + end if + ! + if (found%nogrb) then + write (this%iout, '(4x,a,i0)') 'Binary grid file [0=GRB, 1=NOGRB] & + &set as ', this%nogrb + end if + ! + if (found%xorigin) then + write (this%iout, '(4x,a,G0)') 'XORIGIN = ', this%xorigin + end if + ! + if (found%yorigin) then + write (this%iout, '(4x,a,G0)') 'YORIGIN = ', this%yorigin + end if + ! + if (found%angrot) then + write (this%iout, '(4x,a,G0)') 'ANGROT = ', this%angrot + end if + ! + write (this%iout, '(1x,a,/)') 'End Setting Discretization Options' + ! + end subroutine log_options + + !> @brief Copy dimensions from IDM into package + !< + subroutine source_dimensions(this) + ! -- dummy + class(Disv2dType) :: this + ! -- locals + integer(I4B) :: j + type(DisvFoundType) :: found + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%nodes, 'NODES', this%input_mempath, found%nodes) + call mem_set_value(this%nvert, 'NVERT', this%input_mempath, found%nvert) + ! + ! -- log simulation values + if (this%iout > 0) then + call this%log_dimensions(found) + end if + ! + ! -- verify dimensions were set + if (this%nodes < 1) then + call store_error( & + 'NODES was not specified or was specified incorrectly.') + call store_error_filename(this%input_fname) + end if + if (this%nvert < 1) then + call store_error( & + 'NVERT was not specified or was specified incorrectly.') + call store_error_filename(this%input_fname) + end if + ! + ! -- Calculate nodesuser + this%nodesuser = this%nodes + ! + ! -- Allocate non-reduced vectors for disv + call mem_allocate(this%idomain, this%nodes, 'IDOMAIN', & + this%memoryPath) + call mem_allocate(this%bottom, this%nodes, 'BOTTOM', & + this%memoryPath) + ! + ! -- Allocate vertices array + call mem_allocate(this%vertices, 2, this%nvert, 'VERTICES', this%memoryPath) + call mem_allocate(this%cellxy, 2, this%nodes, 'CELLXY', this%memoryPath) + ! + ! -- initialize all cells to be active (idomain = 1) + do j = 1, this%nodes + this%idomain(j) = 1 + end do + ! + end subroutine source_dimensions + + !> @brief Write dimensions to list file + !< + subroutine log_dimensions(this, found) + ! -- dummy + class(Disv2dType) :: this + type(DisvFoundType), intent(in) :: found + ! + write (this%iout, '(1x,a)') 'Setting Discretization Dimensions' + ! + if (found%nodes) then + write (this%iout, '(4x,a,i0)') 'NODES = ', this%nodes + end if + ! + if (found%nvert) then + write (this%iout, '(4x,a,i0)') 'NVERT = ', this%nvert + end if + ! + write (this%iout, '(1x,a,/)') 'End Setting Discretization Dimensions' + ! + end subroutine log_dimensions + + !> @brief Copy grid data from IDM into package + !< + subroutine source_griddata(this) + ! -- dummy + class(Disv2dType) :: this + ! -- locals + type(DisvFoundType) :: found + ! + ! -- update defaults with idm sourced values + call mem_set_value(this%bottom, 'BOTTOM', this%input_mempath, found%bottom) + call mem_set_value(this%idomain, 'IDOMAIN', this%input_mempath, found%idomain) + ! + ! -- log simulation values + if (this%iout > 0) then + call this%log_griddata(found) + end if + ! + end subroutine source_griddata + + !> @brief Write griddata found to list file + !< + subroutine log_griddata(this, found) + ! -- dummy + class(Disv2dType) :: this + type(DisvFoundType), intent(in) :: found + ! + write (this%iout, '(1x,a)') 'Setting Discretization Griddata' + ! + if (found%bottom) then + write (this%iout, '(4x,a)') 'BOTTOM set from input file' + end if + ! + if (found%idomain) then + write (this%iout, '(4x,a)') 'IDOMAIN set from input file' + end if + ! + write (this%iout, '(1x,a,/)') 'End Setting Discretization Griddata' + ! + end subroutine log_griddata + + !> @brief Finalize grid (check properties, allocate arrays, compute connections) + !< + subroutine grid_finalize(this) + ! -- dummy + class(Disv2dType) :: this + ! -- locals + integer(I4B) :: node, noder, j, ncell_count + ! -- formats + character(len=*), parameter :: fmtnr = & + "(/1x, 'The specified IDOMAIN results in a reduced number of cells.',& + &/1x, 'Number of user nodes: ',I0,& + &/1X, 'Number of nodes in solution: ', I0, //)" + ! + ! -- count active cells + ncell_count = 0 + do j = 1, this%nodes + if (this%idomain(j) > 0) ncell_count = ncell_count + 1 + end do + ! + ! -- Check to make sure nodes is a valid number + if (ncell_count == 0) then + call store_error('Model does not have any active nodes. & + &Ensure IDOMAIN array has some values greater & + &than zero.') + call store_error_filename(this%input_fname) + end if + + if (count_errors() > 0) then + call store_error_filename(this%input_fname) + end if + ! + ! -- Array size is now known, so allocate + call this%allocate_arrays() + ! + ! -- Fill the nodereduced array with the reduced nodenumber, or + ! a negative number to indicate it is a pass-through cell, or + ! a zero to indicate that the cell is excluded from the + ! solution. + if (this%nodes < this%nodesuser) then + node = 1 + noder = 1 + do j = 1, this%nodes + if (this%idomain(j) > 0) then + this%nodereduced(node) = noder + noder = noder + 1 + else + this%nodereduced(node) = 0 + end if + node = node + 1 + end do + end if + ! + ! -- allocate and fill nodeuser if a reduced grid + if (this%nodes < this%nodesuser) then + node = 1 + noder = 1 + do j = 1, this%nodes + if (this%idomain(j) > 0) then + this%nodeuser(noder) = node + noder = noder + 1 + end if + node = node + 1 + end do + end if + + ! Copy bottom into bot + do node = 1, this%nodesuser + this%bot(node) = this%bottom(node) + end do + + ! -- Move bottom into bot + ! and set x and y center coordinates + node = 0 + do j = 1, this%nodes + node = node + 1 + noder = node + if (this%nodes < this%nodesuser) noder = this%nodereduced(node) + if (noder <= 0) cycle + this%bot(noder) = this%bottom(j) + this%xc(noder) = this%cellxy(1, j) + this%yc(noder) = this%cellxy(2, j) + end do + ! + ! -- Build connections + call this%connect() + ! + end subroutine grid_finalize + + !> @brief Load grid vertices from IDM into package + !< + subroutine source_vertices(this) + ! -- dummy + class(Disv2dType) :: this + ! -- local + integer(I4B) :: i + real(DP), dimension(:), contiguous, pointer :: vert_x => null() + real(DP), dimension(:), contiguous, pointer :: vert_y => null() + ! + ! -- set pointers to memory manager input arrays + call mem_setptr(vert_x, 'XV', this%input_mempath) + call mem_setptr(vert_y, 'YV', this%input_mempath) + ! + ! -- set vertices 2d array + if (associated(vert_x) .and. associated(vert_y)) then + do i = 1, this%nvert + this%vertices(1, i) = vert_x(i) + this%vertices(2, i) = vert_y(i) + end do + else + call store_error('Required Vertex arrays not found.') + end if + ! + ! -- log + if (this%iout > 0) then + write (this%iout, '(1x,a)') 'Discretization Vertex data loaded' + end if + ! + end subroutine source_vertices + + !> @brief Build data structures to hold cell vertex info + !< + subroutine define_cellverts(this, icell2d, ncvert, icvert) + ! -- modules + use SparseModule, only: sparsematrix + ! -- dummy + class(Disv2dType) :: this + integer(I4B), dimension(:), contiguous, pointer, intent(in) :: icell2d + integer(I4B), dimension(:), contiguous, pointer, intent(in) :: ncvert + integer(I4B), dimension(:), contiguous, pointer, intent(in) :: icvert + ! -- locals + type(sparsematrix) :: vert_spm + integer(I4B) :: i, j, ierr + integer(I4B) :: icv_idx, startvert, maxnnz = 5 + ! + ! -- initialize sparse matrix + call vert_spm%init(this%nodes, this%nvert, maxnnz) + ! + ! -- add sparse matrix connections from input memory paths + icv_idx = 1 + do i = 1, this%nodes + if (icell2d(i) /= i) call store_error('ICELL2D input sequence violation.') + do j = 1, ncvert(i) + call vert_spm%addconnection(i, icvert(icv_idx), 0) + if (j == 1) then + startvert = icvert(icv_idx) + elseif (j == ncvert(i) .and. (icvert(icv_idx) /= startvert)) then + call vert_spm%addconnection(i, startvert, 0) + end if + icv_idx = icv_idx + 1 + end do + end do + ! + ! -- allocate and fill iavert and javert + call mem_allocate(this%iavert, this%nodes + 1, 'IAVERT', this%memoryPath) + call mem_allocate(this%javert, vert_spm%nnz, 'JAVERT', this%memoryPath) + call vert_spm%filliaja(this%iavert, this%javert, ierr) + call vert_spm%destroy() + ! + end subroutine define_cellverts + + !> @brief Copy cell2d data from IDM into package + !< + subroutine source_cell2d(this) + ! -- dummy + class(Disv2dType) :: this + ! -- locals + integer(I4B), dimension(:), contiguous, pointer :: icell2d => null() + integer(I4B), dimension(:), contiguous, pointer :: ncvert => null() + integer(I4B), dimension(:), contiguous, pointer :: icvert => null() + real(DP), dimension(:), contiguous, pointer :: cell_x => null() + real(DP), dimension(:), contiguous, pointer :: cell_y => null() + integer(I4B) :: i + ! + ! -- set pointers to input path ncvert and icvert + call mem_setptr(icell2d, 'ICELL2D', this%input_mempath) + call mem_setptr(ncvert, 'NCVERT', this%input_mempath) + call mem_setptr(icvert, 'ICVERT', this%input_mempath) + ! + ! -- + if (associated(icell2d) .and. associated(ncvert) & + .and. associated(icvert)) then + call this%define_cellverts(icell2d, ncvert, icvert) + else + call store_error('Required cell vertex array(s) [ICELL2D, NCVERT, ICVERT] & + ¬ found.') + end if + ! + ! -- copy cell center idm sourced values to local arrays + call mem_setptr(cell_x, 'XC', this%input_mempath) + call mem_setptr(cell_y, 'YC', this%input_mempath) + ! + ! -- set cell centers + if (associated(cell_x) .and. associated(cell_y)) then + do i = 1, this%nodes + this%cellxy(1, i) = cell_x(i) + this%cellxy(2, i) = cell_y(i) + end do + else + call store_error('Required cell center arrays not found.') + end if + ! + ! -- log + if (this%iout > 0) then + write (this%iout, '(1x,a)') 'Discretization Cell2d data loaded' + end if + ! + end subroutine source_cell2d + + !> @brief Build grid connections + !< + subroutine connect(this) + ! -- dummy + class(Disv2dType) :: this + ! -- local + integer(I4B) :: j + integer(I4B) :: noder, nrsize + integer(I4B) :: narea_eq_zero + integer(I4B) :: narea_lt_zero + real(DP) :: area + ! + ! -- Initialize + narea_eq_zero = 0 + narea_lt_zero = 0 + ! + ! -- Assign the cell area + do j = 1, this%nodes + area = this%get_cell2d_area(j) + noder = this%get_nodenumber(j, 0) + if (noder > 0) this%area(noder) = area + if (area < DZERO) then + narea_lt_zero = narea_lt_zero + 1 + write (errmsg, '(a,i0,a)') & + &'Calculated CELL2D area less than zero for cell ', j, '.' + call store_error(errmsg) + end if + if (area == DZERO) then + narea_eq_zero = narea_eq_zero + 1 + write (errmsg, '(a,i0,a)') & + 'Calculated CELL2D area is zero for cell ', j, '.' + call store_error(errmsg) + end if + end do + ! + ! -- check for errors + if (count_errors() > 0) then + if (narea_lt_zero > 0) then + write (errmsg, '(i0,a)') narea_lt_zero, & + ' cell(s) have an area less than zero. Calculated cell & + &areas must be greater than zero. Negative areas often & + &mean vertices are not listed in clockwise order.' + call store_error(errmsg) + end if + if (narea_eq_zero > 0) then + write (errmsg, '(i0,a)') narea_eq_zero, & + ' cell(s) have an area equal to zero. Calculated cell & + &areas must be greater than zero. Calculated cell & + &areas equal to zero indicate that the cell is not defined & + &by a valid polygon.' + call store_error(errmsg) + end if + call store_error_filename(this%input_fname) + end if + ! + ! -- create and fill the connections object + nrsize = 0 + if (this%nodes < this%nodesuser) nrsize = this%nodes + allocate (this%con) + call this%con%disvconnections(this%name_model, this%nodes, & + this%nodes, 1, nrsize, & + this%nvert, this%vertices, this%iavert, & + this%javert, this%cellxy, & + this%bot, this%bot, & + this%nodereduced, this%nodeuser) + this%nja = this%con%nja + this%njas = this%con%njas + ! + end subroutine connect + + !> @brief Write a binary grid file + !< + subroutine write_grb(this, icelltype) + ! -- modules + use OpenSpecModule, only: access, form + ! -- dummy + class(Disv2dType) :: this + integer(I4B), dimension(:), intent(in) :: icelltype + ! -- local + integer(I4B) :: iunit, i, ntxt + integer(I4B), parameter :: lentxt = 100 + character(len=50) :: txthdr + character(len=lentxt) :: txt + character(len=LINELENGTH) :: fname + ! -- formats + character(len=*), parameter :: fmtgrdsave = & + "(4X,'BINARY GRID INFORMATION WILL BE WRITTEN TO:', & + &/,6X,'UNIT NUMBER: ', I0,/,6X, 'FILE NAME: ', A)" + ! + ! -- Initialize + ntxt = 18 + ! + ! -- Open the file + fname = trim(this%input_fname)//'.grb' + iunit = getunit() + write (this%iout, fmtgrdsave) iunit, trim(adjustl(fname)) + call openfile(iunit, this%iout, trim(adjustl(fname)), 'DATA(BINARY)', & + form, access, 'REPLACE') + ! + ! -- write header information + write (txthdr, '(a)') 'GRID DISV2D' + txthdr(50:50) = new_line('a') + write (iunit) txthdr + write (txthdr, '(a)') 'VERSION 1' + txthdr(50:50) = new_line('a') + write (iunit) txthdr + write (txthdr, '(a, i0)') 'NTXT ', ntxt + txthdr(50:50) = new_line('a') + write (iunit) txthdr + write (txthdr, '(a, i0)') 'LENTXT ', lentxt + txthdr(50:50) = new_line('a') + write (iunit) txthdr + ! + ! -- write variable definitions + write (txt, '(3a, i0)') 'NCELLS ', 'INTEGER ', 'NDIM 0 # ', this%nodesuser + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'NODES ', 'INTEGER ', 'NDIM 0 # ', this%nodes + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'NVERT ', 'INTEGER ', 'NDIM 0 # ', this%nvert + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'NJAVERT ', 'INTEGER ', 'NDIM 0 # ', size(this%javert) + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'NJA ', 'INTEGER ', 'NDIM 0 # ', this%con%nja + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, 1pg25.15e3)') & + 'XORIGIN ', 'DOUBLE ', 'NDIM 0 # ', this%xorigin + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, 1pg25.15e3)') & + 'YORIGIN ', 'DOUBLE ', 'NDIM 0 # ', this%yorigin + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, 1pg25.15e3)') 'ANGROT ', 'DOUBLE ', 'NDIM 0 # ', this%angrot + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'BOTM ', 'DOUBLE ', 'NDIM 1 ', this%nodesuser + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'VERTICES ', 'DOUBLE ', 'NDIM 2 2 ', this%nvert + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'CELLX ', 'DOUBLE ', 'NDIM 1 ', this%nodes + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'CELLY ', 'DOUBLE ', 'NDIM 1 ', this%nodes + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'IAVERT ', 'INTEGER ', 'NDIM 1 ', this%nodes + 1 + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'JAVERT ', 'INTEGER ', 'NDIM 1 ', size(this%javert) + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'IA ', 'INTEGER ', 'NDIM 1 ', this%nodesuser + 1 + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'JA ', 'INTEGER ', 'NDIM 1 ', size(this%con%jausr) + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'IDOMAIN ', 'INTEGER ', 'NDIM 1 ', this%nodesuser + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + write (txt, '(3a, i0)') 'ICELLTYPE ', 'INTEGER ', 'NDIM 1 ', this%nodesuser + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt + ! + ! -- write data + write (iunit) this%nodesuser ! ncells + write (iunit) this%nodes ! nodes + write (iunit) this%nvert ! nvert + write (iunit) size(this%javert) ! njavert + write (iunit) this%nja ! nja + write (iunit) this%xorigin ! xorigin + write (iunit) this%yorigin ! yorigin + write (iunit) this%angrot ! angrot + write (iunit) this%bottom ! botm + write (iunit) this%vertices ! vertices + write (iunit) (this%cellxy(1, i), i=1, this%nodes) ! cellx + write (iunit) (this%cellxy(2, i), i=1, this%nodes) ! celly + write (iunit) this%iavert ! iavert + write (iunit) this%javert ! javert + write (iunit) this%con%iausr ! iausr + write (iunit) this%con%jausr ! jausr + write (iunit) this%idomain ! idomain + write (iunit) icelltype ! icelltype + ! + ! -- Close the file + close (iunit) + ! + end subroutine write_grb + + !> @brief Convert a user nodenumber to a string (nodenumber) or (k,j) + !< + subroutine nodeu_to_string(this, nodeu, str) + ! -- dummy + class(Disv2dType) :: this + integer(I4B), intent(in) :: nodeu + character(len=*), intent(inout) :: str + ! -- local + integer(I4B) :: i, j, k + character(len=10) :: jstr + ! + call get_ijk(nodeu, 1, this%nodes, 1, i, j, k) + write (jstr, '(i10)') j + str = '('//trim(adjustl(jstr))//')' + ! + end subroutine nodeu_to_string + + !> @brief Convert a user nodenumber to an array (nodenumber) or (k,j) + !< + subroutine nodeu_to_array(this, nodeu, arr) + ! -- dummy + class(Disv2dType) :: this + integer(I4B), intent(in) :: nodeu + integer(I4B), dimension(:), intent(inout) :: arr + ! -- local + integer(I4B) :: isize + integer(I4B) :: i, j, k + ! + ! -- check the size of arr + isize = size(arr) + if (isize /= this%ndim) then + write (errmsg, '(a,i0,a,i0,a)') & + 'Program error: nodeu_to_array size of array (', isize, & + ') is not equal to the discretization dimension (', this%ndim, ').' + call store_error(errmsg, terminate=.TRUE.) + end if + ! + ! -- get k, i, j + call get_ijk(nodeu, 1, this%nodes, 1, i, j, k) + ! + ! -- fill array + arr(1) = j + ! + end subroutine nodeu_to_array + + !> @brief Get reduced node number from user node number + !< + function get_nodenumber_idx1(this, nodeu, icheck) result(nodenumber) + ! -- return + integer(I4B) :: nodenumber + ! -- dummy + class(Disv2dType), intent(in) :: this + integer(I4B), intent(in) :: nodeu + integer(I4B), intent(in) :: icheck + ! -- local + ! + ! -- check the node number if requested + if (icheck /= 0) then + ! + ! -- If within valid range, convert to reduced nodenumber + if (nodeu < 1 .or. nodeu > this%nodesuser) then + nodenumber = 0 + write (errmsg, '(a,i0,a,i0,a)') & + 'Node number (', nodeu, ') is less than 1 or greater than nodes (', & + this%nodesuser, ').' + call store_error(errmsg) + else + nodenumber = nodeu + if (this%nodes < this%nodesuser) nodenumber = this%nodereduced(nodeu) + end if + else + nodenumber = nodeu + if (this%nodes < this%nodesuser) nodenumber = this%nodereduced(nodeu) + end if + ! + end function get_nodenumber_idx1 + + !> @brief Get normal vector components between the cell and a given neighbor + !! + !! The normal points outward from the shared face between noden and nodem. + !< + subroutine connection_normal(this, noden, nodem, ihc, xcomp, ycomp, zcomp, & + ipos) + ! -- dummy + class(Disv2dType) :: this + integer(I4B), intent(in) :: noden !< cell (reduced nn) + integer(I4B), intent(in) :: nodem !< neighbor (reduced nn) + integer(I4B), intent(in) :: ihc !< horizontal connection flag + real(DP), intent(inout) :: xcomp + real(DP), intent(inout) :: ycomp + real(DP), intent(inout) :: zcomp + integer(I4B), intent(in) :: ipos + ! -- local + real(DP) :: angle, dmult + ! + ! -- Set vector components based on ihc + if (ihc == 0) then + xcomp = DZERO + ycomp = DZERO + if (nodem < noden) then + ! + ! -- nodem must be above noden, so upward connection + zcomp = DONE + else + ! + ! -- nodem must be below noden, so downward connection + zcomp = -DONE + end if + else + ! -- find from anglex, since anglex is symmetric, need to flip vector + ! for lower triangle (nodem < noden) + !ipos = this%con%getjaindex(noden, nodem) + angle = this%con%anglex(this%con%jas(ipos)) + dmult = DONE + if (nodem < noden) dmult = -DONE + xcomp = cos(angle) * dmult + ycomp = sin(angle) * dmult + zcomp = DZERO + end if + ! + end subroutine connection_normal + + !> @brief Get unit vector components between the cell and a given neighbor + !! + !! Saturation must be provided to compute cell center vertical coordinates. + !! Also return the straight-line connection length. + !< + subroutine connection_vector(this, noden, nodem, nozee, satn, satm, ihc, & + xcomp, ycomp, zcomp, conlen) + ! -- dummy + class(Disv2dType) :: this + integer(I4B), intent(in) :: noden !< cell (reduced nn) + integer(I4B), intent(in) :: nodem !< neighbor (reduced nn) + logical, intent(in) :: nozee !< do not use z in calculations + real(DP), intent(in) :: satn !< not used for disv1d + real(DP), intent(in) :: satm !< not used for disv1d + integer(I4B), intent(in) :: ihc !< horizontal connection flag + real(DP), intent(inout) :: xcomp !< x component of connection vector + real(DP), intent(inout) :: ycomp !< y component of connection vector + real(DP), intent(inout) :: zcomp !< z component of connection vector + real(DP), intent(inout) :: conlen !< calculated straight-line distance between cell centers + ! -- local + integer(I4B) :: nodeun, nodeum + real(DP) :: xn, xm, yn, ym, zn, zm + + ! horizontal connection, with possible z component due to cell offsets + ! and/or water table conditions + if (nozee) then + zn = DZERO + zm = DZERO + else + zn = this%bot(noden) + zm = this%bot(nodem) + end if + nodeun = this%get_nodeuser(noden) + nodeum = this%get_nodeuser(nodem) + xn = this%cellxy(1, nodeun) + yn = this%cellxy(2, nodeun) + xm = this%cellxy(1, nodeum) + ym = this%cellxy(2, nodeum) + call line_unit_vector(xn, yn, zn, xm, ym, zm, xcomp, ycomp, zcomp, & + conlen) + + end subroutine connection_vector + + !> @brief Get the discretization type + !< + subroutine get_dis_type(this, dis_type) + ! -- dummy + class(Disv2dType), intent(in) :: this + character(len=*), intent(out) :: dis_type + ! + dis_type = "DISV2D" + ! + end subroutine get_dis_type + + !> @brief Allocate and initialize scalars + !< + subroutine allocate_scalars(this, name_model, input_mempath) + ! -- dummy + class(Disv2dType) :: this + character(len=*), intent(in) :: name_model + character(len=*), intent(in) :: input_mempath + ! + ! -- Allocate parent scalars + call this%DisBaseType%allocate_scalars(name_model, input_mempath) + ! + ! -- Allocate + call mem_allocate(this%nvert, 'NVERT', this%memoryPath) + ! + ! -- Initialize + this%nvert = 0 + this%ndim = 1 + ! + end subroutine allocate_scalars + + !> @brief Allocate and initialize arrays + !< + subroutine allocate_arrays(this) + ! -- dummy + class(Disv2dType) :: this + ! + ! -- Allocate arrays in DisBaseType (mshape, top, bot, area) + call this%DisBaseType%allocate_arrays() + ! + ! -- Allocate arrays for DisvType + if (this%nodes < this%nodesuser) then + call mem_allocate(this%nodeuser, this%nodes, 'NODEUSER', this%memoryPath) + call mem_allocate(this%nodereduced, this%nodesuser, 'NODEREDUCED', & + this%memoryPath) + else + call mem_allocate(this%nodeuser, 1, 'NODEUSER', this%memoryPath) + call mem_allocate(this%nodereduced, 1, 'NODEREDUCED', this%memoryPath) + end if + ! -- Initialize + this%mshape(1) = this%nodes + ! + end subroutine allocate_arrays + + !> @brief Get the signed area of the cell + !! + !! A negative result means points are in counter-clockwise orientation. + !! Area is computed from the formula: + !! a = 1/2 *[(x1*y2 + x2*y3 + x3*y4 + ... + xn*y1) - + !! (x2*y1 + x3*y2 + x4*y3 + ... + x1*yn)] + !< + function get_cell2d_area(this, icell2d) result(area) + ! -- dummy + class(Disv2dType) :: this + integer(I4B), intent(in) :: icell2d + ! -- return + real(DP) :: area + ! -- local + integer(I4B) :: ivert + integer(I4B) :: nvert + integer(I4B) :: icount + integer(I4B) :: iv1 + real(DP) :: x + real(DP) :: y + real(DP) :: x1 + real(DP) :: y1 + ! + area = DZERO + nvert = this%iavert(icell2d + 1) - this%iavert(icell2d) + icount = 1 + iv1 = this%javert(this%iavert(icell2d)) + x1 = this%vertices(1, iv1) + y1 = this%vertices(2, iv1) + do ivert = this%iavert(icell2d), this%iavert(icell2d + 1) - 1 + x = this%vertices(1, this%javert(ivert)) + if (icount < nvert) then + y = this%vertices(2, this%javert(ivert + 1)) + else + y = this%vertices(2, this%javert(this%iavert(icell2d))) + end if + area = area + (x - x1) * (y - y1) + icount = icount + 1 + end do + ! + icount = 1 + do ivert = this%iavert(icell2d), this%iavert(icell2d + 1) - 1 + y = this%vertices(2, this%javert(ivert)) + if (icount < nvert) then + x = this%vertices(1, this%javert(ivert + 1)) + else + x = this%vertices(1, this%javert(this%iavert(icell2d))) + end if + area = area - (x - x1) * (y - y1) + icount = icount + 1 + end do + ! + area = -DONE * area * DHALF + ! + end function get_cell2d_area + + !> @brief Convert a string to a user nodenumber + !! + !! Parse layer and within-layer cell number and return user nodenumber. + !! If flag_string is present and true, the first token may be + !! non-numeric (e.g. boundary name). In this case, return -2. + !< + function nodeu_from_string(this, lloc, istart, istop, in, iout, line, & + flag_string, allow_zero) result(nodeu) + ! -- dummy + class(Disv2dType) :: this + integer(I4B), intent(inout) :: lloc + integer(I4B), intent(inout) :: istart + integer(I4B), intent(inout) :: istop + integer(I4B), intent(in) :: in + integer(I4B), intent(in) :: iout + character(len=*), intent(inout) :: line + logical, optional, intent(in) :: flag_string + logical, optional, intent(in) :: allow_zero + integer(I4B) :: nodeu + ! -- local + integer(I4B) :: j, nodes + integer(I4B) :: lloclocal, ndum, istat, n + real(DP) :: r + ! + if (present(flag_string)) then + if (flag_string) then + ! Check to see if first token in line can be read as an integer. + lloclocal = lloc + call urword(line, lloclocal, istart, istop, 1, ndum, r, iout, in) + read (line(istart:istop), *, iostat=istat) n + if (istat /= 0) then + ! First token in line is not an integer; return flag to this effect. + nodeu = -2 + return + end if + end if + end if + ! + nodes = this%mshape(1) + ! + call urword(line, lloc, istart, istop, 2, j, r, iout, in) + ! + if (j == 0) then + if (present(allow_zero)) then + if (allow_zero) then + nodeu = 0 + return + end if + end if + end if + ! + errmsg = '' + ! + if (j < 1 .or. j > nodes) then + write (errmsg, '(a,1x,a,i0,a)') & + trim(adjustl(errmsg)), 'Cell number in list (', j, & + ') is outside of the grid.' + end if + ! + nodeu = get_node(1, 1, j, 1, 1, nodes) + ! + if (nodeu < 1 .or. nodeu > this%nodesuser) then + write (errmsg, '(a,1x,a,i0,a)') & + trim(adjustl(errmsg)), & + "Node number in list (", nodeu, ") is outside of the grid. "// & + "Cell number cannot be determined in line '"// & + trim(adjustl(line))//"'." + end if + ! + if (len_trim(adjustl(errmsg)) > 0) then + call store_error(errmsg) + call store_error_unit(in) + end if + ! + end function nodeu_from_string + + !> @brief Convert a cellid string to a user nodenumber + !! + !! If flag_string is present and true, the first token may be + !! non-numeric (e.g. boundary name). In this case, return -2. + !! + !! If allow_zero is present and true, and all indices are zero, the + !! result can be zero. If allow_zero is false, a zero in any index is an error. + !< + function nodeu_from_cellid(this, cellid, inunit, iout, flag_string, & + allow_zero) result(nodeu) + ! -- return + integer(I4B) :: nodeu + ! -- dummy + class(Disv2dType) :: this + character(len=*), intent(inout) :: cellid + integer(I4B), intent(in) :: inunit + integer(I4B), intent(in) :: iout + logical, optional, intent(in) :: flag_string + logical, optional, intent(in) :: allow_zero + ! -- local + integer(I4B) :: j, nodes + integer(I4B) :: lloclocal, ndum, istat, n + integer(I4B) :: istart, istop + real(DP) :: r + ! + if (present(flag_string)) then + if (flag_string) then + ! Check to see if first token in cellid can be read as an integer. + lloclocal = 1 + call urword(cellid, lloclocal, istart, istop, 1, ndum, r, iout, inunit) + read (cellid(istart:istop), *, iostat=istat) n + if (istat /= 0) then + ! First token in cellid is not an integer; return flag to this effect. + nodeu = -2 + return + end if + end if + end if + ! + nodes = this%mshape(1) + ! + lloclocal = 1 + call urword(cellid, lloclocal, istart, istop, 2, j, r, iout, inunit) + ! + if (j == 0) then + if (present(allow_zero)) then + if (allow_zero) then + nodeu = 0 + return + end if + end if + end if + ! + errmsg = '' + ! + if (j < 1 .or. j > nodes) then + write (errmsg, '(a,1x,a,i0,a)') & + trim(adjustl(errmsg)), 'Cell2d number in list (', j, & + ') is outside of the grid.' + end if + ! + nodeu = get_node(1, 1, j, 1, 1, nodes) + ! + if (nodeu < 1 .or. nodeu > this%nodesuser) then + write (errmsg, '(a,1x,a,i0,a)') & + trim(adjustl(errmsg)), & + "Cell number cannot be determined for cellid ("// & + trim(adjustl(cellid))//") and results in a user "// & + "node number (", nodeu, ") that is outside of the grid." + end if + ! + if (len_trim(adjustl(errmsg)) > 0) then + call store_error(errmsg) + call store_error_unit(inunit) + end if + ! + end function nodeu_from_cellid + + !> @brief Get a 2D array of polygon vertices, listed in clockwise order + !! beginning with the lower left corner + !< + subroutine get_polyverts(this, ic, polyverts, closed) + ! -- dummy + class(Disv2dType), intent(inout) :: this + integer(I4B), intent(in) :: ic !< cell number (reduced) + real(DP), allocatable, intent(out) :: polyverts(:, :) !< polygon vertices (column-major indexing) + logical(LGP), intent(in), optional :: closed !< whether to close the polygon, duplicating a vertex (default false) + ! -- local + integer(I4B) :: icu, icu2d, iavert, nverts, m, j + logical(LGP) :: lclosed + ! + ! count vertices + icu = this%get_nodeuser(ic) + icu2d = icu - ((icu - 1) / this%nodes) * this%nodes + nverts = this%iavert(icu2d + 1) - this%iavert(icu2d) - 1 + if (nverts .le. 0) nverts = nverts + size(this%javert) + ! + ! check closed option + if (.not. (present(closed))) then + lclosed = .false. + else + lclosed = closed + end if + ! + ! allocate vertices array + if (lclosed) then + allocate (polyverts(2, nverts + 1)) + else + allocate (polyverts(2, nverts)) + end if + ! + ! set vertices + iavert = this%iavert(icu2d) + do m = 1, nverts + j = this%javert(iavert - 1 + m) + polyverts(:, m) = (/this%vertices(1, j), this%vertices(2, j)/) + end do + ! + ! close if enabled + if (lclosed) & + polyverts(:, nverts + 1) = polyverts(:, 1) + ! + end subroutine + + !> @brief Record a double precision array + !! + !! The array is written to a formatted or unformatted external file depending + !! on the arguments. + !< + subroutine record_array(this, darray, iout, iprint, idataun, aname, & + cdatafmp, nvaluesp, nwidthp, editdesc, dinact) + ! -- dummy + class(Disv2dType), intent(inout) :: this + real(DP), dimension(:), pointer, contiguous, intent(inout) :: darray !< double precision array to record + integer(I4B), intent(in) :: iout !< ascii output unit number + integer(I4B), intent(in) :: iprint !< whether to print the array + integer(I4B), intent(in) :: idataun !< binary output unit number, if negative don't write by layers, write entire array + character(len=*), intent(in) :: aname !< text descriptor + character(len=*), intent(in) :: cdatafmp !< write format + integer(I4B), intent(in) :: nvaluesp !< values per line + integer(I4B), intent(in) :: nwidthp !< number width + character(len=*), intent(in) :: editdesc !< format type (I, G, F, S, E) + real(DP), intent(in) :: dinact !< double precision value for cells excluded from model domain + ! -- local + integer(I4B) :: k, ifirst + integer(I4B) :: nlay + integer(I4B) :: nrow + integer(I4B) :: ncol + integer(I4B) :: nval + integer(I4B) :: nodeu, noder + integer(I4B) :: istart, istop + real(DP), dimension(:), pointer, contiguous :: dtemp + ! -- formats + character(len=*), parameter :: fmthsv = & + "(1X,/1X,a,' WILL BE SAVED ON UNIT ',I4, & + &' AT END OF TIME STEP',I5,', STRESS PERIOD ',I4)" + ! + ! -- set variables + nlay = 1 + nrow = 1 + ncol = this%mshape(1) + ! + ! -- If this is a reduced model, then copy the values from darray into + ! dtemp. + if (this%nodes < this%nodesuser) then + nval = this%nodes + dtemp => this%dbuff + do nodeu = 1, this%nodesuser + noder = this%get_nodenumber(nodeu, 0) + if (noder <= 0) then + dtemp(nodeu) = dinact + cycle + end if + dtemp(nodeu) = darray(noder) + end do + else + nval = this%nodes + dtemp => darray + end if + ! + ! -- Print to iout if iprint /= 0 + if (iprint /= 0) then + istart = 1 + do k = 1, nlay + istop = istart + nrow * ncol - 1 + call ulaprufw(ncol, nrow, kstp, kper, k, iout, dtemp(istart:istop), & + aname, cdatafmp, nvaluesp, nwidthp, editdesc) + istart = istop + 1 + end do + end if + ! + ! -- Save array to an external file. + if (idataun > 0) then + ! -- write to binary file by layer + ifirst = 1 + istart = 1 + do k = 1, nlay + istop = istart + nrow * ncol - 1 + if (ifirst == 1) write (iout, fmthsv) & + trim(adjustl(aname)), idataun, & + kstp, kper + ifirst = 0 + call ulasav(dtemp(istart:istop), aname, kstp, kper, & + pertim, totim, ncol, nrow, k, idataun) + istart = istop + 1 + end do + elseif (idataun < 0) then + ! + ! -- write entire array as one record + call ubdsv1(kstp, kper, aname, -idataun, dtemp, ncol, nrow, nlay, & + iout, delt, pertim, totim) + end if + ! + end subroutine record_array + + !> @brief Record list header for imeth=6 + !< + subroutine record_srcdst_list_header(this, text, textmodel, textpackage, & + dstmodel, dstpackage, naux, auxtxt, & + ibdchn, nlist, iout) + ! -- dummy + class(Disv2dType) :: this + character(len=16), intent(in) :: text + character(len=16), intent(in) :: textmodel + character(len=16), intent(in) :: textpackage + character(len=16), intent(in) :: dstmodel + character(len=16), intent(in) :: dstpackage + integer(I4B), intent(in) :: naux + character(len=16), dimension(:), intent(in) :: auxtxt + integer(I4B), intent(in) :: ibdchn + integer(I4B), intent(in) :: nlist + integer(I4B), intent(in) :: iout + ! -- local + integer(I4B) :: nlay, nrow, ncol + ! + nlay = 1 + nrow = 1 + ncol = this%mshape(1) + ! + ! -- Use ubdsv06 to write list header + call ubdsv06(kstp, kper, text, textmodel, textpackage, dstmodel, dstpackage, & + ibdchn, naux, auxtxt, ncol, nrow, nlay, & + nlist, iout, delt, pertim, totim) + ! + end subroutine record_srcdst_list_header + +end module Disv2dModule diff --git a/src/Model/SurfaceWaterFlow/swf-cdb.f90 b/src/Model/SurfaceWaterFlow/swf-cdb.f90 index fff076a427b..6a56c42f28c 100644 --- a/src/Model/SurfaceWaterFlow/swf-cdb.f90 +++ b/src/Model/SurfaceWaterFlow/swf-cdb.f90 @@ -23,7 +23,6 @@ module SwfCdbModule use InputOutputModule, only: GetUnit, openfile use MatrixBaseModule use BaseDisModule, only: DisBaseType - use Disv1dModule, only: Disv1dType use SwfCxsModule, only: SwfCxsType ! implicit none @@ -41,7 +40,6 @@ module SwfCdbModule real(DP), pointer :: gravconv => null() !< conversion factor gravity in m/s^2 to model units ! -- pointers other objects - type(Disv1dType), pointer :: disv1d type(SwfCxsType), pointer :: cxs contains @@ -111,13 +109,10 @@ subroutine cdb_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, & packobj%ncolbnd = 1 packobj%iscloc = 1 packobj%ictMemPath = create_mem_path(namemodel, 'DFW') - ! - ! -- store pointer to disv1d - select type (dis) - type is (Disv1dType) - cdbobj%disv1d => dis - end select - ! + + ! -- store pointer to dis + cdbobj%dis => dis + ! -- store pointer to cxs cdbobj%cxs => cxs ! diff --git a/src/Model/SurfaceWaterFlow/swf-dfw.f90 b/src/Model/SurfaceWaterFlow/swf-dfw.f90 index 8071e46a5eb..969e6b00068 100644 --- a/src/Model/SurfaceWaterFlow/swf-dfw.f90 +++ b/src/Model/SurfaceWaterFlow/swf-dfw.f90 @@ -184,6 +184,9 @@ subroutine dfw_df(this, dis) if (distype == "DIS2D") then this%is2d = 1 end if + if (distype == "DISV2D") then + this%is2d = 1 + end if ! -- check if dfw is enabled ! this will need to become if (.not. present(dfw_options)) then diff --git a/src/Model/SurfaceWaterFlow/swf.f90 b/src/Model/SurfaceWaterFlow/swf.f90 index b4825144e0e..d01a3d02bfc 100644 --- a/src/Model/SurfaceWaterFlow/swf.f90 +++ b/src/Model/SurfaceWaterFlow/swf.f90 @@ -116,7 +116,7 @@ module SwfModule !< integer(I4B), parameter :: SWF_NBASEPKG = 9 character(len=LENPACKAGETYPE), dimension(SWF_NBASEPKG) :: & - SWF_BASEPKG = ['DISV1D6', 'DIS2D6 ', 'DISV6 ', & + SWF_BASEPKG = ['DISV1D6', 'DIS2D6 ', 'DISV2D6', & 'DFW6 ', 'CXS6 ', 'OC6 ', & 'IC6 ', 'OBS6 ', 'STO6 '] @@ -1144,7 +1144,7 @@ subroutine create_packages(this) use SimVariablesModule, only: idm_context use Disv1dModule, only: disv1d_cr use Dis2dModule, only: dis2d_cr - use DisvModule, only: disv_cr + use Disv2dModule, only: disv2d_cr use SwfDfWModule, only: dfw_cr use SwfCxsModule, only: cxs_cr use SwfStoModule, only: sto_cr @@ -1198,9 +1198,9 @@ subroutine create_packages(this) case ('DIS2D6') indis = 1 call dis2d_cr(this%dis, this%name, mempath, indis, this%iout) - case ('DISV6') + case ('DISV2D6') indis = 1 - call disv_cr(this%dis, this%name, mempath, indis, this%iout) + call disv2d_cr(this%dis, this%name, mempath, indis, this%iout) case ('DFW6') this%indfw = 1 mempathdfw = mempath diff --git a/src/Utilities/Idm/SourceCommon.f90 b/src/Utilities/Idm/SourceCommon.f90 index ad8ecc29268..a61419dd137 100644 --- a/src/Utilities/Idm/SourceCommon.f90 +++ b/src/Utilities/Idm/SourceCommon.f90 @@ -333,6 +333,23 @@ subroutine set_model_shape(ftype, fname, model_mempath, dis_mempath, & else call store_error_filename(fname) end if + case ('DISV2D6') + ! + call get_isize('NODES', dis_mempath, dim1_size) + ! + if (dim1_size <= 0) then + write (errmsg, '(a)') & + 'Required input dimension "NODES" not found.' + call store_error(errmsg) + end if + ! + if (dim1_size >= 1) then + call mem_allocate(model_shape, 1, 'MODEL_SHAPE', model_mempath) + call mem_setptr(ndim1, 'NODES', dis_mempath) + model_shape = [ndim1] + else + call store_error_filename(fname) + end if case ('DISU6', 'DISV1D6') ! call get_isize('NODES', dis_mempath, dim1_size) diff --git a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 index bd06ac99dc9..429ace441ba 100644 --- a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 +++ b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 @@ -279,7 +279,8 @@ recursive subroutine parse_block(this, iblk, recursive_call) ! ! -- disu vertices/cell2d blocks are contingent on NVERT dimension if (this%mf6_input%pkgtype == 'DISU6' .or. & - this%mf6_input%pkgtype == 'DISV1D6') then + this%mf6_input%pkgtype == 'DISV1D6' .or. & + this%mf6_input%pkgtype == 'DISV2D6') then if (this%mf6_input%block_dfns(iblk)%blockname == 'VERTICES' .or. & this%mf6_input%block_dfns(iblk)%blockname == 'CELL2D') then call get_from_memorylist('NVERT', this%mf6_input%mempath, mt, found, & diff --git a/src/meson.build b/src/meson.build index 92e13ea4e4c..005762bd07d 100644 --- a/src/meson.build +++ b/src/meson.build @@ -77,7 +77,7 @@ modflow_sources = files( 'Idm' / 'gwt-namidm.f90', 'Idm' / 'swf-disv1didm.f90', 'Idm' / 'swf-dis2didm.f90', - 'Idm' / 'swf-disvidm.f90', + 'Idm' / 'swf-disv2didm.f90', 'Idm' / 'swf-namidm.f90', 'Idm' / 'swf-cxsidm.f90', 'Idm' / 'swf-dfwidm.f90', @@ -118,6 +118,7 @@ modflow_sources = files( 'Model' / 'Discretization' / 'Disu.f90', 'Model' / 'Discretization' / 'Disv.f90', 'Model' / 'Discretization' / 'Disv1d.f90', + 'Model' / 'Discretization' / 'Disv2d.f90', 'Model' / 'Geometry' / 'BaseGeometry.f90', 'Model' / 'Geometry' / 'CircularGeometry.f90', 'Model' / 'Geometry' / 'RectangularGeometry.f90', diff --git a/utils/idmloader/dfns.txt b/utils/idmloader/dfns.txt index c1545782f1e..c2e09f3af85 100644 --- a/utils/idmloader/dfns.txt +++ b/utils/idmloader/dfns.txt @@ -45,7 +45,7 @@ gwe-dis.dfn swf-nam.dfn swf-disv1d.dfn swf-dis2d.dfn -swf-disv.dfn +swf-disv2d.dfn swf-cxs.dfn swf-dfw.dfn swf-ic.dfn From e645e17697d37a00049835c6b948fae29f3ace00 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 15 Apr 2024 15:42:41 -0400 Subject: [PATCH 102/199] test(prt): remove bad flopy usages from triangle and ternary tests (#1727) --- autotest/test_prt_ternary_methods.py | 12 +----------- autotest/test_prt_triangle.py | 12 +----------- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/autotest/test_prt_ternary_methods.py b/autotest/test_prt_ternary_methods.py index 4208d2be7c4..c7b90f5da83 100644 --- a/autotest/test_prt_ternary_methods.py +++ b/autotest/test_prt_ternary_methods.py @@ -58,17 +58,6 @@ def build_prt_sim(idx, name, gwf_ws, prt_ws, targets): gwfname = get_model_name(name, "gwf") prtname = get_model_name(name, "prt") - # create grid - tri = get_tri(prt_ws / "grid", targets) - grid = VertexGrid(tri) - gi = GridIntersect(grid) - - # identify cells on left edge - line = LineString([active_domain[0], active_domain[-1]]) - cells_left = gi.intersect(line)["cellids"] - cells_left = np.array(list(cells_left)) - - # create simulation sim = flopy.mf6.MFSimulation( sim_name=name, version="mf6", exe_name=targets["mf6"], sim_ws=prt_ws ) @@ -76,6 +65,7 @@ def build_prt_sim(idx, name, gwf_ws, prt_ws, targets): sim, time_units="DAYS", perioddata=[[1.0, 1, 1.0]] ) prt = flopy.mf6.ModflowPrt(sim, modelname=prtname) + tri = get_tri(prt_ws / "grid", targets) cell2d = tri.get_cell2d() vertices = tri.get_vertices() xcyc = tri.get_xcyc() diff --git a/autotest/test_prt_triangle.py b/autotest/test_prt_triangle.py index bf2ba804b58..da81ab15cc8 100644 --- a/autotest/test_prt_triangle.py +++ b/autotest/test_prt_triangle.py @@ -130,17 +130,6 @@ def build_prt_sim(idx, name, gwf_ws, prt_ws, targets): gwfname = get_model_name(name, "gwf") prtname = get_model_name(name, "prt") - # create grid - tri = get_tri(prt_ws / "grid", targets) - grid = VertexGrid(tri) - gi = GridIntersect(grid) - - # identify cells on left edge - line = LineString([active_domain[0], active_domain[-1]]) - cells_left = gi.intersect(line)["cellids"] - cells_left = np.array(list(cells_left)) - - # create simulation sim = flopy.mf6.MFSimulation( sim_name=name, version="mf6", exe_name=targets["mf6"], sim_ws=prt_ws ) @@ -148,6 +137,7 @@ def build_prt_sim(idx, name, gwf_ws, prt_ws, targets): sim, time_units="DAYS", perioddata=[[1.0, 1, 1.0]] ) prt = flopy.mf6.ModflowPrt(sim, modelname=prtname) + tri = get_tri(prt_ws / "grid", targets) cell2d = tri.get_cell2d() vertices = tri.get_vertices() xcyc = tri.get_xcyc() From 6d84edafe6cf1765c4dff2f9881f13dd1490bd02 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 16 Apr 2024 09:04:06 -0400 Subject: [PATCH 103/199] test(framework): remove very verbose warnings on simulation failure (#1731) Showing the end of the list file in case of simulation failure makes CI logs extremely verbose, making it difficult to scroll/read. We upload failed test outputs as artifacts, so the list file can be inspected that way if needed. --- autotest/framework.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/autotest/framework.py b/autotest/framework.py index a653ad6441a..89dd7fdb6c1 100644 --- a/autotest/framework.py +++ b/autotest/framework.py @@ -660,16 +660,6 @@ def _run_sim_or_model( else: success = True - lst_file_path = Path(workspace) / "mfsim.lst" - if ( - "mf6" in target.name - and not success - and lst_file_path.is_file() - ): - warn( - "MODFLOW 6 listing file ended with: \n" - + get_mfsim_lst_tail(lst_file_path) - ) except Exception: success = False warn( From 94ba5b988b99a2efdec3a7dd2028e939136c4477 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 18:48:47 -0400 Subject: [PATCH 104/199] chore(deps): bump prefix-dev/setup-pixi from 0.5.2 to 0.6.0 (#1736) --- .github/workflows/ci.yml | 12 ++++++------ .github/workflows/compilers.yml | 2 +- .github/workflows/docs.yml | 4 ++-- .github/workflows/large.yml | 2 +- .github/workflows/pixi_auto_update.yml | 2 +- .github/workflows/release.yml | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4408aa19091..4badf88dfe5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,7 +49,7 @@ jobs: - name: Checkout modflow6 uses: actions/checkout@v4 - - uses: prefix-dev/setup-pixi@v0.5.2 + - uses: prefix-dev/setup-pixi@v0.6.0 with: pixi-version: v0.19.1 @@ -79,7 +79,7 @@ jobs: compiler: gcc version: ${{ env.FC_V }} - - uses: prefix-dev/setup-pixi@v0.5.2 + - uses: prefix-dev/setup-pixi@v0.6.0 with: pixi-version: v0.19.1 @@ -124,7 +124,7 @@ jobs: version: ${{ env.FC_V }} - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.2 + uses: prefix-dev/setup-pixi@v0.6.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" @@ -219,7 +219,7 @@ jobs: version: ${{ env.FC_V }} - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.2 + uses: prefix-dev/setup-pixi@v0.6.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" @@ -341,7 +341,7 @@ jobs: path: modflow6-examples - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.2 + uses: prefix-dev/setup-pixi@v0.6.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" @@ -428,7 +428,7 @@ jobs: path: modflow6 - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.2 + uses: prefix-dev/setup-pixi@v0.6.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index f5983d5c190..04f81daf980 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -138,7 +138,7 @@ jobs: version: ${{ matrix.version }} - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.2 + uses: prefix-dev/setup-pixi@v0.6.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 5c35d47ba19..aefc6e28039 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -43,7 +43,7 @@ jobs: path: usgslatex - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.2 + uses: prefix-dev/setup-pixi@v0.6.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" @@ -194,7 +194,7 @@ jobs: sudo apt-get install doxygen graphviz - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.2 + uses: prefix-dev/setup-pixi@v0.6.0 with: pixi-version: v0.19.1 diff --git a/.github/workflows/large.yml b/.github/workflows/large.yml index 419bf74581d..3501c1bb971 100644 --- a/.github/workflows/large.yml +++ b/.github/workflows/large.yml @@ -67,7 +67,7 @@ jobs: path: modflow6-largetestmodels - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.2 + uses: prefix-dev/setup-pixi@v0.6.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" diff --git a/.github/workflows/pixi_auto_update.yml b/.github/workflows/pixi_auto_update.yml index ec7b55a54ed..375d7882c6f 100644 --- a/.github/workflows/pixi_auto_update.yml +++ b/.github/workflows/pixi_auto_update.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: prefix-dev/setup-pixi@v0.5.2 + - uses: prefix-dev/setup-pixi@v0.6.0 with: pixi-version: v0.19.1 cache: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b4dce98d250..d8a17d14ca7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -99,7 +99,7 @@ jobs: ref: ${{ inputs.branch }} - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.5.2 + uses: prefix-dev/setup-pixi@v0.6.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" From 1d6e6b18c8d6be6151b976c9dc6c7269bc957dbc Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 17 Apr 2024 13:36:39 -0400 Subject: [PATCH 105/199] chore(pixi): use custom install task for internal dev dependencies (#1728) Restore the custom task approach to installing flopy, modflowapi, pymake, and modflow-devtools originally introduced by @Hofer-Julian in #1696. This unlocks them (removes them from pixi.lock) and allows rolling updates in CI, as we had before #1703. Going forward, contributors will need to run `pixi run install` instead of `pixi install` to get a full development environment. Also remove hatchling from pixi.toml as it is not needed. --- .github/workflows/ci.yml | 16 + .github/workflows/compilers.yml | 4 + .github/workflows/docs.yml | 7 + .github/workflows/large.yml | 4 + .github/workflows/release.yml | 4 + DEVELOPER.md | 2 +- pixi.lock | 869 +++++++------------------------- pixi.toml | 19 +- 8 files changed, 231 insertions(+), 694 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4badf88dfe5..33fc1e55e10 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -129,6 +129,10 @@ jobs: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" + - name: Custom pixi install + working-directory: modflow6 + run: pixi run install + - name: Build test-drive working-directory: test-drive run: | @@ -224,6 +228,10 @@ jobs: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" + - name: Custom pixi install + working-directory: modflow6 + run: pixi run install + - name: Set LDFLAGS (macOS) if: matrix.os == 'macos-14' run: | @@ -346,6 +354,10 @@ jobs: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" + - name: Custom pixi install + working-directory: modflow6 + run: pixi run install + - name: Setup ${{ env.FC }} ${{ env.FC_V }} uses: fortran-lang/setup-fortran@v1 with: @@ -433,6 +445,10 @@ jobs: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" + - name: Custom pixi install + working-directory: modflow6 + run: pixi run install + - name: Test parallel MF6 if: runner.os != 'Windows' uses: ./modflow6/.github/actions/test-par diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index 04f81daf980..6bf0a90b522 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -143,6 +143,10 @@ jobs: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" + - name: Custom pixi install + working-directory: modflow6 + run: pixi run install + - name: Build modflow6 working-directory: modflow6 run: | diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index aefc6e28039..ff92188bbc6 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -47,6 +47,10 @@ jobs: with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" + + - name: Custom pixi install + working-directory: modflow6 + run: pixi run install - name: Install additional packages for Sphinx using pip working-directory: modflow6/.build_rtd_docs @@ -198,6 +202,9 @@ jobs: with: pixi-version: v0.19.1 + - name: Custom pixi install + run: pixi run install + - name: Print python package versions run: pixi run pip list diff --git a/.github/workflows/large.yml b/.github/workflows/large.yml index 3501c1bb971..bcfa7c34114 100644 --- a/.github/workflows/large.yml +++ b/.github/workflows/large.yml @@ -72,6 +72,10 @@ jobs: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" + - name: Custom pixi install + working-directory: modflow6 + run: pixi run install + - name: Setup ${{ matrix.compiler }} ${{ matrix.version }} uses: fortran-lang/setup-fortran@v1 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d8a17d14ca7..dc37c16148e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -104,6 +104,10 @@ jobs: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" + - name: Custom pixi install + working-directory: modflow6 + run: pixi run install + - name: Setup Micromamba uses: mamba-org/setup-micromamba@v1 with: diff --git a/DEVELOPER.md b/DEVELOPER.md index a8b194bef1d..8a9a30df30d 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -182,7 +182,7 @@ The following tables are automatically generated by [a CI workflow](.github/work Python 3.8+ is required to run MODFLOW 6 tests. Using Python via Pixi is recommended. Pixi installation docs can be found [here](https://pixi.sh). After installing `pixi`, to set up an environment with all development dependencies, run: ``` -pixi install +pixi run install ``` #### Dependencies diff --git a/pixi.lock b/pixi.lock index b7f989653fb..1ca5a420258 100644 --- a/pixi.lock +++ b/pixi.lock @@ -12,7 +12,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/black-24.3.0-py39hf3d152e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/black-24.4.0-py39hf3d152e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bmipy-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda @@ -28,7 +28,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py39h7633fee_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda @@ -51,8 +50,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-2.50.0-h5abf519_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.1-hfa15dee_1.conda @@ -60,10 +59,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda @@ -103,7 +100,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.48-h71f35ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda @@ -141,7 +138,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mfpymake-1.2.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda @@ -150,7 +146,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.0-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.98-h1d7d5a4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda @@ -196,7 +192,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.18.0-py39h9fdd4d6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py39h474f0d3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py39h6404dd3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py39h3d6467e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 @@ -205,7 +201,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py39hd1e30aa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.4.10-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda @@ -235,14 +230,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda - - pypi: git+https://github.com/modflowpy/flopy.git@99b88848b4d18c1fb0ceb8424f5e056d3406b397 - - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@1f358de2bc721c1000c3d0823b9440776432e3b0 - - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/atk-1.0-2.38.0-h1d18e73_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/black-24.3.0-py39h6e9494a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/black-24.4.0-py39h6e9494a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bmipy-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h0dc2134_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h0dc2134_1.conda @@ -257,7 +249,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.1-py39h0ca7971_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/expat-2.6.2-h73e2aa4_0.conda @@ -285,10 +276,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk2-2.24.33-h8ca4665_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-8.3.0-hf45c392_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-73.2-hf5e326d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda @@ -316,7 +305,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-devel-0.22.5-h5ff76d1_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.0-h81c1438_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.0-h81c1438_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.22.5-h5ff76d1_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-devel-0.22.5-h5ff76d1_2.conda @@ -341,13 +330,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mfpymake-1.2.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4.20240210-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.12.0-h7728843_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py39h28c39a1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.2-h7310d3a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.2.1-hd75f5a5_1.conda @@ -386,7 +374,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.18.0-py39hcf47035_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.0-py39h0ed1e0f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.3-py39h19e25c1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda @@ -394,7 +382,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4-py39ha09f3b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.4.10-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-15.1.0-py39hdc70f33_0.conda @@ -408,14 +395,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h8a1eda9_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.5-h829000d_0.conda - - pypi: git+https://github.com/modflowpy/flopy.git@99b88848b4d18c1fb0ceb8424f5e056d3406b397 - - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@1f358de2bc721c1000c3d0823b9440776432e3b0 - - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hcb7b3dd_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.3.0-py39h2804cbe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.4.0-py39h2804cbe_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bmipy-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-hb547adb_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-hb547adb_1.conda @@ -430,7 +414,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.2.1-py39h48c5dd5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.6.2-hebf3989_0.conda @@ -458,10 +441,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk2-2.24.33-h7895bb2_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-8.3.0-h8f0ba13_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda @@ -489,7 +470,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-devel-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.0-hfc324ee_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.0-hfc324ee_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.22.5-h8fbad5d_2.conda @@ -514,13 +495,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mfpymake-1.2.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4.20240210-h078ce10_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.12.0-h2ffa867_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py39h7aa2656_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.1-h0d3ecfb_1.conda @@ -559,7 +539,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.18.0-py39h9a407ce_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.0-py39hcc04109_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.0.3-py39ha70ab96_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda @@ -567,7 +547,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4-py39h17cfd9d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.4.10-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-15.1.0-py39h0f82c59_0.conda @@ -581,13 +560,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-h53f4e23_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.5-h4f39d0f_0.conda - - pypi: git+https://github.com/modflowpy/flopy.git@99b88848b4d18c1fb0ceb8424f5e056d3406b397 - - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@1f358de2bc721c1000c3d0823b9440776432e3b0 - - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/black-24.3.0-py39hcbf5309_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/black-24.4.0-py39hcbf5309_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bmipy-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.1.0-hcfcfb64_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-hcfcfb64_1.conda @@ -602,7 +578,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.2.1-py39h1f6ef14_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/expat-2.6.2-h63175ca_0.conda @@ -624,22 +599,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/getopt-win32-0.1-hcfcfb64_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gettext-0.22.5-h5728263_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gettext-tools-0.22.5-h7d00a51_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.13-h63175ca_1003.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-2.50.0-had6c3a3_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.24.1-h001b923_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.1-hb4038d2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-8.3.0-h7ab893a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-73.2-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_964.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_965.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda @@ -663,8 +636,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h312136b_9.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-0.22.5-h5728263_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-devel-0.22.5-h5728263_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.9.3-default_haede6df_1009.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h2fffb23_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-devel-0.22.5-h5728263_2.conda @@ -692,14 +665,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mfpymake-1.2.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_692.conda - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.12.0-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py39hddb5d58_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.2-h3d672ee_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_1.conda @@ -743,17 +715,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.18.0-py39hf21820d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.0-py39hddb5d58_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/shapely-2.0.3-py39h61a8cf5_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/sip-6.7.12-py39h99910a6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.11.0-h91493d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.4-py39ha55989b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.4.10-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 @@ -781,9 +752,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.2.13-hcfcfb64_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.5-h12be248_0.conda - - pypi: git+https://github.com/modflowpy/flopy.git@99b88848b4d18c1fb0ceb8424f5e056d3406b397 - - pypi: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@1f358de2bc721c1000c3d0823b9440776432e3b0 - - pypi: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f packages: - kind: conda name: _libgcc_mutex @@ -842,8 +810,6 @@ packages: - python license: MIT license_family: MIT - purls: - - pkg:pypi/appdirs size: 12840 timestamp: 1603108499239 - kind: conda @@ -929,18 +895,16 @@ packages: - python >=3.7 license: MIT license_family: MIT - purls: - - pkg:pypi/attrs size: 54582 timestamp: 1704011393776 - kind: conda name: black - version: 24.3.0 + version: 24.4.0 build: py39h2804cbe_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.3.0-py39h2804cbe_0.conda - sha256: 8e14d423a9613ad2763949d9ecc8c0e740a46dfac2dba7307f2c6790796c7f49 - md5: c86e0fc313a494cc855e80c02959fbff + url: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.4.0-py39h2804cbe_0.conda + sha256: 3d12f3e21af54a94785ef6ee5171e21b8220567dccd2d8f57c1b438f96c3124c + md5: 60acbe8e0836174d8acdc0741edae95e depends: - click >=8.0.0 - mypy_extensions >=0.4.3 @@ -954,18 +918,16 @@ packages: - typing_extensions >=4.0.1 license: MIT license_family: MIT - purls: - - pkg:pypi/black - size: 296255 - timestamp: 1710785014536 + size: 295842 + timestamp: 1713170240040 - kind: conda name: black - version: 24.3.0 + version: 24.4.0 build: py39h6e9494a_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/black-24.3.0-py39h6e9494a_0.conda - sha256: 03d2486854754203540352e2ff94d9ddc4a25674c450f2a3cacaa682faf23b90 - md5: d1fd38166a4edfc6b81ca209ac7393d2 + url: https://conda.anaconda.org/conda-forge/osx-64/black-24.4.0-py39h6e9494a_0.conda + sha256: 242d81c1f42cc05251c14c026a46893b80049ff51245d238bd544169e6a3388d + md5: 6ff063cb36c442fe6c9fe1c967d63c3e depends: - click >=8.0.0 - mypy_extensions >=0.4.3 @@ -978,18 +940,16 @@ packages: - typing_extensions >=4.0.1 license: MIT license_family: MIT - purls: - - pkg:pypi/black - size: 296034 - timestamp: 1710785156011 + size: 296256 + timestamp: 1713170150683 - kind: conda name: black - version: 24.3.0 + version: 24.4.0 build: py39hcbf5309_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/black-24.3.0-py39hcbf5309_0.conda - sha256: 82c559179f6a4ea004c6b98bc3e1b9be73eb0d18dbdfa21db0a42967052d8fe4 - md5: 4dd94090f57c252ca7a8c7204171d52b + url: https://conda.anaconda.org/conda-forge/win-64/black-24.4.0-py39hcbf5309_0.conda + sha256: 68131bc0059be9c068c66e4bbbf001057f8203a1f7b225cd626e3adc76d52bcb + md5: 57a4ad13192a81129a2973401b273991 depends: - click >=8.0.0 - mypy_extensions >=0.4.3 @@ -1002,18 +962,16 @@ packages: - typing_extensions >=4.0.1 license: MIT license_family: MIT - purls: - - pkg:pypi/black - size: 310810 - timestamp: 1710785196689 + size: 312668 + timestamp: 1713170377640 - kind: conda name: black - version: 24.3.0 + version: 24.4.0 build: py39hf3d152e_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/black-24.3.0-py39hf3d152e_0.conda - sha256: 7a4d9a43600c24ac29845689e24465b6c15819ad53d35e7120197aaf0badd1bb - md5: 831bcbaf689b20fc85bf87eab3b5ee29 + url: https://conda.anaconda.org/conda-forge/linux-64/black-24.4.0-py39hf3d152e_0.conda + sha256: bf5180d0f08d4981ca0d634300159239e896f088fd3f2bb471f457f135d6170d + md5: f5c5f1be0443783cce4f8336c4ae3d4c depends: - click >=8.0.0 - mypy_extensions >=0.4.3 @@ -1026,10 +984,8 @@ packages: - typing_extensions >=4.0.1 license: MIT license_family: MIT - purls: - - pkg:pypi/black - size: 295298 - timestamp: 1710784875392 + size: 295618 + timestamp: 1713169849810 - kind: conda name: bmipy version: 2.0.1 @@ -1047,8 +1003,6 @@ packages: - python >=3 license: MIT license_family: MIT - purls: - - pkg:pypi/bmipy size: 14075 timestamp: 1698243713437 - kind: conda @@ -1209,8 +1163,6 @@ packages: - libbrotlicommon 1.1.0 hd590300_1 license: MIT license_family: MIT - purls: - - pkg:pypi/brotli size: 350065 timestamp: 1695990113673 - kind: conda @@ -1230,8 +1182,6 @@ packages: - libbrotlicommon 1.1.0 h0dc2134_1 license: MIT license_family: MIT - purls: - - pkg:pypi/brotli size: 367262 timestamp: 1695990623703 - kind: conda @@ -1253,8 +1203,6 @@ packages: - libbrotlicommon 1.1.0 hcfcfb64_1 license: MIT license_family: MIT - purls: - - pkg:pypi/brotli size: 321654 timestamp: 1695990742536 - kind: conda @@ -1275,8 +1223,6 @@ packages: - libbrotlicommon 1.1.0 hb547adb_1 license: MIT license_family: MIT - purls: - - pkg:pypi/brotli size: 344364 timestamp: 1695991093404 - kind: conda @@ -1492,8 +1438,6 @@ packages: depends: - python >=3.7 license: ISC - purls: - - pkg:pypi/certifi size: 160559 timestamp: 1707022289175 - kind: conda @@ -1509,8 +1453,6 @@ packages: - python >=3.7 license: MIT license_family: MIT - purls: - - pkg:pypi/charset-normalizer size: 46597 timestamp: 1698833765762 - kind: conda @@ -1527,8 +1469,6 @@ packages: - python >=3.8 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/click size: 84437 timestamp: 1692311973840 - kind: conda @@ -1546,8 +1486,6 @@ packages: - python >=3.8 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/click size: 85051 timestamp: 1692312207348 - kind: conda @@ -1563,8 +1501,6 @@ packages: - python >=3.7 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/colorama size: 25170 timestamp: 1666700778190 - kind: conda @@ -1580,8 +1516,6 @@ packages: - python >=3.5 license: MIT license_family: MIT - purls: - - pkg:pypi/configargparse size: 39491 timestamp: 1690138171226 - kind: conda @@ -1599,8 +1533,6 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/contourpy size: 232611 timestamp: 1712430213507 - kind: conda @@ -1620,8 +1552,6 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/contourpy size: 186813 timestamp: 1712430556544 - kind: conda @@ -1640,8 +1570,6 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/contourpy size: 225466 timestamp: 1712430376578 - kind: conda @@ -1660,8 +1588,6 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/contourpy size: 241771 timestamp: 1712430062056 - kind: conda @@ -1677,8 +1603,6 @@ packages: - python >=3.8 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/cycler size: 13458 timestamp: 1696677888423 - kind: conda @@ -1698,23 +1622,6 @@ packages: license_family: GPL size: 618596 timestamp: 1640112124844 -- kind: conda - name: editables - version: '0.5' - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - sha256: de160a7494e7bc72360eea6a29cbddf194d0a79f45ff417a4de20e6858cf79a9 - md5: 9873878e2a069bc358b69e9a29c1ecd5 - depends: - - python >=3.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/editables - size: 10988 - timestamp: 1705857085102 - kind: conda name: exceptiongroup version: 1.2.0 @@ -1728,8 +1635,6 @@ packages: depends: - python >=3.7 license: MIT and PSF-2.0 - purls: - - pkg:pypi/exceptiongroup size: 20551 timestamp: 1704921321122 - kind: conda @@ -1745,8 +1650,6 @@ packages: - python >=3.8 license: MIT license_family: MIT - purls: - - pkg:pypi/execnet size: 38883 timestamp: 1712591929944 - kind: conda @@ -1818,8 +1721,6 @@ packages: depends: - python >=3.7 license: Unlicense - purls: - - pkg:pypi/filelock size: 15707 timestamp: 1712686250786 - kind: conda @@ -1835,63 +1736,8 @@ packages: - python >=3.6 license: Apache-2.0 license_family: Apache - purls: - - pkg:pypi/flaky size: 22156 timestamp: 1710293112378 -- kind: pypi - name: flopy - version: 3.7.0.dev0 - url: git+https://github.com/modflowpy/flopy.git@99b88848b4d18c1fb0ceb8424f5e056d3406b397 - requires_dist: - - numpy <2.0.0, >=1.15.0 - - matplotlib >=1.4.0 - - pandas >=2.0.0 - - flopy[doc,lint,optional,test] ; extra == 'dev' - - flopy[optional] ; extra == 'doc' - - ipython[kernel] ; extra == 'doc' - - jupytext ; extra == 'doc' - - myst-parser ; extra == 'doc' - - nbconvert <7.14.0 ; extra == 'doc' - - nbsphinx ; extra == 'doc' - - pyyaml ; extra == 'doc' - - rtds-action ; extra == 'doc' - - sphinx ==7.1.2 ; extra == 'doc' - - sphinx-rtd-theme >=1 ; extra == 'doc' - - cffconvert ; extra == 'lint' - - ruff ; extra == 'lint' - - affine ; extra == 'optional' - - descartes ; extra == 'optional' - - fiona ; extra == 'optional' - - geojson ; extra == 'optional' - - geopandas ; extra == 'optional' - - imageio ; extra == 'optional' - - netcdf4 ; extra == 'optional' - - pyproj ; extra == 'optional' - - pyshp ; extra == 'optional' - - pyvista ; extra == 'optional' - - rasterio ; extra == 'optional' - - rasterstats ; extra == 'optional' - - scipy ; extra == 'optional' - - shapely >=1.8 ; extra == 'optional' - - vtk ; extra == 'optional' - - xmipy ; extra == 'optional' - - pymetis ; platform_system != 'Windows' and extra == 'optional' - - flopy[lint] ; extra == 'test' - - coverage ; extra == 'test' - - flaky ; extra == 'test' - - filelock ; extra == 'test' - - jupyter ; extra == 'test' - - jupytext ; extra == 'test' - - modflow-devtools ; extra == 'test' - - pytest !=8.1.0 ; extra == 'test' - - pytest-benchmark ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-dotenv ; extra == 'test' - - pytest-xdist ; extra == 'test' - - pyzmq >=25.1.2 ; extra == 'test' - - virtualenv ; extra == 'test' - requires_python: '>=3.8' - kind: conda name: font-ttf-dejavu-sans-mono version: '2.37' @@ -2065,8 +1911,6 @@ packages: - unicodedata2 >=14.0.0 license: MIT license_family: MIT - purls: - - pkg:pypi/fonttools size: 2182509 timestamp: 1712345020380 - kind: conda @@ -2085,8 +1929,6 @@ packages: - unicodedata2 >=14.0.0 license: MIT license_family: MIT - purls: - - pkg:pypi/fonttools size: 2200498 timestamp: 1712344949132 - kind: conda @@ -2108,8 +1950,6 @@ packages: - vc14_runtime >=14.29.30139 license: MIT license_family: MIT - purls: - - pkg:pypi/fonttools size: 1888597 timestamp: 1712345179196 - kind: conda @@ -2129,8 +1969,6 @@ packages: - unicodedata2 >=14.0.0 license: MIT license_family: MIT - purls: - - pkg:pypi/fonttools size: 2291843 timestamp: 1712344796788 - kind: conda @@ -2146,8 +1984,6 @@ packages: - python >=3.6 license: MIT license_family: MIT - purls: - - pkg:pypi/fortran-language-server size: 62350 timestamp: 1637570882364 - kind: conda @@ -2164,8 +2000,6 @@ packages: - python >=3.5 license: GPL-3.0-or-later license_family: GPL - purls: - - pkg:pypi/fprettify size: 137690 timestamp: 1637859635697 - kind: conda @@ -2601,15 +2435,16 @@ packages: - kind: conda name: glib version: 2.80.0 - build: h39d0aa6_4 - build_number: 4 + build: h39d0aa6_5 + build_number: 5 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_4.conda - sha256: 2fc5808143c904a6c33c4521a993fdadf18431f27063af6a7e90e3366a6f57f5 - md5: d0a05e8a76abb68b2beb7b16c6d49213 + url: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_5.conda + sha256: b1a73c6507378f666fce8a7085f36deee04aef72f32850ae5f03725bc363ebbd + md5: 987f0532ee1075a4ef5714fa4af4842b depends: - - glib-tools 2.80.0 h0a98069_4 - - libglib 2.80.0 h39d0aa6_4 + - glib-tools 2.80.0 h0a98069_5 + - libffi >=3.4,<4.0a0 + - libglib 2.80.0 h39d0aa6_5 - libintl >=0.22.5,<1.0a0 - libintl-devel - python * @@ -2617,58 +2452,59 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LGPL-2.1-or-later - size: 490761 - timestamp: 1712590680323 + size: 571049 + timestamp: 1713203829694 - kind: conda name: glib version: 2.80.0 - build: hf2295e7_4 - build_number: 4 + build: hf2295e7_5 + build_number: 5 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_4.conda - sha256: bc874908cc8b0ce26a20f09500aa2617114e72f5251ca4739fc6fd18a6196514 - md5: 5521382ee30b96b35eb0037fc3c4f2b4 + url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_5.conda + sha256: 082a1f095f7511ad4339a656714a0ed623758eb0a1caf69494702a59d86f598c + md5: 87562e94dd3948838172eb97175c0e42 depends: - - glib-tools 2.80.0 hde27a5a_4 + - glib-tools 2.80.0 hde27a5a_5 + - libffi >=3.4,<4.0a0 - libgcc-ng >=12 - - libglib 2.80.0 hf2295e7_4 + - libglib 2.80.0 hf2295e7_5 - python * license: LGPL-2.1-or-later - size: 503571 - timestamp: 1712590029172 + size: 599358 + timestamp: 1713203410775 - kind: conda name: glib-tools version: 2.80.0 - build: h0a98069_4 - build_number: 4 + build: h0a98069_5 + build_number: 5 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_4.conda - sha256: 319a2c785a992eaecc37d2280b4bb80096020e59382ec7193356f124d987aef1 - md5: 44cd44c004db728bf5788c1d46ce7334 + url: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_5.conda + sha256: f802e16d4f229938e320bf3bfa4334f48fdb6d58e1621778c001218c6d0137de + md5: a3fa92819125c3d9e21f7401427af890 depends: - - libglib 2.80.0 h39d0aa6_4 + - libglib 2.80.0 h39d0aa6_5 - libintl >=0.22.5,<1.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LGPL-2.1-or-later - size: 94161 - timestamp: 1712590633592 + size: 95213 + timestamp: 1713203782182 - kind: conda name: glib-tools version: 2.80.0 - build: hde27a5a_4 - build_number: 4 + build: hde27a5a_5 + build_number: 5 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_4.conda - sha256: 758e81f0460e273f5c44f5e84ba3fdec734a1cac65b2dde54c58c7f9f853964e - md5: c9deba4959ea5b5f72f1e3e4a71ae014 + url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_5.conda + sha256: 5d8a1e61d054a7147217f7ba9ad675f45f5b642c413a8d3e33ada224f62ba2a5 + md5: 349c38d491861ff6dd7746729912f2f7 depends: - libgcc-ng >=12 - - libglib 2.80.0 hf2295e7_4 + - libglib 2.80.0 hf2295e7_5 license: LGPL-2.1-or-later - size: 113192 - timestamp: 1712589995868 + size: 115170 + timestamp: 1713203374426 - kind: conda name: graphite2 version: 1.3.13 @@ -3158,30 +2994,6 @@ packages: license_family: MIT size: 1342172 timestamp: 1699925847743 -- kind: conda - name: hatchling - version: 1.22.5 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.22.5-pyhd8ed1ab_0.conda - sha256: 885d9070e97d17c07c003c1f346bf7e2efd41e301631bcc1a6fe348843491ed3 - md5: da3efaad48161b8e423a4e25842cb5f5 - depends: - - editables >=0.3 - - importlib-metadata - - packaging >=21.3 - - pathspec >=0.10.1 - - pluggy >=1.0.0 - - python >=3.7 - - tomli >=1.2.2 - - trove-classifiers - license: MIT - license_family: MIT - purls: - - pkg:pypi/hatchling - size: 62871 - timestamp: 1712264371126 - kind: conda name: icu version: '73.2' @@ -3250,28 +3062,8 @@ packages: - python >=3.6 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/idna size: 50124 timestamp: 1701027126206 -- kind: conda - name: importlib-metadata - version: 7.1.0 - build: pyha770c72_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.1.0-pyha770c72_0.conda - sha256: cc2e7d1f7f01cede30feafc1118b7aefa244d0a12224513734e24165ae12ba49 - md5: 0896606848b2dc5cebdf111b6543aa04 - depends: - - python >=3.8 - - zipp >=0.5 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/importlib-metadata - size: 27043 - timestamp: 1710971498183 - kind: conda name: importlib-resources version: 6.4.0 @@ -3304,8 +3096,6 @@ packages: - importlib-resources >=6.4.0,<6.4.1.0a0 license: Apache-2.0 license_family: APACHE - purls: - - pkg:pypi/importlib-resources size: 33056 timestamp: 1711041009039 - kind: conda @@ -3321,23 +3111,21 @@ packages: - python >=3.7 license: MIT license_family: MIT - purls: - - pkg:pypi/iniconfig size: 11101 timestamp: 1673103208955 - kind: conda name: intel-openmp version: 2024.1.0 - build: h57928b3_964 - build_number: 964 + build: h57928b3_965 + build_number: 965 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_964.conda - sha256: bea54e995cd79b0961ded5f0d6d1b8a55513283ccda74cedb3421a3764f7d679 - md5: 30ebb9fd99666d8b8675fcee541a09f3 + url: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_965.conda + sha256: 7b029e476ad6d401d645636ee3e4b40130bfcc9534f7415209dd5b666c6dd292 + md5: c66eb2fd33b999ccc258aef85689758e license: LicenseRef-ProprietaryIntel license_family: Proprietary - size: 1616281 - timestamp: 1712153179165 + size: 1617555 + timestamp: 1712943333029 - kind: conda name: jinja2 version: 3.1.3 @@ -3352,8 +3140,6 @@ packages: - python >=3.7 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/jinja2 size: 111589 timestamp: 1704967140287 - kind: conda @@ -3375,8 +3161,6 @@ packages: - rpds-py >=0.7.1 license: MIT license_family: MIT - purls: - - pkg:pypi/jsonschema size: 72817 timestamp: 1705707712082 - kind: conda @@ -3394,8 +3178,6 @@ packages: - referencing >=0.31.0 license: MIT license_family: MIT - purls: - - pkg:pypi/jsonschema-specifications size: 16431 timestamp: 1703778502971 - kind: conda @@ -3413,8 +3195,6 @@ packages: - traitlets >=5.3 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/jupyter-core size: 80149 timestamp: 1704727554036 - kind: conda @@ -3433,8 +3213,6 @@ packages: - traitlets >=5.3 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/jupyter-core size: 79895 timestamp: 1710257881036 - kind: conda @@ -3453,8 +3231,6 @@ packages: - traitlets >=5.3 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/jupyter-core size: 96366 timestamp: 1710257842034 - kind: conda @@ -3472,8 +3248,6 @@ packages: - traitlets >=5.3 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/jupyter-core size: 79658 timestamp: 1710257600539 - kind: conda @@ -3495,8 +3269,6 @@ packages: - toml license: MIT license_family: MIT - purls: - - pkg:pypi/jupytext size: 102909 timestamp: 1705172248226 - kind: conda @@ -3529,8 +3301,6 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/kiwisolver size: 55660 timestamp: 1695380433980 - kind: conda @@ -3549,8 +3319,6 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/kiwisolver size: 73457 timestamp: 1695380118523 - kind: conda @@ -3568,8 +3336,6 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/kiwisolver size: 60498 timestamp: 1695380322018 - kind: conda @@ -3588,8 +3354,6 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/kiwisolver size: 62080 timestamp: 1695380521068 - kind: conda @@ -4936,12 +4700,12 @@ packages: - kind: conda name: libglib version: 2.80.0 - build: h39d0aa6_4 - build_number: 4 + build: h39d0aa6_5 + build_number: 5 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_4.conda - sha256: d10bdffc193b37060598ddfe1840252aba6feca591f81a072eb1a801a3a635f2 - md5: 9baf04fc7002450a932cf97cb9625ebb + url: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_5.conda + sha256: 73ed5772acce96d0dc88c13000ee7678d12dda88b07ad721d4d20c807a98b6c2 + md5: c2e707c449ac60fa0ad8fbdd8f79327c depends: - libffi >=3.4,<4.0a0 - libiconv >=1.17,<2.0a0 @@ -4952,19 +4716,19 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - - glib 2.80.0 *_4 + - glib 2.80.0 *_5 license: LGPL-2.1-or-later - size: 2762416 - timestamp: 1712590564683 + size: 3699734 + timestamp: 1713203698247 - kind: conda name: libglib version: 2.80.0 - build: h81c1438_4 - build_number: 4 + build: h81c1438_5 + build_number: 5 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.0-h81c1438_4.conda - sha256: d950fa60ec4e27419b029f77ffb690abfc49cc8fb50cadb12930f802c9fee0b8 - md5: eb94cd8fdcb676d17a5119189f87c4ae + url: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.0-h81c1438_5.conda + sha256: a6778ec265222eb9277ec9f2e7519a80dadea0455c7d5386eab624d699346868 + md5: 9105a1c35c37d2908a543bdf7f08f80a depends: - libffi >=3.4,<4.0a0 - libiconv >=1.17,<2.0a0 @@ -4972,19 +4736,19 @@ packages: - libzlib >=1.2.13,<1.3.0a0 - pcre2 >=10.43,<10.44.0a0 constrains: - - glib 2.80.0 *_4 + - glib 2.80.0 *_5 license: LGPL-2.1-or-later - size: 2652294 - timestamp: 1712590118182 + size: 3645199 + timestamp: 1713203913332 - kind: conda name: libglib version: 2.80.0 - build: hf2295e7_4 - build_number: 4 + build: hf2295e7_5 + build_number: 5 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_4.conda - sha256: 99983c2514dd99da1bab50e9a25ed16cfc1d46aca0385c3be177c8e299731b51 - md5: 0269d2b7fa89f4a37cdee5ad6161f6cc + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_5.conda + sha256: 18233d83e0385afc50148520e5b9c6ee65886c41ecdc69e335f60a279fb7a1f5 + md5: 4423ae9726113b68e9527b27baae191f depends: - libffi >=3.4,<4.0a0 - libgcc-ng >=12 @@ -4992,19 +4756,19 @@ packages: - libzlib >=1.2.13,<1.3.0a0 - pcre2 >=10.43,<10.44.0a0 constrains: - - glib 2.80.0 *_4 + - glib 2.80.0 *_5 license: LGPL-2.1-or-later - size: 2900260 - timestamp: 1712589943666 + size: 3892640 + timestamp: 1713203313894 - kind: conda name: libglib version: 2.80.0 - build: hfc324ee_4 - build_number: 4 + build: hfc324ee_5 + build_number: 5 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.0-hfc324ee_4.conda - sha256: 48f371fcb374020c140b26dbfc9a6ef3fbc834334e8cca984120be7bffa6d1bf - md5: c0de76b2c1f1bee86ca8660684ab6ec4 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.0-hfc324ee_5.conda + sha256: 4aa0a6f358592bad428046a6928066ba9fb4d7f61cf6338a83fe544cfe927773 + md5: dfb5f524aacd7a8103527b2a3809d3e7 depends: - libffi >=3.4,<4.0a0 - libiconv >=1.17,<2.0a0 @@ -5012,10 +4776,10 @@ packages: - libzlib >=1.2.13,<1.3.0a0 - pcre2 >=10.43,<10.44.0a0 constrains: - - glib 2.80.0 *_4 + - glib 2.80.0 *_5 license: LGPL-2.1-or-later - size: 2638588 - timestamp: 1712590361453 + size: 2559555 + timestamp: 1713204185625 - kind: conda name: libgomp version: 13.2.0 @@ -5049,23 +4813,23 @@ packages: timestamp: 1708702470365 - kind: conda name: libhwloc - version: 2.9.3 - build: default_haede6df_1009 - build_number: 1009 + version: 2.10.0 + build: default_h2fffb23_1000 + build_number: 1000 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.9.3-default_haede6df_1009.conda - sha256: 2e8c4bb7173f281a8e13f333a23c9fb7a1c86d342d7dccdd74f2eb583ddde450 - md5: 87da045f6d26ce9fe20ad76a18f6a18a + url: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h2fffb23_1000.conda + sha256: e0d75da50e67a81e3cb37e2ee3b0d6ddc6543ec0f7b3828f884558552a1c4d93 + md5: ee944f0d41d9e2048f9d7492c1623ca3 depends: - - libxml2 >=2.11.5,<3.0.0a0 + - libxml2 >=2.12.6,<3.0a0 - pthreads-win32 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD - size: 2578462 - timestamp: 1694533393675 + size: 2376728 + timestamp: 1711491473761 - kind: conda name: libiconv version: '1.17' @@ -6429,8 +6193,6 @@ packages: - python >=3.8 license: MIT license_family: MIT - purls: - - pkg:pypi/markdown-it-py size: 64356 timestamp: 1686175179621 - kind: conda @@ -6449,8 +6211,6 @@ packages: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/markupsafe size: 23827 timestamp: 1706900341193 - kind: conda @@ -6468,8 +6228,6 @@ packages: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/markupsafe size: 23107 timestamp: 1706900243497 - kind: conda @@ -6490,8 +6248,6 @@ packages: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/markupsafe size: 26856 timestamp: 1706900665492 - kind: conda @@ -6510,8 +6266,6 @@ packages: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/markupsafe size: 24314 timestamp: 1706900151453 - kind: conda @@ -6612,8 +6366,6 @@ packages: - python_abi 3.9.* *_cp39 license: PSF-2.0 license_family: PSF - purls: - - pkg:pypi/matplotlib size: 6946151 timestamp: 1712606316061 - kind: conda @@ -6644,8 +6396,6 @@ packages: - python_abi 3.9.* *_cp39 license: PSF-2.0 license_family: PSF - purls: - - pkg:pypi/matplotlib size: 6942468 timestamp: 1712606780360 - kind: conda @@ -6677,8 +6427,6 @@ packages: - tk >=8.6.13,<8.7.0a0 license: PSF-2.0 license_family: PSF - purls: - - pkg:pypi/matplotlib size: 6722721 timestamp: 1712606079317 - kind: conda @@ -6710,8 +6458,6 @@ packages: - vc14_runtime >=14.29.30139 license: PSF-2.0 license_family: PSF - purls: - - pkg:pypi/matplotlib size: 6849548 timestamp: 1712606786181 - kind: conda @@ -6728,8 +6474,6 @@ packages: - python >=3.8 license: MIT license_family: MIT - purls: - - pkg:pypi/mdit-py-plugins size: 41197 timestamp: 1686175527330 - kind: conda @@ -6745,8 +6489,6 @@ packages: - python >=3.6 license: MIT license_family: MIT - purls: - - pkg:pypi/mdurl size: 14680 timestamp: 1704317789138 - kind: conda @@ -6764,32 +6506,8 @@ packages: - setuptools license: Apache-2.0 license_family: APACHE - purls: - - pkg:pypi/meson size: 628242 timestamp: 1700451735019 -- kind: conda - name: mfpymake - version: 1.2.9 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/mfpymake-1.2.9-pyhd8ed1ab_0.conda - sha256: 2fcd9fe875010d94c4b74ea45f0a25a91f46527b9b5f4a29875194c0b33d6a70 - md5: b34f31d00ff11d8baa25cda984196e1e - depends: - - meson - - networkx >=2.6.3 - - ninja - - numpy - - pydotplus - - python >=3.8 - - requests - license: CC0-1.0 - purls: - - pkg:pypi/mfpymake - size: 59409 - timestamp: 1707761286555 - kind: conda name: mkl version: 2024.1.0 @@ -6806,44 +6524,6 @@ packages: license_family: Proprietary size: 109491063 timestamp: 1712153746272 -- kind: pypi - name: modflow-devtools - version: 1.5.0.dev0 - url: git+https://github.com/MODFLOW-USGS/modflow-devtools.git@1f358de2bc721c1000c3d0823b9440776432e3b0 - requires_dist: - - sphinx ; extra == 'docs' - - sphinx-rtd-theme ; extra == 'docs' - - myst-parser ; extra == 'docs' - - ruff ; extra == 'lint' - - modflow-devtools[lint] ; extra == 'test' - - coverage ; extra == 'test' - - flaky ; extra == 'test' - - filelock ; extra == 'test' - - meson !=0.63.0 ; extra == 'test' - - ninja ; extra == 'test' - - numpy ; extra == 'test' - - pytest !=8.1.0 ; extra == 'test' - - pytest-cov ; extra == 'test' - - pytest-dotenv ; extra == 'test' - - pytest-xdist ; extra == 'test' - - pyyaml ; extra == 'test' - requires_python: '>=3.8' -- kind: pypi - name: modflowapi - version: 0.3.0.dev0 - url: git+https://github.com/MODFLOW-USGS/modflowapi.git@0c632e511fb54068d14dcdff44c572ccb6e8831f - requires_dist: - - numpy <2.0.0 - - pandas - - xmipy - - modflowapi[lint,test] ; extra == 'dev' - - ruff ; extra == 'lint' - - filelock ; extra == 'test' - - modflow-devtools ; extra == 'test' - - pytest !=8.1.0 ; extra == 'test' - - pytest-order ; extra == 'test' - - pytest-xdist ; extra == 'test' - requires_python: '>=3.9' - kind: conda name: mpg123 version: 1.32.6 @@ -6883,8 +6563,6 @@ packages: - python license: Apache-2.0 license_family: Apache - purls: - - pkg:pypi/munkres size: 12452 timestamp: 1600387789153 - kind: conda @@ -6900,8 +6578,6 @@ packages: - python >=3.5 license: MIT license_family: MIT - purls: - - pkg:pypi/mypy-extensions size: 10492 timestamp: 1675543414256 - kind: conda @@ -6958,8 +6634,6 @@ packages: - traitlets >=5.1 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/nbformat size: 101232 timestamp: 1712239122969 - kind: conda @@ -7015,69 +6689,67 @@ packages: - pandas >=1.4 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/networkx size: 1149552 timestamp: 1698504905258 - kind: conda name: ninja - version: 1.11.1 - build: h91493d7_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - sha256: 0ffb1912768af8354a930f482368ef170bf3d8217db328dfea1c8b09772c8c71 - md5: 44a99ef26178ea98626ff8e027702795 + version: 1.12.0 + build: h00ab1b0_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.12.0-h00ab1b0_0.conda + sha256: 7eae29099642b490ec9da49f7538a4c159fe34d9e6501cb60aefe0dbd46f35a5 + md5: b048701d52e7cbb5f59ddd4d3b17bbf5 depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vs2015_runtime >=14.29.30139 + - libgcc-ng >=12 + - libstdcxx-ng >=12 license: Apache-2.0 license_family: Apache - size: 279200 - timestamp: 1676838681615 + size: 2216778 + timestamp: 1713204746131 - kind: conda name: ninja - version: 1.11.1 - build: h924138e_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.11.1-h924138e_0.conda - sha256: b555247ac8859b4ff311e3d708a0640f1bfe9fae7125c485b444072474a84c41 - md5: 73a4953a2d9c115bdc10ff30a52f675f + version: 1.12.0 + build: h2ffa867_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.12.0-h2ffa867_0.conda + sha256: 634ff2cda6a77b9cd8935e748a1d5698f51f87f1a226638ddc95eb22f6a172ea + md5: 24e1b17a513393ee4e81e51fdab1fa93 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 + - libcxx >=16 license: Apache-2.0 license_family: Apache - size: 2251263 - timestamp: 1676837602636 + size: 111688 + timestamp: 1713205253264 - kind: conda name: ninja - version: 1.11.1 - build: hb8565cd_0 + version: 1.12.0 + build: h7728843_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda - sha256: 6f738d9a26fa275317b95b2b96832daab9059ef64af9a338f904a3cb684ae426 - md5: 49ad513efe39447aa51affd47e3aa68f + url: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.12.0-h7728843_0.conda + sha256: dcc10cbea89b1846c76d7df06023f23866e794beb6412fffafb2fce6da19db05 + md5: 1ac079f6ecddd2c336f3acb7b371851f depends: - - libcxx >=14.0.6 + - libcxx >=16 license: Apache-2.0 license_family: Apache - size: 121284 - timestamp: 1676837793132 + size: 124810 + timestamp: 1713204841161 - kind: conda name: ninja - version: 1.11.1 - build: hffc8910_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda - sha256: a594e90b0ed8202c280fff4a008f6a355d0db54a62b17067dc4a950370ddffc0 - md5: fdecec4002f41cf6ea1eea5b52947ee0 + version: 1.12.0 + build: h91493d7_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ninja-1.12.0-h91493d7_0.conda + sha256: b4ac4e9945e36981f90124d4e5620f51c061cbbf539bbd26aa46d5abc1faaa95 + md5: e67ab00f4d2c089864c2b8dcccf4dc58 depends: - - libcxx >=14.0.6 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache - size: 107047 - timestamp: 1676837935565 + size: 285887 + timestamp: 1713205275592 - kind: conda name: nspr version: '4.35' @@ -7131,8 +6803,6 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/numpy size: 6481665 timestamp: 1707226262838 - kind: conda @@ -7155,8 +6825,6 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/numpy size: 7039431 timestamp: 1707225726227 - kind: conda @@ -7179,8 +6847,6 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/numpy size: 5492058 timestamp: 1707226364958 - kind: conda @@ -7204,8 +6870,6 @@ packages: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/numpy size: 5920615 timestamp: 1707226471242 - kind: conda @@ -7364,8 +7028,6 @@ packages: - python >=3.8 license: Apache-2.0 license_family: APACHE - purls: - - pkg:pypi/packaging size: 49832 timestamp: 1710076089469 - kind: conda @@ -7388,8 +7050,6 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/pandas size: 11789934 timestamp: 1712783141414 - kind: conda @@ -7411,8 +7071,6 @@ packages: - pytz >=2020.1 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/pandas size: 12044460 timestamp: 1712783178045 - kind: conda @@ -7433,8 +7091,6 @@ packages: - pytz >=2020.1 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/pandas size: 12117482 timestamp: 1712783081291 - kind: conda @@ -7456,8 +7112,6 @@ packages: - pytz >=2020.1 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/pandas size: 12972826 timestamp: 1712782503380 - kind: conda @@ -7558,8 +7212,6 @@ packages: - python >=3.7 license: MPL-2.0 license_family: MOZILLA - purls: - - pkg:pypi/pathspec size: 41173 timestamp: 1702250135032 - kind: conda @@ -7648,8 +7300,6 @@ packages: - python_abi 3.9.* *_cp39 - tk >=8.6.13,<8.7.0a0 license: HPND - purls: - - pkg:pypi/pillow size: 40576213 timestamp: 1712155121473 - kind: conda @@ -7674,8 +7324,6 @@ packages: - python_abi 3.9.* *_cp39 - tk >=8.6.13,<8.7.0a0 license: HPND - purls: - - pkg:pypi/pillow size: 42433427 timestamp: 1712154625243 - kind: conda @@ -7699,8 +7347,6 @@ packages: - python_abi 3.9.* *_cp39 - tk >=8.6.13,<8.7.0a0 license: HPND - purls: - - pkg:pypi/pillow size: 42224219 timestamp: 1712154790265 - kind: conda @@ -7727,8 +7373,6 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: HPND - purls: - - pkg:pypi/pillow size: 42541715 timestamp: 1712155039095 - kind: conda @@ -7746,8 +7390,6 @@ packages: - wheel license: MIT license_family: MIT - purls: - - pkg:pypi/pip size: 1398245 timestamp: 1706960660581 - kind: conda @@ -7822,8 +7464,6 @@ packages: depends: - python >=3.6 license: MIT AND PSF-2.0 - purls: - - pkg:pypi/pkgutil-resolve-name size: 10778 timestamp: 1694617398467 - kind: conda @@ -7839,8 +7479,6 @@ packages: - python >=3.8 license: MIT license_family: MIT - purls: - - pkg:pypi/platformdirs size: 20210 timestamp: 1706713564353 - kind: conda @@ -7856,8 +7494,6 @@ packages: - python >=3.8 license: MIT license_family: MIT - purls: - - pkg:pypi/pluggy size: 23384 timestamp: 1706116931972 - kind: conda @@ -7874,8 +7510,6 @@ packages: - python >=2.6 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/ply size: 49196 timestamp: 1712243121626 - kind: conda @@ -7981,8 +7615,6 @@ packages: - python >=3.7 license: MIT license_family: MIT - purls: - - pkg:pypi/py-cpuinfo size: 24947 timestamp: 1666774595872 - kind: conda @@ -8001,8 +7633,6 @@ packages: - python >=3.6 license: MIT license_family: MIT - purls: - - pkg:pypi/pydotplus size: 24847 timestamp: 1622588237763 - kind: conda @@ -8018,8 +7648,6 @@ packages: - python >=3.6 license: MIT license_family: MIT - purls: - - pkg:pypi/pyparsing size: 89455 timestamp: 1709721146886 - kind: conda @@ -8041,8 +7669,6 @@ packages: - sip >=6.7.11,<6.8.0a0 license: GPL-3.0-only license_family: GPL - purls: - - pkg:pypi/pyqt5 size: 5227659 timestamp: 1695420723753 - kind: conda @@ -8065,8 +7691,6 @@ packages: - vc14_runtime >=14.29.30139 license: GPL-3.0-only license_family: GPL - purls: - - pkg:pypi/pyqt5 size: 3876568 timestamp: 1695421679054 - kind: conda @@ -8088,8 +7712,6 @@ packages: - toml license: GPL-3.0-only license_family: GPL - purls: - - pkg:pypi/pyqt5-sip size: 85034 timestamp: 1695418081052 - kind: conda @@ -8112,8 +7734,6 @@ packages: - vc14_runtime >=14.29.30139 license: GPL-3.0-only license_family: GPL - purls: - - pkg:pypi/pyqt5-sip size: 79633 timestamp: 1695418442270 - kind: conda @@ -8147,8 +7767,6 @@ packages: - win_inet_pton license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/pysocks size: 19348 timestamp: 1661605138291 - kind: conda @@ -8166,8 +7784,6 @@ packages: - python >=3.8 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/pysocks size: 18981 timestamp: 1661604969727 - kind: conda @@ -8191,8 +7807,6 @@ packages: - pytest-faulthandler >=2 license: MIT license_family: MIT - purls: - - pkg:pypi/pytest size: 255523 timestamp: 1709992719691 - kind: conda @@ -8210,8 +7824,6 @@ packages: - python >=3.5 license: BSD-2-Clause license_family: BSD - purls: - - pkg:pypi/pytest-benchmark size: 39571 timestamp: 1666782598879 - kind: conda @@ -8229,8 +7841,6 @@ packages: - python-dotenv >=0.9.1 license: MIT license_family: MIT - purls: - - pkg:pypi/pytest-dotenv size: 7383 timestamp: 1606859705188 - kind: conda @@ -8247,8 +7857,6 @@ packages: - python >=3.6 license: MIT license_family: MIT - purls: - - pkg:pypi/pytest-order size: 15851 timestamp: 1641771678634 - kind: conda @@ -8268,8 +7876,6 @@ packages: - psutil >=3.0 license: MIT license_family: MIT - purls: - - pkg:pypi/pytest-xdist size: 36516 timestamp: 1700593072448 - kind: conda @@ -8387,8 +7993,6 @@ packages: - six >=1.5 license: Apache-2.0 license_family: APACHE - purls: - - pkg:pypi/python-dateutil size: 222742 timestamp: 1709299922152 - kind: conda @@ -8404,8 +8008,6 @@ packages: - python >=3.8 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/python-dotenv size: 24278 timestamp: 1706018281544 - kind: conda @@ -8421,8 +8023,6 @@ packages: - python >=3.3 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/fastjsonschema size: 225250 timestamp: 1703781171097 - kind: conda @@ -8438,8 +8038,6 @@ packages: - python >=3.6 license: Apache-2.0 license_family: APACHE - purls: - - pkg:pypi/tzdata size: 144024 timestamp: 1707747742930 - kind: conda @@ -8515,8 +8113,6 @@ packages: - python >=3.7 license: MIT license_family: MIT - purls: - - pkg:pypi/pytz size: 188538 timestamp: 1706886944988 - kind: conda @@ -8536,8 +8132,6 @@ packages: - vc14_runtime >=14.29.30139 license: PSF-2.0 license_family: PSF - purls: - - pkg:pypi/pywin32 size: 5808124 timestamp: 1695974471118 - kind: conda @@ -8556,8 +8150,6 @@ packages: - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT - purls: - - pkg:pypi/pyyaml size: 159929 timestamp: 1695373838385 - kind: conda @@ -8578,8 +8170,6 @@ packages: - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT - purls: - - pkg:pypi/pyyaml size: 151118 timestamp: 1695373930963 - kind: conda @@ -8598,8 +8188,6 @@ packages: - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT - purls: - - pkg:pypi/pyyaml size: 178391 timestamp: 1695373606953 - kind: conda @@ -8617,8 +8205,6 @@ packages: - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT - purls: - - pkg:pypi/pyyaml size: 162428 timestamp: 1695373824922 - kind: conda @@ -8773,8 +8359,6 @@ packages: - rpds-py >=0.7.0 license: MIT license_family: MIT - purls: - - pkg:pypi/referencing size: 42071 timestamp: 1710763821612 - kind: conda @@ -8796,8 +8380,6 @@ packages: - chardet >=3.0.2,<6 license: Apache-2.0 license_family: APACHE - purls: - - pkg:pypi/requests size: 56690 timestamp: 1684774408600 - kind: conda @@ -8816,8 +8398,6 @@ packages: - __osx >=11.0 license: MIT license_family: MIT - purls: - - pkg:pypi/rpds-py size: 292859 timestamp: 1707923214688 - kind: conda @@ -8834,8 +8414,6 @@ packages: - python_abi 3.9.* *_cp39 license: MIT license_family: MIT - purls: - - pkg:pypi/rpds-py size: 915925 timestamp: 1707923007058 - kind: conda @@ -8853,8 +8431,6 @@ packages: - __osx >=10.12 license: MIT license_family: MIT - purls: - - pkg:pypi/rpds-py size: 300083 timestamp: 1707923366326 - kind: conda @@ -8873,8 +8449,6 @@ packages: - vc14_runtime >=14.29.30139 license: MIT license_family: MIT - purls: - - pkg:pypi/rpds-py size: 202481 timestamp: 1707923894221 - kind: conda @@ -8899,8 +8473,6 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/scipy size: 15767508 timestamp: 1712257544134 - kind: conda @@ -8925,8 +8497,6 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/scipy size: 16360934 timestamp: 1712256688151 - kind: conda @@ -8952,8 +8522,6 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/scipy size: 14629900 timestamp: 1712257309832 - kind: conda @@ -8977,27 +8545,23 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/scipy size: 14849543 timestamp: 1712257711116 - kind: conda name: setuptools - version: 69.2.0 + version: 69.5.1 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.2.0-pyhd8ed1ab_0.conda - sha256: 78a75c75a5dacda6de5f4056c9c990141bdaf4f64245673a590594d00bc63713 - md5: da214ecd521a720a9d521c68047682dc + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + sha256: 72d143408507043628b32bed089730b6d5f5445eccc44b59911ec9f262e365e7 + md5: 7462280d81f639363e6e63c81276bd9e depends: - python >=3.8 license: MIT license_family: MIT - purls: - - pkg:pypi/setuptools - size: 471183 - timestamp: 1710344615844 + size: 501790 + timestamp: 1713094963112 - kind: conda name: shapely version: 2.0.3 @@ -9013,8 +8577,6 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/shapely size: 449167 timestamp: 1708368412520 - kind: conda @@ -9035,8 +8597,6 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/shapely size: 450564 timestamp: 1708368463948 - kind: conda @@ -9055,8 +8615,6 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/shapely size: 479182 timestamp: 1708368191201 - kind: conda @@ -9075,8 +8633,6 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/shapely size: 446351 timestamp: 1708368614890 - kind: conda @@ -9097,8 +8653,6 @@ packages: - tomli license: GPL-3.0-only license_family: GPL - purls: - - pkg:pypi/sip size: 491742 timestamp: 1697300599649 - kind: conda @@ -9120,8 +8674,6 @@ packages: - vc14_runtime >=14.29.30139 license: GPL-3.0-only license_family: GPL - purls: - - pkg:pypi/sip size: 502390 timestamp: 1697300934198 - kind: conda @@ -9137,28 +8689,24 @@ packages: - python license: MIT license_family: MIT - purls: - - pkg:pypi/six size: 14259 timestamp: 1620240338595 - kind: conda name: tbb - version: 2021.11.0 - build: h91493d7_1 - build_number: 1 + version: 2021.12.0 + build: h91493d7_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.11.0-h91493d7_1.conda - sha256: aa30c089fdd6f66c7808592362e29963586e094159964a5fb61fb8efa9e349bc - md5: 21069f3ed16812f9f4f2700667b6ec86 + url: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-h91493d7_0.conda + sha256: 621926aae93513408bdca3dd21c97e2aa8ba7dcd2c400dab804fb0ce7da1387b + md5: 21745fdd12f01b41178596143cbecffd depends: - - libhwloc >=2.9.3,<2.9.4.0a0 + - libhwloc >=2.10.0,<2.10.1.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Apache-2.0 - license_family: APACHE - size: 161382 - timestamp: 1706164225098 + size: 161618 + timestamp: 1712960215111 - kind: conda name: tk version: 8.6.13 @@ -9235,8 +8783,6 @@ packages: - python >=2.7 license: MIT license_family: MIT - purls: - - pkg:pypi/toml size: 18433 timestamp: 1604308660817 - kind: conda @@ -9252,8 +8798,6 @@ packages: - python >=3.7 license: MIT license_family: MIT - purls: - - pkg:pypi/tomli size: 15940 timestamp: 1644342331069 - kind: conda @@ -9270,8 +8814,6 @@ packages: - python_abi 3.9.* *_cp39 license: Apache-2.0 license_family: Apache - purls: - - pkg:pypi/tornado size: 641216 timestamp: 1708363746873 - kind: conda @@ -9287,8 +8829,6 @@ packages: - python_abi 3.9.* *_cp39 license: Apache-2.0 license_family: Apache - purls: - - pkg:pypi/tornado size: 641481 timestamp: 1708363543532 - kind: conda @@ -9307,8 +8847,6 @@ packages: - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache - purls: - - pkg:pypi/tornado size: 644981 timestamp: 1708363806202 - kind: conda @@ -9325,8 +8863,6 @@ packages: - python_abi 3.9.* *_cp39 license: Apache-2.0 license_family: Apache - purls: - - pkg:pypi/tornado size: 639959 timestamp: 1708363320529 - kind: conda @@ -9342,27 +8878,8 @@ packages: - python >=3.8 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/traitlets size: 110288 timestamp: 1710254564088 -- kind: conda - name: trove-classifiers - version: 2024.4.10 - build: pyhd8ed1ab_0 - subdir: noarch - noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.4.10-pyhd8ed1ab_0.conda - sha256: cbc8e5c5f82b1eeff7aa21aaff77757336c1e6d64a4255b071c783acd60f4618 - md5: 9622d541e2314c0207bebdc0359fa478 - depends: - - python >=3.7 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/trove-classifiers - size: 18444 - timestamp: 1712814840654 - kind: conda name: typing_extensions version: 4.11.0 @@ -9376,8 +8893,6 @@ packages: - python >=3.8 license: PSF-2.0 license_family: PSF - purls: - - pkg:pypi/typing-extensions size: 37583 timestamp: 1712330089194 - kind: conda @@ -9420,8 +8935,6 @@ packages: - python_abi 3.9.* *_cp39 license: Apache-2.0 license_family: Apache - purls: - - pkg:pypi/unicodedata2 size: 376309 timestamp: 1695848358752 - kind: conda @@ -9440,8 +8953,6 @@ packages: - vc14_runtime >=14.29.30139 license: Apache-2.0 license_family: Apache - purls: - - pkg:pypi/unicodedata2 size: 373257 timestamp: 1695848310896 - kind: conda @@ -9458,8 +8969,6 @@ packages: - python_abi 3.9.* *_cp39 license: Apache-2.0 license_family: Apache - purls: - - pkg:pypi/unicodedata2 size: 373822 timestamp: 1695848128416 - kind: conda @@ -9475,8 +8984,6 @@ packages: - python_abi 3.9.* *_cp39 license: Apache-2.0 license_family: Apache - purls: - - pkg:pypi/unicodedata2 size: 369843 timestamp: 1695848310939 - kind: conda @@ -9494,8 +9001,6 @@ packages: - python >=3.7 license: MIT license_family: MIT - purls: - - pkg:pypi/urllib3 size: 94669 timestamp: 1708239595549 - kind: conda @@ -9561,8 +9066,6 @@ packages: - python >=3.8 license: MIT license_family: MIT - purls: - - pkg:pypi/wheel size: 57963 timestamp: 1711546009410 - kind: conda @@ -9579,8 +9082,6 @@ packages: - __win - python >=3.6 license: PUBLIC-DOMAIN - purls: - - pkg:pypi/win-inet-pton size: 8191 timestamp: 1667051294134 - kind: conda @@ -9695,8 +9196,6 @@ packages: - numpy - python >=3.8 license: CC0-1.0 - purls: - - pkg:pypi/xmipy size: 18460 timestamp: 1681486998644 - kind: conda @@ -10233,8 +9732,6 @@ packages: - python >=3.8 license: MIT license_family: MIT - purls: - - pkg:pypi/zipp size: 18954 timestamp: 1695255262261 - kind: conda diff --git a/pixi.toml b/pixi.toml index 766b352a163..82df3a24b1c 100644 --- a/pixi.toml +++ b/pixi.toml @@ -10,11 +10,9 @@ filelock = "*" flaky = "*" fortran-language-server = "*" fprettify = "*" -hatchling = "*" jupytext = "*" matplotlib = "*" meson = "1.3.0" -mfpymake = "*" networkx = "*" ninja = "*" numpy = "*" @@ -33,12 +31,19 @@ scipy = "*" shapely = "*" xmipy = "*" -[pypi-dependencies] -flopy = { git = "https://github.com/modflowpy/flopy.git" } -modflowapi = { git = "https://github.com/MODFLOW-USGS/modflowapi.git" } -modflow-devtools = { git = "https://github.com/MODFLOW-USGS/modflow-devtools.git" } - [tasks] +# install +install-flopy = "pip install --no-build-isolation --no-deps --disable-pip-version-check git+https://github.com/modflowpy/flopy.git" +install-pymake = "pip install --no-build-isolation --no-deps --disable-pip-version-check git+https://github.com/modflowpy/pymake.git" +install-modflowapi = "pip install --no-build-isolation --no-deps --disable-pip-version-check git+https://github.com/MODFLOW-USGS/modflowapi.git" +install-modflow-devtools = "pip install --no-build-isolation --no-deps --disable-pip-version-check git+https://github.com/MODFLOW-USGS/modflow-devtools.git" +install = { depends_on = [ + "install-flopy", + "install-pymake", + "install-modflowapi", + "install-modflow-devtools", +] } + # format fortran-format-check = "python .github/common/fortran_format_check.py" msvs-vfproj-check = "python .github/common/msvs_vfproj_check.py" From a3e7f56ac9fc4a0a3dfb294a81c008cf7087c4e2 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Wed, 17 Apr 2024 14:38:46 -0500 Subject: [PATCH 106/199] fix(grb): fix binary grid output (#1739) * fix a bug * update test to load the binary grid file * use consistent naming in binary grid file --- autotest/test_swf_dfw.py | 2 +- autotest/test_swf_dfw_beg2022.py | 2 +- autotest/test_swf_dfw_gwf.py | 2 +- autotest/test_swf_dfw_loop.py | 2 +- autotest/test_swf_vcatch.py | 7 +++++++ src/Model/Discretization/Dis2d.f90 | 5 ++--- src/Model/Discretization/Disv1d.f90 | 8 ++++++-- 7 files changed, 19 insertions(+), 9 deletions(-) diff --git a/autotest/test_swf_dfw.py b/autotest/test_swf_dfw.py index cdc6d393f89..04d20215143 100644 --- a/autotest/test_swf_dfw.py +++ b/autotest/test_swf_dfw.py @@ -165,7 +165,7 @@ def check_output(idx, test): grb = flopy.mf6.utils.MfGrdFile(fpth) ia = grb.ia ja = grb.ja - assert ia.shape[0] == grb.nodes + 1, "ia in grb file is not correct size" + assert ia.shape[0] == grb.ncells + 1, "ia in grb file is not correct size" # read stage file fpth = test.workspace / f"{name}.stage" diff --git a/autotest/test_swf_dfw_beg2022.py b/autotest/test_swf_dfw_beg2022.py index f2d79fe40b3..10abf5c4167 100644 --- a/autotest/test_swf_dfw_beg2022.py +++ b/autotest/test_swf_dfw_beg2022.py @@ -277,7 +277,7 @@ def check_output(idx, test): grb = flopy.mf6.utils.MfGrdFile(fpth) ia = grb.ia ja = grb.ja - assert ia.shape[0] == grb.nodes + 1, "ia in grb file is not correct size" + assert ia.shape[0] == grb.ncells + 1, "ia in grb file is not correct size" # check to make sure stage file can be read fpth = test.workspace / f"{name}.stage" diff --git a/autotest/test_swf_dfw_gwf.py b/autotest/test_swf_dfw_gwf.py index e953a480d07..0933458b08a 100644 --- a/autotest/test_swf_dfw_gwf.py +++ b/autotest/test_swf_dfw_gwf.py @@ -237,7 +237,7 @@ def check_output(idx, test): grb = flopy.mf6.utils.MfGrdFile(fpth) ia = grb.ia ja = grb.ja - assert ia.shape[0] == grb.nodes + 1, "ia in grb file is not correct size" + assert ia.shape[0] == grb.ncells + 1, "ia in grb file is not correct size" # read stage file fpth = test.workspace / f"{name}.stage" diff --git a/autotest/test_swf_dfw_loop.py b/autotest/test_swf_dfw_loop.py index 590ab24b4ae..0a7ecb78f19 100644 --- a/autotest/test_swf_dfw_loop.py +++ b/autotest/test_swf_dfw_loop.py @@ -443,7 +443,7 @@ def check_output(idx, test): fpth = test.workspace / f"{name}.disv1d.grb" grb = flopy.mf6.utils.MfGrdFile(fpth) ia = grb.ia - assert ia.shape[0] == grb.nodes + 1, "ia in grb file is not correct size" + assert ia.shape[0] == grb.ncells + 1, "ia in grb file is not correct size" # read stage file fpth = test.workspace / f"{name}.stage" diff --git a/autotest/test_swf_vcatch.py b/autotest/test_swf_vcatch.py index 2a24ee2ee9e..9cf0bc9d903 100644 --- a/autotest/test_swf_vcatch.py +++ b/autotest/test_swf_vcatch.py @@ -245,6 +245,13 @@ def check_output(idx, test): if makeplot: make_plot(test, mfsim) + # read the binary grid file + fpth = test.workspace / f"{swfname}.dis2d.grb" + grb = flopy.mf6.utils.MfGrdFile(fpth) + ia = grb.ia + ja = grb.ja + assert ia.shape[0] == grb.ncells + 1, "ia in grb file is not correct size" + # read binary stage file fpth = test.workspace / f"{swfname}.stage" sobj = flopy.utils.HeadFile(fpth, precision="double", text="STAGE") diff --git a/src/Model/Discretization/Dis2d.f90 b/src/Model/Discretization/Dis2d.f90 index adc3698354a..2302d85f9c8 100644 --- a/src/Model/Discretization/Dis2d.f90 +++ b/src/Model/Discretization/Dis2d.f90 @@ -490,7 +490,7 @@ subroutine write_grb(this, icelltype) class(Dis2dType) :: this integer(I4B), dimension(:), intent(in) :: icelltype ! -- local - integer(I4B) :: iunit, ntxt, ncpl + integer(I4B) :: iunit, ntxt integer(I4B), parameter :: lentxt = 100 character(len=50) :: txthdr character(len=lentxt) :: txt @@ -500,8 +500,7 @@ subroutine write_grb(this, icelltype) &/,6X,'UNIT NUMBER: ', I0,/,6X, 'FILE NAME: ', A)" ! ! -- Initialize - ntxt = 16 - ncpl = this%nrow * this%ncol + ntxt = 14 ! ! -- Open the file fname = trim(this%input_fname)//'.grb' diff --git a/src/Model/Discretization/Disv1d.f90 b/src/Model/Discretization/Disv1d.f90 index 4d3b2e0ee14..357f7a72bb1 100644 --- a/src/Model/Discretization/Disv1d.f90 +++ b/src/Model/Discretization/Disv1d.f90 @@ -873,7 +873,7 @@ subroutine write_grb(this, icelltype) &/,6X,'UNIT NUMBER: ', I0,/,6X, 'FILE NAME: ', A)" ! ! -- Initialize - ntxt = 9 + ntxt = 10 if (this%nvert > 0) ntxt = ntxt + 5 ! ! -- Open the file @@ -898,7 +898,7 @@ subroutine write_grb(this, icelltype) write (iunit) txthdr ! ! -- write variable definitions - write (txt, '(3a, i0)') 'NODES ', 'INTEGER ', 'NDIM 0 # ', this%nodesuser + write (txt, '(3a, i0)') 'NCELLS ', 'INTEGER ', 'NDIM 0 # ', this%nodesuser txt(lentxt:lentxt) = new_line('a') write (iunit) txt write (txt, '(3a, i0)') 'NJA ', 'INTEGER ', 'NDIM 0 # ', this%con%nja @@ -913,6 +913,9 @@ subroutine write_grb(this, icelltype) write (txt, '(3a, 1pg24.15)') 'ANGROT ', 'DOUBLE ', 'NDIM 0 # ', this%angrot txt(lentxt:lentxt) = new_line('a') write (iunit) txt + write (txt, '(3a, i0)') 'BOTM ', 'DOUBLE ', 'NDIM 1 ', this%nodesuser + txt(lentxt:lentxt) = new_line('a') + write (iunit) txt write (txt, '(3a, i0)') 'IA ', 'INTEGER ', 'NDIM 1 ', this%nodesuser + 1 txt(lentxt:lentxt) = new_line('a') write (iunit) txt @@ -951,6 +954,7 @@ subroutine write_grb(this, icelltype) write (iunit) this%xorigin ! xorigin write (iunit) this%yorigin ! yorigin write (iunit) this%angrot ! angrot + write (iunit) this%bottom ! botm write (iunit) this%con%iausr ! ia write (iunit) this%con%jausr ! ja write (iunit) icelltype ! icelltype From bbcb0399e1ebdb4b65ba15c3d97fec5ed41ca670 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Thu, 18 Apr 2024 07:57:44 -0500 Subject: [PATCH 107/199] fix(uzf): rename uzf package variables to avoid name clashes (#1742) * fix(uzf): rename uzf package variables to avoid name clashes * 9 uzf variables had counterparts in uzf%uzfobj with the same memory path * renamed the uzf package variables by adding _pvar to them * close #1741 This does not fix underlying memory problems with UZF. Instead it is a simple way to avoid multiple uzf variables with the same memory path. A proper fix will require additional work as the variable contents in uzf and uzf%uzfobj are not the same. * fprettifying * clean up a few variables that can be replaced with dis%top, dis%bot, and dis%area * gwet was named to gwet_pvar * fprettify --- src/Model/GroundWaterFlow/gwf-uzf.f90 | 153 +++++++++++++------------- 1 file changed, 75 insertions(+), 78 deletions(-) diff --git a/src/Model/GroundWaterFlow/gwf-uzf.f90 b/src/Model/GroundWaterFlow/gwf-uzf.f90 index 1ed322dcd92..15fedad3b83 100644 --- a/src/Model/GroundWaterFlow/gwf-uzf.f90 +++ b/src/Model/GroundWaterFlow/gwf-uzf.f90 @@ -61,15 +61,12 @@ module UzfModule ! ! -- pointer to gwf variables integer(I4B), pointer :: gwfiss => null() - real(DP), dimension(:), pointer, contiguous :: gwftop => null() - real(DP), dimension(:), pointer, contiguous :: gwfbot => null() - real(DP), dimension(:), pointer, contiguous :: gwfarea => null() real(DP), dimension(:), pointer, contiguous :: gwfhcond => null() ! ! -- uzf data - integer(I4B), pointer :: ntrail => null() + integer(I4B), pointer :: nwav_pvar => null() + integer(I4B), pointer :: ntrail_pvar => null() integer(I4B), pointer :: nsets => null() - integer(I4B), pointer :: nwav => null() integer(I4B), pointer :: nodes => null() integer(I4B), pointer :: readflag => null() integer(I4B), pointer :: ietflag => null() !< et flag, 0 is off, 1 or 2 are different types @@ -87,7 +84,7 @@ module UzfModule real(DP), dimension(:), pointer, contiguous :: rejinf0 => null() real(DP), dimension(:), pointer, contiguous :: rejinftomvr => null() real(DP), dimension(:), pointer, contiguous :: infiltration => null() - real(DP), dimension(:), pointer, contiguous :: gwet => null() + real(DP), dimension(:), pointer, contiguous :: gwet_pvar => null() real(DP), dimension(:), pointer, contiguous :: uzet => null() real(DP), dimension(:), pointer, contiguous :: gwd => null() real(DP), dimension(:), pointer, contiguous :: gwd0 => null() @@ -98,14 +95,17 @@ module UzfModule real(DP), dimension(:), pointer, contiguous :: wcnew => null() !< water content for this time step real(DP), dimension(:), pointer, contiguous :: wcold => null() !< water content for previous time step ! - ! -- timeseries aware variables - real(DP), dimension(:), pointer, contiguous :: sinf => null() - real(DP), dimension(:), pointer, contiguous :: pet => null() + ! -- timeseries aware package variables; these variables with + ! _pvar have uzfobj counterparts + real(DP), dimension(:), pointer, contiguous :: sinf_pvar => null() + real(DP), dimension(:), pointer, contiguous :: pet_pvar => null() real(DP), dimension(:), pointer, contiguous :: extdp => null() - real(DP), dimension(:), pointer, contiguous :: extwc => null() - real(DP), dimension(:), pointer, contiguous :: ha => null() - real(DP), dimension(:), pointer, contiguous :: hroot => null() - real(DP), dimension(:), pointer, contiguous :: rootact => null() + real(DP), dimension(:), pointer, contiguous :: extwc_pvar => null() + real(DP), dimension(:), pointer, contiguous :: ha_pvar => null() + real(DP), dimension(:), pointer, contiguous :: hroot_pvar => null() + real(DP), dimension(:), pointer, contiguous :: rootact_pvar => null() + ! + ! -- aux variable real(DP), dimension(:, :), pointer, contiguous :: uauxvar => null() ! ! -- convergence check @@ -281,7 +281,7 @@ subroutine uzf_allocate_arrays(this) this%memoryPath) call mem_allocate(this%infiltration, this%nodes, 'INFILTRATION', & this%memoryPath) - call mem_allocate(this%gwet, this%nodes, 'GWET', this%memoryPath) + call mem_allocate(this%gwet_pvar, this%nodes, 'GWET_PVAR', this%memoryPath) call mem_allocate(this%uzet, this%nodes, 'UZET', this%memoryPath) call mem_allocate(this%gwd, this%nodes, 'GWD', this%memoryPath) call mem_allocate(this%gwd0, this%nodes, 'GWD0', this%memoryPath) @@ -296,13 +296,14 @@ subroutine uzf_allocate_arrays(this) call mem_allocate(this%ja, this%nodes, 'JA', this%memoryPath) ! ! -- allocate timeseries aware variables - call mem_allocate(this%sinf, this%nodes, 'SINF', this%memoryPath) - call mem_allocate(this%pet, this%nodes, 'PET', this%memoryPath) - call mem_allocate(this%extdp, this%nodes, 'EXDP', this%memoryPath) - call mem_allocate(this%extwc, this%nodes, 'EXTWC', this%memoryPath) - call mem_allocate(this%ha, this%nodes, 'HA', this%memoryPath) - call mem_allocate(this%hroot, this%nodes, 'HROOT', this%memoryPath) - call mem_allocate(this%rootact, this%nodes, 'ROOTACT', this%memoryPath) + call mem_allocate(this%sinf_pvar, this%nodes, 'SINF_PVAR', this%memoryPath) + call mem_allocate(this%pet_pvar, this%nodes, 'PET_PVAR', this%memoryPath) + call mem_allocate(this%extdp, this%nodes, 'EXDP_PVAR', this%memoryPath) + call mem_allocate(this%extwc_pvar, this%nodes, 'EXTWC_PVAR', this%memoryPath) + call mem_allocate(this%ha_pvar, this%nodes, 'HA_PVAR', this%memoryPath) + call mem_allocate(this%hroot_pvar, this%nodes, 'HROOT_PVAR', this%memoryPath) + call mem_allocate(this%rootact_pvar, this%nodes, 'ROOTACT_PVAR', & + this%memoryPath) call mem_allocate(this%uauxvar, this%naux, this%nodes, 'UAUXVAR', & this%memoryPath) ! @@ -312,7 +313,7 @@ subroutine uzf_allocate_arrays(this) this%rejinf(i) = DZERO this%rejinf0(i) = DZERO this%rejinftomvr(i) = DZERO - this%gwet(i) = DZERO + this%gwet_pvar(i) = DZERO this%uzet(i) = DZERO this%gwd(i) = DZERO this%gwd0(i) = DZERO @@ -324,13 +325,13 @@ subroutine uzf_allocate_arrays(this) ! -- integer variables this%ja(i) = 0 ! -- timeseries aware variables - this%sinf(i) = DZERO - this%pet(i) = DZERO + this%sinf_pvar(i) = DZERO + this%pet_pvar(i) = DZERO this%extdp(i) = DZERO - this%extwc(i) = DZERO - this%ha(i) = DZERO - this%hroot(i) = DZERO - this%rootact(i) = DZERO + this%extwc_pvar(i) = DZERO + this%ha_pvar(i) = DZERO + this%hroot_pvar(i) = DZERO + this%rootact_pvar(i) = DZERO do j = 1, this%naux if (this%iauxmultcol > 0 .and. j == this%iauxmultcol) then this%uauxvar(j, i) = DONE @@ -533,7 +534,7 @@ subroutine uzf_readdimensions(this) ! ! -- initialize dimensions to -1 this%nodes = -1 - this%ntrail = 0 + this%ntrail_pvar = 0 this%nsets = 0 ! ! -- get dimensions block @@ -553,8 +554,8 @@ subroutine uzf_readdimensions(this) this%nodes = this%parser%GetInteger() write (this%iout, '(4x,a,i0)') 'NUZFCELLS = ', this%nodes case ('NTRAILWAVES') - this%ntrail = this%parser%GetInteger() - write (this%iout, '(4x,a,i0)') 'NTRAILWAVES = ', this%ntrail + this%ntrail_pvar = this%parser%GetInteger() + write (this%iout, '(4x,a,i0)') 'NTRAILWAVES = ', this%ntrail_pvar case ('NWAVESETS') this%nsets = this%parser%GetInteger() write (this%iout, '(4x,a,i0)') 'NTRAILSETS = ', this%nsets @@ -580,7 +581,7 @@ subroutine uzf_readdimensions(this) call store_error(errmsg) end if - if (this%ntrail <= 0) then + if (this%ntrail_pvar <= 0) then write (errmsg, '(a)') & 'NTRAILWAVES was not specified or was specified incorrectly.' call store_error(errmsg) @@ -598,7 +599,7 @@ subroutine uzf_readdimensions(this) end if ! ! -- set the number of waves - this%nwav = this%ntrail * this%nsets + this%nwav_pvar = this%ntrail_pvar * this%nsets ! ! -- Call define_listlabel to construct the list label that is written ! when PRINT_INPUT option is used. @@ -609,13 +610,8 @@ subroutine uzf_readdimensions(this) ! ! -- initialize uzf group object allocate (this%uzfobj) - call this%uzfobj%init(this%nodes, this%nwav, this%memoryPath) - call this%uzfobjwork%init(1, this%nwav) - ! - ! -- Set pointers to GWF model arrays - call mem_setptr(this%gwftop, 'TOP', create_mem_path(this%name_model, 'DIS')) - call mem_setptr(this%gwfbot, 'BOT', create_mem_path(this%name_model, 'DIS')) - call mem_setptr(this%gwfarea, 'AREA', create_mem_path(this%name_model, 'DIS')) + call this%uzfobj%init(this%nodes, this%nwav_pvar, this%memoryPath) + call this%uzfobjwork%init(1, this%nwav_pvar) ! !--Read uzf cell properties and set values call this%read_cell_properties() @@ -795,7 +791,7 @@ subroutine uzf_rp(this) ! -- FINF call this%parser%GetStringCaps(text) jj = 1 ! For SINF - bndElem => this%sinf(i) + bndElem => this%sinf_pvar(i) call read_value_or_time_series_adv(text, i, jj, bndElem, this%packName, & 'BND', this%tsManager, this%iprpak, & 'SINF') @@ -803,7 +799,7 @@ subroutine uzf_rp(this) ! -- PET call this%parser%GetStringCaps(text) jj = 1 ! For PET - bndElem => this%pet(i) + bndElem => this%pet_pvar(i) call read_value_or_time_series_adv(text, i, jj, bndElem, this%packName, & 'BND', this%tsManager, this%iprpak, & 'PET') @@ -819,7 +815,7 @@ subroutine uzf_rp(this) ! -- EXTWC call this%parser%GetStringCaps(text) jj = 1 ! For EXTWC - bndElem => this%extwc(i) + bndElem => this%extwc_pvar(i) call read_value_or_time_series_adv(text, i, jj, bndElem, this%packName, & 'BND', this%tsManager, this%iprpak, & 'EXTWC') @@ -827,7 +823,7 @@ subroutine uzf_rp(this) ! -- HA call this%parser%GetStringCaps(text) jj = 1 ! For HA - bndElem => this%ha(i) + bndElem => this%ha_pvar(i) call read_value_or_time_series_adv(text, i, jj, bndElem, this%packName, & 'BND', this%tsManager, this%iprpak, & 'HA') @@ -835,7 +831,7 @@ subroutine uzf_rp(this) ! -- HROOT call this%parser%GetStringCaps(text) jj = 1 ! For HROOT - bndElem => this%hroot(i) + bndElem => this%hroot_pvar(i) call read_value_or_time_series_adv(text, i, jj, bndElem, this%packName, & 'BND', this%tsManager, this%iprpak, & 'HROOT') @@ -843,7 +839,7 @@ subroutine uzf_rp(this) ! -- ROOTACT call this%parser%GetStringCaps(text) jj = 1 ! For ROOTACT - bndElem => this%rootact(i) + bndElem => this%rootact_pvar(i) call read_value_or_time_series_adv(text, i, jj, bndElem, this%packName, & 'BND', this%tsManager, this%iprpak, & 'ROOTACT') @@ -871,15 +867,15 @@ subroutine uzf_rp(this) ! -- write data to the table call this%inputtab%add_term(i) call this%inputtab%add_term(cellid) - call this%inputtab%add_term(this%sinf(i)) + call this%inputtab%add_term(this%sinf_pvar(i)) if (this%ietflag /= 0) then - call this%inputtab%add_term(this%pet(i)) + call this%inputtab%add_term(this%pet_pvar(i)) call this%inputtab%add_term(this%extdp(i)) - call this%inputtab%add_term(this%extwc(i)) + call this%inputtab%add_term(this%extwc_pvar(i)) if (this%ietflag == 2) then - call this%inputtab%add_term(this%ha(i)) - call this%inputtab%add_term(this%hroot(i)) - call this%inputtab%add_term(this%rootact(i)) + call this%inputtab%add_term(this%ha_pvar(i)) + call this%inputtab%add_term(this%hroot_pvar(i)) + call this%inputtab%add_term(this%rootact_pvar(i)) end if end if if (this%inamedbound == 1) then @@ -991,22 +987,22 @@ subroutine uzf_ad(this) end if ! ! -- FINF - rval1 = this%sinf(i) + rval1 = this%sinf_pvar(i) call this%uzfobj%setdatafinf(i, rval1) ! ! -- PET, EXTDP - rval1 = this%pet(i) + rval1 = this%pet_pvar(i) rval2 = this%extdp(i) call this%uzfobj%setdataet(i, ivertflag, rval1, rval2) ! ! -- ETWC - rval1 = this%extwc(i) + rval1 = this%extwc_pvar(i) call this%uzfobj%setdataetwc(i, ivertflag, rval1) ! ! -- HA, HROOT, ROOTACT - rval1 = this%ha(i) - rval2 = this%hroot(i) - rval3 = this%rootact(i) + rval1 = this%ha_pvar(i) + rval2 = this%hroot_pvar(i) + rval3 = this%rootact_pvar(i) call this%uzfobj%setdataetha(i, ivertflag, rval1, rval2, rval3) end do ! @@ -1435,7 +1431,7 @@ subroutine uzf_cq(this, x, flowja, iadv) this%gwd(i) = q ! ! -- calculate and store remaining budget terms - this%gwet(i) = this%uzfobj%gwet(i) + this%gwet_pvar(i) = this%uzfobj%gwet(i) this%uzet(i) = this%uzfobj%etact(i) * this%uzfobj%uzfarea(i) / delt ! ! -- End of UZF cell loop @@ -1518,7 +1514,7 @@ subroutine uzf_bd(this, model_budget) ! ! -- groundwater et (gwet array is positive, so switch ratin/ratout) if (this%igwetflag /= 0) then - call rate_accumulator(-this%gwet, ratin, ratout) + call rate_accumulator(-this%gwet_pvar, ratin, ratout) call model_budget%addentry(ratin, ratout, delt, this%bdtxt(4), & isuppress_output, this%packName) end if @@ -1593,7 +1589,7 @@ subroutine uzf_ot_model_flows(this, icbcfl, ibudfl, icbcun, imap) trim(this%packName)//') FLOW RATES' call save_print_model_flows(icbcfl, ibudfl, icbcun, this%iprflow, & this%outputtab, this%nbound, this%nodelist, & - -this%gwet, this%ibound, title, & + -this%gwet_pvar, this%ibound, title, & this%bdtxt(itxt), this%ipakcb, this%dis, & this%naux, this%name_model, this%name_model, & this%name_model, this%packName, this%auxname, & @@ -1968,7 +1964,7 @@ subroutine read_cell_properties(this) 'must be greater than 0 (specified value is', surfdep, ').' call store_error(errmsg) end if - if (surfdep >= this%GWFTOP(ic) - this%GWFBOT(ic)) then + if (surfdep >= this%dis%top(ic) - this%dis%bot(ic)) then write (errmsg, '(a,1x,i0,1x,a)') & 'SURFDEP for uzf cell', i, & 'cannot be greater than the cell thickness.' @@ -2029,9 +2025,10 @@ subroutine read_cell_properties(this) ! -- set data if there are no data errors if (count_errors() == 0) then n = this%igwfnode(i) - call this%uzfobj%setdata(i, this%gwfarea(n), this%gwftop(n), & - this%gwfbot(n), surfdep, vks, thtr, thts, & - thti, eps, this%ntrail, landflag, ivertcon) + call this%uzfobj%setdata(i, this%dis%area(n), this%dis%top(n), & + this%dis%bot(n), surfdep, vks, thtr, thts, & + thti, eps, this%ntrail_pvar, landflag, & + ivertcon) if (ivertcon > 0) then this%iuzf2uzf = 1 end if @@ -2388,7 +2385,7 @@ subroutine uzf_bd_obs(this) end if case ('UZF-GWET') if (this%igwetflag > 0) then - v = this%gwet(n) + v = this%gwet_pvar(n) if (v > DZERO) then v = -v end if @@ -2528,7 +2525,7 @@ subroutine uzf_rp_obs(this) ! ! -- determine maximum cell depth ! -- This is presently complicated for landflag = 1 cells and surfdep - ! greater than zero. In this case, celtop is gwftop - surfdep. + ! greater than zero. In this case, celtop is dis%top - surfdep. iuzid = obsrv%intPak1 dmax = this%uzfobj%celtop(iuzid) - this%uzfobj%celbot(iuzid) ! -- check that obs depth is valid; call store_error if not @@ -2641,11 +2638,11 @@ subroutine uzf_allocate_scalars(this) call mem_allocate(this%ibudgetout, 'IBUDGETOUT', this%memoryPath) call mem_allocate(this%ibudcsv, 'IBUDCSV', this%memoryPath) call mem_allocate(this%ipakcsv, 'IPAKCSV', this%memoryPath) - call mem_allocate(this%ntrail, 'NTRAIL', this%memoryPath) + call mem_allocate(this%ntrail_pvar, 'NTRAIL', this%memoryPath) call mem_allocate(this%nsets, 'NSETS', this%memoryPath) call mem_allocate(this%nodes, 'NODES', this%memoryPath) call mem_allocate(this%istocb, 'ISTOCB', this%memoryPath) - call mem_allocate(this%nwav, 'NWAV', this%memoryPath) + call mem_allocate(this%nwav_pvar, 'NWAV_PVAR', this%memoryPath) call mem_allocate(this%totfluxtot, 'TOTFLUXTOT', this%memoryPath) call mem_allocate(this%bditems, 'BDITEMS', this%memoryPath) call mem_allocate(this%nbdtxt, 'NBDTXT', this%memoryPath) @@ -2725,11 +2722,11 @@ subroutine uzf_da(this) call mem_deallocate(this%ibudgetout) call mem_deallocate(this%ibudcsv) call mem_deallocate(this%ipakcsv) - call mem_deallocate(this%ntrail) + call mem_deallocate(this%ntrail_pvar) call mem_deallocate(this%nsets) call mem_deallocate(this%nodes) call mem_deallocate(this%istocb) - call mem_deallocate(this%nwav) + call mem_deallocate(this%nwav_pvar) call mem_deallocate(this%totfluxtot) call mem_deallocate(this%bditems) call mem_deallocate(this%nbdtxt) @@ -2753,7 +2750,7 @@ subroutine uzf_da(this) call mem_deallocate(this%rejinf0) call mem_deallocate(this%rejinftomvr) call mem_deallocate(this%infiltration) - call mem_deallocate(this%gwet) + call mem_deallocate(this%gwet_pvar) call mem_deallocate(this%uzet) call mem_deallocate(this%gwd) call mem_deallocate(this%gwd0) @@ -2771,13 +2768,13 @@ subroutine uzf_da(this) call mem_deallocate(this%ja) ! ! -- deallocate timeseries aware variables - call mem_deallocate(this%sinf) - call mem_deallocate(this%pet) + call mem_deallocate(this%sinf_pvar) + call mem_deallocate(this%pet_pvar) call mem_deallocate(this%extdp) - call mem_deallocate(this%extwc) - call mem_deallocate(this%ha) - call mem_deallocate(this%hroot) - call mem_deallocate(this%rootact) + call mem_deallocate(this%extwc_pvar) + call mem_deallocate(this%ha_pvar) + call mem_deallocate(this%hroot_pvar) + call mem_deallocate(this%rootact_pvar) call mem_deallocate(this%uauxvar) ! ! -- Parent object From dcb65f2871d6bc146cff201bf0064b1de9c9abe3 Mon Sep 17 00:00:00 2001 From: mjr-deltares <45555666+mjr-deltares@users.noreply.github.com> Date: Thu, 18 Apr 2024 16:39:44 +0200 Subject: [PATCH 108/199] fix(par): GNC is not supported in parallel (#1738) * GNC not allowed when parallel * 'gently' mpi abort instead of stop * fix interface mismatch --- src/Distributed/MpiRunControl.F90 | 7 +++++++ src/Distributed/MpiWorld.f90 | 13 ++++++++++++ src/Exchange/exg-gwfgwf.f90 | 6 ++++-- src/Model/Connection/GwfGwfConnection.f90 | 24 +++++++++++++---------- src/Utilities/ErrorUtil.f90 | 19 ++++++++++++++++++ 5 files changed, 57 insertions(+), 12 deletions(-) diff --git a/src/Distributed/MpiRunControl.F90 b/src/Distributed/MpiRunControl.F90 index 796b59bf9b6..910f31b5203 100644 --- a/src/Distributed/MpiRunControl.F90 +++ b/src/Distributed/MpiRunControl.F90 @@ -36,6 +36,7 @@ end function create_mpi_run_control subroutine mpi_ctrl_start(this) use SimModule, only: ustop, store_error + use ErrorUtilModule, only: pstop_alternative class(MpiRunControlType) :: this ! local @@ -44,6 +45,9 @@ subroutine mpi_ctrl_start(this) logical(LGP) :: petsc_db_exists, wait_dbg, is_parallel_mode type(MpiWorldType), pointer :: mpi_world + ! set mpi abort function + pstop_alternative => mpi_stop + wait_dbg = .false. mpi_world => get_mpi_world() @@ -119,6 +123,7 @@ subroutine wait_for_debugger(this) end subroutine wait_for_debugger subroutine mpi_ctrl_finish(this) + use ErrorUtilModule, only: pstop_alternative class(MpiRunControlType) :: this ! local integer :: ierr @@ -134,6 +139,8 @@ subroutine mpi_ctrl_finish(this) call CHECK_MPI(ierr) #endif + pstop_alternative => null() + ! finish everything else by calling parent call this%RunControlType%finish() diff --git a/src/Distributed/MpiWorld.f90 b/src/Distributed/MpiWorld.f90 index 7ee3498467e..bf0b7b63239 100644 --- a/src/Distributed/MpiWorld.f90 +++ b/src/Distributed/MpiWorld.f90 @@ -6,6 +6,7 @@ module MpiWorldModule private public :: get_mpi_world + public :: mpi_stop public :: CHECK_MPI type, public :: MpiWorldType @@ -126,4 +127,16 @@ subroutine CHECK_MPI(mpi_error_code) end subroutine CHECK_MPI + subroutine mpi_stop(status) + integer(I4B) :: status + ! local + type(MpiWorldType), pointer :: mpi_world + integer :: ierr + + mpi_world => get_mpi_world() + write (*, *) "" ! empty line + call MPI_Abort(mpi_world%comm, status, ierr) + + end subroutine mpi_stop + end module MpiWorldModule diff --git a/src/Exchange/exg-gwfgwf.f90 b/src/Exchange/exg-gwfgwf.f90 index 84959af972d..e780adc528b 100644 --- a/src/Exchange/exg-gwfgwf.f90 +++ b/src/Exchange/exg-gwfgwf.f90 @@ -250,8 +250,10 @@ subroutine gwf_gwf_df(this) ! ! -- Create and read ghost node information if (this%ingnc > 0) then - call gnc_cr(this%gnc, this%name, this%ingnc, iout) - call this%read_gnc() + if (associated(this%gwfmodel1) .and. associated(this%gwfmodel2)) then + call gnc_cr(this%gnc, this%name, this%ingnc, iout) + call this%read_gnc() + end if end if ! ! -- Read mover information diff --git a/src/Model/Connection/GwfGwfConnection.f90 b/src/Model/Connection/GwfGwfConnection.f90 index bbfdb6961dc..7f9bfe0e1be 100644 --- a/src/Model/Connection/GwfGwfConnection.f90 +++ b/src/Model/Connection/GwfGwfConnection.f90 @@ -383,7 +383,7 @@ end subroutine validateConnection !! Stops with error message on config mismatch !< subroutine validateGwfExchange(this) - use SimVariablesModule, only: errmsg + use SimVariablesModule, only: errmsg, simulation_mode use SimModule, only: store_error use GwfNpfModule, only: GwfNpfType class(GwfGwfConnectionType) :: this !< this connection @@ -397,7 +397,19 @@ subroutine validateGwfExchange(this) gwfEx => this%gwfExchange - ! we cannot validate this (yet) in parallel mode + ! GNC not allowed + if (gwfEx%ingnc /= 0 .and. gwfEx%ixt3d /= 0) then + write (errmsg, '(2a)') 'Ghost node correction not supported '// & + 'combined with XT3D for exchange ', trim(gwfEx%name) + call store_error(errmsg) + end if + if (gwfEx%ingnc /= 0 .and. simulation_mode == 'PARALLEL') then + write (errmsg, '(2a)') 'Ghost node correction not supported '// & + 'in parallel run for exchange ', trim(gwfEx%name) + call store_error(errmsg) + end if + + ! we cannot validate the remainder (yet) in parallel mode if (.not. gwfEx%v_model1%is_local) return if (.not. gwfEx%v_model2%is_local) return @@ -406,14 +418,6 @@ subroutine validateGwfExchange(this) modelPtr => this%gwfExchange%model2 gwfModel2 => CastAsGwfModel(modelPtr) - ! GNC not allowed - if (gwfEx%ingnc /= 0) then - write (errmsg, '(2a)') 'Ghost node correction not supported '// & - 'with interface model for exchange', & - trim(gwfEx%name) - call store_error(errmsg) - end if - if ((gwfModel1%inbuy > 0 .and. gwfModel2%inbuy == 0) .or. & (gwfModel1%inbuy == 0 .and. gwfModel2%inbuy > 0)) then write (errmsg, '(2a)') 'Buoyancy package should be enabled/disabled '// & diff --git a/src/Utilities/ErrorUtil.f90 b/src/Utilities/ErrorUtil.f90 index f967168d906..3d320ac4fff 100644 --- a/src/Utilities/ErrorUtil.f90 +++ b/src/Utilities/ErrorUtil.f90 @@ -1,6 +1,16 @@ module ErrorUtilModule use KindModule, only: I4B implicit none + + procedure(pstop_iface), pointer :: pstop_alternative => null() + + interface + subroutine pstop_iface(status) + import I4B + integer(I4B) :: status + end subroutine + end interface + contains !> @brief Stop the program, optionally specifying an error status code. @@ -14,6 +24,15 @@ subroutine pstop(status, message) integer(I4B), intent(in), optional :: status !< optional error code to return (default=0) character(len=*), intent(in), optional :: message !< optional message to print before stopping + if (associated(pstop_alternative)) then + if (present(message)) print *, message + if (present(status)) then + call pstop_alternative(status) + else + call pstop_alternative(0) + end if + end if + if (present(message)) print *, message if (present(status)) then if (status == 0) stop From f7a2bd79093ac65f1fcda8512893d8dfd5d25b86 Mon Sep 17 00:00:00 2001 From: mjreno Date: Thu, 18 Apr 2024 12:00:11 -0400 Subject: [PATCH 109/199] stress package loaders allocated duplicate iper/ionper variables (#1732) Co-authored-by: mjreno --- src/Utilities/Idm/InputLoadType.f90 | 15 --------------- src/Utilities/Idm/mf6blockfile/IdmMf6File.f90 | 19 ++++++++++++++++--- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/Utilities/Idm/InputLoadType.f90 b/src/Utilities/Idm/InputLoadType.f90 index de3c7b2cbb1..8174027d20f 100644 --- a/src/Utilities/Idm/InputLoadType.f90 +++ b/src/Utilities/Idm/InputLoadType.f90 @@ -59,8 +59,6 @@ module InputLoadTypeModule character(len=LINELENGTH) :: component_input_name !< component input name, e.g. model name file character(len=LINELENGTH) :: input_name !< input name, e.g. package *.chd file character(len=LINELENGTH), dimension(:), allocatable :: param_names !< dynamic param tagnames - integer(I4B), pointer :: iper => null() !< memory managed variable, loader iper - integer(I4B), pointer :: ionper => null() !< memory managed variable, next load period logical(LGP) :: readasarrays !< is this array based input integer(I4B) :: iperblock !< index of period block on block definition list integer(I4B) :: iout !< inunit number for logging @@ -166,7 +164,6 @@ end subroutine static_destroy subroutine dynamic_init(this, mf6_input, component_name, component_input_name, & input_name, iperblock, iout) use SimVariablesModule, only: errmsg - use MemoryManagerModule, only: mem_allocate use InputDefinitionModule, only: InputParamDefinitionType ! -- dummy class(DynamicPkgLoadType), intent(inout) :: this @@ -187,14 +184,6 @@ subroutine dynamic_init(this, mf6_input, component_name, component_input_name, & this%iout = iout nullify (idt) ! - ! -- allocate scalars - call mem_allocate(this%iper, 'IPER', mf6_input%mempath) - call mem_allocate(this%ionper, 'IONPER', mf6_input%mempath) - ! - ! -- initialize - this%iper = 0 - this%ionper = 0 - ! ! -- throw error and exit if not found if (this%iperblock == 0) then write (errmsg, '(a,a)') & @@ -243,10 +232,6 @@ subroutine dynamic_destroy(this) use SimVariablesModule, only: idm_context class(DynamicPkgLoadType), intent(inout) :: this ! - ! -- deallocate scalars - call mem_deallocate(this%iper) - call mem_deallocate(this%ionper) - ! ! -- deallocate package static and dynamic input context call memorylist_remove(this%mf6_input%component_name, & this%mf6_input%subcomponent_name, & diff --git a/src/Utilities/Idm/mf6blockfile/IdmMf6File.f90 b/src/Utilities/Idm/mf6blockfile/IdmMf6File.f90 index c3829cea09c..ab75e3853d6 100644 --- a/src/Utilities/Idm/mf6blockfile/IdmMf6File.f90 +++ b/src/Utilities/Idm/mf6blockfile/IdmMf6File.f90 @@ -37,7 +37,9 @@ module IdmMf6FileModule !< type, extends(DynamicPkgLoadBaseType) :: Mf6FileDynamicPkgLoadType type(BlockParserType), pointer :: parser !< parser for MF6File period blocks - class(AsciiDynamicPkgLoadBaseType), pointer :: rp_loader + integer(I4B), pointer :: iper => null() !< memory managed variable, loader iper + integer(I4B), pointer :: ionper => null() !< memory managed variable, next load period + class(AsciiDynamicPkgLoadBaseType), pointer :: rp_loader => null() contains procedure :: init => dynamic_init procedure :: df => dynamic_df @@ -148,6 +150,7 @@ end subroutine static_destroy !< subroutine dynamic_init(this, mf6_input, component_name, component_input_name, & input_name, iperblock, iout) + use MemoryManagerModule, only: mem_allocate use InputDefinitionModule, only: InputParamDefinitionType use DefinitionSelectModule, only: get_param_definition_type class(Mf6FileDynamicPkgLoadType), intent(inout) :: this @@ -164,8 +167,13 @@ subroutine dynamic_init(this, mf6_input, component_name, component_input_name, & component_input_name, input_name, & iperblock, iout) ! - ! -- initialize rp_loader - nullify (this%rp_loader) + ! -- allocate scalars + call mem_allocate(this%iper, 'IPER', mf6_input%mempath) + call mem_allocate(this%ionper, 'IONPER', mf6_input%mempath) + ! + ! -- initialize + this%iper = 0 + this%ionper = 0 ! ! -- open input file inunit = open_mf6file(mf6_input%pkgtype, input_name, & @@ -324,8 +332,13 @@ end subroutine dynamic_create_loader !> @brief dynamic loader destroy !< subroutine dynamic_destroy(this) + use MemoryManagerModule, only: mem_deallocate class(Mf6FileDynamicPkgLoadType), intent(inout) :: this ! + ! -- deallocate scalars + call mem_deallocate(this%iper) + call mem_deallocate(this%ionper) + ! ! -- deallocate loader call this%rp_loader%destroy() deallocate (this%rp_loader) From 30e5e9e94c7495f9757da1cf8bb333d5757e9e0e Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Thu, 18 Apr 2024 09:01:17 -0700 Subject: [PATCH 110/199] perf(UZF): add deprecation warning for SIMULATE_GWSEEP (#1743) * perf(UZF): add deprecation warning for SIMULATE_GWSEEP * add variable to use only list * fprettify * Missing escape character in latex --- doc/ReleaseNotes/develop.tex | 1 + doc/mf6io/mf6ivar/dfn/gwf-uzf.dfn | 1 + src/Model/GroundWaterFlow/gwf-uzf.f90 | 14 ++++++++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index 7af8377f5cf..9036ed2a22c 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -43,6 +43,7 @@ \begin{itemize} \item A divide by zero error would occur in the Streamflow Routing package when reaches were deactivated during a simulation. This bug was fixed by checking if the downstream reach is inactive before calculating the flow to the downstream reach. \item When using the mover transport (MVT) package with UZF and UZT, rejected infiltration was paired with the calculated concentration of the UZF object rather than the user-specified concentration assigned to the infiltration. This bug was fixed by instead pairing the rejected infiltration transferred by the MVR and MVT packages with the user-specified concentration assigned in UZTSETTING with the keyword ``INFILTRATION.'' With this change, MODFLOW 6 simulations that use UZF with the ``SIMULATE\_GWSEEP'' option will not transfer this particular source of water with the correct concentration. Instead, the DRN package should be used to simulate groundwater discharge to land surface. By simulating groundwater discharge to land surface with the DRN package and rejected infiltration with the UZF package, the correct concentrations will be assigned to the water transferred by the MVR package. + \item The SIMULATE\_GWSEEP variable in the UZF package OPTIONS block will eventually be deprecated. The same functionality may be achieved using an option available within the DRN package called AUXDEPTHNAME. The details of the drainage option are given in the supplemental technical information document (mf6suptechinfo) provided with the release. Deprecation of the SIMULATE\_GWSEEP option is motivated by the potential for errors noted above. \item The Streamflow Routing package would not calculate groundwater discharge to a reach in cases where the groundwater head is above the top of the reach and the inflow to the reach from upstream reaches, specified inflows, rainfall, and runoff is zero. This bug has been fixed by eliminating the requirement that the conductance calculated based on the initial calculated stage is greater than zero in order to solve for groundwater . Instead, .As a result, differences in groundwater and surface-water exchange and groundwater heads in existing models may occur. % \item xxx \end{itemize} diff --git a/doc/mf6io/mf6ivar/dfn/gwf-uzf.dfn b/doc/mf6io/mf6ivar/dfn/gwf-uzf.dfn index fdf5078eba5..1cc76d53823 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-uzf.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-uzf.dfn @@ -312,6 +312,7 @@ type keyword tagged true reader urword optional true +deprecated 6.5.0 longname activate seepage description keyword specifying that groundwater discharge (GWSEEP) to land surface will be simulated. Groundwater discharge is nonzero when groundwater head is greater than land surface. This option is no longer recommended; a better approach is to use the Drain Package with discharge scaling as a way to handle seepage to land surface. The Drain Package with discharge scaling is described in Chapter 3 of the Supplemental Technical Information. diff --git a/src/Model/GroundWaterFlow/gwf-uzf.f90 b/src/Model/GroundWaterFlow/gwf-uzf.f90 index 15fedad3b83..586fe420330 100644 --- a/src/Model/GroundWaterFlow/gwf-uzf.f90 +++ b/src/Model/GroundWaterFlow/gwf-uzf.f90 @@ -21,8 +21,9 @@ module UzfModule use ObserveModule, only: ObserveType use ObsModule, only: ObsType use InputOutputModule, only: URWORD - use SimVariablesModule, only: errmsg - use SimModule, only: count_errors, store_error, store_error_unit + use SimVariablesModule, only: errmsg, warnmsg + use SimModule, only: count_errors, store_error, store_error_unit, & + deprecation_warning use BlockParserModule, only: BlockParserType use TableModule, only: TableType, table_cr use MatrixBaseModule @@ -486,6 +487,15 @@ subroutine uzf_options(this, option, found) case ('SIMULATE_GWSEEP') this%iseepflag = 1 write (this%iout, fmtgwseepout) + ! + ! -- Create warning message + write (warnmsg, '(a)') & + 'USE DRN PACKAGE TO SIMULATE GROUNDWATER DISCHARGE TO LAND SURFACE '// & + 'INSTEAD' + ! + ! -- Create deprecation warning + call deprecation_warning('OPTIONS', 'SIMULATE_GWSEEP', '6.5.0', & + warnmsg, this%parser%GetUnit()) case ('UNSAT_ETWC') this%ietflag = 1 write (this%iout, fmtuzetwc) From 91034f633c64179e920d36c22939e9d3506689d4 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Thu, 18 Apr 2024 11:18:48 -0500 Subject: [PATCH 111/199] fix(sfr): update budget and table output for inactive reaches (#1729) * Add evaluation of DHNOFLO value in output tables in the listing file * Add evaluation of DHDRY value in output tables in the listing file * update BudgetObject to correctly handle SFR reaches without connections --- autotest/test_gwf_sfr_inactive.py | 2 +- autotest/test_gwf_sfr_inactive02.py | 232 ++++++++ src/Model/GroundWaterFlow/gwf-sfr.f90 | 812 ++++++++++++++------------ src/Utilities/BudgetObject.f90 | 10 +- src/Utilities/Table.f90 | 94 +-- 5 files changed, 732 insertions(+), 418 deletions(-) create mode 100644 autotest/test_gwf_sfr_inactive02.py diff --git a/autotest/test_gwf_sfr_inactive.py b/autotest/test_gwf_sfr_inactive.py index 47ea86849d3..bf7fd6be47c 100644 --- a/autotest/test_gwf_sfr_inactive.py +++ b/autotest/test_gwf_sfr_inactive.py @@ -42,7 +42,7 @@ def build_models(idx, test): tdis_rc.append((1.0, 1, 1.0)) # spatial discretization data - nlay, nrow, ncol = 1, 10, 10 + nlay, nrow, ncol = 1, 1, 6 delr, delc = 100.0, 100.0 top = 0.0 botm = -10 diff --git a/autotest/test_gwf_sfr_inactive02.py b/autotest/test_gwf_sfr_inactive02.py new file mode 100644 index 00000000000..55cf93d617e --- /dev/null +++ b/autotest/test_gwf_sfr_inactive02.py @@ -0,0 +1,232 @@ +# Test evap in SFR reaches (no interaction with gwf) + +import math +import pathlib as pl + +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +HDRY, HNOFLO = -1e30, 1e30 + +cases = ["sfr-inactive02"] + + +def build_models(idx, test): + # Base simulation and model name and workspace + ws = test.workspace + name = cases[idx] + + length_units = "m" + time_units = "sec" + + nrow = 1 + ncol = 1 + nlay = 1 + delr = delc = 1.0 + + nper = 2 + tds_spd = [ + (1.0, 1, 1.0), + (1.0, 1, 1.0), + ] + + sim = flopy.mf6.MFSimulation( + sim_name=name, sim_ws=ws, exe_name="mf6", version="mf6" + ) + flopy.mf6.ModflowTdis( + sim, + time_units=time_units, + nper=nper, + perioddata=tds_spd, + ) + flopy.mf6.ModflowIms( + sim, + outer_dvclose=1e-5, + inner_dvclose=1e-6, + ) + + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=name, + save_flows=True, + ) + flopy.mf6.ModflowGwfdis( + gwf, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=0.0, + botm=-100.0, + ) + flopy.mf6.ModflowGwfnpf( + gwf, + icelltype=1, # >0 means saturated thickness varies with computed head + ) + flopy.mf6.ModflowGwfic(gwf, strt=1.0) + flopy.mf6.ModflowGwfghb(gwf, stress_period_data=[((0, 0, 0), 1.0, 1e6)]) + + # sfr data + nreaches = 4 + + # + package_data = [ + (0, (0, 0, 0), delr, 1.0, 1e-3, 0.0, 1.0, 1.0, 0.001, 1, 0.0, 0), + (1, (0, 0, 0), delr, 1.0, 1e-3, 0.0, 1.0, 1.0, 0.001, 1, 1.0, 0), + (2, (-1, -1, -1), delr, 1.0, 1e-3, 0.0, 1.0, 1.0, 0.001, 0, 0.0, 0), + (3, (0, 0, 0), delr, 1.0, 1e-3, 0.0, 1.0, 1.0, 0.001, 0, 0.0, 0), + ] + connection_data = [ + (0, -1), + (1, 0), + (2,), + (3,), + ] + + sfr_spd = { + 0: [ + (0, "inflow", 1.0), + (0, "rainfall", 1.0), + (0, "evaporation", 1.0), + (0, "runoff", 1.0), + (1, "rainfall", 1.0), + (1, "evaporation", 1.0), + (1, "runoff", 1.0), + ], + 1: [ + (1, "status", "inactive"), + ], + } + + sfr_obs = { + f"{name}.sfr.obs.csv": [ + ("gwf", "sfr", (0,)), + ("outflow", "ext-outflow", (0,)), + ("depth", "depth", (0,)), + ], + "filename": name + ".sfr.obs", + } + + flopy.mf6.ModflowGwfsfr( + gwf, + save_flows=True, + print_stage=True, + print_flows=True, + print_input=True, + stage_filerecord=f"{name}.sfr.hds", + budget_filerecord=f"{name}.sfr.cbc", + length_conversion=1.0, + time_conversion=1.0, + mover=True, + nreaches=nreaches, + packagedata=package_data, + connectiondata=connection_data, + perioddata=sfr_spd, + observations=sfr_obs, + pname="SFR-1", + ) + + flopy.mf6.ModflowGwfmvr( + gwf, + print_input=True, + print_flows=True, + maxmvr=1, + maxpackages=1, + packages=["SFR-1"], + perioddata={ + 1: [ + ("SFR-1", 0, "SFR-1", 3, "FACTOR", 1.0), + ], + }, + ) + + flopy.mf6.ModflowGwfoc( + gwf, + head_filerecord=f"{name}.hds", + budget_filerecord=f"{name}.cbc", + saverecord=[("head", "all"), ("budget", "all")], + ) + + return sim, None + + +def check_output(idx, test): + sim = flopy.mf6.MFSimulation.load(sim_ws=test.workspace) + gwf = sim.get_model() + sfr = gwf.get_package("SFR-1") + stage = sfr.output.stage().get_alldata().squeeze() + for idx in (0, 1): + assert ( + stage[idx, 2] == HDRY + ), f"reach 3 stage is not HDRY in stress period {idx + 1}" + assert ( + stage[1, 1] == HNOFLO + ), "reach 4 stage is not HNOFLO in stress period 2" + + bobj = sfr.output.budget() + data_names = ( + "GWF", + "RAINFALL", + "EVAPORATION", + "RUNOFF", + "EXT-INFLOW", + "EXT-OUTFLOW", + "STORAGE", + "FROM-MVR", + "TO-MVR", + ) + for name in data_names: + v = bobj.get_data(text=name, totim=2.0)[0] + assert ( + v["q"][1] == 0.0 + ), f"{name} flow for reach 2 is not zero ({v['q'][1]})" + + # skip GWF for reach 3 since it is not connected + # to a GWF cell (data_names[0]) + for totim in (1.0, 2.0): + for name in data_names[1:]: + v = bobj.get_data(text=name, totim=totim)[0] + assert ( + v["q"][2] == 0.0 + ), f"{name} flow for reach 3 is not zero ({v['q'][2]})" + + v = bobj.get_data(text="FLOW-JA-FACE", totim=1.0)[0] + node = v["node"] + node2 = v["node2"] + conn = (node[0], node2[0]) + conn2 = (node2[1], node[1]) + assert conn == conn2, f"FLOW-JA-FACE connectivity is not symmetric" + + q = v["q"] + assert np.allclose( + q[0], -q[1] + ), f"FLOW-JA-FACE for 1-2 ({q[0]}) not equal to 2-1 ({-q[1]})" + + fa = v["FLOW-AREA"] + assert np.allclose( + fa[0], fa[1] + ), f"FLOW-AREA for 1-2 ({fa[0]}) not equal to 2-1 ({fa[1]})" + + v = bobj.get_data(text="TO-MVR", totim=2.0)[0] + v2 = bobj.get_data(text="FROM-MVR", totim=2.0)[0] + assert np.allclose(v["q"][0], -v2["q"][3]), ( + f"TO-MVR for reach 1 ({v['q'][0]}) not equal " + + f"to FROM-MVR for reach 4 ({v2['q'][3]})" + ) + + +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/src/Model/GroundWaterFlow/gwf-sfr.f90 b/src/Model/GroundWaterFlow/gwf-sfr.f90 index 70f4021d499..c0c858abab7 100644 --- a/src/Model/GroundWaterFlow/gwf-sfr.f90 +++ b/src/Model/GroundWaterFlow/gwf-sfr.f90 @@ -2456,7 +2456,7 @@ subroutine sfr_ot_package_flows(this, icbcfl, ibudfl) pertim, totim, this%iout) end if ! - ! -- Print lake flows table + ! -- Print sfr flows table if (ibudfl /= 0 .and. this%iprflow /= 0) then ! ! -- If there are any 'none' gwf connections then need to calculate @@ -2555,21 +2555,36 @@ subroutine sfr_ot_dv(this, idvsave, idvprint) end if call this%stagetab%add_term(n) call this%stagetab%add_term(cellid) - depth = this%depth(n) - stage = this%stage(n) - w = this%calc_top_width_wet(n, depth) - call this%stagetab%add_term(stage) + if (this%iboundpak(n) /= 0) then + depth = this%depth(n) + stage = this%stage(n) + w = this%calc_top_width_wet(n, depth) + call this%sfr_calc_cond(n, depth, cond, stage, hgwf) + else + depth = DHNOFLO + stage = DHNOFLO + w = DHNOFLO + cond = DHNOFLO + end if + if (depth == DZERO) then + call this%stagetab%add_term(DHDRY) + else + call this%stagetab%add_term(stage) + end if call this%stagetab%add_term(depth) call this%stagetab%add_term(w) - call this%sfr_calc_cond(n, depth, cond, stage, hgwf) if (node > 0) then - sbot = this%strtop(n) - this%bthick(n) - if (hgwf < sbot) then - grad = stage - sbot + if (this%iboundpak(n) /= 0) then + sbot = this%strtop(n) - this%bthick(n) + if (hgwf < sbot) then + grad = stage - sbot + else + grad = stage - hgwf + end if + grad = grad / this%bthick(n) else - grad = stage - hgwf + grad = DHNOFLO end if - grad = grad / this%bthick(n) call this%stagetab%add_term(hgwf) call this%stagetab%add_term(cond) call this%stagetab%add_term(grad) @@ -3407,366 +3422,373 @@ subroutine sfr_solve(this, n, h, hcof, rhs, update) else lupdate = .true. end if - ! - ! -- calculate hgwf - hgwf = h - ! - ! + + ! -- initialize variables hcof = DZERO rhs = DZERO ! - ! -- initialize d1, d2, q1, q2, qsrc, and qgwf - d1 = DZERO - d2 = DZERO - q1 = DZERO - q2 = DZERO - qsrc = DZERO - qgwf = DZERO - qgwfold = DZERO - ! - ! -- calculate initial depth assuming a wide cross-section and ignore - ! groundwater leakage - ! -- calculate upstream flow - qu = DZERO - do i = this%ia(n) + 1, this%ia(n + 1) - 1 - if (this%idir(i) < 0) cycle - n2 = this%ja(i) - do ii = this%ia(n2) + 1, this%ia(n2 + 1) - 1 - if (this%idir(ii) > 0) cycle - if (this%ja(ii) /= n) cycle - qu = qu + this%qconn(ii) - end do - end do - this%usflow(n) = qu - ! -- calculate remaining terms - sa = this%calc_surface_area(n) - sa_wet = this%calc_surface_area_wet(n, this%depth(n)) - qi = this%inflow(n) - qr = this%rain(n) * sa - qe = this%evap(n) * sa_wet - qro = this%runoff(n) - ! - ! -- Water mover term; assume that it goes in at the upstream end of the reach - qfrommvr = DZERO - if (this%imover == 1) then - qfrommvr = this%pakmvrobj%get_qfrommvr(n) - end if - ! - ! -- calculate sum of sources to the reach excluding groundwater leakage - qc = qu + qi + qr - qe + qro + qfrommvr - ! - ! -- adjust runoff or evaporation if sum of sources is negative - if (qc < DZERO) then + if (this%iboundpak(n) == 0) then + this%depth(n) = DHNOFLO + this%stage(n) = DHNOFLO + this%usflow(n) = DHNOFLO + this%simevap(n) = DHNOFLO + this%simrunoff(n) = DHNOFLO + this%dsflow(n) = DHNOFLO + this%gwflow(n) = DHNOFLO + else + hgwf = h + d1 = DZERO + d2 = DZERO + q1 = DZERO + q2 = DZERO + qsrc = DZERO + qgwf = DZERO + qgwfold = DZERO ! - ! -- calculate sources without et - qt = qu + qi + qr + qro + qfrommvr + ! -- calculate initial depth assuming a wide cross-section and ignore + ! groundwater leakage + ! -- calculate upstream flow + qu = DZERO + do i = this%ia(n) + 1, this%ia(n + 1) - 1 + if (this%idir(i) < 0) cycle + n2 = this%ja(i) + do ii = this%ia(n2) + 1, this%ia(n2 + 1) - 1 + if (this%idir(ii) > 0) cycle + if (this%ja(ii) /= n) cycle + qu = qu + this%qconn(ii) + end do + end do + this%usflow(n) = qu + ! -- calculate remaining terms + sa = this%calc_surface_area(n) + sa_wet = this%calc_surface_area_wet(n, this%depth(n)) + qi = this%inflow(n) + qr = this%rain(n) * sa + qe = this%evap(n) * sa_wet + qro = this%runoff(n) ! - ! -- runoff exceeds sources of water for reach - if (qt < DZERO) then - qro = -(qu + qi + qr + qfrommvr) - qe = DZERO - ! - ! -- evaporation exceeds sources of water for reach - else - qe = qu + qi + qr + qro + qfrommvr + ! -- Water mover term; assume that it goes in at the upstream end of the reach + qfrommvr = DZERO + if (this%imover == 1) then + qfrommvr = this%pakmvrobj%get_qfrommvr(n) end if + ! + ! -- calculate sum of sources to the reach excluding groundwater leakage qc = qu + qi + qr - qe + qro + qfrommvr - end if - ! - ! -- set simulated evaporation and runoff - this%simevap(n) = qe - this%simrunoff(n) = qro - ! - ! -- calculate flow at the middle of the reach and excluding groundwater leakage - qmp = qu + qi + qfrommvr + DHALF * (qr - qe + qro) - qmpsrc = qmp - ! - ! -- calculate stream depth at the midpoint - if (this%iboundpak(n) > 0) then - call this%sfr_calc_reach_depth(n, qmp, d1) - else - this%stage(n) = this%sstage(n) - d1 = max(DZERO, this%stage(n) - this%strtop(n)) - end if - ! - ! -- calculate sources/sinks for reach excluding groundwater leakage - call this%sfr_calc_qsource(n, d1, qsrc) - ! - ! -- calculate initial reach stage, downstream flow, and groundwater leakage - tp = this%strtop(n) - bt = tp - this%bthick(n) - hsfr = d1 + tp - qd = MAX(qsrc, DZERO) - qgwf = DZERO - ! - ! -- set flag to skip iterations - isolve = 1 - if (hsfr <= tp .and. hgwf <= tp) isolve = 0 - if (hgwf <= tp .and. qc < DEM30) isolve = 0 - if (this%sfr_gwf_conn(n) == 0) isolve = 0 - if (this%iboundpak(n) < 0) isolve = 0 - ! - ! -- iterate to achieve solution - itersol: if (isolve /= 0) then ! - ! -- estimate initial end points - en1 = DZERO - if (d1 > DEM30) then - if ((tp - hgwf) > DEM30) then - en2 = DP9 * d1 + ! -- adjust runoff or evaporation if sum of sources is negative + if (qc < DZERO) then + ! + ! -- calculate sources without et + qt = qu + qi + qr + qro + qfrommvr + ! + ! -- runoff exceeds sources of water for reach + if (qt < DZERO) then + qro = -(qu + qi + qr + qfrommvr) + qe = DZERO + ! + ! -- evaporation exceeds sources of water for reach else - en2 = D1P1 * d1 - (tp - hgwf) + qe = qu + qi + qr + qro + qfrommvr end if - else if ((tp - hgwf) > DEM30) then - en2 = DONE - else - en2 = DP99 * (hgwf - tp) + qc = qu + qi + qr - qe + qro + qfrommvr end if ! - ! -- estimate flow at end points - ! -- end point 1 - if (hgwf > tp) then - call this%sfr_calc_qgwf(n, DZERO, hgwf, qgwf1) - qgwf1 = -qgwf1 - qen1 = qmp - DHALF * qgwf1 - else - qgwf1 = DZERO - qen1 = qmpsrc - end if - if (hgwf > bt) then - call this%sfr_calc_qgwf(n, en2, hgwf, qgwf2) - qgwf2 = -qgwf2 - else - call this%sfr_calc_qgwf(n, en2, bt, qgwf2) - qgwf2 = -qgwf2 - end if - if (qgwf2 > qsrc) qgwf2 = qsrc - ! -- calculate two depths - call this%sfr_calc_reach_depth(n, (qmpsrc - DHALF * qgwf1), d1) - call this%sfr_calc_reach_depth(n, (qmpsrc - DHALF * qgwf2), d2) - ! -- determine roots - if (d1 > DEM30) then - f1 = en1 - d1 - else - en1 = DZERO - f1 = en1 - DZERO - end if - if (d2 > DEM30) then - f2 = en2 - d2 - if (f2 < DEM30) en2 = d2 + ! -- set simulated evaporation and runoff + this%simevap(n) = qe + this%simrunoff(n) = qro + ! + ! -- calculate flow at the middle of the reach and excluding groundwater leakage + qmp = qu + qi + qfrommvr + DHALF * (qr - qe + qro) + qmpsrc = qmp + ! + ! -- calculate stream depth at the midpoint + if (this%iboundpak(n) > 0) then + call this%sfr_calc_reach_depth(n, qmp, d1) else - d2 = DZERO - f2 = en2 - DZERO + this%stage(n) = this%sstage(n) + d1 = max(DZERO, this%stage(n) - this%strtop(n)) end if ! - ! -- iterate to find a solution - dpp = DHALF * (en1 + en2) - dx = dpp - iic = 0 - iic2 = 0 - iic3 = 0 - fhstr1 = DZERO - fhstr2 = DZERO - qgwfp = DZERO - dlhold = DZERO - do i = 1, this%maxsfrit - ibflg = 0 - d1 = dpp - d2 = d1 + DTWO * this%deps - ! -- calculate q at midpoint at both end points - call this%sfr_calc_qman(n, d1, q1) - call this%sfr_calc_qman(n, d2, q2) - ! -- calculate groundwater leakage at both end points - call this%sfr_calc_qgwf(n, d1, hgwf, qgwf1) - qgwf1 = -qgwf1 - call this%sfr_calc_qgwf(n, d2, hgwf, qgwf2) - qgwf2 = -qgwf2 + ! -- calculate sources/sinks for reach excluding groundwater leakage + call this%sfr_calc_qsource(n, d1, qsrc) + ! + ! -- calculate initial reach stage, downstream flow, and groundwater leakage + tp = this%strtop(n) + bt = tp - this%bthick(n) + hsfr = d1 + tp + qd = MAX(qsrc, DZERO) + qgwf = DZERO + ! + ! -- set flag to skip iterations + isolve = 1 + if (hsfr <= tp .and. hgwf <= tp) isolve = 0 + if (hgwf <= tp .and. qc < DEM30) isolve = 0 + if (this%sfr_gwf_conn(n) == 0) isolve = 0 + if (this%iboundpak(n) < 0) isolve = 0 + ! + ! -- iterate to achieve solution + itersol: if (isolve /= 0) then ! - if (qgwf1 >= qsrc) then - en2 = dpp - dpp = DHALF * (en1 + en2) - call this%sfr_calc_qgwf(n, dpp, hgwf, qgwfp) - qgwfp = -qgwfp - if (qgwfp > qsrc) qgwfp = qsrc - call this%sfr_calc_reach_depth(n, (qmpsrc - DHALF * qgwfp), dx) - ibflg = 1 + ! -- estimate initial end points + en1 = DZERO + if (d1 > DEM30) then + if ((tp - hgwf) > DEM30) then + en2 = DP9 * d1 + else + en2 = D1P1 * d1 - (tp - hgwf) + end if + else if ((tp - hgwf) > DEM30) then + en2 = DONE else - fhstr1 = (qmpsrc - DHALF * qgwf1) - q1 - fhstr2 = (qmpsrc - DHALF * qgwf2) - q2 + en2 = DP99 * (hgwf - tp) end if ! - if (ibflg == 0) then - derv = DZERO - if (abs(d1 - d2) > DZERO) then - derv = (fhstr1 - fhstr2) / (d1 - d2) - end if - if (abs(derv) > DEM30) then - dlh = -fhstr1 / derv + ! -- estimate flow at end points + ! -- end point 1 + if (hgwf > tp) then + call this%sfr_calc_qgwf(n, DZERO, hgwf, qgwf1) + qgwf1 = -qgwf1 + qen1 = qmp - DHALF * qgwf1 + else + qgwf1 = DZERO + qen1 = qmpsrc + end if + if (hgwf > bt) then + call this%sfr_calc_qgwf(n, en2, hgwf, qgwf2) + qgwf2 = -qgwf2 + else + call this%sfr_calc_qgwf(n, en2, bt, qgwf2) + qgwf2 = -qgwf2 + end if + if (qgwf2 > qsrc) qgwf2 = qsrc + ! -- calculate two depths + call this%sfr_calc_reach_depth(n, (qmpsrc - DHALF * qgwf1), d1) + call this%sfr_calc_reach_depth(n, (qmpsrc - DHALF * qgwf2), d2) + ! -- determine roots + if (d1 > DEM30) then + f1 = en1 - d1 + else + en1 = DZERO + f1 = en1 - DZERO + end if + if (d2 > DEM30) then + f2 = en2 - d2 + if (f2 < DEM30) en2 = d2 + else + d2 = DZERO + f2 = en2 - DZERO + end if + ! + ! -- iterate to find a solution + dpp = DHALF * (en1 + en2) + dx = dpp + iic = 0 + iic2 = 0 + iic3 = 0 + fhstr1 = DZERO + fhstr2 = DZERO + qgwfp = DZERO + dlhold = DZERO + do i = 1, this%maxsfrit + ibflg = 0 + d1 = dpp + d2 = d1 + DTWO * this%deps + ! -- calculate q at midpoint at both end points + call this%sfr_calc_qman(n, d1, q1) + call this%sfr_calc_qman(n, d2, q2) + ! -- calculate groundwater leakage at both end points + call this%sfr_calc_qgwf(n, d1, hgwf, qgwf1) + qgwf1 = -qgwf1 + call this%sfr_calc_qgwf(n, d2, hgwf, qgwf2) + qgwf2 = -qgwf2 + ! + if (qgwf1 >= qsrc) then + en2 = dpp + dpp = DHALF * (en1 + en2) + call this%sfr_calc_qgwf(n, dpp, hgwf, qgwfp) + qgwfp = -qgwfp + if (qgwfp > qsrc) qgwfp = qsrc + call this%sfr_calc_reach_depth(n, (qmpsrc - DHALF * qgwfp), dx) + ibflg = 1 else - dlh = DZERO + fhstr1 = (qmpsrc - DHALF * qgwf1) - q1 + fhstr2 = (qmpsrc - DHALF * qgwf2) - q2 end if - dpp = d1 + dlh ! - ! -- updated depth outside of endpoints - use bisection instead - if ((dpp >= en2) .or. (dpp <= en1)) then - if (abs(dlh) > abs(dlhold) .or. dpp < DEM30) then + if (ibflg == 0) then + derv = DZERO + if (abs(d1 - d2) > DZERO) then + derv = (fhstr1 - fhstr2) / (d1 - d2) + end if + if (abs(derv) > DEM30) then + dlh = -fhstr1 / derv + else + dlh = DZERO + end if + dpp = d1 + dlh + ! + ! -- updated depth outside of endpoints - use bisection instead + if ((dpp >= en2) .or. (dpp <= en1)) then + if (abs(dlh) > abs(dlhold) .or. dpp < DEM30) then + ibflg = 1 + dpp = DHALF * (en1 + en2) + end if + end if + ! + ! -- check for slow convergence + ! -- set flags to determine if the Newton-Raphson method oscillates + ! or if convergence is slow + if (qgwf1 * qgwfold < DEM30) then + iic2 = iic2 + 1 + else + iic2 = 0 + end if + if (qgwf1 < DEM30) then + iic3 = iic3 + 1 + else + iic3 = 0 + end if + if (dlh * dlhold < DEM30 .or. ABS(dlh) > ABS(dlhold)) then + iic = iic + 1 + end if + iic4 = 0 + if (iic3 > 7 .and. iic > 12) then + iic4 = 1 + end if + ! + ! -- switch to bisection when the Newton-Raphson method oscillates + ! or when convergence is slow + if (iic2 > 7 .or. iic > 12 .or. iic4 == 1) then ibflg = 1 dpp = DHALF * (en1 + en2) end if + ! + ! -- Calculate perturbed gwf flow + call this%sfr_calc_qgwf(n, dpp, hgwf, qgwfp) + qgwfp = -qgwfp + if (qgwfp > qsrc) then + qgwfp = qsrc + if (abs(en1 - en2) < this%dmaxchg * DEM6) then + call this%sfr_calc_reach_depth(n, (qmpsrc - DHALF * qgwfp), dpp) + end if + end if + call this%sfr_calc_reach_depth(n, (qmpsrc - DHALF * qgwfp), dx) end if ! - ! -- check for slow convergence - ! -- set flags to determine if the Newton-Raphson method oscillates - ! or if convergence is slow - if (qgwf1 * qgwfold < DEM30) then - iic2 = iic2 + 1 - else - iic2 = 0 - end if - if (qgwf1 < DEM30) then - iic3 = iic3 + 1 + ! -- bisection to update end points + fp = dpp - dx + if (ibflg == 1) then + dlh = fp + ! -- change end points + ! -- root is between f1 and fp + if (f1 * fp < DZERO) then + en2 = dpp + f2 = fp + ! -- root is between fp and f2 + else + en1 = dpp + f1 = fp + end if + err = min(abs(fp), abs(en2 - en1)) else - iic3 = 0 - end if - if (dlh * dlhold < DEM30 .or. ABS(dlh) > ABS(dlhold)) then - iic = iic + 1 - end if - iic4 = 0 - if (iic3 > 7 .and. iic > 12) then - iic4 = 1 + err = abs(dlh) end if ! - ! -- switch to bisection when the Newton-Raphson method oscillates - ! or when convergence is slow - if (iic2 > 7 .or. iic > 12 .or. iic4 == 1) then - ibflg = 1 - dpp = DHALF * (en1 + en2) + ! -- check for convergence and exit if converged + if (err < this%dmaxchg) then + d1 = dpp + qgwf = qgwfp + qd = qsrc - qgwf + exit end if ! - ! -- Calculate perturbed gwf flow - call this%sfr_calc_qgwf(n, dpp, hgwf, qgwfp) - qgwfp = -qgwfp - if (qgwfp > qsrc) then - qgwfp = qsrc - if (abs(en1 - en2) < this%dmaxchg * DEM6) then - call this%sfr_calc_reach_depth(n, (qmpsrc - DHALF * qgwfp), dpp) - end if - end if - call this%sfr_calc_reach_depth(n, (qmpsrc - DHALF * qgwfp), dx) - end if - ! - ! -- bisection to update end points - fp = dpp - dx - if (ibflg == 1) then - dlh = fp - ! -- change end points - ! -- root is between f1 and fp - if (f1 * fp < DZERO) then - en2 = dpp - f2 = fp - ! -- root is between fp and f2 + ! -- save iterates + errold = err + dlhold = dlh + if (ibflg == 1) then + qgwfold = qgwfp else - en1 = dpp - f1 = fp + qgwfold = qgwf1 end if - err = min(abs(fp), abs(en2 - en1)) - else - err = abs(dlh) - end if + ! + ! -- end of iteration + end do + end if itersol + + ! -- simple routing option or where depth = 0 and hgwf < bt + if (isolve == 0) then + call this%sfr_calc_qgwf(n, d1, hgwf, qgwf) + qgwf = -qgwf ! - ! -- check for convergence and exit if converged - if (err < this%dmaxchg) then - d1 = dpp - qgwf = qgwfp - qd = qsrc - qgwf - exit + ! -- leakage exceeds inflow + if (qgwf > qsrc) then + d1 = DZERO + call this%sfr_calc_qsource(n, d1, qsrc) + qgwf = qsrc end if + ! -- set qd + qd = qsrc - qgwf + end if + ! + ! -- update sfr stage + hsfr = tp + d1 + ! + ! -- update stored values + if (lupdate) then ! - ! -- save iterates - errold = err - dlhold = dlh - if (ibflg == 1) then - qgwfold = qgwfp - else - qgwfold = qgwf1 - end if + ! -- save depth and calculate stage + this%depth(n) = d1 + this%stage(n) = hsfr ! - ! -- end of iteration - end do - end if itersol - - ! -- simple routing option or where depth = 0 and hgwf < bt - if (isolve == 0) then - call this%sfr_calc_qgwf(n, d1, hgwf, qgwf) - qgwf = -qgwf + ! -- update flows + call this%sfr_update_flows(n, qd, qgwf) + end if ! - ! -- leakage exceeds inflow - if (qgwf > qsrc) then - d1 = DZERO - call this%sfr_calc_qsource(n, d1, qsrc) - qgwf = qsrc + ! -- calculate sumleak and sumrch + sumleak = DZERO + sumrch = DZERO + if (this%gwfiss == 0) then + sumleak = qgwf + else + sumleak = qgwf + end if + if (hgwf < bt) then + sumrch = qgwf end if - ! -- set qd - qd = qsrc - qgwf - end if - ! - ! -- update sfr stage - hsfr = tp + d1 - ! - ! -- update stored values - if (lupdate) then ! - ! -- save depth and calculate stage - this%depth(n) = d1 - this%stage(n) = hsfr + ! -- make final qgwf calculation and obtain + ! gwfhcof and gwfrhs values + call this%sfr_calc_qgwf(n, d1, hgwf, qgwf, gwfhcof, gwfrhs) ! - ! -- update flows - call this%sfr_update_flows(n, qd, qgwf) - end if - ! - ! -- calculate sumleak and sumrch - sumleak = DZERO - sumrch = DZERO - if (this%gwfiss == 0) then - sumleak = qgwf - else - sumleak = qgwf - end if - if (hgwf < bt) then - sumrch = qgwf - end if - ! - ! -- make final qgwf calculation and obtain - ! gwfhcof and gwfrhs values - call this%sfr_calc_qgwf(n, d1, hgwf, qgwf, gwfhcof, gwfrhs) - ! - ! - if (abs(sumleak) > DZERO) then - ! -- stream leakage is not head dependent - if (hgwf < bt) then - rhs = rhs - sumrch - ! - ! -- stream leakage is head dependent - else if ((sumleak - qsrc) < -DEM30) then - if (this%gwfiss == 0) then - rhs = rhs + gwfrhs - sumrch + ! + if (abs(sumleak) > DZERO) then + ! -- stream leakage is not head dependent + if (hgwf < bt) then + rhs = rhs - sumrch + ! + ! -- stream leakage is head dependent + else if ((sumleak - qsrc) < -DEM30) then + if (this%gwfiss == 0) then + rhs = rhs + gwfrhs - sumrch + else + rhs = rhs + gwfrhs + end if + hcof = gwfhcof + ! + ! -- place holder for UZF else - rhs = rhs + gwfrhs + if (this%gwfiss == 0) then + rhs = rhs - sumleak - sumrch + else + rhs = rhs - sumleak + end if end if - hcof = gwfhcof ! - ! -- place holder for UZF - else - if (this%gwfiss == 0) then - rhs = rhs - sumleak - sumrch - else - rhs = rhs - sumleak - end if + ! -- add groundwater leakage + else if (hgwf < bt) then + rhs = rhs - sumrch end if - ! - ! -- add groundwater leakage - else if (hgwf < bt) then - rhs = rhs - sumrch end if ! ! -- return @@ -5334,25 +5356,32 @@ subroutine sfr_fill_budobj(this) call this%budobj%budterm(idx)%reset(this%nconn) do n = 1, this%maxbound n1 = n + q = DZERO + ca = DZERO do i = this%ia(n) + 1, this%ia(n + 1) - 1 n2 = this%ja(i) - ! flow to downstream reaches - if (this%idir(i) < 0) then - qt = this%dsflow(n) - q = -this%qconn(i) - ! flow from upstream reaches + if (this%iboundpak(n) /= 0) then + ! flow to downstream reaches + if (this%idir(i) < 0) then + qt = this%dsflow(n) + q = -this%qconn(i) + ! flow from upstream reaches + else + qt = this%usflow(n) + do ii = this%ia(n2) + 1, this%ia(n2 + 1) - 1 + if (this%idir(ii) > 0) cycle + if (this%ja(ii) /= n) cycle + q = this%qconn(ii) + exit + end do + end if + ! calculate flow area + call this%sfr_calc_reach_depth(n, qt, d) + ca = this%calc_area_wet(n, d) else - qt = this%usflow(n) - do ii = this%ia(n2) + 1, this%ia(n2 + 1) - 1 - if (this%idir(ii) > 0) cycle - if (this%ja(ii) /= n) cycle - q = this%qconn(ii) - exit - end do + q = DZERO + ca = DZERO end if - ! calculate flow area - call this%sfr_calc_reach_depth(n, qt, d) - ca = this%calc_area_wet(n, d) this%qauxcbc(1) = ca call this%budobj%budterm(idx)%update_term(n1, n2, q, this%qauxcbc) end do @@ -5364,16 +5393,21 @@ subroutine sfr_fill_budobj(this) do n = 1, this%maxbound n2 = this%igwfnode(n) if (n2 > 0) then - ! -- calc_perimeter_wet() does not enforce depth dependence - if (this%depth(n) > DZERO) then - wp = this%calc_perimeter_wet(n, this%depth(n)) + if (this%iboundpak(n) /= 0) then + ! -- calc_perimeter_wet() does not enforce depth dependence + if (this%depth(n) > DZERO) then + wp = this%calc_perimeter_wet(n, this%depth(n)) + else + wp = DZERO + end if + l = this%length(n) + a = wp * l + this%qauxcbc(1) = a + q = -this%gwflow(n) else - wp = DZERO + this%qauxcbc(1) = DZERO + q = DZERO end if - l = this%length(n) - a = wp * l - this%qauxcbc(1) = a - q = -this%gwflow(n) call this%budobj%budterm(idx)%update_term(n, n2, q, this%qauxcbc) end if end do @@ -5382,8 +5416,12 @@ subroutine sfr_fill_budobj(this) idx = idx + 1 call this%budobj%budterm(idx)%reset(this%maxbound) do n = 1, this%maxbound - a = this%calc_surface_area(n) - q = this%rain(n) * a + if (this%iboundpak(n) /= 0) then + a = this%calc_surface_area(n) + q = this%rain(n) * a + else + q = DZERO + end if call this%budobj%budterm(idx)%update_term(n, n, q) end do ! @@ -5391,7 +5429,11 @@ subroutine sfr_fill_budobj(this) idx = idx + 1 call this%budobj%budterm(idx)%reset(this%maxbound) do n = 1, this%maxbound - q = -this%simevap(n) + if (this%iboundpak(n) /= 0) then + q = -this%simevap(n) + else + q = DZERO + end if call this%budobj%budterm(idx)%update_term(n, n, q) end do ! @@ -5399,7 +5441,11 @@ subroutine sfr_fill_budobj(this) idx = idx + 1 call this%budobj%budterm(idx)%reset(this%maxbound) do n = 1, this%maxbound - q = this%simrunoff(n) + if (this%iboundpak(n) /= 0) then + q = this%simrunoff(n) + else + q = DZERO + end if call this%budobj%budterm(idx)%update_term(n, n, q) end do ! @@ -5407,7 +5453,11 @@ subroutine sfr_fill_budobj(this) idx = idx + 1 call this%budobj%budterm(idx)%reset(this%maxbound) do n = 1, this%maxbound - q = this%inflow(n) + if (this%iboundpak(n) /= 0) then + q = this%inflow(n) + else + q = DZERO + end if call this%budobj%budterm(idx)%update_term(n, n, q) end do ! @@ -5416,19 +5466,25 @@ subroutine sfr_fill_budobj(this) call this%budobj%budterm(idx)%reset(this%maxbound) do n = 1, this%maxbound q = DZERO - do i = this%ia(n) + 1, this%ia(n + 1) - 1 - if (this%idir(i) > 0) cycle - idiv = this%idiv(i) - if (idiv > 0) then - jpos = this%iadiv(n) + idiv - 1 - q = q + this%divq(jpos) - else - q = q + this%qconn(i) + if (this%iboundpak(n) /= 0) then + do i = this%ia(n) + 1, this%ia(n + 1) - 1 + if (this%idir(i) > 0) cycle + idiv = this%idiv(i) + if (idiv > 0) then + jpos = this%iadiv(n) + idiv - 1 + q = q + this%divq(jpos) + else + q = q + this%qconn(i) + end if + end do + q = q - this%dsflow(n) + if (this%imover == 1) then + q = q + this%pakmvrobj%get_qtomvr(n) + end if + else + if (this%imover == 1) then + q = this%pakmvrobj%get_qfrommvr(n) end if - end do - q = q - this%dsflow(n) - if (this%imover == 1) then - q = q + this%pakmvrobj%get_qtomvr(n) end if call this%budobj%budterm(idx)%update_term(n, n, q) end do @@ -5438,9 +5494,14 @@ subroutine sfr_fill_budobj(this) call this%budobj%budterm(idx)%reset(this%maxbound) do n = 1, this%maxbound q = DZERO - d = this%depth(n) - a = this%calc_surface_area_wet(n, d) - this%qauxcbc(1) = a * d + if (this%iboundpak(n) /= 0) then + d = this%depth(n) + a = this%calc_surface_area_wet(n, d) + this%qauxcbc(1) = a * d + else + q = DZERO + this%qauxcbc(1) = DZERO + end if call this%budobj%budterm(idx)%update_term(n, n, q, this%qauxcbc) end do ! @@ -5451,7 +5512,10 @@ subroutine sfr_fill_budobj(this) idx = idx + 1 call this%budobj%budterm(idx)%reset(this%maxbound) do n = 1, this%maxbound - q = this%pakmvrobj%get_qfrommvr(n) + q = DZERO + if (this%iboundpak(n) /= 0) then + q = this%pakmvrobj%get_qfrommvr(n) + end if call this%budobj%budterm(idx)%update_term(n, n, q) end do ! @@ -5459,9 +5523,13 @@ subroutine sfr_fill_budobj(this) idx = idx + 1 call this%budobj%budterm(idx)%reset(this%maxbound) do n = 1, this%maxbound - q = this%pakmvrobj%get_qtomvr(n) - if (q > DZERO) then - q = -q + if (this%iboundpak(n) /= 0) then + q = this%pakmvrobj%get_qtomvr(n) + if (q > DZERO) then + q = -q + end if + else + q = DZERO end if call this%budobj%budterm(idx)%update_term(n, n, q) end do diff --git a/src/Utilities/BudgetObject.f90 b/src/Utilities/BudgetObject.f90 index 83cced41090..8c53869660f 100644 --- a/src/Utilities/BudgetObject.f90 +++ b/src/Utilities/BudgetObject.f90 @@ -413,9 +413,15 @@ subroutine write_flowtable(this, dis, kstp, kper, cellidstr) exit colterm end if else - if (id1 /= icv) cycle colterm + if (id1 /= icv) then + cycle colterm + end if + end if + if (id1 /= icv) then + v = DZERO + else + v = this%budterm(idx)%get_flow(i) end if - v = this%budterm(idx)%get_flow(i) if (trim(adjustl(flowtype)) == 'FLOW-JA-FACE') then if (v < DZERO) then qoutflow = qoutflow + v diff --git a/src/Utilities/Table.f90 b/src/Utilities/Table.f90 index b7e119621eb..9332ff93fc3 100644 --- a/src/Utilities/Table.f90 +++ b/src/Utilities/Table.f90 @@ -6,7 +6,8 @@ module TableModule use KindModule, only: I4B, I8B, DP use ConstantsModule, only: LINELENGTH, LENBUDTXT, & TABSTRING, TABUCSTRING, TABINTEGER, TABREAL, & - TABCENTER + TABCENTER, & + DHNOFLO, DHDRY use TableTermModule, only: TableTermType use InputOutputModule, only: UWWORD, parseline use SimModule, only: store_error @@ -794,52 +795,59 @@ subroutine add_real(this, rval) integer(I4B) :: width integer(I4B) :: alignment ! ------------------------------------------------------------------------------ - ! - ! -- write header - if (this%icount == 0 .and. this%ientry == 0) then - call this%write_header() - end if - ! - ! -- update index for tableterm - this%ientry = this%ientry + 1 - ! - ! -- check that ientry is within bounds - call this%add_error() - ! - ! -- initialize local variables - j = this%ientry - width = this%tableterm(j)%get_width() - alignment = this%tableterm(j)%get_alignment() - line_end = .FALSE. - if (j == this%ntableterm) then - line_end = .TRUE. - end if - ! - ! -- add data to line - if (this%write_csv) then - if (j == 1) then - write (this%dataline, '(G0)') rval - else - write (this%dataline, '(a,",",G0)') trim(this%dataline), rval - end if +! + if (rval == DHNOFLO) then + call this%add_string("INACTIVE") + else if (rval == DHDRY) then + call this%add_string("DRY") else + ! + ! -- write header + if (this%icount == 0 .and. this%ientry == 0) then + call this%write_header() + end if + ! + ! -- update index for tableterm + this%ientry = this%ientry + 1 + ! + ! -- check that ientry is within bounds + call this%add_error() + ! + ! -- initialize local variables + j = this%ientry + width = this%tableterm(j)%get_width() + alignment = this%tableterm(j)%get_alignment() + line_end = .FALSE. if (j == this%ntableterm) then - call UWWORD(this%dataline, this%iloc, width, TABREAL, & - cval, ival, rval, ALIGNMENT=alignment) + line_end = .TRUE. + end if + ! + ! -- add data to line + if (this%write_csv) then + if (j == 1) then + write (this%dataline, '(G0)') rval + else + write (this%dataline, '(a,",",G0)') trim(this%dataline), rval + end if else - call UWWORD(this%dataline, this%iloc, width, TABREAL, & - cval, ival, rval, ALIGNMENT=alignment, SEP=this%sep) + if (j == this%ntableterm) then + call UWWORD(this%dataline, this%iloc, width, TABREAL, & + cval, ival, rval, ALIGNMENT=alignment) + else + call UWWORD(this%dataline, this%iloc, width, TABREAL, & + cval, ival, rval, ALIGNMENT=alignment, SEP=this%sep) + end if + end if + ! + ! -- write the data line, if necessary + if (line_end) then + call this%write_line() + end if + ! + ! -- finalize the table, if necessary + if (this%allow_finalization) then + call this%finalize() end if - end if - ! - ! -- write the data line, if necessary - if (line_end) then - call this%write_line() - end if - ! - ! -- finalize the table, if necessary - if (this%allow_finalization) then - call this%finalize() end if ! ! -- Return From 0b848fdcde30fe380c228df696ae24513560e9e7 Mon Sep 17 00:00:00 2001 From: mjr-deltares <45555666+mjr-deltares@users.noreply.github.com> Date: Thu, 18 Apr 2024 18:31:16 +0200 Subject: [PATCH 112/199] feat(par): connect IMS preconditioner and convergence rules to PETSc solver (#1688) * add ims convergence logic to PETSc solver * build petsc in release model for linux and mac * wire IMS preconditioner into PETSc solver * add 1-based ia,ja,amat to petsc matrix for local block * removed unused delta residual from precon * removed unused get_result fct * improved diagnostics * removed petsc serial code, unused * cleaned up newton test case * petsc convergence when exact solution found within machine precision * add level fill to IMS ILU pc in PETSc * use unpreconditioned residual * preallocate residual vector * cleanup convergence routine * add context constructor --- .github/actions/test-par/action.yml | 6 +- .mf6minsim/.petscrc | 6 - autotest/test_gwf_newton_under_relaxation.py | 3 +- .../test_par_gwf_newton_under_relaxation.py | 31 +- make/makefile | 72 ++-- src/Distributed/MpiRunControl.F90 | 5 - src/Exchange/DisConnExchange.f90 | 2 +- src/Exchange/GwfExchangeMover.f90 | 4 - src/Model/Connection/GwtGwtConnection.f90 | 2 +- src/Model/TransportModel/tsp-apt.f90 | 1 - src/Solution/ConvergenceSummary.f90 | 36 +- src/Solution/LinearMethods/ImsLinear.f90 | 73 +---- src/Solution/LinearMethods/ImsLinearBase.f90 | 100 +++++- .../LinearMethods/ImsLinearSolver.f90 | 10 +- src/Solution/LinearSolverBase.f90 | 7 +- src/Solution/LinearSolverFactory.F90 | 7 +- src/Solution/NumericalSolution.f90 | 35 +- src/Solution/PETSc/PetscConvergence.F90 | 205 ++++++++---- src/Solution/PETSc/PetscImsPreconditioner.F90 | 194 +++++++++-- src/Solution/PETSc/PetscSolver.F90 | 309 +++++++++--------- src/Utilities/Matrix/PetscMatrix.F90 | 92 +++++- src/Utilities/Matrix/SparseMatrix.f90 | 2 + src/Utilities/Sim.f90 | 10 +- 23 files changed, 757 insertions(+), 455 deletions(-) delete mode 100644 .mf6minsim/.petscrc diff --git a/.github/actions/test-par/action.yml b/.github/actions/test-par/action.yml index 03827818ecd..b14c8e78397 100644 --- a/.github/actions/test-par/action.yml +++ b/.github/actions/test-par/action.yml @@ -28,8 +28,8 @@ runs: if: runner.os == 'macOS' shell: bash run: | - echo "PKG_CONFIG_PATH=$GITHUB_WORKSPACE/petsc/arch-darwin-gcc-debug/lib/pkgconfig" >> $GITHUB_ENV - echo "$GITHUB_WORKSPACE/petsc/arch-darwin-gcc-debug/bin" >> $GITHUB_PATH + echo "PKG_CONFIG_PATH=$GITHUB_WORKSPACE/petsc/arch-darwin-gcc/lib/pkgconfig" >> $GITHUB_ENV + echo "$GITHUB_WORKSPACE/petsc/arch-darwin-gcc/bin" >> $GITHUB_PATH - name: Configure PETSc if: runner.os == 'Linux' @@ -45,7 +45,7 @@ runs: shell: bash working-directory: petsc run: | - sudo ./configure PETSC_DIR="$GITHUB_WORKSPACE/petsc" PETSC_ARCH=arch-darwin-gcc-debug --download-fblaslapack --download-openmpi + sudo ./configure PETSC_DIR="$GITHUB_WORKSPACE/petsc" PETSC_ARCH=arch-darwin-gcc --download-fblaslapack --download-openmpi --with-debugging=0 sudo make all - name: Build modflow6 diff --git a/.mf6minsim/.petscrc b/.mf6minsim/.petscrc deleted file mode 100644 index 45020662fe1..00000000000 --- a/.mf6minsim/.petscrc +++ /dev/null @@ -1,6 +0,0 @@ --ksp_type cg --pc_type bjacobi --sub_pc_type ilu --sub_pc_factor_levels 2 --dvclose 1.0e-6 --options_left no diff --git a/autotest/test_gwf_newton_under_relaxation.py b/autotest/test_gwf_newton_under_relaxation.py index 9fedb1875a8..01eba7c08c8 100644 --- a/autotest/test_gwf_newton_under_relaxation.py +++ b/autotest/test_gwf_newton_under_relaxation.py @@ -24,7 +24,7 @@ extents = (0, xlen, 0, ylen) shape2d = (nrow, ncol) shape3d = (nlay, nrow, ncol) -nouter = 50 +nouter = 75 ninner = 100 hclose = 1e-9 hclose_outer = hclose * 10.0 @@ -53,6 +53,7 @@ def build_models(idx, test): flopy.mf6.ModflowIms( sim, print_option="ALL", + no_ptcrecord="ALL", linear_acceleration=linear_acceleration, outer_maximum=nouter, outer_dvclose=hclose_outer, diff --git a/autotest/test_par_gwf_newton_under_relaxation.py b/autotest/test_par_gwf_newton_under_relaxation.py index 628a4f0c107..993df94b0db 100644 --- a/autotest/test_par_gwf_newton_under_relaxation.py +++ b/autotest/test_par_gwf_newton_under_relaxation.py @@ -18,37 +18,12 @@ cases = ["par_nr_ur01", "par_nr_ur02"] -def build_petsc_db(idx, exdir): - from test_gwf_newton_under_relaxation import hclose, ninner - - petsc_db_file = os.path.join(exdir, ".petscrc") - with open(petsc_db_file, "w") as petsc_file: - petsc_file.write("-ksp_type bicg\n") - petsc_file.write("-pc_type bjacobi\n") - petsc_file.write("-sub_pc_type ilu\n") - petsc_file.write("-sub_pc_factor_levels 2\n") - petsc_file.write(f"-dvclose {Decimal(hclose):.2E}\n") - petsc_file.write(f"-nitermax {ninner}\n") - petsc_file.write("-options_left no\n") - - -def build_models(idx, test): - from test_gwf_newton_under_relaxation import build_models as build - - build_petsc_db(idx, test.workspace) - sim, dummy = build(idx, test) - return sim, dummy - - -def check_output(idx, test): - from test_gwf_newton_under_relaxation import check_output as check - - check(idx, test) - - @pytest.mark.parallel @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): + from test_gwf_newton_under_relaxation import build_models + from test_gwf_newton_under_relaxation import check_output + ncpus = 2 if idx == 1 else 1 test = TestFramework( name=name, diff --git a/make/makefile b/make/makefile index 6f75627e51a..2da0bdf737e 100644 --- a/make/makefile +++ b/make/makefile @@ -5,42 +5,42 @@ include ./makedefaults # Define the source file directories SOURCEDIR1=../src -SOURCEDIR2=../src/Idm -SOURCEDIR3=../src/Idm/selector -SOURCEDIR4=../src/Exchange -SOURCEDIR5=../src/Distributed -SOURCEDIR6=../src/Solution -SOURCEDIR7=../src/Solution/LinearMethods -SOURCEDIR8=../src/Solution/ParticleTracker -SOURCEDIR9=../src/Solution/PETSc -SOURCEDIR10=../src/Timing -SOURCEDIR11=../src/Utilities -SOURCEDIR12=../src/Utilities/Idm -SOURCEDIR13=../src/Utilities/Idm/mf6blockfile -SOURCEDIR14=../src/Utilities/TimeSeries -SOURCEDIR15=../src/Utilities/Memory -SOURCEDIR16=../src/Utilities/OutputControl -SOURCEDIR17=../src/Utilities/ArrayRead -SOURCEDIR18=../src/Utilities/Libraries -SOURCEDIR19=../src/Utilities/Libraries/rcm -SOURCEDIR20=../src/Utilities/Libraries/blas -SOURCEDIR21=../src/Utilities/Libraries/sparskit2 -SOURCEDIR22=../src/Utilities/Libraries/daglib -SOURCEDIR23=../src/Utilities/Libraries/sparsekit -SOURCEDIR24=../src/Utilities/Vector -SOURCEDIR25=../src/Utilities/Matrix -SOURCEDIR26=../src/Utilities/Observation -SOURCEDIR27=../src/Model -SOURCEDIR28=../src/Model/Connection -SOURCEDIR29=../src/Model/ParticleTracking -SOURCEDIR30=../src/Model/SurfaceWaterFlow -SOURCEDIR31=../src/Model/GroundWaterTransport -SOURCEDIR32=../src/Model/ModelUtilities -SOURCEDIR33=../src/Model/GroundWaterFlow -SOURCEDIR34=../src/Model/Discretization -SOURCEDIR35=../src/Model/TransportModel -SOURCEDIR36=../src/Model/Geometry -SOURCEDIR37=../src/Model/GroundWaterEnergy +SOURCEDIR2=../src/Model +SOURCEDIR3=../src/Model/SurfaceWaterFlow +SOURCEDIR4=../src/Model/TransportModel +SOURCEDIR5=../src/Model/GroundWaterFlow +SOURCEDIR6=../src/Model/GroundWaterEnergy +SOURCEDIR7=../src/Model/Geometry +SOURCEDIR8=../src/Model/ParticleTracking +SOURCEDIR9=../src/Model/Discretization +SOURCEDIR10=../src/Model/ModelUtilities +SOURCEDIR11=../src/Model/GroundWaterTransport +SOURCEDIR12=../src/Model/Connection +SOURCEDIR13=../src/Idm +SOURCEDIR14=../src/Idm/selector +SOURCEDIR15=../src/Distributed +SOURCEDIR16=../src/Utilities +SOURCEDIR17=../src/Utilities/Idm +SOURCEDIR18=../src/Utilities/Idm/mf6blockfile +SOURCEDIR19=../src/Utilities/Vector +SOURCEDIR20=../src/Utilities/Matrix +SOURCEDIR21=../src/Utilities/Observation +SOURCEDIR22=../src/Utilities/ArrayRead +SOURCEDIR23=../src/Utilities/OutputControl +SOURCEDIR24=../src/Utilities/Libraries +SOURCEDIR25=../src/Utilities/Libraries/blas +SOURCEDIR26=../src/Utilities/Libraries/rcm +SOURCEDIR27=../src/Utilities/Libraries/sparsekit +SOURCEDIR28=../src/Utilities/Libraries/sparskit2 +SOURCEDIR29=../src/Utilities/Libraries/daglib +SOURCEDIR30=../src/Utilities/Memory +SOURCEDIR31=../src/Utilities/TimeSeries +SOURCEDIR32=../src/Timing +SOURCEDIR33=../src/Solution +SOURCEDIR34=../src/Solution/ParticleTracker +SOURCEDIR35=../src/Solution/PETSc +SOURCEDIR36=../src/Solution/LinearMethods +SOURCEDIR37=../src/Exchange VPATH = \ ${SOURCEDIR1} \ diff --git a/src/Distributed/MpiRunControl.F90 b/src/Distributed/MpiRunControl.F90 index 910f31b5203..86196b6682b 100644 --- a/src/Distributed/MpiRunControl.F90 +++ b/src/Distributed/MpiRunControl.F90 @@ -35,7 +35,6 @@ function create_mpi_run_control() result(controller) end function create_mpi_run_control subroutine mpi_ctrl_start(this) - use SimModule, only: ustop, store_error use ErrorUtilModule, only: pstop_alternative class(MpiRunControlType) :: this @@ -96,10 +95,6 @@ subroutine mpi_ctrl_start(this) ! possibly wait to attach debugger here if (wait_dbg) call this%wait_for_debugger() - if (is_parallel_mode .and. nr_procs == 1) then - write (*, '(a,/)') '(WARNING. Running parallel mode on only 1 process)' - end if - ! start everything else by calling parent call this%RunControlType%start() diff --git a/src/Exchange/DisConnExchange.f90 b/src/Exchange/DisConnExchange.f90 index b41402dc366..3429c5bf963 100644 --- a/src/Exchange/DisConnExchange.f90 +++ b/src/Exchange/DisConnExchange.f90 @@ -28,7 +28,7 @@ module DisConnExchangeModule class(VirtualModelType), pointer :: v_model1 => null() !< virtual model 1 class(VirtualModelType), pointer :: v_model2 => null() !< virtual model 2 logical(LGP) :: is_datacopy !< when true, this exchange is just a data copy on another process and - !! not responsible for controlling movers, observations, ... TODO_MJR: refactor this with the new mover!!! + !! not responsible for controlling movers, observations, ... integer(I4B), pointer :: nexg => null() !< number of exchanges integer(I4B), dimension(:), pointer, contiguous :: nodem1 => null() !< node numbers in model 1 diff --git a/src/Exchange/GwfExchangeMover.f90 b/src/Exchange/GwfExchangeMover.f90 index 6c132343551..a900e39c783 100644 --- a/src/Exchange/GwfExchangeMover.f90 +++ b/src/Exchange/GwfExchangeMover.f90 @@ -197,10 +197,7 @@ subroutine xmvr_fc(this) integer(I4B) :: i do i = 1, this%nmvr - ! TODO_MJR: this should only be around the update call, - ! such that every mover has a valid qpactual ??!! if (this%mvr(i)%is_receiver_active) then - ! copy from synchronization arrays back into movers: if (this%prov_is_m1(i)) then this%mvr(i)%qpactual = this%qpactual_m1(i) @@ -209,7 +206,6 @@ subroutine xmvr_fc(this) this%mvr(i)%qpactual = this%qpactual_m2(i) this%mvr(i)%qavailable = this%qavailable_m2(i) end if - call this%mvr(i)%update_receiver() end if end do diff --git a/src/Model/Connection/GwtGwtConnection.f90 b/src/Model/Connection/GwtGwtConnection.f90 index 87b8352cbe4..70576df4637 100644 --- a/src/Model/Connection/GwtGwtConnection.f90 +++ b/src/Model/Connection/GwtGwtConnection.f90 @@ -155,7 +155,7 @@ subroutine gwtgwtcon_df(this) ! has been read at this point) this%iIfaceAdvScheme = this%gwtExchange%iAdvScheme ! - ! determine xt3d setting on interface- (TODO_MJR: default is on?) + ! determine xt3d setting on interface this%iIfaceXt3d = this%gwtExchange%ixt3d ! turn off when off in the owning model diff --git a/src/Model/TransportModel/tsp-apt.f90 b/src/Model/TransportModel/tsp-apt.f90 index 14d7280a14a..dd1c518e5f0 100644 --- a/src/Model/TransportModel/tsp-apt.f90 +++ b/src/Model/TransportModel/tsp-apt.f90 @@ -709,7 +709,6 @@ subroutine apt_ad(this) end subroutine apt_ad !> @brief Override bnd reset for custom mover logic - !< TODO_MJR: check this subroutine apt_reset(this) class(TspAptType) :: this !< GwtAptType object ! local diff --git a/src/Solution/ConvergenceSummary.f90 b/src/Solution/ConvergenceSummary.f90 index 5e85ccc7aaf..7f4c79464d4 100644 --- a/src/Solution/ConvergenceSummary.f90 +++ b/src/Solution/ConvergenceSummary.f90 @@ -19,12 +19,12 @@ module ConvergenceSummaryModule integer(I4B), dimension(:), pointer, contiguous :: itinner => null() !< inner iteration number within each picard iteration integer(I4B), dimension(:), pointer, contiguous :: locdv => null() !< location of the maximum dependent-variable change in the solution real(DP), dimension(:), pointer, contiguous :: dvmax => null() !< maximum dependent-variable change in the solution - integer(I4B), dimension(:), pointer, contiguous :: locdr => null() !< location of the maximum flow change in the solution - real(DP), dimension(:), pointer, contiguous :: drmax => null() !< maximum flow change in the solution + integer(I4B), dimension(:), pointer, contiguous :: locr => null() !< location of the maximum flow change in the solution + real(DP), dimension(:), pointer, contiguous :: rmax => null() !< maximum flow change in the solution integer(I4B), pointer, dimension(:, :), contiguous :: convlocdv => null() !< location of the maximum dependent-variable change in each model in the solution real(DP), pointer, dimension(:, :), contiguous :: convdvmax => null() !< maximum dependent-variable change for each model in the solution - integer(I4B), pointer, dimension(:, :), contiguous :: convlocdr => null() !< location of the maximum flow change in each model in the solution - real(DP), pointer, dimension(:, :), contiguous :: convdrmax => null() !< maximum flow change in each model in the solution + integer(I4B), pointer, dimension(:, :), contiguous :: convlocr => null() !< location of the maximum flow change in each model in the solution + real(DP), pointer, dimension(:, :), contiguous :: convrmax => null() !< maximum flow change in each model in the solution contains procedure :: init procedure :: reinit @@ -54,15 +54,15 @@ subroutine init(this, nr_models, model_bounds, mem_path) call mem_allocate(this%itinner, 0, 'ITINNER', this%memory_path) call mem_allocate(this%locdv, this%convnmod, 'LOCDV', this%memory_path) call mem_allocate(this%dvmax, this%convnmod, 'DVMAX', this%memory_path) - call mem_allocate(this%locdr, this%convnmod, 'LOCDR', this%memory_path) - call mem_allocate(this%drmax, this%convnmod, 'DRMAX', this%memory_path) + call mem_allocate(this%locr, this%convnmod, 'LOCDR', this%memory_path) + call mem_allocate(this%rmax, this%convnmod, 'DRMAX', this%memory_path) call mem_allocate(this%convdvmax, this%convnmod, 0, 'CONVDVMAX', & this%memory_path) call mem_allocate(this%convlocdv, this%convnmod, 0, 'CONVLOCDV', & this%memory_path) - call mem_allocate(this%convdrmax, this%convnmod, 0, 'CONVDRMAX', & + call mem_allocate(this%convrmax, this%convnmod, 0, 'CONVDRMAX', & this%memory_path) - call mem_allocate(this%convlocdr, this%convnmod, 0, 'CONVLOCDR', & + call mem_allocate(this%convlocr, this%convnmod, 0, 'CONVLOCDR', & this%memory_path) call this%set_defaults() @@ -79,9 +79,9 @@ subroutine reinit(this, niter_max) this%memory_path) call mem_reallocate(this%convlocdv, this%convnmod, niter_max, 'CONVLOCDV', & this%memory_path) - call mem_reallocate(this%convdrmax, this%convnmod, niter_max, 'CONVDRMAX', & + call mem_reallocate(this%convrmax, this%convnmod, niter_max, 'CONVDRMAX', & this%memory_path) - call mem_reallocate(this%convlocdr, this%convnmod, niter_max, 'CONVLOCDR', & + call mem_reallocate(this%convlocr, this%convnmod, niter_max, 'CONVLOCDR', & this%memory_path) call this%set_defaults() @@ -94,10 +94,10 @@ subroutine set_defaults(this) integer(I4B) :: i, j do i = 1, this%convnmod - this%locdr(i) = 0 + this%locr(i) = 0 this%dvmax(i) = DZERO this%locdv(i) = 0 - this%drmax(i) = DZERO + this%rmax(i) = DZERO end do do i = 1, this%nitermax @@ -105,8 +105,8 @@ subroutine set_defaults(this) do j = 1, this%convnmod this%convdvmax(j, i) = DZERO this%convlocdv(j, i) = 0 - this%convdrmax(j, i) = DZERO - this%convlocdr(j, i) = 0 + this%convrmax(j, i) = DZERO + this%convlocr(j, i) = 0 end do end do @@ -121,8 +121,8 @@ subroutine destroy(this) call mem_deallocate(this%convnmod) call mem_deallocate(this%nitermax) - call mem_deallocate(this%locdr) - call mem_deallocate(this%drmax) + call mem_deallocate(this%locr) + call mem_deallocate(this%rmax) call mem_deallocate(this%locdv) call mem_deallocate(this%dvmax) @@ -130,8 +130,8 @@ subroutine destroy(this) call mem_deallocate(this%itinner) call mem_deallocate(this%convdvmax) call mem_deallocate(this%convlocdv) - call mem_deallocate(this%convdrmax) - call mem_deallocate(this%convlocdr) + call mem_deallocate(this%convrmax) + call mem_deallocate(this%convlocr) end subroutine destroy diff --git a/src/Solution/LinearMethods/ImsLinear.f90 b/src/Solution/LinearMethods/ImsLinear.f90 index 4838ff1cd88..9929fcbf61b 100644 --- a/src/Solution/LinearMethods/ImsLinear.f90 +++ b/src/Solution/LinearMethods/ImsLinear.f90 @@ -9,7 +9,8 @@ MODULE IMSLinearModule use IMSLinearBaseModule, only: ims_base_cg, ims_base_bcgs, & ims_base_pccrs, ims_base_calc_order, & ims_base_scale, ims_base_pcu, & - ims_base_residual + ims_base_residual, ims_base_epfact, & + ims_calc_pcdims use BlockParserModule, only: BlockParserType use MatrixBaseModule use ConvergenceSummaryModule @@ -127,13 +128,10 @@ SUBROUTINE imslinear_ar(this, NAME, IOUT, IPRIMS, MXITER, & type(ImsLinearSettingsType), pointer :: linear_settings !< the settings form the IMS file ! -- local variables character(len=LINELENGTH) :: errmsg - integer(I4B) :: i, n + integer(I4B) :: n integer(I4B) :: i0 integer(I4B) :: iscllen, iolen - integer(I4B) :: ijlu - integer(I4B) :: ijw - integer(I4B) :: iwlu - integer(I4B) :: iwk + ! ! -- DEFINE NAME this%memoryPath = create_mem_path(name, 'IMSLINEAR') @@ -225,38 +223,9 @@ SUBROUTINE imslinear_ar(this, NAME, IOUT, IPRIMS, MXITER, & CALL mem_allocate(this%DSCALE, iscllen, 'DSCALE', TRIM(this%memoryPath)) CALL mem_allocate(this%DSCALE2, iscllen, 'DSCALE2', TRIM(this%memoryPath)) ! - ! -- ALLOCATE MEMORY FOR PRECONDITIONING MATRIX - ijlu = 1 - ijw = 1 - iwlu = 1 - ! - ! -- ILU0 AND MILU0 - this%NIAPC = this%NEQ - this%NJAPC = this%NJA - ! - ! -- ILUT AND MILUT - IF (this%IPC == 3 .OR. this%IPC == 4) THEN - this%NIAPC = this%NEQ - IF (this%LEVEL > 0) THEN - iwk = this%NEQ * (this%LEVEL * 2 + 1) - ELSE - iwk = 0 - DO n = 1, NEQ - i = this%IA(n + 1) - this%IA(n) - IF (i > iwk) THEN - iwk = i - END IF - END DO - iwk = this%NEQ * iwk - END IF - this%NJAPC = iwk - ijlu = iwk - ijw = 2 * this%NEQ - iwlu = this%NEQ + 1 - END IF - this%NJLU = ijlu - this%NJW = ijw - this%NWLU = iwlu + ! -- determine dimensions for preconditing arrays + call ims_calc_pcdims(this%NEQ, this%NJA, this%IA, this%LEVEL, this%IPC, & + this%NIAPC, this%NJAPC, this%NJLU, this%NJW, this%NWLU) ! ! -- ALLOCATE BASE PRECONDITIONER VECTORS CALL mem_allocate(this%IAPC, this%NIAPC + 1, 'IAPC', TRIM(this%memoryPath)) @@ -268,9 +237,9 @@ SUBROUTINE imslinear_ar(this, NAME, IOUT, IPRIMS, MXITER, & CALL mem_allocate(this%W, this%NIAPC, 'W', TRIM(this%memoryPath)) ! ! -- ALLOCATE MEMORY FOR ILUT VECTORS - CALL mem_allocate(this%JLU, ijlu, 'JLU', TRIM(this%memoryPath)) - CALL mem_allocate(this%JW, ijw, 'JW', TRIM(this%memoryPath)) - CALL mem_allocate(this%WLU, iwlu, 'WLU', TRIM(this%memoryPath)) + CALL mem_allocate(this%JLU, this%NJLU, 'JLU', TRIM(this%memoryPath)) + CALL mem_allocate(this%JW, this%NJW, 'JW', TRIM(this%memoryPath)) + CALL mem_allocate(this%WLU, this%NWLU, 'WLU', TRIM(this%memoryPath)) ! ! -- GENERATE IAPC AND JAPC FOR ILU0 AND MILU0 IF (this%IPC == 1 .OR. this%IPC == 2) THEN @@ -341,13 +310,13 @@ SUBROUTINE imslinear_ar(this, NAME, IOUT, IPRIMS, MXITER, & END DO ! ! -- ILUT AND MILUT WORKING VECTORS - DO n = 1, ijlu - this%JLU(n) = DZERO + DO n = 1, this%NJLU + this%JLU(n) = IZERO END DO - DO n = 1, ijw - this%JW(n) = DZERO + DO n = 1, this%NJW + this%JW(n) = IZERO END DO - DO n = 1, iwlu + DO n = 1, this%NWLU this%WLU(n) = DZERO END DO ! @@ -685,17 +654,7 @@ SUBROUTINE imslinear_ap(this, ICNVG, KSTP, KITER, IN_ITER, & real(DP) :: dnrm2 ! ! -- set epfact based on timestep - IF (this%ICNVGOPT == 2) THEN - IF (KSTP == 1) THEN - this%EPFACT = 0.01 - ELSE - this%EPFACT = 0.10 - END IF - ELSE IF (this%ICNVGOPT == 4) THEN - this%EPFACT = DEM4 - ELSE - this%EPFACT = DONE - END IF + this%EPFACT = ims_base_epfact(this%ICNVGOPT, KSTP) ! ! -- SCALE PROBLEM IF (this%ISCL .NE. 0) THEN diff --git a/src/Solution/LinearMethods/ImsLinearBase.f90 b/src/Solution/LinearMethods/ImsLinearBase.f90 index 4c82d9f87af..dffaa66d3d2 100644 --- a/src/Solution/LinearMethods/ImsLinearBase.f90 +++ b/src/Solution/LinearMethods/ImsLinearBase.f90 @@ -8,7 +8,7 @@ MODULE IMSLinearBaseModule ! -- modules use KindModule, only: DP, I4B use ConstantsModule, only: LINELENGTH, IZERO, & - DZERO, DPREC, DEM6, DEM3, DHALF, DONE + DZERO, DPREC, DEM6, DEM3, DEM4, DHALF, DONE use MathUtilModule, only: is_close use BlockParserModule, only: BlockParserType use IMSReorderingModule, only: ims_odrv @@ -139,8 +139,10 @@ SUBROUTINE ims_base_cg(ICNVG, ITMAX, INNERIT, & rmax = DZERO l2norm = DZERO DO im = 1, CONVNMOD + summary%locdv(im) = 0 summary%dvmax(im) = DZERO - summary%drmax(im) = DZERO + summary%locr(im) = 0 + summary%rmax(im) = DZERO END DO im = 1 im0 = CONVMODSTART(1) @@ -172,9 +174,9 @@ SUBROUTINE ims_base_cg(ICNVG, ITMAX, INNERIT, & rmax = tv rloc = n END IF - IF (ABS(tv) > ABS(summary%drmax(im))) THEN - summary%drmax(im) = tv - summary%locdr(im) = n + IF (ABS(tv) > ABS(summary%rmax(im))) THEN + summary%rmax(im) = tv + summary%locr(im) = n END IF l2norm = l2norm + tv * tv END DO @@ -188,9 +190,9 @@ SUBROUTINE ims_base_cg(ICNVG, ITMAX, INNERIT, & summary%itinner(n) = iiter DO im = 1, CONVNMOD summary%convlocdv(im, n) = summary%locdv(im) - summary%convlocdr(im, n) = summary%locdr(im) + summary%convlocr(im, n) = summary%locr(im) summary%convdvmax(im, n) = summary%dvmax(im) - summary%convdrmax(im, n) = summary%drmax(im) + summary%convrmax(im, n) = summary%rmax(im) END DO END IF ! @@ -433,7 +435,7 @@ SUBROUTINE ims_base_bcgs(ICNVG, ITMAX, INNERIT, & l2norm = DZERO DO im = 1, CONVNMOD summary%dvmax(im) = DZERO - summary%drmax(im) = DZERO + summary%rmax(im) = DZERO END DO im = 1 im0 = CONVMODSTART(1) @@ -472,9 +474,9 @@ SUBROUTINE ims_base_bcgs(ICNVG, ITMAX, INNERIT, & rmax = tv rloc = n END IF - IF (ABS(tv) > ABS(summary%drmax(im))) THEN - summary%drmax(im) = tv - summary%locdr(im) = n + IF (ABS(tv) > ABS(summary%rmax(im))) THEN + summary%rmax(im) = tv + summary%locr(im) = n END IF l2norm = l2norm + tv * tv END DO @@ -490,8 +492,8 @@ SUBROUTINE ims_base_bcgs(ICNVG, ITMAX, INNERIT, & DO im = 1, CONVNMOD summary%convdvmax(im, n) = summary%dvmax(im) summary%convlocdv(im, n) = summary%locdv(im) - summary%convdrmax(im, n) = summary%drmax(im) - summary%convlocdr(im, n) = summary%locdr(im) + summary%convrmax(im, n) = summary%rmax(im) + summary%convlocr(im, n) = summary%locr(im) END DO END IF ! @@ -1173,6 +1175,57 @@ SUBROUTINE ims_base_testcnvg(Icnvgopt, Icnvg, Iiter, & RETURN END SUBROUTINE ims_base_testcnvg + subroutine ims_calc_pcdims(neq, nja, ia, level, ipc, & + niapc, njapc, njlu, njw, nwlu) + integer(I4B), intent(in) :: neq !< nr. of rows A + integer(I4B), intent(in) :: nja !< nr. of nonzeros A + integer(I4B), dimension(:), intent(in) :: ia !< CSR row pointers A + integer(I4B), intent(in) :: level !< fill level ILU + integer(I4B), intent(in) :: ipc !< IMS preconditioner type + integer(I4B), intent(inout) :: niapc !< work array size + integer(I4B), intent(inout) :: njapc !< work array size + integer(I4B), intent(inout) :: njlu !< work array size + integer(I4B), intent(inout) :: njw !< work array size + integer(I4B), intent(inout) :: nwlu !< work array size + ! local + integer(I4B) :: n, i + integer(I4B) :: ijlu, ijw, iwlu, iwk + + ijlu = 1 + ijw = 1 + iwlu = 1 + + ! ILU0 and MILU0 + niapc = neq + njapc = nja + + ! ILUT and MILUT + if (ipc == 3 .or. ipc == 4) then + niapc = neq + if (level > 0) then + iwk = neq * (level * 2 + 1) + else + iwk = 0 + do n = 1, neq + i = ia(n + 1) - ia(n) + if (i > iwk) then + iwk = i + end if + end do + iwk = neq * iwk + end if + njapc = iwk + ijlu = iwk + ijw = 2 * neq + iwlu = neq + 1 + end if + + njlu = ijlu + njw = ijw + nwlu = iwlu + + end subroutine ims_calc_pcdims + !> @ brief Generate CRS pointers for the preconditioner !! !! Generate the CRS row and column pointers for the preconditioner. @@ -1297,4 +1350,25 @@ SUBROUTINE ims_base_residual(NEQ, NJA, X, B, D, A, IA, JA) RETURN END SUBROUTINE ims_base_residual + !> @brief Function returning EPFACT + !< + function ims_base_epfact(icnvgopt, kstp) result(epfact) + integer(I4B) :: icnvgopt !< IMS convergence option + integer(I4B) :: kstp !< time step number + real(DP) :: epfact !< factor for decreasing convergence criteria in subsequent Picard iterations + + if (icnvgopt == 2) then + if (kstp == 1) then + epfact = 0.01 + else + epfact = 0.10 + end if + else if (icnvgopt == 4) then + epfact = DEM4 + else + epfact = DONE + end if + + end function ims_base_epfact + END MODULE IMSLinearBaseModule diff --git a/src/Solution/LinearMethods/ImsLinearSolver.f90 b/src/Solution/LinearMethods/ImsLinearSolver.f90 index b69a055abbd..0ea1bf2d9e1 100644 --- a/src/Solution/LinearMethods/ImsLinearSolver.f90 +++ b/src/Solution/LinearMethods/ImsLinearSolver.f90 @@ -1,5 +1,6 @@ module ImsLinearSolverModule use KindModule, only: I4B, DP + use ConstantsModule, only: LENSOLUTIONNAME use LinearSolverBaseModule use MatrixBaseModule use VectorBaseModule @@ -17,7 +18,6 @@ module ImsLinearSolverModule procedure :: initialize => ims_initialize procedure :: print_summary => ims_print_summary procedure :: solve => ims_solve - procedure :: get_result => ims_get_result procedure :: destroy => ims_destroy procedure :: create_matrix => ims_create_matrix @@ -25,13 +25,15 @@ module ImsLinearSolverModule contains - function create_ims_solver() result(solver) + function create_ims_solver(sln_name) result(solver) class(LinearSolverBaseType), pointer :: solver + character(len=LENSOLUTIONNAME) :: sln_name ! local class(ImsLinearSolverType), pointer :: ims_solver allocate (ims_solver) solver => ims_solver + solver%name = sln_name end function create_ims_solver @@ -54,10 +56,6 @@ subroutine ims_solve(this, kiter, rhs, x, cnvg_summary) type(ConvergenceSummaryType) :: cnvg_summary end subroutine ims_solve - subroutine ims_get_result(this) - class(ImsLinearSolverType) :: this - end subroutine ims_get_result - subroutine ims_destroy(this) class(ImsLinearSolverType) :: this end subroutine ims_destroy diff --git a/src/Solution/LinearSolverBase.f90 b/src/Solution/LinearSolverBase.f90 index afa5eef722c..98db62701fb 100644 --- a/src/Solution/LinearSolverBase.f90 +++ b/src/Solution/LinearSolverBase.f90 @@ -1,5 +1,6 @@ module LinearSolverBaseModule use KindModule, only: I4B, DP + use ConstantsModule, only: LENSOLUTIONNAME use MatrixBaseModule use VectorBaseModule use ImsLinearSettingsModule @@ -14,6 +15,7 @@ module LinearSolverBaseModule !! sequential, parallel, petsc, block solver, ... !< type, public, abstract :: LinearSolverBaseType + character(len=LENSOLUTIONNAME) :: name integer(I4B) :: nitermax integer(I4B) :: iteration_number integer(I4B) :: is_converged @@ -21,7 +23,6 @@ module LinearSolverBaseModule procedure(initialize_if), deferred :: initialize procedure(print_summary_if), deferred :: print_summary procedure(solve_if), deferred :: solve - procedure(get_result_if), deferred :: get_result procedure(destroy_if), deferred :: destroy procedure(create_matrix_if), deferred :: create_matrix @@ -48,10 +49,6 @@ subroutine solve_if(this, kiter, rhs, x, cnvg_summary) class(VectorBaseType), pointer :: x type(ConvergenceSummaryType) :: cnvg_summary end subroutine - subroutine get_result_if(this) - import LinearSolverBaseType - class(LinearSolverBaseType) :: this - end subroutine subroutine destroy_if(this) import LinearSolverBaseType class(LinearSolverBaseType) :: this diff --git a/src/Solution/LinearSolverFactory.F90 b/src/Solution/LinearSolverFactory.F90 index 3a3ce6934b9..13e109e2ed2 100644 --- a/src/Solution/LinearSolverFactory.F90 +++ b/src/Solution/LinearSolverFactory.F90 @@ -19,18 +19,19 @@ module LinearSolverFactory !> @brief Factory method to create the linear solver object !< - function create_linear_solver(solver_mode) result(solver) + function create_linear_solver(solver_mode, sln_name) result(solver) character(len=*) :: solver_mode + character(len=*) :: sln_name class(LinearSolverBaseType), pointer :: solver solver => null() if (solver_mode == 'IMS') then - solver => create_ims_solver() + solver => create_ims_solver(sln_name) return #if defined(__WITH_PETSC__) else if (solver_mode == 'PETSC') then - solver => create_petsc_solver() + solver => create_petsc_solver(sln_name) #endif else call ustop('Unsupported solver mode: '//trim(solver_mode)) diff --git a/src/Solution/NumericalSolution.f90 b/src/Solution/NumericalSolution.f90 index 94049065069..ae8a1ce6452 100644 --- a/src/Solution/NumericalSolution.f90 +++ b/src/Solution/NumericalSolution.f90 @@ -452,7 +452,7 @@ subroutine sln_df(this) allocate (this%linear_settings) ! ! -- create linear system matrix and compatible vectors - this%linear_solver => create_linear_solver(this%solver_mode) + this%linear_solver => create_linear_solver(this%solver_mode, this%name) this%system_matrix => this%linear_solver%create_matrix() this%vec_x => this%system_matrix%create_vec_mm(this%neq, 'X', & this%memory_path) @@ -1985,8 +1985,8 @@ subroutine convergence_summary(this, iu, im, itertot_timestep) integer(I4B) :: k integer(I4B) :: locdv integer(I4B) :: locdr - real(DP) :: dv - real(DP) :: dr + real(DP) :: dv !< the maximum change in the dependent variable + real(DP) :: res !< the maximum value of the residual vector ! ! -- initialize local variables strh = '' @@ -2037,22 +2037,22 @@ subroutine convergence_summary(this, iu, im, itertot_timestep) end if if (im > this%convnmod) then dv = DZERO - dr = DZERO + res = DZERO do j = 1, this%convnmod if (ABS(this%cnvg_summary%convdvmax(j, k)) > ABS(dv)) then locdv = this%cnvg_summary%convlocdv(j, k) dv = this%cnvg_summary%convdvmax(j, k) end if - if (ABS(this%cnvg_summary%convdrmax(j, k)) > ABS(dr)) then - locdr = this%cnvg_summary%convlocdr(j, k) - dr = this%cnvg_summary%convdrmax(j, k) + if (ABS(this%cnvg_summary%convrmax(j, k)) > ABS(res)) then + locdr = this%cnvg_summary%convlocr(j, k) + res = this%cnvg_summary%convrmax(j, k) end if end do else locdv = this%cnvg_summary%convlocdv(im, k) - locdr = this%cnvg_summary%convlocdr(im, k) + locdr = this%cnvg_summary%convlocr(im, k) dv = this%cnvg_summary%convdvmax(im, k) - dr = this%cnvg_summary%convdrmax(im, k) + res = this%cnvg_summary%convrmax(im, k) end if call this%sln_get_loc(locdv, strh) call this%sln_get_loc(locdr, strr) @@ -2063,7 +2063,7 @@ subroutine convergence_summary(this, iu, im, itertot_timestep) call this%innertab%add_term(iinner) call this%innertab%add_term(dv) call this%innertab%add_term(adjustr(trim(strh))) - call this%innertab%add_term(dr) + call this%innertab%add_term(res) call this%innertab%add_term(adjustr(trim(strr))) ! ! -- update i0 @@ -2123,9 +2123,9 @@ subroutine csv_convergence_summary(this, iu, totim, kper, kstp, kouter, & locdv = this%cnvg_summary%convlocdv(j, kpos) dv = this%cnvg_summary%convdvmax(j, kpos) end if - if (ABS(this%cnvg_summary%convdrmax(j, kpos)) > ABS(dr)) then - locdr = this%cnvg_summary%convlocdr(j, kpos) - dr = this%cnvg_summary%convdrmax(j, kpos) + if (ABS(this%cnvg_summary%convrmax(j, kpos)) > ABS(dr)) then + locdr = this%cnvg_summary%convlocr(j, kpos) + dr = this%cnvg_summary%convrmax(j, kpos) end if end do ! @@ -2148,8 +2148,8 @@ subroutine csv_convergence_summary(this, iu, totim, kper, kstp, kouter, & do j = 1, this%cnvg_summary%convnmod locdv = this%cnvg_summary%convlocdv(j, kpos) dv = this%cnvg_summary%convdvmax(j, kpos) - locdr = this%cnvg_summary%convlocdr(j, kpos) - dr = this%cnvg_summary%convdrmax(j, kpos) + locdr = this%cnvg_summary%convlocr(j, kpos) + dr = this%cnvg_summary%convrmax(j, kpos) ! ! -- get model number and user node number for dv call this%sln_get_nodeu(locdv, im, nodeu) @@ -2423,7 +2423,6 @@ subroutine sln_ls(this, kiter, kstp, kper, in_iter, iptc, ptcf) end do ! ! -- complete adjustments for Dirichlet boundaries for a symmetric matrix - ! -- TODO_MJR: add this for PETSc/parallel if (this%isymmetric == 1 .and. simulation_mode == "SEQUENTIAL") then do ieq = 1, this%neq if (this%active(ieq) > 0) then @@ -3097,14 +3096,14 @@ subroutine sln_outer_check(this, hncg, lrch) real(DP) :: ahdif ! ! -- determine the maximum change - nb = 1 + nb = 0 bigch = DZERO abigch = DZERO do n = 1, this%neq if (this%active(n) < 1) cycle hdif = this%x(n) - this%xtemp(n) ahdif = abs(hdif) - if (ahdif >= abigch) then + if (ahdif > abigch) then bigch = hdif abigch = ahdif nb = n diff --git a/src/Solution/PETSc/PetscConvergence.F90 b/src/Solution/PETSc/PetscConvergence.F90 index 0928d7aa017..ae2fad75de5 100644 --- a/src/Solution/PETSc/PetscConvergence.F90 +++ b/src/Solution/PETSc/PetscConvergence.F90 @@ -2,51 +2,59 @@ module PetscConvergenceModule #include use petscksp use KindModule, only: I4B, DP + use ConstantsModule, only: DPREC use ListModule use ConvergenceSummaryModule + use ImsLinearSettingsModule implicit none private public :: petsc_check_convergence public :: KSPSetConvergenceTest - type, public :: PetscContextType - Vec :: x_old - Vec :: res_old - Vec :: delta_x - Vec :: delta_res - real(DP) :: dvclose - integer(I4B) :: max_its - type(ConvergenceSummaryType), pointer :: cnvg_summary => null() + !< Context for the custom convergence check + type, public :: PetscCnvgCtxType + Vec :: x_old !< x vector from the previous iteration + Vec :: delta_x !< delta in x w.r.t. previous iteration + Vec :: residual !< the unpreconditoned residual vector (a la IMS) + integer(I4B) :: icnvg_ims !< IMS convergence number: 1 => converged, -1 => forces next Picard iter + integer(I4B) :: icnvgopt !< convergence option from IMS settings + real(DP) :: dvclose !< dep. variable closure criterion + real(DP) :: rclose !< residual closure criterion + integer(I4B) :: max_its !< maximum number of inner iterations + real(DP) :: rnorm_L2_init !< the initial L2 norm for (b - Ax) + type(ConvergenceSummaryType), pointer :: cnvg_summary => null() !< detailed convergence information + real(DP) :: t_convergence_check !< the time spent convergence checking contains + procedure :: create procedure :: destroy - end type PetscContextType + end type PetscCnvgCtxType ! passing our context into PETSc requires an explicit interface ! on KSPSetConvergenceTest, it is defined here: interface subroutine CnvgCheckFunc(ksp, n, rnorm, flag, context, ierr) - import tKSP, PetscContextType + import tKSP, PetscCnvgCtxType type(tKSP) :: ksp PetscInt :: n PetscReal :: rnorm KSPConvergedReason :: flag - class(PetscContextType), pointer :: context + class(PetscCnvgCtxType), pointer :: context PetscErrorCode :: ierr end subroutine subroutine CnvgDestroyFunc(context, ierr) - import PetscContextType - class(PetscContextType), pointer :: context + import PetscCnvgCtxType + class(PetscCnvgCtxType), pointer :: context PetscErrorCode :: ierr end subroutine subroutine KSPSetConvergenceTest(ksp, check_convergence, context, & destroy, ierr) - import tKSP, CnvgCheckFunc, PetscContextType, CnvgDestroyFunc + import tKSP, CnvgCheckFunc, PetscCnvgCtxType, CnvgDestroyFunc type(tKSP) :: ksp procedure(CnvgCheckFunc) :: check_convergence - class(PetscContextType), pointer :: context + class(PetscCnvgCtxType), pointer :: context procedure(CnvgDestroyFunc) :: destroy PetscErrorCode :: ierr end subroutine @@ -54,24 +62,53 @@ subroutine KSPSetConvergenceTest(ksp, check_convergence, context, & contains + subroutine create(this, mat, settings, summary) + class(PetscCnvgCtxType) :: this + Mat, pointer :: mat + type(ImsLinearSettingsType), pointer :: settings + type(ConvergenceSummaryType), pointer :: summary + ! local + PetscErrorCode :: ierr + + this%icnvg_ims = 0 + this%icnvgopt = settings%icnvgopt + this%dvclose = settings%dvclose + this%rclose = settings%rclose + this%max_its = settings%iter1 + this%cnvg_summary => summary + call MatCreateVecs(mat, this%x_old, PETSC_NULL_VEC, ierr) + CHKERRQ(ierr) + call MatCreateVecs(mat, this%delta_x, PETSC_NULL_VEC, ierr) + CHKERRQ(ierr) + call MatCreateVecs(mat, this%residual, PETSC_NULL_VEC, ierr) + CHKERRQ(ierr) + + end subroutine create + !> @brief Routine to check the convergence. This is called !< from within PETSc. - subroutine petsc_check_convergence(ksp, n, rnorm, flag, context, ierr) + subroutine petsc_check_convergence(ksp, n, rnorm_L2, flag, context, ierr) + use TimerModule KSP :: ksp !< Iterative context PetscInt :: n !< Iteration number - PetscReal :: rnorm !< 2-norm (preconditioned) residual value + PetscReal :: rnorm_L2 !< 2-norm (preconditioned) residual value KSPConvergedReason :: flag !< Converged reason - class(PetscContextType), pointer :: context !< context + class(PetscCnvgCtxType), pointer :: context !< context PetscErrorCode :: ierr !< error ! local - PetscScalar, parameter :: min_one = -1.0 - PetscScalar, dimension(:), pointer :: local_dx, local_dr - PetscScalar :: norm, dvmax_model, drmax_model - PetscInt :: idx_dv, idx_dr - Vec :: x, res + PetscReal, parameter :: min_one = -1.0 + PetscReal, dimension(:), pointer :: local_dx, local_res + PetscReal :: xnorm_inf_ims, rnorm_inf_ims, rnorm_L2_ims + PetscReal :: dvmax_model, rmax_model + PetscInt :: idx_dv, idx_r + Vec :: x, rhs + Mat :: Amat type(ConvergenceSummaryType), pointer :: summary PetscInt :: iter_cnt PetscInt :: i, j, istart, iend + real(DP) :: start_time + + call code_timer(0, start_time, context%t_convergence_check) summary => context%cnvg_summary @@ -79,24 +116,36 @@ subroutine petsc_check_convergence(ksp, n, rnorm, flag, context, ierr) ! to avoid a memory leak, KSPBuildSolution doesn't... call KSPBuildSolution(ksp, PETSC_NULL_VEC, x, ierr) CHKERRQ(ierr) - call KSPBuildResidual(ksp, PETSC_NULL_VEC, PETSC_NULL_VEC, res, ierr) + + call KSPGetRhs(ksp, rhs, ierr) + CHKERRQ(ierr) + + call KSPGetOperators(ksp, Amat, PETSC_NULL_MAT, ierr) + CHKERRQ(ierr) + + call MatMult(Amat, x, context%residual, ierr) + CHKERRQ(ierr) + + ! y = x + beta y (i.e. r = b - A*x) + call VecAYPX(context%residual, -1.0_DP, rhs, ierr) + CHKERRQ(ierr) + + call VecNorm(context%residual, NORM_2, rnorm_L2_ims, ierr) CHKERRQ(ierr) ! n == 0 is before the iteration starts if (n == 0) then - if (rnorm == 0.0) then + context%rnorm_L2_init = rnorm_L2_ims + if (rnorm_L2 < DPREC) then ! exact solution found flag = KSP_CONVERGED_HAPPY_BREAKDOWN else call VecCopy(x, context%x_old, ierr) CHKERRQ(ierr) - call VecCopy(res, context%res_old, ierr) - CHKERRQ(ierr) flag = KSP_CONVERGED_ITERATING end if - call VecDestroy(res, ierr) - CHKERRQ(ierr) + call code_timer(1, start_time, context%t_convergence_check) return end if @@ -109,40 +158,37 @@ subroutine petsc_check_convergence(ksp, n, rnorm, flag, context, ierr) do i = 1, summary%convnmod summary%convdvmax(i, iter_cnt) = -huge(dvmax_model) summary%convlocdv(i, iter_cnt) = -1 - summary%convdrmax(i, iter_cnt) = -huge(drmax_model) - summary%convlocdr(i, iter_cnt) = -1 + summary%convrmax(i, iter_cnt) = -huge(rmax_model) + summary%convlocr(i, iter_cnt) = -1 end do end if call VecWAXPY(context%delta_x, min_one, context%x_old, x, ierr) CHKERRQ(ierr) - call VecWAXPY(context%delta_res, min_one, context%res_old, res, ierr) + call VecNorm(context%delta_x, NORM_INFINITY, xnorm_inf_ims, ierr) CHKERRQ(ierr) - call VecNorm(context%delta_x, NORM_INFINITY, norm, ierr) - CHKERRQ(ierr) + rnorm_inf_ims = 0.0 + if (context%icnvgopt == 0 .or. context%icnvgopt == 1) then + call VecNorm(context%residual, NORM_INFINITY, rnorm_inf_ims, ierr) + CHKERRQ(ierr) + end if call VecCopy(x, context%x_old, ierr) CHKERRQ(ierr) - call VecCopy(res, context%res_old, ierr) - CHKERRQ(ierr) - - call VecDestroy(res, ierr) - CHKERRQ(ierr) - ! get dv and dr per local model (readonly!) call VecGetArrayReadF90(context%delta_x, local_dx, ierr) CHKERRQ(ierr) - call VecGetArrayReadF90(context%delta_res, local_dr, ierr) + call VecGetArrayReadF90(context%residual, local_res, ierr) CHKERRQ(ierr) do i = 1, summary%convnmod ! reset dvmax_model = 0.0 idx_dv = -1 - drmax_model = 0.0 - idx_dr = -1 + rmax_model = 0.0 + idx_r = -1 ! get first and last model index istart = summary%model_bounds(i) iend = summary%model_bounds(i + 1) - 1 @@ -151,48 +197,91 @@ subroutine petsc_check_convergence(ksp, n, rnorm, flag, context, ierr) dvmax_model = local_dx(j) idx_dv = j end if - if (abs(local_dr(j)) > abs(drmax_model)) then - drmax_model = local_dr(j) - idx_dr = j + if (abs(local_res(j)) > abs(rmax_model)) then + rmax_model = local_res(j) + idx_r = j end if end do if (summary%nitermax > 1) then summary%convdvmax(i, iter_cnt) = dvmax_model summary%convlocdv(i, iter_cnt) = idx_dv - summary%convdrmax(i, iter_cnt) = drmax_model - summary%convlocdr(i, iter_cnt) = idx_dr + summary%convrmax(i, iter_cnt) = rmax_model + summary%convlocr(i, iter_cnt) = idx_r end if end do call VecRestoreArrayF90(context%delta_x, local_dx, ierr) CHKERRQ(ierr) - call VecRestoreArrayF90(context%delta_res, local_dr, ierr) + call VecRestoreArrayF90(context%residual, local_res, ierr) CHKERRQ(ierr) - if (norm < context%dvclose) then - flag = KSP_CONVERGED_HAPPY_BREAKDOWN ! Converged + if (rnorm_L2 < DPREC) then + ! exact solution, set to 'converged' + flag = KSP_CONVERGED_HAPPY_BREAKDOWN else - flag = KSP_CONVERGED_ITERATING ! Not yet converged + ! IMS check on convergence + flag = apply_check(context, n, xnorm_inf_ims, rnorm_inf_ims, rnorm_L2_ims) + end if + + if (flag == KSP_CONVERGED_ITERATING) then + ! not yet converged, max. iters reached? Then stop. if (n == context%max_its) then - ! ran out of iterations before convergence - ! has been reached flag = KSP_DIVERGED_ITS end if end if + call code_timer(1, start_time, context%t_convergence_check) + end subroutine petsc_check_convergence + !> @brief Apply the IMS convergence check + !< + function apply_check(ctx, nit, dvmax, rnorm_inf, rnorm_L2) result(flag) + use TdisModule, only: kstp + use IMSLinearBaseModule, only: ims_base_testcnvg, ims_base_epfact + class(PetscCnvgCtxType) :: ctx + integer(I4B) :: nit !< iteration number + real(DP) :: dvmax !< infinity norm of dep. var. change + real(DP) :: rnorm_inf !< infinity norm of residual change + real(DP) :: rnorm_L2 !< L2-norm of residual change + KSPConvergedReason :: flag !< the convergence status + ! local + real(DP) :: epfact + real(DP) :: rcnvg + + ! Set to 'not converged' + flag = KSP_CONVERGED_ITERATING + ctx%icnvg_ims = 0 + + epfact = ims_base_epfact(ctx%icnvgopt, kstp) + + if (ctx%icnvgopt == 2 .or. & + ctx%icnvgopt == 3 .or. & + ctx%icnvgopt == 4) then + rcnvg = rnorm_L2 + else + rcnvg = rnorm_inf + end if + call ims_base_testcnvg(ctx%icnvgopt, ctx%icnvg_ims, nit, & + dvmax, rcnvg, ctx%rnorm_L2_init, & + epfact, ctx%dvclose, ctx%rclose) + + if (ctx%icnvg_ims /= 0) then + ! Set to 'converged' + flag = KSP_CONVERGED_HAPPY_BREAKDOWN + end if + + end function apply_check + subroutine destroy(this) - class(PetscContextType) :: this + class(PetscCnvgCtxType) :: this ! local integer(I4B) :: ierr call VecDestroy(this%x_old, ierr) CHKERRQ(ierr) - call VecDestroy(this%res_old, ierr) - CHKERRQ(ierr) call VecDestroy(this%delta_x, ierr) CHKERRQ(ierr) - call VecDestroy(this%delta_res, ierr) + call VecDestroy(this%residual, ierr) CHKERRQ(ierr) end subroutine destroy diff --git a/src/Solution/PETSc/PetscImsPreconditioner.F90 b/src/Solution/PETSc/PetscImsPreconditioner.F90 index c5f834ad440..40feeb3fb79 100644 --- a/src/Solution/PETSc/PetscImsPreconditioner.F90 +++ b/src/Solution/PETSc/PetscImsPreconditioner.F90 @@ -1,6 +1,12 @@ module PetscImsPreconditionerModule #include use petscksp + use KindModule, only: DP, I4B + use ConstantsModule, only: LENMEMPATH, DZERO, IZERO + use PetscMatrixModule, only: PetscMatrixType + use SparseMatrixModule, only: SparseMatrixType + use ImsLinearSettingsModule, only: ImsLinearSettingsType + use SimVariablesModule, only: iout implicit none private @@ -8,10 +14,32 @@ module PetscImsPreconditionerModule public :: PcShellCtxType public :: pcshell_apply public :: pcshell_setup - public :: pcshell_destroy + + character(len=9), dimension(4) :: IMS_PC_TYPE = ["IMS ILU0 ", & + "IMS MILU0", & + "IMS ILUT ", & + "IMS MILUT"] type :: PcShellCtxType - Vec :: diag + character(len=LENMEMPATH) :: memory_path !< the memory path, taken from the system matrix + class(PetscMatrixType), pointer :: system_matrix !< pointer to the petsc system matrix + type(ImsLinearSettingsType), pointer :: linear_settings !< the linear settings from IMS + integer(I4B) :: ipc !< the IMS preconditioner type: 1=ILU0, 2=MILU0, 3=ILUT, 4=MILUT + character(len=16) :: ims_pc_type !< the IMS preconditioner type as a string + ! PC matrix + integer(I4B), dimension(:), contiguous, pointer :: IAPC => null() !< CSR row pointer + integer(I4B), dimension(:), contiguous, pointer :: JAPC => null() !< CSR columns + real(DP), dimension(:), contiguous, pointer :: APC => null() !< CSR Preconditioner matrix values + ! work vectors + integer(I4B), dimension(:), contiguous, pointer :: IW => null() !< (M)ILU0 work array + real(DP), dimension(:), contiguous, pointer :: W => null() !< (M)ILU0 work array + integer(I4B), dimension(:), contiguous, pointer :: JLU => null() !< (M)ILUT work array + integer(I4B), dimension(:), contiguous, pointer :: JW => null() !< (M)ILUT work array + real(DP), dimension(:), contiguous, pointer :: WLU => null() !< (M)ILUT work array + contains + procedure :: create => pctx_create + procedure :: destroy => pctx_destroy + end type interface @@ -25,56 +53,170 @@ subroutine PCShellGetContext(pc, ctx, ierr) contains - !> @brief Apply shell preconditioner + !> @brief Create the preconditioner context from the system matrix !< + subroutine pctx_create(this, matrix, lin_settings) + use IMSLinearBaseModule, only: ims_base_pccrs, ims_calc_pcdims + use MemoryManagerModule, only: mem_allocate + class(PcShellCtxType) :: this !< this instance + class(PetscMatrixType), pointer :: matrix !< the linear system matrix + type(ImsLinearSettingsType), pointer :: lin_settings !< linear settings from IMS + ! local + integer(I4B) :: n, neq, nja + integer(I4B), dimension(:), contiguous, pointer :: ia, ja + real(DP), dimension(:), contiguous, pointer :: amat + integer(I4B) :: niapc, njapc, njlu, njw, nwlu + + this%memory_path = matrix%memory_path + this%linear_settings => lin_settings + + this%ipc = 1 + if (this%linear_settings%level > 0) this%ipc = this%ipc + 2 + if (this%linear_settings%relax > 0.0_DP) this%ipc = this%ipc + 1 + this%ims_pc_type = IMS_PC_TYPE(this%ipc) + + this%system_matrix => matrix + call matrix%get_aij_local(ia, ja, amat) + + neq = matrix%nrow + nja = matrix%nnz_local + call ims_calc_pcdims(neq, nja, ia, this%linear_settings%level, this%ipc, & + niapc, njapc, njlu, njw, nwlu) + + ! preconditioner matrix + call mem_allocate(this%IAPC, niapc + 1, 'IAPC', this%memory_path) + call mem_allocate(this%JAPC, njapc, 'JAPC', this%memory_path) + call mem_allocate(this%APC, njapc, 'APC', this%memory_path) + if (this%ipc == 1 .or. this%ipc == 2) then + call ims_base_pccrs(niapc, njapc, ia, ja, this%IAPC, this%JAPC) + end if + do n = 1, njapc + this%APC(n) = DZERO + end do + + ! (M)ILU0 work arrays + call mem_allocate(this%IW, niapc, 'IW', this%memory_path) + call mem_allocate(this%W, niapc, 'W', this%memory_path) + do n = 1, niapc + this%IW(n) = IZERO + this%W(n) = DZERO + end do + + ! (M)ILUT work arrays + call mem_allocate(this%JLU, njlu, 'JLU', this%memory_path) + call mem_allocate(this%JW, njw, 'JW', this%memory_path) + call mem_allocate(this%WLU, nwlu, 'WLU', this%memory_path) + + do n = 1, njlu + this%JLU(n) = IZERO + end do + do n = 1, njw + this%JW(n) = IZERO + end do + do n = 1, nwlu + this%WLU(n) = DZERO + end do + + end subroutine pctx_create + + !> @brief Cleanup the context + !< + subroutine pctx_destroy(this) + use MemoryManagerModule, only: mem_deallocate + class(PcShellCtxType) :: this + + ! matrix + call mem_deallocate(this%IAPC) + call mem_deallocate(this%JAPC) + call mem_deallocate(this%APC) + + ! work arrays + call mem_deallocate(this%IW) + call mem_deallocate(this%W) + call mem_deallocate(this%JLU) + call mem_deallocate(this%JW) + call mem_deallocate(this%WLU) + + this%system_matrix => null() + + end subroutine pctx_destroy + + !> @brief Apply shell preconditioner + !< (this is not a type bound procedure) subroutine pcshell_apply(pc, x, y, ierr) + use IMSLinearBaseModule, only: ims_base_ilu0a + external lusol ! from ilut.f90 PC :: pc !< the shell preconditioner Vec :: x !< the input vector Vec :: y !< the output vector PetscErrorCode :: ierr !< PETSc error code ! local type(PcShellCtxType), pointer :: pc_ctx => null() + real(DP), dimension(:), pointer :: local_x, local_y + integer(I4B) :: neq, nja - ! this applies an example jacobi pc, - ! to be replaced by others (MILUT) call PCShellGetContext(pc, pc_ctx, ierr) CHKERRQ(ierr) - call VecPointwiseMult(y, x, pc_ctx%diag, ierr) + + call VecGetArrayReadF90(x, local_x, ierr) + CHKERRQ(ierr) + call VecGetArrayF90(y, local_y, ierr) + CHKERRQ(ierr) + + neq = pc_ctx%system_matrix%nrow + nja = pc_ctx%system_matrix%nnz_local + select case (pc_ctx%ipc) + case (1, 2) + call ims_base_ilu0a(nja, neq, pc_ctx%APC, pc_ctx%IAPC, pc_ctx%JAPC, & + local_x, local_y) + case (3, 4) + call lusol(neq, local_x, local_y, pc_ctx%APC, pc_ctx%JLU, pc_ctx%IW) + end select + + call VecRestoreArrayF90(x, local_x, ierr) + CHKERRQ(ierr) + call VecRestoreArrayF90(y, local_y, ierr) CHKERRQ(ierr) end subroutine pcshell_apply !> @brief Set up the custom preconditioner - !< + !< (this is not a type bound procedure) subroutine pcshell_setup(pc, ierr) + use IMSLinearBaseModule, only: ims_base_pcu PC :: pc !< the shell preconditioner PetscErrorCode :: ierr !< PETSc error code ! local - Mat :: pmat type(PcShellCtxType), pointer :: pc_ctx => null() + integer(I4B) :: neq, nja + integer(I4B) :: niapc, njapc, njlu, njw, nwlu + integer(I4B), dimension(:), contiguous, pointer :: ia, ja + real(DP), dimension(:), contiguous, pointer :: amat - ! this currently sets up an example jacobi pc, - ! to be replaced by others (MILUT) call PCShellGetContext(pc, pc_ctx, ierr) CHKERRQ(ierr) - call PCGetOperators(pc, PETSC_NULL_MAT, pmat, ierr) - CHKERRQ(ierr) - call MatCreateVecs(pmat, pc_ctx%diag, PETSC_NULL_VEC, ierr) - CHKERRQ(ierr) - call MatGetDiagonal(pmat, pc_ctx%diag, ierr) - CHKERRQ(ierr) - call VecReciprocal(pc_ctx%diag, ierr) - CHKERRQ(ierr) - end subroutine pcshell_setup + ! note the two different matrix types here: + ! bridging between PETSc and IMS + call pc_ctx%system_matrix%get_aij_local(ia, ja, amat) - !> @brief Clean up - !< - subroutine pcshell_destroy(pc, ierr) - PC :: pc !< the shell preconditioner - PetscErrorCode :: ierr !< PETSc error code - ! local + neq = pc_ctx%system_matrix%nrow + nja = pc_ctx%system_matrix%nnz_local + niapc = size(pc_ctx%IAPC) - 1 + njapc = size(pc_ctx%JAPC) + njlu = size(pc_ctx%JLU) + njw = size(pc_ctx%JW) + nwlu = size(pc_ctx%WLU) + call ims_base_pcu(iout, nja, neq, niapc, njapc, & + pc_ctx%ipc, pc_ctx%linear_settings%relax, & + amat, ia, ja, & + pc_ctx%APC, pc_ctx%IAPC, pc_ctx%JAPC, & + pc_ctx%IW, pc_ctx%W, & + pc_ctx%linear_settings%level, & + pc_ctx%linear_settings%droptol, & + njlu, njw, nwlu, & + pc_ctx%JLU, pc_ctx%JW, pc_ctx%WLU) - end subroutine pcshell_destroy + end subroutine pcshell_setup end module PetscImsPreconditionerModule diff --git a/src/Solution/PETSc/PetscSolver.F90 b/src/Solution/PETSc/PetscSolver.F90 index fdfd83cbb25..b34f13e478f 100644 --- a/src/Solution/PETSc/PetscSolver.F90 +++ b/src/Solution/PETSc/PetscSolver.F90 @@ -2,7 +2,7 @@ module PetscSolverModule #include use petscksp use KindModule, only: I4B, DP, LGP - use ConstantsModule, only: LINELENGTH + use ConstantsModule, only: LINELENGTH, LENSOLUTIONNAME use LinearSolverBaseModule use MatrixBaseModule use VectorBaseModule @@ -13,39 +13,37 @@ module PetscSolverModule use ConvergenceSummaryModule use ImsLinearSettingsModule use SimVariablesModule, only: iout, simulation_mode - use SimModule, only: store_error + use SimModule, only: store_error, store_warning implicit none private public :: create_petsc_solver + !< Linear solver using PETSc KSP type, public, extends(LinearSolverBaseType) :: PetscSolverType - KSP :: ksp_petsc - class(PetscMatrixType), pointer :: matrix => null() - Mat, pointer :: mat_petsc => null() - Vec, pointer :: vec_residual => null() + KSP :: ksp_petsc !< the KSP linear solver object + class(PetscMatrixType), pointer :: matrix => null() !< the system matrix in PETSc compatible format + Mat, pointer :: mat_petsc => null() !< the PETSc internal matrix format + type(ImsLinearSettingsType), pointer :: linear_settings => null() !< pointer to linear settings from IMS logical(LGP) :: use_ims_pc !< when true, use custom IMS-style preconditioning - real(DP) :: dvclose - integer(I4B) :: pc_levels - real(DP) :: drop_tolerance - KSPType :: ksp_type - PCType :: pc_type - PCType :: sub_pc_type - class(PetscContextType), pointer :: petsc_ctx => null() - type(PcShellCtxType), pointer :: pc_context => null() - type(ConvergenceSummaryType), pointer :: convergence_summary => null() + KSPType :: ksp_type !< the KSP solver type (CG, BCGS, ...) + PCType :: pc_type !< the (global) preconditioner type, should be parallel + PCType :: sub_pc_type !< the block preconditioner type (for the subdomain) + class(PetscCnvgCtxType), pointer :: petsc_ctx => null() !< context for the PETSc custom convergence check + type(PcShellCtxType), pointer :: pc_context => null() !< context for the custom (IMS) precondioner + type(ConvergenceSummaryType), pointer :: convergence_summary => null() !< data structure wrapping the convergence data contains procedure :: initialize => petsc_initialize procedure :: solve => petsc_solve - procedure :: get_result => petsc_get_result procedure :: print_summary => petsc_print_summary procedure :: destroy => petsc_destroy procedure :: create_matrix => petsc_create_matrix ! private + procedure, private :: petsc_check_settings procedure, private :: get_options_mf6 procedure, private :: create_ksp procedure, private :: create_convergence_check @@ -59,15 +57,24 @@ module PetscSolverModule !> @brief Create a PETSc solver object !< - function create_petsc_solver() result(solver) + function create_petsc_solver(sln_name) result(solver) class(LinearSolverBaseType), pointer :: solver !< Uninitialized instance of the PETSc solver + character(len=LENSOLUTIONNAME) :: sln_name !< the solution name ! local class(PetscSolverType), pointer :: petsc_solver + character(len=LINELENGTH) :: errmsg allocate (petsc_solver) allocate (petsc_solver%petsc_ctx) solver => petsc_solver + solver%name = sln_name + + if (simulation_mode /= 'PARALLEL') then + write (errmsg, '(a,a)') 'PETSc solver not supported for run mode: ', & + trim(simulation_mode) + call store_error(errmsg, terminate=.true.) + end if end function create_petsc_solver @@ -78,12 +85,8 @@ subroutine petsc_initialize(this, matrix, linear_settings, convergence_summary) class(MatrixBaseType), pointer :: matrix !< The solution matrix as KSP operator type(ImsLinearSettingsType), pointer :: linear_settings !< the settings for the linear solver from the .ims file type(ConvergenceSummaryType), pointer :: convergence_summary !< a convergence record for diagnostics - ! local - PetscErrorCode :: ierr - character(len=LINELENGTH) :: errmsg - this%use_ims_pc = .false. - allocate (this%pc_context) + this%linear_settings => linear_settings call this%print_petsc_version() @@ -94,32 +97,20 @@ subroutine petsc_initialize(this, matrix, linear_settings, convergence_summary) this%mat_petsc => pm%mat end select - allocate (this%vec_residual) - call MatCreateVecs(this%mat_petsc, this%vec_residual, PETSC_NULL_VEC, ierr) - CHKERRQ(ierr) + call this%petsc_check_settings(linear_settings) - ! configure from IMS settings - this%dvclose = linear_settings%dvclose - this%nitermax = linear_settings%iter1 + this%use_ims_pc = .true. ! default is true, override with .petscrc + allocate (this%pc_context) + call this%pc_context%create(this%matrix, linear_settings) - if (linear_settings%ilinmeth == 1) then + if (linear_settings%ilinmeth == CG_METHOD) then this%ksp_type = KSPCG - else if (linear_settings%ilinmeth == 2) then - this%ksp_type = KSPBCGS else - write (errmsg, '(a)') 'PETSc: unknown linear solver method.' - call store_error(errmsg) + this%ksp_type = KSPBCGS end if - if (simulation_mode == "PARALLEL") then - this%pc_type = PCBJACOBI - this%sub_pc_type = PCILU - else - this%pc_type = PCILU - this%sub_pc_type = PCNONE - end if - this%pc_levels = linear_settings%level - this%drop_tolerance = linear_settings%droptol + this%pc_type = PCBJACOBI + this%sub_pc_type = PCILU ! get MODFLOW options from PETSc database file call this%get_options_mf6() @@ -132,6 +123,39 @@ subroutine petsc_initialize(this, matrix, linear_settings, convergence_summary) end subroutine petsc_initialize + subroutine petsc_check_settings(this, linear_settings) + class(PetscSolverType) :: this + type(ImsLinearSettingsType), pointer :: linear_settings + ! local + character(len=LINELENGTH) :: warnmsg, errmsg + + ! errors + if (linear_settings%ilinmeth /= CG_METHOD .and. & + linear_settings%ilinmeth /= BCGS_METHOD) then + write (errmsg, '(a,a)') 'PETSc: unknown linear solver method in ', & + this%name + call store_error(errmsg, terminate=.true.) + end if + + ! warnings + if (linear_settings%iord > 0) then + linear_settings%iord = 0 + write (warnmsg, '(a)') 'PETSc: IMS reordering not supported' + call store_warning(warnmsg) + end if + if (linear_settings%iscl > 0) then + linear_settings%iscl = 0 + write (warnmsg, '(a)') 'PETSc: IMS matrix scaling not supported' + call store_warning(warnmsg) + end if + if (linear_settings%north > 0) then + linear_settings%north = 0 + write (warnmsg, '(a)') 'PETSc: IMS orthogonalization not supported' + call store_warning(warnmsg) + end if + + end subroutine petsc_check_settings + !> @brief Print PETSc version string from shared lib !< subroutine print_petsc_version(this) @@ -151,8 +175,8 @@ subroutine print_petsc_version(this) end if write (petsc_version, '(i0,a,i0,a,i0,a,a)') & major, ".", minor, ".", subminor, " ", trim(release_str) - write (iout, '(/,1x,2a,/)') & - "PETSc Linear Solver will be used: version ", petsc_version + write (iout, '(/,1x,4a,/)') "PETSc Linear Solver will be used for ", & + trim(this%name), ": version ", petsc_version end subroutine print_petsc_version @@ -164,14 +188,6 @@ subroutine get_options_mf6(this) PetscErrorCode :: ierr logical(LGP) :: found - call PetscOptionsGetReal(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, & - '-dvclose', this%dvclose, found, ierr) - CHKERRQ(ierr) - - call PetscOptionsGetInt(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, & - '-nitermax', this%nitermax, found, ierr) - CHKERRQ(ierr) - call PetscOptionsGetBool(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, & '-ims_pc', this%use_ims_pc, found, ierr) CHKERRQ(ierr) @@ -203,6 +219,9 @@ subroutine create_ksp(this) call this%set_petsc_pc() end if + call KSPSetErrorIfNotConverged(this%ksp_petsc, .false., ierr) + CHKERRQ(ierr) + ! finally override these options from the ! optional .petscrc file call KSPSetFromOptions(this%ksp_petsc, ierr) @@ -222,29 +241,20 @@ subroutine set_petsc_pc(this) call KSPGetPC(this%ksp_petsc, pc, ierr) CHKERRQ(ierr) - call PCSetType(pc, this%pc_type, ierr) CHKERRQ(ierr) - - call PCSetFromOptions(pc, ierr) - CHKERRQ(ierr) - call PCSetUp(pc, ierr) CHKERRQ(ierr) - - if (simulation_mode == "PARALLEL") then - call PCBJacobiGetSubKSP(pc, n_local, n_first, sub_ksp, ierr) - CHKERRQ(ierr) - call KSPGetPC(sub_ksp(1), sub_pc, ierr) - CHKERRQ(ierr) - call PCSetType(sub_pc, this%sub_pc_type, ierr) - CHKERRQ(ierr) - call PCFactorSetLevels(sub_pc, this%pc_levels, ierr) - CHKERRQ(ierr) - else - call PCFactorSetLevels(pc, this%pc_levels, ierr) - CHKERRQ(ierr) - end if + call PCBJacobiGetSubKSP(pc, n_local, n_first, sub_ksp, ierr) + CHKERRQ(ierr) + call KSPGetPC(sub_ksp(1), sub_pc, ierr) + CHKERRQ(ierr) + call PCSetType(sub_pc, this%sub_pc_type, ierr) + CHKERRQ(ierr) + call PCSetFromOptions(sub_pc, ierr) + CHKERRQ(ierr) + call PCFactorSetLevels(sub_pc, this%linear_settings%level, ierr) + CHKERRQ(ierr) end subroutine set_petsc_pc @@ -258,71 +268,40 @@ subroutine set_ims_pc(this) PetscInt :: n_local, n_first PetscErrorCode :: ierr - if (simulation_mode == "PARALLEL") then - this%sub_pc_type = PCSHELL - - call KSPGetPC(this%ksp_petsc, pc, ierr) - CHKERRQ(ierr) - call PCSetType(pc, this%pc_type, ierr) - CHKERRQ(ierr) - call PCSetUp(pc, ierr) - CHKERRQ(ierr) - call PCBJacobiGetSubKSP(pc, n_local, n_first, sub_ksp, ierr) - CHKERRQ(ierr) - call KSPGetPC(sub_ksp(1), sub_pc, ierr) - CHKERRQ(ierr) - call PCSetType(sub_pc, this%sub_pc_type, ierr) - CHKERRQ(ierr) - call PCShellSetApply(sub_pc, pcshell_apply, ierr) - CHKERRQ(ierr) - call PCShellSetSetUp(sub_pc, pcshell_setup, ierr) - CHKERRQ(ierr) - call PCShellSetDestroy(sub_pc, pcshell_destroy, ierr) - CHKERRQ(ierr) - call PCShellSetContext(sub_pc, this%pc_context, ierr) - CHKERRQ(ierr) - else - this%pc_type = PCSHELL - - call KSPGetPC(this%ksp_petsc, pc, ierr) - CHKERRQ(ierr) - call PCSetType(pc, PCSHELL, ierr) - CHKERRQ(ierr) - call PCShellSetApply(pc, pcshell_apply, ierr) - CHKERRQ(ierr) - call PCShellSetSetUp(pc, pcshell_setup, ierr) - CHKERRQ(ierr) - call PCShellSetDestroy(pc, pcshell_destroy, ierr) - CHKERRQ(ierr) - call PCShellSetContext(pc, this%pc_context, ierr) - CHKERRQ(ierr) - end if + this%sub_pc_type = PCSHELL + + call KSPGetPC(this%ksp_petsc, pc, ierr) + CHKERRQ(ierr) + call PCSetType(pc, this%pc_type, ierr) + CHKERRQ(ierr) + call PCSetUp(pc, ierr) + CHKERRQ(ierr) + call PCBJacobiGetSubKSP(pc, n_local, n_first, sub_ksp, ierr) + CHKERRQ(ierr) + call KSPGetPC(sub_ksp(1), sub_pc, ierr) + CHKERRQ(ierr) + call PCSetType(sub_pc, this%sub_pc_type, ierr) + CHKERRQ(ierr) + call PCShellSetApply(sub_pc, pcshell_apply, ierr) + CHKERRQ(ierr) + call PCShellSetSetUp(sub_pc, pcshell_setup, ierr) + CHKERRQ(ierr) + call PCShellSetContext(sub_pc, this%pc_context, ierr) + CHKERRQ(ierr) end subroutine set_ims_pc !> @brief Create and assign a custom convergence !< check for this solver subroutine create_convergence_check(this, convergence_summary) + use IMSLinearBaseModule, only: ims_base_epfact class(PetscSolverType) :: this !< This solver instance type(ConvergenceSummaryType), pointer :: convergence_summary ! local PetscErrorCode :: ierr - this%petsc_ctx%dvclose = this%dvclose - this%petsc_ctx%max_its = this%nitermax - this%petsc_ctx%cnvg_summary => convergence_summary - call MatCreateVecs( & - this%mat_petsc, this%petsc_ctx%x_old, PETSC_NULL_VEC, ierr) - CHKERRQ(ierr) - call MatCreateVecs( & - this%mat_petsc, this%petsc_ctx%delta_x, PETSC_NULL_VEC, ierr) - CHKERRQ(ierr) - call MatCreateVecs( & - this%mat_petsc, this%petsc_ctx%res_old, PETSC_NULL_VEC, ierr) - CHKERRQ(ierr) - call MatCreateVecs( & - this%mat_petsc, this%petsc_ctx%delta_res, PETSC_NULL_VEC, ierr) - CHKERRQ(ierr) + call this%petsc_ctx%create(this%mat_petsc, this%linear_settings, & + convergence_summary) call KSPSetConvergenceTest(this%ksp_petsc, petsc_check_convergence, & this%petsc_ctx, PETSC_NULL_FUNCTION, ierr) @@ -339,8 +318,9 @@ subroutine petsc_solve(this, kiter, rhs, x, cnvg_summary) ! local PetscErrorCode :: ierr class(PetscVectorType), pointer :: rhs_petsc, x_petsc - KSPConvergedReason :: icnvg + KSPConvergedReason :: cnvg_reason integer :: it_number + character(len=LINELENGTH) :: errmsg rhs_petsc => null() select type (rhs) @@ -358,6 +338,10 @@ subroutine petsc_solve(this, kiter, rhs, x, cnvg_summary) this%is_converged = 0 if (kiter == 1) then this%petsc_ctx%cnvg_summary%iter_cnt = 0 + this%petsc_ctx%cnvg_summary%convlocdv = 0 + this%petsc_ctx%cnvg_summary%convdvmax = 0.0 + this%petsc_ctx%cnvg_summary%convlocr = 0 + this%petsc_ctx%cnvg_summary%convrmax = 0.0 end if ! update matrix coefficients @@ -366,42 +350,73 @@ subroutine petsc_solve(this, kiter, rhs, x, cnvg_summary) CHKERRQ(ierr) call KSPGetIterationNumber(this%ksp_petsc, it_number, ierr) + CHKERRQ(ierr) this%iteration_number = it_number - call KSPGetConvergedReason(this%ksp_petsc, icnvg, ierr) - if (icnvg > 0) this%is_converged = 1 - end subroutine petsc_solve + call KSPGetConvergedReason(this%ksp_petsc, cnvg_reason, ierr) + CHKERRQ(ierr) + if (cnvg_reason > 0) then + if (this%petsc_ctx%icnvg_ims == -1) then + ! move to next Picard iteration (e.g. with 'STRICT' option) + this%is_converged = 0 + else + ! linear convergence reached + this%is_converged = 1 + end if + end if - subroutine petsc_get_result(this) - class(PetscSolverType) :: this - end subroutine petsc_get_result + if (cnvg_reason < 0 .and. cnvg_reason /= KSP_DIVERGED_ITS) then + write (errmsg, '(1x,3a,i0)') "PETSc convergence failure in ", & + trim(this%name), ": ", cnvg_reason + call store_error(errmsg, terminate=.true.) + end if + + end subroutine petsc_solve subroutine petsc_print_summary(this) class(PetscSolverType) :: this ! local - character(len=128) :: ksp_type, pc_type, dvclose_str + character(len=128) :: ksp_str, pc_str, subpc_str, & + dvclose_str, rclose_str, relax_str, dtol_str integer :: ierr PC :: pc - call KSPGetType(this%ksp_petsc, ksp_type, ierr) + call KSPGetType(this%ksp_petsc, ksp_str, ierr) CHKERRQ(ierr) call KSPGetPC(this%ksp_petsc, pc, ierr) CHKERRQ(ierr) - call PCGetType(pc, pc_type, ierr) + call PCGetType(pc, pc_str, ierr) CHKERRQ(ierr) - write (dvclose_str, '(e15.5)') this%dvclose + if (this%use_ims_pc) then + subpc_str = this%pc_context%ims_pc_type + else + subpc_str = this%sub_pc_type + end if + + write (dvclose_str, '(e15.5)') this%linear_settings%dvclose + write (rclose_str, '(e15.5)') this%linear_settings%rclose + write (relax_str, '(e15.5)') this%linear_settings%relax + write (dtol_str, '(e15.5)') this%linear_settings%droptol write (iout, '(/,7x,a)') "PETSc linear solver settings: " write (iout, '(1x,a)') repeat('-', 66) - write (iout, '(1x,a,a)') "Linear acceleration method: ", trim(this%ksp_type) - write (iout, '(1x,a,a)') "Preconditioner type: ", trim(this%pc_type) - if (simulation_mode == "PARALLEL") then - write (iout, '(1x,a,a)') "Sub-preconditioner type: ", & - trim(this%sub_pc_type) - end if - write (iout, '(1x,a,i0)') "Maximum nr. of iterations: ", this%nitermax - write (iout, '(1x,a,a,/)') & + write (iout, '(1x,a,a)') "Linear acceleration method: ", trim(ksp_str) + write (iout, '(1x,a,a)') "Preconditioner type: ", trim(pc_str) + write (iout, '(1x,a,a)') "Sub-preconditioner type: ", trim(subpc_str) + write (iout, '(1x,a,i0)') "Maximum nr. of iterations: ", & + this%linear_settings%iter1 + write (iout, '(1x,a,a)') & "Dep. var. closure criterion: ", trim(adjustl(dvclose_str)) + write (iout, '(1x,a,a)') & + "Residual closure criterion: ", trim(adjustl(rclose_str)) + write (iout, '(1x,a,i0)') & + "Residual convergence option: ", this%linear_settings%icnvgopt + write (iout, '(1x,a,a)') & + "Relaxation factor MILU(T): ", trim(adjustl(relax_str)) + write (iout, '(1x,a,i0)') & + "Fill level in factorization: ", this%linear_settings%level + write (iout, '(1x,a,a,/)') & + "Drop tolerance level fill: ", trim(adjustl(dtol_str)) end subroutine petsc_print_summary @@ -413,15 +428,11 @@ subroutine petsc_destroy(this) call KSPDestroy(this%ksp_petsc, ierr) CHKERRQ(ierr) - ! delete work vector - call VecDestroy(this%vec_residual, ierr) - CHKERRQ(ierr) - deallocate (this%vec_residual) - ! delete context call this%petsc_ctx%destroy() deallocate (this%petsc_ctx) + call this%pc_context%destroy() deallocate (this%pc_context) end subroutine petsc_destroy diff --git a/src/Utilities/Matrix/PetscMatrix.F90 b/src/Utilities/Matrix/PetscMatrix.F90 index 92d6955fbb5..c6e6654637d 100644 --- a/src/Utilities/Matrix/PetscMatrix.F90 +++ b/src/Utilities/Matrix/PetscMatrix.F90 @@ -14,10 +14,14 @@ module PetscMatrixModule type, public, extends(MatrixBaseType) :: PetscMatrixType Mat :: mat ! offset in the global matrix - integer(I4B) :: nrow - integer(I4B) :: ncol - integer(I4B) :: nnz - integer(I4B) :: offset + integer(I4B) :: nrow !< number of rows in this portion of the global matrix + integer(I4B) :: ncol !< number of columns in the matrix + integer(I4B) :: nnz !< number of nonzeros in the matrix + integer(I4B) :: nnz_local !< number of nonzeros in the local matrix (the diagonal block tied to this process) + integer(I4B) :: offset !< global offset for the first row in the matrix + integer(I4B), dimension(:), pointer, contiguous, private :: ia_local !< IA(CSR) for local block, contains 1-based index values + integer(I4B), dimension(:), pointer, contiguous, private :: ja_local !< JA(CSR) for local block, contains 1-based index values + real(DP), dimension(:), pointer, contiguous, private :: amat_local !< A(CSR) for local block integer(I4B), dimension(:), pointer, contiguous :: ia_petsc !< IA(CSR) for petsc, contains 0-based index values integer(I4B), dimension(:), pointer, contiguous :: ja_petsc !< JA(CSR) for petsc, contains 0-based index values real(DP), dimension(:), pointer, contiguous :: amat_petsc !< A(CSR) for petsc @@ -48,6 +52,7 @@ module PetscMatrixModule ! public procedure :: update => pm_update + procedure :: get_aij_local => pm_get_aij_local ! private procedure, private :: pm_get_position @@ -64,17 +69,26 @@ subroutine pm_init(this, sparse, mem_path) ! local PetscErrorCode :: ierr integer(I4B) :: i, ierror + Mat :: local_mat + integer(I4B), dimension(:), pointer :: ia_tmp, ja_tmp + integer(I4B) :: nrows_local + logical(LGP) :: done this%memory_path = mem_path this%nrow = sparse%nrow this%ncol = sparse%ncol this%nnz = sparse%nnz + this%nnz_local = sparse%nnz - sparse%nnz_od this%offset = sparse%offset ! allocate the diagonal block of the matrix - allocate (this%ia_petsc(this%nrow + 1)) - allocate (this%ja_petsc(this%nnz)) - allocate (this%amat_petsc(this%nnz)) + call mem_allocate(this%ia_local, this%nrow + 1, 'IA_LOCAL', this%memory_path) + call mem_allocate(this%ja_local, this%nnz_local, 'JA_LOCAL', this%memory_path) + call mem_allocate(this%amat_local, this%nnz_local, 'AMAT_LOCAL', & + this%memory_path) + call mem_allocate(this%ia_petsc, this%nrow + 1, 'IA_PETSC', this%memory_path) + call mem_allocate(this%ja_petsc, this%nnz, 'JA_PETSC', this%memory_path) + call mem_allocate(this%amat_petsc, this%nnz, 'AMAT_PETSC', this%memory_path) call sparse%sort(with_csr=.true.) !< PETSc has full row sorting, MF6 had diagonal first and then sorted call sparse%filliaja(this%ia_petsc, this%ja_petsc, ierror) @@ -107,6 +121,27 @@ subroutine pm_init(this, sparse, mem_path) end if CHKERRQ(ierr) + ! set up local block sparsity structure + nrows_local = 0 + call MatGetDiagonalBlock(this%mat, local_mat, ierr) + CHKERRQ(ierr) + + call MatGetRowIJF90(local_mat, 1, PETSC_FALSE, PETSC_FALSE, & + nrows_local, ia_tmp, ja_tmp, & + done, ierr) + CHKERRQ(ierr) + + do i = 1, size(ia_tmp) + this%ia_local(i) = ia_tmp(i) + end do + do i = 1, size(ja_tmp) - 1 + this%ja_local(i) = ja_tmp(i) + end do + + call MatRestoreRowIJF90(local_mat, 1, PETSC_FALSE, PETSC_FALSE, & + nrows_local, ia_tmp, ja_tmp, done, ierr) + CHKERRQ(ierr) + end subroutine pm_init !> @brief Copies the values from the CSR array into @@ -134,9 +169,12 @@ subroutine pm_destroy(this) call MatDestroy(this%mat, ierr) CHKERRQ(ierr) - deallocate (this%ia_petsc) - deallocate (this%ja_petsc) - deallocate (this%amat_petsc) + call mem_deallocate(this%ia_local) + call mem_deallocate(this%ja_local) + call mem_deallocate(this%amat_local) + call mem_deallocate(this%ia_petsc) + call mem_deallocate(this%ja_petsc) + call mem_deallocate(this%amat_petsc) end subroutine pm_destroy @@ -344,11 +382,41 @@ subroutine pm_get_aij(this, ia, ja, amat) integer(I4B), dimension(:), pointer, contiguous :: ja real(DP), dimension(:), pointer, contiguous :: amat - write (*, *) 'NOT IMPLEMENTED' - call ustop() + call ustop("pm_get_aij not implemented") end subroutine pm_get_aij + !> @brief Get the ia/ja and amat values for the local + !< diagonal block of this matrix. It's a copy. + subroutine pm_get_aij_local(this, ia, ja, amat) + class(PetscMatrixType) :: this + integer(I4B), dimension(:), pointer, contiguous :: ia + integer(I4B), dimension(:), pointer, contiguous :: ja + real(DP), dimension(:), pointer, contiguous :: amat + ! local + PetscErrorCode :: ierr + integer(I4B) :: irow, icol, ipos + real(DP) :: val + Mat :: local_mat + + call MatGetDiagonalBlock(this%mat, local_mat, ierr) + CHKERRQ(ierr) + + do irow = 1, this%nrow + do ipos = this%ia_local(irow), this%ia_local(irow + 1) - 1 + icol = this%ja_local(ipos) + call MatGetValues(local_mat, 1, irow - 1, 1, icol - 1, val, ierr) + CHKERRQ(ierr) + this%amat_local(ipos) = val + end do + end do + + ia => this%ia_local + ja => this%ja_local + amat => this%amat_local + + end subroutine pm_get_aij_local + function pm_get_row_offset(this) result(offset) class(PetscMatrixType) :: this integer(I4B) :: offset diff --git a/src/Utilities/Matrix/SparseMatrix.f90 b/src/Utilities/Matrix/SparseMatrix.f90 index 3ba96a64f5c..54cae8b6adc 100644 --- a/src/Utilities/Matrix/SparseMatrix.f90 +++ b/src/Utilities/Matrix/SparseMatrix.f90 @@ -49,6 +49,8 @@ module SparseMatrixModule contains + !> @brief Initialize sparse matrix from passed + !< sparsity structure subroutine spm_init(this, sparse, mem_path) class(SparseMatrixType) :: this type(sparsematrix) :: sparse diff --git a/src/Utilities/Sim.f90 b/src/Utilities/Sim.f90 index 14d5a0103fa..42b115c11f1 100644 --- a/src/Utilities/Sim.f90 +++ b/src/Utilities/Sim.f90 @@ -444,7 +444,7 @@ end subroutine converge_check subroutine initial_message() ! -- modules use VersionModule, only: write_listfile_header - use SimVariablesModule, only: simulation_mode + use SimVariablesModule, only: simulation_mode, nr_procs ! ! -- initialize message lists call sim_errors%init() @@ -456,9 +456,11 @@ subroutine initial_message() call write_listfile_header(istdout, write_kind_info=.false., & write_sys_command=.false.) ! - if (simulation_mode == 'PARALLEL') then - call write_message('(MODFLOW runs in '//trim(simulation_mode)//' mode)', & - skipafter=1) + call write_message(' MODFLOW runs in '//trim(simulation_mode)//' mode', & + skipafter=1) + ! + if (simulation_mode == 'PARALLEL' .and. nr_procs == 1) then + call store_warning('Running parallel MODFLOW on only 1 process') end if ! end subroutine initial_message From f3a4c0c1577617e66d3db049bf7660c8aaf159de Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 18 Apr 2024 14:29:29 -0400 Subject: [PATCH 113/199] refactor(mf6ivar): discover dfns dynamically (#1745) * look up dfns in doc/mf6io/mf6ivar/dfn/ instead of hardcoded list * preserve top-level component ordering: sim, exg, sln, models, utl * order packages alphabetically within each component section * add argparse CLI allowing model selection, default to all --- doc/mf6io/mf6ivar/md/mf6ivar.md | 2720 ++++++++++----------- doc/mf6io/mf6ivar/mf6ivar.py | 492 ++-- doc/mf6io/mf6ivar/tex/appendixA.tex | 444 ++-- doc/mf6io/mf6ivar/tex/gwf-uzf-desc.tex | 2 - doc/mf6io/mf6ivar/tex/gwf-uzf-options.dat | 1 - 5 files changed, 1767 insertions(+), 1892 deletions(-) diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index afc0fb00eec..765d0d8e22d 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -29,6 +29,31 @@ | SIM | TDIS | PERIODDATA | PERLEN | DOUBLE PRECISION | is the length of a stress period. | | SIM | TDIS | PERIODDATA | NSTP | INTEGER | is the number of time steps in a stress period. | | SIM | TDIS | PERIODDATA | TSMULT | DOUBLE PRECISION | is the multiplier for the length of successive time steps. The length of a time step is calculated by multiplying the length of the previous time step by TSMULT. The length of the first time step, $\Delta t_1$, is related to PERLEN, NSTP, and TSMULT by the relation $\Delta t_1= perlen \frac{tsmult - 1}{tsmult^{nstp}-1}$. | +| EXG | GWEGWE | OPTIONS | GWFMODELNAME1 | STRING | keyword to specify name of first corresponding GWF Model. In the simulation name file, the GWE6-GWE6 entry contains names for GWE Models (exgmnamea and exgmnameb). The GWE Model with the name exgmnamea must correspond to the GWF Model with the name gwfmodelname1. | +| EXG | GWEGWE | OPTIONS | GWFMODELNAME2 | STRING | keyword to specify name of second corresponding GWF Model. In the simulation name file, the GWE6-GWE6 entry contains names for GWE Models (exgmnamea and exgmnameb). The GWE Model with the name exgmnameb must correspond to the GWF Model with the name gwfmodelname2. | +| EXG | GWEGWE | OPTIONS | AUXILIARY | STRING (NAUX) | an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWF-GWF Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' is provided in the description of the DISU Package. If an auxiliary variable with the name ``CDIST'' is found, then this information will be used as the straight-line connection distance, including the vertical component, between the two cell centers. Both ANGLDEGX and CDIST are required if specific discharge is calculated for either of the groundwater models. | +| EXG | GWEGWE | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of GWE Exchange cells. | +| EXG | GWEGWE | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of exchange entries will be echoed to the listing file immediately after it is read. | +| EXG | GWEGWE | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of exchange flow rates will be printed to the listing file for every stress period in which ``SAVE BUDGET'' is specified in Output Control. | +| EXG | GWEGWE | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that cell-by-cell flow terms will be written to the budget file for each model provided that the Output Control for the models are set up with the ``BUDGET SAVE FILE'' option. | +| EXG | GWEGWE | OPTIONS | ADV_SCHEME | STRING | scheme used to solve the advection term. Can be upstream, central, or TVD. If not specified, upstream weighting is the default weighting scheme. | +| EXG | GWEGWE | OPTIONS | CND_XT3D_OFF | KEYWORD | deactivate the xt3d method for the dispersive flux and use the faster and less accurate approximation for this exchange. | +| EXG | GWEGWE | OPTIONS | CND_XT3D_RHS | KEYWORD | add xt3d dispersion terms to right-hand side, when possible, for this exchange. | +| EXG | GWEGWE | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| EXG | GWEGWE | OPTIONS | MVE6 | KEYWORD | keyword to specify that record corresponds to an energy transport mover file. | +| EXG | GWEGWE | OPTIONS | MVE6_FILENAME | STRING | is the file name of the transport mover input file to apply to this exchange. Information for the transport mover are provided in the file provided with these keywords. | +| EXG | GWEGWE | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | +| EXG | GWEGWE | OPTIONS | OBS6_FILENAME | STRING | is the file name of the observations input file for this exchange. See the ``Observation utility'' section for instructions for preparing observation input files. Table \ref{table:gwe-obstypetable} lists observation type(s) supported by the GWE-GWE package. | +| EXG | GWEGWE | OPTIONS | DEV_INTERFACEMODEL_ON | KEYWORD | activates the interface model mechanism for calculating the coefficients at (and possibly near) the exchange. This keyword should only be used for development purposes. | +| EXG | GWEGWE | DIMENSIONS | NEXG | INTEGER | keyword and integer value specifying the number of GWE-GWE exchanges. | +| EXG | GWEGWE | EXCHANGEDATA | CELLIDM1 | INTEGER | is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. | +| EXG | GWEGWE | EXCHANGEDATA | CELLIDM2 | INTEGER | is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. | +| EXG | GWEGWE | EXCHANGEDATA | IHC | INTEGER | is an integer flag indicating the direction between node n and all of its m connections. If IHC = 0 then the connection is vertical. If IHC = 1 then the connection is horizontal. If IHC = 2 then the connection is horizontal for a vertically staggered grid. | +| EXG | GWEGWE | EXCHANGEDATA | CL1 | DOUBLE PRECISION | is the distance between the center of cell 1 and the its shared face with cell 2. | +| EXG | GWEGWE | EXCHANGEDATA | CL2 | DOUBLE PRECISION | is the distance between the center of cell 2 and the its shared face with cell 1. | +| EXG | GWEGWE | EXCHANGEDATA | HWVA | DOUBLE PRECISION | is the horizontal width of the flow connection between cell 1 and cell 2 if IHC $>$ 0, or it is the area perpendicular to flow of the vertical connection between cell 1 and cell 2 if IHC = 0. | +| EXG | GWEGWE | EXCHANGEDATA | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each GWEGWE Exchange. The values of auxiliary variables must be present for each exchange. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. | +| EXG | GWEGWE | EXCHANGEDATA | BOUNDNAME | STRING | name of the GWE Exchange cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | | EXG | GWFGWF | OPTIONS | AUXILIARY | STRING (NAUX) | an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWF-GWF Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' and when it is required is provided in the description of the DISU Package. If an auxiliary variable with the name ``CDIST'' is found, then this information will be used in the calculation of specific discharge within model cells connected by the exchange. For a horizontal connection, CDIST should be specified as the horizontal distance between the cell centers, and should not include the vertical component. For vertical connections, CDIST should be specified as the difference in elevation between the two cell centers. Both ANGLDEGX and CDIST are required if specific discharge is calculated for either of the groundwater models. | | EXG | GWFGWF | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of GWF Exchange cells. | | EXG | GWFGWF | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of exchange entries will be echoed to the listing file immediately after it is read. | @@ -81,31 +106,6 @@ | EXG | GWTGWT | EXCHANGEDATA | HWVA | DOUBLE PRECISION | is the horizontal width of the flow connection between cell 1 and cell 2 if IHC $>$ 0, or it is the area perpendicular to flow of the vertical connection between cell 1 and cell 2 if IHC = 0. | | EXG | GWTGWT | EXCHANGEDATA | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each GWTGWT Exchange. The values of auxiliary variables must be present for each exchange. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. | | EXG | GWTGWT | EXCHANGEDATA | BOUNDNAME | STRING | name of the GWT Exchange cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | -| EXG | GWEGWE | OPTIONS | GWFMODELNAME1 | STRING | keyword to specify name of first corresponding GWF Model. In the simulation name file, the GWE6-GWE6 entry contains names for GWE Models (exgmnamea and exgmnameb). The GWE Model with the name exgmnamea must correspond to the GWF Model with the name gwfmodelname1. | -| EXG | GWEGWE | OPTIONS | GWFMODELNAME2 | STRING | keyword to specify name of second corresponding GWF Model. In the simulation name file, the GWE6-GWE6 entry contains names for GWE Models (exgmnamea and exgmnameb). The GWE Model with the name exgmnameb must correspond to the GWF Model with the name gwfmodelname2. | -| EXG | GWEGWE | OPTIONS | AUXILIARY | STRING (NAUX) | an array of auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided. Most auxiliary variables will not be used by the GWF-GWF Exchange, but they will be available for use by other parts of the program. If an auxiliary variable with the name ``ANGLDEGX'' is found, then this information will be used as the angle (provided in degrees) between the connection face normal and the x axis, where a value of zero indicates that a normal vector points directly along the positive x axis. The connection face normal is a normal vector on the cell face shared between the cell in model 1 and the cell in model 2 pointing away from the model 1 cell. Additional information on ``ANGLDEGX'' is provided in the description of the DISU Package. If an auxiliary variable with the name ``CDIST'' is found, then this information will be used as the straight-line connection distance, including the vertical component, between the two cell centers. Both ANGLDEGX and CDIST are required if specific discharge is calculated for either of the groundwater models. | -| EXG | GWEGWE | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of GWE Exchange cells. | -| EXG | GWEGWE | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of exchange entries will be echoed to the listing file immediately after it is read. | -| EXG | GWEGWE | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of exchange flow rates will be printed to the listing file for every stress period in which ``SAVE BUDGET'' is specified in Output Control. | -| EXG | GWEGWE | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that cell-by-cell flow terms will be written to the budget file for each model provided that the Output Control for the models are set up with the ``BUDGET SAVE FILE'' option. | -| EXG | GWEGWE | OPTIONS | ADV_SCHEME | STRING | scheme used to solve the advection term. Can be upstream, central, or TVD. If not specified, upstream weighting is the default weighting scheme. | -| EXG | GWEGWE | OPTIONS | CND_XT3D_OFF | KEYWORD | deactivate the xt3d method for the dispersive flux and use the faster and less accurate approximation for this exchange. | -| EXG | GWEGWE | OPTIONS | CND_XT3D_RHS | KEYWORD | add xt3d dispersion terms to right-hand side, when possible, for this exchange. | -| EXG | GWEGWE | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| EXG | GWEGWE | OPTIONS | MVE6 | KEYWORD | keyword to specify that record corresponds to an energy transport mover file. | -| EXG | GWEGWE | OPTIONS | MVE6_FILENAME | STRING | is the file name of the transport mover input file to apply to this exchange. Information for the transport mover are provided in the file provided with these keywords. | -| EXG | GWEGWE | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | -| EXG | GWEGWE | OPTIONS | OBS6_FILENAME | STRING | is the file name of the observations input file for this exchange. See the ``Observation utility'' section for instructions for preparing observation input files. Table \ref{table:gwe-obstypetable} lists observation type(s) supported by the GWE-GWE package. | -| EXG | GWEGWE | OPTIONS | DEV_INTERFACEMODEL_ON | KEYWORD | activates the interface model mechanism for calculating the coefficients at (and possibly near) the exchange. This keyword should only be used for development purposes. | -| EXG | GWEGWE | DIMENSIONS | NEXG | INTEGER | keyword and integer value specifying the number of GWE-GWE exchanges. | -| EXG | GWEGWE | EXCHANGEDATA | CELLIDM1 | INTEGER | is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. | -| EXG | GWEGWE | EXCHANGEDATA | CELLIDM2 | INTEGER | is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. | -| EXG | GWEGWE | EXCHANGEDATA | IHC | INTEGER | is an integer flag indicating the direction between node n and all of its m connections. If IHC = 0 then the connection is vertical. If IHC = 1 then the connection is horizontal. If IHC = 2 then the connection is horizontal for a vertically staggered grid. | -| EXG | GWEGWE | EXCHANGEDATA | CL1 | DOUBLE PRECISION | is the distance between the center of cell 1 and the its shared face with cell 2. | -| EXG | GWEGWE | EXCHANGEDATA | CL2 | DOUBLE PRECISION | is the distance between the center of cell 2 and the its shared face with cell 1. | -| EXG | GWEGWE | EXCHANGEDATA | HWVA | DOUBLE PRECISION | is the horizontal width of the flow connection between cell 1 and cell 2 if IHC $>$ 0, or it is the area perpendicular to flow of the vertical connection between cell 1 and cell 2 if IHC = 0. | -| EXG | GWEGWE | EXCHANGEDATA | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each GWEGWE Exchange. The values of auxiliary variables must be present for each exchange. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. | -| EXG | GWEGWE | EXCHANGEDATA | BOUNDNAME | STRING | name of the GWE Exchange cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | | EXG | SWFGWF | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of exchange entries will be echoed to the listing file immediately after it is read. | | EXG | SWFGWF | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of exchange flow rates will be printed to the listing file for every stress period in which ``SAVE BUDGET'' is specified in Output Control. | | EXG | SWFGWF | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | @@ -165,1052 +165,6 @@ | SLN | PTS | OPTIONS | NO_PTC_OPTION | STRING | is an optional keyword that is used to define options for disabling pseudo-transient continuation (PTC). FIRST is an optional keyword to disable PTC for the first stress period, if steady-state and one or more model is using the Newton-Raphson formulation. ALL is an optional keyword to disable PTC for all steady-state stress periods for models using the Newton-Raphson formulation. If NO\_PTC\_OPTION is not specified, the NO\_PTC ALL option is used. | | SLN | PTS | OPTIONS | ATS_OUTER_MAXIMUM_FRACTION | DOUBLE PRECISION | real value defining the fraction of the maximum allowable outer iterations used with the Adaptive Time Step (ATS) capability if it is active. If this value is set to zero by the user, then this solution will have no effect on ATS behavior. This value must be greater than or equal to zero and less than or equal to 0.5 or the program will terminate with an error. If it is not specified by the user, then it is assigned a default value of one third. When the number of outer iterations for this solution is less than the product of this value and the maximum allowable outer iterations, then ATS will increase the time step length by a factor of DTADJ in the ATS input file. When the number of outer iterations for this solution is greater than the maximum allowable outer iterations minus the product of this value and the maximum allowable outer iterations, then the ATS (if active) will decrease the time step length by a factor of 1 / DTADJ. | | SLN | PTS | NONLINEAR | OUTER_MAXIMUM | INTEGER | integer value defining the maximum number of outer (nonlinear) iterations -- that is, calls to the solution routine. For a linear problem OUTER\_MAXIMUM should be 1. | -| GWF | NAM | OPTIONS | LIST | STRING | is name of the listing file to create for this GWF model. If not specified, then the name of the list file will be the basename of the GWF model name file and the '.lst' extension. For example, if the GWF name file is called ``my.model.nam'' then the list file will be called ``my.model.lst''. | -| GWF | NAM | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of all model stress package information will be written to the listing file immediately after it is read. | -| GWF | NAM | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of all model package flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | -| GWF | NAM | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that all model package flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWF | NAM | OPTIONS | NEWTON | KEYWORD | keyword that activates the Newton-Raphson formulation for groundwater flow between connected, convertible groundwater cells and stress packages that support calculation of Newton-Raphson terms for groundwater exchanges. Cells will not dry when this option is used. By default, the Newton-Raphson formulation is not applied. | -| GWF | NAM | OPTIONS | UNDER_RELAXATION | KEYWORD | keyword that indicates whether the groundwater head in a cell will be under-relaxed when water levels fall below the bottom of the model below any given cell. By default, Newton-Raphson UNDER\_RELAXATION is not applied. | -| GWF | NAM | PACKAGES | FTYPE | STRING | is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. | -| GWF | NAM | PACKAGES | FNAME | STRING | is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. | -| GWF | NAM | PACKAGES | PNAME | STRING | is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single GWF Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. | -| GWF | DIS | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | -| GWF | DIS | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | -| GWF | DIS | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| GWF | DIS | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| GWF | DIS | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| GWF | DIS | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | -| GWF | DIS | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | -| GWF | DIS | DIMENSIONS | NROW | INTEGER | is the number of rows in the model grid. | -| GWF | DIS | DIMENSIONS | NCOL | INTEGER | is the number of columns in the model grid. | -| GWF | DIS | GRIDDATA | DELR | DOUBLE PRECISION (NCOL) | is the column spacing in the row direction. | -| GWF | DIS | GRIDDATA | DELC | DOUBLE PRECISION (NROW) | is the row spacing in the column direction. | -| GWF | DIS | GRIDDATA | TOP | DOUBLE PRECISION (NCOL, NROW) | is the top elevation for each cell in the top model layer. | -| GWF | DIS | GRIDDATA | BOTM | DOUBLE PRECISION (NCOL, NROW, NLAY) | is the bottom elevation for each cell. | -| GWF | DIS | GRIDDATA | IDOMAIN | INTEGER (NCOL, NROW, NLAY) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1 or greater, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. | -| GWF | DISV | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | -| GWF | DISV | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | -| GWF | DISV | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| GWF | DISV | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| GWF | DISV | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| GWF | DISV | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | -| GWF | DISV | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | -| GWF | DISV | DIMENSIONS | NCPL | INTEGER | is the number of cells per layer. This is a constant value for the grid and it applies to all layers. | -| GWF | DISV | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. | -| GWF | DISV | GRIDDATA | TOP | DOUBLE PRECISION (NCPL) | is the top elevation for each cell in the top model layer. | -| GWF | DISV | GRIDDATA | BOTM | DOUBLE PRECISION (NCPL, NLAY) | is the bottom elevation for each cell. | -| GWF | DISV | GRIDDATA | IDOMAIN | INTEGER (NCPL, NLAY) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1 or greater, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. | -| GWF | DISV | VERTICES | IV | INTEGER | is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. | -| GWF | DISV | VERTICES | XV | DOUBLE PRECISION | is the x-coordinate for the vertex. | -| GWF | DISV | VERTICES | YV | DOUBLE PRECISION | is the y-coordinate for the vertex. | -| GWF | DISV | CELL2D | ICELL2D | INTEGER | is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. | -| GWF | DISV | CELL2D | XC | DOUBLE PRECISION | is the x-coordinate for the cell center. | -| GWF | DISV | CELL2D | YC | DOUBLE PRECISION | is the y-coordinate for the cell center. | -| GWF | DISV | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | -| GWF | DISV | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices. | -| GWF | DISU | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | -| GWF | DISU | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | -| GWF | DISU | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| GWF | DISU | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| GWF | DISU | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| GWF | DISU | OPTIONS | VERTICAL_OFFSET_TOLERANCE | DOUBLE PRECISION | checks are performed to ensure that the top of a cell is not higher than the bottom of an overlying cell. This option can be used to specify the tolerance that is used for checking. If top of a cell is above the bottom of an overlying cell by a value less than this tolerance, then the program will not terminate with an error. The default value is zero. This option should generally not be used. | -| GWF | DISU | DIMENSIONS | NODES | INTEGER | is the number of cells in the model grid. | -| GWF | DISU | DIMENSIONS | NJA | INTEGER | is the sum of the number of connections and NODES. When calculating the total number of connections, the connection between cell n and cell m is considered to be different from the connection between cell m and cell n. Thus, NJA is equal to the total number of connections, including n to m and m to n, and the total number of cells. | -| GWF | DISU | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to define the plan-view shape of each cell in the model grid. If NVERT is not specified or is specified as zero, then the VERTICES and CELL2D blocks below are not read. NVERT and the accompanying VERTICES and CELL2D blocks should be specified for most simulations. If the XT3D or SAVE\_SPECIFIC\_DISCHARGE options are specified in the NPF Package, then this information is required. | -| GWF | DISU | GRIDDATA | TOP | DOUBLE PRECISION (NODES) | is the top elevation for each cell in the model grid. | -| GWF | DISU | GRIDDATA | BOT | DOUBLE PRECISION (NODES) | is the bottom elevation for each cell. | -| GWF | DISU | GRIDDATA | AREA | DOUBLE PRECISION (NODES) | is the cell surface area (in plan view). | -| GWF | DISU | GRIDDATA | IDOMAIN | INTEGER (NODES) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1 or greater, the cell exists in the simulation. IDOMAIN values of -1 cannot be specified for the DISU Package. | -| GWF | DISU | CONNECTIONDATA | IAC | INTEGER (NODES) | is the number of connections (plus 1) for each cell. The sum of all the entries in IAC must be equal to NJA. | -| GWF | DISU | CONNECTIONDATA | JA | INTEGER (NJA) | is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWF cells and their connections to the other GWF cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code. | -| GWF | DISU | CONNECTIONDATA | IHC | INTEGER (NJA) | is an index array indicating the direction between node n and all of its m connections. If IHC = 0 then cell n and cell m are connected in the vertical direction. Cell n overlies cell m if the cell number for n is less than m; cell m overlies cell n if the cell number for m is less than n. If IHC = 1 then cell n and cell m are connected in the horizontal direction. If IHC = 2 then cell n and cell m are connected in the horizontal direction, and the connection is vertically staggered. A vertically staggered connection is one in which a cell is horizontally connected to more than one cell in a horizontal connection. | -| GWF | DISU | CONNECTIONDATA | CL12 | DOUBLE PRECISION (NJA) | is the array containing connection lengths between the center of cell n and the shared face with each adjacent m cell. | -| GWF | DISU | CONNECTIONDATA | HWVA | DOUBLE PRECISION (NJA) | is a symmetric array of size NJA. For horizontal connections, entries in HWVA are the horizontal width perpendicular to flow. For vertical connections, entries in HWVA are the vertical area for flow. Thus, values in the HWVA array contain dimensions of both length and area. Entries in the HWVA array have a one-to-one correspondence with the connections specified in the JA array. Likewise, there is a one-to-one correspondence between entries in the HWVA array and entries in the IHC array, which specifies the connection type (horizontal or vertical). Entries in the HWVA array must be symmetric; the program will terminate with an error if the value for HWVA for an n to m connection does not equal the value for HWVA for the corresponding n to m connection. | -| GWF | DISU | CONNECTIONDATA | ANGLDEGX | DOUBLE PRECISION (NJA) | is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specifed in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. | -| GWF | DISU | VERTICES | IV | INTEGER | is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. | -| GWF | DISU | VERTICES | XV | DOUBLE PRECISION | is the x-coordinate for the vertex. | -| GWF | DISU | VERTICES | YV | DOUBLE PRECISION | is the y-coordinate for the vertex. | -| GWF | DISU | CELL2D | ICELL2D | INTEGER | is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES. | -| GWF | DISU | CELL2D | XC | DOUBLE PRECISION | is the x-coordinate for the cell center. | -| GWF | DISU | CELL2D | YC | DOUBLE PRECISION | is the y-coordinate for the cell center. | -| GWF | DISU | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | -| GWF | DISU | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. | -| GWF | IC | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | -| GWF | IC | GRIDDATA | STRT | DOUBLE PRECISION (NODES) | is the initial (starting) head---that is, head at the beginning of the GWF Model simulation. STRT must be specified for all simulations, including steady-state simulations. One value is read for every model cell. For simulations in which the first stress period is steady state, the values used for STRT generally do not affect the simulation (exceptions may occur if cells go dry and (or) rewet). The execution time, however, will be less if STRT includes hydraulic heads that are close to the steady-state solution. A head value lower than the cell bottom can be provided if a cell should start as dry. | -| GWF | NPF | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that budget flow terms will be written to the file specified with ``BUDGET SAVE FILE'' in Output Control. | -| GWF | NPF | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that calculated flows between cells will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. This option can produce extremely large list files because all cell-by-cell flows are printed. It should only be used with the NPF Package for models that have a small number of cells. | -| GWF | NPF | OPTIONS | ALTERNATIVE_CELL_AVERAGING | STRING | is a text keyword to indicate that an alternative method will be used for calculating the conductance for horizontal cell connections. The text value for ALTERNATIVE\_CELL\_AVERAGING can be ``LOGARITHMIC'', ``AMT-LMK'', or ``AMT-HMK''. ``AMT-LMK'' signifies that the conductance will be calculated using arithmetic-mean thickness and logarithmic-mean hydraulic conductivity. ``AMT-HMK'' signifies that the conductance will be calculated using arithmetic-mean thickness and harmonic-mean hydraulic conductivity. If the user does not specify a value for ALTERNATIVE\_CELL\_AVERAGING, then the harmonic-mean method will be used. This option cannot be used if the XT3D option is invoked. | -| GWF | NPF | OPTIONS | THICKSTRT | KEYWORD | indicates that cells having a negative ICELLTYPE are confined, and their cell thickness for conductance calculations will be computed as STRT-BOT rather than TOP-BOT. This option should be used with caution as it only affects conductance calculations in the NPF Package. | -| GWF | NPF | OPTIONS | VARIABLECV | KEYWORD | keyword to indicate that the vertical conductance will be calculated using the saturated thickness and properties of the overlying cell and the thickness and properties of the underlying cell. If the DEWATERED keyword is also specified, then the vertical conductance is calculated using only the saturated thickness and properties of the overlying cell if the head in the underlying cell is below its top. If these keywords are not specified, then the default condition is to calculate the vertical conductance at the start of the simulation using the initial head and the cell properties. The vertical conductance remains constant for the entire simulation. | -| GWF | NPF | OPTIONS | DEWATERED | KEYWORD | If the DEWATERED keyword is specified, then the vertical conductance is calculated using only the saturated thickness and properties of the overlying cell if the head in the underlying cell is below its top. | -| GWF | NPF | OPTIONS | PERCHED | KEYWORD | keyword to indicate that when a cell is overlying a dewatered convertible cell, the head difference used in Darcy's Law is equal to the head in the overlying cell minus the bottom elevation of the overlying cell. If not specified, then the default is to use the head difference between the two cells. | -| GWF | NPF | OPTIONS | REWET | KEYWORD | activates model rewetting. Rewetting is off by default. | -| GWF | NPF | OPTIONS | WETFCT | DOUBLE PRECISION | is a keyword and factor that is included in the calculation of the head that is initially established at a cell when that cell is converted from dry to wet. | -| GWF | NPF | OPTIONS | IWETIT | INTEGER | is a keyword and iteration interval for attempting to wet cells. Wetting is attempted every IWETIT iteration. This applies to outer iterations and not inner iterations. If IWETIT is specified as zero or less, then the value is changed to 1. | -| GWF | NPF | OPTIONS | IHDWET | INTEGER | is a keyword and integer flag that determines which equation is used to define the initial head at cells that become wet. If IHDWET is 0, h = BOT + WETFCT (hm - BOT). If IHDWET is not 0, h = BOT + WETFCT (THRESH). | -| GWF | NPF | OPTIONS | XT3D | KEYWORD | keyword indicating that the XT3D formulation will be used. If the RHS keyword is also included, then the XT3D additional terms will be added to the right-hand side. If the RHS keyword is excluded, then the XT3D terms will be put into the coefficient matrix. Use of XT3D will substantially increase the computational effort, but will result in improved accuracy for anisotropic conductivity fields and for unstructured grids in which the CVFD requirement is violated. XT3D requires additional information about the shapes of grid cells. If XT3D is active and the DISU Package is used, then the user will need to provide in the DISU Package the angldegx array in the CONNECTIONDATA block and the VERTICES and CELL2D blocks. | -| GWF | NPF | OPTIONS | RHS | KEYWORD | If the RHS keyword is also included, then the XT3D additional terms will be added to the right-hand side. If the RHS keyword is excluded, then the XT3D terms will be put into the coefficient matrix. | -| GWF | NPF | OPTIONS | SAVE_SPECIFIC_DISCHARGE | KEYWORD | keyword to indicate that x, y, and z components of specific discharge will be calculated at cell centers and written to the budget file, which is specified with ``BUDGET SAVE FILE'' in Output Control. If this option is activated, then additional information may be required in the discretization packages and the GWF Exchange package (if GWF models are coupled). Specifically, ANGLDEGX must be specified in the CONNECTIONDATA block of the DISU Package; ANGLDEGX must also be specified for the GWF Exchange as an auxiliary variable. | -| GWF | NPF | OPTIONS | SAVE_SATURATION | KEYWORD | keyword to indicate that cell saturation will be written to the budget file, which is specified with ``BUDGET SAVE FILE'' in Output Control. Saturation will be saved to the budget file as an auxiliary variable saved with the DATA-SAT text label. Saturation is a cell variable that ranges from zero to one and can be used by post processing programs to determine how much of a cell volume is saturated. If ICELLTYPE is 0, then saturation is always one. | -| GWF | NPF | OPTIONS | K22OVERK | KEYWORD | keyword to indicate that specified K22 is a ratio of K22 divided by K. If this option is specified, then the K22 array entered in the NPF Package will be multiplied by K after being read. | -| GWF | NPF | OPTIONS | K33OVERK | KEYWORD | keyword to indicate that specified K33 is a ratio of K33 divided by K. If this option is specified, then the K33 array entered in the NPF Package will be multiplied by K after being read. | -| GWF | NPF | OPTIONS | TVK6 | KEYWORD | keyword to specify that record corresponds to a time-varying hydraulic conductivity (TVK) file. The behavior of TVK and a description of the input file is provided separately. | -| GWF | NPF | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | NPF | OPTIONS | TVK6_FILENAME | STRING | defines a time-varying hydraulic conductivity (TVK) input file. Records in the TVK file can be used to change hydraulic conductivity properties at specified times or stress periods. | -| GWF | NPF | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | -| GWF | NPF | OPTIONS | DEV_NO_NEWTON | KEYWORD | turn off Newton for unconfined cells | -| GWF | NPF | OPTIONS | DEV_OMEGA | DOUBLE PRECISION | set saturation omega value | -| GWF | NPF | GRIDDATA | ICELLTYPE | INTEGER (NODES) | flag for each cell that specifies how saturated thickness is treated. 0 means saturated thickness is held constant; $>$0 means saturated thickness varies with computed head when head is below the cell top; $<$0 means saturated thickness varies with computed head unless the THICKSTRT option is in effect. When THICKSTRT is in effect, a negative value for ICELLTYPE indicates that the saturated thickness value used in conductance calculations in the NPF Package will be computed as STRT-BOT and held constant. If the THICKSTRT option is not in effect, then negative values provided by the user for ICELLTYPE are automatically reassigned by the program to a value of one. | -| GWF | NPF | GRIDDATA | K | DOUBLE PRECISION (NODES) | is the hydraulic conductivity. For the common case in which the user would like to specify the horizontal hydraulic conductivity and the vertical hydraulic conductivity, then K should be assigned as the horizontal hydraulic conductivity, K33 should be assigned as the vertical hydraulic conductivity, and K22 and the three rotation angles should not be specified. When more sophisticated anisotropy is required, then K corresponds to the K11 hydraulic conductivity axis. All included cells (IDOMAIN $>$ 0) must have a K value greater than zero. | -| GWF | NPF | GRIDDATA | K22 | DOUBLE PRECISION (NODES) | is the hydraulic conductivity of the second ellipsoid axis (or the ratio of K22/K if the K22OVERK option is specified); for an unrotated case this is the hydraulic conductivity in the y direction. If K22 is not included in the GRIDDATA block, then K22 is set equal to K. For a regular MODFLOW grid (DIS Package is used) in which no rotation angles are specified, K22 is the hydraulic conductivity along columns in the y direction. For an unstructured DISU grid, the user must assign principal x and y axes and provide the angle for each cell face relative to the assigned x direction. All included cells (IDOMAIN $>$ 0) must have a K22 value greater than zero. | -| GWF | NPF | GRIDDATA | K33 | DOUBLE PRECISION (NODES) | is the hydraulic conductivity of the third ellipsoid axis (or the ratio of K33/K if the K33OVERK option is specified); for an unrotated case, this is the vertical hydraulic conductivity. When anisotropy is applied, K33 corresponds to the K33 tensor component. All included cells (IDOMAIN $>$ 0) must have a K33 value greater than zero. | -| GWF | NPF | GRIDDATA | ANGLE1 | DOUBLE PRECISION (NODES) | is a rotation angle of the hydraulic conductivity tensor in degrees. The angle represents the first of three sequential rotations of the hydraulic conductivity ellipsoid. With the K11, K22, and K33 axes of the ellipsoid initially aligned with the x, y, and z coordinate axes, respectively, ANGLE1 rotates the ellipsoid about its K33 axis (within the x - y plane). A positive value represents counter-clockwise rotation when viewed from any point on the positive K33 axis, looking toward the center of the ellipsoid. A value of zero indicates that the K11 axis lies within the x - z plane. If ANGLE1 is not specified, default values of zero are assigned to ANGLE1, ANGLE2, and ANGLE3, in which case the K11, K22, and K33 axes are aligned with the x, y, and z axes, respectively. | -| GWF | NPF | GRIDDATA | ANGLE2 | DOUBLE PRECISION (NODES) | is a rotation angle of the hydraulic conductivity tensor in degrees. The angle represents the second of three sequential rotations of the hydraulic conductivity ellipsoid. Following the rotation by ANGLE1 described above, ANGLE2 rotates the ellipsoid about its K22 axis (out of the x - y plane). An array can be specified for ANGLE2 only if ANGLE1 is also specified. A positive value of ANGLE2 represents clockwise rotation when viewed from any point on the positive K22 axis, looking toward the center of the ellipsoid. A value of zero indicates that the K11 axis lies within the x - y plane. If ANGLE2 is not specified, default values of zero are assigned to ANGLE2 and ANGLE3; connections that are not user-designated as vertical are assumed to be strictly horizontal (that is, to have no z component to their orientation); and connection lengths are based on horizontal distances. | -| GWF | NPF | GRIDDATA | ANGLE3 | DOUBLE PRECISION (NODES) | is a rotation angle of the hydraulic conductivity tensor in degrees. The angle represents the third of three sequential rotations of the hydraulic conductivity ellipsoid. Following the rotations by ANGLE1 and ANGLE2 described above, ANGLE3 rotates the ellipsoid about its K11 axis. An array can be specified for ANGLE3 only if ANGLE1 and ANGLE2 are also specified. An array must be specified for ANGLE3 if ANGLE2 is specified. A positive value of ANGLE3 represents clockwise rotation when viewed from any point on the positive K11 axis, looking toward the center of the ellipsoid. A value of zero indicates that the K22 axis lies within the x - y plane. | -| GWF | NPF | GRIDDATA | WETDRY | DOUBLE PRECISION (NODES) | is a combination of the wetting threshold and a flag to indicate which neighboring cells can cause a cell to become wet. If WETDRY $<$ 0, only a cell below a dry cell can cause the cell to become wet. If WETDRY $>$ 0, the cell below a dry cell and horizontally adjacent cells can cause a cell to become wet. If WETDRY is 0, the cell cannot be wetted. The absolute value of WETDRY is the wetting threshold. When the sum of BOT and the absolute value of WETDRY at a dry cell is equaled or exceeded by the head at an adjacent cell, the cell is wetted. WETDRY must be specified if ``REWET'' is specified in the OPTIONS block. If ``REWET'' is not specified in the options block, then WETDRY can be entered, and memory will be allocated for it, even though it is not used. | -| GWF | BUY | OPTIONS | HHFORMULATION_RHS | KEYWORD | use the variable-density hydraulic head formulation and add off-diagonal terms to the right-hand. This option will prevent the BUY Package from adding asymmetric terms to the flow matrix. | -| GWF | BUY | OPTIONS | DENSEREF | DOUBLE PRECISION | fluid reference density used in the equation of state. This value is set to 1000. if not specified as an option. | -| GWF | BUY | OPTIONS | DENSITY | KEYWORD | keyword to specify that record corresponds to density. | -| GWF | BUY | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | -| GWF | BUY | OPTIONS | DENSITYFILE | STRING | name of the binary output file to write density information. The density file has the same format as the head file. Density values will be written to the density file whenever heads are written to the binary head file. The settings for controlling head output are contained in the Output Control option. | -| GWF | BUY | OPTIONS | DEV_EFH_FORMULATION | KEYWORD | use the variable-density equivalent freshwater head formulation instead of the hydraulic head head formulation. This dev option has only been implemented for confined aquifer conditions and should generally not be used. | -| GWF | BUY | DIMENSIONS | NRHOSPECIES | INTEGER | number of species used in density equation of state. This value must be one or greater if the BUY package is activated. | -| GWF | BUY | PACKAGEDATA | IRHOSPEC | INTEGER | integer value that defines the species number associated with the specified PACKAGEDATA data on the line. IRHOSPECIES must be greater than zero and less than or equal to NRHOSPECIES. Information must be specified for each of the NRHOSPECIES species or the program will terminate with an error. The program will also terminate with an error if information for a species is specified more than once. | -| GWF | BUY | PACKAGEDATA | DRHODC | DOUBLE PRECISION | real value that defines the slope of the density-concentration line for this species used in the density equation of state. | -| GWF | BUY | PACKAGEDATA | CRHOREF | DOUBLE PRECISION | real value that defines the reference concentration value used for this species in the density equation of state. | -| GWF | BUY | PACKAGEDATA | MODELNAME | STRING | name of GWT model used to simulate a species that will be used in the density equation of state. This name will have no effect if the simulation does not include a GWT model that corresponds to this GWF model. | -| GWF | BUY | PACKAGEDATA | AUXSPECIESNAME | STRING | name of an auxiliary variable in a GWF stress package that will be used for this species to calculate a density value. If a density value is needed by the Buoyancy Package then it will use the concentration values in this AUXSPECIESNAME column in the density equation of state. For advanced stress packages (LAK, SFR, MAW, and UZF) that have an associated advanced transport package (LKT, SFT, MWT, and UZT), the FLOW\_PACKAGE\_AUXILIARY\_NAME option in the advanced transport package can be used to transfer simulated concentrations into the flow package auxiliary variable. In this manner, the Buoyancy Package can calculate density values for lakes, streams, multi-aquifer wells, and unsaturated zone flow cells using simulated concentrations. | -| GWF | STO | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that cell-by-cell flow terms will be written to the file specified with ``BUDGET SAVE FILE'' in Output Control. | -| GWF | STO | OPTIONS | STORAGECOEFFICIENT | KEYWORD | keyword to indicate that the SS array is read as storage coefficient rather than specific storage. | -| GWF | STO | OPTIONS | SS_CONFINED_ONLY | KEYWORD | keyword to indicate that compressible storage is only calculated for a convertible cell (ICONVERT>0) when the cell is under confined conditions (head greater than or equal to the top of the cell). This option has no effect on cells that are marked as being always confined (ICONVERT=0). This option is identical to the approach used to calculate storage changes under confined conditions in MODFLOW-2005. | -| GWF | STO | OPTIONS | TVS6 | KEYWORD | keyword to specify that record corresponds to a time-varying storage (TVS) file. The behavior of TVS and a description of the input file is provided separately. | -| GWF | STO | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | STO | OPTIONS | TVS_FILENAME | STRING | defines a time-varying storage (TVS) input file. Records in the TVS file can be used to change specific storage and specific yield properties at specified times or stress periods. | -| GWF | STO | GRIDDATA | ICONVERT | INTEGER (NODES) | is a flag for each cell that specifies whether or not a cell is convertible for the storage calculation. 0 indicates confined storage is used. $>$0 indicates confined storage is used when head is above cell top and a mixed formulation of unconfined and confined storage is used when head is below cell top. | -| GWF | STO | GRIDDATA | SS | DOUBLE PRECISION (NODES) | is specific storage (or the storage coefficient if STORAGECOEFFICIENT is specified as an option). Specific storage values must be greater than or equal to 0. If the CSUB Package is included in the GWF model, specific storage must be zero for every cell. | -| GWF | STO | GRIDDATA | SY | DOUBLE PRECISION (NODES) | is specific yield. Specific yield values must be greater than or equal to 0. Specific yield does not have to be specified if there are no convertible cells (ICONVERT=0 in every cell). | -| GWF | STO | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | STO | PERIOD | STEADY-STATE | KEYWORD | keyword to indicate that stress period IPER is steady-state. Steady-state conditions will apply until the TRANSIENT keyword is specified in a subsequent BEGIN PERIOD block. If the CSUB Package is included in the GWF model, only the first and last stress period can be steady-state. | -| GWF | STO | PERIOD | TRANSIENT | KEYWORD | keyword to indicate that stress period IPER is transient. Transient conditions will apply until the STEADY-STATE keyword is specified in a subsequent BEGIN PERIOD block. | -| GWF | CSUB | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of CSUB cells. | -| GWF | CSUB | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of CSUB information will be written to the listing file immediately after it is read. | -| GWF | CSUB | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that cell-by-cell flow terms will be written to the file specified with ``BUDGET SAVE FILE'' in Output Control. | -| GWF | CSUB | OPTIONS | GAMMAW | DOUBLE PRECISION | unit weight of water. For freshwater, GAMMAW is 9806.65 Newtons/cubic meters or 62.48 lb/cubic foot in SI and English units, respectively. By default, GAMMAW is 9806.65 Newtons/cubic meters. | -| GWF | CSUB | OPTIONS | BETA | DOUBLE PRECISION | compressibility of water. Typical values of BETA are 4.6512e-10 1/Pa or 2.2270e-8 lb/square foot in SI and English units, respectively. By default, BETA is 4.6512e-10 1/Pa. | -| GWF | CSUB | OPTIONS | HEAD_BASED | KEYWORD | keyword to indicate the head-based formulation will be used to simulate coarse-grained aquifer materials and no-delay and delay interbeds. Specifying HEAD\_BASED also specifies the INITIAL\_PRECONSOLIDATION\_HEAD option. | -| GWF | CSUB | OPTIONS | INITIAL_PRECONSOLIDATION_HEAD | KEYWORD | keyword to indicate that preconsolidation heads will be specified for no-delay and delay interbeds in the PACKAGEDATA block. If the SPECIFIED\_INITIAL\_INTERBED\_STATE option is specified in the OPTIONS block, user-specified preconsolidation heads in the PACKAGEDATA block are absolute values. Otherwise, user-specified preconsolidation heads in the PACKAGEDATA block are relative to steady-state or initial heads. | -| GWF | CSUB | OPTIONS | NDELAYCELLS | INTEGER | number of nodes used to discretize delay interbeds. If not specified, then a default value of 19 is assigned. | -| GWF | CSUB | OPTIONS | COMPRESSION_INDICES | KEYWORD | keyword to indicate that the recompression (CR) and compression (CC) indices are specified instead of the elastic specific storage (SSE) and inelastic specific storage (SSV) coefficients. If not specified, then elastic specific storage (SSE) and inelastic specific storage (SSV) coefficients must be specified. | -| GWF | CSUB | OPTIONS | UPDATE_MATERIAL_PROPERTIES | KEYWORD | keyword to indicate that the thickness and void ratio of coarse-grained and interbed sediments (delay and no-delay) will vary during the simulation. If not specified, the thickness and void ratio of coarse-grained and interbed sediments will not vary during the simulation. | -| GWF | CSUB | OPTIONS | CELL_FRACTION | KEYWORD | keyword to indicate that the thickness of interbeds will be specified in terms of the fraction of cell thickness. If not specified, interbed thicknness must be specified. | -| GWF | CSUB | OPTIONS | SPECIFIED_INITIAL_INTERBED_STATE | KEYWORD | keyword to indicate that absolute preconsolidation stresses (heads) and delay bed heads will be specified for interbeds defined in the PACKAGEDATA block. The SPECIFIED\_INITIAL\_INTERBED\_STATE option is equivalent to specifying the SPECIFIED\_INITIAL\_PRECONSOLITATION\_STRESS and SPECIFIED\_INITIAL\_DELAY\_HEAD. If SPECIFIED\_INITIAL\_INTERBED\_STATE is not specified then preconsolidation stress (head) and delay bed head values specified in the PACKAGEDATA block are relative to simulated values of the first stress period if steady-state or initial stresses and GWF heads if the first stress period is transient. | -| GWF | CSUB | OPTIONS | SPECIFIED_INITIAL_PRECONSOLIDATION_STRESS | KEYWORD | keyword to indicate that absolute preconsolidation stresses (heads) will be specified for interbeds defined in the PACKAGEDATA block. If SPECIFIED\_INITIAL\_PRECONSOLITATION\_STRESS and SPECIFIED\_INITIAL\_INTERBED\_STATE are not specified then preconsolidation stress (head) values specified in the PACKAGEDATA block are relative to simulated values if the first stress period is steady-state or initial stresses (heads) if the first stress period is transient. | -| GWF | CSUB | OPTIONS | SPECIFIED_INITIAL_DELAY_HEAD | KEYWORD | keyword to indicate that absolute initial delay bed head will be specified for interbeds defined in the PACKAGEDATA block. If SPECIFIED\_INITIAL\_DELAY\_HEAD and SPECIFIED\_INITIAL\_INTERBED\_STATE are not specified then delay bed head values specified in the PACKAGEDATA block are relative to simulated values if the first stress period is steady-state or initial GWF heads if the first stress period is transient. | -| GWF | CSUB | OPTIONS | EFFECTIVE_STRESS_LAG | KEYWORD | keyword to indicate the effective stress from the previous time step will be used to calculate specific storage values. This option can 1) help with convergence in models with thin cells and water table elevations close to land surface; 2) is identical to the approach used in the SUBWT package for MODFLOW-2005; and 3) is only used if the effective-stress formulation is being used. By default, current effective stress values are used to calculate specific storage values. | -| GWF | CSUB | OPTIONS | STRAIN_CSV_INTERBED | KEYWORD | keyword to specify the record that corresponds to final interbed strain output. | -| GWF | CSUB | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | -| GWF | CSUB | OPTIONS | INTERBEDSTRAIN_FILENAME | STRING | name of the comma-separated-values output file to write final interbed strain information. | -| GWF | CSUB | OPTIONS | STRAIN_CSV_COARSE | KEYWORD | keyword to specify the record that corresponds to final coarse-grained material strain output. | -| GWF | CSUB | OPTIONS | COARSESTRAIN_FILENAME | STRING | name of the comma-separated-values output file to write final coarse-grained material strain information. | -| GWF | CSUB | OPTIONS | COMPACTION | KEYWORD | keyword to specify that record corresponds to the compaction. | -| GWF | CSUB | OPTIONS | COMPACTION_FILENAME | STRING | name of the binary output file to write compaction information. | -| GWF | CSUB | OPTIONS | COMPACTION_ELASTIC | KEYWORD | keyword to specify that record corresponds to the elastic interbed compaction binary file. | -| GWF | CSUB | OPTIONS | ELASTIC_COMPACTION_FILENAME | STRING | name of the binary output file to write elastic interbed compaction information. | -| GWF | CSUB | OPTIONS | COMPACTION_INELASTIC | KEYWORD | keyword to specify that record corresponds to the inelastic interbed compaction binary file. | -| GWF | CSUB | OPTIONS | INELASTIC_COMPACTION_FILENAME | STRING | name of the binary output file to write inelastic interbed compaction information. | -| GWF | CSUB | OPTIONS | COMPACTION_INTERBED | KEYWORD | keyword to specify that record corresponds to the interbed compaction binary file. | -| GWF | CSUB | OPTIONS | INTERBED_COMPACTION_FILENAME | STRING | name of the binary output file to write interbed compaction information. | -| GWF | CSUB | OPTIONS | COMPACTION_COARSE | KEYWORD | keyword to specify that record corresponds to the elastic coarse-grained material compaction binary file. | -| GWF | CSUB | OPTIONS | COARSE_COMPACTION_FILENAME | STRING | name of the binary output file to write elastic coarse-grained material compaction information. | -| GWF | CSUB | OPTIONS | ZDISPLACEMENT | KEYWORD | keyword to specify that record corresponds to the z-displacement binary file. | -| GWF | CSUB | OPTIONS | ZDISPLACEMENT_FILENAME | STRING | name of the binary output file to write z-displacement information. | -| GWF | CSUB | OPTIONS | PACKAGE_CONVERGENCE | KEYWORD | keyword to specify that record corresponds to the package convergence comma spaced values file. | -| GWF | CSUB | OPTIONS | PACKAGE_CONVERGENCE_FILENAME | STRING | name of the comma spaced values output file to write package convergence information. | -| GWF | CSUB | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | -| GWF | CSUB | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | CSUB | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | -| GWF | CSUB | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | -| GWF | CSUB | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the CSUB package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the CSUB package. | -| GWF | CSUB | DIMENSIONS | NINTERBEDS | INTEGER | is the number of CSUB interbed systems. More than 1 CSUB interbed systems can be assigned to a GWF cell; however, only 1 GWF cell can be assigned to a single CSUB interbed system. | -| GWF | CSUB | DIMENSIONS | MAXSIG0 | INTEGER | is the maximum number of cells that can have a specified stress offset. More than 1 stress offset can be assigned to a GWF cell. By default, MAXSIG0 is 0. | -| GWF | CSUB | GRIDDATA | CG_SKE_CR | DOUBLE PRECISION (NODES) | is the initial elastic coarse-grained material specific storage or recompression index. The recompression index is specified if COMPRESSION\_INDICES is specified in the OPTIONS block. Specified or calculated elastic coarse-grained material specific storage values are not adjusted from initial values if HEAD\_BASED is specified in the OPTIONS block. | -| GWF | CSUB | GRIDDATA | CG_THETA | DOUBLE PRECISION (NODES) | is the initial porosity of coarse-grained materials. | -| GWF | CSUB | GRIDDATA | SGM | DOUBLE PRECISION (NODES) | is the specific gravity of moist or unsaturated sediments. If not specified, then a default value of 1.7 is assigned. | -| GWF | CSUB | GRIDDATA | SGS | DOUBLE PRECISION (NODES) | is the specific gravity of saturated sediments. If not specified, then a default value of 2.0 is assigned. | -| GWF | CSUB | PACKAGEDATA | ICSUBNO | INTEGER | integer value that defines the CSUB interbed number associated with the specified PACKAGEDATA data on the line. CSUBNO must be greater than zero and less than or equal to NINTERBEDS. CSUB information must be specified for every CSUB cell or the program will terminate with an error. The program will also terminate with an error if information for a CSUB interbed number is specified more than once. | -| GWF | CSUB | PACKAGEDATA | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | -| GWF | CSUB | PACKAGEDATA | CDELAY | STRING | character string that defines the subsidence delay type for the interbed. Possible subsidence package CDELAY strings include: NODELAY--character keyword to indicate that delay will not be simulated in the interbed. DELAY--character keyword to indicate that delay will be simulated in the interbed. | -| GWF | CSUB | PACKAGEDATA | PCS0 | DOUBLE PRECISION | is the initial offset from the calculated initial effective stress or initial preconsolidation stress in the interbed, in units of height of a column of water. PCS0 is the initial preconsolidation stress if SPECIFIED\_INITIAL\_INTERBED\_STATE or SPECIFIED\_INITIAL\_PRECONSOLIDATION\_STRESS are specified in the OPTIONS block. If HEAD\_BASED is specified in the OPTIONS block, PCS0 is the initial offset from the calculated initial head or initial preconsolidation head in the CSUB interbed and the initial preconsolidation stress is calculated from the calculated initial effective stress or calculated initial geostatic stress, respectively. | -| GWF | CSUB | PACKAGEDATA | THICK_FRAC | DOUBLE PRECISION | is the interbed thickness or cell fraction of the interbed. Interbed thickness is specified as a fraction of the cell thickness if CELL\_FRACTION is specified in the OPTIONS block. | -| GWF | CSUB | PACKAGEDATA | RNB | DOUBLE PRECISION | is the interbed material factor equivalent number of interbeds in the interbed system represented by the interbed. RNB must be greater than or equal to 1 if CDELAY is DELAY. Otherwise, RNB can be any value. | -| GWF | CSUB | PACKAGEDATA | SSV_CC | DOUBLE PRECISION | is the initial inelastic specific storage or compression index of the interbed. The compression index is specified if COMPRESSION\_INDICES is specified in the OPTIONS block. Specified or calculated interbed inelastic specific storage values are not adjusted from initial values if HEAD\_BASED is specified in the OPTIONS block. | -| GWF | CSUB | PACKAGEDATA | SSE_CR | DOUBLE PRECISION | is the initial elastic coarse-grained material specific storage or recompression index of the interbed. The recompression index is specified if COMPRESSION\_INDICES is specified in the OPTIONS block. Specified or calculated interbed elastic specific storage values are not adjusted from initial values if HEAD\_BASED is specified in the OPTIONS block. | -| GWF | CSUB | PACKAGEDATA | THETA | DOUBLE PRECISION | is the initial porosity of the interbed. | -| GWF | CSUB | PACKAGEDATA | KV | DOUBLE PRECISION | is the vertical hydraulic conductivity of the delay interbed. KV must be greater than 0 if CDELAY is DELAY. Otherwise, KV can be any value. | -| GWF | CSUB | PACKAGEDATA | H0 | DOUBLE PRECISION | is the initial offset from the head in cell cellid or the initial head in the delay interbed. H0 is the initial head in the delay bed if SPECIFIED\_INITIAL\_INTERBED\_STATE or SPECIFIED\_INITIAL\_DELAY\_HEAD are specified in the OPTIONS block. H0 can be any value if CDELAY is NODELAY. | -| GWF | CSUB | PACKAGEDATA | BOUNDNAME | STRING | name of the CSUB cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | -| GWF | CSUB | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | CSUB | PERIOD | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | -| GWF | CSUB | PERIOD | SIG0 | DOUBLE PRECISION | is the stress offset for the cell. SIG0 is added to the calculated geostatic stress for the cell. SIG0 is specified only if MAXSIG0 is specified to be greater than 0 in the DIMENSIONS block. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | HFB | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of horizontal flow barriers will be written to the listing file immediately after it is read. | -| GWF | HFB | DIMENSIONS | MAXHFB | INTEGER | integer value specifying the maximum number of horizontal flow barriers that will be entered in this input file. The value of MAXHFB is used to allocate memory for the horizontal flow barriers. | -| GWF | HFB | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | HFB | PERIOD | CELLID1 | INTEGER (NCELLDIM) | identifier for the first cell. For a structured grid that uses the DIS input file, CELLID1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLID1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLID1 is the node numbers for the cell. The barrier is located between cells designated as CELLID1 and CELLID2. For models that use the DIS and DISV grid types, the layer number for CELLID1 and CELLID2 must be the same. For all grid types, cells must be horizontally adjacent or the program will terminate with an error. | -| GWF | HFB | PERIOD | CELLID2 | INTEGER (NCELLDIM) | identifier for the second cell. See CELLID1 for description of how to specify. | -| GWF | HFB | PERIOD | HYDCHR | DOUBLE PRECISION | is the hydraulic characteristic of the horizontal-flow barrier. The hydraulic characteristic is the barrier hydraulic conductivity divided by the width of the horizontal-flow barrier. If the hydraulic characteristic is negative, then the absolute value of HYDCHR acts as a multiplier to the conductance between the two model cells specified as containing the barrier. For example, if the value for HYDCHR was specified as -1.5, the conductance calculated for the two cells would be multiplied by 1.5. | -| GWF | CHD | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | -| GWF | CHD | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of CHD head value. | -| GWF | CHD | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of constant-head cells. | -| GWF | CHD | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of constant-head information will be written to the listing file immediately after it is read. | -| GWF | CHD | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of constant-head flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | -| GWF | CHD | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that constant-head flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWF | CHD | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | -| GWF | CHD | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | CHD | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | -| GWF | CHD | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | -| GWF | CHD | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the constant-head package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the constant-head package. | -| GWF | CHD | OPTIONS | DEV_NO_NEWTON | KEYWORD | turn off Newton for unconfined cells | -| GWF | CHD | DIMENSIONS | MAXBOUND | INTEGER | integer value specifying the maximum number of constant-head cells that will be specified for use during any stress period. | -| GWF | CHD | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | CHD | PERIOD | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | -| GWF | CHD | PERIOD | HEAD | DOUBLE PRECISION | is the head at the boundary. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | CHD | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each constant head. The values of auxiliary variables must be present for each constant head. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | CHD | PERIOD | BOUNDNAME | STRING | name of the constant head boundary cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | -| GWF | WEL | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | -| GWF | WEL | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of well flow rate. | -| GWF | WEL | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of well cells. | -| GWF | WEL | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of well information will be written to the listing file immediately after it is read. | -| GWF | WEL | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of well flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | -| GWF | WEL | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that well flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWF | WEL | OPTIONS | AUTO_FLOW_REDUCE | DOUBLE PRECISION | keyword and real value that defines the fraction of the cell thickness used as an interval for smoothly adjusting negative pumping rates to 0 in cells with head values less than or equal to the bottom of the cell. Negative pumping rates are adjusted to 0 or a smaller negative value when the head in the cell is equal to or less than the calculated interval above the cell bottom. AUTO\_FLOW\_REDUCE is set to 0.1 if the specified value is less than or equal to zero. By default, negative pumping rates are not reduced during a simulation. This AUTO\_FLOW\_REDUCE option only applies to wells in model cells that are marked as ``convertible'' (ICELLTYPE /= 0) in the Node Property Flow (NPF) input file. Reduction in flow will not occur for wells in cells marked as confined (ICELLTYPE = 0). | -| GWF | WEL | OPTIONS | AUTO_FLOW_REDUCE_CSV | KEYWORD | keyword to specify that record corresponds to the AUTO\_FLOW\_REDUCE output option in which a new record is written for each well and for each time step in which the user-requested extraction rate is reduced by the program. | -| GWF | WEL | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | -| GWF | WEL | OPTIONS | AFRCSVFILE | STRING | name of the comma-separated value (CSV) output file to write information about well extraction rates that have been reduced by the program. Entries are only written if the extraction rates are reduced. | -| GWF | WEL | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | -| GWF | WEL | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | WEL | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | -| GWF | WEL | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | -| GWF | WEL | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the Well package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the Well package. | -| GWF | WEL | OPTIONS | MOVER | KEYWORD | keyword to indicate that this instance of the Well Package can be used with the Water Mover (MVR) Package. When the MOVER option is specified, additional memory is allocated within the package to store the available, provided, and received water. | -| GWF | WEL | DIMENSIONS | MAXBOUND | INTEGER | integer value specifying the maximum number of wells cells that will be specified for use during any stress period. | -| GWF | WEL | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | WEL | PERIOD | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | -| GWF | WEL | PERIOD | Q | DOUBLE PRECISION | is the volumetric well rate. A positive value indicates recharge (injection) and a negative value indicates discharge (extraction). If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | WEL | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each well. The values of auxiliary variables must be present for each well. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | WEL | PERIOD | BOUNDNAME | STRING | name of the well cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | -| GWF | DRN | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | -| GWF | DRN | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of drain conductance. | -| GWF | DRN | OPTIONS | AUXDEPTHNAME | STRING | name of a variable listed in AUXILIARY that defines the depth at which drainage discharge will be scaled. If a positive value is specified for the AUXDEPTHNAME AUXILIARY variable, then ELEV is the elevation at which the drain starts to discharge and ELEV + DDRN (assuming DDRN is the AUXDEPTHNAME variable) is the elevation when the drain conductance (COND) scaling factor is 1. If a negative drainage depth value is specified for DDRN, then ELEV + DDRN is the elevation at which the drain starts to discharge and ELEV is the elevation when the conductance (COND) scaling factor is 1. A linear- or cubic-scaling is used to scale the drain conductance (COND) when the Standard or Newton-Raphson Formulation is used, respectively. This discharge scaling option is described in more detail in Chapter 3 of the Supplemental Technical Information. | -| GWF | DRN | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of drain cells. | -| GWF | DRN | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of drain information will be written to the listing file immediately after it is read. | -| GWF | DRN | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of drain flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | -| GWF | DRN | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that drain flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWF | DRN | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | -| GWF | DRN | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | DRN | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | -| GWF | DRN | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | -| GWF | DRN | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the Drain package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the Drain package. | -| GWF | DRN | OPTIONS | MOVER | KEYWORD | keyword to indicate that this instance of the Drain Package can be used with the Water Mover (MVR) Package. When the MOVER option is specified, additional memory is allocated within the package to store the available, provided, and received water. | -| GWF | DRN | OPTIONS | DEV_CUBIC_SCALING | KEYWORD | cubic-scaling is used to scale the drain conductance | -| GWF | DRN | DIMENSIONS | MAXBOUND | INTEGER | integer value specifying the maximum number of drains cells that will be specified for use during any stress period. | -| GWF | DRN | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | DRN | PERIOD | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | -| GWF | DRN | PERIOD | ELEV | DOUBLE PRECISION | is the elevation of the drain. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | DRN | PERIOD | COND | DOUBLE PRECISION | is the hydraulic conductance of the interface between the aquifer and the drain. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | DRN | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each drain. The values of auxiliary variables must be present for each drain. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | DRN | PERIOD | BOUNDNAME | STRING | name of the drain cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | -| GWF | RIV | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | -| GWF | RIV | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of riverbed conductance. | -| GWF | RIV | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of river cells. | -| GWF | RIV | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of river information will be written to the listing file immediately after it is read. | -| GWF | RIV | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of river flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | -| GWF | RIV | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that river flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWF | RIV | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | -| GWF | RIV | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | RIV | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | -| GWF | RIV | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | -| GWF | RIV | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the River package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the River package. | -| GWF | RIV | OPTIONS | MOVER | KEYWORD | keyword to indicate that this instance of the River Package can be used with the Water Mover (MVR) Package. When the MOVER option is specified, additional memory is allocated within the package to store the available, provided, and received water. | -| GWF | RIV | DIMENSIONS | MAXBOUND | INTEGER | integer value specifying the maximum number of rivers cells that will be specified for use during any stress period. | -| GWF | RIV | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | RIV | PERIOD | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | -| GWF | RIV | PERIOD | STAGE | DOUBLE PRECISION | is the head in the river. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | RIV | PERIOD | COND | DOUBLE PRECISION | is the riverbed hydraulic conductance. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | RIV | PERIOD | RBOT | DOUBLE PRECISION | is the elevation of the bottom of the riverbed. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | RIV | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each river. The values of auxiliary variables must be present for each river. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | RIV | PERIOD | BOUNDNAME | STRING | name of the river cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | -| GWF | GHB | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | -| GWF | GHB | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of general-head boundary conductance. | -| GWF | GHB | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of general-head boundary cells. | -| GWF | GHB | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of general-head boundary information will be written to the listing file immediately after it is read. | -| GWF | GHB | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of general-head boundary flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | -| GWF | GHB | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that general-head boundary flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWF | GHB | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | -| GWF | GHB | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | GHB | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | -| GWF | GHB | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | -| GWF | GHB | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the General-Head Boundary package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the General-Head Boundary package. | -| GWF | GHB | OPTIONS | MOVER | KEYWORD | keyword to indicate that this instance of the General-Head Boundary Package can be used with the Water Mover (MVR) Package. When the MOVER option is specified, additional memory is allocated within the package to store the available, provided, and received water. | -| GWF | GHB | DIMENSIONS | MAXBOUND | INTEGER | integer value specifying the maximum number of general-head boundary cells that will be specified for use during any stress period. | -| GWF | GHB | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | GHB | PERIOD | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | -| GWF | GHB | PERIOD | BHEAD | DOUBLE PRECISION | is the boundary head. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | GHB | PERIOD | COND | DOUBLE PRECISION | is the hydraulic conductance of the interface between the aquifer cell and the boundary. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | GHB | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each general-head boundary. The values of auxiliary variables must be present for each general-head boundary. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | GHB | PERIOD | BOUNDNAME | STRING | name of the general-head boundary cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | -| GWF | RCH | OPTIONS | FIXED_CELL | KEYWORD | indicates that recharge will not be reassigned to a cell underlying the cell specified in the list if the specified cell is inactive. | -| GWF | RCH | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | -| GWF | RCH | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of recharge. | -| GWF | RCH | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of recharge cells. | -| GWF | RCH | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of recharge information will be written to the listing file immediately after it is read. | -| GWF | RCH | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of recharge flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | -| GWF | RCH | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that recharge flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWF | RCH | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | -| GWF | RCH | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | RCH | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | -| GWF | RCH | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | -| GWF | RCH | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the Recharge package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the Recharge package. | -| GWF | RCH | DIMENSIONS | MAXBOUND | INTEGER | integer value specifying the maximum number of recharge cells cells that will be specified for use during any stress period. | -| GWF | RCH | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | RCH | PERIOD | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | -| GWF | RCH | PERIOD | RECHARGE | DOUBLE PRECISION | is the recharge flux rate ($LT^{-1}$). This rate is multiplied inside the program by the surface area of the cell to calculate the volumetric recharge rate. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | RCH | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each recharge. The values of auxiliary variables must be present for each recharge. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | RCH | PERIOD | BOUNDNAME | STRING | name of the recharge cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | -| GWF | RCHA | OPTIONS | READASARRAYS | KEYWORD | indicates that array-based input will be used for the Recharge Package. This keyword must be specified to use array-based input. | -| GWF | RCHA | OPTIONS | FIXED_CELL | KEYWORD | indicates that recharge will not be reassigned to a cell underlying the cell specified in the list if the specified cell is inactive. | -| GWF | RCHA | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | -| GWF | RCHA | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of recharge. | -| GWF | RCHA | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of recharge information will be written to the listing file immediately after it is read. | -| GWF | RCHA | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of recharge flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | -| GWF | RCHA | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that recharge flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWF | RCHA | OPTIONS | TAS6 | KEYWORD | keyword to specify that record corresponds to a time-array-series file. | -| GWF | RCHA | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | RCHA | OPTIONS | TAS6_FILENAME | STRING | defines a time-array-series file defining a time-array series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-array series capability. | -| GWF | RCHA | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | -| GWF | RCHA | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the Recharge package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the Recharge package. | -| GWF | RCHA | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | RCHA | PERIOD | IRCH | INTEGER (NCOL*NROW; NCPL) | IRCH is the layer number that defines the layer in each vertical column where recharge is applied. If IRCH is omitted, recharge by default is applied to cells in layer 1. IRCH can only be used if READASARRAYS is specified in the OPTIONS block. If IRCH is specified, it must be specified as the first variable in the PERIOD block or MODFLOW will terminate with an error. | -| GWF | RCHA | PERIOD | RECHARGE | DOUBLE PRECISION (NCOL*NROW; NCPL) | is the recharge flux rate ($LT^{-1}$). This rate is multiplied inside the program by the surface area of the cell to calculate the volumetric recharge rate. The recharge array may be defined by a time-array series (see the ``Using Time-Array Series in a Package'' section). | -| GWF | RCHA | PERIOD | AUX | DOUBLE PRECISION (NCOL*NROW; NCPL) | is an array of values for auxiliary variable aux(iaux), where iaux is a value from 1 to naux, and aux(iaux) must be listed as part of the auxiliary variables. A separate array can be specified for each auxiliary variable. If an array is not specified for an auxiliary variable, then a value of zero is assigned. If the value specified here for the auxiliary variable is the same as auxmultname, then the recharge array will be multiplied by this array. | -| GWF | EVT | OPTIONS | FIXED_CELL | KEYWORD | indicates that evapotranspiration will not be reassigned to a cell underlying the cell specified in the list if the specified cell is inactive. | -| GWF | EVT | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | -| GWF | EVT | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of evapotranspiration rate. | -| GWF | EVT | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of evapotranspiration cells. | -| GWF | EVT | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of evapotranspiration information will be written to the listing file immediately after it is read. | -| GWF | EVT | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of evapotranspiration flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | -| GWF | EVT | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that evapotranspiration flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWF | EVT | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | -| GWF | EVT | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | EVT | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | -| GWF | EVT | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | -| GWF | EVT | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the Evapotranspiration package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the Evapotranspiration package. | -| GWF | EVT | OPTIONS | SURF_RATE_SPECIFIED | KEYWORD | indicates that the proportion of the evapotranspiration rate at the ET surface will be specified as PETM0 in list input. | -| GWF | EVT | DIMENSIONS | MAXBOUND | INTEGER | integer value specifying the maximum number of evapotranspiration cells cells that will be specified for use during any stress period. | -| GWF | EVT | DIMENSIONS | NSEG | INTEGER | number of ET segments. Default is one. When NSEG is greater than 1, the PXDP and PETM arrays must be of size NSEG - 1 and be listed in order from the uppermost segment down. Values for PXDP must be listed first followed by the values for PETM. PXDP defines the extinction-depth proportion at the bottom of a segment. PETM defines the proportion of the maximum ET flux rate at the bottom of a segment. | -| GWF | EVT | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | EVT | PERIOD | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | -| GWF | EVT | PERIOD | SURFACE | DOUBLE PRECISION | is the elevation of the ET surface ($L$). If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | EVT | PERIOD | RATE | DOUBLE PRECISION | is the maximum ET flux rate ($LT^{-1}$). If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | EVT | PERIOD | DEPTH | DOUBLE PRECISION | is the ET extinction depth ($L$). If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | EVT | PERIOD | PXDP | DOUBLE PRECISION (NSEG-1) | is the proportion of the ET extinction depth at the bottom of a segment (dimensionless). pxdp is an array of size (nseg - 1). Values in pxdp must be greater than 0.0 and less than 1.0. pxdp values for a cell must increase monotonically. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | EVT | PERIOD | PETM | DOUBLE PRECISION (NSEG-1) | is the proportion of the maximum ET flux rate at the bottom of a segment (dimensionless). petm is an array of size (nseg - 1). If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | EVT | PERIOD | PETM0 | DOUBLE PRECISION | is the proportion of the maximum ET flux rate that will apply when head is at or above the ET surface (dimensionless). PETM0 is read only when the SURF\_RATE\_SPECIFIED option is used. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | EVT | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each evapotranspiration. The values of auxiliary variables must be present for each evapotranspiration. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | EVT | PERIOD | BOUNDNAME | STRING | name of the evapotranspiration cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | -| GWF | EVTA | OPTIONS | READASARRAYS | KEYWORD | indicates that array-based input will be used for the Evapotranspiration Package. This keyword must be specified to use array-based input. | -| GWF | EVTA | OPTIONS | FIXED_CELL | KEYWORD | indicates that evapotranspiration will not be reassigned to a cell underlying the cell specified in the list if the specified cell is inactive. | -| GWF | EVTA | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | -| GWF | EVTA | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of evapotranspiration rate. | -| GWF | EVTA | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of evapotranspiration information will be written to the listing file immediately after it is read. | -| GWF | EVTA | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of evapotranspiration flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | -| GWF | EVTA | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that evapotranspiration flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWF | EVTA | OPTIONS | TAS6 | KEYWORD | keyword to specify that record corresponds to a time-array-series file. | -| GWF | EVTA | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | EVTA | OPTIONS | TAS6_FILENAME | STRING | defines a time-array-series file defining a time-array series that can be used to assign time-varying values. See the Time-Variable Input section for instructions on using the time-array series capability. | -| GWF | EVTA | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | -| GWF | EVTA | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the Evapotranspiration package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the Evapotranspiration package. | -| GWF | EVTA | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | EVTA | PERIOD | IEVT | INTEGER (NCOL*NROW; NCPL) | IEVT is the layer number that defines the layer in each vertical column where evapotranspiration is applied. If IEVT is omitted, evapotranspiration by default is applied to cells in layer 1. If IEVT is specified, it must be specified as the first variable in the PERIOD block or MODFLOW will terminate with an error. | -| GWF | EVTA | PERIOD | SURFACE | DOUBLE PRECISION (NCOL*NROW; NCPL) | is the elevation of the ET surface ($L$). | -| GWF | EVTA | PERIOD | RATE | DOUBLE PRECISION (NCOL*NROW; NCPL) | is the maximum ET flux rate ($LT^{-1}$). | -| GWF | EVTA | PERIOD | DEPTH | DOUBLE PRECISION (NCOL*NROW; NCPL) | is the ET extinction depth ($L$). | -| GWF | EVTA | PERIOD | AUX | DOUBLE PRECISION (NCOL*NROW; NCPL) | is an array of values for auxiliary variable AUX(IAUX), where iaux is a value from 1 to NAUX, and AUX(IAUX) must be listed as part of the auxiliary variables. A separate array can be specified for each auxiliary variable. If an array is not specified for an auxiliary variable, then a value of zero is assigned. If the value specified here for the auxiliary variable is the same as auxmultname, then the evapotranspiration rate will be multiplied by this array. | -| GWF | MAW | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | -| GWF | MAW | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of multi-aquifer well cells. | -| GWF | MAW | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of multi-aquifer well information will be written to the listing file immediately after it is read. | -| GWF | MAW | OPTIONS | PRINT_HEAD | KEYWORD | keyword to indicate that the list of multi-aquifer well heads will be printed to the listing file for every stress period in which ``HEAD PRINT'' is specified in Output Control. If there is no Output Control option and PRINT\_HEAD is specified, then heads are printed for the last time step of each stress period. | -| GWF | MAW | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of multi-aquifer well flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | -| GWF | MAW | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that multi-aquifer well flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWF | MAW | OPTIONS | HEAD | KEYWORD | keyword to specify that record corresponds to head. | -| GWF | MAW | OPTIONS | HEADFILE | STRING | name of the binary output file to write head information. | -| GWF | MAW | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | -| GWF | MAW | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | -| GWF | MAW | OPTIONS | BUDGETFILE | STRING | name of the binary output file to write budget information. | -| GWF | MAW | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | -| GWF | MAW | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | -| GWF | MAW | OPTIONS | NO_WELL_STORAGE | KEYWORD | keyword that deactivates inclusion of well storage contributions to the multi-aquifer well package continuity equation. | -| GWF | MAW | OPTIONS | FLOW_CORRECTION | KEYWORD | keyword that activates flow corrections in cases where the head in a multi-aquifer well is below the bottom of the screen for a connection or the head in a convertible cell connected to a multi-aquifer well is below the cell bottom. When flow corrections are activated, unit head gradients are used to calculate the flow between a multi-aquifer well and a connected GWF cell. By default, flow corrections are not made. | -| GWF | MAW | OPTIONS | FLOWING_WELLS | KEYWORD | keyword that activates the flowing wells option for the multi-aquifer well package. | -| GWF | MAW | OPTIONS | SHUTDOWN_THETA | DOUBLE PRECISION | value that defines the weight applied to discharge rate for wells that limit the water level in a discharging well (defined using the HEAD\_LIMIT keyword in the stress period data). SHUTDOWN\_THETA is used to control discharge rate oscillations when the flow rate from the aquifer is less than the specified flow rate from the aquifer to the well. Values range between 0.0 and 1.0, and larger values increase the weight (decrease under-relaxation) applied to the well discharge rate. The HEAD\_LIMIT option has been included to facilitate backward compatibility with previous versions of MODFLOW but use of the RATE\_SCALING option instead of the HEAD\_LIMIT option is recommended. By default, SHUTDOWN\_THETA is 0.7. | -| GWF | MAW | OPTIONS | SHUTDOWN_KAPPA | DOUBLE PRECISION | value that defines the weight applied to discharge rate for wells that limit the water level in a discharging well (defined using the HEAD\_LIMIT keyword in the stress period data). SHUTDOWN\_KAPPA is used to control discharge rate oscillations when the flow rate from the aquifer is less than the specified flow rate from the aquifer to the well. Values range between 0.0 and 1.0, and larger values increase the weight applied to the well discharge rate. The HEAD\_LIMIT option has been included to facilitate backward compatibility with previous versions of MODFLOW but use of the RATE\_SCALING option instead of the HEAD\_LIMIT option is recommended. By default, SHUTDOWN\_KAPPA is 0.0001. | -| GWF | MAW | OPTIONS | MAW_FLOW_REDUCE_CSV | KEYWORD | keyword to specify that record corresponds to the output option in which a new record is written for each multi-aquifer well and for each time step in which the user-requested extraction or injection rate is reduced by the program. | -| GWF | MAW | OPTIONS | MFRCSVFILE | STRING | name of the comma-separated value (CSV) output file to write information about multi-aquifer well extraction or injection rates that have been reduced by the program. Entries are only written if the extraction or injection rates are reduced. | -| GWF | MAW | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | -| GWF | MAW | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | MAW | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | -| GWF | MAW | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | -| GWF | MAW | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the MAW package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the MAW package. | -| GWF | MAW | OPTIONS | MOVER | KEYWORD | keyword to indicate that this instance of the MAW Package can be used with the Water Mover (MVR) Package. When the MOVER option is specified, additional memory is allocated within the package to store the available, provided, and received water. | -| GWF | MAW | DIMENSIONS | NMAWWELLS | INTEGER | integer value specifying the number of multi-aquifer wells that will be simulated for all stress periods. | -| GWF | MAW | PACKAGEDATA | IFNO | INTEGER | integer value that defines the feature (well) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. Multi-aquifer well information must be specified for every multi-aquifer well or the program will terminate with an error. The program will also terminate with an error if information for a multi-aquifer well is specified more than once. | -| GWF | MAW | PACKAGEDATA | RADIUS | DOUBLE PRECISION | radius for the multi-aquifer well. The program will terminate with an error if the radius is less than or equal to zero. | -| GWF | MAW | PACKAGEDATA | BOTTOM | DOUBLE PRECISION | bottom elevation of the multi-aquifer well. If CONDEQN is SPECIFIED, THIEM, SKIN, or COMPOSITE, BOTTOM is set to the cell bottom in the lowermost GWF cell connection in cases where the specified well bottom is above the bottom of this GWF cell. If CONDEQN is MEAN, BOTTOM is set to the lowermost GWF cell connection screen bottom in cases where the specified well bottom is above this value. The bottom elevation defines the lowest well head that will be simulated when the NEWTON UNDER\_RELAXATION option is specified in the GWF model name file. The bottom elevation is also used to calculate volumetric storage in the well. | -| GWF | MAW | PACKAGEDATA | STRT | DOUBLE PRECISION | starting head for the multi-aquifer well. The program will terminate with an error if the starting head is less than the specified well bottom. | -| GWF | MAW | PACKAGEDATA | CONDEQN | STRING | character string that defines the conductance equation that is used to calculate the saturated conductance for the multi-aquifer well. Possible multi-aquifer well CONDEQN strings include: SPECIFIED--character keyword to indicate the multi-aquifer well saturated conductance will be specified. THIEM--character keyword to indicate the multi-aquifer well saturated conductance will be calculated using the Thiem equation, which considers the cell top and bottom, aquifer hydraulic conductivity, and effective cell and well radius. SKIN--character keyword to indicate that the multi-aquifer well saturated conductance will be calculated using the cell top and bottom, aquifer and screen hydraulic conductivity, and well and skin radius. CUMULATIVE--character keyword to indicate that the multi-aquifer well saturated conductance will be calculated using a combination of the Thiem and SKIN equations. MEAN--character keyword to indicate the multi-aquifer well saturated conductance will be calculated using the aquifer and screen top and bottom, aquifer and screen hydraulic conductivity, and well and skin radius. The CUMULATIVE conductance equation is identical to the SKIN LOSSTYPE in the Multi-Node Well (MNW2) package for MODFLOW-2005. The program will terminate with an error condition if CONDEQN is SKIN or CUMULATIVE and the calculated saturated conductance is less than zero; if an error condition occurs, it is suggested that the THEIM or MEAN conductance equations be used for these multi-aquifer wells. | -| GWF | MAW | PACKAGEDATA | NGWFNODES | INTEGER | integer value that defines the number of GWF nodes connected to this (IFNO) multi-aquifer well. NGWFNODES must be greater than zero. | -| GWF | MAW | PACKAGEDATA | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each multi-aquifer well. The values of auxiliary variables must be present for each multi-aquifer well. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | MAW | PACKAGEDATA | BOUNDNAME | STRING | name of the multi-aquifer well cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | -| GWF | MAW | CONNECTIONDATA | IFNO | INTEGER | integer value that defines the feature (well) number associated with the specified CONNECTIONDATA data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. Multi-aquifer well connection information must be specified for every multi-aquifer well connection to the GWF model (NGWFNODES) or the program will terminate with an error. The program will also terminate with an error if connection information for a multi-aquifer well connection to the GWF model is specified more than once. | -| GWF | MAW | CONNECTIONDATA | ICON | INTEGER | integer value that defines the GWF connection number for this multi-aquifer well connection entry. ICONN must be greater than zero and less than or equal to NGWFNODES for multi-aquifer well IFNO. | -| GWF | MAW | CONNECTIONDATA | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. One or more screened intervals can be connected to the same CELLID if CONDEQN for a well is MEAN. The program will terminate with an error if MAW wells using SPECIFIED, THIEM, SKIN, or CUMULATIVE conductance equations have more than one connection to the same CELLID. | -| GWF | MAW | CONNECTIONDATA | SCRN_TOP | DOUBLE PRECISION | value that defines the top elevation of the screen for the multi-aquifer well connection. If CONDEQN is SPECIFIED, THIEM, SKIN, or COMPOSITE, SCRN\_TOP can be any value and is set to the top of the cell. If CONDEQN is MEAN, SCRN\_TOP is set to the multi-aquifer well connection cell top if the specified value is greater than the cell top. The program will terminate with an error if the screen top is less than the screen bottom. | -| GWF | MAW | CONNECTIONDATA | SCRN_BOT | DOUBLE PRECISION | value that defines the bottom elevation of the screen for the multi-aquifer well connection. If CONDEQN is SPECIFIED, THIEM, SKIN, or COMPOSITE, SCRN\_BOT can be any value and is set to the bottom of the cell. If CONDEQN is MEAN, SCRN\_BOT is set to the multi-aquifer well connection cell bottom if the specified value is less than the cell bottom. The program will terminate with an error if the screen bottom is greater than the screen top. | -| GWF | MAW | CONNECTIONDATA | HK_SKIN | DOUBLE PRECISION | value that defines the skin (filter pack) hydraulic conductivity (if CONDEQN for the multi-aquifer well is SKIN, CUMULATIVE, or MEAN) or conductance (if CONDEQN for the multi-aquifer well is SPECIFIED) for each GWF node connected to the multi-aquifer well (NGWFNODES). If CONDEQN is SPECIFIED, HK\_SKIN must be greater than or equal to zero. HK\_SKIN can be any value if CONDEQN is THIEM. Otherwise, HK\_SKIN must be greater than zero. If CONDEQN is SKIN, the contrast between the cell transmissivity (the product of geometric mean horizontal hydraulic conductivity and the cell thickness) and the well transmissivity (the product of HK\_SKIN and the screen thicknesses) must be greater than one in node CELLID or the program will terminate with an error condition; if an error condition occurs, it is suggested that the HK\_SKIN be reduced to a value less than K11 and K22 in node CELLID or the THEIM or MEAN conductance equations be used for these multi-aquifer wells. | -| GWF | MAW | CONNECTIONDATA | RADIUS_SKIN | DOUBLE PRECISION | real value that defines the skin radius (filter pack radius) for the multi-aquifer well. RADIUS\_SKIN can be any value if CONDEQN is SPECIFIED or THIEM. If CONDEQN is SKIN, CUMULATIVE, or MEAN, the program will terminate with an error if RADIUS\_SKIN is less than or equal to the RADIUS for the multi-aquifer well. | -| GWF | MAW | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | MAW | PERIOD | IFNO | INTEGER | integer value that defines the well number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. | -| GWF | MAW | PERIOD | MAWSETTING | KEYSTRING | line of information that is parsed into a keyword and values. Keyword values that can be used to start the MAWSETTING string include: STATUS, FLOWING\_WELL, RATE, WELL\_HEAD, HEAD\_LIMIT, SHUT\_OFF, RATE\_SCALING, and AUXILIARY. | -| GWF | MAW | PERIOD | STATUS | STRING | keyword option to define well status. STATUS can be ACTIVE, INACTIVE, or CONSTANT. By default, STATUS is ACTIVE. | -| GWF | MAW | PERIOD | FLOWING_WELL | KEYWORD | keyword to indicate the well is a flowing well. The FLOWING\_WELL option can be used to simulate flowing wells when the simulated well head exceeds the specified drainage elevation. | -| GWF | MAW | PERIOD | FWELEV | DOUBLE PRECISION | elevation used to determine whether or not the well is flowing. | -| GWF | MAW | PERIOD | FWCOND | DOUBLE PRECISION | conductance used to calculate the discharge of a free flowing well. Flow occurs when the head in the well is above the well top elevation (FWELEV). | -| GWF | MAW | PERIOD | FWRLEN | DOUBLE PRECISION | length used to reduce the conductance of the flowing well. When the head in the well drops below the well top plus the reduction length, then the conductance is reduced. This reduction length can be used to improve the stability of simulations with flowing wells so that there is not an abrupt change in flowing well rates. | -| GWF | MAW | PERIOD | RATE | DOUBLE PRECISION | is the volumetric pumping rate for the multi-aquifer well. A positive value indicates recharge and a negative value indicates discharge (pumping). RATE only applies to active (STATUS is ACTIVE) multi-aquifer wells. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. By default, the RATE for each multi-aquifer well is zero. | -| GWF | MAW | PERIOD | WELL_HEAD | DOUBLE PRECISION | is the head in the multi-aquifer well. WELL\_HEAD is only applied to constant head (STATUS is CONSTANT) and inactive (STATUS is INACTIVE) multi-aquifer wells. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. The program will terminate with an error if WELL\_HEAD is less than the bottom of the well. | -| GWF | MAW | PERIOD | HEAD_LIMIT | STRING | is the limiting water level (head) in the well, which is the minimum of the well RATE or the well inflow rate from the aquifer. HEAD\_LIMIT can be applied to extraction wells (RATE $<$ 0) or injection wells (RATE $>$ 0). HEAD\_LIMIT can be deactivated by specifying the text string `OFF'. The HEAD\_LIMIT option is based on the HEAD\_LIMIT functionality available in the MNW2~\citep{konikow2009} package for MODFLOW-2005. The HEAD\_LIMIT option has been included to facilitate backward compatibility with previous versions of MODFLOW but use of the RATE\_SCALING option instead of the HEAD\_LIMIT option is recommended. By default, HEAD\_LIMIT is `OFF'. | -| GWF | MAW | PERIOD | SHUT_OFF | KEYWORD | keyword for activating well shut off capability. Subsequent values define the minimum and maximum pumping rate that a well must exceed to shutoff or reactivate a well, respectively, during a stress period. SHUT\_OFF is only applied to injection wells (RATE$<0$) and if HEAD\_LIMIT is specified (not set to `OFF'). If HEAD\_LIMIT is specified, SHUT\_OFF can be deactivated by specifying a minimum value equal to zero. The SHUT\_OFF option is based on the SHUT\_OFF functionality available in the MNW2~\citep{konikow2009} package for MODFLOW-2005. The SHUT\_OFF option has been included to facilitate backward compatibility with previous versions of MODFLOW but use of the RATE\_SCALING option instead of the SHUT\_OFF option is recommended. By default, SHUT\_OFF is not used. | -| GWF | MAW | PERIOD | MINRATE | DOUBLE PRECISION | is the minimum rate that a well must exceed to shutoff a well during a stress period. The well will shut down during a time step if the flow rate to the well from the aquifer is less than MINRATE. If a well is shut down during a time step, reactivation of the well cannot occur until the next time step to reduce oscillations. MINRATE must be less than maxrate. | -| GWF | MAW | PERIOD | MAXRATE | DOUBLE PRECISION | is the maximum rate that a well must exceed to reactivate a well during a stress period. The well will reactivate during a timestep if the well was shutdown during the previous time step and the flow rate to the well from the aquifer exceeds maxrate. Reactivation of the well cannot occur until the next time step if a well is shutdown to reduce oscillations. maxrate must be greater than MINRATE. | -| GWF | MAW | PERIOD | RATE_SCALING | KEYWORD | activate rate scaling. If RATE\_SCALING is specified, both PUMP\_ELEVATION and SCALING\_LENGTH must be specified. RATE\_SCALING cannot be used with HEAD\_LIMIT. RATE\_SCALING can be used for extraction or injection wells. For extraction wells, the extraction rate will start to decrease once the head in the well lowers to a level equal to the pump elevation plus the scaling length. If the head in the well drops below the pump elevation, then the extraction rate is calculated to be zero. For an injection well, the injection rate will begin to decrease once the head in the well rises above the specified pump elevation. If the head in the well rises above the pump elevation plus the scaling length, then the injection rate will be set to zero. | -| GWF | MAW | PERIOD | PUMP_ELEVATION | DOUBLE PRECISION | is the elevation of the multi-aquifer well pump (PUMP\_ELEVATION). PUMP\_ELEVATION should not be less than the bottom elevation (BOTTOM) of the multi-aquifer well. | -| GWF | MAW | PERIOD | SCALING_LENGTH | DOUBLE PRECISION | height above the pump elevation (SCALING\_LENGTH). If the simulated well head is below this elevation (pump elevation plus the scaling length), then the pumping rate is reduced. | -| GWF | MAW | PERIOD | AUXILIARY | KEYWORD | keyword for specifying auxiliary variable. | -| GWF | MAW | PERIOD | AUXNAME | STRING | name for the auxiliary variable to be assigned AUXVAL. AUXNAME must match one of the auxiliary variable names defined in the OPTIONS block. If AUXNAME does not match one of the auxiliary variable names defined in the OPTIONS block the data are ignored. | -| GWF | MAW | PERIOD | AUXVAL | DOUBLE PRECISION | value for the auxiliary variable. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | SFR | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | -| GWF | SFR | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of stream reach cells. | -| GWF | SFR | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of stream reach information will be written to the listing file immediately after it is read. | -| GWF | SFR | OPTIONS | PRINT_STAGE | KEYWORD | keyword to indicate that the list of stream reach stages will be printed to the listing file for every stress period in which ``HEAD PRINT'' is specified in Output Control. If there is no Output Control option and PRINT\_STAGE is specified, then stages are printed for the last time step of each stress period. | -| GWF | SFR | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of stream reach flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | -| GWF | SFR | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that stream reach flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWF | SFR | OPTIONS | STAGE | KEYWORD | keyword to specify that record corresponds to stage. | -| GWF | SFR | OPTIONS | STAGEFILE | STRING | name of the binary output file to write stage information. | -| GWF | SFR | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | -| GWF | SFR | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | -| GWF | SFR | OPTIONS | BUDGETFILE | STRING | name of the binary output file to write budget information. | -| GWF | SFR | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | -| GWF | SFR | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | -| GWF | SFR | OPTIONS | PACKAGE_CONVERGENCE | KEYWORD | keyword to specify that record corresponds to the package convergence comma spaced values file. | -| GWF | SFR | OPTIONS | PACKAGE_CONVERGENCE_FILENAME | STRING | name of the comma spaced values output file to write package convergence information. | -| GWF | SFR | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | -| GWF | SFR | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | SFR | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | -| GWF | SFR | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | -| GWF | SFR | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the SFR package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the SFR package. | -| GWF | SFR | OPTIONS | MOVER | KEYWORD | keyword to indicate that this instance of the SFR Package can be used with the Water Mover (MVR) Package. When the MOVER option is specified, additional memory is allocated within the package to store the available, provided, and received water. | -| GWF | SFR | OPTIONS | MAXIMUM_PICARD_ITERATIONS | INTEGER | integer value that defines the maximum number of Streamflow Routing picard iterations allowed when solving for reach stages and flows as part of the GWF formulate step. Picard iterations are used to minimize differences in SFR package results between subsequent GWF picard (non-linear) iterations as a result of non-optimal reach numbering. If reaches are numbered in order, from upstream to downstream, MAXIMUM\_PICARD\_ITERATIONS can be set to 1 to reduce model run time. By default, MAXIMUM\_PICARD\_ITERATIONS is equal to 100. | -| GWF | SFR | OPTIONS | MAXIMUM_ITERATIONS | INTEGER | integer value that defines the maximum number of Streamflow Routing Newton-Raphson iterations allowed for a reach. By default, MAXIMUM\_ITERATIONS is equal to 100. MAXIMUM\_ITERATIONS would only need to be increased from the default value if one or more reach in a simulation has a large water budget error. | -| GWF | SFR | OPTIONS | MAXIMUM_DEPTH_CHANGE | DOUBLE PRECISION | real value that defines the depth closure tolerance. By default, MAXIMUM\_DEPTH\_CHANGE is equal to $1 \times 10^{-5}$. The MAXIMUM\_STAGE\_CHANGE would only need to be increased or decreased from the default value if the water budget error for one or more reach is too small or too large, respectively. | -| GWF | SFR | OPTIONS | UNIT_CONVERSION | DOUBLE PRECISION | real value that is used to convert user-specified Manning's roughness coefficients from seconds per meters$^{1/3}$ to model length and time units. A constant of 1.486 is used for flow units of cubic feet per second, and a constant of 1.0 is used for units of cubic meters per second. The constant must be multiplied by 86,400 when using time units of days in the simulation. | -| GWF | SFR | OPTIONS | LENGTH_CONVERSION | DOUBLE PRECISION | real value that is used to convert user-specified Manning's roughness coefficients from meters to model length units. LENGTH\_CONVERSION should be set to 3.28081, 1.0, and 100.0 when using length units (LENGTH\_UNITS) of feet, meters, or centimeters in the simulation, respectively. LENGTH\_CONVERSION does not need to be specified if LENGTH\_UNITS are meters. | -| GWF | SFR | OPTIONS | TIME_CONVERSION | DOUBLE PRECISION | real value that is used to convert user-specified Manning's roughness coefficients from seconds to model time units. TIME\_CONVERSION should be set to 1.0, 60.0, 3,600.0, 86,400.0, and 31,557,600.0 when using time units (TIME\_UNITS) of seconds, minutes, hours, days, or years in the simulation, respectively. TIME\_CONVERSION does not need to be specified if TIME\_UNITS are seconds. | -| GWF | SFR | DIMENSIONS | NREACHES | INTEGER | integer value specifying the number of stream reaches. There must be NREACHES entries in the PACKAGEDATA block. | -| GWF | SFR | PACKAGEDATA | IFNO | INTEGER | integer value that defines the feature (reach) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if information for a reach is specified more than once. | -| GWF | SFR | PACKAGEDATA | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. For reaches that are not connected to an underlying GWF cell, a zero should be specified for each grid dimension. For example, for a DIS grid a CELLID of 0 0 0 should be specified. Reach-aquifer flow is not calculated for unconnected reaches. The keyword NONE can be still be specified to identify unconnected reaches for backward compatibility with previous versions of MODFLOW 6 but eventually NONE will be deprecated and will cause MODFLOW 6 to terminate with an error. | -| GWF | SFR | PACKAGEDATA | RLEN | DOUBLE PRECISION | real value that defines the reach length. RLEN must be greater than zero. | -| GWF | SFR | PACKAGEDATA | RWID | DOUBLE PRECISION | real value that defines the reach width. RWID must be greater than zero. | -| GWF | SFR | PACKAGEDATA | RGRD | DOUBLE PRECISION | real value that defines the stream gradient (slope) across the reach. RGRD must be greater than zero. | -| GWF | SFR | PACKAGEDATA | RTP | DOUBLE PRECISION | real value that defines the bottom elevation of the reach. | -| GWF | SFR | PACKAGEDATA | RBTH | DOUBLE PRECISION | real value that defines the thickness of the reach streambed. RBTH can be any value if the reach is not connected to an underlying GWF cell. Otherwise, RBTH must be greater than zero. | -| GWF | SFR | PACKAGEDATA | RHK | DOUBLE PRECISION | real value that defines the hydraulic conductivity of the reach streambed. RHK can be any positive value if the reach is not connected to an underlying GWF cell. Otherwise, RHK must be greater than zero. | -| GWF | SFR | PACKAGEDATA | MAN | STRING | real or character value that defines the Manning's roughness coefficient for the reach. MAN must be greater than zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | SFR | PACKAGEDATA | NCON | INTEGER | integer value that defines the number of reaches connected to the reach. If a value of zero is specified for NCON an entry for IFNO is still required in the subsequent CONNECTIONDATA block. | -| GWF | SFR | PACKAGEDATA | USTRF | DOUBLE PRECISION | real value that defines the fraction of upstream flow from each upstream reach that is applied as upstream inflow to the reach. The sum of all USTRF values for all reaches connected to the same upstream reach must be equal to one and USTRF must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | SFR | PACKAGEDATA | NDV | INTEGER | integer value that defines the number of downstream diversions for the reach. | -| GWF | SFR | PACKAGEDATA | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each stream reach. The values of auxiliary variables must be present for each stream reach. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | SFR | PACKAGEDATA | BOUNDNAME | STRING | name of the stream reach cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | -| GWF | SFR | CROSSSECTIONS | IFNO | INTEGER | integer value that defines the feature (reach) number associated with the specified cross-section table file on the line. IFNO must be greater than zero and less than or equal to NREACHES. The program will also terminate with an error if table information for a reach is specified more than once. | -| GWF | SFR | CROSSSECTIONS | TAB6 | KEYWORD | keyword to specify that record corresponds to a cross-section table file. | -| GWF | SFR | CROSSSECTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | SFR | CROSSSECTIONS | TAB6_FILENAME | STRING | character string that defines the path and filename for the file containing cross-section table data for the reach. The TAB6\_FILENAME file includes the number of entries in the file and the station elevation data in terms of the fractional width and the reach depth. Instructions for creating the TAB6\_FILENAME input file are provided in SFR Reach Cross-Section Table Input File section. | -| GWF | SFR | CONNECTIONDATA | IFNO | INTEGER | integer value that defines the feature (reach) number associated with the specified CONNECTIONDATA data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach connection information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if connection information for a reach is specified more than once. | -| GWF | SFR | CONNECTIONDATA | IC | INTEGER (NCON(IFNO)) | integer value that defines the reach number of the reach connected to the current reach and whether it is connected to the upstream or downstream end of the reach. Negative IC numbers indicate connected reaches are connected to the downstream end of the current reach. Positive IC numbers indicate connected reaches are connected to the upstream end of the current reach. The absolute value of IC must be greater than zero and less than or equal to NREACHES. IC should not be specified when NCON is zero but must be specified otherwise. | -| GWF | SFR | DIVERSIONS | IFNO | INTEGER | integer value that defines the feature (reach) number associated with the specified DIVERSIONS data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach diversion information must be specified for every reach with a NDV value greater than 0 or the program will terminate with an error. The program will also terminate with an error if diversion information for a given reach diversion is specified more than once. | -| GWF | SFR | DIVERSIONS | IDV | INTEGER | integer value that defines the downstream diversion number for the diversion for reach IFNO. IDV must be greater than zero and less than or equal to NDV for reach IFNO. | -| GWF | SFR | DIVERSIONS | ICONR | INTEGER | integer value that defines the downstream reach that will receive the diverted water. IDV must be greater than zero and less than or equal to NREACHES. Furthermore, reach ICONR must be a downstream connection for reach IFNO. | -| GWF | SFR | DIVERSIONS | CPRIOR | STRING | character string value that defines the the prioritization system for the diversion, such as when insufficient water is available to meet all diversion stipulations, and is used in conjunction with the value of FLOW value specified in the STRESS\_PERIOD\_DATA section. Available diversion options include: (1) CPRIOR = `FRACTION', then the amount of the diversion is computed as a fraction of the streamflow leaving reach IFNO ($Q_{DS}$); in this case, 0.0 $\le$ DIVFLOW $\le$ 1.0. (2) CPRIOR = `EXCESS', a diversion is made only if $Q_{DS}$ for reach IFNO exceeds the value of DIVFLOW. If this occurs, then the quantity of water diverted is the excess flow ($Q_{DS} -$ DIVFLOW) and $Q_{DS}$ from reach IFNO is set equal to DIVFLOW. This represents a flood-control type of diversion, as described by Danskin and Hanson (2002). (3) CPRIOR = `THRESHOLD', then if $Q_{DS}$ in reach IFNO is less than the specified diversion flow DIVFLOW, no water is diverted from reach IFNO. If $Q_{DS}$ in reach IFNO is greater than or equal to DIVFLOW, DIVFLOW is diverted and $Q_{DS}$ is set to the remainder ($Q_{DS} -$ DIVFLOW)). This approach assumes that once flow in the stream is sufficiently low, diversions from the stream cease, and is the `priority' algorithm that originally was programmed into the STR1 Package (Prudic, 1989). (4) CPRIOR = `UPTO' -- if $Q_{DS}$ in reach IFNO is greater than or equal to the specified diversion flow DIVFLOW, $Q_{DS}$ is reduced by DIVFLOW. If $Q_{DS}$ in reach IFNO is less than DIVFLOW, DIVFLOW is set to $Q_{DS}$ and there will be no flow available for reaches connected to downstream end of reach IFNO. | -| GWF | SFR | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | SFR | PERIOD | IFNO | INTEGER | integer value that defines the feature (reach) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NREACHES. | -| GWF | SFR | PERIOD | SFRSETTING | KEYSTRING | line of information that is parsed into a keyword and values. Keyword values that can be used to start the SFRSETTING string include: STATUS, MANNING, STAGE, INFLOW, RAINFALL, EVAPORATION, RUNOFF, DIVERSION, UPSTREAM\_FRACTION, and AUXILIARY. | -| GWF | SFR | PERIOD | STATUS | STRING | keyword option to define stream reach status. STATUS can be ACTIVE, INACTIVE, or SIMPLE. The SIMPLE STATUS option simulates streamflow using a user-specified stage for a reach or a stage set to the top of the reach (depth = 0). In cases where the simulated leakage calculated using the specified stage exceeds the sum of inflows to the reach, the stage is set to the top of the reach and leakage is set equal to the sum of inflows. Upstream fractions should be changed using the UPSTREAM\_FRACTION SFRSETTING if the status for one or more reaches is changed to ACTIVE or INACTIVE. For example, if one of two downstream connections for a reach is inactivated, the upstream fraction for the active and inactive downstream reach should be changed to 1.0 and 0.0, respectively, to ensure that the active reach receives all of the downstream outflow from the upstream reach. By default, STATUS is ACTIVE. | -| GWF | SFR | PERIOD | MANNING | STRING | real or character value that defines the Manning's roughness coefficient for the reach. MANNING must be greater than zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | SFR | PERIOD | STAGE | STRING | real or character value that defines the stage for the reach. The specified STAGE is only applied if the reach uses the simple routing option. If STAGE is not specified for reaches that use the simple routing option, the specified stage is set to the top of the reach. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | SFR | PERIOD | INFLOW | STRING | real or character value that defines the volumetric inflow rate for the streamflow routing reach. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. By default, inflow rates are zero for each reach. | -| GWF | SFR | PERIOD | RAINFALL | STRING | real or character value that defines the volumetric rate per unit area of water added by precipitation directly on the streamflow routing reach. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. By default, rainfall rates are zero for each reach. | -| GWF | SFR | PERIOD | EVAPORATION | STRING | real or character value that defines the volumetric rate per unit area of water subtracted by evaporation from the streamflow routing reach. A positive evaporation rate should be provided. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. If the volumetric evaporation rate for a reach exceeds the sources of water to the reach (upstream and specified inflows, rainfall, and runoff but excluding groundwater leakage into the reach) the volumetric evaporation rate is limited to the sources of water to the reach. By default, evaporation rates are zero for each reach. | -| GWF | SFR | PERIOD | RUNOFF | STRING | real or character value that defines the volumetric rate of diffuse overland runoff that enters the streamflow routing reach. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. If the volumetric runoff rate for a reach is negative and exceeds inflows to the reach (upstream and specified inflows, and rainfall but excluding groundwater leakage into the reach) the volumetric runoff rate is limited to inflows to the reach and the volumetric evaporation rate for the reach is set to zero. By default, runoff rates are zero for each reach. | -| GWF | SFR | PERIOD | DIVERSION | KEYWORD | keyword to indicate diversion record. | -| GWF | SFR | PERIOD | IDV | INTEGER | an integer value specifying which diversion of reach IFNO that DIVFLOW is being specified for. Must be less or equal to ndv for the current reach (IFNO). | -| GWF | SFR | PERIOD | DIVFLOW | DOUBLE PRECISION | real or character value that defines the volumetric diversion (DIVFLOW) rate for the streamflow routing reach. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | SFR | PERIOD | UPSTREAM_FRACTION | DOUBLE PRECISION | real value that defines the fraction of upstream flow (USTRF) from each upstream reach that is applied as upstream inflow to the reach. The sum of all USTRF values for all reaches connected to the same upstream reach must be equal to one. | -| GWF | SFR | PERIOD | CROSS_SECTION | KEYWORD | keyword to specify that record corresponds to a reach cross-section. | -| GWF | SFR | PERIOD | TAB6 | KEYWORD | keyword to specify that record corresponds to a cross-section table file. | -| GWF | SFR | PERIOD | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | SFR | PERIOD | TAB6_FILENAME | STRING | character string that defines the path and filename for the file containing cross-section table data for the reach. The TAB6\_FILENAME file includes the number of entries in the file and the station elevation data in terms of the fractional width and the reach depth. Instructions for creating the TAB6\_FILENAME input file are provided in SFR Reach Cross-Section Table Input File section. | -| GWF | SFR | PERIOD | AUXILIARY | KEYWORD | keyword for specifying auxiliary variable. | -| GWF | SFR | PERIOD | AUXNAME | STRING | name for the auxiliary variable to be assigned AUXVAL. AUXNAME must match one of the auxiliary variable names defined in the OPTIONS block. If AUXNAME does not match one of the auxiliary variable names defined in the OPTIONS block the data are ignored. | -| GWF | SFR | PERIOD | AUXVAL | DOUBLE PRECISION | value for the auxiliary variable. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | LAK | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | -| GWF | LAK | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of lake cells. | -| GWF | LAK | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of lake information will be written to the listing file immediately after it is read. | -| GWF | LAK | OPTIONS | PRINT_STAGE | KEYWORD | keyword to indicate that the list of lake stages will be printed to the listing file for every stress period in which ``HEAD PRINT'' is specified in Output Control. If there is no Output Control option and PRINT\_STAGE is specified, then stages are printed for the last time step of each stress period. | -| GWF | LAK | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of lake flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | -| GWF | LAK | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that lake flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWF | LAK | OPTIONS | STAGE | KEYWORD | keyword to specify that record corresponds to stage. | -| GWF | LAK | OPTIONS | STAGEFILE | STRING | name of the binary output file to write stage information. | -| GWF | LAK | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | -| GWF | LAK | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | -| GWF | LAK | OPTIONS | BUDGETFILE | STRING | name of the binary output file to write budget information. | -| GWF | LAK | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | -| GWF | LAK | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | -| GWF | LAK | OPTIONS | PACKAGE_CONVERGENCE | KEYWORD | keyword to specify that record corresponds to the package convergence comma spaced values file. | -| GWF | LAK | OPTIONS | PACKAGE_CONVERGENCE_FILENAME | STRING | name of the comma spaced values output file to write package convergence information. | -| GWF | LAK | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | -| GWF | LAK | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | LAK | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | -| GWF | LAK | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | -| GWF | LAK | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the LAK package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the LAK package. | -| GWF | LAK | OPTIONS | MOVER | KEYWORD | keyword to indicate that this instance of the LAK Package can be used with the Water Mover (MVR) Package. When the MOVER option is specified, additional memory is allocated within the package to store the available, provided, and received water. | -| GWF | LAK | OPTIONS | SURFDEP | DOUBLE PRECISION | real value that defines the surface depression depth for VERTICAL lake-GWF connections. If specified, SURFDEP must be greater than or equal to zero. If SURFDEP is not specified, a default value of zero is used for all vertical lake-GWF connections. | -| GWF | LAK | OPTIONS | MAXIMUM_ITERATIONS | INTEGER | integer value that defines the maximum number of Newton-Raphson iterations allowed for a lake. By default, MAXIMUM\_ITERATIONS is equal to 100. MAXIMUM\_ITERATIONS would only need to be increased from the default value if one or more lakes in a simulation has a large water budget error. | -| GWF | LAK | OPTIONS | MAXIMUM_STAGE_CHANGE | DOUBLE PRECISION | real value that defines the lake stage closure tolerance. By default, MAXIMUM\_STAGE\_CHANGE is equal to $1 \times 10^{-5}$. The MAXIMUM\_STAGE\_CHANGE would only need to be increased or decreased from the default value if the water budget error for one or more lakes is too small or too large, respectively. | -| GWF | LAK | OPTIONS | TIME_CONVERSION | DOUBLE PRECISION | real value that is used to convert user-specified Manning's roughness coefficients or gravitational acceleration used to calculate outlet flows from seconds to model time units. TIME\_CONVERSION should be set to 1.0, 60.0, 3,600.0, 86,400.0, and 31,557,600.0 when using time units (TIME\_UNITS) of seconds, minutes, hours, days, or years in the simulation, respectively. CONVTIME does not need to be specified if no lake outlets are specified or TIME\_UNITS are seconds. | -| GWF | LAK | OPTIONS | LENGTH_CONVERSION | DOUBLE PRECISION | real value that is used to convert outlet user-specified Manning's roughness coefficients or gravitational acceleration used to calculate outlet flows from meters to model length units. LENGTH\_CONVERSION should be set to 3.28081, 1.0, and 100.0 when using length units (LENGTH\_UNITS) of feet, meters, or centimeters in the simulation, respectively. LENGTH\_CONVERSION does not need to be specified if no lake outlets are specified or LENGTH\_UNITS are meters. | -| GWF | LAK | DIMENSIONS | NLAKES | INTEGER | value specifying the number of lakes that will be simulated for all stress periods. | -| GWF | LAK | DIMENSIONS | NOUTLETS | INTEGER | value specifying the number of outlets that will be simulated for all stress periods. If NOUTLETS is not specified, a default value of zero is used. | -| GWF | LAK | DIMENSIONS | NTABLES | INTEGER | value specifying the number of lakes tables that will be used to define the lake stage, volume relation, and surface area. If NTABLES is not specified, a default value of zero is used. | -| GWF | LAK | PACKAGEDATA | IFNO | INTEGER | integer value that defines the feature (lake) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once. | -| GWF | LAK | PACKAGEDATA | STRT | DOUBLE PRECISION | real value that defines the starting stage for the lake. | -| GWF | LAK | PACKAGEDATA | NLAKECONN | INTEGER | integer value that defines the number of GWF cells connected to this (IFNO) lake. There can only be one vertical lake connection to each GWF cell. NLAKECONN must be greater than zero. | -| GWF | LAK | PACKAGEDATA | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each lake. The values of auxiliary variables must be present for each lake. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | LAK | PACKAGEDATA | BOUNDNAME | STRING | name of the lake cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | -| GWF | LAK | CONNECTIONDATA | IFNO | INTEGER | integer value that defines the feature (lake) number associated with the specified CONNECTIONDATA data on the line. IFNO must be greater than zero and less than or equal to NLAKES. Lake connection information must be specified for every lake connection to the GWF model (NLAKECONN) or the program will terminate with an error. The program will also terminate with an error if connection information for a lake connection to the GWF model is specified more than once. | -| GWF | LAK | CONNECTIONDATA | ICONN | INTEGER | integer value that defines the GWF connection number for this lake connection entry. ICONN must be greater than zero and less than or equal to NLAKECONN for lake IFNO. | -| GWF | LAK | CONNECTIONDATA | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | -| GWF | LAK | CONNECTIONDATA | CLAKTYPE | STRING | character string that defines the lake-GWF connection type for the lake connection. Possible lake-GWF connection type strings include: VERTICAL--character keyword to indicate the lake-GWF connection is vertical and connection conductance calculations use the hydraulic conductivity corresponding to the $K_{33}$ tensor component defined for CELLID in the NPF package. HORIZONTAL--character keyword to indicate the lake-GWF connection is horizontal and connection conductance calculations use the hydraulic conductivity corresponding to the $K_{11}$ tensor component defined for CELLID in the NPF package. EMBEDDEDH--character keyword to indicate the lake-GWF connection is embedded in a single cell and connection conductance calculations use the hydraulic conductivity corresponding to the $K_{11}$ tensor component defined for CELLID in the NPF package. EMBEDDEDV--character keyword to indicate the lake-GWF connection is embedded in a single cell and connection conductance calculations use the hydraulic conductivity corresponding to the $K_{33}$ tensor component defined for CELLID in the NPF package. Embedded lakes can only be connected to a single cell (NLAKECONN = 1) and there must be a lake table associated with each embedded lake. | -| GWF | LAK | CONNECTIONDATA | BEDLEAK | STRING | real value or character string that defines the bed leakance for the lake-GWF connection. BEDLEAK must be greater than or equal to zero, equal to the DNODATA value (3.0E+30), or specified to be NONE. If DNODATA or NONE is specified for BEDLEAK, the lake-GWF connection conductance is solely a function of aquifer properties in the connected GWF cell and lakebed sediments are assumed to be absent. Warning messages will be issued if NONE is specified. Eventually the ability to specify NONE will be deprecated and cause MODFLOW 6 to terminate with an error. | -| GWF | LAK | CONNECTIONDATA | BELEV | DOUBLE PRECISION | real value that defines the bottom elevation for a HORIZONTAL lake-GWF connection. Any value can be specified if CLAKTYPE is VERTICAL, EMBEDDEDH, or EMBEDDEDV. If CLAKTYPE is HORIZONTAL and BELEV is not equal to TELEV, BELEV must be greater than or equal to the bottom of the GWF cell CELLID. If BELEV is equal to TELEV, BELEV is reset to the bottom of the GWF cell CELLID. | -| GWF | LAK | CONNECTIONDATA | TELEV | DOUBLE PRECISION | real value that defines the top elevation for a HORIZONTAL lake-GWF connection. Any value can be specified if CLAKTYPE is VERTICAL, EMBEDDEDH, or EMBEDDEDV. If CLAKTYPE is HORIZONTAL and TELEV is not equal to BELEV, TELEV must be less than or equal to the top of the GWF cell CELLID. If TELEV is equal to BELEV, TELEV is reset to the top of the GWF cell CELLID. | -| GWF | LAK | CONNECTIONDATA | CONNLEN | DOUBLE PRECISION | real value that defines the distance between the connected GWF CELLID node and the lake for a HORIZONTAL, EMBEDDEDH, or EMBEDDEDV lake-GWF connection. CONLENN must be greater than zero for a HORIZONTAL, EMBEDDEDH, or EMBEDDEDV lake-GWF connection. Any value can be specified if CLAKTYPE is VERTICAL. | -| GWF | LAK | CONNECTIONDATA | CONNWIDTH | DOUBLE PRECISION | real value that defines the connection face width for a HORIZONTAL lake-GWF connection. CONNWIDTH must be greater than zero for a HORIZONTAL lake-GWF connection. Any value can be specified if CLAKTYPE is VERTICAL, EMBEDDEDH, or EMBEDDEDV. | -| GWF | LAK | TABLES | IFNO | INTEGER | integer value that defines the feature (lake) number associated with the specified TABLES data on the line. IFNO must be greater than zero and less than or equal to NLAKES. The program will terminate with an error if table information for a lake is specified more than once or the number of specified tables is less than NTABLES. | -| GWF | LAK | TABLES | TAB6 | KEYWORD | keyword to specify that record corresponds to a table file. | -| GWF | LAK | TABLES | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | LAK | TABLES | TAB6_FILENAME | STRING | character string that defines the path and filename for the file containing lake table data for the lake connection. The TAB6\_FILENAME file includes the number of entries in the file and the relation between stage, volume, and surface area for each entry in the file. Lake table files for EMBEDDEDH and EMBEDDEDV lake-GWF connections also include lake-GWF exchange area data for each entry in the file. Instructions for creating the TAB6\_FILENAME input file are provided in Lake Table Input File section. | -| GWF | LAK | OUTLETS | OUTLETNO | INTEGER | integer value that defines the outlet number associated with the specified OUTLETS data on the line. OUTLETNO must be greater than zero and less than or equal to NOUTLETS. Outlet information must be specified for every outlet or the program will terminate with an error. The program will also terminate with an error if information for a outlet is specified more than once. | -| GWF | LAK | OUTLETS | LAKEIN | INTEGER | integer value that defines the lake number that outlet is connected to. LAKEIN must be greater than zero and less than or equal to NLAKES. | -| GWF | LAK | OUTLETS | LAKEOUT | INTEGER | integer value that defines the lake number that outlet discharge from lake outlet OUTLETNO is routed to. LAKEOUT must be greater than or equal to zero and less than or equal to NLAKES. If LAKEOUT is zero, outlet discharge from lake outlet OUTLETNO is discharged to an external boundary. | -| GWF | LAK | OUTLETS | COUTTYPE | STRING | character string that defines the outlet type for the outlet OUTLETNO. Possible COUTTYPE strings include: SPECIFIED--character keyword to indicate the outlet is defined as a specified flow. MANNING--character keyword to indicate the outlet is defined using Manning's equation. WEIR--character keyword to indicate the outlet is defined using a sharp weir equation. | -| GWF | LAK | OUTLETS | INVERT | DOUBLE PRECISION | real value that defines the invert elevation for the lake outlet. Any value can be specified if COUTTYPE is SPECIFIED. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | LAK | OUTLETS | WIDTH | DOUBLE PRECISION | real value that defines the width of the lake outlet. Any value can be specified if COUTTYPE is SPECIFIED. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | LAK | OUTLETS | ROUGH | DOUBLE PRECISION | real value that defines the roughness coefficient for the lake outlet. Any value can be specified if COUTTYPE is not MANNING. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | LAK | OUTLETS | SLOPE | DOUBLE PRECISION | real value that defines the bed slope for the lake outlet. Any value can be specified if COUTTYPE is not MANNING. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | LAK | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | LAK | PERIOD | NUMBER | INTEGER | integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. | -| GWF | LAK | PERIOD | LAKSETTING | KEYSTRING | line of information that is parsed into a keyword and values. Keyword values that can be used to start the LAKSETTING string include both keywords for lake settings and keywords for outlet settings. Keywords for lake settings include: STATUS, STAGE, RAINFALL, EVAPORATION, RUNOFF, INFLOW, WITHDRAWAL, and AUXILIARY. Keywords for outlet settings include RATE, INVERT, WIDTH, SLOPE, and ROUGH. | -| GWF | LAK | PERIOD | STATUS | STRING | keyword option to define lake status. STATUS can be ACTIVE, INACTIVE, or CONSTANT. By default, STATUS is ACTIVE. | -| GWF | LAK | PERIOD | STAGE | STRING | real or character value that defines the stage for the lake. The specified STAGE is only applied if the lake is a constant stage lake. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | LAK | PERIOD | RAINFALL | STRING | real or character value that defines the rainfall rate $(LT^{-1})$ for the lake. Value must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | LAK | PERIOD | EVAPORATION | STRING | real or character value that defines the maximum evaporation rate $(LT^{-1})$ for the lake. Value must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | LAK | PERIOD | RUNOFF | STRING | real or character value that defines the runoff rate $(L^3 T^{-1})$ for the lake. Value must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | LAK | PERIOD | INFLOW | STRING | real or character value that defines the volumetric inflow rate $(L^3 T^{-1})$ for the lake. Value must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. By default, inflow rates are zero for each lake. | -| GWF | LAK | PERIOD | WITHDRAWAL | STRING | real or character value that defines the maximum withdrawal rate $(L^3 T^{-1})$ for the lake. Value must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | LAK | PERIOD | RATE | STRING | real or character value that defines the extraction rate for the lake outflow. A positive value indicates inflow and a negative value indicates outflow from the lake. RATE only applies to outlets associated with active lakes (STATUS is ACTIVE). A specified RATE is only applied if COUTTYPE for the OUTLETNO is SPECIFIED. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. By default, the RATE for each SPECIFIED lake outlet is zero. | -| GWF | LAK | PERIOD | INVERT | STRING | real or character value that defines the invert elevation for the lake outlet. A specified INVERT value is only used for active lakes if COUTTYPE for lake outlet OUTLETNO is not SPECIFIED. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | LAK | PERIOD | ROUGH | STRING | real value that defines the roughness coefficient for the lake outlet. Any value can be specified if COUTTYPE is not MANNING. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | LAK | PERIOD | WIDTH | STRING | real or character value that defines the width of the lake outlet. A specified WIDTH value is only used for active lakes if COUTTYPE for lake outlet OUTLETNO is not SPECIFIED. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | LAK | PERIOD | SLOPE | STRING | real or character value that defines the bed slope for the lake outlet. A specified SLOPE value is only used for active lakes if COUTTYPE for lake outlet OUTLETNO is MANNING. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | LAK | PERIOD | AUXILIARY | KEYWORD | keyword for specifying auxiliary variable. | -| GWF | LAK | PERIOD | AUXNAME | STRING | name for the auxiliary variable to be assigned AUXVAL. AUXNAME must match one of the auxiliary variable names defined in the OPTIONS block. If AUXNAME does not match one of the auxiliary variable names defined in the OPTIONS block the data are ignored. | -| GWF | LAK | PERIOD | AUXVAL | DOUBLE PRECISION | value for the auxiliary variable. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | UZF | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | -| GWF | UZF | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of GWF cell area used by UZF cell. | -| GWF | UZF | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of UZF cells. | -| GWF | UZF | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of UZF information will be written to the listing file immediately after it is read. | -| GWF | UZF | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of UZF flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | -| GWF | UZF | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that UZF flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWF | UZF | OPTIONS | WATER_CONTENT | KEYWORD | keyword to specify that record corresponds to unsaturated zone water contents. | -| GWF | UZF | OPTIONS | WCFILE | STRING | name of the binary output file to write water content information. | -| GWF | UZF | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | -| GWF | UZF | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | -| GWF | UZF | OPTIONS | BUDGETFILE | STRING | name of the binary output file to write budget information. | -| GWF | UZF | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | -| GWF | UZF | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | -| GWF | UZF | OPTIONS | PACKAGE_CONVERGENCE | KEYWORD | keyword to specify that record corresponds to the package convergence comma spaced values file. | -| GWF | UZF | OPTIONS | PACKAGE_CONVERGENCE_FILENAME | STRING | name of the comma spaced values output file to write package convergence information. | -| GWF | UZF | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | -| GWF | UZF | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| GWF | UZF | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | -| GWF | UZF | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | -| GWF | UZF | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the UZF package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the UZF package. | -| GWF | UZF | OPTIONS | MOVER | KEYWORD | keyword to indicate that this instance of the UZF Package can be used with the Water Mover (MVR) Package. When the MOVER option is specified, additional memory is allocated within the package to store the available, provided, and received water. | -| GWF | UZF | OPTIONS | SIMULATE_ET | KEYWORD | keyword specifying that ET in the unsaturated (UZF) and saturated zones (GWF) will be simulated. ET can be simulated in the UZF cell and not the GWF cell by omitting keywords LINEAR\_GWET and SQUARE\_GWET. | -| GWF | UZF | OPTIONS | LINEAR_GWET | KEYWORD | keyword specifying that groundwater ET will be simulated using the original ET formulation of MODFLOW-2005. | -| GWF | UZF | OPTIONS | SQUARE_GWET | KEYWORD | keyword specifying that groundwater ET will be simulated by assuming a constant ET rate for groundwater levels between land surface (TOP) and land surface minus the ET extinction depth (TOP-EXTDP). Groundwater ET is smoothly reduced from the PET rate to zero over a nominal interval at TOP-EXTDP. | -| GWF | UZF | OPTIONS | SIMULATE_GWSEEP | KEYWORD | keyword specifying that groundwater discharge (GWSEEP) to land surface will be simulated. Groundwater discharge is nonzero when groundwater head is greater than land surface. This option is no longer recommended; a better approach is to use the Drain Package with discharge scaling as a way to handle seepage to land surface. The Drain Package with discharge scaling is described in Chapter 3 of the Supplemental Technical Information. | -| GWF | UZF | OPTIONS | UNSAT_ETWC | KEYWORD | keyword specifying that ET in the unsaturated zone will be simulated as a function of the specified PET rate while the water content (THETA) is greater than the ET extinction water content (EXTWC). | -| GWF | UZF | OPTIONS | UNSAT_ETAE | KEYWORD | keyword specifying that ET in the unsaturated zone will be simulated using a capillary pressure based formulation. Capillary pressure is calculated using the Brooks-Corey retention function. | -| GWF | UZF | DIMENSIONS | NUZFCELLS | INTEGER | is the number of UZF cells. More than one UZF cell can be assigned to a GWF cell; however, only one GWF cell can be assigned to a single UZF cell. If more than one UZF cell is assigned to a GWF cell, then an auxiliary variable should be used to reduce the surface area of the UZF cell with the AUXMULTNAME option. | -| GWF | UZF | DIMENSIONS | NTRAILWAVES | INTEGER | is the number of trailing waves. A recommended value of 7 can be used for NTRAILWAVES. This value can be increased to lower mass balance error in the unsaturated zone. | -| GWF | UZF | DIMENSIONS | NWAVESETS | INTEGER | is the number of wave sets. A recommended value of 40 can be used for NWAVESETS. This value can be increased if more waves are required to resolve variations in water content within the unsaturated zone. | -| GWF | UZF | PACKAGEDATA | IFNO | INTEGER | integer value that defines the feature (UZF object) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NUZFCELLS. UZF information must be specified for every UZF cell or the program will terminate with an error. The program will also terminate with an error if information for a UZF cell is specified more than once. | -| GWF | UZF | PACKAGEDATA | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | -| GWF | UZF | PACKAGEDATA | LANDFLAG | INTEGER | integer value set to one for land surface cells indicating that boundary conditions can be applied and data can be specified in the PERIOD block. A value of 0 specifies a non-land surface cell. | -| GWF | UZF | PACKAGEDATA | IVERTCON | INTEGER | integer value set to specify underlying UZF cell that receives water flowing to bottom of cell. If unsaturated zone flow reaches the water table before the cell bottom, then water is added to the GWF cell instead of flowing to the underlying UZF cell. A value of 0 indicates the UZF cell is not connected to an underlying UZF cell. | -| GWF | UZF | PACKAGEDATA | SURFDEP | DOUBLE PRECISION | is the surface depression depth of the UZF cell. | -| GWF | UZF | PACKAGEDATA | VKS | DOUBLE PRECISION | is the saturated vertical hydraulic conductivity of the UZF cell. This value is used with the Brooks-Corey function and the simulated water content to calculate the partially saturated hydraulic conductivity. | -| GWF | UZF | PACKAGEDATA | THTR | DOUBLE PRECISION | is the residual (irreducible) water content of the UZF cell. This residual water is not available to plants and will not drain into underlying aquifer cells. | -| GWF | UZF | PACKAGEDATA | THTS | DOUBLE PRECISION | is the saturated water content of the UZF cell. The values for saturated and residual water content should be set in a manner that is consistent with the specific yield value specified in the Storage Package. The saturated water content must be greater than the residual content. | -| GWF | UZF | PACKAGEDATA | THTI | DOUBLE PRECISION | is the initial water content of the UZF cell. The value must be greater than or equal to the residual water content and less than or equal to the saturated water content. | -| GWF | UZF | PACKAGEDATA | EPS | DOUBLE PRECISION | is the exponent used in the Brooks-Corey function. The Brooks-Corey function is used by UZF to calculated hydraulic conductivity under partially saturated conditions as a function of water content and the user-specified saturated hydraulic conductivity. | -| GWF | UZF | PACKAGEDATA | BOUNDNAME | STRING | name of the UZF cell cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | -| GWF | UZF | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | UZF | PERIOD | IFNO | INTEGER | integer value that defines the feature (UZF object) number associated with the specified PERIOD data on the line. | -| GWF | UZF | PERIOD | FINF | STRING | real or character value that defines the applied infiltration rate of the UZF cell ($LT^{-1}$). If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | UZF | PERIOD | PET | STRING | real or character value that defines the potential evapotranspiration rate of the UZF cell and specified GWF cell. Evapotranspiration is first removed from the unsaturated zone and any remaining potential evapotranspiration is applied to the saturated zone. If IVERTCON is greater than zero then residual potential evapotranspiration not satisfied in the UZF cell is applied to the underlying UZF and GWF cells. PET is always specified, but is only used if SIMULATE\_ET is specified in the OPTIONS block. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | UZF | PERIOD | EXTDP | STRING | real or character value that defines the evapotranspiration extinction depth of the UZF cell. If IVERTCON is greater than zero and EXTDP extends below the GWF cell bottom then remaining potential evapotranspiration is applied to the underlying UZF and GWF cells. EXTDP is always specified, but is only used if SIMULATE\_ET is specified in the OPTIONS block. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | UZF | PERIOD | EXTWC | STRING | real or character value that defines the evapotranspiration extinction water content of the UZF cell. EXTWC is always specified, but is only used if SIMULATE\_ET and UNSAT\_ETWC are specified in the OPTIONS block. The evapotranspiration rate from the unsaturated zone will be set to zero when the calculated water content is at or less than this value. The value for EXTWC cannot be less than the residual water content, and if it is specified as being less than the residual water content it is set to the residual water content. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | UZF | PERIOD | HA | STRING | real or character value that defines the air entry potential (head) of the UZF cell. HA is always specified, but is only used if SIMULATE\_ET and UNSAT\_ETAE are specified in the OPTIONS block. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | UZF | PERIOD | HROOT | STRING | real or character value that defines the root potential (head) of the UZF cell. HROOT is always specified, but is only used if SIMULATE\_ET and UNSAT\_ETAE are specified in the OPTIONS block. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | UZF | PERIOD | ROOTACT | STRING | real or character value that defines the root activity function of the UZF cell. ROOTACT is the length of roots in a given volume of soil divided by that volume. Values range from 0 to about 3 $cm^{-2}$, depending on the plant community and its stage of development. ROOTACT is always specified, but is only used if SIMULATE\_ET and UNSAT\_ETAE are specified in the OPTIONS block. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | UZF | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each UZF. The values of auxiliary variables must be present for each UZF. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | -| GWF | MVR | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of MVR information will be written to the listing file immediately after it is read. | -| GWF | MVR | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of MVR flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | -| GWF | MVR | OPTIONS | MODELNAMES | KEYWORD | keyword to indicate that all package names will be preceded by the model name for the package. Model names are required when the Mover Package is used with a GWF-GWF Exchange. The MODELNAME keyword should not be used for a Mover Package that is for a single GWF Model. | -| GWF | MVR | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | -| GWF | MVR | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | -| GWF | MVR | OPTIONS | BUDGETFILE | STRING | name of the output file to write budget information. | -| GWF | MVR | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | -| GWF | MVR | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | -| GWF | MVR | DIMENSIONS | MAXMVR | INTEGER | integer value specifying the maximum number of water mover entries that will specified for any stress period. | -| GWF | MVR | DIMENSIONS | MAXPACKAGES | INTEGER | integer value specifying the number of unique packages that are included in this water mover input file. | -| GWF | MVR | PACKAGES | MNAME | STRING | name of model containing the package. Model names are assigned by the user in the simulation name file. | -| GWF | MVR | PACKAGES | PNAME | STRING | is the name of a package that may be included in a subsequent stress period block. The package name is assigned in the name file for the GWF Model. Package names are optionally provided in the name file. If they are not provided by the user, then packages are assigned a default value, which is the package acronym followed by a hyphen and the package number. For example, the first Drain Package is named DRN-1. The second Drain Package is named DRN-2, and so forth. | -| GWF | MVR | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | MVR | PERIOD | MNAME1 | STRING | name of model containing the package, PNAME1. | -| GWF | MVR | PERIOD | PNAME1 | STRING | is the package name for the provider. The package PNAME1 must be designated to provide water through the MVR Package by specifying the keyword ``MOVER'' in its OPTIONS block. | -| GWF | MVR | PERIOD | ID1 | INTEGER | is the identifier for the provider. For the standard boundary packages, the provider identifier is the number of the boundary as it is listed in the package input file. (Note that the order of these boundaries may change by stress period, which must be accounted for in the Mover Package.) So the first well has an identifier of one. The second is two, and so forth. For the advanced packages, the identifier is the reach number (SFR Package), well number (MAW Package), or UZF cell number. For the Lake Package, ID1 is the lake outlet number. Thus, outflows from a single lake can be routed to different streams, for example. | -| GWF | MVR | PERIOD | MNAME2 | STRING | name of model containing the package, PNAME2. | -| GWF | MVR | PERIOD | PNAME2 | STRING | is the package name for the receiver. The package PNAME2 must be designated to receive water from the MVR Package by specifying the keyword ``MOVER'' in its OPTIONS block. | -| GWF | MVR | PERIOD | ID2 | INTEGER | is the identifier for the receiver. The receiver identifier is the reach number (SFR Package), Lake number (LAK Package), well number (MAW Package), or UZF cell number. | -| GWF | MVR | PERIOD | MVRTYPE | STRING | is the character string signifying the method for determining how much water will be moved. Supported values are ``FACTOR'' ``EXCESS'' ``THRESHOLD'' and ``UPTO''. These four options determine how the receiver flow rate, $Q_R$, is calculated. These options mirror the options defined for the cprior variable in the SFR package, with the term ``FACTOR'' being functionally equivalent to the ``FRACTION'' option for cprior. | -| GWF | MVR | PERIOD | VALUE | DOUBLE PRECISION | is the value to be used in the equation for calculating the amount of water to move. For the ``FACTOR'' option, VALUE is the $\alpha$ factor. For the remaining options, VALUE is the specified flow rate, $Q_S$. | -| GWF | GNC | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of GNC information will be written to the listing file immediately after it is read. | -| GWF | GNC | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of GNC flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | -| GWF | GNC | OPTIONS | EXPLICIT | KEYWORD | keyword to indicate that the ghost node correction is applied in an explicit manner on the right-hand side of the matrix. The explicit approach will likely require additional outer iterations. If the keyword is not specified, then the correction will be applied in an implicit manner on the left-hand side. The implicit approach will likely converge better, but may require additional memory. If the EXPLICIT keyword is not specified, then the BICGSTAB linear acceleration option should be specified within the LINEAR block of the Sparse Matrix Solver. | -| GWF | GNC | DIMENSIONS | NUMGNC | INTEGER | is the number of GNC entries. | -| GWF | GNC | DIMENSIONS | NUMALPHAJ | INTEGER | is the number of contributing factors. | -| GWF | GNC | GNCDATA | CELLIDN | INTEGER | is the cellid of the cell, $n$, in which the ghost node is located. For a structured grid that uses the DIS input file, CELLIDN is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDN is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDN is the node number for the cell. | -| GWF | GNC | GNCDATA | CELLIDM | INTEGER | is the cellid of the connecting cell, $m$, to which flow occurs from the ghost node. For a structured grid that uses the DIS input file, CELLIDM is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM is the node number for the cell. | -| GWF | GNC | GNCDATA | CELLIDSJ | INTEGER (NUMALPHAJ) | is the array of CELLIDS for the contributing j cells, which contribute to the interpolated head value at the ghost node. This item contains one CELLID for each of the contributing cells of the ghost node. Note that if the number of actual contributing cells needed by the user is less than NUMALPHAJ for any ghost node, then a dummy CELLID of zero(s) should be inserted with an associated contributing factor of zero. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLID is the layer number and cell2d number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLID is the node number for the cell. | -| GWF | GNC | GNCDATA | ALPHASJ | DOUBLE PRECISION (NUMALPHAJ) | is the contributing factors for each contributing node in CELLIDSJ. Note that if the number of actual contributing cells is less than NUMALPHAJ for any ghost node, then dummy CELLIDS should be inserted with an associated contributing factor of zero. The sum of ALPHASJ should be less than one. This is because one minus the sum of ALPHASJ is equal to the alpha term (alpha n in equation 4-61 of the GWF Model report) that is multiplied by the head in cell n. | -| GWF | OC | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | -| GWF | OC | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | -| GWF | OC | OPTIONS | BUDGETFILE | STRING | name of the output file to write budget information. | -| GWF | OC | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | -| GWF | OC | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | -| GWF | OC | OPTIONS | HEAD | KEYWORD | keyword to specify that record corresponds to head. | -| GWF | OC | OPTIONS | HEADFILE | STRING | name of the output file to write head information. | -| GWF | OC | OPTIONS | PRINT_FORMAT | KEYWORD | keyword to specify format for printing to the listing file. | -| GWF | OC | OPTIONS | COLUMNS | INTEGER | number of columns for writing data. | -| GWF | OC | OPTIONS | WIDTH | INTEGER | width for writing each number. | -| GWF | OC | OPTIONS | DIGITS | INTEGER | number of digits to use for writing a number. | -| GWF | OC | OPTIONS | FORMAT | STRING | write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. | -| GWF | OC | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | -| GWF | OC | PERIOD | SAVE | KEYWORD | keyword to indicate that information will be saved this stress period. | -| GWF | OC | PERIOD | PRINT | KEYWORD | keyword to indicate that information will be printed this stress period. | -| GWF | OC | PERIOD | RTYPE | STRING | type of information to save or print. Can be BUDGET or HEAD. | -| GWF | OC | PERIOD | OCSETTING | KEYSTRING | specifies the steps for which the data will be saved. | -| GWF | OC | PERIOD | ALL | KEYWORD | keyword to indicate save for all time steps in period. | -| GWF | OC | PERIOD | FIRST | KEYWORD | keyword to indicate save for first step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | -| GWF | OC | PERIOD | LAST | KEYWORD | keyword to indicate save for last step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | -| GWF | OC | PERIOD | FREQUENCY | INTEGER | save at the specified time step frequency. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | -| GWF | OC | PERIOD | STEPS | INTEGER ($ 0). HEAD\_LIMIT can be deactivated by specifying the text string `OFF'. The HEAD\_LIMIT option is based on the HEAD\_LIMIT functionality available in the MNW2~\citep{konikow2009} package for MODFLOW-2005. The HEAD\_LIMIT option has been included to facilitate backward compatibility with previous versions of MODFLOW but use of the RATE\_SCALING option instead of the HEAD\_LIMIT option is recommended. By default, HEAD\_LIMIT is `OFF'. | +| GWF | MAW | PERIOD | SHUT_OFF | KEYWORD | keyword for activating well shut off capability. Subsequent values define the minimum and maximum pumping rate that a well must exceed to shutoff or reactivate a well, respectively, during a stress period. SHUT\_OFF is only applied to injection wells (RATE$<0$) and if HEAD\_LIMIT is specified (not set to `OFF'). If HEAD\_LIMIT is specified, SHUT\_OFF can be deactivated by specifying a minimum value equal to zero. The SHUT\_OFF option is based on the SHUT\_OFF functionality available in the MNW2~\citep{konikow2009} package for MODFLOW-2005. The SHUT\_OFF option has been included to facilitate backward compatibility with previous versions of MODFLOW but use of the RATE\_SCALING option instead of the SHUT\_OFF option is recommended. By default, SHUT\_OFF is not used. | +| GWF | MAW | PERIOD | MINRATE | DOUBLE PRECISION | is the minimum rate that a well must exceed to shutoff a well during a stress period. The well will shut down during a time step if the flow rate to the well from the aquifer is less than MINRATE. If a well is shut down during a time step, reactivation of the well cannot occur until the next time step to reduce oscillations. MINRATE must be less than maxrate. | +| GWF | MAW | PERIOD | MAXRATE | DOUBLE PRECISION | is the maximum rate that a well must exceed to reactivate a well during a stress period. The well will reactivate during a timestep if the well was shutdown during the previous time step and the flow rate to the well from the aquifer exceeds maxrate. Reactivation of the well cannot occur until the next time step if a well is shutdown to reduce oscillations. maxrate must be greater than MINRATE. | +| GWF | MAW | PERIOD | RATE_SCALING | KEYWORD | activate rate scaling. If RATE\_SCALING is specified, both PUMP\_ELEVATION and SCALING\_LENGTH must be specified. RATE\_SCALING cannot be used with HEAD\_LIMIT. RATE\_SCALING can be used for extraction or injection wells. For extraction wells, the extraction rate will start to decrease once the head in the well lowers to a level equal to the pump elevation plus the scaling length. If the head in the well drops below the pump elevation, then the extraction rate is calculated to be zero. For an injection well, the injection rate will begin to decrease once the head in the well rises above the specified pump elevation. If the head in the well rises above the pump elevation plus the scaling length, then the injection rate will be set to zero. | +| GWF | MAW | PERIOD | PUMP_ELEVATION | DOUBLE PRECISION | is the elevation of the multi-aquifer well pump (PUMP\_ELEVATION). PUMP\_ELEVATION should not be less than the bottom elevation (BOTTOM) of the multi-aquifer well. | +| GWF | MAW | PERIOD | SCALING_LENGTH | DOUBLE PRECISION | height above the pump elevation (SCALING\_LENGTH). If the simulated well head is below this elevation (pump elevation plus the scaling length), then the pumping rate is reduced. | +| GWF | MAW | PERIOD | AUXILIARY | KEYWORD | keyword for specifying auxiliary variable. | +| GWF | MAW | PERIOD | AUXNAME | STRING | name for the auxiliary variable to be assigned AUXVAL. AUXNAME must match one of the auxiliary variable names defined in the OPTIONS block. If AUXNAME does not match one of the auxiliary variable names defined in the OPTIONS block the data are ignored. | +| GWF | MAW | PERIOD | AUXVAL | DOUBLE PRECISION | value for the auxiliary variable. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWF | MVR | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of MVR information will be written to the listing file immediately after it is read. | +| GWF | MVR | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of MVR flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| GWF | MVR | OPTIONS | MODELNAMES | KEYWORD | keyword to indicate that all package names will be preceded by the model name for the package. Model names are required when the Mover Package is used with a GWF-GWF Exchange. The MODELNAME keyword should not be used for a Mover Package that is for a single GWF Model. | +| GWF | MVR | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | +| GWF | MVR | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | +| GWF | MVR | OPTIONS | BUDGETFILE | STRING | name of the output file to write budget information. | +| GWF | MVR | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | +| GWF | MVR | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | +| GWF | MVR | DIMENSIONS | MAXMVR | INTEGER | integer value specifying the maximum number of water mover entries that will specified for any stress period. | +| GWF | MVR | DIMENSIONS | MAXPACKAGES | INTEGER | integer value specifying the number of unique packages that are included in this water mover input file. | +| GWF | MVR | PACKAGES | MNAME | STRING | name of model containing the package. Model names are assigned by the user in the simulation name file. | +| GWF | MVR | PACKAGES | PNAME | STRING | is the name of a package that may be included in a subsequent stress period block. The package name is assigned in the name file for the GWF Model. Package names are optionally provided in the name file. If they are not provided by the user, then packages are assigned a default value, which is the package acronym followed by a hyphen and the package number. For example, the first Drain Package is named DRN-1. The second Drain Package is named DRN-2, and so forth. | +| GWF | MVR | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| GWF | MVR | PERIOD | MNAME1 | STRING | name of model containing the package, PNAME1. | +| GWF | MVR | PERIOD | PNAME1 | STRING | is the package name for the provider. The package PNAME1 must be designated to provide water through the MVR Package by specifying the keyword ``MOVER'' in its OPTIONS block. | +| GWF | MVR | PERIOD | ID1 | INTEGER | is the identifier for the provider. For the standard boundary packages, the provider identifier is the number of the boundary as it is listed in the package input file. (Note that the order of these boundaries may change by stress period, which must be accounted for in the Mover Package.) So the first well has an identifier of one. The second is two, and so forth. For the advanced packages, the identifier is the reach number (SFR Package), well number (MAW Package), or UZF cell number. For the Lake Package, ID1 is the lake outlet number. Thus, outflows from a single lake can be routed to different streams, for example. | +| GWF | MVR | PERIOD | MNAME2 | STRING | name of model containing the package, PNAME2. | +| GWF | MVR | PERIOD | PNAME2 | STRING | is the package name for the receiver. The package PNAME2 must be designated to receive water from the MVR Package by specifying the keyword ``MOVER'' in its OPTIONS block. | +| GWF | MVR | PERIOD | ID2 | INTEGER | is the identifier for the receiver. The receiver identifier is the reach number (SFR Package), Lake number (LAK Package), well number (MAW Package), or UZF cell number. | +| GWF | MVR | PERIOD | MVRTYPE | STRING | is the character string signifying the method for determining how much water will be moved. Supported values are ``FACTOR'' ``EXCESS'' ``THRESHOLD'' and ``UPTO''. These four options determine how the receiver flow rate, $Q_R$, is calculated. These options mirror the options defined for the cprior variable in the SFR package, with the term ``FACTOR'' being functionally equivalent to the ``FRACTION'' option for cprior. | +| GWF | MVR | PERIOD | VALUE | DOUBLE PRECISION | is the value to be used in the equation for calculating the amount of water to move. For the ``FACTOR'' option, VALUE is the $\alpha$ factor. For the remaining options, VALUE is the specified flow rate, $Q_S$. | +| GWF | NAM | OPTIONS | LIST | STRING | is name of the listing file to create for this GWF model. If not specified, then the name of the list file will be the basename of the GWF model name file and the '.lst' extension. For example, if the GWF name file is called ``my.model.nam'' then the list file will be called ``my.model.lst''. | +| GWF | NAM | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of all model stress package information will be written to the listing file immediately after it is read. | +| GWF | NAM | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of all model package flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| GWF | NAM | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that all model package flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWF | NAM | OPTIONS | NEWTON | KEYWORD | keyword that activates the Newton-Raphson formulation for groundwater flow between connected, convertible groundwater cells and stress packages that support calculation of Newton-Raphson terms for groundwater exchanges. Cells will not dry when this option is used. By default, the Newton-Raphson formulation is not applied. | +| GWF | NAM | OPTIONS | UNDER_RELAXATION | KEYWORD | keyword that indicates whether the groundwater head in a cell will be under-relaxed when water levels fall below the bottom of the model below any given cell. By default, Newton-Raphson UNDER\_RELAXATION is not applied. | +| GWF | NAM | PACKAGES | FTYPE | STRING | is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. | +| GWF | NAM | PACKAGES | FNAME | STRING | is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. | +| GWF | NAM | PACKAGES | PNAME | STRING | is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single GWF Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. | +| GWF | NPF | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that budget flow terms will be written to the file specified with ``BUDGET SAVE FILE'' in Output Control. | +| GWF | NPF | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that calculated flows between cells will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. This option can produce extremely large list files because all cell-by-cell flows are printed. It should only be used with the NPF Package for models that have a small number of cells. | +| GWF | NPF | OPTIONS | ALTERNATIVE_CELL_AVERAGING | STRING | is a text keyword to indicate that an alternative method will be used for calculating the conductance for horizontal cell connections. The text value for ALTERNATIVE\_CELL\_AVERAGING can be ``LOGARITHMIC'', ``AMT-LMK'', or ``AMT-HMK''. ``AMT-LMK'' signifies that the conductance will be calculated using arithmetic-mean thickness and logarithmic-mean hydraulic conductivity. ``AMT-HMK'' signifies that the conductance will be calculated using arithmetic-mean thickness and harmonic-mean hydraulic conductivity. If the user does not specify a value for ALTERNATIVE\_CELL\_AVERAGING, then the harmonic-mean method will be used. This option cannot be used if the XT3D option is invoked. | +| GWF | NPF | OPTIONS | THICKSTRT | KEYWORD | indicates that cells having a negative ICELLTYPE are confined, and their cell thickness for conductance calculations will be computed as STRT-BOT rather than TOP-BOT. This option should be used with caution as it only affects conductance calculations in the NPF Package. | +| GWF | NPF | OPTIONS | VARIABLECV | KEYWORD | keyword to indicate that the vertical conductance will be calculated using the saturated thickness and properties of the overlying cell and the thickness and properties of the underlying cell. If the DEWATERED keyword is also specified, then the vertical conductance is calculated using only the saturated thickness and properties of the overlying cell if the head in the underlying cell is below its top. If these keywords are not specified, then the default condition is to calculate the vertical conductance at the start of the simulation using the initial head and the cell properties. The vertical conductance remains constant for the entire simulation. | +| GWF | NPF | OPTIONS | DEWATERED | KEYWORD | If the DEWATERED keyword is specified, then the vertical conductance is calculated using only the saturated thickness and properties of the overlying cell if the head in the underlying cell is below its top. | +| GWF | NPF | OPTIONS | PERCHED | KEYWORD | keyword to indicate that when a cell is overlying a dewatered convertible cell, the head difference used in Darcy's Law is equal to the head in the overlying cell minus the bottom elevation of the overlying cell. If not specified, then the default is to use the head difference between the two cells. | +| GWF | NPF | OPTIONS | REWET | KEYWORD | activates model rewetting. Rewetting is off by default. | +| GWF | NPF | OPTIONS | WETFCT | DOUBLE PRECISION | is a keyword and factor that is included in the calculation of the head that is initially established at a cell when that cell is converted from dry to wet. | +| GWF | NPF | OPTIONS | IWETIT | INTEGER | is a keyword and iteration interval for attempting to wet cells. Wetting is attempted every IWETIT iteration. This applies to outer iterations and not inner iterations. If IWETIT is specified as zero or less, then the value is changed to 1. | +| GWF | NPF | OPTIONS | IHDWET | INTEGER | is a keyword and integer flag that determines which equation is used to define the initial head at cells that become wet. If IHDWET is 0, h = BOT + WETFCT (hm - BOT). If IHDWET is not 0, h = BOT + WETFCT (THRESH). | +| GWF | NPF | OPTIONS | XT3D | KEYWORD | keyword indicating that the XT3D formulation will be used. If the RHS keyword is also included, then the XT3D additional terms will be added to the right-hand side. If the RHS keyword is excluded, then the XT3D terms will be put into the coefficient matrix. Use of XT3D will substantially increase the computational effort, but will result in improved accuracy for anisotropic conductivity fields and for unstructured grids in which the CVFD requirement is violated. XT3D requires additional information about the shapes of grid cells. If XT3D is active and the DISU Package is used, then the user will need to provide in the DISU Package the angldegx array in the CONNECTIONDATA block and the VERTICES and CELL2D blocks. | +| GWF | NPF | OPTIONS | RHS | KEYWORD | If the RHS keyword is also included, then the XT3D additional terms will be added to the right-hand side. If the RHS keyword is excluded, then the XT3D terms will be put into the coefficient matrix. | +| GWF | NPF | OPTIONS | SAVE_SPECIFIC_DISCHARGE | KEYWORD | keyword to indicate that x, y, and z components of specific discharge will be calculated at cell centers and written to the budget file, which is specified with ``BUDGET SAVE FILE'' in Output Control. If this option is activated, then additional information may be required in the discretization packages and the GWF Exchange package (if GWF models are coupled). Specifically, ANGLDEGX must be specified in the CONNECTIONDATA block of the DISU Package; ANGLDEGX must also be specified for the GWF Exchange as an auxiliary variable. | +| GWF | NPF | OPTIONS | SAVE_SATURATION | KEYWORD | keyword to indicate that cell saturation will be written to the budget file, which is specified with ``BUDGET SAVE FILE'' in Output Control. Saturation will be saved to the budget file as an auxiliary variable saved with the DATA-SAT text label. Saturation is a cell variable that ranges from zero to one and can be used by post processing programs to determine how much of a cell volume is saturated. If ICELLTYPE is 0, then saturation is always one. | +| GWF | NPF | OPTIONS | K22OVERK | KEYWORD | keyword to indicate that specified K22 is a ratio of K22 divided by K. If this option is specified, then the K22 array entered in the NPF Package will be multiplied by K after being read. | +| GWF | NPF | OPTIONS | K33OVERK | KEYWORD | keyword to indicate that specified K33 is a ratio of K33 divided by K. If this option is specified, then the K33 array entered in the NPF Package will be multiplied by K after being read. | +| GWF | NPF | OPTIONS | TVK6 | KEYWORD | keyword to specify that record corresponds to a time-varying hydraulic conductivity (TVK) file. The behavior of TVK and a description of the input file is provided separately. | +| GWF | NPF | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| GWF | NPF | OPTIONS | TVK6_FILENAME | STRING | defines a time-varying hydraulic conductivity (TVK) input file. Records in the TVK file can be used to change hydraulic conductivity properties at specified times or stress periods. | +| GWF | NPF | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWF | NPF | OPTIONS | DEV_NO_NEWTON | KEYWORD | turn off Newton for unconfined cells | +| GWF | NPF | OPTIONS | DEV_OMEGA | DOUBLE PRECISION | set saturation omega value | +| GWF | NPF | GRIDDATA | ICELLTYPE | INTEGER (NODES) | flag for each cell that specifies how saturated thickness is treated. 0 means saturated thickness is held constant; $>$0 means saturated thickness varies with computed head when head is below the cell top; $<$0 means saturated thickness varies with computed head unless the THICKSTRT option is in effect. When THICKSTRT is in effect, a negative value for ICELLTYPE indicates that the saturated thickness value used in conductance calculations in the NPF Package will be computed as STRT-BOT and held constant. If the THICKSTRT option is not in effect, then negative values provided by the user for ICELLTYPE are automatically reassigned by the program to a value of one. | +| GWF | NPF | GRIDDATA | K | DOUBLE PRECISION (NODES) | is the hydraulic conductivity. For the common case in which the user would like to specify the horizontal hydraulic conductivity and the vertical hydraulic conductivity, then K should be assigned as the horizontal hydraulic conductivity, K33 should be assigned as the vertical hydraulic conductivity, and K22 and the three rotation angles should not be specified. When more sophisticated anisotropy is required, then K corresponds to the K11 hydraulic conductivity axis. All included cells (IDOMAIN $>$ 0) must have a K value greater than zero. | +| GWF | NPF | GRIDDATA | K22 | DOUBLE PRECISION (NODES) | is the hydraulic conductivity of the second ellipsoid axis (or the ratio of K22/K if the K22OVERK option is specified); for an unrotated case this is the hydraulic conductivity in the y direction. If K22 is not included in the GRIDDATA block, then K22 is set equal to K. For a regular MODFLOW grid (DIS Package is used) in which no rotation angles are specified, K22 is the hydraulic conductivity along columns in the y direction. For an unstructured DISU grid, the user must assign principal x and y axes and provide the angle for each cell face relative to the assigned x direction. All included cells (IDOMAIN $>$ 0) must have a K22 value greater than zero. | +| GWF | NPF | GRIDDATA | K33 | DOUBLE PRECISION (NODES) | is the hydraulic conductivity of the third ellipsoid axis (or the ratio of K33/K if the K33OVERK option is specified); for an unrotated case, this is the vertical hydraulic conductivity. When anisotropy is applied, K33 corresponds to the K33 tensor component. All included cells (IDOMAIN $>$ 0) must have a K33 value greater than zero. | +| GWF | NPF | GRIDDATA | ANGLE1 | DOUBLE PRECISION (NODES) | is a rotation angle of the hydraulic conductivity tensor in degrees. The angle represents the first of three sequential rotations of the hydraulic conductivity ellipsoid. With the K11, K22, and K33 axes of the ellipsoid initially aligned with the x, y, and z coordinate axes, respectively, ANGLE1 rotates the ellipsoid about its K33 axis (within the x - y plane). A positive value represents counter-clockwise rotation when viewed from any point on the positive K33 axis, looking toward the center of the ellipsoid. A value of zero indicates that the K11 axis lies within the x - z plane. If ANGLE1 is not specified, default values of zero are assigned to ANGLE1, ANGLE2, and ANGLE3, in which case the K11, K22, and K33 axes are aligned with the x, y, and z axes, respectively. | +| GWF | NPF | GRIDDATA | ANGLE2 | DOUBLE PRECISION (NODES) | is a rotation angle of the hydraulic conductivity tensor in degrees. The angle represents the second of three sequential rotations of the hydraulic conductivity ellipsoid. Following the rotation by ANGLE1 described above, ANGLE2 rotates the ellipsoid about its K22 axis (out of the x - y plane). An array can be specified for ANGLE2 only if ANGLE1 is also specified. A positive value of ANGLE2 represents clockwise rotation when viewed from any point on the positive K22 axis, looking toward the center of the ellipsoid. A value of zero indicates that the K11 axis lies within the x - y plane. If ANGLE2 is not specified, default values of zero are assigned to ANGLE2 and ANGLE3; connections that are not user-designated as vertical are assumed to be strictly horizontal (that is, to have no z component to their orientation); and connection lengths are based on horizontal distances. | +| GWF | NPF | GRIDDATA | ANGLE3 | DOUBLE PRECISION (NODES) | is a rotation angle of the hydraulic conductivity tensor in degrees. The angle represents the third of three sequential rotations of the hydraulic conductivity ellipsoid. Following the rotations by ANGLE1 and ANGLE2 described above, ANGLE3 rotates the ellipsoid about its K11 axis. An array can be specified for ANGLE3 only if ANGLE1 and ANGLE2 are also specified. An array must be specified for ANGLE3 if ANGLE2 is specified. A positive value of ANGLE3 represents clockwise rotation when viewed from any point on the positive K11 axis, looking toward the center of the ellipsoid. A value of zero indicates that the K22 axis lies within the x - y plane. | +| GWF | NPF | GRIDDATA | WETDRY | DOUBLE PRECISION (NODES) | is a combination of the wetting threshold and a flag to indicate which neighboring cells can cause a cell to become wet. If WETDRY $<$ 0, only a cell below a dry cell can cause the cell to become wet. If WETDRY $>$ 0, the cell below a dry cell and horizontally adjacent cells can cause a cell to become wet. If WETDRY is 0, the cell cannot be wetted. The absolute value of WETDRY is the wetting threshold. When the sum of BOT and the absolute value of WETDRY at a dry cell is equaled or exceeded by the head at an adjacent cell, the cell is wetted. WETDRY must be specified if ``REWET'' is specified in the OPTIONS block. If ``REWET'' is not specified in the options block, then WETDRY can be entered, and memory will be allocated for it, even though it is not used. | +| GWF | OC | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | +| GWF | OC | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | +| GWF | OC | OPTIONS | BUDGETFILE | STRING | name of the output file to write budget information. | +| GWF | OC | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | +| GWF | OC | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | +| GWF | OC | OPTIONS | HEAD | KEYWORD | keyword to specify that record corresponds to head. | +| GWF | OC | OPTIONS | HEADFILE | STRING | name of the output file to write head information. | +| GWF | OC | OPTIONS | PRINT_FORMAT | KEYWORD | keyword to specify format for printing to the listing file. | +| GWF | OC | OPTIONS | COLUMNS | INTEGER | number of columns for writing data. | +| GWF | OC | OPTIONS | WIDTH | INTEGER | width for writing each number. | +| GWF | OC | OPTIONS | DIGITS | INTEGER | number of digits to use for writing a number. | +| GWF | OC | OPTIONS | FORMAT | STRING | write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. | +| GWF | OC | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| GWF | OC | PERIOD | SAVE | KEYWORD | keyword to indicate that information will be saved this stress period. | +| GWF | OC | PERIOD | PRINT | KEYWORD | keyword to indicate that information will be printed this stress period. | +| GWF | OC | PERIOD | RTYPE | STRING | type of information to save or print. Can be BUDGET or HEAD. | +| GWF | OC | PERIOD | OCSETTING | KEYSTRING | specifies the steps for which the data will be saved. | +| GWF | OC | PERIOD | ALL | KEYWORD | keyword to indicate save for all time steps in period. | +| GWF | OC | PERIOD | FIRST | KEYWORD | keyword to indicate save for first step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | +| GWF | OC | PERIOD | LAST | KEYWORD | keyword to indicate save for last step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | +| GWF | OC | PERIOD | FREQUENCY | INTEGER | save at the specified time step frequency. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | +| GWF | OC | PERIOD | STEPS | INTEGER (0) when the cell is under confined conditions (head greater than or equal to the top of the cell). This option has no effect on cells that are marked as being always confined (ICONVERT=0). This option is identical to the approach used to calculate storage changes under confined conditions in MODFLOW-2005. | +| GWF | STO | OPTIONS | TVS6 | KEYWORD | keyword to specify that record corresponds to a time-varying storage (TVS) file. The behavior of TVS and a description of the input file is provided separately. | +| GWF | STO | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| GWF | STO | OPTIONS | TVS_FILENAME | STRING | defines a time-varying storage (TVS) input file. Records in the TVS file can be used to change specific storage and specific yield properties at specified times or stress periods. | +| GWF | STO | GRIDDATA | ICONVERT | INTEGER (NODES) | is a flag for each cell that specifies whether or not a cell is convertible for the storage calculation. 0 indicates confined storage is used. $>$0 indicates confined storage is used when head is above cell top and a mixed formulation of unconfined and confined storage is used when head is below cell top. | +| GWF | STO | GRIDDATA | SS | DOUBLE PRECISION (NODES) | is specific storage (or the storage coefficient if STORAGECOEFFICIENT is specified as an option). Specific storage values must be greater than or equal to 0. If the CSUB Package is included in the GWF model, specific storage must be zero for every cell. | +| GWF | STO | GRIDDATA | SY | DOUBLE PRECISION (NODES) | is specific yield. Specific yield values must be greater than or equal to 0. Specific yield does not have to be specified if there are no convertible cells (ICONVERT=0 in every cell). | +| GWF | STO | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| GWF | STO | PERIOD | STEADY-STATE | KEYWORD | keyword to indicate that stress period IPER is steady-state. Steady-state conditions will apply until the TRANSIENT keyword is specified in a subsequent BEGIN PERIOD block. If the CSUB Package is included in the GWF model, only the first and last stress period can be steady-state. | +| GWF | STO | PERIOD | TRANSIENT | KEYWORD | keyword to indicate that stress period IPER is transient. Transient conditions will apply until the STEADY-STATE keyword is specified in a subsequent BEGIN PERIOD block. | +| GWF | UZF | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | +| GWF | UZF | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of GWF cell area used by UZF cell. | +| GWF | UZF | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of UZF cells. | +| GWF | UZF | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of UZF information will be written to the listing file immediately after it is read. | +| GWF | UZF | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of UZF flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| GWF | UZF | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that UZF flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWF | UZF | OPTIONS | WATER_CONTENT | KEYWORD | keyword to specify that record corresponds to unsaturated zone water contents. | +| GWF | UZF | OPTIONS | WCFILE | STRING | name of the binary output file to write water content information. | +| GWF | UZF | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | +| GWF | UZF | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | +| GWF | UZF | OPTIONS | BUDGETFILE | STRING | name of the binary output file to write budget information. | +| GWF | UZF | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | +| GWF | UZF | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | +| GWF | UZF | OPTIONS | PACKAGE_CONVERGENCE | KEYWORD | keyword to specify that record corresponds to the package convergence comma spaced values file. | +| GWF | UZF | OPTIONS | PACKAGE_CONVERGENCE_FILENAME | STRING | name of the comma spaced values output file to write package convergence information. | +| GWF | UZF | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | +| GWF | UZF | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| GWF | UZF | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | +| GWF | UZF | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | +| GWF | UZF | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the UZF package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the UZF package. | +| GWF | UZF | OPTIONS | MOVER | KEYWORD | keyword to indicate that this instance of the UZF Package can be used with the Water Mover (MVR) Package. When the MOVER option is specified, additional memory is allocated within the package to store the available, provided, and received water. | +| GWF | UZF | OPTIONS | SIMULATE_ET | KEYWORD | keyword specifying that ET in the unsaturated (UZF) and saturated zones (GWF) will be simulated. ET can be simulated in the UZF cell and not the GWF cell by omitting keywords LINEAR\_GWET and SQUARE\_GWET. | +| GWF | UZF | OPTIONS | LINEAR_GWET | KEYWORD | keyword specifying that groundwater ET will be simulated using the original ET formulation of MODFLOW-2005. | +| GWF | UZF | OPTIONS | SQUARE_GWET | KEYWORD | keyword specifying that groundwater ET will be simulated by assuming a constant ET rate for groundwater levels between land surface (TOP) and land surface minus the ET extinction depth (TOP-EXTDP). Groundwater ET is smoothly reduced from the PET rate to zero over a nominal interval at TOP-EXTDP. | +| GWF | UZF | OPTIONS | SIMULATE_GWSEEP | KEYWORD | keyword specifying that groundwater discharge (GWSEEP) to land surface will be simulated. Groundwater discharge is nonzero when groundwater head is greater than land surface. This option is no longer recommended; a better approach is to use the Drain Package with discharge scaling as a way to handle seepage to land surface. The Drain Package with discharge scaling is described in Chapter 3 of the Supplemental Technical Information. | +| GWF | UZF | OPTIONS | UNSAT_ETWC | KEYWORD | keyword specifying that ET in the unsaturated zone will be simulated as a function of the specified PET rate while the water content (THETA) is greater than the ET extinction water content (EXTWC). | +| GWF | UZF | OPTIONS | UNSAT_ETAE | KEYWORD | keyword specifying that ET in the unsaturated zone will be simulated using a capillary pressure based formulation. Capillary pressure is calculated using the Brooks-Corey retention function. | +| GWF | UZF | DIMENSIONS | NUZFCELLS | INTEGER | is the number of UZF cells. More than one UZF cell can be assigned to a GWF cell; however, only one GWF cell can be assigned to a single UZF cell. If more than one UZF cell is assigned to a GWF cell, then an auxiliary variable should be used to reduce the surface area of the UZF cell with the AUXMULTNAME option. | +| GWF | UZF | DIMENSIONS | NTRAILWAVES | INTEGER | is the number of trailing waves. A recommended value of 7 can be used for NTRAILWAVES. This value can be increased to lower mass balance error in the unsaturated zone. | +| GWF | UZF | DIMENSIONS | NWAVESETS | INTEGER | is the number of wave sets. A recommended value of 40 can be used for NWAVESETS. This value can be increased if more waves are required to resolve variations in water content within the unsaturated zone. | +| GWF | UZF | PACKAGEDATA | IFNO | INTEGER | integer value that defines the feature (UZF object) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NUZFCELLS. UZF information must be specified for every UZF cell or the program will terminate with an error. The program will also terminate with an error if information for a UZF cell is specified more than once. | +| GWF | UZF | PACKAGEDATA | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | +| GWF | UZF | PACKAGEDATA | LANDFLAG | INTEGER | integer value set to one for land surface cells indicating that boundary conditions can be applied and data can be specified in the PERIOD block. A value of 0 specifies a non-land surface cell. | +| GWF | UZF | PACKAGEDATA | IVERTCON | INTEGER | integer value set to specify underlying UZF cell that receives water flowing to bottom of cell. If unsaturated zone flow reaches the water table before the cell bottom, then water is added to the GWF cell instead of flowing to the underlying UZF cell. A value of 0 indicates the UZF cell is not connected to an underlying UZF cell. | +| GWF | UZF | PACKAGEDATA | SURFDEP | DOUBLE PRECISION | is the surface depression depth of the UZF cell. | +| GWF | UZF | PACKAGEDATA | VKS | DOUBLE PRECISION | is the saturated vertical hydraulic conductivity of the UZF cell. This value is used with the Brooks-Corey function and the simulated water content to calculate the partially saturated hydraulic conductivity. | +| GWF | UZF | PACKAGEDATA | THTR | DOUBLE PRECISION | is the residual (irreducible) water content of the UZF cell. This residual water is not available to plants and will not drain into underlying aquifer cells. | +| GWF | UZF | PACKAGEDATA | THTS | DOUBLE PRECISION | is the saturated water content of the UZF cell. The values for saturated and residual water content should be set in a manner that is consistent with the specific yield value specified in the Storage Package. The saturated water content must be greater than the residual content. | +| GWF | UZF | PACKAGEDATA | THTI | DOUBLE PRECISION | is the initial water content of the UZF cell. The value must be greater than or equal to the residual water content and less than or equal to the saturated water content. | +| GWF | UZF | PACKAGEDATA | EPS | DOUBLE PRECISION | is the exponent used in the Brooks-Corey function. The Brooks-Corey function is used by UZF to calculated hydraulic conductivity under partially saturated conditions as a function of water content and the user-specified saturated hydraulic conductivity. | +| GWF | UZF | PACKAGEDATA | BOUNDNAME | STRING | name of the UZF cell cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | +| GWF | UZF | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| GWF | UZF | PERIOD | IFNO | INTEGER | integer value that defines the feature (UZF object) number associated with the specified PERIOD data on the line. | +| GWF | UZF | PERIOD | FINF | STRING | real or character value that defines the applied infiltration rate of the UZF cell ($LT^{-1}$). If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWF | UZF | PERIOD | PET | STRING | real or character value that defines the potential evapotranspiration rate of the UZF cell and specified GWF cell. Evapotranspiration is first removed from the unsaturated zone and any remaining potential evapotranspiration is applied to the saturated zone. If IVERTCON is greater than zero then residual potential evapotranspiration not satisfied in the UZF cell is applied to the underlying UZF and GWF cells. PET is always specified, but is only used if SIMULATE\_ET is specified in the OPTIONS block. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWF | UZF | PERIOD | EXTDP | STRING | real or character value that defines the evapotranspiration extinction depth of the UZF cell. If IVERTCON is greater than zero and EXTDP extends below the GWF cell bottom then remaining potential evapotranspiration is applied to the underlying UZF and GWF cells. EXTDP is always specified, but is only used if SIMULATE\_ET is specified in the OPTIONS block. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWF | UZF | PERIOD | EXTWC | STRING | real or character value that defines the evapotranspiration extinction water content of the UZF cell. EXTWC is always specified, but is only used if SIMULATE\_ET and UNSAT\_ETWC are specified in the OPTIONS block. The evapotranspiration rate from the unsaturated zone will be set to zero when the calculated water content is at or less than this value. The value for EXTWC cannot be less than the residual water content, and if it is specified as being less than the residual water content it is set to the residual water content. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWF | UZF | PERIOD | HA | STRING | real or character value that defines the air entry potential (head) of the UZF cell. HA is always specified, but is only used if SIMULATE\_ET and UNSAT\_ETAE are specified in the OPTIONS block. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWF | UZF | PERIOD | HROOT | STRING | real or character value that defines the root potential (head) of the UZF cell. HROOT is always specified, but is only used if SIMULATE\_ET and UNSAT\_ETAE are specified in the OPTIONS block. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWF | UZF | PERIOD | ROOTACT | STRING | real or character value that defines the root activity function of the UZF cell. ROOTACT is the length of roots in a given volume of soil divided by that volume. Values range from 0 to about 3 $cm^{-2}$, depending on the plant community and its stage of development. ROOTACT is always specified, but is only used if SIMULATE\_ET and UNSAT\_ETAE are specified in the OPTIONS block. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWF | UZF | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each UZF. The values of auxiliary variables must be present for each UZF. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWF | VSC | OPTIONS | VISCREF | DOUBLE PRECISION | fluid reference viscosity used in the equation of state. This value is set to 1.0 if not specified as an option. | +| GWF | VSC | OPTIONS | TEMPERATURE_SPECIES_NAME | STRING | string used to identify the auxspeciesname in PACKAGEDATA that corresponds to the temperature species. There can be only one occurrence of this temperature species name in the PACKAGEDATA block or the program will terminate with an error. This value has no effect if viscosity does not depend on temperature. | +| GWF | VSC | OPTIONS | THERMAL_FORMULATION | STRING | may be used for specifying which viscosity formulation to use for the temperature species. Can be either LINEAR or NONLINEAR. The LINEAR viscosity formulation is the default. | +| GWF | VSC | OPTIONS | THERMAL_A2 | DOUBLE PRECISION | is an empirical parameter specified by the user for calculating viscosity using a nonlinear formulation. If A2 is not specified, a default value of 10.0 is assigned (Voss, 1984). | +| GWF | VSC | OPTIONS | THERMAL_A3 | DOUBLE PRECISION | is an empirical parameter specified by the user for calculating viscosity using a nonlinear formulation. If A3 is not specified, a default value of 248.37 is assigned (Voss, 1984). | +| GWF | VSC | OPTIONS | THERMAL_A4 | DOUBLE PRECISION | is an empirical parameter specified by the user for calculating viscosity using a nonlinear formulation. If A4 is not specified, a default value of 133.15 is assigned (Voss, 1984). | +| GWF | VSC | OPTIONS | VISCOSITY | KEYWORD | keyword to specify that record corresponds to viscosity. | +| GWF | VSC | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | +| GWF | VSC | OPTIONS | VISCOSITYFILE | STRING | name of the binary output file to write viscosity information. The viscosity file has the same format as the head file. Viscosity values will be written to the viscosity file whenever heads are written to the binary head file. The settings for controlling head output are contained in the Output Control option. | +| GWF | VSC | DIMENSIONS | NVISCSPECIES | INTEGER | number of species used in the viscosity equation of state. If either concentrations or temperature (or both) are used to update viscosity then then nrhospecies needs to be at least one. | +| GWF | VSC | PACKAGEDATA | IVISCSPEC | INTEGER | integer value that defines the species number associated with the specified PACKAGEDATA data entered on each line. IVISCSPECIES must be greater than zero and less than or equal to NVISCSPECIES. Information must be specified for each of the NVISCSPECIES species or the program will terminate with an error. The program will also terminate with an error if information for a species is specified more than once. | +| GWF | VSC | PACKAGEDATA | DVISCDC | DOUBLE PRECISION | real value that defines the slope of the line defining the linear relationship between viscosity and temperature or between viscosity and concentration, depending on the type of species entered on each line. If the value of AUXSPECIESNAME entered on a line corresponds to TEMPERATURE\_SPECIES\_NAME (in the OPTIONS block), this value will be used when VISCOSITY\_FUNC is equal to LINEAR (the default) in the OPTIONS block. When VISCOSITY\_FUNC is set to NONLINEAR, a value for DVISCDC must be specified though it is not used. | +| GWF | VSC | PACKAGEDATA | CVISCREF | DOUBLE PRECISION | real value that defines the reference temperature or reference concentration value used for this species in the viscosity equation of state. If AUXSPECIESNAME entered on a line corresponds to TEMPERATURE\_SPECIES\_NAME (in the OPTIONS block), then CVISCREF refers to a reference temperature, otherwise it refers to a reference concentration. | +| GWF | VSC | PACKAGEDATA | MODELNAME | STRING | name of a GWT model used to simulate a species that will be used in the viscosity equation of state. This name will have no effect if the simulation does not include a GWT model that corresponds to this GWF model. | +| GWF | VSC | PACKAGEDATA | AUXSPECIESNAME | STRING | name of an auxiliary variable in a GWF stress package that will be used for this species to calculate the viscosity values. If a viscosity value is needed by the Viscosity Package then it will use the temperature or concentration values associated with this AUXSPECIESNAME in the viscosity equation of state. For advanced stress packages (LAK, SFR, MAW, and UZF) that have an associated advanced transport package (LKT, SFT, MWT, and UZT), the FLOW\_PACKAGE\_AUXILIARY\_NAME option in the advanced transport package can be used to transfer simulated temperature or concentration(s) into the flow package auxiliary variable. In this manner, the Viscosity Package can calculate viscosity values for lakes, streams, multi-aquifer wells, and unsaturated zone flow cells using simulated concentrations. | +| GWF | WEL | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | +| GWF | WEL | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of well flow rate. | +| GWF | WEL | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of well cells. | +| GWF | WEL | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of well information will be written to the listing file immediately after it is read. | +| GWF | WEL | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of well flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| GWF | WEL | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that well flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWF | WEL | OPTIONS | AUTO_FLOW_REDUCE | DOUBLE PRECISION | keyword and real value that defines the fraction of the cell thickness used as an interval for smoothly adjusting negative pumping rates to 0 in cells with head values less than or equal to the bottom of the cell. Negative pumping rates are adjusted to 0 or a smaller negative value when the head in the cell is equal to or less than the calculated interval above the cell bottom. AUTO\_FLOW\_REDUCE is set to 0.1 if the specified value is less than or equal to zero. By default, negative pumping rates are not reduced during a simulation. This AUTO\_FLOW\_REDUCE option only applies to wells in model cells that are marked as ``convertible'' (ICELLTYPE /= 0) in the Node Property Flow (NPF) input file. Reduction in flow will not occur for wells in cells marked as confined (ICELLTYPE = 0). | +| GWF | WEL | OPTIONS | AUTO_FLOW_REDUCE_CSV | KEYWORD | keyword to specify that record corresponds to the AUTO\_FLOW\_REDUCE output option in which a new record is written for each well and for each time step in which the user-requested extraction rate is reduced by the program. | +| GWF | WEL | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | +| GWF | WEL | OPTIONS | AFRCSVFILE | STRING | name of the comma-separated value (CSV) output file to write information about well extraction rates that have been reduced by the program. Entries are only written if the extraction rates are reduced. | +| GWF | WEL | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | +| GWF | WEL | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| GWF | WEL | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | +| GWF | WEL | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | +| GWF | WEL | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the Well package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the Well package. | +| GWF | WEL | OPTIONS | MOVER | KEYWORD | keyword to indicate that this instance of the Well Package can be used with the Water Mover (MVR) Package. When the MOVER option is specified, additional memory is allocated within the package to store the available, provided, and received water. | +| GWF | WEL | DIMENSIONS | MAXBOUND | INTEGER | integer value specifying the maximum number of wells cells that will be specified for use during any stress period. | +| GWF | WEL | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| GWF | WEL | PERIOD | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | +| GWF | WEL | PERIOD | Q | DOUBLE PRECISION | is the volumetric well rate. A positive value indicates recharge (injection) and a negative value indicates discharge (extraction). If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWF | WEL | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each well. The values of auxiliary variables must be present for each well. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWF | WEL | PERIOD | BOUNDNAME | STRING | name of the well cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | +| GWT | ADV | OPTIONS | SCHEME | STRING | scheme used to solve the advection term. Can be upstream, central, or TVD. If not specified, upstream weighting is the default weighting scheme. | +| GWT | API | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of api boundary cells. | +| GWT | API | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of api boundary information will be written to the listing file immediately after it is read. | +| GWT | API | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of api boundary flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| GWT | API | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that api boundary flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWT | API | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | +| GWT | API | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| GWT | API | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the api boundary package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the api boundary package. | +| GWT | API | OPTIONS | MOVER | KEYWORD | keyword to indicate that this instance of the api boundary Package can be used with the Water Mover (MVR) Package. When the MOVER option is specified, additional memory is allocated within the package to store the available, provided, and received water. | +| GWT | API | DIMENSIONS | MAXBOUND | INTEGER | integer value specifying the maximum number of api boundary cells that will be specified for use during any stress period. | +| GWT | CNC | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | +| GWT | CNC | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of concentration value. | +| GWT | CNC | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of constant concentration cells. | +| GWT | CNC | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of constant concentration information will be written to the listing file immediately after it is read. | +| GWT | CNC | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of constant concentration flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| GWT | CNC | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that constant concentration flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWT | CNC | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | +| GWT | CNC | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| GWT | CNC | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | +| GWT | CNC | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | +| GWT | CNC | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the Constant Concentration package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the Constant Concentration package. | +| GWT | CNC | DIMENSIONS | MAXBOUND | INTEGER | integer value specifying the maximum number of constant concentrations cells that will be specified for use during any stress period. | +| GWT | CNC | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| GWT | CNC | PERIOD | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | +| GWT | CNC | PERIOD | CONC | DOUBLE PRECISION | is the constant concentration value. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWT | CNC | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each constant concentration. The values of auxiliary variables must be present for each constant concentration. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWT | CNC | PERIOD | BOUNDNAME | STRING | name of the constant concentration cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | +| GWT | DIS | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | +| GWT | DIS | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | +| GWT | DIS | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWT | DIS | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWT | DIS | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWT | DIS | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWT | DIS | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | +| GWT | DIS | DIMENSIONS | NROW | INTEGER | is the number of rows in the model grid. | +| GWT | DIS | DIMENSIONS | NCOL | INTEGER | is the number of columns in the model grid. | +| GWT | DIS | GRIDDATA | DELR | DOUBLE PRECISION (NCOL) | is the column spacing in the row direction. | +| GWT | DIS | GRIDDATA | DELC | DOUBLE PRECISION (NROW) | is the row spacing in the column direction. | +| GWT | DIS | GRIDDATA | TOP | DOUBLE PRECISION (NCOL, NROW) | is the top elevation for each cell in the top model layer. | +| GWT | DIS | GRIDDATA | BOTM | DOUBLE PRECISION (NCOL, NROW, NLAY) | is the bottom elevation for each cell. | +| GWT | DIS | GRIDDATA | IDOMAIN | INTEGER (NCOL, NROW, NLAY) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. | +| GWT | DISU | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | +| GWT | DISU | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | +| GWT | DISU | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWT | DISU | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWT | DISU | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWT | DISU | OPTIONS | VERTICAL_OFFSET_TOLERANCE | DOUBLE PRECISION | checks are performed to ensure that the top of a cell is not higher than the bottom of an overlying cell. This option can be used to specify the tolerance that is used for checking. If top of a cell is above the bottom of an overlying cell by a value less than this tolerance, then the program will not terminate with an error. The default value is zero. This option should generally not be used. | +| GWT | DISU | DIMENSIONS | NODES | INTEGER | is the number of cells in the model grid. | +| GWT | DISU | DIMENSIONS | NJA | INTEGER | is the sum of the number of connections and NODES. When calculating the total number of connections, the connection between cell n and cell m is considered to be different from the connection between cell m and cell n. Thus, NJA is equal to the total number of connections, including n to m and m to n, and the total number of cells. | +| GWT | DISU | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to define the plan-view shape of each cell in the model grid. If NVERT is not specified or is specified as zero, then the VERTICES and CELL2D blocks below are not read. NVERT and the accompanying VERTICES and CELL2D blocks should be specified for most simulations. If the XT3D or SAVE\_SPECIFIC\_DISCHARGE options are specified in the NPF Package, then this information is required. | +| GWT | DISU | GRIDDATA | TOP | DOUBLE PRECISION (NODES) | is the top elevation for each cell in the model grid. | +| GWT | DISU | GRIDDATA | BOT | DOUBLE PRECISION (NODES) | is the bottom elevation for each cell. | +| GWT | DISU | GRIDDATA | AREA | DOUBLE PRECISION (NODES) | is the cell surface area (in plan view). | +| GWT | DISU | GRIDDATA | IDOMAIN | INTEGER (NODES) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1 or greater, the cell exists in the simulation. IDOMAIN values of -1 cannot be specified for the DISU Package. | +| GWT | DISU | CONNECTIONDATA | IAC | INTEGER (NODES) | is the number of connections (plus 1) for each cell. The sum of all the entries in IAC must be equal to NJA. | +| GWT | DISU | CONNECTIONDATA | JA | INTEGER (NJA) | is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWT cells and their connections to the other GWT cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code. | +| GWT | DISU | CONNECTIONDATA | IHC | INTEGER (NJA) | is an index array indicating the direction between node n and all of its m connections. If IHC = 0 then cell n and cell m are connected in the vertical direction. Cell n overlies cell m if the cell number for n is less than m; cell m overlies cell n if the cell number for m is less than n. If IHC = 1 then cell n and cell m are connected in the horizontal direction. If IHC = 2 then cell n and cell m are connected in the horizontal direction, and the connection is vertically staggered. A vertically staggered connection is one in which a cell is horizontally connected to more than one cell in a horizontal connection. | +| GWT | DISU | CONNECTIONDATA | CL12 | DOUBLE PRECISION (NJA) | is the array containing connection lengths between the center of cell n and the shared face with each adjacent m cell. | +| GWT | DISU | CONNECTIONDATA | HWVA | DOUBLE PRECISION (NJA) | is a symmetric array of size NJA. For horizontal connections, entries in HWVA are the horizontal width perpendicular to flow. For vertical connections, entries in HWVA are the vertical area for flow. Thus, values in the HWVA array contain dimensions of both length and area. Entries in the HWVA array have a one-to-one correspondence with the connections specified in the JA array. Likewise, there is a one-to-one correspondence between entries in the HWVA array and entries in the IHC array, which specifies the connection type (horizontal or vertical). Entries in the HWVA array must be symmetric; the program will terminate with an error if the value for HWVA for an n to m connection does not equal the value for HWVA for the corresponding n to m connection. | +| GWT | DISU | CONNECTIONDATA | ANGLDEGX | DOUBLE PRECISION (NJA) | is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specifed in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. | +| GWT | DISU | VERTICES | IV | INTEGER | is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. | +| GWT | DISU | VERTICES | XV | DOUBLE PRECISION | is the x-coordinate for the vertex. | +| GWT | DISU | VERTICES | YV | DOUBLE PRECISION | is the y-coordinate for the vertex. | +| GWT | DISU | CELL2D | ICELL2D | INTEGER | is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES. | +| GWT | DISU | CELL2D | XC | DOUBLE PRECISION | is the x-coordinate for the cell center. | +| GWT | DISU | CELL2D | YC | DOUBLE PRECISION | is the y-coordinate for the cell center. | +| GWT | DISU | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | +| GWT | DISU | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. | +| GWT | DISV | OPTIONS | LENGTH_UNITS | STRING | is the length units used for this model. Values can be ``FEET'', ``METERS'', or ``CENTIMETERS''. If not specified, the default is ``UNKNOWN''. | +| GWT | DISV | OPTIONS | NOGRB | KEYWORD | keyword to deactivate writing of the binary grid file. | +| GWT | DISV | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWT | DISV | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWT | DISV | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | +| GWT | DISV | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWT | DISV | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | +| GWT | DISV | DIMENSIONS | NCPL | INTEGER | is the number of cells per layer. This is a constant value for the grid and it applies to all layers. | +| GWT | DISV | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. | +| GWT | DISV | GRIDDATA | TOP | DOUBLE PRECISION (NCPL) | is the top elevation for each cell in the top model layer. | +| GWT | DISV | GRIDDATA | BOTM | DOUBLE PRECISION (NCPL, NLAY) | is the bottom elevation for each cell. | +| GWT | DISV | GRIDDATA | IDOMAIN | INTEGER (NCPL, NLAY) | is an optional array that characterizes the existence status of a cell. If the IDOMAIN array is not specified, then all model cells exist within the solution. If the IDOMAIN value for a cell is 0, the cell does not exist in the simulation. Input and output values will be read and written for the cell, but internal to the program, the cell is excluded from the solution. If the IDOMAIN value for a cell is 1, the cell exists in the simulation. If the IDOMAIN value for a cell is -1, the cell does not exist in the simulation. Furthermore, the first existing cell above will be connected to the first existing cell below. This type of cell is referred to as a ``vertical pass through'' cell. | +| GWT | DISV | VERTICES | IV | INTEGER | is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. | +| GWT | DISV | VERTICES | XV | DOUBLE PRECISION | is the x-coordinate for the vertex. | +| GWT | DISV | VERTICES | YV | DOUBLE PRECISION | is the y-coordinate for the vertex. | +| GWT | DISV | CELL2D | ICELL2D | INTEGER | is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. | +| GWT | DISV | CELL2D | XC | DOUBLE PRECISION | is the x-coordinate for the cell center. | +| GWT | DISV | CELL2D | YC | DOUBLE PRECISION | is the y-coordinate for the cell center. | +| GWT | DISV | CELL2D | NCVERT | INTEGER | is the number of vertices required to define the cell. There may be a different number of vertices for each cell. | +| GWT | DISV | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices. | +| GWT | DSP | OPTIONS | XT3D_OFF | KEYWORD | deactivate the xt3d method and use the faster and less accurate approximation. This option may provide a fast and accurate solution under some circumstances, such as when flow aligns with the model grid, there is no mechanical dispersion, or when the longitudinal and transverse dispersivities are equal. This option may also be used to assess the computational demand of the XT3D approach by noting the run time differences with and without this option on. | +| GWT | DSP | OPTIONS | XT3D_RHS | KEYWORD | add xt3d terms to right-hand side, when possible. This option uses less memory, but may require more iterations. | +| GWT | DSP | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWT | DSP | GRIDDATA | DIFFC | DOUBLE PRECISION (NODES) | effective molecular diffusion coefficient. | +| GWT | DSP | GRIDDATA | ALH | DOUBLE PRECISION (NODES) | longitudinal dispersivity in horizontal direction. If flow is strictly horizontal, then this is the longitudinal dispersivity that will be used. If flow is not strictly horizontal or strictly vertical, then the longitudinal dispersivity is a function of both ALH and ALV. If mechanical dispersion is represented (by specifying any dispersivity values) then this array is required. | +| GWT | DSP | GRIDDATA | ALV | DOUBLE PRECISION (NODES) | longitudinal dispersivity in vertical direction. If flow is strictly vertical, then this is the longitudinal dispsersivity value that will be used. If flow is not strictly horizontal or strictly vertical, then the longitudinal dispersivity is a function of both ALH and ALV. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ALH. | +| GWT | DSP | GRIDDATA | ATH1 | DOUBLE PRECISION (NODES) | transverse dispersivity in horizontal direction. This is the transverse dispersivity value for the second ellipsoid axis. If flow is strictly horizontal and directed in the x direction (along a row for a regular grid), then this value controls spreading in the y direction. If mechanical dispersion is represented (by specifying any dispersivity values) then this array is required. | +| GWT | DSP | GRIDDATA | ATH2 | DOUBLE PRECISION (NODES) | transverse dispersivity in horizontal direction. This is the transverse dispersivity value for the third ellipsoid axis. If flow is strictly horizontal and directed in the x direction (along a row for a regular grid), then this value controls spreading in the z direction. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ATH1. | +| GWT | DSP | GRIDDATA | ATV | DOUBLE PRECISION (NODES) | transverse dispersivity when flow is in vertical direction. If flow is strictly vertical and directed in the z direction, then this value controls spreading in the x and y directions. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ATH2. | +| GWT | FMI | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that FMI flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWT | FMI | OPTIONS | FLOW_IMBALANCE_CORRECTION | KEYWORD | correct for an imbalance in flows by assuming that any residual flow error comes in or leaves at the concentration of the cell. When this option is activated, the GWT Model budget written to the listing file will contain two additional entries: FLOW-ERROR and FLOW-CORRECTION. These two entries will be equal but opposite in sign. The FLOW-CORRECTION term is a mass flow that is added to offset the error caused by an imprecise flow balance. If these terms are not relatively small, the flow model should be rerun with stricter convergence tolerances. | +| GWT | FMI | PACKAGEDATA | FLOWTYPE | STRING | is the word GWFBUDGET, GWFHEAD, GWFMOVER or the name of an advanced GWF stress package. If GWFBUDGET is specified, then the corresponding file must be a budget file from a previous GWF Model run. If an advanced GWF stress package name appears then the corresponding file must be the budget file saved by a LAK, SFR, MAW or UZF Package. | +| GWT | FMI | PACKAGEDATA | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| GWT | FMI | PACKAGEDATA | FNAME | STRING | is the name of the file containing flows. The path to the file should be included if the file is not located in the folder where the program was run. | +| GWT | IC | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWT | IC | GRIDDATA | STRT | DOUBLE PRECISION (NODES) | is the initial (starting) concentration---that is, concentration at the beginning of the GWT Model simulation. STRT must be specified for all GWT Model simulations. One value is read for every model cell. | +| GWT | IST | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that IST flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWT | IST | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | +| GWT | IST | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | +| GWT | IST | OPTIONS | BUDGETFILE | STRING | name of the binary output file to write budget information. | +| GWT | IST | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | +| GWT | IST | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | +| GWT | IST | OPTIONS | SORPTION | KEYWORD | is a text keyword to indicate that sorption will be activated. Use of this keyword requires that BULK\_DENSITY and DISTCOEF are specified in the GRIDDATA block. The linear sorption isotherm is the only isotherm presently supported in the IST Package. | +| GWT | IST | OPTIONS | FIRST_ORDER_DECAY | KEYWORD | is a text keyword to indicate that first-order decay will occur. Use of this keyword requires that DECAY and DECAY\_SORBED (if sorption is active) are specified in the GRIDDATA block. | +| GWT | IST | OPTIONS | ZERO_ORDER_DECAY | KEYWORD | is a text keyword to indicate that zero-order decay will occur. Use of this keyword requires that DECAY and DECAY\_SORBED (if sorption is active) are specified in the GRIDDATA block. | +| GWT | IST | OPTIONS | CIM | KEYWORD | keyword to specify that record corresponds to immobile concentration. | +| GWT | IST | OPTIONS | CIMFILE | STRING | name of the output file to write immobile concentrations. This file is a binary file that has the same format and structure as a binary head and concentration file. The value for the text variable written to the file is CIM. Immobile domain concentrations will be written to this file at the same interval as mobile domain concentrations are saved, as specified in the GWT Model Output Control file. | +| GWT | IST | OPTIONS | PRINT_FORMAT | KEYWORD | keyword to specify format for printing to the listing file. | +| GWT | IST | OPTIONS | COLUMNS | INTEGER | number of columns for writing data. | +| GWT | IST | OPTIONS | WIDTH | INTEGER | width for writing each number. | +| GWT | IST | OPTIONS | DIGITS | INTEGER | number of digits to use for writing a number. | +| GWT | IST | OPTIONS | FORMAT | STRING | write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. | +| GWT | IST | GRIDDATA | POROSITY | DOUBLE PRECISION (NODES) | porosity of the immobile domain specified as the immobile domain pore volume per immobile domain volume. | +| GWT | IST | GRIDDATA | VOLFRAC | DOUBLE PRECISION (NODES) | fraction of the cell volume that consists of this immobile domain. The sum of all immobile domain volume fractions must be less than one. | +| GWT | IST | GRIDDATA | ZETAIM | DOUBLE PRECISION (NODES) | mass transfer rate coefficient between the mobile and immobile domains, in dimensions of per time. | +| GWT | IST | GRIDDATA | CIM | DOUBLE PRECISION (NODES) | initial concentration of the immobile domain in mass per length cubed. If CIM is not specified, then it is assumed to be zero. | +| GWT | IST | GRIDDATA | DECAY | DOUBLE PRECISION (NODES) | is the rate coefficient for first or zero-order decay for the aqueous phase of the immobile domain. A negative value indicates solute production. The dimensions of decay for first-order decay is one over time. The dimensions of decay for zero-order decay is mass per length cubed per time. Decay will have no effect on simulation results unless either first- or zero-order decay is specified in the options block. | +| GWT | IST | GRIDDATA | DECAY_SORBED | DOUBLE PRECISION (NODES) | is the rate coefficient for first or zero-order decay for the sorbed phase of the immobile domain. A negative value indicates solute production. The dimensions of decay\_sorbed for first-order decay is one over time. The dimensions of decay\_sorbed for zero-order decay is mass of solute per mass of aquifer per time. If decay\_sorbed is not specified and both decay and sorption are active, then the program will terminate with an error. decay\_sorbed will have no effect on simulation results unless the SORPTION keyword and either first- or zero-order decay are specified in the options block. | +| GWT | IST | GRIDDATA | BULK_DENSITY | DOUBLE PRECISION (NODES) | is the bulk density of this immobile domain in mass per length cubed. Bulk density is defined as the immobile domain solid mass per volume of the immobile domain. bulk\_density is not required unless the SORPTION keyword is specified in the options block. If the SORPTION keyword is not specified in the options block, bulk\_density will have no effect on simulation results. | +| GWT | IST | GRIDDATA | DISTCOEF | DOUBLE PRECISION (NODES) | is the distribution coefficient for the equilibrium-controlled linear sorption isotherm in dimensions of length cubed per mass. distcoef is not required unless the SORPTION keyword is specified in the options block. If the SORPTION keyword is not specified in the options block, distcoef will have no effect on simulation results. | +| GWT | LKT | OPTIONS | FLOW_PACKAGE_NAME | STRING | keyword to specify the name of the corresponding flow package. If not specified, then the corresponding flow package must have the same name as this advanced transport package (the name associated with this package in the GWT name file). | +| GWT | LKT | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | +| GWT | LKT | OPTIONS | FLOW_PACKAGE_AUXILIARY_NAME | STRING | keyword to specify the name of an auxiliary variable in the corresponding flow package. If specified, then the simulated concentrations from this advanced transport package will be copied into the auxiliary variable specified with this name. Note that the flow package must have an auxiliary variable with this name or the program will terminate with an error. If the flows for this advanced transport package are read from a file, then this option will have no effect. | +| GWT | LKT | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of lake cells. | +| GWT | LKT | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of lake information will be written to the listing file immediately after it is read. | +| GWT | LKT | OPTIONS | PRINT_CONCENTRATION | KEYWORD | keyword to indicate that the list of lake concentration will be printed to the listing file for every stress period in which ``CONCENTRATION PRINT'' is specified in Output Control. If there is no Output Control option and PRINT\_CONCENTRATION is specified, then concentration are printed for the last time step of each stress period. | +| GWT | LKT | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of lake flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| GWT | LKT | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that lake flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWT | LKT | OPTIONS | CONCENTRATION | KEYWORD | keyword to specify that record corresponds to concentration. | +| GWT | LKT | OPTIONS | CONCFILE | STRING | name of the binary output file to write concentration information. | +| GWT | LKT | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | +| GWT | LKT | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | +| GWT | LKT | OPTIONS | BUDGETFILE | STRING | name of the binary output file to write budget information. | +| GWT | LKT | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | +| GWT | LKT | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | +| GWT | LKT | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | +| GWT | LKT | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| GWT | LKT | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | +| GWT | LKT | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | +| GWT | LKT | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the LKT package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the LKT package. | +| GWT | LKT | PACKAGEDATA | IFNO | INTEGER | integer value that defines the feature (lake) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once. | +| GWT | LKT | PACKAGEDATA | STRT | DOUBLE PRECISION | real value that defines the starting concentration for the lake. | +| GWT | LKT | PACKAGEDATA | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each lake. The values of auxiliary variables must be present for each lake. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWT | LKT | PACKAGEDATA | BOUNDNAME | STRING | name of the lake cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | +| GWT | LKT | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| GWT | LKT | PERIOD | IFNO | INTEGER | integer value that defines the feature (lake) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NLAKES. | +| GWT | LKT | PERIOD | LAKSETTING | KEYSTRING | line of information that is parsed into a keyword and values. Keyword values that can be used to start the LAKSETTING string include: STATUS, CONCENTRATION, RAINFALL, EVAPORATION, RUNOFF, EXT-INFLOW, and AUXILIARY. These settings are used to assign the concentration of associated with the corresponding flow terms. Concentrations cannot be specified for all flow terms. For example, the Lake Package supports a ``WITHDRAWAL'' flow term. If this withdrawal term is active, then water will be withdrawn from the lake at the calculated concentration of the lake. | +| GWT | LKT | PERIOD | STATUS | STRING | keyword option to define lake status. STATUS can be ACTIVE, INACTIVE, or CONSTANT. By default, STATUS is ACTIVE, which means that concentration will be calculated for the lake. If a lake is inactive, then there will be no solute mass fluxes into or out of the lake and the inactive value will be written for the lake concentration. If a lake is constant, then the concentration for the lake will be fixed at the user specified value. | +| GWT | LKT | PERIOD | CONCENTRATION | STRING | real or character value that defines the concentration for the lake. The specified CONCENTRATION is only applied if the lake is a constant concentration lake. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWT | LKT | PERIOD | RAINFALL | STRING | real or character value that defines the rainfall solute concentration $(ML^{-3})$ for the lake. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWT | LKT | PERIOD | EVAPORATION | STRING | real or character value that defines the concentration of evaporated water $(ML^{-3})$ for the lake. If this concentration value is larger than the simulated concentration in the lake, then the evaporated water will be removed at the same concentration as the lake. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWT | LKT | PERIOD | RUNOFF | STRING | real or character value that defines the concentration of runoff $(ML^{-3})$ for the lake. Value must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWT | LKT | PERIOD | EXT-INFLOW | STRING | real or character value that defines the concentration of external inflow $(ML^{-3})$ for the lake. Value must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWT | LKT | PERIOD | AUXILIARY | KEYWORD | keyword for specifying auxiliary variable. | +| GWT | LKT | PERIOD | AUXNAME | STRING | name for the auxiliary variable to be assigned AUXVAL. AUXNAME must match one of the auxiliary variable names defined in the OPTIONS block. If AUXNAME does not match one of the auxiliary variable names defined in the OPTIONS block the data are ignored. | +| GWT | LKT | PERIOD | AUXVAL | DOUBLE PRECISION | value for the auxiliary variable. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWT | MST | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that MST flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWT | MST | OPTIONS | FIRST_ORDER_DECAY | KEYWORD | is a text keyword to indicate that first-order decay will occur. Use of this keyword requires that DECAY and DECAY\_SORBED (if sorption is active) are specified in the GRIDDATA block. | +| GWT | MST | OPTIONS | ZERO_ORDER_DECAY | KEYWORD | is a text keyword to indicate that zero-order decay will occur. Use of this keyword requires that DECAY and DECAY\_SORBED (if sorption is active) are specified in the GRIDDATA block. | +| GWT | MST | OPTIONS | SORPTION | STRING | is a text keyword to indicate that sorption will be activated. Valid sorption options include LINEAR, FREUNDLICH, and LANGMUIR. Use of this keyword requires that BULK\_DENSITY and DISTCOEF are specified in the GRIDDATA block. If sorption is specified as FREUNDLICH or LANGMUIR then SP2 is also required in the GRIDDATA block. | +| GWT | MST | GRIDDATA | POROSITY | DOUBLE PRECISION (NODES) | is the mobile domain porosity, defined as the mobile domain pore volume per mobile domain volume. Additional information on porosity within the context of mobile and immobile domain transport simulations is included in the MODFLOW 6 Supplemental Technical Information document. | +| GWT | MST | GRIDDATA | DECAY | DOUBLE PRECISION (NODES) | is the rate coefficient for first or zero-order decay for the aqueous phase of the mobile domain. A negative value indicates solute production. The dimensions of decay for first-order decay is one over time. The dimensions of decay for zero-order decay is mass per length cubed per time. decay will have no effect on simulation results unless either first- or zero-order decay is specified in the options block. | +| GWT | MST | GRIDDATA | DECAY_SORBED | DOUBLE PRECISION (NODES) | is the rate coefficient for first or zero-order decay for the sorbed phase of the mobile domain. A negative value indicates solute production. The dimensions of decay\_sorbed for first-order decay is one over time. The dimensions of decay\_sorbed for zero-order decay is mass of solute per mass of aquifer per time. If decay\_sorbed is not specified and both decay and sorption are active, then the program will terminate with an error. decay\_sorbed will have no effect on simulation results unless the SORPTION keyword and either first- or zero-order decay are specified in the options block. | +| GWT | MST | GRIDDATA | BULK_DENSITY | DOUBLE PRECISION (NODES) | is the bulk density of the aquifer in mass per length cubed. bulk\_density is not required unless the SORPTION keyword is specified. Bulk density is defined as the mobile domain solid mass per mobile domain volume. Additional information on bulk density is included in the MODFLOW 6 Supplemental Technical Information document. | +| GWT | MST | GRIDDATA | DISTCOEF | DOUBLE PRECISION (NODES) | is the distribution coefficient for the equilibrium-controlled linear sorption isotherm in dimensions of length cubed per mass. distcoef is not required unless the SORPTION keyword is specified. | +| GWT | MST | GRIDDATA | SP2 | DOUBLE PRECISION (NODES) | is the exponent for the Freundlich isotherm and the sorption capacity for the Langmuir isotherm. | +| GWT | MVT | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of mover information will be written to the listing file immediately after it is read. | +| GWT | MVT | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of lake flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| GWT | MVT | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that lake flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWT | MVT | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | +| GWT | MVT | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | +| GWT | MVT | OPTIONS | BUDGETFILE | STRING | name of the binary output file to write budget information. | +| GWT | MVT | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | +| GWT | MVT | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | +| GWT | MWT | OPTIONS | FLOW_PACKAGE_NAME | STRING | keyword to specify the name of the corresponding flow package. If not specified, then the corresponding flow package must have the same name as this advanced transport package (the name associated with this package in the GWT name file). | +| GWT | MWT | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | +| GWT | MWT | OPTIONS | FLOW_PACKAGE_AUXILIARY_NAME | STRING | keyword to specify the name of an auxiliary variable in the corresponding flow package. If specified, then the simulated concentrations from this advanced transport package will be copied into the auxiliary variable specified with this name. Note that the flow package must have an auxiliary variable with this name or the program will terminate with an error. If the flows for this advanced transport package are read from a file, then this option will have no effect. | +| GWT | MWT | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of well cells. | +| GWT | MWT | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of well information will be written to the listing file immediately after it is read. | +| GWT | MWT | OPTIONS | PRINT_CONCENTRATION | KEYWORD | keyword to indicate that the list of well concentration will be printed to the listing file for every stress period in which ``CONCENTRATION PRINT'' is specified in Output Control. If there is no Output Control option and PRINT\_CONCENTRATION is specified, then concentration are printed for the last time step of each stress period. | +| GWT | MWT | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of well flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| GWT | MWT | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that well flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWT | MWT | OPTIONS | CONCENTRATION | KEYWORD | keyword to specify that record corresponds to concentration. | +| GWT | MWT | OPTIONS | CONCFILE | STRING | name of the binary output file to write concentration information. | +| GWT | MWT | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | +| GWT | MWT | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | +| GWT | MWT | OPTIONS | BUDGETFILE | STRING | name of the binary output file to write budget information. | +| GWT | MWT | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | +| GWT | MWT | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | +| GWT | MWT | OPTIONS | TS6 | KEYWORD | keyword to specify that record corresponds to a time-series file. | +| GWT | MWT | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| GWT | MWT | OPTIONS | TS6_FILENAME | STRING | defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability. | +| GWT | MWT | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | +| GWT | MWT | OPTIONS | OBS6_FILENAME | STRING | name of input file to define observations for the MWT package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the MWT package. | +| GWT | MWT | PACKAGEDATA | IFNO | INTEGER | integer value that defines the feature (well) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. Well information must be specified for every well or the program will terminate with an error. The program will also terminate with an error if information for a well is specified more than once. | +| GWT | MWT | PACKAGEDATA | STRT | DOUBLE PRECISION | real value that defines the starting concentration for the well. | +| GWT | MWT | PACKAGEDATA | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each well. The values of auxiliary variables must be present for each well. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWT | MWT | PACKAGEDATA | BOUNDNAME | STRING | name of the well cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | +| GWT | MWT | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| GWT | MWT | PERIOD | IFNO | INTEGER | integer value that defines the feature (well) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. | +| GWT | MWT | PERIOD | MWTSETTING | KEYSTRING | line of information that is parsed into a keyword and values. Keyword values that can be used to start the MWTSETTING string include: STATUS, CONCENTRATION, RATE, and AUXILIARY. These settings are used to assign the concentration associated with the corresponding flow terms. Concentrations cannot be specified for all flow terms. For example, the Multi-Aquifer Well Package supports a ``WITHDRAWAL'' flow term. If this withdrawal term is active, then water will be withdrawn from the well at the calculated concentration of the well. | +| GWT | MWT | PERIOD | STATUS | STRING | keyword option to define well status. STATUS can be ACTIVE, INACTIVE, or CONSTANT. By default, STATUS is ACTIVE, which means that concentration will be calculated for the well. If a well is inactive, then there will be no solute mass fluxes into or out of the well and the inactive value will be written for the well concentration. If a well is constant, then the concentration for the well will be fixed at the user specified value. | +| GWT | MWT | PERIOD | CONCENTRATION | STRING | real or character value that defines the concentration for the well. The specified CONCENTRATION is only applied if the well is a constant concentration well. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWT | MWT | PERIOD | RATE | STRING | real or character value that defines the injection solute concentration $(ML^{-3})$ for the well. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWT | MWT | PERIOD | AUXILIARY | KEYWORD | keyword for specifying auxiliary variable. | +| GWT | MWT | PERIOD | AUXNAME | STRING | name for the auxiliary variable to be assigned AUXVAL. AUXNAME must match one of the auxiliary variable names defined in the OPTIONS block. If AUXNAME does not match one of the auxiliary variable names defined in the OPTIONS block the data are ignored. | +| GWT | MWT | PERIOD | AUXVAL | DOUBLE PRECISION | value for the auxiliary variable. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWT | NAM | OPTIONS | LIST | STRING | is name of the listing file to create for this GWT model. If not specified, then the name of the list file will be the basename of the GWT model name file and the '.lst' extension. For example, if the GWT name file is called ``my.model.nam'' then the list file will be called ``my.model.lst''. | +| GWT | NAM | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of all model stress package information will be written to the listing file immediately after it is read. | +| GWT | NAM | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of all model package flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| GWT | NAM | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that all model package flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWT | NAM | PACKAGES | FTYPE | STRING | is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. | +| GWT | NAM | PACKAGES | FNAME | STRING | is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. | +| GWT | NAM | PACKAGES | PNAME | STRING | is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single GWT Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. | +| GWT | OC | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | +| GWT | OC | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | +| GWT | OC | OPTIONS | BUDGETFILE | STRING | name of the output file to write budget information. | +| GWT | OC | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | +| GWT | OC | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | +| GWT | OC | OPTIONS | CONCENTRATION | KEYWORD | keyword to specify that record corresponds to concentration. | +| GWT | OC | OPTIONS | CONCENTRATIONFILE | STRING | name of the output file to write conc information. | +| GWT | OC | OPTIONS | PRINT_FORMAT | KEYWORD | keyword to specify format for printing to the listing file. | +| GWT | OC | OPTIONS | COLUMNS | INTEGER | number of columns for writing data. | +| GWT | OC | OPTIONS | WIDTH | INTEGER | width for writing each number. | +| GWT | OC | OPTIONS | DIGITS | INTEGER | number of digits to use for writing a number. | +| GWT | OC | OPTIONS | FORMAT | STRING | write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. | +| GWT | OC | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | +| GWT | OC | PERIOD | SAVE | KEYWORD | keyword to indicate that information will be saved this stress period. | +| GWT | OC | PERIOD | PRINT | KEYWORD | keyword to indicate that information will be printed this stress period. | +| GWT | OC | PERIOD | RTYPE | STRING | type of information to save or print. Can be BUDGET or CONCENTRATION. | +| GWT | OC | PERIOD | OCSETTING | KEYSTRING | specifies the steps for which the data will be saved. | +| GWT | OC | PERIOD | ALL | KEYWORD | keyword to indicate save for all time steps in period. | +| GWT | OC | PERIOD | FIRST | KEYWORD | keyword to indicate save for first step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | +| GWT | OC | PERIOD | LAST | KEYWORD | keyword to indicate save for last step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | +| GWT | OC | PERIOD | FREQUENCY | INTEGER | save at the specified time step frequency. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | +| GWT | OC | PERIOD | STEPS | INTEGER ( 0: @@ -191,13 +179,20 @@ def parse_mf6var_file(fname): else: key = name if key in vardict: - raise Exception("Variable already exists in dictionary: " + name) + raise ValueError(f"Variable already exists in dictionary: {k}") vardict[key] = vd return vardict -COMMONDESCRIPTIONS = parse_mf6var_file(os.path.join(".", "dfn", "common.dfn")) - +MF6IVAR_DIR_PATH = Path(__file__).parent +DFNS_DIR_PATH = MF6IVAR_DIR_PATH / "dfn" +EXAMPLES_DIR_PATH = MF6IVAR_DIR_PATH / "examples" +MD_DIR_PATH = MF6IVAR_DIR_PATH / "md" +TEX_DIR_PATH = MF6IVAR_DIR_PATH / "tex" +RTD_DOC_DIR_PATH = Path(__file__).parents[3] / ".build_rtd_docs" / "_mf6io" +COMMON_DFN_PATH = parse_mf6var_file(DFNS_DIR_PATH / "common.dfn") +COMMON_DIR_PATH = MF6IVAR_DIR_PATH.parent.parent / "Common" +DEFAULT_MODELS = ["gwf", "gwt", "gwe", "prt", "swf"] VALID_TYPES = [ "integer", "double precision", @@ -278,14 +273,8 @@ def block_entry(varname, block, vardict, prefix=" "): return s -def write_block( - vardict, block, blk_var_list, varexcludeprefix=None, indent=None -): - if indent is None: - prepend = "" - else: - prepend = indent * " " - +def write_block(vardict, block, blk_var_list, varexcludeprefix=None, indent=None): + prepend = "" if indent is None else indent * " " s = prepend + "BEGIN {}".format(block.upper()) for variable in blk_var_list: ts = block_entry(variable[0], block, vardict).strip() @@ -294,7 +283,7 @@ def write_block( else: s = "{} {}".format(s, ts) s += "\n" - for iv, key in enumerate(vardict): + for key in vardict.keys(): name, b = key v = vardict[key] if b == block: @@ -333,11 +322,10 @@ def get_description(desc): """ if desc.strip().split()[0] == "REPLACE": bcoption = desc.strip().split()[1] - constantstring = COMMONDESCRIPTIONS[bcoption]["description"] + constantstring = COMMON_DFN_PATH[bcoption]["description"] istart = desc.index("{") istop = desc.rfind("}") + 1 d = eval(desc[istart:istop]) - # d = eval(desc[desc.index('{'):]) for k in d: v = d[k] constantstring = constantstring.replace(k, v) @@ -347,7 +335,7 @@ def get_description(desc): def write_desc(vardict, block, blk_var_list, varexcludeprefix=None): s = "" - for iv, (name, b) in enumerate(vardict): + for name, b in vardict.keys(): v = vardict[(name, b)] if v["block"] == block: if "block_variable" in v and v["block_variable"]: @@ -409,7 +397,7 @@ def write_desc(vardict, block, blk_var_list, varexcludeprefix=None): def write_desc_md(vardict, block, blk_var_list, varexcludeprefix=None): s = "" - for iv, (name, b) in enumerate(vardict): + for name, b in vardict.keys(): v = vardict[(name, b)] if v["block"] == block: if "block_variable" in v and v["block_variable"]: @@ -505,12 +493,10 @@ def md_replace(s): def get_examples(component): - pth = os.path.join("examples") files = [ filename - for filename in sorted(os.listdir(pth)) - if component.lower() in filename.lower() - and "-obs" not in filename.lower() + for filename in sorted(os.listdir(EXAMPLES_DIR_PATH)) + if component.lower() in filename.lower() and "-obs" not in filename.lower() ] s = "" for idx, filename in enumerate(files): @@ -518,7 +504,7 @@ def get_examples(component): s += "#### Example Input File\n" if len(files) > 1: s += "Example {}\n\n".format(idx + 1) - fpth = os.path.join(pth, filename) + fpth = os.path.join(EXAMPLES_DIR_PATH, filename) with open(fpth, "r") as f: lines = f.readlines() s += "```\n" @@ -530,10 +516,9 @@ def get_examples(component): def get_obs_examples(component): - pth = os.path.join("examples") files = [ filename - for filename in sorted(os.listdir(pth)) + for filename in sorted(os.listdir(EXAMPLES_DIR_PATH)) if component.lower() in filename.lower() and "-obs" in filename.lower() ] s = "" @@ -541,7 +526,7 @@ def get_obs_examples(component): s += "#### Example Observation Input File\n" if len(files) > 1: s += "Example {}\n\n".format(idx + 1) - fpth = os.path.join(pth, filename) + fpth = os.path.join(EXAMPLES_DIR_PATH, filename) with open(fpth, "r") as f: lines = f.readlines() s += "```\n" @@ -553,24 +538,19 @@ def get_obs_examples(component): def get_obs_table(component): - pth = os.path.join("..", "..", "Common") files = [ filename - for filename in sorted(os.listdir(pth)) + for filename in sorted(os.listdir(COMMON_DIR_PATH)) if component.lower() in filename.lower() and filename.lower().endswith("obs.tex") ] s = "" if files: s += "#### Available Observation Types\n\n" - s += ( - "| Stress Package | Observation Type | ID1 | ID2 | Description |\n" - ) - s += ( - "|----------------|------------------|-----|-----|-------------|\n" - ) - for idx, filename in enumerate(files): - fpth = os.path.join(pth, filename) + s += "| Stress Package | Observation Type | ID1 | ID2 | Description |\n" + s += "|----------------|------------------|-----|-----|-------------|\n" + for filename in files: + fpth = os.path.join(COMMON_DIR_PATH, filename) with open(fpth, "r") as f: lines = f.readlines() for line in lines: @@ -589,22 +569,21 @@ def get_obs_table(component): def write_md_header(f): s = "# MODFLOW 6 INPUT VARIABLES\n\n" - fmd.write(s) + f.write(s) s = "| {} | {} | {} | {} | {} | {} |\n".format( "component", "package", "block", "variable name", "type", "description" ) - fmd.write(s) + f.write(s) s = "| {} | {} | {} | {} | {} | {} |\n".format( ":---:", ":---:", ":---:", ":---:", ":---:", "---" ) - fmd.write(s) - return + f.write(s) def write_md(f, vardict, component, package): c = component.upper() p = package.upper() - for iv, (name, b) in enumerate(vardict): + for name, b in vardict.keys(): n = name.upper() v = vardict[(name, b)] b = v["block"].upper() @@ -622,12 +601,10 @@ def write_md(f, vardict, component, package): d = get_description(v["description"]) s = "| {} | {} | {} | {} | {} | {} |\n".format(c, p, b, n, t, d) f.write(s) - return -def write_appendix(texdir, allblocks): - fname = os.path.join(texdir, "appendixA.tex") - with open(fname, "w") as f: +def write_appendix(blocks): + with open(Path(TEX_DIR_PATH) / "appendixA.tex", "w") as f: f.write("\\small\n\\begin{longtable}{p{1.5cm} p{1.5cm} p{3cm} c}\n") f.write( "\\caption{List of block names organized by component and input file " @@ -655,7 +632,7 @@ def write_appendix(texdir, allblocks): f.write("\\hline\n\\endhead\n\n\\hline\n\\endfoot\n\n\n") lastftype = "" - for b in allblocks: + for b in blocks: l = b.strip().split("-") component, ftype, blockname = l if lastftype != ftype: @@ -675,168 +652,49 @@ def write_appendix(texdir, allblocks): f.write(s) lastftype = ftype - f.write( - "\n\n\\hline\n\\end{longtable}\n\\label{table:blocks}\n\\normalsize\n" - ) + f.write("\n\n\\hline\n\\end{longtable}\n\\label{table:blocks}\n\\normalsize\n") -if __name__ == "__main__": - file_order = [ - "sim-nam", # dfn completed tex updated - "sim-tdis", # dfn completed tex updated - "exg-gwfgwf", # dfn completed tex updated - "exg-gwfgwt", - "exg-gwtgwt", - "exg-gwfgwe", - "exg-gwegwe", - "exg-gwfprt", - "exg-swfgwf", - "sln-ims", # dfn completed tex updated - "sln-ems", # dfn completed tex updated - "sln-pts", - "gwf-nam", # dfn completed tex updated - "gwf-dis", # dfn completed tex updated - "gwf-disv", # dfn completed tex updated - "gwf-disu", # dfn completed tex updated - "gwf-ic", # dfn completed tex updated - "gwf-npf", # dfn completed tex updated - "gwf-buy", # dfn completed tex updated - "gwf-sto", # dfn completed tex updated - "gwf-csub", # dfn completed tex updated - "gwf-hfb", # dfn completed tex updated - "gwf-chd", # dfn completed tex updated - "gwf-wel", # dfn completed tex updated - "gwf-drn", # dfn completed tex updated - "gwf-riv", # dfn completed tex updated - "gwf-ghb", # dfn completed tex updated - "gwf-rch", # dfn completed tex updated - "gwf-rcha", # dfn completed tex updated - "gwf-evt", # dfn completed tex updated - "gwf-evta", # dfn completed tex updated - "gwf-maw", # dfn completed tex updated - "gwf-sfr", # dfn completed tex updated - "gwf-lak", # dfn completed tex updated - "gwf-uzf", # dfn completed tex updated - "gwf-mvr", # dfn completed tex updated - "gwf-gnc", # dfn completed tex updated - "gwf-oc", # dfn completed tex updated - "gwf-vsc", - "gwf-api", - "gwt-adv", - "gwt-dsp", - "gwt-cnc", - "gwt-dis", - "gwt-disv", - "gwt-disu", - "gwt-ic", - "gwt-nam", - "gwt-oc", - "gwt-ssm", - "gwt-src", - "gwt-mst", - "gwt-ist", - "gwt-sft", - "gwt-lkt", - "gwt-mwt", - "gwt-uzt", - "gwt-fmi", - "gwt-mvt", - "gwt-api", - "gwe-adv", - "gwe-cnd", - "gwe-ctp", - "gwe-dis", - "gwe-disv", - "gwe-disu", - "gwe-esl", - "gwe-est", - "gwe-ic", - "gwe-lke", - "gwe-mwe", - "gwe-nam", - "gwe-oc", - "gwe-ssm", - "gwe-sfe", - "gwe-uze", - "gwe-fmi", - "swf-nam", - "swf-disv1d", - "swf-dis2d", - "swf-disv2d", - "swf-dfw", - "swf-cxs", - "swf-ic", - "swf-sto", - "swf-oc", - "swf-chd", - "swf-cdb", - "swf-flw", - "swf-zdg", - 'prt-nam', - 'prt-dis', - 'prt-disv', - 'prt-mip', - 'prt-prp', - 'prt-oc', - 'prt-fmi', - "utl-spc", - "utl-spca", - "utl-spt", - "utl-spta", - "utl-obs", - "utl-laktab", - "utl-sfrtab", - "utl-ts", - "utl-tas", - "utl-ats", - "utl-tvk", - "utl-tvs", - ] +def get_dfn_files(models): + def is_sim_dfn(stem): + return "sim" in stem + + def is_sln_dfn(stem): + return "sln" in stem - # directories - dfndir = os.path.join(".", "dfn") - texdir = os.path.join(".", "tex") - mddir = os.path.join(".", "md") - docdir = os.path.join("..", "..", "..", ".build_rtd_docs", "_mf6io") + def is_utl_dfn(stem): + return "utl" in stem - # regenerate docdir - if os.path.isdir(docdir): - shutil.rmtree(docdir) - os.makedirs(docdir) + def is_model_dfn(stem): + return any(stem.startswith(m) for m in models) - # list for storing all block names - allblocks = [] + def is_exg_dfn(stem): + exg = stem.rpartition("-")[2] + left = exg[:3] + right = exg[-3:] + return left in models and right in models - # setup a markdown file - fname = os.path.join(mddir, "mf6ivar.md") - with open(fname, "w") as fmd: + files = list(DFNS_DIR_PATH.glob("*.dfn")) + files = ( + sorted([f for f in files if is_sim_dfn(f.stem)]) + + sorted([f for f in files if is_exg_dfn(f.stem)]) + + sorted([f for f in files if is_sln_dfn(f.stem)]) + + sorted([f for f in files if is_model_dfn(f.stem)]) + + sorted([f for f in files if is_utl_dfn(f.stem)]) + ) + return files + + +def write_variables(): + allblocks = [] # cumulative list of all block names + + # write markdown input variables file + with open(MD_DIR_PATH / "mf6ivar.md", "w") as fmd: write_md_header(fmd) - # construct list of dfn files to process in the order of file_order - files = os.listdir(dfndir) - for f in files: - if "common" in f: - continue - if ".DS_Store" in f: - continue - if os.path.splitext(f)[0] not in file_order: - raise Exception("File not in file_order: ", f) - files = [ - fname + ".dfn" for fname in file_order if fname + ".dfn" in files - ] - # files = ['gwf-obs.dfn'] - - # # create rst file for markdown - # fpth = os.path.join(docdir, "mf6io.rst") - # frst = open(fpth, "w") - # s = ".. toctree::\n" - # s += " :maxdepth: 4\n" - # s += " :name: mf6-io\n\n" - # frst.write(s) - - for txtname in files: - component, package = os.path.splitext(txtname)[0].split("-")[0:2] - vardict = parse_mf6var_file(os.path.join(dfndir, txtname)) + for fpath in dfns: + component, package = fpath.stem.split("-")[0:2] + vardict = parse_mf6var_file(fpath) # make list of unique block names blocks = [] @@ -852,117 +710,137 @@ def write_appendix(texdir, allblocks): allblocks.append(b) # go through each block and write information - desc = "% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py \n\n" + desc = ( + "% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py \n\n" + ) for b in blocks: blk_var_list = [] # Write the name of the block to the latex file - desc += "\item \\textbf{}\n\n".format( - "{Block: " + b.upper() + "}" - ) - + desc += "\item \\textbf{}\n\n".format("{Block: " + b.upper() + "}") desc += "\\begin{description}\n" - desc += write_desc( - vardict, b, blk_var_list, varexcludeprefix="dev_" - ) + desc += write_desc(vardict, b, blk_var_list, varexcludeprefix="dev_") desc += "\\end{description}\n" - fname = os.path.join( - texdir, os.path.splitext(txtname)[0] + "-" + b + ".dat" - ) - f = open(fname, "w") - s = ( - write_block( - vardict, b, blk_var_list, varexcludeprefix="dev_" + with open(TEX_DIR_PATH / f"{fpath.stem}-{b}.dat", "w") as f: + s = ( + write_block(vardict, b, blk_var_list, varexcludeprefix="dev_") + + "\n" ) - + "\n" - ) + f.write(s) + if verbose: + print(s) + + with open(TEX_DIR_PATH / f"{fpath.stem}-desc.tex", "w") as f: + s = desc + "\n" f.write(s) - if VERBOSE: + if verbose: print(s) - f.close() - fname = os.path.join( - texdir, os.path.splitext(txtname)[0] + "-desc" + ".tex" - ) - f = open(fname, "w") - s = desc + "\n" - f.write(s) - if VERBOSE: - print(s) - f.close() # write markdown description - mdname = os.path.splitext(txtname)[0] - fname = os.path.join(docdir, mdname + ".md") - f = open(fname, "w") - f.write("### {}\n\n".format(mdname.upper())) - f.write("#### Structure of Blocks\n\n") - f.write("_FOR EACH SIMULATION_\n\n") - desc = "" - for b in blocks: - blk_var_list = [] + mdname = fpath.stem + with open(RTD_DOC_DIR_PATH / f"{mdname}.md", "w") as f: + f.write("### {}\n\n".format(mdname.upper())) + f.write("#### Structure of Blocks\n\n") + f.write("_FOR EACH SIMULATION_\n\n") + desc = "" + for b in blocks: + blk_var_list = [] + + # Write the name of the block to the latex file + desc += "##### Block: {}\n\n".format(b.upper()) + + desc += write_desc_md( + vardict, b, blk_var_list, varexcludeprefix="dev_" + ) - # Write the name of the block to the latex file - desc += "##### Block: {}\n\n".format(b.upper()) - - desc += write_desc_md( - vardict, b, blk_var_list, varexcludeprefix="dev_" - ) - - if "period" in b.lower(): - f.write("\n_FOR ANY STRESS PERIOD_\n\n") - f.write("```\n") - s = ( - md_replace( - write_block( - vardict, - b, - blk_var_list, - varexcludeprefix="dev_", - indent=4, + if "period" in b.lower(): + f.write("\n_FOR ANY STRESS PERIOD_\n\n") + f.write("```\n") + s = ( + md_replace( + write_block( + vardict, + b, + blk_var_list, + varexcludeprefix="dev_", + indent=4, + ) ) + + "\n" ) - + "\n" - ) - # s = s.replace("@", "") + "\n" - f.write(s) - f.write("```\n") - if VERBOSE: - print(s) - - f.write("\n#### Explanation of Variables\n\n") - f.write(desc) - - # add examples - s = get_examples(mdname) - if len(s) > 0: - f.write(s) + f.write(s) + f.write("```\n") + if verbose: + print(s) - # add observation table - s = get_obs_table(mdname) - if len(s) > 0: - f.write(s) + f.write("\n#### Explanation of Variables\n\n") + f.write(desc) - # add observation examples - s = get_obs_examples(mdname) - if len(s) > 0: - f.write(s) + # add examples + s = get_examples(mdname) + if len(s) > 0: + f.write(s) - # close the markdown file - f.close() + # add observation table + s = get_obs_table(mdname) + if len(s) > 0: + f.write(s) - # # add to rst catalog - # s = " {}\n".format(os.path.basename(fname)) - # frst.write(s) + # add observation examples + s = get_obs_examples(mdname) + if len(s) > 0: + f.write(s) # write markdown write_md(fmd, vardict, component, package) - # # close restart catalog - # frst.write("\n\n") - # frst.close() + return allblocks - if VERBOSE: - for b in allblocks: - print(b) - write_appendix(texdir, allblocks) + +if __name__ == "__main__": + # parse arguments + parser = ArgumentParser( + prog="Generate MF6 IO documentation files from DFN files", + formatter_class=RawDescriptionHelpFormatter, + epilog=textwrap.dedent( + """\ + Generate markdown and latex files for MF6 IO documents + from DFN files. This script reads DFN files and creates + tables and appendices describing input/output variables + supported by MODFLOW 6. + """ + ), + ) + parser.add_argument( + "-m", + "--model", + required=False, + action="append", + help="Filter models to include", + ) + parser.add_argument( + "-v", + "--verbose", + required=False, + default=False, + action="store_true", + help="Whether to show verbose output", + ) + args = parser.parse_args() + models = args.model if args.model else DEFAULT_MODELS + verbose = args.verbose + + # clean/recreate docdir + if os.path.isdir(RTD_DOC_DIR_PATH): + shutil.rmtree(RTD_DOC_DIR_PATH) + os.makedirs(RTD_DOC_DIR_PATH) + + # filter dfn files corresponding to the selected set of models + # and write variables and appendix to markdown and latex files + dfns = get_dfn_files(models) + blocks = write_variables() + write_appendix(blocks) + if verbose: + for block in blocks: + print(block) diff --git a/doc/mf6io/mf6ivar/tex/appendixA.tex b/doc/mf6io/mf6ivar/tex/appendixA.tex index 1108af6ba01..7915b054671 100644 --- a/doc/mf6io/mf6ivar/tex/appendixA.tex +++ b/doc/mf6io/mf6ivar/tex/appendixA.tex @@ -33,6 +33,10 @@ SIM & TDIS & DIMENSIONS & yes \\ SIM & TDIS & PERIODDATA & yes \\ \hline +EXG & GWEGWE & OPTIONS & yes \\ +EXG & GWEGWE & DIMENSIONS & yes \\ +EXG & GWEGWE & EXCHANGEDATA & yes \\ +\hline EXG & GWFGWF & OPTIONS & yes \\ EXG & GWFGWF & DIMENSIONS & yes \\ EXG & GWFGWF & EXCHANGEDATA & yes \\ @@ -41,10 +45,6 @@ EXG & GWTGWT & DIMENSIONS & yes \\ EXG & GWTGWT & EXCHANGEDATA & yes \\ \hline -EXG & GWEGWE & OPTIONS & yes \\ -EXG & GWEGWE & DIMENSIONS & yes \\ -EXG & GWEGWE & EXCHANGEDATA & yes \\ -\hline EXG & SWFGWF & OPTIONS & yes \\ EXG & SWFGWF & DIMENSIONS & yes \\ EXG & SWFGWF & EXCHANGEDATA & yes \\ @@ -56,39 +56,82 @@ SLN & PTS & OPTIONS & yes \\ SLN & PTS & NONLINEAR & yes \\ \hline -GWF & NAM & OPTIONS & yes \\ -GWF & NAM & PACKAGES & yes \\ +GWE & ADV & OPTIONS & yes \\ \hline -GWF & DIS & OPTIONS & yes \\ -GWF & DIS & DIMENSIONS & yes \\ -GWF & DIS & GRIDDATA & no \\ +GWE & CND & OPTIONS & yes \\ +GWE & CND & GRIDDATA & no \\ \hline -GWF & DISV & OPTIONS & yes \\ -GWF & DISV & DIMENSIONS & yes \\ -GWF & DISV & GRIDDATA & no \\ -GWF & DISV & VERTICES & yes \\ -GWF & DISV & CELL2D & yes \\ +GWE & CTP & OPTIONS & yes \\ +GWE & CTP & DIMENSIONS & yes \\ +GWE & CTP & PERIOD & yes \\ \hline -GWF & DISU & OPTIONS & yes \\ -GWF & DISU & DIMENSIONS & yes \\ -GWF & DISU & GRIDDATA & no \\ -GWF & DISU & CONNECTIONDATA & yes \\ -GWF & DISU & VERTICES & yes \\ -GWF & DISU & CELL2D & yes \\ +GWE & DIS & OPTIONS & yes \\ +GWE & DIS & DIMENSIONS & yes \\ +GWE & DIS & GRIDDATA & no \\ \hline -GWF & IC & OPTIONS & yes \\ -GWF & IC & GRIDDATA & no \\ +GWE & DISU & OPTIONS & yes \\ +GWE & DISU & DIMENSIONS & yes \\ +GWE & DISU & GRIDDATA & no \\ +GWE & DISU & CONNECTIONDATA & yes \\ +GWE & DISU & VERTICES & yes \\ +GWE & DISU & CELL2D & yes \\ \hline -GWF & NPF & OPTIONS & yes \\ -GWF & NPF & GRIDDATA & no \\ +GWE & DISV & OPTIONS & yes \\ +GWE & DISV & DIMENSIONS & yes \\ +GWE & DISV & GRIDDATA & no \\ +GWE & DISV & VERTICES & yes \\ +GWE & DISV & CELL2D & yes \\ +\hline +GWE & ESL & OPTIONS & yes \\ +GWE & ESL & DIMENSIONS & yes \\ +GWE & ESL & PERIOD & yes \\ +\hline +GWE & EST & OPTIONS & yes \\ +GWE & EST & GRIDDATA & no \\ +GWE & EST & PACKAGEDATA & yes \\ +\hline +GWE & FMI & OPTIONS & yes \\ +GWE & FMI & PACKAGEDATA & yes \\ +\hline +GWE & IC & OPTIONS & yes \\ +GWE & IC & GRIDDATA & no \\ +\hline +GWE & LKE & OPTIONS & yes \\ +GWE & LKE & PACKAGEDATA & yes \\ +GWE & LKE & PERIOD & yes \\ +\hline +GWE & MWE & OPTIONS & yes \\ +GWE & MWE & PACKAGEDATA & yes \\ +GWE & MWE & PERIOD & yes \\ +\hline +GWE & NAM & OPTIONS & yes \\ +GWE & NAM & PACKAGES & yes \\ +\hline +GWE & OC & OPTIONS & yes \\ +GWE & OC & PERIOD & yes \\ +\hline +GWE & SFE & OPTIONS & yes \\ +GWE & SFE & PACKAGEDATA & yes \\ +GWE & SFE & PERIOD & yes \\ +\hline +GWE & SSM & OPTIONS & yes \\ +GWE & SSM & SOURCES & yes \\ +GWE & SSM & FILEINPUT & yes \\ +\hline +GWE & UZE & OPTIONS & yes \\ +GWE & UZE & PACKAGEDATA & yes \\ +GWE & UZE & PERIOD & yes \\ +\hline +GWF & API & OPTIONS & yes \\ +GWF & API & DIMENSIONS & yes \\ \hline GWF & BUY & OPTIONS & yes \\ GWF & BUY & DIMENSIONS & yes \\ GWF & BUY & PACKAGEDATA & yes \\ \hline -GWF & STO & OPTIONS & yes \\ -GWF & STO & GRIDDATA & no \\ -GWF & STO & PERIOD & yes \\ +GWF & CHD & OPTIONS & yes \\ +GWF & CHD & DIMENSIONS & yes \\ +GWF & CHD & PERIOD & yes \\ \hline GWF & CSUB & OPTIONS & yes \\ GWF & CSUB & DIMENSIONS & yes \\ @@ -96,43 +139,56 @@ GWF & CSUB & PACKAGEDATA & yes \\ GWF & CSUB & PERIOD & yes \\ \hline -GWF & HFB & OPTIONS & yes \\ -GWF & HFB & DIMENSIONS & yes \\ -GWF & HFB & PERIOD & yes \\ +GWF & DIS & OPTIONS & yes \\ +GWF & DIS & DIMENSIONS & yes \\ +GWF & DIS & GRIDDATA & no \\ \hline -GWF & CHD & OPTIONS & yes \\ -GWF & CHD & DIMENSIONS & yes \\ -GWF & CHD & PERIOD & yes \\ +GWF & DISU & OPTIONS & yes \\ +GWF & DISU & DIMENSIONS & yes \\ +GWF & DISU & GRIDDATA & no \\ +GWF & DISU & CONNECTIONDATA & yes \\ +GWF & DISU & VERTICES & yes \\ +GWF & DISU & CELL2D & yes \\ \hline -GWF & WEL & OPTIONS & yes \\ -GWF & WEL & DIMENSIONS & yes \\ -GWF & WEL & PERIOD & yes \\ +GWF & DISV & OPTIONS & yes \\ +GWF & DISV & DIMENSIONS & yes \\ +GWF & DISV & GRIDDATA & no \\ +GWF & DISV & VERTICES & yes \\ +GWF & DISV & CELL2D & yes \\ \hline GWF & DRN & OPTIONS & yes \\ GWF & DRN & DIMENSIONS & yes \\ GWF & DRN & PERIOD & yes \\ \hline -GWF & RIV & OPTIONS & yes \\ -GWF & RIV & DIMENSIONS & yes \\ -GWF & RIV & PERIOD & yes \\ +GWF & EVT & OPTIONS & yes \\ +GWF & EVT & DIMENSIONS & yes \\ +GWF & EVT & PERIOD & yes \\ +\hline +GWF & EVTA & OPTIONS & yes \\ +GWF & EVTA & PERIOD & yes \\ \hline GWF & GHB & OPTIONS & yes \\ GWF & GHB & DIMENSIONS & yes \\ GWF & GHB & PERIOD & yes \\ \hline -GWF & RCH & OPTIONS & yes \\ -GWF & RCH & DIMENSIONS & yes \\ -GWF & RCH & PERIOD & yes \\ +GWF & GNC & OPTIONS & yes \\ +GWF & GNC & DIMENSIONS & yes \\ +GWF & GNC & GNCDATA & yes \\ \hline -GWF & RCHA & OPTIONS & yes \\ -GWF & RCHA & PERIOD & yes \\ +GWF & HFB & OPTIONS & yes \\ +GWF & HFB & DIMENSIONS & yes \\ +GWF & HFB & PERIOD & yes \\ \hline -GWF & EVT & OPTIONS & yes \\ -GWF & EVT & DIMENSIONS & yes \\ -GWF & EVT & PERIOD & yes \\ +GWF & IC & OPTIONS & yes \\ +GWF & IC & GRIDDATA & no \\ \hline -GWF & EVTA & OPTIONS & yes \\ -GWF & EVTA & PERIOD & yes \\ +GWF & LAK & OPTIONS & yes \\ +GWF & LAK & DIMENSIONS & yes \\ +GWF & LAK & PACKAGEDATA & yes \\ +GWF & LAK & CONNECTIONDATA & yes \\ +GWF & LAK & TABLES & yes \\ +GWF & LAK & OUTLETS & yes \\ +GWF & LAK & PERIOD & yes \\ \hline GWF & MAW & OPTIONS & yes \\ GWF & MAW & DIMENSIONS & yes \\ @@ -140,6 +196,31 @@ GWF & MAW & CONNECTIONDATA & yes \\ GWF & MAW & PERIOD & yes \\ \hline +GWF & MVR & OPTIONS & yes \\ +GWF & MVR & DIMENSIONS & yes \\ +GWF & MVR & PACKAGES & yes \\ +GWF & MVR & PERIOD & yes \\ +\hline +GWF & NAM & OPTIONS & yes \\ +GWF & NAM & PACKAGES & yes \\ +\hline +GWF & NPF & OPTIONS & yes \\ +GWF & NPF & GRIDDATA & no \\ +\hline +GWF & OC & OPTIONS & yes \\ +GWF & OC & PERIOD & yes \\ +\hline +GWF & RCH & OPTIONS & yes \\ +GWF & RCH & DIMENSIONS & yes \\ +GWF & RCH & PERIOD & yes \\ +\hline +GWF & RCHA & OPTIONS & yes \\ +GWF & RCHA & PERIOD & yes \\ +\hline +GWF & RIV & OPTIONS & yes \\ +GWF & RIV & DIMENSIONS & yes \\ +GWF & RIV & PERIOD & yes \\ +\hline GWF & SFR & OPTIONS & yes \\ GWF & SFR & DIMENSIONS & yes \\ GWF & SFR & PACKAGEDATA & yes \\ @@ -148,42 +229,27 @@ GWF & SFR & DIVERSIONS & yes \\ GWF & SFR & PERIOD & yes \\ \hline -GWF & LAK & OPTIONS & yes \\ -GWF & LAK & DIMENSIONS & yes \\ -GWF & LAK & PACKAGEDATA & yes \\ -GWF & LAK & CONNECTIONDATA & yes \\ -GWF & LAK & TABLES & yes \\ -GWF & LAK & OUTLETS & yes \\ -GWF & LAK & PERIOD & yes \\ +GWF & STO & OPTIONS & yes \\ +GWF & STO & GRIDDATA & no \\ +GWF & STO & PERIOD & yes \\ \hline GWF & UZF & OPTIONS & yes \\ GWF & UZF & DIMENSIONS & yes \\ GWF & UZF & PACKAGEDATA & yes \\ GWF & UZF & PERIOD & yes \\ \hline -GWF & MVR & OPTIONS & yes \\ -GWF & MVR & DIMENSIONS & yes \\ -GWF & MVR & PACKAGES & yes \\ -GWF & MVR & PERIOD & yes \\ -\hline -GWF & GNC & OPTIONS & yes \\ -GWF & GNC & DIMENSIONS & yes \\ -GWF & GNC & GNCDATA & yes \\ -\hline -GWF & OC & OPTIONS & yes \\ -GWF & OC & PERIOD & yes \\ -\hline GWF & VSC & OPTIONS & yes \\ GWF & VSC & DIMENSIONS & yes \\ GWF & VSC & PACKAGEDATA & yes \\ \hline -GWF & API & OPTIONS & yes \\ -GWF & API & DIMENSIONS & yes \\ +GWF & WEL & OPTIONS & yes \\ +GWF & WEL & DIMENSIONS & yes \\ +GWF & WEL & PERIOD & yes \\ \hline GWT & ADV & OPTIONS & yes \\ \hline -GWT & DSP & OPTIONS & yes \\ -GWT & DSP & GRIDDATA & no \\ +GWT & API & OPTIONS & yes \\ +GWT & API & DIMENSIONS & yes \\ \hline GWT & CNC & OPTIONS & yes \\ GWT & CNC & DIMENSIONS & yes \\ @@ -193,12 +259,6 @@ GWT & DIS & DIMENSIONS & yes \\ GWT & DIS & GRIDDATA & no \\ \hline -GWT & DISV & OPTIONS & yes \\ -GWT & DISV & DIMENSIONS & yes \\ -GWT & DISV & GRIDDATA & no \\ -GWT & DISV & VERTICES & yes \\ -GWT & DISV & CELL2D & yes \\ -\hline GWT & DISU & OPTIONS & yes \\ GWT & DISU & DIMENSIONS & yes \\ GWT & DISU & GRIDDATA & no \\ @@ -206,121 +266,105 @@ GWT & DISU & VERTICES & yes \\ GWT & DISU & CELL2D & yes \\ \hline -GWT & IC & OPTIONS & yes \\ -GWT & IC & GRIDDATA & no \\ -\hline -GWT & NAM & OPTIONS & yes \\ -GWT & NAM & PACKAGES & yes \\ -\hline -GWT & OC & OPTIONS & yes \\ -GWT & OC & PERIOD & yes \\ +GWT & DISV & OPTIONS & yes \\ +GWT & DISV & DIMENSIONS & yes \\ +GWT & DISV & GRIDDATA & no \\ +GWT & DISV & VERTICES & yes \\ +GWT & DISV & CELL2D & yes \\ \hline -GWT & SSM & OPTIONS & yes \\ -GWT & SSM & SOURCES & yes \\ -GWT & SSM & FILEINPUT & yes \\ +GWT & DSP & OPTIONS & yes \\ +GWT & DSP & GRIDDATA & no \\ \hline -GWT & SRC & OPTIONS & yes \\ -GWT & SRC & DIMENSIONS & yes \\ -GWT & SRC & PERIOD & yes \\ +GWT & FMI & OPTIONS & yes \\ +GWT & FMI & PACKAGEDATA & yes \\ \hline -GWT & MST & OPTIONS & yes \\ -GWT & MST & GRIDDATA & no \\ +GWT & IC & OPTIONS & yes \\ +GWT & IC & GRIDDATA & no \\ \hline GWT & IST & OPTIONS & yes \\ GWT & IST & GRIDDATA & no \\ \hline -GWT & SFT & OPTIONS & yes \\ -GWT & SFT & PACKAGEDATA & yes \\ -GWT & SFT & PERIOD & yes \\ -\hline GWT & LKT & OPTIONS & yes \\ GWT & LKT & PACKAGEDATA & yes \\ GWT & LKT & PERIOD & yes \\ \hline -GWT & MWT & OPTIONS & yes \\ -GWT & MWT & PACKAGEDATA & yes \\ -GWT & MWT & PERIOD & yes \\ -\hline -GWT & UZT & OPTIONS & yes \\ -GWT & UZT & PACKAGEDATA & yes \\ -GWT & UZT & PERIOD & yes \\ -\hline -GWT & FMI & OPTIONS & yes \\ -GWT & FMI & PACKAGEDATA & yes \\ +GWT & MST & OPTIONS & yes \\ +GWT & MST & GRIDDATA & no \\ \hline GWT & MVT & OPTIONS & yes \\ \hline -GWT & API & OPTIONS & yes \\ -GWT & API & DIMENSIONS & yes \\ +GWT & MWT & OPTIONS & yes \\ +GWT & MWT & PACKAGEDATA & yes \\ +GWT & MWT & PERIOD & yes \\ \hline -GWE & ADV & OPTIONS & yes \\ +GWT & NAM & OPTIONS & yes \\ +GWT & NAM & PACKAGES & yes \\ \hline -GWE & CND & OPTIONS & yes \\ -GWE & CND & GRIDDATA & no \\ +GWT & OC & OPTIONS & yes \\ +GWT & OC & PERIOD & yes \\ \hline -GWE & CTP & OPTIONS & yes \\ -GWE & CTP & DIMENSIONS & yes \\ -GWE & CTP & PERIOD & yes \\ +GWT & SFT & OPTIONS & yes \\ +GWT & SFT & PACKAGEDATA & yes \\ +GWT & SFT & PERIOD & yes \\ \hline -GWE & DIS & OPTIONS & yes \\ -GWE & DIS & DIMENSIONS & yes \\ -GWE & DIS & GRIDDATA & no \\ +GWT & SRC & OPTIONS & yes \\ +GWT & SRC & DIMENSIONS & yes \\ +GWT & SRC & PERIOD & yes \\ \hline -GWE & DISV & OPTIONS & yes \\ -GWE & DISV & DIMENSIONS & yes \\ -GWE & DISV & GRIDDATA & no \\ -GWE & DISV & VERTICES & yes \\ -GWE & DISV & CELL2D & yes \\ +GWT & SSM & OPTIONS & yes \\ +GWT & SSM & SOURCES & yes \\ +GWT & SSM & FILEINPUT & yes \\ \hline -GWE & DISU & OPTIONS & yes \\ -GWE & DISU & DIMENSIONS & yes \\ -GWE & DISU & GRIDDATA & no \\ -GWE & DISU & CONNECTIONDATA & yes \\ -GWE & DISU & VERTICES & yes \\ -GWE & DISU & CELL2D & yes \\ +GWT & UZT & OPTIONS & yes \\ +GWT & UZT & PACKAGEDATA & yes \\ +GWT & UZT & PERIOD & yes \\ \hline -GWE & ESL & OPTIONS & yes \\ -GWE & ESL & DIMENSIONS & yes \\ -GWE & ESL & PERIOD & yes \\ +PRT & DIS & OPTIONS & yes \\ +PRT & DIS & DIMENSIONS & yes \\ +PRT & DIS & GRIDDATA & no \\ \hline -GWE & EST & OPTIONS & yes \\ -GWE & EST & GRIDDATA & no \\ -GWE & EST & PACKAGEDATA & yes \\ +PRT & DISV & OPTIONS & yes \\ +PRT & DISV & DIMENSIONS & yes \\ +PRT & DISV & GRIDDATA & no \\ +PRT & DISV & VERTICES & yes \\ +PRT & DISV & CELL2D & yes \\ \hline -GWE & IC & OPTIONS & yes \\ -GWE & IC & GRIDDATA & no \\ +PRT & FMI & OPTIONS & yes \\ +PRT & FMI & PACKAGEDATA & yes \\ \hline -GWE & LKE & OPTIONS & yes \\ -GWE & LKE & PACKAGEDATA & yes \\ -GWE & LKE & PERIOD & yes \\ +PRT & MIP & OPTIONS & yes \\ +PRT & MIP & GRIDDATA & no \\ \hline -GWE & MWE & OPTIONS & yes \\ -GWE & MWE & PACKAGEDATA & yes \\ -GWE & MWE & PERIOD & yes \\ +PRT & NAM & OPTIONS & yes \\ +PRT & NAM & PACKAGES & yes \\ \hline -GWE & NAM & OPTIONS & yes \\ -GWE & NAM & PACKAGES & yes \\ +PRT & OC & OPTIONS & yes \\ +PRT & OC & PERIOD & yes \\ \hline -GWE & OC & OPTIONS & yes \\ -GWE & OC & PERIOD & yes \\ +PRT & PRP & OPTIONS & yes \\ +PRT & PRP & DIMENSIONS & yes \\ +PRT & PRP & PACKAGEDATA & yes \\ +PRT & PRP & PERIOD & yes \\ \hline -GWE & SSM & OPTIONS & yes \\ -GWE & SSM & SOURCES & yes \\ -GWE & SSM & FILEINPUT & yes \\ +SWF & CDB & OPTIONS & yes \\ +SWF & CDB & DIMENSIONS & yes \\ +SWF & CDB & PERIOD & yes \\ \hline -GWE & SFE & OPTIONS & yes \\ -GWE & SFE & PACKAGEDATA & yes \\ -GWE & SFE & PERIOD & yes \\ +SWF & CHD & OPTIONS & yes \\ +SWF & CHD & DIMENSIONS & yes \\ +SWF & CHD & PERIOD & yes \\ \hline -GWE & UZE & OPTIONS & yes \\ -GWE & UZE & PACKAGEDATA & yes \\ -GWE & UZE & PERIOD & yes \\ +SWF & CXS & OPTIONS & yes \\ +SWF & CXS & DIMENSIONS & yes \\ +SWF & CXS & PACKAGEDATA & yes \\ +SWF & CXS & CROSSSECTIONDATA & yes \\ \hline -GWE & FMI & OPTIONS & yes \\ -GWE & FMI & PACKAGEDATA & yes \\ +SWF & DFW & OPTIONS & yes \\ +SWF & DFW & GRIDDATA & no \\ \hline -SWF & NAM & OPTIONS & yes \\ -SWF & NAM & PACKAGES & yes \\ +SWF & DIS2D & OPTIONS & yes \\ +SWF & DIS2D & DIMENSIONS & yes \\ +SWF & DIS2D & GRIDDATA & no \\ \hline SWF & DISV1D & OPTIONS & yes \\ SWF & DISV1D & DIMENSIONS & yes \\ @@ -328,75 +372,43 @@ SWF & DISV1D & VERTICES & yes \\ SWF & DISV1D & CELL2D & yes \\ \hline -SWF & DIS2D & OPTIONS & yes \\ -SWF & DIS2D & DIMENSIONS & yes \\ -SWF & DIS2D & GRIDDATA & no \\ -\hline SWF & DISV2D & OPTIONS & yes \\ SWF & DISV2D & DIMENSIONS & yes \\ SWF & DISV2D & GRIDDATA & no \\ SWF & DISV2D & VERTICES & yes \\ SWF & DISV2D & CELL2D & yes \\ \hline -SWF & DFW & OPTIONS & yes \\ -SWF & DFW & GRIDDATA & no \\ -\hline -SWF & CXS & OPTIONS & yes \\ -SWF & CXS & DIMENSIONS & yes \\ -SWF & CXS & PACKAGEDATA & yes \\ -SWF & CXS & CROSSSECTIONDATA & yes \\ +SWF & FLW & OPTIONS & yes \\ +SWF & FLW & DIMENSIONS & yes \\ +SWF & FLW & PERIOD & yes \\ \hline SWF & IC & OPTIONS & yes \\ SWF & IC & GRIDDATA & no \\ \hline -SWF & STO & OPTIONS & yes \\ -SWF & STO & PERIOD & yes \\ +SWF & NAM & OPTIONS & yes \\ +SWF & NAM & PACKAGES & yes \\ \hline SWF & OC & OPTIONS & yes \\ SWF & OC & PERIOD & yes \\ \hline -SWF & CHD & OPTIONS & yes \\ -SWF & CHD & DIMENSIONS & yes \\ -SWF & CHD & PERIOD & yes \\ -\hline -SWF & CDB & OPTIONS & yes \\ -SWF & CDB & DIMENSIONS & yes \\ -SWF & CDB & PERIOD & yes \\ -\hline -SWF & FLW & OPTIONS & yes \\ -SWF & FLW & DIMENSIONS & yes \\ -SWF & FLW & PERIOD & yes \\ +SWF & STO & OPTIONS & yes \\ +SWF & STO & PERIOD & yes \\ \hline SWF & ZDG & OPTIONS & yes \\ SWF & ZDG & DIMENSIONS & yes \\ SWF & ZDG & PERIOD & yes \\ \hline -PRT & NAM & OPTIONS & yes \\ -PRT & NAM & PACKAGES & yes \\ -\hline -PRT & DIS & OPTIONS & yes \\ -PRT & DIS & DIMENSIONS & yes \\ -PRT & DIS & GRIDDATA & no \\ -\hline -PRT & DISV & OPTIONS & yes \\ -PRT & DISV & DIMENSIONS & yes \\ -PRT & DISV & GRIDDATA & no \\ -PRT & DISV & VERTICES & yes \\ -PRT & DISV & CELL2D & yes \\ -\hline -PRT & MIP & OPTIONS & yes \\ -PRT & MIP & GRIDDATA & no \\ +UTL & ATS & DIMENSIONS & yes \\ +UTL & ATS & PERIODDATA & yes \\ \hline -PRT & PRP & OPTIONS & yes \\ -PRT & PRP & DIMENSIONS & yes \\ -PRT & PRP & PACKAGEDATA & yes \\ -PRT & PRP & PERIOD & yes \\ +UTL & LAKTAB & DIMENSIONS & yes \\ +UTL & LAKTAB & TABLE & yes \\ \hline -PRT & OC & OPTIONS & yes \\ -PRT & OC & PERIOD & yes \\ +UTL & OBS & OPTIONS & yes \\ +UTL & OBS & CONTINUOUS & yes \\ \hline -PRT & FMI & OPTIONS & yes \\ -PRT & FMI & PACKAGEDATA & yes \\ +UTL & SFRTAB & DIMENSIONS & yes \\ +UTL & SFRTAB & TABLE & yes \\ \hline UTL & SPC & OPTIONS & yes \\ UTL & SPC & DIMENSIONS & yes \\ @@ -412,23 +424,11 @@ UTL & SPTA & OPTIONS & yes \\ UTL & SPTA & PERIOD & yes \\ \hline -UTL & OBS & OPTIONS & yes \\ -UTL & OBS & CONTINUOUS & yes \\ -\hline -UTL & LAKTAB & DIMENSIONS & yes \\ -UTL & LAKTAB & TABLE & yes \\ -\hline -UTL & SFRTAB & DIMENSIONS & yes \\ -UTL & SFRTAB & TABLE & yes \\ -\hline -UTL & TS & ATTRIBUTES & yes \\ -UTL & TS & TIMESERIES & yes \\ -\hline UTL & TAS & ATTRIBUTES & yes \\ UTL & TAS & TIME & no \\ \hline -UTL & ATS & DIMENSIONS & yes \\ -UTL & ATS & PERIODDATA & yes \\ +UTL & TS & ATTRIBUTES & yes \\ +UTL & TS & TIMESERIES & yes \\ \hline UTL & TVK & OPTIONS & yes \\ UTL & TVK & PERIOD & yes \\ diff --git a/doc/mf6io/mf6ivar/tex/gwf-uzf-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-uzf-desc.tex index 1944e303cee..648d8814e0e 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-uzf-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-uzf-desc.tex @@ -51,8 +51,6 @@ \item \texttt{SQUARE\_GWET}---keyword specifying that groundwater ET will be simulated by assuming a constant ET rate for groundwater levels between land surface (TOP) and land surface minus the ET extinction depth (TOP-EXTDP). Groundwater ET is smoothly reduced from the PET rate to zero over a nominal interval at TOP-EXTDP. -\item \texttt{SIMULATE\_GWSEEP}---keyword specifying that groundwater discharge (GWSEEP) to land surface will be simulated. Groundwater discharge is nonzero when groundwater head is greater than land surface. This option is no longer recommended; a better approach is to use the Drain Package with discharge scaling as a way to handle seepage to land surface. The Drain Package with discharge scaling is described in Chapter 3 of the Supplemental Technical Information. - \item \texttt{UNSAT\_ETWC}---keyword specifying that ET in the unsaturated zone will be simulated as a function of the specified PET rate while the water content (THETA) is greater than the ET extinction water content (EXTWC). \item \texttt{UNSAT\_ETAE}---keyword specifying that ET in the unsaturated zone will be simulated using a capillary pressure based formulation. Capillary pressure is calculated using the Brooks-Corey retention function. diff --git a/doc/mf6io/mf6ivar/tex/gwf-uzf-options.dat b/doc/mf6io/mf6ivar/tex/gwf-uzf-options.dat index 48d349ff02b..ff39aaaa4d7 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-uzf-options.dat +++ b/doc/mf6io/mf6ivar/tex/gwf-uzf-options.dat @@ -15,7 +15,6 @@ BEGIN OPTIONS [SIMULATE_ET] [LINEAR_GWET] [SQUARE_GWET] - [SIMULATE_GWSEEP] [UNSAT_ETWC] [UNSAT_ETAE] END OPTIONS From bba6446bd660067537771c7e0858aa727e3836c8 Mon Sep 17 00:00:00 2001 From: Mike Taves Date: Sat, 20 Apr 2024 01:02:37 +1200 Subject: [PATCH 114/199] fix(typos): fixed a variety of typos throughout project (#1748) --- autotest/common_regression.py | 4 ++-- autotest/prt_test_utils.py | 2 +- autotest/test_gwe_drycell_cnd0.py | 2 +- autotest/test_gwe_drycell_cnd1.py | 2 +- autotest/test_gwe_drycell_cnd2.py | 4 ++-- autotest/test_gwe_esl01.py | 2 +- autotest/test_gwe_esl02.py | 2 +- autotest/test_gwe_lke_conduction.py | 2 +- autotest/test_gwe_sfe_strmbedcond.py | 2 +- autotest/test_gwegwe_exchng_with_comp2gwt.py | 2 +- autotest/test_gwf_chd02.py | 2 +- autotest/test_gwf_csub_sk02.py | 2 +- autotest/test_gwf_csub_sub03.py | 2 +- autotest/test_gwf_csub_subwt01.py | 4 ++-- autotest/test_gwf_csub_subwt02.py | 4 ++-- autotest/test_gwf_csub_wtgeo.py | 2 +- autotest/test_gwf_disv_uzf.py | 2 +- autotest/test_gwf_ifmod_xt3d02.py | 2 +- autotest/test_gwf_ifmod_xt3d03.py | 2 +- autotest/test_gwf_multimvr.py | 2 +- autotest/test_gwf_sfr_diversion.py | 2 +- autotest/test_gwf_vsc01.py | 2 +- autotest/test_gwf_vsc04_lak.py | 2 +- autotest/test_gwf_vsc05_hfb.py | 2 +- autotest/test_gwt_adv03.py | 2 +- autotest/test_gwt_ssm06fmi.py | 2 +- autotest/test_swf_dfw_beg2022.py | 2 +- distribution/update_version.py | 2 +- doc/MODFLOW6References.bib | 4 ++-- doc/ReleaseNotes/previous/v6.4.2.tex | 2 +- .../Figures/MODFLOW6References.bib | 4 ++-- doc/SuppTechInfo/gwffunc.tex | 2 +- doc/SuppTechInfo/python/VSC-nonlinear.ipynb | 2 +- doc/SuppTechInfo/sorption.tex | 4 ++-- doc/mf6io/framework/binary_list_input.tex | 2 +- doc/mf6io/gwe/gwe.tex | 2 +- doc/mf6io/gwf/tsi.tex | 2 +- doc/mf6io/gwt/gwt.tex | 2 +- doc/mf6io/mf6ivar/dfn/gwe-disu.dfn | 2 +- doc/mf6io/mf6ivar/dfn/gwf-disu.dfn | 2 +- doc/mf6io/mf6ivar/dfn/gwt-disu.dfn | 2 +- doc/mf6io/mf6ivar/dfn/sln-ims.dfn | 2 +- doc/mf6io/mf6ivar/dfn/utl-ats.dfn | 2 +- doc/mf6io/mf6ivar/md/mf6ivar.md | 10 ++++---- doc/mf6io/mf6ivar/readme.md | 4 ++-- doc/mf6io/mf6ivar/tex/gwe-disu-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/gwf-disu-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/gwt-disu-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/utl-ats-desc.tex | 2 +- src/Distributed/MpiRouter.f90 | 2 +- src/Distributed/VirtualDataManager.f90 | 2 +- src/Distributed/VirtualExchange.f90 | 2 +- src/Distributed/VirtualSolution.f90 | 2 +- src/Exchange/exg-gwegwe.f90 | 2 +- src/Exchange/exg-gwfgwf.f90 | 2 +- src/Exchange/exg-gwtgwt.f90 | 2 +- src/Exchange/exg-swfgwf.f90 | 2 +- src/Model/Connection/ConnectionBuilder.f90 | 2 +- src/Model/Connection/GridConnection.f90 | 10 ++++---- .../Connection/SpatialModelConnection.f90 | 2 +- src/Model/Connection/qsort_inline.inc | 6 ++--- src/Model/Discretization/Dis2d.f90 | 2 +- src/Model/Discretization/Disv1d.f90 | 2 +- src/Model/ExplicitModel.f90 | 2 +- src/Model/GroundWaterEnergy/gwe-est.f90 | 8 +++---- src/Model/GroundWaterEnergy/gwe-lke.f90 | 4 ++-- src/Model/GroundWaterEnergy/gwe-mwe.f90 | 12 +++++----- src/Model/GroundWaterEnergy/gwe-sfe.f90 | 2 +- src/Model/GroundWaterEnergy/gwe-uze.f90 | 2 +- src/Model/GroundWaterEnergy/gwe.f90 | 2 +- src/Model/GroundWaterFlow/gwf-api.f90 | 4 ++-- src/Model/GroundWaterFlow/gwf-chd.f90 | 2 +- src/Model/GroundWaterFlow/gwf-csub.f90 | 16 ++++++------- src/Model/GroundWaterFlow/gwf-lak.f90 | 4 ++-- src/Model/GroundWaterFlow/gwf-maw.f90 | 8 +++---- src/Model/GroundWaterFlow/gwf-npf.f90 | 2 +- src/Model/GroundWaterFlow/gwf-sfr.f90 | 8 +++---- src/Model/GroundWaterFlow/gwf-sto.f90 | 2 +- src/Model/GroundWaterFlow/gwf-tvs.f90 | 2 +- src/Model/GroundWaterFlow/gwf-uzf.f90 | 6 ++--- src/Model/GroundWaterFlow/gwf-vsc.f90 | 10 ++++---- src/Model/GroundWaterFlow/gwf.f90 | 2 +- src/Model/GroundWaterTransport/gwt-lkt.f90 | 2 +- src/Model/GroundWaterTransport/gwt-mst.f90 | 2 +- src/Model/GroundWaterTransport/gwt-mwt.f90 | 4 ++-- src/Model/GroundWaterTransport/gwt-sft.f90 | 2 +- src/Model/GroundWaterTransport/gwt.f90 | 2 +- src/Model/ModelUtilities/BoundaryPackage.f90 | 22 ++++++++--------- .../ModelUtilities/BoundaryPackageExt.f90 | 2 +- src/Model/ModelUtilities/Disv1dGeom.f90 | 4 ++-- .../ModelUtilities/FlowModelInterface.f90 | 2 +- src/Model/ModelUtilities/GweInputData.f90 | 2 +- src/Model/ModelUtilities/GwtSpc.f90 | 2 +- src/Model/ModelUtilities/Mover.f90 | 2 +- .../ModelUtilities/SfrCrossSectionManager.f90 | 2 +- .../ModelUtilities/SfrCrossSectionUtils.f90 | 10 ++++---- src/Model/ModelUtilities/SwfCxsUtils.f90 | 24 +++++++++---------- src/Model/ParticleTracking/prt.f90 | 2 +- src/Model/SurfaceWaterFlow/swf-dfw.f90 | 2 +- src/Model/SurfaceWaterFlow/swf-flw.f90 | 2 +- src/Model/SurfaceWaterFlow/swf.f90 | 2 +- src/Model/TransportModel/tsp-adv.f90 | 2 +- src/Model/TransportModel/tsp-fmi.f90 | 4 ++-- src/Model/TransportModel/tsp-mvt.f90 | 4 ++-- src/Model/TransportModel/tsp-ssm.f90 | 6 ++--- src/Model/TransportModel/tsp.f90 | 4 ++-- src/RunControl.f90 | 2 +- src/Solution/LinearMethods/ImsLinear.f90 | 2 +- src/Solution/LinearMethods/ImsLinearBase.f90 | 10 ++++---- src/Solution/NumericalSolution.f90 | 8 +++---- src/Utilities/ArrayRead/ArrayReaderBase.f90 | 12 +++++----- src/Utilities/ArrayRead/Double1dReader.f90 | 12 +++++----- src/Utilities/ArrayRead/Double2dReader.f90 | 12 +++++----- src/Utilities/ArrayRead/Integer1dReader.f90 | 12 +++++----- src/Utilities/ArrayRead/Integer2dReader.f90 | 12 +++++----- src/Utilities/BlockParser.f90 | 2 +- src/Utilities/BudgetObject.f90 | 2 +- src/Utilities/CharString.f90 | 2 +- src/Utilities/GeomUtil.f90 | 2 +- src/Utilities/Idm/InputDefinition.f90 | 4 ++-- src/Utilities/Idm/ModelPackageInputs.f90 | 2 +- src/Utilities/Idm/SourceCommon.f90 | 6 ++--- .../Idm/mf6blockfile/LoadMf6File.f90 | 8 +++---- .../Idm/mf6blockfile/Mf6FileGridInput.f90 | 2 +- src/Utilities/Libraries/rcm/rcm.f90 | 8 +++---- src/Utilities/LongLineReader.f90 | 2 +- src/Utilities/Memory/MemoryManager.f90 | 8 +++---- src/Utilities/Observation/Obs.f90 | 2 +- src/Utilities/Observation/ObsUtility.f90 | 2 +- src/Utilities/Observation/Observe.f90 | 2 +- src/Utilities/Sim.f90 | 2 +- src/Utilities/SmoothingFunctions.f90 | 4 ++-- src/Utilities/Vector/SeqVector.f90 | 4 ++-- utils/idmloader/IDM.md | 8 +++---- utils/meson.build | 2 +- 135 files changed, 264 insertions(+), 264 deletions(-) diff --git a/autotest/common_regression.py b/autotest/common_regression.py index a1307adc23f..fa0b3a38f27 100644 --- a/autotest/common_regression.py +++ b/autotest/common_regression.py @@ -510,10 +510,10 @@ def setup_model(namefile, dst, remove_existing=True, extrafiles=None): dst : str destination path for comparison model or file(s) remove_existing : bool - boolean indicating if an existing comparision model or file(s) should + boolean indicating if an existing comparison model or file(s) should be replaced (default is True) extrafiles : str or list of str - list of extra files to include in the comparision + list of extra files to include in the comparison """ # Construct src pth from namefile or lgr file diff --git a/autotest/prt_test_utils.py b/autotest/prt_test_utils.py index ebce0529780..b776ba96d72 100644 --- a/autotest/prt_test_utils.py +++ b/autotest/prt_test_utils.py @@ -294,7 +294,7 @@ def get_track_dtype(path: os.PathLike): def get_ireason_code(output_event): """ - Map output event to PRT ireason code specifing + Map output event to PRT ireason code specifying the reason a particle track datum was recorded. """ diff --git a/autotest/test_gwe_drycell_cnd0.py b/autotest/test_gwe_drycell_cnd0.py index 5a6e789e43d..b4f419baf38 100644 --- a/autotest/test_gwe_drycell_cnd0.py +++ b/autotest/test_gwe_drycell_cnd0.py @@ -4,7 +4,7 @@ Test the energy "flowing" through a dry cell. The test checks for some of the flow-through energy being left behind and warming the cell it passes through. Based on the model appearing in the -MT3D-USGS documention, pages 13-14. Dry cell is in layer 1, row 1 +MT3D-USGS documentation, pages 13-14. Dry cell is in layer 1, row 1 column 4. +-------+-------+-------+-------+-------+-------+ diff --git a/autotest/test_gwe_drycell_cnd1.py b/autotest/test_gwe_drycell_cnd1.py index 638cb17b884..504393868bd 100644 --- a/autotest/test_gwe_drycell_cnd1.py +++ b/autotest/test_gwe_drycell_cnd1.py @@ -429,7 +429,7 @@ def check_output(idx, test): except: assert False, f'could not load temperature data from "{fpth}"' - # Ensure constant temperatures are initiated properly in teh 1st and 3rd + # Ensure constant temperatures are initiated properly in the 1st and 3rd # stress periods, which are separated by period of "turning off" the # constant temperature boundary msg0 = "Grid cell temperatures do not reflect user-specified difference" diff --git a/autotest/test_gwe_drycell_cnd2.py b/autotest/test_gwe_drycell_cnd2.py index aaa798c29b9..b8190f93746 100644 --- a/autotest/test_gwe_drycell_cnd2.py +++ b/autotest/test_gwe_drycell_cnd2.py @@ -2,7 +2,7 @@ Test problem for GWE Test conduction from a partially saturated group of cells into their dry -neighbors. Referring to this test as a flowing trough problem. +neighbors. Referring to this test as a flowing through problem. Profile view of columns w/ approximate water table profile shown @@ -278,7 +278,7 @@ def build_models(idx, test): # Instantiating MODFLOW 6 initial conditions package for flow model flopy.mf6.ModflowGwfic(gwf, strt=strt, filename="{}.ic".format(gwfname)) - # Instatiate left and right general-head boundaries for driving flow + # Instantiate left and right general-head boundaries for driving flow flopy.mf6.ModflowGwfghb( gwf, maxbound=len(ghbspd[0]), diff --git a/autotest/test_gwe_esl01.py b/autotest/test_gwe_esl01.py index 56370d8f627..a4922901550 100644 --- a/autotest/test_gwe_esl01.py +++ b/autotest/test_gwe_esl01.py @@ -291,7 +291,7 @@ def build_models(idx, test): # Instantiate energy source loading (ESL) package # Energy is added such that the temperature change in the cell will be - # +1.0, +2.0, -1.0, and 0.0 degrees Celcius from stress period to stress + # +1.0, +2.0, -1.0, and 0.0 degrees Celsius from stress period to stress # period esl_spd = { 0: [ diff --git a/autotest/test_gwe_esl02.py b/autotest/test_gwe_esl02.py index 05ded2783cc..5b49de2231a 100644 --- a/autotest/test_gwe_esl02.py +++ b/autotest/test_gwe_esl02.py @@ -290,7 +290,7 @@ def build_models(idx, test): # Instantiate energy source loading (ESL) package # Energy is added such that the temperature change in the cell will be - # +1.0, +2.0, -1.0, and 0.0 degrees Celcius from stress period to stress + # +1.0, +2.0, -1.0, and 0.0 degrees Celsius from stress period to stress # period factor = ncol[idx] Specified_joules_added = ( diff --git a/autotest/test_gwe_lke_conduction.py b/autotest/test_gwe_lke_conduction.py index 7b645fb71e4..3c5e37b7b35 100644 --- a/autotest/test_gwe_lke_conduction.py +++ b/autotest/test_gwe_lke_conduction.py @@ -169,7 +169,7 @@ def trenddetector(list_of_index, array_of_data, order=1): nlay = botm.shape[0] ibound = np.ones_like(botm) -# deactive gw cells where lake cells are active +# deactivate gw cells where lake cells are active ibound[0, 6:11, 6:11] = 0 # layer 1 ibound[1, 7:10, 7:10] = 0 # layer 2 diff --git a/autotest/test_gwe_sfe_strmbedcond.py b/autotest/test_gwe_sfe_strmbedcond.py index ce390dab2e7..dfaec4f5cbe 100644 --- a/autotest/test_gwe_sfe_strmbedcond.py +++ b/autotest/test_gwe_sfe_strmbedcond.py @@ -328,7 +328,7 @@ def build_models(idx, test): chdelev1 = top[0, 0] - 3.0 # convection from stream to gw, chdelev2 = top[0, -1] - 3.0 # conduction from gw to strm - # Instatiate constant head boundary package + # Instantiate constant head boundary package if chd_on: chdlist1 = [ [(0, 0, 0), chdelev1, strt_gw_temp[idx]], diff --git a/autotest/test_gwegwe_exchng_with_comp2gwt.py b/autotest/test_gwegwe_exchng_with_comp2gwt.py index 4eb41492fcd..936f3201794 100644 --- a/autotest/test_gwegwe_exchng_with_comp2gwt.py +++ b/autotest/test_gwegwe_exchng_with_comp2gwt.py @@ -294,7 +294,7 @@ def build_models(idx, test): return sim, None -# Instatiate the upper and lower flow models +# Instantiate the upper and lower flow models def add_flow(sim): # Instantiating MODFLOW 6 solver for flow model imsgwf = flopy.mf6.ModflowIms( diff --git a/autotest/test_gwf_chd02.py b/autotest/test_gwf_chd02.py index af30d11a1b1..a22ef240eb9 100644 --- a/autotest/test_gwf_chd02.py +++ b/autotest/test_gwf_chd02.py @@ -1,4 +1,4 @@ -# test use of binary stress period data with auxilliary data +# test use of binary stress period data with auxiliary data import os import flopy diff --git a/autotest/test_gwf_csub_sk02.py b/autotest/test_gwf_csub_sk02.py index 62f546f77e9..f193e5b8726 100644 --- a/autotest/test_gwf_csub_sk02.py +++ b/autotest/test_gwf_csub_sk02.py @@ -339,7 +339,7 @@ def check_output(idx, test): except: assert False, f'could not load data from "{fpth}"' - # comparision total compaction results + # comparison total compaction results cpth = cmppths[idx] fpth = os.path.join(test.workspace, cpth, "csub_obs.csv") try: diff --git a/autotest/test_gwf_csub_sub03.py b/autotest/test_gwf_csub_sub03.py index cdd41d0b6ea..3050227e97f 100644 --- a/autotest/test_gwf_csub_sub03.py +++ b/autotest/test_gwf_csub_sub03.py @@ -361,7 +361,7 @@ def check_output(idx, test): except: assert False, f'could not load data from "{fpth}"' - # Comparision total compaction results + # Comparison total compaction results fpth = os.path.join(test.workspace, cmppth, "csub_obs.csv") try: tc0 = np.genfromtxt(fpth, names=True, delimiter=",") diff --git a/autotest/test_gwf_csub_subwt01.py b/autotest/test_gwf_csub_subwt01.py index a1ff03b8aa7..62cecff7e73 100644 --- a/autotest/test_gwf_csub_subwt01.py +++ b/autotest/test_gwf_csub_subwt01.py @@ -242,7 +242,7 @@ def build_models(idx, test): # build MODFLOW 6 files sim = get_model(idx, test.workspace) - # build comparision files + # build comparison files ws = os.path.join(test.workspace, cmppth) mc = get_model(idx, ws) @@ -257,7 +257,7 @@ def check_output(idx, test): except: assert False, f'could not load data from "{fpth}"' - # Comparision total compaction results + # Comparison total compaction results cpth = cmppth fpth = os.path.join(test.workspace, cpth, "csub_obs.csv") try: diff --git a/autotest/test_gwf_csub_subwt02.py b/autotest/test_gwf_csub_subwt02.py index 877e5474d4c..fc7838ec0d7 100644 --- a/autotest/test_gwf_csub_subwt02.py +++ b/autotest/test_gwf_csub_subwt02.py @@ -412,7 +412,7 @@ def build_models(idx, test): ws = test.workspace sim = get_model(idx, ws) - # build comparision files + # build comparison files ws = os.path.join(test.workspace, cmppth) mc = get_model(idx, ws) @@ -427,7 +427,7 @@ def check_output(idx, test): except: assert False, f'could not load data from "{fpth}"' - # comparision total compaction results + # comparison total compaction results cpth = cmppth fpth = os.path.join(test.workspace, cmppth, "csub_obs.csv") try: diff --git a/autotest/test_gwf_csub_wtgeo.py b/autotest/test_gwf_csub_wtgeo.py index a0f50764e8d..0f554657bea 100644 --- a/autotest/test_gwf_csub_wtgeo.py +++ b/autotest/test_gwf_csub_wtgeo.py @@ -489,7 +489,7 @@ def check_output(idx, test): except: assert False, f'could not load data from "{fpth}"' - # comparision total compaction results + # comparison total compaction results fpth = os.path.join(test.workspace, cmppth, "csub_obs.csv") try: tc0 = np.genfromtxt(fpth, names=True, delimiter=",") diff --git a/autotest/test_gwf_disv_uzf.py b/autotest/test_gwf_disv_uzf.py index e681c041df1..929521660c0 100644 --- a/autotest/test_gwf_disv_uzf.py +++ b/autotest/test_gwf_disv_uzf.py @@ -1,7 +1,7 @@ """ A test of DISV with UZF. Originally created due to a possible bug in the ASCII output file generated by UZF. Uses quadrilateral cells. The cells -are created from a numpy grid with cells that are 1m x 1m. Althought a DISV +are created from a numpy grid with cells that are 1m x 1m. Although a DISV grid, arrangement mimics that of a 10 row x 10 col x 5 layer DIS grid. Inflow from infiltration on the top of the grid, flow exits via GHB boundary on the right-hand side of the model. diff --git a/autotest/test_gwf_ifmod_xt3d02.py b/autotest/test_gwf_ifmod_xt3d02.py index e4876486ae0..9176f3da52e 100644 --- a/autotest/test_gwf_ifmod_xt3d02.py +++ b/autotest/test_gwf_ifmod_xt3d02.py @@ -17,7 +17,7 @@ 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 1 1 1 1 1 1 1 1 1 1 1 -The head values should always be indentical. All models are +The head values should always be identical. All models are part of the same solution for convenience. In addition, a check on the x,y,z components of specific discharge is present. The values of the left submodel are compared to diff --git a/autotest/test_gwf_ifmod_xt3d03.py b/autotest/test_gwf_ifmod_xt3d03.py index e942d03d393..98f3b1c6f29 100644 --- a/autotest/test_gwf_ifmod_xt3d03.py +++ b/autotest/test_gwf_ifmod_xt3d03.py @@ -24,7 +24,7 @@ 'bl' 'br' -The head values should always be indentical. All models are +The head values should always be identical. All models are part of the same solution for convenience. In addition, a check on the x,y,z components of specific discharge is present. Finally, the budget error is checked. diff --git a/autotest/test_gwf_multimvr.py b/autotest/test_gwf_multimvr.py index f85ce24ce7f..a78530736b5 100644 --- a/autotest/test_gwf_multimvr.py +++ b/autotest/test_gwf_multimvr.py @@ -828,7 +828,7 @@ def instantiate_base_simulation(sim_ws, gwfname, gwfnamec): def add_parent_sfr(gwf, gwfname, conns): - # Instatiate a scenario-specific sfr package + # Instantiate a scenario-specific sfr package pkdat = generate_parentmod_sfr_input(conns) sfrspd = {0: [[0, "INFLOW", 40.0]]} sfr = flopy.mf6.ModflowGwfsfr( diff --git a/autotest/test_gwf_sfr_diversion.py b/autotest/test_gwf_sfr_diversion.py index 4ca34d74bd0..180ab0ed4f2 100644 --- a/autotest/test_gwf_sfr_diversion.py +++ b/autotest/test_gwf_sfr_diversion.py @@ -141,7 +141,7 @@ def build_models(idx, test): def check_output(idx, test): - # check flow for indivdual reach + # check flow for individual reach fname = os.path.join(test.workspace, f"{test.name}.sfr.cbb") with flopy.utils.CellBudgetFile(fname) as cbb: outflows = cbb.get_data(text="EXT-OUTFLOW") diff --git a/autotest/test_gwf_vsc01.py b/autotest/test_gwf_vsc01.py index 4abc3c1bf80..4d39263bb0a 100644 --- a/autotest/test_gwf_vsc01.py +++ b/autotest/test_gwf_vsc01.py @@ -160,7 +160,7 @@ def build_models(idx, test): auxiliary="temperature", ) - # Instatiating OC + # Instantiating OC head_filerecord = "{}.hds".format(gwfname) budget_filerecord = "{}.bud".format(gwfname) flopy.mf6.ModflowGwfoc( diff --git a/autotest/test_gwf_vsc04_lak.py b/autotest/test_gwf_vsc04_lak.py index af738585aee..97bfa8d8619 100644 --- a/autotest/test_gwf_vsc04_lak.py +++ b/autotest/test_gwf_vsc04_lak.py @@ -102,7 +102,7 @@ nlay = botm.shape[0] ibound = np.ones_like(botm) -# deactive gw cells where lake cells are active +# deactivate gw cells where lake cells are active ibound[0, 6:11, 6:11] = 0 # layer 1 ibound[1, 7:10, 7:10] = 0 # layer 2 diff --git a/autotest/test_gwf_vsc05_hfb.py b/autotest/test_gwf_vsc05_hfb.py index 16d62c121a9..02d8d493b6a 100644 --- a/autotest/test_gwf_vsc05_hfb.py +++ b/autotest/test_gwf_vsc05_hfb.py @@ -186,7 +186,7 @@ def build_models(idx, test): pname="HFB-1", ) - # Instatiating OC + # Instantiating OC head_filerecord = "{}.hds".format(gwfname) budget_filerecord = "{}.bud".format(gwfname) flopy.mf6.ModflowGwfoc( diff --git a/autotest/test_gwt_adv03.py b/autotest/test_gwt_adv03.py index 562e2567b43..c2278c6ce8d 100644 --- a/autotest/test_gwt_adv03.py +++ b/autotest/test_gwt_adv03.py @@ -345,7 +345,7 @@ def check_output(idx, test): assert False, f'could not load data from "{fpth}"' # This is the answer to this problem. These concentrations are for - # the time eqaul to 1/5 of perlen. + # the time equal to 1/5 of perlen. cres1 = [ 9.75305991e-01, 9.52167956e-01, diff --git a/autotest/test_gwt_ssm06fmi.py b/autotest/test_gwt_ssm06fmi.py index c7e74a3c176..4f3a3b0164b 100644 --- a/autotest/test_gwt_ssm06fmi.py +++ b/autotest/test_gwt_ssm06fmi.py @@ -4,7 +4,7 @@ as well. However, by adding SFR we can now invoke MVR, in this case WEL -> SFR at the same time as invoking auxiliary variables. A companion autotest runs this same simulation (uses SFR in place of RIV for -receiving MVR water), but runs both flow and tranport simultaneously which, +receiving MVR water), but runs both flow and transport simultaneously which, at one time, wrongly threw an input error. However, running the models separately never threw the error. """ diff --git a/autotest/test_swf_dfw_beg2022.py b/autotest/test_swf_dfw_beg2022.py index 10abf5c4167..6ae1a5cb9d4 100644 --- a/autotest/test_swf_dfw_beg2022.py +++ b/autotest/test_swf_dfw_beg2022.py @@ -306,7 +306,7 @@ def check_output(idx, test): q = -ra[0]["q"] qoutflow_mf6.append(q) - # check to make sure the difference in outflow bewteen mf6 and + # check to make sure the difference in outflow between mf6 and # mf2005 is less than atol diff = np.abs(qoutflow_mf6 - qoutflow_mf2005) print(diff) diff --git a/distribution/update_version.py b/distribution/update_version.py index dcf3c904195..8422dfce354 100755 --- a/distribution/update_version.py +++ b/distribution/update_version.py @@ -381,7 +381,7 @@ def update_version( @no_parallel -@pytest.mark.skip(reason="reverts repo files on cleanup, tread carefully") +@pytest.mark.skip(reason="reverts repo files on cleanup, treat carefully") @pytest.mark.parametrize( "version", [ diff --git a/doc/MODFLOW6References.bib b/doc/MODFLOW6References.bib index e1b6525749d..e468d4feba8 100644 --- a/doc/MODFLOW6References.bib +++ b/doc/MODFLOW6References.bib @@ -852,7 +852,7 @@ @book{konikow1977 Author = {Konikow, Leonard F and Grove, D.B.}, Date-Added = {2019-01-07 10:06:42 -0600}, Date-Modified = {2019-01-07 10:20:13 -0600}, - Series = {{U.S. Geological Survey Techniquest of Water-Resources Investigations Report 77-19, [Revised 1984], 30 p.}}, + Series = {{U.S. Geological Survey Techniques of Water-Resources Investigations Report 77-19, [Revised 1984], 30 p.}}, Title = {Derivation of equations describing solute transport in ground water}, Year = {1977}, Bdsk-Url-1 = {http://dx.doi.org/10.3133/wri7719}} @@ -861,7 +861,7 @@ @book{konikow1978 Author = {Konikow, Leonard F and Bredehoeft, J.D.}, Date-Added = {2019-01-07 09:59:39 -0600}, Date-Modified = {2019-01-07 10:22:41 -0600}, - Series = {{U.S. Geological Survey Techniquest of Water-Resources Investigations, Book 7, Chapter C2, 90 p.}}, + Series = {{U.S. Geological Survey Techniques of Water-Resources Investigations, Book 7, Chapter C2, 90 p.}}, Title = {Computer model of two-dimensional solute transport and dispersion in ground water}, Year = {1978}} diff --git a/doc/ReleaseNotes/previous/v6.4.2.tex b/doc/ReleaseNotes/previous/v6.4.2.tex index afc3511061a..68ccbbecc72 100644 --- a/doc/ReleaseNotes/previous/v6.4.2.tex +++ b/doc/ReleaseNotes/previous/v6.4.2.tex @@ -10,7 +10,7 @@ \item The Groundwater Transport (GWT) model was modified for simulations involving a mobile domain and one or more immobile domains. The modifications do not affect GWT Models without the Immobile Storage and Transfer (IST) Package. The original IST Package formulation described by \cite{modflow6gwt} was based on a limiting assumption about how the mobile and immobile domains are apportioned within a model cell. The changes introduced here require the user to explicitly specify in the IST Package the volume fraction of each cell that is immobile. This change also redefines the meaning of several input parameters. As described in a new chapter (Chapter 9) in the Supplemental Technical Information document, porosity and bulk density values must now be entered per domain volume rather than per cell volume. Consequently, for simulations that include one or more IST Packages, these changes are not backward compatible, and will require updates to IST and MST input. Suggestions for updating existing parameter values is included in Chapter 9 of the Supplemental Technical Information document, which is included with the distribution. \item Add LENGTH\_CONVERSION and TIME\_CONVERSION variables to replace the UNIT\_CONVERSION variable in the SFR Package input file. The LENGTH\_CONVERSION and TIME\_CONVERSION variables are used to convert user-specified Manning's roughness coefficients from SI units (sec/m$^{1/3}$) to model length and time units. LENGTH\_CONVERSION does not need to be specified if LENGTH\_UNITS are meters. TIME\_CONVERSION does not need to be specified if TIME\_UNITS are seconds. Warning messages will be issued if UNIT\_CONVERSION variable is specified. The model will terminate with an error if UNIT\_CONVERSION and LENGTH\_CONVERSION and TIME\_CONVERSION variables are specified. The UNIT\_CONVERSION variable in the SFR Package input file will eventually be deprecated. \item Add MAXIMUM\_ITERATIONS and MAXIMUM\_STAGE\_CHANGE variables in the LAK Package input file. The MAXIMUM\_ITERATIONS variable is used to change the maximum number of iterations and would only need to be increased from the default value if one or more lakes in a simulation has a large water budget error. The MAXIMUM\_STAGE\_CHANGE variable defines the stage closure tolerance for each lake. The MAXIMUM\_STAGE\_CHANGE variable would only need to be increased or decreased from the default value if the water budget error for one or more lakes is too small or too large. - \item The Input Data Processor (IDP) is introduced in this release to read user-provided input files and store user-provided input data in memory for subsequent use by simulation, model, and package components. Components that have been integrated with IDP no longer handle input files directly but rather retrieve all input data from named locations, called memory paths, allocated in managed memory. The collection of all simulation input data in managed memory is called the input context. IDP uses existing descriptions of input variables, called variable definitions, to interpret and store input. The program variable definition set and its representation in the input context is described as the Input Data Model (IDM). Input variables can be recognized in a memory dump (e.g., with the MEMORY\_PRINT\_OPTION activated in the options block of mfsim.nam) by their memory path prefix string "\_\_INPUT\_\_". Components that later access input typically copy data from the input context to their own memory space; therefore, the present implemention of the IDP results in an increased memory footprint for the program. Among its advantages include the consolidation of all input processing early in program runtime, and outside of any particular component, enabling the support of alternative types of input data sources. Input file types that are currently processed by IDP include DIS6, DISU6, DIV6, NPF6, DSP6, and Name File inputs for the Simulation (mfsim.nam) and GWF and GWT models. + \item The Input Data Processor (IDP) is introduced in this release to read user-provided input files and store user-provided input data in memory for subsequent use by simulation, model, and package components. Components that have been integrated with IDP no longer handle input files directly but rather retrieve all input data from named locations, called memory paths, allocated in managed memory. The collection of all simulation input data in managed memory is called the input context. IDP uses existing descriptions of input variables, called variable definitions, to interpret and store input. The program variable definition set and its representation in the input context is described as the Input Data Model (IDM). Input variables can be recognized in a memory dump (e.g., with the MEMORY\_PRINT\_OPTION activated in the options block of mfsim.nam) by their memory path prefix string "\_\_INPUT\_\_". Components that later access input typically copy data from the input context to their own memory space; therefore, the present implementation of the IDP results in an increased memory footprint for the program. Among its advantages include the consolidation of all input processing early in program runtime, and outside of any particular component, enabling the support of alternative types of input data sources. Input file types that are currently processed by IDP include DIS6, DISU6, DIV6, NPF6, DSP6, and Name File inputs for the Simulation (mfsim.nam) and GWF and GWT models. % \item xxx \end{itemize} diff --git a/doc/SuppTechInfo/Figures/MODFLOW6References.bib b/doc/SuppTechInfo/Figures/MODFLOW6References.bib index d856cf3fb4f..0548e86400d 100644 --- a/doc/SuppTechInfo/Figures/MODFLOW6References.bib +++ b/doc/SuppTechInfo/Figures/MODFLOW6References.bib @@ -726,7 +726,7 @@ @book{konikow1977 Author = {Konikow, Leonard F and Grove, D.B.}, Date-Added = {2019-01-07 10:06:42 -0600}, Date-Modified = {2019-01-07 10:20:13 -0600}, - Series = {{U.S. Geological Survey Techniquest of Water-Resources Investigations Report 77-19, [Revised 1984], 30 p.}}, + Series = {{U.S. Geological Survey Techniques of Water-Resources Investigations Report 77-19, [Revised 1984], 30 p.}}, Title = {Derivation of equations describing solute transport in ground water}, Year = {1977}, Bdsk-Url-1 = {http://dx.doi.org/10.3133/wri7719}} @@ -735,7 +735,7 @@ @book{konikow1978 Author = {Konikow, Leonard F and Bredehoeft, J.D.}, Date-Added = {2019-01-07 09:59:39 -0600}, Date-Modified = {2019-01-07 10:22:41 -0600}, - Series = {{U.S. Geological Survey Techniquest of Water-Resources Investigations, Book 7, Chapter C2, 90 p.}}, + Series = {{U.S. Geological Survey Techniques of Water-Resources Investigations, Book 7, Chapter C2, 90 p.}}, Title = {Computer model of two-dimensional solute transport and dispersion in ground water}, Year = {1978}} diff --git a/doc/SuppTechInfo/gwffunc.tex b/doc/SuppTechInfo/gwffunc.tex index a8072ceb2de..59e9a8e27c0 100644 --- a/doc/SuppTechInfo/gwffunc.tex +++ b/doc/SuppTechInfo/gwffunc.tex @@ -58,7 +58,7 @@ \newcommand{\sign}{\text{sign}} \newcommand{\matr}[1]{\mathbf{#1}} -%convience commands for ijk subscripts +%convenience commands for ijk subscripts \newcommand{\ijk}{$i$,$j$,$k$} \newcommand{\ipjk}{$i+1$,$j$,$k$} \newcommand{\ijpk}{$i$,$j+1$,$k$} diff --git a/doc/SuppTechInfo/python/VSC-nonlinear.ipynb b/doc/SuppTechInfo/python/VSC-nonlinear.ipynb index c907b5687f0..cd69f368048 100644 --- a/doc/SuppTechInfo/python/VSC-nonlinear.ipynb +++ b/doc/SuppTechInfo/python/VSC-nonlinear.ipynb @@ -98,7 +98,7 @@ "# calc rise/run\n", "dviscdT = (y_lin_pts[1] - y_lin_pts[0]) / (x_lin_pts[1] - x_lin_pts[0])\n", "\n", - "# tempearture of reference viscosity\n", + "# temperature of reference viscosity\n", "Tviscref = 20\n", "\n", "# reference viscosity\n", diff --git a/doc/SuppTechInfo/sorption.tex b/doc/SuppTechInfo/sorption.tex index 41f17747b14..43fb517d0f1 100644 --- a/doc/SuppTechInfo/sorption.tex +++ b/doc/SuppTechInfo/sorption.tex @@ -1,7 +1,7 @@ The Groundwater Transport (GWT) Model \citep{modflow6gwt} in \mf can simulate a variety of solute-transport processes in aquifer material that includes ``mobile" and ``immobile" domains. The mobile and immobile domains are conceptualized as coexisting within a model cell and can exchange solute with each other. The mobile domain is always simulated by the GWT Model. Transport in an immobile domain, which may be optionally defined by the user, is simulated by the Immobile Storage and Transfer (IST) Package \citep{modflow6gwt} for the GWT Model. Multiple instances of the IST Package may be invoked to represent multiple immobile domains. -In \mf version 6.4.2, the parameterization of the equations that govern transport in the mobile and immobile domains has been revised, and corresponding changes have been made to the input requirements for porosity, domain fraction, and bulk density. The revised parameterization is expected to be more intutive for users in many mobile-immobile transport applications. It will also allow users to model a wider variety of solute transport scenarios involving immobile-domain sorption than the original parameterization used in versions of \mf up to and including version 6.4.1. +In \mf version 6.4.2, the parameterization of the equations that govern transport in the mobile and immobile domains has been revised, and corresponding changes have been made to the input requirements for porosity, domain fraction, and bulk density. The revised parameterization is expected to be more intuitive for users in many mobile-immobile transport applications. It will also allow users to model a wider variety of solute transport scenarios involving immobile-domain sorption than the original parameterization used in versions of \mf up to and including version 6.4.1. Input for existing \mf models that include one or more immobile domains can be converted from the original parameterization to the revised parameterization such that the simulated transport behavior remains the same. No changes to the model input are needed for existing \mf models that do not include an immobile domain. @@ -205,4 +205,4 @@ \subsubsection{Simulation With At Least One Immobile Domain} \subsubsection{Unrealistic Parameter Values} -It is possible that in some cases the process of converting parameters will produce revised parameter values that are unrealistic or inconsistent with independently measured or estimated values. For example, selection of apparently reasonable values of $\hat{f}_{im}$ may require setting $\hat{f}_{m}$, $\phi_{m}$, $\rho_{b, m}$, $\phi_{im}$, and/or $\rho_{b, im}$ to unreasonable values. Assuming the conversion equations have been applied correctly and the independently measured or estimated values are reasonably accurate, other possible sources of inconsistency are errors in setting the original parameter values; selection of unrealistic values for revised parameters ($\hat{f}_{im}$ values, for example) as a starting point for the conversion; and the setting of the original immobile domain fractions $f_{im}$ according to equation~\ref{eqn:fim1}, which may be a poor approxiation for some of the domains being modeled. \ No newline at end of file +It is possible that in some cases the process of converting parameters will produce revised parameter values that are unrealistic or inconsistent with independently measured or estimated values. For example, selection of apparently reasonable values of $\hat{f}_{im}$ may require setting $\hat{f}_{m}$, $\phi_{m}$, $\rho_{b, m}$, $\phi_{im}$, and/or $\rho_{b, im}$ to unreasonable values. Assuming the conversion equations have been applied correctly and the independently measured or estimated values are reasonably accurate, other possible sources of inconsistency are errors in setting the original parameter values; selection of unrealistic values for revised parameters ($\hat{f}_{im}$ values, for example) as a starting point for the conversion; and the setting of the original immobile domain fractions $f_{im}$ according to equation~\ref{eqn:fim1}, which may be a poor approximation for some of the domains being modeled. diff --git a/doc/mf6io/framework/binary_list_input.tex b/doc/mf6io/framework/binary_list_input.tex index 10ee136062a..4f625293704 100644 --- a/doc/mf6io/framework/binary_list_input.tex +++ b/doc/mf6io/framework/binary_list_input.tex @@ -10,7 +10,7 @@ \subsubsection{Description of Binary List Input Files} \item \texttt{CELLID} is the cell identifier, and depends on the type of grid that is used for the simulation.; \item \texttt{RLIST} is a double precision two-dimensional array of size (NDAT,NLIST) containing the stress package PERIOD data; \item \texttt{NDAT} is the number of columns in RLIST, which is the number of columns of real data in the stress package PERIOD data; -\item \texttt{AUXVAR} is a double precision two-dimensional array of size (NAUX,NLIST) containing the auxilary data for the stress package PERIOD data; +\item \texttt{AUXVAR} is a double precision two-dimensional array of size (NAUX,NLIST) containing the auxiliary data for the stress package PERIOD data; \item \texttt{NAUX} is the number of columns in AUXVAR, which is the number of columns of real auxiliary data the in stress package PERIOD data; \item \texttt{NLIST} is the size of the list; \end{description} diff --git a/doc/mf6io/gwe/gwe.tex b/doc/mf6io/gwe/gwe.tex index c4ab64fe833..89eccf3b161 100644 --- a/doc/mf6io/gwe/gwe.tex +++ b/doc/mf6io/gwe/gwe.tex @@ -23,7 +23,7 @@ \subsection{Information for Existing Heat Transport Modelers} \item Thermal energy transport budgets written to the \mf list file are reported in units of energy (e.g., joules). Previously, using a program like MT3D-USGS \citep{mt3dusgs} to simulate heat transport, units in the list file budget did not correspond to thermal energy, but were reported in units of $\frac{m^{3 \;\circ}C}{d}$. To convert to thermal energy units, values in the list file had to be post-processed by multiplying each line item by the density of water ($\rho_w$) and the heat capacity of water ($C_p$) \citep{langevin2008seawat}. -\item Thermal equilibrium between the aqueous and solid phases is assumed. Thus, simulated temperatures are representive of both phases. As a result, thermal conduction between adjacent cells may still occur even in the absense of convection. +\item Thermal equilibrium between the aqueous and solid phases is assumed. Thus, simulated temperatures are representative of both phases. As a result, thermal conduction between adjacent cells may still occur even in the absence of convection. \item In GWE, dry cells (devoid of groundwater) remain active for simulating thermal conduction. For example, energy (heat) transfer will be simulated between a partially saturated cell (i.e., ``water-table'' cell) and an overlying dry cell. In this way, a more full accounting of various heat transport processes is represented in the subsurface. Moreover, this approach readily supports heat transport in the unsaturated-zone when the UZE (unsaturated-zone energy transport) Package is active. diff --git a/doc/mf6io/gwf/tsi.tex b/doc/mf6io/gwf/tsi.tex index f2aaa4c05e7..7f4ab454f42 100644 --- a/doc/mf6io/gwf/tsi.tex +++ b/doc/mf6io/gwf/tsi.tex @@ -46,7 +46,7 @@ \subsubsection{Time-Series Files} END ATTRIBUTES \end{lstlisting} -In a case where a time-series file contains multiple time series and a single interpolation method applies to all time series in the file, the METHOD keyword can be used, and a single interpolation method is read. Similary, if a single scale factor applies to all time series in the file, the SFAC keyword can be used, and a single scale factor is read. +In a case where a time-series file contains multiple time series and a single interpolation method applies to all time series in the file, the METHOD keyword can be used, and a single interpolation method is read. Similarly, if a single scale factor applies to all time series in the file, the SFAC keyword can be used, and a single scale factor is read. The ATTRIBUTES block is followed by a TIMESERIES block of the form: \begin{lstlisting}[style=blockdefinition] diff --git a/doc/mf6io/gwt/gwt.tex b/doc/mf6io/gwt/gwt.tex index 516708c4514..10a6b47111d 100644 --- a/doc/mf6io/gwt/gwt.tex +++ b/doc/mf6io/gwt/gwt.tex @@ -1,6 +1,6 @@ The GWT Model simulates three-dimensional transport of a single solute species in flowing groundwater \citep{modflow6gwt}. The GWT Model solves the solute transport equation using numerical methods and a generalized control-volume finite-difference approach, which can be used with regular MODFLOW grids (DIS Package) or with unstructured grids (DISV and DISU Packages). The GWT Model is designed to work with most of the new capabilities released with the GWF Model, including the Newton flow formulation, unstructured grids, advanced packages, and the movement of water between packages. The GWF and GWT Models operate simultaneously during a \mf simulation to represent coupled groundwater flow and solute transport. The GWT Model can also run separately from a GWF Model by reading the heads and flows saved by a previously run GWF Model. The GWT model is also capable of working with the flows from another groundwater flow model, as long as the flows from that model can be written in the correct form to flow and head files. -The purpose of the GWT Model is to calculate changes in solute concentration in both space and time. Solute concentrations within an aquifer can change in response to multiple solute transport processes. These processes include (1) advective transport of solute with flowing groundwater, (2) the combined hydrodynamic dispersion processes of velocity-dependent mechanical dispersion and chemical diffusion, (3) sorption of solutes by the aquifer matrix either by adsorption to individual solid grains or by absorbtion into solid grains, (4) transfer of solute into very low permeability aquifer material (called an immobile domain) where it can be stored and later released, (5) first- or zero-order solute decay or production in response to chemical or biological reactions, (6) mixing with fluids from groundwater sources and sinks, and (7) direct addition of solute mass. +The purpose of the GWT Model is to calculate changes in solute concentration in both space and time. Solute concentrations within an aquifer can change in response to multiple solute transport processes. These processes include (1) advective transport of solute with flowing groundwater, (2) the combined hydrodynamic dispersion processes of velocity-dependent mechanical dispersion and chemical diffusion, (3) sorption of solutes by the aquifer matrix either by adsorption to individual solid grains or by absorption into solid grains, (4) transfer of solute into very low permeability aquifer material (called an immobile domain) where it can be stored and later released, (5) first- or zero-order solute decay or production in response to chemical or biological reactions, (6) mixing with fluids from groundwater sources and sinks, and (7) direct addition of solute mass. With the present implementation, there can be multiple domains and multiple phases. There is a single mobile domain, which normally consists of flowing groundwater, and there can be one or more immobile domains. The GWT Model simulates the dissolved phase of chemical constituents in both the mobile and immobile domains. The dissolved phase is also referred to in this report as the aqueous phase. If sorption is represented, then the GWT Model also simulates the solid phase of the chemical constituent in both the mobile and immobile domains. The dissolved and solid phases of the chemical constituent are tracked in the different domains by the GWT Model and can be reported as output as requested by the user. diff --git a/doc/mf6io/mf6ivar/dfn/gwe-disu.dfn b/doc/mf6io/mf6ivar/dfn/gwe-disu.dfn index ec86d0852c7..4bf78998fa4 100644 --- a/doc/mf6io/mf6ivar/dfn/gwe-disu.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwe-disu.dfn @@ -166,7 +166,7 @@ optional true shape (nja) reader readarray longname angle of face normal to connection -description is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specifed in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. +description is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specified in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. jagged_array iac # --------------------- gwe disu vertices --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/gwf-disu.dfn b/doc/mf6io/mf6ivar/dfn/gwf-disu.dfn index 48e18477c1c..dabf4411afc 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-disu.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-disu.dfn @@ -166,7 +166,7 @@ optional true shape (nja) reader readarray longname angle of face normal to connection -description is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specifed in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. +description is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specified in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. jagged_array iac # --------------------- gwf disu vertices --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/gwt-disu.dfn b/doc/mf6io/mf6ivar/dfn/gwt-disu.dfn index 00ffe21ad09..0c3a26fb148 100644 --- a/doc/mf6io/mf6ivar/dfn/gwt-disu.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwt-disu.dfn @@ -166,7 +166,7 @@ optional true shape (nja) reader readarray longname angle of face normal to connection -description is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specifed in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. +description is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specified in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. jagged_array iac # --------------------- gwt disu vertices --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/sln-ims.dfn b/doc/mf6io/mf6ivar/dfn/sln-ims.dfn index 65e81b65461..9b07f85e7ba 100644 --- a/doc/mf6io/mf6ivar/dfn/sln-ims.dfn +++ b/doc/mf6io/mf6ivar/dfn/sln-ims.dfn @@ -192,7 +192,7 @@ type double precision reader urword optional true deprecated 6.1.1 -description real value defining the residual tolerance for convergence of model packages that solve a separate equation not solved by the IMS linear solver. This value represents the maximum allowable residual between successive outer iterations at any single model package element. An example of a model package that would use OUTER\_RCLOSEBND to evaluate convergence is the SFR package which solves a continuity equation for each reach. The OUTER\_RCLOSEBND option is deprecated and has no effect on simulation results as of version 6.1.1. The keyword, OUTER\_RCLOSEBND can be still be specified for backward compatibility with previous versions of MODFLOW 6 but eventually specificiation of OUTER\_RCLOSEBND will cause MODFLOW 6 to terminate with an error. +description real value defining the residual tolerance for convergence of model packages that solve a separate equation not solved by the IMS linear solver. This value represents the maximum allowable residual between successive outer iterations at any single model package element. An example of a model package that would use OUTER\_RCLOSEBND to evaluate convergence is the SFR package which solves a continuity equation for each reach. The OUTER\_RCLOSEBND option is deprecated and has no effect on simulation results as of version 6.1.1. The keyword, OUTER\_RCLOSEBND can be still be specified for backward compatibility with previous versions of MODFLOW 6 but eventually specification of OUTER\_RCLOSEBND will cause MODFLOW 6 to terminate with an error. longname boundary package flow residual tolerance block nonlinear diff --git a/doc/mf6io/mf6ivar/dfn/utl-ats.dfn b/doc/mf6io/mf6ivar/dfn/utl-ats.dfn index d2cd5a40a01..c43b4de6099 100644 --- a/doc/mf6io/mf6ivar/dfn/utl-ats.dfn +++ b/doc/mf6io/mf6ivar/dfn/utl-ats.dfn @@ -72,7 +72,7 @@ tagged false reader urword optional false longname time step multiplier factor -description is the time step multiplier factor for this period. If the number of outer solver iterations are less than the product of the maximum number of outer iterations (OUTER\_MAXIMUM) and ATS\_OUTER\_MAXIMUM\_FRACTION (an optional variable in the IMS input file with a default value of 1/3), then the time step length is multipled by dtadj. If the number of outer solver iterations are greater than the product of the maximum number of outer iterations and ATS\_OUTER\_MAXIMUM\_FRACTION, then the time step length is divided by dtadj. dtadj must be zero, one, or greater than one. If dtadj is zero or one, then it has no effect on the simulation. A value between 2.0 and 5.0 can be used as an initial estimate. +description is the time step multiplier factor for this period. If the number of outer solver iterations are less than the product of the maximum number of outer iterations (OUTER\_MAXIMUM) and ATS\_OUTER\_MAXIMUM\_FRACTION (an optional variable in the IMS input file with a default value of 1/3), then the time step length is multiplied by dtadj. If the number of outer solver iterations are greater than the product of the maximum number of outer iterations and ATS\_OUTER\_MAXIMUM\_FRACTION, then the time step length is divided by dtadj. dtadj must be zero, one, or greater than one. If dtadj is zero or one, then it has no effect on the simulation. A value between 2.0 and 5.0 can be used as an initial estimate. block perioddata name dtfailadj diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 765d0d8e22d..e6850222c48 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -129,7 +129,7 @@ | SLN | IMS | OPTIONS | ATS_OUTER_MAXIMUM_FRACTION | DOUBLE PRECISION | real value defining the fraction of the maximum allowable outer iterations used with the Adaptive Time Step (ATS) capability if it is active. If this value is set to zero by the user, then this solution will have no effect on ATS behavior. This value must be greater than or equal to zero and less than or equal to 0.5 or the program will terminate with an error. If it is not specified by the user, then it is assigned a default value of one third. When the number of outer iterations for this solution is less than the product of this value and the maximum allowable outer iterations, then ATS will increase the time step length by a factor of DTADJ in the ATS input file. When the number of outer iterations for this solution is greater than the maximum allowable outer iterations minus the product of this value and the maximum allowable outer iterations, then the ATS (if active) will decrease the time step length by a factor of 1 / DTADJ. | | SLN | IMS | NONLINEAR | OUTER_HCLOSE | DOUBLE PRECISION | real value defining the head change criterion for convergence of the outer (nonlinear) iterations, in units of length. When the maximum absolute value of the head change at all nodes during an iteration is less than or equal to OUTER\_HCLOSE, iteration stops. Commonly, OUTER\_HCLOSE equals 0.01. The OUTER\_HCLOSE option has been deprecated in favor of the more general OUTER\_DVCLOSE (for dependent variable), however either one can be specified in order to maintain backward compatibility. | | SLN | IMS | NONLINEAR | OUTER_DVCLOSE | DOUBLE PRECISION | real value defining the dependent-variable (for example, head) change criterion for convergence of the outer (nonlinear) iterations, in units of the dependent-variable (for example, length for head). When the maximum absolute value of the dependent-variable change at all nodes during an iteration is less than or equal to OUTER\_DVCLOSE, iteration stops. Commonly, OUTER\_DVCLOSE equals 0.01. The keyword, OUTER\_HCLOSE can be still be specified instead of OUTER\_DVCLOSE for backward compatibility with previous versions of MODFLOW 6 but eventually OUTER\_HCLOSE will be deprecated and specification of OUTER\_HCLOSE will cause MODFLOW 6 to terminate with an error. | -| SLN | IMS | NONLINEAR | OUTER_RCLOSEBND | DOUBLE PRECISION | real value defining the residual tolerance for convergence of model packages that solve a separate equation not solved by the IMS linear solver. This value represents the maximum allowable residual between successive outer iterations at any single model package element. An example of a model package that would use OUTER\_RCLOSEBND to evaluate convergence is the SFR package which solves a continuity equation for each reach. The OUTER\_RCLOSEBND option is deprecated and has no effect on simulation results as of version 6.1.1. The keyword, OUTER\_RCLOSEBND can be still be specified for backward compatibility with previous versions of MODFLOW 6 but eventually specificiation of OUTER\_RCLOSEBND will cause MODFLOW 6 to terminate with an error. | +| SLN | IMS | NONLINEAR | OUTER_RCLOSEBND | DOUBLE PRECISION | real value defining the residual tolerance for convergence of model packages that solve a separate equation not solved by the IMS linear solver. This value represents the maximum allowable residual between successive outer iterations at any single model package element. An example of a model package that would use OUTER\_RCLOSEBND to evaluate convergence is the SFR package which solves a continuity equation for each reach. The OUTER\_RCLOSEBND option is deprecated and has no effect on simulation results as of version 6.1.1. The keyword, OUTER\_RCLOSEBND can be still be specified for backward compatibility with previous versions of MODFLOW 6 but eventually specification of OUTER\_RCLOSEBND will cause MODFLOW 6 to terminate with an error. | | SLN | IMS | NONLINEAR | OUTER_MAXIMUM | INTEGER | integer value defining the maximum number of outer (nonlinear) iterations -- that is, calls to the solution routine. For a linear problem OUTER\_MAXIMUM should be 1. | | SLN | IMS | NONLINEAR | UNDER_RELAXATION | STRING | is an optional keyword that defines the nonlinear under-relaxation schemes used. Under-relaxation is also known as dampening, and is used to reduce the size of the calculated dependent variable before proceeding to the next outer iteration. Under-relaxation can be an effective tool for highly nonlinear models when there are large and often counteracting changes in the calculated dependent variable between successive outer iterations. By default under-relaxation is not used. NONE - under-relaxation is not used (default). SIMPLE - Simple under-relaxation scheme with a fixed relaxation factor (UNDER\_RELAXATION\_GAMMA) is used. COOLEY - Cooley under-relaxation scheme is used. DBD - delta-bar-delta under-relaxation is used. Note that the under-relaxation schemes are often used in conjunction with problems that use the Newton-Raphson formulation, however, experience has indicated that they also work well for non-Newton problems, such as those with the wet/dry options of MODFLOW 6. | | SLN | IMS | NONLINEAR | UNDER_RELAXATION_GAMMA | DOUBLE PRECISION | real value defining either the relaxation factor for the SIMPLE scheme or the history or memory term factor of the Cooley and delta-bar-delta algorithms. For the SIMPLE scheme, a value of one indicates that there is no under-relaxation and the full head change is applied. This value can be gradually reduced from one as a way to improve convergence; for well behaved problems, using a value less than one can increase the number of outer iterations required for convergence and needlessly increase run times. UNDER\_RELAXATION\_GAMMA must be greater than zero for the SIMPLE scheme or the program will terminate with an error. For the Cooley and delta-bar-delta schemes, UNDER\_RELAXATION\_GAMMA is a memory term that can range between zero and one. When UNDER\_RELAXATION\_GAMMA is zero, only the most recent history (previous iteration value) is maintained. As UNDER\_RELAXATION\_GAMMA is increased, past history of iteration changes has greater influence on the memory term. The memory term is maintained as an exponential average of past changes. Retaining some past history can overcome granular behavior in the calculated function surface and therefore helps to overcome cyclic patterns of non-convergence. The value usually ranges from 0.1 to 0.3; a value of 0.2 works well for most problems. UNDER\_RELAXATION\_GAMMA only needs to be specified if UNDER\_RELAXATION is not NONE. | @@ -225,7 +225,7 @@ | GWE | DISU | CONNECTIONDATA | IHC | INTEGER (NJA) | is an index array indicating the direction between node n and all of its m connections. If IHC = 0 then cell n and cell m are connected in the vertical direction. Cell n overlies cell m if the cell number for n is less than m; cell m overlies cell n if the cell number for m is less than n. If IHC = 1 then cell n and cell m are connected in the horizontal direction. If IHC = 2 then cell n and cell m are connected in the horizontal direction, and the connection is vertically staggered. A vertically staggered connection is one in which a cell is horizontally connected to more than one cell in a horizontal connection. | | GWE | DISU | CONNECTIONDATA | CL12 | DOUBLE PRECISION (NJA) | is the array containing connection lengths between the center of cell n and the shared face with each adjacent m cell. | | GWE | DISU | CONNECTIONDATA | HWVA | DOUBLE PRECISION (NJA) | is a symmetric array of size NJA. For horizontal connections, entries in HWVA are the horizontal width perpendicular to flow. For vertical connections, entries in HWVA are the vertical area for flow. Thus, values in the HWVA array contain dimensions of both length and area. Entries in the HWVA array have a one-to-one correspondence with the connections specified in the JA array. Likewise, there is a one-to-one correspondence between entries in the HWVA array and entries in the IHC array, which specifies the connection type (horizontal or vertical). Entries in the HWVA array must be symmetric; the program will terminate with an error if the value for HWVA for an n to m connection does not equal the value for HWVA for the corresponding n to m connection. | -| GWE | DISU | CONNECTIONDATA | ANGLDEGX | DOUBLE PRECISION (NJA) | is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specifed in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. | +| GWE | DISU | CONNECTIONDATA | ANGLDEGX | DOUBLE PRECISION (NJA) | is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specified in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. | | GWE | DISU | VERTICES | IV | INTEGER | is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. | | GWE | DISU | VERTICES | XV | DOUBLE PRECISION | is the x-coordinate for the vertex. | | GWE | DISU | VERTICES | YV | DOUBLE PRECISION | is the y-coordinate for the vertex. | @@ -603,7 +603,7 @@ | GWF | DISU | CONNECTIONDATA | IHC | INTEGER (NJA) | is an index array indicating the direction between node n and all of its m connections. If IHC = 0 then cell n and cell m are connected in the vertical direction. Cell n overlies cell m if the cell number for n is less than m; cell m overlies cell n if the cell number for m is less than n. If IHC = 1 then cell n and cell m are connected in the horizontal direction. If IHC = 2 then cell n and cell m are connected in the horizontal direction, and the connection is vertically staggered. A vertically staggered connection is one in which a cell is horizontally connected to more than one cell in a horizontal connection. | | GWF | DISU | CONNECTIONDATA | CL12 | DOUBLE PRECISION (NJA) | is the array containing connection lengths between the center of cell n and the shared face with each adjacent m cell. | | GWF | DISU | CONNECTIONDATA | HWVA | DOUBLE PRECISION (NJA) | is a symmetric array of size NJA. For horizontal connections, entries in HWVA are the horizontal width perpendicular to flow. For vertical connections, entries in HWVA are the vertical area for flow. Thus, values in the HWVA array contain dimensions of both length and area. Entries in the HWVA array have a one-to-one correspondence with the connections specified in the JA array. Likewise, there is a one-to-one correspondence between entries in the HWVA array and entries in the IHC array, which specifies the connection type (horizontal or vertical). Entries in the HWVA array must be symmetric; the program will terminate with an error if the value for HWVA for an n to m connection does not equal the value for HWVA for the corresponding n to m connection. | -| GWF | DISU | CONNECTIONDATA | ANGLDEGX | DOUBLE PRECISION (NJA) | is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specifed in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. | +| GWF | DISU | CONNECTIONDATA | ANGLDEGX | DOUBLE PRECISION (NJA) | is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specified in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. | | GWF | DISU | VERTICES | IV | INTEGER | is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. | | GWF | DISU | VERTICES | XV | DOUBLE PRECISION | is the x-coordinate for the vertex. | | GWF | DISU | VERTICES | YV | DOUBLE PRECISION | is the y-coordinate for the vertex. | @@ -1236,7 +1236,7 @@ | GWT | DISU | CONNECTIONDATA | IHC | INTEGER (NJA) | is an index array indicating the direction between node n and all of its m connections. If IHC = 0 then cell n and cell m are connected in the vertical direction. Cell n overlies cell m if the cell number for n is less than m; cell m overlies cell n if the cell number for m is less than n. If IHC = 1 then cell n and cell m are connected in the horizontal direction. If IHC = 2 then cell n and cell m are connected in the horizontal direction, and the connection is vertically staggered. A vertically staggered connection is one in which a cell is horizontally connected to more than one cell in a horizontal connection. | | GWT | DISU | CONNECTIONDATA | CL12 | DOUBLE PRECISION (NJA) | is the array containing connection lengths between the center of cell n and the shared face with each adjacent m cell. | | GWT | DISU | CONNECTIONDATA | HWVA | DOUBLE PRECISION (NJA) | is a symmetric array of size NJA. For horizontal connections, entries in HWVA are the horizontal width perpendicular to flow. For vertical connections, entries in HWVA are the vertical area for flow. Thus, values in the HWVA array contain dimensions of both length and area. Entries in the HWVA array have a one-to-one correspondence with the connections specified in the JA array. Likewise, there is a one-to-one correspondence between entries in the HWVA array and entries in the IHC array, which specifies the connection type (horizontal or vertical). Entries in the HWVA array must be symmetric; the program will terminate with an error if the value for HWVA for an n to m connection does not equal the value for HWVA for the corresponding n to m connection. | -| GWT | DISU | CONNECTIONDATA | ANGLDEGX | DOUBLE PRECISION (NJA) | is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specifed in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. | +| GWT | DISU | CONNECTIONDATA | ANGLDEGX | DOUBLE PRECISION (NJA) | is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specified in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. | | GWT | DISU | VERTICES | IV | INTEGER | is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. | | GWT | DISU | VERTICES | XV | DOUBLE PRECISION | is the x-coordinate for the vertex. | | GWT | DISU | VERTICES | YV | DOUBLE PRECISION | is the y-coordinate for the vertex. | @@ -1815,7 +1815,7 @@ | UTL | ATS | PERIODDATA | DT0 | DOUBLE PRECISION | is the initial time step length for period iperats. If dt0 is zero, then the final step from the previous stress period will be used as the initial time step. The program will terminate with an error message if dt0 is negative. | | UTL | ATS | PERIODDATA | DTMIN | DOUBLE PRECISION | is the minimum time step length for this period. This value must be greater than zero and less than dtmax. dtmin must be a small value in order to ensure that simulation times end at the end of stress periods and the end of the simulation. A small value, such as 1.e-5, is recommended. | | UTL | ATS | PERIODDATA | DTMAX | DOUBLE PRECISION | is the maximum time step length for this period. This value must be greater than dtmin. | -| UTL | ATS | PERIODDATA | DTADJ | DOUBLE PRECISION | is the time step multiplier factor for this period. If the number of outer solver iterations are less than the product of the maximum number of outer iterations (OUTER\_MAXIMUM) and ATS\_OUTER\_MAXIMUM\_FRACTION (an optional variable in the IMS input file with a default value of 1/3), then the time step length is multipled by dtadj. If the number of outer solver iterations are greater than the product of the maximum number of outer iterations and ATS\_OUTER\_MAXIMUM\_FRACTION, then the time step length is divided by dtadj. dtadj must be zero, one, or greater than one. If dtadj is zero or one, then it has no effect on the simulation. A value between 2.0 and 5.0 can be used as an initial estimate. | +| UTL | ATS | PERIODDATA | DTADJ | DOUBLE PRECISION | is the time step multiplier factor for this period. If the number of outer solver iterations are less than the product of the maximum number of outer iterations (OUTER\_MAXIMUM) and ATS\_OUTER\_MAXIMUM\_FRACTION (an optional variable in the IMS input file with a default value of 1/3), then the time step length is multiplied by dtadj. If the number of outer solver iterations are greater than the product of the maximum number of outer iterations and ATS\_OUTER\_MAXIMUM\_FRACTION, then the time step length is divided by dtadj. dtadj must be zero, one, or greater than one. If dtadj is zero or one, then it has no effect on the simulation. A value between 2.0 and 5.0 can be used as an initial estimate. | | UTL | ATS | PERIODDATA | DTFAILADJ | DOUBLE PRECISION | is the divisor of the time step length when a time step fails to converge. If there is solver failure, then the time step will be tried again with a shorter time step length calculated as the previous time step length divided by dtfailadj. dtfailadj must be zero, one, or greater than one. If dtfailadj is zero or one, then time steps will not be retried with shorter lengths. In this case, the program will terminate with an error, or it will continue of the CONTINUE option is set in the simulation name file. Initial tests with this variable should be set to 5.0 or larger to determine if convergence can be achieved. | | UTL | LAKTAB | DIMENSIONS | NROW | INTEGER | integer value specifying the number of rows in the lake table. There must be NROW rows of data in the TABLE block. | | UTL | LAKTAB | DIMENSIONS | NCOL | INTEGER | integer value specifying the number of columns in the lake table. There must be NCOL columns of data in the TABLE block. For lakes with HORIZONTAL and/or VERTICAL CTYPE connections, NCOL must be equal to 3. For lakes with EMBEDDEDH or EMBEDDEDV CTYPE connections, NCOL must be equal to 4. | diff --git a/doc/mf6io/mf6ivar/readme.md b/doc/mf6io/mf6ivar/readme.md index 53b9297d0ee..3f19481ad33 100644 --- a/doc/mf6io/mf6ivar/readme.md +++ b/doc/mf6io/mf6ivar/readme.md @@ -74,7 +74,7 @@ An example below is the second line in the ts subpackage dfn: \# flopy parent_name_type parent_package MFPackage -There are three possible types (or combination of them) that can be used for "parent package type", MFPackage, MFModel, and MFSimulation. If a package supports multiple types of parents (for example, it can be either in the model namefile or in a package, like the obs package), include all the types supported, seperating each type with a / (MFPackage/MFModel). +There are three possible types (or combination of them) that can be used for "parent package type", MFPackage, MFModel, and MFSimulation. If a package supports multiple types of parents (for example, it can be either in the model namefile or in a package, like the obs package), include all the types supported, separating each type with a / (MFPackage/MFModel). ## Creating Definition Files for New Models @@ -666,7 +666,7 @@ END NPFDATA # Common Text Strings -Many of the MODFLOW 6 input variables share common description information. This information can be defined in one place and then referenced as many times as needed throughout the definition files. The definition file [./dfn/common.dfn](./dfn/common.dfn) is where common infomation is defined. For example, there is a text string defined as: +Many of the MODFLOW 6 input variables share common description information. This information can be defined in one place and then referenced as many times as needed throughout the definition files. The definition file [./dfn/common.dfn](./dfn/common.dfn) is where common information is defined. For example, there is a text string defined as: ``` name auxnames diff --git a/doc/mf6io/mf6ivar/tex/gwe-disu-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-disu-desc.tex index 14d67b19f02..17940c7f4cf 100644 --- a/doc/mf6io/mf6ivar/tex/gwe-disu-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwe-disu-desc.tex @@ -51,7 +51,7 @@ \item \texttt{hwva}---is a symmetric array of size NJA. For horizontal connections, entries in HWVA are the horizontal width perpendicular to flow. For vertical connections, entries in HWVA are the vertical area for flow. Thus, values in the HWVA array contain dimensions of both length and area. Entries in the HWVA array have a one-to-one correspondence with the connections specified in the JA array. Likewise, there is a one-to-one correspondence between entries in the HWVA array and entries in the IHC array, which specifies the connection type (horizontal or vertical). Entries in the HWVA array must be symmetric; the program will terminate with an error if the value for HWVA for an n to m connection does not equal the value for HWVA for the corresponding n to m connection. -\item \texttt{angldegx}---is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specifed in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. +\item \texttt{angldegx}---is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specified in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. \end{description} \item \textbf{Block: VERTICES} diff --git a/doc/mf6io/mf6ivar/tex/gwf-disu-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-disu-desc.tex index 9e74c4e48bf..5c943b5ffcf 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-disu-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-disu-desc.tex @@ -51,7 +51,7 @@ \item \texttt{hwva}---is a symmetric array of size NJA. For horizontal connections, entries in HWVA are the horizontal width perpendicular to flow. For vertical connections, entries in HWVA are the vertical area for flow. Thus, values in the HWVA array contain dimensions of both length and area. Entries in the HWVA array have a one-to-one correspondence with the connections specified in the JA array. Likewise, there is a one-to-one correspondence between entries in the HWVA array and entries in the IHC array, which specifies the connection type (horizontal or vertical). Entries in the HWVA array must be symmetric; the program will terminate with an error if the value for HWVA for an n to m connection does not equal the value for HWVA for the corresponding n to m connection. -\item \texttt{angldegx}---is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specifed in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. +\item \texttt{angldegx}---is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specified in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. \end{description} \item \textbf{Block: VERTICES} diff --git a/doc/mf6io/mf6ivar/tex/gwt-disu-desc.tex b/doc/mf6io/mf6ivar/tex/gwt-disu-desc.tex index 471a8511729..138c58549d9 100644 --- a/doc/mf6io/mf6ivar/tex/gwt-disu-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwt-disu-desc.tex @@ -51,7 +51,7 @@ \item \texttt{hwva}---is a symmetric array of size NJA. For horizontal connections, entries in HWVA are the horizontal width perpendicular to flow. For vertical connections, entries in HWVA are the vertical area for flow. Thus, values in the HWVA array contain dimensions of both length and area. Entries in the HWVA array have a one-to-one correspondence with the connections specified in the JA array. Likewise, there is a one-to-one correspondence between entries in the HWVA array and entries in the IHC array, which specifies the connection type (horizontal or vertical). Entries in the HWVA array must be symmetric; the program will terminate with an error if the value for HWVA for an n to m connection does not equal the value for HWVA for the corresponding n to m connection. -\item \texttt{angldegx}---is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specifed in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. +\item \texttt{angldegx}---is the angle (in degrees) between the horizontal x-axis and the outward normal to the face between a cell and its connecting cells. The angle varies between zero and 360.0 degrees, where zero degrees points in the positive x-axis direction, and 90 degrees points in the positive y-axis direction. ANGLDEGX is only needed if horizontal anisotropy is specified in the NPF Package, if the XT3D option is used in the NPF Package, or if the SAVE\_SPECIFIC\_DISCHARGE option is specified in the NPF Package. ANGLDEGX does not need to be specified if these conditions are not met. ANGLDEGX is of size NJA; values specified for vertical connections and for the diagonal position are not used. Note that ANGLDEGX is read in degrees, which is different from MODFLOW-USG, which reads a similar variable (ANGLEX) in radians. \end{description} \item \textbf{Block: VERTICES} diff --git a/doc/mf6io/mf6ivar/tex/utl-ats-desc.tex b/doc/mf6io/mf6ivar/tex/utl-ats-desc.tex index 6841c2c2aec..21324f17613 100644 --- a/doc/mf6io/mf6ivar/tex/utl-ats-desc.tex +++ b/doc/mf6io/mf6ivar/tex/utl-ats-desc.tex @@ -17,7 +17,7 @@ \item \texttt{dtmax}---is the maximum time step length for this period. This value must be greater than dtmin. -\item \texttt{dtadj}---is the time step multiplier factor for this period. If the number of outer solver iterations are less than the product of the maximum number of outer iterations (OUTER\_MAXIMUM) and ATS\_OUTER\_MAXIMUM\_FRACTION (an optional variable in the IMS input file with a default value of 1/3), then the time step length is multipled by dtadj. If the number of outer solver iterations are greater than the product of the maximum number of outer iterations and ATS\_OUTER\_MAXIMUM\_FRACTION, then the time step length is divided by dtadj. dtadj must be zero, one, or greater than one. If dtadj is zero or one, then it has no effect on the simulation. A value between 2.0 and 5.0 can be used as an initial estimate. +\item \texttt{dtadj}---is the time step multiplier factor for this period. If the number of outer solver iterations are less than the product of the maximum number of outer iterations (OUTER\_MAXIMUM) and ATS\_OUTER\_MAXIMUM\_FRACTION (an optional variable in the IMS input file with a default value of 1/3), then the time step length is multiplied by dtadj. If the number of outer solver iterations are greater than the product of the maximum number of outer iterations and ATS\_OUTER\_MAXIMUM\_FRACTION, then the time step length is divided by dtadj. dtadj must be zero, one, or greater than one. If dtadj is zero or one, then it has no effect on the simulation. A value between 2.0 and 5.0 can be used as an initial estimate. \item \texttt{dtfailadj}---is the divisor of the time step length when a time step fails to converge. If there is solver failure, then the time step will be tried again with a shorter time step length calculated as the previous time step length divided by dtfailadj. dtfailadj must be zero, one, or greater than one. If dtfailadj is zero or one, then time steps will not be retried with shorter lengths. In this case, the program will terminate with an error, or it will continue of the CONTINUE option is set in the simulation name file. Initial tests with this variable should be set to 5.0 or larger to determine if convergence can be achieved. diff --git a/src/Distributed/MpiRouter.f90 b/src/Distributed/MpiRouter.f90 index b4fcd6c1eff..6741f0576e7 100644 --- a/src/Distributed/MpiRouter.f90 +++ b/src/Distributed/MpiRouter.f90 @@ -245,7 +245,7 @@ subroutine route_active(this, unit, stage) integer, dimension(:), allocatable :: body_rcv_t integer, dimension(:), allocatable :: body_snd_t - ! update adress list + ! update address list call this%update_senders() call this%update_receivers() diff --git a/src/Distributed/VirtualDataManager.f90 b/src/Distributed/VirtualDataManager.f90 index a91b5e7eabe..c7c3f87e64e 100644 --- a/src/Distributed/VirtualDataManager.f90 +++ b/src/Distributed/VirtualDataManager.f90 @@ -274,7 +274,7 @@ subroutine vds_reduce_halo(this) write (monitor_file, '(a,i0,a)') "iface.p", proc_id, ".log" open (unit=outunit, file=monitor_file) do isol = 1, this%nr_solutions - write (outunit, '(a,i0,/)') "interface mape for solution ", & + write (outunit, '(a,i0,/)') "interface map for solution ", & this%virtual_solutions(isol)%solution_id virt_sol => this%virtual_solutions(isol) call virt_sol%interface_map%print_interface(outunit) diff --git a/src/Distributed/VirtualExchange.f90 b/src/Distributed/VirtualExchange.f90 index e849f990724..bcaf4f43c21 100644 --- a/src/Distributed/VirtualExchange.f90 +++ b/src/Distributed/VirtualExchange.f90 @@ -292,7 +292,7 @@ subroutine deallocate_data(this) end subroutine deallocate_data - !> @brief Returs a virtual exchange with the specified id + !> @brief Returns a virtual exchange with the specified id !< from the global list function get_virtual_exchange(exg_id) result(virtual_exg) use VirtualDataListsModule, only: virtual_exchange_list diff --git a/src/Distributed/VirtualSolution.f90 b/src/Distributed/VirtualSolution.f90 index 0433ba6a8b2..d556d9268c3 100644 --- a/src/Distributed/VirtualSolution.f90 +++ b/src/Distributed/VirtualSolution.f90 @@ -16,7 +16,7 @@ module VirtualSolutionModule type(InterfaceMapType), pointer :: interface_map => null() !< contains the aggregate interface map for the solution !! NB: the aggregation is over multiple interface models !! and there is no unique numbering there. The target - !! indexes should therefore be considere invalid. + !! indexes should therefore be considered invalid. end type VirtualSolutionType end module VirtualSolutionModule diff --git a/src/Exchange/exg-gwegwe.f90 b/src/Exchange/exg-gwegwe.f90 index 0593bd15eea..b168d6c4b0c 100644 --- a/src/Exchange/exg-gwegwe.f90 +++ b/src/Exchange/exg-gwegwe.f90 @@ -1156,7 +1156,7 @@ subroutine gwe_gwe_save_simvals(this) return end subroutine gwe_gwe_save_simvals - !> @ brief Obs ID processer + !> @ brief Obs ID processor !! !! Process observations for this exchange !< diff --git a/src/Exchange/exg-gwfgwf.f90 b/src/Exchange/exg-gwfgwf.f90 index e780adc528b..534df4b0f9d 100644 --- a/src/Exchange/exg-gwfgwf.f90 +++ b/src/Exchange/exg-gwfgwf.f90 @@ -2129,7 +2129,7 @@ subroutine gwf_gwf_save_simvals(this) return end subroutine gwf_gwf_save_simvals - !> @ brief Obs ID processer + !> @ brief Obs ID processor !! !! Process observations for this exchange !< diff --git a/src/Exchange/exg-gwtgwt.f90 b/src/Exchange/exg-gwtgwt.f90 index c4833aeef7d..c9e66e8d27c 100644 --- a/src/Exchange/exg-gwtgwt.f90 +++ b/src/Exchange/exg-gwtgwt.f90 @@ -1153,7 +1153,7 @@ subroutine gwt_gwt_save_simvals(this) return end subroutine gwt_gwt_save_simvals - !> @ brief Obs ID processer + !> @ brief Obs ID processor !! !! Process observations for this exchange !< diff --git a/src/Exchange/exg-swfgwf.f90 b/src/Exchange/exg-swfgwf.f90 index 85cbca147bf..a49650a5884 100644 --- a/src/Exchange/exg-swfgwf.f90 +++ b/src/Exchange/exg-swfgwf.f90 @@ -3291,7 +3291,7 @@ end module SwfGwfExchangeModule ! return ! end subroutine swf_gwf_save_simvals -! !> @ brief Obs ID processer +! !> @ brief Obs ID processor ! !! ! !! Process observations for this exchange ! !< diff --git a/src/Model/Connection/ConnectionBuilder.f90 b/src/Model/Connection/ConnectionBuilder.f90 index d53aa51bedb..63407f80583 100644 --- a/src/Model/Connection/ConnectionBuilder.f90 +++ b/src/Model/Connection/ConnectionBuilder.f90 @@ -60,7 +60,7 @@ subroutine processSolution(this, solution) write (iout, '(1x,a,i0,a,a)') 'Created ', newConnections%Count(), & ' model connections for solution ', trim(solution%name) - ! craete the topology of models participating in the interfaces + ! create the topology of models participating in the interfaces call this%createModelConnectivity(newConnections) ! replace numerical exchanges in solution with connections diff --git a/src/Model/Connection/GridConnection.f90 b/src/Model/Connection/GridConnection.f90 index 8ad009e905a..dd2fddd4e7b 100644 --- a/src/Model/Connection/GridConnection.f90 +++ b/src/Model/Connection/GridConnection.f90 @@ -410,7 +410,7 @@ recursive subroutine addNeighbors(this, cellNbrs, depth, mask, interior) newDepth = newDepth - 1 end if end if - ! and add neigbors with the new depth + ! and add neighbors with the new depth call this%addNeighbors(cellNbrs%neighbors(inbr), newDepth, & cellNbrs%cell, interior) end do @@ -465,7 +465,7 @@ end subroutine addRemoteNeighbors subroutine addNeighborCell(this, cellNbrs, newNbrIdx, v_nbr_model, mask) class(GridConnectionType), intent(in) :: this !< this grid connection instance type(CellWithNbrsType), intent(inout) :: cellNbrs !< the root cell which to add to - integer(I4B), intent(in) :: newNbrIdx !< the neigboring cell's index + integer(I4B), intent(in) :: newNbrIdx !< the neighboring cell's index class(VirtualModelType), pointer :: v_nbr_model !< the model where the new neighbor lives type(GlobalCellType), optional :: mask !< don't add connections to this cell (optional) @@ -480,7 +480,7 @@ subroutine addNeighborCell(this, cellNbrs, newNbrIdx, v_nbr_model, mask) end subroutine addNeighborCell !> @brief Recursively set interface cell indexes and - !< add to the region-to-interface loopup table + !< add to the region-to-interface lookup table recursive subroutine registerInterfaceCells(this, cellWithNbrs) class(GridConnectionType), intent(inout) :: this !< this grid connection instance type(CellWithNbrsType) :: cellWithNbrs !< the cell from where to start registering neighbors @@ -626,7 +626,7 @@ subroutine makePrimaryConnections(this, sparse) end subroutine makePrimaryConnections !> @brief Recursively add higher order connections (from - !! cells neighoring the primarily connected cells) to the + !! cells neighboring the primarily connected cells) to the !< sparse data structure recursive subroutine connectNeighborCells(this, cell, sparse) class(GridConnectionType), intent(inout) :: this !< this grid connection instance @@ -739,7 +739,7 @@ subroutine fillConnectionDataFromExchanges(this) nIfaceIdx = this%region_to_iface_map(noffset + v_exg%nodem1%get(iexg)) mIfaceIdx = this%region_to_iface_map(moffset + v_exg%nodem2%get(iexg)) ! not all nodes from the exchanges are part of the interface grid - ! (think of exchanges between neigboring models, and their neighbors) + ! (think of exchanges between neighboring models, and their neighbors) if (nIFaceIdx == -1 .or. mIFaceIdx == -1) then cycle end if diff --git a/src/Model/Connection/SpatialModelConnection.f90 b/src/Model/Connection/SpatialModelConnection.f90 index 6ebc92fef6c..062dd3de78c 100644 --- a/src/Model/Connection/SpatialModelConnection.f90 +++ b/src/Model/Connection/SpatialModelConnection.f90 @@ -436,7 +436,7 @@ end subroutine spatialcon_mc !> @brief Calculate (or adjust) matrix coefficients, !! in this case those which are determined or affected - !< by the connection of a GWF model with its neigbors + !< by the connection of a GWF model with its neighbors subroutine spatialcon_cf(this, kiter) class(SpatialModelConnectionType) :: this !< this connection integer(I4B), intent(in) :: kiter !< the iteration counter diff --git a/src/Model/Connection/qsort_inline.inc b/src/Model/Connection/qsort_inline.inc index 7990a776ed9..863944e4b38 100644 --- a/src/Model/Connection/qsort_inline.inc +++ b/src/Model/Connection/qsort_inline.inc @@ -49,7 +49,7 @@ ! the benefit is in blocks of 8 or less, and values of 16 to 128 ! are generally about equal speed. However, the optimal value ! depends a lot on the hardware and the data being sorted, so this -! is left as a tunable parameter for cases where ther is an +! is left as a tunable parameter for cases where there is an ! effect on performance. ! !--------------------------------------------------------------------- @@ -62,7 +62,7 @@ ! Sorting vectors of a multidimensional allocatable array can be ! VERY slow. In this case, or with large derived types, it is better ! to sort a simple derived type of key/index pairs, then reorder -! tha actual data using the sorted indices. +! the actual data using the sorted indices. ! !--------------------------------------------------------------------- integer :: stack_top, right_size, left_size @@ -70,7 +70,7 @@ ! A stack of 32 can handle the entire extent of a 32-bit ! index, so this value is fixed. If you have 64-bit indexed -! arrays, which might contain more thant 2^32 elements, this +! arrays, which might contain more than 2^32 elements, this ! should be set to 64. integer, parameter :: QSORT_STACK_SIZE = 64 type qsort_stack; integer :: low, high; end type diff --git a/src/Model/Discretization/Dis2d.f90 b/src/Model/Discretization/Dis2d.f90 index 2302d85f9c8..20afa460439 100644 --- a/src/Model/Discretization/Dis2d.f90 +++ b/src/Model/Discretization/Dis2d.f90 @@ -1013,7 +1013,7 @@ subroutine connection_vector(this, noden, nodem, nozee, satn, satm, ihc, & real(DP), intent(in) :: satm !< not used for dis2d integer(I4B), intent(in) :: ihc !< not used for dis2d (always horizontal) real(DP), intent(inout) :: xcomp !< x component of the connection vector - real(DP), intent(inout) :: ycomp !< y componenet of the connection vector + real(DP), intent(inout) :: ycomp !< y component of the connection vector real(DP), intent(inout) :: zcomp !< z component, which is always zero real(DP), intent(inout) :: conlen !< calculated connection length ! local diff --git a/src/Model/Discretization/Disv1d.f90 b/src/Model/Discretization/Disv1d.f90 index 357f7a72bb1..dafd6da3324 100644 --- a/src/Model/Discretization/Disv1d.f90 +++ b/src/Model/Discretization/Disv1d.f90 @@ -995,7 +995,7 @@ function get_nodenumber_idx1(this, nodeu, icheck) result(nodenumber) end if end if ! - ! -- set node number based on wheter it is reduced or not + ! -- set node number based on whether it is reduced or not if (this%nodes == this%nodesuser) then nodenumber = nodeu else diff --git a/src/Model/ExplicitModel.f90 b/src/Model/ExplicitModel.f90 index dd829d4d465..ecb86e38f00 100644 --- a/src/Model/ExplicitModel.f90 +++ b/src/Model/ExplicitModel.f90 @@ -87,7 +87,7 @@ subroutine model_da(this) call this%bndlist%Clear() deallocate (this%bndlist) - ! -- deallocate base tpye + ! -- deallocate base type call this%BaseModelType%model_da() end subroutine model_da diff --git a/src/Model/GroundWaterEnergy/gwe-est.f90 b/src/Model/GroundWaterEnergy/gwe-est.f90 index c5a0dba3f65..3f24af32489 100644 --- a/src/Model/GroundWaterEnergy/gwe-est.f90 +++ b/src/Model/GroundWaterEnergy/gwe-est.f90 @@ -4,9 +4,9 @@ !! to GwtEstModule; however, there are some important differences !! owing to the fact that a sorbed phase is not considered. !! Instead, a single temperature is simulated for each grid -!! cell and is represenative of both the aqueous and solid +!! cell and is representative of both the aqueous and solid !! phases (i.e., instantaneous thermal equilibrium is -!! assumed). Also, "thermal bleeding" is accomodated, where +!! assumed). Also, "thermal bleeding" is accommodated, where !! conductive processes can transport into, through, or !! out of dry cells that are part of the active domain. !< @@ -47,7 +47,7 @@ module GweEstModule ! ! -- decay integer(I4B), pointer :: idcy => null() !< order of decay rate (0:none, 1:first, 2:zero) - integer(I4B), pointer :: ilhv => null() !< latent heat of vaporization for calculating temperature change associcated with evaporation (0: not specified, not 0: specified) + integer(I4B), pointer :: ilhv => null() !< latent heat of vaporization for calculating temperature change associated with evaporation (0: not specified, not 0: specified) real(DP), dimension(:), pointer, contiguous :: decay => null() !< first or zero order decay rate (aqueous) real(DP), dimension(:), pointer, contiguous :: ratedcy => null() !< rate of decay real(DP), dimension(:), pointer, contiguous :: decaylast => null() !< decay rate used for last iteration (needed for zero order decay) @@ -462,7 +462,7 @@ subroutine est_bd(this, isuppress_output, model_budget) use BudgetModule, only: BudgetType, rate_accumulator ! -- dummy class(GweEstType) :: this !< GweEstType object - integer(I4B), intent(in) :: isuppress_output !< flag to supress output + integer(I4B), intent(in) :: isuppress_output !< flag to suppress output type(BudgetType), intent(inout) :: model_budget !< model budget object ! -- local real(DP) :: rin diff --git a/src/Model/GroundWaterEnergy/gwe-lke.f90 b/src/Model/GroundWaterEnergy/gwe-lke.f90 index 46c932ffad8..d7b1ff41fd7 100644 --- a/src/Model/GroundWaterEnergy/gwe-lke.f90 +++ b/src/Model/GroundWaterEnergy/gwe-lke.f90 @@ -484,7 +484,7 @@ function lke_get_nbudterms(this) result(nbudterms) ! 2) evap ! 3) runoff ! 4) ext-inflow - ! 5) withdrawl + ! 5) withdrawal ! 6) ext-outflow ! 7) lakebed-cond ! @@ -999,7 +999,7 @@ end subroutine lke_outf_term !> @brief Defined observation types !! - !! Store the observation type supported by the APT package and overide + !! Store the observation type supported by the APT package and override !! BndType%bnd_df_obs !< subroutine lke_df_obs(this) diff --git a/src/Model/GroundWaterEnergy/gwe-mwe.f90 b/src/Model/GroundWaterEnergy/gwe-mwe.f90 index 4b6bb76a38d..1dfac96562e 100644 --- a/src/Model/GroundWaterEnergy/gwe-mwe.f90 +++ b/src/Model/GroundWaterEnergy/gwe-mwe.f90 @@ -254,7 +254,7 @@ subroutine find_mwe_package(this) this%idxbudssm(ip) = 0 case default ! - ! -- Set idxbudssm equal to a column index for where the tempeartures + ! -- Set idxbudssm equal to a column index for where the temperatures ! are stored in the tempbud(nbudssm, ncv) array this%idxbudssm(ip) = icount icount = icount + 1 @@ -716,7 +716,7 @@ subroutine mwe_da(this) return end subroutine mwe_da - !> @brief Thermal transport matrix term(s) associcated with a user-specified + !> @brief Thermal transport matrix term(s) associated with a user-specified !! flow rate (mwe_rate_term) !< subroutine mwe_rate_term(this, ientry, n1, n2, rrate, rhsval, hcofval) @@ -754,7 +754,7 @@ subroutine mwe_rate_term(this, ientry, n1, n2, rrate, rhsval, hcofval) return end subroutine mwe_rate_term - !> @brief Thermal transport matrix term(s) associcated with a flowing- + !> @brief Thermal transport matrix term(s) associated with a flowing- !! well rate term associated with pumping (or injection) !< subroutine mwe_fwrt_term(this, ientry, n1, n2, rrate, rhsval, hcofval) @@ -782,7 +782,7 @@ subroutine mwe_fwrt_term(this, ientry, n1, n2, rrate, rhsval, hcofval) return end subroutine mwe_fwrt_term - !> @brief Thermal transport matrix term(s) associcated with pumped-water- + !> @brief Thermal transport matrix term(s) associated with pumped-water- !! to-mover term (mwe_rtmv_term) !< subroutine mwe_rtmv_term(this, ientry, n1, n2, rrate, rhsval, hcofval) @@ -810,7 +810,7 @@ subroutine mwe_rtmv_term(this, ientry, n1, n2, rrate, rhsval, hcofval) return end subroutine mwe_rtmv_term - !> @brief Thermal transport matrix term(s) associcated with the flowing- + !> @brief Thermal transport matrix term(s) associated with the flowing- !! well-rate-to-mover term (mwe_frtm_term) !< subroutine mwe_frtm_term(this, ientry, n1, n2, rrate, rhsval, hcofval) @@ -840,7 +840,7 @@ end subroutine mwe_frtm_term !> @brief Observations !! - !! Store the observation type supported by the APT package and overide + !! Store the observation type supported by the APT package and override !! BndType%bnd_df_obs !< subroutine mwe_df_obs(this) diff --git a/src/Model/GroundWaterEnergy/gwe-sfe.f90 b/src/Model/GroundWaterEnergy/gwe-sfe.f90 index e2e514d1d11..844ca92d053 100644 --- a/src/Model/GroundWaterEnergy/gwe-sfe.f90 +++ b/src/Model/GroundWaterEnergy/gwe-sfe.f90 @@ -917,7 +917,7 @@ end subroutine sfe_outf_term !> @brief Observations !! - !! Store the observation type supported by the APT package and overide + !! Store the observation type supported by the APT package and override !! BndType%bnd_df_obs !< subroutine sfe_df_obs(this) diff --git a/src/Model/GroundWaterEnergy/gwe-uze.f90 b/src/Model/GroundWaterEnergy/gwe-uze.f90 index a1d2e4c9d13..ee429ac8313 100644 --- a/src/Model/GroundWaterEnergy/gwe-uze.f90 +++ b/src/Model/GroundWaterEnergy/gwe-uze.f90 @@ -87,7 +87,7 @@ module GweUzeModule contains - !> @breif Create a new UZE package + !> @brief Create a new UZE package !< subroutine uze_create(packobj, id, ibcnum, inunit, iout, namemodel, pakname, & fmi, eqnsclfac, gwecommon, dvt, dvu, dvua) diff --git a/src/Model/GroundWaterEnergy/gwe.f90 b/src/Model/GroundWaterEnergy/gwe.f90 index f0d34e2354d..e387f77791c 100644 --- a/src/Model/GroundWaterEnergy/gwe.f90 +++ b/src/Model/GroundWaterEnergy/gwe.f90 @@ -601,7 +601,7 @@ end subroutine gwe_ot !> @brief Deallocate !! - !! Deallocate memmory at conclusion of model run + !! Deallocate memory at conclusion of model run !< subroutine gwe_da(this) ! -- modules diff --git a/src/Model/GroundWaterFlow/gwf-api.f90 b/src/Model/GroundWaterFlow/gwf-api.f90 index f587937545d..71613a415d0 100644 --- a/src/Model/GroundWaterFlow/gwf-api.f90 +++ b/src/Model/GroundWaterFlow/gwf-api.f90 @@ -94,7 +94,7 @@ subroutine api_options(this, option, found) character(len=*), intent(inout) :: option logical, intent(inout) :: found ! - ! -- process pakage options + ! -- process package options select case (option) case ('MOVER') this%imover = 1 @@ -113,7 +113,7 @@ end subroutine api_options !> @ brief Read and prepare stress period data for package !! !! Method reads and prepares stress period data for the USR package. - !! This method overides the base read and prepare method and does not read + !! This method overrides the base read and prepare method and does not read !! any stress period data from the USR package input file. !! !< diff --git a/src/Model/GroundWaterFlow/gwf-chd.f90 b/src/Model/GroundWaterFlow/gwf-chd.f90 index 3b7c7c26a16..c209f6c962b 100644 --- a/src/Model/GroundWaterFlow/gwf-chd.f90 +++ b/src/Model/GroundWaterFlow/gwf-chd.f90 @@ -263,7 +263,7 @@ subroutine chd_fc(this, rhs, ia, idxglo, matrix_sln) return end subroutine chd_fc - !> @brief Calculate flow associated with constant head bondary + !> @brief Calculate flow associated with constant head boundary !! !! This method overrides bnd_cq() !< diff --git a/src/Model/GroundWaterFlow/gwf-csub.f90 b/src/Model/GroundWaterFlow/gwf-csub.f90 index db87b8ff411..7ab26738cbd 100644 --- a/src/Model/GroundWaterFlow/gwf-csub.f90 +++ b/src/Model/GroundWaterFlow/gwf-csub.f90 @@ -474,7 +474,7 @@ subroutine csub_ar(this, dis, ibound) call store_error('Required GRIDDATA block not found.') end if ! - ! -- detemine if cg_ske and cg_theta have been specified + ! -- determine if cg_ske and cg_theta have been specified if (iske == 0) then write (errmsg, '(a)') 'CG_SKE GRIDDATA must be specified.' call store_error(errmsg) @@ -735,7 +735,7 @@ subroutine read_options(this) case ('NDELAYCELLS') this%ndelaycells = this%parser%GetInteger() ! - ! -- compression indicies (CR amd CC) will be specified instead of + ! -- compression indices (CR amd CC) will be specified instead of ! storage coefficients (SSE and SSV) case ('COMPRESSION_INDICES') this%istoragec = 0 @@ -3325,7 +3325,7 @@ subroutine csub_cq(this, nodes, hnew, hold, isuppress_output, flowja) end if ! ! -- update coarse-grained storage and water - ! compresion variables + ! compression variables this%cg_stor(node) = rrate this%cell_wcstor(node) = rratewc this%cell_thick(node) = this%cg_thick(node) @@ -4406,7 +4406,7 @@ subroutine csub_set_initial_state(this, nodes, hnew) pcs = this%cg_es(node) + pcs0 end if else - ! specified pcs...substract head (u) from sigma + ! specified pcs...subtract head (u) from sigma if (this%ipch /= 0) then pcs = this%cg_gs(node) - (pcs0 - bot) end if @@ -5156,7 +5156,7 @@ end subroutine csub_cg_calc_comp !> @ brief Update coarse-grained material properties !! - !! Method updates coarse-grained material proerties in a cell. + !! Method updates coarse-grained material properties in a cell. !! !< subroutine csub_cg_update(this, node) @@ -5293,7 +5293,7 @@ subroutine csub_cg_wcomp_fn(this, node, tled, area, hcell, hcellold, hcof, rhs) bot = this%dis%bot(node) tthk = this%cg_thick(node) ! - ! -- calculate saturation derivitive + ! -- calculate saturation derivative satderv = this%csub_calc_sat_derivative(node, hcell) ! ! -- calculate water compressibility factor @@ -5413,7 +5413,7 @@ subroutine csub_nodelay_wcomp_fn(this, ib, node, tled, area, & ! f = this%brg * area * tled ! - ! -- calculate saturation derivitive + ! -- calculate saturation derivative satderv = this%csub_calc_sat_derivative(node, hcell) ! ! -- calculate the current water compressibility factor @@ -6057,7 +6057,7 @@ subroutine csub_delay_calc_ssksske(this, ib, n, hcell, ssk, sske) ! of the cell based on current head zcell = this%csub_calc_znode(topcell, botcell, hbarcell) ! - ! -- set variables for delay interbed zcell calulations + ! -- set variables for delay interbed zcell calculations zcenter = zcell + this%dbrelz(n, idelay) dzhalf = DHALF * this%dbdzini(1, idelay) top = zcenter + dzhalf diff --git a/src/Model/GroundWaterFlow/gwf-lak.f90 b/src/Model/GroundWaterFlow/gwf-lak.f90 index e6386e6fcd5..c73a03360f1 100644 --- a/src/Model/GroundWaterFlow/gwf-lak.f90 +++ b/src/Model/GroundWaterFlow/gwf-lak.f90 @@ -3091,7 +3091,7 @@ subroutine lak_set_stressperiod(this, itemno) bndElem => this%withdrawal(itemno) call read_value_or_time_series_adv(text, itemno, jj, bndElem, & this%packName, 'BND', this%tsManager, & - this%iprpak, 'WITHDRAWL') + this%iprpak, 'WITHDRAWAL') if (this%withdrawal(itemno) < DZERO) then write (errmsg, '(a,i0,a,G0,a)') & 'Lake ', itemno, ' was assigned a withdrawal value of ', & @@ -6359,7 +6359,7 @@ subroutine lak_calculate_density_exchange(this, iconn, stage, head, cond, & ! else ! - ! -- calulate average relative density + ! -- calculate average relative density rdenseavg = DHALF * (rdenselak + rdensegwf) ! ! -- Add contribution of first density term: diff --git a/src/Model/GroundWaterFlow/gwf-maw.f90 b/src/Model/GroundWaterFlow/gwf-maw.f90 index cf603f6ce42..8c5ef200087 100644 --- a/src/Model/GroundWaterFlow/gwf-maw.f90 +++ b/src/Model/GroundWaterFlow/gwf-maw.f90 @@ -1549,7 +1549,7 @@ subroutine maw_check_attributes(this) ! -- connection screen data if (this%botscrn(jpos) >= this%topscrn(jpos)) then call this%maw_set_attribute_error(n, 'SCREEN_TOP', 'screen bottom '// & - 'must be less tha screen top. '// & + 'must be less than screen top. '// & trim(cgwfnode)) end if ! @@ -2159,7 +2159,7 @@ subroutine maw_ad(this) end if end do ! - !--use the appropriate xoldsto if intial heads are above the + !--use the appropriate xoldsto if initial heads are above the ! specified flowing well discharge elevation if (kper == 1 .and. kstp == 1) then do n = 1, this%nmawwells @@ -3605,7 +3605,7 @@ subroutine maw_calculate_satcond(this, i, j, node) end if ! ! -- ensure that the conductance is not negative. Only write error message - ! if error condition has not occured for skin calculations (LC2) + ! if error condition has not occurred for skin calculations (LC2) if (c < DZERO .and. iTcontrastErr == 0) then write (errmsg, '(a,g0,a,1x,i0,1x,a,1x,i0,a,4(1x,a))') & 'Invalid calculated negative conductance (', c, & @@ -4717,7 +4717,7 @@ subroutine maw_activate_viscosity(this) return end subroutine maw_activate_viscosity - !> @brief Calculate the groundwater-maw density exchnage terms + !> @brief Calculate the groundwater-maw density exchange terms !! !! Arguments are as follows: !! iconn : maw-gwf connection number diff --git a/src/Model/GroundWaterFlow/gwf-npf.f90 b/src/Model/GroundWaterFlow/gwf-npf.f90 index 4d0f3e15d0d..d043e2025d2 100644 --- a/src/Model/GroundWaterFlow/gwf-npf.f90 +++ b/src/Model/GroundWaterFlow/gwf-npf.f90 @@ -2843,7 +2843,7 @@ function calcSatThickness(this, n, m, ihc) result(satThickness) class(GwfNpfType) :: this !< this NPF instance integer(I4B) :: n !< node n integer(I4B) :: m !< node m - integer(I4B) :: ihc !< 1 = horizonal connection, 0 for vertical + integer(I4B) :: ihc !< 1 = horizontal connection, 0 for vertical ! -- return real(DP) :: satThickness !< saturated thickness ! diff --git a/src/Model/GroundWaterFlow/gwf-sfr.f90 b/src/Model/GroundWaterFlow/gwf-sfr.f90 index c0c858abab7..ac3f5163420 100644 --- a/src/Model/GroundWaterFlow/gwf-sfr.f90 +++ b/src/Model/GroundWaterFlow/gwf-sfr.f90 @@ -1547,7 +1547,7 @@ subroutine sfr_read_diversions(this) call mem_reallocate(this%divq, ndiversions, 'DIVQ', this%memoryPath) end if ! - ! -- inititialize diversion flow + ! -- initialize diversion flow do n = 1, ndiversions this%divflow(n) = DZERO this%divq(n) = DZERO @@ -5084,7 +5084,7 @@ subroutine sfr_check_ustrf(this) end do end if ! - ! -- evaluate if an error condition has occured + ! -- evaluate if an error condition has occurred ! the sum of fractions is not equal to 1 if (ids /= 0) then if (abs(f - DONE) > DEM6) then @@ -5822,7 +5822,7 @@ end subroutine sfr_activate_density !> @brief Activate viscosity terms !! - !! Method to activate addition of viscosity terms for exhange + !! Method to activate addition of viscosity terms for exchange !! with groundwater along a SFR package reach. !! !< @@ -5922,7 +5922,7 @@ subroutine sfr_calculate_density_exchange(this, n, stage, head, cond, & ! else ! - ! -- calulate average relative density + ! -- calculate average relative density rdenseavg = DHALF * (rdensesfr + rdensegwf) ! ! -- Add contribution of first density term: diff --git a/src/Model/GroundWaterFlow/gwf-sto.f90 b/src/Model/GroundWaterFlow/gwf-sto.f90 index df9ee6195b2..67458127e06 100644 --- a/src/Model/GroundWaterFlow/gwf-sto.f90 +++ b/src/Model/GroundWaterFlow/gwf-sto.f90 @@ -36,7 +36,7 @@ module GwfStoModule integer(I4B), pointer :: iss => null() !< steady state flag: 1 = steady, 0 = transient integer(I4B), pointer :: iusesy => null() !< flag set if any cell is convertible (0, 1) integer(I4B), dimension(:), pointer, contiguous :: iconvert => null() !< confined (0) or convertible (1) - real(DP), dimension(:), pointer, contiguous :: ss => null() !< specfic storage or storage coefficient + real(DP), dimension(:), pointer, contiguous :: ss => null() !< specific storage or storage coefficient real(DP), dimension(:), pointer, contiguous :: sy => null() !< specific yield real(DP), dimension(:), pointer, contiguous :: strgss => null() !< vector of specific storage rates real(DP), dimension(:), pointer, contiguous :: strgsy => null() !< vector of specific yield rates diff --git a/src/Model/GroundWaterFlow/gwf-tvs.f90 b/src/Model/GroundWaterFlow/gwf-tvs.f90 index e516424c4fe..ba4a7409745 100644 --- a/src/Model/GroundWaterFlow/gwf-tvs.f90 +++ b/src/Model/GroundWaterFlow/gwf-tvs.f90 @@ -25,7 +25,7 @@ module TvsModule type, extends(TvBaseType) :: TvsType integer(I4B), pointer :: integratechanges => null() !< STO flag indicating if mid-simulation ss and sy changes should be integrated via an additional matrix formulation term integer(I4B), pointer :: iusesy => null() !< STO flag set if any cell is convertible (0, 1) - real(DP), dimension(:), pointer, contiguous :: ss => null() !< STO specfic storage or storage coefficient + real(DP), dimension(:), pointer, contiguous :: ss => null() !< STO specific storage or storage coefficient real(DP), dimension(:), pointer, contiguous :: sy => null() !< STO specific yield contains diff --git a/src/Model/GroundWaterFlow/gwf-uzf.f90 b/src/Model/GroundWaterFlow/gwf-uzf.f90 index 586fe420330..ad2d58d4584 100644 --- a/src/Model/GroundWaterFlow/gwf-uzf.f90 +++ b/src/Model/GroundWaterFlow/gwf-uzf.f90 @@ -603,7 +603,7 @@ subroutine uzf_readdimensions(this) call store_error(errmsg) end if ! - ! -- teminate if there are dimension errors + ! -- terminate if there are dimension errors if (count_errors() > 0) then call this%parser%StoreErrorUnit() end if @@ -854,7 +854,7 @@ subroutine uzf_rp(this) 'BND', this%tsManager, this%iprpak, & 'ROOTACT') ! - ! -- read auxillary variables + ! -- read auxiliary variables do j = 1, this%naux call this%parser%GetStringCaps(text) bndElem => this%uauxvar(j, i) @@ -1891,7 +1891,7 @@ subroutine read_cell_properties(this) type(sparsematrix) :: sparse integer(I4B), dimension(:), allocatable :: nboundchk ! - ! -- allocate space for node counter and initilize + ! -- allocate space for node counter and initialize allocate (rowmaxnnz(this%dis%nodes)) do n = 1, this%dis%nodes rowmaxnnz(n) = 0 diff --git a/src/Model/GroundWaterFlow/gwf-vsc.f90 b/src/Model/GroundWaterFlow/gwf-vsc.f90 index 56af59c0424..a746a56b4c7 100644 --- a/src/Model/GroundWaterFlow/gwf-vsc.f90 +++ b/src/Model/GroundWaterFlow/gwf-vsc.f90 @@ -237,7 +237,7 @@ end subroutine vsc_ar !> @brief Activate viscosity in advanced packages !! - !! Viscosity ar_bnd rountine to activate viscosity in the advanced + !! Viscosity ar_bnd routine to activate viscosity in the advanced !! packages. This routine is called from gwf_ar() as it moves through each !! package !< @@ -519,7 +519,7 @@ subroutine vsc_ad_standard_bnd(packobj, hnew, visc, viscref, locelev, & ! -- Check if boundary cell is active, cycle if not if (packobj%ibound(node) <= 0) cycle ! - ! -- calculate the viscosity associcated with the boundary + ! -- calculate the viscosity associated with the boundary viscbnd = calc_bnd_viscosity(n, locvisc, locconc, viscref, dviscdc, & cviscref, ctemp, ivisc, a2, a3, a4, & packobj%auxvar) @@ -595,7 +595,7 @@ subroutine vsc_ad_sfr(packobj, visc, viscref, elev, locvisc, locconc, & ! ! -- ! - ! -- calculate the viscosity associcated with the boundary + ! -- calculate the viscosity associated with the boundary viscsfr = calc_bnd_viscosity(n, locvisc, locconc, viscref, dviscdc, & cviscref, ctemp, ivisc, a2, a3, a4, & packobj%auxvar) @@ -652,7 +652,7 @@ subroutine vsc_ad_lak(packobj, visc, viscref, elev, locvisc, locconc, & ! ! -- ! - ! -- calculate the viscosity associcated with the boundary + ! -- calculate the viscosity associated with the boundary visclak = calc_bnd_viscosity(n, locvisc, locconc, viscref, dviscdc, & cviscref, ctemp, ivisc, a2, a3, a4, & packobj%auxvar) @@ -709,7 +709,7 @@ subroutine vsc_ad_maw(packobj, visc, viscref, elev, locvisc, locconc, & ! ! -- ! - ! -- calculate the viscosity associcated with the boundary + ! -- calculate the viscosity associated with the boundary viscmaw = calc_bnd_viscosity(n, locvisc, locconc, viscref, dviscdc, & cviscref, ctemp, ivisc, a2, a3, a4, & packobj%auxvar) diff --git a/src/Model/GroundWaterFlow/gwf.f90 b/src/Model/GroundWaterFlow/gwf.f90 index 5b7d6ee90c0..ca9c5219085 100644 --- a/src/Model/GroundWaterFlow/gwf.f90 +++ b/src/Model/GroundWaterFlow/gwf.f90 @@ -911,7 +911,7 @@ subroutine gwf_ot(this) ! Print budget summaries call this%gwf_ot_bdsummary(ibudfl, ipflag) ! - ! -- Timing Output; if any dependendent variables or budgets + ! -- Timing Output; if any dependent variables or budgets ! are printed, then ipflag is set to 1. if (ipflag == 1) call tdis_ot(this%iout) ! diff --git a/src/Model/GroundWaterTransport/gwt-lkt.f90 b/src/Model/GroundWaterTransport/gwt-lkt.f90 index 9e441516268..68b633d4ecc 100644 --- a/src/Model/GroundWaterTransport/gwt-lkt.f90 +++ b/src/Model/GroundWaterTransport/gwt-lkt.f90 @@ -905,7 +905,7 @@ end subroutine lkt_outf_term !> @brief Defined observation types !! - !! Store the observation type supported by the APT package and overide + !! Store the observation type supported by the APT package and override !! BndType%bnd_df_obs !< subroutine lkt_df_obs(this) diff --git a/src/Model/GroundWaterTransport/gwt-mst.f90 b/src/Model/GroundWaterTransport/gwt-mst.f90 index 48842e211b5..bc58193778a 100644 --- a/src/Model/GroundWaterTransport/gwt-mst.f90 +++ b/src/Model/GroundWaterTransport/gwt-mst.f90 @@ -878,7 +878,7 @@ subroutine mst_bd(this, isuppress_output, model_budget) use BudgetModule, only: BudgetType, rate_accumulator ! -- dummy class(GwtMstType) :: this !< GwtMstType object - integer(I4B), intent(in) :: isuppress_output !< flag to supress output + integer(I4B), intent(in) :: isuppress_output !< flag to suppress output type(BudgetType), intent(inout) :: model_budget !< model budget object ! -- local real(DP) :: rin diff --git a/src/Model/GroundWaterTransport/gwt-mwt.f90 b/src/Model/GroundWaterTransport/gwt-mwt.f90 index 1cd782c9917..7ad35dbd8da 100644 --- a/src/Model/GroundWaterTransport/gwt-mwt.f90 +++ b/src/Model/GroundWaterTransport/gwt-mwt.f90 @@ -657,7 +657,7 @@ subroutine mwt_rate_term(this, ientry, n1, n2, rrate, & return end subroutine mwt_rate_term - !> @brief Transport matrix term(s) associcated with a flowing- + !> @brief Transport matrix term(s) associated with a flowing- !! well rate term associated with pumping (or injection) !< subroutine mwt_fwrt_term(this, ientry, n1, n2, rrate, & @@ -750,7 +750,7 @@ end subroutine mwt_frtm_term !> @brief Observations !! - !! Store the observation type supported by the APT package and overide + !! Store the observation type supported by the APT package and override !! BndType%bnd_df_obs !< subroutine mwt_df_obs(this) diff --git a/src/Model/GroundWaterTransport/gwt-sft.f90 b/src/Model/GroundWaterTransport/gwt-sft.f90 index ef36c177631..d6c2ab6cc49 100644 --- a/src/Model/GroundWaterTransport/gwt-sft.f90 +++ b/src/Model/GroundWaterTransport/gwt-sft.f90 @@ -821,7 +821,7 @@ end subroutine sft_outf_term !> @brief Observations !! - !! Store the observation type supported by the APT package and overide + !! Store the observation type supported by the APT package and override !! BndType%bnd_df_obs !< subroutine sft_df_obs(this) diff --git a/src/Model/GroundWaterTransport/gwt.f90 b/src/Model/GroundWaterTransport/gwt.f90 index aef3c247dfc..7e26b2c2530 100644 --- a/src/Model/GroundWaterTransport/gwt.f90 +++ b/src/Model/GroundWaterTransport/gwt.f90 @@ -607,7 +607,7 @@ end subroutine gwt_ot !> @brief Deallocate !! - !! Deallocate memmory at conclusion of model run + !! Deallocate memory at conclusion of model run !< subroutine gwt_da(this) ! -- modules diff --git a/src/Model/ModelUtilities/BoundaryPackage.f90 b/src/Model/ModelUtilities/BoundaryPackage.f90 index 9bda0f770f8..af699bef9ed 100644 --- a/src/Model/ModelUtilities/BoundaryPackage.f90 +++ b/src/Model/ModelUtilities/BoundaryPackage.f90 @@ -42,7 +42,7 @@ module BndModule !> @ brief BndType !! - !! Generic boundary package type. This derived type can be overriden to + !! Generic boundary package type. This derived type can be overridden to !! become concrete boundary package types. !< type, extends(NumericalPackageType) :: BndType @@ -270,7 +270,7 @@ end subroutine bnd_mc !> @ brief Allocate and read method for boundary package !! !! Generic method to allocate and read static data for model boundary - !! packages. A boundary package only needs to overide this method if + !! packages. A boundary package only needs to override this method if !! input data varies from the standard boundary package. !! !< @@ -302,7 +302,7 @@ end subroutine bnd_ar !> @ brief Allocate and read method for package !! !! Generic method to read and prepare period data for model boundary - !! packages. A boundary package only needs to overide this method if + !! packages. A boundary package only needs to override this method if !! period data varies from the standard boundary package. !! !< @@ -403,7 +403,7 @@ end subroutine bnd_rp !! !! Advance data in the boundary package. The method sets advances !! time series, time array series, and observation data. A boundary - !! package only needs to overide this method if additional data + !! package only needs to override this method if additional data !! needs to be advanced. !! !< @@ -479,7 +479,7 @@ end subroutine bnd_cf !! !! Add the hcof and rhs terms for the boundary package to the !! coefficient matrix and right-hand side vector. A boundary - !! package only needs to overide this method if it is different for + !! package only needs to override this method if it is different for !! a specific boundary package. !! !< @@ -511,7 +511,7 @@ end subroutine bnd_fc !! !! Calculate and add the Newton-Raphson terms for the boundary package !! to the coefficient matrix and right-hand side vector. A boundary - !! package only needs to overide this method if a specific boundary + !! package only needs to override this method if a specific boundary !! package needs to add Newton-Raphson terms. !! !< @@ -533,7 +533,7 @@ end subroutine bnd_fn !> @ brief Apply Newton-Raphson under-relaxation for package. !! !! Apply Newton-Raphson under-relaxation for a boundary package. A boundary - !! package only needs to overide this method if a specific boundary + !! package only needs to override this method if a specific boundary !! package needs to apply Newton-Raphson under-relaxation. An example is !! the MAW package which adds rows to the system of equations and may need !! to have the dependent-variable constrained by the bottom of the model. @@ -561,9 +561,9 @@ end subroutine bnd_nur !! !! Perform additional convergence checks on the flow between the package !! and the model it is attached to. This additional convergence check is - !! applied to pacakages that solve their own continuity equation as + !! applied to packages that solve their own continuity equation as !! part of the formulate step at the beginning of a Picard iteration. - !! A boundary package only needs to overide this method if a specific boundary + !! A boundary package only needs to override this method if a specific boundary !! package solves its own continuity equation. Example packages that implement !! this additional convergence check is the CSUB, SFR, LAK, and UZF packages. !! @@ -588,7 +588,7 @@ end subroutine bnd_cc !> @ brief Calculate advanced package flows. !! !! Calculate the flow between connected advanced package control volumes. - !! Only advanced boundary packages need to overide this method. + !! Only advanced boundary packages need to override this method. !! !< subroutine bnd_cq(this, x, flowja, iadv) @@ -1846,7 +1846,7 @@ end subroutine bnd_rp_ts ! -- Procedures related to casting - !> @brief Cast as a boundary tyoe + !> @brief Cast as a boundary type !! !! Subroutine to cast an object as a boundary package type. !! diff --git a/src/Model/ModelUtilities/BoundaryPackageExt.f90 b/src/Model/ModelUtilities/BoundaryPackageExt.f90 index 16d6e7e3975..8cdb69a57a6 100644 --- a/src/Model/ModelUtilities/BoundaryPackageExt.f90 +++ b/src/Model/ModelUtilities/BoundaryPackageExt.f90 @@ -24,7 +24,7 @@ module BndExtModule !> @ brief BndExtType !! !! Generic extended boundary package type. This derived type can be - !! overriden to define concrete boundary package types that source + !! overridden to define concrete boundary package types that source !! all input from the input context. !< type, extends(BndType) :: BndExtType diff --git a/src/Model/ModelUtilities/Disv1dGeom.f90 b/src/Model/ModelUtilities/Disv1dGeom.f90 index aa64167fd76..119a27e149d 100644 --- a/src/Model/ModelUtilities/Disv1dGeom.f90 +++ b/src/Model/ModelUtilities/Disv1dGeom.f90 @@ -7,7 +7,7 @@ module Disv1dGeom contains - !> @brief Calculate distance bewteen two vertices + !> @brief Calculate distance between two vertices !< function calcdist(vertices, ivert1, ivert2) result(dist) ! -- dummy @@ -26,7 +26,7 @@ function calcdist(vertices, ivert1, ivert2) result(dist) return end function calcdist - !> @brief Calculate distance bewteen two vertices + !> @brief Calculate distance between two vertices !! !! Calculate the vector components (xcomp, ycomp, and zcomp) !! for a line defined by two points, (x0, y0, z0), (x1, y1, z1). Also diff --git a/src/Model/ModelUtilities/FlowModelInterface.f90 b/src/Model/ModelUtilities/FlowModelInterface.f90 index f1f2e2cd049..5340291d509 100644 --- a/src/Model/ModelUtilities/FlowModelInterface.f90 +++ b/src/Model/ModelUtilities/FlowModelInterface.f90 @@ -739,7 +739,7 @@ end subroutine finalize_hfr !> @brief Initialize gwf terms from budget file !! - !! initalize terms and figure out how many + !! initialize terms and figure out how many !! different terms and packages are contained within the file !! !< diff --git a/src/Model/ModelUtilities/GweInputData.f90 b/src/Model/ModelUtilities/GweInputData.f90 index fb3493f2888..d831977f1a4 100644 --- a/src/Model/ModelUtilities/GweInputData.f90 +++ b/src/Model/ModelUtilities/GweInputData.f90 @@ -187,7 +187,7 @@ subroutine set_gwe_shared_arrays(this, gwerhos, gwecps) return end subroutine set_gwe_shared_arrays - !> @ breif Deallocate memory + !> @ brief Deallocate memory !! !! Deallocate GWE shared data array memory !< diff --git a/src/Model/ModelUtilities/GwtSpc.f90 b/src/Model/ModelUtilities/GwtSpc.f90 index 0b0677afc91..2ca7bc3606d 100644 --- a/src/Model/ModelUtilities/GwtSpc.f90 +++ b/src/Model/ModelUtilities/GwtSpc.f90 @@ -554,7 +554,7 @@ subroutine spc_rp_array(this, line) logical :: convertFlux ! ! -- these time array series pointers need to be non-contiguous - ! beacuse a slice of bound is passed + ! because a slice of bound is passed real(DP), dimension(:), pointer :: bndArrayPtr => null() ! -- formats ! -- data diff --git a/src/Model/ModelUtilities/Mover.f90 b/src/Model/ModelUtilities/Mover.f90 index 1e560c036ad..becca3a79b2 100644 --- a/src/Model/ModelUtilities/Mover.f90 +++ b/src/Model/ModelUtilities/Mover.f90 @@ -97,7 +97,7 @@ subroutine prepare(this, inunit, pckMemPaths, pakmovers) ! -- modules use SimModule, only: store_error, store_error_unit, count_errors ! -- dummy - class(MvrType) :: this !< MvrType objec + class(MvrType) :: this !< MvrType object integer(I4B), intent(in) :: inunit !< input file unit number character(len=LENMEMPATH), & dimension(:), pointer, contiguous :: pckMemPaths !< array of strings diff --git a/src/Model/ModelUtilities/SfrCrossSectionManager.f90 b/src/Model/ModelUtilities/SfrCrossSectionManager.f90 index bee9e5fab66..f65d2a8f78e 100644 --- a/src/Model/ModelUtilities/SfrCrossSectionManager.f90 +++ b/src/Model/ModelUtilities/SfrCrossSectionManager.f90 @@ -82,7 +82,7 @@ end subroutine cross_section_cr !> @brief Initialize a cross-section object !! - !! Subroutine to inititialize the cross-section object with the current + !! Subroutine to initialize the cross-section object with the current !! data. !! !< diff --git a/src/Model/ModelUtilities/SfrCrossSectionUtils.f90 b/src/Model/ModelUtilities/SfrCrossSectionUtils.f90 index e5e9d0aba66..de86630298f 100644 --- a/src/Model/ModelUtilities/SfrCrossSectionUtils.f90 +++ b/src/Model/ModelUtilities/SfrCrossSectionUtils.f90 @@ -67,7 +67,7 @@ function get_wetted_topwidth(npts, stations, heights, d) result(w) real(DP) :: w real(DP), dimension(npts - 1) :: widths ! - ! -- intitialize the wetted perimeter for the reach + ! -- initialize the wetted perimeter for the reach w = DZERO ! ! -- calculate the wetted top width for each line segment @@ -135,7 +135,7 @@ function get_wetted_perimeter(npts, stations, heights, d) result(p) real(DP) :: p real(DP), dimension(npts - 1) :: perimeters ! - ! -- intitialize the wetted perimeter for the reach + ! -- initialize the wetted perimeter for the reach p = DZERO ! ! -- calculate the wetted perimeter for each line segment @@ -168,7 +168,7 @@ function get_cross_section_area(npts, stations, heights, d) result(a) real(DP) :: a real(DP), dimension(npts - 1) :: areas ! - ! -- intitialize the area + ! -- initialize the area a = DZERO ! ! -- calculate the cross-sectional area for each line segment @@ -204,7 +204,7 @@ function get_hydraulic_radius(npts, stations, heights, d) result(r) real(DP), dimension(npts - 1) :: areas real(DP), dimension(npts - 1) :: perimeters ! - ! -- intitialize the hydraulic radius, perimeter, and area + ! -- initialize the hydraulic radius, perimeter, and area r = DZERO p = DZERO a = DZERO @@ -265,7 +265,7 @@ function get_mannings_section(npts, stations, heights, roughfracs, & real(DP), dimension(npts - 1) :: areas real(DP), dimension(npts - 1) :: perimeters ! - ! -- intitialize the hydraulic radius, perimeter, and area + ! -- initialize the hydraulic radius, perimeter, and area q = DZERO rh = DZERO r = DZERO diff --git a/src/Model/ModelUtilities/SwfCxsUtils.f90 b/src/Model/ModelUtilities/SwfCxsUtils.f90 index 00061a73690..4b95284f97c 100644 --- a/src/Model/ModelUtilities/SwfCxsUtils.f90 +++ b/src/Model/ModelUtilities/SwfCxsUtils.f90 @@ -40,7 +40,7 @@ function calc_depth_from_q(qrch, width, rough, slope, & ! -- dummy variables real(DP), intent(in) :: qrch !< streamflow real(DP), intent(in) :: width !< reach width - real(DP), intent(in) :: rough !< mannings reach roughness coefficent + real(DP), intent(in) :: rough !< mannings reach roughness coefficient real(DP), intent(in) :: slope !< reach bottom slope real(DP), dimension(:), intent(in) :: cxs_xf ! xfraction distances for this cross section real(DP), dimension(:), intent(in) :: cxs_h ! heights for this cross section @@ -81,7 +81,7 @@ function calc_depth_from_q_bisect(qrch, width, rough, slope, & !integer(I4B), intent(in) :: n !< reach number real(DP), intent(in) :: qrch !< streamflow real(DP), intent(in) :: width !< reach width - real(DP), intent(in) :: rough !< mannings reach roughness coefficent + real(DP), intent(in) :: rough !< mannings reach roughness coefficient real(DP), intent(in) :: slope !< reach bottom slope real(DP), dimension(:), intent(in) :: cxs_xf ! xfraction distances for this cross section real(DP), dimension(:), intent(in) :: cxs_h ! heights for this cross section @@ -148,7 +148,7 @@ function calc_depth_from_q_nr(qrch, width, rough, slope, & !integer(I4B), intent(in) :: n !< reach number real(DP), intent(in) :: qrch !< streamflow real(DP), intent(in) :: width !< reach width - real(DP), intent(in) :: rough !< mannings reach roughness coefficent + real(DP), intent(in) :: rough !< mannings reach roughness coefficient real(DP), intent(in) :: slope !< reach bottom slope real(DP), dimension(:), intent(in) :: cxs_xf ! xfraction distances for this cross section real(DP), dimension(:), intent(in) :: cxs_h ! heights for this cross section @@ -221,7 +221,7 @@ function calc_qman(depth, width, rough, slope, & ! -- dummy variables real(DP), intent(in) :: depth !< reach depth real(DP), intent(in) :: width !< reach width - real(DP), intent(in) :: rough !< mannings reach roughness coefficent + real(DP), intent(in) :: rough !< mannings reach roughness coefficient real(DP), intent(in) :: slope !< reach bottom slope real(DP), dimension(:), intent(in) :: cxs_xf ! xfraction distances for this cross section real(DP), dimension(:), intent(in) :: cxs_h ! heights for this cross section @@ -262,7 +262,7 @@ function calc_qman_composite(depth, width, rough, slope, & ! -- dummy variables real(DP), intent(in) :: depth !< reach depth real(DP), intent(in) :: width !< reach width - real(DP), intent(in) :: rough !< mannings reach roughness coefficent + real(DP), intent(in) :: rough !< mannings reach roughness coefficient real(DP), intent(in) :: slope !< reach bottom slope real(DP), dimension(:), intent(in) :: cxs_xf ! xfraction distances for this cross section real(DP), dimension(:), intent(in) :: cxs_h ! heights for this cross section @@ -316,7 +316,7 @@ function calc_composite_roughness(npts, depth, width, rough, slope, & integer(I4B), intent(in) :: npts real(DP), intent(in) :: depth !< reach depth real(DP), intent(in) :: width !< reach width - real(DP), intent(in) :: rough !< mannings reach roughness coefficent + real(DP), intent(in) :: rough !< mannings reach roughness coefficient real(DP), intent(in) :: slope !< reach bottom slope real(DP), dimension(:), intent(in) :: cxs_xf ! xfraction distances for this cross section real(DP), dimension(:), intent(in) :: cxs_h ! heights for this cross section @@ -382,7 +382,7 @@ function calc_qman_by_section(depth, width, rough, slope, & ! -- dummy variables real(DP), intent(in) :: depth !< reach depth real(DP), intent(in) :: width !< reach width - real(DP), intent(in) :: rough !< mannings reach roughness coefficent + real(DP), intent(in) :: rough !< mannings reach roughness coefficient real(DP), intent(in) :: slope !< reach bottom slope real(DP), dimension(:), intent(in) :: cxs_xf ! xfraction distances for this cross section real(DP), dimension(:), intent(in) :: cxs_h ! heights for this cross section @@ -496,7 +496,7 @@ function get_wetted_topwidth(npts, xfraction, heights, width, d) result(w) stations(n) = xfraction(n) * width end do ! - ! -- intitialize the wetted perimeter for the reach + ! -- initialize the wetted perimeter for the reach w = DZERO ! ! -- calculate the wetted top width for each line segment @@ -536,7 +536,7 @@ function get_wetted_perimeter(npts, xfraction, heights, width, d) result(p) stations(n) = xfraction(n) * width end do ! - ! -- intitialize the wetted perimeter for the reach + ! -- initialize the wetted perimeter for the reach p = DZERO ! ! -- calculate the wetted perimeter for each line segment @@ -576,7 +576,7 @@ function get_cross_section_area(npts, xfraction, heights, width, d) result(a) stations(n) = xfraction(n) * width end do ! - ! -- intitialize the area + ! -- initialize the area a = DZERO ! ! -- calculate the cross-sectional area for each line segment @@ -764,7 +764,7 @@ function get_hydraulic_radius(npts, stations, heights, d) result(r) real(DP), dimension(npts - 1) :: areas real(DP), dimension(npts - 1) :: perimeters ! - ! -- intitialize the hydraulic radius, perimeter, and area + ! -- initialize the hydraulic radius, perimeter, and area r = DZERO p = DZERO a = DZERO @@ -860,7 +860,7 @@ function get_mannings_section(npts, xfraction, heights, roughfracs, & real(DP), dimension(npts - 1) :: areas real(DP), dimension(npts - 1) :: perimeters ! - ! -- intitialize the hydraulic radius, perimeter, and area + ! -- initialize the hydraulic radius, perimeter, and area q = DZERO rh = DZERO r = DZERO diff --git a/src/Model/ParticleTracking/prt.f90 b/src/Model/ParticleTracking/prt.f90 index 9dc4c1f1aee..29f637115c0 100644 --- a/src/Model/ParticleTracking/prt.f90 +++ b/src/Model/ParticleTracking/prt.f90 @@ -539,7 +539,7 @@ subroutine prt_ot(this) ! -- Print budget summaries call this%prt_ot_bdsummary(ibudfl, ipflag) - ! -- Timing Output; if any dependendent variables or budgets + ! -- Timing Output; if any dependent variables or budgets ! are printed, then ipflag is set to 1. if (ipflag == 1) call tdis_ot(this%iout) end subroutine prt_ot diff --git a/src/Model/SurfaceWaterFlow/swf-dfw.f90 b/src/Model/SurfaceWaterFlow/swf-dfw.f90 index 969e6b00068..680295e1adf 100644 --- a/src/Model/SurfaceWaterFlow/swf-dfw.f90 +++ b/src/Model/SurfaceWaterFlow/swf-dfw.f90 @@ -811,7 +811,7 @@ function get_cond(this, n, m, ipos, stage_n, stage_m, cln, clm) result(cond) cm = this%get_cond_n(m, depth_m, clm, width_m, dhds_m) ! -- Use harmonic mean to calculated weighted - ! conductance bewteen the centers of reaches + ! conductance between the centers of reaches ! n and m if ((cn + cm) > DPREC) then cond = cn * cm / (cn + cm) diff --git a/src/Model/SurfaceWaterFlow/swf-flw.f90 b/src/Model/SurfaceWaterFlow/swf-flw.f90 index c3da6ef2e83..e3b9a718582 100644 --- a/src/Model/SurfaceWaterFlow/swf-flw.f90 +++ b/src/Model/SurfaceWaterFlow/swf-flw.f90 @@ -1,7 +1,7 @@ !> @brief This module contains the FLW package methods !! !! This module can be used to represent inflow to streams. It is -!! designed similiarly to the GWF WEL package. +!! designed similarly to the GWF WEL package. !! !< module SwfFlwModule diff --git a/src/Model/SurfaceWaterFlow/swf.f90 b/src/Model/SurfaceWaterFlow/swf.f90 index d01a3d02bfc..3cc58488991 100644 --- a/src/Model/SurfaceWaterFlow/swf.f90 +++ b/src/Model/SurfaceWaterFlow/swf.f90 @@ -760,7 +760,7 @@ subroutine swf_ot(this) ! Print budget summaries call this%swf_ot_bdsummary(ibudfl, ipflag) ! - ! -- Timing Output; if any dependendent variables or budgets + ! -- Timing Output; if any dependent variables or budgets ! are printed, then ipflag is set to 1. if (ipflag == 1) call tdis_ot(this%iout) ! diff --git a/src/Model/TransportModel/tsp-adv.f90 b/src/Model/TransportModel/tsp-adv.f90 index f08d61351ca..139791037a6 100644 --- a/src/Model/TransportModel/tsp-adv.f90 +++ b/src/Model/TransportModel/tsp-adv.f90 @@ -224,7 +224,7 @@ function advqtvd(this, n, m, iposnm, cnew) result(qtvd) real(DP) :: qnm, qmax, qupj, elupdn, elup2up real(DP) :: smooth, cdiff, alimiter ! - ! -- intialize + ! -- initialize qtvd = DZERO ! ! -- Find upstream node diff --git a/src/Model/TransportModel/tsp-fmi.f90 b/src/Model/TransportModel/tsp-fmi.f90 index 3a282bc501d..e303f412cd8 100644 --- a/src/Model/TransportModel/tsp-fmi.f90 +++ b/src/Model/TransportModel/tsp-fmi.f90 @@ -69,7 +69,7 @@ module TspFmiModule contains - !> @breif Create a new FMI object + !> @brief Create a new FMI object !< subroutine fmi_cr(fmiobj, name_model, inunit, iout, eqnsclfac, depvartype) ! -- dummy @@ -773,7 +773,7 @@ end subroutine set_aptbudobj_pointer !> @brief Initialize the groundwater flow terms based on the budget file !! reader !! - !! Initalize terms and figure out how many different terms and packages + !! Initialize terms and figure out how many different terms and packages !! are contained within the file !< subroutine initialize_gwfterms_from_bfr(this) diff --git a/src/Model/TransportModel/tsp-mvt.f90 b/src/Model/TransportModel/tsp-mvt.f90 index 8a52a1b50c2..17108e4f29a 100644 --- a/src/Model/TransportModel/tsp-mvt.f90 +++ b/src/Model/TransportModel/tsp-mvt.f90 @@ -216,7 +216,7 @@ end subroutine mvt_rp !> @brief Calculate coefficients and fill amat and rhs !! !! The mvt package adds the mass flow rate to the provider qmfrommvr array. - !! The advanced packages know enough to subract any mass that is leaving, so + !! The advanced packages know enough to subtract any mass that is leaving, so !! the mvt just adds mass coming in from elsewhere. Because the movers !! change by stress period, their solute effects must be added to the right- !! hand side of the transport matrix equations. @@ -281,7 +281,7 @@ subroutine mvt_fc(this, cnew1, cnew2) if (fmi_pr%iatp(ipr) /= 0) then ! ! -- Provider package is being represented by an APT (SFT, LKT, MWT, UZT) - ! so set the concentration to the simulated concentation of APT + ! so set the concentration to the simulated concentration of APT cp = concpak(id1) else ! diff --git a/src/Model/TransportModel/tsp-ssm.f90 b/src/Model/TransportModel/tsp-ssm.f90 index d190a7fdc92..2880901a302 100644 --- a/src/Model/TransportModel/tsp-ssm.f90 +++ b/src/Model/TransportModel/tsp-ssm.f90 @@ -237,7 +237,7 @@ subroutine ssm_ad(this) integer(I4B) :: node ! ------------------------------------------------------------------------------ ! - ! -- Calculate total number of exising flow boundaries. It is possible + ! -- Calculate total number of existing flow boundaries. It is possible ! that a node may equal zero. In this case, the bound should be ! skipped and not written to ssm output. this%nbound = 0 @@ -309,7 +309,7 @@ subroutine ssm_term(this, ipackage, ientry, rrate, rhsval, hcofval, & qbnd = this%fmi%gwfpackages(ipackage)%get_flow(ientry) call this%get_ssm_conc(ipackage, ientry, nbound_flow, ctmp, lauxmixed) ! - ! -- assign values for hcoftmp, rhstmp, and ctmp for subsequent assigment + ! -- assign values for hcoftmp, rhstmp, and ctmp for subsequent assignment ! of hcof, rhs, and rate if (.not. lauxmixed) then ! @@ -452,7 +452,7 @@ end subroutine ssm_fc !> @ brief Calculate flow !! - !! Calulate the resulting mass flow between the boundary and the connected + !! Calculate the resulting mass flow between the boundary and the connected !! GWT model cell. Update the diagonal position of the flowja array so that !! it ultimately contains the solute balance residual. !< diff --git a/src/Model/TransportModel/tsp.f90 b/src/Model/TransportModel/tsp.f90 index a3eb1f70589..e40f3abc0ba 100644 --- a/src/Model/TransportModel/tsp.f90 +++ b/src/Model/TransportModel/tsp.f90 @@ -351,7 +351,7 @@ subroutine tsp_ot(this, inmst) ! -- Print budget summaries call this%tsp_ot_bdsummary(ibudfl, ipflag) ! - ! -- Timing Output; if any dependendent variables or budgets + ! -- Timing Output; if any dependent variables or budgets ! are printed, then ipflag is set to 1. if (ipflag == 1) call tdis_ot(this%iout) ! @@ -609,7 +609,7 @@ end subroutine set_tsp_labels !> @brief Deallocate memory !! - !! Deallocate memmory at conclusion of model run + !! Deallocate memory at conclusion of model run !< subroutine tsp_da(this) ! -- modules diff --git a/src/RunControl.f90 b/src/RunControl.f90 index 6872f119da0..a07b1c5dc19 100644 --- a/src/RunControl.f90 +++ b/src/RunControl.f90 @@ -136,7 +136,7 @@ subroutine before_con_df_handler(this) end subroutine before_con_df_handler - !> @brief Actions after definining connections + !> @brief Actions after defining connections !< subroutine after_con_df_handler(this) class(RunControlType) :: this diff --git a/src/Solution/LinearMethods/ImsLinear.f90 b/src/Solution/LinearMethods/ImsLinear.f90 index 9929fcbf61b..d2260b0c31c 100644 --- a/src/Solution/LinearMethods/ImsLinear.f90 +++ b/src/Solution/LinearMethods/ImsLinear.f90 @@ -455,7 +455,7 @@ end subroutine imslinear_summary !> @ brief Allocate and initialize scalars !! - !! Allocate and inititialize linear accelerator scalars + !! Allocate and initialize linear accelerator scalars !! !< subroutine allocate_scalars(this) diff --git a/src/Solution/LinearMethods/ImsLinearBase.f90 b/src/Solution/LinearMethods/ImsLinearBase.f90 index dffaa66d3d2..2b001ef02c7 100644 --- a/src/Solution/LinearMethods/ImsLinearBase.f90 +++ b/src/Solution/LinearMethods/ImsLinearBase.f90 @@ -563,7 +563,7 @@ SUBROUTINE ims_base_calc_order(IORD, NEQ, NJA, IA, JA, LORDER, IORDER) ! -- modules use SimModule, only: store_error, count_errors ! -- dummy variables - integer(I4B), INTENT(IN) :: IORD !< reordering optionn + integer(I4B), INTENT(IN) :: IORD !< reordering option integer(I4B), INTENT(IN) :: NEQ !< number of rows integer(I4B), INTENT(IN) :: NJA !< number of non-zero entries integer(I4B), DIMENSION(NEQ + 1), INTENT(IN) :: IA !< row pointer @@ -609,7 +609,7 @@ SUBROUTINE ims_base_calc_order(IORD, NEQ, NJA, IA, JA, LORDER, IORDER) IORDER(LORDER(n)) = n END DO ! - ! -- terminate if errors occured + ! -- terminate if errors occurred if (count_errors() > 0) then call parser%StoreErrorUnit() end if @@ -790,7 +790,7 @@ SUBROUTINE ims_base_pcu(IOUT, NJA, NEQ, NIAPC, NJAPC, IPC, RELAX, & integer(I4B), DIMENSION(NIAPC + 1), INTENT(INOUT) :: IAPC !< preconditioner CRS row pointers integer(I4B), DIMENSION(NJAPC), INTENT(INOUT) :: JAPC !< preconditioner CRS column pointers integer(I4B), DIMENSION(NIAPC), INTENT(INOUT) :: IW !< preconditioner integed work vector - real(DP), DIMENSION(NIAPC), INTENT(INOUT) :: W !< preconditioner work verctor + real(DP), DIMENSION(NIAPC), INTENT(INOUT) :: W !< preconditioner work vector ! -- ILUT dummy variables integer(I4B), INTENT(IN) :: LEVEL !< number of levels of fill for ILUT and MILUT real(DP), INTENT(IN) :: DROPTOL !< drop tolerance @@ -1137,7 +1137,7 @@ SUBROUTINE ims_base_testcnvg(Icnvgopt, Icnvg, Iiter, & real(DP), INTENT(IN) :: Rmax0 !< initial flow change (initial L2-norm) real(DP), INTENT(IN) :: Epfact !< factor for reducing convergence criteria in subsequent Picard iterations real(DP), INTENT(IN) :: Dvclose !< Maximum depenendent-variable change allowed - real(DP), INTENT(IN) :: Rclose !< Maximum flow change alowed + real(DP), INTENT(IN) :: Rclose !< Maximum flow change allowed ! -- code IF (Icnvgopt == 0) THEN IF (ABS(Dvmax) <= Dvclose .AND. ABS(Rmax) <= Rclose) THEN @@ -1300,7 +1300,7 @@ END SUBROUTINE ims_base_pccrs !< SUBROUTINE ims_base_isort(NVAL, IARRAY) ! -- dummy variables - integer(I4B), INTENT(IN) :: NVAL !< length of the interger array + integer(I4B), INTENT(IN) :: NVAL !< length of the integer array integer(I4B), DIMENSION(NVAL), INTENT(INOUT) :: IARRAY !< integer array to be sorted ! -- local variables integer(I4B) :: i, j, itemp diff --git a/src/Solution/NumericalSolution.f90 b/src/Solution/NumericalSolution.f90 index ae8a1ce6452..f27c938fa09 100644 --- a/src/Solution/NumericalSolution.f90 +++ b/src/Solution/NumericalSolution.f90 @@ -1876,7 +1876,7 @@ subroutine finalizeSolve(this, kiter, isgcnvg, isuppress_output) this%itertot_timestep) end if ! - ! -- set solution goup convergence flag + ! -- set solution group convergence flag if (this%icnvg == 0) isgcnvg = 0 ! ! -- Calculate flow for each model @@ -2753,7 +2753,7 @@ end subroutine sln_backtracking !> @ brief Backtracking update of the dependent variable !! !! Backtracking update of the dependent variable if the calculated backtracking - !! update exceeds the dependent variable closure critera. + !! update exceeds the dependent variable closure criteria. !! !< subroutine sln_backtracking_xupdate(this, btflag) @@ -2796,7 +2796,7 @@ end subroutine sln_backtracking_xupdate !! active cells using !! !! A = the linear system matrix - !! x = the dependendent variable vector + !! x = the dependent variable vector !! b = the right-hand side vector !! !! r = A * x - b @@ -3153,7 +3153,7 @@ function sln_package_convergence(this, dpak, cpakout, iend) result(ivalue) end function sln_package_convergence - !> @brief Syncronize Newton Under-relaxation flag + !> @brief Synchronize Newton Under-relaxation flag !< function sln_sync_newtonur_flag(this, inewtonur) result(ivalue) ! dummy diff --git a/src/Utilities/ArrayRead/ArrayReaderBase.f90 b/src/Utilities/ArrayRead/ArrayReaderBase.f90 index e387178f087..fbac684d7ac 100644 --- a/src/Utilities/ArrayRead/ArrayReaderBase.f90 +++ b/src/Utilities/ArrayRead/ArrayReaderBase.f90 @@ -29,14 +29,14 @@ module ArrayReaderBaseModule procedure :: read_array procedure :: reset_reader procedure :: read_control_record - procedure :: set_constant ! must be overriden - procedure :: fill_constant ! must be overriden + procedure :: set_constant ! must be overridden + procedure :: fill_constant ! must be overridden procedure :: fill_internal procedure :: fill_open_close - procedure :: read_ascii ! must be overriden - procedure :: read_binary ! must be overriden - procedure :: set_factor ! must be overriden - procedure :: apply_factor ! must be overriden + procedure :: read_ascii ! must be overridden + procedure :: read_binary ! must be overridden + procedure :: set_factor ! must be overridden + procedure :: apply_factor ! must be overridden procedure :: open_file end type ArrayReaderBaseType diff --git a/src/Utilities/ArrayRead/Double1dReader.f90 b/src/Utilities/ArrayRead/Double1dReader.f90 index a34202a5d5a..2ff844231d5 100644 --- a/src/Utilities/ArrayRead/Double1dReader.f90 +++ b/src/Utilities/ArrayRead/Double1dReader.f90 @@ -21,12 +21,12 @@ module Double1dReaderModule contains procedure :: reset_reader - procedure :: set_constant ! must be overriden - procedure :: fill_constant ! must be overriden - procedure :: read_ascii ! must be overriden - procedure :: read_binary ! must be overriden - procedure :: set_factor ! must be overriden - procedure :: apply_factor ! must be overriden + procedure :: set_constant ! must be overridden + procedure :: fill_constant ! must be overridden + procedure :: read_ascii ! must be overridden + procedure :: read_binary ! must be overridden + procedure :: set_factor ! must be overridden + procedure :: apply_factor ! must be overridden end type Double1dReaderType diff --git a/src/Utilities/ArrayRead/Double2dReader.f90 b/src/Utilities/ArrayRead/Double2dReader.f90 index 0df3d7bce15..4d35998fefd 100644 --- a/src/Utilities/ArrayRead/Double2dReader.f90 +++ b/src/Utilities/ArrayRead/Double2dReader.f90 @@ -21,12 +21,12 @@ module Double2dReaderModule contains procedure :: reset_reader - procedure :: set_constant ! must be overriden - procedure :: fill_constant ! must be overriden - procedure :: read_ascii ! must be overriden - procedure :: read_binary ! must be overriden - procedure :: set_factor ! must be overriden - procedure :: apply_factor ! must be overriden + procedure :: set_constant ! must be overridden + procedure :: fill_constant ! must be overridden + procedure :: read_ascii ! must be overridden + procedure :: read_binary ! must be overridden + procedure :: set_factor ! must be overridden + procedure :: apply_factor ! must be overridden end type Double2dReaderType diff --git a/src/Utilities/ArrayRead/Integer1dReader.f90 b/src/Utilities/ArrayRead/Integer1dReader.f90 index 60b279e9fee..2b3d1aa0809 100644 --- a/src/Utilities/ArrayRead/Integer1dReader.f90 +++ b/src/Utilities/ArrayRead/Integer1dReader.f90 @@ -20,12 +20,12 @@ module Integer1dReaderModule contains procedure :: reset_reader - procedure :: set_constant ! must be overriden - procedure :: fill_constant ! must be overriden - procedure :: read_ascii ! must be overriden - procedure :: read_binary ! must be overriden - procedure :: set_factor ! must be overriden - procedure :: apply_factor ! must be overriden + procedure :: set_constant ! must be overridden + procedure :: fill_constant ! must be overridden + procedure :: read_ascii ! must be overridden + procedure :: read_binary ! must be overridden + procedure :: set_factor ! must be overridden + procedure :: apply_factor ! must be overridden end type Integer1dReaderType diff --git a/src/Utilities/ArrayRead/Integer2dReader.f90 b/src/Utilities/ArrayRead/Integer2dReader.f90 index 2fe4364d359..ef7859b4580 100644 --- a/src/Utilities/ArrayRead/Integer2dReader.f90 +++ b/src/Utilities/ArrayRead/Integer2dReader.f90 @@ -21,12 +21,12 @@ module Integer2dReaderModule contains procedure :: reset_reader - procedure :: set_constant ! must be overriden - procedure :: fill_constant ! must be overriden - procedure :: read_ascii ! must be overriden - procedure :: read_binary ! must be overriden - procedure :: set_factor ! must be overriden - procedure :: apply_factor ! must be overriden + procedure :: set_constant ! must be overridden + procedure :: fill_constant ! must be overridden + procedure :: read_ascii ! must be overridden + procedure :: read_binary ! must be overridden + procedure :: set_factor ! must be overridden + procedure :: apply_factor ! must be overridden end type Integer2dReaderType diff --git a/src/Utilities/BlockParser.f90 b/src/Utilities/BlockParser.f90 index d808748f036..87e151ff771 100644 --- a/src/Utilities/BlockParser.f90 +++ b/src/Utilities/BlockParser.f90 @@ -550,7 +550,7 @@ subroutine StoreErrorUnit(this, terminate) ! -- dummy variable class(BlockParserType), intent(inout) :: this !< BlockParserType object logical, intent(in), optional :: terminate !< boolean indicating if the simulation should be terminated - ! -- loacl variables + ! -- local variables logical :: lterminate ! ! -- process optional variables diff --git a/src/Utilities/BudgetObject.f90 b/src/Utilities/BudgetObject.f90 index 8c53869660f..0e60fd605a6 100644 --- a/src/Utilities/BudgetObject.f90 +++ b/src/Utilities/BudgetObject.f90 @@ -513,7 +513,7 @@ subroutine save_flows(this, dis, ibinun, kstp, kper, delt, & return end subroutine save_flows - !> @brief Read froms from a binary file into this BudgetObjectType + !> @brief Read from a binary file into this BudgetObjectType !< subroutine read_flows(this, dis, ibinun) ! -- dummy diff --git a/src/Utilities/CharString.f90 b/src/Utilities/CharString.f90 index 90cefa46cf6..c5da41c87ce 100644 --- a/src/Utilities/CharString.f90 +++ b/src/Utilities/CharString.f90 @@ -12,7 +12,7 @@ module CharacterStringModule !! !! The overloaded methods allow instances to behave like !! a regular string and work with intrinsic Fortran - !! character strings. Ideas for the implmentation were + !! character strings. Ideas for the implementation were !! inspired by: !! https://gitlab.com/everythingfunctional/iso_varying_string ! diff --git a/src/Utilities/GeomUtil.f90 b/src/Utilities/GeomUtil.f90 index 9fdd947e99f..e15343d5507 100644 --- a/src/Utilities/GeomUtil.f90 +++ b/src/Utilities/GeomUtil.f90 @@ -300,7 +300,7 @@ subroutine compose(xorigin, yorigin, zorigin, & if (lrotate) then ! -- Calculate modified rotation matrix (represented by sinrot ! -- and cosrot) as R_add^T R, where R and R_add^T are the existing - ! -- rotation matirx and the transpose of the additional rotation + ! -- rotation matrix and the transpose of the additional rotation ! -- matrix, respectively sinrot = cosrot_add * s0 - sinrot_add * c0 cosrot = cosrot_add * c0 + sinrot_add * s0 diff --git a/src/Utilities/Idm/InputDefinition.f90 b/src/Utilities/Idm/InputDefinition.f90 index 63197b415dc..e02d22b1a54 100644 --- a/src/Utilities/Idm/InputDefinition.f90 +++ b/src/Utilities/Idm/InputDefinition.f90 @@ -1,7 +1,7 @@ !> @brief This module contains the InputDefinitionModule !! !! This module contains type definitions that represent -!! descriptions of input from modflow 6 defintion files. +!! descriptions of input from modflow 6 definition files. !! !< module InputDefinitionModule @@ -14,7 +14,7 @@ module InputDefinitionModule public :: InputParamDefinitionType, & InputBlockDefinitionType - !> @brief Input paramater definition type + !> @brief Input parameter definition type !! !! This type is used to store information for !! each modflow input record diff --git a/src/Utilities/Idm/ModelPackageInputs.f90 b/src/Utilities/Idm/ModelPackageInputs.f90 index 9e57f8910d0..cda83dd286a 100644 --- a/src/Utilities/Idm/ModelPackageInputs.f90 +++ b/src/Utilities/Idm/ModelPackageInputs.f90 @@ -22,7 +22,7 @@ module ModelPackageInputsModule !> @brief derived type for loadable package type !! !! This derived type is used to store package instance - !! desriptions for a supported package type. + !! descriptions for a supported package type. !! !< type :: LoadablePackageType diff --git a/src/Utilities/Idm/SourceCommon.f90 b/src/Utilities/Idm/SourceCommon.f90 index a61419dd137..e5e31b109b9 100644 --- a/src/Utilities/Idm/SourceCommon.f90 +++ b/src/Utilities/Idm/SourceCommon.f90 @@ -56,7 +56,7 @@ end function package_source_type !! !! Return the component type typically derived from package file type, !! i.e. return GWF when input is GWF6. This function checks the - !! resultant commponent type and throws a terminating error if not + !! resultant component type and throws a terminating error if not !! supported by IDM in some capacity. !! !< @@ -135,8 +135,8 @@ end function idm_subcomponent_type !> @brief model package subcomponent name !! - !! Return the IDM component name, which is the pacage type for - !! base packages and the package name for mutli package (i.e. + !! Return the IDM component name, which is the package type for + !! base packages and the package name for multi package (i.e. !! stress) types. !! !< diff --git a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 index 429ace441ba..357e4cfdcac 100644 --- a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 +++ b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 @@ -832,7 +832,7 @@ subroutine load_integer2d_type(parser, idt, memoryPath, mshape, export, iout) integer(I4B), dimension(:), allocatable :: layer_shape character(len=LINELENGTH) :: keyword - ! determine the array shape from the input data defintion (idt%shape), + ! determine the array shape from the input data definition (idt%shape), ! which looks like "NCOL, NROW, NLAY" call get_shape_from_string(idt%shape, array_shape, memoryPath) nsize1 = array_shape(1) @@ -884,7 +884,7 @@ subroutine load_integer3d_type(parser, idt, memoryPath, mshape, export, iout) character(len=LINELENGTH) :: keyword integer(I4B), dimension(:), pointer, contiguous :: int1d_ptr - ! determine the array shape from the input data defintion (idt%shape), + ! determine the array shape from the input data definition (idt%shape), ! which looks like "NCOL, NROW, NLAY" call get_shape_from_string(idt%shape, array_shape, memoryPath) nsize1 = array_shape(1) @@ -1007,7 +1007,7 @@ subroutine load_double2d_type(parser, idt, memoryPath, mshape, export, iout) integer(I4B), dimension(:), allocatable :: layer_shape character(len=LINELENGTH) :: keyword - ! determine the array shape from the input data defintion (idt%shape), + ! determine the array shape from the input data definition (idt%shape), ! which looks like "NCOL, NROW, NLAY" call get_shape_from_string(idt%shape, array_shape, memoryPath) nsize1 = array_shape(1) @@ -1059,7 +1059,7 @@ subroutine load_double3d_type(parser, idt, memoryPath, mshape, export, iout) character(len=LINELENGTH) :: keyword real(DP), dimension(:), pointer, contiguous :: dbl1d_ptr - ! determine the array shape from the input data defintion (idt%shape), + ! determine the array shape from the input data definition (idt%shape), ! which looks like "NCOL, NROW, NLAY" call get_shape_from_string(idt%shape, array_shape, memoryPath) nsize1 = array_shape(1) diff --git a/src/Utilities/Idm/mf6blockfile/Mf6FileGridInput.f90 b/src/Utilities/Idm/mf6blockfile/Mf6FileGridInput.f90 index 947bab0ef22..962bf12f925 100644 --- a/src/Utilities/Idm/mf6blockfile/Mf6FileGridInput.f90 +++ b/src/Utilities/Idm/mf6blockfile/Mf6FileGridInput.f90 @@ -426,7 +426,7 @@ subroutine bndgrid_tas_links_create(this, inunit) integer(I4B), intent(in) :: inunit ! -- local type(InputParamDefinitionType), pointer :: idt - ! -- non-contiguous beacuse a slice of bound is passed + ! -- non-contiguous because a slice of bound is passed real(DP), dimension(:), pointer :: auxArrayPtr, bndArrayPtr real(DP), dimension(:), pointer, contiguous :: bound integer(I4B), dimension(:), pointer, contiguous :: nodelist diff --git a/src/Utilities/Libraries/rcm/rcm.f90 b/src/Utilities/Libraries/rcm/rcm.f90 index 8bede360cb3..ef7ebc88816 100644 --- a/src/Utilities/Libraries/rcm/rcm.f90 +++ b/src/Utilities/Libraries/rcm/rcm.f90 @@ -3847,7 +3847,7 @@ subroutine triangulation_order3_adj_count ( node_num, triangle_num, & ! in the sample grid. On the left, we list the node, and its neighbors, ! with an asterisk to indicate the adjacency of the node to itself ! (in some cases, you want to count this self adjacency and in some - ! you don't). On the right, we list the number of adjancencies to + ! you don't). On the right, we list the number of adjacencies to ! lower-indexed nodes, to the node itself, to higher-indexed nodes, ! the total number of adjacencies for this node, and the location ! of the first and last entries required to list this set of adjacencies @@ -4050,7 +4050,7 @@ subroutine triangulation_order3_adj_set ( node_num, triangle_num, & ! in the sample grid. On the left, we list the node, and its neighbors, ! with an asterisk to indicate the adjacency of the node to itself ! (in some cases, you want to count this self adjacency and in some - ! you don't). On the right, we list the number of adjancencies to + ! you don't). On the right, we list the number of adjacencies to ! lower-indexed nodes, to the node itself, to higher-indexed nodes, ! the total number of adjacencies for this node, and the location ! of the first and last entries required to list this set of adjacencies @@ -4512,7 +4512,7 @@ subroutine triangulation_order6_adj_count ( node_num, triangle_num, & ! 24: 15 19 20 23 * 25 ! 25: 15 19 20 23 24 * ! - ! Below, we list the number of adjancencies to lower-indexed nodes, to + ! Below, we list the number of adjacencies to lower-indexed nodes, to ! the node itself, to higher-indexed nodes, the total number of ! adjacencies for this node, and the location of the first and last ! entries required to list this set of adjacencies in a single list @@ -4797,7 +4797,7 @@ subroutine triangulation_order6_adj_set ( node_num, triangle_num, & ! 24: 15 19 20 23 * 25 ! 25: 15 19 20 23 24 * ! - ! Below, we list the number of adjancencies to lower-indexed nodes, to + ! Below, we list the number of adjacencies to lower-indexed nodes, to ! the node itself, to higher-indexed nodes, the total number of ! adjacencies for this node, and the location of the first and last ! entries required to list this set of adjacencies in a single list diff --git a/src/Utilities/LongLineReader.f90 b/src/Utilities/LongLineReader.f90 index bce57afd45d..fc3fb0e1803 100644 --- a/src/Utilities/LongLineReader.f90 +++ b/src/Utilities/LongLineReader.f90 @@ -94,7 +94,7 @@ subroutine rdcom(this, iu, iout, line, ierr) return end subroutine rdcom - !> @brief Emulate a Fortan backspace + !> @brief Emulate a Fortran backspace !! !! Emulate a fortran backspace call by storing !! the current line in long_line diff --git a/src/Utilities/Memory/MemoryManager.f90 b/src/Utilities/Memory/MemoryManager.f90 index da17dabe6f4..31e8a2ec1d9 100644 --- a/src/Utilities/Memory/MemoryManager.f90 +++ b/src/Utilities/Memory/MemoryManager.f90 @@ -1750,7 +1750,7 @@ subroutine copyptr_int1d(aint, name, mem_path, mem_path_copy) integer(I4B), dimension(:), pointer, contiguous, intent(inout) :: aint !< returned copy of 1d integer array character(len=*), intent(in) :: name !< variable name character(len=*), intent(in) :: mem_path !< path where variable is stored - character(len=*), intent(in), optional :: mem_path_copy !< optional path where the copy wil be stored, + character(len=*), intent(in), optional :: mem_path_copy !< optional path where the copy will be stored, !! if passed then the copy is added to the !! memory manager ! -- local @@ -1781,7 +1781,7 @@ subroutine copyptr_int2d(aint, name, mem_path, mem_path_copy) integer(I4B), dimension(:, :), pointer, contiguous, intent(inout) :: aint !< returned copy of 2d integer array character(len=*), intent(in) :: name !< variable name character(len=*), intent(in) :: mem_path !< path where variable is stored - character(len=*), intent(in), optional :: mem_path_copy !< optional path where the copy wil be stored, + character(len=*), intent(in), optional :: mem_path_copy !< optional path where the copy will be stored, !! if passed then the copy is added to the !! memory manager ! -- local @@ -1819,7 +1819,7 @@ subroutine copyptr_dbl1d(adbl, name, mem_path, mem_path_copy) real(DP), dimension(:), pointer, contiguous, intent(inout) :: adbl !< returned copy of 1d real array character(len=*), intent(in) :: name !< variable name character(len=*), intent(in) :: mem_path !< path where variable is stored - character(len=*), intent(in), optional :: mem_path_copy !< optional path where the copy wil be stored, + character(len=*), intent(in), optional :: mem_path_copy !< optional path where the copy will be stored, !! if passed then the copy is added to the !! memory manager ! -- local @@ -1850,7 +1850,7 @@ subroutine copyptr_dbl2d(adbl, name, mem_path, mem_path_copy) real(DP), dimension(:, :), pointer, contiguous, intent(inout) :: adbl !< returned copy of 2d real array character(len=*), intent(in) :: name !< variable name character(len=*), intent(in) :: mem_path !< path where variable is stored - character(len=*), intent(in), optional :: mem_path_copy !< optional path where the copy wil be stored, + character(len=*), intent(in), optional :: mem_path_copy !< optional path where the copy will be stored, !! if passed then the copy is added to the !! memory manager ! -- local diff --git a/src/Utilities/Observation/Obs.f90 b/src/Utilities/Observation/Obs.f90 index 93ec3b973f3..f2e0aa166a9 100644 --- a/src/Utilities/Observation/Obs.f90 +++ b/src/Utilities/Observation/Obs.f90 @@ -218,7 +218,7 @@ module ObsModule !! !! - creates object !! - allocates pointer - !! - initilizes values + !! - initializes values !! !< subroutine obs_cr(obs, inobs) diff --git a/src/Utilities/Observation/ObsUtility.f90 b/src/Utilities/Observation/ObsUtility.f90 index 3a2ae187daa..bfd9cde4b5c 100644 --- a/src/Utilities/Observation/ObsUtility.f90 +++ b/src/Utilities/Observation/ObsUtility.f90 @@ -61,7 +61,7 @@ subroutine write_fmtd_obs(fmtc, obsrv, obsOutputList, value) ! -- flush the file ! Added flush after each non-advancing write to resolve ! issue with ifort (IFORT) 19.1.0.166 20191121 for Linux - ! that occured on some Linux systems. + ! that occurred on some Linux systems. flush (nunit) ! ! -- return diff --git a/src/Utilities/Observation/Observe.f90 b/src/Utilities/Observation/Observe.f90 index 8cc02be1161..89186ec5d44 100644 --- a/src/Utilities/Observation/Observe.f90 +++ b/src/Utilities/Observation/Observe.f90 @@ -59,7 +59,7 @@ module ObserveModule integer(I4B), allocatable, dimension(:), public :: indxbnds !< node numbers for observations when using boundname ! ! -- Set FormattedOutput false if output unit is opened for unformatted i/o - logical, public :: FormattedOutput = .true. !< logical indicating if obervation output is formatted + logical, public :: FormattedOutput = .true. !< logical indicating if observation output is formatted logical, public :: BndFound = .false. !< logical indicating if a boundname was found real(DP), public :: CurrentTimeStepEndValue = DZERO !< observation value real(DP), public :: CurrentTimeStepEndTime = DZERO !< observation time diff --git a/src/Utilities/Sim.f90 b/src/Utilities/Sim.f90 index 42b115c11f1..26a3d290b12 100644 --- a/src/Utilities/Sim.f90 +++ b/src/Utilities/Sim.f90 @@ -479,7 +479,7 @@ subroutine final_message() character(len=*), parameter :: fmtnocnvg = & &"(1x, 'Simulation convergence failure occurred ', i0, ' time(s).')" ! - ! -- Write message if nonconvergence occured in at least one timestep + ! -- Write message if nonconvergence occurred in at least one timestep if (numnoconverge > 0) then write (warnmsg, fmtnocnvg) numnoconverge if (isimcontinue == 0) then diff --git a/src/Utilities/SmoothingFunctions.f90 b/src/Utilities/SmoothingFunctions.f90 index 40c82161021..c103f811c33 100644 --- a/src/Utilities/SmoothingFunctions.f90 +++ b/src/Utilities/SmoothingFunctions.f90 @@ -449,7 +449,7 @@ function sQSaturation(top, bot, x, c1, c2) result(y) cof2 = DTHREE end if ! - ! -- calculate head diference from bottom (w), + ! -- calculate head difference from bottom (w), ! calculate range (b), and ! calculate normalized head difference from bottom (s) w = x - bot @@ -507,7 +507,7 @@ function sQSaturationDerivative(top, bot, x, c1, c2) result(y) cof2 = DTHREE end if ! - ! -- calculate head diference from bottom (w), + ! -- calculate head difference from bottom (w), ! calculate range (b), and ! calculate normalized head difference from bottom (s) w = x - bot diff --git a/src/Utilities/Vector/SeqVector.f90 b/src/Utilities/Vector/SeqVector.f90 index a5552c83f3e..c1a4d1c2418 100644 --- a/src/Utilities/Vector/SeqVector.f90 +++ b/src/Utilities/Vector/SeqVector.f90 @@ -26,7 +26,7 @@ module SeqVectorModule contains - !> @brief Create a sequential vector: the classic MF6 verion, + !> @brief Create a sequential vector: the classic MF6 version, !< storing in the memory manager. subroutine sqv_create_mm(this, n, name, mem_path) class(SeqVectorType) :: this !< this vector @@ -41,7 +41,7 @@ subroutine sqv_create_mm(this, n, name, mem_path) end subroutine sqv_create_mm - !> @brief Create a sequential vector: the classic MF6 verion + !> @brief Create a sequential vector: the classic MF6 version !< subroutine sqv_create(this, n) class(SeqVectorType) :: this !< this vector diff --git a/utils/idmloader/IDM.md b/utils/idmloader/IDM.md index cf56e5af702..d78b436d934 100644 --- a/utils/idmloader/IDM.md +++ b/utils/idmloader/IDM.md @@ -10,12 +10,12 @@ MODFLOW 6 reads simulation input from text and binary input files. Traditionall The MODFLOW 6 IDP (Input Data Processor) is a subsystem meant to generically read and store simulation input data from more than one type of input source. It is built upon existing MODFLOW 6 capabilities, specifically input parameter descriptions currently stored in \*.dfn (definition) files, and the Memory Manager. The parameter descriptions provide IDP with input block and parameter attributes needed to create memory and store input data. The Memory Manager provides a globally accessible way to create, update, access and remove input (and other) data. Existing components that read a traditional ASCII input file can be updated to source their input from the Memory Manager. This type of update is a significant step towards supporting sources of input data other than the traditional ASCII files. ## Framework -MODFLOW 6 \*.dfn files are used pre-compile time to generate fortran source files containing a subset of the parameter and block attribute information necessary to process input for the simulation. A single definition file is converted into one fortran source file that defines the component parameters and blocks and organizes them into lists. This conversion from defintion file to fortran source file is currently managed by the [dfn2f90.py](scripts/dfn2f90.py) script. This script also creates framework fortran source files with routines for generically accessing package definitions by component. A package or other component intended to be updated and integrated with IDM must be added to the `utils/idmloader/dfns.txt` file, which the `dfn2f90.py` script consumes. This process is described below. +MODFLOW 6 \*.dfn files are used pre-compile time to generate fortran source files containing a subset of the parameter and block attribute information necessary to process input for the simulation. A single definition file is converted into one fortran source file that defines the component parameters and blocks and organizes them into lists. This conversion from definition file to fortran source file is currently managed by the [dfn2f90.py](scripts/dfn2f90.py) script. This script also creates framework fortran source files with routines for generically accessing package definitions by component. A package or other component intended to be updated and integrated with IDM must be added to the `utils/idmloader/dfns.txt` file, which the `dfn2f90.py` script consumes. This process is described below. ## Design Input data stored in the Memory Manager use the special identifier ```__INPUT__``` as a prefix to a memory path. MODFLOW 6 refers to memory path prefixes such as these as a "context" and as such the collection of input data stored in the Memory Manager is referred to as the "input context". -IDM defines and implements loaders as objects to read input from some supported source and to allocate and store that input in a source independent way for the package or component. Variations across sources are managed by the loaders. Input retrieved by simulation packages is stuctured such that the source is not apparent or relevant to the package. +IDM defines and implements loaders as objects to read input from some supported source and to allocate and store that input in a source independent way for the package or component. Variations across sources are managed by the loaders. Input retrieved by simulation packages is structured such that the source is not apparent or relevant to the package. IDM distinguishes between static and dynamic loader objects. Static loader objects load all pre-period input before any simulation objects are created and prepare for dynamic (stress period) data loads by creating the dynamic loader when relevant. Static and dynamic loaders are defined per supported source by extending base types defined in [InputLoadType.f90](../../src/Utilities/Idm/InputLoadType.f90). Top level IDM context ([IdmLoad.f90](../../src/Utilities/Idm/IdmLoad.f90)) maintains pointers to loader base types and invoke the common deferred interfaces load() (static) and rp() (dynamic) for each component. Each source can introduce as much complexity as needed to support variations in input by introducing source specific loader types. For example, there are currently distinct loaders for dynamic ASCII list based and array-based inputs. These sub-loaders are allocated and managed within the context of a given source (e.g. ASCII). @@ -24,7 +24,7 @@ A simulation component (package, etc) can be integrated with IDM by following th - Create dfn file - Add component to `dfns.txt` and run `dfn2f90.py` - Update MODFLOW 6 build scripts (e.g. meson / msvs) -- Use common intefaces to source input from input context +- Use common interfaces to source input from input context The DFN file is already a requirement for MODFLOW 6 package integration and so is not an IDM specific requirement. The DFN file should be added to `doc/mf6io/mf6ivar/dfn/` and its filename added to `dfns.txt`. The generated package files are named `\*idm.f90` and located in the `src/Idm/` subdirectory by default. To run the script: @@ -39,6 +39,6 @@ Once these files have been added to the build the package can be updated to sour call mem_set_value(this%xorigin, 'XORIGIN', this%input_mempath, found%xorigin) ``` -The found instance is a convenience type generated by dfn2f90.py and should be complete and ready to use from the \*idm.f90 package module. The inteface updates the data pointer (```this%xorigin``` in the example) only if the relevant data was provided as input and will set the logical ```found%xorigin``` to TRUE when this is the case. +The found instance is a convenience type generated by dfn2f90.py and should be complete and ready to use from the \*idm.f90 package module. The interface updates the data pointer (```this%xorigin``` in the example) only if the relevant data was provided as input and will set the logical ```found%xorigin``` to TRUE when this is the case. Dynamic data can also be copied between contexts by using the ```mem_set_value()``` interface or it can be accessed directly by setting a pointer to it. In most cases, dynamic input memory is not reallocated during it's lifetime and such a pointer is valid for the duration of the simulation. See CHD package code for an example (e.g. "HEAD") diff --git a/utils/meson.build b/utils/meson.build index 7a6eb67c7ba..48eb623fbe1 100644 --- a/utils/meson.build +++ b/utils/meson.build @@ -1,4 +1,4 @@ -# Supress all warnings on util projects +# Suppress all warnings on util projects util_args = [] if fc_id == 'gcc' or fc_id == 'intel' util_args += '-w' From 0e228cfc849411248b584cd98e6f122a7d899c42 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 19 Apr 2024 10:19:11 -0400 Subject: [PATCH 115/199] ci(release): support model selection for docs/dfns/examples (#1746) * select model types to include in docs/dfns/examples at release time * don't rebuild mf6io.pdf in build_documentation() if it already exists * don't build examples in dist build job (not needed) * last step toward feature toggling --- .github/workflows/release.yml | 41 ++++++-------------- .github/workflows/release_dispatch.yml | 5 +++ distribution/build_dist.py | 53 +++++++++++++------------- distribution/build_docs.py | 29 ++++++++++++-- 4 files changed, 68 insertions(+), 60 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dc37c16148e..39f5e6f2394 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,6 +47,10 @@ on: description: 'Version number to use for release.' required: true type: string + models: + description: 'Models to include in the release documentation' + required: false + type: string outputs: version: description: 'Version number used for release' @@ -419,7 +423,9 @@ jobs: - name: Build example models if: inputs.full == true working-directory: modflow6-examples/autotest - run: pytest -v -n auto test_scripts.py --init + run: | + models="${{ inputs.models }}" + pytest -v -n auto test_scripts.py --init -k "${models//,/ or }" - name: Create folder structure if: inputs.full == true @@ -461,7 +467,8 @@ jobs: GITHUB_TOKEN: ${{ github.token }} run: | mkdir -p "${{ needs.build.outputs.distname }}/doc" - cmd="python modflow6/distribution/build_docs.py -b bin -o doc" + models="${{ inputs.models }}" + cmd="python modflow6/distribution/build_docs.py -b bin -o doc -m ${models//,/ -m }" if [[ "${{ inputs.full }}" == "true" ]]; then cmd="$cmd --full" fi @@ -568,40 +575,14 @@ jobs: echo "dist directory contains:" ls - - name: Install dependencies for example models - env: - GITHUB_TOKEN: ${{ github.token }} - run: | - pip install -r modflow6-examples/etc/requirements.pip.txt - distname="${{ needs.build.outputs.distname }}_${{ steps.ostag.outputs.ostag }}" - echo "$distname/bin" >> $GITHUB_PATH - # execute permissions may not have survived artifact upload/download - chmod +x "$distname/bin/mf6" - chmod +x "$distname/bin/mf5to6" - chmod +x "$distname/bin/zbud6" - - # the example models also need mf2005, triangle and gridgen - - name: Install extra executables - uses: modflowpy/install-modflow-action@v1 - with: - subset: mf2005,triangle,gridgen - - - name: Update Flopy - working-directory: modflow6/autotest - run: python update_flopy.py - - - name: Build example models - if: inputs.full == true - working-directory: modflow6-examples/autotest - run: pytest -v -n auto test_scripts.py --init - - name: Build distribution env: GITHUB_TOKEN: ${{ github.token }} run: | # build distribution distname="${{ needs.build.outputs.distname }}_${{ steps.ostag.outputs.ostag }}" - cmd="python modflow6/distribution/build_dist.py -o $distname -e modflow6-examples" + models="${{ inputs.models }}" + cmd="python modflow6/distribution/build_dist.py -o $distname -m ${models//,/ -m }" if [[ "${{ inputs.full }}" == "true" ]]; then cmd="$cmd --full" fi diff --git a/.github/workflows/release_dispatch.yml b/.github/workflows/release_dispatch.yml index 77d159d0f46..7e96783c37e 100644 --- a/.github/workflows/release_dispatch.yml +++ b/.github/workflows/release_dispatch.yml @@ -48,6 +48,10 @@ on: description: 'Version number to use for release.' required: true type: string + models: + description: 'Models to include in the release documentation' + required: false + type: string jobs: set_options: name: Set release options @@ -137,6 +141,7 @@ jobs: full: true run_tests: ${{ inputs.run_tests }} version: ${{ needs.set_options.outputs.version }} + models: ${{ inputs.models }} pr: name: Draft release PR if: ${{ github.ref_name != 'master' && ((github.event_name == 'workflow_dispatch' && inputs.approve == 'true') || (github.event_name != 'workflow_dispatch' && !contains(github.ref_name, 'rc'))) }} diff --git a/distribution/build_dist.py b/distribution/build_dist.py index 759691333c3..12ff7fcfe86 100644 --- a/distribution/build_dist.py +++ b/distribution/build_dist.py @@ -7,25 +7,26 @@ from pathlib import Path from pprint import pprint from shutil import copy, copyfile, copytree, ignore_patterns +from typing import List, Optional import pytest -from modflow_devtools.build import meson_build -from modflow_devtools.download import download_and_unzip, get_release -from modflow_devtools.markers import no_parallel, requires_exe -from modflow_devtools.misc import get_model_paths - from build_docs import build_documentation from build_makefiles import ( build_mf5to6_makefile, build_mf6_makefile, build_zbud6_makefile, ) -from utils import get_project_root_path, run_command +from modflow_devtools.build import meson_build +from modflow_devtools.download import download_and_unzip, get_release +from modflow_devtools.markers import no_parallel, requires_exe +from modflow_devtools.misc import get_model_paths + +from utils import get_project_root_path # default paths _project_root_path = get_project_root_path() -_examples_repo_path = _project_root_path.parent / "modflow6-examples" _build_path = _project_root_path / "builddir" +_default_models = ["gwf", "gwt", "gwe", "prt", "swf"] # OS-specific extensions _system = platform.system() @@ -107,7 +108,10 @@ def test_copy_sources(tmp_path): def setup_examples( - bin_path: PathLike, examples_path: PathLike, overwrite: bool = False + bin_path: PathLike, + examples_path: PathLike, + overwrite: bool = False, + models: Optional[List[str]] = None, ): examples_path = Path(examples_path).expanduser().absolute() @@ -119,6 +123,11 @@ def setup_examples( ) download_and_unzip(asset["browser_download_url"], examples_path, verbose=True) + # filter examples for models selected for release + for p in examples_path.glob("*"): + if not any(m in p.stem for m in models): + p.unlink() + # list folders with mfsim.nam (recursively) # and add run.sh/bat script to each folder model_paths = get_model_paths(examples_path) @@ -266,15 +275,14 @@ def test_build_makefiles(tmp_path): def build_distribution( build_path: PathLike, output_path: PathLike, - examples_repo_path: PathLike, full: bool = False, overwrite: bool = False, + models: Optional[List[str]] = None, ): print(f"Building {'full' if full else 'minimal'} distribution") build_path = Path(build_path).expanduser().absolute() output_path = Path(output_path).expanduser().absolute() - examples_repo_path = Path(examples_repo_path).expanduser().absolute() # binaries build_programs_meson( @@ -288,11 +296,12 @@ def build_distribution( if not full: return - # examples + # download and setup example models setup_examples( bin_path=output_path / "bin", examples_path=output_path / "examples", overwrite=overwrite, + models=models, ) # copy source code files @@ -301,7 +310,7 @@ def build_distribution( # build and copy makefiles build_makefiles(output_path=output_path) - # docs + # build docs build_documentation( bin_path=output_path / "bin", full=full, @@ -319,7 +328,6 @@ def test_build_distribution(tmp_path, full): build_distribution( build_path=tmp_path / "builddir", output_path=output_path, - examples_repo_path=_examples_repo_path, full=full, overwrite=True, ) @@ -378,11 +386,11 @@ def test_build_distribution(tmp_path, full): help="Path to create distribution artifacts", ) parser.add_argument( - "-e", - "--examples-repo-path", + "-m", + "--model", required=False, - default=str(_examples_repo_path), - help="Path to directory containing modflow6 example models", + action="append", + help="Filter models to include", ) parser.add_argument( "--full", @@ -402,20 +410,13 @@ def test_build_distribution(tmp_path, full): args = parser.parse_args() build_path = Path(args.build_path) out_path = Path(args.output_path) - examples_repo_path = ( - Path(args.examples_repo_path) - if args.examples_repo_path - else _examples_repo_path - ) - assert ( - examples_repo_path.is_dir() - ), f"Examples repo not found at path: {examples_repo_path}" out_path.mkdir(parents=True, exist_ok=True) + models = args.model if args.model else _default_models build_distribution( build_path=build_path, output_path=out_path, - examples_repo_path=examples_repo_path, full=args.full, overwrite=args.force, + models=models, ) diff --git a/distribution/build_docs.py b/distribution/build_docs.py index 991329a2848..066e85da7c5 100644 --- a/distribution/build_docs.py +++ b/distribution/build_docs.py @@ -14,6 +14,7 @@ from warnings import warn import pytest +from benchmark import run_benchmarks from flaky import flaky from modflow_devtools.build import meson_build from modflow_devtools.download import ( @@ -25,7 +26,6 @@ from modflow_devtools.markers import no_parallel, requires_exe, requires_github from modflow_devtools.misc import is_in_ci, run_cmd, set_dir -from benchmark import run_benchmarks from utils import convert_line_endings, get_project_root_path # paths @@ -47,6 +47,7 @@ _docs_path / "ConverterGuide" / "converter_mf5to6.tex", _docs_path / "SuppTechInfo" / "mf6suptechinfo.tex", ] +_default_models = ["gwf", "gwt", "gwe", "prt", "swf"] # OS-specific extensions _system = platform.system() @@ -219,7 +220,9 @@ def build_deprecations_tex(): assert (_docs_path / "ReleaseNotes" / f"{deprecations_path.stem}.tex").is_file() -def build_mf6io_tex_from_dfn(overwrite: bool = False): +def build_mf6io_tex_from_dfn( + overwrite: bool = False, models: Optional[List[str]] = None +): if overwrite: clean_tex_files() @@ -261,7 +264,11 @@ def files_match(tex_path, dfn_path, ignored): f.unlink() # run python script - out, err, ret = run_cmd(sys.executable, "mf6ivar.py") + args = [sys.executable, "mf6ivar.py"] + if models is not None and any(models): + for model in models: + args += ["--model", model] + out, err, ret = run_cmd(*args) assert not ret, out + err # check that dfn and tex files match @@ -473,17 +480,22 @@ def build_documentation( output_path: Optional[PathLike] = None, overwrite: bool = False, repo_owner: str = "MODFLOW-USGS", + models: Optional[List[str]] = None, ): print(f"Building {'full' if full else 'minimal'} documentation") bin_path = Path(bin_path).expanduser().absolute() output_path = Path(output_path).expanduser().absolute() + if (output_path / "mf6io.pdf").is_file() and not overwrite: + print(f"{output_path / 'mf6io.pdf'} already exists") + return + # make sure output directory exists output_path.mkdir(parents=True, exist_ok=True) # build LaTex input/output docs from DFN files - build_mf6io_tex_from_dfn(overwrite=True) + build_mf6io_tex_from_dfn(overwrite=overwrite, models=models) # build LaTeX input/output example model docs with TemporaryDirectory() as temp: @@ -608,14 +620,23 @@ def test_build_documentation(tmp_path): default="MODFLOW-USGS", help="Repository owner (substitute your own for a fork)", ) + parser.add_argument( + "-m", + "--model", + required=False, + action="append", + help="Filter model types to include", + ) args = parser.parse_args() output_path = Path(args.output_path).expanduser().absolute() output_path.mkdir(parents=True, exist_ok=True) bin_path = Path(args.bin_path).expanduser().absolute() + models = args.model if args.model else _default_models build_documentation( bin_path=bin_path, full=args.full, output_path=output_path, overwrite=args.force, repo_owner=args.repo_owner, + models=models, ) From b4f7e3305b46f9619b20a6a356f13c7e7ad4e81c Mon Sep 17 00:00:00 2001 From: mjr-deltares <45555666+mjr-deltares@users.noreply.github.com> Date: Fri, 19 Apr 2024 20:06:54 +0200 Subject: [PATCH 116/199] fix(par): XT3D on exchange no longer hangs simulation (#1750) * - move 'parallel' logic to mpi control * - incremental reorg. * - fix recursive model search * - allow asymmetry in send/recv - test still failing * - fix test: no element map when halo model has no actual contribution * - fix format --- autotest/test_par_gwf04.py | 260 ++++++++++++++++++ src/Distributed/InterfaceMap.f90 | 3 + src/Distributed/MpiRouter.f90 | 84 ++---- src/Distributed/MpiRunControl.F90 | 132 ++++++++- src/Distributed/RouterBase.f90 | 5 +- src/Distributed/VirtualDataContainer.f90 | 8 +- src/Distributed/VirtualDataManager.f90 | 95 +++---- .../Connection/SpatialModelConnection.f90 | 74 +++-- src/RunControl.f90 | 34 ++- src/Utilities/ArrayHandlers.f90 | 2 +- 10 files changed, 539 insertions(+), 158 deletions(-) create mode 100644 autotest/test_par_gwf04.py diff --git a/autotest/test_par_gwf04.py b/autotest/test_par_gwf04.py new file mode 100644 index 00000000000..599c3ec312c --- /dev/null +++ b/autotest/test_par_gwf04.py @@ -0,0 +1,260 @@ +""" +Test for parallel MODFLOW running a simple +3x3 multi-model setup with asymmetry from +only one exchange with XT3D + + (xt3d) + | + v + [M13] | [M23] | [M33] [3] [6] [9] + --------------------- + [M12] | [M22] | [M32] ids: [2] [5] [8] + --------------------- + [M11] | [M21] | [M31] [1] [4] [7] + +with constant head set at the lower-left corner. +This constant head should reach all domains, but +the test is really about the underlying MPI +communication pattern: e.g., M13 will need data +from M22, but not the other way around. + +The test was added to reproduce and fix the issue +listed here: + + https://github.com/MODFLOW-USGS/modflow6/issues/1744 + +""" + +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +cases = [ + "par_gwf04-noxt3d", + "par_gwf04-xt3d", +] +domain_grid = [(3, 3), (3, 3)] + +nlay = 1 +nrow = 3 +ncol = 3 +delr = 100.0 +delc = 100.0 +head_initial = -1.0 +cst_head_south_west = 435.0 +hclose = 1.0e-8 + + +def get_model_name(ix, iy): + return f"model-{ix}-{iy}" + + +def get_simulation(idx, ws): + name = cases[idx] + nr_models_x = domain_grid[idx][0] + nr_models_y = domain_grid[idx][1] + + # parameters and spd + # tdis + nper = 1 + tdis_rc = [] + for i in range(nper): + tdis_rc.append((1.0, 1, 1)) + + # solver data + nouter, ninner = 100, 300 + rclose, relax = 1e-3, 0.97 + + sim = flopy.mf6.MFSimulation( + sim_name=name, + version="mf6", + exe_name="mf6", + sim_ws=ws, + ) + + tdis = flopy.mf6.ModflowTdis( + sim, time_units="DAYS", nper=nper, perioddata=tdis_rc + ) + + ims = flopy.mf6.ModflowIms( + sim, + print_option="ALL", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="DBD", + inner_maximum=ninner, + inner_dvclose=hclose, + rcloserecord=rclose, + linear_acceleration="BICGSTAB", + relaxation_factor=relax, + ) + + # create models (and exchanges) + for ix in range(nr_models_x): + for iy in range(nr_models_y): + add_model(sim, ix, iy) + + # add exchanges from west to east + for iy in range(nr_models_y): + for ix in range(nr_models_x - 1): + name_west = get_model_name(ix, iy) + name_east = get_model_name(ix + 1, iy) + with_xt3d = (ix == 0 and iy == 2) and idx == 1 # enable xt3d between M13 and M23 + add_exchange_west_east(sim, name_west, name_east, with_xt3d) + + # add exchange from south to north + for ix in range(nr_models_x): + for iy in range(nr_models_y - 1): + name_south = get_model_name(ix, iy) + name_north = get_model_name(ix, iy + 1) + add_exchange_south_north(sim, name_south, name_north) + + return sim + + +def add_model(sim, ix, iy): + # model spatial discretization + shift_x = ix * ncol * delr + shift_y = iy * nrow * delc + model_name = get_model_name(ix, iy) + + # top/bot of the aquifer + tops = [0.0, -100.0] + + # hydraulic conductivity + k11 = 1.0 + + # initial head + h_start = head_initial + + gwf = flopy.mf6.ModflowGwf(sim, modelname=model_name, save_flows=True) + dis = flopy.mf6.ModflowGwfdis( + gwf, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=tops[0], + botm=tops[1 : nlay + 1], + xorigin=shift_x, + yorigin=shift_y, + ) + ic = flopy.mf6.ModflowGwfic(gwf, strt=h_start) + npf = flopy.mf6.ModflowGwfnpf( + gwf, + save_specific_discharge=True, + save_flows=True, + icelltype=0, + k=k11, + ) + oc = flopy.mf6.ModflowGwfoc( + gwf, + head_filerecord=f"{model_name}.hds", + budget_filerecord=f"{model_name}.cbc", + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + ) + + if ix == 0 and iy == 0: + # add SW corner BC + sw_chd = [[(0, nrow - 1, 0), cst_head_south_west]] + chd_spd_sw = {0: sw_chd} + chd = flopy.mf6.ModflowGwfchd(gwf, stress_period_data=chd_spd_sw) + + +def add_exchange_west_east(sim, name_west, name_east, with_xt3d): + exg_filename = f"we_{name_west}_{name_east}.gwfgwf" + # exchangedata + angldegx = 0.0 + cdist = delr + gwfgwf_data = [ + [ + (ilay, irow, ncol - 1), + (ilay, irow, 0), + 1, + delr / 2.0, + delr / 2.0, + delc, + angldegx, + cdist, + ] + for irow in range(nrow) + for ilay in range(nlay) + ] + gwfgwf = flopy.mf6.ModflowGwfgwf( + sim, + exgtype="GWF6-GWF6", + nexg=len(gwfgwf_data), + exgmnamea=name_west, + exgmnameb=name_east, + exchangedata=gwfgwf_data, + auxiliary=["ANGLDEGX", "CDIST"], + filename=exg_filename, + xt3d=with_xt3d, + ) + + +def add_exchange_south_north(sim, name_south, name_north): + exg_filename = f"sn_{name_south}_{name_north}.gwfgwf" + + # exchangedata + angldegx = 90.0 + cdist = delc + gwfgwf_data = [ + [ + (ilay, 0, icol), + (ilay, nrow - 1, icol), + 1, + delc / 2.0, + delc / 2.0, + delr, + angldegx, + cdist, + ] + for icol in range(ncol) + for ilay in range(nlay) + ] + gwfgwf = flopy.mf6.ModflowGwfgwf( + sim, + exgtype="GWF6-GWF6", + nexg=len(gwfgwf_data), + exgmnamea=name_south, + exgmnameb=name_north, + exchangedata=gwfgwf_data, + auxiliary=["ANGLDEGX", "CDIST"], + filename=exg_filename, + ) + + +def build_models(idx, test): + sim = get_simulation(idx, test.workspace) + return sim, None + + +def check_output(idx, test): + mf6_sim = flopy.mf6.MFSimulation.load(sim_ws=test.workspace) + for mname in mf6_sim.model_names: + m = mf6_sim.get_model(mname) + hds = m.output.head().get_data().flatten() + hds_compare = cst_head_south_west * np.ones_like(hds) + assert np.allclose(hds, hds_compare, atol=1.0e-6, rtol=0.0) + + +@pytest.mark.parallel +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + ncpus = domain_grid[idx][0] * domain_grid[idx][1] + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + compare=None, + parallel=True, + ncpus=ncpus, + ) + test.run() diff --git a/src/Distributed/InterfaceMap.f90 b/src/Distributed/InterfaceMap.f90 index ef04bba288a..8a5512c3b23 100644 --- a/src/Distributed/InterfaceMap.f90 +++ b/src/Distributed/InterfaceMap.f90 @@ -105,6 +105,7 @@ subroutine add(this, map_to_add) end subroutine add function get_node_map(this, model_id) result(node_map) + use SimModule, only: ustop class(InterfaceMapType) :: this integer(I4B) :: model_id type(IndexMapType), pointer :: node_map @@ -115,6 +116,8 @@ function get_node_map(this, model_id) result(node_map) m_idx = ifind(this%model_ids, model_id) if (m_idx > 0) then node_map => this%node_maps(m_idx) + else + call ustop("Internal error. Can't find node map in interface") end if end function get_node_map diff --git a/src/Distributed/MpiRouter.f90 b/src/Distributed/MpiRouter.f90 index 6741f0576e7..a68f7c05e07 100644 --- a/src/Distributed/MpiRouter.f90 +++ b/src/Distributed/MpiRouter.f90 @@ -41,9 +41,7 @@ module MpiRouterModule procedure, private :: activate procedure, private :: deactivate procedure, private :: update_senders - procedure, private :: update_senders_sln procedure, private :: update_receivers - procedure, private :: update_receivers_sln procedure, private :: route_active procedure, private :: is_cached procedure, private :: compose_messages @@ -75,8 +73,11 @@ subroutine mr_initialize(this) class(VirtualDataContainerType), pointer :: vdc character(len=LINELENGTH) :: monitor_file + ! routing over all when starting + this%halo_activated = .false. + ! to log or not to log - this%enable_monitor = .false. + this%enable_monitor = .true. ! initialize the MPI message builder and cache call this%message_builder%init() @@ -249,19 +250,14 @@ subroutine route_active(this, unit, stage) call this%update_senders() call this%update_receivers() - if (this%senders%size /= this%receivers%size) then - call store_error("Internal error: receivers should equal senders", & - terminate=.true.) - end if - ! allocate body data allocate (body_rcv_t(this%senders%size)) allocate (body_snd_t(this%receivers%size)) ! allocate handles - allocate (rcv_req(this%receivers%size)) - allocate (snd_req(this%senders%size)) - allocate (rcv_stat(MPI_STATUS_SIZE, this%receivers%size)) + allocate (rcv_req(this%senders%size)) + allocate (snd_req(this%receivers%size)) + allocate (rcv_stat(MPI_STATUS_SIZE, this%senders%size)) ! always initialize request handles rcv_req = MPI_REQUEST_NULL @@ -635,59 +631,37 @@ subroutine update_senders(this) end subroutine update_senders - subroutine update_senders_sln(this, virtual_sol) - class(MpiRouterType) :: this - type(VirtualSolutionType) :: virtual_sol - ! local - integer(I4B) :: i - class(VirtualDataContainerType), pointer :: vdc - - call this%senders%clear() - - do i = 1, size(virtual_sol%models) - vdc => virtual_sol%models(i)%ptr - if (.not. vdc%is_local .and. vdc%is_active) then - call this%senders%push_back_unique(vdc%orig_rank) - end if - end do - do i = 1, size(virtual_sol%exchanges) - vdc => virtual_sol%exchanges(i)%ptr - if (.not. vdc%is_local .and. vdc%is_active) then - call this%senders%push_back_unique(vdc%orig_rank) - end if - end do - - end subroutine update_senders_sln - subroutine update_receivers(this) class(MpiRouterType) :: this ! local - integer(I4B) :: i + integer(I4B) :: i, j + class(VirtualDataContainerType), pointer :: vdc call this%receivers%clear() - ! assuming symmetry for now - do i = 1, this%senders%size - call this%receivers%push_back(this%senders%at(i)) - end do + if (.not. this%halo_activated) then + ! assuming symmetry for now + do i = 1, this%senders%size + call this%receivers%push_back(this%senders%at(i)) + end do + else + ! get the receivers from the VDCs + do i = 1, size(this%rte_models) + vdc => this%rte_models(i)%ptr + do j = 1, vdc%rcv_ranks%size + call this%receivers%push_back_unique(vdc%rcv_ranks%at(j)) + end do + end do + do i = 1, size(this%rte_exchanges) + vdc => this%rte_exchanges(i)%ptr + do j = 1, vdc%rcv_ranks%size + call this%receivers%push_back_unique(vdc%rcv_ranks%at(j)) + end do + end do + end if end subroutine update_receivers - subroutine update_receivers_sln(this, virtual_sol) - class(MpiRouterType) :: this - type(VirtualSolutionType) :: virtual_sol - ! local - integer(I4B) :: i - - call this%receivers%clear() - - ! assuming symmetry for now - do i = 1, this%senders%size - call this%receivers%push_back(this%senders%at(i)) - end do - - end subroutine update_receivers_sln - !> @brief Check if this stage is cached !< function is_cached(this, unit, stage) result(in_cache) diff --git a/src/Distributed/MpiRunControl.F90 b/src/Distributed/MpiRunControl.F90 index 86196b6682b..3c95253d8f9 100644 --- a/src/Distributed/MpiRunControl.F90 +++ b/src/Distributed/MpiRunControl.F90 @@ -1,12 +1,17 @@ module MpiRunControlModule #if defined(__WITH_PETSC__) #include - use petscksp + ! cannot use all symbols because of clash with 'use mpi' + use petscksp, only: PETSC_COMM_WORLD, PetscInitialize, PetscFinalize, & + PETSC_NULL_CHARACTER, PETSC_NULL_OPTIONS #endif use mpi use MpiWorldModule use SimVariablesModule, only: proc_id, nr_procs + use SimStagesModule use KindModule, only: I4B, LGP + use STLVecIntModule + use NumericalSolutionModule use RunControlModule, only: RunControlType implicit none private @@ -18,6 +23,7 @@ module MpiRunControlModule ! override procedure :: start => mpi_ctrl_start procedure :: finish => mpi_ctrl_finish + procedure :: after_con_cr => mpi_ctrl_after_con_cr ! private procedure, private :: wait_for_debugger end type MpiRunControlType @@ -141,4 +147,128 @@ subroutine mpi_ctrl_finish(this) end subroutine mpi_ctrl_finish + !> @brief Actions after creating connections + !< + subroutine mpi_ctrl_after_con_cr(this) + use VirtualDataListsModule + use VirtualModelModule, only: VirtualModelType, & + get_virtual_model_from_list, & + get_virtual_model + use VirtualExchangeModule, only: VirtualExchangeType, & + get_virtual_exchange_from_list, & + get_virtual_exchange + class(MpiRunControlType) :: this + ! local + integer(I4B) :: i, j, id, irank + integer(I4B) :: nr_models, nr_exgs, nr_remotes, max_nr_remotes + type(STLVecInt) :: remote_models, remote_exgs + integer(I4B), dimension(:, :), pointer :: remote_models_per_process + integer(I4B), dimension(:, :), pointer :: remote_exgs_per_process + class(VirtualModelType), pointer :: vm + class(VirtualExchangeType), pointer :: ve + type(MpiWorldType), pointer :: mpi_world + integer :: ierr + + mpi_world => get_mpi_world() + + ! activate halo through base + call this%RunControlType%after_con_cr() + + ! compose list of remote models/exchanges to receive + call remote_models%init() + nr_models = virtual_model_list%Count() + do i = 1, nr_models + vm => get_virtual_model_from_list(virtual_model_list, i) + if (vm%is_active .and. .not. vm%is_local) then + ! remote and active + call remote_models%push_back(vm%id) + end if + end do + call remote_exgs%init() + nr_exgs = virtual_exchange_list%Count() + do i = 1, nr_exgs + ve => get_virtual_exchange_from_list(virtual_exchange_list, i) + if (ve%is_active .and. .not. ve%is_local) then + ! remote and active + call remote_exgs%push_back(ve%id) + end if + end do + + ! Models: find max for allocation + nr_remotes = remote_models%size + call MPI_Allreduce(nr_remotes, max_nr_remotes, 1, MPI_INTEGER, MPI_MAX, & + mpi_world%comm, ierr) + call CHECK_MPI(ierr) + + allocate (remote_models_per_process(max_nr_remotes, nr_procs)) + remote_models_per_process = 0 + + ! Models: fill local portion and reduce + do i = 1, remote_models%size + remote_models_per_process(i, proc_id + 1) = remote_models%at(i) + end do + call MPI_Allreduce(MPI_IN_PLACE, remote_models_per_process, & + max_nr_remotes * nr_procs, MPI_INTEGER, MPI_MAX, & + mpi_world%comm, ierr) + call CHECK_MPI(ierr) + + ! Models: set remotes to virtual models + do i = 1, nr_procs + do j = 1, max_nr_remotes + id = remote_models_per_process(j, i) + if (id > 0) then + ! assign zero-based rank number to virtual model + vm => get_virtual_model(id) + if (vm%is_local) then + ! only for local models + irank = i - 1 + call vm%rcv_ranks%push_back_unique(irank) + end if + end if + end do + end do + + ! Exchanges: find max for allocation + nr_remotes = remote_exgs%size + call MPI_Allreduce(nr_remotes, max_nr_remotes, 1, MPI_INTEGER, MPI_MAX, & + mpi_world%comm, ierr) + call CHECK_MPI(ierr) + + allocate (remote_exgs_per_process(max_nr_remotes, nr_procs)) + remote_exgs_per_process = 0 + + ! Exchanges: fill local portion and reduce + do i = 1, remote_exgs%size + remote_exgs_per_process(i, proc_id + 1) = remote_exgs%at(i) + end do + call MPI_Allreduce(MPI_IN_PLACE, remote_exgs_per_process, & + max_nr_remotes * nr_procs, MPI_INTEGER, MPI_MAX, & + mpi_world%comm, ierr) + call CHECK_MPI(ierr) + + ! Exchanges: set remotes to virtual exchanges + do i = 1, nr_procs + do j = 1, max_nr_remotes + id = remote_exgs_per_process(j, i) + if (id > 0) then + ! assign zero-based rank number to virtual exchange + ve => get_virtual_exchange(id) + if (ve%is_local) then + ! only for local exchanges + irank = i - 1 + call ve%rcv_ranks%push_back_unique(irank) + end if + end if + end do + end do + + ! clean up + call remote_models%destroy() + call remote_exgs%destroy() + + deallocate (remote_models_per_process) + deallocate (remote_exgs_per_process) + + end subroutine mpi_ctrl_after_con_cr + end module MpiRunControlModule diff --git a/src/Distributed/RouterBase.f90 b/src/Distributed/RouterBase.f90 index 6718b7aabc2..e08db1c0be4 100644 --- a/src/Distributed/RouterBase.f90 +++ b/src/Distributed/RouterBase.f90 @@ -1,11 +1,12 @@ module RouterBaseModule - use KindModule, only: I4B + use KindModule, only: I4B, LGP use VirtualSolutionModule implicit none private type, abstract, public :: RouterBaseType - + logical(LGP) :: halo_activated !< when true, the halo has been activated + !< (allowing more efficient routing of virtual data) contains procedure(initialize_if), deferred :: initialize procedure(route_all_if), deferred :: route_all diff --git a/src/Distributed/VirtualDataContainer.f90 b/src/Distributed/VirtualDataContainer.f90 index 3350bd64e5b..4afe1bcf218 100644 --- a/src/Distributed/VirtualDataContainer.f90 +++ b/src/Distributed/VirtualDataContainer.f90 @@ -11,7 +11,7 @@ module VirtualDataContainerModule private public :: get_vdc_from_list - public VDC_TYPE_TO_STR + public :: VDC_TYPE_TO_STR integer(I4B), public, parameter :: VDC_UNKNOWN_TYPE = 0 integer(I4B), public, parameter :: VDC_GWFMODEL_TYPE = 1 @@ -59,6 +59,8 @@ module VirtualDataContainerModule !! some of its variables can still be remote logical(LGP) :: is_active !< when true, this container is being synchronized integer(I4B) :: orig_rank !< the global rank of the process which holds the physical data for this container + type(STLVecInt) :: rcv_ranks !< the ranks of processes, other than orig_rank, having this container active + !< (only guaranteed to be complete after synchronization) type(ListType) :: virtual_data_list !< a list with all virtual data items for this container type(VdcElementMapType), dimension(NR_VDC_ELEMENT_MAPS) :: element_maps !< a list with all element maps @@ -115,6 +117,8 @@ subroutine vdc_create(this, name, id, is_local) this%element_luts(i)%remote_to_virtual => null() end do + call this%rcv_ranks%init() + end subroutine vdc_create !> @brief Init virtual data item, without allocation, @@ -394,6 +398,8 @@ subroutine vdc_destroy(this) integer(I4B) :: i class(*), pointer :: obj + call this%rcv_ranks%destroy() + do i = 1, size(this%element_maps) if (associated(this%element_maps(i)%remote_elem_shift)) then deallocate (this%element_maps(i)%remote_elem_shift) diff --git a/src/Distributed/VirtualDataManager.f90 b/src/Distributed/VirtualDataManager.f90 index c7c3f87e64e..18dcfb8ad24 100644 --- a/src/Distributed/VirtualDataManager.f90 +++ b/src/Distributed/VirtualDataManager.f90 @@ -3,14 +3,15 @@ module VirtualDataManagerModule use STLVecIntModule use VirtualDataListsModule, only: virtual_model_list, virtual_exchange_list use VirtualBaseModule, only: MAP_NODE_TYPE, MAP_CONN_TYPE - use VirtualModelModule, only: get_virtual_model, get_virtual_model_from_list - use VirtualExchangeModule, only: get_virtual_exchange, & + use VirtualModelModule, only: VirtualModelType, get_virtual_model, & + get_virtual_model_from_list + use VirtualExchangeModule, only: VirtualExchangeType, get_virtual_exchange, & get_virtual_exchange_from_list use VirtualSolutionModule use VirtualDataContainerModule use RouterBaseModule use RouterFactoryModule, only: create_router - use ListsModule, only: basesolutionlist + use ListsModule, only: basesolutionlist, baseconnectionlist use NumericalSolutionModule, only: NumericalSolutionType, & CastAsNumericalSolutionClass use NumericalModelModule, only: NumericalModelType, GetNumericalModelFromList @@ -32,8 +33,8 @@ module VirtualDataManagerModule procedure :: create => vds_create procedure :: init => vds_init procedure :: add_solution => vds_add_solution - procedure :: set_halo => vds_set_halo - procedure :: reduce_halo => vds_reduce_halo + procedure :: activate_halo => vds_activate_halo + procedure :: compress_halo => vds_compress_halo procedure :: synchronize => vds_synchronize procedure :: synchronize_sln => vds_synchronize_sln procedure :: destroy @@ -175,44 +176,30 @@ subroutine vds_add_solution(this, num_sol) end subroutine vds_add_solution - !> @brief Restrict the models and exchanges in the halo - !< to the set that has an actual chance of being used - subroutine vds_set_halo(this) - use ListsModule, only: basesolutionlist - use VirtualDataListsModule - use VirtualModelModule - use VirtualExchangeModule + !> @brief Activates models and exchanges in the halo, + !! i.e. the ones that have an actual chance of being used + subroutine vds_activate_halo(this) class(VirtualDataManagerType) :: this ! local - integer(I4B) :: i, imod, isol, iexg + integer(I4B) :: im, ic, ix type(STLVecInt) :: halo_model_ids class(VirtualModelType), pointer :: vm class(VirtualExchangeType), pointer :: ve class(SpatialModelConnectionType), pointer :: conn - class(*), pointer :: sln_ptr call halo_model_ids%init() ! add halo models to list with ids (unique) - do isol = 1, basesolutionlist%Count() - sln_ptr => basesolutionlist%GetItem(isol) - select type (sln_ptr) - class is (NumericalSolutionType) - do iexg = 1, sln_ptr%exchangelist%Count() - conn => get_smc_from_list(sln_ptr%exchangelist, iexg) - if (.not. associated(conn)) cycle - - ! add halo model ids to the list - do i = 1, conn%halo_models%size - call halo_model_ids%push_back_unique(conn%halo_models%at(i)) - end do - end do - end select + do ic = 1, baseconnectionlist%Count() + conn => get_smc_from_list(baseconnectionlist, ic) + do im = 1, conn%halo_models%size + call halo_model_ids%push_back_unique(conn%halo_models%at(im)) + end do end do ! deactivate models that are not local, and not in halo - do imod = 1, virtual_model_list%Count() - vm => get_virtual_model_from_list(virtual_model_list, imod) + do im = 1, virtual_model_list%Count() + vm => get_virtual_model_from_list(virtual_model_list, im) if (.not. vm%is_local) then if (.not. halo_model_ids%contains(vm%id)) then vm%is_active = .false. @@ -221,32 +208,34 @@ subroutine vds_set_halo(this) end do ! deactivate exchanges that are not local and outside halo - do iexg = 1, virtual_exchange_list%Count() - ve => get_virtual_exchange_from_list(virtual_exchange_list, iexg) - if (ve%v_model1%is_local .or. ve%v_model2%is_local) then - cycle - end if - if (halo_model_ids%contains(ve%v_model1%id) .and. & - halo_model_ids%contains(ve%v_model2%id)) then - cycle + ! (inside halo means both models are part of halo models) + do ix = 1, virtual_exchange_list%Count() + ve => get_virtual_exchange_from_list(virtual_exchange_list, ix) + if (.not. ve%is_local) then + if (.not. halo_model_ids%contains(ve%v_model1%id) .or. & + .not. halo_model_ids%contains(ve%v_model2%id)) then + ve%is_active = .false. + end if end if - - ve%is_active = .false. end do + this%router%halo_activated = .true. + call halo_model_ids%destroy() - end subroutine vds_set_halo + end subroutine vds_activate_halo - !> @brief Reduce the halo for all solutions. This will - !< activate the mapping tables in the virtual data items. - subroutine vds_reduce_halo(this) + !> @brief Compress the halo for all solutions. This will + !! activate the mapping tables in the virtual data items + !< such that only relevant part of data arrays can be sync'ed + subroutine vds_compress_halo(this) + use ArrayHandlersModule, only: ifind use InputOutputModule, only: getunit use SimVariablesModule, only: proc_id use IndexMapModule class(VirtualDataManagerType) :: this ! local - integer(I4B) :: ivm, isol, iexg + integer(I4B) :: ivm, isol, iexg, m_idx integer(I4B) :: outunit character(len=128) :: monitor_file type(VirtualSolutionType), pointer :: virt_sol @@ -287,15 +276,19 @@ subroutine vds_reduce_halo(this) virt_sol => this%virtual_solutions(isol) do ivm = 1, size(virt_sol%models) vdc => virt_sol%models(ivm)%ptr - if (vdc%is_local) cycle - nmap => virt_sol%interface_map%get_node_map(vdc%id) - cmap => virt_sol%interface_map%get_connection_map(vdc%id) - call vdc%set_element_map(nmap%src_idx, MAP_NODE_TYPE) - call vdc%set_element_map(cmap%src_idx, MAP_CONN_TYPE) + if (.not. vdc%is_local .and. vdc%is_active) then + m_idx = ifind(virt_sol%interface_map%model_ids, vdc%id) + if (m_idx == -1) cycle + + nmap => virt_sol%interface_map%get_node_map(vdc%id) + cmap => virt_sol%interface_map%get_connection_map(vdc%id) + call vdc%set_element_map(nmap%src_idx, MAP_NODE_TYPE) + call vdc%set_element_map(cmap%src_idx, MAP_CONN_TYPE) + end if end do end do - end subroutine vds_reduce_halo + end subroutine vds_compress_halo !> @brief Synchronize the full virtual data store for this stage !< diff --git a/src/Model/Connection/SpatialModelConnection.f90 b/src/Model/Connection/SpatialModelConnection.f90 index 062dd3de78c..ff801af11b2 100644 --- a/src/Model/Connection/SpatialModelConnection.f90 +++ b/src/Model/Connection/SpatialModelConnection.f90 @@ -145,7 +145,7 @@ subroutine createModelHalo(this) call this%halo_exchanges%init() call this%addModelNeighbors(this%owner%id, virtual_exchange_list, & - this%exg_stencil_depth) + this%exg_stencil_depth, .true.) end subroutine createModelHalo @@ -153,19 +153,21 @@ end subroutine createModelHalo !< recursive subroutine addModelNeighbors(this, model_id, & virtual_exchanges, & - depth, mask) + depth, is_root, mask) use VirtualExchangeModule, only: get_virtual_exchange class(SpatialModelConnectionType) :: this !< this connection integer(I4B) :: model_id !< the model (id) to add neighbors for type(ListType) :: virtual_exchanges !< list with all virtual exchanges integer(I4B), value :: depth !< the maximal number of exchanges between + logical(LGP) :: is_root !< true when called for neighbor from primary exchange integer(I4B), optional :: mask !< don't add this one as a neighbor ! local integer(I4B) :: i, n class(VirtualExchangeType), pointer :: v_exg integer(I4B) :: neighbor_id integer(I4B) :: model_mask - type(STLVecInt) :: nbr_models + type(STLVecInt) :: models_at_depth !< model ids at a certain depth, to + !! recurse on for nbrs-of-nbrs search if (.not. present(mask)) then model_mask = 0 @@ -173,47 +175,61 @@ recursive subroutine addModelNeighbors(this, model_id, & model_mask = mask end if - call nbr_models%init() - - ! first find all direct neighbors of the model and add them, - ! avoiding duplicates - do i = 1, virtual_exchanges%Count() - neighbor_id = -1 - v_exg => get_virtual_exchange_from_list(virtual_exchanges, i) - if (v_exg%v_model1%id == model_id) then - neighbor_id = v_exg%v_model2%id - else if (v_exg%v_model2%id == model_id) then - neighbor_id = v_exg%v_model1%id - end if + call models_at_depth%init() - ! check if there is a neighbor, and it is not masked - ! (to prevent back-and-forth connections) - if (neighbor_id > 0) then + if (is_root) then + ! first layer in the recursive search + call models_at_depth%push_back_unique(model_id) - ! check if masked - if (neighbor_id == model_mask) cycle - call nbr_models%push_back_unique(neighbor_id) - call this%halo_models%push_back_unique(neighbor_id) - call this%halo_exchanges%push_back_unique(v_exg%id) + ! fetch primary neighbor + if (this%prim_exchange%v_model1%id == this%owner%id) then + neighbor_id = this%prim_exchange%v_model2%id + else + neighbor_id = this%prim_exchange%v_model1%id end if + ! add + call models_at_depth%push_back_unique(neighbor_id) + call this%halo_models%push_back_unique(neighbor_id) + call this%halo_exchanges%push_back_unique(this%prim_exchange%id) + else + ! find all direct neighbors of the model and add them, + ! avoiding duplicates + do i = 1, virtual_exchanges%Count() + neighbor_id = -1 + v_exg => get_virtual_exchange_from_list(virtual_exchanges, i) + if (v_exg%v_model1%id == model_id) then + neighbor_id = v_exg%v_model2%id + else if (v_exg%v_model2%id == model_id) then + neighbor_id = v_exg%v_model1%id + end if - end do + ! check if there is a neighbor, and it is not masked + ! (to prevent back-and-forth connections) + if (neighbor_id > 0) then + ! check if masked + if (neighbor_id == model_mask) cycle + call models_at_depth%push_back_unique(neighbor_id) + call this%halo_models%push_back_unique(neighbor_id) + call this%halo_exchanges%push_back_unique(v_exg%id) + end if + end do + end if depth = depth - 1 if (depth == 0) then ! and we're done with this branch - call nbr_models%destroy() + call models_at_depth%destroy() return end if ! now recurse on the neighbors up to the specified depth - do n = 1, nbr_models%size - call this%addModelNeighbors(nbr_models%at(n), virtual_exchanges, & - depth, model_id) + do n = 1, models_at_depth%size + call this%addModelNeighbors(models_at_depth%at(n), virtual_exchanges, & + depth, .false., model_id) end do ! we're done with the tree - call nbr_models%destroy() + call models_at_depth%destroy() end subroutine addModelNeighbors diff --git a/src/RunControl.f90 b/src/RunControl.f90 index a07b1c5dc19..e17b1b92360 100644 --- a/src/RunControl.f90 +++ b/src/RunControl.f90 @@ -3,9 +3,7 @@ module RunControlModule use SimStagesModule use VirtualDataManagerModule use MapperModule - use ListsModule, only: baseconnectionlist, basesolutionlist - use SpatialModelConnectionModule, only: SpatialModelConnectionType, & - get_smc_from_list + use ListsModule, only: basesolutionlist use NumericalSolutionModule, only: NumericalSolutionType implicit none private @@ -20,11 +18,11 @@ module RunControlModule procedure :: start => ctrl_start procedure :: at_stage => ctrl_at_stage procedure :: finish => ctrl_finish + procedure :: after_con_cr => ctrl_after_con_cr ! private procedure, private :: init_handler - procedure, private :: after_con_cr_handler - procedure, private :: before_con_df_handler - procedure, private :: after_con_df_handler + procedure, private :: before_con_df + procedure, private :: after_con_df procedure, private :: destroy end type RunControlType @@ -71,11 +69,11 @@ subroutine ctrl_at_stage(this, stage) if (stage == STG_BFR_MDL_DF) then call this%init_handler() else if (stage == STG_AFT_CON_CR) then - call this%after_con_cr_handler() + call this%after_con_cr() else if (stage == STG_BFR_CON_DF) then - call this%before_con_df_handler() + call this%before_con_df() else if (stage == STG_AFT_CON_DF) then - call this%after_con_df_handler() + call this%after_con_df() end if call this%virtual_data_mgr%synchronize(stage) @@ -95,12 +93,12 @@ end subroutine init_handler !> @brief Actions after connections have been created !< - subroutine after_con_cr_handler(this) - class(RunControlType), target :: this + subroutine ctrl_after_con_cr(this) + class(RunControlType) :: this - call this%virtual_data_mgr%set_halo() + call this%virtual_data_mgr%activate_halo() - end subroutine after_con_cr_handler + end subroutine ctrl_after_con_cr !> @brief Actions before defining the connections !! @@ -109,7 +107,7 @@ end subroutine after_con_cr_handler !! have been determined. Add them to the virtual data manager !! for synchronization. (After which the interface model !< grids can be constructed) - subroutine before_con_df_handler(this) + subroutine before_con_df(this) class(RunControlType), target :: this ! local integer(I4B) :: i @@ -134,20 +132,20 @@ subroutine before_con_df_handler(this) ! be copied in from the virtual exchanges call this%mapper%add_exchange_vars() - end subroutine before_con_df_handler + end subroutine before_con_df !> @brief Actions after defining connections !< - subroutine after_con_df_handler(this) + subroutine after_con_df(this) class(RunControlType) :: this ! Reduce the halo - call this%virtual_data_mgr%reduce_halo() + call this%virtual_data_mgr%compress_halo() ! Add variables in interface models to the mapper call this%mapper%add_interface_vars() - end subroutine after_con_df_handler + end subroutine after_con_df !> @brief Synchronizes from within numerical solution (delegate) !< diff --git a/src/Utilities/ArrayHandlers.f90 b/src/Utilities/ArrayHandlers.f90 index 2b9c43bbf90..2f8fa17a30d 100644 --- a/src/Utilities/ArrayHandlers.f90 +++ b/src/Utilities/ArrayHandlers.f90 @@ -488,7 +488,7 @@ function ifind_character(array, str) end do findloop end function ifind_character - !> @brief Find the first element containing str, or -1 if not found. + !> @brief Find the first element containing ival, or -1 if not found. function ifind_integer(iarray, ival) ! -- return integer(I4B) :: ifind_integer From fc99eec293c1705b0f72010c048219c3e8d3c34a Mon Sep 17 00:00:00 2001 From: mjr-deltares <45555666+mjr-deltares@users.noreply.github.com> Date: Fri, 19 Apr 2024 21:29:03 +0200 Subject: [PATCH 117/199] - accidentally left logging enabled (#1751) --- src/Distributed/MpiRouter.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Distributed/MpiRouter.f90 b/src/Distributed/MpiRouter.f90 index a68f7c05e07..d6d6727f2ab 100644 --- a/src/Distributed/MpiRouter.f90 +++ b/src/Distributed/MpiRouter.f90 @@ -77,7 +77,7 @@ subroutine mr_initialize(this) this%halo_activated = .false. ! to log or not to log - this%enable_monitor = .true. + this%enable_monitor = .false. ! initialize the MPI message builder and cache call this%message_builder%init() From 82f34c94dc92830085427482d10088b830373f32 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Fri, 19 Apr 2024 16:06:58 -0500 Subject: [PATCH 118/199] fix(gwf-lak): fix and test lakes set to inactive (#1678) * fix(lake status): setting lake to inactive * implement fix for lake status set to inactive * update test * update develop.tex to reflect changes --- autotest/test_gwf_lak_status.py | 314 ++++++++++++++++++++++++++ doc/ReleaseNotes/develop.tex | 1 + src/Model/GroundWaterFlow/gwf-lak.f90 | 83 +++---- 3 files changed, 341 insertions(+), 57 deletions(-) create mode 100644 autotest/test_gwf_lak_status.py diff --git a/autotest/test_gwf_lak_status.py b/autotest/test_gwf_lak_status.py new file mode 100644 index 00000000000..3577c0b883d --- /dev/null +++ b/autotest/test_gwf_lak_status.py @@ -0,0 +1,314 @@ +""" +Test to make sure lakes can be turned on and off using +the STATUS setting. + +This is the configuration, where C is constant head +and L is the lake. +C 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 +1 1 1 L L L 1 1 1 1 +1 1 1 L L L 1 1 1 1 +1 1 1 L L L 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 1 1 1 1 1 +1 1 1 1 1 1 1 1 1 C + +The lake is active for the first and last stress +period and inactive for the second stress period. + +The test checks the lake observations, lake stage +file, lake budget file, and gwf head file. + +""" + +import os +import pathlib as pl + +import flopy +import numpy as np +import pytest + +from framework import DNODATA, TestFramework + +cases = ["gwf-lak-status"] + + +def build_models(idx, test): + nlay, nrow, ncol = 1, 10, 10 + nper = 3 + perlen = nper * [ + 1.0, + ] + nstp = nper * [ + 1, + ] + tsmult = nper * [ + 1.0, + ] + + lenx = 300.0 + delr = delc = lenx / float(nrow) + strt = 100.0 + + nouter, ninner = 100, 300 + hclose, rclose, relax = 1e-9, 1e-3, 0.97 + + tdis_rc = [] + for i in range(nper): + tdis_rc.append((perlen[i], nstp[i], tsmult[i])) + + name = cases[idx] + + # build MODFLOW 6 files + ws = test.workspace + 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 and register the gwf model with it + ims = flopy.mf6.ModflowIms( + sim, + print_option="SUMMARY", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="DBD", + inner_maximum=ninner, + inner_dvclose=hclose, + rcloserecord=rclose, + linear_acceleration="BICGSTAB", + 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=90.0, + botm=0.0, + ) + + # initial conditions + ic = flopy.mf6.ModflowGwfic(gwf, strt=strt) + + # node property flow + npf = flopy.mf6.ModflowGwfnpf( + gwf, save_flows=True, icelltype=1, k=1.0, k33=0.01 + ) + # storage + sto = flopy.mf6.ModflowGwfsto( + gwf, + save_flows=True, + iconvert=1, + ss=0.0, + sy=0.1, + steady_state={0: True}, + ) + + # chd files + chdlist0 = [] + chdlist0.append([(0, 0, 0), 100.0]) + chdlist0.append([(0, nrow - 1, ncol - 1), 95.0]) + + chdspdict = {0: chdlist0} + chd = flopy.mf6.ModflowGwfchd( + gwf, + stress_period_data=chdspdict, + save_flows=False, + ) + + # [] [] + packagedata = [ + [0, 100.0, 9, "lake1"], + ] + # + bedleak = 1.0 + connectiondata = [ + [0, 0, (0, 3, 3), "vertical", bedleak, 0.0, 0.0, 0.0, 0.0], + [0, 1, (0, 3, 4), "vertical", bedleak, 0.0, 0.0, 0.0, 0.0], + [0, 2, (0, 3, 5), "vertical", bedleak, 0.0, 0.0, 0.0, 0.0], + [0, 3, (0, 4, 3), "vertical", bedleak, 0.0, 0.0, 0.0, 0.0], + [0, 4, (0, 4, 4), "vertical", bedleak, 0.0, 0.0, 0.0, 0.0], + [0, 5, (0, 4, 5), "vertical", bedleak, 0.0, 0.0, 0.0, 0.0], + [0, 6, (0, 5, 3), "vertical", bedleak, 0.0, 0.0, 0.0, 0.0], + [0, 7, (0, 5, 4), "vertical", bedleak, 0.0, 0.0, 0.0, 0.0], + [0, 8, (0, 5, 5), "vertical", bedleak, 0.0, 0.0, 0.0, 0.0], + ] + lak_spd = { + 0: [[0, "rainfall", 0.1]], + 1: [[0, "status", "inactive"]], + 2: [[0, "status", "active"]], + } + + # note: for specifying lake number, use fortran indexing! + fname = f"{name}.lak.obs.csv" + lak_obs = { + fname: [ + ("lakestage", "stage", 1), + ("lakevolume", "volume", 1), + ("lak1", "lak", "lake1"), + ], + "digits": 10, + } + lak = flopy.mf6.ModflowGwflak( + gwf, + boundnames=True, + surfdep=1.0, + print_input=True, + print_stage=True, + print_flows=True, + save_flows=True, + stage_filerecord=f"{name}.lak.stage", + budget_filerecord=f"{name}.lak.bud", + nlakes=len(packagedata), + packagedata=packagedata, + connectiondata=connectiondata, + perioddata=lak_spd, + observations=lak_obs, + ) + + # output control + oc = flopy.mf6.ModflowGwfoc( + gwf, + head_filerecord=f"{name}.hds", + budget_filerecord=f"{name}.cbc", + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + printrecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + ) + + return sim, None + + +def check_budget_file(idx, test): + # lak budget + name = cases[idx] + fpth = test.workspace / f"{name}.lak.bud" + print(f"Checking contents of {fpth.name}") + bobj = flopy.utils.CellBudgetFile(fpth, precision="double") + times = bobj.get_times() + print(bobj.list_unique_records()) + + # check to make sure GWF is zero when lake is inactive + # and non-zero otherwise + for kper in range(3): + print(f" Checking binary budget for stress period {kper + 1}") + record = bobj.get_data(text="GWF", totim=times[kper])[0] + for r in record: + if kper == 1: + assert r["q"] == 0.0 + else: + assert r["q"] != 0.0 + + # check all the other terms to make sure they are zero for + # the second period + lake_terms = [ + "rainfall", + "evaporation", + "ext-inflow", + "withdrawal", + "ext-outflow", + "storage", + "constant", + ] + for lake_term in lake_terms: + print(f" Checking lake term {lake_term} for period 2.") + record = bobj.get_data(text=lake_term, totim=times[1])[0] + q = record["q"][0] + msg = f"Lake term for stress period 2 is not zero ({lake_term}={q})" + assert np.allclose(q, 0.0), msg + + +def check_stage_file(idx, test): + # Check to make sure the stage is equal to dhnoflo + # for stress period 2 and not dhnoflo otherwise + dhnoflo = 1.0e30 + name = cases[idx] + fpth = test.workspace / f"{name}.lak.stage" + print(f"Checking contents of {fpth.name}") + bobj = flopy.utils.HeadFile(fpth, text="stage", precision="double") + times = bobj.get_times() + for kper in range(3): + print(f" Checking binary stage for stress period {kper + 1}") + stage = bobj.get_data(totim=times[kper]).flatten() + print(stage) + if kper == 1: + assert stage[0] == dhnoflo + else: + assert stage[0] != dhnoflo + + +def check_head_file(idx, test): + # Check to make sure the simulated head for the first and + # last period is the same and different from the second period. + name = cases[idx] + fpth = test.workspace / f"{name}.hds" + print(f"Checking contents of {fpth.name}") + bobj = flopy.utils.HeadFile(fpth, text="head", precision="double") + times = bobj.get_times() + + head0 = bobj.get_data(totim=times[0]).flatten() + head1 = bobj.get_data(totim=times[1]).flatten() + head2 = bobj.get_data(totim=times[2]).flatten() + + assert np.allclose( + head0, head2 + ), "Simulated heads for period 1 and 3 should be the same" + assert np.all( + np.less_equal(head1, 100.0) + ), f"Simulated heads for period 2 should be less than or equal to 100. {head1}" + assert np.any( + np.greater(head0, 100.0) + ), f"Some simulated heads for period 1 should be greater than 100. {head0}" + + +def check_lake_obs(idx, test): + # Check to make sure the simulated head for the first and + # last period is the same and different from the second period. + dnodata = 3.0e30 + name = cases[idx] + fpth = test.workspace / f"{name}.lak.obs.csv" + print(f"Checking contents of {fpth.name}") + obs = np.genfromtxt(fpth, names=True, delimiter=",") + stage = obs["LAKESTAGE"].tolist() + print(stage) + assert ( + stage[0] == stage[2] + ), "Period 1 and period 3 stages should be equal." + assert stage[1] == dnodata, "Period 2 stage should equal dnodata" + + +def check_output(idx, test): + check_lake_obs(idx, test) + check_head_file(idx, test) + check_stage_file(idx, test) + check_budget_file(idx, test) + + +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + xfail="fail" in str(function_tmpdir), + ) + test.run() diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index 9036ed2a22c..45faa5eba35 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -45,6 +45,7 @@ \item When using the mover transport (MVT) package with UZF and UZT, rejected infiltration was paired with the calculated concentration of the UZF object rather than the user-specified concentration assigned to the infiltration. This bug was fixed by instead pairing the rejected infiltration transferred by the MVR and MVT packages with the user-specified concentration assigned in UZTSETTING with the keyword ``INFILTRATION.'' With this change, MODFLOW 6 simulations that use UZF with the ``SIMULATE\_GWSEEP'' option will not transfer this particular source of water with the correct concentration. Instead, the DRN package should be used to simulate groundwater discharge to land surface. By simulating groundwater discharge to land surface with the DRN package and rejected infiltration with the UZF package, the correct concentrations will be assigned to the water transferred by the MVR package. \item The SIMULATE\_GWSEEP variable in the UZF package OPTIONS block will eventually be deprecated. The same functionality may be achieved using an option available within the DRN package called AUXDEPTHNAME. The details of the drainage option are given in the supplemental technical information document (mf6suptechinfo) provided with the release. Deprecation of the SIMULATE\_GWSEEP option is motivated by the potential for errors noted above. \item The Streamflow Routing package would not calculate groundwater discharge to a reach in cases where the groundwater head is above the top of the reach and the inflow to the reach from upstream reaches, specified inflows, rainfall, and runoff is zero. This bug has been fixed by eliminating the requirement that the conductance calculated based on the initial calculated stage is greater than zero in order to solve for groundwater . Instead, .As a result, differences in groundwater and surface-water exchange and groundwater heads in existing models may occur. + \item The capability to inactivate lakes (using the STATUS INACTIVE setting) did not work properly for the GWF Lake Package. The Lake Package was fixed so that inactive lakes have a zero flow value with connected GWF model cells and that the lake stage is assigned the inactive value (1.E30). The listing, budget, and observation files were modifed to accurately report inactive lakes. % \item xxx \end{itemize} diff --git a/src/Model/GroundWaterFlow/gwf-lak.f90 b/src/Model/GroundWaterFlow/gwf-lak.f90 index c73a03360f1..964fa016a8d 100644 --- a/src/Model/GroundWaterFlow/gwf-lak.f90 +++ b/src/Model/GroundWaterFlow/gwf-lak.f90 @@ -238,7 +238,6 @@ module LakModule procedure, private :: lak_check_valid procedure, private :: lak_set_stressperiod procedure, private :: lak_set_attribute_error - procedure, private :: lak_cfupdate procedure, private :: lak_bound_update procedure, private :: lak_calculate_sarea procedure, private :: lak_calculate_warea @@ -3610,9 +3609,6 @@ subroutine lak_cf(this) integer(I4B) :: igwfnode real(DP) :: hlak, blak ! - ! -- Calculate lak conductance and update package RHS and HCOF - !call this%lak_cfupdate() - ! ! -- save groundwater seepage for lake solution do n = 1, this%nlakes this%seep0(n) = this%seep(n) @@ -3711,6 +3707,7 @@ subroutine lak_fc(this, rhs, ia, idxglo, matrix_sln) ! ! -- add terms to the gwf matrix do n = 1, this%nlakes + if (this%iboundpak(n) == 0) cycle do j = this%idxlakeconn(n), this%idxlakeconn(n + 1) - 1 igwfnode = this%cellid(j) if (this%ibound(igwfnode) < 1) cycle @@ -4170,7 +4167,6 @@ subroutine lak_cq(this, x, flowja, iadv) ! ! -- gwf flow and constant flow to lake do n = 1, this%nlakes - if (this%iboundpak(n) == 0) cycle rrate = DZERO do j = this%idxlakeconn(n), this%idxlakeconn(n + 1) - 1 ! simvals is from aquifer perspective, and so it is positive @@ -4178,7 +4174,9 @@ subroutine lak_cq(this, x, flowja, iadv) ! perspective. rrate = -this%simvals(j) this%qleak(j) = rrate - call this%lak_accumulate_chterm(n, rrate, chratin, chratout) + if (this%iboundpak(n) /= 0) then + call this%lak_accumulate_chterm(n, rrate, chratin, chratout) + end if end do end do ! @@ -4282,10 +4280,17 @@ subroutine lak_ot_dv(this, idvsave, idvprint) ! ! -- write data do n = 1, this%nlakes - stage = this%xnewpak(n) - call this%lak_calculate_sarea(n, stage, sa) - call this%lak_calculate_warea(n, stage, wa) - call this%lak_calculate_vol(n, stage, v) + if (this%iboundpak(n) == 0) then + stage = DHNOFLO + sa = DHNOFLO + wa = DHNOFLO + v = DHNOFLO + else + stage = this%xnewpak(n) + call this%lak_calculate_sarea(n, stage, sa) + call this%lak_calculate_warea(n, stage, wa) + call this%lak_calculate_vol(n, stage, v) + end if if (this%inamedbound == 1) then call this%stagetab%add_term(this%lakename(n)) end if @@ -5070,51 +5075,6 @@ subroutine lak_accumulate_chterm(this, ilak, rrate, chratin, chratout) return end subroutine lak_accumulate_chterm - !> @brief Update LAK satcond and package rhs and hcof - !< - subroutine lak_cfupdate(this) - ! -- dummy - class(LakType), intent(inout) :: this - ! -- local - integer(I4B) :: j, n, node - real(DP) :: hlak, head, clak, blak - ! - ! -- Return if no lak lakes - if (this%nbound .eq. 0) return - ! - ! -- Calculate hcof and rhs for each lak entry - do n = 1, this%nlakes - hlak = this%xnewpak(n) - do j = this%idxlakeconn(n), this%idxlakeconn(n + 1) - 1 - node = this%cellid(j) - head = this%xnew(node) - - this%hcof(j) = DZERO - this%rhs(j) = DZERO - ! - ! -- set bound, hcof, and rhs components - call this%lak_calculate_conn_conductance(n, j, hlak, head, clak) - this%simcond(j) = clak - - this%bound(2, j) = clak - - blak = this%bound(3, j) - - this%hcof(j) = -clak - ! - ! -- fill rhs - if (hlak < blak) then - this%rhs(j) = -clak * blak - else - this%rhs(j) = -clak * hlak - end if - end do - end do - ! - ! -- Return - return - end subroutine lak_cfupdate - !> @brief Store the lake head and connection conductance in the bound array !< subroutine lak_bound_update(this) @@ -5281,9 +5241,13 @@ subroutine lak_solve(this, update) this%flwiter(n) = this%flwin(n) this%flwiter1(n) = this%flwin(n) if (this%gwfiss /= 0) then - this%flwiter(n) = DEP20 !1.D+10 - this%flwiter1(n) = DEP20 !1.D+10 + this%flwiter(n) = DEP20 + this%flwiter1(n) = DEP20 end if + do j = this%idxlakeconn(n), this%idxlakeconn(n + 1) - 1 + this%hcof(j) = DZERO + this%rhs(j) = DZERO + end do end do ! estseep: do i = 1, 2 @@ -5335,6 +5299,11 @@ subroutine lak_solve(this, update) end do estseep ! laklevel: do n = 1, this%nlakes + ! -- skip inactive lakes + if (this%iboundpak(n) == 0) then + this%ncncvr(n) = 1 + cycle laklevel + end if ibflg = 0 hlak = this%xnewpak(n) if (iter < maxiter) then From 9ce6787e2713e6904d2e976fe3af5636280ede4c Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Fri, 19 Apr 2024 21:41:59 -0500 Subject: [PATCH 119/199] feat(sfr): add time varying bed hydraulic conductivity option (#1747) * add BEDK sfrsetting in period block * add test of bedk with and without timeseries * update release notes * fix sfr rain observations for inactive reaches --- autotest/test_gwf_sfr_tbedk.py | 196 ++++++++++++++++++ doc/ReleaseNotes/develop.tex | 6 +- doc/mf6io/mf6ivar/dfn/gwf-sfr.dfn | 20 +- doc/mf6io/mf6ivar/md/mf6ivar.md | 5 +- doc/mf6io/mf6ivar/tex/gwf-sfr-desc.tex | 7 +- doc/mf6io/mf6ivar/tex/gwf-sfr-packagedata.dat | 4 +- src/Model/GroundWaterFlow/gwf-sfr.f90 | 42 +++- 7 files changed, 258 insertions(+), 22 deletions(-) create mode 100644 autotest/test_gwf_sfr_tbedk.py diff --git a/autotest/test_gwf_sfr_tbedk.py b/autotest/test_gwf_sfr_tbedk.py new file mode 100644 index 00000000000..ece1c4defb8 --- /dev/null +++ b/autotest/test_gwf_sfr_tbedk.py @@ -0,0 +1,196 @@ +# Test evap in SFR reaches (no interaction with gwf) + +import math +import pathlib as pl + +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +cases = [ + "sfr-bedk", + "sfr-bedkts", + "sfr-rhkts", +] + + +def build_models(idx, test): + # Base simulation and model name and workspace + ws = test.workspace + name = cases[idx] + + length_units = "m" + time_units = "sec" + + nrow = 1 + ncol = 1 + nlay = 1 + delr = delc = 1.0 + + nper = 4 + tds_spd = [ + (1.0, 1, 1.0), + (1.0, 1, 1.0), + (1.0, 1, 1.0), + (1.0, 1, 1.0), + ] + + sim = flopy.mf6.MFSimulation( + sim_name=name, sim_ws=ws, exe_name="mf6", version="mf6" + ) + flopy.mf6.ModflowTdis( + sim, + time_units=time_units, + nper=nper, + perioddata=tds_spd, + ) + flopy.mf6.ModflowIms( + sim, + outer_dvclose=1e-5, + inner_dvclose=1e-6, + ) + + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=name, + ) + flopy.mf6.ModflowGwfdis( + gwf, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=0.0, + botm=-100.0, + ) + flopy.mf6.ModflowGwfnpf( + gwf, + icelltype=1, # >0 means saturated thickness varies with computed head + ) + flopy.mf6.ModflowGwfic(gwf, strt=1.0) + flopy.mf6.ModflowGwfghb(gwf, stress_period_data=[((0, 0, 0), 1.0, 1e6)]) + + # sfr data + nreaches = 2 + + # + if idx < 2: + rhk1 = 0.0 + rhk2 = 0.0 + else: + rhk1 = "bedk1" + rhk2 = "bedk2" + package_data = [ + (0, (0, 0, 0), delr, 1.0, 1e-3, 0.0, 1.0, rhk1, 0.001, 0, 0.0, 0), + (1, (0, 0, 0), delr, 1.0, 1e-3, 0.0, 1.0, rhk2, 0.001, 0, 0.0, 0), + ] + connection_data = [ + (0,), + (1,), + ] + + if idx == 0: + timeseries = False + sfr_spd = { + 0: [ + (1, "bedk", 10.0), + ], + 1: [ + (0, "bedk", 1.0), + (1, "bedk", 5.0), + ], + 2: [ + (0, "bedk", 5.0), + (1, "bedk", 1.0), + ], + 3: [ + (0, "bedk", 10.0), + (1, "bedk", 0.0), + ], + } + else: + timeseries = True + ts_names = ["bedk1", "bedk2"] + ts_methods = ["linearend"] * len(ts_names) + ts_data = [ + (0.0, 0.0, 10.0), + (1.0, 0.0, 10.0), + (2.0, 1.0, 5.0), + (3.0, 5.0, 1.0), + (4.0, 10.0, 0.0), + ] + if idx < 2: + sfr_spd = { + 0: [ + (0, "bedk", "bedk1"), + (1, "bedk", "bedk2"), + ] + } + else: + sfr_spd = None + + sfr_obs = { + f"{name}.sfr.obs.csv": [ + ("gwfr1", "sfr", (0,)), + ("gwfr2", "sfr", (1,)), + ], + "filename": f"{name}.sfr.obs", + } + + sfr = flopy.mf6.ModflowGwfsfr( + gwf, + print_stage=True, + print_flows=True, + print_input=True, + length_conversion=1.0, + time_conversion=1.0, + nreaches=nreaches, + packagedata=package_data, + connectiondata=connection_data, + perioddata=sfr_spd, + observations=sfr_obs, + pname="SFR-1", + ) + + if timeseries: + sfr.ts.initialize( + filename=f"{name}.sfr.ts", + timeseries=ts_data, + time_series_namerecord=ts_names, + interpolation_methodrecord=ts_methods, + ) + + flopy.mf6.ModflowGwfoc( + gwf, + printrecord=[("head", "all"), ("budget", "all")], + ) + + return sim, None + + +def check_output(idx, test): + sim = flopy.mf6.MFSimulation.load(sim_ws=test.workspace) + gwf = sim.get_model() + sfr = gwf.get_package("SFR-1") + obs_data = sfr.output.obs().get_data() + o1 = obs_data["GWFR1"] + o2 = obs_data["GWFR2"][::-1] + assert np.allclose( + o1, o2 + ), f"GWFR1 ({o1}) not equal to reversed GWFR2 ({o2})" + + +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index 45faa5eba35..ae0879ad0f0 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -7,7 +7,7 @@ \begin{itemize} \item A new Groundwater Energy (GWE) transport model is introduced to the code base for simulating heat transport in the subsurface. Additional information for activating the GWE model type within a MODFLOW 6 simulation is available within the mf6io.pdf document. New example problems have been developed for testing and demonstrating GWE capabilities (in addition to other internal tests that help verify the accuracy of GWE); however, additional changes to the code and input may be necessary in response to user needs and further testing. \item A new capability has been introduced to create parameter layer export files of user input data for packages including DIS, DISV, IC, NPF, DSP(GWT), MIP(PRT), and CND(GWE). The number of supported packages is expected to increase in the future. The capability can be turned on with the package EXPORT\_ARRAY\_ASCII option. The package parameter export set is pre-defined and currently focuses on griddata. The number of parameters per package may also increase in the future. - % \item xxx + \item Add capability to vary the hydraulic conductivity of the reach streambed (RHK) by stress period in the Streamflow Routing (SFR) package. RHK can be modified by stress period using the BEDK SFRSETTING. RHK can also be defined using a timeseries string in the PACKAGEDATA or PERIOD blocks. \end{itemize} %\underline{EXAMPLES} @@ -44,8 +44,10 @@ \item A divide by zero error would occur in the Streamflow Routing package when reaches were deactivated during a simulation. This bug was fixed by checking if the downstream reach is inactive before calculating the flow to the downstream reach. \item When using the mover transport (MVT) package with UZF and UZT, rejected infiltration was paired with the calculated concentration of the UZF object rather than the user-specified concentration assigned to the infiltration. This bug was fixed by instead pairing the rejected infiltration transferred by the MVR and MVT packages with the user-specified concentration assigned in UZTSETTING with the keyword ``INFILTRATION.'' With this change, MODFLOW 6 simulations that use UZF with the ``SIMULATE\_GWSEEP'' option will not transfer this particular source of water with the correct concentration. Instead, the DRN package should be used to simulate groundwater discharge to land surface. By simulating groundwater discharge to land surface with the DRN package and rejected infiltration with the UZF package, the correct concentrations will be assigned to the water transferred by the MVR package. \item The SIMULATE\_GWSEEP variable in the UZF package OPTIONS block will eventually be deprecated. The same functionality may be achieved using an option available within the DRN package called AUXDEPTHNAME. The details of the drainage option are given in the supplemental technical information document (mf6suptechinfo) provided with the release. Deprecation of the SIMULATE\_GWSEEP option is motivated by the potential for errors noted above. - \item The Streamflow Routing package would not calculate groundwater discharge to a reach in cases where the groundwater head is above the top of the reach and the inflow to the reach from upstream reaches, specified inflows, rainfall, and runoff is zero. This bug has been fixed by eliminating the requirement that the conductance calculated based on the initial calculated stage is greater than zero in order to solve for groundwater . Instead, .As a result, differences in groundwater and surface-water exchange and groundwater heads in existing models may occur. \item The capability to inactivate lakes (using the STATUS INACTIVE setting) did not work properly for the GWF Lake Package. The Lake Package was fixed so that inactive lakes have a zero flow value with connected GWF model cells and that the lake stage is assigned the inactive value (1.E30). The listing, budget, and observation files were modifed to accurately report inactive lakes. + \item The Streamflow Routing package would not calculate groundwater discharge to a reach in cases where the groundwater head is above the top of the reach and the inflow to the reach from upstream reaches, specified inflows, rainfall, and runoff is zero. This bug has been fixed by eliminating the requirement that the conductance calculated based on the initial calculated stage is greater than zero in order to solve for groundwater. As a result, differences in groundwater and surface-water exchange and groundwater heads in existing models may occur. + \item The Streamflow Routing package stage tables written to the model listing file have been modified so that inactive reaches are identified to be INACTIVE and dry reaches are identified to be DRY. + \item The Streamflow Routing package would not correctly report reach flow terms for unconnected reaches even though reach flows were correctly calculated. This bug has been fixed by modifying the budget routine so that it correctly reports unconnected reach flows in the model listing file and cell-by-cell budget files. Simulated groundwater flow results should not change but differences may be observed in post-processed results and transport simulations that rely on binary cell-by-cell data. % \item xxx \end{itemize} diff --git a/doc/mf6io/mf6ivar/dfn/gwf-sfr.dfn b/doc/mf6io/mf6ivar/dfn/gwf-sfr.dfn index 24da890760e..eb3967e441d 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-sfr.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-sfr.dfn @@ -427,8 +427,9 @@ shape tagged false in_record true reader urword -longname -description real value that defines the hydraulic conductivity of the reach streambed. RHK can be any positive value if the reach is not connected to an underlying GWF cell. Otherwise, RHK must be greater than zero. +time_series true +longname reach bed hydraulic conductivity +description real or character value that defines the hydraulic conductivity of the reach streambed. RHK can be any positive value if the reach is not connected to an underlying GWF cell. Otherwise, RHK must be greater than zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. block packagedata name man @@ -677,13 +678,13 @@ numeric_index true block period name sfrsetting -type keystring status manning stage inflow rainfall evaporation runoff diversionrecord upstream_fraction cross_sectionrecord auxiliaryrecord +type keystring status bedk manning stage inflow rainfall evaporation runoff diversionrecord upstream_fraction cross_sectionrecord auxiliaryrecord shape tagged false in_record true reader urword longname -description line of information that is parsed into a keyword and values. Keyword values that can be used to start the SFRSETTING string include: STATUS, MANNING, STAGE, INFLOW, RAINFALL, EVAPORATION, RUNOFF, DIVERSION, UPSTREAM\_FRACTION, and AUXILIARY. +description line of information that is parsed into a keyword and values. Keyword values that can be used to start the SFRSETTING string include: STATUS, BEDK, MANNING, STAGE, INFLOW, RAINFALL, EVAPORATION, RUNOFF, DIVERSION, UPSTREAM\_FRACTION, and AUXILIARY. block period name status @@ -695,6 +696,17 @@ reader urword longname well status description keyword option to define stream reach status. STATUS can be ACTIVE, INACTIVE, or SIMPLE. The SIMPLE STATUS option simulates streamflow using a user-specified stage for a reach or a stage set to the top of the reach (depth = 0). In cases where the simulated leakage calculated using the specified stage exceeds the sum of inflows to the reach, the stage is set to the top of the reach and leakage is set equal to the sum of inflows. Upstream fractions should be changed using the UPSTREAM\_FRACTION SFRSETTING if the status for one or more reaches is changed to ACTIVE or INACTIVE. For example, if one of two downstream connections for a reach is inactivated, the upstream fraction for the active and inactive downstream reach should be changed to 1.0 and 0.0, respectively, to ensure that the active reach receives all of the downstream outflow from the upstream reach. By default, STATUS is ACTIVE. +block period +name bedk +type string +shape +tagged true +in_record true +reader urword +time_series true +longname reach bed hydraulic conductivity +description real or character value that defines the hydraulic conductivity of the reach streambed. BEDK can be any positive value if the reach is not connected to an underlying GWF cell. Otherwise, BEDK must be greater than zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. + block period name manning type string diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index e6850222c48..4390cd2ff52 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -1039,7 +1039,7 @@ | GWF | SFR | PACKAGEDATA | RGRD | DOUBLE PRECISION | real value that defines the stream gradient (slope) across the reach. RGRD must be greater than zero. | | GWF | SFR | PACKAGEDATA | RTP | DOUBLE PRECISION | real value that defines the bottom elevation of the reach. | | GWF | SFR | PACKAGEDATA | RBTH | DOUBLE PRECISION | real value that defines the thickness of the reach streambed. RBTH can be any value if the reach is not connected to an underlying GWF cell. Otherwise, RBTH must be greater than zero. | -| GWF | SFR | PACKAGEDATA | RHK | DOUBLE PRECISION | real value that defines the hydraulic conductivity of the reach streambed. RHK can be any positive value if the reach is not connected to an underlying GWF cell. Otherwise, RHK must be greater than zero. | +| GWF | SFR | PACKAGEDATA | RHK | DOUBLE PRECISION | real or character value that defines the hydraulic conductivity of the reach streambed. RHK can be any positive value if the reach is not connected to an underlying GWF cell. Otherwise, RHK must be greater than zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | | GWF | SFR | PACKAGEDATA | MAN | STRING | real or character value that defines the Manning's roughness coefficient for the reach. MAN must be greater than zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | | GWF | SFR | PACKAGEDATA | NCON | INTEGER | integer value that defines the number of reaches connected to the reach. If a value of zero is specified for NCON an entry for IFNO is still required in the subsequent CONNECTIONDATA block. | | GWF | SFR | PACKAGEDATA | USTRF | DOUBLE PRECISION | real value that defines the fraction of upstream flow from each upstream reach that is applied as upstream inflow to the reach. The sum of all USTRF values for all reaches connected to the same upstream reach must be equal to one and USTRF must be greater than or equal to zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | @@ -1058,8 +1058,9 @@ | GWF | SFR | DIVERSIONS | CPRIOR | STRING | character string value that defines the the prioritization system for the diversion, such as when insufficient water is available to meet all diversion stipulations, and is used in conjunction with the value of FLOW value specified in the STRESS\_PERIOD\_DATA section. Available diversion options include: (1) CPRIOR = `FRACTION', then the amount of the diversion is computed as a fraction of the streamflow leaving reach IFNO ($Q_{DS}$); in this case, 0.0 $\le$ DIVFLOW $\le$ 1.0. (2) CPRIOR = `EXCESS', a diversion is made only if $Q_{DS}$ for reach IFNO exceeds the value of DIVFLOW. If this occurs, then the quantity of water diverted is the excess flow ($Q_{DS} -$ DIVFLOW) and $Q_{DS}$ from reach IFNO is set equal to DIVFLOW. This represents a flood-control type of diversion, as described by Danskin and Hanson (2002). (3) CPRIOR = `THRESHOLD', then if $Q_{DS}$ in reach IFNO is less than the specified diversion flow DIVFLOW, no water is diverted from reach IFNO. If $Q_{DS}$ in reach IFNO is greater than or equal to DIVFLOW, DIVFLOW is diverted and $Q_{DS}$ is set to the remainder ($Q_{DS} -$ DIVFLOW)). This approach assumes that once flow in the stream is sufficiently low, diversions from the stream cease, and is the `priority' algorithm that originally was programmed into the STR1 Package (Prudic, 1989). (4) CPRIOR = `UPTO' -- if $Q_{DS}$ in reach IFNO is greater than or equal to the specified diversion flow DIVFLOW, $Q_{DS}$ is reduced by DIVFLOW. If $Q_{DS}$ in reach IFNO is less than DIVFLOW, DIVFLOW is set to $Q_{DS}$ and there will be no flow available for reaches connected to downstream end of reach IFNO. | | GWF | SFR | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | | GWF | SFR | PERIOD | IFNO | INTEGER | integer value that defines the feature (reach) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NREACHES. | -| GWF | SFR | PERIOD | SFRSETTING | KEYSTRING | line of information that is parsed into a keyword and values. Keyword values that can be used to start the SFRSETTING string include: STATUS, MANNING, STAGE, INFLOW, RAINFALL, EVAPORATION, RUNOFF, DIVERSION, UPSTREAM\_FRACTION, and AUXILIARY. | +| GWF | SFR | PERIOD | SFRSETTING | KEYSTRING | line of information that is parsed into a keyword and values. Keyword values that can be used to start the SFRSETTING string include: STATUS, BEDK, MANNING, STAGE, INFLOW, RAINFALL, EVAPORATION, RUNOFF, DIVERSION, UPSTREAM\_FRACTION, and AUXILIARY. | | GWF | SFR | PERIOD | STATUS | STRING | keyword option to define stream reach status. STATUS can be ACTIVE, INACTIVE, or SIMPLE. The SIMPLE STATUS option simulates streamflow using a user-specified stage for a reach or a stage set to the top of the reach (depth = 0). In cases where the simulated leakage calculated using the specified stage exceeds the sum of inflows to the reach, the stage is set to the top of the reach and leakage is set equal to the sum of inflows. Upstream fractions should be changed using the UPSTREAM\_FRACTION SFRSETTING if the status for one or more reaches is changed to ACTIVE or INACTIVE. For example, if one of two downstream connections for a reach is inactivated, the upstream fraction for the active and inactive downstream reach should be changed to 1.0 and 0.0, respectively, to ensure that the active reach receives all of the downstream outflow from the upstream reach. By default, STATUS is ACTIVE. | +| GWF | SFR | PERIOD | BEDK | STRING | real or character value that defines the hydraulic conductivity of the reach streambed. BEDK can be any positive value if the reach is not connected to an underlying GWF cell. Otherwise, BEDK must be greater than zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | | GWF | SFR | PERIOD | MANNING | STRING | real or character value that defines the Manning's roughness coefficient for the reach. MANNING must be greater than zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | | GWF | SFR | PERIOD | STAGE | STRING | real or character value that defines the stage for the reach. The specified STAGE is only applied if the reach uses the simple routing option. If STAGE is not specified for reaches that use the simple routing option, the specified stage is set to the top of the reach. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | | GWF | SFR | PERIOD | INFLOW | STRING | real or character value that defines the volumetric inflow rate for the streamflow routing reach. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. By default, inflow rates are zero for each reach. | diff --git a/doc/mf6io/mf6ivar/tex/gwf-sfr-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-sfr-desc.tex index 2f72a3458a2..a938349d32f 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-sfr-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-sfr-desc.tex @@ -79,7 +79,7 @@ \item \texttt{rbth}---real value that defines the thickness of the reach streambed. RBTH can be any value if the reach is not connected to an underlying GWF cell. Otherwise, RBTH must be greater than zero. -\item \texttt{rhk}---real value that defines the hydraulic conductivity of the reach streambed. RHK can be any positive value if the reach is not connected to an underlying GWF cell. Otherwise, RHK must be greater than zero. +\item \textcolor{blue}{\texttt{rhk}---real or character value that defines the hydraulic conductivity of the reach streambed. RHK can be any positive value if the reach is not connected to an underlying GWF cell. Otherwise, RHK must be greater than zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} \item \textcolor{blue}{\texttt{man}---real or character value that defines the Manning's roughness coefficient for the reach. MAN must be greater than zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} @@ -133,10 +133,11 @@ \item \texttt{ifno}---integer value that defines the feature (reach) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NREACHES. -\item \texttt{sfrsetting}---line of information that is parsed into a keyword and values. Keyword values that can be used to start the SFRSETTING string include: STATUS, MANNING, STAGE, INFLOW, RAINFALL, EVAPORATION, RUNOFF, DIVERSION, UPSTREAM\_FRACTION, and AUXILIARY. +\item \texttt{sfrsetting}---line of information that is parsed into a keyword and values. Keyword values that can be used to start the SFRSETTING string include: STATUS, BEDK, MANNING, STAGE, INFLOW, RAINFALL, EVAPORATION, RUNOFF, DIVERSION, UPSTREAM\_FRACTION, and AUXILIARY. \begin{lstlisting}[style=blockdefinition] STATUS +BEDK <@bedk@> MANNING <@manning@> STAGE <@stage@> INFLOW <@inflow@> @@ -151,6 +152,8 @@ \item \texttt{status}---keyword option to define stream reach status. STATUS can be ACTIVE, INACTIVE, or SIMPLE. The SIMPLE STATUS option simulates streamflow using a user-specified stage for a reach or a stage set to the top of the reach (depth = 0). In cases where the simulated leakage calculated using the specified stage exceeds the sum of inflows to the reach, the stage is set to the top of the reach and leakage is set equal to the sum of inflows. Upstream fractions should be changed using the UPSTREAM\_FRACTION SFRSETTING if the status for one or more reaches is changed to ACTIVE or INACTIVE. For example, if one of two downstream connections for a reach is inactivated, the upstream fraction for the active and inactive downstream reach should be changed to 1.0 and 0.0, respectively, to ensure that the active reach receives all of the downstream outflow from the upstream reach. By default, STATUS is ACTIVE. +\item \textcolor{blue}{\texttt{bedk}---real or character value that defines the hydraulic conductivity of the reach streambed. BEDK can be any positive value if the reach is not connected to an underlying GWF cell. Otherwise, BEDK must be greater than zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} + \item \textcolor{blue}{\texttt{manning}---real or character value that defines the Manning's roughness coefficient for the reach. MANNING must be greater than zero. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} \item \textcolor{blue}{\texttt{stage}---real or character value that defines the stage for the reach. The specified STAGE is only applied if the reach uses the simple routing option. If STAGE is not specified for reaches that use the simple routing option, the specified stage is set to the top of the reach. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value.} diff --git a/doc/mf6io/mf6ivar/tex/gwf-sfr-packagedata.dat b/doc/mf6io/mf6ivar/tex/gwf-sfr-packagedata.dat index dd18612d650..0a759449156 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-sfr-packagedata.dat +++ b/doc/mf6io/mf6ivar/tex/gwf-sfr-packagedata.dat @@ -1,5 +1,5 @@ BEGIN PACKAGEDATA - <@man@> <@ustrf@> [<@aux(naux)@>] [] - <@man@> <@ustrf@> [<@aux(naux)@>] [] + <@rhk@> <@man@> <@ustrf@> [<@aux(naux)@>] [] + <@rhk@> <@man@> <@ustrf@> [<@aux(naux)@>] [] ... END PACKAGEDATA diff --git a/src/Model/GroundWaterFlow/gwf-sfr.f90 b/src/Model/GroundWaterFlow/gwf-sfr.f90 index ac3f5163420..90190eb2758 100644 --- a/src/Model/GroundWaterFlow/gwf-sfr.f90 +++ b/src/Model/GroundWaterFlow/gwf-sfr.f90 @@ -848,6 +848,7 @@ subroutine sfr_read_packagedata(this) character(len=10) :: cnum character(len=LENBOUNDNAME) :: bndName character(len=LENBOUNDNAME) :: bndNameTemp + character(len=LENBOUNDNAME) :: hkname character(len=LENBOUNDNAME) :: manningname character(len=LENBOUNDNAME) :: ustrfname character(len=50), dimension(:), allocatable :: caux @@ -941,7 +942,7 @@ subroutine sfr_read_packagedata(this) ! -- get reach bed thickness this%bthick(n) = this%parser%GetDouble() ! -- get reach bed hk - this%hk(n) = this%parser%GetDouble() + call this%parser%GetStringCaps(hkname) ! -- get reach roughness call this%parser%GetStringCaps(manningname) ! -- get number of connections for reach @@ -986,9 +987,18 @@ subroutine sfr_read_packagedata(this) end if this%sfrname(n) = bndName ! + ! -- set reach hydraulic conductivity + text = hkname + jj = 1 !for 'BEDK' + bndElem => this%hk(n) + call read_value_or_time_series_adv(text, n, jj, bndElem, & + this%packName, 'BND', & + this%tsManager, this%iprpak, & + 'BEDK') + ! ! -- set Mannings text = manningname - jj = 1 !for 'ROUGH' + jj = 1 !for 'MANNING' bndElem => this%rough(n) call read_value_or_time_series_adv(text, n, jj, bndElem, & this%packName, 'BND', & @@ -2954,7 +2964,11 @@ subroutine sfr_bd_obs(this) case ('EXT-OUTFLOW') v = this%qextoutflow(n) case ('RAINFALL') - v = this%rain(n) + if (this%iboundpak(n) /= 0) then + v = this%rain(n) + else + v = DZERO + end if case ('RUNOFF') v = this%simrunoff(n) case ('EVAPORATION') @@ -3202,6 +3216,14 @@ subroutine sfr_set_stressperiod(this, n, ichkustrm, crossfile) 'Unknown '//trim(this%text)//' sfr status keyword: ', trim(text) call store_error(errmsg) end if + case ('BEDK') + call this%parser%GetString(text) + jj = 1 ! For 'BEDK' + bndElem => this%hk(n) + call read_value_or_time_series_adv(text, n, jj, bndElem, & + this%packName, 'BND', & + this%tsManager, this%iprpak, & + 'BEDK') case ('MANNING') call this%parser%GetString(text) jj = 1 ! For 'MANNING' @@ -3231,7 +3253,7 @@ subroutine sfr_set_stressperiod(this, n, ichkustrm, crossfile) call read_value_or_time_series_adv(text, n, jj, bndElem, & this%packName, 'BND', & this%tsManager, this%iprpak, & - 'MANNING') + 'EVAP') case ('RUNOFF') call this%parser%GetString(text) jj = 1 ! For 'RUNOFF' @@ -3428,13 +3450,13 @@ subroutine sfr_solve(this, n, h, hcof, rhs, update) rhs = DZERO ! if (this%iboundpak(n) == 0) then - this%depth(n) = DHNOFLO + this%depth(n) = DZERO this%stage(n) = DHNOFLO - this%usflow(n) = DHNOFLO - this%simevap(n) = DHNOFLO - this%simrunoff(n) = DHNOFLO - this%dsflow(n) = DHNOFLO - this%gwflow(n) = DHNOFLO + this%usflow(n) = DZERO + this%simevap(n) = DZERO + this%simrunoff(n) = DZERO + this%dsflow(n) = DZERO + this%gwflow(n) = DZERO else hgwf = h d1 = DZERO From cea54b2a6b6809ef0b7420035aa863d03350294f Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Sat, 20 Apr 2024 20:27:52 -0400 Subject: [PATCH 120/199] ci(release): fix model selection options for dist scripts (#1752) * fix nightly build broken by #1746 * fix model selection, can't assume models provided * fix example filtering in build_dist.py, use rmtree not unlink * unrelated: remove old workaround from autotest/get_exes.py --- .github/workflows/release.yml | 10 ++++++++-- autotest/get_exes.py | 21 ++++++--------------- distribution/build_dist.py | 7 +++---- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 39f5e6f2394..163b29f8674 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -467,8 +467,11 @@ jobs: GITHUB_TOKEN: ${{ github.token }} run: | mkdir -p "${{ needs.build.outputs.distname }}/doc" + cmd="python modflow6/distribution/build_docs.py -b bin -o doc" models="${{ inputs.models }}" - cmd="python modflow6/distribution/build_docs.py -b bin -o doc -m ${models//,/ -m }" + if [ -n "$models" ]; then + cmd="$cmd -m ${models//,/ -m }" + fi if [[ "${{ inputs.full }}" == "true" ]]; then cmd="$cmd --full" fi @@ -581,8 +584,11 @@ jobs: run: | # build distribution distname="${{ needs.build.outputs.distname }}_${{ steps.ostag.outputs.ostag }}" + cmd="python modflow6/distribution/build_dist.py -o $distname" models="${{ inputs.models }}" - cmd="python modflow6/distribution/build_dist.py -o $distname -m ${models//,/ -m }" + if [ -n "$models" ]; then + cmd="$cmd -m ${models//,/ -m }" + fi if [[ "${{ inputs.full }}" == "true" ]]; then cmd="$cmd --full" fi diff --git a/autotest/get_exes.py b/autotest/get_exes.py index d5c789ceb11..2da09b3b2c5 100644 --- a/autotest/get_exes.py +++ b/autotest/get_exes.py @@ -53,6 +53,7 @@ def test_rebuild_release(rebuilt_bin_path: Path): ) with TemporaryDirectory() as td: + # download the release download_path = Path(td) download_and_unzip( asset["browser_download_url"], @@ -76,21 +77,11 @@ def test_rebuild_release(rebuilt_bin_path: Path): f.write(f"{line}\n") # rebuild with Meson - def rebuild(): - meson_build( - project_path=source_files_path.parent, - build_path=download_path / "builddir", - bin_path=rebuilt_bin_path, - ) - - # temp workaround until next release, - # ifx fails to build 6.4.2 on Windows - # most likely due to backspace issues - if system() == "Windows" and environ.get("FC") == "ifx": - with set_env(FC="ifort", CC="icl"): - rebuild() - else: - rebuild() + meson_build( + project_path=source_files_path.parent, + build_path=download_path / "builddir", + bin_path=rebuilt_bin_path, + ) @flaky(max_runs=3) diff --git a/distribution/build_dist.py b/distribution/build_dist.py index 12ff7fcfe86..79627da8070 100644 --- a/distribution/build_dist.py +++ b/distribution/build_dist.py @@ -6,7 +6,7 @@ from os import PathLike, environ from pathlib import Path from pprint import pprint -from shutil import copy, copyfile, copytree, ignore_patterns +from shutil import copy, copyfile, copytree, ignore_patterns, rmtree from typing import List, Optional import pytest @@ -114,19 +114,18 @@ def setup_examples( models: Optional[List[str]] = None, ): examples_path = Path(examples_path).expanduser().absolute() - - # download example models zip asset latest = get_release("MODFLOW-USGS/modflow6-examples", "latest") assets = latest["assets"] asset = next( iter([a for a in assets if a["name"] == "modflow6-examples.zip"]), None ) + # download example models zip asset download_and_unzip(asset["browser_download_url"], examples_path, verbose=True) # filter examples for models selected for release for p in examples_path.glob("*"): if not any(m in p.stem for m in models): - p.unlink() + rmtree(p) # list folders with mfsim.nam (recursively) # and add run.sh/bat script to each folder From 775810154ae362fc0f0c17cf8ccf2e5c50dae1c7 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Mon, 22 Apr 2024 09:47:20 -0500 Subject: [PATCH 121/199] docs: add codespell source and docs check (#1754) * docs: spell-checking LaTeX and other files * docs: add codespell check of source and documents * add lint step to docs.yml --- .codespell.ignore | 37 + .github/common/codespell_docs_check.py | 157 ++ .github/common/fortran_format_check.py | 67 +- .github/workflows/docs.yml | 17 + CONTRIBUTING.md | 4 +- DEVELOPER.md | 2 +- doc/ReleaseNotes/develop.tex | 2 +- doc/mf6io/gwf/bcoptions.tex | 4 +- environment.yml | 1 + pixi.lock | 2501 +++++++++++++++++++++--- pixi.toml | 5 +- src/Model/Discretization/Disv1d.f90 | 2 +- src/Utilities/ArrayHandlers.f90 | 4 +- src/Utilities/compilerversion.F90 | 28 +- utils/zonebudget/src/zoneoutput.f90 | 2 +- 15 files changed, 2518 insertions(+), 315 deletions(-) create mode 100644 .codespell.ignore create mode 100644 .github/common/codespell_docs_check.py diff --git a/.codespell.ignore b/.codespell.ignore new file mode 100644 index 00000000000..d82203c1c3b --- /dev/null +++ b/.codespell.ignore @@ -0,0 +1,37 @@ +Alph +alph +WEL +wel +NAM +nam +GAGE +gage +Gage +DROB +drob +DELT +delt +LKE +lke +IST +ist +inout +INOUT +strng +OT +ot +initialX +initialx +initialY +initialy +initialZ +initialz +iterm +htmp +dum +blak +thck +shft +lsat +numer +thi diff --git a/.github/common/codespell_docs_check.py b/.github/common/codespell_docs_check.py new file mode 100644 index 00000000000..dcb035bb060 --- /dev/null +++ b/.github/common/codespell_docs_check.py @@ -0,0 +1,157 @@ +import argparse +import glob +import os +import sys +from pathlib import Path +from subprocess import run + +# MODFLOW 6 repository directories to check (relative to root) +searchpaths = [ + "doc", + ".hpc", + ".vscode", + "distribution", +] + +# Exclude these directories from checks +excludedirs = [ + "srcbmi/latex", +] + +# Exclude these files from checks +excludefiles = [] # add excluded files here + + +class CodespellCheck: + """ + Verify MODFLOW 6 fortran source code format + """ + + def __init__(self, root: Path, verbose: bool, write_changes: bool): + self._checkcount = 0 + self._codespellfails = [] + self._exclude_dirs = [] + self._exclude_files = [] + self._root = root.resolve() + self._verbose = verbose + self.write_changes = write_changes + self._entrypath = Path().cwd() + + os.chdir(self._root) + + def add_search_paths(self) -> None: + files = [] + files += Path(".").glob("*.md") + + for dir_path in searchpaths: + p = Path(dir_path) + for e in ("**/*.dfn", "**/*.tex", "**/*.md"): + files += p.glob(e) + + for f in sorted(files): + self._check_docs_codespell(f) + + def add_exclude_dirs(self, excl_dirs: list) -> None: + self._exclude_dirs += excl_dirs + + def add_exclude_files(self, excl_files: list) -> None: + self._exclude_files += excl_files + + def clear_exclude_dirs(self) -> None: + self._exclude_dirs = None + self._exclude_dirs = [] + + def clear_exclude_files(self) -> None: + self._exclude_files = None + self._exclude_files = [] + + def report(self) -> None: + print(f"\nDocument files checked: {self._checkcount}") + print( + f"Document files codespell failures: {len(self._codespellfails)}\n" + ) + + if len(self._codespellfails) > 0: + print(f"codespell failures\n{71*'-'}") + for f in self._codespellfails: + print(f"codespell -w {f} --ignore-words=.codespell.ignore") + print() + + def exit(self) -> int: + os.chdir(self._entrypath) + + if len(self._codespellfails): + return 1 + + return 0 + + def _check_docs_codespell(self, path: Path) -> None: + if self._excluded(path): + return + + self._checkcount += 1 + + if self._verbose: + print(f"{self._checkcount: 5d}: {path}") + + if self.write_changes: + wc_str = "-w" + else: + wc_str = "" + + cmd = f"codespell {wc_str} {path} --ignore-words=.codespell.ignore" + result = run(cmd, capture_output=True, shell=True) + + if result.stdout or result.stderr: + self._codespellfails.append(path) + + def _excluded(self, path: Path) -> bool: + for f in self._exclude_files: + if os.path.exists(f) and os.path.samefile(path, f): + return True + + for d in self._exclude_dirs: + if os.path.exists(d) and os.path.samefile(path.parents[0], d): + return True + + return False + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + "MODFLOW 6 Documents spell check with codespell verification" + ) + parser.add_argument( + "-r", + "--root", + help="path to MODFLOW 6 repository root directory", + ) + parser.add_argument( + "-w", + "--write-changes", + help="write changes in place if possible", + action="store_true", + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + help="verbose", + ) + args = parser.parse_args() + + # set MODFLOW 6 repository root + root = Path(args.root).resolve() if args.root else Path(".").resolve() + + doccheck = CodespellCheck( + root=root, + verbose=args.verbose, + write_changes=args.write_changes, + ) + doccheck.add_exclude_dirs(excl_dirs=excludedirs) + doccheck.add_exclude_files(excl_files=excludefiles) + + doccheck.add_search_paths() + + doccheck.report() + sys.exit(doccheck.exit()) diff --git a/.github/common/fortran_format_check.py b/.github/common/fortran_format_check.py index b04f0997453..c1436641ae2 100644 --- a/.github/common/fortran_format_check.py +++ b/.github/common/fortran_format_check.py @@ -26,12 +26,14 @@ class FortranFormatCheck: Verify MODFLOW 6 fortran source code format """ - def __init__(self, root: Path, verbose: bool): + def __init__(self, root: Path, verbose: bool, write_changes: bool): self._checkcount = 0 self._fprettifyfails = [] + self._codespellfails = [] self._exclude_dirs = [] self._exclude_files = [] self._root = root.resolve() + self.write_changes = write_changes self._verbose = verbose self._entrypath = Path().cwd() @@ -42,6 +44,7 @@ def add_search_path(self, path: Path) -> None: for f in p.glob("**/*.[fF]9[05]"): self._check_src_fprettify(f) + self._check_src_codespell(f) def add_exclude_dirs(self, excl_dirs: list) -> None: self._exclude_dirs += excl_dirs @@ -59,17 +62,29 @@ def clear_exclude_files(self) -> None: def report(self) -> None: print(f"\nFortran source files checked: {self._checkcount}") - print(f"Fortran source files failed: {len(self._fprettifyfails)}\n") - - for f in self._fprettifyfails: - print(f"fprettify -c .fprettify.yaml {f}") - - print() + print( + f"Fortran source files fprettify failures: {len(self._fprettifyfails)}" + ) + print( + f"Fortran source files codespell failures: {len(self._codespellfails)}\n" + ) + + if len(self._fprettifyfails) > 0: + print(f"fprettify failures\n{71*'-'}") + for f in self._fprettifyfails: + print(f"fprettify -c .fprettify.yaml {f}") + print() + + if len(self._codespellfails) > 0: + print(f"codespell failures\n{71*'-'}") + for f in self._codespellfails: + print(f"codespell -w {f} --ignore-words=.codespell.ignore") + print() def exit(self) -> int: os.chdir(self._entrypath) - if len(self._fprettifyfails): + if len(self._fprettifyfails) > 0 or len(self._codespellfails) > 0: return 1 return 0 @@ -81,7 +96,7 @@ def _check_src_fprettify(self, path: Path) -> None: self._checkcount += 1 if self._verbose: - print(path) + print(f"{self._checkcount: 5d}: {path}") cmd = f"fprettify -d -c .fprettify.yaml {path}" result = run(cmd, capture_output=True, shell=True) @@ -89,6 +104,21 @@ def _check_src_fprettify(self, path: Path) -> None: if result.stdout or result.stderr: self._fprettifyfails.append(path) + def _check_src_codespell(self, path: Path) -> None: + if self._excluded(path): + return + + if self.write_changes: + wc_str = "-w" + else: + wc_str = "" + + cmd = f"codespell {wc_str} {path} --ignore-words=.codespell.ignore" + result = run(cmd, capture_output=True, shell=True) + + if result.stdout or result.stderr: + self._codespellfails.append(path) + def _excluded(self, path: Path) -> bool: for f in self._exclude_files: if os.path.exists(f) and os.path.samefile(path, f): @@ -108,13 +138,28 @@ def _excluded(self, path: Path) -> bool: parser.add_argument( "-r", "--root", help="path to MODFLOW 6 repository root directory" ) - parser.add_argument("-v", "--verbose", action="store_true", help="verbose") + parser.add_argument( + "-w", + "--write-changes", + help="write codespell changes in place if possible", + action="store_true", + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + help="verbose", + ) args = parser.parse_args() # set MODFLOW 6 repository root root = Path(args.root).resolve() if args.root else Path(".").resolve() - fformat_check = FortranFormatCheck(root=root, verbose=args.verbose) + fformat_check = FortranFormatCheck( + root=root, + verbose=args.verbose, + write_changes=args.write_changes, + ) fformat_check.add_exclude_dirs(excl_dirs=excludedirs) fformat_check.add_exclude_files(excl_files=excludefiles) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index ff92188bbc6..254bdc656bd 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -15,8 +15,25 @@ on: env: PIXI_BETA_WARNING_OFF: true jobs: + lint: + name: Check format + runs-on: ubuntu-latest + steps: + + - name: Checkout modflow6 + uses: actions/checkout@v4 + + - uses: prefix-dev/setup-pixi@v0.6.0 + with: + pixi-version: v0.19.1 + + - name: Check documents using codespell + run: pixi run check-docs + rtd_build: name: Build ReadTheDocs + needs: + - lint runs-on: ubuntu-22.04 defaults: run: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0882133457c..0126b90c449 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -136,11 +136,11 @@ from the main (upstream) repository: To ensure consistency throughout the source code, keep these rules in mind as you are working: * All features or bug fixes **must be tested** by one or more specs (unit-tests and/or integration/regression-tests). -* All Fortran souce code submissions must adhere to modflow6 [Format Rules](#format) +* All Fortran source code submissions must adhere to modflow6 [Format Rules](#format) ## Format Rules -Fortran souce code format rules are met by running the +Fortran source code format rules are met by running the [fprettify formatter](https://github.com/pseewald/fprettify) while specifying the [MODFLOW 6 fprettify configuration](.fprettify.yaml). `fprettify` is included in the conda and pixi environments and can be run on the command line or integrated into a [VSCode](.vscode/README.md) or Visual Studio environment. The configuration file reflects the current minimum standard for Fortran source diff --git a/DEVELOPER.md b/DEVELOPER.md index 8a9a30df30d..6a04169b4c4 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -655,7 +655,7 @@ git checkout feat-xyz Next, consider squashing commits on the feature branch. If there are many commits, it is beneficial to squash them before trying to rebase with develop. There is a nice article on [squashing commits into one using git](https://www.internalpointers.com/post/squash-commits-into-one-git), which has been very useful for consolidating commits on a long-lived modflow6 feature branch. -A quick and dirty way to squash without interactive rebase (as an alternative to the approach described in the article mentioned in the preceding paragraph) is a soft reset followed by an ammended commit. First making a backup of the feature branch is strongly recommended before using this approach, as accidentally typing `--hard` instead of `--soft` will wipe out all your work. +A quick and dirty way to squash without interactive rebase (as an alternative to the approach described in the article mentioned in the preceding paragraph) is a soft reset followed by an amended commit. First making a backup of the feature branch is strongly recommended before using this approach, as accidentally typing `--hard` instead of `--soft` will wipe out all your work. ``` git reset --soft diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index ae0879ad0f0..2fa10ce2031 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -44,7 +44,7 @@ \item A divide by zero error would occur in the Streamflow Routing package when reaches were deactivated during a simulation. This bug was fixed by checking if the downstream reach is inactive before calculating the flow to the downstream reach. \item When using the mover transport (MVT) package with UZF and UZT, rejected infiltration was paired with the calculated concentration of the UZF object rather than the user-specified concentration assigned to the infiltration. This bug was fixed by instead pairing the rejected infiltration transferred by the MVR and MVT packages with the user-specified concentration assigned in UZTSETTING with the keyword ``INFILTRATION.'' With this change, MODFLOW 6 simulations that use UZF with the ``SIMULATE\_GWSEEP'' option will not transfer this particular source of water with the correct concentration. Instead, the DRN package should be used to simulate groundwater discharge to land surface. By simulating groundwater discharge to land surface with the DRN package and rejected infiltration with the UZF package, the correct concentrations will be assigned to the water transferred by the MVR package. \item The SIMULATE\_GWSEEP variable in the UZF package OPTIONS block will eventually be deprecated. The same functionality may be achieved using an option available within the DRN package called AUXDEPTHNAME. The details of the drainage option are given in the supplemental technical information document (mf6suptechinfo) provided with the release. Deprecation of the SIMULATE\_GWSEEP option is motivated by the potential for errors noted above. - \item The capability to inactivate lakes (using the STATUS INACTIVE setting) did not work properly for the GWF Lake Package. The Lake Package was fixed so that inactive lakes have a zero flow value with connected GWF model cells and that the lake stage is assigned the inactive value (1.E30). The listing, budget, and observation files were modifed to accurately report inactive lakes. + \item The capability to deactivate lakes (using the STATUS INACTIVE setting) did not work properly for the GWF Lake Package. The Lake Package was fixed so that inactive lakes have a zero flow value with connected GWF model cells and that the lake stage is assigned the inactive value (1.E30). The listing, budget, and observation files were modified to accurately report inactive lakes. \item The Streamflow Routing package would not calculate groundwater discharge to a reach in cases where the groundwater head is above the top of the reach and the inflow to the reach from upstream reaches, specified inflows, rainfall, and runoff is zero. This bug has been fixed by eliminating the requirement that the conductance calculated based on the initial calculated stage is greater than zero in order to solve for groundwater. As a result, differences in groundwater and surface-water exchange and groundwater heads in existing models may occur. \item The Streamflow Routing package stage tables written to the model listing file have been modified so that inactive reaches are identified to be INACTIVE and dry reaches are identified to be DRY. \item The Streamflow Routing package would not correctly report reach flow terms for unconnected reaches even though reach flows were correctly calculated. This bug has been fixed by modifying the budget routine so that it correctly reports unconnected reach flows in the model listing file and cell-by-cell budget files. Simulated groundwater flow results should not change but differences may be observed in post-processed results and transport simulations that rely on binary cell-by-cell data. diff --git a/doc/mf6io/gwf/bcoptions.tex b/doc/mf6io/gwf/bcoptions.tex index 939320b22c8..62e0efbf729 100644 --- a/doc/mf6io/gwf/bcoptions.tex +++ b/doc/mf6io/gwf/bcoptions.tex @@ -18,9 +18,9 @@ \newcommand{\timeseries}[0]{\texttt{TIMESERIESFILE time-series-filename}---defines a time-series file defining time series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-series capability.} -\newcommand{\timearrayseries}{\texttt{TIMEARRAYSERIESFILE time-array-series-filename}---defines a time-array-series file defining a time-array series that can be used to assign time-varying values. See the €œTime-Variable Input€ section for instructions on using the time-array series capability.} +\newcommand{\timearrayseries}{\texttt{TIMEARRAYSERIESFILE time-array-series-filename}---defines a time-array-series file defining a time-array series that can be used to assign time-varying values. See the ``Time-Variable Input'' section for instructions on using the time-array series capability.} -\newcommand{\timearrayserieslayered}{\texttt{TIMEARRAYSERIESFILE time-array-series-filename}---name of a time-array-series file defining a time-array series that can be used to assign time-varying values when input is read in array form. See the €œTime-Variable Input€ section for instructions on using the time-array series capability. Valid only when the READASARRAYS option is used.} +\newcommand{\timearrayserieslayered}{\texttt{TIMEARRAYSERIESFILE time-array-series-filename}---name of a time-array-series file defining a time-array series that can be used to assign time-varying values when input is read in array form. See the ``Time-Variable Input'' section for instructions on using the time-array series capability. Valid only when the READASARRAYS option is used.} \newcommand{\maxbound}[1]{\texttt{MAXBOUND maxbound}---keyword and integer value specifying the maximum number of {#1} cells that will be specified for use during any stress period.} diff --git a/environment.yml b/environment.yml index 66e15331237..04f5434a8f1 100644 --- a/environment.yml +++ b/environment.yml @@ -7,6 +7,7 @@ channels: dependencies: - python - appdirs + - codespell - filelock - fprettify - fortran-language-server diff --git a/pixi.lock b/pixi.lock index 1ca5a420258..2609992b7e8 100644 --- a/pixi.lock +++ b/pixi.lock @@ -23,6 +23,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/codespell-2.2.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py39h7633fee_0.conda @@ -45,13 +46,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fprettify-0.3.7-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.11-hb9ae30d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-2.50.0-h5abf519_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.1-hfa15dee_1.conda @@ -60,7 +61,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda @@ -74,7 +75,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda @@ -100,7 +101,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.48-h71f35ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda @@ -114,9 +115,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-16.2-h33b98f1_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.0-hce6bd6c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.0-hadf69e7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda @@ -128,7 +129,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda @@ -162,7 +163,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda @@ -193,14 +194,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.18.0-py39h9fdd4d6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py39h474f0d3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py39h6404dd3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py39h6404dd3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py39h3d6467e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4-py39hd1e30aa_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py39hd1e30aa_0.conda @@ -230,6 +231,179 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/atk-1.0-2.38.0-hf4e84e4_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/black-24.4.0-py39h4420490_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bmipy-2.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.1.0-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.1.0-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py39h387a81e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h31becfc_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.2.2-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.0-ha13f110_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/codespell-2.2.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.2.1-py39hd16970a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.6.2-h2f0025b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.14.2-ha9a116f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.51.0-py39h898b7ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fortran-language-server-1.12.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fprettify-0.3.7-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fribidi-1.0.10-hb9de7d4_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gdk-pixbuf-2.42.11-ha61d561_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/geos-3.12.1-h2f0025b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.13-h2f0025b_1003.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphviz-2.50.0-h856fde9_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gtk2-2.24.33-h0d7db29_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gts-0.7.6-he293c15_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-8.3.0-hebeb849_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-73.2-h787c7f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jupyter_core-5.7.2-py39h4420490_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.4.5-py39had2cf8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.16-h922389a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-hba4e955_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-22_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-22_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.20-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.2-h2f0025b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-13.2.0-hf8544c7_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgd-2.3.3-hcd22fd5_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-13.2.0-he9431aa_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-13.2.0-h582850c_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.80.0-h9d8fbc1_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.2.0-hf8544c7_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-22_linuxaarch64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.27-pthreads_h5a5ec62_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.43-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/librsvg-2.58.0-h010368b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.45.3-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.2.0-h9a76618_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.6.0-hf980d43_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtool-2.4.7-h4de3ea5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-1.3.2-heb2ea1b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.3.2-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.15-h2a766a3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.12.6-h3091e33_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.2.13-h31becfc_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-2.1.5-py39h7cc1d5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-3.8.4-py39ha65689a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.8.4-py39h8e43113_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/meson-1.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.4.20240210-h0425590_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.12.0-h2a328a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py39h91c28bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.2-h0d9d63b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.2.1-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.2-py39h26ccf5d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pango-1.50.14-h11ef544_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.43-hd0f9c67_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-10.3.0-py39h71661b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.43.4-h2f0025b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-hb9de7d4_1001.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pydotplus-2.0.2-pyhaef67bd_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-dotenv-0.5.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-order-1.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.9.19-h4ac3b42_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.9-4_cp39.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.1-py39h898b7ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.18.0-py39hfe8b3a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.13.0-py39h91c28bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/shapely-2.0.4-py39h497b60c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4-py39h7cc1d5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/unicodedata2-15.1.0-py39h898b7ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xmipy-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-kbproto-1.0.7-h3557bc0_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.1-h7935292_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.4-h5a01bc2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.9-h055a233_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.11-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.3-h3557bc0_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.4-h2a766a3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.11-h7935292_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-renderproto-0.11.1-h3557bc0_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-xextproto-7.3.0-h2a766a3_1003.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-xproto-7.0.31-h3557bc0_1007.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.2.13-h31becfc_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.5-h4c53e97_0.conda osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/atk-1.0-2.38.0-h1d18e73_1.tar.bz2 @@ -245,6 +419,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/codespell-2.2.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/contourpy-1.2.1-py39h0ca7971_0.conda @@ -266,7 +441,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fprettify-0.3.7-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h60636b9_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fribidi-1.0.10-hbcb3906_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.42.10-hd9e0ca3_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.42.11-ha9f1606_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/geos-3.12.1-h93d8f39_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gettext-0.22.5-h5ff76d1_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gettext-tools-0.22.5-h5ff76d1_2.conda @@ -277,7 +452,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-8.3.0-hf45c392_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-73.2-hf5e326d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda @@ -305,7 +480,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libgettextpo-devel-0.22.5-h5ff76d1_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-13.2.0-h2873a65_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.0-h81c1438_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.0-h81c1438_6.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hd75f5a5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.22.5-h5ff76d1_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-devel-0.22.5-h5ff76d1_2.conda @@ -313,14 +488,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_hfef2a42_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.43-h92b6c6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.58.0-h7b06fc5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.2-h92b6c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.58.0-h7b06fc5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.3-h92b6c6a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.6.0-h129831d_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtool-2.4.7-hf0c8a7f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-1.3.2-h44782d1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.3.2-h10d778d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.15-hb7f2c08_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.6-hc0ae0f7_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.6-hc0ae0f7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.3-hb6ac08f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda @@ -349,7 +524,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.43.4-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-hc929b4f_1001.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pydotplus-2.0.2-pyhaef67bd_5.tar.bz2 @@ -375,13 +550,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.18.0-py39hcf47035_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.0-py39h0ed1e0f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.3-py39h19e25c1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.4-py39h19e25c1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.4-py39ha09f3b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-15.1.0-py39hdc70f33_0.conda @@ -410,6 +585,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/codespell-2.2.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.2.1-py39h48c5dd5_0.conda @@ -431,7 +607,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/fprettify-0.3.7-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.10-h27ca646_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.42.10-hcea6d13_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.42.11-h13c029f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/geos-3.12.1-h965bd2d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-tools-0.22.5-h8fbad5d_2.conda @@ -442,7 +618,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-8.3.0-h8f0ba13_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda @@ -470,7 +646,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgettextpo-devel-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.0-hfc324ee_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.0-hfc324ee_6.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-devel-0.22.5-h8fbad5d_2.conda @@ -478,14 +654,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-22_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.27-openmp_h6c19121_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.43-h091b4b1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.58.0-hb3d354b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.2-h091b4b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.58.0-hb3d354b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.6.0-h07db509_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtool-2.4.7-hb7217d7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-1.3.2-hf30222e_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.3.2-h93a5062_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.15-hf346824_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.3-hcd81f8e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda @@ -514,7 +690,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.43.4-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-h27ca646_1001.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pydotplus-2.0.2-pyhaef67bd_5.tar.bz2 @@ -540,13 +716,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.18.0-py39h9a407ce_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.0-py39hcc04109_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.0.3-py39ha70ab96_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.0.4-py39ha70ab96_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.4-py39h17cfd9d_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-15.1.0-py39h0f82c59_0.conda @@ -574,6 +750,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/codespell-2.2.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/configargparse-1.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.2.1-py39h1f6ef14_0.conda @@ -599,8 +776,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/getopt-win32-0.1-hcfcfb64_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gettext-0.22.5-h5728263_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gettext-tools-0.22.5-h7d00a51_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_6.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.13-h63175ca_1003.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-2.50.0-had6c3a3_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.24.1-h001b923_1.conda @@ -608,7 +785,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-8.3.0-h7ab893a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-73.2-h63175ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda @@ -636,7 +813,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h312136b_9.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-0.22.5-h5728263_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-devel-0.22.5-h5728263_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_6.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h2fffb23_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_2.conda @@ -645,13 +822,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-22_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libogg-1.3.4-h8ffe710_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.43-h19919ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.2-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.3-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.6.0-hddb2be6_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libvorbis-1.3.7-h0e60522_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-1.3.2-hcfcfb64_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.3.2-hcfcfb64_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.15-hcd874cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.6-hc3477c8_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.6-hc3477c8_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 @@ -685,7 +862,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.43.4-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/pthreads-win32-2.9.1-hfa6e2cd_3.tar.bz2 @@ -716,7 +893,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.18.0-py39hf21820d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.0-py39hddb5d58_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/shapely-2.0.3-py39h61a8cf5_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/shapely-2.0.4-py39h61a8cf5_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/sip-6.7.12-py39h99910a6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-h91493d7_0.conda @@ -724,7 +901,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.4-py39ha55989b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.11.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 @@ -782,6 +959,23 @@ packages: license_family: BSD size: 23621 timestamp: 1650670423406 +- kind: conda + name: _openmp_mutex + version: '4.5' + build: 2_gnu + build_number: 16 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23712 + timestamp: 1650670790230 - kind: conda name: alsa-lib version: 1.2.11 @@ -867,6 +1061,25 @@ packages: license_family: LGPL size: 551928 timestamp: 1667420962627 +- kind: conda + name: atk-1.0 + version: 2.38.0 + build: hf4e84e4_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/atk-1.0-2.38.0-hf4e84e4_1.tar.bz2 + sha256: e7b18a14dab4a22948fde59a680b30e1b7d7093717fc008f783411cf9a9c3fbb + md5: 515464ef36136ee19a64d0511f77df62 + depends: + - libgcc-ng >=12 + - libglib >=2.74.1,<3.0a0 + - libstdcxx-ng >=12 + constrains: + - atk-1.0 2.38.0 + license: LGPL-2.0-or-later + license_family: LGPL + size: 537714 + timestamp: 1667422475490 - kind: conda name: attr version: 2.5.1 @@ -920,6 +1133,29 @@ packages: license_family: MIT size: 295842 timestamp: 1713170240040 +- kind: conda + name: black + version: 24.4.0 + build: py39h4420490_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/black-24.4.0-py39h4420490_0.conda + sha256: 18ef7d8c330543638d9ad59af32450c5ed6a9da391e4a2ed251b4371d8ac405b + md5: 669244a72ec72f69c37ce1abb8bc779a + depends: + - click >=8.0.0 + - mypy_extensions >=0.4.3 + - packaging >=22.0 + - pathspec >=0.9 + - platformdirs >=2 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + - tomli >=1.1.0 + - typing_extensions >=4.0.1 + license: MIT + license_family: MIT + size: 295234 + timestamp: 1713169939257 - kind: conda name: black version: 24.4.0 @@ -1022,6 +1258,24 @@ packages: license_family: MIT size: 19530 timestamp: 1695990310168 +- kind: conda + name: brotli + version: 1.1.0 + build: h31becfc_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.1.0-h31becfc_1.conda + sha256: 1e1e46a4d16936d1bd1a605767b4cc36cf8fd3180ad776b5ba9e4c8ce64859bf + md5: e41f5862ac746428407f3fd44d2ed01f + depends: + - brotli-bin 1.1.0 h31becfc_1 + - libbrotlidec 1.1.0 h31becfc_1 + - libbrotlienc 1.1.0 h31becfc_1 + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 19586 + timestamp: 1695990171649 - kind: conda name: brotli version: 1.1.0 @@ -1093,6 +1347,23 @@ packages: license_family: MIT size: 16660 timestamp: 1695990286737 +- kind: conda + name: brotli-bin + version: 1.1.0 + build: h31becfc_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.1.0-h31becfc_1.conda + sha256: fd1e57615b995565939fdb9910534933c4c27ec0c37a911a2c923241dbf8ad3b + md5: 9e4a13596ab651ea8d77aae023d0ce3f + depends: + - libbrotlidec 1.1.0 h31becfc_1 + - libbrotlienc 1.1.0 h31becfc_1 + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 18915 + timestamp: 1695990154825 - kind: conda name: brotli-bin version: 1.1.0 @@ -1145,6 +1416,27 @@ packages: license_family: MIT size: 18980 timestamp: 1695990054140 +- kind: conda + name: brotli-python + version: 1.1.0 + build: py39h387a81e_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.1.0-py39h387a81e_1.conda + sha256: d74e7e8a8936afe6ca9fcf347e9da0e0cf3a2b2cb75bc5fff903c041681836e6 + md5: 983fb0d6a8d0ad30f7213dccadea185d + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + constrains: + - libbrotlicommon 1.1.0 h31becfc_1 + license: MIT + license_family: MIT + size: 355569 + timestamp: 1695990300233 - kind: conda name: brotli-python version: 1.1.0 @@ -1238,6 +1530,21 @@ packages: license_family: BSD size: 127885 timestamp: 1699280178474 +- kind: conda + name: bzip2 + version: 1.0.8 + build: h31becfc_5 + build_number: 5 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h31becfc_5.conda + sha256: b9f170990625cb1eeefaca02e091dc009a64264b077166d8ed7aeb7a09e923b0 + md5: a64e35f01e0b7a2a152eca87d33b9c87 + depends: + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + size: 189668 + timestamp: 1699280060686 - kind: conda name: bzip2 version: 1.0.8 @@ -1316,6 +1623,17 @@ packages: license: ISC size: 155432 timestamp: 1706843687645 +- kind: conda + name: ca-certificates + version: 2024.2.2 + build: hcefe29a_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.2.2-hcefe29a_0.conda + sha256: 0f6b34d835e26e5fa97cca4985dc46f0aba551a3a23f07c6f13cca2542b8c642 + md5: 57c226edb90c4e973b9b7503537dd339 + license: ISC + size: 155738 + timestamp: 1706845723412 - kind: conda name: ca-certificates version: 2024.2.2 @@ -1403,6 +1721,35 @@ packages: license: LGPL-2.1-only or MPL-1.1 size: 885311 timestamp: 1697028802967 +- kind: conda + name: cairo + version: 1.18.0 + build: ha13f110_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.0-ha13f110_0.conda + sha256: 79b6323661b535d90aaec0eac0e91ccda88cc5917d9e597a03d7de183bc22f26 + md5: 425111f8cc6945c5d1307357dd819b9b + depends: + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=73.2,<74.0a0 + - libgcc-ng >=12 + - libglib >=2.78.0,<3.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libstdcxx-ng >=12 + - libxcb >=1.15,<1.16.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - pixman >=0.42.2,<1.0a0 + - xorg-libice >=1.1.1,<2.0a0 + - xorg-libsm >=1.2.4,<2.0a0 + - xorg-libx11 >=1.8.6,<2.0a0 + - xorg-libxext >=1.3.4,<2.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + - zlib + license: LGPL-2.1-only or MPL-1.1 + size: 983779 + timestamp: 1697028424329 - kind: conda name: cairo version: 1.18.0 @@ -1488,6 +1835,21 @@ packages: license_family: BSD size: 85051 timestamp: 1692312207348 +- kind: conda + name: codespell + version: 2.2.6 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/codespell-2.2.6-pyhd8ed1ab_0.conda + sha256: b49d5482fbdeeb610275f6e7def3ee1409e6f2305b0eae4d37e23ada8b01e989 + md5: a206349b7bb7475ae580f987cb425bdd + depends: + - python >=3.8 + license: GPL-2.0-only + license_family: GPL + size: 266992 + timestamp: 1696287185466 - kind: conda name: colorama version: 0.4.6 @@ -1590,6 +1952,25 @@ packages: license_family: BSD size: 241771 timestamp: 1712430062056 +- kind: conda + name: contourpy + version: 1.2.1 + build: py39hd16970a_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.2.1-py39hd16970a_0.conda + sha256: 25216ac880cf43930f24365edd548f5fcf03bcf4e1b1b40cde0134ced33ee8f1 + md5: 66b9718539ecdd38876b0176c315bcad + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - numpy >=1.20 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 248196 + timestamp: 1712430213230 - kind: conda name: cycler version: 0.12.1 @@ -1652,6 +2033,21 @@ packages: license_family: MIT size: 38883 timestamp: 1712591929944 +- kind: conda + name: expat + version: 2.6.2 + build: h2f0025b_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.6.2-h2f0025b_0.conda + sha256: a7a998faf6b9ed71d8c5c67f996e7faa52a7b9b02ed2d2f2ab6cfa1db8e5aca4 + md5: 6d31100ba1e12773b4f1ef0693fb0169 + depends: + - libexpat 2.6.2 h2f0025b_0 + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 128302 + timestamp: 1710362329008 - kind: conda name: expat version: 2.6.2 @@ -1841,6 +2237,24 @@ packages: license_family: MIT size: 237668 timestamp: 1674829263740 +- kind: conda + name: fontconfig + version: 2.14.2 + build: ha9a116f_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.14.2-ha9a116f_0.conda + sha256: 71143b04d9beeb76264a54cb42a2953ff858a95f7383531fcb3a33ac6433e7f6 + md5: 6d2d19ea85f9d41534cd28fdefd59a25 + depends: + - expat >=2.5.0,<3.0a0 + - freetype >=2.12.1,<3.0a0 + - libgcc-ng >=12 + - libuuid >=2.32.1,<3.0a0 + - libzlib >=1.2.13,<1.3.0a0 + license: MIT + license_family: MIT + size: 280375 + timestamp: 1674830224830 - kind: conda name: fontconfig version: 2.14.2 @@ -1913,6 +2327,26 @@ packages: license_family: MIT size: 2182509 timestamp: 1712345020380 +- kind: conda + name: fonttools + version: 4.51.0 + build: py39h898b7ef_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.51.0-py39h898b7ef_0.conda + sha256: ba0416a2cec887b4e647f07cdd76d4186c3498f684739a1514108e3a0ead86e9 + md5: 7b6a069c66a729454fb4c534ed145dcd + depends: + - brotli + - libgcc-ng >=12 + - munkres + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + - unicodedata2 >=14.0.0 + license: MIT + license_family: MIT + size: 2259069 + timestamp: 1712344949814 - kind: conda name: fonttools version: 4.51.0 @@ -2066,6 +2500,22 @@ packages: license: GPL-2.0-only OR FTL size: 510306 timestamp: 1694616398888 +- kind: conda + name: freetype + version: 2.12.1 + build: hf0a5ef3_2 + build_number: 2 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + sha256: 7af93030f4407f076dce181062360efac2cd54dce863b5d7765287a6f5382537 + md5: a5ab74c5bd158c3d5532b66d8d83d907 + depends: + - libgcc-ng >=12 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<1.3.0a0 + license: GPL-2.0-only OR FTL + size: 642092 + timestamp: 1694617858496 - kind: conda name: fribidi version: 1.0.10 @@ -2104,6 +2554,19 @@ packages: license: LGPL-2.1 size: 64567 timestamp: 1604417122064 +- kind: conda + name: fribidi + version: 1.0.10 + build: hb9de7d4_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/fribidi-1.0.10-hb9de7d4_0.tar.bz2 + sha256: bcb5a40f1aaf4ea8cda2fc6b2b12aa336403772121350281ce31fd2d9d3e214e + md5: f6c91a43eace6fb926a8730b3b9a8a50 + depends: + - libgcc-ng >=7.5.0 + license: LGPL-2.1 + size: 115689 + timestamp: 1604417149643 - kind: conda name: fribidi version: 1.0.10 @@ -2117,63 +2580,83 @@ packages: timestamp: 1604417213 - kind: conda name: gdk-pixbuf - version: 2.42.10 - build: h829c605_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_5.conda - sha256: bacd1cc3ed77699dec11ea5a670160db3cf701f1b19f34f1a19be36cae25c396 - md5: 8fdb82e5d9694dd8e9ed9ac8fdf48a26 + version: 2.42.11 + build: h13c029f_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.42.11-h13c029f_0.conda + sha256: d726f6e1d5a9a2d4fcbce593fd3452a6d60c94a862957ae87cf30c0aa5378423 + md5: 244ae9d2841ef2cfab668f62c34f2f8d depends: - - libglib >=2.78.4,<3.0a0 + - __osx >=11.0 + - libglib >=2.80.0,<3.0a0 + - libintl >=0.22.5,<1.0a0 - libjpeg-turbo >=3.0.0,<4.0a0 - libpng >=1.6.43,<1.7.0a0 - libtiff >=4.6.0,<4.7.0a0 license: LGPL-2.1-or-later license_family: LGPL - size: 573339 - timestamp: 1710203544212 + size: 508571 + timestamp: 1713604183077 - kind: conda name: gdk-pixbuf - version: 2.42.10 - build: hcea6d13_5 - build_number: 5 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.42.10-hcea6d13_5.conda - sha256: 1259c6a32269074b85e870a2afaa426f96cba6ebad547c3e152c941e46036e3a - md5: bbf4bb664dedbec6d3a8fb8b6d90b710 + version: 2.42.11 + build: ha61d561_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/gdk-pixbuf-2.42.11-ha61d561_0.conda + sha256: 66b145a889841b6a55c5a625c373b883e9a0e9f78f2796b6ca601f3ade2e7845 + md5: 838d751872c5bf8ff92890507d0672ee depends: - - libglib >=2.78.4,<3.0a0 + - libgcc-ng >=12 + - libglib >=2.80.0,<3.0a0 - libjpeg-turbo >=3.0.0,<4.0a0 - libpng >=1.6.43,<1.7.0a0 - libtiff >=4.6.0,<4.7.0a0 license: LGPL-2.1-or-later license_family: LGPL - size: 548239 - timestamp: 1710203926272 + size: 537372 + timestamp: 1713605522330 - kind: conda name: gdk-pixbuf - version: 2.42.10 - build: hd9e0ca3_5 - build_number: 5 + version: 2.42.11 + build: ha9f1606_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.42.10-hd9e0ca3_5.conda - sha256: e15a0923d2640020dc7f2ff2b04f09face4ddce6484e09f78752cd0e65ad1cdf - md5: 308cefd960b6ba51bdbdc5ba9e9b2377 + url: https://conda.anaconda.org/conda-forge/osx-64/gdk-pixbuf-2.42.11-ha9f1606_0.conda + sha256: 9aa45b4f746cef58756da7879c646dbbf66c3940cbee5ea2ac822e0846d85aad + md5: ab407c96c658772c9bcd7161931fd933 depends: - - libglib >=2.78.4,<3.0a0 + - __osx >=10.9 + - libglib >=2.80.0,<3.0a0 + - libintl >=0.22.5,<1.0a0 - libjpeg-turbo >=3.0.0,<4.0a0 - libpng >=1.6.43,<1.7.0a0 - libtiff >=4.6.0,<4.7.0a0 license: LGPL-2.1-or-later license_family: LGPL - size: 550156 - timestamp: 1710203904195 + size: 514096 + timestamp: 1713604069354 - kind: conda - name: geos - version: 3.12.1 - build: h1537add_0 - subdir: win-64 + name: gdk-pixbuf + version: 2.42.11 + build: hb9ae30d_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.11-hb9ae30d_0.conda + sha256: 0421338fc0947d7c61ff90ed5c6aa86499c6b5a0bfcead7efda9605912bd279b + md5: 9bd27b5e21da16e40cf799bc2acf47d1 + depends: + - libgcc-ng >=12 + - libglib >=2.80.0,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + size: 526919 + timestamp: 1713604108933 +- kind: conda + name: geos + version: 3.12.1 + build: h1537add_0 + subdir: win-64 url: https://conda.anaconda.org/conda-forge/win-64/geos-3.12.1-h1537add_0.conda sha256: d7a6bb89063df38b24843e5b4c99da602333ac4e1c1e39c069f2021827d3c98d md5: 02fdccc66ed44a8f9f3731d15f445724 @@ -2184,6 +2667,20 @@ packages: license: LGPL-2.1-only size: 1561705 timestamp: 1699778438983 +- kind: conda + name: geos + version: 3.12.1 + build: h2f0025b_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/geos-3.12.1-h2f0025b_0.conda + sha256: 7e041dcaa524aeb7564f1cd3c7ba25ba1f1ed57c18b0516da92eccbd44844f24 + md5: ac30e662102643639f9421aa80723e2b + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: LGPL-2.1-only + size: 1678795 + timestamp: 1699778041248 - kind: conda name: geos version: 3.12.1 @@ -2406,6 +2903,20 @@ packages: license_family: MIT size: 74516 timestamp: 1712692686914 +- kind: conda + name: giflib + version: 5.2.2 + build: h31becfc_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda + sha256: a79dc3bd54c4fb1f249942ee2d5b601a76ecf9614774a4cff9af49adfa458db2 + md5: 2f809afaf0ba1ea4135dce158169efac + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 82124 + timestamp: 1712692444545 - kind: conda name: giflib version: 5.2.2 @@ -2435,16 +2946,16 @@ packages: - kind: conda name: glib version: 2.80.0 - build: h39d0aa6_5 - build_number: 5 + build: h39d0aa6_6 + build_number: 6 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_5.conda - sha256: b1a73c6507378f666fce8a7085f36deee04aef72f32850ae5f03725bc363ebbd - md5: 987f0532ee1075a4ef5714fa4af4842b + url: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_6.conda + sha256: 25b3e8930540cfbb87c03feda23cd412eb1b01fd903f46d1bd067f7d39d5941d + md5: a4036d0bc6f499ebe9fef7b887f3ca0f depends: - - glib-tools 2.80.0 h0a98069_5 + - glib-tools 2.80.0 h0a98069_6 - libffi >=3.4,<4.0a0 - - libglib 2.80.0 h39d0aa6_5 + - libglib 2.80.0 h39d0aa6_6 - libintl >=0.22.5,<1.0a0 - libintl-devel - python * @@ -2452,59 +2963,75 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LGPL-2.1-or-later - size: 571049 - timestamp: 1713203829694 + size: 572781 + timestamp: 1713639879324 - kind: conda name: glib version: 2.80.0 - build: hf2295e7_5 - build_number: 5 + build: hf2295e7_6 + build_number: 6 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_5.conda - sha256: 082a1f095f7511ad4339a656714a0ed623758eb0a1caf69494702a59d86f598c - md5: 87562e94dd3948838172eb97175c0e42 + url: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_6.conda + sha256: 186e366c3a48c07830aa94dfc84616155bdfd08e9b73cb8e482c6ca84a550d3e + md5: a1e026a82a562b443845db5614ca568a depends: - - glib-tools 2.80.0 hde27a5a_5 + - glib-tools 2.80.0 hde27a5a_6 - libffi >=3.4,<4.0a0 - libgcc-ng >=12 - - libglib 2.80.0 hf2295e7_5 + - libglib 2.80.0 hf2295e7_6 - python * license: LGPL-2.1-or-later - size: 599358 - timestamp: 1713203410775 + size: 597788 + timestamp: 1713639483074 - kind: conda name: glib-tools version: 2.80.0 - build: h0a98069_5 - build_number: 5 + build: h0a98069_6 + build_number: 6 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_5.conda - sha256: f802e16d4f229938e320bf3bfa4334f48fdb6d58e1621778c001218c6d0137de - md5: a3fa92819125c3d9e21f7401427af890 + url: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_6.conda + sha256: a7533a2e10fe95c8503e990da15933711843061e962450a1c7e753dc050f221b + md5: 40d452e4012c00f644b1dd6319fcdbcf depends: - - libglib 2.80.0 h39d0aa6_5 + - libglib 2.80.0 h39d0aa6_6 - libintl >=0.22.5,<1.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LGPL-2.1-or-later - size: 95213 - timestamp: 1713203782182 + size: 94763 + timestamp: 1713639812512 - kind: conda name: glib-tools version: 2.80.0 - build: hde27a5a_5 - build_number: 5 + build: hde27a5a_6 + build_number: 6 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_5.conda - sha256: 5d8a1e61d054a7147217f7ba9ad675f45f5b642c413a8d3e33ada224f62ba2a5 - md5: 349c38d491861ff6dd7746729912f2f7 + url: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_6.conda + sha256: fb63c92ba2b08aad574404c6229d45f12dc78309ff7a540f1e8d941a8a075074 + md5: a9d23c02485c5cf055f9ac90eb9c9c63 depends: - libgcc-ng >=12 - - libglib 2.80.0 hf2295e7_5 + - libglib 2.80.0 hf2295e7_6 license: LGPL-2.1-or-later - size: 115170 - timestamp: 1713203374426 + size: 113049 + timestamp: 1713639447140 +- kind: conda + name: graphite2 + version: 1.3.13 + build: h2f0025b_1003 + build_number: 1003 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.13-h2f0025b_1003.conda + sha256: c7585e1fb536120583790080f3b3875c04d5f2d64eafbc87e9aa39895e4118c0 + md5: f33009add6a08358bc12d114ceec1304 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: LGPL-2.0-or-later + license_family: LGPL + size: 99453 + timestamp: 1711634223220 - kind: conda name: graphite2 version: 1.3.13 @@ -2600,6 +3127,38 @@ packages: license_family: Other size: 3101737 timestamp: 1657298141011 +- kind: conda + name: graphviz + version: 2.50.0 + build: h856fde9_3 + build_number: 3 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/graphviz-2.50.0-h856fde9_3.tar.bz2 + sha256: 92897043ad8119d02fb703898b4c507157e79152da14d75d5d2024761446d0ba + md5: caefd71249206ab252d41f3931d65755 + depends: + - cairo >=1.16.0,<2.0.0a0 + - expat >=2.4.8,<3.0a0 + - fontconfig >=2.13.96,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.10.4,<3.0a0 + - gdk-pixbuf >=2.42.8,<3.0a0 + - gtk2 + - gts >=0.7.6,<0.8.0a0 + - libgcc-ng >=12 + - libgd >=2.3.3,<2.4.0a0 + - libglib >=2.70.2,<3.0a0 + - librsvg >=2.54.4,<3.0a0 + - libstdcxx-ng >=12 + - libtool + - libwebp-base + - libzlib >=1.2.12,<1.3.0a0 + - pango >=1.50.8,<1.51.0a0 + - zlib >=1.2.12,<1.3.0a0 + license: EPL-1.0 + license_family: Other + size: 3293635 + timestamp: 1657298269723 - kind: conda name: graphviz version: 2.50.0 @@ -2782,6 +3341,32 @@ packages: license_family: LGPL size: 2069365 timestamp: 1711318923388 +- kind: conda + name: gtk2 + version: 2.24.33 + build: h0d7db29_4 + build_number: 4 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/gtk2-2.24.33-h0d7db29_4.conda + sha256: 1ab89b67ed28f9ff2a8925b4cd79b0c7d7793481e6f3775b691987d09cf2a1c7 + md5: c65965f92ea5701d983d16aada829dd9 + depends: + - atk-1.0 >=2.38.0 + - cairo >=1.18.0,<2.0a0 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - gdk-pixbuf >=2.42.10,<3.0a0 + - harfbuzz >=8.3.0,<9.0a0 + - libgcc-ng >=12 + - libglib >=2.78.4,<3.0a0 + - pango >=1.50.14,<2.0a0 + - xorg-libx11 >=1.8.7,<2.0a0 + - xorg-libxext >=1.3.4,<2.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + license: LGPL-2.1-or-later + size: 6664464 + timestamp: 1710148262255 - kind: conda name: gtk2 version: 2.24.33 @@ -2897,6 +3482,23 @@ packages: license_family: LGPL size: 318312 timestamp: 1686545244763 +- kind: conda + name: gts + version: 0.7.6 + build: he293c15_4 + build_number: 4 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/gts-0.7.6-he293c15_4.conda + sha256: 1e9cc30d1c746d5a3399a279f5f642a953f37d9f9c82fd4d55b301e9c2a23f7c + md5: 2aeaeddbd89e84b60165463225814cfc + depends: + - libgcc-ng >=12 + - libglib >=2.76.3,<3.0a0 + - libstdcxx-ng >=12 + license: LGPL-2.0-or-later + license_family: LGPL + size: 332673 + timestamp: 1686545222091 - kind: conda name: gts version: 0.7.6 @@ -2974,6 +3576,26 @@ packages: license_family: MIT size: 1295036 timestamp: 1699925935335 +- kind: conda + name: harfbuzz + version: 8.3.0 + build: hebeb849_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-8.3.0-hebeb849_0.conda + sha256: f6f39bb13d0070565e8975ad5f23005ce894655422a1c50089e6d754c69be084 + md5: 1c06a74f88f085c2af16809fe4c31b73 + depends: + - cairo >=1.18.0,<2.0a0 + - freetype >=2.12.1,<3.0a0 + - graphite2 + - icu >=73.2,<74.0a0 + - libgcc-ng >=12 + - libglib >=2.78.1,<3.0a0 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + size: 1583124 + timestamp: 1699927567410 - kind: conda name: harfbuzz version: 8.3.0 @@ -3025,6 +3647,21 @@ packages: license_family: MIT size: 13422193 timestamp: 1692901469029 +- kind: conda + name: icu + version: '73.2' + build: h787c7f5_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-73.2-h787c7f5_0.conda + sha256: aedb9c911ede5596c87e1abd763ed940fab680d71fdb953bce8e4094119d47b3 + md5: 9d3c29d71f28452a2e843aff8cbe09d2 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + size: 12237094 + timestamp: 1692900632394 - kind: conda name: icu version: '73.2' @@ -3051,19 +3688,19 @@ packages: timestamp: 1692901622519 - kind: conda name: idna - version: '3.6' + version: '3.7' build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda - sha256: 6ee4c986d69ce61e60a20b2459b6f2027baeba153f0a64995fd3cb47c2cc7e07 - md5: 1a76f09108576397c41c0b0c5bd84134 + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + sha256: 9687ee909ed46169395d4f99a0ee94b80a52f87bed69cd454bb6d37ffeb0ec7b + md5: c0cc1420498b17414d8617d0b9f506ca depends: - python >=3.6 license: BSD-3-Clause license_family: BSD - size: 50124 - timestamp: 1701027126206 + size: 52718 + timestamp: 1713279497047 - kind: conda name: importlib-resources version: 6.4.0 @@ -3215,6 +3852,24 @@ packages: license_family: BSD size: 79895 timestamp: 1710257881036 +- kind: conda + name: jupyter_core + version: 5.7.2 + build: py39h4420490_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/jupyter_core-5.7.2-py39h4420490_0.conda + sha256: 6eeadf893308e6a9e27b978f013968b178e080eb383532f5dbc0691f93438141 + md5: 7d9cb6936e2b7c33480a8890d4f2d41c + depends: + - platformdirs >=2.5 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + - traitlets >=5.3 + license: BSD-3-Clause + license_family: BSD + size: 80302 + timestamp: 1710257538687 - kind: conda name: jupyter_core version: 5.7.2 @@ -3338,6 +3993,24 @@ packages: license_family: BSD size: 60498 timestamp: 1695380322018 +- kind: conda + name: kiwisolver + version: 1.4.5 + build: py39had2cf8c_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.4.5-py39had2cf8c_1.conda + sha256: aa6b1145e81ec1e5458f54b1ce0243cc24a70c6a2da20c6afae0482fed6a05a9 + md5: ddb99610f7b950fdd5ff2aff19136363 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 73233 + timestamp: 1695381496108 - kind: conda name: kiwisolver version: 1.4.5 @@ -3425,6 +4098,22 @@ packages: license_family: MIT size: 507632 timestamp: 1701648249706 +- kind: conda + name: lcms2 + version: '2.16' + build: h922389a_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.16-h922389a_0.conda + sha256: be4847b1014d3cbbc524a53bdbf66182f86125775020563e11d914c8468dd97d + md5: ffdd8267a04c515e7ce69c727b051414 + depends: + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.7.0a0 + license: MIT + license_family: MIT + size: 296219 + timestamp: 1701647961116 - kind: conda name: lcms2 version: '2.16' @@ -3474,17 +4163,29 @@ packages: - kind: conda name: ld_impl_linux-64 version: '2.40' - build: h41732ed_0 + build: h55db66e_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda - sha256: f6cc89d887555912d6c61b295d398cff9ec982a3417d38025c45d5dd9b9e79cd - md5: 7aca3059a1729aa76c597603f10b0dd3 + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h55db66e_0.conda + sha256: ef969eee228cfb71e55146eaecc6af065f468cb0bc0a5239bc053b39db0b5f09 + md5: 10569984e7db886e4f1abc2b47ad79a1 constrains: - binutils_impl_linux-64 2.40 license: GPL-3.0-only - license_family: GPL - size: 704696 - timestamp: 1674833944779 + size: 713322 + timestamp: 1713651222435 +- kind: conda + name: ld_impl_linux-aarch64 + version: '2.40' + build: hba4e955_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-hba4e955_0.conda + sha256: a306f9368b490b5fd926abf42d9a796e1725cbc7c3e631fc404f80a2bf7d1388 + md5: b55c1cb33c63d23b542fa53f24541e56 + constrains: + - binutils_impl_linux-aarch64 2.40 + license: GPL-3.0-only + size: 735254 + timestamp: 1713651051970 - kind: conda name: lerc version: 4.0.0 @@ -3500,6 +4201,21 @@ packages: license_family: Apache size: 281798 timestamp: 1657977462600 +- kind: conda + name: lerc + version: 4.0.0 + build: h4de3ea5_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 + sha256: 2d09ef9b7796d83364957e420b41c32d94e628c3f0520b61c332518a7b5cd586 + md5: 1a0ffc65e03ce81559dbcb0695ad1476 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: Apache-2.0 + license_family: Apache + size: 262096 + timestamp: 1657978241894 - kind: conda name: lerc version: 4.0.0 @@ -3672,6 +4388,27 @@ packages: license_family: BSD size: 14537 timestamp: 1712542250081 +- kind: conda + name: libblas + version: 3.9.0 + build: 22_linuxaarch64_openblas + build_number: 22 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.9.0-22_linuxaarch64_openblas.conda + sha256: eb4398566a601e68b21ceab9a905a619b94d4d6c8242fffd9ed57cc26d29e278 + md5: 068ab33f2382cda4dd0b72a715ad33b5 + depends: + - libopenblas >=0.3.27,<0.3.28.0a0 + - libopenblas >=0.3.27,<1.0a0 + constrains: + - blas * openblas + - libcblas 3.9.0 22_linuxaarch64_openblas + - liblapacke 3.9.0 22_linuxaarch64_openblas + - liblapack 3.9.0 22_linuxaarch64_openblas + license: BSD-3-Clause + license_family: BSD + size: 14612 + timestamp: 1712542041279 - kind: conda name: libblas version: 3.9.0 @@ -3747,6 +4484,21 @@ packages: license_family: MIT size: 67476 timestamp: 1695990207321 +- kind: conda + name: libbrotlicommon + version: 1.1.0 + build: h31becfc_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.1.0-h31becfc_1.conda + sha256: 1c3d4ea61e862eb5f1968915f6f5917ea61db9921aec30b14785775c87234060 + md5: 1b219fd801eddb7a94df5bd001053ad9 + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 69237 + timestamp: 1695990107496 - kind: conda name: libbrotlicommon version: 1.1.0 @@ -3807,6 +4559,22 @@ packages: license_family: MIT size: 30327 timestamp: 1695990232422 +- kind: conda + name: libbrotlidec + version: 1.1.0 + build: h31becfc_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.1.0-h31becfc_1.conda + sha256: 1d2558efbb727f9065dd94d5f906aa68252153f80e571456d3695fa102e8a352 + md5: 8db7cff89510bec0b863a0a8ee6a7bce + depends: + - libbrotlicommon 1.1.0 h31becfc_1 + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 31926 + timestamp: 1695990123189 - kind: conda name: libbrotlidec version: 1.1.0 @@ -3871,6 +4639,22 @@ packages: license_family: MIT size: 299092 timestamp: 1695990259225 +- kind: conda + name: libbrotlienc + version: 1.1.0 + build: h31becfc_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.1.0-h31becfc_1.conda + sha256: 271fd8ef9181ad19246bf8b4273c99b9608c6eedecb6b11cd925211b8f1c6217 + md5: ad3d3a826b5848d99936e4466ebbaa26 + depends: + - libbrotlicommon 1.1.0 h31becfc_1 + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 290542 + timestamp: 1695990138784 - kind: conda name: libbrotlienc version: 1.1.0 @@ -3954,6 +4738,25 @@ packages: license_family: BSD size: 14438 timestamp: 1712542270166 +- kind: conda + name: libcblas + version: 3.9.0 + build: 22_linuxaarch64_openblas + build_number: 22 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.9.0-22_linuxaarch64_openblas.conda + sha256: 04e31c5f3a3b345a8fcdfa6f5c75909688a134bf9ee93c367c6e5affca501068 + md5: fbe7fe553f2cc78a0311e009b26f180d + depends: + - libblas 3.9.0 22_linuxaarch64_openblas + constrains: + - blas * openblas + - liblapack 3.9.0 22_linuxaarch64_openblas + - liblapacke 3.9.0 22_linuxaarch64_openblas + license: BSD-3-Clause + license_family: BSD + size: 14514 + timestamp: 1712542053335 - kind: conda name: libcblas version: 3.9.0 @@ -4104,6 +4907,20 @@ packages: license_family: Apache size: 1142172 timestamp: 1686896907750 +- kind: conda + name: libdeflate + version: '1.20' + build: h31becfc_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.20-h31becfc_0.conda + sha256: 01efbc296d47de9861100d9a9ad2c7f682adc71a0e9b9b040a35b454d1ccd3bd + md5: 018592a3d691662f451f89d0de474a20 + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 69943 + timestamp: 1711196586503 - kind: conda name: libdeflate version: '1.20' @@ -4190,6 +5007,22 @@ packages: license_family: BSD size: 427426 timestamp: 1685725977222 +- kind: conda + name: libexpat + version: 2.6.2 + build: h2f0025b_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.2-h2f0025b_0.conda + sha256: 07453df3232a649f39fb4d1e68cfe1c78c3457764f85225f6f3ccd1bdd9818a4 + md5: 1b9f46b804a2c3c5d7fd6a80b77c35f9 + depends: + - libgcc-ng >=12 + constrains: + - expat 2.6.2.* + license: MIT + license_family: MIT + size: 72544 + timestamp: 1710362309065 - kind: conda name: libexpat version: 2.6.2 @@ -4274,6 +5107,21 @@ packages: license_family: MIT size: 39020 timestamp: 1636488587153 +- kind: conda + name: libffi + version: 3.4.2 + build: h3557bc0_5 + build_number: 5 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2 + sha256: 7e9258a102480757fe3faeb225a3ca04dffd10fecd2a958c65cdb4cdf75f2c3c + md5: dddd85f4d52121fab0a8b099c5e06501 + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + size: 59450 + timestamp: 1636488255090 - kind: conda name: libffi version: 3.4.2 @@ -4341,6 +5189,23 @@ packages: license_family: GPL size: 770506 timestamp: 1706819192021 +- kind: conda + name: libgcc-ng + version: 13.2.0 + build: hf8544c7_5 + build_number: 5 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-13.2.0-hf8544c7_5.conda + sha256: 869e44e1cf329198f5bea56c146207ed639b24b6281187159435b9499ecb3959 + md5: dee934e640275d9e74e7bbd455f25162 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgomp 13.2.0 hf8544c7_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 456795 + timestamp: 1706820691781 - kind: conda name: libgcrypt version: 1.10.3 @@ -4446,12 +5311,12 @@ packages: - kind: conda name: libgd version: 2.3.3 - build: hfdf3952_9 + build: hcd22fd5_9 build_number: 9 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-hfdf3952_9.conda - sha256: cfdecfaa27807abc2728bd8c60b923ce1b44020553e122e9a56fc3acb77acaec - md5: 0d847466f115fbdaaf2b6926f2e33278 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgd-2.3.3-hcd22fd5_9.conda + sha256: fe821d61ff28069d6ff8a56a354329808d03a84900a5491c166c585b0ee5b78b + md5: 765021fb606a138701b961b4a3607a3e depends: - expat - fontconfig >=2.14.2,<3.0a0 @@ -4459,7 +5324,7 @@ packages: - freetype >=2.12.1,<3.0a0 - icu >=73.2,<74.0a0 - libexpat >=2.5.0,<3.0a0 - - libiconv >=1.17,<2.0a0 + - libgcc-ng >=12 - libjpeg-turbo >=3.0.0,<4.0a0 - libpng >=1.6.39,<1.7.0a0 - libtiff >=4.6.0,<4.7.0a0 @@ -4469,14 +5334,42 @@ packages: - zlib license: GD license_family: BSD - size: 206783 - timestamp: 1696161158189 + size: 231712 + timestamp: 1696160722186 - kind: conda - name: libgettextpo - version: 0.22.5 - build: h5728263_2 - build_number: 2 - subdir: win-64 + name: libgd + version: 2.3.3 + build: hfdf3952_9 + build_number: 9 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-hfdf3952_9.conda + sha256: cfdecfaa27807abc2728bd8c60b923ce1b44020553e122e9a56fc3acb77acaec + md5: 0d847466f115fbdaaf2b6926f2e33278 + depends: + - expat + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - icu >=73.2,<74.0a0 + - libexpat >=2.5.0,<3.0a0 + - libiconv >=1.17,<2.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp + - libwebp-base >=1.3.2,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - zlib + license: GD + license_family: BSD + size: 206783 + timestamp: 1696161158189 +- kind: conda + name: libgettextpo + version: 0.22.5 + build: h5728263_2 + build_number: 2 + subdir: win-64 url: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-0.22.5-h5728263_2.conda sha256: 445ecfc4bf5b474c2ac79f716dcb8459a08a532ab13a785744665f086ef94c95 md5: f4c826b19bf1ccee2a63a2c685039728 @@ -4646,6 +5539,21 @@ packages: license_family: GPL size: 23829 timestamp: 1706819413770 +- kind: conda + name: libgfortran-ng + version: 13.2.0 + build: he9431aa_5 + build_number: 5 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-13.2.0-he9431aa_5.conda + sha256: a7e5d1ac34118a4fad8286050af0146226d2fb2bd63e7a1066dc4dae7ba42daa + md5: fab7c6a8c84492e18cbe578820e97a56 + depends: + - libgfortran5 13.2.0 h582850c_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 23994 + timestamp: 1706820985230 - kind: conda name: libgfortran5 version: 13.2.0 @@ -4663,6 +5571,23 @@ packages: license_family: GPL size: 1571379 timestamp: 1707328880361 +- kind: conda + name: libgfortran5 + version: 13.2.0 + build: h582850c_5 + build_number: 5 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-13.2.0-h582850c_5.conda + sha256: f778346e85eb19bca36d1a5c8cddf8e089dcd6799b8f3e1b3f2d5a3157920827 + md5: 547486aac825d236de3beecb927b389c + depends: + - libgcc-ng >=13.2.0 + constrains: + - libgfortran-ng 13.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 1082835 + timestamp: 1706820715400 - kind: conda name: libgfortran5 version: 13.2.0 @@ -4700,12 +5625,12 @@ packages: - kind: conda name: libglib version: 2.80.0 - build: h39d0aa6_5 - build_number: 5 + build: h39d0aa6_6 + build_number: 6 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_5.conda - sha256: 73ed5772acce96d0dc88c13000ee7678d12dda88b07ad721d4d20c807a98b6c2 - md5: c2e707c449ac60fa0ad8fbdd8f79327c + url: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_6.conda + sha256: 87772cdcfb292a64ddd9e737c5deaaf671c7cd82b22ad70c8a8a9f1f34074fb5 + md5: cd5c6efbe213c089f78575c98ab9a0ed depends: - libffi >=3.4,<4.0a0 - libiconv >=1.17,<2.0a0 @@ -4716,19 +5641,19 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - - glib 2.80.0 *_5 + - glib 2.80.0 *_6 license: LGPL-2.1-or-later - size: 3699734 - timestamp: 1713203698247 + size: 3740691 + timestamp: 1713639713931 - kind: conda name: libglib version: 2.80.0 - build: h81c1438_5 - build_number: 5 + build: h81c1438_6 + build_number: 6 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.0-h81c1438_5.conda - sha256: a6778ec265222eb9277ec9f2e7519a80dadea0455c7d5386eab624d699346868 - md5: 9105a1c35c37d2908a543bdf7f08f80a + url: https://conda.anaconda.org/conda-forge/osx-64/libglib-2.80.0-h81c1438_6.conda + sha256: 1cbca3cfdc470c528a36c93d9d478103d2a7a6036814ab23fa0486cde29e9607 + md5: 54dd1ed37dd65c5d13600bcc5ebbd0a1 depends: - libffi >=3.4,<4.0a0 - libiconv >=1.17,<2.0a0 @@ -4736,19 +5661,39 @@ packages: - libzlib >=1.2.13,<1.3.0a0 - pcre2 >=10.43,<10.44.0a0 constrains: - - glib 2.80.0 *_5 + - glib 2.80.0 *_6 license: LGPL-2.1-or-later - size: 3645199 - timestamp: 1713203913332 + size: 3687274 + timestamp: 1713641327993 - kind: conda name: libglib version: 2.80.0 - build: hf2295e7_5 - build_number: 5 + build: h9d8fbc1_6 + build_number: 6 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.80.0-h9d8fbc1_6.conda + sha256: b013379d259a0135a55ccdbc9688740720e5410ff8d4197d6ff2631e2a7ad636 + md5: c7b8b76a9753281cd37b1b692b740f4a + depends: + - libffi >=3.4,<4.0a0 + - libgcc-ng >=12 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - pcre2 >=10.43,<10.44.0a0 + constrains: + - glib 2.80.0 *_6 + license: LGPL-2.1-or-later + size: 4005917 + timestamp: 1713639406417 +- kind: conda + name: libglib + version: 2.80.0 + build: hf2295e7_6 + build_number: 6 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_5.conda - sha256: 18233d83e0385afc50148520e5b9c6ee65886c41ecdc69e335f60a279fb7a1f5 - md5: 4423ae9726113b68e9527b27baae191f + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_6.conda + sha256: d2867a1515676f3b64265420598badb2e4ad2369d85237fb276173a99959eb37 + md5: 9342e7c44c38bea649490f72d92c382d depends: - libffi >=3.4,<4.0a0 - libgcc-ng >=12 @@ -4756,19 +5701,19 @@ packages: - libzlib >=1.2.13,<1.3.0a0 - pcre2 >=10.43,<10.44.0a0 constrains: - - glib 2.80.0 *_5 + - glib 2.80.0 *_6 license: LGPL-2.1-or-later - size: 3892640 - timestamp: 1713203313894 + size: 3942450 + timestamp: 1713639388280 - kind: conda name: libglib version: 2.80.0 - build: hfc324ee_5 - build_number: 5 + build: hfc324ee_6 + build_number: 6 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.0-hfc324ee_5.conda - sha256: 4aa0a6f358592bad428046a6928066ba9fb4d7f61cf6338a83fe544cfe927773 - md5: dfb5f524aacd7a8103527b2a3809d3e7 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.80.0-hfc324ee_6.conda + sha256: 912913b1d6f3ec1e7dcb3a59426f2d9f70a996891cca718f32195687eb271e06 + md5: 762a78b7637203d7ada1403e547470ec depends: - libffi >=3.4,<4.0a0 - libiconv >=1.17,<2.0a0 @@ -4776,10 +5721,10 @@ packages: - libzlib >=1.2.13,<1.3.0a0 - pcre2 >=10.43,<10.44.0a0 constrains: - - glib 2.80.0 *_5 + - glib 2.80.0 *_6 license: LGPL-2.1-or-later - size: 2559555 - timestamp: 1713204185625 + size: 3615908 + timestamp: 1713639914767 - kind: conda name: libgomp version: 13.2.0 @@ -4795,6 +5740,19 @@ packages: license_family: GPL size: 419751 timestamp: 1706819107383 +- kind: conda + name: libgomp + version: 13.2.0 + build: hf8544c7_5 + build_number: 5 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.2.0-hf8544c7_5.conda + sha256: a98d4f242a351feb7983a28e7d6a0ca51da764c6233ea3dfc776975a3aba8a01 + md5: 379be2f115ffb73860e4e260dd2170b7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 423091 + timestamp: 1706820564165 - kind: conda name: libgpg-error version: '1.48' @@ -4842,6 +5800,20 @@ packages: license: LGPL-2.1-only size: 676469 timestamp: 1702682458114 +- kind: conda + name: libiconv + version: '1.17' + build: h31becfc_2 + build_number: 2 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda + sha256: a30e09d089cb75a0d5b8e5c354694c1317da98261185ed65aa3793e741060614 + md5: 9a8eb13f14de7d761555a98712e6df65 + depends: + - libgcc-ng >=12 + license: LGPL-2.1-only + size: 705787 + timestamp: 1702684557134 - kind: conda name: libiconv version: '1.17' @@ -4985,6 +5957,22 @@ packages: license: IJG AND BSD-3-Clause AND Zlib size: 579748 timestamp: 1694475265912 +- kind: conda + name: libjpeg-turbo + version: 3.0.0 + build: h31becfc_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda + sha256: 675bc1f2a8581cd34a86c412663ec29c5f90c1d9f8d11866aa1ade5cdbdf8429 + md5: ed24e702928be089d9ba3f05618515c6 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + size: 647126 + timestamp: 1694475003570 - kind: conda name: libjpeg-turbo version: 3.0.0 @@ -5052,6 +6040,25 @@ packages: license_family: BSD size: 14471 timestamp: 1712542277696 +- kind: conda + name: liblapack + version: 3.9.0 + build: 22_linuxaarch64_openblas + build_number: 22 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-22_linuxaarch64_openblas.conda + sha256: a7cb3fd83fdd6eca14adbe3d0cbba6e6246683d39af783f5c05852ed2a9e16a5 + md5: 8c709d281609792c39b1d5c0241f90f1 + depends: + - libblas 3.9.0 22_linuxaarch64_openblas + constrains: + - blas * openblas + - libcblas 3.9.0 22_linuxaarch64_openblas + - liblapacke 3.9.0 22_linuxaarch64_openblas + license: BSD-3-Clause + license_family: BSD + size: 14451 + timestamp: 1712542059832 - kind: conda name: liblapack version: 3.9.0 @@ -5146,6 +6153,20 @@ packages: license_family: Apache size: 38422113 timestamp: 1712517638355 +- kind: conda + name: libnsl + version: 2.0.1 + build: h31becfc_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + license: LGPL-2.1-only + license_family: GPL + size: 34501 + timestamp: 1697358973269 - kind: conda name: libnsl version: 2.0.1 @@ -5245,6 +6266,24 @@ packages: license_family: BSD size: 5598747 timestamp: 1712364444346 +- kind: conda + name: libopenblas + version: 0.3.27 + build: pthreads_h5a5ec62_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.27-pthreads_h5a5ec62_0.conda + sha256: 8a898c64f769c03217fee45d2df9faaee6c1a24349e21ba3569bc7a2ed8dfd1e + md5: ffecca8f4f31cd50b92c0e6e6bfe4416 + depends: + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=12.3.0 + constrains: + - openblas >=0.3.27,<0.3.28.0a0 + license: BSD-3-Clause + license_family: BSD + size: 4300345 + timestamp: 1712492725507 - kind: conda name: libopus version: 1.3.1 @@ -5273,6 +6312,20 @@ packages: license: zlib-acknowledgement size: 264177 timestamp: 1708780447187 +- kind: conda + name: libpng + version: 1.6.43 + build: h194ca79_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.43-h194ca79_0.conda + sha256: 6f408f3d6854f86e223289f0dda12562b047c7a1fdf3636c67ec39afcd141f43 + md5: 1123e504d9254dd9494267ab9aba95f0 + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<1.3.0a0 + license: zlib-acknowledgement + size: 294380 + timestamp: 1708782876525 - kind: conda name: libpng version: 1.6.43 @@ -5335,64 +6388,89 @@ packages: - kind: conda name: librsvg version: 2.58.0 - build: h7b06fc5_0 + build: h010368b_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/librsvg-2.58.0-h010368b_1.conda + sha256: db98f7915755edcde2f24a34f3e752bdb5a1da916dd52dd56b872074dcedfc5f + md5: d29998bcb90c0468f2abc49854349ed9 + depends: + - cairo >=1.18.0,<2.0a0 + - freetype >=2.12.1,<3.0a0 + - gdk-pixbuf >=2.42.10,<3.0a0 + - harfbuzz >=8.3.0,<9.0a0 + - libgcc-ng >=12 + - libglib >=2.80.0,<3.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libxml2 >=2.12.6,<3.0a0 + - pango >=1.50.14,<2.0a0 + license: LGPL-2.1-or-later + size: 6541210 + timestamp: 1713376776362 +- kind: conda + name: librsvg + version: 2.58.0 + build: h7b06fc5_1 + build_number: 1 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.58.0-h7b06fc5_0.conda - sha256: 4bd11494357eac8f9b71945bdaf55a5868d65829b05224dd6c3b0a51d6d974c8 - md5: 3ad98f9e1ad2b0c9b202b9d5212752d2 + url: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.58.0-h7b06fc5_1.conda + sha256: a8ecadeeb7e0a146919d3548f8a6127f88a963313f227db5ba77e1c6e89c2b46 + md5: e4a5f1bb5962ec6f2f2d2f0467ed0826 depends: - __osx >=10.12 - cairo >=1.18.0,<2.0a0 - gdk-pixbuf >=2.42.10,<3.0a0 - - gettext >=0.21.1,<1.0a0 - libglib >=2.80.0,<3.0a0 - libxml2 >=2.12.6,<3.0a0 - pango >=1.50.14,<2.0a0 constrains: - __osx >=10.12 license: LGPL-2.1-or-later - size: 4963394 - timestamp: 1712271256465 + size: 5307232 + timestamp: 1713370349551 - kind: conda name: librsvg version: 2.58.0 - build: hb3d354b_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.58.0-hb3d354b_0.conda - sha256: d948ebcbf6acc30b81b61f074662582d2560130463da25bb7d7a724836d55a37 - md5: a62815a3ebaf337a2747afa6a69efa0a + build: hadf69e7_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.0-hadf69e7_1.conda + sha256: eaba82901f01f3ede8b1307c64e0448df8c5e9af9c6b78600c5f63c91c122e45 + md5: 0e2b5bd9533043b41f9482ae9e2c16b5 depends: - - __osx >=11.0 - cairo >=1.18.0,<2.0a0 + - freetype >=2.12.1,<3.0a0 - gdk-pixbuf >=2.42.10,<3.0a0 - - gettext >=0.21.1,<1.0a0 + - harfbuzz >=8.3.0,<9.0a0 + - libgcc-ng >=12 - libglib >=2.80.0,<3.0a0 + - libpng >=1.6.43,<1.7.0a0 - libxml2 >=2.12.6,<3.0a0 - pango >=1.50.14,<2.0a0 - constrains: - - __osx >=11.0 license: LGPL-2.1-or-later - size: 4797834 - timestamp: 1712272013941 + size: 5997596 + timestamp: 1713369512903 - kind: conda name: librsvg version: 2.58.0 - build: hce6bd6c_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.0-hce6bd6c_0.conda - sha256: 3f69e1350821426598688de0db7834f303dd05fd5c9ceb5e4c27c93889a24413 - md5: 0891de8980ee29828542dbf9578838b9 + build: hb3d354b_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.58.0-hb3d354b_1.conda + sha256: c57a7fc7b24e5d036b0f2e5c871af0b636d46455cf73497fc2a6a5f873542b65 + md5: eefc587613e6097d9c0b14188c292b5d depends: + - __osx >=11.0 - cairo >=1.18.0,<2.0a0 - gdk-pixbuf >=2.42.10,<3.0a0 - - gettext >=0.21.1,<1.0a0 - - libgcc-ng >=12 - libglib >=2.80.0,<3.0a0 - libxml2 >=2.12.6,<3.0a0 - pango >=1.50.14,<2.0a0 + constrains: + - __osx >=11.0 license: LGPL-2.1-or-later - size: 6004734 - timestamp: 1712270439751 + size: 4774673 + timestamp: 1713371158806 - kind: conda name: libsndfile version: 1.2.2 @@ -5417,59 +6495,73 @@ packages: timestamp: 1695747735668 - kind: conda name: libsqlite - version: 3.45.2 + version: 3.45.3 build: h091b4b1_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.2-h091b4b1_0.conda - sha256: 7c234320a1a2132b9cc972aaa06bb215bb220a5b1addb0bed7a5a321c805920e - md5: 9d07427ee5bd9afd1e11ce14368a48d6 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda + sha256: 4337f466eb55bbdc74e168b52ec8c38f598e3664244ec7a2536009036e2066cc + md5: c8c1186c7f3351f6ffddb97b1f54fc58 + depends: + - libzlib >=1.2.13,<1.3.0a0 + license: Unlicense + size: 824794 + timestamp: 1713367748819 +- kind: conda + name: libsqlite + version: 3.45.3 + build: h194ca79_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.45.3-h194ca79_0.conda + sha256: be87d8b67bdf892665c709d82c48011991fbf2fa15c19b006379b03ed494b070 + md5: fb35b8afbe9e92467ac7b5608d60b775 depends: + - libgcc-ng >=12 - libzlib >=1.2.13,<1.3.0a0 license: Unlicense - size: 825300 - timestamp: 1710255078823 + size: 1036705 + timestamp: 1713367400740 - kind: conda name: libsqlite - version: 3.45.2 + version: 3.45.3 build: h2797004_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda - sha256: 8cdbeb7902729e319510a82d7c642402981818702b58812af265ef55d1315473 - md5: 866983a220e27a80cb75e85cb30466a1 + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda + sha256: e2273d6860eadcf714a759ffb6dc24a69cfd01f2a0ea9d6c20f86049b9334e0c + md5: b3316cbe90249da4f8e84cd66e1cc55b depends: - libgcc-ng >=12 - libzlib >=1.2.13,<1.3.0a0 license: Unlicense - size: 857489 - timestamp: 1710254744982 + size: 859858 + timestamp: 1713367435849 - kind: conda name: libsqlite - version: 3.45.2 + version: 3.45.3 build: h92b6c6a_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.2-h92b6c6a_0.conda - sha256: 320ec73a4e3dd377757a2595770b8137ec4583df4d7782472d76377cdbdc4543 - md5: 086f56e13a96a6cfb1bf640505ae6b70 + url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.3-h92b6c6a_0.conda + sha256: 4d44b68fb29dcbc2216a8cae0b274b02ef9b4ae05d1d0f785362ed30b91c9b52 + md5: 68e462226209f35182ef66eda0f794ff depends: - libzlib >=1.2.13,<1.3.0a0 license: Unlicense - size: 902355 - timestamp: 1710254991672 + size: 902546 + timestamp: 1713367776445 - kind: conda name: libsqlite - version: 3.45.2 + version: 3.45.3 build: hcfcfb64_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.2-hcfcfb64_0.conda - sha256: 4bb24b986550275a6d02835150d943c4c675808d05c0efc5c2a22154d007a69f - md5: f95359f8dc5abf7da7776ece9ef10bc5 + url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.3-hcfcfb64_0.conda + sha256: 06ec75faa51d7ec6d5db98889e869b579a9df19d7d3d9baff8359627da4a3b7e + md5: 73f5dc8e2d55d9a1e14b11f49c3b4a28 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Unlicense - size: 869606 - timestamp: 1710255095740 + size: 870518 + timestamp: 1713367888406 - kind: conda name: libstdcxx-ng version: 13.2.0 @@ -5483,6 +6575,19 @@ packages: license_family: GPL size: 3834139 timestamp: 1706819252496 +- kind: conda + name: libstdcxx-ng + version: 13.2.0 + build: h9a76618_5 + build_number: 5 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.2.0-h9a76618_5.conda + sha256: c209f23a8a497fc87107a68b6bbc8d2089cf15fd4015b558dfdce63544379b05 + md5: 1b79d37dce0fad96bdf3de03925f43b4 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3752658 + timestamp: 1706820778418 - kind: conda name: libsystemd0 version: '255' @@ -5589,6 +6694,28 @@ packages: license: HPND size: 787198 timestamp: 1711218639912 +- kind: conda + name: libtiff + version: 4.6.0 + build: hf980d43_3 + build_number: 3 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.6.0-hf980d43_3.conda + sha256: 8f578c4e5acf94479b698aea284b2ebfeb32dc3ae99a60c7ef5e07c7003d98cc + md5: b6f3abf5726ae33094bee238b4eb492f + depends: + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.20,<1.21.0a0 + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libstdcxx-ng >=12 + - libwebp-base >=1.3.2,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.5,<1.6.0a0 + license: HPND + size: 316525 + timestamp: 1711218038581 - kind: conda name: libtool version: 2.4.7 @@ -5603,6 +6730,20 @@ packages: license_family: GPL size: 411817 timestamp: 1672361825713 +- kind: conda + name: libtool + version: 2.4.7 + build: h4de3ea5_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libtool-2.4.7-h4de3ea5_0.conda + sha256: 30317589d42f65c4d9e58a67253746ac46f22a9afdb61d7732b27a56e49e1a14 + md5: 6fceb9b65466da0b2f4d7dea52716da0 + depends: + - libgcc-ng >=12 + license: GPL-2.0-or-later + license_family: GPL + size: 416683 + timestamp: 1672361843729 - kind: conda name: libtool version: 2.4.7 @@ -5641,6 +6782,20 @@ packages: license_family: BSD size: 33601 timestamp: 1680112270483 +- kind: conda + name: libuuid + version: 2.38.1 + build: hb4cce97_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 35720 + timestamp: 1680113474501 - kind: conda name: libvorbis version: 1.3.7 @@ -5733,6 +6888,27 @@ packages: license_family: BSD size: 71143 timestamp: 1696116489561 +- kind: conda + name: libwebp + version: 1.3.2 + build: heb2ea1b_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-1.3.2-heb2ea1b_1.conda + sha256: 7a52e367f75fdab475eb23b3d14ba03ccf3cdd07f6e8c5a75757f8983d6eb526 + md5: a839d0667366503c792ba5a0856219c4 + depends: + - giflib >=5.2.1,<5.3.0a0 + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp-base 1.3.2.* + - libwebp-base >=1.3.2,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 95094 + timestamp: 1696118835040 - kind: conda name: libwebp version: 1.3.2 @@ -5768,6 +6944,23 @@ packages: license_family: BSD size: 350825 timestamp: 1712602583307 +- kind: conda + name: libwebp-base + version: 1.3.2 + build: h31becfc_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.3.2-h31becfc_1.conda + sha256: 65f96a2671cacb81eadf26d65ba29038a1f12fe5ba4652b1789fac920f332099 + md5: 675c1f4aa320704b899f4eb350a69418 + depends: + - libgcc-ng >=12 + constrains: + - libwebp 1.3.2 + license: BSD-3-Clause + license_family: BSD + size: 355942 + timestamp: 1712603681172 - kind: conda name: libwebp-base version: 1.3.2 @@ -5836,6 +7029,23 @@ packages: license_family: MIT size: 384238 timestamp: 1682082368177 +- kind: conda + name: libxcb + version: '1.15' + build: h2a766a3_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.15-h2a766a3_0.conda + sha256: d159fcdb8b74187b0bd32f2d9b3a9191bc8b786a97e413aa66e19c39ba7050a0 + md5: eb3d8c8170e3d03f2564ed2024aa00c8 + depends: + - libgcc-ng >=12 + - pthread-stubs + - xorg-libxau + - xorg-libxdmcp + license: MIT + license_family: MIT + size: 388526 + timestamp: 1682083614077 - kind: conda name: libxcb version: '1.15' @@ -5886,6 +7096,20 @@ packages: license_family: MIT size: 334770 timestamp: 1682082734262 +- kind: conda + name: libxcrypt + version: 4.4.36 + build: h31becfc_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + size: 114269 + timestamp: 1702724369203 - kind: conda name: libxcrypt version: 4.4.36 @@ -5922,12 +7146,12 @@ packages: - kind: conda name: libxml2 version: 2.12.6 - build: h0d0cfa8_1 - build_number: 1 + build: h0d0cfa8_2 + build_number: 2 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_1.conda - sha256: f18775ca8494ead5451d4acfc53fa7ebf7a8b5ed04c43bcc50fab847c9780cb3 - md5: c08526c957192192e1e7b4f622761144 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_2.conda + sha256: a5c10af641d6accf3effb3c3a3c594d931bb374f9e3e796719f3ecf769cfb0fc + md5: 27577d561de7659487b062c363d8a527 depends: - icu >=73.2,<74.0a0 - libiconv >=1.17,<2.0a0 @@ -5935,17 +7159,17 @@ packages: - xz >=5.2.6,<6.0a0 license: MIT license_family: MIT - size: 588539 - timestamp: 1711318256840 + size: 588638 + timestamp: 1713314780561 - kind: conda name: libxml2 version: 2.12.6 - build: h232c23b_1 - build_number: 1 + build: h232c23b_2 + build_number: 2 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda - sha256: c0bd693bb1a7e5aba388a0c79be16ff92e2411e03aaa920f94b4b33bf099e254 - md5: 6853448e9ca1cfd5f15382afd2a6d123 + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_2.conda + sha256: 0fd41df7211aae04f492c8550ce10238e8cfa8b1abebc2215a983c5e66d284ea + md5: 9a3a42df8a95f65334dfc7b80da1195d depends: - icu >=73.2,<74.0a0 - libgcc-ng >=12 @@ -5954,17 +7178,36 @@ packages: - xz >=5.2.6,<6.0a0 license: MIT license_family: MIT - size: 705994 - timestamp: 1711318087106 + size: 704938 + timestamp: 1713314718258 - kind: conda name: libxml2 version: 2.12.6 - build: hc0ae0f7_1 - build_number: 1 + build: h3091e33_2 + build_number: 2 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.12.6-h3091e33_2.conda + sha256: 87fe73d7512f92cf3150a9a0f0afa8a10910fd7f838b56e022e201fad0d4610a + md5: bce28567f20f42b90b536728f89b8460 + depends: + - icu >=73.2,<74.0a0 + - libgcc-ng >=12 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - xz >=5.2.6,<6.0a0 + license: MIT + license_family: MIT + size: 751877 + timestamp: 1713315917802 +- kind: conda + name: libxml2 + version: 2.12.6 + build: hc0ae0f7_2 + build_number: 2 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.6-hc0ae0f7_1.conda - sha256: 07a5dc7316d4c1ff3d924df6a76e6a13380d702fa5b3b1889e56d0672e5b8201 - md5: bd85e0ca9e1ffaadc3b56079fd956035 + url: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.6-hc0ae0f7_2.conda + sha256: 2598a525b1769338f96c3d4badad7d8b95c9ddcea86db3f9479a274803190e5c + md5: 50b997370584f2c83ca0c38e9028eab9 depends: - icu >=73.2,<74.0a0 - libiconv >=1.17,<2.0a0 @@ -5972,17 +7215,17 @@ packages: - xz >=5.2.6,<6.0a0 license: MIT license_family: MIT - size: 620164 - timestamp: 1711318305209 + size: 619622 + timestamp: 1713314870641 - kind: conda name: libxml2 version: 2.12.6 - build: hc3477c8_1 - build_number: 1 + build: hc3477c8_2 + build_number: 2 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.6-hc3477c8_1.conda - sha256: 1846c1318a5987e7315ca3648b55b38e5cfd9853370803a0f5159bc0071609c1 - md5: eb9f59dd51f50f5aa369813fa63ba569 + url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.6-hc3477c8_2.conda + sha256: 9a717cad6da52c84cfc490f7d52203c4cbc9e0e0389941fc6523273be5ccd17a + md5: ac7af7a949db01dae61ddc48f4a93d79 depends: - libiconv >=1.17,<2.0a0 - libzlib >=1.2.13,<1.3.0a0 @@ -5991,8 +7234,25 @@ packages: - vc14_runtime >=14.29.30139 license: MIT license_family: MIT - size: 1640801 - timestamp: 1711318467301 + size: 1589904 + timestamp: 1713315104803 +- kind: conda + name: libzlib + version: 1.2.13 + build: h31becfc_5 + build_number: 5 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.2.13-h31becfc_5.conda + sha256: aeeefbb61e5e8227e53566d5e42dbb49e120eb99109996bf0dbfde8f180747a7 + md5: b213aa87eea9491ef7b129179322e955 + depends: + - libgcc-ng >=12 + constrains: + - zlib 1.2.13 *_5 + license: Zlib + license_family: Other + size: 67036 + timestamp: 1686575148440 - kind: conda name: libzlib version: 1.2.13 @@ -6213,6 +7473,24 @@ packages: license_family: BSD size: 23827 timestamp: 1706900341193 +- kind: conda + name: markupsafe + version: 2.1.5 + build: py39h7cc1d5f_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-2.1.5-py39h7cc1d5f_0.conda + sha256: a1d6317b35fe1a25e0b0ac9479baa26c397813f1f882b2d62a2b4703da6f96a8 + md5: d6fda92ac61840449b8053eaee6a682e + depends: + - libgcc-ng >=12 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + size: 24748 + timestamp: 1706901572172 - kind: conda name: markupsafe version: 2.1.5 @@ -6285,6 +7563,23 @@ packages: license_family: PSF size: 8542 timestamp: 1712606369335 +- kind: conda + name: matplotlib + version: 3.8.4 + build: py39ha65689a_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-3.8.4-py39ha65689a_0.conda + sha256: 444ce5e5da2e45b9bb100f1679fe8b35ce882ec75168ddf2e3cff147c3566639 + md5: d501bb96ff505fdd431fd8fdac8efbf9 + depends: + - matplotlib-base >=3.8.4,<3.8.5.0a0 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - tornado >=5 + license: PSF-2.0 + license_family: PSF + size: 8553 + timestamp: 1712606383268 - kind: conda name: matplotlib version: 3.8.4 @@ -6368,6 +7663,38 @@ packages: license_family: PSF size: 6946151 timestamp: 1712606316061 +- kind: conda + name: matplotlib-base + version: 3.8.4 + build: py39h8e43113_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/matplotlib-base-3.8.4-py39h8e43113_0.conda + sha256: 27c2eabbbd963535b089373261af5c9a455ef749ffa19615b5f578eb457459a7 + md5: f397ddfe5c551732de61a92106a14cf3 + depends: + - certifi >=2020.06.20 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype >=2.12.1,<3.0a0 + - importlib-resources >=3.2.0 + - kiwisolver >=1.3.1 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - numpy >=1.21,<2 + - numpy >=1.22.4,<2.0a0 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python-dateutil >=2.7 + - python_abi 3.9.* *_cp39 + - tk >=8.6.13,<8.7.0a0 + license: PSF-2.0 + license_family: PSF + size: 6857664 + timestamp: 1712606354422 - kind: conda name: matplotlib-base version: 3.8.4 @@ -6636,6 +7963,19 @@ packages: license_family: BSD size: 101232 timestamp: 1712239122969 +- kind: conda + name: ncurses + version: 6.4.20240210 + build: h0425590_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.4.20240210-h0425590_0.conda + sha256: 4223dc34e2bddd37bf995158ae481e00be375b287d539bc7a0532634c0fc63b7 + md5: c1a1612ddaee95c83abfa0b2ec858626 + depends: + - libgcc-ng >=12 + license: X11 AND BSD-3-Clause + size: 926594 + timestamp: 1710866633409 - kind: conda name: ncurses version: 6.4.20240210 @@ -6706,6 +8046,21 @@ packages: license_family: Apache size: 2216778 timestamp: 1713204746131 +- kind: conda + name: ninja + version: 1.12.0 + build: h2a328a1_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.12.0-h2a328a1_0.conda + sha256: 2df7d473ff69b6012dcf0400f1ece0554509852351add3489bda0cca27e44bc8 + md5: c0f3f508baf69c8db8142466beaa0ccc + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: Apache-2.0 + license_family: Apache + size: 2333116 + timestamp: 1713206226546 - kind: conda name: ninja version: 1.12.0 @@ -6849,6 +8204,29 @@ packages: license_family: BSD size: 5492058 timestamp: 1707226364958 +- kind: conda + name: numpy + version: 1.26.4 + build: py39h91c28bb_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py39h91c28bb_0.conda + sha256: a6c2cc090050de18d3e268dd7d13f20bf1effadd02e71d9a3304cb1ff016e82c + md5: d88e195f11a9f27e649aea408b54cb48 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + size: 6082609 + timestamp: 1707225790468 - kind: conda name: numpy version: 1.26.4 @@ -6872,6 +8250,24 @@ packages: license_family: BSD size: 5920615 timestamp: 1707226471242 +- kind: conda + name: openjpeg + version: 2.5.2 + build: h0d9d63b_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.2-h0d9d63b_0.conda + sha256: d83375856601bc67c11295b537548a937a6896ede9d0a51d78bf5e921ab07c6f + md5: fd2898519e839d5ceb778343f39a3176 + depends: + - libgcc-ng >=12 + - libpng >=1.6.43,<1.7.0a0 + - libstdcxx-ng >=12 + - libtiff >=4.6.0,<4.7.0a0 + - libzlib >=1.2.13,<1.3.0a0 + license: BSD-2-Clause + license_family: BSD + size: 374964 + timestamp: 1709159226478 - kind: conda name: openjpeg version: 2.5.2 @@ -6960,6 +8356,24 @@ packages: license_family: Apache size: 2855250 timestamp: 1710793435903 +- kind: conda + name: openssl + version: 3.2.1 + build: h31becfc_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.2.1-h31becfc_1.conda + sha256: 055a26e99ebc12ae0cf23266a0e62e71b59b8ce8cafb1ebb87e375ef9c758d7b + md5: e95eb18d256edc72058e0dc9be5338a0 + depends: + - ca-certificates + - libgcc-ng >=12 + constrains: + - pyopenssl >=22.1 + license: Apache-2.0 + license_family: Apache + size: 3380844 + timestamp: 1710793424665 - kind: conda name: openssl version: 3.2.1 @@ -7030,6 +8444,27 @@ packages: license_family: APACHE size: 49832 timestamp: 1710076089469 +- kind: conda + name: pandas + version: 2.2.2 + build: py39h26ccf5d_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.2-py39h26ccf5d_0.conda + sha256: 3002e0c6a3c8fc3aa26ca8689fc31d0a2778ac108ddcc5dba490ccd3c48f59aa + md5: 9a7ad86f0649cb987912d8ceeb57ebb1 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - numpy >=1.22.4,<2.0a0 + - python >=3.9,<3.10.0a0 + - python-dateutil >=2.8.1 + - python-tzdata >=2022a + - python_abi 3.9.* *_cp39 + - pytz >=2020.1 + license: BSD-3-Clause + license_family: BSD + size: 12675075 + timestamp: 1712782674099 - kind: conda name: pandas version: 2.2.2 @@ -7135,6 +8570,28 @@ packages: license: LGPL-2.1-or-later size: 442093 timestamp: 1693056497295 +- kind: conda + name: pango + version: 1.50.14 + build: h11ef544_2 + build_number: 2 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pango-1.50.14-h11ef544_2.conda + sha256: f3fd2b473eea4cb374461bbde322c921a97cda853a100b5f5bf6c6f8fb73cd67 + md5: 2fe79e8224e0fd83f0660af9fa13f8ed + depends: + - cairo >=1.16.0,<2.0a0 + - fontconfig >=2.14.2,<3.0a0 + - fonts-conda-ecosystem + - freetype >=2.12.1,<3.0a0 + - fribidi >=1.0.10,<2.0a0 + - harfbuzz >=8.1.1,<9.0a0 + - libgcc-ng >=12 + - libglib >=2.76.4,<3.0a0 + - libpng >=1.6.39,<1.7.0a0 + license: LGPL-2.1-or-later + size: 454095 + timestamp: 1693057499830 - kind: conda name: pango version: 1.50.14 @@ -7278,6 +8735,22 @@ packages: license_family: BSD size: 950847 timestamp: 1708118050286 +- kind: conda + name: pcre2 + version: '10.43' + build: hd0f9c67_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.43-hd0f9c67_0.conda + sha256: 1bac2077caa28f0764f955e522468b98316b99b2d0904e9d93a01297fe1b7ba2 + md5: 1275fa549338ecdc8b7793589ac09150 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libgcc-ng >=12 + - libzlib >=1.2.13,<1.3.0a0 + license: BSD-3-Clause + license_family: BSD + size: 880930 + timestamp: 1708117999756 - kind: conda name: pillow version: 10.3.0 @@ -7302,6 +8775,30 @@ packages: license: HPND size: 40576213 timestamp: 1712155121473 +- kind: conda + name: pillow + version: 10.3.0 + build: py39h71661b1_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-10.3.0-py39h71661b1_0.conda + sha256: 1cfd29c096089b983ec4901e644e04505e1f3920fea2e50d72a5e81e08db6b08 + md5: dae548b7b537d7ef796d1d4c38a55319 + depends: + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp-base >=1.3.2,<2.0a0 + - libxcb >=1.15,<1.16.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - openjpeg >=2.5.2,<3.0a0 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + - tk >=8.6.13,<8.7.0a0 + license: HPND + size: 42017922 + timestamp: 1712155997691 - kind: conda name: pillow version: 10.3.0 @@ -7407,6 +8904,21 @@ packages: license_family: MIT size: 386826 timestamp: 1706549500138 +- kind: conda + name: pixman + version: 0.43.4 + build: h2f0025b_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.43.4-h2f0025b_0.conda + sha256: e145b0d89c800326a20d1afd86c74f9422b81549b17fe53add46c2fa43a4c93e + md5: 81b2ddea4b0eca188da9c5a7aa4b0cff + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + size: 295064 + timestamp: 1709240909660 - kind: conda name: pixman version: 0.43.4 @@ -7483,19 +8995,19 @@ packages: timestamp: 1706713564353 - kind: conda name: pluggy - version: 1.4.0 + version: 1.5.0 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda - sha256: 6edfd2c41938ea772096c674809bfcf2ebb9bef7e82de6c7ea0b966b86bfb4d0 - md5: 139e9feb65187e916162917bb2484976 + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + sha256: 33eaa3359948a260ebccf9cdc2fd862cea5a6029783289e13602d8e634cd9a26 + md5: d3483c8fc2dc2cc3f5cf43e26d60cabf depends: - python >=3.8 license: MIT license_family: MIT - size: 23384 - timestamp: 1706116931972 + size: 23815 + timestamp: 1713667175451 - kind: conda name: ply version: '3.11' @@ -7540,6 +9052,21 @@ packages: license_family: MIT size: 5625 timestamp: 1606147468727 +- kind: conda + name: pthread-stubs + version: '0.4' + build: hb9de7d4_1001 + build_number: 1001 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-hb9de7d4_1001.tar.bz2 + sha256: f1d7ff5e06cc515ec82010537813c796369f8e9dde46ce3f4fa1a9f70bc7db7d + md5: d0183ec6ce0b5aaa3486df25fa5f0ded + depends: + - libgcc-ng >=7.5.0 + license: MIT + license_family: MIT + size: 5657 + timestamp: 1606147738742 - kind: conda name: pthread-stubs version: '0.4' @@ -7907,6 +9434,35 @@ packages: license: Python-2.0 size: 23800555 timestamp: 1710940120866 +- kind: conda + name: python + version: 3.9.19 + build: h4ac3b42_0_cpython + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.9.19-h4ac3b42_0_cpython.conda + sha256: 26845bcb8194e121331d47dca98d07f6197d5bf3bd2cb8da2cd2391722463180 + md5: 1501507cd9451472ec8900d587ce872f + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libffi >=3.4,<4.0a0 + - libgcc-ng >=12 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.2.13,<1.3.0a0 + - ncurses >=6.4.20240210,<7.0a0 + - openssl >=3.2.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.9.* *_cp39 + license: Python-2.0 + size: 12542650 + timestamp: 1710945692074 - kind: conda name: python version: 3.9.19 @@ -8055,6 +9611,21 @@ packages: license_family: BSD size: 6378 timestamp: 1695147399237 +- kind: conda + name: python_abi + version: '3.9' + build: 4_cp39 + build_number: 4 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.9-4_cp39.conda + sha256: b9201f49d9172c37f52818e34eaf21855c0e5a1fb885cd1b5a60fa1a9307d178 + md5: c191905a08694e4a5cb1238e90233878 + constrains: + - python 3.9.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 6433 + timestamp: 1695147422968 - kind: conda name: python_abi version: '3.9' @@ -8152,6 +9723,25 @@ packages: license_family: MIT size: 159929 timestamp: 1695373838385 +- kind: conda + name: pyyaml + version: 6.0.1 + build: py39h898b7ef_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.1-py39h898b7ef_1.conda + sha256: 7a3ffc8bc3ca6858776b73030985bcb6ef2f9fa63a0c34b57adee12f959eb139 + md5: 6130aa0677e5b9bfcd3c8fde05f8a7e6 + depends: + - libgcc-ng >=12 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + size: 168125 + timestamp: 1695373798879 - kind: conda name: pyyaml version: 6.0.1 @@ -8314,6 +9904,22 @@ packages: license_family: GPL size: 281456 timestamp: 1679532220005 +- kind: conda + name: readline + version: '8.2' + build: h8fc344f_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda + sha256: 4c99f7417419734e3797d45bc355e61c26520e111893b0d7087a01a7fbfbe3dd + md5: 105eb1e16bf83bfb2eb380a48032b655 + depends: + - libgcc-ng >=12 + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 294092 + timestamp: 1679532238805 - kind: conda name: readline version: '8.2' @@ -8451,6 +10057,22 @@ packages: license_family: MIT size: 202481 timestamp: 1707923894221 +- kind: conda + name: rpds-py + version: 0.18.0 + build: py39hfe8b3a4_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.18.0-py39hfe8b3a4_0.conda + sha256: 368b4d9112c9fb610431c5296cb35af618a4e01e64728ab80b639670eb816b6a + md5: 5fb466fc0672de73b2faa4cdc545bc65 + depends: + - libgcc-ng >=12 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: MIT + license_family: MIT + size: 912397 + timestamp: 1707925058085 - kind: conda name: scipy version: 1.13.0 @@ -8499,6 +10121,31 @@ packages: license_family: BSD size: 16360934 timestamp: 1712256688151 +- kind: conda + name: scipy + version: 1.13.0 + build: py39h91c28bb_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.13.0-py39h91c28bb_0.conda + sha256: b749e6f1c9a74647146006920c8cc698abe0a9617f86509a65ed1490512b285a + md5: 2b6f1ed053a61c2447304e4b810fc397 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc-ng >=12 + - libgfortran-ng + - libgfortran5 >=12.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx-ng >=12 + - numpy >=1.22.4,<1.28 + - numpy >=1.22.4,<2.0a0 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 16617157 + timestamp: 1712256784317 - kind: conda name: scipy version: 1.13.0 @@ -8564,29 +10211,47 @@ packages: timestamp: 1713094963112 - kind: conda name: shapely - version: 2.0.3 + version: 2.0.4 build: py39h19e25c1_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.3-py39h19e25c1_0.conda - sha256: ef82124eacdccc7109306fab623a130689e0e2efa65b5930aafe9de67ecdbfe3 - md5: 139065ace3542c37f2f6c2def6a7248f + url: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.4-py39h19e25c1_0.conda + sha256: b06b6dd583e5f29d9b18037364de01c11c01e95ddb327fc3be398c97949457df + md5: ed6d23f6ef9f6e26390896b356fb5c86 + depends: + - geos >=3.12.1,<3.12.2.0a0 + - numpy >=1.22.4,<2.0a0 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: BSD-3-Clause + license_family: BSD + size: 449799 + timestamp: 1713346740834 +- kind: conda + name: shapely + version: 2.0.4 + build: py39h497b60c_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/shapely-2.0.4-py39h497b60c_0.conda + sha256: 8581f28b6691db6dae5e18bd70fd8aa900fe9d61f7c88dc4ab7fcad3ab718aad + md5: 20369769275afce9d613a8504b754455 depends: - geos >=3.12.1,<3.12.2.0a0 + - libgcc-ng >=12 - numpy >=1.22.4,<2.0a0 - python >=3.9,<3.10.0a0 - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - size: 449167 - timestamp: 1708368412520 + size: 481269 + timestamp: 1713348316016 - kind: conda name: shapely - version: 2.0.3 + version: 2.0.4 build: py39h61a8cf5_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/shapely-2.0.3-py39h61a8cf5_0.conda - sha256: e9c852f2c0b1bd060e5eb840401981c33306f34f09d0c1f5d98ffa138ee1103c - md5: 47fbc5da424f3b8c4853b126e5ae8766 + url: https://conda.anaconda.org/conda-forge/win-64/shapely-2.0.4-py39h61a8cf5_0.conda + sha256: fe0296e8aa038c1a3720959f0e1d2a64549fa68cadfe9503c631a534156c6817 + md5: 09cd2f2712b87bd69327bebde34143a7 depends: - geos >=3.12.1,<3.12.2.0a0 - numpy >=1.22.4,<2.0a0 @@ -8597,16 +10262,16 @@ packages: - vc14_runtime >=14.29.30139 license: BSD-3-Clause license_family: BSD - size: 450564 - timestamp: 1708368463948 + size: 449803 + timestamp: 1713346780033 - kind: conda name: shapely - version: 2.0.3 + version: 2.0.4 build: py39h6404dd3_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py39h6404dd3_0.conda - sha256: 43af6c106ff55be27be3be99b7f313fa3becee9aeeb826e31257c1159416f53a - md5: 1520f039123452cd2de847068449a618 + url: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py39h6404dd3_0.conda + sha256: a43c894940645091626277f91463fa55de7ed934c1aea7c26891691ce8052b25 + md5: c33c60a88dad5df6960c4da482f9e313 depends: - geos >=3.12.1,<3.12.2.0a0 - libgcc-ng >=12 @@ -8615,16 +10280,16 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - size: 479182 - timestamp: 1708368191201 + size: 480509 + timestamp: 1713346267044 - kind: conda name: shapely - version: 2.0.3 + version: 2.0.4 build: py39ha70ab96_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.0.3-py39ha70ab96_0.conda - sha256: 2bd385c02e2ef0a9a15bf3a1e79ab40119a441d03ffa72339ac2f5c73c583eed - md5: 6f1f893210f9daa0fe5e0634c0e0d2b6 + url: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.0.4-py39ha70ab96_0.conda + sha256: 80afeeec485a95461333cc92d2d01b1eae229ff672a8a96b1ae6b6c401a44692 + md5: a1979d786b7c352f7a8e305d0e69161a depends: - geos >=3.12.1,<3.12.2.0a0 - numpy >=1.22.4,<2.0a0 @@ -8633,8 +10298,8 @@ packages: - python_abi 3.9.* *_cp39 license: BSD-3-Clause license_family: BSD - size: 446351 - timestamp: 1708368614890 + size: 446880 + timestamp: 1713346910714 - kind: conda name: sip version: 6.7.12 @@ -8705,8 +10370,24 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Apache-2.0 + license_family: APACHE size: 161618 timestamp: 1712960215111 +- kind: conda + name: tk + version: 8.6.13 + build: h194ca79_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<1.3.0a0 + license: TCL + license_family: BSD + size: 3351802 + timestamp: 1695506242997 - kind: conda name: tk version: 8.6.13 @@ -8816,6 +10497,22 @@ packages: license_family: Apache size: 641216 timestamp: 1708363746873 +- kind: conda + name: tornado + version: '6.4' + build: py39h7cc1d5f_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.4-py39h7cc1d5f_0.conda + sha256: 91a9657b8bcaa08a15de4fddbc5b0a23574a86a30dcabf6db5585a4091d2dcf6 + md5: 2c06a653ebfa389c18aea2d8f338df3b + depends: + - libgcc-ng >=12 + - python >=3.9,<3.10.0a0 + - python_abi 3.9.* *_cp39 + license: Apache-2.0 + license_family: Apache + size: 643162 + timestamp: 1708365572833 - kind: conda name: tornado version: '6.4' @@ -8867,19 +10564,19 @@ packages: timestamp: 1708363320529 - kind: conda name: traitlets - version: 5.14.2 + version: 5.14.3 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.2-pyhd8ed1ab_0.conda - sha256: 9ea6073091c130470a51b51703c8d2d959434992e29c4aa4abeba07cd56533a3 - md5: af5fa2d2186003472e766a23c46cae04 + url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda + sha256: 8a64fa0f19022828513667c2c7176cfd125001f3f4b9bc00d33732e627dd2592 + md5: 3df84416a021220d8b5700c613af2dc5 depends: - python >=3.8 license: BSD-3-Clause license_family: BSD - size: 110288 - timestamp: 1710254564088 + size: 110187 + timestamp: 1713535244513 - kind: conda name: typing_extensions version: 4.11.0 @@ -8937,6 +10634,23 @@ packages: license_family: Apache size: 376309 timestamp: 1695848358752 +- kind: conda + name: unicodedata2 + version: 15.1.0 + build: py39h898b7ef_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/unicodedata2-15.1.0-py39h898b7ef_0.conda + sha256: ddb1a64567d3927a10a77d6ef9c7c18af9344fc3589705e2bd600b8a02ad40d2 + md5: 8c072c9329aeea97a46005625267a851 + depends: + - libgcc-ng >=12 + - python >=3.9,<3.10.0a0 + - python >=3.9,<3.10.0a0 *_cpython + - python_abi 3.9.* *_cp39 + license: Apache-2.0 + license_family: Apache + size: 373906 + timestamp: 1695848199413 - kind: conda name: unicodedata2 version: 15.1.0 @@ -9198,6 +10912,21 @@ packages: license: CC0-1.0 size: 18460 timestamp: 1681486998644 +- kind: conda + name: xorg-kbproto + version: 1.0.7 + build: h3557bc0_1002 + build_number: 1002 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-kbproto-1.0.7-h3557bc0_1002.tar.bz2 + sha256: 421c0a115b31f02082f95c8f06dbba48b2274718f66a72d64d5102141e5a8731 + md5: ec8ce6b3dac3945a4010559a6284b755 + depends: + - libgcc-ng >=9.3.0 + license: MIT + license_family: MIT + size: 27369 + timestamp: 1610028170368 - kind: conda name: xorg-kbproto version: 1.0.7 @@ -9228,6 +10957,20 @@ packages: license_family: MIT size: 28166 timestamp: 1610028297505 +- kind: conda + name: xorg-libice + version: 1.1.1 + build: h7935292_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.1-h7935292_0.conda + sha256: c889673c9313798372bea7c93640e853561bda5ba361b265ad4b14d7d1295235 + md5: 025968e2637bca910b9b3e7f6743beff + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 60321 + timestamp: 1685308489806 - kind: conda name: xorg-libice version: 1.1.1 @@ -9258,6 +11001,22 @@ packages: license_family: MIT size: 58469 timestamp: 1685307573114 +- kind: conda + name: xorg-libsm + version: 1.2.4 + build: h5a01bc2_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.4-h5a01bc2_0.conda + sha256: 2678975d4001f1123752ceabf9e2810cab51f740624320077de1ab12b537b498 + md5: d788eca20ecd63bad8eea7219e5c5fb7 + depends: + - libgcc-ng >=12 + - libuuid >=2.38.1,<3.0a0 + - xorg-libice >=1.1.1,<2.0a0 + license: MIT + license_family: MIT + size: 28634 + timestamp: 1685454576261 - kind: conda name: xorg-libsm version: 1.2.4 @@ -9290,6 +11049,24 @@ packages: license_family: MIT size: 86397 timestamp: 1685454296879 +- kind: conda + name: xorg-libx11 + version: 1.8.9 + build: h055a233_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.9-h055a233_0.conda + sha256: fe6adc8f0ab7ea026b8ccd5c8c8843e5a01f49bcd193eacec9af1626f0db1194 + md5: d5f0529d3568a2ce38a9aed44a9a8029 + depends: + - libgcc-ng >=12 + - libxcb >=1.15,<1.16.0a0 + - xorg-kbproto + - xorg-xextproto >=7.3.0,<8.0a0 + - xorg-xproto + license: MIT + license_family: MIT + size: 851567 + timestamp: 1712415736293 - kind: conda name: xorg-libx11 version: 1.8.9 @@ -9339,6 +11116,20 @@ packages: license_family: MIT size: 13071 timestamp: 1684638167647 +- kind: conda + name: xorg-libxau + version: 1.0.11 + build: h31becfc_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.11-h31becfc_0.conda + sha256: c00a8909e783ba7f4ada7256f0385ae46fc21322f4090fa396c80b4481abd5f4 + md5: 13de34f69cb73165dbe08c1e9148bedb + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 15380 + timestamp: 1684638889756 - kind: conda name: xorg-libxau version: 1.0.11 @@ -9392,6 +11183,20 @@ packages: license_family: MIT size: 18164 timestamp: 1610071737668 +- kind: conda + name: xorg-libxdmcp + version: 1.1.3 + build: h3557bc0_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.3-h3557bc0_0.tar.bz2 + sha256: 2aad9a0b57796170b8fb40317598fd79cfc7ae27fa7fb68c417d815e44499d59 + md5: a6c9016ae1ca5c47a3603ed4cd65fedd + depends: + - libgcc-ng >=9.3.0 + license: MIT + license_family: MIT + size: 19916 + timestamp: 1610072242320 - kind: conda name: xorg-libxdmcp version: 1.1.3 @@ -9449,6 +11254,23 @@ packages: license_family: MIT size: 50143 timestamp: 1677036907815 +- kind: conda + name: xorg-libxext + version: 1.3.4 + build: h2a766a3_2 + build_number: 2 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.4-h2a766a3_2.conda + sha256: 16eff29fb70b2f89b9120d112d2d5df1bf7bd4e95d1e5baafabc61dac4977fa8 + md5: 0cea7d840c8eeaa4e349e0b4775c826d + depends: + - libgcc-ng >=12 + - xorg-libx11 >=1.7.2,<2.0a0 + - xorg-xextproto + license: MIT + license_family: MIT + size: 50856 + timestamp: 1677037784530 - kind: conda name: xorg-libxext version: 1.3.4 @@ -9486,6 +11308,22 @@ packages: license_family: MIT size: 195881 timestamp: 1696449889560 +- kind: conda + name: xorg-libxrender + version: 0.9.11 + build: h7935292_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.11-h7935292_0.conda + sha256: 15ab433c3b565d92bbd9dc83e469bb4ff1076f9002f7cd142b8a39e1b6cbcfab + md5: 8c96b84f7fb97a3cd533a14dbdcd6626 + depends: + - libgcc-ng >=12 + - xorg-libx11 >=1.8.6,<2.0a0 + - xorg-renderproto + license: MIT + license_family: MIT + size: 37477 + timestamp: 1688300682978 - kind: conda name: xorg-libxrender version: 0.9.11 @@ -9523,6 +11361,21 @@ packages: license_family: MIT size: 671704 timestamp: 1690289114426 +- kind: conda + name: xorg-renderproto + version: 0.11.1 + build: h3557bc0_1002 + build_number: 1002 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-renderproto-0.11.1-h3557bc0_1002.tar.bz2 + sha256: e57e8b4a58f8c3b5011bf6cd66f499fca9fc5067981bb33f828750b168c3698d + md5: 01cbfe96ce66b78a9a270ac305791dd2 + depends: + - libgcc-ng >=9.3.0 + license: MIT + license_family: MIT + size: 9612 + timestamp: 1614866892676 - kind: conda name: xorg-renderproto version: 0.11.1 @@ -9553,6 +11406,21 @@ packages: license_family: MIT size: 30270 timestamp: 1677036833037 +- kind: conda + name: xorg-xextproto + version: 7.3.0 + build: h2a766a3_1003 + build_number: 1003 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-xextproto-7.3.0-h2a766a3_1003.conda + sha256: 62298f1c7b963f3a5921a65d9cb6aae82c3ec8b3069319c8264c5b0a3d190286 + md5: 32de1e4422c986e3b6eff59e7edc4d04 + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 30267 + timestamp: 1677037618141 - kind: conda name: xorg-xextproto version: 7.3.0 @@ -9583,6 +11451,21 @@ packages: license_family: MIT size: 23875 timestamp: 1620067286978 +- kind: conda + name: xorg-xproto + version: 7.0.31 + build: h3557bc0_1007 + build_number: 1007 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-xproto-7.0.31-h3557bc0_1007.tar.bz2 + sha256: 7711ca1898e6f74a8434931fe6c0593ff7201277778aa09ea012d8be8bc7a7f5 + md5: 987e98faa0ad2c667bbea6b6aae260bc + depends: + - libgcc-ng >=9.3.0 + license: MIT + license_family: MIT + size: 74831 + timestamp: 1607291481791 - kind: conda name: xorg-xproto version: 7.0.31 @@ -9662,6 +11545,19 @@ packages: license: LGPL-2.1 and GPL-2.0 size: 217804 timestamp: 1660346976440 +- kind: conda + name: xz + version: 5.2.6 + build: h9cdd2b7_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 + sha256: 93f58a7b393adf41fa007ac8c55978765e957e90cd31877ece1e5a343cb98220 + md5: 83baad393a31d59c20b63ba4da6592df + depends: + - libgcc-ng >=12 + license: LGPL-2.1 and GPL-2.0 + size: 440555 + timestamp: 1660348056328 - kind: conda name: yaml version: 0.2.5 @@ -9719,6 +11615,21 @@ packages: license_family: MIT size: 63274 timestamp: 1641347623319 +- kind: conda + name: yaml + version: 0.2.5 + build: hf897c2e_2 + build_number: 2 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-hf897c2e_2.tar.bz2 + sha256: 8bc601d6dbe249eba44b3c456765265cd8f42ef1e778f8df9b0c9c88b8558d7e + md5: b853307650cb226731f653aa623936a4 + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + size: 92927 + timestamp: 1641347626613 - kind: conda name: zipp version: 3.17.0 @@ -9734,6 +11645,22 @@ packages: license_family: MIT size: 18954 timestamp: 1695255262261 +- kind: conda + name: zlib + version: 1.2.13 + build: h31becfc_5 + build_number: 5 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.2.13-h31becfc_5.conda + sha256: aa3e9d46b13d1959faf634f03d929d7dec950dc1b84a8ff109f7f0e3f364b562 + md5: 96866c7301479abaf8308c50958c71a4 + depends: + - libgcc-ng >=12 + - libzlib 1.2.13 h31becfc_5 + license: Zlib + license_family: Other + size: 95842 + timestamp: 1686575155348 - kind: conda name: zlib version: 1.2.13 @@ -9815,6 +11742,22 @@ packages: license_family: BSD size: 343428 timestamp: 1693151615801 +- kind: conda + name: zstd + version: 1.5.5 + build: h4c53e97_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.5-h4c53e97_0.conda + sha256: d1e070029e9d07a3f25e6ed082d507b0f3cff1b109dd18d0b091a5c7b86dd07b + md5: b74eb9dbb5c3c15cb3cee7cbdf198c75 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<1.3.0a0 + license: BSD-3-Clause + license_family: BSD + size: 528989 + timestamp: 1693151197934 - kind: conda name: zstd version: 1.5.5 diff --git a/pixi.toml b/pixi.toml index 82df3a24b1c..584d903e032 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,11 +1,12 @@ [project] name = "modflow6" channels = ["conda-forge"] -platforms = ["win-64", "linux-64", "osx-arm64", "osx-64"] +platforms = ["win-64", "linux-64", "linux-aarch64", "osx-arm64", "osx-64"] version = "6.5.0.dev2" [dependencies] appdirs = "*" +codespell = "*" filelock = "*" flaky = "*" fortran-language-server = "*" @@ -58,6 +59,8 @@ autotest = { cmd = "pytest -v -n auto --durations 0 --keep-failed .failed", cwd # dist/docs benchmark = { cmd = "python benchmark.py", cwd = "distribution" } +run-mf6ivar = { cmd = "python mf6ivar.py", cwd = "doc/mf6io/mf6ivar" } +check-docs = "python .github/common/codespell_docs_check.py" build-docs = { cmd = "python build_docs.py", cwd = "distribution" } build-dist = { cmd = "python build_dist.py", cwd = "distribution" } build-makefiles = { cmd = "python build_makefiles.py", cwd = "distribution" } diff --git a/src/Model/Discretization/Disv1d.f90 b/src/Model/Discretization/Disv1d.f90 index dafd6da3324..614075feb57 100644 --- a/src/Model/Discretization/Disv1d.f90 +++ b/src/Model/Discretization/Disv1d.f90 @@ -677,7 +677,7 @@ subroutine calculate_cellxy(vertices, fdc, iavert, javert, cellxy) integer(I4B) :: ixy !< x, y column index real(DP) :: length !< reach length = sum of individual line reaches real(DP) :: fd0 !< fractional distance to start of this line reach - real(DP) :: fd1 !< fractional distance to end fo this line reach + real(DP) :: fd1 !< fractional distance to end of this line reach real(DP) :: fd !< fractional distance where midpoint (defined by fdc) is located real(DP) :: d !< distance diff --git a/src/Utilities/ArrayHandlers.f90 b/src/Utilities/ArrayHandlers.f90 index 2f8fa17a30d..fccbbc120fc 100644 --- a/src/Utilities/ArrayHandlers.f90 +++ b/src/Utilities/ArrayHandlers.f90 @@ -227,8 +227,8 @@ subroutine expand_character(array, increment) ! -- expand array to the requested size, keeping ! existing items, or allocate if still needed - ! [Ned TODO: may be able to use mold here, e.g.: - ! allocate(values(num), mold=proto)] + ! TODO: may be able to use mold here, e.g.: + ! allocate(values(num), mold=proto) if (allocated(array)) then nold = size(array) nnew = nold + inc diff --git a/src/Utilities/compilerversion.F90 b/src/Utilities/compilerversion.F90 index e9801e8b12d..6e42a4e32bc 100644 --- a/src/Utilities/compilerversion.F90 +++ b/src/Utilities/compilerversion.F90 @@ -7,9 +7,9 @@ module CompilerVersion implicit none private ! -- compiler version - character(len=10) :: ccompiler !< compiler string - character(len=10) :: cversion !< compiler version string - character(len=20) :: cdate !< compilation date + character(len=10) :: c_compiler !< compiler string + character(len=10) :: c_version !< compiler version string + character(len=20) :: c_date !< compilation date integer(I4B) :: icompiler = CUNKNOWN !< compiler enum public :: get_compiler, get_compile_date, get_compile_options contains @@ -26,27 +26,27 @@ subroutine get_compiler(txt) ! -- set variables #ifdef __GFORTRAN__ icompiler = CGFORTRAN - cdate = __DATE__//' '//__TIME__ + c_date = __DATE__//' '//__TIME__ #endif #ifdef __INTEL_COMPILER icompiler = CINTEL - cdate = __DATE__//' '//__TIME__ + c_date = __DATE__//' '//__TIME__ #endif #ifdef _CRAYFTN icompiler = CCRAYFTN - cdate = __DATE__//' '//__TIME__ + c_date = __DATE__//' '//__TIME__ #endif ! ! -- set compiler strings if (icompiler == CUNKNOWN) then - ccompiler = 'UNKNOWN' - cversion = '??.??' - cdate = '??? ?? ???? ??:??:??' + c_compiler = 'UNKNOWN' + c_version = '??.??' + c_date = '??? ?? ???? ??:??:??' end if ! ! -- write string with compiler information write (txt, '(a,3(1x,a))') & - 'MODFLOW 6 compiled', trim(adjustl(cdate)), & + 'MODFLOW 6 compiled', trim(adjustl(c_date)), & 'with', trim(adjustl(compiler_version())) ! ! -- return @@ -63,17 +63,17 @@ subroutine get_compile_date(txt) character(len=20), intent(inout) :: txt !< compilation date ! -- set variables #ifdef __GFORTRAN__ - cdate = __DATE__//' '//__TIME__ + c_date = __DATE__//' '//__TIME__ #endif #ifdef __INTEL_COMPILER - cdate = __DATE__//' '//__TIME__ + c_date = __DATE__//' '//__TIME__ #endif #ifdef _CRAYFTN - cdate = __DATE__//' '//__TIME__ + c_date = __DATE__//' '//__TIME__ #endif ! ! -- write compilation date string - write (txt, '(a)') trim(adjustl(cdate)) + write (txt, '(a)') trim(adjustl(c_date)) ! ! -- return return diff --git a/utils/zonebudget/src/zoneoutput.f90 b/utils/zonebudget/src/zoneoutput.f90 index 6e304940632..c8683dc5e94 100644 --- a/utils/zonebudget/src/zoneoutput.f90 +++ b/utils/zonebudget/src/zoneoutput.f90 @@ -100,7 +100,7 @@ subroutine zoneoutput_write(itime, kstp, kper, delt, totim, nbudterms, & end do end do ! - ! -- Write time and zone informatio to CSV header + ! -- Write time and zone information to CSV header write (ioutcsv, '(a)', advance='no') 'totim,' write (ioutcsv, '(a)', advance='no') 'kstp,' write (ioutcsv, '(a)', advance='no') 'kper,' From eec27f79b8a958c0f411e362d7c305ead480135b Mon Sep 17 00:00:00 2001 From: Scott Boyce Date: Mon, 22 Apr 2024 08:46:26 -0700 Subject: [PATCH 122/199] refactor(ts): skip search for repeated boundary time series file (#1649) * refactor(ts): skip search for repeated boundary time series file The subroutine read_value_or_time_series checks to see if a time series file (TS) has been previously included in the time series manager (tsManager) before adding it. The check compares against the package name and the input parser row and column (ii, jj) location in the input file. If the package name and location match, then the TS is not added to the tsManager. This check is never true for boundary (BND) type TS, so a conditional is added to only perform the search for for non-BND TS types. This results in a substantial performance increase when there are a large number of time series files. * Remove link check for auxiliary variable * fprettify * cleanup --------- Co-authored-by: Langevin, Christian D --- .../TimeSeries/TimeSeriesManager.f90 | 55 +++++++------------ 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/src/Utilities/TimeSeries/TimeSeriesManager.f90 b/src/Utilities/TimeSeries/TimeSeriesManager.f90 index 412cae25ce3..f85dda9e0e4 100644 --- a/src/Utilities/TimeSeries/TimeSeriesManager.f90 +++ b/src/Utilities/TimeSeries/TimeSeriesManager.f90 @@ -541,10 +541,16 @@ end subroutine HashBndTimeSeries ! -- Non-type-bound procedures !> @brief Call this subroutine if the time-series link is available or needed + !! + !! This routine assumes that there is not an existing link for the + !! specified package and array row and column. For the standard + !! boundary package, all links are removed by calling the tsmanager%reset() + !! method. For advanced packages, there is a separate routine called + !! read_value_or_time_series_adv, which should be used instead of this one. !< subroutine read_value_or_time_series(textInput, ii, jj, bndElem, pkgName, & auxOrBnd, tsManager, iprpak, tsLink) - ! -- dummy + ! dummy character(len=*), intent(in) :: textInput integer(I4B), intent(in) :: ii integer(I4B), intent(in) :: jj @@ -554,62 +560,43 @@ subroutine read_value_or_time_series(textInput, ii, jj, bndElem, pkgName, & type(TimeSeriesManagerType), intent(inout) :: tsManager integer(I4B), intent(in) :: iprpak type(TimeSeriesLinkType), pointer, intent(inout) :: tsLink - ! -- local + ! local type(TimeSeriesType), pointer :: timeseries => null() - type(TimeSeriesLinkType), pointer :: tslTemp => null() - integer(I4B) :: i, istat, nlinks + integer(I4B) :: istat real(DP) :: r character(len=LINELENGTH) :: errmsg character(len=LENTIMESERIESNAME) :: tsNameTemp - logical :: found - ! + read (textInput, *, iostat=istat) r if (istat == 0) then bndElem = r else + + ! Check to see if this is a time series name tsNameTemp = textInput call UPCASE(tsNameTemp) - ! -- If text is a time-series name, get value - ! from time series. timeseries => tsManager%get_time_series(tsNameTemp) - ! -- Create a time series link and add it to the package - ! list of time series links used by the array. + + ! If this is a time series, then create a link between + ! the time series and the row and column position of + ! bndElem if (associated(timeseries)) then ! -- Assign value from time series to current ! array element r = timeseries%GetValue(totimsav, totim, & tsManager%extendTsToEndOfSimulation) bndElem = r - ! Look to see if this array element already has a time series - ! linked to it. If not, make a link to it. - nlinks = tsManager%CountLinks(auxOrBnd) - found = .false. - searchlinks: do i = 1, nlinks - tslTemp => tsManager%GetLink(auxOrBnd, i) - if (tslTemp%PackageName == pkgName) then - ! -- Check ii, jj against iRow, jCol stored in link - if (tslTemp%IRow == ii .and. tslTemp%JCol == jj) then - ! -- This array element is already linked to a time series. - tsLink => tslTemp - found = .true. - exit searchlinks - end if - end if - end do searchlinks - if (.not. found) then - ! -- Link was not found. Make one and add it to the list. - call tsManager%make_link(timeseries, pkgName, auxOrBnd, bndElem, & - ii, jj, iprpak, tsLink, '', '') - end if + ! Make a new link between the time series and the row and + ! column position in the array + call tsManager%make_link(timeseries, pkgName, auxOrBnd, bndElem, & + ii, jj, iprpak, tsLink, '', '') else errmsg = 'Error in list input. Expected numeric value or '// & "time-series name, but found '"//trim(textInput)//"'." call store_error(errmsg) end if end if - ! - ! -- Return - return + end subroutine read_value_or_time_series !> @brief Call this subroutine from advanced packages to define timeseries From 6580a75f03f3a9379ea8bf4dd71b3340be757964 Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Mon, 22 Apr 2024 10:22:28 -0700 Subject: [PATCH 123/199] feat(MVE): adding support for energy mover package (#1740) --- autotest/test_gwe_mve.py | 872 ++++++++++++++++++ autotest/test_gwe_uze00.py | 8 +- doc/mf6io/gwe/gwe.tex | 4 + doc/mf6io/gwe/mve.tex | 18 + doc/mf6io/mf6ivar/dfn/gwe-mve.dfn | 106 +++ .../mf6ivar/examples/gwe-mve-example.dat | 6 + doc/mf6io/mf6ivar/md/mf6ivar.md | 8 + doc/mf6io/mf6ivar/mf6ivar.py | 1 - doc/mf6io/mf6ivar/tex/appendixA.tex | 2 + doc/mf6io/mf6ivar/tex/gwe-mve-desc.tex | 23 + doc/mf6io/mf6ivar/tex/gwe-mve-options.dat | 7 + src/Exchange/exg-gwegwe.f90 | 2 +- src/Exchange/exg-gwtgwt.f90 | 2 +- src/Model/GroundWaterEnergy/gwe.f90 | 2 +- src/Model/TransportModel/tsp-mvt.f90 | 167 ++-- src/Model/TransportModel/tsp.f90 | 4 +- src/Utilities/BudgetObject.f90 | 12 +- 17 files changed, 1134 insertions(+), 110 deletions(-) create mode 100644 autotest/test_gwe_mve.py create mode 100644 doc/mf6io/gwe/mve.tex create mode 100644 doc/mf6io/mf6ivar/dfn/gwe-mve.dfn create mode 100644 doc/mf6io/mf6ivar/examples/gwe-mve-example.dat create mode 100644 doc/mf6io/mf6ivar/tex/gwe-mve-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/gwe-mve-options.dat diff --git a/autotest/test_gwe_mve.py b/autotest/test_gwe_mve.py new file mode 100644 index 00000000000..7a6ccdfbdc5 --- /dev/null +++ b/autotest/test_gwe_mve.py @@ -0,0 +1,872 @@ +""" +Uses a sloped surface to test MVR/MVE connections. Connection types include + 1) DRN to SFR + 2) UZF to SFR + 3) DRN to UZF + 4) UZF to UZF + +Stress period 1 shouldn't have any DRN to MVR flows +Stress period 1 should include UZF to UZF and UZF to SFR flows +Stress period 2 shouldn't have any type of TO-MVR flows +Stress period 3 should include DRN to UZF and DRN to SFR flows +Stress period 4 should include all types (listed above) of TO-MVR flows + + (Not to scale: shows model grid design in profile view) + + +-----+ + | +-----+ precip + | | +-----+ runoff | MVR connections: UZF -> SFR + | | | +-----+ ~~~> v UZF -> UZF + | | | | +-----+ ~~~> DRN -> UZF + | | | | | +-----+ ~~~> DRN -> SFR + | | | | | | +-----+ ~~~> + | | | | | | | +-----+ ~~~> SFR channel + | | | | | | | | +-----+ / + | | | | | | | | | gw +-| |-+ + | | | | | | | | |dis Q| +-+ | + +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ + | | | | | | | | | | | + | | | | | | | | | | | + +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ + | | | | | | | | | | | + | | | | | | | | | | | + +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ + + A note about "gw dis Q" in the 9th column: DRN connections using + MVR/MVE have been set up for all active UZF cells; however, only + the right-most active DRN connection actually transfers groundwater + discharge to land surface to SFR. That is, none of the DRN -> UZF + connections accounting for cascading gw discharge to land surface + should ever be anything but 0.0 (which is verified by the checks) + +""" + +import os + +import flopy +import flopy.utils.binaryfile as bf +import numpy as np +import pytest + +from framework import TestFramework + +include_NWT = False + +cases = ["mve-01"] + +iuz_cell_dict = {} +cell_iuz_dict = {} + +nlay, nrow, ncol = 3, 3, 10 +nper = 4 +perlen = [1.0] * nper +nstp = [1] * nper +tsmult = [1.0] * nper + +delr = 1.0 +delc = 1.0 +strt = 25 + +nouter, ninner = 300, 300 +hclose, rclose, relax = 1e-6, 1e-3, 0.97 + +top = np.stack( + [ + [30.9, 30.8, 30.6, 30.6, 30.5, 30.4, 30.3, 30.2, 30.1, 30.0] + for _ in range(3) + ], + axis=0, +) +botm = [25.0, 10, 0.0] + +icelltype = 1 +K = 1000.0 +K33 = 100.0 +ss = 1e-6 +sy = 0.3 +strt_temp = 1.0 +scheme = "TVD" +dispersivity = 0.0 +ktw = 0.5918 +kts = 0.2700 +rhow = 1000.0 +cpw = 4183.0 +lhv = 2500.0 +cps = 760.0 +rhos = 1500.0 +K_therm_strmbed = [ + 1.5, + 1.75, + 2.0, +] # Thermal conductivity of the streambed material ($W/m/C$) +rbthcnd = 0.0001 +prsity = sy +drn_depth = 2.0 +ddrn = 1.0 +drn_cond = 1e5 + +ghbelv1 = 28.0 +ghbelv2 = 28.25 +ghbcond = 50000.0 +ghbtemp = 1.0 + +ghbspd = { + 0: [ + [0, 0, 0, ghbelv1, ghbcond, ghbtemp], + [0, 1, 0, ghbelv1, ghbcond, ghbtemp], + [0, 2, 0, ghbelv1, ghbcond, ghbtemp], + [1, 0, 0, ghbelv1, ghbcond, ghbtemp], + [1, 1, 0, ghbelv1, ghbcond, ghbtemp], + [1, 2, 0, ghbelv1, ghbcond, ghbtemp], + [2, 0, 0, ghbelv1, ghbcond, ghbtemp], + [2, 1, 0, ghbelv1, ghbcond, ghbtemp], + [2, 2, 0, ghbelv1, ghbcond, ghbtemp], + ], + 2: [ + [0, 0, 0, ghbelv2, ghbcond, ghbtemp], + [0, 1, 0, ghbelv2, ghbcond, ghbtemp], + [0, 2, 0, ghbelv2, ghbcond, ghbtemp], + [1, 0, 0, ghbelv2, ghbcond, ghbtemp], + [1, 1, 0, ghbelv2, ghbcond, ghbtemp], + [1, 2, 0, ghbelv2, ghbcond, ghbtemp], + [2, 0, 0, ghbelv2, ghbcond, ghbtemp], + [2, 1, 0, ghbelv2, ghbcond, ghbtemp], + [2, 2, 0, ghbelv2, ghbcond, ghbtemp], + ], +} + +# ifno cellid landflg ivertcn surfdp vks thtr thts thti eps [bndnm] +surfdep1 = 0.01 +surfdep2 = 0.001 +vks = 0.1 +eps = 4.0 +thti = 0.06 +thtr = 0.05 +thts = sy + thtr +iuzfbnd = np.array( + [ + [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, 0], + ] +) + +drn_pkdat = [] +uzf_pkdat = [] +uze_pkdat = [] +uze_perdat = [] +uzf_id_lkup = {} +ct = -1 +for k in np.arange(nlay): + landflg = 1 + if k > 0: + landflg = 0 + + for i in np.arange(nrow): + for j in np.arange(ncol): + if iuzfbnd[i, j] > 0: + ct += 1 + if k < nlay - 1: + ivertconn = ct + iuzfbnd.sum() + else: + ivertconn = -1 + + # gwf + uzf_pkdat.append( + [ + ct, + (k, i, j), + landflg, + ivertconn, + surfdep1, + vks, + thtr, + thts, + thti, + eps, + "uzf" + str(ct + 1).zfill(2), + ] + ) + # gwe + uze_pkdat.append((ct, 0)) + uze_perdat.append([ct, "INFILTRATION", 1.0]) + # generate a lookup dictionary based on the top layer + if k == 0: + drn_pkdat.append( + [(k, i, j), top[i, j] - drn_depth, drn_cond, ddrn] + ) + uzf_id_lkup.update({(i, j): ct}) + + +uze_perdat = { + 0: uze_perdat, +} + +mvr_pkdat = [] +for i in np.arange(nrow): + for j in np.arange(ncol - 1): + if iuzfbnd[i, j] > 0 and iuzfbnd[i, j + 1] > 0: + mvr_pkdat.append( + [ + "UZF-1", + uzf_id_lkup[(i, j)], + "UZF-1", + uzf_id_lkup[(i, j + 1)], + "FACTOR", + 1.0, + ] + ) + mvr_pkdat.append( + [ + "DRN-1", + uzf_id_lkup[(i, j)], + "UZF-1", + uzf_id_lkup[(i, j + 1)], + "FACTOR", + 1.0, + ] + ) + elif iuzfbnd[i, j] > 0 and j + 1 == ncol - 1: + mvr_pkdat.append( + ["UZF-1", uzf_id_lkup[(i, j)], "SFR-1", i, "FACTOR", 1.0] + ) + mvr_pkdat.append( + ["DRN-1", uzf_id_lkup[(i, j)], "SFR-1", i, "FACTOR", 1.0] + ) + +extdp = 3.0 +extwc = 0.05 +pet0 = 0.0 +pet1 = 0.001 +pet2 = 0.011 +finf0 = 0.2 +finf1 = 0.0 +finf2 = 0.2 +finf3 = 0.01 +zero = 0.0 +ntrail2 = 25 +nsets2 = 80 +uzf_spd = { + 0: [ + [0, finf0, pet0, extdp, extwc, zero, zero, zero], + [1, finf0, pet0, extdp, extwc, zero, zero, zero], + [2, finf0, pet0, extdp, extwc, zero, zero, zero], + [3, finf0, pet0, extdp, extwc, zero, zero, zero], + [4, finf0, pet0, extdp, extwc, zero, zero, zero], + [5, finf0, pet0, extdp, extwc, zero, zero, zero], + [6, finf0, pet0, extdp, extwc, zero, zero, zero], + [7, finf0, pet0, extdp, extwc, zero, zero, zero], + [8, finf1, pet0, extdp, extwc, zero, zero, zero], + [9, finf1, pet0, extdp, extwc, zero, zero, zero], + [10, finf1, pet0, extdp, extwc, zero, zero, zero], + [11, finf1, pet0, extdp, extwc, zero, zero, zero], + [12, finf1, pet0, extdp, extwc, zero, zero, zero], + [13, finf1, pet0, extdp, extwc, zero, zero, zero], + [14, finf1, pet0, extdp, extwc, zero, zero, zero], + [15, finf1, pet0, extdp, extwc, zero, zero, zero], + ], + 1: [], + 2: [], + 3: [ + [0, finf2, pet0, extdp, extwc, zero, zero, zero], + [1, finf2, pet0, extdp, extwc, zero, zero, zero], + [2, finf2, pet0, extdp, extwc, zero, zero, zero], + [3, finf2, pet0, extdp, extwc, zero, zero, zero], + [4, finf2, pet0, extdp, extwc, zero, zero, zero], + [5, finf2, pet0, extdp, extwc, zero, zero, zero], + [6, finf2, pet0, extdp, extwc, zero, zero, zero], + [7, finf2, pet0, extdp, extwc, zero, zero, zero], + [8, finf1, pet0, extdp, extwc, zero, zero, zero], + [9, finf1, pet0, extdp, extwc, zero, zero, zero], + [10, finf1, pet0, extdp, extwc, zero, zero, zero], + [11, finf1, pet0, extdp, extwc, zero, zero, zero], + [12, finf1, pet0, extdp, extwc, zero, zero, zero], + [13, finf1, pet0, extdp, extwc, zero, zero, zero], + [14, finf1, pet0, extdp, extwc, zero, zero, zero], + [15, finf1, pet0, extdp, extwc, zero, zero, zero], + ], +} + +rlen = delr +rwid = 1.0 +rgrd = 0.001 +rtp = 26.0 +rbth = 0.1 +rhk = 0.0 +rman = 0.02 +ncon = 2 +ustrf = 1.0 +ndv = 0 +pak_data = [] +for irno in range(nrow): + ncon = 2 + if irno in [0, nrow - 1]: + ncon = 1 + cellid = (0, irno, ncol - 1) + t = ( + irno, + cellid, + rlen, + rwid, + rgrd, + rtp, + rbth, + rhk, + rman, + ncon, + ustrf, + ndv, + ) + pak_data.append(t) + +con_data = [] +for irno in range(nrow): + if irno == 0: + t = (irno, -(irno + 1)) + elif irno == nrow - 1: + t = (irno, irno - 1) + else: + t = (irno, irno - 1, -(irno + 1)) + con_data.append(t) + +p_data = [ + (0, "INFLOW", 0.0), +] + + +def build_mf6_model(idx, ws): + tdis_rc = [] + for i in range(nper): + tdis_rc.append((perlen[i], nstp[i], tsmult[i])) + + name = cases[idx] + gwfname = "gwf-" + name + + # build MODFLOW 6 files + sim = flopy.mf6.MFSimulation( + sim_name=name, version="mf6", exe_name="mf6", sim_ws=ws + ) + + # create tdis package + flopy.mf6.ModflowTdis( + sim, time_units="DAYS", nper=nper, perioddata=tdis_rc + ) + + # create gwf model + gwf = flopy.mf6.ModflowGwf( + sim, modelname=gwfname, newtonoptions="NEWTON", save_flows=True + ) + + # create iterative model solution and register the gwf model with it + ims = flopy.mf6.ModflowIms( + sim, + print_option="SUMMARY", + complexity="MODERATE", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="DBD", + inner_maximum=ninner, + inner_dvclose=hclose, + rcloserecord=rclose, + linear_acceleration="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + ) + sim.register_ims_package(ims, [gwf.name]) + + flopy.mf6.ModflowGwfdis( + gwf, + nogrb=True, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + ) + + # initial conditions + flopy.mf6.ModflowGwfic(gwf, strt=strt) + + # node property flow + flopy.mf6.ModflowGwfnpf(gwf, save_flows=True, icelltype=1, k=K, k33=K33) + + # aquifer storage + flopy.mf6.ModflowGwfsto(gwf, iconvert=1, ss=ss, sy=sy, transient=True) + + # ghb files + flopy.mf6.ModflowGwfghb( + gwf, + print_flows=True, + auxiliary="TEMPERATURE", + stress_period_data=ghbspd, + pname="GHB-1", + ) + + flopy.mf6.ModflowGwfdrn( + gwf, + save_flows=True, + print_input=True, + print_flows=True, + auxiliary="DDRN", + auxdepthname="DDRN", + stress_period_data=drn_pkdat, + mover=True, + pname="DRN-1", + ) + + # transient uzf info + uzf_obs = { + f"{gwfname}.uzfobs": [ + ("uzf01_dpth=0.5", "water-content", "uzf01", 0.5), + ( + "uzf01_dpth=1.5", + "water-content", + "uzf01", + 1.5, + ), # Relies on boundnames + ("uzf01_dpth=2.5", "water-content", "uzf01", 2.5), + ("uzf01_dpth=3.5", "water-content", "uzf01", 3.5), + ("uzf01_dpth=4.49", "water-content", "uzf01", 4.49), + ] + } + flopy.mf6.ModflowGwfuzf( + gwf, + mover=True, + print_flows=True, + save_flows=True, + wc_filerecord=gwfname + ".uzfwc.bin", + simulate_et=True, + simulate_gwseep=False, + linear_gwet=True, + boundnames=True, + observations=uzf_obs, + ntrailwaves=ntrail2, + nwavesets=nsets2, + nuzfcells=len(uzf_pkdat), + packagedata=uzf_pkdat, + perioddata=uzf_spd, + budget_filerecord=f"{gwfname}.uzf.bud", + pname="UZF-1", + filename=f"{gwfname}.uzf", + ) + + flopy.mf6.modflow.ModflowGwfsfr( + gwf, + save_flows=True, + print_input=True, + print_flows=True, + print_stage=True, + mover=True, + stage_filerecord=name + ".sfr.stg", + budget_filerecord=name + ".sfr.bud", + nreaches=nrow, + packagedata=pak_data, + pname="SFR-1", + connectiondata=con_data, + perioddata=p_data, + ) + + packages = [ + ("UZF-1",), + ("SFR-1",), + ("DRN-1",), + ] + flopy.mf6.ModflowGwfmvr( + gwf, + maxmvr=len(mvr_pkdat), + budget_filerecord=f"{gwfname}.mvr.bud", + maxpackages=len(packages), + print_flows=True, + packages=packages, + perioddata=mvr_pkdat, + ) + + # output control + flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord=f"{gwfname}.cbc", + head_filerecord=f"{gwfname}.hds", + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + printrecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + filename=f"{gwfname}.oc", + ) + + # ---------- + # GWE model + # ---------- + + gwename = "gwe-" + name + gwe = flopy.mf6.ModflowGwe( + sim, modelname=gwename, model_nam_file=f"{gwename}.nam" + ) + gwe.name_file.save_flows = True + + imsgwe = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwename), + ) + sim.register_ims_package(imsgwe, [gwe.name]) + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwedis( + gwe, + nogrb=True, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + pname="DIS", + filename=f"{gwename}.dis", + ) + + # Instantiating MODFLOW 6 transport initial concentrations + flopy.mf6.ModflowGweic( + gwe, + strt=strt_temp, + pname="IC", + filename=f"{gwename}.ic", + ) + + # Instantiating MODFLOW 6 transport advection package + flopy.mf6.ModflowGweadv( + gwe, scheme=scheme, pname="ADV", filename="{}.adv".format(gwename) + ) + + # Instantiating MODFLOW 6 transport dispersion package + flopy.mf6.ModflowGwecnd( + gwe, + xt3d_off=False, + alh=dispersivity, + ath1=dispersivity, + ktw=ktw * 86400, + kts=kts * 86400, + pname="CND", + filename=f"{gwename}.cnd", + ) + + # Instantiating MODFLOW 6 transport mass storage package + flopy.mf6.ModflowGweest( + gwe, + save_flows=True, + porosity=prsity, + cps=cps, + rhos=rhos, + packagedata=[cpw, rhow, lhv], + pname="EST", + filename=f"{gwename}.est", + ) + + # Source-sink mixing package to support GHB input + srctype = "AUX" + auxname = "TEMPERATURE" + pname = ["GHB-1"] + # Inpput to SSM is: + sources = [[itm, srctype, auxname] for itm in pname] + + flopy.mf6.ModflowGwessm( + gwe, + sources=sources, + pname="SSM", + filename=f"{gwename}.ssm", + ) + + # Instantiate Streamflow Energy Transport package + sfepackagedata = [] + for irno in range(nrow): + t = (irno, strt_temp, K_therm_strmbed[irno], rbthcnd) + sfepackagedata.append(t) + + sfeperioddata = {0: [(0, "INFLOW", strt_temp)]} + + flopy.mf6.modflow.ModflowGwesfe( + gwe, + boundnames=False, + save_flows=True, + print_input=False, + print_flows=False, + print_temperature=True, + temperature_filerecord=gwename + ".sfe.bin", + budget_filerecord=gwename + ".sfe.bud", + packagedata=sfepackagedata, + reachperioddata=sfeperioddata, + flow_package_name="SFR-1", + pname="SFE-1", + filename="{}.sfe".format(gwename), + ) + + # Instantiating MODFLOW 6 unsaturated zone energy transport + flopy.mf6.ModflowGweuze( + gwe, + flow_package_name="UZF-1", + boundnames=False, + save_flows=True, + print_input=True, + print_flows=True, + print_temperature=True, + temperature_filerecord=gwename + ".uze.bin", + budget_filerecord=gwename + ".uze.bud", + packagedata=uze_pkdat, + uzeperioddata=uze_perdat, + pname="UZE-1", + filename=f"{gwename}.uze", + ) + + # mover transport package + fname = f"{gwename}.mve.bud" + mve = flopy.mf6.modflow.ModflowGwemve( + gwe, print_flows=True, budget_filerecord=fname + ) + + # Instantiate Output Control package for transport + flopy.mf6.ModflowGweoc( + gwe, + temperature_filerecord="{}.ucn".format(gwename), + budget_filerecord=f"{gwename}.bud", + saverecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + temperatureprintrecord=[ + ("COLUMNS", 3, "WIDTH", 20, "DIGITS", 8, "GENERAL") + ], + printrecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + filename="{}.oc".format(gwename), + ) + + # Instantiate Gwf-Gwe Exchange package + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname, + exgmnameb=gwename, + filename="{}.gwfgwe".format(gwename), + ) + + return sim + + +def build_models(idx, test): + # Start by building the MF6 model + sim = build_mf6_model(idx, test.workspace) + + return sim, None + + +def check_output(idx, test): + ws = test.workspace + name = cases[idx] + gwfname = "gwf-" + name + gwename = "gwe-" + name + + # Get the model budget items + fname = os.path.join(ws, gwfname + ".cbc") + assert os.path.isfile(fname) + modobj = flopy.utils.CellBudgetFile( + fname, precision="double", verbose=True + ) + + # Get the MVR results from GWF + fname = os.path.join(ws, gwfname + ".mvr.bud") + assert os.path.isfile(fname) + mvrobj = flopy.utils.CellBudgetFile( + fname, precision="double", verbose=True + ) + + # Get the MVE results from GWE + fname = os.path.join(ws, gwename + ".mve.bud") + assert os.path.isfile(fname) + mveobj = flopy.utils.CellBudgetFile( + fname, precision="double", verbose=False + ) + + ckstpkper = mveobj.get_kstpkper() + + drnbud = modobj.get_data(text="DRN") + drn2mvr = modobj.get_data(text="DRN-TO-MVR") + # uzf2mvr = modobj.get_data(text="UZF-GWD TO-MVR") + mvrdat = mvrobj.get_data(text="MOVER-FLOW") + mvedat = mveobj.get_data(text="MVE-FLOW") + + msg0 = "Accumulated cascading runoff is not as expected" + msg1 = ( + "Rejected infiltration being passed to MVR where it should not " + "be happening" + ) + msg2 = ( + "The accumulated cascading runoff that is finally passed to SFR " + "is not as expected" + ) + msg3 = "There should be no UZF -> SFR MVR flows in rows 2 and 3" + msg4 = ( + "There should be no cascading flow resulting from gw discharge " + "to land surface during the first stress period, but at least " + "one is not equal to 0.0" + ) + msg5 = ( + "GW discharge simulated with DRN from the right-most active DRN " + "cells should be 0 in the first stress period, but at least one " + "is not equal to 0.0" + ) + msg6 = ( + "GW discharge simulated by DRN for the right-most active DRN " + "cells should not be 0.0 in stress period 3, but at least one " + "is equal to 0.0" + ) + msg7 = "Accumulated cascaded energy is not accumulating as expected" + msg8 = ( + "Energy associated with rejected infiltration is being passed " + "to MVE where it should not be happening" + ) + msg9 = ( + "The accumulated cascading energy associated with runoff that " + "is finally passed to SFR is not as expected" + ) + msg10 = "There should be no UZE -> SFE MVE flows in rows 2 and 3" + msg11 = ( + "There should be no cascading energy flow resulting from gw " + "discharge to land surface, but at least one is not equal " + "to 0.0" + ) + msg12 = ( + "There should be no energy being passed by DRN from the " + "right-most active DRN cells during the first stress period, " + "but at least one is not equal to 0.0" + ) + msg13 = ( + "Energy accompanying gw discharge simulated by DRN for the " + "right-most active DRN cells should not be 0.0 in stress period " + "3, but at least one is equal to 0.0" + ) + + accum_runoff = 0.0 + accum_energy = 0.0 + for i, current_kstpkper in enumerate(ckstpkper): + mvr_rawdat = mvrobj.get_data(kstpkper=current_kstpkper) + mve_rawdat = mveobj.get_data(kstpkper=current_kstpkper) + if i == 0: + for idx, (itm, itm_e) in enumerate(zip(mvr_rawdat, mve_rawdat)): + # idx == 0 checks the UZF -> UZF MVR/MVE connections + if idx == 0: + for ct, val in enumerate(itm): + if ct < 7: + assert np.isclose( + itm[ct][-1], -1 * (finf0 - vks) + accum_runoff + ), msg0 + assert np.isclose( + itm_e[ct][-1], + (finf0 - vks) * rhow * cpw + accum_energy, + ), msg7 + accum_runoff += -1 * (finf0 - vks) + accum_energy += (finf0 - vks) * rhow * cpw + elif ct == 8: + accum_runoff += -1 * (finf0 - vks) + accum_energy += (finf0 - vks) * rhow * cpw + else: + assert itm[ct][-1] == 0, msg1 + assert itm_e[ct][-1] == 0, msg8 + + # idx == 1 checks the UZF -> SFR MVR connections + if idx == 1: + for ct, val in enumerate(itm): + if ct == 0: + assert np.isclose(itm[ct][-1], accum_runoff), msg2 + assert np.isclose( + itm_e[ct][-1], accum_energy + ), msg9 + else: + assert itm[ct][-1] == 0, msg3 + assert itm_e[ct][-1] == 0, msg10 + + # idx == 6 checks the DRN -> UZF MVR connections + # (groundwater discharge that cascades downhill) + if idx == 6: + for ct, val in enumerate(itm): + assert itm[ct][-1] == 0, msg4 + assert itm_e[ct][-1] == 0, msg11 + + # idx == 7 check the DRN -> SFR MVR connections + # (gw discharge from the lowest cell to SFR) + if idx == 7: + for ct, val in enumerate(itm): + assert itm[ct][-1] == 0, msg5 + assert itm_e[ct][-1] == 0, msg12 + + # Expect DRN -> MVR flows in the third stress period + if i == 2: + accum_runoff = 0 + accum_energy = 0 + for idx, (itm, itm_e) in enumerate(zip(mvr_rawdat, mve_rawdat)): + # idx == 0 checks the UZF -> UZF MVR connections + if idx == 0: + for ct, val in enumerate(itm): + if ct < 7: + assert np.isclose( + itm[ct][-1], -1 * (finf0 - vks) + accum_runoff + ), msg0 + assert np.isclose( + itm_e[ct][-1], + (finf0 - vks) * rhow * cpw + accum_energy, + ), msg7 + accum_runoff += -1 * (finf0 - vks) + accum_energy += (finf0 - vks) * rhow * cpw + elif ct == 8: + accum_runoff += -1 * (finf0 - vks) + accum_energy += (finf0 - vks) * rhow * cpw + else: + assert itm[ct][-1] == 0, msg1 + assert itm_e[ct][-1] == 0, msg8 + + # idx == 1 checks the UZF -> SFR MVR connections + if idx == 1: + for ct, val in enumerate(itm): + if ct == 0: + assert np.isclose(itm[ct][-1], accum_runoff), msg2 + assert np.isclose( + itm_e[ct][-1], accum_energy + ), msg9 + else: + assert itm[ct][-1] == 0, msg3 + assert itm_e[ct][-1] == 0, msg10 + + # idx == 6 checks the DRN -> UZF MVR connections + # (groundwater discharge that cascades downhill) + if idx == 6: + for ct, val in enumerate(itm): + assert itm[ct][-1] == 0, msg4 + assert itm_e[ct][-1] == 0, msg11 + + # idx == 7 check the DRN -> SFR MVR connections + # (gw discharge from the lowest cell to SFR) + if idx == 7: + for ct, val in enumerate(itm): + assert itm[ct][-1] < 0, msg6 + assert itm_e[ct][-1] > 0, msg13 + + print("Finished running checks") + + +@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), + check=lambda t: check_output(idx, t), + targets=targets, + ) + test.run() diff --git a/autotest/test_gwe_uze00.py b/autotest/test_gwe_uze00.py index 9fb9b6336c1..a196d0514d5 100644 --- a/autotest/test_gwe_uze00.py +++ b/autotest/test_gwe_uze00.py @@ -338,8 +338,8 @@ def build_models(idx, test): ath1=dispersivity, ktw=0.5918 * 86400, kts=0.2700 * 86400, - pname="DSP", - filename=f"{gwename}.dsp", + pname="CND", + filename=f"{gwename}.cnd", ) # Instantiating MODFLOW 6 transport mass storage package @@ -353,8 +353,8 @@ def build_models(idx, test): cps=760.0, rhos=1500.0, packagedata=[cpw, rhow, lhv], - pname="MST", - filename=f"{gwename}.mst", + pname="EST", + filename=f"{gwename}.est", ) # Instantiating MODFLOW 6 constant temperature boundary condition at diff --git a/doc/mf6io/gwe/gwe.tex b/doc/mf6io/gwe/gwe.tex index 89eccf3b161..c908f5a85dd 100644 --- a/doc/mf6io/gwe/gwe.tex +++ b/doc/mf6io/gwe/gwe.tex @@ -145,6 +145,10 @@ \subsection{Unsaturated-Zone Energy Transport (UZE) Package} \subsection{Flow Model Interface (FMI) Package} \input{gwe/fmi} +\newpage +\subsection{Mover Energy Transport (MVE) Package} +\input{gwe/mve} + \newpage \subsection{Groundwater Energy Transport (GWE) Exchange} \input{gwe/gwe-gwe} diff --git a/doc/mf6io/gwe/mve.tex b/doc/mf6io/gwe/mve.tex new file mode 100644 index 00000000000..a931c3421dd --- /dev/null +++ b/doc/mf6io/gwe/mve.tex @@ -0,0 +1,18 @@ +Mover Energy Transport (MVE) Package information is read from the file that is specified by ``MVE6'' as the file type. Only one MVE Package can be specified for a GWE model. + +The MVE Package is used to route thermal energy according to flows from the GWF Water Mover (MVR) Package. The MVE Package must be activated by the user if the MVR Package is active in the corresponding the GWF Model. Flows from the GWF MVR Package must be available to the GWE model either through activation of a GWF-GWE Exchange or through specification of ``GWFMOVER'' in the PACKAGEDATA block of the GWE FMI Package. + +\vspace{5mm} +\subsubsection{Structure of Blocks} +\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/gwe-mve-options.dat} + +\vspace{5mm} +\subsubsection{Explanation of Variables} +\begin{description} +\input{./mf6ivar/tex/gwe-mve-desc.tex} +\end{description} + +\vspace{5mm} +\subsubsection{Example Input File} +\lstinputlisting[style=inputfile]{./mf6ivar/examples/gwe-mve-example.dat} + diff --git a/doc/mf6io/mf6ivar/dfn/gwe-mve.dfn b/doc/mf6io/mf6ivar/dfn/gwe-mve.dfn new file mode 100644 index 00000000000..e67e76ba471 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/gwe-mve.dfn @@ -0,0 +1,106 @@ +# --------------------- gwe mve options --------------------- +# flopy subpackage mve_filerecord mve perioddata perioddata +# flopy parent_name_type parent_model_or_package MFModel/MFPackage + +block options +name print_input +type keyword +reader urword +optional true +longname print input to listing file +description REPLACE print_input {'{#1}': 'mover'} + +block options +name print_flows +type keyword +reader urword +optional true +longname print calculated flows to listing file +description REPLACE print_flows {'{#1}': 'lake'} + +block options +name save_flows +type keyword +reader urword +optional true +longname save lake flows to budget file +description REPLACE save_flows {'{#1}': 'lake'} + +block options +name budget_filerecord +type record budget fileout budgetfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name budget +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname budget keyword +description keyword to specify that record corresponds to the budget. + +block options +name fileout +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an output filename is expected next. + +block options +name budgetfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the binary output file to write budget information. + +block options +name budgetcsv_filerecord +type record budgetcsv fileout budgetcsvfile +shape +reader urword +tagged true +optional true +longname +description + +block options +name budgetcsv +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname budget keyword +description keyword to specify that record corresponds to the budget CSV. + +block options +name budgetcsvfile +type string +preserve_case true +shape +in_record true +reader urword +tagged false +optional false +longname file keyword +description name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. + + diff --git a/doc/mf6io/mf6ivar/examples/gwe-mve-example.dat b/doc/mf6io/mf6ivar/examples/gwe-mve-example.dat new file mode 100644 index 00000000000..1b2835d13cf --- /dev/null +++ b/doc/mf6io/mf6ivar/examples/gwe-mve-example.dat @@ -0,0 +1,6 @@ +BEGIN OPTIONS + PRINT_INPUT + PRINT_FLOWS + SAVE_FLOWS + BUDGET FILEOUT mygwemodel.mve.bud +END OPTIONS diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 4390cd2ff52..8821d4b6ad0 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -326,6 +326,14 @@ | GWE | LKE | PERIOD | AUXILIARY | KEYWORD | keyword for specifying auxiliary variable. | | GWE | LKE | PERIOD | AUXNAME | STRING | name for the auxiliary variable to be assigned AUXVAL. AUXNAME must match one of the auxiliary variable names defined in the OPTIONS block. If AUXNAME does not match one of the auxiliary variable names defined in the OPTIONS block the data are ignored. | | GWE | LKE | PERIOD | AUXVAL | DOUBLE PRECISION | value for the auxiliary variable. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | +| GWE | MVE | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of mover information will be written to the listing file immediately after it is read. | +| GWE | MVE | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of lake flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | +| GWE | MVE | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that lake flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | +| GWE | MVE | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | +| GWE | MVE | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | +| GWE | MVE | OPTIONS | BUDGETFILE | STRING | name of the binary output file to write budget information. | +| GWE | MVE | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | +| GWE | MVE | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | | GWE | MWE | OPTIONS | FLOW_PACKAGE_NAME | STRING | keyword to specify the name of the corresponding flow package. If not specified, then the corresponding flow package must have the same name as this advanced transport package (the name associated with this package in the GWE name file). | | GWE | MWE | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | | GWE | MWE | OPTIONS | FLOW_PACKAGE_AUXILIARY_NAME | STRING | keyword to specify the name of an auxiliary variable in the corresponding flow package. If specified, then the simulated temperatures from this advanced transport package will be copied into the auxiliary variable specified with this name. Note that the flow package must have an auxiliary variable with this name or the program will terminate with an error. If the flows for this advanced transport package are read from a file, then this option will have no effect. | diff --git a/doc/mf6io/mf6ivar/mf6ivar.py b/doc/mf6io/mf6ivar/mf6ivar.py index 4dba6f2ec62..aaf21a3c1d7 100644 --- a/doc/mf6io/mf6ivar/mf6ivar.py +++ b/doc/mf6io/mf6ivar/mf6ivar.py @@ -654,7 +654,6 @@ def write_appendix(blocks): f.write("\n\n\\hline\n\\end{longtable}\n\\label{table:blocks}\n\\normalsize\n") - def get_dfn_files(models): def is_sim_dfn(stem): return "sim" in stem diff --git a/doc/mf6io/mf6ivar/tex/appendixA.tex b/doc/mf6io/mf6ivar/tex/appendixA.tex index 7915b054671..273ed6a303c 100644 --- a/doc/mf6io/mf6ivar/tex/appendixA.tex +++ b/doc/mf6io/mf6ivar/tex/appendixA.tex @@ -100,6 +100,8 @@ GWE & LKE & PACKAGEDATA & yes \\ GWE & LKE & PERIOD & yes \\ \hline +GWE & MVE & OPTIONS & yes \\ +\hline GWE & MWE & OPTIONS & yes \\ GWE & MWE & PACKAGEDATA & yes \\ GWE & MWE & PERIOD & yes \\ diff --git a/doc/mf6io/mf6ivar/tex/gwe-mve-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-mve-desc.tex new file mode 100644 index 00000000000..faae2d20ff4 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-mve-desc.tex @@ -0,0 +1,23 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of mover information will be written to the listing file immediately after it is read. + +\item \texttt{PRINT\_FLOWS}---keyword to indicate that the list of lake flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. + +\item \texttt{SAVE\_FLOWS}---keyword to indicate that lake flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. + +\item \texttt{BUDGET}---keyword to specify that record corresponds to the budget. + +\item \texttt{FILEOUT}---keyword to specify that an output filename is expected next. + +\item \texttt{budgetfile}---name of the binary output file to write budget information. + +\item \texttt{BUDGETCSV}---keyword to specify that record corresponds to the budget CSV. + +\item \texttt{budgetcsvfile}---name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/gwe-mve-options.dat b/doc/mf6io/mf6ivar/tex/gwe-mve-options.dat new file mode 100644 index 00000000000..7b9ca2ed7b1 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/gwe-mve-options.dat @@ -0,0 +1,7 @@ +BEGIN OPTIONS + [PRINT_INPUT] + [PRINT_FLOWS] + [SAVE_FLOWS] + [BUDGET FILEOUT ] + [BUDGETCSV FILEOUT ] +END OPTIONS diff --git a/src/Exchange/exg-gwegwe.f90 b/src/Exchange/exg-gwegwe.f90 index b168d6c4b0c..6289e7e01ef 100644 --- a/src/Exchange/exg-gwegwe.f90 +++ b/src/Exchange/exg-gwegwe.f90 @@ -800,7 +800,7 @@ subroutine read_mvt(this, iout) ! for gwtmodel1 so that a call to save flows has an associated dis ! object. call mvt_cr(this%mvt, this%name, this%inmvt, iout, this%gwemodel1%fmi, & - this%gwemodel1%eqnsclfac, & + this%gwemodel1%eqnsclfac, this%gwemodel1%depvartype, & gwfmodelname1=this%gwfmodelname1, & gwfmodelname2=this%gwfmodelname2, & fmi2=this%gwemodel2%fmi) diff --git a/src/Exchange/exg-gwtgwt.f90 b/src/Exchange/exg-gwtgwt.f90 index c9e66e8d27c..e6559ce6f48 100644 --- a/src/Exchange/exg-gwtgwt.f90 +++ b/src/Exchange/exg-gwtgwt.f90 @@ -797,7 +797,7 @@ subroutine read_mvt(this, iout) ! for gwtmodel1 so that a call to save flows has an associated dis ! object. call mvt_cr(this%mvt, this%name, this%inmvt, iout, this%gwtmodel1%fmi, & - this%gwtmodel1%eqnsclfac, & + this%gwtmodel1%eqnsclfac, this%gwtmodel1%depvartype, & gwfmodelname1=this%gwfmodelname1, & gwfmodelname2=this%gwfmodelname2, & fmi2=this%gwtmodel2%fmi) diff --git a/src/Model/GroundWaterEnergy/gwe.f90 b/src/Model/GroundWaterEnergy/gwe.f90 index e387f77791c..8ed3e4394b1 100644 --- a/src/Model/GroundWaterEnergy/gwe.f90 +++ b/src/Model/GroundWaterEnergy/gwe.f90 @@ -70,7 +70,7 @@ module GweModule character(len=LENPACKAGETYPE), dimension(GWE_NBASEPKG) :: GWE_BASEPKG data GWE_BASEPKG/'DIS6 ', 'DISV6', 'DISU6', ' ', ' ', & ! 5 &'IC6 ', 'FMI6 ', 'EST6 ', 'ADV6 ', ' ', & ! 10 - &'CND6 ', 'SSM6 ', 'MVT6 ', 'OC6 ', ' ', & ! 15 + &'CND6 ', 'SSM6 ', 'MVE6 ', 'OC6 ', ' ', & ! 15 &'OBS6 ', ' ', ' ', ' ', ' ', & ! 20 &30*' '/ ! 50 diff --git a/src/Model/TransportModel/tsp-mvt.f90 b/src/Model/TransportModel/tsp-mvt.f90 index 17108e4f29a..c5b5a86f001 100644 --- a/src/Model/TransportModel/tsp-mvt.f90 +++ b/src/Model/TransportModel/tsp-mvt.f90 @@ -6,7 +6,8 @@ module TspMvtModule use KindModule, only: DP, I4B use ConstantsModule, only: LINELENGTH, MAXCHARLEN, DZERO, LENPAKLOC, & - DNODATA, LENPACKAGENAME, TABCENTER, LENMODELNAME + DNODATA, LENPACKAGENAME, TABCENTER, & + LENMODELNAME, LENVARNAME use SimModule, only: store_error use BaseDisModule, only: DisBaseType @@ -23,6 +24,7 @@ module TspMvtModule public :: mvt_cr type, extends(NumericalPackageType) :: TspMvtType + character(len=LENMODELNAME) :: gwfmodelname1 = '' !< name of model 1 character(len=LENMODELNAME) :: gwfmodelname2 = '' !< name of model 2 (set to modelname 1 for single model MVT) integer(I4B), pointer :: maxpackages !< max number of packages @@ -36,10 +38,13 @@ module TspMvtModule type(BudgetObjectType), pointer :: mvrbudobj => null() !< pointer to the water mover budget object character(len=LENPACKAGENAME), & dimension(:), pointer, contiguous :: paknames => null() !< array of package names + character(len=LENVARNAME) :: depvartype = '' ! ! -- table objects type(TableType), pointer :: outputtab => null() + contains + procedure :: mvt_df procedure :: mvt_ar procedure :: mvt_rp @@ -66,7 +71,7 @@ module TspMvtModule !> @brief Create a new mover transport object !< subroutine mvt_cr(mvt, name_model, inunit, iout, fmi1, eqnsclfac, & - gwfmodelname1, gwfmodelname2, fmi2) + depvartype, gwfmodelname1, gwfmodelname2, fmi2) ! -- dummy type(TspMvtType), pointer :: mvt character(len=*), intent(in) :: name_model @@ -74,15 +79,15 @@ subroutine mvt_cr(mvt, name_model, inunit, iout, fmi1, eqnsclfac, & integer(I4B), intent(in) :: iout type(TspFmiType), intent(in), target :: fmi1 real(DP), intent(in), pointer :: eqnsclfac !< governing equation scale factor + character(len=LENVARNAME), intent(in) :: depvartype !< dependent variable type ('concentration' or 'temperature') character(len=*), intent(in), optional :: gwfmodelname1 character(len=*), intent(in), optional :: gwfmodelname2 type(TspFmiType), intent(in), target, optional :: fmi2 -! ------------------------------------------------------------------------------ ! ! -- Create the object allocate (mvt) ! - ! -- create name and memory path + ! -- Create name and memory path call mvt%set_names(1, name_model, 'MVT', 'MVT') ! ! -- Allocate scalars @@ -95,12 +100,12 @@ subroutine mvt_cr(mvt, name_model, inunit, iout, fmi1, eqnsclfac, & mvt%fmi1 => fmi1 mvt%fmi2 => fmi1 ! - ! -- set pointers + ! -- Set pointers if (present(fmi2)) then mvt%fmi2 => fmi2 end if ! - ! -- set model names + ! -- Set model names if (present(gwfmodelname1)) then mvt%gwfmodelname1 = gwfmodelname1 end if @@ -108,12 +113,16 @@ subroutine mvt_cr(mvt, name_model, inunit, iout, fmi1, eqnsclfac, & mvt%gwfmodelname2 = gwfmodelname2 end if ! - ! -- create the budget object + ! -- Create the budget object call budgetobject_cr(mvt%budobj, 'TRANSPORT MOVER') ! ! -- Store pointer to governing equation scale factor mvt%eqnsclfac => eqnsclfac ! + ! -- Store pointer to labels associated with the current model so that the + ! package has access to the corresponding dependent variable type + mvt%depvartype = depvartype + ! ! -- Return return end subroutine mvt_cr @@ -121,27 +130,24 @@ end subroutine mvt_cr !> @brief Define mover transport object !< subroutine mvt_df(this, dis) - ! -- modules ! -- dummy class(TspMvtType) :: this class(DisBaseType), pointer, intent(in) :: dis - ! -- local ! -- formats character(len=*), parameter :: fmtmvt = & "(1x,/1x,'MVT -- MOVER TRANSPORT PACKAGE, VERSION 1, 4/15/2020', & &' INPUT READ FROM UNIT ', i0, //)" -! ------------------------------------------------------------------------------ ! - ! -- set pointer to dis + ! -- Set pointer to dis this%dis => dis ! - ! -- print a message identifying the MVT package. + ! -- Print a message identifying the MVT package. write (this%iout, fmtmvt) this%inunit ! ! -- Initialize block parser call this%parser%Initialize(this%inunit, this%iout) ! - ! -- initialize the budget table writer + ! -- Initialize the budget table writer call budget_cr(this%budget, this%memoryPath) ! ! -- Read mvt options @@ -156,7 +162,6 @@ end subroutine mvt_df !! Store a pointer to mvrbudobj, which contains the simulated water !! mover flows from either a gwf model MVR package or from a gwf-gwf !! exchange MVR package. - !! !< subroutine set_pointer_mvrbudobj(this, mvrbudobj) class(TspMvtType) :: this @@ -167,13 +172,10 @@ end subroutine set_pointer_mvrbudobj !> @brief Allocate and read mover-for-transport information !< subroutine mvt_ar(this) - ! -- modules ! -- dummy class(TspMvtType) :: this - ! -- locals -! ------------------------------------------------------------------------------ ! - ! -- setup the output table + ! -- Setup the output table call this%mvt_setup_outputtab() ! ! -- Return @@ -187,20 +189,17 @@ subroutine mvt_rp(this) use TdisModule, only: kper, kstp ! -- dummy class(TspMvtType) :: this - ! -- local - ! -- formats -! ------------------------------------------------------------------------------ ! ! -- At this point, the mvrbudobj is available to set up the mvt budobj if (kper * kstp == 1) then ! - ! -- if mvt is for a single model then point to fmi1 + ! -- If mvt is for a single model then point to fmi1 !cdl todo: this needs to be called from GwtGwtExg somehow for the 2 model case if (associated(this%fmi1, this%fmi2)) then call this%set_pointer_mvrbudobj(this%fmi1%mvrbudobj) end if ! - ! -- set up the mvt budobject + ! -- Set up the mvt budobject call this%mvt_scan_mvrbudobj() call this%mvt_setup_budobj() ! @@ -222,7 +221,6 @@ end subroutine mvt_rp !! hand side of the transport matrix equations. !< subroutine mvt_fc(this, cnew1, cnew2) - ! -- modules ! -- dummy class(TspMvtType) :: this real(DP), intent(in), dimension(:), contiguous, target :: cnew1 @@ -238,7 +236,6 @@ subroutine mvt_fc(this, cnew1, cnew2) real(DP), dimension(:), contiguous, pointer :: cnew type(TspFmiType), pointer :: fmi_pr !< pointer to provider model fmi package type(TspFmiType), pointer :: fmi_rc !< pointer to receiver model fmi package -! ------------------------------------------------------------------------------ ! ! -- Add mover QC terms to the receiver packages nbudterm = this%mvrbudobj%nbudterm @@ -249,7 +246,8 @@ subroutine mvt_fc(this, cnew1, cnew2) ! -- Set pointers to the fmi packages for the provider and the receiver call this%set_fmi_pr_rc(i, fmi_pr, fmi_rc) ! - ! -- Set a pointer to the GWT model concentration associated with the provider + ! -- Set a pointer to the GWT model concentration (or temperature) + ! associated with the provider cnew => cnew1 if (associated(fmi_pr, this%fmi2)) then cnew => cnew2 @@ -280,8 +278,9 @@ subroutine mvt_fc(this, cnew1, cnew2) cp = DZERO if (fmi_pr%iatp(ipr) /= 0) then ! - ! -- Provider package is being represented by an APT (SFT, LKT, MWT, UZT) - ! so set the concentration to the simulated concentration of APT + ! -- Provider package is being represented by an APT (SFT, LKT, MWT, UZT, + ! SFE, LKE, MWE, UZE) so set the dependent variable (concentration or + ! temperature) to the simulated dependent variable of the APT. cp = concpak(id1) else ! @@ -290,10 +289,10 @@ subroutine mvt_fc(this, cnew1, cnew2) ! SFT, LKT, MWT, or UZT, so use the GWT cell concentration igwtnode = fmi_pr%gwfpackages(ipr)%nodelist(id1) cp = cnew(igwtnode) - + ! end if ! - ! -- add the mover rate times the provider concentration into the receiver + ! -- Add the mover rate times the provider concentration into the receiver ! make sure these are accumulated since multiple providers can move ! water into the same receiver if (fmi_rc%iatp(irc) /= 0) then @@ -323,40 +322,40 @@ subroutine set_fmi_pr_rc(this, ibudterm, fmi_pr, fmi_rc) integer(I4B), intent(in) :: ibudterm type(TspFmiType), pointer :: fmi_pr type(TspFmiType), pointer :: fmi_rc - + ! fmi_pr => null() fmi_rc => null() if (this%gwfmodelname1 == '' .and. this%gwfmodelname2 == '') then fmi_pr => this%fmi1 fmi_rc => this%fmi1 else - ! modelname for provider is this%mvrbudobj%budterm(i)%text1id1 + ! -- Modelname for provider is this%mvrbudobj%budterm(i)%text1id1 if (this%mvrbudobj%budterm(ibudterm)%text1id1 == this%gwfmodelname1) then - ! -- model 1 is the provider + ! -- Model 1 is the provider fmi_pr => this%fmi1 else if (this%mvrbudobj%budterm(ibudterm)%text1id1 == & this%gwfmodelname2) then - ! -- model 2 is the provider + ! -- Model 2 is the provider fmi_pr => this%fmi2 else - ! must be an error + ! -- Must be an error !cdl todo: programming error print *, this%mvrbudobj%budterm(ibudterm)%text1id1 print *, this%gwfmodelname1 print *, this%gwfmodelname2 stop "error in set_fmi_pr_rc" end if - - ! modelname for receiver is this%mvrbudobj%budterm(i)%text1id2 + ! + ! -- Modelname for receiver is this%mvrbudobj%budterm(i)%text1id2 if (this%mvrbudobj%budterm(ibudterm)%text1id2 == this%gwfmodelname1) then - ! -- model 1 is the receiver + ! -- Model 1 is the receiver fmi_rc => this%fmi1 else if (this%mvrbudobj%budterm(ibudterm)%text1id2 == & this%gwfmodelname2) then - ! -- model 2 is the receiver + ! -- Model 2 is the receiver fmi_rc => this%fmi2 else - ! must be an error + ! -- Must be an error !cdl todo: programming error print *, this%mvrbudobj%budterm(ibudterm)%text1id2 print *, this%gwfmodelname1 @@ -364,7 +363,7 @@ subroutine set_fmi_pr_rc(this, ibudterm, fmi_pr, fmi_rc) stop "error in set_fmi_pr_rc" end if end if - + ! if (.not. associated(fmi_pr)) then print *, 'Could not find FMI Package...' stop "error in set_fmi_pr_rc" @@ -388,7 +387,6 @@ subroutine mvt_cc(this, kiter, iend, icnvgmod, cpak, dpak) integer(I4B), intent(in) :: icnvgmod character(len=LENPAKLOC), intent(inout) :: cpak real(DP), intent(inout) :: dpak - ! -- local ! -- formats character(len=*), parameter :: fmtmvrcnvg = & "(/,1x,'MOVER PACKAGE REQUIRES AT LEAST TWO OUTER ITERATIONS. CONVERGE & @@ -403,25 +401,22 @@ subroutine mvt_cc(this, kiter, iend, icnvgmod, cpak, dpak) end if end if ! - ! -- return + ! -- Return return end subroutine mvt_cc !> @brief Write mover terms to listing file !< subroutine mvt_bd(this, cnew1, cnew2) - ! -- modules ! -- dummy class(TspMvtType) :: this real(DP), dimension(:), contiguous, intent(in) :: cnew1 real(DP), dimension(:), contiguous, intent(in) :: cnew2 - ! -- local -! ------------------------------------------------------------------------------ ! - ! -- fill the budget object + ! -- Fill the budget object call this%mvt_fill_budobj(cnew1, cnew2) ! - ! -- return + ! -- Return return end subroutine mvt_bd @@ -436,7 +431,6 @@ subroutine mvt_ot_saveflow(this, icbcfl, ibudfl) integer(I4B), intent(in) :: ibudfl ! -- locals integer(I4B) :: ibinun -! ------------------------------------------------------------------------------ ! ! -- Save the mover flows from the budobj to a mover binary file ibinun = 0 @@ -456,13 +450,10 @@ end subroutine mvt_ot_saveflow !> @brief Print mover flow table !< subroutine mvt_ot_printflow(this, icbcfl, ibudfl) - ! -- modules ! -- dummy class(TspMvtType) :: this integer(I4B), intent(in) :: icbcfl integer(I4B), intent(in) :: ibudfl - ! -- locals -! ------------------------------------------------------------------------------ ! ! -- Print the mover flow table if (ibudfl /= 0 .and. this%iprflow /= 0) then @@ -494,28 +485,21 @@ subroutine mvt_ot_bdsummary(this, ibudfl) ! ! -- Accumulate the rates do i = 1, this%maxpackages - do j = 1, this%budobj%nbudterm - do n = 1, this%budobj%budterm(j)%nlist - ! - ! -- provider is inflow to mover + ! -- Provider is inflow to mover if (this%paknames(i) == this%budobj%budterm(j)%text2id1) then ratin(i) = ratin(i) + this%budobj%budterm(j)%flow(n) end if ! - ! -- receiver is outflow from mover + ! -- Receiver is outflow from mover if (this%paknames(i) == this%budobj%budterm(j)%text2id2) then ratout(i) = ratout(i) + this%budobj%budterm(j)%flow(n) end if - end do - end do - end do - ! ! -- Send rates to budget object call this%budget%reset() @@ -554,25 +538,23 @@ subroutine mvt_da(this) use MemoryManagerModule, only: mem_deallocate ! -- dummy class(TspMvtType) :: this - ! -- local -! ------------------------------------------------------------------------------ ! ! -- Deallocate arrays if package was active if (this%inunit > 0) then ! - ! -- character array + ! -- Character array deallocate (this%paknames) ! - ! -- budget object + ! -- Budget object call this%budget%budget_da() deallocate (this%budget) ! - ! -- budobj + ! -- Budobj call this%budobj%budgetobject_da() deallocate (this%budobj) nullify (this%budobj) ! - ! -- output table object + ! -- Output table object if (associated(this%outputtab)) then call this%outputtab%table_da() deallocate (this%outputtab) @@ -588,7 +570,7 @@ subroutine mvt_da(this) call mem_deallocate(this%ibudgetout) call mem_deallocate(this%ibudcsv) ! - ! -- deallocate scalars in NumericalPackageType + ! -- Deallocate scalars in NumericalPackageType call this%NumericalPackageType%da() ! ! -- Return @@ -604,10 +586,8 @@ subroutine allocate_scalars(this) use MemoryManagerModule, only: mem_allocate, mem_setptr ! -- dummy class(TspMvtType) :: this - ! -- local -! ------------------------------------------------------------------------------ ! - ! -- allocate scalars in NumericalPackageType + ! -- Allocate scalars in NumericalPackageType call this%NumericalPackageType%allocate_scalars() ! ! -- Allocate @@ -637,18 +617,18 @@ subroutine read_options(this) character(len=MAXCHARLEN) :: fname integer(I4B) :: ierr logical :: isfound, endOfBlock + ! -- formats character(len=*), parameter :: fmtflow = & "(4x, a, 1x, a, 1x, ' WILL BE SAVED TO FILE: ', a, & &/4x, 'OPENED ON UNIT: ', I0)" character(len=*), parameter :: fmtflow2 = & &"(4x, 'FLOWS WILL BE SAVED TO BUDGET FILE')" -! ------------------------------------------------------------------------------ ! - ! -- get options block + ! -- Get options block call this%parser%GetBlock('OPTIONS', isfound, ierr, blockRequired=.false., & supportOpenClose=.true.) ! - ! -- parse options block if detected + ! -- Parse options block if detected if (isfound) then write (this%iout, '(1x,a)') 'PROCESSING MVT OPTIONS' do @@ -702,7 +682,7 @@ subroutine read_options(this) write (this%iout, '(1x,a)') 'END OF MVT OPTIONS' end if ! - ! -- return + ! -- Return return end subroutine read_options @@ -722,15 +702,18 @@ subroutine mvt_setup_budobj(this) character(len=LENMODELNAME) :: modelname1, modelname2 character(len=LENPACKAGENAME) :: packagename1, packagename2 character(len=LENBUDTXT) :: text -! ------------------------------------------------------------------------------ ! ! -- Assign terms to set up the mover budget object nbudterm = this%mvrbudobj%nbudterm ncv = 0 - text = ' MVT-FLOW' naux = 0 + if (this%depvartype == 'CONCENTRATION') then + text = ' MVT-FLOW' + else + text = ' MVE-FLOW' + end if ! - ! -- set up budobj + ! -- Set up budobj call this%budobj%budgetobject_df(ncv, nbudterm, 0, 0, bddim_opt='M') ! ! -- Go through the water mover budget terms and set up the transport @@ -757,7 +740,6 @@ end subroutine mvt_setup_budobj !> @brief Copy mover-for-transport flow terms into this%budobj !< subroutine mvt_fill_budobj(this, cnew1, cnew2) - ! -- modules ! -- dummy class(TspMvtType) :: this real(DP), intent(in), dimension(:), contiguous, target :: cnew1 @@ -777,8 +759,6 @@ subroutine mvt_fill_budobj(this, cnew1, cnew2) real(DP) :: cp real(DP) :: q real(DP) :: rate - ! -- formats -! ----------------------------------------------------------------------------- ! ! -- Go through the water mover budget terms and set up the transport ! mover budget terms @@ -813,7 +793,7 @@ subroutine mvt_fill_budobj(this, cnew1, cnew2) rate = -q * cp * this%eqnsclfac end if ! - ! -- add the rate to the budterm + ! -- Add the rate to the budterm call this%budobj%budterm(i)%update_term(n1, n2, rate) end do end do @@ -821,7 +801,7 @@ subroutine mvt_fill_budobj(this, cnew1, cnew2) ! --Terms are filled, now accumulate them for this time step call this%budobj%accumulate_terms() ! - ! -- return + ! -- Return return end subroutine mvt_fill_budobj @@ -848,13 +828,13 @@ subroutine mvt_scan_mvrbudobj(this) end do this%maxpackages = maxpackages ! - ! -- allocate paknames + ! -- Allocate paknames allocate (this%paknames(this%maxpackages)) do i = 1, this%maxpackages this%paknames(i) = '' end do ! - ! -- scan through mvrbudobj and create unique paknames + ! -- Scan through mvrbudobj and create unique paknames ipos = 1 do i = 1, nbudterm found = .false. @@ -886,14 +866,14 @@ subroutine mvt_setup_outputtab(this) integer(I4B) :: maxrow integer(I4B) :: ilen ! - ! -- allocate and initialize the output table + ! -- Allocate and initialize the output table if (this%iprflow /= 0) then ! - ! -- dimension table + ! -- Dimension table ntabcol = 7 maxrow = 0 ! - ! -- initialize the output table object + ! -- Initialize the output table object title = 'TRANSPORT MOVER PACKAGE ('//trim(this%packName)// & ') FLOW RATES' call table_cr(this%outputtab, this%packName, title) @@ -915,10 +895,10 @@ subroutine mvt_setup_outputtab(this) call this%outputtab%initialize_column(text, ilen) text = 'RECEIVER ID' call this%outputtab%initialize_column(text, 10) - + ! end if ! - ! -- return + ! -- Return return end subroutine mvt_setup_outputtab @@ -937,16 +917,15 @@ subroutine mvt_print_outputtab(this) integer(I4B) :: inum integer(I4B) :: ntabrows integer(I4B) :: nlist -! ------------------------------------------------------------------------------ ! - ! -- determine number of table rows + ! -- Determine number of table rows ntabrows = 0 do i = 1, this%budobj%nbudterm nlist = this%budobj%budterm(i)%nlist ntabrows = ntabrows + nlist end do ! - ! -- set table kstp and kper + ! -- Set table kstp and kper call this%outputtab%set_kstpkper(kstp, kper) ! ! -- Add terms and print the table @@ -975,7 +954,7 @@ subroutine mvt_print_outputtab(this) end do end do ! - ! -- return + ! -- Return return end subroutine mvt_print_outputtab diff --git a/src/Model/TransportModel/tsp.f90 b/src/Model/TransportModel/tsp.f90 index e40f3abc0ba..18a2bc20c1e 100644 --- a/src/Model/TransportModel/tsp.f90 +++ b/src/Model/TransportModel/tsp.f90 @@ -791,7 +791,7 @@ subroutine create_tsp_packages(this, indis) mempathic = mempath case ('FMI6') this%infmi = inunit - case ('MVT6') + case ('MVT6', 'MVE6') this%inmvt = inunit case ('ADV6') this%inadv = inunit @@ -816,7 +816,7 @@ subroutine create_tsp_packages(this, indis) call ssm_cr(this%ssm, this%name, this%inssm, this%iout, this%fmi, & this%eqnsclfac, this%depvartype) call mvt_cr(this%mvt, this%name, this%inmvt, this%iout, this%fmi, & - this%eqnsclfac) + this%eqnsclfac, this%depvartype) call oc_cr(this%oc, this%name, this%inoc, this%iout) call tsp_obs_cr(this%obs, this%inobs) ! diff --git a/src/Utilities/BudgetObject.f90 b/src/Utilities/BudgetObject.f90 index 0e60fd605a6..c0f935fa9ce 100644 --- a/src/Utilities/BudgetObject.f90 +++ b/src/Utilities/BudgetObject.f90 @@ -123,7 +123,7 @@ subroutine budgetobject_df(this, ncv, nbudterm, iflowja, nsto, & character(len=16) :: labeltitle character(len=20) :: bdzone ! - ! -- set values + ! -- Set values this%ncv = ncv this%nbudterm = nbudterm this%iflowja = iflowja @@ -288,7 +288,7 @@ subroutine accumulate_terms(this) use TdisModule, only: delt ! -- dummy class(BudgetObjectType) :: this - ! -- dummy + ! -- local character(len=LENBUDTXT) :: flowtype integer(I4B) :: i real(DP) :: ratin, ratout @@ -526,7 +526,6 @@ subroutine read_flows(this, dis, ibinun) real(DP) :: delt real(DP) :: pertim real(DP) :: totim - ! -- dummy integer(I4B) :: i ! ! -- Read flows for each budget term @@ -544,7 +543,7 @@ end subroutine read_flows subroutine budgetobject_da(this) ! -- dummy class(BudgetObjectType) :: this - ! -- dummy + ! -- local integer(I4B) :: i ! ! -- Save flows for each budget term @@ -658,8 +657,9 @@ subroutine bfr_advance(this, dis, iout) class(BudgetObjectType) :: this class(DisBaseType), intent(in) :: dis integer(I4B), intent(in) :: iout - ! -- dummy + ! -- local logical :: readnext + ! -- formats character(len=*), parameter :: fmtkstpkper = & &"(1x,/1x, a, ' READING BUDGET TERMS FOR KSTP ', i0, ' KPER ', i0)" character(len=*), parameter :: fmtbudkstpkper = & @@ -708,7 +708,7 @@ subroutine fill_from_bfr(this, dis, iout) class(BudgetObjectType) :: this class(DisBaseType), intent(in) :: dis integer(I4B), intent(in) :: iout - ! -- dummy + ! -- local integer(I4B) :: i logical :: success ! From be7bca59a8be5b26e08bd8c86dcb7d87b8df33a4 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Mon, 22 Apr 2024 20:37:28 -0500 Subject: [PATCH 124/199] refactor(gwf-sfr): refactor sfr for kinematic wave option (#1755) * function to adjust runoff and evaporation based on inflow --- .codespell.ignore | 18 +- src/Model/GroundWaterFlow/gwf-sfr.f90 | 750 ++++++++++++++------------ 2 files changed, 418 insertions(+), 350 deletions(-) diff --git a/.codespell.ignore b/.codespell.ignore index d82203c1c3b..0ce09cf8f38 100644 --- a/.codespell.ignore +++ b/.codespell.ignore @@ -1,33 +1,17 @@ -Alph alph -WEL wel -NAM nam -GAGE gage -Gage -DROB drob -DELT delt -LKE lke -IST ist inout -INOUT -strng -OT ot -initialX initialx -initialY initialy -initialZ initialz iterm -htmp dum blak thck @@ -35,3 +19,5 @@ shft lsat numer thi +strng +htmp diff --git a/src/Model/GroundWaterFlow/gwf-sfr.f90 b/src/Model/GroundWaterFlow/gwf-sfr.f90 index 90190eb2758..b8333475b26 100644 --- a/src/Model/GroundWaterFlow/gwf-sfr.f90 +++ b/src/Model/GroundWaterFlow/gwf-sfr.f90 @@ -182,7 +182,10 @@ module SfrModule ! -- private procedures procedure, private :: sfr_set_stressperiod procedure, private :: sfr_solve + procedure, private :: sfr_calc_constant + procedure, private :: sfr_calc_steady procedure, private :: sfr_update_flows + procedure, private :: sfr_adjust_ro_ev procedure, private :: sfr_calc_qgwf procedure, private :: sfr_gwf_conn procedure, private :: sfr_calc_cond @@ -3141,19 +3144,19 @@ subroutine sfr_process_obsID(obsrv, dis, inunitobs, iout) integer(I4B) :: icol integer(I4B) :: istart integer(I4B) :: istop - character(len=LINELENGTH) :: strng + character(len=LINELENGTH) :: string character(len=LENBOUNDNAME) :: bndname ! ! -- initialize local variables - strng = obsrv%IDstring + string = obsrv%IDstring ! - ! -- Extract reach number from strng and store it. + ! -- Extract reach number from string and store it. ! If 1st item is not an integer(I4B), it should be a ! boundary name--deal with it. icol = 1 ! ! -- get reach number or boundary name - call extract_idnum_or_bndname(strng, icol, istart, istop, nn1, bndname) + call extract_idnum_or_bndname(string, icol, istart, istop, nn1, bndname) if (nn1 == NAMEDBOUNDFLAG) then obsrv%FeatureName = bndname end if @@ -3386,12 +3389,6 @@ subroutine sfr_solve(this, n, h, hcof, rhs, update) integer(I4B) :: i integer(I4B) :: ii integer(I4B) :: n2 - integer(I4B) :: isolve - integer(I4B) :: iic - integer(I4B) :: iic2 - integer(I4B) :: iic3 - integer(I4B) :: iic4 - integer(I4B) :: ibflg real(DP) :: hgwf real(DP) :: sa real(DP) :: sa_wet @@ -3400,39 +3397,14 @@ subroutine sfr_solve(this, n, h, hcof, rhs, update) real(DP) :: qr real(DP) :: qe real(DP) :: qro - real(DP) :: qmp real(DP) :: qsrc real(DP) :: qfrommvr real(DP) :: qgwf - real(DP) :: qmpsrc - real(DP) :: qc - real(DP) :: qt real(DP) :: tp real(DP) :: bt real(DP) :: hsfr real(DP) :: qd - real(DP) :: en1 - real(DP) :: en2 - real(DP) :: qen1 - real(DP) :: f1, f2 - real(DP) :: qgwf1 - real(DP) :: qgwf2 - real(DP) :: qgwfp - real(DP) :: qgwfold - real(DP) :: fhstr1 - real(DP) :: fhstr2 real(DP) :: d1 - real(DP) :: d2 - real(DP) :: dpp - real(DP) :: dx - real(DP) :: q1 - real(DP) :: q2 - real(DP) :: derv - real(DP) :: dlh - real(DP) :: dlhold - real(DP) :: fp - real(DP) :: err - real(DP) :: errold real(DP) :: sumleak real(DP) :: sumrch real(DP) :: gwfhcof @@ -3460,15 +3432,11 @@ subroutine sfr_solve(this, n, h, hcof, rhs, update) else hgwf = h d1 = DZERO - d2 = DZERO - q1 = DZERO - q2 = DZERO qsrc = DZERO qgwf = DZERO - qgwfold = DZERO - ! - ! -- calculate initial depth assuming a wide cross-section and ignore - ! groundwater leakage + + ! -- calculate initial depth assuming a wide cross-section and + ! ignore groundwater leakage ! -- calculate upstream flow qu = DZERO do i = this%ia(n) + 1, this%ia(n + 1) - 1 @@ -3481,6 +3449,7 @@ subroutine sfr_solve(this, n, h, hcof, rhs, update) end do end do this%usflow(n) = qu + ! -- calculate remaining terms sa = this%calc_surface_area(n) sa_wet = this%calc_surface_area_wet(n, this%depth(n)) @@ -3488,285 +3457,46 @@ subroutine sfr_solve(this, n, h, hcof, rhs, update) qr = this%rain(n) * sa qe = this%evap(n) * sa_wet qro = this%runoff(n) - ! + ! -- Water mover term; assume that it goes in at the upstream end of the reach qfrommvr = DZERO if (this%imover == 1) then qfrommvr = this%pakmvrobj%get_qfrommvr(n) end if - ! - ! -- calculate sum of sources to the reach excluding groundwater leakage - qc = qu + qi + qr - qe + qro + qfrommvr - ! + + ! -- calculate downstream flow ignoring groundwater leakage + qsrc = qu + qi + qr - qe + qro + qfrommvr + ! -- adjust runoff or evaporation if sum of sources is negative - if (qc < DZERO) then - ! - ! -- calculate sources without et - qt = qu + qi + qr + qro + qfrommvr - ! - ! -- runoff exceeds sources of water for reach - if (qt < DZERO) then - qro = -(qu + qi + qr + qfrommvr) - qe = DZERO - ! - ! -- evaporation exceeds sources of water for reach - else - qe = qu + qi + qr + qro + qfrommvr - end if - qc = qu + qi + qr - qe + qro + qfrommvr - end if - ! + call this%sfr_adjust_ro_ev(qsrc, qu, qi, qr, qro, qe, qfrommvr) + ! -- set simulated evaporation and runoff this%simevap(n) = qe this%simrunoff(n) = qro - ! - ! -- calculate flow at the middle of the reach and excluding groundwater leakage - qmp = qu + qi + qfrommvr + DHALF * (qr - qe + qro) - qmpsrc = qmp - ! - ! -- calculate stream depth at the midpoint - if (this%iboundpak(n) > 0) then - call this%sfr_calc_reach_depth(n, qmp, d1) + + ! -- calculate reach flow using appropriate method + if (this%iboundpak(n) < 0) then + call this%sfr_calc_constant(n, d1, hgwf, qgwf, qd) else - this%stage(n) = this%sstage(n) - d1 = max(DZERO, this%stage(n) - this%strtop(n)) + call this%sfr_calc_steady(n, d1, hgwf, qu, qi, & + qfrommvr, qr, qe, qro, & + qgwf, qd) end if - ! - ! -- calculate sources/sinks for reach excluding groundwater leakage - call this%sfr_calc_qsource(n, d1, qsrc) - ! - ! -- calculate initial reach stage, downstream flow, and groundwater leakage - tp = this%strtop(n) - bt = tp - this%bthick(n) - hsfr = d1 + tp - qd = MAX(qsrc, DZERO) - qgwf = DZERO - ! - ! -- set flag to skip iterations - isolve = 1 - if (hsfr <= tp .and. hgwf <= tp) isolve = 0 - if (hgwf <= tp .and. qc < DEM30) isolve = 0 - if (this%sfr_gwf_conn(n) == 0) isolve = 0 - if (this%iboundpak(n) < 0) isolve = 0 - ! - ! -- iterate to achieve solution - itersol: if (isolve /= 0) then - ! - ! -- estimate initial end points - en1 = DZERO - if (d1 > DEM30) then - if ((tp - hgwf) > DEM30) then - en2 = DP9 * d1 - else - en2 = D1P1 * d1 - (tp - hgwf) - end if - else if ((tp - hgwf) > DEM30) then - en2 = DONE - else - en2 = DP99 * (hgwf - tp) - end if - ! - ! -- estimate flow at end points - ! -- end point 1 - if (hgwf > tp) then - call this%sfr_calc_qgwf(n, DZERO, hgwf, qgwf1) - qgwf1 = -qgwf1 - qen1 = qmp - DHALF * qgwf1 - else - qgwf1 = DZERO - qen1 = qmpsrc - end if - if (hgwf > bt) then - call this%sfr_calc_qgwf(n, en2, hgwf, qgwf2) - qgwf2 = -qgwf2 - else - call this%sfr_calc_qgwf(n, en2, bt, qgwf2) - qgwf2 = -qgwf2 - end if - if (qgwf2 > qsrc) qgwf2 = qsrc - ! -- calculate two depths - call this%sfr_calc_reach_depth(n, (qmpsrc - DHALF * qgwf1), d1) - call this%sfr_calc_reach_depth(n, (qmpsrc - DHALF * qgwf2), d2) - ! -- determine roots - if (d1 > DEM30) then - f1 = en1 - d1 - else - en1 = DZERO - f1 = en1 - DZERO - end if - if (d2 > DEM30) then - f2 = en2 - d2 - if (f2 < DEM30) en2 = d2 - else - d2 = DZERO - f2 = en2 - DZERO - end if - ! - ! -- iterate to find a solution - dpp = DHALF * (en1 + en2) - dx = dpp - iic = 0 - iic2 = 0 - iic3 = 0 - fhstr1 = DZERO - fhstr2 = DZERO - qgwfp = DZERO - dlhold = DZERO - do i = 1, this%maxsfrit - ibflg = 0 - d1 = dpp - d2 = d1 + DTWO * this%deps - ! -- calculate q at midpoint at both end points - call this%sfr_calc_qman(n, d1, q1) - call this%sfr_calc_qman(n, d2, q2) - ! -- calculate groundwater leakage at both end points - call this%sfr_calc_qgwf(n, d1, hgwf, qgwf1) - qgwf1 = -qgwf1 - call this%sfr_calc_qgwf(n, d2, hgwf, qgwf2) - qgwf2 = -qgwf2 - ! - if (qgwf1 >= qsrc) then - en2 = dpp - dpp = DHALF * (en1 + en2) - call this%sfr_calc_qgwf(n, dpp, hgwf, qgwfp) - qgwfp = -qgwfp - if (qgwfp > qsrc) qgwfp = qsrc - call this%sfr_calc_reach_depth(n, (qmpsrc - DHALF * qgwfp), dx) - ibflg = 1 - else - fhstr1 = (qmpsrc - DHALF * qgwf1) - q1 - fhstr2 = (qmpsrc - DHALF * qgwf2) - q2 - end if - ! - if (ibflg == 0) then - derv = DZERO - if (abs(d1 - d2) > DZERO) then - derv = (fhstr1 - fhstr2) / (d1 - d2) - end if - if (abs(derv) > DEM30) then - dlh = -fhstr1 / derv - else - dlh = DZERO - end if - dpp = d1 + dlh - ! - ! -- updated depth outside of endpoints - use bisection instead - if ((dpp >= en2) .or. (dpp <= en1)) then - if (abs(dlh) > abs(dlhold) .or. dpp < DEM30) then - ibflg = 1 - dpp = DHALF * (en1 + en2) - end if - end if - ! - ! -- check for slow convergence - ! -- set flags to determine if the Newton-Raphson method oscillates - ! or if convergence is slow - if (qgwf1 * qgwfold < DEM30) then - iic2 = iic2 + 1 - else - iic2 = 0 - end if - if (qgwf1 < DEM30) then - iic3 = iic3 + 1 - else - iic3 = 0 - end if - if (dlh * dlhold < DEM30 .or. ABS(dlh) > ABS(dlhold)) then - iic = iic + 1 - end if - iic4 = 0 - if (iic3 > 7 .and. iic > 12) then - iic4 = 1 - end if - ! - ! -- switch to bisection when the Newton-Raphson method oscillates - ! or when convergence is slow - if (iic2 > 7 .or. iic > 12 .or. iic4 == 1) then - ibflg = 1 - dpp = DHALF * (en1 + en2) - end if - ! - ! -- Calculate perturbed gwf flow - call this%sfr_calc_qgwf(n, dpp, hgwf, qgwfp) - qgwfp = -qgwfp - if (qgwfp > qsrc) then - qgwfp = qsrc - if (abs(en1 - en2) < this%dmaxchg * DEM6) then - call this%sfr_calc_reach_depth(n, (qmpsrc - DHALF * qgwfp), dpp) - end if - end if - call this%sfr_calc_reach_depth(n, (qmpsrc - DHALF * qgwfp), dx) - end if - ! - ! -- bisection to update end points - fp = dpp - dx - if (ibflg == 1) then - dlh = fp - ! -- change end points - ! -- root is between f1 and fp - if (f1 * fp < DZERO) then - en2 = dpp - f2 = fp - ! -- root is between fp and f2 - else - en1 = dpp - f1 = fp - end if - err = min(abs(fp), abs(en2 - en1)) - else - err = abs(dlh) - end if - ! - ! -- check for convergence and exit if converged - if (err < this%dmaxchg) then - d1 = dpp - qgwf = qgwfp - qd = qsrc - qgwf - exit - end if - ! - ! -- save iterates - errold = err - dlhold = dlh - if (ibflg == 1) then - qgwfold = qgwfp - else - qgwfold = qgwf1 - end if - ! - ! -- end of iteration - end do - end if itersol - ! -- simple routing option or where depth = 0 and hgwf < bt - if (isolve == 0) then - call this%sfr_calc_qgwf(n, d1, hgwf, qgwf) - qgwf = -qgwf - ! - ! -- leakage exceeds inflow - if (qgwf > qsrc) then - d1 = DZERO - call this%sfr_calc_qsource(n, d1, qsrc) - qgwf = qsrc - end if - ! -- set qd - qd = qsrc - qgwf - end if - ! ! -- update sfr stage + tp = this%strtop(n) + bt = tp - this%bthick(n) hsfr = tp + d1 - ! + ! -- update stored values if (lupdate) then - ! ! -- save depth and calculate stage this%depth(n) = d1 this%stage(n) = hsfr - ! ! -- update flows call this%sfr_update_flows(n, qd, qgwf) end if - ! + ! -- calculate sumleak and sumrch sumleak = DZERO sumrch = DZERO @@ -3778,17 +3508,16 @@ subroutine sfr_solve(this, n, h, hcof, rhs, update) if (hgwf < bt) then sumrch = qgwf end if - ! + ! -- make final qgwf calculation and obtain ! gwfhcof and gwfrhs values call this%sfr_calc_qgwf(n, d1, hgwf, qgwf, gwfhcof, gwfrhs) - ! - ! + + ! -- update hcof and rhs terms if (abs(sumleak) > DZERO) then ! -- stream leakage is not head dependent if (hgwf < bt) then rhs = rhs - sumrch - ! ! -- stream leakage is head dependent else if ((sumleak - qsrc) < -DEM30) then if (this%gwfiss == 0) then @@ -3797,7 +3526,6 @@ subroutine sfr_solve(this, n, h, hcof, rhs, update) rhs = rhs + gwfrhs end if hcof = gwfhcof - ! ! -- place holder for UZF else if (this%gwfiss == 0) then @@ -3806,15 +3534,12 @@ subroutine sfr_solve(this, n, h, hcof, rhs, update) rhs = rhs - sumleak end if end if - ! + ! -- add groundwater leakage else if (hgwf < bt) then rhs = rhs - sumrch end if end if - ! - ! -- return - return end subroutine sfr_solve !> @brief Update flow terms @@ -3891,6 +3616,48 @@ subroutine sfr_update_flows(this, n, qd, qgwf) return end subroutine sfr_update_flows + !> @brief Adjust runoff and evaporation + !! + !! Method to adjust runoff and evaporation for a SFR package reach + !! based on the total reach flow. + !! + !< + subroutine sfr_adjust_ro_ev(this, qc, qu, qi, qr, qro, qe, qfrommvr) + ! -- dummy variables + class(SfrType) :: this !< SfrType object + real(DP), intent(inout) :: qc !< total reach volumetric flow + real(DP), intent(in) :: qu !< upstream reach volumetric flow + real(DP), intent(in) :: qi !< reach volumetric inflow + real(DP), intent(in) :: qr !< reach volumetric rainfall + real(DP), intent(inout) :: qro !< reach volumetric runoff + real(DP), intent(inout) :: qe !< reach volumetric evaporation + real(DP), intent(in) :: qfrommvr !< reach volumetric flow from mover + ! -- local variables + real(DP) :: qt + ! + ! -- adjust runoff or evaporation if sum of sources is negative + if (qc < DZERO) then + ! + ! -- calculate sources without evaporation + qt = qu + qi + qr + qro + qfrommvr + ! + ! -- runoff exceeds sources of water for reach + if (qt < DZERO) then + if (qro < DZERO) then + qro = -(qu + qi + qr + qfrommvr) + qe = DZERO + end if + ! + ! -- evaporation exceeds sources of water for reach + else + if (qe > DZERO) then + qe = qu + qi + qr + qro + qfrommvr + end if + end if + qc = qu + qi + qr - qe + qro + qfrommvr + end if + end subroutine sfr_adjust_ro_ev + !> @brief Calculate downstream flow term !! !! Method to calculate downstream flow for a SFR package reach. @@ -3946,7 +3713,6 @@ subroutine sfr_calc_qsource(this, n, depth, qsrc) real(DP) :: qe real(DP) :: qro real(DP) :: qfrommvr - real(DP) :: qt real(DP) :: a real(DP) :: ae ! @@ -3974,22 +3740,7 @@ subroutine sfr_calc_qsource(this, n, depth, qsrc) qsrc = qu + qi + qr - qe + qro + qfrommvr ! ! -- adjust runoff or evaporation if sum of sources is negative - if (qsrc < DZERO) then - ! - ! -- calculate sources without et - qt = qu + qi + qr + qro + qfrommvr - ! - ! -- runoff exceeds sources of water for reach - if (qt < DZERO) then - qro = -(qu + qi + qr + qfrommvr) - qe = DZERO - ! - ! -- evaporation exceeds sources of water for reach - else - qe = qu + qi + qr + qro + qfrommvr - end if - qsrc = qu + qi + qr - qe + qro + qfrommvr - end if + call this%sfr_adjust_ro_ev(qsrc, qu, qi, qr, qro, qe, qfrommvr) ! ! -- return return @@ -4089,7 +3840,7 @@ subroutine sfr_calc_qgwf(this, n, depth, hgwf, qgwf, gwfhcof, gwfrhs) real(DP) :: tp real(DP) :: bt real(DP) :: hsfr - real(DP) :: htmp + real(DP) :: h_temp real(DP) :: cond real(DP) :: sat real(DP) :: derv @@ -4113,16 +3864,16 @@ subroutine sfr_calc_qgwf(this, n, depth, hgwf, qgwf, gwfhcof, gwfrhs) tp = this%strtop(n) bt = tp - this%bthick(n) hsfr = tp + depth - htmp = hgwf - if (htmp < bt) then - htmp = bt + h_temp = hgwf + if (h_temp < bt) then + h_temp = bt end if ! ! -- calculate conductance - call this%sfr_calc_cond(n, depth, cond, hsfr, htmp) + call this%sfr_calc_cond(n, depth, cond, hsfr, h_temp) ! ! -- calculate groundwater leakage - qgwf = sat * cond * (htmp - hsfr) + qgwf = sat * cond * (h_temp - hsfr) gwfrhs0 = -sat * cond * hsfr gwfhcof0 = -sat * cond ! @@ -4167,14 +3918,14 @@ end function sfr_gwf_conn !! Method to calculate the reach-aquifer conductance for a SFR package reach. !! !< - subroutine sfr_calc_cond(this, n, depth, cond, hsfr, htmp) + subroutine sfr_calc_cond(this, n, depth, cond, hsfr, h_temp) ! -- dummy variables class(SfrType) :: this !< SfrType object integer(I4B), intent(in) :: n !< reach number real(DP), intent(in) :: depth !< reach depth real(DP), intent(inout) :: cond !< reach-aquifer conductance real(DP), intent(in), optional :: hsfr !< stream stage - real(DP), intent(in), optional :: htmp !< head in gw cell + real(DP), intent(in), optional :: h_temp !< head in gw cell ! -- local variables integer(I4B) :: node real(DP) :: wp @@ -4194,7 +3945,7 @@ subroutine sfr_calc_cond(this, n, depth, cond, hsfr, htmp) ! ! -- direction of gradient across streambed determines which vsc ratio if (this%ivsc == 1) then - if (hsfr > htmp) then + if (hsfr > h_temp) then ! strm stg > gw head vscratio = this%viscratios(1, n) else @@ -4210,6 +3961,337 @@ subroutine sfr_calc_cond(this, n, depth, cond, hsfr, htmp) return end subroutine sfr_calc_cond + subroutine sfr_calc_constant(this, n, d1, hgwf, qgwf, qd) + ! -- dummy variables + class(SfrType) :: this !< SfrType object + integer(I4B), intent(in) :: n !< reach number + real(DP), intent(inout) :: d1 !< current reach depth estimate + real(DP), intent(in) :: hgwf !< head in gw cell + real(DP), intent(inout) :: qgwf !< reach-aquifer exchange + real(DP), intent(inout) :: qd !< reach outflow + ! -- local variables + real(DP) :: qsrc + + this%stage(n) = this%sstage(n) + d1 = max(DZERO, this%stage(n) - this%strtop(n)) + + call this%sfr_calc_qsource(n, d1, qsrc) + + if (this%sfr_gwf_conn(n) == 1) then + call this%sfr_calc_qgwf(n, d1, hgwf, qgwf) + qgwf = -qgwf + else + qgwf = DZERO + end if + + ! -- leakage exceeds inflow + if (qgwf > qsrc) then + d1 = DZERO + call this%sfr_calc_qsource(n, d1, qsrc) + qgwf = qsrc + end if + + ! -- set qd + qd = qsrc - qgwf + + end subroutine sfr_calc_constant + + subroutine sfr_calc_steady(this, n, d1, hgwf, & + qu, qi, qfrommvr, qr, qe, qro, & + qgwf, qd) + ! -- dummy variables + class(SfrType) :: this !< SfrType object + integer(I4B), intent(in) :: n !< reach number + real(DP), intent(inout) :: d1 !< current reach depth estimate + real(DP), intent(in) :: hgwf !< head in gw cell + real(DP), intent(in) :: qu !< reach upstream flow + real(DP), intent(in) :: qi !< reach specified inflow + real(DP), intent(in) :: qfrommvr !< reach flow from mover + real(DP), intent(in) :: qr !< reach rainfall + real(DP), intent(in) :: qe !< reach evaporation + real(DP), intent(in) :: qro !< reach runoff flow + real(DP), intent(inout) :: qgwf !< reach-aquifer exchange + real(DP), intent(inout) :: qd !< reach outflow + ! -- local variables + integer(I4B) :: i + integer(I4B) :: isolve + integer(I4B) :: iic + integer(I4B) :: iic2 + integer(I4B) :: iic3 + integer(I4B) :: iic4 + integer(I4B) :: ibflg + real(DP) :: qmp + real(DP) :: qsrc + real(DP) :: qsrcmp + real(DP) :: tp + real(DP) :: bt + real(DP) :: hsfr + real(DP) :: qc + real(DP) :: en1 + real(DP) :: en2 + real(DP) :: qen1 + real(DP) :: f1 + real(DP) :: f2 + real(DP) :: qgwf1 + real(DP) :: qgwf2 + real(DP) :: qgwfp + real(DP) :: qgwfold + real(DP) :: fhstr1 + real(DP) :: fhstr2 + real(DP) :: d2 + real(DP) :: dpp + real(DP) :: dx + real(DP) :: q1 + real(DP) :: q2 + real(DP) :: derv + real(DP) :: dlh + real(DP) :: dlhold + real(DP) :: fp + real(DP) :: err + real(DP) :: errold + ! + ! -- initialize local variables + d2 = DZERO + q1 = DZERO + q2 = DZERO + qsrc = DZERO + qgwf = DZERO + qgwfold = DZERO + ! + ! -- calculate the flow at end of the reach + ! excluding groundwater leakage + qc = qu + qi + qr - qe + qro + qfrommvr + ! + ! -- calculate flow at the middle of the reach + ! excluding groundwater leakage + qsrcmp = qu + qi + qfrommvr + DHALF * (qr - qe + qro) + qmp = qsrcmp ! initial estimate flow at the midpoint + ! + ! -- calculate stream depth at the midpoint + call this%sfr_calc_reach_depth(n, qmp, d1) + ! + ! -- calculate sources/sinks for reach + ! excluding groundwater leakage + call this%sfr_calc_qsource(n, d1, qsrc) + ! + ! -- calculate initial reach stage, downstream flow, + ! and groundwater leakage + tp = this%strtop(n) + bt = tp - this%bthick(n) + hsfr = d1 + tp + qd = MAX(qsrc, DZERO) + qgwf = DZERO + ! + ! -- set flag to skip iterations + isolve = 1 + if (hsfr <= tp .and. hgwf <= tp) isolve = 0 + if (hgwf <= tp .and. qc < DEM30) isolve = 0 + if (this%sfr_gwf_conn(n) == 0) isolve = 0 + ! + ! -- iterate to achieve solution + calc_solution: if (isolve /= 0) then + ! + ! -- estimate initial end points + en1 = DZERO + if (d1 > DEM30) then + if ((tp - hgwf) > DEM30) then + en2 = DP9 * d1 + else + en2 = D1P1 * d1 - (tp - hgwf) + end if + else if ((tp - hgwf) > DEM30) then + en2 = DONE + else + en2 = DP99 * (hgwf - tp) + end if + ! + ! -- estimate flow at end points + ! -- end point 1 + if (hgwf > tp) then + call this%sfr_calc_qgwf(n, DZERO, hgwf, qgwf1) + qgwf1 = -qgwf1 + qen1 = qmp - DHALF * qgwf1 + else + qgwf1 = DZERO + qen1 = qsrcmp + end if + if (hgwf > bt) then + call this%sfr_calc_qgwf(n, en2, hgwf, qgwf2) + qgwf2 = -qgwf2 + else + call this%sfr_calc_qgwf(n, en2, bt, qgwf2) + qgwf2 = -qgwf2 + end if + if (qgwf2 > qsrc) qgwf2 = qsrc + ! -- calculate two depths + call this%sfr_calc_reach_depth(n, (qsrcmp - DHALF * qgwf1), d1) + call this%sfr_calc_reach_depth(n, (qsrcmp - DHALF * qgwf2), d2) + ! -- determine roots + if (d1 > DEM30) then + f1 = en1 - d1 + else + en1 = DZERO + f1 = en1 - DZERO + end if + if (d2 > DEM30) then + f2 = en2 - d2 + if (f2 < DEM30) en2 = d2 + else + d2 = DZERO + f2 = en2 - DZERO + end if + ! + ! -- iterate to find a solution + dpp = DHALF * (en1 + en2) + dx = dpp + iic = 0 + iic2 = 0 + iic3 = 0 + fhstr1 = DZERO + fhstr2 = DZERO + qgwfp = DZERO + dlhold = DZERO + do i = 1, this%maxsfrit + ibflg = 0 + d1 = dpp + d2 = d1 + DTWO * this%deps + ! -- calculate q at midpoint at both end points + call this%sfr_calc_qman(n, d1, q1) + call this%sfr_calc_qman(n, d2, q2) + ! -- calculate groundwater leakage at both end points + call this%sfr_calc_qgwf(n, d1, hgwf, qgwf1) + qgwf1 = -qgwf1 + call this%sfr_calc_qgwf(n, d2, hgwf, qgwf2) + qgwf2 = -qgwf2 + ! + if (qgwf1 >= qsrc) then + en2 = dpp + dpp = DHALF * (en1 + en2) + call this%sfr_calc_qgwf(n, dpp, hgwf, qgwfp) + qgwfp = -qgwfp + if (qgwfp > qsrc) qgwfp = qsrc + call this%sfr_calc_reach_depth(n, (qsrcmp - DHALF * qgwfp), dx) + ibflg = 1 + else + fhstr1 = (qsrcmp - DHALF * qgwf1) - q1 + fhstr2 = (qsrcmp - DHALF * qgwf2) - q2 + end if + ! + if (ibflg == 0) then + derv = DZERO + if (abs(d1 - d2) > DZERO) then + derv = (fhstr1 - fhstr2) / (d1 - d2) + end if + if (abs(derv) > DEM30) then + dlh = -fhstr1 / derv + else + dlh = DZERO + end if + dpp = d1 + dlh + ! + ! -- updated depth outside of endpoints - use bisection instead + if ((dpp >= en2) .or. (dpp <= en1)) then + if (abs(dlh) > abs(dlhold) .or. dpp < DEM30) then + ibflg = 1 + dpp = DHALF * (en1 + en2) + end if + end if + ! + ! -- check for slow convergence + ! -- set flags to determine if the Newton-Raphson method oscillates + ! or if convergence is slow + if (qgwf1 * qgwfold < DEM30) then + iic2 = iic2 + 1 + else + iic2 = 0 + end if + if (qgwf1 < DEM30) then + iic3 = iic3 + 1 + else + iic3 = 0 + end if + if (dlh * dlhold < DEM30 .or. ABS(dlh) > ABS(dlhold)) then + iic = iic + 1 + end if + iic4 = 0 + if (iic3 > 7 .and. iic > 12) then + iic4 = 1 + end if + ! + ! -- switch to bisection when the Newton-Raphson method oscillates + ! or when convergence is slow + if (iic2 > 7 .or. iic > 12 .or. iic4 == 1) then + ibflg = 1 + dpp = DHALF * (en1 + en2) + end if + ! + ! -- Calculate perturbed gwf flow + call this%sfr_calc_qgwf(n, dpp, hgwf, qgwfp) + qgwfp = -qgwfp + if (qgwfp > qsrc) then + qgwfp = qsrc + if (abs(en1 - en2) < this%dmaxchg * DEM6) then + call this%sfr_calc_reach_depth(n, (qsrcmp - DHALF * qgwfp), dpp) + end if + end if + call this%sfr_calc_reach_depth(n, (qsrcmp - DHALF * qgwfp), dx) + end if + ! + ! -- bisection to update end points + fp = dpp - dx + if (ibflg == 1) then + dlh = fp + ! -- change end points + ! -- root is between f1 and fp + if (f1 * fp < DZERO) then + en2 = dpp + f2 = fp + ! -- root is between fp and f2 + else + en1 = dpp + f1 = fp + end if + err = min(abs(fp), abs(en2 - en1)) + else + err = abs(dlh) + end if + ! + ! -- check for convergence and exit if converged + if (err < this%dmaxchg) then + d1 = dpp + qgwf = qgwfp + qd = qsrc - qgwf + exit + end if + ! + ! -- save iterates + errold = err + dlhold = dlh + if (ibflg == 1) then + qgwfold = qgwfp + else + qgwfold = qgwf1 + end if + ! + ! -- end of iteration + end do + ! -- depth = 0 and hgwf < bt + else + call this%sfr_calc_qgwf(n, d1, hgwf, qgwf) + qgwf = -qgwf + ! + ! -- leakage exceeds inflow + if (qgwf > qsrc) then + d1 = DZERO + call this%sfr_calc_qsource(n, d1, qsrc) + qgwf = qsrc + end if + ! -- set qd + qd = qsrc - qgwf + end if calc_solution + + end subroutine sfr_calc_steady + !> @brief Calculate diversion flow !! !! Method to calculate the diversion flow for a diversion connected From eb609b782f743eaa964f0d82e5533ca28c4819aa Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Tue, 23 Apr 2024 11:38:30 -0500 Subject: [PATCH 125/199] refactor(codespell): modify codespell ignore words (#1759) * words removed - blak, thck, numer, strng, htmp * added thckstrt --- .codespell.ignore | 6 +-- src/Exchange/exg-gwegwe.f90 | 12 ++--- src/Exchange/exg-gwfgwf.f90 | 12 ++--- src/Exchange/exg-gwtgwt.f90 | 12 ++--- src/Exchange/exg-swfgwf.f90 | 12 ++--- src/Model/GroundWaterFlow/gwf-csub.f90 | 12 ++--- src/Model/GroundWaterFlow/gwf-lak.f90 | 16 +++---- src/Model/GroundWaterFlow/gwf-maw.f90 | 46 ++++++++++---------- src/Model/GroundWaterFlow/gwf-npf.f90 | 10 ++--- src/Model/GroundWaterFlow/gwf-obs.f90 | 20 ++++----- src/Model/GroundWaterFlow/gwf-uzf.f90 | 18 ++++---- src/Model/ParticleTracking/prt-obs.f90 | 20 ++++----- src/Model/SurfaceWaterFlow/swf-dfw.f90 | 6 +-- src/Model/SurfaceWaterFlow/swf-obs.f90 | 20 ++++----- src/Model/TransportModel/tsp-apt.f90 | 18 ++++---- src/Model/TransportModel/tsp-obs.f90 | 20 ++++----- src/Solution/LinearMethods/ImsLinearBase.f90 | 24 +++++----- src/Utilities/Observation/Obs.f90 | 12 ++--- 18 files changed, 146 insertions(+), 150 deletions(-) diff --git a/.codespell.ignore b/.codespell.ignore index 0ce09cf8f38..c0a87d7fc47 100644 --- a/.codespell.ignore +++ b/.codespell.ignore @@ -13,11 +13,7 @@ initialy initialz iterm dum -blak -thck shft lsat -numer thi -strng -htmp +thckstrt diff --git a/src/Exchange/exg-gwegwe.f90 b/src/Exchange/exg-gwegwe.f90 index 6289e7e01ef..3475e240732 100644 --- a/src/Exchange/exg-gwegwe.f90 +++ b/src/Exchange/exg-gwegwe.f90 @@ -1175,19 +1175,19 @@ subroutine gwe_gwe_process_obsID(obsrv, dis, inunitobs, iout) integer(I4B) :: n, iexg, istat integer(I4B) :: icol, istart, istop real(DP) :: r - character(len=LINELENGTH) :: strng + character(len=LINELENGTH) :: string ! - strng = obsrv%IDstring + string = obsrv%IDstring icol = 1 ! -- get exchange index - call urword(strng, icol, istart, istop, 1, n, r, iout, inunitobs) - read (strng(istart:istop), '(i10)', iostat=istat) iexg + call urword(string, icol, istart, istop, 1, n, r, iout, inunitobs) + read (string(istart:istop), '(i10)', iostat=istat) iexg if (istat == 0) then obsrv%intPak1 = iexg else - ! Integer can't be read from strng; it's presumed to be an exchange + ! Integer can't be read from string; it's presumed to be an exchange ! boundary name (already converted to uppercase) - obsrv%FeatureName = trim(adjustl(strng)) + obsrv%FeatureName = trim(adjustl(string)) ! -- Observation may require summing rates from multiple exchange ! boundaries, so assign intPak1 as a value that indicates observation ! is for a named exchange boundary or group of exchange boundaries. diff --git a/src/Exchange/exg-gwfgwf.f90 b/src/Exchange/exg-gwfgwf.f90 index 534df4b0f9d..c2152602ed4 100644 --- a/src/Exchange/exg-gwfgwf.f90 +++ b/src/Exchange/exg-gwfgwf.f90 @@ -2148,19 +2148,19 @@ subroutine gwf_gwf_process_obsID(obsrv, dis, inunitobs, iout) integer(I4B) :: n, iexg, istat integer(I4B) :: icol, istart, istop real(DP) :: r - character(len=LINELENGTH) :: strng + character(len=LINELENGTH) :: string ! - strng = obsrv%IDstring + string = obsrv%IDstring icol = 1 ! -- get exchange index - call urword(strng, icol, istart, istop, 1, n, r, iout, inunitobs) - read (strng(istart:istop), '(i10)', iostat=istat) iexg + call urword(string, icol, istart, istop, 1, n, r, iout, inunitobs) + read (string(istart:istop), '(i10)', iostat=istat) iexg if (istat == 0) then obsrv%intPak1 = iexg else - ! Integer can't be read from strng; it's presumed to be an exchange + ! Integer can't be read from string; it's presumed to be an exchange ! boundary name (already converted to uppercase) - obsrv%FeatureName = trim(adjustl(strng)) + obsrv%FeatureName = trim(adjustl(string)) ! -- Observation may require summing rates from multiple exchange ! boundaries, so assign intPak1 as a value that indicates observation ! is for a named exchange boundary or group of exchange boundaries. diff --git a/src/Exchange/exg-gwtgwt.f90 b/src/Exchange/exg-gwtgwt.f90 index e6559ce6f48..66e5310bb99 100644 --- a/src/Exchange/exg-gwtgwt.f90 +++ b/src/Exchange/exg-gwtgwt.f90 @@ -1172,19 +1172,19 @@ subroutine gwt_gwt_process_obsID(obsrv, dis, inunitobs, iout) integer(I4B) :: n, iexg, istat integer(I4B) :: icol, istart, istop real(DP) :: r - character(len=LINELENGTH) :: strng + character(len=LINELENGTH) :: string ! - strng = obsrv%IDstring + string = obsrv%IDstring icol = 1 ! -- get exchange index - call urword(strng, icol, istart, istop, 1, n, r, iout, inunitobs) - read (strng(istart:istop), '(i10)', iostat=istat) iexg + call urword(string, icol, istart, istop, 1, n, r, iout, inunitobs) + read (string(istart:istop), '(i10)', iostat=istat) iexg if (istat == 0) then obsrv%intPak1 = iexg else - ! Integer can't be read from strng; it's presumed to be an exchange + ! Integer can't be read from string; it's presumed to be an exchange ! boundary name (already converted to uppercase) - obsrv%FeatureName = trim(adjustl(strng)) + obsrv%FeatureName = trim(adjustl(string)) ! -- Observation may require summing rates from multiple exchange ! boundaries, so assign intPak1 as a value that indicates observation ! is for a named exchange boundary or group of exchange boundaries. diff --git a/src/Exchange/exg-swfgwf.f90 b/src/Exchange/exg-swfgwf.f90 index a49650a5884..739356dc6d8 100644 --- a/src/Exchange/exg-swfgwf.f90 +++ b/src/Exchange/exg-swfgwf.f90 @@ -3310,19 +3310,19 @@ end module SwfGwfExchangeModule ! integer(I4B) :: n, iexg, istat ! integer(I4B) :: icol, istart, istop ! real(DP) :: r -! character(len=LINELENGTH) :: strng +! character(len=LINELENGTH) :: string ! ! -! strng = obsrv%IDstring +! string = obsrv%IDstring ! icol = 1 ! ! -- get exchange index -! call urword(strng, icol, istart, istop, 1, n, r, iout, inunitobs) -! read (strng(istart:istop), '(i10)', iostat=istat) iexg +! call urword(string, icol, istart, istop, 1, n, r, iout, inunitobs) +! read (string(istart:istop), '(i10)', iostat=istat) iexg ! if (istat == 0) then ! obsrv%intPak1 = iexg ! else -! ! Integer can't be read from strng; it's presumed to be an exchange +! ! Integer can't be read from string; it's presumed to be an exchange ! ! boundary name (already converted to uppercase) -! obsrv%FeatureName = trim(adjustl(strng)) +! obsrv%FeatureName = trim(adjustl(string)) ! ! -- Observation may require summing rates from multiple exchange ! ! boundaries, so assign intPak1 as a value that indicates observation ! ! is for a named exchange boundary or group of exchange boundaries. diff --git a/src/Model/GroundWaterFlow/gwf-csub.f90 b/src/Model/GroundWaterFlow/gwf-csub.f90 index 7ab26738cbd..f6a56bc07c8 100644 --- a/src/Model/GroundWaterFlow/gwf-csub.f90 +++ b/src/Model/GroundWaterFlow/gwf-csub.f90 @@ -7510,14 +7510,14 @@ subroutine csub_process_obsID(obsrv, dis, inunitobs, iout) integer(I4B) :: nn1 integer(I4B) :: nn2 integer(I4B) :: icol, istart, istop - character(len=LINELENGTH) :: strng + character(len=LINELENGTH) :: string character(len=LENBOUNDNAME) :: bndname logical :: flag_string ! ! -- initialize variables - strng = obsrv%IDstring + string = obsrv%IDstring ! - ! -- Extract reach number from strng and store it. + ! -- Extract reach number from string and store it. ! If 1st item is not an integer(I4B), it should be a ! boundary name--deal with it. icol = 1 @@ -7542,10 +7542,10 @@ subroutine csub_process_obsID(obsrv, dis, inunitobs, iout) obsrv%ObsTypeId == 'DELAY-THETA' .or. & obsrv%ObsTypeId == 'DELAY-FLOWTOP' .or. & obsrv%ObsTypeId == 'DELAY-FLOWBOT') then - call extract_idnum_or_bndname(strng, icol, istart, istop, nn1, bndname) + call extract_idnum_or_bndname(string, icol, istart, istop, nn1, bndname) else nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, strng, flag_string) + iout, string, flag_string) end if if (nn1 == NAMEDBOUNDFLAG) then obsrv%FeatureName = bndname @@ -7557,7 +7557,7 @@ subroutine csub_process_obsID(obsrv, dis, inunitobs, iout) obsrv%ObsTypeId == 'DELAY-COMPACTION' .or. & obsrv%ObsTypeId == 'DELAY-THICKNESS' .or. & obsrv%ObsTypeId == 'DELAY-THETA') then - call extract_idnum_or_bndname(strng, icol, istart, istop, nn2, bndname) + call extract_idnum_or_bndname(string, icol, istart, istop, nn2, bndname) if (nn2 == NAMEDBOUNDFLAG) then obsrv%FeatureName = bndname ! -- reset nn1 diff --git a/src/Model/GroundWaterFlow/gwf-lak.f90 b/src/Model/GroundWaterFlow/gwf-lak.f90 index 964fa016a8d..4185d5765e2 100644 --- a/src/Model/GroundWaterFlow/gwf-lak.f90 +++ b/src/Model/GroundWaterFlow/gwf-lak.f90 @@ -3607,7 +3607,7 @@ subroutine lak_cf(this) ! -- local integer(I4B) :: j, n integer(I4B) :: igwfnode - real(DP) :: hlak, blak + real(DP) :: hlak, bottom_lake ! ! -- save groundwater seepage for lake solution do n = 1, this%nlakes @@ -3665,8 +3665,8 @@ subroutine lak_cf(this) end if ! ! -- Mark ibound for wet lakes or inactive lakes; reset to 1 otherwise - blak = this%belev(j) - if (hlak > blak .or. this%iboundpak(n) == 0) then + bottom_lake = this%belev(j) + if (hlak > bottom_lake .or. this%iboundpak(n) == 0) then this%ibound(igwfnode) = IWETLAKE else this%ibound(igwfnode) = 1 @@ -4998,22 +4998,22 @@ subroutine lak_process_obsID(obsrv, dis, inunitobs, iout) ! -- local integer(I4B) :: nn1, nn2 integer(I4B) :: icol, istart, istop - character(len=LINELENGTH) :: strng + character(len=LINELENGTH) :: string character(len=LENBOUNDNAME) :: bndname ! - strng = obsrv%IDstring - ! -- Extract lake number from strng and store it. + string = obsrv%IDstring + ! -- Extract lake number from string and store it. ! If 1st item is not an integer(I4B), it should be a ! lake name--deal with it. icol = 1 ! -- get lake number or boundary name - call extract_idnum_or_bndname(strng, icol, istart, istop, nn1, bndname) + call extract_idnum_or_bndname(string, icol, istart, istop, nn1, bndname) if (nn1 == NAMEDBOUNDFLAG) then obsrv%FeatureName = bndname else if (obsrv%ObsTypeId == 'LAK' .or. obsrv%ObsTypeId == 'CONDUCTANCE' .or. & obsrv%ObsTypeId == 'WETTED-AREA') then - call extract_idnum_or_bndname(strng, icol, istart, istop, nn2, bndname) + call extract_idnum_or_bndname(string, icol, istart, istop, nn2, bndname) if (len_trim(bndName) < 1 .and. nn2 < 0) then write (errmsg, '(a,1x,a,a,1x,a,1x,a)') & 'For observation type', trim(adjustl(obsrv%ObsTypeId)), & diff --git a/src/Model/GroundWaterFlow/gwf-maw.f90 b/src/Model/GroundWaterFlow/gwf-maw.f90 index 8c5ef200087..af52810a2fe 100644 --- a/src/Model/GroundWaterFlow/gwf-maw.f90 +++ b/src/Model/GroundWaterFlow/gwf-maw.f90 @@ -3358,23 +3358,23 @@ subroutine maw_process_obsID(obsrv, dis, inunitobs, iout) ! -- local integer(I4B) :: nn1, nn2 integer(I4B) :: icol, istart, istop - character(len=LINELENGTH) :: strng + character(len=LINELENGTH) :: string character(len=LENBOUNDNAME) :: bndname ! formats ! - strng = obsrv%IDstring - ! -- Extract multi-aquifer well number from strng and store it. + string = obsrv%IDstring + ! -- Extract multi-aquifer well number from string and store it. ! If 1st item is not an integer(I4B), it should be a ! maw name--deal with it. icol = 1 ! -- get multi-aquifer well number or boundary name - call extract_idnum_or_bndname(strng, icol, istart, istop, nn1, bndname) + call extract_idnum_or_bndname(string, icol, istart, istop, nn1, bndname) if (nn1 == NAMEDBOUNDFLAG) then obsrv%FeatureName = bndname else if (obsrv%ObsTypeId == 'MAW' .or. & obsrv%ObsTypeId == 'CONDUCTANCE') then - call extract_idnum_or_bndname(strng, icol, istart, istop, nn2, bndname) + call extract_idnum_or_bndname(string, icol, istart, istop, nn2, bndname) if (len_trim(bndName) < 1 .and. nn2 < 0) then write (errmsg, '(a,1x,a,a,1x,a,1x,a)') & 'For observation type', trim(adjustl(obsrv%ObsTypeId)), & @@ -3634,7 +3634,7 @@ subroutine maw_calculate_saturation(this, n, j, node, sat) real(DP), intent(inout) :: sat ! -- local integer(I4B) :: jpos - real(DP) :: htmp + real(DP) :: h_temp real(DP) :: hwell real(DP) :: topw real(DP) :: botw @@ -3658,25 +3658,25 @@ subroutine maw_calculate_saturation(this, n, j, node, sat) ! ! -- calculate appropriate saturation if (this%inewton /= 1) then - htmp = this%xnew(node) - if (htmp < botw) then - htmp = botw + h_temp = this%xnew(node) + if (h_temp < botw) then + h_temp = botw end if if (hwell < botw) then hwell = botw end if - htmp = DHALF * (htmp + hwell) + h_temp = DHALF * (h_temp + hwell) else - htmp = this%xnew(node) - if (hwell > htmp) then - htmp = hwell + h_temp = this%xnew(node) + if (hwell > h_temp) then + h_temp = hwell end if - if (htmp < botw) then - htmp = botw + if (h_temp < botw) then + h_temp = botw end if end if ! -- calculate saturation - sat = sQuadraticSaturation(topw, botw, htmp, this%satomega) + sat = sQuadraticSaturation(topw, botw, h_temp, this%satomega) else sat = DONE end if @@ -4031,15 +4031,15 @@ subroutine maw_calculate_qpot(this, n, qnet) real(DP) :: cmaw real(DP) :: hgwf real(DP) :: bmaw - real(DP) :: htmp + real(DP) :: h_temp real(DP) :: hv real(DP) :: vscratio ! -- format ! - ! -- initialize qnet and htmp + ! -- initialize qnet and h_temp qnet = DZERO vscratio = DONE - htmp = this%shutofflevel(n) + h_temp = this%shutofflevel(n) ! ! -- if vsc active, select appropriate viscosity ratio if (this%ivsc == 1) then @@ -4056,21 +4056,21 @@ subroutine maw_calculate_qpot(this, n, qnet) if (this%fwcond(n) > DZERO) then bt = this%fwelev(n) tp = bt + this%fwrlen(n) - scale = sQSaturation(tp, bt, htmp) + scale = sQSaturation(tp, bt, h_temp) cfw = scale * this%fwcond(n) * this%viscratios(2, n) this%ifwdischarge(n) = 0 if (cfw > DZERO) then this%ifwdischarge(n) = 1 this%xsto(n) = bt end if - qnet = qnet + cfw * (bt - htmp) + qnet = qnet + cfw * (bt - h_temp) end if end if ! ! -- calculate maw storage changes if (this%imawiss /= 1) then if (this%ifwdischarge(n) /= 1) then - hdterm = this%xoldsto(n) - htmp + hdterm = this%xoldsto(n) - h_temp else hdterm = this%xoldsto(n) - this%fwelev(n) end if @@ -4085,7 +4085,7 @@ subroutine maw_calculate_qpot(this, n, qnet) cmaw = this%satcond(jpos) * vscratio * sat hgwf = this%xnew(igwfnode) bmaw = this%botscrn(jpos) - hv = htmp + hv = h_temp if (hv < bmaw) then hv = bmaw end if diff --git a/src/Model/GroundWaterFlow/gwf-npf.f90 b/src/Model/GroundWaterFlow/gwf-npf.f90 index d043e2025d2..a7830d7535c 100644 --- a/src/Model/GroundWaterFlow/gwf-npf.f90 +++ b/src/Model/GroundWaterFlow/gwf-npf.f90 @@ -2129,7 +2129,7 @@ subroutine sgwf_npf_wetdry(this, kiter, hnew) real(DP), intent(inout), dimension(:) :: hnew ! -- local integer(I4B) :: n, m, ii, ihc - real(DP) :: ttop, bbot, thck + real(DP) :: ttop, bbot, thick integer(I4B) :: ncnvrt, ihdcnv character(len=30), dimension(5) :: nodcnvrt character(len=30) :: nodestr @@ -2188,16 +2188,16 @@ subroutine sgwf_npf_wetdry(this, kiter, hnew) if (this%icelltype(n) /= 0) then if (hnew(n) < ttop) ttop = hnew(n) end if - thck = ttop - bbot + thick = ttop - bbot ! - ! -- If thck<0 print message, set hnew, and ibound - if (thck <= DZERO) then + ! -- If thick<0 print message, set hnew, and ibound + if (thick <= DZERO) then call this%wdmsg(1, ncnvrt, nodcnvrt, acnvrt, ihdcnv, kiter, n) hnew(n) = this%hdry if (this%ibound(n) < 0) then errmsg = 'CONSTANT-HEAD CELL WENT DRY -- SIMULATION ABORTED' call store_error(errmsg) - write (errmsg, fmttopbotthk) ttop, bbot, thck + write (errmsg, fmttopbotthk) ttop, bbot, thick call store_error(errmsg) call this%dis%noder_to_string(n, nodestr) write (errmsg, fmtni) trim(adjustl(nodestr)), kiter, kstp, kper diff --git a/src/Model/GroundWaterFlow/gwf-obs.f90 b/src/Model/GroundWaterFlow/gwf-obs.f90 index 38c6f52cb26..446be36b5de 100644 --- a/src/Model/GroundWaterFlow/gwf-obs.f90 +++ b/src/Model/GroundWaterFlow/gwf-obs.f90 @@ -205,16 +205,16 @@ subroutine gwf_process_head_drawdown_obs_id(obsrv, dis, inunitobs, iout) ! -- local integer(I4B) :: nn1 integer(I4B) :: icol, istart, istop - character(len=LINELENGTH) :: ermsg, strng + character(len=LINELENGTH) :: ermsg, string ! ! -- Initialize variables - strng = obsrv%IDstring + string = obsrv%IDstring icol = 1 ! ! Get node number, with option for ID string to be either node ! number or lay, row, column (when dis is structured). nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, strng, .false.) + iout, string, .false.) ! if (nn1 > 0) then obsrv%NodeNumber = nn1 @@ -239,41 +239,41 @@ subroutine gwf_process_intercell_obs_id(obsrv, dis, inunitobs, iout) ! -- local integer(I4B) :: nn1, nn2 integer(I4B) :: icol, istart, istop, jaidx - character(len=LINELENGTH) :: ermsg, strng + character(len=LINELENGTH) :: ermsg, string ! formats 70 format('Error: No connection exists between cells identified in text: ', a) ! ! -- Initialize variables - strng = obsrv%IDstring + string = obsrv%IDstring icol = 1 ! ! Get node number, with option for ID string to be either node ! number or lay, row, column (when dis is structured). nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, strng, .false.) + iout, string, .false.) ! if (nn1 > 0) then obsrv%NodeNumber = nn1 else - ermsg = 'Error reading data from ID string: '//strng(istart:istop) + ermsg = 'Error reading data from ID string: '//string(istart:istop) call store_error(ermsg) end if ! ! Get node number, with option for ID string to be either node ! number or lay, row, column (when dis is structured). nn2 = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, strng, .false.) + iout, string, .false.) if (nn2 > 0) then obsrv%NodeNumber2 = nn2 else - ermsg = 'Error reading data from ID string: '//strng(istart:istop) + ermsg = 'Error reading data from ID string: '//string(istart:istop) call store_error(ermsg) end if ! ! -- store JA index jaidx = dis%con%getjaindex(nn1, nn2) if (jaidx == 0) then - write (ermsg, 70) trim(strng) + write (ermsg, 70) trim(string) call store_error(ermsg) end if obsrv%JaIndex = jaidx diff --git a/src/Model/GroundWaterFlow/gwf-uzf.f90 b/src/Model/GroundWaterFlow/gwf-uzf.f90 index ad2d58d4584..2c63fb0793b 100644 --- a/src/Model/GroundWaterFlow/gwf-uzf.f90 +++ b/src/Model/GroundWaterFlow/gwf-uzf.f90 @@ -2593,26 +2593,26 @@ subroutine uzf_process_obsID(obsrv, dis, inunitobs, iout) real(DP) :: obsdepth integer(I4B) :: icol, istart, istop, istat real(DP) :: r - character(len=LINELENGTH) :: strng + character(len=LINELENGTH) :: string ! formats 30 format(i10) ! - strng = obsrv%IDstring - ! -- Extract node number from strng and store it. + string = obsrv%IDstring + ! -- Extract node number from string and store it. ! If 1st item is not an integer(I4B), it should be a ! feature name--deal with it. icol = 1 ! -- get node number - call urword(strng, icol, istart, istop, 1, n, r, iout, inunitobs) - read (strng(istart:istop), 30, iostat=istat) nn + call urword(string, icol, istart, istop, 1, n, r, iout, inunitobs) + read (string(istart:istop), 30, iostat=istat) nn if (istat == 0) then ! -- store uzf node number (NodeNumber) obsrv%NodeNumber = nn else - ! Integer can't be read from strng; it's presumed to be a boundary + ! Integer can't be read from string; it's presumed to be a boundary ! name (already converted to uppercase) - obsrv%FeatureName = strng(istart:istop) - !obsrv%FeatureName = trim(adjustl(strng)) + obsrv%FeatureName = string(istart:istop) + !obsrv%FeatureName = trim(adjustl(string)) ! -- Observation may require summing rates from multiple boundaries, ! so assign NodeNumber as a value that indicates observation ! is for a named boundary or group of boundaries. @@ -2621,7 +2621,7 @@ subroutine uzf_process_obsID(obsrv, dis, inunitobs, iout) ! ! -- for soil water observation, store depth if (obsrv%ObsTypeId == 'WATER-CONTENT') then - call urword(strng, icol, istart, istop, 3, n, r, iout, inunitobs) + call urword(string, icol, istart, istop, 3, n, r, iout, inunitobs) obsdepth = r ! -- store observations depth obsrv%Obsdepth = obsdepth diff --git a/src/Model/ParticleTracking/prt-obs.f90 b/src/Model/ParticleTracking/prt-obs.f90 index b39beefa478..73a308427a7 100644 --- a/src/Model/ParticleTracking/prt-obs.f90 +++ b/src/Model/ParticleTracking/prt-obs.f90 @@ -157,16 +157,16 @@ subroutine prt_process_concentration_obs_id(obsrv, dis, inunitobs, iout) ! -- local integer(I4B) :: nn1 integer(I4B) :: icol, istart, istop - character(len=LINELENGTH) :: ermsg, strng + character(len=LINELENGTH) :: ermsg, string ! ! -- Initialize variables - strng = obsrv%IDstring + string = obsrv%IDstring icol = 1 ! ! Get node number, with option for ID string to be either node ! number or lay, row, column (when dis is structured). nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, strng, .false.) + iout, string, .false.) ! if (nn1 > 0) then obsrv%NodeNumber = nn1 @@ -187,41 +187,41 @@ subroutine prt_process_intercell_obs_id(obsrv, dis, inunitobs, iout) ! -- local integer(I4B) :: nn1, nn2 integer(I4B) :: icol, istart, istop, jaidx - character(len=LINELENGTH) :: ermsg, strng + character(len=LINELENGTH) :: ermsg, string ! formats 70 format('Error: No connection exists between cells identified in text: ', a) ! ! -- Initialize variables - strng = obsrv%IDstring + string = obsrv%IDstring icol = 1 ! ! Get node number, with option for ID string to be either node ! number or lay, row, column (when dis is structured). nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, strng, .false.) + iout, string, .false.) ! if (nn1 > 0) then obsrv%NodeNumber = nn1 else - ermsg = 'Error reading data from ID string: '//strng(istart:istop) + ermsg = 'Error reading data from ID string: '//string(istart:istop) call store_error(ermsg) end if ! ! Get node number, with option for ID string to be either node ! number or lay, row, column (when dis is structured). nn2 = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, strng, .false.) + iout, string, .false.) if (nn2 > 0) then obsrv%NodeNumber2 = nn2 else - ermsg = 'Error reading data from ID string: '//strng(istart:istop) + ermsg = 'Error reading data from ID string: '//string(istart:istop) call store_error(ermsg) end if ! ! -- store JA index jaidx = dis%con%getjaindex(nn1, nn2) if (jaidx == 0) then - write (ermsg, 70) trim(strng) + write (ermsg, 70) trim(string) call store_error(ermsg) end if obsrv%JaIndex = jaidx diff --git a/src/Model/SurfaceWaterFlow/swf-dfw.f90 b/src/Model/SurfaceWaterFlow/swf-dfw.f90 index 680295e1adf..a8427d53dda 100644 --- a/src/Model/SurfaceWaterFlow/swf-dfw.f90 +++ b/src/Model/SurfaceWaterFlow/swf-dfw.f90 @@ -1628,11 +1628,11 @@ subroutine dfwobsidprocessor(obsrv, dis, inunitobs, iout) integer(I4B), intent(in) :: iout ! -- local integer(I4B) :: n - character(len=LINELENGTH) :: strng + character(len=LINELENGTH) :: string ! ! -- Initialize variables - strng = obsrv%IDstring - read (strng, *) n + string = obsrv%IDstring + read (string, *) n ! if (n > 0) then obsrv%NodeNumber = n diff --git a/src/Model/SurfaceWaterFlow/swf-obs.f90 b/src/Model/SurfaceWaterFlow/swf-obs.f90 index 38f64a0c407..db969fc874f 100644 --- a/src/Model/SurfaceWaterFlow/swf-obs.f90 +++ b/src/Model/SurfaceWaterFlow/swf-obs.f90 @@ -181,16 +181,16 @@ subroutine swf_process_stage_obs_id(obsrv, dis, inunitobs, iout) ! -- local integer(I4B) :: nn1 integer(I4B) :: icol, istart, istop - character(len=LINELENGTH) :: ermsg, strng + character(len=LINELENGTH) :: ermsg, string ! ! -- Initialize variables - strng = obsrv%IDstring + string = obsrv%IDstring icol = 1 ! ! Get node number, with option for ID string to be either node ! number or lay, row, column (when dis is structured). nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, strng, .false.) + iout, string, .false.) ! if (nn1 > 0) then obsrv%NodeNumber = nn1 @@ -214,41 +214,41 @@ subroutine swf_process_intercell_obs_id(obsrv, dis, inunitobs, iout) ! -- local integer(I4B) :: nn1, nn2 integer(I4B) :: icol, istart, istop, jaidx - character(len=LINELENGTH) :: ermsg, strng + character(len=LINELENGTH) :: ermsg, string ! formats 70 format('Error: No connection exists between cells identified in text: ', a) ! ! -- Initialize variables - strng = obsrv%IDstring + string = obsrv%IDstring icol = 1 ! ! Get node number, with option for ID string to be either node ! number or lay, row, column (when dis is structured). nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, strng, .false.) + iout, string, .false.) ! if (nn1 > 0) then obsrv%NodeNumber = nn1 else - ermsg = 'Error reading data from ID string: '//strng(istart:istop) + ermsg = 'Error reading data from ID string: '//string(istart:istop) call store_error(ermsg) end if ! ! Get node number, with option for ID string to be either node ! number or lay, row, column (when dis is structured). nn2 = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, strng, .false.) + iout, string, .false.) if (nn2 > 0) then obsrv%NodeNumber2 = nn2 else - ermsg = 'Error reading data from ID string: '//strng(istart:istop) + ermsg = 'Error reading data from ID string: '//string(istart:istop) call store_error(ermsg) end if ! ! -- store JA index jaidx = dis%con%getjaindex(nn1, nn2) if (jaidx == 0) then - write (ermsg, 70) trim(strng) + write (ermsg, 70) trim(string) call store_error(ermsg) end if obsrv%JaIndex = jaidx diff --git a/src/Model/TransportModel/tsp-apt.f90 b/src/Model/TransportModel/tsp-apt.f90 index dd1c518e5f0..2555740a250 100644 --- a/src/Model/TransportModel/tsp-apt.f90 +++ b/src/Model/TransportModel/tsp-apt.f90 @@ -3005,19 +3005,19 @@ subroutine apt_process_obsID(obsrv, dis, inunitobs, iout) integer(I4B) :: icol integer(I4B) :: istart integer(I4B) :: istop - character(len=LINELENGTH) :: strng + character(len=LINELENGTH) :: string character(len=LENBOUNDNAME) :: bndname ! ! -- initialize local variables - strng = obsrv%IDstring + string = obsrv%IDstring ! - ! -- Extract reach number from strng and store it. + ! -- Extract reach number from string and store it. ! If 1st item is not an integer(I4B), it should be a ! boundary name--deal with it. icol = 1 ! ! -- get reach number or boundary name - call extract_idnum_or_bndname(strng, icol, istart, istop, nn1, bndname) + call extract_idnum_or_bndname(string, icol, istart, istop, nn1, bndname) if (nn1 == NAMEDBOUNDFLAG) then obsrv%FeatureName = bndname end if @@ -3052,23 +3052,23 @@ subroutine apt_process_obsID12(obsrv, dis, inunitobs, iout) integer(I4B) :: icol integer(I4B) :: istart integer(I4B) :: istop - character(len=LINELENGTH) :: strng + character(len=LINELENGTH) :: string character(len=LENBOUNDNAME) :: bndname ! ! -- initialize local variables - strng = obsrv%IDstring + string = obsrv%IDstring ! - ! -- Extract reach number from strng and store it. + ! -- Extract reach number from string and store it. ! If 1st item is not an integer(I4B), it should be a ! boundary name--deal with it. icol = 1 ! ! -- get reach number or boundary name - call extract_idnum_or_bndname(strng, icol, istart, istop, nn1, bndname) + call extract_idnum_or_bndname(string, icol, istart, istop, nn1, bndname) if (nn1 == NAMEDBOUNDFLAG) then obsrv%FeatureName = bndname else - call extract_idnum_or_bndname(strng, icol, istart, istop, iconn, bndname) + call extract_idnum_or_bndname(string, icol, istart, istop, iconn, bndname) if (len_trim(bndName) < 1 .and. iconn < 0) then write (errmsg, '(a,1x,a,a,1x,a,1x,a)') & 'For observation type', trim(adjustl(obsrv%ObsTypeId)), & diff --git a/src/Model/TransportModel/tsp-obs.f90 b/src/Model/TransportModel/tsp-obs.f90 index 55e4114bf0a..2dba34e60ac 100644 --- a/src/Model/TransportModel/tsp-obs.f90 +++ b/src/Model/TransportModel/tsp-obs.f90 @@ -197,16 +197,16 @@ subroutine gwt_process_concentration_obs_id(obsrv, dis, inunitobs, iout) ! -- local integer(I4B) :: nn1 integer(I4B) :: icol, istart, istop - character(len=LINELENGTH) :: ermsg, strng + character(len=LINELENGTH) :: ermsg, string ! ! -- Initialize variables - strng = obsrv%IDstring + string = obsrv%IDstring icol = 1 ! ! Get node number, with option for ID string to be either node ! number or lay, row, column (when dis is structured). nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, strng, .false.) + iout, string, .false.) ! if (nn1 > 0) then obsrv%NodeNumber = nn1 @@ -233,41 +233,41 @@ subroutine tsp_process_intercell_obs_id(obsrv, dis, inunitobs, iout) ! -- local integer(I4B) :: nn1, nn2 integer(I4B) :: icol, istart, istop, jaidx - character(len=LINELENGTH) :: ermsg, strng + character(len=LINELENGTH) :: ermsg, string ! formats 70 format('Error: No connection exists between cells identified in text: ', a) ! ! -- Initialize variables - strng = obsrv%IDstring + string = obsrv%IDstring icol = 1 ! ! Get node number, with option for ID string to be either node ! number or lay, row, column (when dis is structured). nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, strng, .false.) + iout, string, .false.) ! if (nn1 > 0) then obsrv%NodeNumber = nn1 else - ermsg = 'Error reading data from ID string: '//strng(istart:istop) + ermsg = 'Error reading data from ID string: '//string(istart:istop) call store_error(ermsg) end if ! ! Get node number, with option for ID string to be either node ! number or lay, row, column (when dis is structured). nn2 = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, strng, .false.) + iout, string, .false.) if (nn2 > 0) then obsrv%NodeNumber2 = nn2 else - ermsg = 'Error reading data from ID string: '//strng(istart:istop) + ermsg = 'Error reading data from ID string: '//string(istart:istop) call store_error(ermsg) end if ! ! -- store JA index jaidx = dis%con%getjaindex(nn1, nn2) if (jaidx == 0) then - write (ermsg, 70) trim(strng) + write (ermsg, 70) trim(string) call store_error(ermsg) end if obsrv%JaIndex = jaidx diff --git a/src/Solution/LinearMethods/ImsLinearBase.f90 b/src/Solution/LinearMethods/ImsLinearBase.f90 index 2b001ef02c7..d88afe12e4d 100644 --- a/src/Solution/LinearMethods/ImsLinearBase.f90 +++ b/src/Solution/LinearMethods/ImsLinearBase.f90 @@ -87,7 +87,7 @@ SUBROUTINE ims_base_cg(ICNVG, ITMAX, INNERIT, & real(DP) :: rmax real(DP) :: l2norm real(DP) :: rcnvg - real(DP) :: denom + real(DP) :: denominator real(DP) :: alpha, beta real(DP) :: rho, rho0 ! @@ -130,9 +130,9 @@ SUBROUTINE ims_base_cg(ICNVG, ITMAX, INNERIT, & ! ! -- UPDATE Q call amux(NEQ, P, Q, A0, JA0, IA0) - denom = ddot(NEQ, P, 1, Q, 1) - denom = denom + SIGN(DPREC, denom) - alpha = rho / denom + denominator = ddot(NEQ, P, 1, Q, 1) + denominator = denominator + SIGN(DPREC, denominator) + alpha = rho / denominator ! ! -- UPDATE X AND RESIDUAL deltax = DZERO @@ -320,7 +320,7 @@ SUBROUTINE ims_base_bcgs(ICNVG, ITMAX, INNERIT, & real(DP) :: beta real(DP) :: rho, rho0 real(DP) :: omega, omega0 - real(DP) :: numer, denom + real(DP) :: numerator, denominator ! ! -- initialize local variables INNERIT = 0 @@ -375,9 +375,9 @@ SUBROUTINE ims_base_bcgs(ICNVG, ITMAX, INNERIT, & call amux(NEQ, PHAT, V, A0, JA0, IA0) ! ! -- UPDATE alpha WITH DHAT AND V - denom = ddot(NEQ, DHAT, 1, V, 1) - denom = denom + SIGN(DPREC, denom) - alpha = rho / denom + denominator = ddot(NEQ, DHAT, 1, V, 1) + denominator = denominator + SIGN(DPREC, denominator) + alpha = rho / denominator ! ! -- UPDATE Q DO n = 1, NEQ @@ -424,10 +424,10 @@ SUBROUTINE ims_base_bcgs(ICNVG, ITMAX, INNERIT, & call amux(NEQ, QHAT, T, A0, JA0, IA0) ! ! -- UPDATE omega - numer = ddot(NEQ, T, 1, Q, 1) - denom = ddot(NEQ, T, 1, T, 1) - denom = denom + SIGN(DPREC, denom) - omega = numer / denom + numerator = ddot(NEQ, T, 1, Q, 1) + denominator = ddot(NEQ, T, 1, T, 1) + denominator = denominator + SIGN(DPREC, denominator) + omega = numerator / denominator ! ! -- UPDATE X AND RESIDUAL deltax = DZERO diff --git a/src/Utilities/Observation/Obs.f90 b/src/Utilities/Observation/Obs.f90 index f2e0aa166a9..e4028ee07fb 100644 --- a/src/Utilities/Observation/Obs.f90 +++ b/src/Utilities/Observation/Obs.f90 @@ -254,23 +254,23 @@ subroutine DefaultObsIdProcessor(obsrv, dis, inunitobs, iout) ! -- local integer(I4B) :: n integer(I4B) :: icol, istart, istop - character(len=LINELENGTH) :: strng + character(len=LINELENGTH) :: string logical :: flag_string ! ! -- Initialize variables - strng = obsrv%IDstring + string = obsrv%IDstring icol = 1 - flag_string = .true. ! Allow strng to contain a boundary name + flag_string = .true. ! Allow string to contain a boundary name ! n = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, strng, flag_string) + iout, string, flag_string) ! if (n > 0) then obsrv%NodeNumber = n elseif (n == -2) then - ! Integer can't be read from strng; it's presumed to be a boundary + ! Integer can't be read from string; it's presumed to be a boundary ! name (already converted to uppercase) - obsrv%FeatureName = strng(istart:istop) + obsrv%FeatureName = string(istart:istop) ! -- Observation may require summing rates from multiple boundaries, ! so assign NodeNumber as a value that indicates observation ! is for a named boundary or group of boundaries. From 61dc0177be43fbede23a7ddfa9aad372fe318bbe Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 23 Apr 2024 13:44:00 -0400 Subject: [PATCH 126/199] feat(PRT): local z option for particle release point package (#1756) Optional support for local z coordinates. This allows positioning particles based on the water table. The motivations here are 1) modpath 7 parity and 2) to provide the same capabilities whether prt is running alongside a gwf model or as a post-processor. Previously dynamic positioning was possible only if prt runs as a post-processor. --- autotest/test_prt_stop_zones.py | 34 +++++++++++++++----------- doc/mf6io/mf6ivar/dfn/prt-prp.dfn | 8 ++++++ src/Model/ParticleTracking/prt-prp.f90 | 25 +++++++++++++++++-- 3 files changed, 51 insertions(+), 16 deletions(-) diff --git a/autotest/test_prt_stop_zones.py b/autotest/test_prt_stop_zones.py index a7e354dd87a..f7c1f794bc0 100644 --- a/autotest/test_prt_stop_zones.py +++ b/autotest/test_prt_stop_zones.py @@ -54,6 +54,25 @@ def create_izone(nlay, nrow, ncol): return izone +def build_gwf_sim(name, ws, mf6): + gwf_sim = FlopyReadmeCase.get_gwf_sim( + name, ws, mf6 + ) + gwf = gwf_sim.get_model() + dis = gwf.get_package("DIS") + nlay = int(name[-1]) + botm = [FlopyReadmeCase.top - (k + 1) for k in range(nlay)] + botm_data = np.array( + [ + list(repeat(b, FlopyReadmeCase.nrow * FlopyReadmeCase.ncol)) + for b in botm + ] + ).reshape((nlay, FlopyReadmeCase.nrow, FlopyReadmeCase.ncol)) + dis.nlay = nlay + dis.botm.set_data(botm_data) + return gwf_sim + + def build_prt_sim(name, gwf_ws, prt_ws, mf6): # create simulation sim = flopy.mf6.MFSimulation( @@ -193,21 +212,8 @@ def build_mp7_sim(name, ws, mp7, gwf): def build_models(idx, test): - gwf_sim = FlopyReadmeCase.get_gwf_sim( - test.name, test.workspace, test.targets["mf6"] - ) + gwf_sim = build_gwf_sim(test.name, test.workspace, test.targets["mf6"]) gwf = gwf_sim.get_model() - dis = gwf.get_package("DIS") - nlay = int(test.name[-1]) - botm = [FlopyReadmeCase.top - (k + 1) for k in range(nlay)] - botm_data = np.array( - [ - list(repeat(b, FlopyReadmeCase.nrow * FlopyReadmeCase.ncol)) - for b in botm - ] - ).reshape((nlay, FlopyReadmeCase.nrow, FlopyReadmeCase.ncol)) - dis.nlay = nlay - dis.botm.set_data(botm_data) prt_sim = build_prt_sim( test.name, test.workspace, test.workspace / "prt", test.targets["mf6"] ) diff --git a/doc/mf6io/mf6ivar/dfn/prt-prp.dfn b/doc/mf6io/mf6ivar/dfn/prt-prp.dfn index 4a6d8234340..667f7303de8 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-prp.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-prp.dfn @@ -10,6 +10,14 @@ optional true longname description REPLACE boundnames {'{#1}': 'release-point'} +block options +name local_z +type keyword +reader urword +optional true +longname whether to use local z coordinates +description indicates that rptz defines the local z coordinate of the release point within the cell, with value between 0 and 1 (inclusive). If the cell is unsaturated at release time, the z coordinate is computed relative to the water table rather than the top of the cell. + block options name track_filerecord type record track fileout trackfile diff --git a/src/Model/ParticleTracking/prt-prp.f90 b/src/Model/ParticleTracking/prt-prp.f90 index aa970c8ec9b..3e76df3acdf 100644 --- a/src/Model/ParticleTracking/prt-prp.f90 +++ b/src/Model/ParticleTracking/prt-prp.f90 @@ -46,6 +46,7 @@ module PrtPrpModule integer(I4B), pointer :: itrkhdr => null() !< track header file integer(I4B), pointer :: itrkcsv => null() !< CSV track file integer(I4B), pointer :: irlstls => null() !< release time file + logical(LGP), pointer :: localz => null() !< compute z coordinates local to the cell logical(LGP), pointer :: rlsall => null() !< release in all time step logical(LGP), pointer :: rlsfirst => null() !< release in first time step logical(LGP), pointer :: rlstimelist => null() !< use global release time @@ -58,6 +59,7 @@ module PrtPrpModule real(DP), pointer, contiguous :: rptx(:) => null() !< release point x coordinates real(DP), pointer, contiguous :: rpty(:) => null() !< release point y coordinates real(DP), pointer, contiguous :: rptz(:) => null() !< release point z coordinates + real(DP), pointer, contiguous :: locz(:) => null() !< release point local z coordinates real(DP), pointer, contiguous :: rptmass(:) => null() !< total mass released from point character(len=LENBOUNDNAME), pointer, contiguous :: rptname(:) => null() !< release point names type(TimeSelectType), pointer :: releasetimes @@ -140,6 +142,7 @@ subroutine prp_da(this) call mem_deallocate(this%rlsall) call mem_deallocate(this%rlsfirst) call mem_deallocate(this%rlstimelist) + call mem_deallocate(this%localz) call mem_deallocate(this%offset) call mem_deallocate(this%stoptime) call mem_deallocate(this%stoptraveltime) @@ -157,6 +160,7 @@ subroutine prp_da(this) call mem_deallocate(this%rptx) call mem_deallocate(this%rpty) call mem_deallocate(this%rptz) + call mem_deallocate(this%locz) call mem_deallocate(this%rptnode) call mem_deallocate(this%rptmass) call mem_deallocate(this%rlskstp) @@ -201,6 +205,7 @@ subroutine prp_allocate_arrays(this, nodelist, auxvar) call mem_allocate(this%rptx, this%nreleasepts, 'RPTX', this%memoryPath) call mem_allocate(this%rpty, this%nreleasepts, 'RPTY', this%memoryPath) call mem_allocate(this%rptz, this%nreleasepts, 'RPTZ', this%memoryPath) + call mem_allocate(this%locz, this%nreleasepts, 'LOCZ', this%memoryPath) call mem_allocate(this%rptmass, this%nreleasepts, 'RPTMASS', this%memoryPath) call mem_allocate(this%rptnode, this%nreleasepts, 'RPTNODER', & this%memoryPath) @@ -230,6 +235,7 @@ subroutine prp_allocate_scalars(this) call mem_allocate(this%rlsall, 'RLSALL', this%memoryPath) call mem_allocate(this%rlsfirst, 'RLSFIRST', this%memoryPath) call mem_allocate(this%rlstimelist, 'RELEASETIME', this%memoryPath) + call mem_allocate(this%localz, 'LOCALZ', this%memoryPath) call mem_allocate(this%offset, 'OFFSET', this%memoryPath) call mem_allocate(this%stoptime, 'STOPTIME', this%memoryPath) call mem_allocate(this%stoptraveltime, 'STOPTRAVELTIME', this%memoryPath) @@ -247,6 +253,7 @@ subroutine prp_allocate_scalars(this) this%rlsall = .false. this%rlsfirst = .false. this%rlstimelist = .false. + this%localz = .false. this%offset = DZERO this%stoptime = huge(1d0) this%stoptraveltime = huge(1d0) @@ -303,7 +310,7 @@ subroutine prp_ad(this) character(len=LINELENGTH) :: errmsg integer(I4B) :: ic, icu, nps, nts, nrel, & nreleasets, np, irow, icol, ilay, icpl - real(DP) :: x, y, z, trelease, tend + real(DP) :: x, y, z, trelease, tend, top, bot, hds real(DP), allocatable :: polyverts(:, :) type(ParticleType), pointer :: particle @@ -418,7 +425,14 @@ subroutine prp_ad(this) end if particle%x = x particle%y = y - particle%z = this%rptz(nps) + if (this%localz) then + top = this%fmi%dis%top(ic) + bot = this%fmi%dis%bot(ic) + hds = this%fmi%gwfhead(ic) + particle%z = bot + this%rptz(nps) * (hds - bot) + else + particle%z = this%rptz(nps) + end if particle%trelease = trelease ! Set stopping time to earlier of times specified by STOPTIME and STOPTRAVELTIME if (this%stoptraveltime == huge(1d0)) then @@ -794,6 +808,8 @@ subroutine prp_options(this, option, found) &FOLLOWED BY FILEOUT') end if found = .true. + case ('LOCAL_Z') + this%localz = .true. case default found = .false. end select @@ -873,6 +889,11 @@ subroutine prp_read_packagedata(this) y(n) = this%parser%GetDouble() z(n) = this%parser%GetDouble() + if (this%localz .and. (z(n) < 0 .or. z(n) > 1)) then + call store_error('Local z coordinate must fall in the interval [0, 1]') + cycle + end if + ! -- set default boundname write (cno, '(i9.9)') n bndName = 'PRP'//cno From 4c0c01338b7ada168a3009085f57712204709770 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Wed, 24 Apr 2024 20:57:07 -0500 Subject: [PATCH 127/199] test(prt): limit prt autotest results plotting (#1757) --- autotest/test_gwe_uze00.py | 3 +- autotest/test_gwf_ats02.py | 2 +- autotest/test_prt_budget.py | 84 +++++++-------- autotest/test_prt_drape.py | 48 +++++---- autotest/test_prt_exg.py | 84 +++++++-------- autotest/test_prt_fmi.py | 80 +++++++------- autotest/test_prt_release_timing.py | 80 +++++++------- autotest/test_prt_stop_zones.py | 156 ++++++++++++++-------------- autotest/test_prt_track_events.py | 84 +++++++-------- autotest/test_prt_voronoi1.py | 3 +- autotest/test_prt_weak_sinks.py | 110 ++++++++++---------- 11 files changed, 376 insertions(+), 358 deletions(-) diff --git a/autotest/test_gwe_uze00.py b/autotest/test_gwe_uze00.py index a196d0514d5..90311457c42 100644 --- a/autotest/test_gwe_uze00.py +++ b/autotest/test_gwe_uze00.py @@ -556,7 +556,8 @@ def check_output(idx, test): assert np.min(analytical_sln[100] - temps[100]) >= -0.20763221276, msg4 # If a plot is needed for visual inspection, change following if statement to "True" - if False: + plot_results = False + if plot_results: analytical_sln = np.zeros((len(t), len(z))) for i, tm in enumerate(t): for j, depth in enumerate(z): diff --git a/autotest/test_gwf_ats02.py b/autotest/test_gwf_ats02.py index 7514eeafed5..7e03230de24 100644 --- a/autotest/test_gwf_ats02.py +++ b/autotest/test_gwf_ats02.py @@ -202,7 +202,7 @@ def make_plot(test): label=f"Layer {ilay + 1}", ) plt.legend() - # plt.show() + plt.show() def check_output(idx, test): diff --git a/autotest/test_prt_budget.py b/autotest/test_prt_budget.py index 59357810112..0c1a4b83522 100644 --- a/autotest/test_prt_budget.py +++ b/autotest/test_prt_budget.py @@ -272,47 +272,49 @@ def check_output(idx, test): qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) # setup plot - fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) - for a in ax: - a.set_aspect("equal") - - # plot mf6 pathlines in map view - pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) - for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): - pl.plot( - title="MF6 pathlines", - kind="line", - x="x", - y="y", - ax=ax[0], - legend=False, - color=cm.plasma(ipl / len(mf6_plines)), - ) - - # plot mp7 pathlines in map view - pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - mp7_plines = mp7_pls.groupby(["particleid"]) - for ipl, (pid, pl) in enumerate(mp7_plines): - pl.plot( - title="MP7 pathlines", - kind="line", - x="x", - y="y", - ax=ax[1], - legend=False, - color=cm.plasma(ipl / len(mp7_plines)), - ) - - # view/save plot - # plt.show() - plt.savefig(gwf_ws / f"test_{simname}.png") + plot_results = False + if plot_results: + fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) + for a in ax: + a.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title="MF6 pathlines", + kind="line", + x="x", + y="y", + ax=ax[0], + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) + + # plot mp7 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mp7_plines = mp7_pls.groupby(["particleid"]) + for ipl, (pid, pl) in enumerate(mp7_plines): + pl.plot( + title="MP7 pathlines", + kind="line", + x="x", + y="y", + ax=ax[1], + legend=False, + color=cm.plasma(ipl / len(mp7_plines)), + ) + + # view/save plot + plt.show() + plt.savefig(gwf_ws / f"test_{simname}.png") # convert mf6 pathlines to mp7 format mf6_pls = to_mp7_pathlines(mf6_pls) diff --git a/autotest/test_prt_drape.py b/autotest/test_prt_drape.py index f27b2e81d0d..35796b65814 100644 --- a/autotest/test_prt_drape.py +++ b/autotest/test_prt_drape.py @@ -282,29 +282,31 @@ def check_output(idx, test): qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) # setup plot - fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(10, 10)) - ax.set_aspect("equal") - - # plot mf6 pathlines in map view - pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) - for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): - pl.plot( - title=f"MF6 pathlines{' (drape)' if drape else ''}", - kind="line", - x="x", - y="y", - ax=ax, - legend=False, - color=cm.plasma(ipl / len(mf6_plines)), - ) - - # view/save plot - # plt.show() - plt.savefig(gwf_ws / f"test_{simname}.png") + plot_results = False + if plot_results: + fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(10, 10)) + ax.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title=f"MF6 pathlines{' (drape)' if drape else ''}", + kind="line", + x="x", + y="y", + ax=ax, + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) + + # view/save plot + plt.show() + plt.savefig(gwf_ws / f"test_{simname}.png") if drape: assert mf6_pls.shape[0] == 36 diff --git a/autotest/test_prt_exg.py b/autotest/test_prt_exg.py index f1ca6903312..e873d62e09f 100644 --- a/autotest/test_prt_exg.py +++ b/autotest/test_prt_exg.py @@ -248,47 +248,49 @@ def check_output(idx, test): qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) # setup plot - fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) - for a in ax: - a.set_aspect("equal") - - # plot mf6 pathlines in map view - pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) - for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): - pl.plot( - title="MF6 pathlines", - kind="line", - x="x", - y="y", - ax=ax[0], - legend=False, - color=cm.plasma(ipl / len(mf6_plines)), - ) - - # plot mp7 pathlines in map view - pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - mp7_plines = mp7_pls.groupby(["particleid"]) - for ipl, (pid, pl) in enumerate(mp7_plines): - pl.plot( - title="MP7 pathlines", - kind="line", - x="x", - y="y", - ax=ax[1], - legend=False, - color=cm.plasma(ipl / len(mp7_plines)), - ) - - # view/save plot - # plt.show() - plt.savefig(gwf_ws / f"test_{name}.png") + plot_results = False + if plot_results: + fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) + for a in ax: + a.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title="MF6 pathlines", + kind="line", + x="x", + y="y", + ax=ax[0], + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) + + # plot mp7 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mp7_plines = mp7_pls.groupby(["particleid"]) + for ipl, (pid, pl) in enumerate(mp7_plines): + pl.plot( + title="MP7 pathlines", + kind="line", + x="x", + y="y", + ax=ax[1], + legend=False, + color=cm.plasma(ipl / len(mp7_plines)), + ) + + # view/save plot + plt.show() + plt.savefig(gwf_ws / f"test_{name}.png") # convert mf6 pathlines to mp7 format mf6_pls = to_mp7_pathlines(mf6_pls) diff --git a/autotest/test_prt_fmi.py b/autotest/test_prt_fmi.py index 7986007f721..74c64182dad 100644 --- a/autotest/test_prt_fmi.py +++ b/autotest/test_prt_fmi.py @@ -301,47 +301,49 @@ def check_output(idx, test): qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) # setup plot - fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) - for a in ax: - a.set_aspect("equal") - - # plot mf6 pathlines in map view - pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) - for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): - pl.plot( - title="MF6 pathlines", - kind="line", - x="x", - y="y", - ax=ax[0], - legend=False, - color=cm.plasma(ipl / len(mf6_plines)), - ) + plot_data = False + if plot_data: + fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) + for a in ax: + a.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title="MF6 pathlines", + kind="line", + x="x", + y="y", + ax=ax[0], + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) - # plot mp7 pathlines in map view - pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - mp7_plines = mp7_pls.groupby(["particleid"]) - for ipl, (pid, pl) in enumerate(mp7_plines): - pl.plot( - title="MP7 pathlines", - kind="line", - x="x", - y="y", - ax=ax[1], - legend=False, - color=cm.plasma(ipl / len(mp7_plines)), - ) + # plot mp7 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mp7_plines = mp7_pls.groupby(["particleid"]) + for ipl, (pid, pl) in enumerate(mp7_plines): + pl.plot( + title="MP7 pathlines", + kind="line", + x="x", + y="y", + ax=ax[1], + legend=False, + color=cm.plasma(ipl / len(mp7_plines)), + ) - # view/save plot - # plt.show() - plt.savefig(gwf_ws / f"test_{simname}.png") + # view/save plot + plt.show() + plt.savefig(gwf_ws / f"test_{simname}.png") # convert mf6 pathlines to mp7 format mf6_pls = to_mp7_pathlines(mf6_pls) diff --git a/autotest/test_prt_release_timing.py b/autotest/test_prt_release_timing.py index 3a3cfcad606..0c3d37157ee 100644 --- a/autotest/test_prt_release_timing.py +++ b/autotest/test_prt_release_timing.py @@ -339,47 +339,49 @@ def check_output(idx, test, fraction): qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) # setup plot - fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) - for a in ax: - a.set_aspect("equal") - - # plot mf6 pathlines in map view - pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) - for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): - pl.plot( - title="MF6 pathlines", - kind="line", - x="x", - y="y", - ax=ax[0], - legend=False, - color=cm.plasma(ipl / len(mf6_plines)), - ) + plot_results = False + if plot_results: + fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) + for a in ax: + a.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title="MF6 pathlines", + kind="line", + x="x", + y="y", + ax=ax[0], + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) - # plot mp7 pathlines in map view - pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - mp7_plines = mp7_pls.groupby(["particleid"]) - for ipl, (pid, pl) in enumerate(mp7_plines): - pl.plot( - title="MP7 pathlines", - kind="line", - x="x", - y="y", - ax=ax[1], - legend=False, - color=cm.plasma(ipl / len(mp7_plines)), - ) + # plot mp7 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mp7_plines = mp7_pls.groupby(["particleid"]) + for ipl, (pid, pl) in enumerate(mp7_plines): + pl.plot( + title="MP7 pathlines", + kind="line", + x="x", + y="y", + ax=ax[1], + legend=False, + color=cm.plasma(ipl / len(mp7_plines)), + ) - # view/save plot - # plt.show() - plt.savefig(ws / f"test_{simname}.png") + # view/save plot + plt.show() + plt.savefig(ws / f"test_{simname}.png") # convert mf6 pathlines to mp7 format mf6_pls = to_mp7_pathlines(mf6_pls) diff --git a/autotest/test_prt_stop_zones.py b/autotest/test_prt_stop_zones.py index f7c1f794bc0..a284fb01081 100644 --- a/autotest/test_prt_stop_zones.py +++ b/autotest/test_prt_stop_zones.py @@ -285,89 +285,91 @@ def check_output(idx, test): qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) # setup map view plot - fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) - for a in ax: - a.set_aspect("equal") - - # plot mf6 pathlines in map view - pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) - for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): - pl.plot( - title="MF6 pathlines", - kind="line", - x="x", - y="y", - ax=ax[0], - legend=False, - color=cm.plasma(ipl / len(mf6_plines)), - ) - - # plot mp7 pathlines in map view - pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - mp7_plines = mp7_pls.groupby(["particleid"]) - for ipl, (pid, pl) in enumerate(mp7_plines): - pl.plot( - title="MP7 pathlines", - kind="line", - x="x", - y="y", - ax=ax[1], - legend=False, - color=cm.plasma(ipl / len(mp7_plines)), - ) - - def sort_square_verts(verts): - """Sort 4 or more points on a square in clockwise order, starting with the top-left point""" - - # sort by y coordinate - verts.sort(key=lambda v: v[1], reverse=True) - - # separate top and bottom rows - y0 = verts[0][1] - t = [v for v in verts if v[1] == y0] - b = verts[len(t) :] - - # sort top and bottom rows by x coordinate - t.sort(key=lambda v: v[0]) - b.sort(key=lambda v: v[0]) - - # return vertices in clockwise order - return t + list(reversed(b)) + plot_results = False + if plot_results: + fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) + for a in ax: + a.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title="MF6 pathlines", + kind="line", + x="x", + y="y", + ax=ax[0], + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) - def plot_stop_zone(nn, ax): - ifaces = [] - iverts = mg.iverts[nn] + # plot mp7 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mp7_plines = mp7_pls.groupby(["particleid"]) + for ipl, (pid, pl) in enumerate(mp7_plines): + pl.plot( + title="MP7 pathlines", + kind="line", + x="x", + y="y", + ax=ax[1], + legend=False, + color=cm.plasma(ipl / len(mp7_plines)), + ) - # sort vertices of well cell in clockwise order - verts = [tuple(mg.verts[v]) for v in iverts] - sorted_verts = sort_square_verts(list(set(verts.copy()))) - for i in range(len(sorted_verts) - 1): - if i == 0: - p0 = sorted_verts[-1] - p1 = sorted_verts[i] + def sort_square_verts(verts): + """Sort 4 or more points on a square in clockwise order, starting with the top-left point""" + + # sort by y coordinate + verts.sort(key=lambda v: v[1], reverse=True) + + # separate top and bottom rows + y0 = verts[0][1] + t = [v for v in verts if v[1] == y0] + b = verts[len(t) :] + + # sort top and bottom rows by x coordinate + t.sort(key=lambda v: v[0]) + b.sort(key=lambda v: v[0]) + + # return vertices in clockwise order + return t + list(reversed(b)) + + def plot_stop_zone(nn, ax): + ifaces = [] + iverts = mg.iverts[nn] + + # sort vertices of well cell in clockwise order + verts = [tuple(mg.verts[v]) for v in iverts] + sorted_verts = sort_square_verts(list(set(verts.copy()))) + for i in range(len(sorted_verts) - 1): + if i == 0: + p0 = sorted_verts[-1] + p1 = sorted_verts[i] + ifaces.append([p0, p1]) + p0 = sorted_verts[i] + p1 = sorted_verts[(i + 1)] ifaces.append([p0, p1]) - p0 = sorted_verts[i] - p1 = sorted_verts[(i + 1)] - ifaces.append([p0, p1]) - lc = LineCollection(ifaces, color="red", lw=4) - ax.add_collection(lc) + lc = LineCollection(ifaces, color="red", lw=4) + ax.add_collection(lc) - # plot stop zones - for iz in stopzone_cells: - for a in ax: - plot_stop_zone(mg.get_node([iz])[0], a) + # plot stop zones + for iz in stopzone_cells: + for a in ax: + plot_stop_zone(mg.get_node([iz])[0], a) - # view/save plot - # plt.show() - plt.savefig(gwf_ws / f"test_{name}_map.png") + # view/save plot + plt.show() + plt.savefig(gwf_ws / f"test_{name}_map.png") # check that cell numbers are correct for i, row in list(mf6_pls.iterrows()): diff --git a/autotest/test_prt_track_events.py b/autotest/test_prt_track_events.py index 6f984731442..f0e8be98d8c 100644 --- a/autotest/test_prt_track_events.py +++ b/autotest/test_prt_track_events.py @@ -410,49 +410,51 @@ def all_equal(col, val): qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) # setup plot - fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) - for a in ax: - a.set_aspect("equal") - - # plot mf6 pathlines in map view - pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) - for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): - pl.plot( - title="MF6 pathlines", - marker="o", - markersize=2, - linestyle="None", - x="x", - y="y", - ax=ax[0], - legend=False, - color=cm.plasma(ipl / len(mf6_plines)), - ) + plot_results = False + if plot_results: + fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) + for a in ax: + a.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title="MF6 pathlines", + marker="o", + markersize=2, + linestyle="None", + x="x", + y="y", + ax=ax[0], + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) - # plot mp7 pathlines in map view - pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - mp7_plines = mp7_pls.groupby(["particleid"]) - for ipl, (pid, pl) in enumerate(mp7_plines): - pl.plot( - title="MP7 pathlines", - kind="line", - x="x", - y="y", - ax=ax[1], - legend=False, - color=cm.plasma(ipl / len(mp7_plines)), - ) + # plot mp7 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + mp7_plines = mp7_pls.groupby(["particleid"]) + for ipl, (pid, pl) in enumerate(mp7_plines): + pl.plot( + title="MP7 pathlines", + kind="line", + x="x", + y="y", + ax=ax[1], + legend=False, + color=cm.plasma(ipl / len(mp7_plines)), + ) - # view/save plot - # plt.show() - plt.savefig(gwf_ws / f"test_{simname}.png") + # view/save plot + plt.show() + plt.savefig(gwf_ws / f"test_{simname}.png") # check that cell numbers are correct for i, row in list(mf6_pls.iterrows()): diff --git a/autotest/test_prt_voronoi1.py b/autotest/test_prt_voronoi1.py index 05b408fce40..37a9d7d5d4d 100644 --- a/autotest/test_prt_voronoi1.py +++ b/autotest/test_prt_voronoi1.py @@ -531,9 +531,10 @@ def callback(mesh, value): p.add_mesh(path_mesh, label="Time", style="points", color="black") p.camera.zoom(1) p.add_slider_widget(lambda v: callback(path_mesh, v), [0, 30202]) - p.show() + # p.show() +@pytest.mark.slow @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets, benchmark): if ( diff --git a/autotest/test_prt_weak_sinks.py b/autotest/test_prt_weak_sinks.py index 1f83721d028..f69c3f11840 100644 --- a/autotest/test_prt_weak_sinks.py +++ b/autotest/test_prt_weak_sinks.py @@ -285,60 +285,62 @@ def all_equal(col, val): qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) # setup plot - fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) - for a in ax: - a.set_aspect("equal") - - # plot mf6 pathlines in map view - pmv = flopy.plot.PlotMapView(model=gwf, ax=ax[0]) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - pmv.plot_bc("WEL") - mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) - for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): - pl.plot( - title="MF6 pathlines", - kind="line", - x="x", - y="y", - ax=ax[0], - legend=False, - color=cm.plasma(ipl / len(mf6_plines)), - ) - - # plot mp7 pathlines in map view - pmv = flopy.plot.PlotMapView(model=gwf, ax=ax[1]) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - pmv.plot_bc("WEL") - mp7_plines = mp7_pls.groupby(["particleid"]) - for ipl, (pid, pl) in enumerate(mp7_plines): - pl.plot( - title="MP7 pathlines", - kind="line", - x="x", - y="y", - ax=ax[1], - legend=False, - color=cm.plasma(ipl / len(mp7_plines)), - ) - - # plot cell centers - # xc, yc = mg.get_xcellcenters_for_layer(0), mg.get_ycellcenters_for_layer(0) - # xc = xc.flatten() - # yc = yc.flatten() - # for i in range(mg.ncpl): - # x, y = xc[i], yc[i] - # nn = mg.get_node(mg.intersect(x, y, 0))[0] - # for a in ax: - # a.plot(x, y, "ro") - # a.annotate(str(nn + 1), (x, y), color="r") - - # view/save plot - # plt.show() - plt.savefig(gwf_ws / f"test_{simname}.png") + plot_results = False + if plot_results: + fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) + for a in ax: + a.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(model=gwf, ax=ax[0]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + pmv.plot_bc("WEL") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title="MF6 pathlines", + kind="line", + x="x", + y="y", + ax=ax[0], + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) + + # plot mp7 pathlines in map view + pmv = flopy.plot.PlotMapView(model=gwf, ax=ax[1]) + pmv.plot_grid() + pmv.plot_array(hds[0], alpha=0.1) + pmv.plot_vector(qx, qy, normalize=True, color="white") + pmv.plot_bc("WEL") + mp7_plines = mp7_pls.groupby(["particleid"]) + for ipl, (pid, pl) in enumerate(mp7_plines): + pl.plot( + title="MP7 pathlines", + kind="line", + x="x", + y="y", + ax=ax[1], + legend=False, + color=cm.plasma(ipl / len(mp7_plines)), + ) + + # plot cell centers + # xc, yc = mg.get_xcellcenters_for_layer(0), mg.get_ycellcenters_for_layer(0) + # xc = xc.flatten() + # yc = yc.flatten() + # for i in range(mg.ncpl): + # x, y = xc[i], yc[i] + # nn = mg.get_node(mg.intersect(x, y, 0))[0] + # for a in ax: + # a.plot(x, y, "ro") + # a.annotate(str(nn + 1), (x, y), color="r") + + # view/save plot + plt.show() + plt.savefig(gwf_ws / f"test_{simname}.png") # convert mf6 pathlines to mp7 format mf6_pls = to_mp7_pathlines(mf6_pls) From 0853c9f5129e9a7b504820292bf646cdbb9c0bb7 Mon Sep 17 00:00:00 2001 From: mjreno Date: Thu, 25 Apr 2024 08:22:26 -0400 Subject: [PATCH 128/199] refactor(export): include griddata block and array-based period parameters (#1723) * add enumeration type for discretizations * add get_dis_enum interface to dis types * add export_array_ascii option to additional packages * extend and refactor input export capability * add export_array_ascii tests for disv1d and dis2d * some cleanup * update export description for mf6io * assign exports as layered or not layered * remove export support for array-based input for now --------- Co-authored-by: mjreno --- autotest/test_gwf_npf01_75x75.py | 51 ++- autotest/test_swf_dfw_swrt2.py | 26 +- autotest/test_swf_vcatch.py | 35 +- doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn | 2 +- doc/mf6io/mf6ivar/dfn/gwe-dis.dfn | 2 +- doc/mf6io/mf6ivar/dfn/gwe-disu.dfn | 9 + doc/mf6io/mf6ivar/dfn/gwe-disv.dfn | 2 +- doc/mf6io/mf6ivar/dfn/gwe-ic.dfn | 2 +- doc/mf6io/mf6ivar/dfn/gwf-dis.dfn | 2 +- doc/mf6io/mf6ivar/dfn/gwf-disu.dfn | 9 + doc/mf6io/mf6ivar/dfn/gwf-disv.dfn | 2 +- doc/mf6io/mf6ivar/dfn/gwf-ic.dfn | 2 +- doc/mf6io/mf6ivar/dfn/gwf-npf.dfn | 2 +- doc/mf6io/mf6ivar/dfn/gwt-dis.dfn | 2 +- doc/mf6io/mf6ivar/dfn/gwt-disu.dfn | 9 + doc/mf6io/mf6ivar/dfn/gwt-disv.dfn | 2 +- doc/mf6io/mf6ivar/dfn/gwt-dsp.dfn | 2 +- doc/mf6io/mf6ivar/dfn/gwt-ic.dfn | 2 +- doc/mf6io/mf6ivar/dfn/prt-dis.dfn | 2 +- doc/mf6io/mf6ivar/dfn/prt-disv.dfn | 2 +- doc/mf6io/mf6ivar/dfn/prt-mip.dfn | 2 +- doc/mf6io/mf6ivar/dfn/swf-dfw.dfn | 10 +- doc/mf6io/mf6ivar/dfn/swf-dis2d.dfn | 2 +- doc/mf6io/mf6ivar/dfn/swf-disv1d.dfn | 4 +- doc/mf6io/mf6ivar/dfn/swf-disv2d.dfn | 2 +- doc/mf6io/mf6ivar/dfn/swf-ic.dfn | 2 +- src/Idm/gwe-disuidm.f90 | 19 + src/Idm/gwf-disuidm.f90 | 19 + src/Idm/gwt-disuidm.f90 | 19 + src/Idm/swf-dfwidm.f90 | 19 + src/Model/Discretization/Dis.f90 | 9 + src/Model/Discretization/Dis2d.f90 | 9 + src/Model/Discretization/Disu.f90 | 9 + src/Model/Discretization/Disv.f90 | 9 + src/Model/Discretization/Disv1d.f90 | 9 + .../ModelUtilities/DiscretizationBase.f90 | 12 + src/Utilities/Constants.f90 | 18 + src/Utilities/Idm/IdmLogger.f90 | 422 ++++++++++++++---- src/Utilities/Idm/SourceCommon.f90 | 28 +- .../Idm/mf6blockfile/LoadMf6File.f90 | 48 +- .../Idm/mf6blockfile/Mf6FileGridInput.f90 | 16 +- 41 files changed, 703 insertions(+), 151 deletions(-) diff --git a/autotest/test_gwf_npf01_75x75.py b/autotest/test_gwf_npf01_75x75.py index 9e125f7dfec..9565665f4ea 100644 --- a/autotest/test_gwf_npf01_75x75.py +++ b/autotest/test_gwf_npf01_75x75.py @@ -108,20 +108,17 @@ def build_models(idx, test): # initial conditions ic = flopy.mf6.ModflowGwfic( - gwf, - export_array_ascii=True, - strt=strt, - filename=f"{name}.ic" + gwf, export_array_ascii=True, strt=strt, filename=f"{name}.ic" ) # node property flow npf = flopy.mf6.ModflowGwfnpf( - gwf, + gwf, export_array_ascii=True, - save_flows=False, - icelltype=laytyp[idx], - k=hk, - k33=hk + save_flows=False, + icelltype=laytyp[idx], + k=hk, + k33=hk, ) # storage sto = flopy.mf6.ModflowGwfsto( @@ -210,17 +207,45 @@ def check_output(idx, test): # ensure export array is working properly name = cases[idx] - flist = ["dis.botm", "dis.idomain", "ic.strt", "npf.icelltype", "npf.k", "npf.k33"] - files = [pl.Path(ws / f"{name}-{f}.l1.txt") for f in flist] + layered = [ + "dis.botm", + "dis.idomain", + "ic.strt", + "npf.icelltype", + "npf.k", + "npf.k33", + ] + flist = [ + "dis.botm", + "dis.delc", + "dis.delr", + "dis.idomain", + "dis.top", + "ic.strt", + "npf.icelltype", + "npf.k", + "npf.k33", + ] + files = [ + ( + pl.Path(ws / f"{name}-{f}.l1.txt") + if f in layered + else pl.Path(ws / f"{name}-{f}.txt") + ) + for f in flist + ] gwf = test.sims[0].gwf[0] for i, fpth in enumerate(files): assert fpth.is_file(), f"Expected file does not exist: {fpth.name}" a = np.loadtxt(fpth) - array_name = flist[i][flist[i].index(".") + 1:] - package_name = flist[i][0:flist[i].index(".")] + array_name = flist[i][flist[i].index(".") + 1 :] + package_name = flist[i][0 : flist[i].index(".")] package = getattr(gwf, package_name) b = getattr(package, array_name).array assert np.allclose(a, b) + print(f"compared: {fpth}") + print(f"a={a}") + print(f"b={b}") return diff --git a/autotest/test_swf_dfw_swrt2.py b/autotest/test_swf_dfw_swrt2.py index 2f9beaf092d..5660b82e73d 100644 --- a/autotest/test_swf_dfw_swrt2.py +++ b/autotest/test_swf_dfw_swrt2.py @@ -12,7 +12,7 @@ """ import os - +import pathlib as pl import flopy import numpy as np import pytest @@ -89,6 +89,7 @@ def build_models(idx, test): disv1d = flopy.mf6.ModflowSwfdisv1D( swf, + export_array_ascii=True, nodes=nodes, nvert=nvert, length=dx, @@ -101,6 +102,7 @@ def build_models(idx, test): dfw = flopy.mf6.ModflowSwfdfw( swf, + export_array_ascii=True, print_flows=True, save_flows=True, manningsn=0.30, @@ -114,6 +116,7 @@ def build_models(idx, test): ic = flopy.mf6.ModflowSwfic( swf, + export_array_ascii=True, strt=2.05, ) @@ -223,6 +226,27 @@ def check_output(idx, test): depth, 1.0 ), f"Simulated depth at end should be 1, but found {depth}" + # ensure export array is working properly + flist = [ + "disv1d.length", + "disv1d.width", + "disv1d.bottom", + "disv1d.idomain", + "dfw.manningsn", + "ic.strt", + ] + files = [pl.Path(ws / f"{swfname}-{f}.txt") for f in flist] + swf = test.sims[0].swf[0] + for i, fpth in enumerate(files): + assert fpth.is_file(), f"Expected file does not exist: {fpth.name}" + a = np.loadtxt(fpth) + array_name = flist[i][flist[i].index(".") + 1 :] + package_name = flist[i][0 : flist[i].index(".")] + package = getattr(swf, package_name) + b = getattr(package, array_name).array + assert np.allclose(a, b) + return + @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): diff --git a/autotest/test_swf_vcatch.py b/autotest/test_swf_vcatch.py index 9cf0bc9d903..17aea3d32ca 100644 --- a/autotest/test_swf_vcatch.py +++ b/autotest/test_swf_vcatch.py @@ -8,7 +8,7 @@ """ import os - +import pathlib as pl import flopy import numpy as np import pytest @@ -123,6 +123,7 @@ def build_models(idx, test): botm = land_surface.reshape((nrow, ncol)) dis = flopy.mf6.ModflowSwfdis2D( swf, + export_array_ascii=True, nrow=nrow, ncol=ncol, delr=dx, @@ -136,6 +137,7 @@ def build_models(idx, test): dfw = flopy.mf6.ModflowSwfdfw( swf, + export_array_ascii=True, print_flows=False, save_flows=True, manningsn=rough, @@ -151,6 +153,7 @@ def build_models(idx, test): ic = flopy.mf6.ModflowSwfic( swf, + export_array_ascii=True, strt=botm, ) @@ -190,9 +193,7 @@ def build_models(idx, test): idcxs = -1 # use cross section 0 width = dx - spd = [ - ((nrow - 1, int(ncol / 2)), idcxs, width, slope_y, rough_channel) - ] + spd = [((nrow - 1, int(ncol / 2)), idcxs, width, slope_y, rough_channel)] zdg = flopy.mf6.ModflowSwfzdg( swf, observations=zdg_obs, @@ -264,10 +265,32 @@ def check_output(idx, test): outflow_answer = 4.859497719 # outflow value at end of first period idx = np.where(obsvals["time"] == 5400.0) outflow_sim = -obsvals["OUTFLOW"][idx] - msg = (f"Simulated outflow at end of period should be {outflow_answer} " - f"but found {outflow_sim}") + msg = ( + f"Simulated outflow at end of period should be {outflow_answer} " + f"but found {outflow_sim}" + ) assert np.allclose(outflow_answer, outflow_sim, atol=0.001), msg + # ensure export array is working properly + flist = [ + "dis2d.botm", + "dis2d.delc", + "dis2d.delr", + "dfw.manningsn", + "ic.strt", + ] + files = [pl.Path(ws / f"{swfname}-{f}.txt") for f in flist] + swf = test.sims[0].swf[0] + for i, fpth in enumerate(files): + assert fpth.is_file(), f"Expected file does not exist: {fpth.name}" + a = np.loadtxt(fpth) + array_name = flist[i][flist[i].index(".") + 1 :] + package_name = flist[i][0 : flist[i].index(".")] + package = getattr(swf, package_name) + b = getattr(package, array_name).array + assert np.allclose(a, b) + return + @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): diff --git a/doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn b/doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn index 28d0865f51a..6a45cbac414 100644 --- a/doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn @@ -25,7 +25,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- gwe cnd griddata --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/gwe-dis.dfn b/doc/mf6io/mf6ivar/dfn/gwe-dis.dfn index c3284d4a918..2326105aa04 100644 --- a/doc/mf6io/mf6ivar/dfn/gwe-dis.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwe-dis.dfn @@ -47,7 +47,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- gwe dis dimensions --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/gwe-disu.dfn b/doc/mf6io/mf6ivar/dfn/gwe-disu.dfn index 4bf78998fa4..1b2035600ad 100644 --- a/doc/mf6io/mf6ivar/dfn/gwe-disu.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwe-disu.dfn @@ -50,6 +50,15 @@ longname vertical length dimension for top and bottom checking description checks are performed to ensure that the top of a cell is not higher than the bottom of an overlying cell. This option can be used to specify the tolerance that is used for checking. If top of a cell is above the bottom of an overlying cell by a value less than this tolerance, then the program will not terminate with an error. The default value is zero. This option should generally not be used. mf6internal voffsettol +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. + # --------------------- gwe disu dimensions --------------------- block dimensions diff --git a/doc/mf6io/mf6ivar/dfn/gwe-disv.dfn b/doc/mf6io/mf6ivar/dfn/gwe-disv.dfn index 05b46f96241..ff91ef0cfd8 100644 --- a/doc/mf6io/mf6ivar/dfn/gwe-disv.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwe-disv.dfn @@ -47,7 +47,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- gwe disv dimensions --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/gwe-ic.dfn b/doc/mf6io/mf6ivar/dfn/gwe-ic.dfn index 1b3d08ec490..6bd80b3de63 100644 --- a/doc/mf6io/mf6ivar/dfn/gwe-ic.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwe-ic.dfn @@ -7,7 +7,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- gwe ic griddata --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/gwf-dis.dfn b/doc/mf6io/mf6ivar/dfn/gwf-dis.dfn index 26569f3d701..4406a57be44 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-dis.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-dis.dfn @@ -47,7 +47,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- gwf dis dimensions --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/gwf-disu.dfn b/doc/mf6io/mf6ivar/dfn/gwf-disu.dfn index dabf4411afc..be7be430a61 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-disu.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-disu.dfn @@ -50,6 +50,15 @@ longname vertical length dimension for top and bottom checking description checks are performed to ensure that the top of a cell is not higher than the bottom of an overlying cell. This option can be used to specify the tolerance that is used for checking. If top of a cell is above the bottom of an overlying cell by a value less than this tolerance, then the program will not terminate with an error. The default value is zero. This option should generally not be used. mf6internal voffsettol +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. + # --------------------- gwf disu dimensions --------------------- block dimensions diff --git a/doc/mf6io/mf6ivar/dfn/gwf-disv.dfn b/doc/mf6io/mf6ivar/dfn/gwf-disv.dfn index ec685f7ba84..17152994f5f 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-disv.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-disv.dfn @@ -47,7 +47,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- gwf disv dimensions --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/gwf-ic.dfn b/doc/mf6io/mf6ivar/dfn/gwf-ic.dfn index dd4560f6ccb..de93f781c33 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-ic.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-ic.dfn @@ -7,7 +7,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- gwf ic griddata --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/gwf-npf.dfn b/doc/mf6io/mf6ivar/dfn/gwf-npf.dfn index f35b3527877..23cb314c2ab 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-npf.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-npf.dfn @@ -231,7 +231,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # dev options diff --git a/doc/mf6io/mf6ivar/dfn/gwt-dis.dfn b/doc/mf6io/mf6ivar/dfn/gwt-dis.dfn index 4c8a94de344..ac03a5e1a3f 100644 --- a/doc/mf6io/mf6ivar/dfn/gwt-dis.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwt-dis.dfn @@ -47,7 +47,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- gwt dis dimensions --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/gwt-disu.dfn b/doc/mf6io/mf6ivar/dfn/gwt-disu.dfn index 0c3a26fb148..49fd5aa5eaa 100644 --- a/doc/mf6io/mf6ivar/dfn/gwt-disu.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwt-disu.dfn @@ -50,6 +50,15 @@ longname vertical length dimension for top and bottom checking description checks are performed to ensure that the top of a cell is not higher than the bottom of an overlying cell. This option can be used to specify the tolerance that is used for checking. If top of a cell is above the bottom of an overlying cell by a value less than this tolerance, then the program will not terminate with an error. The default value is zero. This option should generally not be used. mf6internal voffsettol +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. + # --------------------- gwt disu dimensions --------------------- block dimensions diff --git a/doc/mf6io/mf6ivar/dfn/gwt-disv.dfn b/doc/mf6io/mf6ivar/dfn/gwt-disv.dfn index 062fb01f169..b06062b6f93 100644 --- a/doc/mf6io/mf6ivar/dfn/gwt-disv.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwt-disv.dfn @@ -47,7 +47,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- gwt disv dimensions --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/gwt-dsp.dfn b/doc/mf6io/mf6ivar/dfn/gwt-dsp.dfn index 1ec2fec57a7..0b425db955e 100644 --- a/doc/mf6io/mf6ivar/dfn/gwt-dsp.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwt-dsp.dfn @@ -25,7 +25,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- gwt dsp griddata --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/gwt-ic.dfn b/doc/mf6io/mf6ivar/dfn/gwt-ic.dfn index 51605cefdd8..d6d113d5c55 100644 --- a/doc/mf6io/mf6ivar/dfn/gwt-ic.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwt-ic.dfn @@ -7,7 +7,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- gwt ic griddata --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/prt-dis.dfn b/doc/mf6io/mf6ivar/dfn/prt-dis.dfn index 9a37d7a4f61..7d4724f0aed 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-dis.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-dis.dfn @@ -47,7 +47,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- prt dis dimensions --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/prt-disv.dfn b/doc/mf6io/mf6ivar/dfn/prt-disv.dfn index d2f238c644c..1bec85b5a7b 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-disv.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-disv.dfn @@ -47,7 +47,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- prt disv dimensions --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/prt-mip.dfn b/doc/mf6io/mf6ivar/dfn/prt-mip.dfn index a993a10d410..0448d2249cc 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-mip.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-mip.dfn @@ -15,7 +15,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- prt mip griddata --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn b/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn index 0d82a2eb352..0eef8d71b2e 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-dfw.dfn @@ -97,6 +97,15 @@ optional false longname obs6 input filename description REPLACE obs6_filename {'{#1}': 'DFW'} +block options +name export_array_ascii +type keyword +reader urword +optional true +mf6internal export_ascii +longname export array variables to layered ascii files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. + # dev options block options @@ -108,7 +117,6 @@ longname use SWR conductance formulation description use the conductance formulation in the Surface Water Routing (SWR) Process for MODFLOW-2005. mf6internal iswrcond - # --------------------- swf dfw griddata --------------------- block griddata diff --git a/doc/mf6io/mf6ivar/dfn/swf-dis2d.dfn b/doc/mf6io/mf6ivar/dfn/swf-dis2d.dfn index b82e31abc93..96b1837b572 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-dis2d.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-dis2d.dfn @@ -47,7 +47,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- swf dis2d dimensions --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/swf-disv1d.dfn b/doc/mf6io/mf6ivar/dfn/swf-disv1d.dfn index 84fcc63e939..8e6b3c10f69 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-disv1d.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-disv1d.dfn @@ -47,7 +47,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- swf disv1d dimensions --------------------- @@ -207,4 +207,4 @@ reader urword optional false longname number of cell vertices description is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC. -numeric_index true \ No newline at end of file +numeric_index true diff --git a/doc/mf6io/mf6ivar/dfn/swf-disv2d.dfn b/doc/mf6io/mf6ivar/dfn/swf-disv2d.dfn index e9b41acabc4..37f17f7f4b2 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-disv2d.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-disv2d.dfn @@ -47,7 +47,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- swf disv2d dimensions --------------------- diff --git a/doc/mf6io/mf6ivar/dfn/swf-ic.dfn b/doc/mf6io/mf6ivar/dfn/swf-ic.dfn index a06580e3ed8..5462ac7a29c 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-ic.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-ic.dfn @@ -7,7 +7,7 @@ reader urword optional true mf6internal export_ascii longname export array variables to layered ascii files. -description keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +description keyword that specifies input griddata arrays should be written to layered ascii output files. # --------------------- swf ic griddata --------------------- diff --git a/src/Idm/gwe-disuidm.f90 b/src/Idm/gwe-disuidm.f90 index 4e61f3935b2..70e6553516b 100644 --- a/src/Idm/gwe-disuidm.f90 +++ b/src/Idm/gwe-disuidm.f90 @@ -17,6 +17,7 @@ module GweDisuInputModule logical :: yorigin = .false. logical :: angrot = .false. logical :: voffsettol = .false. + logical :: export_ascii = .false. logical :: nodes = .false. logical :: nja = .false. logical :: nvert = .false. @@ -144,6 +145,23 @@ module GweDisuInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + gwedisu_export_ascii = InputParamDefinitionType & + ( & + 'GWE', & ! component + 'DISU', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & gwedisu_nodes = InputParamDefinitionType & ( & @@ -510,6 +528,7 @@ module GweDisuInputModule gwedisu_yorigin, & gwedisu_angrot, & gwedisu_voffsettol, & + gwedisu_export_ascii, & gwedisu_nodes, & gwedisu_nja, & gwedisu_nvert, & diff --git a/src/Idm/gwf-disuidm.f90 b/src/Idm/gwf-disuidm.f90 index 7f09d38be19..f3a82ea63cc 100644 --- a/src/Idm/gwf-disuidm.f90 +++ b/src/Idm/gwf-disuidm.f90 @@ -17,6 +17,7 @@ module GwfDisuInputModule logical :: yorigin = .false. logical :: angrot = .false. logical :: voffsettol = .false. + logical :: export_ascii = .false. logical :: nodes = .false. logical :: nja = .false. logical :: nvert = .false. @@ -144,6 +145,23 @@ module GwfDisuInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + gwfdisu_export_ascii = InputParamDefinitionType & + ( & + 'GWF', & ! component + 'DISU', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & gwfdisu_nodes = InputParamDefinitionType & ( & @@ -510,6 +528,7 @@ module GwfDisuInputModule gwfdisu_yorigin, & gwfdisu_angrot, & gwfdisu_voffsettol, & + gwfdisu_export_ascii, & gwfdisu_nodes, & gwfdisu_nja, & gwfdisu_nvert, & diff --git a/src/Idm/gwt-disuidm.f90 b/src/Idm/gwt-disuidm.f90 index 9b552f60f11..2315f4aafff 100644 --- a/src/Idm/gwt-disuidm.f90 +++ b/src/Idm/gwt-disuidm.f90 @@ -17,6 +17,7 @@ module GwtDisuInputModule logical :: yorigin = .false. logical :: angrot = .false. logical :: voffsettol = .false. + logical :: export_ascii = .false. logical :: nodes = .false. logical :: nja = .false. logical :: nvert = .false. @@ -144,6 +145,23 @@ module GwtDisuInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + gwtdisu_export_ascii = InputParamDefinitionType & + ( & + 'GWT', & ! component + 'DISU', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & gwtdisu_nodes = InputParamDefinitionType & ( & @@ -510,6 +528,7 @@ module GwtDisuInputModule gwtdisu_yorigin, & gwtdisu_angrot, & gwtdisu_voffsettol, & + gwtdisu_export_ascii, & gwtdisu_nodes, & gwtdisu_nja, & gwtdisu_nvert, & diff --git a/src/Idm/swf-dfwidm.f90 b/src/Idm/swf-dfwidm.f90 index 4e07411b58f..75b9692fd2e 100644 --- a/src/Idm/swf-dfwidm.f90 +++ b/src/Idm/swf-dfwidm.f90 @@ -21,6 +21,7 @@ module SwfDfwInputModule logical :: obs6 = .false. logical :: filein = .false. logical :: obs6_filename = .false. + logical :: export_ascii = .false. logical :: iswrcond = .false. logical :: manningsn = .false. logical :: idcxs = .false. @@ -198,6 +199,23 @@ module SwfDfwInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + swfdfw_export_ascii = InputParamDefinitionType & + ( & + 'SWF', & ! component + 'DFW', & ! subcomponent + 'OPTIONS', & ! block + 'EXPORT_ARRAY_ASCII', & ! tag name + 'EXPORT_ASCII', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & swfdfw_iswrcond = InputParamDefinitionType & ( & @@ -262,6 +280,7 @@ module SwfDfwInputModule swfdfw_obs6, & swfdfw_filein, & swfdfw_obs6_filename, & + swfdfw_export_ascii, & swfdfw_iswrcond, & swfdfw_manningsn, & swfdfw_idcxs & diff --git a/src/Model/Discretization/Dis.f90 b/src/Model/Discretization/Dis.f90 index cd9bc86f349..2fd92e3bbe9 100644 --- a/src/Model/Discretization/Dis.f90 +++ b/src/Model/Discretization/Dis.f90 @@ -38,6 +38,7 @@ module DisModule procedure :: dis_df => dis3d_df procedure :: dis_da => dis3d_da procedure :: get_dis_type => get_dis_type + procedure :: get_dis_enum => get_dis_enum procedure, public :: record_array procedure, public :: read_layer_array procedure, public :: record_srcdst_list_header @@ -1171,6 +1172,14 @@ subroutine get_dis_type(this, dis_type) ! end subroutine get_dis_type + !> @brief Get the discretization type enumeration + function get_dis_enum(this) result(dis_enum) + use ConstantsModule, only: DIS + class(DisType), intent(in) :: this + integer(I4B) :: dis_enum + dis_enum = DIS + end function get_dis_enum + !> @brief Get a 2D array of polygon vertices, listed in !! !! clockwise order beginning with the lower left corner diff --git a/src/Model/Discretization/Dis2d.f90 b/src/Model/Discretization/Dis2d.f90 index 20afa460439..490dd003715 100644 --- a/src/Model/Discretization/Dis2d.f90 +++ b/src/Model/Discretization/Dis2d.f90 @@ -35,6 +35,7 @@ module Dis2dModule procedure :: dis_df => dis3d_df procedure :: dis_da => dis3d_da procedure :: get_dis_type => get_dis_type + procedure :: get_dis_enum => get_dis_enum procedure, public :: record_array procedure, public :: read_layer_array procedure, public :: record_srcdst_list_header @@ -1059,6 +1060,14 @@ subroutine get_dis_type(this, dis_type) ! end subroutine get_dis_type + !> @brief Get the discretization type enumeration + function get_dis_enum(this) result(dis_enum) + use ConstantsModule, only: DIS2D + class(Dis2dType), intent(in) :: this + integer(I4B) :: dis_enum + dis_enum = DIS2D + end function get_dis_enum + !> @brief Get a 2D array of polygon vertices, listed in !! !! clockwise order beginning with the lower left corner diff --git a/src/Model/Discretization/Disu.f90 b/src/Model/Discretization/Disu.f90 index 0a24483f4f1..282816d5304 100644 --- a/src/Model/Discretization/Disu.f90 +++ b/src/Model/Discretization/Disu.f90 @@ -52,6 +52,7 @@ module DisuModule procedure :: disu_load procedure :: dis_da => disu_da procedure :: get_dis_type => get_dis_type + procedure :: get_dis_enum => get_dis_enum procedure :: disu_ck procedure :: grid_finalize procedure :: get_nodenumber_idx1 @@ -1169,6 +1170,14 @@ subroutine get_dis_type(this, dis_type) ! end subroutine get_dis_type + !> @brief Get the discretization type enumeration + function get_dis_enum(this) result(dis_enum) + use ConstantsModule, only: DISU + class(DisuType), intent(in) :: this + integer(I4B) :: dis_enum + dis_enum = DISU + end function get_dis_enum + !> @brief Allocate and initialize scalar variables !< subroutine allocate_scalars(this, name_model, input_mempath) diff --git a/src/Model/Discretization/Disv.f90 b/src/Model/Discretization/Disv.f90 index 846539d7248..3d900f6fdd3 100644 --- a/src/Model/Discretization/Disv.f90 +++ b/src/Model/Discretization/Disv.f90 @@ -39,6 +39,7 @@ module DisvModule procedure :: dis_da => disv_da procedure :: disv_load procedure :: get_dis_type => get_dis_type + procedure :: get_dis_enum => get_dis_enum procedure, public :: record_array procedure, public :: read_layer_array procedure, public :: record_srcdst_list_header @@ -1089,6 +1090,14 @@ subroutine get_dis_type(this, dis_type) ! end subroutine get_dis_type + !> @brief Get the discretization type enumeration + function get_dis_enum(this) result(dis_enum) + use ConstantsModule, only: DISV + class(DisvType), intent(in) :: this + integer(I4B) :: dis_enum + dis_enum = DISV + end function get_dis_enum + !> @brief Allocate and initialize scalars !< subroutine allocate_scalars(this, name_model, input_mempath) diff --git a/src/Model/Discretization/Disv1d.f90 b/src/Model/Discretization/Disv1d.f90 index 614075feb57..2717e984531 100644 --- a/src/Model/Discretization/Disv1d.f90 +++ b/src/Model/Discretization/Disv1d.f90 @@ -34,6 +34,7 @@ module Disv1dModule procedure :: dis_df => disv1d_df procedure :: dis_da => disv1d_da procedure :: get_dis_type => get_dis_type + procedure :: get_dis_enum => get_dis_enum procedure :: get_flow_width => get_flow_width procedure, public :: record_array procedure, public :: record_srcdst_list_header @@ -224,6 +225,14 @@ subroutine get_dis_type(this, dis_type) dis_type = "DISV1D" end subroutine get_dis_type + !> @brief Get the discretization type enumeration + function get_dis_enum(this) result(dis_enum) + use ConstantsModule, only: DISV1D + class(Disv1dType), intent(in) :: this + integer(I4B) :: dis_enum + dis_enum = DISV1D + end function get_dis_enum + !> @brief Allocate scalar variables !< subroutine allocate_scalars(this, name_model, input_mempath) diff --git a/src/Model/ModelUtilities/DiscretizationBase.f90 b/src/Model/ModelUtilities/DiscretizationBase.f90 index 30b2b26944e..05151ad9dbd 100644 --- a/src/Model/ModelUtilities/DiscretizationBase.f90 +++ b/src/Model/ModelUtilities/DiscretizationBase.f90 @@ -82,6 +82,7 @@ module BaseDisModule procedure :: connection_normal procedure :: connection_vector procedure :: get_dis_type + procedure :: get_dis_enum procedure :: supports_layers procedure :: allocate_scalars procedure :: allocate_arrays @@ -377,6 +378,17 @@ subroutine get_dis_type(this, dis_type) terminate=.true.) end subroutine get_dis_type + !> @brief Get the discretization type enumeration + function get_dis_enum(this) result(dis_enum) + use ConstantsModule, only: DISUNDEF + class(DisBaseType), intent(in) :: this + integer(I4B) :: dis_enum + + dis_enum = DISUNDEF + call store_error('Programmer error: get_dis_enum must be overridden', & + terminate=.true.) + end function get_dis_enum + !> @brief Allocate and initialize scalar variables subroutine allocate_scalars(this, name_model, input_mempath) ! -- dummy diff --git a/src/Utilities/Constants.f90 b/src/Utilities/Constants.f90 index 619322f4ab2..4983c7f3744 100644 --- a/src/Utilities/Constants.f90 +++ b/src/Utilities/Constants.f90 @@ -145,6 +145,24 @@ module ConstantsModule ENUMERATOR :: LINEAREND = 3 !< linear end interpolation END ENUM + !> @brief enumerator associated with Discretization types + !< + ENUM, BIND(C) + ENUMERATOR :: DISUNDEF = 0 !< undefined discretization + ! -- 3D (base) discretizations + ENUMERATOR :: DIS = 1 !< DIS6 discretization + ENUMERATOR :: DISV = 2 !< DISU6 discretization + ENUMERATOR :: DISU = 3 !< DISV6 discretization + ! -- 1D discretizations + ENUMERATOR :: DIS1D = 101 !< DIS1D6 discretization + ENUMERATOR :: DISV1D = 102 !< DISV1D6 discretization + ENUMERATOR :: DISU1D = 103 !< DISU1D6 discretization + ! -- 2D discretizations + ENUMERATOR :: DIS2D = 201 !< DIS2D6 discretization + ENUMERATOR :: DISV2D = 202 !< DISV2D6 discretization + ENUMERATOR :: DISU2D = 203 !< DISU2D6 discretization + END ENUM + !> @brief enumerator used with table objects !< ENUM, BIND(C) diff --git a/src/Utilities/Idm/IdmLogger.f90 b/src/Utilities/Idm/IdmLogger.f90 index 908c347fa4f..8abe33ba633 100644 --- a/src/Utilities/Idm/IdmLogger.f90 +++ b/src/Utilities/Idm/IdmLogger.f90 @@ -7,8 +7,10 @@ module IdmLoggerModule use KindModule, only: DP, LGP, I4B - use SimVariablesModule, only: iparamlog - use ConstantsModule, only: LINELENGTH + use SimVariablesModule, only: iparamlog, errmsg, idm_context + use SimModule, only: store_error + use ConstantsModule, only: LINELENGTH, LENMEMPATH, LENCOMPONENTNAME, & + DISUNDEF, DIS, DISV, DISU, DIS2D, DISV1D implicit none private @@ -333,98 +335,195 @@ end subroutine idm_log_var_str !> @brief Create export file int1d !! - !! export layered int1d parameters with NODES shape + !! export layered int1d parameter files !! !< - subroutine idm_export_int1d(p_mem, varname, mempath, iout) - use SimVariablesModule, only: idm_context - use ConstantsModule, only: LENMEMPATH, LENCOMPONENTNAME + subroutine idm_export_int1d(p_mem, varname, mempath, shapestr, iout) use MemoryManagerModule, only: mem_setptr use MemoryHelperModule, only: create_mem_path, split_mem_path integer(I4B), dimension(:), contiguous, intent(in) :: p_mem !< 1d integer array character(len=*), intent(in) :: varname !< variable name character(len=*), intent(in) :: mempath !< variable memory path + character(len=*), intent(in) :: shapestr !< dfn shape string integer(I4B), intent(in) :: iout ! -- dummy integer(I4B), dimension(:), pointer, contiguous :: model_shape integer(I4B), dimension(:, :, :), pointer, contiguous :: int3d integer(I4B), dimension(:, :), pointer, contiguous :: int2d - integer(I4B), dimension(3) :: dis_shape - integer(I4B), dimension(2) :: disv_shape + integer(I4B), dimension(3) :: dis3d_shape + integer(I4B), dimension(2) :: dis2d_shape + integer(I4B), pointer :: distype character(LENMEMPATH) :: input_mempath character(LENCOMPONENTNAME) :: comp, subcomp - integer(I4B) :: i, j, k, inunit + integer(I4B) :: i, j, k, inunit, export_dim + logical(LGP) :: is_layered ! + ! -- set pointer to DISENUM and MODEL_SHAPE call split_mem_path(mempath, comp, subcomp) input_mempath = create_mem_path(component=comp, context=idm_context) + call mem_setptr(distype, 'DISENUM', input_mempath) call mem_setptr(model_shape, 'MODEL_SHAPE', input_mempath) ! - if (size(model_shape) == 3) then - dis_shape(1) = model_shape(3) - dis_shape(2) = model_shape(2) - dis_shape(3) = model_shape(1) - allocate (int3d(dis_shape(1), dis_shape(2), dis_shape(3))) - int3d = reshape(p_mem, dis_shape) - do k = 1, dis_shape(3) + ! -- set export_dim + export_dim = distype_export_dim(distype, shapestr, is_layered) + ! + ! -- create export file(s) + select case (export_dim) + case (3) + ! -- set reshape array + dis3d_shape(1) = model_shape(3) + dis3d_shape(2) = model_shape(2) + dis3d_shape(3) = model_shape(1) + ! -- allocate and reshape + allocate (int3d(dis3d_shape(1), dis3d_shape(2), dis3d_shape(3))) + int3d = reshape(p_mem, dis3d_shape) + ! -- write export files 3D array + do k = 1, dis3d_shape(3) inunit = create_export_file(varname, mempath, k, iout) do i = 1, model_shape(2) write (inunit, '(*(i0, " "))') (int3d(j, i, k), j=1, & - dis_shape(1)) + dis3d_shape(1)) end do close (inunit) end do + ! -- cleanup deallocate (int3d) - else if (size(model_shape) == 2) then - disv_shape(1) = model_shape(2) - disv_shape(2) = model_shape(1) - allocate (int2d(disv_shape(1), disv_shape(2))) - int2d = reshape(p_mem, disv_shape) - do i = 1, disv_shape(2) - inunit = create_export_file(varname, mempath, i, iout) - write (inunit, '(*(i0, " "))') (int2d(j, i), j=1, disv_shape(1)) + case (2) + ! -- set reshape array + dis2d_shape(1) = model_shape(2) + dis2d_shape(2) = model_shape(1) + ! -- allocate and reshape + allocate (int2d(dis2d_shape(1), dis2d_shape(2))) + int2d = reshape(p_mem, dis2d_shape) + if (is_layered) then + ! -- write layered export files 2D array + do i = 1, dis2d_shape(2) + inunit = create_export_file(varname, mempath, i, iout) + write (inunit, '(*(i0, " "))') (int2d(j, i), j=1, dis2d_shape(1)) + close (inunit) + end do + else + ! -- write export file 2D array + inunit = create_export_file(varname, mempath, 0, iout) + do i = 1, dis2d_shape(2) + write (inunit, '(*(i0, " "))') (int2d(j, i), j=1, dis2d_shape(1)) + end do close (inunit) - end do - else if (size(model_shape) == 1) then + end if + ! -- cleanup + deallocate (int2d) + case (1) + ! -- write export file 1D array inunit = create_export_file(varname, mempath, 0, iout) write (inunit, '(*(i0, " "))') p_mem close (inunit) - end if + case default + write (errmsg, '(a,i0)') 'EXPORT unsupported int1d export_dim=', & + export_dim + call store_error(errmsg, .true.) + end select end subroutine idm_export_int1d !> @brief Create export file int2d !< - subroutine idm_export_int2d(p_mem, varname, mempath, iout) + subroutine idm_export_int2d(p_mem, varname, mempath, shapestr, iout) + use MemoryManagerModule, only: mem_setptr + use MemoryHelperModule, only: create_mem_path, split_mem_path integer(I4B), dimension(:, :), contiguous, intent(in) :: p_mem !< 2d dbl array character(len=*), intent(in) :: varname !< variable name character(len=*), intent(in) :: mempath !< variable memory path + character(len=*), intent(in) :: shapestr !< dfn shape string integer(I4B), intent(in) :: iout ! -- dummy - integer(I4B) :: i, j, inunit + integer(I4B), dimension(:), pointer, contiguous :: model_shape + integer(I4B), pointer :: distype + character(LENMEMPATH) :: input_mempath + character(LENCOMPONENTNAME) :: comp, subcomp + integer(I4B) :: i, j, inunit, export_dim + logical(LGP) :: is_layered ! - do i = 1, size(p_mem, dim=2) - inunit = create_export_file(varname, mempath, i, iout) - write (inunit, '(*(i0, " "))') (p_mem(j, i), j=1, size(p_mem, dim=1)) + ! -- set pointer to DISENUM + call split_mem_path(mempath, comp, subcomp) + input_mempath = create_mem_path(component=comp, context=idm_context) + call mem_setptr(distype, 'DISENUM', input_mempath) + call mem_setptr(model_shape, 'MODEL_SHAPE', input_mempath) + ! + ! -- set export_dim + export_dim = distype_export_dim(distype, shapestr, is_layered) + ! + select case (export_dim) + case (1) + ! -- write export file 1D array + inunit = create_export_file(varname, mempath, 0, iout) + do i = 1, size(p_mem, dim=2) + write (inunit, '(*(i0, " "))') (p_mem(j, i), j=1, size(p_mem, dim=1)) + end do close (inunit) - end do + case (2) + if (is_layered) then + ! -- write layered export files 2D array + do i = 1, size(p_mem, dim=2) + inunit = create_export_file(varname, mempath, i, iout) + write (inunit, '(*(i0, " "))') (p_mem(j, i), j=1, size(p_mem, dim=1)) + close (inunit) + end do + else + ! -- write export file 2D array + inunit = create_export_file(varname, mempath, 0, iout) + do i = 1, size(p_mem, dim=2) + write (inunit, '(*(i0, " "))') (p_mem(j, i), j=1, size(p_mem, dim=1)) + end do + close (inunit) + end if + case default + write (errmsg, '(a,i0)') 'EXPORT unsupported int2d export_dim=', & + export_dim + call store_error(errmsg, .true.) + end select end subroutine idm_export_int2d !> @brief Create export file int3d !< - subroutine idm_export_int3d(p_mem, varname, mempath, iout) + subroutine idm_export_int3d(p_mem, varname, mempath, shapestr, iout) + use MemoryManagerModule, only: mem_setptr + use MemoryHelperModule, only: create_mem_path, split_mem_path integer(I4B), dimension(:, :, :), contiguous, intent(in) :: p_mem !< 2d dbl array character(len=*), intent(in) :: varname !< variable name character(len=*), intent(in) :: mempath !< variable memory path + character(len=*), intent(in) :: shapestr !< dfn shape string integer(I4B), intent(in) :: iout ! -- dummy - integer(I4B) :: i, j, k, inunit + integer(I4B), dimension(:), pointer, contiguous :: model_shape + integer(I4B), pointer :: distype + character(LENMEMPATH) :: input_mempath + character(LENCOMPONENTNAME) :: comp, subcomp + integer(I4B) :: i, j, k, inunit, export_dim + logical(LGP) :: is_layered ! - do k = 1, size(p_mem, dim=3) - inunit = create_export_file(varname, mempath, k, iout) - do i = 1, size(p_mem, dim=2) - write (inunit, '(*(i0, " "))') (p_mem(j, i, k), j=1, size(p_mem, dim=1)) + ! -- set pointer to DISENUM + call split_mem_path(mempath, comp, subcomp) + input_mempath = create_mem_path(component=comp, context=idm_context) + call mem_setptr(distype, 'DISENUM', input_mempath) + call mem_setptr(model_shape, 'MODEL_SHAPE', input_mempath) + ! + ! -- set export_dim + export_dim = distype_export_dim(distype, shapestr, is_layered) + ! + select case (export_dim) + case (3) + ! -- write export files 3D array + do k = 1, size(p_mem, dim=3) + inunit = create_export_file(varname, mempath, k, iout) + do i = 1, size(p_mem, dim=2) + write (inunit, '(*(i0, " "))') (p_mem(j, i, k), j=1, size(p_mem, dim=1)) + end do + close (inunit) end do - close (inunit) - end do + case default + write (errmsg, '(a,i0)') 'EXPORT unsupported int3d export_dim=', & + export_dim + call store_error(errmsg, .true.) + end select end subroutine idm_export_int3d !> @brief Create export file dbl1d @@ -432,105 +531,256 @@ end subroutine idm_export_int3d !! export layered dbl1d parameters with NODES shape !! !< - subroutine idm_export_dbl1d(p_mem, varname, mempath, iout) - use SimVariablesModule, only: idm_context - use ConstantsModule, only: LENMEMPATH, LENCOMPONENTNAME + subroutine idm_export_dbl1d(p_mem, varname, mempath, shapestr, iout) use MemoryManagerModule, only: mem_setptr use MemoryHelperModule, only: create_mem_path, split_mem_path real(DP), dimension(:), contiguous, intent(in) :: p_mem !< 1d dbl array character(len=*), intent(in) :: varname !< variable name character(len=*), intent(in) :: mempath !< variable memory path + character(len=*), intent(in) :: shapestr !< dfn shape string integer(I4B), intent(in) :: iout ! -- dummy integer(I4B), dimension(:), pointer, contiguous :: model_shape real(DP), dimension(:, :, :), pointer, contiguous :: dbl3d real(DP), dimension(:, :), pointer, contiguous :: dbl2d - integer(I4B), dimension(3) :: dis_shape - integer(I4B), dimension(2) :: disv_shape + integer(I4B), dimension(3) :: dis3d_shape + integer(I4B), dimension(2) :: dis2d_shape + integer(I4B), pointer :: distype character(LENMEMPATH) :: input_mempath character(LENCOMPONENTNAME) :: comp, subcomp - integer(I4B) :: i, j, k, inunit + integer(I4B) :: i, j, k, inunit, export_dim + logical(LGP) :: is_layered ! + ! -- set pointer to DISENUM and MODEL_SHAPE call split_mem_path(mempath, comp, subcomp) input_mempath = create_mem_path(component=comp, context=idm_context) + call mem_setptr(distype, 'DISENUM', input_mempath) call mem_setptr(model_shape, 'MODEL_SHAPE', input_mempath) ! - if (size(model_shape) == 3) then - dis_shape(1) = model_shape(3) - dis_shape(2) = model_shape(2) - dis_shape(3) = model_shape(1) - allocate (dbl3d(dis_shape(1), dis_shape(2), dis_shape(3))) - dbl3d = reshape(p_mem, dis_shape) - do k = 1, dis_shape(3) + ! -- set export_dim + export_dim = distype_export_dim(distype, shapestr, is_layered) + ! + ! -- create export file(s) + select case (export_dim) + case (3) + ! -- set reshape array + dis3d_shape(1) = model_shape(3) + dis3d_shape(2) = model_shape(2) + ! -- allocate and reshape + dis3d_shape(3) = model_shape(1) + allocate (dbl3d(dis3d_shape(1), dis3d_shape(2), dis3d_shape(3))) + dbl3d = reshape(p_mem, dis3d_shape) + do k = 1, dis3d_shape(3) + ! -- write export files 3D array inunit = create_export_file(varname, mempath, k, iout) do i = 1, model_shape(2) write (inunit, '(*(G0.10, " "))') (dbl3d(j, i, k), j=1, & - dis_shape(1)) + dis3d_shape(1)) end do close (inunit) end do + ! -- cleanup deallocate (dbl3d) - else if (size(model_shape) == 2) then - disv_shape(1) = model_shape(2) - disv_shape(2) = model_shape(1) - allocate (dbl2d(disv_shape(1), disv_shape(2))) - dbl2d = reshape(p_mem, disv_shape) - do i = 1, disv_shape(2) - inunit = create_export_file(varname, mempath, i, iout) - write (inunit, '(*(G0.10, " "))') (dbl2d(j, i), j=1, disv_shape(1)) + case (2) + ! -- set reshape array + dis2d_shape(1) = model_shape(2) + dis2d_shape(2) = model_shape(1) + ! -- allocate and reshape + allocate (dbl2d(dis2d_shape(1), dis2d_shape(2))) + dbl2d = reshape(p_mem, dis2d_shape) + if (is_layered) then + ! -- write layered export files 2D array + do i = 1, dis2d_shape(2) + inunit = create_export_file(varname, mempath, i, iout) + write (inunit, '(*(G0.10, " "))') (dbl2d(j, i), j=1, dis2d_shape(1)) + close (inunit) + end do + else + ! -- write export file 2D array + inunit = create_export_file(varname, mempath, 0, iout) + do i = 1, dis2d_shape(2) + write (inunit, '(*(G0.10, " "))') (dbl2d(j, i), j=1, dis2d_shape(1)) + end do close (inunit) - end do - else if (size(model_shape) == 1) then + end if + ! -- cleanup + deallocate (dbl2d) + case (1) + ! -- write export file 1D array inunit = create_export_file(varname, mempath, 0, iout) write (inunit, '(*(G0.10, " "))') p_mem close (inunit) - end if + case default + write (errmsg, '(a,i0)') 'EXPORT unsupported dbl1d export_dim=', & + export_dim + call store_error(errmsg, .true.) + end select end subroutine idm_export_dbl1d !> @brief Create export file dbl2d !< - subroutine idm_export_dbl2d(p_mem, varname, mempath, iout) + subroutine idm_export_dbl2d(p_mem, varname, mempath, shapestr, iout) + use MemoryManagerModule, only: mem_setptr + use MemoryHelperModule, only: create_mem_path, split_mem_path real(DP), dimension(:, :), contiguous, intent(in) :: p_mem !< 2d dbl array character(len=*), intent(in) :: varname !< variable name character(len=*), intent(in) :: mempath !< variable memory path + character(len=*), intent(in) :: shapestr !< dfn shape string integer(I4B), intent(in) :: iout ! -- dummy - integer(I4B) :: i, j, inunit + integer(I4B), dimension(:), pointer, contiguous :: model_shape + integer(I4B), pointer :: distype + character(LENMEMPATH) :: input_mempath + character(LENCOMPONENTNAME) :: comp, subcomp + integer(I4B) :: i, j, inunit, export_dim + logical(LGP) :: is_layered ! - do i = 1, size(p_mem, dim=2) - inunit = create_export_file(varname, mempath, i, iout) - write (inunit, '(*(G0.10, " "))') (p_mem(j, i), j=1, size(p_mem, dim=1)) + ! -- set pointer to DISENUM + call split_mem_path(mempath, comp, subcomp) + input_mempath = create_mem_path(component=comp, context=idm_context) + call mem_setptr(distype, 'DISENUM', input_mempath) + call mem_setptr(model_shape, 'MODEL_SHAPE', input_mempath) + ! + ! -- set export_dim + export_dim = distype_export_dim(distype, shapestr, is_layered) + ! + select case (export_dim) + case (1) + ! -- write export file 1D array + inunit = create_export_file(varname, mempath, 0, iout) + do i = 1, size(p_mem, dim=2) + write (inunit, '(*(G0.10, " "))') (p_mem(j, i), j=1, size(p_mem, dim=1)) + end do close (inunit) - end do + case (2) + if (is_layered) then + ! -- write layered export files 2D array + do i = 1, size(p_mem, dim=2) + inunit = create_export_file(varname, mempath, i, iout) + write (inunit, '(*(G0.10, " "))') (p_mem(j, i), j=1, size(p_mem, dim=1)) + close (inunit) + end do + else + ! -- write export file 2D array + inunit = create_export_file(varname, mempath, 0, iout) + do i = 1, size(p_mem, dim=2) + write (inunit, '(*(G0.10, " "))') (p_mem(j, i), j=1, size(p_mem, dim=1)) + end do + close (inunit) + end if + case default + write (errmsg, '(a,i0)') 'EXPORT unsupported dbl2d export_dim=', & + export_dim + call store_error(errmsg, .true.) + end select end subroutine idm_export_dbl2d !> @brief Create export file dbl3d !< - subroutine idm_export_dbl3d(p_mem, varname, mempath, iout) + subroutine idm_export_dbl3d(p_mem, varname, mempath, shapestr, iout) + use MemoryManagerModule, only: mem_setptr + use MemoryHelperModule, only: create_mem_path, split_mem_path real(DP), dimension(:, :, :), contiguous, intent(in) :: p_mem !< 2d dbl array character(len=*), intent(in) :: varname !< variable name character(len=*), intent(in) :: mempath !< variable memory path + character(len=*), intent(in) :: shapestr !< dfn shape string integer(I4B), intent(in) :: iout ! -- dummy - integer(I4B) :: i, j, k, inunit + integer(I4B), dimension(:), pointer, contiguous :: model_shape + integer(I4B), pointer :: distype + character(LENMEMPATH) :: input_mempath + character(LENCOMPONENTNAME) :: comp, subcomp + integer(I4B) :: i, j, k, inunit, export_dim + logical(LGP) :: is_layered ! - do k = 1, size(p_mem, dim=3) - inunit = create_export_file(varname, mempath, k, iout) - do i = 1, size(p_mem, dim=2) - write (inunit, '(*(G0.10, " "))') (p_mem(j, i, k), j=1, & - size(p_mem, dim=1)) + ! -- set pointer to DISENUM + call split_mem_path(mempath, comp, subcomp) + input_mempath = create_mem_path(component=comp, context=idm_context) + call mem_setptr(distype, 'DISENUM', input_mempath) + call mem_setptr(model_shape, 'MODEL_SHAPE', input_mempath) + ! + ! -- set export_dim + export_dim = distype_export_dim(distype, shapestr, is_layered) + ! + select case (export_dim) + case (3) + ! -- write export files 3D array + do k = 1, size(p_mem, dim=3) + inunit = create_export_file(varname, mempath, k, iout) + do i = 1, size(p_mem, dim=2) + write (inunit, '(*(G0.10, " "))') (p_mem(j, i, k), j=1, & + size(p_mem, dim=1)) + end do + close (inunit) end do - close (inunit) - end do + case default + write (errmsg, '(a,i0)') 'EXPORT unsupported dbl3d export_dim=', & + export_dim + call store_error(errmsg, .true.) + end select end subroutine idm_export_dbl3d - !> @brief Create export file + !> @brief Set dis type export_dim !! - !! Name format: -.varname.[layer].txt + !! Set the dimension of the export + !< + function distype_export_dim(distype, shapestr, is_layered) & + result(export_dim) + integer(I4B), pointer, intent(in) :: distype + character(len=*), intent(in) :: shapestr !< dfn shape string + logical(LGP), intent(inout) :: is_layered !< does this data represent layers + integer(I4B) :: export_dim + ! + ! -- initialize is_layered to false + is_layered = .false. + ! + select case (distype) + case (DIS) + if (shapestr == 'NODES') then + export_dim = 3 + is_layered = .true. + else if (shapestr == 'NCOL NROW NLAY') then + export_dim = 3 + is_layered = .true. + else + export_dim = 1 + end if + case (DISV) + if (shapestr == 'NODES') then + export_dim = 2 + is_layered = .true. + else if (shapestr == 'NCPL NLAY') then + export_dim = 2 + is_layered = .true. + else + export_dim = 1 + end if + case (DIS2D) + if (shapestr == 'NODES') then + export_dim = 2 + else if (shapestr == 'NCOL NROW') then + export_dim = 2 + else + export_dim = 1 + end if + case (DISU, DISV1D) + export_dim = 1 + case default + export_dim = 0 + end select + end function distype_export_dim + + !> @brief Create export file !! + !! Name formats where l=layer, a=auxiliary, p=period + !! : -.varname.txt + !! : -.varname.l.txt + !! : -.varname.p.txt + !! : -.varname.a.p.txt !< - function create_export_file(varname, mempath, layer, iout) result(inunit) - use ConstantsModule, only: LENCOMPONENTNAME, LENVARNAME + function create_export_file(varname, mempath, layer, iout) & + result(inunit) + use ConstantsModule, only: LENVARNAME use InputOutputModule, only: openfile, getunit use InputOutputModule, only: upcase, lowcase use MemoryHelperModule, only: create_mem_path, split_mem_path diff --git a/src/Utilities/Idm/SourceCommon.f90 b/src/Utilities/Idm/SourceCommon.f90 index e5e31b109b9..cbd997ad08a 100644 --- a/src/Utilities/Idm/SourceCommon.f90 +++ b/src/Utilities/Idm/SourceCommon.f90 @@ -234,6 +234,7 @@ end subroutine get_shape_from_string !< subroutine set_model_shape(ftype, fname, model_mempath, dis_mempath, & model_shape) + use ConstantsModule, only: DISUNDEF, DIS, DISV, DISU, DIS2D, DISV1D use MemoryManagerModule, only: mem_allocate, mem_setptr, get_isize character(len=*), intent(in) :: ftype character(len=*), intent(in) :: fname @@ -244,11 +245,18 @@ subroutine set_model_shape(ftype, fname, model_mempath, dis_mempath, & integer(I4B), pointer :: ndim2 integer(I4B), pointer :: ndim3 integer(I4B), pointer :: ncelldim - integer(I4B) :: dim1_size, dim2_size, dim3_size + integer(I4B), pointer :: distype + integer(I4B) :: dim1_size, dim2_size, dim3_size, dis_type + ! + ! -- initialize dis_type + dis_type = DISUNDEF ! ! -- allocate and set model shape in model input context select case (ftype) case ('DIS6') + ! + ! -- set dis_type + dis_type = DIS ! call get_isize('NLAY', dis_mempath, dim1_size) call get_isize('NROW', dis_mempath, dim2_size) @@ -283,6 +291,9 @@ subroutine set_model_shape(ftype, fname, model_mempath, dis_mempath, & end if ! case ('DIS2D6') + ! + ! -- set dis_type + dis_type = DIS2D ! call get_isize('NROW', dis_mempath, dim1_size) call get_isize('NCOL', dis_mempath, dim2_size) @@ -309,6 +320,9 @@ subroutine set_model_shape(ftype, fname, model_mempath, dis_mempath, & end if ! case ('DISV6') + ! + ! -- set dis_type + dis_type = DISV ! call get_isize('NLAY', dis_mempath, dim1_size) call get_isize('NCPL', dis_mempath, dim2_size) @@ -351,6 +365,13 @@ subroutine set_model_shape(ftype, fname, model_mempath, dis_mempath, & call store_error_filename(fname) end if case ('DISU6', 'DISV1D6') + ! + ! -- set dis_type + if (ftype == 'DISU6') then + dis_type = DISU + else if (ftype == 'DISV1D6') then + dis_type = DISV1D + end if ! call get_isize('NODES', dis_mempath, dim1_size) ! @@ -375,6 +396,11 @@ subroutine set_model_shape(ftype, fname, model_mempath, dis_mempath, & call mem_allocate(ncelldim, 'NCELLDIM', model_mempath) ncelldim = size(model_shape) ! + ! -- allocate and set distype in model input context + ! TODO make sure this doesn't clash name GRIDTYPE, e.g. + call mem_allocate(distype, 'DISENUM', model_mempath) + distype = dis_type + ! ! -- return return end subroutine set_model_shape diff --git a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 index 357e4cfdcac..d1da5d94355 100644 --- a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 +++ b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 @@ -807,9 +807,11 @@ subroutine load_integer1d_type(parser, idt, memoryPath, mshape, export, iout) ! log information on the loaded array to the list file call idm_log_var(int1d, idt%tagname, memoryPath, iout) - ! create export file for layered parameters if optioned - if (export .and. idt%layered) then - call idm_export(int1d, idt%tagname, memoryPath, iout) + ! create export file for griddata parameters if optioned + if (export) then + if (idt%blockname == 'GRIDDATA') then + call idm_export(int1d, idt%tagname, memoryPath, idt%shape, iout) + end if end if return @@ -858,9 +860,11 @@ subroutine load_integer2d_type(parser, idt, memoryPath, mshape, export, iout) ! log information on the loaded array to the list file call idm_log_var(int2d, idt%tagname, memoryPath, iout) - ! create export file for layered parameters if optioned - if (export .and. idt%layered) then - call idm_export(int2d, idt%tagname, memoryPath, iout) + ! create export file for griddata parameters if optioned + if (export) then + if (idt%blockname == 'GRIDDATA') then + call idm_export(int2d, idt%tagname, memoryPath, idt%shape, iout) + end if end if return @@ -914,9 +918,11 @@ subroutine load_integer3d_type(parser, idt, memoryPath, mshape, export, iout) ! log information on the loaded array to the list file call idm_log_var(int3d, idt%tagname, memoryPath, iout) - ! create export file for layered parameters if optioned - if (export .and. idt%layered) then - call idm_export(int3d, idt%tagname, memoryPath, iout) + ! create export file for griddata parameters if optioned + if (export) then + if (idt%blockname == 'GRIDDATA') then + call idm_export(int3d, idt%tagname, memoryPath, idt%shape, iout) + end if end if return @@ -982,9 +988,11 @@ subroutine load_double1d_type(parser, idt, memoryPath, mshape, export, iout) ! log information on the loaded array to the list file call idm_log_var(dbl1d, idt%tagname, memoryPath, iout) - ! create export file for layered parameters if optioned - if (export .and. idt%layered) then - call idm_export(dbl1d, idt%tagname, memoryPath, iout) + ! create export file for griddata parameters if optioned + if (export) then + if (idt%blockname == 'GRIDDATA') then + call idm_export(dbl1d, idt%tagname, memoryPath, idt%shape, iout) + end if end if return @@ -1033,9 +1041,11 @@ subroutine load_double2d_type(parser, idt, memoryPath, mshape, export, iout) ! log information on the loaded array to the list file call idm_log_var(dbl2d, idt%tagname, memoryPath, iout) - ! create export file for layered parameters if optioned - if (export .and. idt%layered) then - call idm_export(dbl2d, idt%tagname, memoryPath, iout) + ! create export file for griddata parameters if optioned + if (export) then + if (idt%blockname == 'GRIDDATA') then + call idm_export(dbl2d, idt%tagname, memoryPath, idt%shape, iout) + end if end if return @@ -1089,9 +1099,11 @@ subroutine load_double3d_type(parser, idt, memoryPath, mshape, export, iout) ! log information on the loaded array to the list file call idm_log_var(dbl3d, idt%tagname, memoryPath, iout) - ! create export file for layered parameters if optioned - if (export .and. idt%layered) then - call idm_export(dbl3d, idt%tagname, memoryPath, iout) + ! create export file for griddata parameters if optioned + if (export) then + if (idt%blockname == 'GRIDDATA') then + call idm_export(dbl3d, idt%tagname, memoryPath, idt%shape, iout) + end if end if return diff --git a/src/Utilities/Idm/mf6blockfile/Mf6FileGridInput.f90 b/src/Utilities/Idm/mf6blockfile/Mf6FileGridInput.f90 index 962bf12f925..7530b9b782c 100644 --- a/src/Utilities/Idm/mf6blockfile/Mf6FileGridInput.f90 +++ b/src/Utilities/Idm/mf6blockfile/Mf6FileGridInput.f90 @@ -216,7 +216,7 @@ subroutine bndgrid_rp(this, parser) ! ! -- read and load the parameter call this%param_load(parser, idt%datatype, idt%mf6varname, idt%tagname, & - this%mf6_input%mempath, iaux) + idt%shape, this%mf6_input%mempath, iaux) ! end do ! @@ -323,7 +323,7 @@ subroutine bndgrid_params_alloc(this) end subroutine bndgrid_params_alloc subroutine bndgrid_param_load(this, parser, datatype, varname, & - tagname, mempath, iaux) + tagname, shapestr, mempath, iaux) ! -- modules use MemoryManagerModule, only: mem_setptr use ArrayHandlersModule, only: ifind @@ -339,13 +339,14 @@ subroutine bndgrid_param_load(this, parser, datatype, varname, & character(len=*), intent(in) :: datatype character(len=*), intent(in) :: varname character(len=*), intent(in) :: tagname + character(len=*), intent(in) :: shapestr character(len=*), intent(in) :: mempath integer(I4B), intent(in) :: iaux ! -- local integer(I4B), dimension(:), pointer, contiguous :: int1d real(DP), dimension(:), pointer, contiguous :: dbl1d real(DP), dimension(:, :), pointer, contiguous :: dbl2d - integer(I4B) :: iparam + integer(I4B) :: iparam, n ! select case (datatype) case ('INTEGER1D') @@ -363,8 +364,13 @@ subroutine bndgrid_param_load(this, parser, datatype, varname, & case ('DOUBLE2D') ! call mem_setptr(dbl2d, varname, mempath) - call read_dbl1d(parser, dbl2d(iaux, :), varname) - call idm_log_var(dbl2d, tagname, mempath, this%iout) + allocate (dbl1d(this%bound_context%ncpl)) + call read_dbl1d(parser, dbl1d, varname) + do n = 1, this%bound_context%ncpl + dbl2d(iaux, n) = dbl1d(n) + end do + call idm_log_var(dbl1d, tagname, mempath, this%iout) + deallocate (dbl1d) ! case default ! From ba54d046676f7a8b0e3f2f5522e47c666a3ceacb Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 25 Apr 2024 09:09:53 -0400 Subject: [PATCH 129/199] test(PRT): set iflowface in test_prt_triangle.py (#1764) * set boundary face flows for triangle disv grid test * also applies to test_prt_ternary_methods.py * unrelated fix: set found in prp module --- autotest/test_prt_ternary_methods.py | 4 +-- autotest/test_prt_triangle.py | 44 +++++++++++++++++++++----- src/Model/ParticleTracking/prt-prp.f90 | 1 + 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/autotest/test_prt_ternary_methods.py b/autotest/test_prt_ternary_methods.py index c7b90f5da83..ef12c5398e8 100644 --- a/autotest/test_prt_ternary_methods.py +++ b/autotest/test_prt_ternary_methods.py @@ -165,9 +165,9 @@ def check_output(idx, test): ) # check pathline shape and endpoints - assert pls.shape == (112, 16) + assert pls.shape == (116, 16) assert endpts.shape == (2, 16) - assert set(endpts.icell) == {111, 144} + assert set(endpts.icell) == {111, 112} @pytest.mark.parametrize("idx, name", enumerate(cases)) diff --git a/autotest/test_prt_triangle.py b/autotest/test_prt_triangle.py index da81ab15cc8..daa62d8a893 100644 --- a/autotest/test_prt_triangle.py +++ b/autotest/test_prt_triangle.py @@ -100,21 +100,36 @@ def build_gwf_sim(name, ws, targets, chd_sides=None): if isinstance(chd_sides, (list, tuple)): if "left" in chd_sides: leftcells = tri.get_edge_cells(4) + leftcells = set(leftcells) - set(cells) cells.extend(leftcells) if "right" in chd_sides: rightcells = tri.get_edge_cells(2) + rightcells = set(rightcells) - set(cells) cells.extend(rightcells) if "botm" in chd_sides: botmcells = tri.get_edge_cells(3) + botmcells = set(botmcells) - set(cells) cells.extend(botmcells) if "top" in chd_sides: topcells = tri.get_edge_cells(1) + topcells = set(topcells) - set(cells) cells.extend(topcells) for icpl in set(cells): h = get_chd_head(xcyc[icpl, 0]) chdlist.append([(0, icpl), h]) - chd = flopy.mf6.ModflowGwfchd(gwf, stress_period_data=chdlist) + iflowface_map = {89: 3, 87: 2, 130: 3, 136: 3, 112: 3, 111: 3} + + def add_iflowface(row): + ic = row[0][1] + 1 # 0 to 1-based indexing + iff = iflowface_map.get(ic, -1) + return (*row, iff) + + chdlist = [add_iflowface(row) for row in chdlist] + + chd = flopy.mf6.ModflowGwfchd( + gwf, stress_period_data=chdlist, auxiliary=["IFLOWFACE"] + ) oc = flopy.mf6.ModflowGwfoc( gwf, budget_filerecord=f"{gwfname}.cbc", @@ -258,20 +273,33 @@ def check_output(idx, test): y="y", ax=ax, legend=False, - color="black", + color="blue", ) + grid = gwf.modelgrid + xc, yc = grid.get_xcellcenters_for_layer( + 0 + ), grid.get_ycellcenters_for_layer(0) + for i in range(grid.ncpl): + x, y = xc[i], yc[i] + ax.plot(x, y, "o", color="grey", alpha=0.25, ms=2) + ax.annotate(str(i + 1), (x, y), color="grey", alpha=0.5) plt.show() if "r2l" in name: - assert pls.shape == (76, 16) + assert pls.shape == (82, 16) assert (pls.z == 0.5).all() - assert isclose(min(pls.x), 5.1145, rel_tol=1e-6) - assert isclose(max(pls.x), 96, rel_tol=1e-6) - assert set(endpts.icell) == {12, 128} + rtol = 1e-6 + assert isclose(min(pls.x), 0, rel_tol=rtol) + assert isclose(max(pls.x), 96, rel_tol=rtol) + assert isclose(min(pls[pls.irpt == 1].y), 91.690657, rel_tol=rtol) + assert isclose(max(pls[pls.irpt == 1].y), 92, rel_tol=rtol) + assert isclose(min(pls[pls.irpt == 2].y), 85.585069, rel_tol=rtol) + assert isclose(max(pls[pls.irpt == 2].y), 86, rel_tol=rtol) + assert set(endpts.icell) == {130, 136} elif "diag" in name: - assert pls.shape == (112, 16) + assert pls.shape == (116, 16) assert endpts.shape == (2, 16) - assert set(endpts.icell) == {111, 144} + assert set(endpts.icell) == {111, 112} @pytest.mark.parametrize("idx, name", enumerate(cases)) diff --git a/src/Model/ParticleTracking/prt-prp.f90 b/src/Model/ParticleTracking/prt-prp.f90 index 3e76df3acdf..61eacbf3e1c 100644 --- a/src/Model/ParticleTracking/prt-prp.f90 +++ b/src/Model/ParticleTracking/prt-prp.f90 @@ -810,6 +810,7 @@ subroutine prp_options(this, option, found) found = .true. case ('LOCAL_Z') this%localz = .true. + found = .true. case default found = .false. end select From c2efa39baad1bd0fc74ce1b20c442ce0b0934652 Mon Sep 17 00:00:00 2001 From: mjr-deltares <45555666+mjr-deltares@users.noreply.github.com> Date: Wed, 1 May 2024 15:00:57 +0200 Subject: [PATCH 130/199] fix(par): improve CSV report for convergence in parallel mode (#1766) * - streamline convergence csv report between IMS and PETSc solver - fix typo in csv header (inner report now contains model data for PETSc solver, similar to IMS) * - remove timer (fixes fp excep) * - model id printed instead of (local) index - a bit of cleanup/comments --- src/Solution/NumericalSolution.f90 | 160 +++++++++++++++--------- src/Solution/PETSc/PetscConvergence.F90 | 34 +++-- src/Solution/PETSc/PetscSolver.F90 | 6 +- 3 files changed, 114 insertions(+), 86 deletions(-) diff --git a/src/Solution/NumericalSolution.f90 b/src/Solution/NumericalSolution.f90 index f27c938fa09..7405cba2af7 100644 --- a/src/Solution/NumericalSolution.f90 +++ b/src/Solution/NumericalSolution.f90 @@ -1359,8 +1359,8 @@ subroutine writeCSVHeader(this) 'ninner', 'solution_inner_dvmax', 'solution_inner_dvmax_model', & 'solution_inner_dvmax_node' write (this%icsvinnerout, '(*(G0,:,","))', advance='NO') & - '', 'solution_inner_drmax', 'solution_inner_drmax_model', & - 'solution_inner_drmax_node' + '', 'solution_inner_rmax', 'solution_inner_rmax_model', & + 'solution_inner_rmax_node' ! solver items specific to ims solver if (this%linsolver == IMS_SOLVER) then write (this%icsvinnerout, '(*(G0,:,","))', advance='NO') & @@ -1371,14 +1371,14 @@ subroutine writeCSVHeader(this) end if end if ! -- check for more than one model - ims only - if (this%linsolver == IMS_SOLVER .and. this%convnmod > 1) then + if (this%convnmod > 1) then do im = 1, this%modellist%Count() mp => GetNumericalModelFromList(this%modellist, im) write (this%icsvinnerout, '(*(G0,:,","))', advance='NO') & '', trim(adjustl(mp%name))//'_inner_dvmax', & trim(adjustl(mp%name))//'_inner_dvmax_node', & - trim(adjustl(mp%name))//'_inner_drmax', & - trim(adjustl(mp%name))//'_inner_drmax_node' + trim(adjustl(mp%name))//'_inner_rmax', & + trim(adjustl(mp%name))//'_inner_rmax_node' end do end if write (this%icsvinnerout, '(a)') '' @@ -1500,7 +1500,7 @@ subroutine solve(this, kiter) character(len=25) :: cval character(len=7) :: cmsg integer(I4B) :: ic - integer(I4B) :: im + integer(I4B) :: im, m_idx, model_id integer(I4B) :: icsv0 integer(I4B) :: kcsv0 integer(I4B) :: ntabrows @@ -1513,7 +1513,7 @@ subroutine solve(this, kiter) integer(I4B) :: iend integer(I4B) :: icnvgmod integer(I4B) :: iptc - integer(I4B) :: nodeu + integer(I4B) :: node_user integer(I4B) :: ipak integer(I4B) :: ipos0 integer(I4B) :: ipos1 @@ -1593,7 +1593,7 @@ subroutine solve(this, kiter) ! ! -- linear solve call code_timer(0, ttsoln, this%ttsoln) - CALL this%sln_ls(kiter, kstp, kper, iter, iptc, ptcf) + call this%sln_ls(kiter, kstp, kper, iter, iptc, ptcf) call code_timer(1, ttsoln, this%ttsoln) ! ! -- increment counters storing the total number of linear and @@ -1789,26 +1789,35 @@ subroutine solve(this, kiter) if (abs(outer_hncg) > abs(dpak)) then ! ! -- get model number and user node number - call this%sln_get_nodeu(this%lrch(1, kiter), im, nodeu) + call this%sln_get_nodeu(this%lrch(1, kiter), m_idx, node_user) cpakout = '' + else if (outer_hncg == DZERO .and. dpak == DZERO) then ! zero change, location could be any + m_idx = 0 + node_user = 0 ! - ! -- package convergence error + ! -- then it's a package convergence error else ! ! -- set convergence error, model number, user node number, ! and package name outer_hncg = dpak ipos0 = index(cmod, '_') - read (cmod(1:ipos0 - 1), *) im - nodeu = ipak + read (cmod(1:ipos0 - 1), *) m_idx + node_user = ipak ipos0 = index(cpak, '-', back=.true.) cpakout = cpak(1:ipos0 - 1) end if ! ! -- write line to outer iteration csv file + if (m_idx > 0) then + mp => GetNumericalModelFromList(this%modellist, m_idx) ! TODO_MJR: right list? + model_id = mp%id + else + model_id = 0 + end if write (this%icsvouterout, '(*(G0,:,","))') & this%itertot_sim, totim, kper, kstp, kiter, iter, & - outer_hncg, im, trim(cpakout), nodeu + outer_hncg, model_id, trim(cpakout), node_user end if ! ! -- write to inner iteration csv file @@ -1974,8 +1983,8 @@ subroutine convergence_summary(this, iu, im, itertot_timestep) ! -- local variables character(len=LINELENGTH) :: title character(len=LINELENGTH) :: tag - character(len=LENPAKLOC) :: strh - character(len=LENPAKLOC) :: strr + character(len=LENPAKLOC) :: loc_dvmax_str + character(len=LENPAKLOC) :: loc_rmax_str integer(I4B) :: ntabrows integer(I4B) :: ntabcols integer(I4B) :: iinner @@ -1989,8 +1998,8 @@ subroutine convergence_summary(this, iu, im, itertot_timestep) real(DP) :: res !< the maximum value of the residual vector ! ! -- initialize local variables - strh = '' - strr = '' + loc_dvmax_str = '' + loc_rmax_str = '' iouter = 1 locdv = 0 locdr = 0 @@ -2054,17 +2063,17 @@ subroutine convergence_summary(this, iu, im, itertot_timestep) dv = this%cnvg_summary%convdvmax(im, k) res = this%cnvg_summary%convrmax(im, k) end if - call this%sln_get_loc(locdv, strh) - call this%sln_get_loc(locdr, strr) + call this%sln_get_loc(locdv, loc_dvmax_str) + call this%sln_get_loc(locdr, loc_rmax_str) ! ! -- add data to innertab call this%innertab%add_term(k) call this%innertab%add_term(iouter) call this%innertab%add_term(iinner) call this%innertab%add_term(dv) - call this%innertab%add_term(adjustr(trim(strh))) + call this%innertab%add_term(adjustr(trim(loc_dvmax_str))) call this%innertab%add_term(res) - call this%innertab%add_term(adjustr(trim(strr))) + call this%innertab%add_term(adjustr(trim(loc_rmax_str))) ! ! -- update i0 i0 = iinner @@ -2095,15 +2104,14 @@ subroutine csv_convergence_summary(this, iu, totim, kper, kstp, kouter, & integer(I4B), intent(in) :: kstart !< starting position in the conv* arrays ! -- local integer(I4B) :: itot - integer(I4B) :: im - integer(I4B) :: j - integer(I4B) :: k + integer(I4B) :: m_idx, j, k integer(I4B) :: kpos - integer(I4B) :: locdv - integer(I4B) :: locdr - integer(I4B) :: nodeu - real(DP) :: dv - real(DP) :: dr + integer(I4B) :: loc_dvmax !< solution node number (row) of max. dep. var. change + integer(I4B) :: loc_rmax !< solution node number (row) of max. residual + integer(I4B) :: model_id, node_user + real(DP) :: dvmax !< maximum dependent variable change + real(DP) :: rmax !< maximum residual + class(NumericalModelType), pointer :: num_mod => null() ! ------------------------------------------------------------------------------ ! ! -- initialize local variables @@ -2116,26 +2124,44 @@ subroutine csv_convergence_summary(this, iu, totim, kper, kstp, kouter, & itot, totim, kper, kstp, kouter, k ! ! -- solution summary - dv = DZERO - dr = DZERO + dvmax = DZERO + rmax = DZERO do j = 1, this%convnmod - if (ABS(this%cnvg_summary%convdvmax(j, kpos)) > ABS(dv)) then - locdv = this%cnvg_summary%convlocdv(j, kpos) - dv = this%cnvg_summary%convdvmax(j, kpos) + if (ABS(this%cnvg_summary%convdvmax(j, kpos)) > ABS(dvmax)) then + loc_dvmax = this%cnvg_summary%convlocdv(j, kpos) + dvmax = this%cnvg_summary%convdvmax(j, kpos) end if - if (ABS(this%cnvg_summary%convrmax(j, kpos)) > ABS(dr)) then - locdr = this%cnvg_summary%convlocr(j, kpos) - dr = this%cnvg_summary%convrmax(j, kpos) + if (ABS(this%cnvg_summary%convrmax(j, kpos)) > ABS(rmax)) then + loc_rmax = this%cnvg_summary%convlocr(j, kpos) + rmax = this%cnvg_summary%convrmax(j, kpos) end if end do ! - ! -- get model number and user node number for dv - call this%sln_get_nodeu(locdv, im, nodeu) - write (iu, '(*(G0,:,","))', advance='NO') '', dv, im, nodeu + ! -- no change, could be anywhere + if (dvmax == DZERO) loc_dvmax = 0 + if (rmax == DZERO) loc_rmax = 0 + ! + ! -- get model number and user node number for max. dep. var. change + if (loc_dvmax > 0) then + call this%sln_get_nodeu(loc_dvmax, m_idx, node_user) + num_mod => GetNumericalModelFromList(this%modellist, m_idx) + model_id = num_mod%id + else + model_id = 0 + node_user = 0 + end if + write (iu, '(*(G0,:,","))', advance='NO') '', dvmax, model_id, node_user ! - ! -- get model number and user node number for dr - call this%sln_get_nodeu(locdr, im, nodeu) - write (iu, '(*(G0,:,","))', advance='NO') '', dr, im, nodeu + ! -- get model number and user node number for max. residual + if (loc_rmax > 0) then + call this%sln_get_nodeu(loc_rmax, m_idx, node_user) + num_mod => GetNumericalModelFromList(this%modellist, m_idx) + model_id = num_mod%id + else + model_id = 0 + node_user = 0 + end if + write (iu, '(*(G0,:,","))', advance='NO') '', rmax, model_id, node_user ! ! -- write ims acceleration parameters if (this%linsolver == IMS_SOLVER) then @@ -2143,21 +2169,29 @@ subroutine csv_convergence_summary(this, iu, totim, kper, kstp, kouter, & '', trim(adjustl(this%caccel(kpos))) end if ! - ! -- write information for each model - ims only - if (this%linsolver == IMS_SOLVER .and. this%convnmod > 1) then + ! -- write information for each model + if (this%convnmod > 1) then do j = 1, this%cnvg_summary%convnmod - locdv = this%cnvg_summary%convlocdv(j, kpos) - dv = this%cnvg_summary%convdvmax(j, kpos) - locdr = this%cnvg_summary%convlocr(j, kpos) - dr = this%cnvg_summary%convrmax(j, kpos) + loc_dvmax = this%cnvg_summary%convlocdv(j, kpos) + dvmax = this%cnvg_summary%convdvmax(j, kpos) + loc_rmax = this%cnvg_summary%convlocr(j, kpos) + rmax = this%cnvg_summary%convrmax(j, kpos) ! - ! -- get model number and user node number for dv - call this%sln_get_nodeu(locdv, im, nodeu) - write (iu, '(*(G0,:,","))', advance='NO') '', dv, nodeu + ! -- get model number and user node number for max. dep. var. change + if (loc_dvmax > 0) then + call this%sln_get_nodeu(loc_dvmax, m_idx, node_user) + else + node_user = 0 + end if + write (iu, '(*(G0,:,","))', advance='NO') '', dvmax, node_user ! - ! -- get model number and user node number for dr - call this%sln_get_nodeu(locdr, im, nodeu) - write (iu, '(*(G0,:,","))', advance='NO') '', dr, nodeu + ! -- get model number and user node number for max. residual + if (loc_rmax > 0) then + call this%sln_get_nodeu(loc_rmax, m_idx, node_user) + else + node_user = 0 + end if + write (iu, '(*(G0,:,","))', advance='NO') '', rmax, node_user end do end if ! @@ -3185,9 +3219,8 @@ end function sln_nur_has_converged !> @ brief Get cell location string !! - !! Get the cell location string for the provided solution node number. - !! - !< + !! Get the cell location string for the provided solution node number. + !< Returns empty string when node not found. subroutine sln_get_loc(this, nodesln, str) ! -- dummy variables class(NumericalSolutionType), intent(inout) :: this !< NumericalSolutionType instance @@ -3236,26 +3269,29 @@ subroutine sln_get_nodeu(this, nodesln, im, nodeu) ! -- dummy variables class(NumericalSolutionType), intent(inout) :: this !< NumericalSolutionType instance integer(I4B), intent(in) :: nodesln !< solution node number - integer(I4B), intent(inout) :: im !< solution model number + integer(I4B), intent(inout) :: im !< solution model index (index in model list for this solution) integer(I4B), intent(inout) :: nodeu !< user node number ! -- local variables class(NumericalModelType), pointer :: mp => null() integer(I4B) :: i integer(I4B) :: istart integer(I4B) :: iend - integer(I4B) :: noder + integer(I4B) :: noder, nglo ! ! -- initialize local variables noder = 0 ! + ! -- when parallel, account for offset + nglo = nodesln + this%matrix_offset + ! ! -- calculate and set offsets do i = 1, this%modellist%Count() mp => GetNumericalModelFromList(this%modellist, i) istart = 0 iend = 0 call mp%get_mrange(istart, iend) - if (nodesln >= istart .and. nodesln <= iend) then - noder = nodesln - istart + 1 + if (nglo >= istart .and. nglo <= iend) then + noder = nglo - istart + 1 call mp%get_mnodeu(noder, nodeu) im = i exit diff --git a/src/Solution/PETSc/PetscConvergence.F90 b/src/Solution/PETSc/PetscConvergence.F90 index ae2fad75de5..250dc02c2d0 100644 --- a/src/Solution/PETSc/PetscConvergence.F90 +++ b/src/Solution/PETSc/PetscConvergence.F90 @@ -2,7 +2,7 @@ module PetscConvergenceModule #include use petscksp use KindModule, only: I4B, DP - use ConstantsModule, only: DPREC + use ConstantsModule, only: DPREC, DZERO use ListModule use ConvergenceSummaryModule use ImsLinearSettingsModule @@ -12,6 +12,9 @@ module PetscConvergenceModule public :: petsc_check_convergence public :: KSPSetConvergenceTest + ! TODO_MJR: this could be smaller, find a bound + real(DP), private, parameter :: RNORM_L2_TOL = DPREC + !< Context for the custom convergence check type, public :: PetscCnvgCtxType Vec :: x_old !< x vector from the previous iteration @@ -88,7 +91,6 @@ end subroutine create !> @brief Routine to check the convergence. This is called !< from within PETSc. subroutine petsc_check_convergence(ksp, n, rnorm_L2, flag, context, ierr) - use TimerModule KSP :: ksp !< Iterative context PetscInt :: n !< Iteration number PetscReal :: rnorm_L2 !< 2-norm (preconditioned) residual value @@ -106,9 +108,6 @@ subroutine petsc_check_convergence(ksp, n, rnorm_L2, flag, context, ierr) type(ConvergenceSummaryType), pointer :: summary PetscInt :: iter_cnt PetscInt :: i, j, istart, iend - real(DP) :: start_time - - call code_timer(0, start_time, context%t_convergence_check) summary => context%cnvg_summary @@ -136,7 +135,7 @@ subroutine petsc_check_convergence(ksp, n, rnorm_L2, flag, context, ierr) ! n == 0 is before the iteration starts if (n == 0) then context%rnorm_L2_init = rnorm_L2_ims - if (rnorm_L2 < DPREC) then + if (rnorm_L2 < RNORM_L2_TOL) then ! exact solution found flag = KSP_CONVERGED_HAPPY_BREAKDOWN else @@ -144,8 +143,7 @@ subroutine petsc_check_convergence(ksp, n, rnorm_L2, flag, context, ierr) CHKERRQ(ierr) flag = KSP_CONVERGED_ITERATING end if - - call code_timer(1, start_time, context%t_convergence_check) + ! early return return end if @@ -156,10 +154,10 @@ subroutine petsc_check_convergence(ksp, n, rnorm_L2, flag, context, ierr) if (summary%nitermax > 1) then summary%itinner(iter_cnt) = n do i = 1, summary%convnmod - summary%convdvmax(i, iter_cnt) = -huge(dvmax_model) - summary%convlocdv(i, iter_cnt) = -1 - summary%convrmax(i, iter_cnt) = -huge(rmax_model) - summary%convlocr(i, iter_cnt) = -1 + summary%convdvmax(i, iter_cnt) = DZERO + summary%convlocdv(i, iter_cnt) = 0 + summary%convrmax(i, iter_cnt) = DZERO + summary%convlocr(i, iter_cnt) = 0 end do end if @@ -185,10 +183,10 @@ subroutine petsc_check_convergence(ksp, n, rnorm_L2, flag, context, ierr) CHKERRQ(ierr) do i = 1, summary%convnmod ! reset - dvmax_model = 0.0 - idx_dv = -1 - rmax_model = 0.0 - idx_r = -1 + dvmax_model = DZERO + idx_dv = 0 + rmax_model = DZERO + idx_r = 0 ! get first and last model index istart = summary%model_bounds(i) iend = summary%model_bounds(i + 1) - 1 @@ -214,7 +212,7 @@ subroutine petsc_check_convergence(ksp, n, rnorm_L2, flag, context, ierr) call VecRestoreArrayF90(context%residual, local_res, ierr) CHKERRQ(ierr) - if (rnorm_L2 < DPREC) then + if (rnorm_L2 < RNORM_L2_TOL) then ! exact solution, set to 'converged' flag = KSP_CONVERGED_HAPPY_BREAKDOWN else @@ -229,8 +227,6 @@ subroutine petsc_check_convergence(ksp, n, rnorm_L2, flag, context, ierr) end if end if - call code_timer(1, start_time, context%t_convergence_check) - end subroutine petsc_check_convergence !> @brief Apply the IMS convergence check diff --git a/src/Solution/PETSc/PetscSolver.F90 b/src/Solution/PETSc/PetscSolver.F90 index b34f13e478f..2bbb86995fb 100644 --- a/src/Solution/PETSc/PetscSolver.F90 +++ b/src/Solution/PETSc/PetscSolver.F90 @@ -2,7 +2,7 @@ module PetscSolverModule #include use petscksp use KindModule, only: I4B, DP, LGP - use ConstantsModule, only: LINELENGTH, LENSOLUTIONNAME + use ConstantsModule, only: LINELENGTH, LENSOLUTIONNAME, DZERO use LinearSolverBaseModule use MatrixBaseModule use VectorBaseModule @@ -338,10 +338,6 @@ subroutine petsc_solve(this, kiter, rhs, x, cnvg_summary) this%is_converged = 0 if (kiter == 1) then this%petsc_ctx%cnvg_summary%iter_cnt = 0 - this%petsc_ctx%cnvg_summary%convlocdv = 0 - this%petsc_ctx%cnvg_summary%convdvmax = 0.0 - this%petsc_ctx%cnvg_summary%convlocr = 0 - this%petsc_ctx%cnvg_summary%convrmax = 0.0 end if ! update matrix coefficients From 9b959febe3076e24e485371188fd4dd345e52749 Mon Sep 17 00:00:00 2001 From: spaulins-usgs Date: Wed, 1 May 2024 09:29:02 -0700 Subject: [PATCH 131/199] feat(HPC): dfn changes for HPC package (#1763) Co-authored-by: scottrp <45947939+scottrp@users.noreply.github.com> --- doc/mf6io/mf6ivar/dfn/gwf-gnc.dfn | 2 +- doc/mf6io/mf6ivar/dfn/sim-nam.dfn | 44 +++++++++++++++++++++++++++++++ doc/mf6io/mf6ivar/dfn/utl-hpc.dfn | 40 ++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 doc/mf6io/mf6ivar/dfn/utl-hpc.dfn diff --git a/doc/mf6io/mf6ivar/dfn/gwf-gnc.dfn b/doc/mf6io/mf6ivar/dfn/gwf-gnc.dfn index 2a6a07c7072..6a458a3d5d5 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-gnc.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-gnc.dfn @@ -1,6 +1,6 @@ # --------------------- gwf gnc options --------------------- # flopy subpackage gnc_filerecord gnc gncdata gncdata -# flopy parent_name_type parent_model_or_package +# flopy parent_name_type parent_model_or_package MFModel/MFPackage block options name print_input diff --git a/doc/mf6io/mf6ivar/dfn/sim-nam.dfn b/doc/mf6io/mf6ivar/dfn/sim-nam.dfn index da749a8eea0..4c255c45924 100644 --- a/doc/mf6io/mf6ivar/dfn/sim-nam.dfn +++ b/doc/mf6io/mf6ivar/dfn/sim-nam.dfn @@ -41,6 +41,50 @@ optional true longname print input to listing file description keyword to activate printing of simulation input summaries to the simulation list file (mfsim.lst). With this keyword, input summaries will be written for those packages that support newer input data model routines. Not all packages are supported yet by the newer input data model routines. +block options +name hpc_filerecord +type record hpc6 filein hpc6_filename +shape +reader urword +tagged true +optional true +longname +description hpc record + +block options +name hpc6 +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname head keyword +description keyword to specify that record corresponds to a hpc file. + +block options +name filein +type keyword +shape +in_record true +reader urword +tagged true +optional false +longname file keyword +description keyword to specify that an input filename is expected next. + +block options +name hpc6_filename +type string +preserve_case true +in_record true +reader urword +optional false +tagged false +longname file name of time series information +description name of input file to define HPC file settings for the HPC package. See the ``HPC File'' section for instructions for preparing HPC input files. + + # --------------------- sim nam timing --------------------- block timing diff --git a/doc/mf6io/mf6ivar/dfn/utl-hpc.dfn b/doc/mf6io/mf6ivar/dfn/utl-hpc.dfn new file mode 100644 index 00000000000..4003a0a8e20 --- /dev/null +++ b/doc/mf6io/mf6ivar/dfn/utl-hpc.dfn @@ -0,0 +1,40 @@ +# --------------------- sim hpc options --------------------- +# flopy subpackage hpc_filerecord hpc hpc_data hpc +# flopy parent_name_type parent_package MFSimulation + +block options +name dev_log_mpi +type keyword +reader urword +optional true +longname log mpi traffic +description keyword to enable (extremely verbose) logging of mpi traffic to file. + + +# --------------------- sim hpc partitions --------------------- + +block partitions +name partitions +type recarray mname mrank +reader urword +optional +longname list of partition numbers +description is the list of zero-based partition numbers. + +block partitions +name mname +in_record true +type string +tagged false +reader urword +longname model name +description is the unique model name. + +block partitions +name mrank +in_record true +type integer +tagged false +reader urword +longname model rank +description is the zero-based partition number (also: MPI rank or processor id) to which the model will be assigned. From 574f1f3d7fb7c2f89cc3463f1316b21023732986 Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Wed, 1 May 2024 10:19:52 -0700 Subject: [PATCH 132/199] fix(test_gwe_drycell_cond0): user reporting better performance with small change to assert setup (#1758) --- autotest/test_gwe_drycell_cnd0.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autotest/test_gwe_drycell_cnd0.py b/autotest/test_gwe_drycell_cnd0.py index b4f419baf38..741a3d39d47 100644 --- a/autotest/test_gwe_drycell_cnd0.py +++ b/autotest/test_gwe_drycell_cnd0.py @@ -403,7 +403,7 @@ def check_output(idx, test): "Pass through cell should not be as warm as its neighbor to " "the left" ) - assert np.all(conc1[1:, 0, 0, 2] > conc1[1:, 0, 0, 3]), msg5 + assert np.all(np.round(conc1[:, 0, 0, 3] - conc1[:, 0, 0, 2], 8) <= 0), msg5 # - No need to change any code below From 5d26730b21cde3c551d9ef30a461a9711e1ce313 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 2 May 2024 23:15:40 -0400 Subject: [PATCH 133/199] Update `pixi.lock` (#1768) Co-authored-by: GitHub --- pixi.lock | 1591 +++++++++++++++++++++++------------------------------ 1 file changed, 692 insertions(+), 899 deletions(-) diff --git a/pixi.lock b/pixi.lock index 2609992b7e8..1254faa52af 100644 --- a/pixi.lock +++ b/pixi.lock @@ -9,10 +9,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/black-24.4.0-py39hf3d152e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/black-24.4.2-py39hf3d152e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bmipy-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda @@ -32,12 +32,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 @@ -54,19 +54,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-2.50.0-h5abf519_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.1-hfa15dee_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.1-h98fc4e7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-2.50.0-h78e8752_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.1-hfa15dee_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.1-h98fc4e7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.4.0-h3d44ed6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.22.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.7.2-py39hf3d152e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.1-pyhd8ed1ab_0.conda @@ -86,7 +86,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp15-15.0.7-default_h127d8a8_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.3-default_h5d6823c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.4-default_h5d6823c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 @@ -94,21 +94,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h43f5ff8_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.0-hf2295e7_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.48-h71f35ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.49-h4f305b6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hb3ce162_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.3-h2448989_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.4-h2448989_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda @@ -118,14 +118,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.0-hadf69e7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libtool-2.4.7-h27087fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.4.0-h2c329e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda @@ -152,17 +151,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.98-h1d7d5a4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py39h474f0d3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py39hddac248_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.52.2-ha41ecd1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py39h90c7501_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2 @@ -174,7 +173,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py39h3d6467e_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-dotenv-0.5.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-order-1.0.1-pyhd8ed1ab_0.tar.bz2 @@ -189,7 +188,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-hc9dc06e_21.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.18.0-py39h9fdd4d6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.0-py39h474f0d3_0.conda @@ -234,9 +233,9 @@ environments: linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/atk-1.0-2.38.0-hf4e84e4_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/atk-1.0-2.38.0-hedc4a1f_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/black-24.4.0-py39h4420490_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/black-24.4.2-py39h4420490_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bmipy-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-1.1.0-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-bin-1.1.0-h31becfc_1.conda @@ -255,12 +254,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.6.2-h2f0025b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.14.2-ha9a116f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 @@ -273,17 +272,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/geos-3.12.1-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.13-h2f0025b_1003.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphviz-2.50.0-h856fde9_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphviz-2.50.0-h65e8cce_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gtk2-2.24.33-h0d7db29_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gts-0.7.6-he293c15_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-8.3.0-hebeb849_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-8.4.0-hebeb849_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-73.2-h787c7f5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.22.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jupyter_core-5.7.2-py39h4420490_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.1-pyhd8ed1ab_0.conda @@ -299,12 +298,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.20-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.2-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-13.2.0-hf8544c7_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-13.2.0-he277a41_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgd-2.3.3-hcd22fd5_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-13.2.0-he9431aa_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-13.2.0-h582850c_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-13.2.0-he9431aa_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-13.2.0-h87d9d71_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.80.0-h9d8fbc1_6.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.2.0-hf8544c7_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.2.0-he277a41_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.9.0-22_linuxaarch64_openblas.conda @@ -313,12 +312,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.43-h194ca79_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/librsvg-2.58.0-h010368b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.45.3-h194ca79_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.2.0-h9a76618_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.2.0-h3f4de04_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.6.0-hf980d43_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtool-2.4.7-h4de3ea5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-1.3.2-heb2ea1b_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.3.2-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-1.4.0-h8b4e01b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.4.0-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.15-h2a766a3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.12.6-h3091e33_2.conda @@ -338,17 +336,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ninja-1.12.0-h2a328a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py39h91c28bb_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.2-h0d9d63b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.2.1-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.0-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-2.2.2-py39h26ccf5d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pango-1.50.14-h11ef544_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pango-1.52.2-h11ef544_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.43-hd0f9c67_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-10.3.0-py39h71661b1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.43.4-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-hb9de7d4_1001.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 @@ -356,7 +354,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-dotenv-0.5.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-order-1.0.1-pyhd8ed1ab_0.tar.bz2 @@ -370,7 +368,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.1-py39h898b7ef_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.18.0-py39hfe8b3a4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.13.0-py39h91c28bb_0.conda @@ -406,9 +404,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.5-h4c53e97_0.conda osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/atk-1.0-2.38.0-h1d18e73_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/atk-1.0-2.38.0-h4bec284_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/black-24.4.0-py39h6e9494a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/black-24.4.2-py39h6e9494a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bmipy-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-1.1.0-h0dc2134_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-bin-1.1.0-h0dc2134_1.conda @@ -427,12 +425,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/expat-2.6.2-h73e2aa4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fontconfig-2.14.2-h5bb23bf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 @@ -447,17 +445,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/gettext-tools-0.22.5-h5ff76d1_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.13-h73e2aa4_1003.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-2.50.0-ha5baa68_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-2.50.0-h8671558_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk2-2.24.33-h8ca4665_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gts-0.7.6-h53e17e3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-8.3.0-hf45c392_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-8.4.0-h72fa137_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-73.2-hf5e326d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.22.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/jupyter_core-5.7.1-py39h6e9494a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.1-pyhd8ed1ab_0.conda @@ -491,13 +489,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/librsvg-2.58.0-h7b06fc5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.3-h92b6c6a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.6.0-h129831d_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libtool-2.4.7-hf0c8a7f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-1.3.2-h44782d1_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.3.2-h10d778d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-1.4.0-hc207709_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.4.0-h10d778d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.15-hb7f2c08_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.6-hc0ae0f7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.3-hb6ac08f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.4-h2c61cee_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.5-py39ha09f3b3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.4-py39h6e9494a_0.conda @@ -513,17 +510,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.12.0-h7728843_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-1.26.4-py39h28c39a1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.2-h7310d3a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.2.1-hd75f5a5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.0-hd75f5a5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.2.2-py39haf03413_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.50.14-h19c1c8a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pango-1.52.2-h7f2093b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.43-h0ad2156_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.3.0-py39h9dabb2a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pixman-0.43.4-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-hc929b4f_1001.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 @@ -531,7 +528,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-dotenv-0.5.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-order-1.0.1-pyhd8ed1ab_0.tar.bz2 @@ -545,7 +542,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.1-py39hdc70f33_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.18.0-py39hcf47035_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.13.0-py39h0ed1e0f_0.conda @@ -572,9 +569,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.5-h829000d_0.conda osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hcb7b3dd_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hd03087b_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.4.0-py39h2804cbe_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.4.2-py39h2804cbe_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bmipy-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-hb547adb_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.1.0-hb547adb_1.conda @@ -593,12 +590,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/expat-2.6.2-hebf3989_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.14.2-h82840c6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 @@ -613,17 +610,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-tools-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.13-hebf3989_1003.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-2.50.0-hc7d6d94_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-2.50.0-h54e2d63_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk2-2.24.33-h7895bb2_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-8.3.0-h8f0ba13_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-8.4.0-hbe0f7c0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-73.2-hc8870d7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.22.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jupyter_core-5.7.2-py39h2804cbe_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.1-pyhd8ed1ab_0.conda @@ -657,13 +654,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.58.0-hb3d354b_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.6.0-h07db509_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtool-2.4.7-hb7217d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-1.3.2-hf30222e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.3.2-h93a5062_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-1.4.0-h54798ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.15-hf346824_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.12.6-h0d0cfa8_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.3-hcd81f8e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.4-hbf6887a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.5-py39h17cfd9d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.4-py39hdf13c20_0.conda @@ -679,17 +675,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.12.0-h2ffa867_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py39h7aa2656_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.1-h0d3ecfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-h0d3ecfb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.2-py39h47e51b9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.50.14-hcf40dda_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.52.2-hb067d4f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.43-h26f9a81_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-10.3.0-py39h3352c98_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.43.4-hebf3989_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-h27ca646_1001.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/py-cpuinfo-9.0.0-pyhd8ed1ab_0.tar.bz2 @@ -697,7 +693,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-dotenv-0.5.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-order-1.0.1-pyhd8ed1ab_0.tar.bz2 @@ -711,7 +707,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.1-py39h0f82c59_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.18.0-py39h9a407ce_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.13.0-py39hcc04109_0.conda @@ -739,7 +735,7 @@ environments: win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/black-24.4.0-py39hcbf5309_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/black-24.4.2-py39hcbf5309_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/bmipy-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.1.0-hcfcfb64_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.1.0-hcfcfb64_1.conda @@ -758,12 +754,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/expat-2.6.2-h63175ca_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.14.2-hbde0cde_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2 @@ -774,16 +770,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/fribidi-1.0.10-h8d14728_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.12.1-h1537add_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/getopt-win32-0.1-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/gettext-0.22.5-h5728263_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/gettext-tools-0.22.5-h7d00a51_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_6.conda - conda: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_6.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.13-h63175ca_1003.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-2.50.0-had6c3a3_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.24.1-h001b923_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.1-hb4038d2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-2.50.0-hb5dec95_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.24.1-h001b923_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.1-hb4038d2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-8.3.0-h7ab893a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-8.4.0-h7ab893a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-73.2-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-resources-6.4.0-pyhd8ed1ab_0.conda @@ -791,7 +785,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_965.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.22.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/jupyter_core-5.7.2-py39hcbf5309_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.1-pyhd8ed1ab_0.conda @@ -799,20 +793,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.2-heb0366b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libasprintf-0.22.5-h5728263_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libasprintf-devel-0.22.5-h5728263_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-22_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.1.0-hcfcfb64_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.1.0-hcfcfb64_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.1.0-hcfcfb64_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-22_win64_mkl.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.3-default_hf64faad_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.4-default_hf64faad_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.20-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h312136b_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-0.22.5-h5728263_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-devel-0.22.5-h5728263_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.80.0-h39d0aa6_6.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.10.0-default_h2fffb23_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-hcfcfb64_2.conda @@ -825,8 +815,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.3-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.6.0-hddb2be6_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libvorbis-1.3.7-h0e60522_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-1.3.2-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.3.2-hcfcfb64_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-1.4.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.4.0-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.15-hcd874cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.6-hc3477c8_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda @@ -851,17 +841,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.12.0-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py39hddb5d58_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.2-h3d672ee_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.0-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.2.2-py39h32e6231_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.50.14-h07c897b_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.52.2-h07c897b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.43-h17e33f8_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-10.3.0-py39h9ee4981_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.43.4-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2 @@ -873,7 +863,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/pyqt5-sip-12.12.2-py39h99910a6_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh0701188_6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-benchmark-4.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-dotenv-0.5.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-order-1.0.1-pyhd8ed1ab_0.tar.bz2 @@ -888,7 +878,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-306-py39h99910a6_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.1-py39ha55989b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/qt-main-5.15.8-hcef0176_21.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.18.0-py39hf21820d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.13.0-py39hddb5d58_0.conda @@ -1009,77 +999,81 @@ packages: - kind: conda name: atk-1.0 version: 2.38.0 - build: h1d18e73_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/atk-1.0-2.38.0-h1d18e73_1.tar.bz2 - sha256: 7af1f86cfc85b1e57547e2a81c069095545ff6a52f3f8e15184df954dce446dd - md5: 5a538295f97a484ee332aacc131718b5 + build: h04ea711_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda + sha256: df682395d05050cd1222740a42a551281210726a67447e5258968dd55854302e + md5: f730d54ba9cd543666d7220c9f7ed563 depends: - - libcxx >=14.0.4 - - libglib >=2.74.1,<3.0a0 + - libgcc-ng >=12 + - libglib >=2.80.0,<3.0a0 + - libstdcxx-ng >=12 constrains: - atk-1.0 2.38.0 license: LGPL-2.0-or-later license_family: LGPL - size: 367515 - timestamp: 1667421223751 + size: 355900 + timestamp: 1713896169874 - kind: conda name: atk-1.0 version: 2.38.0 - build: hcb7b3dd_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hcb7b3dd_1.tar.bz2 - sha256: d40f103467fd2fa426072691919fd135a4fed4a2b03cd12256ff0fee37a98249 - md5: 3c98bfeed7717a9cf5af18c295f49f3a + build: h4bec284_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/atk-1.0-2.38.0-h4bec284_2.conda + sha256: a5972a943764e46478c966b26be61de70dcd7d0cfda4bd0b0c46916ae32e0492 + md5: d9684247c943d492d9aac8687bc5db77 depends: - - libcxx >=14.0.4 - - libglib >=2.74.1,<3.0a0 + - __osx >=10.9 + - libcxx >=16 + - libglib >=2.80.0,<3.0a0 + - libintl >=0.22.5,<1.0a0 constrains: - atk-1.0 2.38.0 license: LGPL-2.0-or-later license_family: LGPL - size: 373158 - timestamp: 1667421529784 + size: 349989 + timestamp: 1713896423623 - kind: conda name: atk-1.0 version: 2.38.0 - build: hd4edc92_1 - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2 - sha256: 2f9314de13c1f0b54510a2afa0cdc02c0e3f828fccfc4277734f9590b11a65f1 - md5: 6c72ec3e660a51736913ef6ea68c454b + build: hd03087b_2 + build_number: 2 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hd03087b_2.conda + sha256: b0747f9b1bc03d1932b4d8c586f39a35ac97e7e72fe6e63f2b2a2472d466f3c1 + md5: 57301986d02d30d6805fdce6c99074ee depends: - - libgcc-ng >=12 - - libglib >=2.74.1,<3.0a0 - - libstdcxx-ng >=12 + - __osx >=11.0 + - libcxx >=16 + - libglib >=2.80.0,<3.0a0 + - libintl >=0.22.5,<1.0a0 constrains: - atk-1.0 2.38.0 license: LGPL-2.0-or-later license_family: LGPL - size: 551928 - timestamp: 1667420962627 + size: 347530 + timestamp: 1713896411580 - kind: conda name: atk-1.0 version: 2.38.0 - build: hf4e84e4_1 - build_number: 1 + build: hedc4a1f_2 + build_number: 2 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/atk-1.0-2.38.0-hf4e84e4_1.tar.bz2 - sha256: e7b18a14dab4a22948fde59a680b30e1b7d7093717fc008f783411cf9a9c3fbb - md5: 515464ef36136ee19a64d0511f77df62 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/atk-1.0-2.38.0-hedc4a1f_2.conda + sha256: 69f70048a1a915be7b8ad5d2cbb7bf020baa989b5506e45a676ef4ef5106c4f0 + md5: 9308557e2328f944bd5809c5630761af depends: - libgcc-ng >=12 - - libglib >=2.74.1,<3.0a0 + - libglib >=2.80.0,<3.0a0 - libstdcxx-ng >=12 constrains: - atk-1.0 2.38.0 license: LGPL-2.0-or-later license_family: LGPL - size: 537714 - timestamp: 1667422475490 + size: 358327 + timestamp: 1713898303194 - kind: conda name: attr version: 2.5.1 @@ -1112,12 +1106,12 @@ packages: timestamp: 1704011393776 - kind: conda name: black - version: 24.4.0 + version: 24.4.2 build: py39h2804cbe_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.4.0-py39h2804cbe_0.conda - sha256: 3d12f3e21af54a94785ef6ee5171e21b8220567dccd2d8f57c1b438f96c3124c - md5: 60acbe8e0836174d8acdc0741edae95e + url: https://conda.anaconda.org/conda-forge/osx-arm64/black-24.4.2-py39h2804cbe_0.conda + sha256: 03afc54e43fcb70b22dd2a7a734882007216b8a3181d9d098ea6c116ac974af2 + md5: 7ee0de95f9dd40e50a067b3edf567d33 depends: - click >=8.0.0 - mypy_extensions >=0.4.3 @@ -1131,16 +1125,16 @@ packages: - typing_extensions >=4.0.1 license: MIT license_family: MIT - size: 295842 - timestamp: 1713170240040 + size: 303017 + timestamp: 1714119944526 - kind: conda name: black - version: 24.4.0 + version: 24.4.2 build: py39h4420490_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/black-24.4.0-py39h4420490_0.conda - sha256: 18ef7d8c330543638d9ad59af32450c5ed6a9da391e4a2ed251b4371d8ac405b - md5: 669244a72ec72f69c37ce1abb8bc779a + url: https://conda.anaconda.org/conda-forge/linux-aarch64/black-24.4.2-py39h4420490_0.conda + sha256: ac888294ff7d83003926a77e5493b4ca6c951adc6f40be95105aeb1a0c052702 + md5: 524a56d77c08d2ebf3869357356b3d60 depends: - click >=8.0.0 - mypy_extensions >=0.4.3 @@ -1154,16 +1148,16 @@ packages: - typing_extensions >=4.0.1 license: MIT license_family: MIT - size: 295234 - timestamp: 1713169939257 + size: 301607 + timestamp: 1714119855598 - kind: conda name: black - version: 24.4.0 + version: 24.4.2 build: py39h6e9494a_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/black-24.4.0-py39h6e9494a_0.conda - sha256: 242d81c1f42cc05251c14c026a46893b80049ff51245d238bd544169e6a3388d - md5: 6ff063cb36c442fe6c9fe1c967d63c3e + url: https://conda.anaconda.org/conda-forge/osx-64/black-24.4.2-py39h6e9494a_0.conda + sha256: def6012f4789ff61bd8f6d1cec32b2c54ce60de7401e9ec5752f868972f64568 + md5: 90ccc6f946cba439366661b0e3f552e0 depends: - click >=8.0.0 - mypy_extensions >=0.4.3 @@ -1176,16 +1170,16 @@ packages: - typing_extensions >=4.0.1 license: MIT license_family: MIT - size: 296256 - timestamp: 1713170150683 + size: 301980 + timestamp: 1714119822546 - kind: conda name: black - version: 24.4.0 + version: 24.4.2 build: py39hcbf5309_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/black-24.4.0-py39hcbf5309_0.conda - sha256: 68131bc0059be9c068c66e4bbbf001057f8203a1f7b225cd626e3adc76d52bcb - md5: 57a4ad13192a81129a2973401b273991 + url: https://conda.anaconda.org/conda-forge/win-64/black-24.4.2-py39hcbf5309_0.conda + sha256: 21a520064499ff3de16d577ca026d3c49dcaaaeb12d89b1573962218aae57b81 + md5: 6b4f72c3d5590e626ee37f8e6564f097 depends: - click >=8.0.0 - mypy_extensions >=0.4.3 @@ -1198,16 +1192,16 @@ packages: - typing_extensions >=4.0.1 license: MIT license_family: MIT - size: 312668 - timestamp: 1713170377640 + size: 320216 + timestamp: 1714120236535 - kind: conda name: black - version: 24.4.0 + version: 24.4.2 build: py39hf3d152e_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/black-24.4.0-py39hf3d152e_0.conda - sha256: bf5180d0f08d4981ca0d634300159239e896f088fd3f2bb471f457f135d6170d - md5: f5c5f1be0443783cce4f8336c4ae3d4c + url: https://conda.anaconda.org/conda-forge/linux-64/black-24.4.2-py39hf3d152e_0.conda + sha256: 90ad8c9891113451ae5f363eefcecd65a487d758fed7bba53df6564f3d8215b2 + md5: 4e57cd7b3828beb539dd5da422fb1525 depends: - click >=8.0.0 - mypy_extensions >=0.4.3 @@ -1220,8 +1214,8 @@ packages: - typing_extensions >=4.0.1 license: MIT license_family: MIT - size: 295618 - timestamp: 1713169849810 + size: 301934 + timestamp: 1714119735053 - kind: conda name: bmipy version: 2.0.1 @@ -2107,18 +2101,18 @@ packages: timestamp: 1710362455984 - kind: conda name: filelock - version: 3.13.4 + version: 3.14.0 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.4-pyhd8ed1ab_0.conda - sha256: 2eef860d5ad6ef1fac5002a3b75661f765d448e9f997f64482b0e51a097e037f - md5: 6baa2e7fc09bd2c7c82cb6662d5f1d36 + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.14.0-pyhd8ed1ab_0.conda + sha256: 6031be667e1b0cc0dee713f1cbca887cdee4daafa8bac478da33096f3147d38b + md5: 831d85ae0acfba31b8efd0f0d07da736 depends: - python >=3.7 license: Unlicense - size: 15707 - timestamp: 1712686250786 + size: 15902 + timestamp: 1714422911808 - kind: conda name: flaky version: 3.8.1 @@ -2176,17 +2170,17 @@ packages: - kind: conda name: font-ttf-ubuntu version: '0.83' - build: h77eed37_1 - build_number: 1 + build: h77eed37_2 + build_number: 2 subdir: noarch noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_1.conda - sha256: 056c85b482d58faab5fd4670b6c1f5df0986314cca3bc831d458b22e4ef2c792 - md5: 6185f640c43843e5ad6fd1c5372c3f80 + url: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda + sha256: c940f6e969143e13a3a9660abb3c7e7e23b8319efb29dbdd5dee0b9939236e13 + md5: cbbe59391138ea5ad3658c76912e147f license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 license_family: Other - size: 1619820 - timestamp: 1700944216729 + size: 1622566 + timestamp: 1714483134319 - kind: conda name: fontconfig version: 2.14.2 @@ -2740,27 +2734,6 @@ packages: license_family: GPL size: 21903 timestamp: 1694400856979 -- kind: conda - name: gettext - version: 0.22.5 - build: h5728263_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/gettext-0.22.5-h5728263_2.conda - sha256: cd4ef93fd052a4fe89a4db963c9d69e60c8a434d41968fc9dc8726db67191582 - md5: da84216f88a8c89eb943c683ceb34d7d - depends: - - gettext-tools 0.22.5 h7d00a51_2 - - libasprintf 0.22.5 h5728263_2 - - libasprintf-devel 0.22.5 h5728263_2 - - libgettextpo 0.22.5 h5728263_2 - - libgettextpo-devel 0.22.5 h5728263_2 - - libiconv >=1.17,<2.0a0 - - libintl 0.22.5 h5728263_2 - - libintl-devel 0.22.5 h5728263_2 - license: LGPL-2.1-or-later AND GPL-3.0-or-later - size: 34028 - timestamp: 1712517225377 - kind: conda name: gettext version: 0.22.5 @@ -2856,25 +2829,6 @@ packages: license_family: GPL size: 2501207 timestamp: 1712512940076 -- kind: conda - name: gettext-tools - version: 0.22.5 - build: h7d00a51_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/gettext-tools-0.22.5-h7d00a51_2.conda - sha256: e3621dc3d48399c89bf0dd512a6a398d354429b3b84219473d674aa56e0feef2 - md5: ef1c3bb48c013099c4872640a5f2096c - depends: - - libiconv >=1.17,<2.0a0 - - libintl 0.22.5 h5728263_2 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: GPL-3.0-or-later - license_family: GPL - size: 3415835 - timestamp: 1712516856107 - kind: conda name: gettext-tools version: 0.22.5 @@ -3098,165 +3052,150 @@ packages: - kind: conda name: graphviz version: 2.50.0 - build: h5abf519_3 - build_number: 3 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/graphviz-2.50.0-h5abf519_3.tar.bz2 - sha256: f3e2c487b545506ff20eb0dd48a1ec34e97d48357d98158326b743e1c790f3b8 - md5: b3270521ce5733ce016ee094ef2e8d27 + build: h54e2d63_4 + build_number: 4 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-2.50.0-h54e2d63_4.conda + sha256: 87765d9510980c5ede7a693ce154919c885bff9815f2dff362716b72be31f7eb + md5: cdd926b037948deb2fc86f629619acac depends: - - cairo >=1.16.0,<2.0.0a0 - - expat >=2.4.8,<3.0a0 - - fontconfig >=2.13.96,<3.0a0 + - cairo >=1.18.0,<2.0a0 - fonts-conda-ecosystem - - freetype >=2.10.4,<3.0a0 - - gdk-pixbuf >=2.42.8,<3.0a0 + - gdk-pixbuf >=2.42.11,<3.0a0 - gtk2 - gts >=0.7.6,<0.8.0a0 - - libgcc-ng >=12 + - libcxx >=16 + - libexpat >=2.6.2,<3.0a0 - libgd >=2.3.3,<2.4.0a0 - - libglib >=2.70.2,<3.0a0 - - librsvg >=2.54.4,<3.0a0 - - libstdcxx-ng >=12 - - libtool - - libwebp-base - - libzlib >=1.2.12,<1.3.0a0 - - pango >=1.50.8,<1.51.0a0 - - zlib >=1.2.12,<1.3.0a0 + - libglib >=2.80.0,<3.0a0 + - librsvg >=2.58.0,<3.0a0 + - libwebp-base >=1.3.2,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - pango >=1.50.14,<2.0a0 license: EPL-1.0 license_family: Other - size: 3101737 - timestamp: 1657298141011 + size: 2355251 + timestamp: 1714468855930 - kind: conda name: graphviz version: 2.50.0 - build: h856fde9_3 - build_number: 3 + build: h65e8cce_4 + build_number: 4 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/graphviz-2.50.0-h856fde9_3.tar.bz2 - sha256: 92897043ad8119d02fb703898b4c507157e79152da14d75d5d2024761446d0ba - md5: caefd71249206ab252d41f3931d65755 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/graphviz-2.50.0-h65e8cce_4.conda + sha256: 6190ee42bb016d852839f6f290e8976ffdd20879d565b19621b4ae0cdffd1967 + md5: 84cd8b382d647ef29aeca151a2393bf7 depends: - - cairo >=1.16.0,<2.0.0a0 - - expat >=2.4.8,<3.0a0 - - fontconfig >=2.13.96,<3.0a0 + - cairo >=1.18.0,<2.0a0 - fonts-conda-ecosystem - - freetype >=2.10.4,<3.0a0 - - gdk-pixbuf >=2.42.8,<3.0a0 + - gdk-pixbuf >=2.42.11,<3.0a0 - gtk2 - gts >=0.7.6,<0.8.0a0 + - libexpat >=2.6.2,<3.0a0 - libgcc-ng >=12 - libgd >=2.3.3,<2.4.0a0 - - libglib >=2.70.2,<3.0a0 - - librsvg >=2.54.4,<3.0a0 + - libglib >=2.80.0,<3.0a0 + - librsvg >=2.58.0,<3.0a0 - libstdcxx-ng >=12 - - libtool - - libwebp-base - - libzlib >=1.2.12,<1.3.0a0 - - pango >=1.50.8,<1.51.0a0 - - zlib >=1.2.12,<1.3.0a0 + - libwebp-base >=1.3.2,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - pango >=1.50.14,<2.0a0 license: EPL-1.0 license_family: Other - size: 3293635 - timestamp: 1657298269723 + size: 2683034 + timestamp: 1714468037338 - kind: conda name: graphviz version: 2.50.0 - build: ha5baa68_3 - build_number: 3 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/graphviz-2.50.0-ha5baa68_3.tar.bz2 - sha256: 8c98ae0d99a756a5551ca192211588fc6f812cc411c0e20a13ad89b32c7540db - md5: edf6407c328dc71d699da7cc25fb2e17 + build: h78e8752_4 + build_number: 4 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/graphviz-2.50.0-h78e8752_4.conda + sha256: c0e5ea955a6de926555293d7284e93c4a09078143678f3f01280d4b1716c637d + md5: f2b8527693867d72d94e4ed4126637cd depends: - - cairo >=1.16.0,<2.0.0a0 - - expat >=2.4.8,<3.0a0 - - fontconfig >=2.13.96,<3.0a0 + - cairo >=1.18.0,<2.0a0 - fonts-conda-ecosystem - - freetype >=2.10.4,<3.0a0 - - gdk-pixbuf >=2.42.8,<3.0a0 + - gdk-pixbuf >=2.42.11,<3.0a0 - gtk2 - gts >=0.7.6,<0.8.0a0 - - libcxx >=13.0.1 + - libexpat >=2.6.2,<3.0a0 + - libgcc-ng >=12 - libgd >=2.3.3,<2.4.0a0 - - libglib >=2.70.2,<3.0a0 - - librsvg >=2.54.4,<3.0a0 - - libtool - - libwebp-base - - libzlib >=1.2.12,<1.3.0a0 - - pango >=1.50.8,<1.51.0a0 - - zlib >=1.2.12,<1.3.0a0 + - libglib >=2.80.0,<3.0a0 + - librsvg >=2.58.0,<3.0a0 + - libstdcxx-ng >=12 + - libwebp-base >=1.3.2,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - pango >=1.50.14,<2.0a0 license: EPL-1.0 license_family: Other - size: 3143040 - timestamp: 1657298531555 + size: 2584669 + timestamp: 1714468118750 - kind: conda name: graphviz version: 2.50.0 - build: had6c3a3_3 - build_number: 3 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/graphviz-2.50.0-had6c3a3_3.tar.bz2 - sha256: efd04d88d2951771c57e78bfe7335c945645e7fe3b3501dd963f93e56895e002 - md5: 77a30e29d9b7980092597245a1a13ce1 + build: h8671558_4 + build_number: 4 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/graphviz-2.50.0-h8671558_4.conda + sha256: 516ed5c20eebf54db55f6e14cc5e1571ed2b9bffc12fb83d6f3da99950d782c3 + md5: 5af4ac346b120e4ede0a98a94e65e5ac depends: - - cairo >=1.16.0,<2.0.0a0 - - expat >=2.4.8,<3.0a0 - - getopt-win32 >=0.1,<0.2.0a0 + - cairo >=1.18.0,<2.0a0 + - fonts-conda-ecosystem + - gdk-pixbuf >=2.42.11,<3.0a0 + - gtk2 - gts >=0.7.6,<0.8.0a0 + - libcxx >=16 + - libexpat >=2.6.2,<3.0a0 - libgd >=2.3.3,<2.4.0a0 - - libglib >=2.70.2,<3.0a0 - - pango >=1.50.8,<1.51.0a0 - - vc >=14.1,<15 - - vs2015_runtime >=14.16.27033 + - libglib >=2.80.0,<3.0a0 + - librsvg >=2.58.0,<3.0a0 + - libwebp-base >=1.3.2,<2.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - pango >=1.50.14,<2.0a0 license: EPL-1.0 license_family: Other - size: 1112429 - timestamp: 1657298699584 + size: 2441315 + timestamp: 1714468654219 - kind: conda name: graphviz version: 2.50.0 - build: hc7d6d94_3 - build_number: 3 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-2.50.0-hc7d6d94_3.tar.bz2 - sha256: 3f285cc1d9af7a116cc988e0b03dc18efb16e501662c0221563ed1a1df0c9c5c - md5: 6dfdcc31332b1d93206888208cfc234d + build: hb5dec95_4 + build_number: 4 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/graphviz-2.50.0-hb5dec95_4.conda + sha256: 925ef4ef92512197c4ed0afbd748b2c202130b38ed823f06672e325abcbe0a28 + md5: 6e6b1732a1882bd5e316017f7b3847cd depends: - - cairo >=1.16.0,<2.0.0a0 - - expat >=2.4.8,<3.0a0 - - fontconfig >=2.13.96,<3.0a0 - - fonts-conda-ecosystem - - freetype >=2.10.4,<3.0a0 - - gdk-pixbuf >=2.42.8,<3.0a0 - - gtk2 + - cairo >=1.18.0,<2.0a0 + - getopt-win32 >=0.1,<0.2.0a0 - gts >=0.7.6,<0.8.0a0 - - libcxx >=13.0.1 + - libexpat >=2.6.2,<3.0a0 - libgd >=2.3.3,<2.4.0a0 - - libglib >=2.70.2,<3.0a0 - - librsvg >=2.54.4,<3.0a0 - - libtool - - libwebp-base - - libzlib >=1.2.12,<1.3.0a0 - - pango >=1.50.8,<1.51.0a0 - - zlib >=1.2.12,<1.3.0a0 + - libglib >=2.80.0,<3.0a0 + - pango >=1.50.14,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: EPL-1.0 license_family: Other - size: 2851615 - timestamp: 1657298551055 + size: 928271 + timestamp: 1714468744451 - kind: conda name: gst-plugins-base version: 1.24.1 - build: h001b923_1 - build_number: 1 + build: h001b923_2 + build_number: 2 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.24.1-h001b923_1.conda - sha256: 14cdc32e1adf2876d23623cc2047489d7bad122b7020e2b23357bd2416744b80 - md5: 7900eb39e6203249accb52fb705a2fb0 + url: https://conda.anaconda.org/conda-forge/win-64/gst-plugins-base-1.24.1-h001b923_2.conda + sha256: e5710147fe1c1b0daf20e0decfbbb1504877600fdc602c12a62713b5dc0e817c + md5: 03bbe386d95cdce0d6069b09ce1698af depends: - - gettext >=0.21.1,<1.0a0 - - gstreamer 1.24.1 hb4038d2_1 - - libglib >=2.78.4,<3.0a0 + - gstreamer 1.24.1 hb4038d2_2 + - libglib >=2.80.0,<3.0a0 + - libintl >=0.22.5,<1.0a0 - libogg >=1.3.4,<1.4.0a0 - libvorbis >=1.3.7,<1.4.0a0 - libzlib >=1.2.13,<1.3.0a0 @@ -3264,23 +3203,21 @@ packages: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LGPL-2.0-or-later - license_family: LGPL - size: 2090953 - timestamp: 1711319124984 + size: 2066034 + timestamp: 1714679123942 - kind: conda name: gst-plugins-base version: 1.24.1 - build: hfa15dee_1 - build_number: 1 + build: hfa15dee_2 + build_number: 2 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.1-hfa15dee_1.conda - sha256: 4228bb9b568a09f8e31f0d52d6ccf06e7752dfa1d72af15ee11fd347e6795bca - md5: a6dd2bbc684913e2bef0a54ce56fcbfb + url: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.1-hfa15dee_2.conda + sha256: 619755008b457efd8c58dcdf05f4a4c216de4c99e641652a750c2035b8292951 + md5: 5ff6ce5ae6e2591b13dd772ba84d8e86 depends: - __glibc >=2.17,<3.0.a0 - alsa-lib >=1.2.11,<1.3.0a0 - - gettext >=0.21.1,<1.0a0 - - gstreamer 1.24.1 h98fc4e7_1 + - gstreamer 1.24.1 h98fc4e7_2 - libexpat >=2.6.2,<3.0a0 - libgcc-ng >=12 - libglib >=2.80.0,<3.0a0 @@ -3291,56 +3228,52 @@ packages: - libvorbis >=1.3.7,<1.4.0a0 - libxcb >=1.15,<1.16.0a0 - libzlib >=1.2.13,<1.3.0a0 - - xorg-libx11 >=1.8.7,<2.0a0 + - xorg-libx11 >=1.8.9,<2.0a0 - xorg-libxau >=1.0.11,<2.0a0 - xorg-libxext >=1.3.4,<2.0a0 - xorg-libxrender >=0.9.11,<0.10.0a0 license: LGPL-2.0-or-later - license_family: LGPL - size: 2789211 - timestamp: 1711318581613 + size: 2787559 + timestamp: 1714678437793 - kind: conda name: gstreamer version: 1.24.1 - build: h98fc4e7_1 - build_number: 1 + build: h98fc4e7_2 + build_number: 2 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.1-h98fc4e7_1.conda - sha256: a341496165602c8de4e537e596ba8f5070232d0362a9fe36b3591116a0f0752d - md5: b04b5cdf3ba01430db27979250bc5a1d + url: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.1-h98fc4e7_2.conda + sha256: 90c9fd1f44a3a000f822d42122fcb6bf78be5ec1cdf5821f9dd38db1403a9cb0 + md5: 3dc9f89a302e171e4361b75a7bef916f depends: - __glibc >=2.17,<3.0.a0 - - gettext >=0.21.1,<1.0a0 - glib >=2.80.0,<3.0a0 - libgcc-ng >=12 - libglib >=2.80.0,<3.0a0 - libiconv >=1.17,<2.0a0 - libstdcxx-ng >=12 license: LGPL-2.0-or-later - license_family: LGPL - size: 2010273 - timestamp: 1711318435463 + size: 2020162 + timestamp: 1714678301278 - kind: conda name: gstreamer version: 1.24.1 - build: hb4038d2_1 - build_number: 1 + build: hb4038d2_2 + build_number: 2 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.1-hb4038d2_1.conda - sha256: f2ee66bb1ef3d12f9c2d6784d2c4bf19bb9d4e99c55c96ca4df53c9bd308c084 - md5: 8a6dfe53ad02a3b151e6383a950043ee + url: https://conda.anaconda.org/conda-forge/win-64/gstreamer-1.24.1-hb4038d2_2.conda + sha256: cbc822831fcf84b994e6e4f6fcb0492508405324e829b4b718b9fa78b41b080c + md5: 881e39a9b90dc6e6a31ba5ce44fca0ac depends: - - gettext >=0.21.1,<1.0a0 - - glib >=2.78.4,<3.0a0 - - libglib >=2.78.4,<3.0a0 + - glib >=2.80.0,<3.0a0 + - libglib >=2.80.0,<3.0a0 - libiconv >=1.17,<2.0a0 + - libintl >=0.22.5,<1.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: LGPL-2.0-or-later - license_family: LGPL - size: 2069365 - timestamp: 1711318923388 + size: 2031181 + timestamp: 1714678922367 - kind: conda name: gtk2 version: 2.24.33 @@ -3517,105 +3450,103 @@ packages: timestamp: 1686545503242 - kind: conda name: harfbuzz - version: 8.3.0 + version: 8.4.0 build: h3d44ed6_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.3.0-h3d44ed6_0.conda - sha256: 4b55aea03b18a4084b750eee531ad978d4a3690f63019132c26c6ad26bbe3aed - md5: 5a6f6c00ef982a9bc83558d9ac8f64a0 + url: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.4.0-h3d44ed6_0.conda + sha256: d27441d53498f28a36a1612d8f767bae0418076e9c08dcd2cd511c8439d2fb4d + md5: 27f46291a6aaa3c2a4f798ebd35a7ddb depends: - cairo >=1.18.0,<2.0a0 - freetype >=2.12.1,<3.0a0 - graphite2 - icu >=73.2,<74.0a0 - libgcc-ng >=12 - - libglib >=2.78.1,<3.0a0 + - libglib >=2.80.0,<3.0a0 - libstdcxx-ng >=12 license: MIT license_family: MIT - size: 1547473 - timestamp: 1699925311766 + size: 1587652 + timestamp: 1713957638950 - kind: conda name: harfbuzz - version: 8.3.0 + version: 8.4.0 + build: h72fa137_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-8.4.0-h72fa137_0.conda + sha256: 1618a47f7001c149c95beb84647f5260f17297c6d52a900de4924873397f9fba + md5: 7d065a2266ae5eb2a5d91a6dca4fca69 + depends: + - cairo >=1.18.0,<2.0a0 + - freetype >=2.12.1,<3.0a0 + - graphite2 + - icu >=73.2,<74.0a0 + - libcxx >=16 + - libglib >=2.80.0,<3.0a0 + license: MIT + license_family: MIT + size: 1356068 + timestamp: 1713957909497 +- kind: conda + name: harfbuzz + version: 8.4.0 build: h7ab893a_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-8.3.0-h7ab893a_0.conda - sha256: 5365595303d95810d10662b46f9e857cedc82757cc7b5576bda30e15d66bb3ad - md5: b8ef0beb91df83c5e6038c9509b9f730 + url: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-8.4.0-h7ab893a_0.conda + sha256: 725d669f2c72fc1c09ddf3151aacb5a5ef7ebb5f6d3e6217464b9a741a6d5d15 + md5: bf9b853f9702724a5ec4e68dc637cc29 depends: - cairo >=1.18.0,<2.0a0 - freetype >=2.12.1,<3.0a0 - graphite2 - icu >=73.2,<74.0a0 - - libglib >=2.78.1,<3.0a0 + - libglib >=2.80.0,<3.0a0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: MIT license_family: MIT - size: 1070592 - timestamp: 1699926990335 + size: 1081529 + timestamp: 1713958941420 - kind: conda name: harfbuzz - version: 8.3.0 - build: h8f0ba13_0 + version: 8.4.0 + build: hbe0f7c0_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-8.3.0-h8f0ba13_0.conda - sha256: 55e95aee9e5be7ada5a1cccedf1bb74c1362a7504cb0251fb48bcfa8bbd7cae3 - md5: 71e7f9ba27feae122733bb9f1bfe594c + url: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-8.4.0-hbe0f7c0_0.conda + sha256: 633d8258bbfc59ba85726320003271b40bd7b7addc9d0b8622241ebd57310cf2 + md5: 030a2b3b032cd2616b78439e01f79347 depends: - - __osx >=10.9 - cairo >=1.18.0,<2.0a0 - freetype >=2.12.1,<3.0a0 - graphite2 - icu >=73.2,<74.0a0 - - libcxx >=16.0.6 - - libglib >=2.78.1,<3.0a0 + - libcxx >=16 + - libglib >=2.80.0,<3.0a0 license: MIT license_family: MIT - size: 1295036 - timestamp: 1699925935335 + size: 1307565 + timestamp: 1713958317353 - kind: conda name: harfbuzz - version: 8.3.0 + version: 8.4.0 build: hebeb849_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-8.3.0-hebeb849_0.conda - sha256: f6f39bb13d0070565e8975ad5f23005ce894655422a1c50089e6d754c69be084 - md5: 1c06a74f88f085c2af16809fe4c31b73 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-8.4.0-hebeb849_0.conda + sha256: 3dde2e2b341e445867ab2ac673c25e3ab443b4b9f6fefe6cd81f863aa30de98a + md5: 043a2675fc55e43f0fa681d79eb976f4 depends: - cairo >=1.18.0,<2.0a0 - freetype >=2.12.1,<3.0a0 - graphite2 - icu >=73.2,<74.0a0 - libgcc-ng >=12 - - libglib >=2.78.1,<3.0a0 + - libglib >=2.80.0,<3.0a0 - libstdcxx-ng >=12 license: MIT license_family: MIT - size: 1583124 - timestamp: 1699927567410 -- kind: conda - name: harfbuzz - version: 8.3.0 - build: hf45c392_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/harfbuzz-8.3.0-hf45c392_0.conda - sha256: c6ea14e4f4869bc78b27276c09832af845dfa415585362ed6064e37a1b5fe9c5 - md5: 41d890485f909e4ecdc608741718c75e - depends: - - __osx >=10.9 - - cairo >=1.18.0,<2.0a0 - - freetype >=2.12.1,<3.0a0 - - graphite2 - - icu >=73.2,<74.0a0 - - libcxx >=16.0.6 - - libglib >=2.78.1,<3.0a0 - license: MIT - license_family: MIT - size: 1342172 - timestamp: 1699925847743 + size: 1783122 + timestamp: 1713960304200 - kind: conda name: icu version: '73.2' @@ -3781,13 +3712,13 @@ packages: timestamp: 1704967140287 - kind: conda name: jsonschema - version: 4.21.1 + version: 4.22.0 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.21.1-pyhd8ed1ab_0.conda - sha256: c5c1b4e08e91fdd697289015be1a176409b4e63942899a43b276f1f250be8129 - md5: 8a3a3d01629da20befa340919e3dd2c4 + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.22.0-pyhd8ed1ab_0.conda + sha256: 57a466e8c42635d8e930fa065dc6e461f4215aa259ab03873eacb03ddaeefc8a + md5: b9661a4b1200d6bc7d8a4cdafdc91468 depends: - attrs >=22.2.0 - importlib_resources >=1.4.0 @@ -3797,9 +3728,8 @@ packages: - referencing >=0.28.4 - rpds-py >=0.7.1 license: MIT - license_family: MIT - size: 72817 - timestamp: 1705707712082 + size: 74149 + timestamp: 1714573245148 - kind: conda name: jsonschema-specifications version: 2023.12.1 @@ -4171,6 +4101,7 @@ packages: constrains: - binutils_impl_linux-64 2.40 license: GPL-3.0-only + license_family: GPL size: 713322 timestamp: 1713651222435 - kind: conda @@ -4184,6 +4115,7 @@ packages: constrains: - binutils_impl_linux-aarch64 2.40 license: GPL-3.0-only + license_family: GPL size: 735254 timestamp: 1713651051970 - kind: conda @@ -4259,18 +4191,6 @@ packages: license_family: Apache size: 290319 timestamp: 1657977526749 -- kind: conda - name: libasprintf - version: 0.22.5 - build: h5728263_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libasprintf-0.22.5-h5728263_2.conda - sha256: 5722a4a260355c9233680a3424a977433f25826ca0a1c05af403d62b805681bc - md5: 75a6982b9ff0a8db0f53303527b07af8 - license: LGPL-2.1-or-later - size: 49778 - timestamp: 1712515968238 - kind: conda name: libasprintf version: 0.22.5 @@ -4310,20 +4230,6 @@ packages: license: LGPL-2.1-or-later size: 40630 timestamp: 1712512727388 -- kind: conda - name: libasprintf-devel - version: 0.22.5 - build: h5728263_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libasprintf-devel-0.22.5-h5728263_2.conda - sha256: d5c711d9da4e35d29f4f2191664075c64cbf8cd481a35bf7ef3a527018eb0184 - md5: 8377da2cc31200d7181d2e48d60e4c7b - depends: - - libasprintf 0.22.5 h5728263_2 - license: LGPL-2.1-or-later - size: 36272 - timestamp: 1712516175913 - kind: conda name: libasprintf-devel version: 0.22.5 @@ -4833,28 +4739,28 @@ packages: timestamp: 1711063711931 - kind: conda name: libclang13 - version: 18.1.3 + version: 18.1.4 build: default_h5d6823c_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.3-default_h5d6823c_0.conda - sha256: 8490f8ca051e80d0f79279d75dabb93e0cadf046984b96bfaeb4c9d6146857fb - md5: 5fff487759736b275dc3e4a263cac666 + url: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.4-default_h5d6823c_0.conda + sha256: 3ec4de4613285b971350c9588125164ed2753bdabfd3a0f6378b7bc832a5a859 + md5: 2c3b47879fc036ef57f3056834737ecb depends: - libgcc-ng >=12 - - libllvm18 >=18.1.3,<18.2.0a0 + - libllvm18 >=18.1.4,<18.2.0a0 - libstdcxx-ng >=12 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 11054286 - timestamp: 1712569057776 + size: 11043670 + timestamp: 1714511189746 - kind: conda name: libclang13 - version: 18.1.3 + version: 18.1.4 build: default_hf64faad_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.3-default_hf64faad_0.conda - sha256: 7ccb5fefe1ca2c8341e402fa726e5b9cea1939feb87b5335b3c4581589ba86d5 - md5: 9217c37b478ec601af909aafc954a6fc + url: https://conda.anaconda.org/conda-forge/win-64/libclang13-18.1.4-default_hf64faad_0.conda + sha256: 126ad517d9d85371566f6668e5207f69bc43e22dea4663674ebd90e23c36f38f + md5: eb322d98026526776d1464c2b04ddbe3 depends: - libzlib >=1.2.13,<1.3.0a0 - ucrt >=10.0.20348.0 @@ -4863,8 +4769,8 @@ packages: - zstd >=1.5.5,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 25293651 - timestamp: 1712568643856 + size: 25328763 + timestamp: 1714517601407 - kind: conda name: libcups version: 2.3.3 @@ -5174,38 +5080,36 @@ packages: - kind: conda name: libgcc-ng version: 13.2.0 - build: h807b86a_5 - build_number: 5 + build: h77fa898_6 + build_number: 6 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda - sha256: d32f78bfaac282cfe5205f46d558704ad737b8dbf71f9227788a5ca80facaba4 - md5: d4ff227c46917d3b4565302a2bbb276b + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_6.conda + sha256: 8bd6311a05f02459eb3efafe948f21e58170ccfcce4350a86de35d7573256bb2 + md5: 4398809ac84d0b8c28beebaaa83277f5 depends: - _libgcc_mutex 0.1 conda_forge - _openmp_mutex >=4.5 constrains: - - libgomp 13.2.0 h807b86a_5 + - libgomp 13.2.0 h77fa898_6 license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 770506 - timestamp: 1706819192021 + size: 777610 + timestamp: 1714581763008 - kind: conda name: libgcc-ng version: 13.2.0 - build: hf8544c7_5 - build_number: 5 + build: he277a41_6 + build_number: 6 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-13.2.0-hf8544c7_5.conda - sha256: 869e44e1cf329198f5bea56c146207ed639b24b6281187159435b9499ecb3959 - md5: dee934e640275d9e74e7bbd455f25162 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-13.2.0-he277a41_6.conda + sha256: 4d50c1686b836d280f16ec8c3a43da2698deab78e2d51ca140a61a993d77290b + md5: 5ca8651e635390d41004c847f03c2d3c depends: - _openmp_mutex >=4.5 constrains: - - libgomp 13.2.0 hf8544c7_5 + - libgomp 13.2.0 he277a41_6 license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 456795 - timestamp: 1706820691781 + size: 458706 + timestamp: 1714581587285 - kind: conda name: libgcrypt version: 1.10.3 @@ -5364,22 +5268,6 @@ packages: license_family: BSD size: 206783 timestamp: 1696161158189 -- kind: conda - name: libgettextpo - version: 0.22.5 - build: h5728263_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-0.22.5-h5728263_2.conda - sha256: 445ecfc4bf5b474c2ac79f716dcb8459a08a532ab13a785744665f086ef94c95 - md5: f4c826b19bf1ccee2a63a2c685039728 - depends: - - libiconv >=1.17,<2.0a0 - - libintl 0.22.5 h5728263_2 - license: GPL-3.0-or-later - license_family: GPL - size: 171210 - timestamp: 1712516290149 - kind: conda name: libgettextpo version: 0.22.5 @@ -5427,23 +5315,6 @@ packages: license_family: GPL size: 159856 timestamp: 1712512788407 -- kind: conda - name: libgettextpo-devel - version: 0.22.5 - build: h5728263_2 - build_number: 2 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libgettextpo-devel-0.22.5-h5728263_2.conda - sha256: bcee730b2be23ba9aa5de3471b78c4644d3b17d5a71e7fdc59bb40e252edb2f7 - md5: 6f42ec61abc6d52a4079800a640319c5 - depends: - - libgettextpo 0.22.5 h5728263_2 - - libiconv >=1.17,<2.0a0 - - libintl 0.22.5 h5728263_2 - license: GPL-3.0-or-later - license_family: GPL - size: 40312 - timestamp: 1712516436925 - kind: conda name: libgettextpo-devel version: 0.22.5 @@ -5527,33 +5398,32 @@ packages: - kind: conda name: libgfortran-ng version: 13.2.0 - build: h69a702a_5 - build_number: 5 + build: h69a702a_6 + build_number: 6 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda - sha256: 238c16c84124d58307376715839aa152bd4a1bf5a043052938ad6c3137d30245 - md5: e73e9cfd1191783392131e6238bdb3e9 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_6.conda + sha256: 5e436753c55d81005e9383d7a8ec14298ebd35029d148db7e03c4834ffca54ee + md5: 3666a850342f8f3be88f9a93d948d027 depends: - - libgfortran5 13.2.0 ha4646dd_5 + - libgfortran5 13.2.0 h43f5ff8_6 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 23829 - timestamp: 1706819413770 + size: 24183 + timestamp: 1713755271389 - kind: conda name: libgfortran-ng version: 13.2.0 - build: he9431aa_5 - build_number: 5 + build: he9431aa_6 + build_number: 6 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-13.2.0-he9431aa_5.conda - sha256: a7e5d1ac34118a4fad8286050af0146226d2fb2bd63e7a1066dc4dae7ba42daa - md5: fab7c6a8c84492e18cbe578820e97a56 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-ng-13.2.0-he9431aa_6.conda + sha256: 5a33b0895b8e7504e488feb0b8cb24476b2d7658082b0002851019f36e2cffa4 + md5: c8ab19934c000ea8cc9cf1fc6c2aa83d depends: - - libgfortran5 13.2.0 h582850c_5 + - libgfortran5 13.2.0 h87d9d71_6 license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 23994 - timestamp: 1706820985230 + size: 24168 + timestamp: 1714581801800 - kind: conda name: libgfortran5 version: 13.2.0 @@ -5574,37 +5444,36 @@ packages: - kind: conda name: libgfortran5 version: 13.2.0 - build: h582850c_5 - build_number: 5 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-13.2.0-h582850c_5.conda - sha256: f778346e85eb19bca36d1a5c8cddf8e089dcd6799b8f3e1b3f2d5a3157920827 - md5: 547486aac825d236de3beecb927b389c + build: h43f5ff8_6 + build_number: 6 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h43f5ff8_6.conda + sha256: 5da2abd9e2c09ec8566fbacb237926b532f6629871ff2733c90a0be77b77679e + md5: e54a5ddc67e673f9105cf2a2e9c070b0 depends: - libgcc-ng >=13.2.0 constrains: - libgfortran-ng 13.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 1082835 - timestamp: 1706820715400 + size: 1442624 + timestamp: 1713755021286 - kind: conda name: libgfortran5 version: 13.2.0 - build: ha4646dd_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda - sha256: ba8d94e8493222ce155bb264d9de4200e41498a458e866fedf444de809bde8b6 - md5: 7a6bd7a12a4bd359e2afe6c0fa1acace + build: h87d9d71_6 + build_number: 6 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-13.2.0-h87d9d71_6.conda + sha256: 12eb0bb3d164f169239d2475f9f3050dd0fb24f225d923a4e4c1121ae7884b55 + md5: a3fdb6378e561e73c735ec30207daa15 depends: - libgcc-ng >=13.2.0 constrains: - libgfortran-ng 13.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 1442769 - timestamp: 1706819209473 + size: 1095331 + timestamp: 1714581627555 - kind: conda name: libgfortran5 version: 13.2.0 @@ -5728,47 +5597,47 @@ packages: - kind: conda name: libgomp version: 13.2.0 - build: h807b86a_5 - build_number: 5 + build: h77fa898_6 + build_number: 6 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda - sha256: 0d3d4b1b0134283ea02d58e8eb5accf3655464cf7159abf098cc694002f8d34e - md5: d211c42b9ce49aee3734fdc828731689 + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_6.conda + sha256: b059ec2403a421c71c33633ece6be2ccd303e376aae6079f8cfda96d42616527 + md5: e733e0573651a1f0639fa8ce066a286e depends: - _libgcc_mutex 0.1 conda_forge license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 419751 - timestamp: 1706819107383 + size: 420177 + timestamp: 1714581699319 - kind: conda name: libgomp version: 13.2.0 - build: hf8544c7_5 - build_number: 5 + build: he277a41_6 + build_number: 6 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.2.0-hf8544c7_5.conda - sha256: a98d4f242a351feb7983a28e7d6a0ca51da764c6233ea3dfc776975a3aba8a01 - md5: 379be2f115ffb73860e4e260dd2170b7 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.2.0-he277a41_6.conda + sha256: 42f701220ef18d4395a1d9a462e85addd364beb6240a5d9bb449d7ffb3e23caf + md5: 7f5d03f107326321017198f348b21103 license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 423091 - timestamp: 1706820564165 + size: 423167 + timestamp: 1714581506022 - kind: conda name: libgpg-error - version: '1.48' - build: h71f35ed_0 + version: '1.49' + build: h4f305b6_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.48-h71f35ed_0.conda - sha256: c448c6d86d27e10b9e844172000540e9cbfe9c28f968db87f949ba05add9bd50 - md5: 4d18d86916705d352d5f4adfb7f0edd3 + url: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.49-h4f305b6_0.conda + sha256: b2664c2c11211a63856f23278efb49d3e65d902297989a0c12dcd228b5d97110 + md5: dfcfd72c7a430d3616763ecfbefe4ca9 depends: - - gettext >=0.21.1,<1.0a0 + - gettext + - libasprintf >=0.22.5,<1.0a0 - libgcc-ng >=12 + - libgettextpo >=0.22.5,<1.0a0 - libstdcxx-ng >=12 license: GPL-2.0-only license_family: GPL - size: 266447 - timestamp: 1708702470365 + size: 263319 + timestamp: 1714121531915 - kind: conda name: libhwloc version: 2.10.0 @@ -6137,12 +6006,12 @@ packages: timestamp: 1701375836233 - kind: conda name: libllvm18 - version: 18.1.3 + version: 18.1.4 build: h2448989_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.3-h2448989_0.conda - sha256: 4f213da12c893451b21db33ab9eb7637378b79da3747e4ba70db482f7310c5ae - md5: 927b6d6e80b2c0d4405a58b61ca248a3 + url: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.4-h2448989_0.conda + sha256: fce6d29c7e5771858a653653475366a9742b06ef725d85cf062e855fe3eba5c5 + md5: fc46f35def3d50b071c138fe8b84bc72 depends: - libgcc-ng >=12 - libstdcxx-ng >=12 @@ -6151,8 +6020,8 @@ packages: - zstd >=1.5.5,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 38422113 - timestamp: 1712517638355 + size: 38415463 + timestamp: 1714412509082 - kind: conda name: libnsl version: 2.0.1 @@ -6565,29 +6434,27 @@ packages: - kind: conda name: libstdcxx-ng version: 13.2.0 - build: h7e041cc_5 - build_number: 5 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda - sha256: a56c5b11f1e73a86e120e6141a42d9e935a99a2098491ac9e15347a1476ce777 - md5: f6f6600d18a4047b54f803cf708b868a + build: h3f4de04_6 + build_number: 6 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.2.0-h3f4de04_6.conda + sha256: 41de374e794cd59ae416e58ffcbd89f38b8499017eeb9ff0047f6635fd0d5873 + md5: dfe2ae16945dc08f163307a6bb3e70e0 license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 3834139 - timestamp: 1706819252496 + size: 3753474 + timestamp: 1714581657363 - kind: conda name: libstdcxx-ng version: 13.2.0 - build: h9a76618_5 - build_number: 5 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.2.0-h9a76618_5.conda - sha256: c209f23a8a497fc87107a68b6bbc8d2089cf15fd4015b558dfdce63544379b05 - md5: 1b79d37dce0fad96bdf3de03925f43b4 + build: hc0a3c3a_6 + build_number: 6 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_6.conda + sha256: 547903d5ffecf49543c6ca9f6e504f0a8a47920b0517395cf529b4a955f1c3d4 + md5: 2f18345bbc433c8a1ed887d7161e86a6 license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 3752658 - timestamp: 1706820778418 + size: 3844194 + timestamp: 1714581807420 - kind: conda name: libsystemd0 version: '255' @@ -6716,58 +6583,6 @@ packages: license: HPND size: 316525 timestamp: 1711218038581 -- kind: conda - name: libtool - version: 2.4.7 - build: h27087fc_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libtool-2.4.7-h27087fc_0.conda - sha256: 345b3b580ef91557a82425ea3f432a70a8748c040deb14570b9f4dca4af3e3d1 - md5: f204c8ba400ec475452737094fb81d52 - depends: - - libgcc-ng >=12 - license: GPL-2.0-or-later - license_family: GPL - size: 411817 - timestamp: 1672361825713 -- kind: conda - name: libtool - version: 2.4.7 - build: h4de3ea5_0 - subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libtool-2.4.7-h4de3ea5_0.conda - sha256: 30317589d42f65c4d9e58a67253746ac46f22a9afdb61d7732b27a56e49e1a14 - md5: 6fceb9b65466da0b2f4d7dea52716da0 - depends: - - libgcc-ng >=12 - license: GPL-2.0-or-later - license_family: GPL - size: 416683 - timestamp: 1672361843729 -- kind: conda - name: libtool - version: 2.4.7 - build: hb7217d7_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libtool-2.4.7-hb7217d7_0.conda - sha256: efe50471d2baea151f2a93f1f99c05553f8c88e3f0065cdc267e1aa2e8c42449 - md5: fe8efc3385f58f0055e8100b07225055 - license: GPL-2.0-or-later - license_family: GPL - size: 408403 - timestamp: 1672362003513 -- kind: conda - name: libtool - version: 2.4.7 - build: hf0c8a7f_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libtool-2.4.7-hf0c8a7f_0.conda - sha256: 0827bcf84a243ca6dd47901caa607262a0184d6048a7cf444b26aa8ee80eb066 - md5: 1f87b8f56ae1210c77f6133705ef24af - license: GPL-2.0-or-later - license_family: GPL - size: 407170 - timestamp: 1672362058438 - kind: conda name: libuuid version: 2.38.1 @@ -6830,188 +6645,175 @@ packages: timestamp: 1610609811627 - kind: conda name: libwebp - version: 1.3.2 - build: h44782d1_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libwebp-1.3.2-h44782d1_1.conda - sha256: 4d7e1efb76e398f578c5a3d0905c5eca1e4a93298aed6e2f7a10854f6671dfe8 - md5: 46d48ff2cd600a82db18d7b83471aa86 + version: 1.4.0 + build: h2466b09_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libwebp-1.4.0-h2466b09_0.conda + sha256: ebabb57084e85cd09d529dbb4fe0f4db6cd0d369ad8095342c37b98855fd87fd + md5: 11334a8fb02041b453e2f89a4ae16f8d depends: - - giflib >=5.2.1,<5.3.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libpng >=1.6.39,<1.7.0a0 - - libtiff >=4.6.0,<4.7.0a0 - - libwebp-base 1.3.2.* - - libwebp-base >=1.3.2,<2.0a0 + - libwebp-base 1.4.0.* + - libwebp-base >=1.4.0,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: BSD-3-Clause - license_family: BSD - size: 79587 - timestamp: 1696116409146 + size: 71106 + timestamp: 1714600150795 - kind: conda name: libwebp - version: 1.3.2 - build: h658648e_1 - build_number: 1 + version: 1.4.0 + build: h2c329e2_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda - sha256: cc5e55531d8067ea379b145861aea8c749a545912bc016372f5e3c69cc925efd - md5: 0ebb65e8d86843865796c7c95a941f34 + url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.4.0-h2c329e2_0.conda + sha256: bd45805b169e3e0ff166d360c3c4842d77107d28c8f9feba020a8e8b9c80f948 + md5: 80030debaa84cfc31755d53742df3ca6 depends: - - giflib >=5.2.1,<5.3.0a0 + - giflib >=5.2.2,<5.3.0a0 - libgcc-ng >=12 - libjpeg-turbo >=3.0.0,<4.0a0 - - libpng >=1.6.39,<1.7.0a0 + - libpng >=1.6.43,<1.7.0a0 - libtiff >=4.6.0,<4.7.0a0 - - libwebp-base 1.3.2.* - - libwebp-base >=1.3.2,<2.0a0 + - libwebp-base 1.4.0.* + - libwebp-base >=1.4.0,<2.0a0 license: BSD-3-Clause - license_family: BSD - size: 84938 - timestamp: 1696116247718 + size: 91941 + timestamp: 1714599671055 - kind: conda name: libwebp - version: 1.3.2 - build: hcfcfb64_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libwebp-1.3.2-hcfcfb64_1.conda - sha256: 7b4f95d1e9756fe81186309113188195fbac164687b96ad443a243a0ca59ec8f - md5: 6202a1ba6be2713084cf0452d4e8c10c + version: 1.4.0 + build: h54798ee_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-1.4.0-h54798ee_0.conda + sha256: e75e7a58793236fc8e92733c8bad168ce7bea40ca54c8c643e357511ba4a7b98 + md5: 078abbcc54996b186b9144cf795bd30f depends: - - libwebp-base 1.3.2.* - - libwebp-base >=1.3.2,<2.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - __osx >=11.0 + - giflib >=5.2.2,<5.3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libpng >=1.6.43,<1.7.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp-base 1.4.0.* + - libwebp-base >=1.4.0,<2.0a0 license: BSD-3-Clause - license_family: BSD - size: 71143 - timestamp: 1696116489561 + size: 87703 + timestamp: 1714599993749 - kind: conda name: libwebp - version: 1.3.2 - build: heb2ea1b_1 - build_number: 1 + version: 1.4.0 + build: h8b4e01b_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-1.3.2-heb2ea1b_1.conda - sha256: 7a52e367f75fdab475eb23b3d14ba03ccf3cdd07f6e8c5a75757f8983d6eb526 - md5: a839d0667366503c792ba5a0856219c4 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-1.4.0-h8b4e01b_0.conda + sha256: b7015194cb7e0c38e9b216be32bb11d885bc9cbe6bb14729818a1fea732ad437 + md5: b8ec3537009b561eb9bbd1780f920093 depends: - - giflib >=5.2.1,<5.3.0a0 + - giflib >=5.2.2,<5.3.0a0 - libgcc-ng >=12 - libjpeg-turbo >=3.0.0,<4.0a0 - - libpng >=1.6.39,<1.7.0a0 + - libpng >=1.6.43,<1.7.0a0 - libtiff >=4.6.0,<4.7.0a0 - - libwebp-base 1.3.2.* - - libwebp-base >=1.3.2,<2.0a0 + - libwebp-base 1.4.0.* + - libwebp-base >=1.4.0,<2.0a0 license: BSD-3-Clause - license_family: BSD - size: 95094 - timestamp: 1696118835040 + size: 101815 + timestamp: 1714602881855 - kind: conda name: libwebp - version: 1.3.2 - build: hf30222e_1 - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-1.3.2-hf30222e_1.conda - sha256: 5ee611009277c8aaef1a5355df6a05100e563735ec33ef019f6415db0b83d548 - md5: a07cf7f5425eb51b79880fb66837200f + version: 1.4.0 + build: hc207709_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libwebp-1.4.0-hc207709_0.conda + sha256: 5c7103d5462deedf0f80a081bc895c25b05404719c11b33a846dc5f5328d791c + md5: c5aa72a275c001665128245084c9ce14 depends: - - giflib >=5.2.1,<5.3.0a0 + - __osx >=10.9 + - giflib >=5.2.2,<5.3.0a0 - libjpeg-turbo >=3.0.0,<4.0a0 - - libpng >=1.6.39,<1.7.0a0 + - libpng >=1.6.43,<1.7.0a0 - libtiff >=4.6.0,<4.7.0a0 - - libwebp-base 1.3.2.* - - libwebp-base >=1.3.2,<2.0a0 + - libwebp-base 1.4.0.* + - libwebp-base >=1.4.0,<2.0a0 license: BSD-3-Clause - license_family: BSD - size: 81880 - timestamp: 1696116440536 + size: 87124 + timestamp: 1714599963620 - kind: conda name: libwebp-base - version: 1.3.2 - build: h10d778d_1 - build_number: 1 + version: 1.4.0 + build: h10d778d_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.3.2-h10d778d_1.conda - sha256: cd2d651e90b93b03e4e38617aa15ddf8e5537b2bd22dd2628784e4c80bc107eb - md5: 1ff09ca6e85ee516442a6a94cdfc7065 + url: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.4.0-h10d778d_0.conda + sha256: 7bafd8f4c637778cd0aa390bf3a894feef0e1fcf6ea6000c7ffc25c4c5a65538 + md5: b2c0047ea73819d992484faacbbe1c24 constrains: - - libwebp 1.3.2 + - libwebp 1.4.0 license: BSD-3-Clause license_family: BSD - size: 350825 - timestamp: 1712602583307 + size: 355099 + timestamp: 1713200298965 - kind: conda name: libwebp-base - version: 1.3.2 - build: h31becfc_1 - build_number: 1 + version: 1.4.0 + build: h31becfc_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.3.2-h31becfc_1.conda - sha256: 65f96a2671cacb81eadf26d65ba29038a1f12fe5ba4652b1789fac920f332099 - md5: 675c1f4aa320704b899f4eb350a69418 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.4.0-h31becfc_0.conda + sha256: 10dded60f274e29c573cfacf6e96f5d0fc374ee431250374a44cbd773916ab9d + md5: 5fd7ab3e5f382c70607fbac6335e6e19 depends: - libgcc-ng >=12 constrains: - - libwebp 1.3.2 + - libwebp 1.4.0 license: BSD-3-Clause license_family: BSD - size: 355942 - timestamp: 1712603681172 + size: 363577 + timestamp: 1713201785160 - kind: conda name: libwebp-base - version: 1.3.2 - build: h93a5062_1 - build_number: 1 + version: 1.4.0 + build: h93a5062_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.3.2-h93a5062_1.conda - sha256: 4336a22660ba77e9d2f5940ba184a85bb1da1b2f5488ba11b486dceca0b39aa1 - md5: ce4e2ea0aa859a8796b1437fe5cb07ed + url: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda + sha256: 0d4bad713a512d79bfeb4d61821f447afab8b0792aca823f505ce6b195e9fde5 + md5: c0af0edfebe780b19940e94871f1a765 constrains: - - libwebp 1.3.2 + - libwebp 1.4.0 license: BSD-3-Clause license_family: BSD - size: 283775 - timestamp: 1712602560769 + size: 287750 + timestamp: 1713200194013 - kind: conda name: libwebp-base - version: 1.3.2 - build: hcfcfb64_1 - build_number: 1 + version: 1.4.0 + build: hcfcfb64_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.3.2-hcfcfb64_1.conda - sha256: bf8d80cb9ed5092742aefc963dc200454b8ecbecf3656a813df295ba2d97336c - md5: fdf80cb33c32d4d002bb89c37cfff5b7 + url: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.4.0-hcfcfb64_0.conda + sha256: d0ca51cb1de9192be9a3238e71fbcca5a535619c499c4f4c9b2ed41c14d36770 + md5: abd61d0ab127ec5cd68f62c2969e6f34 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - - libwebp 1.3.2 + - libwebp 1.4.0 license: BSD-3-Clause license_family: BSD - size: 269593 - timestamp: 1712603180071 + size: 274359 + timestamp: 1713200524021 - kind: conda name: libwebp-base - version: 1.3.2 - build: hd590300_1 - build_number: 1 + version: 1.4.0 + build: hd590300_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_1.conda - sha256: c230e238646d0481851a44086767581cf7e112f27e97bb1c0b89175a079d961d - md5: 049b7df8bae5e184d1de42cdf64855f8 + url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda + sha256: 49bc5f6b1e11cb2babf2a2a731d1a680a5e08a858280876a779dbda06c78c35f + md5: b26e8aa824079e1be0294e7152ca4559 depends: - libgcc-ng >=12 constrains: - - libwebp 1.3.2 + - libwebp 1.4.0 license: BSD-3-Clause license_family: BSD - size: 434659 - timestamp: 1712602397804 + size: 438953 + timestamp: 1713199854503 - kind: conda name: libxcb version: '1.15' @@ -7321,32 +7123,34 @@ packages: timestamp: 1686575217516 - kind: conda name: llvm-openmp - version: 18.1.3 - build: hb6ac08f_0 + version: 18.1.4 + build: h2c61cee_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.3-hb6ac08f_0.conda - sha256: 997e4169ea474a7bc137fed3b5f4d94b1175162b3318e8cb3943003e460fe458 - md5: 506f270f4f00980d27cc1fc127e0ed37 + url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.4-h2c61cee_0.conda + sha256: 3b5952236c415a374f561ea1208a12fd0258069b813101d84cbc65e6bdaee146 + md5: 0619a2dda8b7e25b78abc0b3d872744f + depends: + - __osx >=10.9 constrains: - - openmp 18.1.3|18.1.3.* + - openmp 18.1.4|18.1.4.* license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - size: 300597 - timestamp: 1712603382363 + size: 300738 + timestamp: 1714635138453 - kind: conda name: llvm-openmp - version: 18.1.3 - build: hcd81f8e_0 + version: 18.1.4 + build: hbf6887a_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.3-hcd81f8e_0.conda - sha256: 4cb4eadd633669496ed70c580c965f5f2ed29336890636c61a53e9c1c1541073 - md5: 24cbf1fb1b83056f8ba1beaac0619bf8 + url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-18.1.4-hbf6887a_0.conda + sha256: 77c7cdebe513de20ed83e6570070b05b6e8135b4a0e7ab5b907fdc07df301cb9 + md5: c5dbf4be297aa3c447d2f259040a6ce9 + depends: + - __osx >=11.0 constrains: - - openmp 18.1.3|18.1.3.* + - openmp 18.1.4|18.1.4.* license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - size: 276320 - timestamp: 1712603367897 + size: 276713 + timestamp: 1714635204645 - kind: conda name: lz4-c version: 1.9.4 @@ -8341,30 +8145,28 @@ packages: timestamp: 1709159627299 - kind: conda name: openssl - version: 3.2.1 - build: h0d3ecfb_1 - build_number: 1 + version: 3.3.0 + build: h0d3ecfb_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.1-h0d3ecfb_1.conda - sha256: 519dc941d7ab0ebf31a2878d85c2f444450e7c5f6f41c4d07252c6bb3417b78b - md5: eb580fb888d93d5d550c557323ac5cee + url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-h0d3ecfb_0.conda + sha256: 51f9be8fe929c2bb3243cd0707b6dfcec27541f8284b4bd9b063c288fc46f482 + md5: 25b0e522c3131886a637e347b2ca0c0f depends: - ca-certificates constrains: - pyopenssl >=22.1 license: Apache-2.0 license_family: Apache - size: 2855250 - timestamp: 1710793435903 + size: 2888226 + timestamp: 1714466346030 - kind: conda name: openssl - version: 3.2.1 - build: h31becfc_1 - build_number: 1 + version: 3.3.0 + build: h31becfc_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.2.1-h31becfc_1.conda - sha256: 055a26e99ebc12ae0cf23266a0e62e71b59b8ce8cafb1ebb87e375ef9c758d7b - md5: e95eb18d256edc72058e0dc9be5338a0 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.0-h31becfc_0.conda + sha256: 5aee0fc6e07ec60e01023a8d3e034773534bfd1df1a8dd83f446da03ae98b333 + md5: 36ca60a3afaf2ea2c460daeebd67430e depends: - ca-certificates - libgcc-ng >=12 @@ -8372,17 +8174,16 @@ packages: - pyopenssl >=22.1 license: Apache-2.0 license_family: Apache - size: 3380844 - timestamp: 1710793424665 + size: 3423479 + timestamp: 1714465928572 - kind: conda name: openssl - version: 3.2.1 - build: hcfcfb64_1 - build_number: 1 + version: 3.3.0 + build: hcfcfb64_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_1.conda - sha256: 61ce4e11c3c26ed4e4d9b7e7e2483121a1741ad0f9c8db0a91a28b6e05182ce6 - md5: 958e0418e93e50c575bff70fbcaa12d8 + url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.0-hcfcfb64_0.conda + sha256: ca7573b7503711b53b2464fa35e4efa6f89dcd3d436fb5f128722b853e356dfd + md5: a6c544c9f060740c625dbf6d92cf3495 depends: - ca-certificates - ucrt >=10.0.20348.0 @@ -8392,17 +8193,16 @@ packages: - pyopenssl >=22.1 license: Apache-2.0 license_family: Apache - size: 8230112 - timestamp: 1710796158475 + size: 8358240 + timestamp: 1714468180752 - kind: conda name: openssl - version: 3.2.1 - build: hd590300_1 - build_number: 1 + version: 3.3.0 + build: hd590300_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda - sha256: 2c689444ed19a603be457284cf2115ee728a3fafb7527326e96054dee7cdc1a7 - md5: 9d731343cff6ee2e5a25c4a091bf8e2a + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-hd590300_0.conda + sha256: fdbf05e4db88c592366c90bb82e446edbe33c6e49e5130d51c580b2629c0b5d5 + md5: c0f3abb4a16477208bbd43a39bd56f18 depends: - ca-certificates - libgcc-ng >=12 @@ -8410,25 +8210,24 @@ packages: - pyopenssl >=22.1 license: Apache-2.0 license_family: Apache - size: 2865379 - timestamp: 1710793235846 + size: 2895187 + timestamp: 1714466138265 - kind: conda name: openssl - version: 3.2.1 - build: hd75f5a5_1 - build_number: 1 + version: 3.3.0 + build: hd75f5a5_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.2.1-hd75f5a5_1.conda - sha256: 7ae0ac6a1673584a8a380c2ff3d46eca48ed53bc7174c0d4eaa0dd2f247a0984 - md5: 570a6f04802df580be529f3a72d2bbf7 + url: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.3.0-hd75f5a5_0.conda + sha256: d3889b0c89c2742e92e20f01e8f298b64c221df5d577c639b823a0bfe314e2e3 + md5: eb8c33aa7929a7714eab8b90c1d88afe depends: - ca-certificates constrains: - pyopenssl >=22.1 license: Apache-2.0 license_family: Apache - size: 2506344 - timestamp: 1710793930515 + size: 2541802 + timestamp: 1714467068742 - kind: conda name: packaging version: '24.0' @@ -8551,111 +8350,106 @@ packages: timestamp: 1712782503380 - kind: conda name: pango - version: 1.50.14 - build: h07c897b_2 - build_number: 2 + version: 1.52.2 + build: h07c897b_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/pango-1.50.14-h07c897b_2.conda - sha256: e9c0ae76cd2860d0fc35162c17bb2fc8808d390ee2ab2f583f4997ae8d824f00 - md5: 455617d3c3f5fef2e859bb07da8b1dec + url: https://conda.anaconda.org/conda-forge/win-64/pango-1.52.2-h07c897b_0.conda + sha256: 1520663568d2c3ad520fd6c990bd5711e8104371eef1e5d00f066f66924a0fb5 + md5: d4b8ab1b86d06d9d6c65eaed989a018d depends: - - cairo >=1.16.0,<2.0a0 + - cairo >=1.18.0,<2.0a0 - fontconfig >=2.14.2,<3.0a0 - fonts-conda-ecosystem - freetype >=2.12.1,<3.0a0 - fribidi >=1.0.10,<2.0a0 - - harfbuzz >=8.1.1,<9.0a0 - - libglib >=2.76.4,<3.0a0 - - libpng >=1.6.39,<1.7.0a0 + - harfbuzz >=8.3.0,<9.0a0 + - libglib >=2.80.0,<3.0a0 + - libpng >=1.6.43,<1.7.0a0 license: LGPL-2.1-or-later - size: 442093 - timestamp: 1693056497295 + size: 451181 + timestamp: 1712103800111 - kind: conda name: pango - version: 1.50.14 - build: h11ef544_2 - build_number: 2 + version: 1.52.2 + build: h11ef544_0 subdir: linux-aarch64 - url: https://conda.anaconda.org/conda-forge/linux-aarch64/pango-1.50.14-h11ef544_2.conda - sha256: f3fd2b473eea4cb374461bbde322c921a97cda853a100b5f5bf6c6f8fb73cd67 - md5: 2fe79e8224e0fd83f0660af9fa13f8ed + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pango-1.52.2-h11ef544_0.conda + sha256: ccb66f5b01faaf215c8819a05a45cf902428cb9b7a96fdaa1ae642f11a550d5d + md5: 36e37468883220518ab485addfa6a3f1 depends: - - cairo >=1.16.0,<2.0a0 + - cairo >=1.18.0,<2.0a0 - fontconfig >=2.14.2,<3.0a0 - fonts-conda-ecosystem - freetype >=2.12.1,<3.0a0 - fribidi >=1.0.10,<2.0a0 - - harfbuzz >=8.1.1,<9.0a0 + - harfbuzz >=8.3.0,<9.0a0 - libgcc-ng >=12 - - libglib >=2.76.4,<3.0a0 - - libpng >=1.6.39,<1.7.0a0 + - libglib >=2.80.0,<3.0a0 + - libpng >=1.6.43,<1.7.0a0 license: LGPL-2.1-or-later - size: 454095 - timestamp: 1693057499830 + size: 458724 + timestamp: 1712105822446 - kind: conda name: pango - version: 1.50.14 - build: h19c1c8a_2 - build_number: 2 + version: 1.52.2 + build: h7f2093b_0 subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/pango-1.50.14-h19c1c8a_2.conda - sha256: 639abd1c1d383fe047462ab7233b6857702d1bf40f229c337d3b59d1e5476a71 - md5: bf0d46d9e97cb3ae5ad7ee4b688929a9 + url: https://conda.anaconda.org/conda-forge/osx-64/pango-1.52.2-h7f2093b_0.conda + sha256: ea36e845c747c453288736f78cf3d216fea930b62c734e66a8470fb0f1091093 + md5: ea9611aee7e61e4ff18c4dc56ec100ab depends: - - cairo >=1.16.0,<2.0a0 + - cairo >=1.18.0,<2.0a0 - fontconfig >=2.14.2,<3.0a0 - fonts-conda-ecosystem - freetype >=2.12.1,<3.0a0 - fribidi >=1.0.10,<2.0a0 - - harfbuzz >=8.1.1,<9.0a0 - - libglib >=2.76.4,<3.0a0 - - libpng >=1.6.39,<1.7.0a0 + - harfbuzz >=8.3.0,<9.0a0 + - libglib >=2.80.0,<3.0a0 + - libpng >=1.6.43,<1.7.0a0 license: LGPL-2.1-or-later - size: 418656 - timestamp: 1693056392103 + size: 421629 + timestamp: 1712103688303 - kind: conda name: pango - version: 1.50.14 - build: ha41ecd1_2 - build_number: 2 + version: 1.52.2 + build: ha41ecd1_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda - sha256: 6ecce306b7ac4acf1184eb5b045e57e613e19e99c27d57f33eb255f8a9120a93 - md5: 1a66c10f6a0da3dbd2f3a68127e7f6a0 + url: https://conda.anaconda.org/conda-forge/linux-64/pango-1.52.2-ha41ecd1_0.conda + sha256: 5f6383ffd8f3b6f8f3ebb516c870b2bfebef68c4a21193de5f0609fa4cc0b358 + md5: a658eeabf188c3040da36b0763de2bfd depends: - - cairo >=1.16.0,<2.0a0 + - cairo >=1.18.0,<2.0a0 - fontconfig >=2.14.2,<3.0a0 - fonts-conda-ecosystem - freetype >=2.12.1,<3.0a0 - fribidi >=1.0.10,<2.0a0 - - harfbuzz >=8.1.1,<9.0a0 + - harfbuzz >=8.3.0,<9.0a0 - libgcc-ng >=12 - - libglib >=2.76.4,<3.0a0 - - libpng >=1.6.39,<1.7.0a0 + - libglib >=2.80.0,<3.0a0 + - libpng >=1.6.43,<1.7.0a0 license: LGPL-2.1-or-later - size: 443648 - timestamp: 1693056071824 + size: 446864 + timestamp: 1712103212459 - kind: conda name: pango - version: 1.50.14 - build: hcf40dda_2 - build_number: 2 + version: 1.52.2 + build: hb067d4f_0 subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.50.14-hcf40dda_2.conda - sha256: e17f649192ce06c68893b50fa2492db87d2d82ae6d3c6058cc62dcc44dde8b2e - md5: 79026cbb74d69b444e5dc2be0fb4b4a9 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.52.2-hb067d4f_0.conda + sha256: ef6de9f47be81cad0ca2e99f46c30e2a4a0e87137319cc40ce4d2f6a2a26fe37 + md5: fc1b2e68f2d7b693d6930f12324a06f3 depends: - - cairo >=1.16.0,<2.0a0 + - cairo >=1.18.0,<2.0a0 - fontconfig >=2.14.2,<3.0a0 - fonts-conda-ecosystem - freetype >=2.12.1,<3.0a0 - fribidi >=1.0.10,<2.0a0 - - harfbuzz >=8.1.1,<9.0a0 - - libglib >=2.76.4,<3.0a0 - - libpng >=1.6.39,<1.7.0a0 + - harfbuzz >=8.3.0,<9.0a0 + - libglib >=2.80.0,<3.0a0 + - libpng >=1.6.43,<1.7.0a0 license: LGPL-2.1-or-later - size: 426303 - timestamp: 1693056536154 + size: 416865 + timestamp: 1712103776625 - kind: conda name: pathspec version: 0.12.1 @@ -8980,19 +8774,19 @@ packages: timestamp: 1694617398467 - kind: conda name: platformdirs - version: 4.2.0 + version: 4.2.1 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda - sha256: 2ebfb971236ab825dd79dd6086ea742a9901008ffb9c6222c1f2b5172a8039d3 - md5: a0bc3eec34b0fab84be6b2da94e98e20 + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.1-pyhd8ed1ab_0.conda + sha256: 5718fef2954f016834058ae1d359e407ff8e2e847b35ab43d5d91bcf22d5578d + md5: d478a8a3044cdff1aa6e62f9269cefe0 depends: - python >=3.8 license: MIT license_family: MIT - size: 20210 - timestamp: 1706713564353 + size: 20248 + timestamp: 1713912912262 - kind: conda name: pluggy version: 1.5.0 @@ -9315,27 +9109,27 @@ packages: timestamp: 1661604969727 - kind: conda name: pytest - version: 8.1.1 + version: 8.2.0 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.1.1-pyhd8ed1ab_0.conda - sha256: 3c481d6b54af1a33c32a3f3eaa3e0971955431e7023db55808740cd062271c73 - md5: 94ff09cdedcb7b17e9cd5097ee2cfcff + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.0-pyhd8ed1ab_0.conda + sha256: 02227fea7b50132a75fb223c2d796306ffebd4dc6324897455f17cb54d16683d + md5: 088ff7e08f4f10a06190468048c2a353 depends: - colorama - exceptiongroup >=1.0.0rc8 - iniconfig - packaging - - pluggy <2.0,>=1.4 + - pluggy <2.0,>=1.5 - python >=3.8 - tomli >=1 constrains: - pytest-faulthandler >=2 license: MIT license_family: MIT - size: 255523 - timestamp: 1709992719691 + size: 257122 + timestamp: 1714308481448 - kind: conda name: pytest-benchmark version: 4.0.0 @@ -9952,21 +9746,20 @@ packages: timestamp: 1679532707590 - kind: conda name: referencing - version: 0.34.0 + version: 0.35.1 build: pyhd8ed1ab_0 subdir: noarch noarch: python - url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.34.0-pyhd8ed1ab_0.conda - sha256: 2e631e9e1d49280770573f7acc7441b70181b2dc21948bb1be15eaae80550672 - md5: e4492c22e314be5c75db3469e3bbf3d9 + url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda + sha256: be8d6d9e86b1a3fef5424127ff81782f8ca63d3058980859609f6f1ecdd34cb3 + md5: 0fc8b52192a8898627c3efae1003e9f6 depends: - attrs >=22.2.0 - python >=3.8 - rpds-py >=0.7.0 license: MIT - license_family: MIT - size: 42071 - timestamp: 1710763821612 + size: 42210 + timestamp: 1714619625532 - kind: conda name: requests version: 2.31.0 From 4bfb27a60084ccc9a6737490ec870574fb63f3f5 Mon Sep 17 00:00:00 2001 From: Scott Boyce Date: Sun, 5 May 2024 07:30:34 -0700 Subject: [PATCH 134/199] docs: fix broken url in developer.md (#1773) --- DEVELOPER.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEVELOPER.md b/DEVELOPER.md index 6a04169b4c4..8ba1c12450a 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -217,7 +217,7 @@ Like MODFLOW 6, `flopy` is modular — for each MODFLOW 6 package there is g ##### `modflow-devtools` -The tests use a set of shared fixtures and utilities provided by the [`modflow-devtools`](https://github/com/MODFLOW-USGS/modflow-devtools) package. +The tests use a set of shared fixtures and utilities provided by the [`modflow-devtools`](https://github.com/MODFLOW-USGS/modflow-devtools) package. ### Optional tools From df31dcfca0126482094dcd546670f8013dd75472 Mon Sep 17 00:00:00 2001 From: mjreno Date: Mon, 6 May 2024 12:35:44 -0400 Subject: [PATCH 135/199] fix(idm): allow filein tags in mfsim.nam options block (#1770) * allow filein tags in mfsim.nam options block * update developer doc to describe updating fortran definitions * update fortran input definitions * additional detail added to developer doc --------- Co-authored-by: mjreno --- DEVELOPER.md | 10 ++++ src/Idm/sim-namidm.f90 | 76 ++++++++++++++++++++++++++ src/Utilities/Idm/DefinitionSelect.f90 | 1 + src/Utilities/Idm/IdmLoad.f90 | 13 ++++- 4 files changed, 97 insertions(+), 3 deletions(-) diff --git a/DEVELOPER.md b/DEVELOPER.md index 8ba1c12450a..616bfdb6fd9 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -39,6 +39,7 @@ To build and test a parallel version of the program, first read the instructions - [Configuring integration tests](#configuring-integration-tests) - [Rebuilding release binaries](#rebuilding-release-binaries) - [Updating FloPy packages](#updating-flopy-packages) + - [Updating Fortran definitions](#updating-fortran-definitions) - [Installing external models](#installing-external-models) - [Running tests](#running-tests) - [Running unit tests](#running-unit-tests) @@ -365,6 +366,15 @@ pixi run update-flopy pixi run update-flopy doc/mf6io/mf6ivar/dfn ``` +##### Updating Fortran definitions + +Any time a MODFLOW 6 input definition file (dfn) has been changed internal MODFLOW 6 Fortran definitions should be updated as well. This can be accomplished locally by running utils/idmloader/scripts/dfn2f90.py and then recompiling. This script will update the appropriate input package Fortran definition files if the dfn change is relevant to input processing. Updated definition files should accompany related dfn file changes when creating a pull request. + +```shell +cd utils/idmloader/scripts +python dfn2f90.py +``` + ##### Installing external models Some autotests load models from external repositories: diff --git a/src/Idm/sim-namidm.f90 b/src/Idm/sim-namidm.f90 index f2a53f30a12..46c56aa221f 100644 --- a/src/Idm/sim-namidm.f90 +++ b/src/Idm/sim-namidm.f90 @@ -16,6 +16,10 @@ module SimNamInputModule logical :: prmem = .false. logical :: maxerrors = .false. logical :: print_input = .false. + logical :: hpc_filerecord = .false. + logical :: hpc6 = .false. + logical :: filein = .false. + logical :: hpc6_filename = .false. logical :: tdis6 = .false. logical :: mtype = .false. logical :: mfname = .false. @@ -117,6 +121,74 @@ module SimNamInputModule .false. & ! timeseries ) + type(InputParamDefinitionType), parameter :: & + simnam_hpc_filerecord = InputParamDefinitionType & + ( & + 'SIM', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'HPC_FILERECORD', & ! tag name + 'HPC_FILERECORD', & ! fortran variable + 'RECORD HPC6 FILEIN HPC6_FILENAME', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + simnam_hpc6 = InputParamDefinitionType & + ( & + 'SIM', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'HPC6', & ! tag name + 'HPC6', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + simnam_filein = InputParamDefinitionType & + ( & + 'SIM', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'FILEIN', & ! tag name + 'FILEIN', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + simnam_hpc6_filename = InputParamDefinitionType & + ( & + 'SIM', & ! component + 'NAM', & ! subcomponent + 'OPTIONS', & ! block + 'HPC6_FILENAME', & ! tag name + 'HPC6_FILENAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .true., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + type(InputParamDefinitionType), parameter :: & simnam_tdis6 = InputParamDefinitionType & ( & @@ -329,6 +401,10 @@ module SimNamInputModule simnam_prmem, & simnam_maxerrors, & simnam_print_input, & + simnam_hpc_filerecord, & + simnam_hpc6, & + simnam_filein, & + simnam_hpc6_filename, & simnam_tdis6, & simnam_mtype, & simnam_mfname, & diff --git a/src/Utilities/Idm/DefinitionSelect.f90 b/src/Utilities/Idm/DefinitionSelect.f90 index ef6ec9b5883..3a24b95152c 100644 --- a/src/Utilities/Idm/DefinitionSelect.f90 +++ b/src/Utilities/Idm/DefinitionSelect.f90 @@ -19,6 +19,7 @@ module DefinitionSelectModule public :: get_aggregate_definition_type public :: split_record_definition public :: idt_parse_rectype + public :: idt_datatype contains diff --git a/src/Utilities/Idm/IdmLoad.f90 b/src/Utilities/Idm/IdmLoad.f90 index c3093961cf5..8ca01c0c3d6 100644 --- a/src/Utilities/Idm/IdmLoad.f90 +++ b/src/Utilities/Idm/IdmLoad.f90 @@ -619,6 +619,7 @@ subroutine allocate_simnam_param(input_mempath, idt) use SimVariablesModule, only: simfile use MemoryManagerModule, only: mem_allocate use CharacterStringModule, only: CharacterStringType + use DefinitionSelectModule, only: idt_datatype character(len=LENMEMPATH), intent(in) :: input_mempath type(InputParamDefinitionType), pointer, intent(in) :: idt character(len=LINELENGTH), pointer :: cstr @@ -627,11 +628,15 @@ subroutine allocate_simnam_param(input_mempath, idt) ! ! -- initialize ! - select case (idt%datatype) + select case (idt_datatype(idt)) case ('KEYWORD', 'INTEGER') ! - ! -- allocate and set default - call allocate_simnam_int(input_mempath, idt) + if (idt%in_record) then + ! -- no-op + else + ! -- allocate and set default + call allocate_simnam_int(input_mempath, idt) + end if ! case ('STRING') ! @@ -647,6 +652,8 @@ subroutine allocate_simnam_param(input_mempath, idt) call mem_allocate(cstr, LINELENGTH, idt%mf6varname, input_mempath) cstr = '' end if + case ('RECORD') + ! -- no-op case default write (errmsg, '(a,a)') & 'IdmLoad allocate simnam param unhandled datatype: ', & From 9c0dbef4e95df4d2a6c5343d210d0f0d9547e95a Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 6 May 2024 14:17:12 -0400 Subject: [PATCH 136/199] test(modflow6-testmodels): reinstate excluded models (#1767) * continue excluding test014_NWTP3Low_dev until convergence failure resolved --- autotest/test_testmodels_mf6.py | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/autotest/test_testmodels_mf6.py b/autotest/test_testmodels_mf6.py index 717c831b4be..e25f834fbb7 100644 --- a/autotest/test_testmodels_mf6.py +++ b/autotest/test_testmodels_mf6.py @@ -1,25 +1,19 @@ from shutil import copytree import pytest - -from framework import TestFramework from common_regression import ( + get_mf6_comparison, setup_mf6, setup_mf6_comparison, - get_mf6_comparison, ) +from framework import TestFramework excluded_models = [ "alt_model", "test205_gwtbuy-henrytidal", - # todo reinstate when flopy fixed: https://github.com/modflowpy/flopy/issues/2053 - "test001a_Tharmonic_tabs", - "test004_bcfss", - "test014_NWTP3Low_dev", - "test041_flowdivert_nwt_dev", # todo reinstate after 6.5.0 release "test001d_Tnewton", - # remove tests with nwt usg conductance weighting + # remove tests with nwt usg conductance weighting "test006_gwf3_gnc_nr_dev", "test006_gwf3_nr_dev", "test014_NWTP3High_dev", @@ -28,9 +22,8 @@ "test016_Keating_disu_dev", "test053_npf-a-nwt_dev", "test053_npf-b-nwt_dev", - # todo reinstate when flopy fixed: https://github.com/modflowpy/flopy/issues/2145 - "test001h_evt_array4", - "test001h_rch_array4", + # todo reinstate after resolving convergence failure + "test014_NWTP3Low_dev" ] @@ -47,7 +40,11 @@ def test_model( model_path = test_model_mf6.parent model_name = model_path.name excluded = model_name in excluded_models - compare = get_mf6_comparison(model_path) if original_regression else "mf6_regression" + compare = ( + get_mf6_comparison(model_path) + if original_regression + else "mf6_regression" + ) dev_only = "dev" in model_name and "not developmode" in markers if excluded or dev_only: reason = "excluded" if excluded else "developmode only" From b1399b601f8f9c8db31c150abdaf6c7e3602967c Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Mon, 6 May 2024 18:18:20 -0500 Subject: [PATCH 137/199] feat(swf): implement proper perturbation for jacobian calculation (#1776) * feat(swf): implement proper perturbation for jacobian calculation * calculate jacobian based on C.T. Kelley method * refactor flow area calculation to be consistent with conductance calculation * fprettify * add unit test for get_perturbation --- autotest/TestMathUtil.f90 | 48 +++++++++++- src/Model/SurfaceWaterFlow/swf-cdb.f90 | 4 +- src/Model/SurfaceWaterFlow/swf-dfw.f90 | 100 +++++++++++++++++++------ src/Model/SurfaceWaterFlow/swf-sto.f90 | 8 +- src/Model/SurfaceWaterFlow/swf-zdg.f90 | 4 +- src/Utilities/Constants.f90 | 1 + src/Utilities/MathUtil.f90 | 17 ++++- 7 files changed, 154 insertions(+), 28 deletions(-) diff --git a/autotest/TestMathUtil.f90 b/autotest/TestMathUtil.f90 index 18b377fd06d..b203e7ba765 100644 --- a/autotest/TestMathUtil.f90 +++ b/autotest/TestMathUtil.f90 @@ -4,7 +4,8 @@ module TestMathUtil use testdrive, only: check, error_type, new_unittest, test_failed, & to_string, unittest_type use MathUtilModule, only: f1d, is_close, mod_offset, & - zero_ch, zero_test, zero_br + zero_ch, zero_test, zero_br, & + get_perturbation implicit none private public :: collect_mathutil @@ -24,7 +25,9 @@ subroutine collect_mathutil(testsuite) new_unittest("zero_br", & test_zero_br), & new_unittest("zero_test", & - test_zero_test) & + test_zero_test), & + new_unittest("get_perturbation", & + test_get_perturbation) & ] end subroutine collect_mathutil @@ -240,4 +243,45 @@ subroutine test_zero_test(error) 'expected pi, got: '//to_string(z)) end subroutine test_zero_test + subroutine test_get_perturbation(error) + type(error_type), allocatable, intent(out) :: error + real(DP) :: x, eps + real(DP) :: v1, v2 + + ! test perturbation calculation for pos and negative x + v1 = get_perturbation(1.D0) + v2 = -get_perturbation(-1.D0) + call check(error, & + is_close(v1, v2, atol=1d-12), & + 'expected '//to_string(v1)//' got: '//to_string(v2)) + + ! test derivative calculation for sin(x) where x=1 + x = 1.d0 + eps = get_perturbation(x) + v1 = (sin(x + eps) - sin(x)) / eps + v2 = cos(x) + call check(error, & + is_close(v1, v2, atol=1d-5), & + 'expected '//to_string(v1)//' got: '//to_string(v2)) + + ! test derivative calculation for sin(x) where x=0 + x = 0.d0 + eps = get_perturbation(x) + v1 = (sin(x + eps) - sin(x)) / eps + v2 = cos(x) + call check(error, & + is_close(v1, v2, atol=1d-5), & + 'expected '//to_string(v1)//' got: '//to_string(v2)) + + ! test derivative calculation for x ** 2 + x = 1.d6 + eps = get_perturbation(x) + v1 = ((x + eps) ** 2 - x ** 2) / eps + v2 = 2 * x + call check(error, & + is_close(v1, v2, atol=1d-1), & + 'expected '//to_string(v1)//' got: '//to_string(v2)) + + end subroutine test_get_perturbation + end module TestMathUtil diff --git a/src/Model/SurfaceWaterFlow/swf-cdb.f90 b/src/Model/SurfaceWaterFlow/swf-cdb.f90 index 6a56c42f28c..5eff2f2b1fb 100644 --- a/src/Model/SurfaceWaterFlow/swf-cdb.f90 +++ b/src/Model/SurfaceWaterFlow/swf-cdb.f90 @@ -290,6 +290,8 @@ end subroutine cdb_rp !! !< subroutine cdb_cf(this) + ! modules + use MathUtilModule, only: get_perturbation ! -- dummy variables class(SwfCdbType) :: this !< SwfCdbType object ! -- local variables @@ -304,7 +306,6 @@ subroutine cdb_cf(this) if (this%nbound == 0) return ! ! -- Calculate hcof and rhs for each cdb entry - eps = 1.D-8 do i = 1, this%nbound node = this%nodelist(i) @@ -321,6 +322,7 @@ subroutine cdb_cf(this) q = this%qcalc(i, depth) ! -- calculate perturbed q + eps = get_perturbation(depth) qeps = this%qcalc(i, depth + eps) ! -- calculate derivative diff --git a/src/Model/SurfaceWaterFlow/swf-dfw.f90 b/src/Model/SurfaceWaterFlow/swf-dfw.f90 index a8427d53dda..76f654c0fe5 100644 --- a/src/Model/SurfaceWaterFlow/swf-dfw.f90 +++ b/src/Model/SurfaceWaterFlow/swf-dfw.f90 @@ -4,12 +4,6 @@ !! wave approach. !! !< - -! todo: -! Move Newton to FN routines -! Implement a proper perturbation epsilon -! Parameterize the smoothing depth? -! module SwfDfwModule use KindModule, only: DP, I4B, LGP @@ -100,6 +94,7 @@ module SwfDfwModule procedure :: get_cond procedure :: get_cond_swr procedure :: get_cond_n + procedure :: get_flow_area_nm procedure :: calc_velocity procedure :: sav_velocity procedure, public :: increase_edge_count @@ -625,7 +620,7 @@ end subroutine dfw_fc !< subroutine dfw_qnm_fc_nr(this, kiter, matrix_sln, idxglo, rhs, stage, stage_old) ! -- modules - use ConstantsModule, only: DONE + use MathUtilModule, only: get_perturbation ! -- dummy class(SwfDfwType) :: this integer(I4B) :: kiter @@ -641,9 +636,6 @@ subroutine dfw_qnm_fc_nr(this, kiter, matrix_sln, idxglo, rhs, stage, stage_old) real(DP) :: eps real(DP) :: derv ! - ! -- set perturbation derivative epsilon - eps = 1.D-8 - ! ! -- Calculate conductance and put into amat do n = 1, this%dis%nodes ! @@ -659,17 +651,19 @@ subroutine dfw_qnm_fc_nr(this, kiter, matrix_sln, idxglo, rhs, stage, stage_old) ! -- connection variables m = this%dis%con%ja(ii) ! - ! -- Fill the qnm term on the right hand side + ! -- Fill the qnm term on the right-hand side qnm = this%qcalc(n, m, stage(n), stage(m), ii) rhs(n) = rhs(n) - qnm ! ! -- Derivative calculation and fill of n terms + eps = get_perturbation(stage(n)) qeps = this%qcalc(n, m, stage(n) + eps, stage(m), ii) derv = (qeps - qnm) / eps call matrix_sln%add_value_pos(idxglo(idiag), derv) rhs(n) = rhs(n) + derv * stage(n) ! ! -- Derivative calculation and fill of m terms + eps = get_perturbation(stage(m)) qeps = this%qcalc(n, m, stage(n), stage(m) + eps, ii) derv = (qeps - qnm) / eps call matrix_sln%add_value_pos(idxglo(ii), derv) @@ -973,6 +967,78 @@ function get_cond_swr(this, n, m, ipos, stage_n, stage_m, cln, clm) result(cond) end function get_cond_swr + !> @brief Calculate flow area between cell n and m + !! + !! Calculate an average flow area between cell n and m. + !! First calculate a flow area for cell n and then for + !! cell m and linearly weight the areas using the connection + !! distances. + !< + function get_flow_area_nm(this, n, m, stage_n, stage_m, cln, clm, & + ipos) result(area_avg) + ! module + use SmoothingModule, only: sQuadratic + ! dummy + class(SwfDfwType) :: this + integer(I4B), intent(in) :: n + integer(I4B), intent(in) :: m + real(DP), intent(in) :: stage_n + real(DP), intent(in) :: stage_m + real(DP), intent(in) :: cln + real(DP), intent(in) :: clm + integer(I4B), intent(in) :: ipos + ! local + real(DP) :: depth_n + real(DP) :: depth_m + real(DP) :: width_n + real(DP) :: width_m + real(DP) :: area_n + real(DP) :: area_m + real(DP) :: weight_n + real(DP) :: weight_m + real(DP) :: length_nm + real(DP) :: range = 1.d-6 + real(DP) :: dydx + real(DP) :: smooth_factor + ! return + real(DP) :: area_avg + + ! depths + depth_n = stage_n - this%dis%bot(n) + depth_m = stage_m - this%dis%bot(m) + + ! -- Assign upstream depth, if not central + if (this%icentral == 0) then + ! -- use upstream weighting + if (stage_n > stage_m) then + depth_m = depth_n + else + depth_n = depth_m + end if + end if + + ! -- Calculate a smoothed depth that goes to zero over + ! the specified range + call sQuadratic(depth_n, range, dydx, smooth_factor) + depth_n = depth_n * smooth_factor + call sQuadratic(depth_m, range, dydx, smooth_factor) + depth_m = depth_m * smooth_factor + + ! Get the flow widths for n and m from dis package + call this%dis%get_flow_width(n, m, ipos, width_n, width_m) + + ! linear weight toward node closer to shared face + length_nm = cln + clm + weight_n = clm / length_nm + weight_m = DONE - weight_n + + ! average cross sectional flow area + area_n = this%cxs%get_area(this%idcxs(n), width_n, depth_n) + area_m = this%cxs%get_area(this%idcxs(m), width_m, depth_m) + area_avg = weight_n * area_n + weight_m * area_m + + end function get_flow_area_nm + subroutine calc_dhds(this) ! modules use VectorInterpolationModule, only: vector_interpolation_2d @@ -1281,7 +1347,6 @@ subroutine calc_velocity(this, flowja) real(DP) :: dsumz real(DP) :: denom real(DP) :: area - real(DP) :: dz real(DP) :: axy real(DP) :: ayx real(DP), allocatable, dimension(:) :: vi @@ -1353,16 +1418,7 @@ subroutine calc_velocity(this, flowja) m = this%dis%con%ja(ipos) isympos = this%dis%con%jas(ipos) ihc = this%dis%con%ihc(isympos) - area = this%dis%con%hwva(isympos) - - ! -- horizontal connection ic = ic + 1 - if (this%hnew(n) > this%hnew(m)) then - dz = this%hnew(n) - this%dis%bot(n) - else - dz = this%hnew(m) - this%dis%bot(m) - end if - area = area * dz call this%dis%connection_normal(n, m, ihc, xn, yn, zn, ipos) call this%dis%connection_vector(n, m, nozee, DONE, DONE, & ihc, xc, yc, zc, dltot) @@ -1376,6 +1432,8 @@ subroutine calc_velocity(this, flowja) nix(ic) = -xn niy(ic) = -yn di(ic) = dltot * cl1 * ooclsum + area = this%get_flow_area_nm(n, m, this%hnew(n), this%hnew(m), & + cl1, cl2, ipos) if (area > DZERO) then vi(ic) = flowja(ipos) / area else diff --git a/src/Model/SurfaceWaterFlow/swf-sto.f90 b/src/Model/SurfaceWaterFlow/swf-sto.f90 index 91b807a3694..65c80d34f2f 100644 --- a/src/Model/SurfaceWaterFlow/swf-sto.f90 +++ b/src/Model/SurfaceWaterFlow/swf-sto.f90 @@ -410,6 +410,7 @@ end subroutine sto_cq subroutine calc_storage_dis1d(this, n, stage_new, stage_old, dx, qsto, derv) ! module use TdisModule, only: delt + use MathUtilModule, only: get_perturbation ! dummy class(SwfStoType) :: this integer(I4B), intent(in) :: n @@ -426,7 +427,7 @@ subroutine calc_storage_dis1d(this, n, stage_new, stage_old, dx, qsto, derv) real(DP) :: cxs_area_new real(DP) :: cxs_area_old real(DP) :: cxs_area_eps - real(DP) :: eps = 1.d-8 + real(DP) :: eps call this%dis%get_flow_width(n, n, 0, width_n, width_m) depth_new = stage_new - this%dis%bot(n) @@ -435,6 +436,7 @@ subroutine calc_storage_dis1d(this, n, stage_new, stage_old, dx, qsto, derv) cxs_area_old = this%cxs%get_area(this%idcxs(n), width_n, depth_old) qsto = (cxs_area_new - cxs_area_old) * dx / delt if (present(derv)) then + eps = get_perturbation(depth_new) cxs_area_eps = this%cxs%get_area(this%idcxs(n), width_n, depth_new + eps) derv = (cxs_area_eps - cxs_area_new) * dx / delt / eps end if @@ -444,6 +446,7 @@ end subroutine calc_storage_dis1d subroutine calc_storage_dis2d(this, n, stage_new, stage_old, qsto, derv) ! module use TdisModule, only: delt + use MathUtilModule, only: get_perturbation ! dummy class(SwfStoType) :: this integer(I4B), intent(in) :: n @@ -458,7 +461,7 @@ subroutine calc_storage_dis2d(this, n, stage_new, stage_old, qsto, derv) real(DP) :: depth_eps real(DP) :: volume_new real(DP) :: volume_old - real(DP) :: eps = 1.d-8 + real(DP) :: eps area = this%dis%get_area(n) depth_new = stage_new - this%dis%bot(n) @@ -468,6 +471,7 @@ subroutine calc_storage_dis2d(this, n, stage_new, stage_old, qsto, derv) qsto = (volume_new - volume_old) / delt if (present(derv)) then + eps = get_perturbation(depth_new) depth_eps = depth_new + eps derv = (depth_eps - depth_new) * area / delt / eps end if diff --git a/src/Model/SurfaceWaterFlow/swf-zdg.f90 b/src/Model/SurfaceWaterFlow/swf-zdg.f90 index fc053d2d7ca..697680a87a0 100644 --- a/src/Model/SurfaceWaterFlow/swf-zdg.f90 +++ b/src/Model/SurfaceWaterFlow/swf-zdg.f90 @@ -304,6 +304,8 @@ end subroutine zdg_rp !! !< subroutine zdg_cf(this) + ! modules + use MathUtilModule, only: get_perturbation ! -- dummy variables class(SwfZdgType) :: this !< SwfZdgType object ! -- local variables @@ -320,7 +322,6 @@ subroutine zdg_cf(this) if (this%nbound == 0) return ! ! -- Calculate hcof and rhs for each zdg entry - eps = 1.D-8 do i = 1, this%nbound node = this%nodelist(i) @@ -340,6 +341,7 @@ subroutine zdg_cf(this) q = -cond * this%slope(i) ! -- calculate perturbed q + eps = get_perturbation(depth) cond = this%get_cond(i, depth + eps, absdhdxsq, this%unitconv) qeps = -cond * this%slope(i) diff --git a/src/Utilities/Constants.f90 b/src/Utilities/Constants.f90 index 4983c7f3744..933294d2a86 100644 --- a/src/Utilities/Constants.f90 +++ b/src/Utilities/Constants.f90 @@ -117,6 +117,7 @@ module ConstantsModule real(DP), parameter :: DEM30 = 1.0e-30_DP !< real constant 1e-30 real(DP), parameter :: DPREC = EPSILON(1.0_DP) !< real constant machine precision + real(DP), parameter :: DPRECSQRT = SQRT(DPREC) real(DP), parameter :: DSAME = DHUNDRED * DPREC !< real constant for values that are considered !! the same based on machine precision diff --git a/src/Utilities/MathUtil.f90 b/src/Utilities/MathUtil.f90 index 058f32d5f1d..24296c4f0ae 100644 --- a/src/Utilities/MathUtil.f90 +++ b/src/Utilities/MathUtil.f90 @@ -7,7 +7,8 @@ module MathUtilModule implicit none private - public :: f1d, is_close, mod_offset, zero_ch, zero_br, zero_test + public :: f1d, is_close, mod_offset, zero_ch, zero_br, zero_test, & + get_perturbation interface mod_offset module procedure :: mod_offset_int, mod_offset_dbl @@ -434,4 +435,18 @@ function zero_test(x0, x1, f, epsa) result(z) end do end function + !> @brief Calculate a numerical perturbation given the value of x + !! + !! Calculate a perturbation value to use for a numerical derivative + !! calculation. Taken from the book "Solving Nonlinear Equations with + !! Newton's Method" 2003, by C.T. Kelley. Method also used in the + !! SWR Process for MODFLOW-2005. + !< + function get_perturbation(x) result(res) + use ConstantsModule, only: DPRECSQRT, DONE + real(DP), intent(in) :: x !< value that will be perturbed by the result + real(DP) :: res !< calculated perturbation value + res = DPRECSQRT * max(abs(x), DONE) * sign(DONE, x) + end function get_perturbation + end module MathUtilModule From 17d62ea612e772430469505883eca515381e1eef Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 6 May 2024 21:29:35 -0400 Subject: [PATCH 138/199] fix(msvs): update mf5to6/zbud6 msvs files, include in validation script (#1777) MSVS files for mf5to6 and zonebudget were out of date, update them and include them in the validation script we run in CI --- .github/common/msvs_vfproj_check.py | 170 +++++++++++++++++------- utils/mf5to6/msvs/mf5to6.vfproj | 5 +- utils/zonebudget/msvs/zonebudget.vfproj | 3 +- 3 files changed, 130 insertions(+), 48 deletions(-) diff --git a/.github/common/msvs_vfproj_check.py b/.github/common/msvs_vfproj_check.py index 80c1f3d719d..bd570c55fd7 100644 --- a/.github/common/msvs_vfproj_check.py +++ b/.github/common/msvs_vfproj_check.py @@ -1,68 +1,148 @@ +import argparse import xml.etree.ElementTree as ET +from itertools import chain from pathlib import Path +from pprint import pformat -def get_source_files(src_folder): - p = Path(".") - src_files = [] - print(f"Processing {src_folder} folder") - ftypes = ("*.[fF]9[05]", "*.inc") - src_files = [] - for ft in ftypes: - src_files.extend(p.glob(f"{src_folder}/**/{ft}")) - return src_files +PROJ_ROOT = Path(__file__).parents[2] -def get_msvs_files(vfproj_file): - print(f"Processing {vfproj_file}") - tree = ET.parse(vfproj_file) +def get_source_files(src_path, verbose=False): + if verbose: + print(f" Checking source files in dir: {src_path}") + extensions = ("*.[fF]", "*.[fF]9[05]", "*.inc") + for ext in extensions: + for path in src_path.glob(f"**/{ext}"): + yield path.absolute() + + +def get_extra_files(extrafiles_path, src_path, extra_path, verbose=False): + if verbose: + print(f" Checking extra files in dir: {extra_path}") + paths = set(get_source_files(extra_path)) + with open(extrafiles_path) as ef: + for path in ef: + path = path.replace("\\", "/").strip() + root = extra_path if "../../../" in path else src_path + path = root / path.replace("../", "").replace("src/", "") + if path in paths: + yield path.absolute() + + +def get_msvs_files(vfproj_path, src_path, extra_path=None, verbose=False): + if verbose: + print(f" Checking MSVS file: {vfproj_path}") + tree = ET.parse(vfproj_path) root = tree.getroot() - msvs_files = [] for f in root.iter("File"): - s = f.attrib["RelativePath"] - s = s.replace("\\", "/") - s = s.replace("../", "") - fpath = Path(s) - msvs_files.append(fpath) - return msvs_files + path = f.attrib["RelativePath"].replace("\\", "/") + yield ( + ( + extra_path + if (extra_path is not None and "../../../" in path) + else src_path + ) + / path.replace("../", "").replace("src/", "").replace("srcbmi/", "") + ).absolute() -def check_files(name, src_files, msvs_files): - print( - f"Verifying {name} files referenced in msvs project files are in src folder..." - ) - s, m = set(src_files), set(msvs_files) +def check_files(name, src, msvs, verbose=False): + if verbose: + print(f"Checking that {name} MSVS files match source files...") + s, m = set(src), set(msvs) diff = s ^ m - from pprint import pformat - assert not any(diff), ( - f"{name} src files don't match msvs project file\n" + f"{name} src files don't match MSVS project file\n" f"=> symmetric difference:\n{pformat(diff)}\n" f"=> src - msvs:\n{pformat(s - m)}\n" f"=> msvs - src:\n{pformat(m - s)}\n" - "Check to make sure msvs project file is consistent with source files." ) -def check_mf6(): - # get list of source files and files referenced in msvs project files - src_files = get_source_files("src") - msvs_files = [] - for vfproj in ["./msvs/mf6core.vfproj", "./msvs/mf6.vfproj"]: - msvs_files.extend(get_msvs_files(vfproj)) - check_files("MF6", src_files, msvs_files) +def check_mf6(verbose): + src_path = PROJ_ROOT / "src" + src = get_source_files(src_path=src_path, verbose=verbose) + msvs = chain( + *[ + get_msvs_files( + vfproj_path=PROJ_ROOT / "msvs" / f, src_path=src_path, verbose=verbose + ) + for f in ["mf6core.vfproj", "mf6.vfproj"] + ] + ) + check_files("MF6", src, msvs, verbose) + + +def check_bmi(verbose): + src_path = PROJ_ROOT / "srcbmi" + src = get_source_files(src_path=src_path, verbose=verbose) + msvs = get_msvs_files( + vfproj_path=PROJ_ROOT / "msvs" / "mf6bmi.vfproj", + src_path=src_path, + verbose=verbose, + ) + check_files("BMI", src, msvs, verbose) -def check_bmi(): - # get list of source files and files referenced in msvs project files - src_files = get_source_files("srcbmi") - msvs_files = [] - for vfproj in ["./msvs/mf6bmi.vfproj"]: - msvs_files.extend(get_msvs_files(vfproj)) - check_files("BMI", src_files, msvs_files) +def check_mf5to6(verbose): + util_path = PROJ_ROOT / "utils" / "mf5to6" + src_path = util_path / "src" + src_files = chain( + get_source_files(src_path=src_path, verbose=verbose), + get_extra_files( + extrafiles_path=util_path / "pymake" / "extrafiles.txt", + src_path=src_path, + extra_path=PROJ_ROOT / "src", + verbose=verbose, + ), + ) + msvs_files = get_msvs_files( + vfproj_path=util_path / "msvs" / "mf5to6.vfproj", + src_path=src_path, + extra_path=PROJ_ROOT / "src", + verbose=verbose, + ) + check_files("MODFLOW 5 to 6 converter", src_files, msvs_files, verbose) + + +def check_zonebudget(verbose): + util_path = PROJ_ROOT / "utils" / "zonebudget" + src_path = util_path / "src" + src_files = chain( + get_source_files(src_path=src_path, verbose=verbose), + get_extra_files( + extrafiles_path=util_path / "pymake" / "extrafiles.txt", + src_path=src_path, + extra_path=PROJ_ROOT / "src", + verbose=verbose, + ), + ) + msvs_files = get_msvs_files( + vfproj_path=util_path / "msvs" / "zonebudget.vfproj", + src_path=src_path, + extra_path=PROJ_ROOT / "src", + verbose=verbose, + ) + check_files("Zonebudget", src_files, msvs_files, verbose) if __name__ == "__main__": - check_mf6() - check_bmi() - print("msvs project (vfproj) files appear up-to-date...") + parser = argparse.ArgumentParser( + prog="Check Microsoft Visual Studio project files", + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + parser.add_argument( + "-v", + "--verbose", + default=True, + required=False, + help="Show verbose output", + ) + args = parser.parse_args() + verbose = args.verbose + check_mf6(verbose) + check_bmi(verbose) + check_mf5to6(verbose) + check_zonebudget(verbose) + print("MSVS project (vfproj) files are up-to-date.") diff --git a/utils/mf5to6/msvs/mf5to6.vfproj b/utils/mf5to6/msvs/mf5to6.vfproj index 10ff7233751..9e99022a2cd 100644 --- a/utils/mf5to6/msvs/mf5to6.vfproj +++ b/utils/mf5to6/msvs/mf5to6.vfproj @@ -103,13 +103,14 @@ - - + + + diff --git a/utils/zonebudget/msvs/zonebudget.vfproj b/utils/zonebudget/msvs/zonebudget.vfproj index f6e8613efd2..883e7c7f87b 100644 --- a/utils/zonebudget/msvs/zonebudget.vfproj +++ b/utils/zonebudget/msvs/zonebudget.vfproj @@ -45,10 +45,11 @@ - + + From e6202c0a79d70b978599e92986cc109bca40d38d Mon Sep 17 00:00:00 2001 From: mjr-deltares <45555666+mjr-deltares@users.noreply.github.com> Date: Wed, 8 May 2024 19:50:55 +0200 Subject: [PATCH 139/199] fix(par): fix backtracking and residual norm calculation for certain cases in parallel (#1780) - update petsc matrix before multiplication - backtracking now properly synchronized --- src/Solution/NumericalSolution.f90 | 90 ++++++++++++++++++---------- src/Solution/ParallelSolution.f90 | 16 +++-- src/Utilities/Matrix/PetscMatrix.F90 | 7 ++- 3 files changed, 74 insertions(+), 39 deletions(-) diff --git a/src/Solution/NumericalSolution.f90 b/src/Solution/NumericalSolution.f90 index 7405cba2af7..07629dc4d0c 100644 --- a/src/Solution/NumericalSolution.f90 +++ b/src/Solution/NumericalSolution.f90 @@ -168,6 +168,8 @@ module NumericalSolutionModule procedure :: sln_calc_ptc procedure :: sln_underrelax procedure :: sln_backtracking_xupdate + procedure :: get_backtracking_flag + procedure :: apply_backtracking ! private procedure, private :: sln_connect @@ -179,7 +181,7 @@ module NumericalSolutionModule procedure, private :: sln_calcdx procedure, private :: sln_calc_residual procedure, private :: sln_l2norm - procedure, private :: sln_outer_check + procedure, private :: sln_get_dxmax procedure, private :: sln_get_loc procedure, private :: sln_get_nodeu procedure, private :: allocate_scalars @@ -1617,7 +1619,7 @@ subroutine solve(this, kiter) !------------------------------------------------------- ! ! -- check convergence of solution - call this%sln_outer_check(this%hncg(kiter), this%lrch(1, kiter)) + call this%sln_get_dxmax(this%hncg(kiter), this%lrch(1, kiter)) this%icnvg = 0 if (this%sln_has_converged(this%hncg(kiter))) then this%icnvg = 1 @@ -1752,7 +1754,7 @@ subroutine solve(this, kiter) this%icnvg = 1 ! ! -- reset outer dependent-variable change and location for output - call this%sln_outer_check(this%hncg(kiter), this%lrch(1, kiter)) + call this%sln_get_dxmax(this%hncg(kiter), this%lrch(1, kiter)) ! ! -- write revised dependent-variable change data after ! newton under-relaxation @@ -2790,41 +2792,65 @@ end subroutine sln_backtracking !! update exceeds the dependent variable closure criteria. !! !< - subroutine sln_backtracking_xupdate(this, btflag) + subroutine sln_backtracking_xupdate(this, bt_flag) ! -- dummy variables class(NumericalSolutionType), intent(inout) :: this !< NumericalSolutionType instance - integer(I4B), intent(inout) :: btflag !< backtracking flag (1) backtracking performed (0) backtracking not performed - ! -- local variables + integer(I4B), intent(inout) :: bt_flag !< backtracking flag (1) backtracking performed (0) backtracking not performed + + bt_flag = this%get_backtracking_flag() + + ! perform backtracking if ... + if (bt_flag > 0) then + call this%apply_backtracking() + end if + + end subroutine sln_backtracking_xupdate + + !> @brief Check if backtracking should be applied for this solution, + !< returns 1: yes, 0: no + function get_backtracking_flag(this) result(bt_flag) + class(NumericalSolutionType) :: this !< NumericalSolutionType instance + integer(I4B) :: bt_flag !< backtracking flag (1) backtracking performed (0) backtracking not performed + ! local + integer(I4B) :: n + real(DP) :: dx + real(DP) :: dx_abs + real(DP) :: dx_abs_max + + ! default is off + bt_flag = 0 + + ! find max. change + dx_abs_max = 0.0 + do n = 1, this%neq + if (this%active(n) < 1) cycle + dx = this%x(n) - this%xtemp(n) + dx_abs = abs(dx) + if (dx_abs > dx_abs_max) dx_abs_max = dx_abs + end do + + ! if backtracking, set flag + if (this%breduc * dx_abs_max >= this%dvclose) then + bt_flag = 1 + end if + + end function get_backtracking_flag + + !> @brief Update x with backtracking + !< + subroutine apply_backtracking(this) + class(NumericalSolutionType) :: this !< NumericalSolutionType instance + ! local integer(I4B) :: n real(DP) :: delx - real(DP) :: absdelx - real(DP) :: chmax - ! - ! -- initialize dummy variables - btflag = 0 - ! - ! -- no backtracking if maximum change is less than closure so return - chmax = 0.0 + do n = 1, this%neq if (this%active(n) < 1) cycle delx = this%breduc * (this%x(n) - this%xtemp(n)) - absdelx = abs(delx) - if (absdelx > chmax) chmax = absdelx + this%x(n) = this%xtemp(n) + delx end do - ! - ! -- perform backtracking if free of constraints and set counter and flag - if (chmax >= this%dvclose) then - btflag = 1 - do n = 1, this%neq - if (this%active(n) < 1) cycle - delx = this%breduc * (this%x(n) - this%xtemp(n)) - this%x(n) = this%xtemp(n) + delx - end do - end if - ! - ! -- return - return - end subroutine sln_backtracking_xupdate + + end subroutine !> @ brief Calculate the solution L-2 norm for all !! active cells using @@ -3116,7 +3142,7 @@ end subroutine sln_underrelax !! Picard iteration. !! !< - subroutine sln_outer_check(this, hncg, lrch) + subroutine sln_get_dxmax(this, hncg, lrch) ! -- dummy variables class(NumericalSolutionType), intent(inout) :: this !< NumericalSolutionType instance real(DP), intent(inout) :: hncg !< maximum dependent-variable change @@ -3150,7 +3176,7 @@ subroutine sln_outer_check(this, hncg, lrch) ! ! -- return return - end subroutine sln_outer_check + end subroutine sln_get_dxmax function sln_has_converged(this, max_dvc) result(has_converged) class(NumericalSolutionType) :: this !< NumericalSolutionType instance diff --git a/src/Solution/ParallelSolution.f90 b/src/Solution/ParallelSolution.f90 index 09c00392ef9..22d5353d522 100644 --- a/src/Solution/ParallelSolution.f90 +++ b/src/Solution/ParallelSolution.f90 @@ -183,10 +183,10 @@ end subroutine par_underrelax !> @brief synchronize backtracking flag over processes !< - subroutine par_backtracking_xupdate(this, btflag) + subroutine par_backtracking_xupdate(this, bt_flag) ! -- dummy variables class(ParallelSolutionType), intent(inout) :: this !< ParallelSolutionType instance - integer(I4B), intent(inout) :: btflag !< global backtracking flag (1) backtracking performed (0) backtracking not performed + integer(I4B), intent(inout) :: bt_flag !< global backtracking flag (1) backtracking performed (0) backtracking not performed ! -- local variables integer(I4B) :: btflag_local type(MpiWorldType), pointer :: mpi_world @@ -194,13 +194,19 @@ subroutine par_backtracking_xupdate(this, btflag) mpi_world => get_mpi_world() - btflag_local = 0 - call this%NumericalSolutionType%sln_backtracking_xupdate(btflag_local) + ! get local bt flag + btflag_local = this%NumericalSolutionType%get_backtracking_flag() - call MPI_Allreduce(btflag_local, btflag, 1, MPI_INTEGER, & + ! reduce into global decision (if any, then all) + call MPI_Allreduce(btflag_local, bt_flag, 1, MPI_INTEGER, & MPI_MAX, mpi_world%comm, ierr) call CHECK_MPI(ierr) + ! perform backtracking if ... + if (bt_flag > 0) then + call this%NumericalSolutionType%apply_backtracking() + end if + end subroutine par_backtracking_xupdate end module ParallelSolutionModule diff --git a/src/Utilities/Matrix/PetscMatrix.F90 b/src/Utilities/Matrix/PetscMatrix.F90 index c6e6654637d..440e9b71f96 100644 --- a/src/Utilities/Matrix/PetscMatrix.F90 +++ b/src/Utilities/Matrix/PetscMatrix.F90 @@ -12,8 +12,8 @@ module PetscMatrixModule private type, public, extends(MatrixBaseType) :: PetscMatrixType - Mat :: mat - ! offset in the global matrix + Mat :: mat !< the PETSc matrix object, NOTE: update() should be called before using this, + !! in case the matrix CSR array has changed!!! integer(I4B) :: nrow !< number of rows in this portion of the global matrix integer(I4B) :: ncol !< number of columns in the matrix integer(I4B) :: nnz !< number of nonzeros in the matrix @@ -446,6 +446,9 @@ subroutine pm_multiply(this, vec_x, vec_y) y => vec_y end select + ! copy data into petsc object + call this%update() + ! and multiply call MatMult(this%mat, x%vec_impl, y%vec_impl, ierr) CHKERRQ(ierr) From 832d98adb4a1bb4dfc7f75aec49020cabf02f4ea Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Mon, 13 May 2024 04:02:35 -0700 Subject: [PATCH 140/199] fix(mf6io): synchronize mf6io with descriptions in forthcoming SuppTechInfo chapter (#1781) * fix(mf6io): synchronize mf6io with descriptions in forthcoming SuppTechInfo chapter * Move the discussion about tortuosity to the definition file * Tweak description of CND package, specifically its relationship with XT3D --- doc/mf6io/gwe/cnd.tex | 2 +- doc/mf6io/gwe/gwe.tex | 2 +- doc/mf6io/gwe/namefile.tex | 2 +- doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn | 2 +- doc/mf6io/mf6ivar/examples/gwe-nam-example.dat | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/mf6io/gwe/cnd.tex b/doc/mf6io/gwe/cnd.tex index aeb317f899e..8eaebcdf126 100644 --- a/doc/mf6io/gwe/cnd.tex +++ b/doc/mf6io/gwe/cnd.tex @@ -1,4 +1,4 @@ -Conduction (CND) Package information is read from the file that is specified by ``CND6'' as the file type. Only one CND Package can be specified for a GWE model. The CND Package is based on the mathematical formulation presented for the XT3D option of the NPF Package available to represent full three-dimensional anisotropy in groundwater flow. XT3D can be computationally expensive and can be turned off to use a simplified and approximate form of the dispersion equations that also account for conduction in a heat transport model. For most problems, however, XT3D will be required to accurately represent conduction and dispersion. +Conduction and Dispersion (CND) Package information is read from the file that is specified by ``CND6'' as the file type. Only one CND Package can be specified for a GWE model. By default, the CND Package uses the mathematical formulation presented for the XT3D option of the NPF Package to represent full three-dimensional anisotropy in groundwater flow. XT3D can be computationally expensive and can be turned off to use a simplified and approximate form of the dispersion equations that also account for conduction in a heat transport model. For most problems, however, XT3D will be required to accurately represent conduction and dispersion. \vspace{5mm} \subsubsection{Structure of Blocks} diff --git a/doc/mf6io/gwe/gwe.tex b/doc/mf6io/gwe/gwe.tex index c908f5a85dd..3f18ebaf03d 100644 --- a/doc/mf6io/gwe/gwe.tex +++ b/doc/mf6io/gwe/gwe.tex @@ -106,7 +106,7 @@ \subsection{Advection (ADV) Package} \input{gwe/adv} \newpage -\subsection{Conduction (CND) Package} +\subsection{Conduction and Dispersion (CND) Package} \input{gwe/cnd} \newpage diff --git a/doc/mf6io/gwe/namefile.tex b/doc/mf6io/gwe/namefile.tex index d8cc1d18fec..1f8ed8ba7b1 100644 --- a/doc/mf6io/gwe/namefile.tex +++ b/doc/mf6io/gwe/namefile.tex @@ -29,7 +29,7 @@ \subsubsection{Explanation of Variables} IC6 & Initial Conditions Package \\ OC6 & Output Control Option \\ ADV6 & Advection Package \\ -CND6 & Conduction Package \\ +CND6 & Conduction and Dispersion Package \\ SSM6 & Source and Sink Mixing Package \\ EST6 & Energy Storage and Transfer Package \\ CTP6 & Constant Temperature Package & * \\ diff --git a/doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn b/doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn index 6a45cbac414..d9d51b3011a 100644 --- a/doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwe-cnd.dfn @@ -87,7 +87,7 @@ reader readarray layered true optional true longname thermal conductivity of the simulated fluid -description thermal conductivity of the simulated fluid +description thermal conductivity of the simulated fluid. Note that the CND Package does not account for the tortuosity of the flow paths when solving for the conductive spread of heat. If tortuosity plays an important role in the thermal conductivity calculation, its effect should be reflected in the value specified for KTW. block griddata name kts diff --git a/doc/mf6io/mf6ivar/examples/gwe-nam-example.dat b/doc/mf6io/mf6ivar/examples/gwe-nam-example.dat index b1b57df5a27..90eae077720 100644 --- a/doc/mf6io/mf6ivar/examples/gwe-nam-example.dat +++ b/doc/mf6io/mf6ivar/examples/gwe-nam-example.dat @@ -7,7 +7,7 @@ BEGIN PACKAGES IC6 heat_transport.ic EST6 heat_transport.est ADV6 heat_transport.adv - DSP6 heat_transport.dsp + CND6 heat_transport.cnd SSM6 heat_transport.ssm CTP6 heat_transport01.ctp LEFT CTP6 heat_transport02.ctp RIGHT From a6415f7db22159f7df923c560fb81fc9d3ec7aa3 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 13 May 2024 07:45:24 -0400 Subject: [PATCH 141/199] refactor: separate format/spell checks, parallelize, rename scripts (#1782) * separate scripts for formatting and spellchecking * rename msvs_vfproj_check.py -> check_vfproj.py * rename fortran_format_check.py -> check_format.py * rename codespell_docs_check.py -> check_spelling.py * include unit tests in Fortran format checks, reformat where needed * use multiprocessing for significant speedup (~80s to ~15s for format checks on my machine) --- .github/common/check_format.py | 133 ++++++++++++ .github/common/check_spelling.py | 135 +++++++++++++ .../{msvs_vfproj_check.py => check_vfproj.py} | 0 .github/common/codespell_docs_check.py | 157 --------------- .github/common/fortran_format_check.py | 170 ---------------- ...pat_reports.py => widen_compat_reports.py} | 0 .github/workflows/ci.yml | 4 +- .github/workflows/compilers.yml | 4 +- .github/workflows/docs.yml | 4 +- autotest/TestMathUtil.f90 | 2 +- autotest/TestSwfUtils.f90 | 190 +++++++++--------- pixi.toml | 6 +- 12 files changed, 375 insertions(+), 430 deletions(-) create mode 100644 .github/common/check_format.py create mode 100644 .github/common/check_spelling.py rename .github/common/{msvs_vfproj_check.py => check_vfproj.py} (100%) delete mode 100644 .github/common/codespell_docs_check.py delete mode 100644 .github/common/fortran_format_check.py rename .github/common/{wide_compat_reports.py => widen_compat_reports.py} (100%) diff --git a/.github/common/check_format.py b/.github/common/check_format.py new file mode 100644 index 00000000000..a21f7a32c4e --- /dev/null +++ b/.github/common/check_format.py @@ -0,0 +1,133 @@ +import argparse +import os +import sys +import timeit +from itertools import repeat +from queue import Empty +from pathlib import Path +from subprocess import run +from multiprocessing import cpu_count, Pool, Manager + +PROJ_ROOT = Path(__file__).parents[2] + +# exclude these directories from checks +excludedirs = [ + PROJ_ROOT / ".pixi", + PROJ_ROOT / "src" / "Utilities" / "Libraries" / "blas", + PROJ_ROOT / "src" / "Utilities" / "Libraries" / "daglib", + PROJ_ROOT / "src" / "Utilities" / "Libraries" / "rcm", + PROJ_ROOT / "src" / "Utilities" / "Libraries" / "sparsekit", + PROJ_ROOT / "src" / "Utilities" / "Libraries" / "sparskit2", + PROJ_ROOT / "utils" / "mf5to6", +] + +# exclude these files from checks +excludefiles = [] + +# shared state +manager = Manager() +failures = manager.Queue() +checks = manager.Value("checks", 0) +skips = manager.Value("skips", 0) +lock = manager.Lock() + +# commands +fprettify = "fprettify -c .fprettify.yaml" + + +def excluded(path) -> bool: + path = Path(path) + for f in excludefiles: + if os.path.exists(f) and os.path.samefile(path, f): + return True + for d in excludedirs: + if os.path.exists(d) and path.is_relative_to(d): + return True + return False + + +def check_format(path, write_changes=False, verbose=False): + path = Path(path) + if excluded(path): + if verbose: + print(f"Skipping format check: {path}") + with lock: + skips.value += 1 + return + + if verbose: + print(f"Checking format: {path}") + + diff = "" if write_changes else "-d" + cmd = f"{fprettify} {diff} {path}" + result = run(cmd, capture_output=True, shell=True) + if result.stdout or result.stderr: + failures.put(path) + + with lock: + checks.value += 1 + + +def report(duration: float) -> bool: + def pop(q): + return q.get(block=False) + + n_failures = failures.qsize() + success = n_failures == 0 + print(f"Checked format for {checks.value} Fortran files in {duration:.4f}s") + + if n_failures > 0: + success = False + stats = f"failures: {n_failures} \\" + hr = "".join(repeat("_", len(stats) - 1)) + print(f"{hr}\n{stats}") + while True: + try: + print(f"{fprettify} {pop(failures)}") + except Empty: + break + + print() + return success + + +if __name__ == "__main__": + start = timeit.default_timer() + parser = argparse.ArgumentParser( + "MODFLOW 6 Fortran source code format verification" + ) + parser.add_argument( + "-p", + "--path", + help="path to file or directory", + default=PROJ_ROOT, + ) + parser.add_argument( + "-w", + "--write-changes", + help="write codespell changes in place if possible", + action="store_true", + default=False, + ) + parser.add_argument( + "-v", "--verbose", action="store_true", help="verbose", default=False + ) + args = parser.parse_args() + path = Path(args.path).expanduser().absolute() + assert path.exists(), f"Path not found: {path}" + write = args.write_changes + verbose = args.verbose + + if path.is_file(): + check_format(path, verbose) + else: + with Pool(cpu_count()) as pool: + files = [str(p) for p in path.rglob("*.[fF]9[05]")] + if verbose: + msg = f"Checking {len(files)} files in directory: {path}" + print(msg) + print("".join(repeat("-", len(msg)))) + pool.starmap(check_format, [(f, write, verbose) for f in files]) + + stop = timeit.default_timer() + sys.exit(0 if report(stop - start) else 1) diff --git a/.github/common/check_spelling.py b/.github/common/check_spelling.py new file mode 100644 index 00000000000..c9ac0dd77e4 --- /dev/null +++ b/.github/common/check_spelling.py @@ -0,0 +1,135 @@ +import argparse +import os +import sys +import timeit +from itertools import repeat +from queue import Empty +from pathlib import Path +from subprocess import run +from multiprocessing import cpu_count, Pool, Manager + +PROJ_ROOT = Path(__file__).parents[2] + +# exclude these directories from checks +excludedirs = [ + PROJ_ROOT / ".pixi", + PROJ_ROOT / "autotest" / ".pytest_cache", + PROJ_ROOT / "src" / "Utilities" / "Libraries" / "blas", + PROJ_ROOT / "src" / "Utilities" / "Libraries" / "daglib", + PROJ_ROOT / "src" / "Utilities" / "Libraries" / "rcm", + PROJ_ROOT / "src" / "Utilities" / "Libraries" / "sparsekit", + PROJ_ROOT / "src" / "Utilities" / "Libraries" / "sparskit2", + PROJ_ROOT / "srcbmi" / "latex", + PROJ_ROOT / "utils" / "mf5to6", +] + +# exclude these files from checks +excludefiles = [] + +# shared state +manager = Manager() +failures = manager.Queue() +checks = manager.Value("checks", 0) +lock = manager.Lock() + +# commands +codespell = "codespell --ignore-words=.codespell.ignore" + + +def excluded(path) -> bool: + path = Path(path) + for f in excludefiles: + if os.path.exists(f) and os.path.samefile(path, f): + return True + for d in excludedirs: + if os.path.exists(d) and path.is_relative_to(d): + return True + return False + + +def check_spelling(path, write_changes=False, verbose=False): + path = Path(path) + if verbose: + print(f"Checking spelling: {path}") + + wc = "-w" if write_changes else "" + cmd = f"{codespell} {wc} {path}" + result = run(cmd, capture_output=True, shell=True) + if result.stdout or result.stderr: + failures.put(path) + + with lock: + checks.value += 1 + + +def report(duration: float) -> bool: + def pop(q): + return q.get(block=False) + + n_failures = failures.qsize() + success = n_failures == 0 + print(f"Checked spelling for {checks.value} files in {duration:.4f}s") + + if n_failures > 0: + success = False + stats = f"failures: {n_failures} \\" + hr = "".join(repeat("_", len(stats) - 1)) + print(f"{hr}\n{stats}") + while True: + try: + print(f"{codespell} {pop(failures)}") + except Empty: + break + + print() + return success + + +if __name__ == "__main__": + start = timeit.default_timer() + parser = argparse.ArgumentParser("MODFLOW 6 spell check verification") + parser.add_argument( + "-p", + "--path", + help="path to file or directory", + default=PROJ_ROOT, + ) + parser.add_argument( + "-e", + "--extension", + help="file extensions to check", + action="append", + default=[".[fF]9[05]", ".dfn", ".tex", ".md"], + ) + parser.add_argument( + "-w", + "--write-changes", + help="write changes in place if possible", + action="store_true", + default=False, + ) + parser.add_argument( + "-v", "--verbose", action="store_true", help="verbose", default=False + ) + args = parser.parse_args() + path = Path(args.path).expanduser().absolute() + assert path.exists(), f"Path not found: {path}" + extensions = args.extension + write = args.write_changes + verbose = args.verbose + + if path.is_file(): + check_spelling(path, write, verbose) + else: + with Pool(cpu_count()) as pool: + files = [] + for ext in extensions: + files.extend([str(p) for p in path.rglob(f"*{ext}") if not excluded(p)]) + if verbose: + msg = f"Checking {len(files)} files in directory: {path}" + print(msg) + print("".join(repeat("-", len(msg)))) + pool.starmap(check_spelling, [(f, write, verbose) for f in files]) + + stop = timeit.default_timer() + sys.exit(0 if report(stop - start) else 1) diff --git a/.github/common/msvs_vfproj_check.py b/.github/common/check_vfproj.py similarity index 100% rename from .github/common/msvs_vfproj_check.py rename to .github/common/check_vfproj.py diff --git a/.github/common/codespell_docs_check.py b/.github/common/codespell_docs_check.py deleted file mode 100644 index dcb035bb060..00000000000 --- a/.github/common/codespell_docs_check.py +++ /dev/null @@ -1,157 +0,0 @@ -import argparse -import glob -import os -import sys -from pathlib import Path -from subprocess import run - -# MODFLOW 6 repository directories to check (relative to root) -searchpaths = [ - "doc", - ".hpc", - ".vscode", - "distribution", -] - -# Exclude these directories from checks -excludedirs = [ - "srcbmi/latex", -] - -# Exclude these files from checks -excludefiles = [] # add excluded files here - - -class CodespellCheck: - """ - Verify MODFLOW 6 fortran source code format - """ - - def __init__(self, root: Path, verbose: bool, write_changes: bool): - self._checkcount = 0 - self._codespellfails = [] - self._exclude_dirs = [] - self._exclude_files = [] - self._root = root.resolve() - self._verbose = verbose - self.write_changes = write_changes - self._entrypath = Path().cwd() - - os.chdir(self._root) - - def add_search_paths(self) -> None: - files = [] - files += Path(".").glob("*.md") - - for dir_path in searchpaths: - p = Path(dir_path) - for e in ("**/*.dfn", "**/*.tex", "**/*.md"): - files += p.glob(e) - - for f in sorted(files): - self._check_docs_codespell(f) - - def add_exclude_dirs(self, excl_dirs: list) -> None: - self._exclude_dirs += excl_dirs - - def add_exclude_files(self, excl_files: list) -> None: - self._exclude_files += excl_files - - def clear_exclude_dirs(self) -> None: - self._exclude_dirs = None - self._exclude_dirs = [] - - def clear_exclude_files(self) -> None: - self._exclude_files = None - self._exclude_files = [] - - def report(self) -> None: - print(f"\nDocument files checked: {self._checkcount}") - print( - f"Document files codespell failures: {len(self._codespellfails)}\n" - ) - - if len(self._codespellfails) > 0: - print(f"codespell failures\n{71*'-'}") - for f in self._codespellfails: - print(f"codespell -w {f} --ignore-words=.codespell.ignore") - print() - - def exit(self) -> int: - os.chdir(self._entrypath) - - if len(self._codespellfails): - return 1 - - return 0 - - def _check_docs_codespell(self, path: Path) -> None: - if self._excluded(path): - return - - self._checkcount += 1 - - if self._verbose: - print(f"{self._checkcount: 5d}: {path}") - - if self.write_changes: - wc_str = "-w" - else: - wc_str = "" - - cmd = f"codespell {wc_str} {path} --ignore-words=.codespell.ignore" - result = run(cmd, capture_output=True, shell=True) - - if result.stdout or result.stderr: - self._codespellfails.append(path) - - def _excluded(self, path: Path) -> bool: - for f in self._exclude_files: - if os.path.exists(f) and os.path.samefile(path, f): - return True - - for d in self._exclude_dirs: - if os.path.exists(d) and os.path.samefile(path.parents[0], d): - return True - - return False - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - "MODFLOW 6 Documents spell check with codespell verification" - ) - parser.add_argument( - "-r", - "--root", - help="path to MODFLOW 6 repository root directory", - ) - parser.add_argument( - "-w", - "--write-changes", - help="write changes in place if possible", - action="store_true", - ) - parser.add_argument( - "-v", - "--verbose", - action="store_true", - help="verbose", - ) - args = parser.parse_args() - - # set MODFLOW 6 repository root - root = Path(args.root).resolve() if args.root else Path(".").resolve() - - doccheck = CodespellCheck( - root=root, - verbose=args.verbose, - write_changes=args.write_changes, - ) - doccheck.add_exclude_dirs(excl_dirs=excludedirs) - doccheck.add_exclude_files(excl_files=excludefiles) - - doccheck.add_search_paths() - - doccheck.report() - sys.exit(doccheck.exit()) diff --git a/.github/common/fortran_format_check.py b/.github/common/fortran_format_check.py deleted file mode 100644 index c1436641ae2..00000000000 --- a/.github/common/fortran_format_check.py +++ /dev/null @@ -1,170 +0,0 @@ -import argparse -import glob -import os -import sys -from pathlib import Path -from subprocess import run - -# MODFLOW 6 repository directories to check (relative to root) -searchpaths = ["src", "srcbmi", "utils/zonebudget/src"] - -# Exclude these directories from checks -excludedirs = [ - "src/Utilities/Libraries/blas", # external library blas - "src/Utilities/Libraries/daglib", # external library dag - "src/Utilities/Libraries/rcm", # external library rcm - "src/Utilities/Libraries/sparsekit", # external library sparsekit - "src/Utilities/Libraries/sparskit2", # external library sparsekit2 -] - -# Exclude these files from checks -excludefiles = [] # add excluded files here - - -class FortranFormatCheck: - """ - Verify MODFLOW 6 fortran source code format - """ - - def __init__(self, root: Path, verbose: bool, write_changes: bool): - self._checkcount = 0 - self._fprettifyfails = [] - self._codespellfails = [] - self._exclude_dirs = [] - self._exclude_files = [] - self._root = root.resolve() - self.write_changes = write_changes - self._verbose = verbose - self._entrypath = Path().cwd() - - os.chdir(self._root) - - def add_search_path(self, path: Path) -> None: - p = Path(path) - - for f in p.glob("**/*.[fF]9[05]"): - self._check_src_fprettify(f) - self._check_src_codespell(f) - - def add_exclude_dirs(self, excl_dirs: list) -> None: - self._exclude_dirs += excl_dirs - - def add_exclude_files(self, excl_files: list) -> None: - self._exclude_files += excl_files - - def clear_exclude_dirs(self) -> None: - self._exclude_dirs = None - self._exclude_dirs = [] - - def clear_exclude_files(self) -> None: - self._exclude_files = None - self._exclude_files = [] - - def report(self) -> None: - print(f"\nFortran source files checked: {self._checkcount}") - print( - f"Fortran source files fprettify failures: {len(self._fprettifyfails)}" - ) - print( - f"Fortran source files codespell failures: {len(self._codespellfails)}\n" - ) - - if len(self._fprettifyfails) > 0: - print(f"fprettify failures\n{71*'-'}") - for f in self._fprettifyfails: - print(f"fprettify -c .fprettify.yaml {f}") - print() - - if len(self._codespellfails) > 0: - print(f"codespell failures\n{71*'-'}") - for f in self._codespellfails: - print(f"codespell -w {f} --ignore-words=.codespell.ignore") - print() - - def exit(self) -> int: - os.chdir(self._entrypath) - - if len(self._fprettifyfails) > 0 or len(self._codespellfails) > 0: - return 1 - - return 0 - - def _check_src_fprettify(self, path: Path) -> None: - if self._excluded(path): - return - - self._checkcount += 1 - - if self._verbose: - print(f"{self._checkcount: 5d}: {path}") - - cmd = f"fprettify -d -c .fprettify.yaml {path}" - result = run(cmd, capture_output=True, shell=True) - - if result.stdout or result.stderr: - self._fprettifyfails.append(path) - - def _check_src_codespell(self, path: Path) -> None: - if self._excluded(path): - return - - if self.write_changes: - wc_str = "-w" - else: - wc_str = "" - - cmd = f"codespell {wc_str} {path} --ignore-words=.codespell.ignore" - result = run(cmd, capture_output=True, shell=True) - - if result.stdout or result.stderr: - self._codespellfails.append(path) - - def _excluded(self, path: Path) -> bool: - for f in self._exclude_files: - if os.path.exists(f) and os.path.samefile(path, f): - return True - - for d in self._exclude_dirs: - if os.path.exists(d) and os.path.samefile(path.parents[0], d): - return True - - return False - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - "MODFLOW 6 fortran format source code verification" - ) - parser.add_argument( - "-r", "--root", help="path to MODFLOW 6 repository root directory" - ) - parser.add_argument( - "-w", - "--write-changes", - help="write codespell changes in place if possible", - action="store_true", - ) - parser.add_argument( - "-v", - "--verbose", - action="store_true", - help="verbose", - ) - args = parser.parse_args() - - # set MODFLOW 6 repository root - root = Path(args.root).resolve() if args.root else Path(".").resolve() - - fformat_check = FortranFormatCheck( - root=root, - verbose=args.verbose, - write_changes=args.write_changes, - ) - fformat_check.add_exclude_dirs(excl_dirs=excludedirs) - fformat_check.add_exclude_files(excl_files=excludefiles) - - for path in searchpaths: - fformat_check.add_search_path(path=path) - - fformat_check.report() - sys.exit(fformat_check.exit()) diff --git a/.github/common/wide_compat_reports.py b/.github/common/widen_compat_reports.py similarity index 100% rename from .github/common/wide_compat_reports.py rename to .github/common/widen_compat_reports.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 33fc1e55e10..249e5d3af37 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,10 +54,10 @@ jobs: pixi-version: v0.19.1 - name: Check Fortran source formatting - run: pixi run fortran-format-check + run: pixi run check-format - name: Check MSVS project files - run: pixi run msvs-vfproj-check + run: pixi run check-vfproj - name: Check CITATION.cff uses: dieghernan/cff-validator@v3 diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index 6bf0a90b522..a4dc70e3a2c 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -264,8 +264,8 @@ jobs: working-directory: .github/compat id: merge-reports run: | - python ../common/wide_compat_reports.py "long_comp.csv" "comp.csv" - python ../common/wide_compat_reports.py "long_test.csv" "test.csv" + python ../common/widen_compat_reports.py "long_comp.csv" "comp.csv" + python ../common/widen_compat_reports.py "long_test.csv" "test.csv" # only upload wide CSVs and Markdown tables - name: Upload artifacts diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 254bdc656bd..2806dbb6314 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -27,8 +27,8 @@ jobs: with: pixi-version: v0.19.1 - - name: Check documents using codespell - run: pixi run check-docs + - name: Check spelling + run: pixi run check-spelling rtd_build: name: Build ReadTheDocs diff --git a/autotest/TestMathUtil.f90 b/autotest/TestMathUtil.f90 index b203e7ba765..773f7604674 100644 --- a/autotest/TestMathUtil.f90 +++ b/autotest/TestMathUtil.f90 @@ -276,7 +276,7 @@ subroutine test_get_perturbation(error) ! test derivative calculation for x ** 2 x = 1.d6 eps = get_perturbation(x) - v1 = ((x + eps) ** 2 - x ** 2) / eps + v1 = ((x + eps)**2 - x**2) / eps v2 = 2 * x call check(error, & is_close(v1, v2, atol=1d-1), & diff --git a/autotest/TestSwfUtils.f90 b/autotest/TestSwfUtils.f90 index d43b71bf5f5..5ef414b1ed1 100644 --- a/autotest/TestSwfUtils.f90 +++ b/autotest/TestSwfUtils.f90 @@ -1,7 +1,8 @@ module TestSwfUtils use KindModule, only: I4B, DP use ConstantsModule, only: DZERO, DHALF, DONE, DTWO, DNODATA, DTWOTHIRDS - use testdrive, only : error_type, unittest_type, new_unittest, check, test_failed, to_string + use testdrive, only: error_type, unittest_type, new_unittest, check, & + test_failed, to_string use SwfCxsUtilsModule, only: get_cross_section_area, & get_wetted_perimeter, & get_conveyance @@ -9,20 +10,22 @@ module TestSwfUtils private public :: collect_swfutils contains - + subroutine collect_swfutils(testsuite) type(unittest_type), allocatable, intent(out) :: testsuite(:) testsuite = [ & - new_unittest("two_point_section", test_two_point_section), & - new_unittest("three_point_section", test_three_point_section), & - new_unittest("test_four_point_rectangular_section", test_four_point_rectangular_section), & - new_unittest("test_n_point_rectangular_section", test_n_point_rectangular_section) & - ] + new_unittest("two_point_section", test_two_point_section), & + new_unittest("three_point_section", test_three_point_section), & + new_unittest("test_four_point_rectangular_section", & + test_four_point_rectangular_section), & + new_unittest("test_n_point_rectangular_section", & + test_n_point_rectangular_section) & + ] end subroutine collect_swfutils subroutine test_two_point_section(error) type(error_type), allocatable, intent(out) :: error - integer(I4B), parameter :: NPTS=2 + integer(I4B), parameter :: NPTS = 2 real(DP), dimension(NPTS) :: xfraction real(DP), dimension(NPTS) :: height real(DP), dimension(NPTS) :: cxs_rf @@ -72,7 +75,7 @@ subroutine test_two_point_section(error) width, rough, depth) conveyance = res call check(error, & - conveyance == area * (area / perimeter) ** (DTWOTHIRDS) / rough, & + conveyance == area * (area / perimeter)**(DTWOTHIRDS) / rough, & "Conveyance correct") if (allocated(error)) then call test_failed(error, "Conveyance incorrect") @@ -82,7 +85,7 @@ end subroutine test_two_point_section subroutine test_three_point_section(error) type(error_type), allocatable, intent(out) :: error - integer(I4B), parameter :: NPTS=3 + integer(I4B), parameter :: NPTS = 3 real(DP), dimension(NPTS) :: xfraction real(DP), dimension(NPTS) :: height real(DP), dimension(NPTS) :: cxs_rf @@ -111,7 +114,7 @@ subroutine test_three_point_section(error) width, depth) perimeter = res call check(error, & - perimeter == DTWO * sqrt((width / DTWO) ** DTWO + depth ** DTWO), & + perimeter == DTWO * sqrt((width / DTWO)**DTWO + depth**DTWO), & "Wetted perimeter correct") if (allocated(error)) then call test_failed(error, "Wetted perimeter incorrect") @@ -138,11 +141,11 @@ subroutine test_three_point_section(error) conveyance = res a = area / DTWO p = perimeter / DTWO - c = DTWO * (a * ((a / p) ** DTWOTHIRDS) / rough) + c = DTWO * (a * ((a / p)**DTWOTHIRDS) / rough) call check(error, & abs(conveyance - c) < 1.d-8, & - "Swf util conveyance " // to_string(conveyance) // & - " /= expected conveyance " // to_string(c)) + "Swf util conveyance "//to_string(conveyance)// & + " /= expected conveyance "//to_string(c)) if (allocated(error)) then call test_failed(error, "Conveyance calculation failed") return @@ -151,7 +154,7 @@ end subroutine test_three_point_section subroutine test_four_point_rectangular_section(error) type(error_type), allocatable, intent(out) :: error - integer(I4B), parameter :: NPTS=4 + integer(I4B), parameter :: NPTS = 4 real(DP), dimension(NPTS) :: xfraction real(DP), dimension(NPTS) :: height real(DP), dimension(NPTS) :: cxs_rf @@ -183,8 +186,8 @@ subroutine test_four_point_rectangular_section(error) p = DTWO * depth + width call check(error, & perimeter == p, & - "Wetted perimeter " // to_string(perimeter) // & - " /= expected value " // to_string(p)) + "Wetted perimeter "//to_string(perimeter)// & + " /= expected value "//to_string(p)) if (allocated(error)) then call test_failed(error, "Wetted perimeter fail") return @@ -199,8 +202,8 @@ subroutine test_four_point_rectangular_section(error) a = depth * width call check(error, & area == a, & - "Area " // to_string(area) // & - " /= expected value " // to_string(a)) + "Area "//to_string(area)// & + " /= expected value "//to_string(a)) if (allocated(error)) then call test_failed(error, "Cross section area incorrect") return @@ -214,11 +217,11 @@ subroutine test_four_point_rectangular_section(error) conveyance = res a = area p = perimeter - c = a / rough * (a / p) ** DTWOTHIRDS + c = a / rough * (a / p)**DTWOTHIRDS call check(error, & abs(conveyance - c) < 1.d-8, & - "Conveyance " // to_string(conveyance) // & - " /= expected value " // to_string(c)) + "Conveyance "//to_string(conveyance)// & + " /= expected value "//to_string(c)) if (allocated(error)) then call test_failed(error, "Conveyance calculation failed") return @@ -230,7 +233,7 @@ subroutine test_four_point_rectangular_section(error) ! highest height point. depth = 1.5d0 - ! confirm wetted perimeter calculation + ! confirm wetted perimeter calculation res = get_wetted_perimeter(NPTS, & xfraction, & height, & @@ -239,8 +242,8 @@ subroutine test_four_point_rectangular_section(error) p = DTWO * height(1) + width call check(error, & perimeter == p, & - "Wetted perimeter " // to_string(perimeter) // & - " /= expected value " // to_string(p)) + "Wetted perimeter "//to_string(perimeter)// & + " /= expected value "//to_string(p)) if (allocated(error)) then call test_failed(error, "Wetted perimeter fail") return @@ -255,8 +258,8 @@ subroutine test_four_point_rectangular_section(error) a = depth * width call check(error, & area == a, & - "Area " // to_string(area) // & - " /= expected value " // to_string(a)) + "Area "//to_string(area)// & + " /= expected value "//to_string(a)) if (allocated(error)) then call test_failed(error, "Cross section area incorrect") return @@ -270,11 +273,11 @@ subroutine test_four_point_rectangular_section(error) conveyance = res a = area p = perimeter - c = a / rough * (a / p) ** DTWOTHIRDS + c = a / rough * (a / p)**DTWOTHIRDS call check(error, & abs(conveyance - c) < 1.d-8, & - "Conveyance " // to_string(conveyance) // & - " /= expected value " // to_string(c)) + "Conveyance "//to_string(conveyance)// & + " /= expected value "//to_string(c)) if (allocated(error)) then call test_failed(error, "Conveyance calculation failed") return @@ -283,12 +286,12 @@ end subroutine test_four_point_rectangular_section !> @brief Test n-point cross section calculations !! - !! Use the 8-point cross section data from the + !! Use the 8-point cross section data from the !< Punxsutawney example of the HEC-HMS tutorial. subroutine test_n_point_rectangular_section(error) type(error_type), allocatable, intent(out) :: error - integer(I4B), parameter :: NPTS=8 - integer(I4B), parameter :: NDEPTHS=12 + integer(I4B), parameter :: NPTS = 8 + integer(I4B), parameter :: NDEPTHS = 12 real(DP), dimension(NPTS) :: xfraction real(DP), dimension(NPTS) :: height real(DP), dimension(NPTS) :: cxs_rf @@ -312,54 +315,55 @@ subroutine test_n_point_rectangular_section(error) ! expected values area_expected = [ & - 0.0000000000000000d0, & - 14.756129265604915d0, & - 37.883172712533252d0, & - 63.615202573234768d0, & - 91.952218847709474d0, & - 139.22191462507655d0, & - 231.01552353826017d0, & - 325.38720871509929d0, & - 422.33697015559397d0, & - 521.86480785974402d0, & - 623.97072182754971d0, & - 728.53880232770473d0 & - ] + 0.0000000000000000d0, & + 14.756129265604915d0, & + 37.883172712533252d0, & + 63.615202573234768d0, & + 91.952218847709474d0, & + 139.22191462507655d0, & + 231.01552353826017d0, & + 325.38720871509929d0, & + 422.33697015559397d0, & + 521.86480785974402d0, & + 623.97072182754971d0, & + 728.53880232770473d0 & + ] wp_expected = [ & - 0.0000000000000000d0, & - 22.416013040258729d0, & - 25.759029889993588d0, & - 29.102046739728443d0, & - 32.445063589463295d0, & - 93.878846225107850d0, & - 97.159078583084536d0, & - 100.43931094106127d0, & - 103.71954329903795d0, & - 106.99977565701464d0, & - 110.28000801499132d0, & - 112.57661057753654d0 & - ] + 0.0000000000000000d0, & + 22.416013040258729d0, & + 25.759029889993588d0, & + 29.102046739728443d0, & + 32.445063589463295d0, & + 93.878846225107850d0, & + 97.159078583084536d0, & + 100.43931094106127d0, & + 103.71954329903795d0, & + 106.99977565701464d0, & + 110.28000801499132d0, & + 112.57661057753654d0 & + ] conveyance_expected = [ & - 0.0000000000000000d0, & - 285.75028108202571d0, & - 1289.7912773134653d0, & - 2876.8119843270820d0, & - 5016.5410818181253d0, & - 7835.1910481243458d0, & - 12094.062268307061d0, & - 17566.086627356817d0, & - 24108.098792137902d0, & - 31647.248549995347d0, & - 40136.606753502856d0, & - 49571.805574496953d0 & - ] + 0.0000000000000000d0, & + 285.75028108202571d0, & + 1289.7912773134653d0, & + 2876.8119843270820d0, & + 5016.5410818181253d0, & + 7835.1910481243458d0, & + 12094.062268307061d0, & + 17566.086627356817d0, & + 24108.098792137902d0, & + 31647.248549995347d0, & + 40136.606753502856d0, & + 49571.805574496953d0 & + ] xfraction = [0.d0, 6.10003658d0, 37.39941478d0, 41.09973177d0, & 61.39965862d0, 68.6021702d0, 96.299683d0, 105.19995123d0] - height = [10.70013411d0, 4.70007315d0, 4.60009754d0, 0.d0, 0.6000061d0, & + height = [10.70013411d0, 4.70007315d0, 4.60009754d0, 0.d0, 0.6000061d0, & 4.60009754d0, 5.d0, 10.70013411d0] cxs_rf = [0.09d0, 0.09d0, 0.04d0, 0.04d0, 0.04d0, 0.09d0, 0.09d0, 0.d0] - depths = [0.d0, 1.d0, 2.d0, 3.d0, 4.d0, 5.d0, 6.d0, 7.d0, 8.d0, 9.d0, 10.d0, 11.d0] + depths = [0.d0, 1.d0, 2.d0, 3.d0, 4.d0, 5.d0, & + 6.d0, 7.d0, 8.d0, 9.d0, 10.d0, 11.d0] width = DONE rough = DONE @@ -370,17 +374,17 @@ subroutine test_n_point_rectangular_section(error) ! confirm cross section area calculation res = get_cross_section_area(NPTS, & - xfraction, & - height, & - width, depth) + xfraction, & + height, & + width, depth) area = res a = area_expected(idepth) difference = abs(area - a) call check(error, & difference < atol, & - "Area " // to_string(area) // & - " /= expected value " // to_string(a) // & - " Difference is " // to_string(difference)) + "Area "//to_string(area)// & + " /= expected value "//to_string(a)// & + " Difference is "//to_string(difference)) if (allocated(error)) then call test_failed(error, "Cross section area incorrect") return @@ -388,17 +392,17 @@ subroutine test_n_point_rectangular_section(error) ! confirm wetted perimeter calculation res = get_wetted_perimeter(NPTS, & - xfraction, & - height, & - width, depth) + xfraction, & + height, & + width, depth) perimeter = res p = wp_expected(idepth) difference = abs(perimeter - p) call check(error, & difference < atol, & - "Wetted perimeter " // to_string(perimeter) // & - " /= expected value " // to_string(p) // & - " Difference is " // to_string(difference)) + "Wetted perimeter "//to_string(perimeter)// & + " /= expected value "//to_string(p)// & + " Difference is "//to_string(difference)) if (allocated(error)) then call test_failed(error, "Wetted perimeter fail") return @@ -406,17 +410,17 @@ subroutine test_n_point_rectangular_section(error) ! confirm composite conveyance calculation = A/n*R^(2/3) res = get_conveyance(NPTS, & - xfraction, & - height, cxs_rf, & - width, rough, depth) + xfraction, & + height, cxs_rf, & + width, rough, depth) conveyance = res c = conveyance_expected(idepth) difference = abs(conveyance - c) call check(error, & difference < atol, & - "Conveyance " // to_string(conveyance) // & - " /= expected value " // to_string(c) // & - " Difference is " // to_string(difference)) + "Conveyance "//to_string(conveyance)// & + " /= expected value "//to_string(c)// & + " Difference is "//to_string(difference)) if (allocated(error)) then call test_failed(error, "Conveyance calculation failed") return @@ -426,4 +430,4 @@ subroutine test_n_point_rectangular_section(error) end subroutine test_n_point_rectangular_section -end module TestSwfUtils \ No newline at end of file +end module TestSwfUtils diff --git a/pixi.toml b/pixi.toml index 584d903e032..fa17f781889 100644 --- a/pixi.toml +++ b/pixi.toml @@ -46,8 +46,9 @@ install = { depends_on = [ ] } # format -fortran-format-check = "python .github/common/fortran_format_check.py" -msvs-vfproj-check = "python .github/common/msvs_vfproj_check.py" +check-format = "python .github/common/check_format.py" +check-vfproj = "python .github/common/check_vfproj.py" +check-spelling = "python .github/common/check_spelling.py" # build/test setup = "meson setup --prefix=$(pwd) --libdir=bin" @@ -60,7 +61,6 @@ autotest = { cmd = "pytest -v -n auto --durations 0 --keep-failed .failed", cwd # dist/docs benchmark = { cmd = "python benchmark.py", cwd = "distribution" } run-mf6ivar = { cmd = "python mf6ivar.py", cwd = "doc/mf6io/mf6ivar" } -check-docs = "python .github/common/codespell_docs_check.py" build-docs = { cmd = "python build_docs.py", cwd = "distribution" } build-dist = { cmd = "python build_dist.py", cwd = "distribution" } build-makefiles = { cmd = "python build_makefiles.py", cwd = "distribution" } From dca518ae8dfddf01c7a0cd9835a7578a82b22fb3 Mon Sep 17 00:00:00 2001 From: mjreno Date: Mon, 13 May 2024 08:13:16 -0400 Subject: [PATCH 142/199] feat(idm): support binary for regular, numeric list input blocks (#1783) * support binary for regular, numeric list input blocks * some cleanup * more cleanup * refactor to remove exchange reference in static loader --------- Co-authored-by: mjreno --- doc/ReleaseNotes/develop.tex | 1 + doc/mf6io/mf6ivar/dfn/exg-gwegwe.dfn | 1 + doc/mf6io/mf6ivar/dfn/exg-gwfgwf.dfn | 1 + doc/mf6io/mf6ivar/dfn/exg-gwtgwt.dfn | 1 + src/Exchange/DisConnExchange.f90 | 2 +- src/Idm/exg-gwegweidm.f90 | 8 +- src/Idm/exg-gwfgwfidm.f90 | 8 +- src/Idm/exg-gwtgwtidm.f90 | 8 +- src/Utilities/Idm/BoundInputContext.f90 | 21 +- src/Utilities/Idm/DynamicPackageParams.f90 | 48 +++-- src/Utilities/Idm/SourceCommon.f90 | 21 -- .../Idm/mf6blockfile/LoadMf6File.f90 | 203 +++++++++++++++--- .../Idm/mf6blockfile/Mf6FileListInput.f90 | 94 +------- .../Idm/mf6blockfile/StructArray.f90 | 5 +- 14 files changed, 235 insertions(+), 187 deletions(-) diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index 2fa10ce2031..c2e367100f1 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -8,6 +8,7 @@ \item A new Groundwater Energy (GWE) transport model is introduced to the code base for simulating heat transport in the subsurface. Additional information for activating the GWE model type within a MODFLOW 6 simulation is available within the mf6io.pdf document. New example problems have been developed for testing and demonstrating GWE capabilities (in addition to other internal tests that help verify the accuracy of GWE); however, additional changes to the code and input may be necessary in response to user needs and further testing. \item A new capability has been introduced to create parameter layer export files of user input data for packages including DIS, DISV, IC, NPF, DSP(GWT), MIP(PRT), and CND(GWE). The number of supported packages is expected to increase in the future. The capability can be turned on with the package EXPORT\_ARRAY\_ASCII option. The package parameter export set is pre-defined and currently focuses on griddata. The number of parameters per package may also increase in the future. \item Add capability to vary the hydraulic conductivity of the reach streambed (RHK) by stress period in the Streamflow Routing (SFR) package. RHK can be modified by stress period using the BEDK SFRSETTING. RHK can also be defined using a timeseries string in the PACKAGEDATA or PERIOD blocks. + \item Extend binary input support to all list style input blocks that have a regular shape and don't contain string fields (e.g. BOUNDNAME). \end{itemize} %\underline{EXAMPLES} diff --git a/doc/mf6io/mf6ivar/dfn/exg-gwegwe.dfn b/doc/mf6io/mf6ivar/dfn/exg-gwegwe.dfn index 315296422bf..7b79ce7e7ea 100644 --- a/doc/mf6io/mf6ivar/dfn/exg-gwegwe.dfn +++ b/doc/mf6io/mf6ivar/dfn/exg-gwegwe.dfn @@ -267,6 +267,7 @@ reader urword optional true longname auxiliary variables description represents the values of the auxiliary variables for each GWEGWE Exchange. The values of auxiliary variables must be present for each exchange. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. +mf6internal auxvar block exchangedata name boundname diff --git a/doc/mf6io/mf6ivar/dfn/exg-gwfgwf.dfn b/doc/mf6io/mf6ivar/dfn/exg-gwfgwf.dfn index e27195cb393..0f68acead6f 100644 --- a/doc/mf6io/mf6ivar/dfn/exg-gwfgwf.dfn +++ b/doc/mf6io/mf6ivar/dfn/exg-gwfgwf.dfn @@ -307,6 +307,7 @@ reader urword optional true longname auxiliary variables description represents the values of the auxiliary variables for each GWFGWF Exchange. The values of auxiliary variables must be present for each exchange. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. +mf6internal auxvar block exchangedata name boundname diff --git a/doc/mf6io/mf6ivar/dfn/exg-gwtgwt.dfn b/doc/mf6io/mf6ivar/dfn/exg-gwtgwt.dfn index 7d8b419ddd1..11af74961a7 100644 --- a/doc/mf6io/mf6ivar/dfn/exg-gwtgwt.dfn +++ b/doc/mf6io/mf6ivar/dfn/exg-gwtgwt.dfn @@ -267,6 +267,7 @@ reader urword optional true longname auxiliary variables description represents the values of the auxiliary variables for each GWTGWT Exchange. The values of auxiliary variables must be present for each exchange. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. +mf6internal auxvar block exchangedata name boundname diff --git a/src/Exchange/DisConnExchange.f90 b/src/Exchange/DisConnExchange.f90 index 3429c5bf963..5c758cb7d7d 100644 --- a/src/Exchange/DisConnExchange.f90 +++ b/src/Exchange/DisConnExchange.f90 @@ -291,7 +291,7 @@ subroutine source_data(this, iout) call mem_setptr(cl1, 'CL1', this%input_mempath) call mem_setptr(cl2, 'CL2', this%input_mempath) call mem_setptr(hwva, 'HWVA', this%input_mempath) - call mem_setptr(auxvar, 'AUX', this%input_mempath) + call mem_setptr(auxvar, 'AUXVAR', this%input_mempath) call mem_setptr(boundname, 'BOUNDNAME', this%input_mempath) ndim1 = size(cellidm1, dim=1) ndim2 = size(cellidm2, dim=1) diff --git a/src/Idm/exg-gwegweidm.f90 b/src/Idm/exg-gwegweidm.f90 index 588078857a2..5581f5e9098 100644 --- a/src/Idm/exg-gwegweidm.f90 +++ b/src/Idm/exg-gwegweidm.f90 @@ -36,7 +36,7 @@ module ExgGwegweInputModule logical :: cl1 = .false. logical :: cl2 = .false. logical :: hwva = .false. - logical :: aux = .false. + logical :: auxvar = .false. logical :: boundname = .false. end type ExgGwegweParamFoundType @@ -468,13 +468,13 @@ module ExgGwegweInputModule ) type(InputParamDefinitionType), parameter :: & - exggwegwe_aux = InputParamDefinitionType & + exggwegwe_auxvar = InputParamDefinitionType & ( & 'EXG', & ! component 'GWEGWE', & ! subcomponent 'EXCHANGEDATA', & ! block 'AUX', & ! tag name - 'AUX', & ! fortran variable + 'AUXVAR', & ! fortran variable 'DOUBLE1D', & ! type 'NAUX', & ! shape .false., & ! required @@ -529,7 +529,7 @@ module ExgGwegweInputModule exggwegwe_cl1, & exggwegwe_cl2, & exggwegwe_hwva, & - exggwegwe_aux, & + exggwegwe_auxvar, & exggwegwe_boundname & ] diff --git a/src/Idm/exg-gwfgwfidm.f90 b/src/Idm/exg-gwfgwfidm.f90 index 888f6422cb1..85f433aed80 100644 --- a/src/Idm/exg-gwfgwfidm.f90 +++ b/src/Idm/exg-gwfgwfidm.f90 @@ -40,7 +40,7 @@ module ExgGwfgwfInputModule logical :: cl1 = .false. logical :: cl2 = .false. logical :: hwva = .false. - logical :: aux = .false. + logical :: auxvar = .false. logical :: boundname = .false. end type ExgGwfgwfParamFoundType @@ -540,13 +540,13 @@ module ExgGwfgwfInputModule ) type(InputParamDefinitionType), parameter :: & - exggwfgwf_aux = InputParamDefinitionType & + exggwfgwf_auxvar = InputParamDefinitionType & ( & 'EXG', & ! component 'GWFGWF', & ! subcomponent 'EXCHANGEDATA', & ! block 'AUX', & ! tag name - 'AUX', & ! fortran variable + 'AUXVAR', & ! fortran variable 'DOUBLE1D', & ! type 'NAUX', & ! shape .false., & ! required @@ -605,7 +605,7 @@ module ExgGwfgwfInputModule exggwfgwf_cl1, & exggwfgwf_cl2, & exggwfgwf_hwva, & - exggwfgwf_aux, & + exggwfgwf_auxvar, & exggwfgwf_boundname & ] diff --git a/src/Idm/exg-gwtgwtidm.f90 b/src/Idm/exg-gwtgwtidm.f90 index dba0074ce73..76255bc488a 100644 --- a/src/Idm/exg-gwtgwtidm.f90 +++ b/src/Idm/exg-gwtgwtidm.f90 @@ -36,7 +36,7 @@ module ExgGwtgwtInputModule logical :: cl1 = .false. logical :: cl2 = .false. logical :: hwva = .false. - logical :: aux = .false. + logical :: auxvar = .false. logical :: boundname = .false. end type ExgGwtgwtParamFoundType @@ -468,13 +468,13 @@ module ExgGwtgwtInputModule ) type(InputParamDefinitionType), parameter :: & - exggwtgwt_aux = InputParamDefinitionType & + exggwtgwt_auxvar = InputParamDefinitionType & ( & 'EXG', & ! component 'GWTGWT', & ! subcomponent 'EXCHANGEDATA', & ! block 'AUX', & ! tag name - 'AUX', & ! fortran variable + 'AUXVAR', & ! fortran variable 'DOUBLE1D', & ! type 'NAUX', & ! shape .false., & ! required @@ -529,7 +529,7 @@ module ExgGwtgwtInputModule exggwtgwt_cl1, & exggwtgwt_cl2, & exggwtgwt_hwva, & - exggwtgwt_aux, & + exggwtgwt_auxvar, & exggwtgwt_boundname & ] diff --git a/src/Utilities/Idm/BoundInputContext.f90 b/src/Utilities/Idm/BoundInputContext.f90 index fd6af60c6a4..cecc3d7282d 100644 --- a/src/Utilities/Idm/BoundInputContext.f90 +++ b/src/Utilities/Idm/BoundInputContext.f90 @@ -133,7 +133,7 @@ subroutine allocate_scalars(this) end if ! ! -- initialize package params object - call this%package_params%init(this%mf6_input, this%readasarrays, & + call this%package_params%init(this%mf6_input, 'PERIOD', this%readasarrays, & this%naux, this%inamedbound) ! ! -- return @@ -167,22 +167,11 @@ subroutine allocate_arrays(this) call mem_allocate(cellid, 0, 0, 'CELLID', this%mf6_input%mempath) end if ! - ! -- allocate or set pointer to BOUNDNAME - if (this%inamedbound == 0) then - call mem_allocate(this%boundname_cst, LENBOUNDNAME, 0, & - 'BOUNDNAME', this%mf6_input%mempath) - ! - else - call mem_setptr(this%boundname_cst, 'BOUNDNAME', this%mf6_input%mempath) - end if + ! -- set pointer to BOUNDNAME + call mem_setptr(this%boundname_cst, 'BOUNDNAME', this%mf6_input%mempath) ! - ! -- allocate or set pointer to AUXVAR - if (this%naux == 0) then - call mem_allocate(this%auxvar, 0, 0, 'AUXVAR', this%mf6_input%mempath) - ! - else - call mem_setptr(this%auxvar, 'AUXVAR', this%mf6_input%mempath) - end if + ! -- set pointer to AUXVAR + call mem_setptr(this%auxvar, 'AUXVAR', this%mf6_input%mempath) ! ! -- return return diff --git a/src/Utilities/Idm/DynamicPackageParams.f90 b/src/Utilities/Idm/DynamicPackageParams.f90 index 7cb43b53b5f..c4eec5f6dcd 100644 --- a/src/Utilities/Idm/DynamicPackageParams.f90 +++ b/src/Utilities/Idm/DynamicPackageParams.f90 @@ -5,7 +5,7 @@ module DynamicPackageParamsModule use KindModule, only: DP, I4B, LGP - use ConstantsModule, only: LINELENGTH, DZERO, IZERO + use ConstantsModule, only: LINELENGTH, LENBOUNDNAME, DZERO, IZERO use SimVariablesModule, only: errmsg use SimModule, only: store_error, store_error_filename use MemoryManagerModule, only: mem_allocate @@ -30,7 +30,8 @@ module DynamicPackageParamsModule !< type :: DynamicPackageParamsType character(len=LINELENGTH), dimension(:), allocatable :: params !< in scope param tags - integer(I4B) :: naux !< number of aux variables in package + character(len=LINELENGTH) :: blockname !< name of block + integer(I4B) :: iauxiliary !< package auxiliary active, 0=inactive, active for values > 0 integer(I4B) :: inamedbound !< package inamedbound setting integer(I4B) :: nparam !< number of in scope params type(ModflowInputType) :: mf6_input !< description of input @@ -47,19 +48,23 @@ module DynamicPackageParamsModule !> @brief initialize dynamic param filter !! !< - subroutine init(this, mf6_input, readasarrays, naux, inamedbound) + subroutine init(this, mf6_input, blockname, readasarrays, iauxiliary, & + inamedbound) ! -- modules ! -- dummy class(DynamicPackageParamsType) :: this type(ModflowInputType), intent(in) :: mf6_input + character(len=*) :: blockname logical(LGP), intent(in) :: readasarrays - integer(I4B), intent(in) :: naux + integer(I4B), intent(in) :: iauxiliary integer(I4B), intent(in) :: inamedbound + !integer(I4B) :: iparam ! -- local ! this%mf6_input = mf6_input + this%blockname = blockname this%nparam = 0 - this%naux = naux + this%iauxiliary = iauxiliary this%inamedbound = inamedbound ! ! -- determine in scope input params @@ -98,6 +103,8 @@ subroutine set_filtered_grid(this) ! -- local type(InputParamDefinitionType), pointer :: idt integer(I4B), dimension(:), allocatable :: idt_idxs + type(CharacterStringType), dimension(:), pointer, contiguous :: boundname + real(DP), dimension(:, :), pointer, contiguous :: auxvar integer(I4B) :: keepcnt, iparam logical(LGP) :: keep ! @@ -112,13 +119,18 @@ subroutine set_filtered_grid(this) ! -- assign param definition pointer idt => this%mf6_input%param_dfns(iparam) ! - if (idt%blockname /= 'PERIOD') then + if (idt%blockname /= this%blockname) then keep = .false. end if ! if (idt%tagname == 'AUX') then - if (this%naux == 0) then + if (this%iauxiliary == 0) then keep = .false. + call mem_allocate(auxvar, 0, 0, 'AUXVAR', this%mf6_input%mempath) + end if + if (this%inamedbound == 0) then + call mem_allocate(boundname, LENBOUNDNAME, 0, 'BOUNDNAME', & + this%mf6_input%mempath) end if end if ! @@ -160,6 +172,8 @@ subroutine set_filtered_list(this) ! -- local type(InputParamDefinitionType), pointer :: ra_idt, idt character(len=LINELENGTH), dimension(:), allocatable :: ra_cols + type(CharacterStringType), dimension(:), pointer, contiguous :: boundname + real(DP), dimension(:, :), pointer, contiguous :: auxvar integer(I4B) :: ra_ncol, icol, keepcnt logical(LGP) :: keep ! @@ -171,7 +185,7 @@ subroutine set_filtered_list(this) get_aggregate_definition_type(this%mf6_input%aggregate_dfns, & this%mf6_input%component_type, & this%mf6_input%subcomponent_type, & - 'PERIOD') + this%blockname) ! ! -- split recarray definition call idt_parse_rectype(ra_idt, ra_cols, ra_ncol) @@ -185,21 +199,26 @@ subroutine set_filtered_list(this) idt => get_param_definition_type(this%mf6_input%param_dfns, & this%mf6_input%component_type, & this%mf6_input%subcomponent_type, & - 'PERIOD', ra_cols(icol), '') + this%blockname, ra_cols(icol), '') ! if (ra_cols(icol) == 'RECARRAY') then ! no-op else if (ra_cols(icol) == 'AUX') then - if (this%naux > 0) then + if (this%iauxiliary > 0) then keep = .true. + else + call mem_allocate(auxvar, 0, 0, 'AUXVAR', this%mf6_input%mempath) end if else if (ra_cols(icol) == 'BOUNDNAME') then if (this%inamedbound /= 0) then keep = .true. + else + call mem_allocate(boundname, LENBOUNDNAME, 0, 'BOUNDNAME', & + this%mf6_input%mempath) end if else ! -- determine if the param is scope - keep = pkg_param_in_scope(this%mf6_input, ra_cols(icol)) + keep = pkg_param_in_scope(this%mf6_input, this%blockname, ra_cols(icol)) end if ! if (keep) then @@ -331,11 +350,12 @@ end subroutine allocate_param_dbl2d !> @brief determine if input param is in scope for a package !! !< - function pkg_param_in_scope(mf6_input, tagname) result(in_scope) + function pkg_param_in_scope(mf6_input, blockname, tagname) result(in_scope) ! -- modules use MemoryManagerModule, only: get_isize, mem_setptr ! -- dummy type(ModflowInputType), intent(in) :: mf6_input + character(len=*), intent(in) :: blockname character(len=*), intent(in) :: tagname ! -- return logical(LGP) :: in_scope @@ -350,7 +370,7 @@ function pkg_param_in_scope(mf6_input, tagname) result(in_scope) idt => get_param_definition_type(mf6_input%param_dfns, & mf6_input%component_type, & mf6_input%subcomponent_type, & - 'PERIOD', tagname, '') + blockname, tagname, '') ! if (idt%required) then ! -- required params always included @@ -376,6 +396,8 @@ function pkg_param_in_scope(mf6_input, tagname) result(in_scope) end if end if ! + case ('NAM') + in_scope = .true. case default errmsg = 'IDM unimplemented. DynamicPackageParamsType::pkg_param_in_scope & &add case tagname='//trim(idt%tagname) diff --git a/src/Utilities/Idm/SourceCommon.f90 b/src/Utilities/Idm/SourceCommon.f90 index cbd997ad08a..4e1246484f9 100644 --- a/src/Utilities/Idm/SourceCommon.f90 +++ b/src/Utilities/Idm/SourceCommon.f90 @@ -18,7 +18,6 @@ module SourceCommonModule public :: idm_component_type, idm_subcomponent_type, idm_subcomponent_name public :: set_model_shape public :: get_shape_from_string - public :: mem_allocate_naux public :: file_ext public :: ifind_charstr public :: filein_fname @@ -405,26 +404,6 @@ subroutine set_model_shape(ftype, fname, model_mempath, dis_mempath, & return end subroutine set_model_shape - subroutine mem_allocate_naux(mempath) - use MemoryManagerModule, only: mem_allocate, mem_setptr, get_isize - character(len=*), intent(in) :: mempath - integer(I4B), pointer :: naux - integer(I4B) :: isize - ! - ! -- initialize - nullify (naux) - ! - ! -- allocate optional input scalars locally - call get_isize('NAUX', mempath, isize) - if (isize < 0) then - call mem_allocate(naux, 'NAUX', mempath) - naux = 0 - end if - ! - ! -- return - return - end subroutine mem_allocate_naux - function ifind_charstr(array, str) use CharacterStringModule, only: CharacterStringType ! -- Find the first array element containing str diff --git a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 index d1da5d94355..fa18336bc77 100644 --- a/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 +++ b/src/Utilities/Idm/mf6blockfile/LoadMf6File.f90 @@ -36,6 +36,7 @@ module LoadMf6FileModule implicit none private public :: LoadMf6FileType + public :: read_control_record !> @brief Static parser based input loader !! @@ -49,8 +50,12 @@ module LoadMf6FileModule type(StructArrayType), pointer :: structarray => null() !< structarray for loading list input type(ModflowInputType) :: mf6_input !< description of input character(len=LINELENGTH) :: filename !< name of ascii input file + character(len=LINELENGTH), dimension(:), allocatable :: block_tags !< read block tags logical(LGP) :: ts_active !< is timeseries active logical(LGP) :: export !< is array export active + logical(LGP) :: readasarrays + integer(I4B) :: inamedbound + integer(I4B) :: iauxiliary integer(I4B) :: iout !< inunit for list log contains procedure :: load @@ -129,6 +134,9 @@ subroutine init(this, parser, mf6_input, filename, iout) this%filename = filename this%ts_active = .false. this%export = .false. + this%readasarrays = .false. + this%inamedbound = 0 + this%iauxiliary = 0 this%iout = iout ! call get_isize('MODEL_SHAPE', mf6_input%component_mempath, isize) @@ -167,12 +175,16 @@ subroutine load_block(this, iblk) call destructStructArray(this%structarray) end if ! + allocate (this%block_tags(0)) + ! ! -- load the block call this%parse_block(iblk, .false.) ! ! -- post process block call this%block_post_process(iblk) ! + deallocate (this%block_tags) + ! ! --return return end subroutine load_block @@ -208,15 +220,37 @@ end subroutine finalize !< subroutine block_post_process(this, iblk) ! -- modules - use MemoryManagerModule, only: get_isize - use SourceCommonModule, only: set_model_shape, mem_allocate_naux + use ConstantsModule, only: LENBOUNDNAME + use CharacterStringModule, only: CharacterStringType + use SourceCommonModule, only: set_model_shape ! -- dummy class(LoadMf6FileType) :: this integer(I4B), intent(in) :: iblk ! -- local type(InputParamDefinitionType), pointer :: idt - integer(I4B) :: iparam, ts6_size, export_size + integer(I4B) :: iparam + integer(I4B), pointer :: intptr ! + ! -- update state based on read tags + do iparam = 1, size(this%block_tags) + select case (this%mf6_input%block_dfns(iblk)%blockname) + case ('OPTIONS') + if (this%block_tags(iparam) == 'AUXILIARY') then + this%iauxiliary = 1 + else if (this%block_tags(iparam) == 'BOUNDNAMES') then + this%inamedbound = 1 + else if (this%block_tags(iparam) == 'READASARRAYS') then + this%readasarrays = .true. + else if (this%block_tags(iparam) == 'TS6') then + this%ts_active = .true. + else if (this%block_tags(iparam) == 'EXPORT_ARRAY_ASCII') then + this%export = .true. + end if + case default + end select + end do + ! + ! -- update input context allocations based on dfn set and input select case (this%mf6_input%block_dfns(iblk)%blockname) case ('OPTIONS') ! -- allocate naux and set to 0 if not allocated @@ -225,25 +259,13 @@ subroutine block_post_process(this, iblk) ! if (idt%blockname == 'OPTIONS' .and. & idt%tagname == 'AUXILIARY') then - call mem_allocate_naux(this%mf6_input%mempath) + if (this%iauxiliary == 0) then + call mem_allocate(intptr, 'NAUX', this%mf6_input%mempath) + intptr = 0 + end if exit end if end do - ! - ! -- determine if TS6 files were provided in OPTIONS block - call get_isize('TS6_FILENAME', this%mf6_input%mempath, ts6_size) - ! - if (ts6_size > 0) then - this%ts_active = .true. - end if - ! - ! -- determine if EXPORT options were provided - call get_isize('EXPORT_ASCII', this%mf6_input%mempath, export_size) - ! - if (export_size > 0) then - this%export = .true. - end if - ! case ('DIMENSIONS') ! -- set model shape if discretization dimensions have been read if (this%mf6_input%pkgtype(1:3) == 'DIS') then @@ -434,6 +456,7 @@ end subroutine parse_keyword_tag !< recursive subroutine parse_tag(this, iblk, recursive_call) ! -- modules + use ArrayHandlersModule, only: expandarray ! -- dummy class(LoadMf6FileType) :: this integer(I4B), intent(in) :: iblk @@ -504,6 +527,10 @@ recursive subroutine parse_tag(this, iblk, recursive_call) call this%parse_tag(iblk, .true.) end if ! + ! + call expandarray(this%block_tags) + this%block_tags(size(this%block_tags)) = trim(idt%tagname) + ! ! -- return return end subroutine parse_tag @@ -552,20 +579,25 @@ end function block_index_dfn subroutine parse_structarray_block(this, iblk) ! -- modules use StructArrayModule, only: StructArrayType, constructStructArray + use DynamicPackageParamsModule, only: DynamicPackageParamsType ! -- dummy class(LoadMf6FileType) :: this integer(I4B), intent(in) :: iblk ! -- local + type(DynamicPackageParamsType) :: block_params type(InputParamDefinitionType), pointer :: idt !< input data type object describing this record type(InputParamDefinitionType), target :: blockvar_idt - integer(I4B) :: blocknum, iwords + integer(I4B) :: blocknum integer(I4B), pointer :: nrow integer(I4B) :: nrows, nrowsread - integer(I4B) :: icol + integer(I4B) :: ibinary, oc_inunit + integer(I4B) :: icol, iparam integer(I4B) :: ncol - integer(I4B) :: nwords - character(len=16), dimension(:), allocatable :: words - character(len=:), allocatable :: parse_str + ! + ! -- initialize package params object + call block_params%init(this%mf6_input, & + this%mf6_input%block_dfns(iblk)%blockname, & + this%readasarrays, this%iauxiliary, this%inamedbound) ! ! -- set input definition for this block idt => & @@ -581,12 +613,10 @@ subroutine parse_structarray_block(this, iblk) blocknum = 0 end if ! - ! -- identify variable names, ignore first RECARRAY column - parse_str = trim(idt%datatype)//' ' - call parseline(parse_str, nwords, words) - ncol = nwords - 1 + ! -- set ncol + ncol = block_params%nparam ! - ! -- a column will be prepended if block is reloadable + ! -- add col if block is reloadable if (blocknum > 0) ncol = ncol + 1 ! ! -- use shape to set the max num of rows @@ -619,11 +649,11 @@ subroutine parse_structarray_block(this, iblk) end if ! ! -- set indexes (where first column is blocknum) - iwords = icol + iparam = icol - 1 else ! ! -- set indexes (no blocknum column) - iwords = icol + 1 + iparam = icol end if ! ! -- set pointer to input definition for this 1d vector @@ -632,15 +662,33 @@ subroutine parse_structarray_block(this, iblk) this%mf6_input%component_type, & this%mf6_input%subcomponent_type, & this%mf6_input%block_dfns(iblk)%blockname, & - words(iwords), this%filename) + block_params%params(iparam), this%filename) ! ! -- allocate variable in memory manager call this%structarray%mem_create_vector(icol, idt) end do ! - ! -- read the structured array - nrowsread = this%structarray%read_from_parser(this%parser, this%ts_active, & - this%iout) + ! -- read the block control record + ibinary = read_control_record(this%parser, oc_inunit, this%iout) + ! + if (ibinary == 1) then + ! + ! -- read from binary + nrowsread = this%structarray%read_from_binary(oc_inunit, this%iout) + ! + call this%parser%terminateblock() + ! + close (oc_inunit) + ! + else + ! + ! -- read from ascii + nrowsread = this%structarray%read_from_parser(this%parser, this%ts_active, & + this%iout) + end if + ! + ! -- clean up + call block_params%destroy() ! ! -- return return @@ -1135,4 +1183,89 @@ subroutine get_layered_shape(mshape, nlay, layer_shape) end subroutine get_layered_shape + function read_control_record(parser, oc_inunit, iout) result(ibinary) + ! -- modules + use SimModule, only: store_error_unit + use InputOutputModule, only: urword + use InputOutputModule, only: openfile + use OpenSpecModule, only: form, access + use ConstantsModule, only: LINELENGTH + use BlockParserModule, only: BlockParserType + ! -- dummy + type(BlockParserType), intent(inout) :: parser + integer(I4B), intent(inout) :: oc_inunit + integer(I4B), intent(in) :: iout + ! -- return + integer(I4B) :: ibinary + ! -- local + integer(I4B) :: lloc, istart, istop, idum, inunit, itmp, ierr + integer(I4B) :: nunopn = 99 + character(len=:), allocatable :: line + character(len=LINELENGTH) :: fname + logical :: exists + real(DP) :: r + ! -- formats + character(len=*), parameter :: fmtocne = & + &"('Specified OPEN/CLOSE file ',(A),' does not exist')" + character(len=*), parameter :: fmtobf = & + &"(1X,/1X,'OPENING BINARY FILE ON UNIT ',I0,':',/1X,A)" + ! + ! -- initialize oc_inunit and ibinary + oc_inunit = 0 + ibinary = 0 + ! + inunit = parser%getunit() + ! + ! -- Read to the first non-commented line + lloc = 1 + call parser%line_reader%rdcom(inunit, iout, line, ierr) + call urword(line, lloc, istart, istop, 1, idum, r, iout, inunit) + ! + if (line(istart:istop) == 'OPEN/CLOSE') then + ! + ! -- get filename + call urword(line, lloc, istart, istop, 0, idum, r, & + iout, inunit) + ! + fname = line(istart:istop) + ! + ! -- check to see if file OPEN/CLOSE file exists + inquire (file=fname, exist=exists) + ! + if (.not. exists) then + write (errmsg, fmtocne) line(istart:istop) + call store_error(errmsg) + call store_error('Specified OPEN/CLOSE file does not exist') + call store_error_unit(inunit) + end if + ! + ! -- Check for (BINARY) keyword + call urword(line, lloc, istart, istop, 1, idum, r, & + iout, inunit) + ! + if (line(istart:istop) == '(BINARY)') ibinary = 1 + ! + ! -- Open the file depending on ibinary flag + if (ibinary == 1) then + oc_inunit = nunopn + itmp = iout + ! + if (iout > 0) then + itmp = 0 + write (iout, fmtobf) oc_inunit, trim(adjustl(fname)) + end if + ! + call openfile(oc_inunit, itmp, fname, 'OPEN/CLOSE', & + fmtarg_opt=form, accarg_opt=access) + end if + end if + ! + if (ibinary == 0) then + call parser%line_reader%bkspc(parser%getunit()) + end if + ! + ! -- return + return + end function read_control_record + end module LoadMf6FileModule diff --git a/src/Utilities/Idm/mf6blockfile/Mf6FileListInput.f90 b/src/Utilities/Idm/mf6blockfile/Mf6FileListInput.f90 index 52cc4646b31..9b989b6e63f 100644 --- a/src/Utilities/Idm/mf6blockfile/Mf6FileListInput.f90 +++ b/src/Utilities/Idm/mf6blockfile/Mf6FileListInput.f90 @@ -36,8 +36,6 @@ module Mf6FileListInputModule !< type, abstract, extends(AsciiDynamicPkgLoadBaseType) :: ListInputBaseType integer(I4B) :: ts_active - integer(I4B) :: ibinary - integer(I4B) :: oc_inunit type(TimeSeriesManagerType), pointer :: tsmanager => null() type(StructArrayType), pointer :: structarray => null() contains @@ -46,7 +44,6 @@ module Mf6FileListInputModule procedure :: df procedure :: ad procedure :: reset - procedure :: read_control_record end type ListInputBaseType !> @brief Boundary package list loader. @@ -142,32 +139,33 @@ end subroutine bndlist_init subroutine bndlist_rp(this, parser) ! -- modules use BlockParserModule, only: BlockParserType + use LoadMf6FileModule, only: read_control_record use StructVectorModule, only: StructVectorType use IdmLoggerModule, only: idm_log_header, idm_log_close ! -- dummy class(BoundListInputType), intent(inout) :: this type(BlockParserType), pointer, intent(inout) :: parser ! -- local + integer(I4B) :: ibinary + integer(I4B) :: oc_inunit logical(LGP) :: ts_active ! call this%reset() ! - call this%read_control_record(parser) + ibinary = read_control_record(parser, oc_inunit, this%iout) ! ! -- log lst file header call idm_log_header(this%mf6_input%component_name, & this%mf6_input%subcomponent_name, this%iout) ! - if (this%ibinary == 1) then + if (ibinary == 1) then ! this%bound_context%nbound = & - this%structarray%read_from_binary(this%oc_inunit, this%iout) + this%structarray%read_from_binary(oc_inunit, this%iout) ! call parser%terminateblock() ! - close (this%oc_inunit) - this%ibinary = 0 - this%oc_inunit = 0 + close (oc_inunit) ! else ! @@ -413,8 +411,6 @@ subroutine base_init(this, mf6_input, component_name, component_input_name, & ! ! -- initialize this%ts_active = 0 - this%ibinary = 0 - this%oc_inunit = 0 ! ! -- initialize static loader call loader%init(parser, mf6_input, this%input_name, iout) @@ -506,80 +502,4 @@ subroutine reset(this) return end subroutine reset - subroutine read_control_record(this, parser) - ! -- modules - use InputOutputModule, only: urword - use OpenSpecModule, only: form, access - use ConstantsModule, only: LINELENGTH - use BlockParserModule, only: BlockParserType - ! -- dummy - class(ListInputBaseType), intent(inout) :: this - type(BlockParserType), intent(inout) :: parser - ! -- local - integer(I4B) :: lloc, istart, istop, idum, inunit, itmp, ierr - integer(I4B) :: nunopn = 99 - character(len=:), allocatable :: line - character(len=LINELENGTH) :: fname - logical :: exists - real(DP) :: r - ! -- formats - character(len=*), parameter :: fmtocne = & - &"('Specified OPEN/CLOSE file ',(A),' does not exist')" - character(len=*), parameter :: fmtobf = & - &"(1X,/1X,'OPENING BINARY FILE ON UNIT ',I0,':',/1X,A)" - ! - inunit = parser%getunit() - ! - ! -- Read to the first non-commented line - lloc = 1 - call parser%line_reader%rdcom(inunit, this%iout, line, ierr) - call urword(line, lloc, istart, istop, 1, idum, r, this%iout, inunit) - ! - if (line(istart:istop) == 'OPEN/CLOSE') then - ! - ! -- get filename - call urword(line, lloc, istart, istop, 0, idum, r, & - this%iout, inunit) - ! - fname = line(istart:istop) - ! - ! -- check to see if file OPEN/CLOSE file exists - inquire (file=fname, exist=exists) - ! - if (.not. exists) then - write (errmsg, fmtocne) line(istart:istop) - call store_error(errmsg) - call store_error('Specified OPEN/CLOSE file does not exist') - call store_error_unit(inunit) - end if - ! - ! -- Check for (BINARY) keyword - call urword(line, lloc, istart, istop, 1, idum, r, & - this%iout, inunit) - ! - if (line(istart:istop) == '(BINARY)') this%ibinary = 1 - ! - ! -- Open the file depending on ibinary flag - if (this%ibinary == 1) then - this%oc_inunit = nunopn - itmp = this%iout - ! - if (this%iout > 0) then - itmp = 0 - write (this%iout, fmtobf) this%oc_inunit, trim(adjustl(fname)) - end if - ! - call openfile(this%oc_inunit, itmp, fname, 'OPEN/CLOSE', & - fmtarg_opt=form, accarg_opt=access) - end if - end if - ! - if (this%ibinary == 0) then - call parser%line_reader%bkspc(parser%getunit()) - end if - ! - ! -- return - return - end subroutine read_control_record - end module Mf6FileListInputModule diff --git a/src/Utilities/Idm/mf6blockfile/StructArray.f90 b/src/Utilities/Idm/mf6blockfile/StructArray.f90 index 42ed137c1c4..f316a1fd903 100644 --- a/src/Utilities/Idm/mf6blockfile/StructArray.f90 +++ b/src/Utilities/Idm/mf6blockfile/StructArray.f90 @@ -995,8 +995,9 @@ function read_from_binary(this, inunit, iout) result(irow) read (inunit, iostat=ierr) this%struct_vectors(j)%dbl1d(irow) case (3) ! -- memtype charstring ! - errmsg = 'IDM unimplemented. StructArray::read_from_binary string & - &types not supported for binary inputs.' + errmsg = 'List style binary inputs not supported & + &for text columns, tag='// & + trim(this%struct_vectors(j)%idt%tagname)//'.' call store_error(errmsg, terminate=.TRUE.) ! case (4) ! -- memtype intvector From 60e5d427202fb414b8b5554207f7f9f5549b168d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 18:51:15 -0400 Subject: [PATCH 143/199] chore(deps): bump prefix-dev/setup-pixi from 0.6.0 to 0.7.0 (#1785) --- .github/workflows/ci.yml | 12 ++++++------ .github/workflows/compilers.yml | 2 +- .github/workflows/docs.yml | 6 +++--- .github/workflows/large.yml | 2 +- .github/workflows/pixi_auto_update.yml | 2 +- .github/workflows/release.yml | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 249e5d3af37..217b73457fe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,7 +49,7 @@ jobs: - name: Checkout modflow6 uses: actions/checkout@v4 - - uses: prefix-dev/setup-pixi@v0.6.0 + - uses: prefix-dev/setup-pixi@v0.7.0 with: pixi-version: v0.19.1 @@ -79,7 +79,7 @@ jobs: compiler: gcc version: ${{ env.FC_V }} - - uses: prefix-dev/setup-pixi@v0.6.0 + - uses: prefix-dev/setup-pixi@v0.7.0 with: pixi-version: v0.19.1 @@ -124,7 +124,7 @@ jobs: version: ${{ env.FC_V }} - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.6.0 + uses: prefix-dev/setup-pixi@v0.7.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" @@ -223,7 +223,7 @@ jobs: version: ${{ env.FC_V }} - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.6.0 + uses: prefix-dev/setup-pixi@v0.7.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" @@ -349,7 +349,7 @@ jobs: path: modflow6-examples - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.6.0 + uses: prefix-dev/setup-pixi@v0.7.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" @@ -440,7 +440,7 @@ jobs: path: modflow6 - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.6.0 + uses: prefix-dev/setup-pixi@v0.7.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" diff --git a/.github/workflows/compilers.yml b/.github/workflows/compilers.yml index a4dc70e3a2c..0cad55f07aa 100644 --- a/.github/workflows/compilers.yml +++ b/.github/workflows/compilers.yml @@ -138,7 +138,7 @@ jobs: version: ${{ matrix.version }} - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.6.0 + uses: prefix-dev/setup-pixi@v0.7.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 2806dbb6314..a7b3199d01d 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -23,7 +23,7 @@ jobs: - name: Checkout modflow6 uses: actions/checkout@v4 - - uses: prefix-dev/setup-pixi@v0.6.0 + - uses: prefix-dev/setup-pixi@v0.7.0 with: pixi-version: v0.19.1 @@ -60,7 +60,7 @@ jobs: path: usgslatex - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.6.0 + uses: prefix-dev/setup-pixi@v0.7.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" @@ -215,7 +215,7 @@ jobs: sudo apt-get install doxygen graphviz - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.6.0 + uses: prefix-dev/setup-pixi@v0.7.0 with: pixi-version: v0.19.1 diff --git a/.github/workflows/large.yml b/.github/workflows/large.yml index bcfa7c34114..9514d9af112 100644 --- a/.github/workflows/large.yml +++ b/.github/workflows/large.yml @@ -67,7 +67,7 @@ jobs: path: modflow6-largetestmodels - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.6.0 + uses: prefix-dev/setup-pixi@v0.7.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" diff --git a/.github/workflows/pixi_auto_update.yml b/.github/workflows/pixi_auto_update.yml index 375d7882c6f..1df768e0af0 100644 --- a/.github/workflows/pixi_auto_update.yml +++ b/.github/workflows/pixi_auto_update.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: prefix-dev/setup-pixi@v0.6.0 + - uses: prefix-dev/setup-pixi@v0.7.0 with: pixi-version: v0.19.1 cache: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 163b29f8674..3ca19986108 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -103,7 +103,7 @@ jobs: ref: ${{ inputs.branch }} - name: Setup pixi - uses: prefix-dev/setup-pixi@v0.6.0 + uses: prefix-dev/setup-pixi@v0.7.0 with: pixi-version: v0.19.1 manifest-path: "modflow6/pixi.toml" From e741afb72d6975373a71a96069de1c38a8cccd76 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 13 May 2024 22:24:29 -0400 Subject: [PATCH 144/199] fix(scripts): create shared memory objects in main function (#1788) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Manager() creates a server process — as recommended, avoid starting new processes outside the main function so the module can safely be imported * avoid EOF errors --- .github/common/check_format.py | 28 ++++++++++++++-------------- .github/common/check_spelling.py | 22 +++++++++++----------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/.github/common/check_format.py b/.github/common/check_format.py index a21f7a32c4e..be4ca8eeb95 100644 --- a/.github/common/check_format.py +++ b/.github/common/check_format.py @@ -24,13 +24,6 @@ # exclude these files from checks excludefiles = [] -# shared state -manager = Manager() -failures = manager.Queue() -checks = manager.Value("checks", 0) -skips = manager.Value("skips", 0) -lock = manager.Lock() - # commands fprettify = "fprettify -c .fprettify.yaml" @@ -46,13 +39,11 @@ def excluded(path) -> bool: return False -def check_format(path, write_changes=False, verbose=False): +def check_format(path, lock, checks, failures, write_changes=False, verbose=False): path = Path(path) if excluded(path): if verbose: print(f"Skipping format check: {path}") - with lock: - skips.value += 1 return if verbose: @@ -68,7 +59,7 @@ def check_format(path, write_changes=False, verbose=False): checks.value += 1 -def report(duration: float) -> bool: +def report(checks, failures, duration: float) -> bool: def pop(q): return q.get(block=False) @@ -118,8 +109,14 @@ def pop(q): write = args.write_changes verbose = args.verbose + # shared state + manager = Manager() + lock = manager.Lock() + checks = manager.Value("checks", 0) + failures = manager.Queue() + if path.is_file(): - check_format(path, verbose) + check_format(path, lock, checks, failures, verbose=verbose) else: with Pool(cpu_count()) as pool: files = [str(p) for p in path.rglob("*.[fF]9[05]")] @@ -127,7 +124,10 @@ def pop(q): msg = f"Checking {len(files)} files in directory: {path}" print(msg) print("".join(repeat("-", len(msg)))) - pool.starmap(check_format, [(f, write, verbose) for f in files]) + pool.starmap( + check_format, + [(f, lock, checks, failures, write, verbose) for f in files], + ) stop = timeit.default_timer() - sys.exit(0 if report(stop - start) else 1) + sys.exit(0 if report(checks, failures, stop - start) else 1) diff --git a/.github/common/check_spelling.py b/.github/common/check_spelling.py index c9ac0dd77e4..228104b10d1 100644 --- a/.github/common/check_spelling.py +++ b/.github/common/check_spelling.py @@ -26,12 +26,6 @@ # exclude these files from checks excludefiles = [] -# shared state -manager = Manager() -failures = manager.Queue() -checks = manager.Value("checks", 0) -lock = manager.Lock() - # commands codespell = "codespell --ignore-words=.codespell.ignore" @@ -47,7 +41,7 @@ def excluded(path) -> bool: return False -def check_spelling(path, write_changes=False, verbose=False): +def check_spelling(path, lock, checks, failures, write_changes=False, verbose=False): path = Path(path) if verbose: print(f"Checking spelling: {path}") @@ -62,7 +56,7 @@ def check_spelling(path, write_changes=False, verbose=False): checks.value += 1 -def report(duration: float) -> bool: +def report(checks, failures, duration: float) -> bool: def pop(q): return q.get(block=False) @@ -118,8 +112,14 @@ def pop(q): write = args.write_changes verbose = args.verbose + # shared state + manager = Manager() + lock = manager.Lock() + checks = manager.Value("checks", 0) + failures = manager.Queue() + if path.is_file(): - check_spelling(path, write, verbose) + check_spelling(path, lock, checks, failures, write, verbose) else: with Pool(cpu_count()) as pool: files = [] @@ -129,7 +129,7 @@ def pop(q): msg = f"Checking {len(files)} files in directory: {path}" print(msg) print("".join(repeat("-", len(msg)))) - pool.starmap(check_spelling, [(f, write, verbose) for f in files]) + pool.starmap(check_spelling, [(f, lock, checks, failures, write, verbose) for f in files]) stop = timeit.default_timer() - sys.exit(0 if report(stop - start) else 1) + sys.exit(0 if report(checks, failures, stop - start) else 1) From 0eb76440661670f1cf4d86e2c9c953eb39b56be6 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 13 May 2024 22:48:45 -0400 Subject: [PATCH 145/199] refactor(prt): define istatus=9, subcell with no exit face (#1790) * previously corresponded to mp7 'terminated for unknown reason' --- src/Model/ModelUtilities/TrackData.f90 | 3 ++- .../ParticleTracker/MethodSubcellPollock.f90 | 8 +++----- .../ParticleTracker/MethodSubcellTernary.f90 | 13 +++---------- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/Model/ModelUtilities/TrackData.f90 b/src/Model/ModelUtilities/TrackData.f90 index bf2230d6b83..2a43c7d97b7 100644 --- a/src/Model/ModelUtilities/TrackData.f90 +++ b/src/Model/ModelUtilities/TrackData.f90 @@ -104,7 +104,7 @@ module TrackModule ! 6: terminated in cell with specified zone number ! 7: terminated in inactive cell ! 8: permanently unreleased*** - ! 9: terminated for unknown reason* + ! 9: terminated in subcell with no exit face***** ! ! PRT shares the same status enumeration as MODPATH 7. However, some ! don't apply to PRT; for instance, MODPATH 7 distinguishes forwards @@ -115,6 +115,7 @@ module TrackModule ! ** unnecessary since PRT makes no distinction between forwards/backwards tracking ! *** e.g., released into an inactive cell, a stop zone cell, or a termination zone ! **** this may coincide with termination, in which case two events are reported + ! ***** PRT-specific status indicating a particle stopped within a cell subcell contains diff --git a/src/Solution/ParticleTracker/MethodSubcellPollock.f90 b/src/Solution/ParticleTracker/MethodSubcellPollock.f90 index 3b122739c61..04a075ce733 100644 --- a/src/Solution/ParticleTracker/MethodSubcellPollock.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellPollock.f90 @@ -135,12 +135,10 @@ subroutine track_subcell(this, subcell, particle, tmax) statusVZ = calculate_dt(subcell%vz1, subcell%vz2, subcell%dz, & initialZ, vz, dvzdz, dtexitz) - ! -- Subcells should never be strong sinks, contact the developer situation + ! -- Subcell with no exit face, terminate the particle if ((statusVX .eq. 3) .and. (statusVY .eq. 3) .and. (statusVZ .eq. 3)) then - print *, "Subcell with no exit face:", & - "particle", get_particle_id(particle), & - "cell", particle%idomain(2) - call pstop(1) + call this%save(particle, reason=9) + return end if ! -- Determine (earliest) exit face and corresponding travel time to exit diff --git a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 index edf31873aa7..ae1d11a6316 100644 --- a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 @@ -204,17 +204,10 @@ subroutine track_subcell(this, subcell, particle, tmax) alp0, bet0, alp1, bet1, alp2, bet2, alpi, beti, & vziodz, az, lbary) - ! -- Check for no exit face + ! -- Subcell with no exit face, terminate the particle if ((itopbotexit .eq. 0) .and. (itrifaceexit .eq. 0)) then - ! exitFace = 0 - ! particle%iboundary(3) = exitFace - ! particle%istatus = 5 - ! return - - ! contact the developer situation (for now? always?) - print *, "Subcell with no exit face: particle", get_particle_id(particle), & - "cell", particle%idomain(2) - call pstop(1) + call this%save(particle, reason=9) + return end if ! -- Determine (earliest) exit face and corresponding travel time to exit From 4502cddfe333df5af8e77b06d3fc78b6c1e69058 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 13 May 2024 23:59:00 -0400 Subject: [PATCH 146/199] refactor(prt): remove euler and test methods from ternary soln (#1789) * limit zeromethod options to 1 brent, 2 chandrupatla in ternary solution * remove test method root function from MathUtil * cleanup, use named constants --- autotest/TestMathUtil.f90 | 25 +-- autotest/test_prt_ternary_methods.py | 4 - doc/mf6io/mf6ivar/dfn/prt-mip.dfn | 2 +- .../ParticleTracker/TernarySolveTrack.f90 | 206 +----------------- src/Utilities/MathUtil.f90 | 156 ++++--------- 5 files changed, 45 insertions(+), 348 deletions(-) diff --git a/autotest/TestMathUtil.f90 b/autotest/TestMathUtil.f90 index 773f7604674..c8a54e06301 100644 --- a/autotest/TestMathUtil.f90 +++ b/autotest/TestMathUtil.f90 @@ -4,7 +4,7 @@ module TestMathUtil use testdrive, only: check, error_type, new_unittest, test_failed, & to_string, unittest_type use MathUtilModule, only: f1d, is_close, mod_offset, & - zero_ch, zero_test, zero_br, & + zero_ch, zero_br, & get_perturbation implicit none private @@ -24,8 +24,6 @@ subroutine collect_mathutil(testsuite) test_zero_ch), & new_unittest("zero_br", & test_zero_br), & - new_unittest("zero_test", & - test_zero_test), & new_unittest("get_perturbation", & test_get_perturbation) & ] @@ -222,27 +220,6 @@ subroutine test_zero_br(error) 'expected pi, got: '//to_string(z)) end subroutine test_zero_br - subroutine test_zero_test(error) - type(error_type), allocatable, intent(out) :: error - real(DP), parameter :: pi = 4 * atan(1.0_DP) - real(DP) :: z - procedure(f1d), pointer :: f - - f => sine - - z = zero_test(-1.0_DP, 1.0_DP, f, 0.001_DP) - call check(error, is_close(z, 0.0_DP, atol=1d-6), & - 'expected 0, got: '//to_string(z)) - - z = zero_test(-4.0_DP, -1.0_DP, f, 0.001_DP) - call check(error, is_close(z, -pi, atol=1d-6), & - 'expected -pi, got: '//to_string(z)) - - z = zero_test(1.0_DP, 4.0_DP, f, 0.001_DP) - call check(error, is_close(z, pi, atol=1d-6), & - 'expected pi, got: '//to_string(z)) - end subroutine test_zero_test - subroutine test_get_perturbation(error) type(error_type), allocatable, intent(out) :: error real(DP) :: x, eps diff --git a/autotest/test_prt_ternary_methods.py b/autotest/test_prt_ternary_methods.py index ef12c5398e8..7bedea3abbe 100644 --- a/autotest/test_prt_ternary_methods.py +++ b/autotest/test_prt_ternary_methods.py @@ -40,16 +40,12 @@ simname = "prtter" cases = [ - f"{simname}eu", f"{simname}br", f"{simname}ch", - # f"{simname}test", ] methods = [ - 0, # euler 1, # brent 2, # chandrupatla - # 3 # test method (doesn't always converge??) ] diff --git a/doc/mf6io/mf6ivar/dfn/prt-mip.dfn b/doc/mf6io/mf6ivar/dfn/prt-mip.dfn index 0448d2249cc..7dbb1a493c9 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-mip.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-mip.dfn @@ -6,7 +6,7 @@ type integer reader urword optional true longname zero method -description the root finding algorithm to solve ternary subcells. 0 euler, 1 brent, 2 chandrupatla, 3 test. +description the root finding algorithm to solve ternary subcells. 1 brent, 2 chandrupatla. block options name export_array_ascii diff --git a/src/Solution/ParticleTracker/TernarySolveTrack.f90 b/src/Solution/ParticleTracker/TernarySolveTrack.f90 index dbc49a10eb7..f572725ee44 100644 --- a/src/Solution/ParticleTracker/TernarySolveTrack.f90 +++ b/src/Solution/ParticleTracker/TernarySolveTrack.f90 @@ -2,7 +2,7 @@ module TernarySolveTrack use KindModule, only: I4B, DP, LGP use GeomUtilModule, only: skew - use MathUtilModule, only: f1d, zero_ch, zero_br, zero_test + use MathUtilModule, only: f1d, zero_ch, zero_br use ErrorUtilModule, only: pstop private @@ -11,15 +11,12 @@ module TernarySolveTrack public :: get_w public :: solve_coefs public :: step_analytical - public :: step_euler public :: find_exit_bary public :: get_t_alpt public :: get_bet_outflow_bary public :: get_bet_soln_limits public :: soln_brent public :: soln_chand - public :: soln_test - public :: soln_euler public :: alpfun ! global data @@ -41,7 +38,7 @@ subroutine traverse_triangle(isolv, tol, step, texit, & ! -- dummy integer(I4B), intent(in) :: isolv !< solution method real(DP), intent(in) :: tol !< solution tolerance - real(DP), intent(in) :: step !< stepsize for numerical methods (e.g. euler) + real(DP), intent(in) :: step !< stepsize for numerical methods real(DP), intent(out) :: texit !< time particle exits the cell real(DP) :: alpexit real(DP) :: betexit !< alpha and beta coefficients @@ -365,80 +362,6 @@ subroutine step_analytical(t, alp, bet) end subroutine - !> @brief Step (evaluate) numerically depending in case - subroutine step_euler(nt, step, vziodz, az, alpi, beti, t, alp, bet) - ! -- dummy - integer(I4B) :: nt - real(DP), intent(in) :: step - real(DP) :: vziodz - real(DP) :: az - real(DP) :: alpi - real(DP) :: beti - real(DP), intent(inout) :: t - real(DP) :: alp - real(DP) :: bet - ! -- local - real(DP) :: alpproj - real(DP) :: betproj - real(DP) :: valp - real(DP) :: vbet - real(DP) :: vz - real(DP) :: vmeasure - real(DP) :: delt - real(DP) :: thalf - real(DP) :: rkn1 - real(DP) :: rln1 - real(DP) :: rkn2 - real(DP) :: rln2 - real(DP) :: rkn3 - real(DP) :: rln3 - real(DP) :: rkn4 - real(DP) :: rln4 - - if (nt .eq. 0) then - ! -- Initial location - alp = alpi - bet = beti - t = 0d0 - else - ! -- Step numerically - valp = cv0(1) + waa * alp + wab * bet - vbet = cv0(2) + wba * alp + wbb * bet - if (step .lt. 0d0) then - ! -- Compute time step based on abs value of step, interpreting the latter - ! -- as a distance in canonical coordinates (alpha, beta, and scaled z) - vz = vziodz * dexp(az * t) - vmeasure = dsqrt(valp * valp + vbet * vbet + vz * vz) - delt = -step / vmeasure - else - ! -- Set time step directly to step - delt = step - end if - ikluge = 2 ! kluge - if (ikluge .eq. 1) then - t = t + delt - alp = alp + valp * delt - bet = bet + vbet * delt - else - rkn1 = valp - rln1 = vbet - thalf = t + 5d-1 * delt - call step_analytical(thalf, alpproj, betproj) - rkn2 = cv0(1) + waa * alpproj + wab * betproj - rln2 = cv0(2) + wba * alpproj + wbb * betproj - rkn3 = rkn2 - rln3 = rln2 - t = t + delt - call step_analytical(t, alpproj, betproj) - rkn4 = cv0(1) + waa * alpproj + wab * betproj - rln4 = cv0(2) + wba * alpproj + wbb * betproj - alp = alp + delt * (rkn1 + 2d0 * rkn2 + 2d0 * rkn3 + rkn4) / 6d0 - bet = bet + delt * (rln1 + 2d0 * rln2 + 2d0 * rln3 + rln4) / 6d0 - end if - end if - - end subroutine - !> @brief Find the exit time and location in barycentric coordinates. subroutine find_exit_bary(isolv, itriface, itrifaceenter, & alpi, beti, & @@ -595,11 +518,7 @@ subroutine find_exit_bary(isolv, itriface, itrifaceenter, & ! -- Root not bracketed; no exit texit = huge(1d0) else - if (isolv .eq. 0) then - ! -- Use Euler integration to find exit - call soln_euler(itriface, alpi, beti, step, vziodz, az, & - texit, alpexit, betexit) - else if (isolv .eq. 1) then + if (isolv .eq. 1) then ! -- Use Brent's method with initial bounds on beta of betlo and bethi, ! -- assuming they bound the root call soln_brent(itriface, betlo, bethi, tol, texit, & @@ -609,13 +528,8 @@ subroutine find_exit_bary(isolv, itriface, itrifaceenter, & ! -- assuming they bound the root call soln_chand(itriface, betlo, bethi, tol, texit, & alpexit, betexit) - else if (isolv .eq. 3) then - ! -- Use a test method with initial bounds on beta of betlo and bethi, - ! -- assuming they bound the root - call soln_test(itriface, betlo, bethi, tol, texit, & - alpexit, betexit) else - call pstop(1, "Invalid isolv, expected 0, 1, 2, or 3") + call pstop(1, "Invalid isolv, expected one of: 1, 2") end if end if end if @@ -857,116 +771,4 @@ subroutine soln_chand(itriface, betlo, bethi, tol, & end subroutine - !> @brief Use a test method with initial bounds on beta of betlo and bethi - subroutine soln_test(itriface, betlo, bethi, tol, & - texit, alpexit, betexit) - ! -- dummy - integer(I4B), intent(in) :: itriface - real(DP) :: betlo - real(DP) :: bethi - real(DP), intent(in) :: tol - real(DP) :: texit - real(DP) :: alpexit - real(DP) :: betexit - ! -- local - real(DP) :: itmax - real(DP) :: itact - real(DP) :: blo - real(DP) :: bhi - procedure(f1d), pointer :: f - - ! -- assuming betlo and bethi bracket the root - ! tol = 1d-7 ! kluge - itmax = 50 ! kluge - itact = itmax + 1 ! kluge - blo = betlo - bhi = bethi - if (itriface .eq. 1) then - f => fbary1 - betexit = zero_test(blo, bhi, f, tol) - else - f => fbary2 - betexit = zero_test(blo, bhi, f, tol) - end if - call get_t_alpt(betexit, texit, alpexit) - - end subroutine - - !> @brief Use Euler integration to find exit - subroutine soln_euler(itriface, alpi, beti, step, vziodz, & - az, texit, alpexit, betexit) - ! -- dummy - integer(I4B), intent(in) :: itriface - real(DP) :: alpi - real(DP) :: beti - real(DP), intent(in) :: step - real(DP) :: vziodz - real(DP) :: az - real(DP) :: texit - real(DP) :: alpexit - real(DP) :: betexit - ! -- local - real(DP) :: alp - real(DP) :: bet - real(DP) :: gam - real(DP) :: alpold - real(DP) :: betold - real(DP) :: gamold - real(DP) :: wt - real(DP) :: omwt - real(DP) :: t - real(DP) :: told - - t = 0d0 - alp = alpi - bet = beti - if (itriface .eq. 1) gam = 1d0 - alpi - beti - do nt = 1, 1000000000 ! kluge hardwired - ! -- Save current time, alpha, and beta - told = t - alpold = alp - betold = bet - ! -- Step forward in time - ! t = dble(nt)*step - call step_euler(nt, step, vziodz, az, alpi, beti, t, alp, bet) - ! if (nt.eq.0) then - ! znum = zi - ! else - ! vz = vzbot + az*(znum - zbot) - ! znum = znum + vz*delt ! kluge note: can be smart about checking z - ! end if - if (itriface .eq. 1) then - ! -- If gamma has crossed zero, interpolate linearly - ! -- to find crossing (exit) point - gamold = gam - gam = 1d0 - alp - bet - if (gam .lt. 0d0) then - wt = gamold / (gamold - gam) - omwt = 1d0 - wt - texit = omwt * told + wt * t - alpexit = omwt * alpold + wt * alp - betexit = omwt * betold + wt * bet - exit - end if - else - ! -- If alpha has crossed zero, interpolate linearly - ! -- to find crossing (exit) point - if (alp .lt. 0d0) then - wt = alpold / (alpold - alp) - omwt = 1d0 - wt - texit = omwt * told + wt * t - alpexit = omwt * alpold + wt * alp - betexit = omwt * betold + wt * bet - exit - end if - end if - ! -- End time step loop - end do - if (nt .gt. 1000000000) then ! kluge hardwired - ! -- Exit not found after max number of time steps - call pstop(1, "Didn't find exit in soln_euler") - end if - - end subroutine - end module TernarySolveTrack diff --git a/src/Utilities/MathUtil.f90 b/src/Utilities/MathUtil.f90 index 24296c4f0ae..08c2f5975af 100644 --- a/src/Utilities/MathUtil.f90 +++ b/src/Utilities/MathUtil.f90 @@ -2,12 +2,12 @@ module MathUtilModule use KindModule, only: DP, I4B, LGP use ErrorUtilModule, only: pstop use ConstantsModule, only: MAXCHARLEN, LENHUGELINE, & - DZERO, DPREC, DSAME, & + DZERO, DPREC, DSAME, DHALF, DONE, DTWO, DTHREE, & LINELENGTH, LENHUGELINE, VSUMMARY implicit none private - public :: f1d, is_close, mod_offset, zero_ch, zero_br, zero_test, & + public :: f1d, is_close, mod_offset, zero_ch, zero_br, & get_perturbation interface mod_offset @@ -156,8 +156,16 @@ function zero_ch(x0, x1, f, epsa) result(z) fc = f(c) t = 5d-1 + ! check whether a or b is the solution + if (fa == DZERO) then + z = a + return + else if (fb == DZERO) then + z = b + return + end if + do while (.true.) - ! xt = a + t*(b - a) xt = a - t * aminusb ft = f(xt) if (sign(ft, fa) == ft) then @@ -183,29 +191,17 @@ function zero_ch(x0, x1, f, epsa) result(z) xm = b fm = fb end if - tol = 2d0 * epsm * dabs(xm) + epsa - ! tl = tol/dabs(b - c) + tol = DTWO * epsm * dabs(xm) + epsa tl = tol / dabs(cminusb) - if ((tl > 5d-1) .or. (fm == 0d0)) then + if ((tl > 5d-1) .or. (fm == DZERO)) then z = xm return end if - ! xi = (a - b)/(c - b) xi = aminusb / cminusb - ! phi = (fa - fb)/(fc - fb) phi = faminusfb / fcminusfb - philo = 1d0 - dsqrt(1d0 - xi) + philo = DONE - dsqrt(DONE - xi) phihi = dsqrt(xi) if ((phi > philo) .and. (phi < phihi)) then - ! rab = fa/(fb - fa) - ! rab = -fa/faminusfb - ! rcb = fc/(fb - fc) - ! rcb = -fc/fcminusfb - ! rac = fa/(fc - fa) - ! rbc = fb/(fc - fb) - ! rbc = fb/fcminusfb - ! t = rab*rcb + rac*rbc*(c - a)/(b - a) - ! t = rab*rcb - rac*rbc*(c - a)/aminusb racb = fa / fcminusfb rcab = fc / faminusfb rbca = fb / (fc - fa) @@ -213,7 +209,7 @@ function zero_ch(x0, x1, f, epsa) result(z) if (t < tl) then t = tl else - tlc = 1d0 - tl + tlc = DONE - tl if (t > tlc) then t = tlc end if @@ -221,8 +217,6 @@ function zero_ch(x0, x1, f, epsa) result(z) else t = 5d-1 end if - ! if (t < tl) t = tl - ! if (t > 1d0 - tl) t = 1d0 - tl end do end function @@ -266,16 +260,24 @@ function zero_br(ax, bx, f, tol) result(z) logical(LGP) :: rs eps = epsilon(ax) - tol1 = eps + 1.0d0 + tol1 = eps + DONE a = ax b = bx fa = f(a) fb = f(b) - ! check that f(ax) and f(bx) have different signs - if (.not. ((fa .eq. 0.0d0 .or. fb .eq. 0.0d0) .or. & - (fa * (fb / dabs(fb)) .le. 0.0d0))) & + ! check if a or b is the solution + if (fa == DZERO) then + z = a + return + else if (fb == DZERO) then + z = b + return + end if + + ! check that f(ax) and f(bx) have opposite sign + if (fa * (fb / dabs(fb)) .ge. DZERO) & call pstop(1, 'f(ax) and f(bx) do not have different signs,') rs = .true. ! var reset @@ -296,9 +298,9 @@ function zero_br(ax, bx, f, tol) result(z) fc = fa end if - tol1 = 2.0d0 * eps * dabs(b) + 0.5d0 * tol - xm = 0.5d0 * (c - b) - if ((dabs(xm) .le. tol1) .or. (fb .eq. 0.0d0)) then + tol1 = DTWO * eps * dabs(b) + DHALF * tol + xm = DHALF * (c - b) + if ((dabs(xm) .le. tol1) .or. (fb .eq. DZERO)) then z = b return end if @@ -310,23 +312,23 @@ function zero_br(ax, bx, f, tol) result(z) ! inverse quadratic interpolation q = fa / fc r = fb / fc - p = s * (2.0d0 * xm * q * (q - r) - (b - a) * (r - 1.0d0)) - q = (q - 1.0d0) * (r - 1.0d0) * (s - 1.0d0) + p = s * (DTWO * xm * q * (q - r) - (b - a) * (r - DONE)) + q = (q - DONE) * (r - DONE) * (s - DONE) else ! linear interpolation - p = 2.0d0 * xm * s - q = 1.0d0 - s + p = DTWO * xm * s + q = DONE - s end if - if (p .le. 0.0d0) then + if (p .le. DZERO) then p = -p else q = -q end if s = e e = d - if (((2.0d0 * p) .ge. (3.0d0 * xm * q - dabs(tol1 * q))) .or. & - (p .ge. dabs(0.5d0 * s * q))) then + if (((DTWO * p) .ge. (DTHREE * xm * q - dabs(tol1 * q))) .or. & + (p .ge. dabs(DHALF * s * q))) then d = xm e = d else @@ -341,7 +343,7 @@ function zero_br(ax, bx, f, tol) result(z) fa = fb if (dabs(d) .le. tol1) then - if (xm .le. 0.0d0) then + if (xm .le. DZERO) then b = b - tol1 else b = b + tol1 @@ -351,90 +353,10 @@ function zero_br(ax, bx, f, tol) result(z) end if fb = f(b) - rs = (fb * (fc / dabs(fc))) .gt. 0.0d0 + rs = (fb * (fc / dabs(fc))) .gt. DZERO end do end function zero_br - !> @brief Compute a zero of f(x) in the interval (x0, x1) with a test method. - function zero_test(x0, x1, f, epsa) result(z) - ! -- dummy - real(DP) :: x0, x1 - procedure(f1d), pointer, intent(in) :: f - real(DP) :: epsa - real(DP) :: z - ! -- local - real(DP) :: epsm - real(DP) :: ema, emb - real(DP) :: f0 - real(DP) :: tol - real(DP) :: xa, xb, xl - real(DP) :: ya, yb, yl - logical(LGP) :: retainedxa, retainedxb - - epsm = epsilon(x0) - f0 = f(x0) - if (f0 .eq. 0d0) then - z = x0 - return - else if (f0 .lt. 0d0) then - ya = x0 - yb = x1 - xa = f0 - xb = f(yb) - else - ya = x1 - yb = x0 - xa = f(ya) - xb = f0 - end if - ema = 1d0 - emb = 1d0 - retainedxa = .false. - retainedxb = .false. - - do while (.true.) - ! yl = ya - xa*(yb - ya)/(xb - xa) - yl = (ya * xb * emb - yb * xa * ema) / (xb * emb - xa * ema) - tol = 4d0 * epsm * dabs(yl) + epsa - if (dabs(yb - ya) .le. tol) then - z = yl - return - else - xl = f(yl) - if (xl .eq. 0d0) then - z = yl - return - else if (xl .gt. 0d0) then - if (retainedxa) then - ! ema = 1d0 - xl/xb - ! if (ema <= 0d0) ema = 5d-1 - ema = 5d-1 ! kluge illinois - else - ema = 1d0 - end if - emb = 1d0 - yb = yl - xb = xl - retainedxa = .true. - retainedxb = .false. - else - if (retainedxb) then - ! emb = 1d0 - xl/xa - ! if (emb <= 0d0) emb = 5d-1 - emb = 5d-1 ! kluge illinois - else - emb = 1d0 - end if - ema = 1d0 - ya = yl - xa = xl - retainedxa = .false. - retainedxb = .true. - end if - end if - end do - end function - !> @brief Calculate a numerical perturbation given the value of x !! !! Calculate a perturbation value to use for a numerical derivative From ef3fc1a4651bbd7c52c161a9c1bebd996eea3731 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 13 May 2024 23:59:34 -0400 Subject: [PATCH 147/199] feat(geomutil): add polygon area routine (#1791) --- autotest/TestGeomUtil.f90 | 42 ++++++++++++++++++++++++++++++++++++-- src/Utilities/GeomUtil.f90 | 28 +++++++++++++++++++++++-- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/autotest/TestGeomUtil.f90 b/autotest/TestGeomUtil.f90 index 3447f8eb6e9..fe4117ed08e 100644 --- a/autotest/TestGeomUtil.f90 +++ b/autotest/TestGeomUtil.f90 @@ -3,7 +3,7 @@ module TestGeomUtil use testdrive, only: check, error_type, new_unittest, test_failed, & to_string, unittest_type use GeomUtilModule, only: get_node, get_ijk, get_jk, point_in_polygon, & - skew + skew, area use ConstantsModule, only: LINELENGTH implicit none private @@ -22,7 +22,8 @@ subroutine collect_geomutil(testsuite) test_point_in_polygon_tri), & new_unittest("point_in_polygon_irr", & test_point_in_polygon_irr), & - new_unittest("skew", test_skew) & + new_unittest("skew", test_skew), & + new_unittest("area", test_area) & ] end subroutine collect_geomutil @@ -300,24 +301,61 @@ subroutine test_skew(error) v = (/1.0_DP, 1.0_DP/) v = skew(v, (/1.0_DP, 1.0_DP, 1.0_DP/)) call check(error, v(1) == 2.0_DP .and. v(2) == 1.0_DP) + if (allocated(error)) return + v = (/2.0_DP, 2.0_DP/) v = skew(v, (/1.0_DP, 0.5_DP, 1.0_DP/)) call check(error, v(1) == 3.0_DP .and. v(2) == 2.0_DP) + if (allocated(error)) return ! collapse x dim v = (/2.0_DP, 2.0_DP/) v = skew(v, (/0.0_DP, 0.5_DP, 1.0_DP/)) call check(error, v(1) == 1.0_DP .and. v(2) == 2.0_DP, to_string(v(1))) + if (allocated(error)) return ! mirror over x axis v = (/2.0_DP, 2.0_DP/) v = skew(v, (/-1.0_DP, 0.0_DP, 1.0_DP/)) call check(error, v(1) == -2.0_DP .and. v(2) == 2.0_DP, to_string(v(1))) + if (allocated(error)) return ! mirror over x and y axis v = (/2.0_DP, 2.0_DP/) v = skew(v, (/-1.0_DP, 0.0_DP, -1.0_DP/)) call check(error, v(1) == -2.0_DP .and. v(2) == -2.0_DP, to_string(v(1))) + if (allocated(error)) return end subroutine test_skew + subroutine test_area(error) + type(error_type), allocatable, intent(out) :: error + real(DP), allocatable :: poly(:, :) + real(DP) :: a + + allocate (poly(2, 5)) + + poly(:, 1) = (/0.0_DP, 0.0_DP/) + poly(:, 2) = (/1.0_DP, 1.0_DP/) + poly(:, 3) = (/1.0_DP, 2.0_DP/) + poly(:, 4) = (/2.0_DP, 2.0_DP/) + poly(:, 5) = (/2.0_DP, 0.0_DP/) + + a = area(poly(1, :), poly(2, :)) + call check(error, a == 2.5_DP, to_string(a)) + if (allocated(error)) return + + poly(:, 5) = (/0.0_DP, 0.0_DP/) + poly(:, 4) = (/1.0_DP, 1.0_DP/) + poly(:, 3) = (/1.0_DP, 2.0_DP/) + poly(:, 2) = (/2.0_DP, 2.0_DP/) + poly(:, 1) = (/2.0_DP, 0.0_DP/) + + a = area(poly(1, :), poly(2, :), cw=.false.) + call check(error, a == 2.5_DP, to_string(a)) + if (allocated(error)) return + + deallocate (poly) + + end subroutine + end module TestGeomUtil diff --git a/src/Utilities/GeomUtil.f90 b/src/Utilities/GeomUtil.f90 index e15343d5507..2c8a4502765 100644 --- a/src/Utilities/GeomUtil.f90 +++ b/src/Utilities/GeomUtil.f90 @@ -1,12 +1,13 @@ module GeomUtilModule use KindModule, only: I4B, DP, LGP use ErrorUtilModule, only: pstop - use ConstantsModule, only: DZERO, DONE + use ConstantsModule, only: DZERO, DONE, DHALF implicit none private public :: between, point_in_polygon, & get_node, get_ijk, get_jk, & - skew, transform, compose + skew, transform, compose, & + area contains !> @brief Check if a value is between two other values (inclusive). @@ -362,4 +363,27 @@ subroutine defaults(xorigin, yorigin, zorigin, & if (present(invert_opt)) invert = invert_opt end subroutine defaults + !> @brief Calculate polygon area, with vertices given in CW or CCW order. + function area(xv, yv, cw) result(a) + ! dummy + real(DP), dimension(:), intent(in) :: xv + real(DP), dimension(:), intent(in) :: yv + logical(LGP), intent(in), optional :: cw + ! result + real(DP) :: a + integer(I4B) :: s + + if (present(cw)) then + if (cw) then + s = 1 + else + s = -1 + end if + else + s = 1 + end if + + a = -DHALF * sum(xv(:) * cshift(yv(:), s) - cshift(xv(:), s) * yv(:)) + + end function area end module GeomUtilModule From b6e2b6bd64f8eb5490ce09748812923588bc03aa Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Tue, 14 May 2024 05:28:36 -0700 Subject: [PATCH 148/199] fix(mf6io): apply suggested change to DSP write-up for consistency with CND write-up (#1787) --- doc/mf6io/gwt/dsp.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/mf6io/gwt/dsp.tex b/doc/mf6io/gwt/dsp.tex index 100b5c7b65d..8b78c0a4b1a 100644 --- a/doc/mf6io/gwt/dsp.tex +++ b/doc/mf6io/gwt/dsp.tex @@ -1,4 +1,4 @@ -Dispersion (DSP) Package information is read from the file that is specified by ``DSP6'' as the file type. Only one DSP Package can be specified for a GWT model. The DSP Package is based on the mathematical formulation presented for the XT3D option of the NPF Package available to represent full three-dimensional anisotropy in groundwater flow. XT3D can be computationally expensive and can be turned off to use a simplified and approximate form of the dispersion equations. For most problems, however, XT3D will be required to accurately represent dispersion. +Dispersion (DSP) Package information is read from the file that is specified by ``DSP6'' as the file type. Only one DSP Package can be specified for a GWT model. By default, the DSP Package uses the mathematical formulation presented for the XT3D option of the NPF Package to represent full three-dimensional anisotropy in groundwater flow. XT3D can be computationally expensive and can be turned off to use a simplified and approximate form of the dispersion equations. For most problems, however, XT3D will be required to accurately represent dispersion. \vspace{5mm} \subsubsection{Structure of Blocks} From d591a8e6a282060d9452cfd5b8434adf6c5c075a Mon Sep 17 00:00:00 2001 From: mjreno Date: Tue, 14 May 2024 09:56:05 -0400 Subject: [PATCH 149/199] test(idm): add exchange binary input tests (#1784) * update test_gwfgwf to read exchange data from binary input * add gwfgwf_lgr binary input tests * add disu binary exchange input test --------- Co-authored-by: mjreno --- autotest/data/gwfgwf_lgr_exg.txt | 117 ++++++++++++++++++ .../par_gwf_disu_exg/par_gwf_disu3_exg.txt | 1 + .../par_gwf_disu_exg/par_gwf_disu4_exg.txt | 5 + .../par_gwf_disu_exg/par_gwf_disu5_exg.txt | 25 ++++ autotest/test_gwfgwf_lgr.py | 58 ++++++++- autotest/test_par_gwf_disu.py | 46 ++++++- 6 files changed, 247 insertions(+), 5 deletions(-) create mode 100644 autotest/data/gwfgwf_lgr_exg.txt create mode 100644 autotest/data/par_gwf_disu_exg/par_gwf_disu3_exg.txt create mode 100644 autotest/data/par_gwf_disu_exg/par_gwf_disu4_exg.txt create mode 100644 autotest/data/par_gwf_disu_exg/par_gwf_disu5_exg.txt diff --git a/autotest/data/gwfgwf_lgr_exg.txt b/autotest/data/gwfgwf_lgr_exg.txt new file mode 100644 index 00000000000..97b8da6f847 --- /dev/null +++ b/autotest/data/gwfgwf_lgr_exg.txt @@ -0,0 +1,117 @@ + 1 3 2 1 1 1 1 50.00000000 16.66666667 33.33333333 0.00000000 74.53559925 + 1 2 3 1 1 1 1 50.00000000 16.66666667 33.33333333 270.00000000 74.53559925 + 2 3 3 1 1 1 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 2 3 1 1 2 1 50.00000000 16.66666667 33.33333333 270.00000000 66.66666667 + 2 3 3 1 1 2 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 2 3 1 1 3 1 50.00000000 16.66666667 33.33333333 270.00000000 74.53559925 + 2 3 3 1 1 3 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 2 4 1 1 4 1 50.00000000 16.66666667 33.33333333 270.00000000 74.53559925 + 2 3 4 1 1 4 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 2 4 1 1 5 1 50.00000000 16.66666667 33.33333333 270.00000000 66.66666667 + 2 3 4 1 1 5 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 2 4 1 1 6 1 50.00000000 16.66666667 33.33333333 270.00000000 74.53559925 + 2 3 4 1 1 6 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 2 5 1 1 7 1 50.00000000 16.66666667 33.33333333 270.00000000 74.53559925 + 2 3 5 1 1 7 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 2 5 1 1 8 1 50.00000000 16.66666667 33.33333333 270.00000000 66.66666667 + 2 3 5 1 1 8 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 3 6 1 1 9 1 50.00000000 16.66666667 33.33333333 180.00000000 74.53559925 + 1 2 5 1 1 9 1 50.00000000 16.66666667 33.33333333 270.00000000 74.53559925 + 2 3 5 1 1 9 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 3 2 1 2 1 1 50.00000000 16.66666667 33.33333333 0.00000000 66.66666667 + 2 3 3 1 2 1 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 3 3 1 2 2 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 3 3 1 2 3 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 3 4 1 2 4 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 3 4 1 2 5 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 3 4 1 2 6 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 3 5 1 2 7 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 3 5 1 2 8 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 3 6 1 2 9 1 50.00000000 16.66666667 33.33333333 180.00000000 66.66666667 + 2 3 5 1 2 9 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 3 2 1 3 1 1 50.00000000 16.66666667 33.33333333 0.00000000 74.53559925 + 2 3 3 1 3 1 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 3 3 1 3 2 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 3 3 1 3 3 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 3 4 1 3 4 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 3 4 1 3 5 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 3 4 1 3 6 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 3 5 1 3 7 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 3 5 1 3 8 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 3 6 1 3 9 1 50.00000000 16.66666667 33.33333333 180.00000000 74.53559925 + 2 3 5 1 3 9 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 4 2 1 4 1 1 50.00000000 16.66666667 33.33333333 0.00000000 74.53559925 + 2 4 3 1 4 1 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 3 1 4 2 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 3 1 4 3 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 4 1 4 4 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 4 1 4 5 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 4 1 4 6 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 5 1 4 7 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 5 1 4 8 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 4 6 1 4 9 1 50.00000000 16.66666667 33.33333333 180.00000000 74.53559925 + 2 4 5 1 4 9 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 4 2 1 5 1 1 50.00000000 16.66666667 33.33333333 0.00000000 66.66666667 + 2 4 3 1 5 1 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 3 1 5 2 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 3 1 5 3 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 4 1 5 4 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 4 1 5 5 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 4 1 5 6 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 5 1 5 7 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 5 1 5 8 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 4 6 1 5 9 1 50.00000000 16.66666667 33.33333333 180.00000000 66.66666667 + 2 4 5 1 5 9 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 4 2 1 6 1 1 50.00000000 16.66666667 33.33333333 0.00000000 74.53559925 + 2 4 3 1 6 1 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 3 1 6 2 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 3 1 6 3 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 4 1 6 4 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 4 1 6 5 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 4 1 6 6 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 5 1 6 7 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 4 5 1 6 8 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 4 6 1 6 9 1 50.00000000 16.66666667 33.33333333 180.00000000 74.53559925 + 2 4 5 1 6 9 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 5 2 1 7 1 1 50.00000000 16.66666667 33.33333333 0.00000000 74.53559925 + 2 5 3 1 7 1 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 5 3 1 7 2 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 5 3 1 7 3 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 5 4 1 7 4 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 5 4 1 7 5 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 5 4 1 7 6 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 5 5 1 7 7 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 5 5 1 7 8 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 5 6 1 7 9 1 50.00000000 16.66666667 33.33333333 180.00000000 74.53559925 + 2 5 5 1 7 9 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 5 2 1 8 1 1 50.00000000 16.66666667 33.33333333 0.00000000 66.66666667 + 2 5 3 1 8 1 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 5 3 1 8 2 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 5 3 1 8 3 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 5 4 1 8 4 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 5 4 1 8 5 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 5 4 1 8 6 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 5 5 1 8 7 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 2 5 5 1 8 8 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 5 6 1 8 9 1 50.00000000 16.66666667 33.33333333 180.00000000 66.66666667 + 2 5 5 1 8 9 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 5 2 1 9 1 1 50.00000000 16.66666667 33.33333333 0.00000000 74.53559925 + 1 6 3 1 9 1 1 50.00000000 16.66666667 33.33333333 90.00000000 74.53559925 + 2 5 3 1 9 1 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 6 3 1 9 2 1 50.00000000 16.66666667 33.33333333 90.00000000 66.66666667 + 2 5 3 1 9 2 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 6 3 1 9 3 1 50.00000000 16.66666667 33.33333333 90.00000000 74.53559925 + 2 5 3 1 9 3 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 6 4 1 9 4 1 50.00000000 16.66666667 33.33333333 90.00000000 74.53559925 + 2 5 4 1 9 4 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 6 4 1 9 5 1 50.00000000 16.66666667 33.33333333 90.00000000 66.66666667 + 2 5 4 1 9 5 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 6 4 1 9 6 1 50.00000000 16.66666667 33.33333333 90.00000000 74.53559925 + 2 5 4 1 9 6 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 6 5 1 9 7 1 50.00000000 16.66666667 33.33333333 90.00000000 74.53559925 + 2 5 5 1 9 7 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 6 5 1 9 8 1 50.00000000 16.66666667 33.33333333 90.00000000 66.66666667 + 2 5 5 1 9 8 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 + 1 5 6 1 9 9 1 50.00000000 16.66666667 33.33333333 180.00000000 74.53559925 + 1 6 5 1 9 9 1 50.00000000 16.66666667 33.33333333 90.00000000 74.53559925 + 2 5 5 1 9 9 0 50.00000000 50.00000000 1111.11111111 180.00000000 100.00000000 diff --git a/autotest/data/par_gwf_disu_exg/par_gwf_disu3_exg.txt b/autotest/data/par_gwf_disu_exg/par_gwf_disu3_exg.txt new file mode 100644 index 00000000000..f5945cc8f05 --- /dev/null +++ b/autotest/data/par_gwf_disu_exg/par_gwf_disu3_exg.txt @@ -0,0 +1 @@ +5 1 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 diff --git a/autotest/data/par_gwf_disu_exg/par_gwf_disu4_exg.txt b/autotest/data/par_gwf_disu_exg/par_gwf_disu4_exg.txt new file mode 100644 index 00000000000..0ad6c6a2ae7 --- /dev/null +++ b/autotest/data/par_gwf_disu_exg/par_gwf_disu4_exg.txt @@ -0,0 +1,5 @@ + 5 1 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 10 6 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 15 11 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 20 16 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 25 21 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 diff --git a/autotest/data/par_gwf_disu_exg/par_gwf_disu5_exg.txt b/autotest/data/par_gwf_disu_exg/par_gwf_disu5_exg.txt new file mode 100644 index 00000000000..ef92270176c --- /dev/null +++ b/autotest/data/par_gwf_disu_exg/par_gwf_disu5_exg.txt @@ -0,0 +1,25 @@ + 5 1 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 30 26 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 55 51 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 80 76 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 105 101 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 10 6 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 35 31 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 60 56 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 85 81 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 110 106 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 15 11 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 40 36 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 65 61 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 90 86 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 115 111 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 20 16 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 45 41 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 70 66 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 95 91 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 120 116 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 25 21 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 50 46 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 75 71 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 100 96 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 + 125 121 1 50.00000000 50.00000000 100.00000000 0.00000000 100.00000000 diff --git a/autotest/test_gwfgwf_lgr.py b/autotest/test_gwfgwf_lgr.py index 6292114b406..962b8631bc4 100644 --- a/autotest/test_gwfgwf_lgr.py +++ b/autotest/test_gwfgwf_lgr.py @@ -37,10 +37,17 @@ import pytest from flopy.utils.lgrutil import Lgr +from conftest import project_root_path from framework import TestFramework -cases = ["gwfgwf_lgr_classic", "gwfgwf_lgr_ifmod"] -ifmod = [False, True] +data_path = project_root_path / "autotest" / "data" +cases = [ + "gwfgwf_lgr_classic", + "gwfgwf_lgr_ifmod", + "gwfgwf_lgr_classic_binary", + "gwfgwf_lgr_ifmod_binary", +] +ifmod = [False, True, False, True] parent_name = "parent" child_name = "child" h_left = 1.0 @@ -222,13 +229,58 @@ def get_model(idx, test): exgdata = lgr.get_exchange_data(angldegx=True, cdist=True) + if name.endswith("_binary"): + exchangedata = { + "factor": 1.0, + "filename": "exg.bin", + "data": None, + "binary": True, + } + exg_fpath = data_path / "gwfgwf_lgr_exg.txt" + exg_fdata = np.loadtxt( + exg_fpath, + dtype={ + "names": ( + "c11", + "c12", + "c13", + "c21", + "c22", + "c23", + "ihc", + "cl1", + "cl2", + "hwva", + "aux1", + "aux2", + ), + "formats": ( + "i4", + "i4", + "i4", + "i4", + "i4", + "i4", + "i4", + "f8", + "f8", + "f8", + "f8", + "f8", + ), + }, + ) + exg_fdata.tofile(ws / "exg.bin") + else: + exchangedata = exgdata + gwfgwf = flopy.mf6.ModflowGwfgwf( sim, exgtype="GWF6-GWF6", nexg=len(exgdata), exgmnamea=parent_name, exgmnameb=child_name, - exchangedata=exgdata, + exchangedata=exchangedata, print_flows=True, auxiliary=["ANGLDEGX", "CDIST"], dev_interfacemodel_on=ifmod[idx], diff --git a/autotest/test_par_gwf_disu.py b/autotest/test_par_gwf_disu.py index da77695e6c2..918804c79a9 100644 --- a/autotest/test_par_gwf_disu.py +++ b/autotest/test_par_gwf_disu.py @@ -18,14 +18,19 @@ import pytest from flopy.utils.gridutil import get_disu_kwargs +from conftest import project_root_path from framework import TestFramework +data_path = project_root_path / "autotest" / "data" / "par_gwf_disu_exg" cases = [ "par_gwf_disu1d", "par_gwf_disu2d", "par_gwf_disu3d", + "par_gwf_disu1d_binary", + "par_gwf_disu2d_binary", + "par_gwf_disu3d_binary", ] -dis_shape = [(1, 1, 5), (1, 1, 5), (1, 1, 5), (1, 5, 5), (5, 5, 5)] +dis_shape = [(1, 1, 5), (1, 5, 5), (5, 5, 5), (1, 1, 5), (1, 5, 5), (5, 5, 5)] # global convenience... name_left = "leftmodel" @@ -184,13 +189,50 @@ def get_model(idx, dir): for ilay in range(nlay) ] + if name.endswith("_binary"): + exchangedata = { + "factor": 1.0, + "filename": "exg.bin", + "data": None, + "binary": True, + } + exg_fpath = data_path / f"par_gwf_disu{idx}_exg.txt" + exg_fdata = np.loadtxt( + exg_fpath, + dtype={ + "names": ( + "c11", + "c21", + "ihc", + "cl1", + "cl2", + "hwva", + "aux1", + "aux2", + ), + "formats": ( + "i4", + "i4", + "i4", + "f8", + "f8", + "f8", + "f8", + "f8", + ), + }, + ) + exg_fdata.tofile(dir / "exg.bin") + else: + exchangedata = gwfgwf_data + gwfgwf = flopy.mf6.ModflowGwfgwf( sim, exgtype="GWF6-GWF6", nexg=len(gwfgwf_data), exgmnamea=name_left, exgmnameb=name_right, - exchangedata=gwfgwf_data, + exchangedata=exchangedata, auxiliary=["ANGLDEGX", "CDIST"], print_input=True, ) From 3be7a5b77ce16ae2b4889edcd7af5e15279cfcab Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 14 May 2024 11:37:18 -0400 Subject: [PATCH 150/199] refactor(prt): move min tracking level to 1, use mem mgr for particle arrays (#1792) * minimum tracking level used to be 0 (simulation) but this is not necessary, move minimum tracking level to 1 (model) * allocate/resize particle arrays with memory manager, no longer need special handling for non-standard array bounds * update exclusions in check_format.py --- .github/common/check_format.py | 2 + src/Model/ParticleTracking/prt-prp.f90 | 2 - src/Model/ParticleTracking/prt.f90 | 3 +- .../ParticleTracker/MethodCellTernary.f90 | 5 +- .../ParticleTracker/MethodSubcellPollock.f90 | 2 - .../ParticleTracker/MethodSubcellTernary.f90 | 2 +- src/Solution/ParticleTracker/Particle.f90 | 76 +++++-------------- 7 files changed, 26 insertions(+), 66 deletions(-) diff --git a/.github/common/check_format.py b/.github/common/check_format.py index be4ca8eeb95..e9a49bcdeb0 100644 --- a/.github/common/check_format.py +++ b/.github/common/check_format.py @@ -19,6 +19,8 @@ PROJ_ROOT / "src" / "Utilities" / "Libraries" / "sparsekit", PROJ_ROOT / "src" / "Utilities" / "Libraries" / "sparskit2", PROJ_ROOT / "utils" / "mf5to6", + PROJ_ROOT / "utils" / "zonebudget" / "msvs", + PROJ_ROOT / "msvs" ] # exclude these files from checks diff --git a/src/Model/ParticleTracking/prt-prp.f90 b/src/Model/ParticleTracking/prt-prp.f90 index 61eacbf3e1c..39a6b8800c6 100644 --- a/src/Model/ParticleTracking/prt-prp.f90 +++ b/src/Model/ParticleTracking/prt-prp.f90 @@ -442,8 +442,6 @@ subroutine prp_ad(this) if (this%stoptime < particle%tstop) particle%tstop = this%stoptime end if particle%ttrack = particle%trelease - particle%idomain(0) = 0 - particle%iboundary(0) = 0 particle%idomain(1) = 0 particle%iboundary(1) = 0 particle%idomain(2) = ic diff --git a/src/Model/ParticleTracking/prt.f90 b/src/Model/ParticleTracking/prt.f90 index 29f637115c0..66fe08bfb1d 100644 --- a/src/Model/ParticleTracking/prt.f90 +++ b/src/Model/ParticleTracking/prt.f90 @@ -999,8 +999,7 @@ subroutine prt_solve(this) end select end do - ! -- Destroy particle - call particle%destroy() + ! -- Deallocate particle deallocate (particle) end subroutine prt_solve diff --git a/src/Solution/ParticleTracker/MethodCellTernary.f90 b/src/Solution/ParticleTracker/MethodCellTernary.f90 index e7deaadb7cd..613d201dbcf 100644 --- a/src/Solution/ParticleTracker/MethodCellTernary.f90 +++ b/src/Solution/ParticleTracker/MethodCellTernary.f90 @@ -275,8 +275,6 @@ end subroutine apply_mct !> @brief Loads a triangular subcell from the polygonal cell subroutine load_subcell(this, particle, subcell) - ! -- modules - use ParticleModule, only: get_particle_id ! -- dummy class(MethodCellTernaryType), intent(inout) :: this type(ParticleType), pointer, intent(inout) :: particle @@ -354,8 +352,7 @@ subroutine load_subcell(this, particle, subcell) end if end do if (isc .le. 0) then - print *, "error -- initial triangle not found for particle ", & - get_particle_id(particle), " in cell ", ic + print *, "error -- initial triangle not found in cell ", ic call pstop(1) else ! subcellTri%isubcell = isc diff --git a/src/Solution/ParticleTracker/MethodSubcellPollock.f90 b/src/Solution/ParticleTracker/MethodSubcellPollock.f90 index 04a075ce733..e1ab5a5df27 100644 --- a/src/Solution/ParticleTracker/MethodSubcellPollock.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellPollock.f90 @@ -84,8 +84,6 @@ end subroutine apply_msp !! this context and for any modifications or errors. !< subroutine track_subcell(this, subcell, particle, tmax) - ! modules - use ParticleModule, only: get_particle_id ! dummy class(MethodSubcellPollockType), intent(inout) :: this class(SubcellRectType), intent(in) :: subcell diff --git a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 index ae1d11a6316..5b34491e0e0 100644 --- a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 @@ -6,7 +6,7 @@ module MethodSubcellTernaryModule use CellModule, only: CellType use SubcellModule, only: SubcellType use SubcellTriModule, only: SubcellTriType, create_subcell_tri - use ParticleModule, only: ParticleType, get_particle_id + use ParticleModule, only: ParticleType use TrackModule, only: TrackFileControlType use TernarySolveTrack, only: traverse_triangle, step_analytical, canonical use PrtFmiModule, only: PrtFmiType diff --git a/src/Solution/ParticleTracker/Particle.f90 b/src/Solution/ParticleTracker/Particle.f90 index 1ce8e47a507..ca10e474742 100644 --- a/src/Solution/ParticleTracker/Particle.f90 +++ b/src/Solution/ParticleTracker/Particle.f90 @@ -8,11 +8,10 @@ module ParticleModule private public :: ParticleType, ParticleStoreType, & - create_particle, create_particle_store, & - get_particle_id + create_particle, create_particle_store - ! min/max tracking levels (1: model, 2: cell, 3: subcell) - integer, parameter, public :: levelmin = 0, levelmax = 4 + ! tracking levels (1: model, 2: cell, 3: subcell) + integer, parameter, public :: levelmax = 4 !> @brief A particle tracked by the PRT model. !! @@ -61,7 +60,6 @@ module ParticleModule logical(LGP), public :: transformed !< whether coordinates have been transformed from model to local logical(LGP), public :: advancing !< whether particle is still being tracked for current time step contains - procedure, public :: destroy => destroy_particle procedure, public :: get_model_coords procedure, public :: load_from_store procedure, public :: transform => transform_coords @@ -78,8 +76,8 @@ module ParticleModule integer(I4B), dimension(:), pointer, contiguous :: istopweaksink !< weak sink option: 0 = do not stop, 1 = stop integer(I4B), dimension(:), pointer, contiguous :: istopzone !< stop zone number ! state - integer(I4B), dimension(:, :), allocatable :: idomain !< array of indices for domains in the tracking domain hierarchy - integer(I4B), dimension(:, :), allocatable :: iboundary !< array of indices for tracking domain boundaries + integer(I4B), dimension(:, :), pointer, contiguous :: idomain !< array of indices for domains in the tracking domain hierarchy + integer(I4B), dimension(:, :), pointer, contiguous :: iboundary !< array of indices for tracking domain boundaries integer(I4B), dimension(:), pointer, contiguous :: icu !< cell number (user, not reduced) integer(I4B), dimension(:), pointer, contiguous :: ilay !< layer integer(I4B), dimension(:), pointer, contiguous :: izone !< current zone number @@ -102,17 +100,10 @@ module ParticleModule subroutine create_particle(particle) type(ParticleType), pointer :: particle !< particle allocate (particle) - allocate (particle%idomain(levelmin:levelmax)) - allocate (particle%iboundary(levelmin:levelmax)) + allocate (particle%idomain(levelmax)) + allocate (particle%iboundary(levelmax)) end subroutine create_particle - !> @brief Destroy a particle - subroutine destroy_particle(this) - class(ParticleType), intent(inout) :: this !< particle - deallocate (this%idomain) - deallocate (this%iboundary) - end subroutine destroy_particle - !> @brief Create a new particle store subroutine create_particle_store(this, np, mempath) type(ParticleStoreType), pointer :: this !< store @@ -124,10 +115,6 @@ subroutine create_particle_store(this, np, mempath) call mem_allocate(this%irpt, np, 'PLIRPT', mempath) call mem_allocate(this%iprp, np, 'PLIPRP', mempath) call mem_allocate(this%name, LENBOUNDNAME, np, 'PLNAME', mempath) - ! -- kluge todo: update mem_allocate to allow custom range of indices? - ! e.g. here we want to allocate 0-4 for trackdomain levels, not 1-5 - allocate (this%idomain(np, levelmin:levelmax)) - allocate (this%iboundary(np, levelmin:levelmax)) call mem_allocate(this%icu, np, 'PLICU', mempath) call mem_allocate(this%ilay, np, 'PLILAY', mempath) call mem_allocate(this%izone, np, 'PLIZONE', mempath) @@ -140,6 +127,8 @@ subroutine create_particle_store(this, np, mempath) call mem_allocate(this%ttrack, np, 'PLTTRACK', mempath) call mem_allocate(this%istopweaksink, np, 'PLISTOPWEAKSINK', mempath) call mem_allocate(this%istopzone, np, 'PLISTOPZONE', mempath) + call mem_allocate(this%idomain, np, levelmax, 'PLIDOMAIN', mempath) + call mem_allocate(this%iboundary, np, levelmax, 'PLIBOUNDARY', mempath) end subroutine create_particle_store !> @brief Deallocate particle arrays @@ -151,8 +140,6 @@ subroutine destroy_store(this, mempath) call mem_deallocate(this%iprp, 'PLIPRP', mempath) call mem_deallocate(this%irpt, 'PLIRPT', mempath) call mem_deallocate(this%name, 'PLNAME', mempath) - deallocate (this%idomain) - deallocate (this%iboundary) call mem_deallocate(this%icu, 'PLICU', mempath) call mem_deallocate(this%ilay, 'PLILAY', mempath) call mem_deallocate(this%izone, 'PLIZONE', mempath) @@ -165,12 +152,12 @@ subroutine destroy_store(this, mempath) call mem_deallocate(this%ttrack, 'PLTTRACK', mempath) call mem_deallocate(this%istopweaksink, 'PLISTOPWEAKSINK', mempath) call mem_deallocate(this%istopzone, 'PLISTOPZONE', mempath) + call mem_deallocate(this%idomain, 'PLIDOMAIN', mempath) + call mem_deallocate(this%iboundary, 'PLIBOUNDARY', mempath) end subroutine destroy_store !> @brief Reallocate particle arrays subroutine resize_store(this, np, mempath) - ! -- modules - use ArrayHandlersModule, only: ExpandArray2D ! -- dummy class(ParticleStoreType), intent(inout) :: this !< particle store integer(I4B), intent(in) :: np !< number of particles @@ -193,16 +180,8 @@ subroutine resize_store(this, np, mempath) call mem_reallocate(this%ttrack, np, 'PLTTRACK', mempath) call mem_reallocate(this%istopweaksink, np, 'PLISTOPWEAKSINK', mempath) call mem_reallocate(this%istopzone, np, 'PLISTOPZONE', mempath) - ! resize first dimension of 2D arrays - ! todo: memory manager support? - call ExpandArray2D( & - this%idomain, & - np - size(this%idomain, 1), & - 0) - call ExpandArray2D( & - this%iboundary, & - np - size(this%iboundary, 1), & - 0) + call mem_reallocate(this%idomain, np, levelmax, 'PLIDOMAIN', mempath) + call mem_reallocate(this%iboundary, np, levelmax, 'PLIBOUNDARY', mempath) end subroutine resize_store !> @brief Initialize particle from particle list. @@ -237,11 +216,11 @@ subroutine load_from_store(this, store, imdl, iprp, ip) this%tstop = store%tstop(ip) this%ttrack = store%ttrack(ip) this%advancing = .true. - this%idomain(levelmin:levelmax) = & - store%idomain(ip, levelmin:levelmax) + this%idomain(1:levelmax) = & + store%idomain(ip, 1:levelmax) this%idomain(1) = imdl - this%iboundary(levelmin:levelmax) = & - store%iboundary(ip, levelmin:levelmax) + this%iboundary(1:levelmax) = & + store%iboundary(ip, 1:levelmax) end subroutine load_from_store !> @brief Update particle store from particle @@ -268,12 +247,12 @@ subroutine load_from_particle(this, particle, ip) this%ttrack(ip) = particle%ttrack this%idomain( & ip, & - levelmin:levelmax) = & - particle%idomain(levelmin:levelmax) + 1:levelmax) = & + particle%idomain(1:levelmax) this%iboundary( & ip, & - levelmin:levelmax) = & - particle%iboundary(levelmin:levelmax) + 1:levelmax) = & + particle%iboundary(1:levelmax) end subroutine load_from_particle !> @brief Apply the given global-to-local transformation to the particle. @@ -345,17 +324,4 @@ subroutine get_model_coords(this, x, y, z) end if end subroutine get_model_coords - !> @brief Return the particle's composite ID. - !! - !! Particles are uniquely identified by model index, PRP index, - !! location index, and release time. - !< - pure function get_particle_id(particle) result(id) - class(ParticleType), intent(in) :: particle !< particle - character(len=LENMEMPATH) :: id !< particle id - - write (id, '(I0,"-",I0,"-",I0,"-",F0.0)') & - particle%imdl, particle%iprp, particle%irpt, particle%trelease - end function get_particle_id - end module ParticleModule From 9fcfa7ee5b3ff355acb5bdcdf7866900f34c9ee5 Mon Sep 17 00:00:00 2001 From: mjr-deltares <45555666+mjr-deltares@users.noreply.github.com> Date: Tue, 14 May 2024 17:56:56 +0200 Subject: [PATCH 151/199] feat(par): add HPC configuration file for parallel (#1769) * in progress: add hpc config file * - add concept for test * - fix merge error * - update from dfn * - load load balance from HPC file - connect UTL HPC subpackage - add ifind for charstring * fix msvs * - follow up on review comments * - generate new makefile * - also makefiles for zbud * - msvs for zonebudget * - isolated load balance in separate container (Distributed Simulation) * - add to msvs * - fprettify * - fprettify2 * - codespell * - fix PRT test * - HPC input: check load balance validity - increase autotest coverage * - validate hpc file only when hpc file exists * - one more test for hpc file (and splitter) * - remove metis dependency from autotest --- autotest/test_gwt_subset.py | 291 +++++++++++++++ autotest/test_par_gwf_splitter01.py | 199 ++++++++++ autotest/test_par_gwt_subset.py | 45 +++ autotest/test_par_hpc01.py | 300 +++++++++++++++ make/makefile | 7 +- msvs/mf6core.vfproj | 7 +- src/Distributed/DistributedSim.f90 | 468 ++++++++++++++++++++++++ src/Idm/selector/IdmDfnSelector.f90 | 13 + src/Idm/selector/IdmUtlDfnSelector.f90 | 94 +++++ src/Idm/utl-hpcidm.f90 | 120 ++++++ src/SimulationCreate.f90 | 181 +-------- src/Utilities/ArrayHandlers.f90 | 23 +- src/Utilities/Idm/IdmLoad.f90 | 21 +- src/Utilities/Idm/SourceLoad.F90 | 12 +- src/meson.build | 3 + src/mf6core.f90 | 23 +- utils/idmloader/dfns.txt | 5 +- utils/zonebudget/make/makefile | 3 +- utils/zonebudget/msvs/zonebudget.vfproj | 1 + utils/zonebudget/pymake/extrafiles.txt | 1 + 20 files changed, 1620 insertions(+), 197 deletions(-) create mode 100644 autotest/test_gwt_subset.py create mode 100644 autotest/test_par_gwf_splitter01.py create mode 100644 autotest/test_par_gwt_subset.py create mode 100644 autotest/test_par_hpc01.py create mode 100644 src/Distributed/DistributedSim.f90 create mode 100644 src/Idm/selector/IdmUtlDfnSelector.f90 create mode 100644 src/Idm/utl-hpcidm.f90 diff --git a/autotest/test_gwt_subset.py b/autotest/test_gwt_subset.py new file mode 100644 index 00000000000..01cdedb3244 --- /dev/null +++ b/autotest/test_gwt_subset.py @@ -0,0 +1,291 @@ +""" +Test gwt in a subset of the flow grid: + +GWT: XXXXXXXXX [ transport ] + + +GWF: [ flow1 ] + [ flow2 ] + +Flow is directed from right to left. The initial concentration equals +zero everywhere except for the rightmost cell. At the end of the run, +all the solute should be in the leftmost cell from the transport model. +(This will be a non-trivial problem in parallel to test the load balance) + +""" + +import os + +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +cases = ["gwt_subset01"] +gdelr = 1.0 + +# solver settings +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-6, 1e-6, 1.0 + + +def get_gwf_model(sim, gwfname, gwfpath, modelshape, chdspd): + nlay, nrow, ncol, xshift, yshift = modelshape + delr = gdelr + delc = 1.0 + top = 1.0 + botm = [0.0] + strt = 1.0 + hk = 1.0 + laytyp = 0 + + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=gwfname, + save_flows=True, + ) + + dis = flopy.mf6.ModflowGwfdis( + gwf, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + xorigin=xshift, + yorigin=yshift, + ) + + # initial conditions + ic = flopy.mf6.ModflowGwfic(gwf, strt=strt) + + # node property flow + npf = flopy.mf6.ModflowGwfnpf( + gwf, + icelltype=laytyp, + k=hk, + save_specific_discharge=True, + ) + + # chd files + chd = flopy.mf6.modflow.mfgwfchd.ModflowGwfchd( + gwf, + stress_period_data=chdspd, + save_flows=False, + pname="CHD-1", + ) + + # output control + oc = flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord=f"{gwfname}.cbc", + head_filerecord=f"{gwfname}.hds", + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + printrecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + ) + gwf.set_model_relative_path(gwfpath) + return gwf + + +def get_gwt_model(sim, gwtname, gwtpath, modelshape): + nlay, nrow, ncol, xshift, yshift = modelshape + delc = 1.0 + top = 1.0 + botm = [0.0] + + strt = ncol * [0.0] + strt[-1] = 1.0 + + gwt = flopy.mf6.MFModel( + sim, + model_type="gwt6", + modelname=gwtname, + ) + gwt.name_file.save_flows = True + + dis = flopy.mf6.ModflowGwtdis( + gwt, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=gdelr, + delc=delc, + top=top, + botm=botm, + xorigin=xshift, + yorigin=yshift, + ) + + # initial conditions + ic = flopy.mf6.ModflowGwtic(gwt, strt=strt) + + # advection + adv = flopy.mf6.ModflowGwtadv(gwt, scheme="tvd") + + # mass storage and transfer + mst = flopy.mf6.ModflowGwtmst(gwt, porosity=0.1) + + # sources + ssm = flopy.mf6.ModflowGwtssm(gwt, sources=None) + + # output control + oc = flopy.mf6.ModflowGwtoc( + gwt, + budget_filerecord=f"{gwtname}.cbc", + concentration_filerecord=f"{gwtname}.ucn", + concentrationprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("CONCENTRATION", "ALL"), ("BUDGET", "LAST")], + printrecord=[("CONCENTRATION", "ALL"), ("BUDGET", "LAST")], + ) + + gwt.set_model_relative_path(gwtpath) + return gwt + + +def build_models(idx, test): + # temporal discretization + nper = 1 + perlen = [200.0] + nstp = [25] + tsmult = [1.0] + tdis_rc = [] + for i in range(nper): + tdis_rc.append((perlen[i], nstp[i], tsmult[i])) + + # build MODFLOW 6 files + ws = test.workspace + sim = flopy.mf6.MFSimulation( + sim_name=ws, version="mf6", exe_name="mf6", sim_ws=ws + ) + # create tdis package + tdis = flopy.mf6.ModflowTdis( + sim, time_units="DAYS", nper=nper, perioddata=tdis_rc, pname="sim.tdis" + ) + + # grid information + nlay, nrow, ncol = 1, 1, 50 + + # Create gwf1 model + chdspd = {0: [[(0, 0, 0), 0.0]]} + gwf1 = get_gwf_model( + sim, + "flow1", + "flow1", + (nlay, nrow, ncol, 0.0, 0.0), + chdspd=chdspd, + ) + + # Create gwf2 model + chdspd = {0: [[(0, 0, ncol - 1), 10.0]]} + gwf2 = get_gwf_model( + sim, + "flow2", + "flow2", + (nlay, nrow, ncol, 50.0 * gdelr, 0.0), + chdspd=chdspd, + ) + + # gwf-gwf with interface model enabled + gwfgwf_data = [[(0, 0, ncol - 1), (0, 0, 0), 1, 0.5, 0.5, 1.0, 0.0, 1.0]] + gwfgwf = flopy.mf6.ModflowGwfgwf( + sim, + exgtype="GWF6-GWF6", + nexg=len(gwfgwf_data), + exgmnamea=gwf1.name, + exgmnameb=gwf2.name, + exchangedata=gwfgwf_data, + auxiliary=["ANGLDEGX", "CDIST"], + filename="flow1_flow2.gwfgwf", + dev_interfacemodel_on=True, + ) + + # create iterative model solution and register the gwf model with it + imsgwf = 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, + filename="flow.ims", + ) + sim.register_ims_package(imsgwf, [gwf1.name, gwf2.name]) + + # Create gwt model + gwt = get_gwt_model( + sim, + "transport", + "transport", + (nlay, nrow, ncol, 50.0 * gdelr, 0.0), + ) + + # GWF GWT exchange + gwfgwt = flopy.mf6.ModflowGwfgwt( + sim, + exgtype="GWF6-GWT6", + exgmnamea="flow2", + exgmnameb="transport", + filename="flow2_transport.gwfgwt", + ) + + # create iterative model solution and register the gwt model with it + imsgwt = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="transport.ims", + ) + sim.register_ims_package(imsgwt, [gwt.name]) + + return sim, None + + +def check_output(idx, test): + gwtname = "transport" + + fpth = os.path.join(test.workspace, gwtname, f"{gwtname}.ucn") + try: + cobj = flopy.utils.HeadFile( + fpth, precision="double", text="CONCENTRATION" + ) + conc = cobj.get_data() + except: + assert False, f'could not load data from "{fpth}"' + + # this simply checks if the solute from the right at t = 0 + # has arrived all the way on the left at t = t_end: + assert conc[0, 0, 0] == pytest.approx( + 1.0 + ), "concentration should be close to 1.0" + + +@pytest.mark.parametrize("idx, name", enumerate(cases)) +@pytest.mark.developmode +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/autotest/test_par_gwf_splitter01.py b/autotest/test_par_gwf_splitter01.py new file mode 100644 index 00000000000..3de080ec075 --- /dev/null +++ b/autotest/test_par_gwf_splitter01.py @@ -0,0 +1,199 @@ +""" +Test for splitting parallel MODFLOW GWF model +and using the HPC input file with partitioning +to run the simulation on 4 domains. +""" + +import pathlib as pl + +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +cases = [ + "par_gwf_spl01", +] + +gwf_name = "gwf" + +# solver data +nouter, ninner = 100, 300 +hclose, rclose, relax = 10e-9, 1e-3, 0.97 + +# boundary stress period data +h_left = 1.0 +h_right = 10.0 + +# model spatial discretization +nlay = 1 +nrow = 10 +ncol = 10 + +# cell spacing +delr = 100.0 +delc = 100.0 + + +def get_model(idx, test): + name = cases[idx] + + # parameters and spd + # tdis + nper = 1 + tdis_rc = [] + for i in range(nper): + tdis_rc.append((1.0, 1, 1)) + + # top/bot of the aquifer + tops = [0.0, -10.0] + + # hydraulic conductivity + k11 = 10.0 + + # initial head + h_start = 0.0 + + sim = flopy.mf6.MFSimulation( + sim_name=name, + version="mf6", + exe_name="mf6", + sim_ws=test.workspace, + ) + + tdis = flopy.mf6.ModflowTdis( + sim, time_units="DAYS", nper=nper, perioddata=tdis_rc + ) + + ims = flopy.mf6.ModflowIms( + sim, + print_option="ALL", + outer_dvclose=hclose, + outer_maximum=nouter, + inner_maximum=ninner, + inner_dvclose=hclose, + rcloserecord=rclose, + linear_acceleration="CG", + relaxation_factor=relax, + pname="ims", + ) + + # left CHD: + left_chd = [ + [(ilay, irow, 0), h_left] + for irow in range(nrow) + for ilay in range(nlay) + ] + + # right CHD: + right_chd = [ + [(ilay, irow, ncol - 1), h_right] + for irow in range(nrow) + for ilay in range(nlay) + ] + chd_spd = {0: left_chd + right_chd} + + gwf = flopy.mf6.ModflowGwf(sim, modelname=gwf_name, save_flows=True) + dis = flopy.mf6.ModflowGwfdis( + gwf, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=tops[0], + botm=tops[1 : nlay + 1], + ) + ic = flopy.mf6.ModflowGwfic(gwf, strt=h_start) + npf = flopy.mf6.ModflowGwfnpf( + gwf, + save_specific_discharge=True, + save_flows=True, + icelltype=0, + k=k11, + ) + chd = flopy.mf6.ModflowGwfchd(gwf, stress_period_data=chd_spd) + oc = flopy.mf6.ModflowGwfoc( + gwf, + head_filerecord=f"{gwf_name}.hds", + budget_filerecord=f"{gwf_name}.cbc", + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + ) + + # split the model in 4 domains + mfsplit = flopy.mf6.utils.Mf6Splitter(sim) + split_array = np.zeros(shape=(nrow, ncol)) + for irow in range(nrow): + for icol in range(ncol): + idomain = 0 + if irow > nrow / 2: + idomain = idomain + 2 + if icol > ncol / 2: + idomain = idomain + 1 + split_array[irow, icol] = idomain + print(split_array) + split_sim = mfsplit.split_model(split_array) + split_sim.set_sim_path(test.workspace) + + # balance the load + partitions = [] + for idx, model_name in enumerate(split_sim.model_names): + partitions.append((model_name, idx)) + hpc = flopy.mf6.ModflowUtlhpc(split_sim, partitions=partitions) + + return split_sim + + +def build_models(idx, test): + sim = get_model(idx, test) + return sim, None + + +def check_output(idx, test): + import os + + # define reference result: + def exact(x): + return h_left + (h_right - h_left) * (x - 0.5 * delr) / ( + (ncol - 1) * delr + ) + + # load the finished sim: + sim = flopy.mf6.MFSimulation.load(sim_ws=test.workspace) + + # compare model heads to exact value: + for model_name in sim.model_names: + fpth = os.path.join(test.workspace, f"{model_name}.hds") + hds = flopy.utils.HeadFile(fpth) + heads = hds.get_data() + fpth = os.path.join(test.workspace, f"{model_name}.dis.grb") + grb = flopy.mf6.utils.MfGrdFile(fpth) + xyc = grb.modelgrid.xycenters + xoff = grb.modelgrid.xoffset + + for ilay in range(grb.modelgrid.nlay): + for irow in range(grb.modelgrid.nrow): + for icol in range(grb.modelgrid.ncol): + xc = xyc[0][icol] + xoff + ref_value = exact(xc) + assert heads[ilay, irow, icol] == pytest.approx( + ref_value + ), f"Comparing for model {model_name}, cell ({ilay},{irow},{icol}) failed" + + +@pytest.mark.parallel +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + compare=None, + parallel=True, + ncpus=4, + ) + test.run() diff --git a/autotest/test_par_gwt_subset.py b/autotest/test_par_gwt_subset.py new file mode 100644 index 00000000000..6e9a8e3217a --- /dev/null +++ b/autotest/test_par_gwt_subset.py @@ -0,0 +1,45 @@ +""" +This test reuses the simulation data and config in +test_gwt_subset.py and runs it in parallel mode. + +The purpose of this test is to make sure that the +transport model ends up on the right process to be +coupled to flow by using the HPC subpackage. +""" + +import pytest +import flopy + +from framework import TestFramework + +cases = ["par_gwt_subset"] + + +def build_models(idx, test): + from test_gwt_subset import build_models as build + + sim, dummy = build(idx, test) + + # create the load balance for a parallel run + partitions = [("flow1", 0), ("flow2", 1), ("transport", 1)] + hpc = flopy.mf6.ModflowUtlhpc(sim, partitions=partitions) + + return sim, dummy + + +@pytest.mark.parallel +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + from test_gwt_subset import check_output + + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + compare=None, + parallel=True, + ncpus=2, + ) + test.run() diff --git a/autotest/test_par_hpc01.py b/autotest/test_par_hpc01.py new file mode 100644 index 00000000000..cccd6d9eae7 --- /dev/null +++ b/autotest/test_par_hpc01.py @@ -0,0 +1,300 @@ +""" +Test for parallel MODFLOW with the HPC input file +for a 3x3 grid of models with constant head set at +the lower-left corner. This constant head should +reach all domains, no matter the topology of partitions + +The test is to provide a HPC input file where the +models are distributed over available processors +in a non-trivial way: backwards as compared to the +default partitioning strategy in MODFLOW. This means +that the first model goes to the process with highest +rank (and not with rank == 0), etc. +""" + +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +cases = [ + "par_hpc01-9cpu", + "par_hpc01-3cpu", + "par_hpc01-2cpu", + "par_hpc01-1cpu", +] + +# the number of models in x and y +domain_grid = (3, 3) + +# specified per case +models_per_cpu = [1, 3, 5, 9] +ncpus_cases = [9, 3, 2, 1] + +nlay = 1 +nrow = 3 +ncol = 3 +delr = 100.0 +delc = 100.0 +head_initial = -1.0 +cst_head_south_west = 435.0 +hclose = 1.0e-8 + + +def get_model_name(ix, iy): + return f"model-{ix}-{iy}" + + +def get_simulation(idx, ws): + name = cases[idx] + nr_models_x = domain_grid[0] + nr_models_y = domain_grid[1] + + # parameters and spd + # tdis + nper = 1 + tdis_rc = [] + for i in range(nper): + tdis_rc.append((1.0, 1, 1)) + + # solver data + nouter, ninner = 100, 300 + rclose, relax = 1e-3, 0.97 + + sim = flopy.mf6.MFSimulation( + sim_name=name, + version="mf6", + exe_name="mf6", + sim_ws=ws, + ) + + partitions = [] + rnk = 0 + mpc = models_per_cpu[idx] + for ix in range(nr_models_x): + for iy in range(nr_models_y): + mname = get_model_name(ix, iy) + if mpc == 0: + rnk = rnk + 1 + mpc = models_per_cpu[idx] + partitions.append((mname, rnk)) + mpc = mpc - 1 + # reverse order + highest_rank = rnk + partitions = [(n, highest_rank - r) for n, r in partitions] + + hpc = flopy.mf6.ModflowUtlhpc(sim, partitions=partitions) + + tdis = flopy.mf6.ModflowTdis( + sim, time_units="DAYS", nper=nper, perioddata=tdis_rc + ) + + ims = flopy.mf6.ModflowIms( + sim, + print_option="ALL", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="DBD", + inner_maximum=ninner, + inner_dvclose=hclose, + rcloserecord=rclose, + linear_acceleration="BICGSTAB", + relaxation_factor=relax, + ) + + # create models (and exchanges) + for ix in range(nr_models_x): + for iy in range(nr_models_y): + add_model(sim, ix, iy, nr_models_x, nr_models_y) + + # add exchanges from west to east + for iy in range(nr_models_y): + for ix in range(nr_models_x - 1): + name_west = get_model_name(ix, iy) + name_east = get_model_name(ix + 1, iy) + add_exchange_west_east(sim, name_west, name_east) + + # add exchange from south to north + for ix in range(nr_models_x): + for iy in range(nr_models_y - 1): + name_south = get_model_name(ix, iy) + name_north = get_model_name(ix, iy + 1) + add_exchange_south_north(sim, name_south, name_north) + + return sim + + +def add_model(sim, ix, iy, nr_models_x, nr_models_y): + # model spatial discretization + shift_x = ix * ncol * delr + shift_y = iy * nrow * delc + model_name = get_model_name(ix, iy) + + # top/bot of the aquifer + tops = [0.0, -100.0] + + # hydraulic conductivity + k11 = 1.0 + + # initial head + h_start = head_initial + + gwf = flopy.mf6.ModflowGwf(sim, modelname=model_name, save_flows=True) + dis = flopy.mf6.ModflowGwfdis( + gwf, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=tops[0], + botm=tops[1 : nlay + 1], + xorigin=shift_x, + yorigin=shift_y, + ) + ic = flopy.mf6.ModflowGwfic(gwf, strt=h_start) + npf = flopy.mf6.ModflowGwfnpf( + gwf, + save_specific_discharge=True, + save_flows=True, + icelltype=0, + k=k11, + ) + oc = flopy.mf6.ModflowGwfoc( + gwf, + head_filerecord=f"{model_name}.hds", + budget_filerecord=f"{model_name}.cbc", + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + ) + + if ix == 0 and iy == 0: + # add SW corner BC + sw_chd = [[(0, nrow - 1, 0), cst_head_south_west]] + chd_spd_sw = {0: sw_chd} + chd = flopy.mf6.ModflowGwfchd(gwf, stress_period_data=chd_spd_sw) + + +def add_exchange_west_east(sim, name_west, name_east): + exg_filename = f"we_{name_west}_{name_east}.gwfgwf" + # exchangedata + angldegx = 0.0 + cdist = delr + gwfgwf_data = [ + [ + (ilay, irow, ncol - 1), + (ilay, irow, 0), + 1, + delr / 2.0, + delr / 2.0, + delc, + angldegx, + cdist, + ] + for irow in range(nrow) + for ilay in range(nlay) + ] + gwfgwf = flopy.mf6.ModflowGwfgwf( + sim, + exgtype="GWF6-GWF6", + nexg=len(gwfgwf_data), + exgmnamea=name_west, + exgmnameb=name_east, + exchangedata=gwfgwf_data, + auxiliary=["ANGLDEGX", "CDIST"], + filename=exg_filename, + ) + + +def add_exchange_south_north(sim, name_south, name_north): + exg_filename = f"sn_{name_south}_{name_north}.gwfgwf" + + # exchangedata + angldegx = 90.0 + cdist = delc + gwfgwf_data = [ + [ + (ilay, 0, icol), + (ilay, nrow - 1, icol), + 1, + delc / 2.0, + delc / 2.0, + delr, + angldegx, + cdist, + ] + for icol in range(ncol) + for ilay in range(nlay) + ] + gwfgwf = flopy.mf6.ModflowGwfgwf( + sim, + exgtype="GWF6-GWF6", + nexg=len(gwfgwf_data), + exgmnamea=name_south, + exgmnameb=name_north, + exchangedata=gwfgwf_data, + auxiliary=["ANGLDEGX", "CDIST"], + filename=exg_filename, + ) + + +def build_models(idx, test): + sim = get_simulation(idx, test.workspace) + return sim, None + + +def check_output(idx, test): + mf6_sim = flopy.mf6.MFSimulation.load(sim_ws=test.workspace) + for mname in mf6_sim.model_names: + m = mf6_sim.get_model(mname) + hds = m.output.head().get_data().flatten() + hds_compare = cst_head_south_west * np.ones_like(hds) + assert np.allclose(hds, hds_compare, atol=1.0e-6, rtol=0.0) + + import pathlib as pl + + ncpus = ncpus_cases[idx] + partitions = mf6_sim.name_file.package_dict["hpc"].partitions.array + if ncpus > 1: + for name, rank in partitions: + model_id = mf6_sim.model_names.index(name) + 1 + list_file = pl.Path(test.workspace, "mfsim.p{}.lst".format(rank)) + success_msg = "GWF6 model {} will be created".format(model_id) + success = False + for line in open(list_file).readlines(): + if success_msg in line: + success = True + break + assert success, "Model {} not created on target process {}".format( + model_id, rank + ) + elif ncpus == 1: + list_file = pl.Path(test.workspace, "mfsim.lst") + for name, rank in partitions: + model_id = mf6_sim.model_names.index(name) + 1 + success_msg = "GWF6 model {} will be created".format(model_id) + success = False + for line in open(list_file).readlines(): + if success_msg in line: + success = True + break + assert success, "Model {} not created on target process {}".format( + model_id, rank + ) + + +@pytest.mark.parallel +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + compare=None, + parallel=True, + ncpus=ncpus_cases[idx], + ) + test.run() diff --git a/make/makefile b/make/makefile index 2da0bdf737e..f2eaaae47f7 100644 --- a/make/makefile +++ b/make/makefile @@ -1,4 +1,4 @@ -# makefile created by pymake (version 1.2.10.dev0) for the 'mf6' executable. +# makefile created by pymake (version 1.2.9.dev0) for the 'mf6' executable. include ./makedefaults @@ -87,6 +87,7 @@ OBJECTS = \ $(OBJDIR)/kind.o \ $(OBJDIR)/Constants.o \ $(OBJDIR)/ErrorUtil.o \ +$(OBJDIR)/CharString.o \ $(OBJDIR)/SimVariables.o \ $(OBJDIR)/ArrayHandlers.o \ $(OBJDIR)/Message.o \ @@ -99,10 +100,10 @@ $(OBJDIR)/InputOutput.o \ $(OBJDIR)/TableTerm.o \ $(OBJDIR)/Table.o \ $(OBJDIR)/MemoryHelper.o \ -$(OBJDIR)/CharString.o \ $(OBJDIR)/InputDefinition.o \ $(OBJDIR)/Memory.o \ $(OBJDIR)/List.o \ +$(OBJDIR)/utl-hpcidm.o \ $(OBJDIR)/swf-zdgidm.o \ $(OBJDIR)/swf-namidm.o \ $(OBJDIR)/swf-icidm.o \ @@ -159,6 +160,7 @@ $(OBJDIR)/exg-gwegweidm.o \ $(OBJDIR)/LongLineReader.o \ $(OBJDIR)/DevFeature.o \ $(OBJDIR)/MemoryList.o \ +$(OBJDIR)/IdmUtlDfnSelector.o \ $(OBJDIR)/IdmSwfDfnSelector.o \ $(OBJDIR)/IdmSimDfnSelector.o \ $(OBJDIR)/IdmPrtDfnSelector.o \ @@ -424,6 +426,7 @@ $(OBJDIR)/SolutionFactory.o \ $(OBJDIR)/exg-gwfprt.o \ $(OBJDIR)/exg-gwfgwt.o \ $(OBJDIR)/exg-gwfgwe.o \ +$(OBJDIR)/DistributedSim.o \ $(OBJDIR)/RunControl.o \ $(OBJDIR)/SourceLoad.o \ $(OBJDIR)/ModelPackageInputs.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index 9a1a862c927..3382358faa9 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -51,6 +51,7 @@ + @@ -131,7 +132,8 @@ - + + @@ -185,7 +187,8 @@ - + + diff --git a/src/Distributed/DistributedSim.f90 b/src/Distributed/DistributedSim.f90 new file mode 100644 index 00000000000..42c620b4fd7 --- /dev/null +++ b/src/Distributed/DistributedSim.f90 @@ -0,0 +1,468 @@ +module DistributedSimModule + use KindModule, only: I4B, LGP + use SimVariablesModule, only: idm_context, nr_procs, proc_id, errmsg, warnmsg + use ConstantsModule, only: LENMEMPATH, LENMODELNAME, LINELENGTH, LENPACKAGETYPE + use ArrayHandlersModule, only: ifind + use CharacterStringModule, only: CharacterStringType + use SimModule, only: store_error, store_error_filename, count_errors, & + store_warning + use MemoryManagerModule, only: mem_allocate, mem_deallocate, mem_setptr, & + mem_print_detailed, get_isize + use MemoryHelperModule, only: create_mem_path + + implicit none + private + + public :: DistributedSimType + public :: get_dsim + + type :: DistributedSimType + character(len=LENMEMPATH) :: memory_path + integer(I4B), pointer :: nr_models !< the total (global) number of models, equals the length of the model block in mfsim.nam + integer(I4B), dimension(:), pointer, contiguous :: load_mask => null() !< mask for loading models and exchanges, 1 when active on this processor, else 0 + integer(I4B), dimension(:), pointer, contiguous :: model_ranks => null() !< load balance: model rank (0,...,nr_procs-1) per global model id (array index) + contains + procedure :: create + procedure :: get_load_mask + procedure :: get_load_balance + procedure :: destroy + ! private + procedure, private :: create_load_mask + procedure, private :: set_load_balance_from_input + procedure, private :: set_load_balance_default + procedure, private :: validate_load_balance + end type + + ! singleton, private member + class(DistributedSimType), private, pointer :: dist_sim => null() + +contains + + !> @brief Get pointer to the distributed simulation object + !< + function get_dsim() result(ds) + class(DistributedSimType), pointer :: ds + + if (.not. associated(dist_sim)) then + allocate (dist_sim) + call dist_sim%create() + end if + ds => dist_sim + + end function get_dsim + + !> Create the distributed simulation object from the simulation input ctx + !< + subroutine create(this) + class(DistributedSimType) :: this + ! local + character(len=LENMEMPATH) :: input_mempath + integer(I4B), pointer :: nmod + + this%memory_path = create_mem_path(component='SIM') + + input_mempath = create_mem_path(component='SIM', context=idm_context) + call mem_setptr(nmod, 'NUMMODELS', input_mempath) + + call mem_allocate(this%nr_models, 'NUMMODELS', this%memory_path) + this%nr_models = nmod + + end subroutine create + + !> @brief Return pointer to the load mask for models + !! + !! Get a load mask to determine which models + !! should be loaded by idm on this process. This is in + !! sync with models create. The mask array is allocated + !! with its size equal to the global number of models. + !! It is returned as (1, 1, 0, 0, ... 0) with each entry + !! being a load mask for the model at the corresponding + !< location in the 'MNAME' array of the IDM. + function get_load_mask(this) result(load_mask) + class(DistributedSimType) :: this + integer(I4B), dimension(:), pointer :: load_mask + + if (.not. associated(this%load_mask)) then + call this%create_load_mask() + end if + load_mask => this%load_mask + + end function get_load_mask + + !> @brief Create a load mask for IDM from the load balance array + !< + subroutine create_load_mask(this) + class(DistributedSimType) :: this + ! local + integer(I4B), dimension(:), pointer :: model_ranks => null() !< the load balance + integer(I4B) :: m_id !< model id + + call mem_allocate(this%load_mask, this%nr_models, 'LOADMASK', & + this%memory_path) + this%load_mask = 0 + + ! get load balance (probably the first call, so creates it) + model_ranks => this%get_load_balance() + + ! set mask from balance + do m_id = 1, this%nr_models + if (model_ranks(m_id) == proc_id) then + this%load_mask(m_id) = 1 + else + this%load_mask(m_id) = 0 + end if + end do + + end subroutine create_load_mask + + !> @brief Get the model load balance for the simulation + !< + function get_load_balance(this) result(mranks) + class(DistributedSimType) :: this !< this distributed sim instance + integer(I4B), dimension(:), pointer :: mranks !< the load balance: array of ranks per model id + ! local + integer(I4B) :: isize + character(len=LENMEMPATH) :: hpc_mempath + + ! if load balance available, return here: + if (associated(this%model_ranks)) then + mranks => this%model_ranks + return + end if + + call mem_allocate(this%model_ranks, this%nr_models, 'MODELRANKS', & + this%memory_path) + + ! check if exists (partitions block is optional in HPC file) + hpc_mempath = create_mem_path('UTL', 'HPC', idm_context) + call get_isize('MNAME', hpc_mempath, isize) + + if (isize > 0) then + ! HPC file present + if (nr_procs == 1) then + write (warnmsg, *) "Ignoring PARTITIONS block in HPC file when "// & + "running a serial process" + call store_warning(warnmsg) + + ! single process, everything on cpu 0: + this%model_ranks = 0 + else + ! set balance from HPC file + call this%set_load_balance_from_input() + ! check if valid configuration + call this%validate_load_balance() + end if + else + ! no HPC file present + if (nr_procs == 1) then + ! single process, everything on cpu 0: + this%model_ranks = 0 + else + ! set balance from default algorithm + call this%set_load_balance_default() + end if + end if + + mranks => this%model_ranks + + end function get_load_balance + + !> @brief Load load balance from the input configuration + !< + subroutine set_load_balance_from_input(this) + class(DistributedSimType) :: this !< this distributed sim instance + ! local + character(len=LENMEMPATH) :: simnam_mempath, hpc_mempath + character(len=LENMODELNAME) :: model_name + type(CharacterStringType), dimension(:), contiguous, pointer :: mnames !< model names (all) from the simulation nam file + type(CharacterStringType), dimension(:), contiguous, pointer :: mnames_hpc !< model names in the hpc file + integer(I4B), dimension(:), contiguous, pointer :: mranks_hpc !< rank numbers in the hpc file + integer(I4B) :: i, model_idx + integer(I4B) :: target_rank + integer(I4B), dimension(:), allocatable :: rank_used + type(CharacterStringType), dimension(:), contiguous, pointer :: hpc_names !< helper array to get the hpc filename + character(len=LINELENGTH) :: hpc_filename !< the HPC option file + + ! set to uninitialized + this%model_ranks = -1 + + ! from IDM + simnam_mempath = create_mem_path('SIM', 'NAM', idm_context) + hpc_mempath = create_mem_path('UTL', 'HPC', idm_context) + call mem_setptr(mnames, 'MNAME', simnam_mempath) + call mem_setptr(mnames_hpc, 'MNAME', hpc_mempath) + call mem_setptr(mranks_hpc, 'MRANK', hpc_mempath) + call mem_setptr(hpc_names, 'HPC6_FILENAME', simnam_mempath) + + ! FILEIN options give an array, so take the first: + hpc_filename = hpc_names(1) + + ! check: valid model names + do i = 1, size(mnames_hpc) + if (ifind(mnames, mnames_hpc(i)) == -1) then + model_name = mnames_hpc(i) + write (errmsg, *) "HPC input error: undefined model name (", & + trim(model_name), ")" + call store_error(errmsg) + end if + end do + ! check: valid ranks + do i = 1, size(mranks_hpc) + target_rank = mranks_hpc(i) + if (target_rank < 0 .or. target_rank > nr_procs - 1) then + model_name = mnames_hpc(i) + write (errmsg, '(a,i0,2a)') "HPC input error: invalid target rank (", & + target_rank, ") for model ", trim(model_name) + call store_error(errmsg) + end if + end do + if (count_errors() > 0) then + call store_error_filename(hpc_filename) + end if + + ! construct rank array + do i = 1, size(mnames_hpc) + model_idx = ifind(mnames, mnames_hpc(i)) + this%model_ranks(model_idx) = mranks_hpc(i) + end do + + ! check: all models acquired rank + do i = 1, size(this%model_ranks) + if (this%model_ranks(i) == -1) then + model_name = mnames(i) + write (errmsg, '(2a)') "HPC input error: no target rank for model ", & + trim(model_name) + call store_error(errmsg) + end if + end do + if (count_errors() > 0) then + call store_error_filename(hpc_filename) + end if + + ! check: no idle ranks + allocate (rank_used(nr_procs)) + rank_used = 0 + do i = 1, size(this%model_ranks) + if (this%model_ranks(i) >= 0 .and. this%model_ranks(i) < nr_procs) then + rank_used(this%model_ranks(i) + 1) = 1 + end if + end do + do i = 1, size(rank_used) + if (rank_used(i) == 0) then + write (errmsg, '(a,i0,a)') "HPC input error: rank ", i - 1, & + " has no models assigned" + call store_error(errmsg) + end if + end do + deallocate (rank_used) + if (count_errors() > 0) then + call store_error_filename(hpc_filename) + end if + + end subroutine set_load_balance_from_input + + !> @brief Distribute the models over the available + !! processes in a parallel run. Expects an array sized + !< to the number of models in the global simulation + subroutine set_load_balance_default(this) + class(DistributedSimType) :: this !< this distributed sim. instance + ! local + integer(I4B) :: im, imm, ie, ip, cnt + integer(I4B) :: nr_models, nr_gwf_models + integer(I4B) :: nr_exchanges + integer(I4B) :: min_per_proc, nr_left + integer(I4B) :: rank + integer(I4B), dimension(:), allocatable :: nr_models_proc + character(len=LENPACKAGETYPE) :: model_type_str + character(len=LENMEMPATH) :: input_mempath + type(CharacterStringType), dimension(:), contiguous, & + pointer :: mtypes !< model types + type(CharacterStringType), dimension(:), contiguous, & + pointer :: mnames !< model names + type(CharacterStringType), dimension(:), contiguous, & + pointer :: etypes !< exg types + type(CharacterStringType), dimension(:), contiguous, & + pointer :: emnames_a !< model a names + type(CharacterStringType), dimension(:), contiguous, & + pointer :: emnames_b !< model b names + + this%model_ranks = 0 + + ! load IDM data + input_mempath = create_mem_path('SIM', 'NAM', idm_context) + call mem_setptr(mtypes, 'MTYPE', input_mempath) + call mem_setptr(mnames, 'MNAME', input_mempath) + call mem_setptr(etypes, 'EXGTYPE', input_mempath) + call mem_setptr(emnames_a, 'EXGMNAMEA', input_mempath) + call mem_setptr(emnames_b, 'EXGMNAMEB', input_mempath) + + ! count flow models + nr_models = size(mnames) + nr_gwf_models = 0 + do im = 1, nr_models + if (mtypes(im) == 'GWF6') then + nr_gwf_models = nr_gwf_models + 1 + end if + + if (mtypes(im) == 'GWF6' .or. & + mtypes(im) == 'GWT6' .or. & + mtypes(im) == 'GWE6') then + cycle + end if + + model_type_str = mtypes(im) + write (errmsg, *) 'Model type ', model_type_str, & + ' not supported in parallel mode.' + call store_error(errmsg, terminate=.true.) + end do + + ! calculate nr of flow models for each rank + allocate (nr_models_proc(nr_procs)) + min_per_proc = nr_gwf_models / nr_procs + nr_left = nr_gwf_models - nr_procs * min_per_proc + cnt = 1 + do ip = 1, nr_procs + rank = ip - 1 + nr_models_proc(ip) = min_per_proc + if (rank < nr_left) then + nr_models_proc(ip) = nr_models_proc(ip) + 1 + end if + end do + + ! assign ranks for flow models + rank = 0 + do im = 1, nr_models + if (mtypes(im) == 'GWF6') then + if (nr_models_proc(rank + 1) == 0) then + rank = rank + 1 + end if + this%model_ranks(im) = rank + nr_models_proc(rank + 1) = nr_models_proc(rank + 1) - 1 + end if + end do + + ! match other models to flow + nr_exchanges = size(etypes) + do im = 1, nr_models + if (mtypes(im) == 'GWT6') then + + ! find match + do ie = 1, nr_exchanges + if (etypes(ie) == 'GWF6-GWT6' .and. mnames(im) == emnames_b(ie)) then + rank = 0 + do imm = 1, nr_models + if (mnames(imm) == emnames_a(ie)) then + rank = this%model_ranks(imm) + exit + end if + end do + this%model_ranks(im) = rank + exit + end if + end do + + else if (mtypes(im) == 'GWE6') then + do ie = 1, nr_exchanges + if (etypes(ie) == 'GWF6-GWE6' .and. mnames(im) == emnames_b(ie)) then + rank = 0 + do imm = 1, nr_models + if (mnames(imm) == emnames_a(ie)) then + rank = this%model_ranks(imm) + exit + end if + end do + this%model_ranks(im) = rank + exit + end if + end do + + else + cycle ! e.g., for a flow model + end if + end do + + ! cleanup + deallocate (nr_models_proc) + + end subroutine set_load_balance_default + + !> @brief Check validity of load balance configuration + !< + subroutine validate_load_balance(this) + class(DistributedSimType) :: this + character(len=LENMEMPATH) :: input_mempath + type(CharacterStringType), dimension(:), contiguous, & + pointer :: mtypes !< model types + type(CharacterStringType), dimension(:), contiguous, & + pointer :: mnames !< model names + type(CharacterStringType), dimension(:), contiguous, & + pointer :: etypes !< exg types + type(CharacterStringType), dimension(:), contiguous, & + pointer :: emnames_a !< model a names + type(CharacterStringType), dimension(:), contiguous, & + pointer :: emnames_b !< model b names + type(CharacterStringType), dimension(:), contiguous, & + pointer :: hpc_names !< helper array to get hpc filename + integer(I4B) :: ie + integer(I4B) :: idx_a, idx_b + integer(I4B) :: rank_a, rank_b + integer(I4B) :: nr_exchanges + character(len=LINELENGTH) :: hpc_filename !< the HPC option file + character(len=LENMODELNAME) :: name_a, name_b + character(len=LINELENGTH) :: exg_type + + ! load IDM data + input_mempath = create_mem_path('SIM', 'NAM', idm_context) + call mem_setptr(mtypes, 'MTYPE', input_mempath) + call mem_setptr(mnames, 'MNAME', input_mempath) + call mem_setptr(etypes, 'EXGTYPE', input_mempath) + call mem_setptr(emnames_a, 'EXGMNAMEA', input_mempath) + call mem_setptr(emnames_b, 'EXGMNAMEB', input_mempath) + call mem_setptr(hpc_names, 'HPC6_FILENAME', input_mempath) + + ! FILEIN options give an array, so take the first: + hpc_filename = hpc_names(1) + + nr_exchanges = size(etypes) + + ! loop over exchanges + do ie = 1, nr_exchanges + if (etypes(ie) == 'GWF6-GWT6' .or. etypes(ie) == 'GWF6-GWE6') then + idx_a = ifind(mnames, emnames_a(ie)) + idx_b = ifind(mnames, emnames_b(ie)) + rank_a = this%model_ranks(idx_a) + rank_b = this%model_ranks(idx_b) + if (rank_a /= rank_b) then + name_a = emnames_a(ie) + name_b = emnames_b(ie) + exg_type = etypes(ie) + write (errmsg, '(7a)') "HPC input error: models ", & + trim(name_a), " and ", trim(name_b), " with a ", & + trim(exg_type), " coupling have to be assigned to the same rank" + call store_error(errmsg) + end if + end if + end do + + if (count_errors() > 0) then + call store_error_filename(hpc_filename) + end if + + end subroutine validate_load_balance + + !> @brief clean up + !< + subroutine destroy(this) + class(DistributedSimType) :: this + + call mem_deallocate(this%load_mask) + call mem_deallocate(this%model_ranks) + + call mem_deallocate(this%nr_models) + + ! delete singleton instance + if (associated(dist_sim)) deallocate (dist_sim) + + end subroutine destroy + +end module DistributedSimModule diff --git a/src/Idm/selector/IdmDfnSelector.f90 b/src/Idm/selector/IdmDfnSelector.f90 index 0cc1a8f55db..61c83d085ec 100644 --- a/src/Idm/selector/IdmDfnSelector.f90 +++ b/src/Idm/selector/IdmDfnSelector.f90 @@ -12,6 +12,7 @@ module IdmDfnSelectorModule use IdmSwfDfnSelectorModule use IdmPrtDfnSelectorModule use IdmExgDfnSelectorModule + use IdmUtlDfnSelectorModule implicit none private @@ -44,6 +45,8 @@ function param_definitions(component, subcomponent) result(input_definition) input_definition => prt_param_definitions(subcomponent) case ('EXG') input_definition => exg_param_definitions(subcomponent) + case ('UTL') + input_definition => utl_param_definitions(subcomponent) case default end select return @@ -69,6 +72,8 @@ function aggregate_definitions(component, subcomponent) result(input_definition) input_definition => prt_aggregate_definitions(subcomponent) case ('EXG') input_definition => exg_aggregate_definitions(subcomponent) + case ('UTL') + input_definition => utl_aggregate_definitions(subcomponent) case default end select return @@ -94,6 +99,8 @@ function block_definitions(component, subcomponent) result(input_definition) input_definition => prt_block_definitions(subcomponent) case ('EXG') input_definition => exg_block_definitions(subcomponent) + case ('UTL') + input_definition => utl_block_definitions(subcomponent) case default end select return @@ -118,6 +125,8 @@ function idm_multi_package(component, subcomponent) result(multi_package) multi_package = prt_idm_multi_package(subcomponent) case ('EXG') multi_package = exg_idm_multi_package(subcomponent) + case ('UTL') + multi_package = utl_idm_multi_package(subcomponent) case default call store_error('Idm selector component not found; '//& &'component="'//trim(component)//& @@ -146,6 +155,8 @@ function idm_integrated(component, subcomponent) result(integrated) integrated = prt_idm_integrated(subcomponent) case ('EXG') integrated = exg_idm_integrated(subcomponent) + case ('UTL') + integrated = utl_idm_integrated(subcomponent) case default end select return @@ -170,6 +181,8 @@ function idm_component(component) result(integrated) integrated = .true. case ('EXG') integrated = .true. + case ('UTL') + integrated = .true. case default end select return diff --git a/src/Idm/selector/IdmUtlDfnSelector.f90 b/src/Idm/selector/IdmUtlDfnSelector.f90 new file mode 100644 index 00000000000..1024107f7f1 --- /dev/null +++ b/src/Idm/selector/IdmUtlDfnSelector.f90 @@ -0,0 +1,94 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module IdmUtlDfnSelectorModule + + use ConstantsModule, only: LENVARNAME + use SimModule, only: store_error + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + use UtlHpcInputModule + + implicit none + private + public :: utl_param_definitions + public :: utl_aggregate_definitions + public :: utl_block_definitions + public :: utl_idm_multi_package + public :: utl_idm_integrated + +contains + + subroutine set_param_pointer(input_dfn, input_dfn_target) + type(InputParamDefinitionType), dimension(:), pointer :: input_dfn + type(InputParamDefinitionType), dimension(:), target :: input_dfn_target + input_dfn => input_dfn_target + end subroutine set_param_pointer + + subroutine set_block_pointer(input_dfn, input_dfn_target) + type(InputBlockDefinitionType), dimension(:), pointer :: input_dfn + type(InputBlockDefinitionType), dimension(:), target :: input_dfn_target + input_dfn => input_dfn_target + end subroutine set_block_pointer + + function utl_param_definitions(subcomponent) result(input_definition) + character(len=*), intent(in) :: subcomponent + type(InputParamDefinitionType), dimension(:), pointer :: input_definition + nullify (input_definition) + select case (subcomponent) + case ('HPC') + call set_param_pointer(input_definition, utl_hpc_param_definitions) + case default + end select + return + end function utl_param_definitions + + function utl_aggregate_definitions(subcomponent) result(input_definition) + character(len=*), intent(in) :: subcomponent + type(InputParamDefinitionType), dimension(:), pointer :: input_definition + nullify (input_definition) + select case (subcomponent) + case ('HPC') + call set_param_pointer(input_definition, utl_hpc_aggregate_definitions) + case default + end select + return + end function utl_aggregate_definitions + + function utl_block_definitions(subcomponent) result(input_definition) + character(len=*), intent(in) :: subcomponent + type(InputBlockDefinitionType), dimension(:), pointer :: input_definition + nullify (input_definition) + select case (subcomponent) + case ('HPC') + call set_block_pointer(input_definition, utl_hpc_block_definitions) + case default + end select + return + end function utl_block_definitions + + function utl_idm_multi_package(subcomponent) result(multi_package) + character(len=*), intent(in) :: subcomponent + logical :: multi_package + select case (subcomponent) + case ('HPC') + multi_package = utl_hpc_multi_package + case default + call store_error('Idm selector subcomponent not found; '//& + &'component="UTL"'//& + &', subcomponent="'//trim(subcomponent)//'".', .true.) + end select + return + end function utl_idm_multi_package + + function utl_idm_integrated(subcomponent) result(integrated) + character(len=*), intent(in) :: subcomponent + logical :: integrated + integrated = .false. + select case (subcomponent) + case ('HPC') + integrated = .true. + case default + end select + return + end function utl_idm_integrated + +end module IdmUtlDfnSelectorModule diff --git a/src/Idm/utl-hpcidm.f90 b/src/Idm/utl-hpcidm.f90 new file mode 100644 index 00000000000..a6456293d23 --- /dev/null +++ b/src/Idm/utl-hpcidm.f90 @@ -0,0 +1,120 @@ +! ** Do Not Modify! MODFLOW 6 system generated file. ** +module UtlHpcInputModule + use ConstantsModule, only: LENVARNAME + use InputDefinitionModule, only: InputParamDefinitionType, & + InputBlockDefinitionType + private + public utl_hpc_param_definitions + public utl_hpc_aggregate_definitions + public utl_hpc_block_definitions + public UtlHpcParamFoundType + public utl_hpc_multi_package + + type UtlHpcParamFoundType + logical :: dev_log_mpi = .false. + logical :: mname = .false. + logical :: mrank = .false. + end type UtlHpcParamFoundType + + logical :: utl_hpc_multi_package = .false. + + type(InputParamDefinitionType), parameter :: & + utlhpc_dev_log_mpi = InputParamDefinitionType & + ( & + 'UTL', & ! component + 'HPC', & ! subcomponent + 'OPTIONS', & ! block + 'DEV_LOG_MPI', & ! tag name + 'DEV_LOG_MPI', & ! fortran variable + 'KEYWORD', & ! type + '', & ! shape + .false., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + utlhpc_mname = InputParamDefinitionType & + ( & + 'UTL', & ! component + 'HPC', & ! subcomponent + 'PARTITIONS', & ! block + 'MNAME', & ! tag name + 'MNAME', & ! fortran variable + 'STRING', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + utlhpc_mrank = InputParamDefinitionType & + ( & + 'UTL', & ! component + 'HPC', & ! subcomponent + 'PARTITIONS', & ! block + 'MRANK', & ! tag name + 'MRANK', & ! fortran variable + 'INTEGER', & ! type + '', & ! shape + .true., & ! required + .true., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + utl_hpc_param_definitions(*) = & + [ & + utlhpc_dev_log_mpi, & + utlhpc_mname, & + utlhpc_mrank & + ] + + type(InputParamDefinitionType), parameter :: & + utlhpc_partitions = InputParamDefinitionType & + ( & + 'UTL', & ! component + 'HPC', & ! subcomponent + 'PARTITIONS', & ! block + 'PARTITIONS', & ! tag name + 'PARTITIONS', & ! fortran variable + 'RECARRAY MNAME MRANK', & ! type + '', & ! shape + .true., & ! required + .false., & ! multi-record + .false., & ! preserve case + .false., & ! layered + .false. & ! timeseries + ) + + type(InputParamDefinitionType), parameter :: & + utl_hpc_aggregate_definitions(*) = & + [ & + utlhpc_partitions & + ] + + type(InputBlockDefinitionType), parameter :: & + utl_hpc_block_definitions(*) = & + [ & + InputBlockDefinitionType( & + 'OPTIONS', & ! blockname + .false., & ! required + .false., & ! aggregate + .false. & ! block_variable + ), & + InputBlockDefinitionType( & + 'PARTITIONS', & ! blockname + .true., & ! required + .true., & ! aggregate + .false. & ! block_variable + ) & + ] + +end module UtlHpcInputModule diff --git a/src/SimulationCreate.f90 b/src/SimulationCreate.f90 index bdfc505d6c9..6d8df16cb6a 100644 --- a/src/SimulationCreate.f90 +++ b/src/SimulationCreate.f90 @@ -6,10 +6,9 @@ module SimulationCreateModule DZERO, LENEXCHANGENAME, LENMEMPATH, LENPACKAGETYPE use CharacterStringModule, only: CharacterStringType use SimVariablesModule, only: iout, simulation_mode, proc_id, & - nr_procs, model_names, model_ranks, & - model_loc_idx - use SimModule, only: store_error, count_errors, & - store_error_filename, MaxErrors + nr_procs, model_names, model_loc_idx + use SimModule, only: store_error, count_errors, store_error_filename, & + MaxErrors, store_warning use VersionModule, only: write_listfile_header use InputOutputModule, only: getunit, urword, openfile use ArrayHandlersModule, only: expandarray, ifind @@ -27,7 +26,6 @@ module SimulationCreateModule private public :: simulation_cr public :: simulation_da - public :: create_load_mask contains @@ -50,10 +48,16 @@ end subroutine simulation_cr subroutine simulation_da() ! -- modules use MemoryManagerModule, only: mem_deallocate + use DistributedSimModule, only: DistributedSimType, get_dsim ! -- local + type(DistributedSimType), pointer :: ds ! ------------------------------------------------------------------------------ ! ! -- variables + ! + ds => get_dsim() + call ds%destroy() + ! deallocate (model_names) deallocate (model_loc_idx) ! @@ -210,7 +214,8 @@ subroutine models_create() ! -- modules use MemoryHelperModule, only: create_mem_path use MemoryManagerModule, only: mem_setptr, mem_allocate - use SimVariablesModule, only: idm_context + use SimVariablesModule, only: idm_context, errmsg + use DistributedSimModule, only: DistributedSimType, get_dsim use GwfModule, only: gwf_cr use GwtModule, only: gwt_cr use GweModule, only: gwe_cr @@ -224,6 +229,7 @@ subroutine models_create() use ConstantsModule, only: LENMODELNAME ! -- dummy ! -- locals + type(DistributedSimType), pointer :: ds character(len=LENMEMPATH) :: input_mempath type(CharacterStringType), dimension(:), contiguous, & pointer :: mtypes !< model types @@ -235,8 +241,8 @@ subroutine models_create() class(NumericalModelType), pointer :: num_model character(len=LINELENGTH) :: model_type character(len=LINELENGTH) :: fname, model_name - character(len=LINELENGTH) :: errmsg integer(I4B) :: n, nr_models_glob + integer(I4B), dimension(:), pointer :: model_ranks => null() logical :: terminate = .true. ! ! -- set input memory path @@ -249,12 +255,12 @@ subroutine models_create() ! ! -- allocate global arrays nr_models_glob = size(mnames) - call mem_allocate(model_ranks, nr_models_glob, 'MRANKS', input_mempath) allocate (model_names(nr_models_glob)) allocate (model_loc_idx(nr_models_glob)) ! - ! -- assign models to cpu cores (in serial all to rank 0) - call create_load_balance(model_ranks) + ! -- get model-to-cpu assignment (in serial all to rank 0) + ds => get_dsim() + model_ranks => ds%get_load_balance() ! ! -- open model logging block write (iout, '(/1x,a)') 'READING SIMULATION MODELS' @@ -826,159 +832,4 @@ subroutine check_model_name(mtype, mname) return end subroutine check_model_name - !> @brief Create a load mask to determine which models - !! should be loaded by idm on this process. This is in - !! sync with models create. The mask array should be - !! pre-allocated with size equal to the global number - !! of models. It is returned as (1, 1, 0, 0, ... 0) - !! with each entry being a load mask for the model - !! at the corresponding location in the 'MNAME' array - !< of the IDM. - subroutine create_load_mask(mask_array) - use SimVariablesModule, only: proc_id - integer(I4B), dimension(:) :: mask_array - ! local - integer(I4B) :: i - - call create_load_balance(mask_array) - do i = 1, size(mask_array) - if (mask_array(i) == proc_id) then - mask_array(i) = 1 - else - mask_array(i) = 0 - end if - end do - - end subroutine create_load_mask - - !> @brief Distribute the models over the available - !! processes in a parallel run. Expects an array sized - !< to the number of models in the global simulation - subroutine create_load_balance(mranks) - use SimVariablesModule, only: idm_context - use MemoryHelperModule, only: create_mem_path - use MemoryManagerModule, only: mem_setptr - integer(I4B), dimension(:) :: mranks - ! local - integer(I4B) :: im, imm, ie, ip, cnt - integer(I4B) :: nr_models, nr_gwf_models - integer(I4B) :: nr_exchanges - integer(I4B) :: min_per_proc, nr_left - integer(I4B) :: rank - integer(I4B), dimension(:), allocatable :: nr_models_proc - character(len=LENPACKAGETYPE) :: model_type_str - character(len=LINELENGTH) :: errmsg - character(len=LENMEMPATH) :: input_mempath - type(CharacterStringType), dimension(:), contiguous, & - pointer :: mtypes !< model types - type(CharacterStringType), dimension(:), contiguous, & - pointer :: mnames !< model names - type(CharacterStringType), dimension(:), contiguous, & - pointer :: etypes !< exg types - type(CharacterStringType), dimension(:), contiguous, & - pointer :: emnames_a !< model a names - type(CharacterStringType), dimension(:), contiguous, & - pointer :: emnames_b !< model b names - - mranks = 0 - if (simulation_mode /= 'PARALLEL') return - - ! load IDM data - input_mempath = create_mem_path('SIM', 'NAM', idm_context) - call mem_setptr(mtypes, 'MTYPE', input_mempath) - call mem_setptr(mnames, 'MNAME', input_mempath) - call mem_setptr(etypes, 'EXGTYPE', input_mempath) - call mem_setptr(emnames_a, 'EXGMNAMEA', input_mempath) - call mem_setptr(emnames_b, 'EXGMNAMEB', input_mempath) - - ! count flow models - nr_models = size(mnames) - nr_gwf_models = 0 - do im = 1, nr_models - if (mtypes(im) == 'GWF6') then - nr_gwf_models = nr_gwf_models + 1 - end if - - if (mtypes(im) == 'GWF6' .or. & - mtypes(im) == 'GWT6' .or. & - mtypes(im) == 'GWE6') then - cycle - end if - - model_type_str = mtypes(im) - write (errmsg, *) 'Model type ', model_type_str, & - ' not supported in parallel mode.' - call store_error(errmsg, terminate=.true.) - end do - - ! calculate nr of flow models for each rank - allocate (nr_models_proc(nr_procs)) - min_per_proc = nr_gwf_models / nr_procs - nr_left = nr_gwf_models - nr_procs * min_per_proc - cnt = 1 - do ip = 1, nr_procs - rank = ip - 1 - nr_models_proc(ip) = min_per_proc - if (rank < nr_left) then - nr_models_proc(ip) = nr_models_proc(ip) + 1 - end if - end do - - ! assign ranks for flow models - rank = 0 - do im = 1, nr_models - if (mtypes(im) == 'GWF6') then - if (nr_models_proc(rank + 1) == 0) then - rank = rank + 1 - end if - mranks(im) = rank - nr_models_proc(rank + 1) = nr_models_proc(rank + 1) - 1 - end if - end do - - ! match other models to flow - nr_exchanges = size(etypes) - do im = 1, nr_models - if (mtypes(im) == 'GWT6') then - - ! find match - do ie = 1, nr_exchanges - if (etypes(ie) == 'GWF6-GWT6' .and. mnames(im) == emnames_b(ie)) then - rank = 0 - do imm = 1, nr_models - if (mnames(imm) == emnames_a(ie)) then - rank = mranks(imm) - exit - end if - end do - mranks(im) = rank - exit - end if - end do - - else if (mtypes(im) == 'GWE6') then - do ie = 1, nr_exchanges - if (etypes(ie) == 'GWF6-GWE6' .and. mnames(im) == emnames_b(ie)) then - rank = 0 - do imm = 1, nr_models - if (mnames(imm) == emnames_a(ie)) then - rank = mranks(imm) - exit - end if - end do - mranks(im) = rank - exit - end if - end do - - else - cycle ! e.g., for a flow model - end if - end do - - ! cleanup - deallocate (nr_models_proc) - - end subroutine create_load_balance - end module SimulationCreateModule diff --git a/src/Utilities/ArrayHandlers.f90 b/src/Utilities/ArrayHandlers.f90 index fccbbc120fc..a64b5a74396 100644 --- a/src/Utilities/ArrayHandlers.f90 +++ b/src/Utilities/ArrayHandlers.f90 @@ -42,7 +42,7 @@ module ArrayHandlersModule end interface interface ifind - module procedure ifind_character, ifind_integer + module procedure ifind_character, ifind_integer, ifind_charstring end interface ifind contains @@ -488,6 +488,27 @@ function ifind_character(array, str) end do findloop end function ifind_character + !> @brief Find the 1st array element containing str, or -1 if not found. + !< + function ifind_charstring(array, str) + use CharacterStringModule + ! -- return + integer(I4B) :: ifind_charstring + ! -- dummy + type(CharacterStringType), dimension(:) :: array + type(CharacterStringType) :: str + ! -- local + integer(I4B) :: i + + ifind_charstring = -1 + findloop: do i = 1, size(array) + if (array(i) == str) then + ifind_charstring = i + exit findloop + end if + end do findloop + end function ifind_charstring + !> @brief Find the first element containing ival, or -1 if not found. function ifind_integer(iarray, ival) ! -- return diff --git a/src/Utilities/Idm/IdmLoad.f90 b/src/Utilities/Idm/IdmLoad.f90 index 8ca01c0c3d6..eb3fd089cc0 100644 --- a/src/Utilities/Idm/IdmLoad.f90 +++ b/src/Utilities/Idm/IdmLoad.f90 @@ -111,6 +111,7 @@ subroutine idm_da(iout) end do ! ! -- deallocate input context SIM paths + call memorylist_remove('UTL', 'HPC', idm_context) call memorylist_remove('SIM', 'TDIS', idm_context) call memorylist_remove('SIM', 'NAM', idm_context) call memorylist_remove(component='SIM', context=idm_context) @@ -207,19 +208,21 @@ end subroutine load_model_pkgs !> @brief load model namfiles and model package files !< - subroutine load_models(model_loadmask, iout) + subroutine load_models(iout) ! -- modules use MemoryHelperModule, only: create_mem_path use MemoryManagerModule, only: mem_setptr use CharacterStringModule, only: CharacterStringType use SimVariablesModule, only: idm_context + use DistributedSimModule, only: DistributedSimType, get_dsim use ModelPackageInputsModule, only: ModelPackageInputsType use SourceCommonModule, only: idm_component_type use SourceLoadModule, only: load_modelnam ! -- dummy - integer(I4B), dimension(:), intent(in) :: model_loadmask integer(I4B), intent(in) :: iout ! -- local + type(DistributedSimType), pointer :: ds + integer(I4B), dimension(:), pointer :: model_loadmask character(len=LENMEMPATH) :: input_mempath type(CharacterStringType), dimension(:), contiguous, & pointer :: mtypes !< model types @@ -232,6 +235,10 @@ subroutine load_models(model_loadmask, iout) type(ModelPackageInputsType), allocatable :: model_pkg_inputs integer(I4B) :: n ! + ! -- get model mask + ds => get_dsim() + model_loadmask => ds%get_load_mask() + ! ! -- set input memory path input_mempath = create_mem_path('SIM', 'NAM', idm_context) ! @@ -275,19 +282,21 @@ end subroutine load_models !> @brief load exchange files !< - subroutine load_exchanges(model_loadmask, iout) + subroutine load_exchanges(iout) ! -- modules use MemoryHelperModule, only: create_mem_path use MemoryManagerModule, only: mem_setptr, mem_allocate, & mem_deallocate, get_isize use CharacterStringModule, only: CharacterStringType use SimVariablesModule, only: idm_context, simfile + use DistributedSimModule, only: DistributedSimType, get_dsim use SourceCommonModule, only: idm_subcomponent_type, ifind_charstr use SourceLoadModule, only: create_input_loader, remote_model_ndim ! -- dummy - integer(I4B), dimension(:), intent(in) :: model_loadmask integer(I4B), intent(in) :: iout ! -- local + type(DistributedSimType), pointer :: ds + integer(I4B), dimension(:), pointer :: model_loadmask type(CharacterStringType), dimension(:), contiguous, & pointer :: etypes !< exg types type(CharacterStringType), dimension(:), contiguous, & @@ -313,6 +322,10 @@ subroutine load_exchanges(model_loadmask, iout) class(DynamicPkgLoadBaseType), pointer :: dynamic_loader integer(I4B) :: n, m1_idx, m2_idx, irem, isize ! + ! -- get model mask + ds => get_dsim() + model_loadmask => ds%get_load_mask() + ! ! -- set input memory path input_mempath = create_mem_path('SIM', 'NAM', idm_context) ! diff --git a/src/Utilities/Idm/SourceLoad.F90 b/src/Utilities/Idm/SourceLoad.F90 index 603bdc6d3d7..5576bc89e39 100644 --- a/src/Utilities/Idm/SourceLoad.F90 +++ b/src/Utilities/Idm/SourceLoad.F90 @@ -147,9 +147,12 @@ end subroutine load_modelnam subroutine load_simnam() use SimVariablesModule, only: simfile, iout + use MemoryManagerModule, only: mem_setptr, mem_print_detailed use MessageModule, only: write_message use IdmMf6FileModule, only: input_load - type(ModflowInputType) :: mf6_input + use SourceCommonModule, only: filein_fname + type(ModflowInputType) :: mf6_input, hpc_input + character(len=LINELENGTH) :: hpc6_filename character(len=LINELENGTH) :: line logical :: lexist ! @@ -168,6 +171,13 @@ subroutine load_simnam() ! ! -- open namfile and load to input context call input_load(simfile, mf6_input, simfile, iout) + ! + ! -- load optional HPC configuration file + if (filein_fname(hpc6_filename, 'HPC6_FILENAME', mf6_input%mempath, & + simfile)) then + hpc_input = getModflowInput('HPC6', 'UTL', 'HPC', 'UTL', 'HPC') + call input_load(hpc6_filename, hpc_input, simfile, iout) + end if end if ! ! -- return diff --git a/src/meson.build b/src/meson.build index 005762bd07d..803f89b4c34 100644 --- a/src/meson.build +++ b/src/meson.build @@ -7,6 +7,7 @@ external_libraries = files( ) modflow_sources = files( + 'Distributed' / 'DistributedSim.f90', 'Distributed' / 'IndexMap.f90', 'Distributed' / 'InterfaceMap.f90', 'Distributed' / 'Mapper.f90', @@ -92,6 +93,7 @@ modflow_sources = files( 'Idm' / 'prt-disidm.f90', 'Idm' / 'prt-disvidm.f90', 'Idm' / 'prt-mipidm.f90', + 'Idm' / 'utl-hpcidm.f90', 'Idm' / 'selector' / 'IdmDfnSelector.f90', 'Idm' / 'selector' / 'IdmExgDfnSelector.f90', 'Idm' / 'selector' / 'IdmGweDfnSelector.f90', @@ -100,6 +102,7 @@ modflow_sources = files( 'Idm' / 'selector' / 'IdmSwfDfnSelector.f90', 'Idm' / 'selector' / 'IdmPrtDfnSelector.f90', 'Idm' / 'selector' / 'IdmSimDfnSelector.f90', + 'Idm' / 'selector' / 'IdmUtlDfnSelector.f90', 'Model' / 'Connection' / 'ConnectionBuilder.f90', 'Model' / 'Connection' / 'CellWithNbrs.f90', 'Model' / 'Connection' / 'CsrUtils.f90', diff --git a/src/mf6core.f90 b/src/mf6core.f90 index fd66e15a88a..e67a0772592 100644 --- a/src/mf6core.f90 +++ b/src/mf6core.f90 @@ -272,13 +272,7 @@ subroutine static_input_load() load_models, load_exchanges use MemoryHelperModule, only: create_mem_path use MemoryManagerModule, only: mem_setptr, mem_allocate - use SimVariablesModule, only: idm_context, iparamlog - use SimulationCreateModule, only: create_load_mask - ! -- dummy - ! -- locals - character(len=LENMEMPATH) :: input_mempath - integer(I4B), dimension(:), pointer, contiguous :: model_loadmask - integer(I4B), pointer :: nummodels => null() + use SimVariablesModule, only: iparamlog ! ! -- load simnam input context call simnam_load(iparamlog) @@ -286,22 +280,11 @@ subroutine static_input_load() ! -- load tdis to input context call simtdis_load() ! - ! -- allocate model load mask - input_mempath = create_mem_path(component='SIM', context=idm_context) - call mem_setptr(nummodels, 'NUMMODELS', input_mempath) - allocate (model_loadmask(nummodels)) - ! - ! -- initialize mask - call create_load_mask(model_loadmask) - ! ! -- load in scope models - call load_models(model_loadmask, iout) + call load_models(iout) ! ! -- load in scope exchanges - call load_exchanges(model_loadmask, iout) - ! - ! -- cleanup - deallocate (model_loadmask) + call load_exchanges(iout) ! ! -- return return diff --git a/utils/idmloader/dfns.txt b/utils/idmloader/dfns.txt index c2e09f3af85..0d73b752697 100644 --- a/utils/idmloader/dfns.txt +++ b/utils/idmloader/dfns.txt @@ -67,4 +67,7 @@ exg-gwtgwt.dfn exg-gwfgwe.dfn exg-gwegwe.dfn exg-swfgwf.dfn -exg-gwfprt.dfn \ No newline at end of file +exg-gwfprt.dfn + +# utils +utl-hpc.dfn \ No newline at end of file diff --git a/utils/zonebudget/make/makefile b/utils/zonebudget/make/makefile index 69fa6b73c71..1d465c473fa 100644 --- a/utils/zonebudget/make/makefile +++ b/utils/zonebudget/make/makefile @@ -1,4 +1,4 @@ -# makefile created by pymake (version 1.2.10.dev0) for the 'zbud6' executable. +# makefile created by pymake (version 1.2.9.dev0) for the 'zbud6' executable. include ./makedefaults @@ -17,6 +17,7 @@ OBJECTS = \ $(OBJDIR)/kind.o \ $(OBJDIR)/Constants.o \ $(OBJDIR)/ErrorUtil.o \ +$(OBJDIR)/CharString.o \ $(OBJDIR)/SimVariables.o \ $(OBJDIR)/ArrayHandlers.o \ $(OBJDIR)/Message.o \ diff --git a/utils/zonebudget/msvs/zonebudget.vfproj b/utils/zonebudget/msvs/zonebudget.vfproj index 883e7c7f87b..89a64a5816f 100644 --- a/utils/zonebudget/msvs/zonebudget.vfproj +++ b/utils/zonebudget/msvs/zonebudget.vfproj @@ -36,6 +36,7 @@ + diff --git a/utils/zonebudget/pymake/extrafiles.txt b/utils/zonebudget/pymake/extrafiles.txt index 54d11147ff3..d33ec55b1a4 100644 --- a/utils/zonebudget/pymake/extrafiles.txt +++ b/utils/zonebudget/pymake/extrafiles.txt @@ -1,3 +1,4 @@ +../../../src/Utilities/CharString.f90 ../../../src/Utilities/ArrayHandlers.f90 ../../../src/Utilities/ArrayReaders.f90 ../../../src/Utilities/BlockParser.f90 From 6ec273049ad0c26a59c6d3a32e8e205e241b68b1 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Tue, 14 May 2024 10:58:41 -0500 Subject: [PATCH 152/199] docs(ioguide): remove swf from ioguide for release (#1793) --- doc/mf6io/body.tex | 6 +- doc/mf6io/framework/processing_of_input.tex | 23 +++++- doc/mf6io/mf6io.nightlybuild.bbl | 80 +++++++++++++++++++-- doc/mf6io/obs/obs.tex | 4 +- doc/mf6io/simulation_namefile.tex | 2 + 5 files changed, 102 insertions(+), 13 deletions(-) diff --git a/doc/mf6io/body.tex b/doc/mf6io/body.tex index 1a48211159e..6c59a1c2a12 100644 --- a/doc/mf6io/body.tex +++ b/doc/mf6io/body.tex @@ -56,9 +56,9 @@ \input{prt/prt.tex} %SWF Model Input Instructions -\newpage -\SECTION{Surface Water Flow (SWF) Model Input} -\input{swf/swf.tex} +% \newpage +% \SECTION{Surface Water Flow (SWF) Model Input} +% \input{swf/swf.tex} %Sparse Matrix Solution (IMS) \newpage diff --git a/doc/mf6io/framework/processing_of_input.tex b/doc/mf6io/framework/processing_of_input.tex index b625e2ffece..e995bcfeed1 100644 --- a/doc/mf6io/framework/processing_of_input.tex +++ b/doc/mf6io/framework/processing_of_input.tex @@ -16,8 +16,8 @@ \subsection{Supported Components} \hline SIM/NAM & mfsim.nam \\ SIM/TDIS & TDIS6 \\ +\hline GWF/NAM & GWF name file \\ -GWT/NAM & GWT name file \\ GWF/CHD & CHD6 \\ GWF/DIS & DIS6 \\ GWF/DISU & DISU6 \\ @@ -32,15 +32,34 @@ \subsection{Supported Components} GWF/RCHA & RCH6 \\ GWF/RIV & RIV6 \\ GWF/WEL & WEL6 \\ +\hline +GWT/NAM & GWT name file \\ +GWT/CNC & CNC6 \\ GWT/DIS & DIS6 \\ GWT/DISU & DISU6 \\ GWT/DISV & DISV6 \\ -GWT/CNC & CNC6 \\ GWT/DSP & DSP6 \\ GWT/IC & IC6 \\ +\hline +GWE/NAM & GWE name file \\ +GWE/CND & CND6 \\ +GWE/CTP & CTP6 \\ +GWE/DIS & DIS6 \\ +GWE/DISU & DISU6 \\ +GWE/DISV & DISV6 \\ +GWE/IC & IC6 \\ +\hline +PRT/NAM & PRT name file \\ +PRT/DIS & DIS6 \\ +PRT/DISV & DISV6 \\ +PRT/MIP & MIP \\ +\hline EXG/GWFGWF & GWF6-GWF6 \\ EXG/GWFGWT & GWF6-GWT6 \\ EXG/GWTGWT & GWT6-GWT6 \\ +EXG/GWFGWE & GWF6-GWE6 \\ +EXG/GWEGWE & GWE6-GWE6 \\ +EXG/GWFPRT & GWF6-PRT6 \\ \hline \end{longtable} \label{table:idmsupported} diff --git a/doc/mf6io/mf6io.nightlybuild.bbl b/doc/mf6io/mf6io.nightlybuild.bbl index f0abd461eeb..9a3a5427419 100644 --- a/doc/mf6io/mf6io.nightlybuild.bbl +++ b/doc/mf6io/mf6io.nightlybuild.bbl @@ -1,4 +1,4 @@ -\begin{thebibliography}{31} +\begin{thebibliography}{41} \providecommand{\natexlab}[1]{#1} \expandafter\ifx\csname urlstyle\endcsname\relax \providecommand{\doi}[1]{doi:\discretionary{}{}{}#1}\else @@ -36,6 +36,14 @@ Banta, E.R., 2011, MODFLOW-CDSS, a version of MODFLOW-2005 with modifications Report 2011--1213, 19 p.}, accessed June 27, 2017, at \url{https://pubs.er.usgs.gov/publication/ofr20111213}. +\bibitem[{Bedekar and others(2016)Bedekar, Morway, Langevin, and + Tonkin}]{mt3dusgs} +Bedekar, Vivek, Morway, E.D., Langevin, C.D., and Tonkin, M.J., 2016, MT3D-USGS + version 1: A U.S. Geological Survey release of MT3DMS updated with new and + expanded transport capabilities for use with MODFLOW: {U.S. Geological Survey + Techniques and Methods, book 6, chap. A53, 69 p.}, + \url{https://doi.org/10.3133/tm6a53}, \url{http://dx.doi.org/10.3133/tm6A53}. + \bibitem[{Fenske and others(1996)Fenske, Leake, and Prudic}]{fenske1996documentation} Fenske, J.P., Leake, S.A., and Prudic, D.E., 1996, Documentation of a computer @@ -64,6 +72,21 @@ Harbaugh, A.W., 2005, MODFLOW-2005, the U.S. Geological Survey modular Techniques and Methods, book 6, chap. A16, variously paged}, accessed June 27, 2017, at \url{https://pubs.usgs.gov/tm/2005/tm6A16/}. +\bibitem[{Healy and Ronan(1996)}]{healy1996} +Healy, R.W., and Ronan, A.D., 1996, Documentation of Computer Program VS2DH for + Simulation of Energy Transport in Variably Saturated Porous Media: + Modification of the U.S. Geological Survey's Computer Program VS2DT: {U.S. + Geological Survey Water-Resources Investigation Report 96-4230, 36 p.}, + accessed September 27, 2022, at \url{https://doi.org/10.3133/wri964230}, at + \url{https://pubs.usgs.gov/wri/1996/4230/report.pdf}. + +\bibitem[{Hecht-Mendez and others(2010)Hecht-Mendez, Molina-Giraldo, Blum, and + Bayer}]{hechtmendez} +Hecht-Mendez, J., Molina-Giraldo, N., Blum, P., and Bayer, P., 2010, Evaluating + mt3dms for heat transport simulation of closed geothermal systems: + Groundwater, v.~48, no.~5, p.~741--756, + \url{https://doi.org/10.1111/j.1745-6584.2010.00678.x}. + \bibitem[{Hill(1990)}]{hill1990preconditioned} Hill, M.C., 1990, Preconditioned Conjugate-Gradient 2 (PCG2), a computer program for solving ground-water flow equations: {U.S. Geological Survey @@ -106,8 +129,28 @@ Hughes, J.D., Langevin, C.D., Chartier, K.L., and White, J.T., 2012, Banta}]{modflow6framework} Hughes, J.D., Langevin, C.D., and Banta, E.R., 2017, Documentation for the MODFLOW 6 framework: {U.S. Geological Survey Techniques and Methods, book 6, - chap. A57, 36 p.}, accessed August 4, 2017, at - \url{https://doi.org/10.3133/tm6A57}. + chap. A57, 36 p.}, \url{https://doi.org/10.3133/tm6A57}. + +\bibitem[{Hughes and others(2022{\natexlab{a}})Hughes, Russcher, Langevin, + Morway, and McDonald}]{modflow6api} +Hughes, J.D., Russcher, M.J., Langevin, C.D., Morway, E.D., and McDonald, R.R., + 2022{\natexlab{a}}, The {MODFLOW Application Programming Interface} for + simulation control and software interoperability: Environmental Modelling \& + Software, v. 148, 105257, + \url{https://doi.org/10.1016/j.envsoft.2021.105257}. + +\bibitem[{Hughes and others(2022{\natexlab{b}})Hughes, Leake, Galloway, and + White}]{modflow6csub} +Hughes, J.D., Leake, S.A., Galloway, D.L., and White, J.T., 2022{\natexlab{b}}, + Documentation for the Skeletal Storage, Compaction, and Subsidence (CSUB) + Package of MODFLOW 6: {U.S. Geological Survey Techniques and Methods, book 6, + chap. A62, 57 p.}, \url{https://doi.org/10.3133/tm6A62}. + +\bibitem[{Kipp(1987)}]{kipp1987} +Kipp, K.L., 1987, HST3D: A Computer Code for Simulation of Heat and Solute + Transport in Three-Dimensional Ground-Water Flow Systems: {U.S. Geological + Survey Water-Resources Investigation Report 86-4095, 517 p.}, accessed + September 27, 2022, at \url{https://pubs.usgs.gov/wri/1986/4095/report.pdf}. \bibitem[{Konikow and others(2009)Konikow, Hornberger, Halford, and Hanson}]{konikow2009} @@ -129,7 +172,7 @@ Langevin, C.D., Thorne~Jr, D.T., Dausman, A.M., Sukop, M.C., and Guo, Weixing, Langevin, C.D., Hughes, J.D., Provost, A.M., Banta, E.R., Niswonger, R.G., and Panday, Sorab, 2017, Documentation for the MODFLOW 6 Groundwater Flow (GWF) Model: {U.S. Geological Survey Techniques and Methods, book 6, chap. A55, 197 - p.}, accessed August 4, 2017, at \url{https://doi.org/10.3133/tm6A55}. + p.}, \url{https://doi.org/10.3133/tm6A55}. \bibitem[{Langevin and others(2020)Langevin, Panday, and Provost}]{langevin2020hydraulic} @@ -137,6 +180,13 @@ Langevin, C.D., Panday, Sorab, and Provost, A.M., 2020, Hydraulic-head formulation for density-dependent flow and transport: Groundwater, v.~58, no.~3, p.~349--362. +\bibitem[{Langevin and others(2022)Langevin, Provost, Panday, and + Hughes}]{modflow6gwt} +Langevin, C.D., Provost, A.M., Panday, Sorab, and Hughes, J.D., 2022, + Documentation for the MODFLOW 6 Groundwater Transport (GWT) Model: {U.S. + Geological Survey Techniques and Methods, book 6, chap. A61, 56 p.}, + \url{https://doi.org/10.3133/tm6A61}. + \bibitem[{Leake and Galloway(2007)}]{leake2007modflow} Leake, S.A., and Galloway, D.L., 2007, MODFLOW Ground-water model---User guide to the Subsidence and Aquifer-System Compaction Package (SUB-WT) for @@ -151,6 +201,11 @@ Leake, S.A., and Lilly, M.R., 1997, Documentation of computer program (FHB1) (MODFLOW): {U.S. Geological Survey Open-File Report 97--571, 50 p.}, accessed June 27, 2017, at \url{https://pubs.er.usgs.gov/publication/ofr97571}. +\bibitem[{Ma and Zheng(2010)}]{mazheng2010} +Ma, Rui, and Zheng, Chunmiao, 2010, Effects of density and viscosity in + modeling heat as a groundwater tracer: Groundwater, v.~48, no.~3, + p.~380--389, \url{https://doi.org/10.1111/j.1745-6584.2009.00660.x}. + \bibitem[{Maddock and others(2012)Maddock, Baird, Hanson, Schmid, and Ajami}]{modflowripetpack} Maddock, Thomas, III, Baird, K.J., Hanson, R.T., Schmid, Wolfgang, and Ajami, @@ -191,8 +246,8 @@ Panday, Sorab, Langevin, C.D., Niswonger, R.G., Ibaraki, Motomu, and Hughes, \bibitem[{Provost and others(2017)Provost, Langevin, and Hughes}]{modflow6xt3d} Provost, A.M., Langevin, C.D., and Hughes, J.D., 2017, Documentation for the ``XT3D'' Option in the Node Property Flow (NPF) Package of MODFLOW 6: {U.S. - Geological Survey Techniques and Methods, book 6, chap. A56, 46 p.}, accessed - August 4, 2017, at \url{https://doi.org/10.3133/tm6A56}. + Geological Survey Techniques and Methods, book 6, chap. A56, 46 p.}, + \url{https://doi.org/10.3133/tm6A56}. \bibitem[{Prudic(1989)}]{prudic1989str} Prudic, D.E., 1989, Documentation of a computer program to simulate @@ -207,10 +262,23 @@ Prudic, D.E., Konikow, L.F., and Banta, E.R., 2004, A New Streamflow-Routing {U.S. Geological Survey Open File Report 2004--1042, 104 p.}, accessed June 27, 2017, at \url{https://pubs.er.usgs.gov/publication/ofr20041042}. +\bibitem[{Voss(1984)}]{Voss1984sutra} +Voss, C.I., 1984, SUTRA---A finite-element simulation model for + saturated-unsaturated fluid-density-dependent ground-water flow with energy + transport or chemically-reactive single-species solute transport: {U.S. + Geological Survey Water-Resources Investigations Report 84--4369, 409 p.} + \bibitem[{Zheng(2010)}]{zheng2010supplemental} Zheng, Chunmiao, 2010, MT3DMS v5.3, Supplemental User's Guide: {Technical Report Prepared for the U.S. Army Corps of Engineers, 51 p.} +\bibitem[{Zheng and Wang(1999)}]{zheng1999mt3dms} +Zheng, Chunmiao, and Wang, P.P., 1999, MT3DMS---A modular three-dimensional + multi-species transport model for simulation of advection, dispersion and + chemical reactions of contaminants in groundwater systems; Documentation and + user's guide: {Contract report SERDP--99--1: Vicksburg, Miss., U.S. Army + Engineer Research and Development Center, 169 p.} + \bibitem[{Zheng and others(2001)Zheng, Hill, and Hsieh}]{zheng2001modflow} Zheng, Chunmiao, Hill, M.C., and Hsieh, P.A., 2001, MODFLOW-2000, the U.S. Geological Survey Modular Ground-Water Model---User guide to the LMT6 diff --git a/doc/mf6io/obs/obs.tex b/doc/mf6io/obs/obs.tex index 089d5840099..72c20a02444 100644 --- a/doc/mf6io/obs/obs.tex +++ b/doc/mf6io/obs/obs.tex @@ -36,5 +36,5 @@ \subsubsection{GWT Observations} \subsubsection{GWE Observations} \input{./obs/obs-gwe.tex} -\subsubsection{SWF Observations} -\input{./obs/obs-swf.tex} +% \subsubsection{SWF Observations} +% \input{./obs/obs-swf.tex} diff --git a/doc/mf6io/simulation_namefile.tex b/doc/mf6io/simulation_namefile.tex index bb943c14f9a..1ff885d9ddb 100644 --- a/doc/mf6io/simulation_namefile.tex +++ b/doc/mf6io/simulation_namefile.tex @@ -29,6 +29,8 @@ \subsection{Explanation of Variables} \hline GWF6 & Groundwater Flow Model \\ GWT6 & Groundwater Transport Model \\ +GWE6 & Groundwater Energy Model \\ +PRT6 & Particle Tracking Model \\ \hline \end{tabular*} \label{table:mtype} From 5388819867175c3530c5597f44573bb54de16e45 Mon Sep 17 00:00:00 2001 From: jdhughes-usgs Date: Tue, 14 May 2024 12:16:32 -0500 Subject: [PATCH 153/199] fix(ptc): DEV_PTC_OUTPUT support for parallel simulations (#1795) --- src/Solution/NumericalSolution.f90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Solution/NumericalSolution.f90 b/src/Solution/NumericalSolution.f90 index 07629dc4d0c..8040af8419c 100644 --- a/src/Solution/NumericalSolution.f90 +++ b/src/Solution/NumericalSolution.f90 @@ -692,6 +692,9 @@ subroutine sln_ar(this) call this%parser%GetStringCaps(keyword) if (keyword == 'FILEOUT') then call this%parser%GetString(fname) + if (nr_procs > 1) then + call append_processor_id(fname, proc_id) + end if this%iptcout = getunit() call openfile(this%iptcout, iout, fname, 'PTC-OUT', & filstat_opt='REPLACE') From dccdfba75b1de71a3046e880fa9928ea3235b0b6 Mon Sep 17 00:00:00 2001 From: mjr-deltares <45555666+mjr-deltares@users.noreply.github.com> Date: Tue, 14 May 2024 19:45:46 +0200 Subject: [PATCH 154/199] fix(par): suppress BUY message for interface models (#1794) * - suppress BUY message for interface model - add safety check to avoid bound exception in comparison * - format --- src/Exchange/exg-gwfgwt.f90 | 11 +++++++---- src/Model/GroundWaterFlow/gwf-buy.f90 | 4 +++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/Exchange/exg-gwfgwt.f90 b/src/Exchange/exg-gwfgwt.f90 index 65a33bc0a8b..688961f71f6 100644 --- a/src/Exchange/exg-gwfgwt.f90 +++ b/src/Exchange/exg-gwfgwt.f90 @@ -326,10 +326,13 @@ subroutine gwfconn2gwtconn(this, gwfModel, gwtModel) ! ! for now, connecting the same nodes nrs will be ! sufficient evidence of equality - areEqual = all(gwfConn%prim_exchange%nodem1 == & - gwtConn%prim_exchange%nodem1) - areEqual = areEqual .and. all(gwfConn%prim_exchange%nodem2 == & - gwtConn%prim_exchange%nodem2) + areEqual = gwfConn%prim_exchange%nexg == gwtConn%prim_exchange%nexg + if (areEqual) then + areEqual = all(gwfConn%prim_exchange%nodem1 == & + gwtConn%prim_exchange%nodem1) + areEqual = areEqual .and. all(gwfConn%prim_exchange%nodem2 == & + gwtConn%prim_exchange%nodem2) + end if if (areEqual) then ! same DIS, same exchange: link and go to next GWT conn. write (iout, '(/6a)') 'Linking exchange ', & diff --git a/src/Model/GroundWaterFlow/gwf-buy.f90 b/src/Model/GroundWaterFlow/gwf-buy.f90 index 6cca69d1d95..ae9cf509884 100644 --- a/src/Model/GroundWaterFlow/gwf-buy.f90 +++ b/src/Model/GroundWaterFlow/gwf-buy.f90 @@ -143,7 +143,9 @@ subroutine buy_df(this, dis, buy_input) &' input read from unit ', i0, //)" ! ! --print a message identifying the buoyancy package. - write (this%iout, fmtbuy) this%inunit + if (.not. present(buy_input)) then + write (this%iout, fmtbuy) this%inunit + end if ! ! -- store pointers to arguments that were passed in this%dis => dis From e39aac3bdb7ddf0487b56f872b002270591078af Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Tue, 14 May 2024 11:25:27 -0700 Subject: [PATCH 155/199] chore(SolutionGroup.f90): cleanup docstrings in SolutionGroup class (#1796) --- src/Solution/SolutionGroup.f90 | 59 ++++++++++++---------------------- 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/src/Solution/SolutionGroup.f90 b/src/Solution/SolutionGroup.f90 index c51076e802c..3f309f8a039 100644 --- a/src/Solution/SolutionGroup.f90 +++ b/src/Solution/SolutionGroup.f90 @@ -16,7 +16,9 @@ module SolutionGroupModule integer(I4B), pointer :: mxiter integer(I4B), pointer :: nsolutions integer(I4B), dimension(:), allocatable :: idsolutions !array of solution ids in basesolutionlist + contains + procedure :: sgp_ca procedure :: sgp_da procedure, private :: allocate_scalars @@ -25,16 +27,12 @@ module SolutionGroupModule contains + !> @brief Create a new solution group + !< subroutine solutiongroup_create(sgp, id) -! ****************************************************************************** -! solutiongroup_create -- Create a new solution group -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ + ! -- dummy type(SolutionGroupType), pointer :: sgp integer(I4B), intent(in) :: id -! ------------------------------------------------------------------------------ ! allocate (sgp) call sgp%allocate_scalars() @@ -44,16 +42,13 @@ subroutine solutiongroup_create(sgp, id) return end subroutine solutiongroup_create + !> @brief Calculate the solution group + !! + !! Solve each solution group and each solution. Start with converge + !! flag equal true and reset to zero if any non-convergence triggers + !! are encountered. + !< subroutine sgp_ca(this) -! ****************************************************************************** -! sgp_ca -- Calculate the solution group -! Solve each solution group and each solution. Start with converge -! flag equal true and reset to zero if any non-convergence triggers -! are encountered. -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ ! -- modules use ConstantsModule, only: LINELENGTH use SimVariablesModule, only: iout, isimcnvg, lastStepFailed @@ -68,7 +63,6 @@ subroutine sgp_ca(this) character(len=*), parameter :: fmtnocnvg = & "(1X,'Solution Group ', i0, ' did not converge for stress period ', i0, & &' and time step ', i0)" -! ------------------------------------------------------------------------------ ! ! -- Suppress output during picard iterations if (this%mxiter > 1) then @@ -117,15 +111,11 @@ subroutine sgp_ca(this) return end subroutine sgp_ca + !> @brief Deallocate + !< subroutine sgp_da(this) -! ****************************************************************************** -! deallocate -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ + ! -- dummy class(SolutionGroupType) :: this -! ------------------------------------------------------------------------------ ! deallocate (this%id) deallocate (this%mxiter) @@ -136,15 +126,11 @@ subroutine sgp_da(this) return end subroutine sgp_da + !> @brief Allocate scalars + !< subroutine allocate_scalars(this) -! ****************************************************************************** -! allocate_scalars -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ + ! -- dummy class(SolutionGroupType) :: this -! ------------------------------------------------------------------------------ ! allocate (this%id) allocate (this%mxiter) @@ -157,13 +143,9 @@ subroutine allocate_scalars(this) return end subroutine allocate_scalars + !> @brief Add solution + !< subroutine add_solution(this, isoln, sp) -! ****************************************************************************** -! add_solution -! ****************************************************************************** -! -! SPECIFICATIONS: -! ------------------------------------------------------------------------------ ! -- modules use ArrayHandlersModule, only: ExpandArray ! -- dummy @@ -172,7 +154,6 @@ subroutine add_solution(this, isoln, sp) class(BaseSolutionType), pointer, intent(in) :: sp ! -- local integer(I4B) :: ipos -! ------------------------------------------------------------------------------ ! call ExpandArray(this%idsolutions) ipos = size(this%idsolutions) @@ -185,7 +166,9 @@ end subroutine add_solution function CastAsSolutionGroupClass(obj) result(res) implicit none + ! -- dummy class(*), pointer, intent(inout) :: obj + ! -- return class(SolutionGroupType), pointer :: res ! res => null() From 124f550ad4ff953bab4056f3ca3468ba183b83f3 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 14 May 2024 19:43:34 -0400 Subject: [PATCH 156/199] ci(docs): remove outdated script, update test step in docs.yml (#1798) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * autotest/build_mfio_tex.py is no longer used and out of date, remove it * distribution/build_docs.py::test_build_mf6io_tex_from_dfn instead — this is the script used in the release automation --- .github/workflows/docs.yml | 4 +- autotest/build_mfio_tex.py | 207 ------------------------------------- 2 files changed, 2 insertions(+), 209 deletions(-) delete mode 100644 autotest/build_mfio_tex.py diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index a7b3199d01d..d700b05ca30 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -87,8 +87,8 @@ jobs: run: sudo ./install.sh --all-users - name: Test building files from dfn's for LaTeX - working-directory: modflow6/autotest - run: pixi run pytest -v build_mfio_tex.py + working-directory: modflow6/distribution + run: pixi run pytest -v build_docs.py::test_build_mf6io_tex_from_dfn - name: Setup ${{ env.FC }} ${{ env.FC_V }} uses: fortran-lang/setup-fortran@v1 diff --git a/autotest/build_mfio_tex.py b/autotest/build_mfio_tex.py deleted file mode 100644 index 04c79d8e969..00000000000 --- a/autotest/build_mfio_tex.py +++ /dev/null @@ -1,207 +0,0 @@ -import os -import subprocess -import sys -from contextlib import contextmanager - -# base name for mf6io LaTeX document -base_name = "mf6io" - - -@contextmanager -def cwd(path): - oldpwd = os.getcwd() - os.chdir(path) - try: - yield - finally: - os.chdir(oldpwd) - - -def test_clean_latex(): - """ - Clean mf6io files - """ - # do not build latex on osx - # if sys.platform == 'darwin': - # return - - pth = os.path.join("..", "doc", "mf6io") - - # remove existing files - files = [ - f"{base_name}.pdf", - f"{base_name}.aux", - # f"{base_name}.bbl", - ] - delete_files(files, pth, allow_failure=True) - return - - -def test_rebuild_from_dfn(): - """ - Rebuild mf6io TeX files from dfn files - """ - # do not build latex on osx - # if sys.platform == 'darwin': - # return - - npth = os.path.join("..", "doc", "mf6io", "mf6ivar") - pth = "./" - - with cwd(npth): - # get list of TeX files - files = [ - f - for f in os.listdir("tex") - if os.path.isfile(os.path.join("tex", f)) - ] - for f in files: - fpth = os.path.join("tex", f) - os.remove(fpth) - - # run python - argv = [sys.executable, "mf6ivar.py"] - buff, ierr = run_command(argv, pth) - msg = f"\nERROR {ierr}: could not run {argv[0]} with {argv[1]}" - assert ierr == 0, buff + msg - - # get list for dfn files - dfnfiles = [ - os.path.splitext(f)[0] - for f in os.listdir("dfn") - if os.path.isfile(os.path.join("dfn", f)) - and "dfn" in os.path.splitext(f)[1] - ] - texfiles = [ - os.path.splitext(f)[0] - for f in os.listdir("tex") - if os.path.isfile(os.path.join("tex", f)) - and "tex" in os.path.splitext(f)[1] - ] - missing = "" - icnt = 0 - for f in dfnfiles: - if "common" in f: - continue - fpth = f"{f}-desc" - if fpth not in texfiles: - icnt += 1 - missing += f" {icnt:3d} {fpth}.tex\n" - msg = ( - "\n{} TeX file(s) are missing. ".format(icnt) - + f"Missing files:\n{missing}" - ) - assert icnt == 0, msg - - return - - -def test_build_mfio(): - """ - Build mf6io.pdf from LaTeX files - """ - # do not build latex on osx - # if sys.platform == 'darwin': - # return - - # set path to document files - npth = os.path.join("..", "doc", "mf6io") - - pth = "./" - - with cwd(npth): - # build pdf - argv = ["pdflatex", f"{base_name}.tex"] - buff, ierr = run_command(argv, pth) - msg = f"\nERROR {ierr}: could not run {argv[0]} on {argv[1]}" - assert ierr == 0, buff + msg - - argv = ["bibtex", f"{base_name}.aux"] - buff, ierr = run_command(argv, pth) - msg = f"\nERROR {ierr}: could not run {argv[0]} on {argv[1]}" - assert ierr == 0, buff + msg - - argv = ["pdflatex", f"{base_name}.tex"] - buff, ierr = run_command(argv, pth) - msg = f"\nERROR {ierr}: could not run {argv[0]} on {argv[1]}" - assert ierr == 0, buff + msg - - argv = ["pdflatex", f"{base_name}.tex"] - buff, ierr = run_command(argv, pth) - msg = f"\nERROR {ierr}: could not run {argv[0]} on {argv[1]}" - assert ierr == 0, buff + msg - - return - - -def test_pdf(): - """ - Test if mf6io.pdf exists - """ - # do not build latex on osx - # if sys.platform == 'darwin': - # return - - pth = os.path.join("..", "doc", "mf6io") - - msg = "mf6io.pdf does not exist" - assert os.path.isfile(os.path.join(pth, f"{base_name}.pdf")), msg - - -def delete_files(files, pth, allow_failure=False): - for file in files: - fpth = os.path.join(pth, file) - try: - print(f"removing...{file}") - os.remove(fpth) - except: - print(f"could not remove...{file}") - if not allow_failure: - return False - return True - - -def run_command(argv, pth, timeout=10): - with subprocess.Popen( - argv, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=pth - ) as process: - try: - output, unused_err = process.communicate(timeout=timeout) - buff = output.decode("utf-8") - ierr = process.returncode - except subprocess.TimeoutExpired: - process.kill() - output, unused_err = process.communicate() - buff = output.decode("utf-8") - ierr = 100 - except: - output, unused_err = process.communicate() - buff = output.decode("utf-8") - ierr = 101 - - return buff, ierr - - -def main(): - # write message - tnam = os.path.splitext(os.path.basename(__file__))[0] - msg = f"Running {tnam} test" - print(msg) - - print("running...test_rebuild_from_dfn()") - test_rebuild_from_dfn() - print("running...test_clean_latex()") - test_clean_latex() - print("running...test_build_mfio()") - test_build_mfio() - print("running...test_pdf()") - test_pdf() - - return - - -if __name__ == "__main__": - print(f"standalone run of {os.path.basename(__file__)}") - - # run main routine - main() From b0712d1450f889605ee4abfb3a85551c46e77aa1 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 15 May 2024 00:36:16 -0400 Subject: [PATCH 157/199] fix(prt): multiple bugfixes, enhancements, refactoring, cleanup (#1799) * reimplement vertex velocity calculations such that local mass is conserved * fix for non-rectangular 4-sided cells erroneously solved via pollock's method * fix multiple floating point exceptions in voronoi subcells: div-0, underflow * add option dev_forceternary to force ternary solution for quad grids * refactor/optimize routine shared_face() for finding neighbor faces, move to GeomUtilModule * switch create/destroy to allocate/deallocate naming for derived type setup/teardown routines * define named parameters for magic numbers e.g. MAX_POLY_CELLS * use KindModule types throughout * use snapshot test fixtures to check pathlines and/or endpoints for select tests * test_prt_release_timing.py * test_prt_triangle.py * test_prt_voronoi1.py * remove development notes, miscellaneous cleanup * add syrupy and gitpython to environment.yml and pixi.toml, update pixi.lock Co-authored-by: Alden Provost --- autotest/TestGeomUtil.f90 | 21 +- .../test_mf6model[0.5-0-prtreltsgl].npy | Bin 0 -> 13781 bytes .../test_mf6model[0.5-1-prtreltdbl].npy | Bin 0 -> 27063 bytes .../test_mf6model[0.5-2-prtrelttls].npy | Bin 0 -> 27063 bytes .../test_mf6model[0.5-3-prtreltstps].npy | Bin 0 -> 13781 bytes .../test_mf6model[0-prttrir2l].npy | Bin 0 -> 1314 bytes .../test_mf6model[1-prttridiag].npy | Bin 0 -> 1314 bytes .../test_mf6model[0-prtvor1l2r].npy | Bin 0 -> 19384 bytes .../test_mf6model[1-prtvor1welp].npy | Bin 0 -> 19367 bytes .../test_mf6model[2-prtvor1weli].npy | Bin 0 -> 19387 bytes autotest/prt_test_utils.py | 13 +- autotest/pytest.ini | 2 +- autotest/test_prt_budget.py | 1 - autotest/test_prt_disv1.py | 16 +- autotest/test_prt_drape.py | 1 - autotest/test_prt_exg.py | 1 - autotest/test_prt_fmi.py | 1 - autotest/test_prt_notebooks.py | 176 +---- autotest/test_prt_release_timing.py | 124 ++-- autotest/test_prt_stop_zones.py | 7 +- autotest/test_prt_ternary_methods.py | 3 +- autotest/test_prt_track_events.py | 3 +- autotest/test_prt_triangle.py | 128 ++-- autotest/test_prt_voronoi1.py | 299 ++++---- autotest/test_prt_voronoi2.py | 8 +- autotest/test_prt_weak_sinks.py | 1 - doc/mf6io/mf6ivar/dfn/prt-prp.dfn | 10 + environment.yml | 13 +- make/makefile | 70 +- pixi.lock | 84 +++ pixi.toml | 2 + src/Exchange/exg-gwfprt.f90 | 5 - src/Model/ModelUtilities/TimeSelect.f90 | 6 +- src/Model/ParticleTracking/prt-fmi.f90 | 42 +- src/Model/ParticleTracking/prt-oc.f90 | 2 +- src/Model/ParticleTracking/prt-prp.f90 | 52 +- src/Model/ParticleTracking/prt.f90 | 11 +- src/Solution/ParticleTracker/Cell.f90 | 3 + src/Solution/ParticleTracker/CellDefn.f90 | 31 +- src/Solution/ParticleTracker/CellRectQuad.f90 | 92 +-- src/Solution/ParticleTracker/CellUtil.f90 | 32 +- src/Solution/ParticleTracker/Method.f90 | 23 +- .../ParticleTracker/MethodCellPollock.f90 | 17 +- .../ParticleTracker/MethodCellPollockQuad.f90 | 100 ++- .../ParticleTracker/MethodCellTernary.f90 | 650 +++++++++++++----- src/Solution/ParticleTracker/MethodDis.f90 | 181 ++--- src/Solution/ParticleTracker/MethodDisv.f90 | 230 ++----- .../ParticleTracker/MethodSubcellPollock.f90 | 73 +- .../ParticleTracker/MethodSubcellTernary.f90 | 308 ++++++--- src/Solution/ParticleTracker/Particle.f90 | 43 +- .../ParticleTracker/TernarySolveTrack.f90 | 237 +++---- src/Utilities/GeomUtil.f90 | 71 +- utils/mf5to6/make/makefile | 6 +- utils/zonebudget/make/makefile | 2 +- 54 files changed, 1763 insertions(+), 1438 deletions(-) create mode 100644 autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-0-prtreltsgl].npy create mode 100644 autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-1-prtreltdbl].npy create mode 100644 autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-2-prtrelttls].npy create mode 100644 autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-3-prtreltstps].npy create mode 100644 autotest/__snapshots__/test_prt_triangle/test_mf6model[0-prttrir2l].npy create mode 100644 autotest/__snapshots__/test_prt_triangle/test_mf6model[1-prttridiag].npy create mode 100644 autotest/__snapshots__/test_prt_voronoi1/test_mf6model[0-prtvor1l2r].npy create mode 100644 autotest/__snapshots__/test_prt_voronoi1/test_mf6model[1-prtvor1welp].npy create mode 100644 autotest/__snapshots__/test_prt_voronoi1/test_mf6model[2-prtvor1weli].npy diff --git a/autotest/TestGeomUtil.f90 b/autotest/TestGeomUtil.f90 index fe4117ed08e..3a486a7aa2d 100644 --- a/autotest/TestGeomUtil.f90 +++ b/autotest/TestGeomUtil.f90 @@ -3,7 +3,7 @@ module TestGeomUtil use testdrive, only: check, error_type, new_unittest, test_failed, & to_string, unittest_type use GeomUtilModule, only: get_node, get_ijk, get_jk, point_in_polygon, & - skew, area + skew, area, shared_face use ConstantsModule, only: LINELENGTH implicit none private @@ -23,7 +23,8 @@ subroutine collect_geomutil(testsuite) new_unittest("point_in_polygon_irr", & test_point_in_polygon_irr), & new_unittest("skew", test_skew), & - new_unittest("area", test_area) & + new_unittest("area", test_area), & + new_unittest("shared_face", test_shared_face) & ] end subroutine collect_geomutil @@ -358,4 +359,20 @@ subroutine test_area(error) end subroutine + subroutine test_shared_face(error) + type(error_type), allocatable, intent(out) :: error + integer(I4B) :: iverts1(5), iverts2(5) + integer(I4B) :: iface + + iface = 0 + iverts1 = (/1, 2, 5, 4, 1/) + iverts2 = (/2, 3, 6, 5, 2/) + + call shared_face(iverts1, iverts2, iface) + call check(error, iface == 2) + + if (allocated(error)) return + + end subroutine + end module TestGeomUtil diff --git a/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-0-prtreltsgl].npy b/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-0-prtreltsgl].npy new file mode 100644 index 0000000000000000000000000000000000000000..3fd761ae331ac7fd6425212f3d9fd1cb608e0769 GIT binary patch literal 13781 zcmbW733ye-6~_Y!i(v~1O9&ynyayye*dZhYxWjspCt=5cB4ncv4N2zZp#%Z3%0o)6 zweAaA_oWu8r3i}qE-s+9s8o$2SX`>2LPgNd+&eS(oSfTyDbMedo0s=~Ip@rr|D2gQ z*A&m6F>7IqgbQ0-oKsO*S02q76F4U~=YrbGXii=rXYBHVoc?(M@kU*&7QL~2MMV{U zqc+;;6Vcij{zO%2J$|FSvZ@hebxn08{!Cr0G`6x1zZb16t*fa<@5Q2(RpMRu%gdD2 z?%&rxt#ZDge{xOHKdnZ;t1eyPfY!{+>AzTnVOdQy7A>t_QWLEZaTybsT3S_CDc-M( zl-5>?pL2&549yd9S{wL3U&-qe%d1zesI4DdUK6bxykcclYL4-*StkIVFPbDsYMx2+{lyW@K(9u7UAt1cx&~^idcPZWioH$eNh;n z%-e3dVk19e4o}VvCziBGNJv=2+ZE@QB#9?E=DfZ8C`Oxia31A2^N#ML7-8PYeH3HM zQ`|=}s=RYaD?wN;$CIbJ&vGPrT1gxEzB`7zi~Ey1dc12%Tk$(RZoHdgPK zoqy|j59i<2Jj3~Ga%6bV7|&eGd*w#jN7|IMlz*UrXGzC;&*1^>*jS!jTwFZ;7x8lb z7fy)rU|BdJ&O?z7kwCa@ocD=z6b~tJ-Z#=oJfz2YzetLB2*i0#q_cR)jq}_{s(2V0 z=lvsT;-MhU2SmDv2Nvf8BVEPAv^dX;bW?^bE8v5qA%o}eA;ORdHDPF3cvhSbi*%0+ z375qA@JPCNSQ_UeB0a=IB+f@hGQ>k|oR5n1RMeRTJYP~r&*24<+73Hr#du*^cvYN_ zSs7k0W`PJ#QQ4-&d~B|q6Y#$T@l%3rHHeUj7kJoplYHH5v)~BlWqws6Kgh?$_;^27 z3-dYK`Xnj+n%M61ZEN@W>wY{C+$UJ_yWr161jfRcc427}#Qb1y?XvpgX}0y!l`}so zs#s*RfJ5=Dl^BLGT^nOq(kN@qS64@DYhS-3tKK>Fz0ERxFcUDQH^HRrJ+ySfrqQ;w zKjZc%FMN5s&C-1^6EUVg!Sr}E{NjCI-)37M3g3i-HtXVpnS?PT2qt*n*IOPL)X}yM zUUzBhJ|7IRS&9#4GRBM}m;vWL)OJ|EBewOq<5Qu{WFm@}8BH1DDHvlD%#gFreC)hY zmTi5bzRjeHh!?_4#h7UXGknL(+Y3ulZ0mbx{#;@+2hs>*W6T_aDNGZSZ`}#-ZOzlu zT{<-lW9Aaf*gozo_I%OaLCl#LvzTDU-zt+J1S0$S4bFT0|TehE$FvS=ngc}P5n^F`M$vF||gH{X}o0%9>PBB}Q%ow%O z`UNqwFs4FaT7?sh!8V)HEX-^V)6x;<|0&3?7(rg5#!xLjrj*=zUn=_ELm<{*-ps=oA1xNzCv;25mYhF*J^&*RF!M2nYH{Zt?iyts z`EJLQJ6?ST%tL@#fH72y(}i#fF$c2M?GtkAUpuG2xF)g z=k0vw)OS0kdLqhNZwows%RL8CY|g=$Gl?}L3TA&Hgv(~F{F+&czt2#Up-^ zODw}%2Y=> zM)Z)Xk;1gM39gqdej|YHvVEX+EW2hD%mzpPq;_yzDT!94Vg{EHwV|=t& z7LW^)yjjOGr^)iG3}KdIOgA!%TS;3|YXnBl;o7_XCH;Ji2@p)Gq*UK%TgOwYWqkyu zGl?@1T(B^ zvs}DAUyOG!892s-31-Bn%BfV970j8#jf(v!#!xLDxpjdkU{?YyKIQC;7NFSFVGPyc z(Lp&v&w*KYT;zrXL#JXGb2f3RFk5cMdV(C#SphLCF{XrKCTNV_0{d+}F2oqB#bXw_ zWs;}GS}~wC7hw$5;-X$Mm-Ya)I#97lE~F?nt1yOYaq}?s9ww=2Eq+f)FblpWU#}x; zR{LR~79WvStk^SHhh!b`)=}UcNX?5ehHCLKXU8feQx6ae%#K921ztebtihP}jR)L1 zp|sOF>g1N#SOwf{K$x`{L$x?r$&7W<*;iR$9s;MW_L_-mi|Kn}vL0gw5=>yG(oTIe!Me;+M=`*uOED&oV%}Bb+*Y3^`K=7U z#+ZD9$?c#viJjzr{EH2q48qu4hA~u&b1zqi3n^-xndU*vDm{jy@Qwy z7&DPzhB}q~JRzbgvc4-r9AnNRnBlve-Mc5EOpiRYW+TSTAefP7{PbDX=E*kGvyQnj z!ly}BU<}pbk;mMl1n;=-q?`fYK8SK^6UI<2&flWcFQ7)s!IF)}u_%!Ky zk=R-vv|>QaW{ja)Ji1;kW zJJZ;!0L;ikYi_}q$)}0A6=RACX5{1Uw#<|@Cb^(BTQFwkX<}}}7#}Ux<+YI+KP|o; zV-^u>@|%VEBgRlIZXV_i57WA7Ek3BvC_?H1hWJiD4Af#%7weF);DhcZ9>m;*F;t69 zU3{vkqmH{VhG?;=i_LUl*;}346C@P(U<}n_T^E}iV1adRZ3>;b7h^h-0XKDVJ9&{P zPp1MtvUMNEP%SofvDOEcwbrdMpf&enOb=p>sf*JdRtJE7E5idAL$x@d>ta(v_S_}c zV|=vwAjb3|)|k3DU4?|DtMg~*)Sob>FU9D(Sby7hfq4jHh7gRYi?uJlE5n~LhH9~? zi*;m~jx}^@E5?i=)|k3jkF)P(?ZX&Dwb<0fde$*L51}>NFlGv|#?-|+2TWE#%wI5u zYO$${bw)CG;Bl4y2*&tmv961a7Hh?T*8CM?s1|z#tyU|oUl6k$W2hE45A!z<)23-H zKCG_nSjgw@ZigQRYOy&l*1oV%AA0ceD8^7N*5}1$fLQQaxAy?XW+%oZl6jM)&Wl+a z=YY1z|HNb$#!xNR=f!5$v21xmB(AohHIHEo)na{KY*LA3_fqHC4emsgTaU*vrW0{W zpBEc_U;)wO5q|N0WX*1jNg)_>Uffj~;kz&`iic_2 zv=$%H=fxrQ0Ihk|4+FK>^igEanYPj1r_4zlkwai*+A` zr^VR~)SA5*L$z4hj-=y zG5^3As>P;{B3oYp`f2fgjG^cQWUB#Ve6(2g z7n^ZrA?IvC^sxfW#~4GkSoas3S;s;)b?Ot0p<1l_i#-tyb#m{|pfv|ErZt(xy1&>H z(V%YK15SO4F>MG&_ZNF28kD!{vE3*(hcKos!RY>CmgSC%|JLI$#!xNR{l!LtS+;EV zi*7^Ke1U`!UV#`G5l7c{=_0weV~#^e%= z=`YsfY(^eh^99BXCm7RT9O@)n_IrW83}DTd7(=z#^cROz1BA&6Xw6p`L$%oS7l$rV zU1|FI17iM-F;t69f3emF=1xPb#b09#)nd~a9MWo~^$S|_4aQI{ZXV{_${0UdHu%3a CoNT%P literal 0 HcmV?d00001 diff --git a/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-1-prtreltdbl].npy b/autotest/__snapshots__/test_prt_release_timing/test_mf6model[0.5-1-prtreltdbl].npy new file mode 100644 index 0000000000000000000000000000000000000000..164c82d992073391e4ac908717942cfaa4e76ee0 GIT binary patch literal 27063 zcmbW9349bqzQ-pJ4g*3UfZ?8Gz=Zn_H&a{=8aYJ8h$sXIJ19qb5)@Dr52CKRu8X(g ziO2eUtk35|UEO=vW8HPV_IdDhSZ>U!X@s9V)t|6kWX|EA;Eem>Hf%zRT-UG=Sh zSJ(Wv&pUqZf)fi8rx%=Av9hjVMXq8}@}$a&)9UMT6+@F1Q&vx?7&J7gUubBoXD_T? zyK)VGp+48_9l82O{*E=ZoA?VW>ee)aY+k>vj=!g&v9@tT1Ai@7SKF|D9eb@YSGPvL z8hm(_Ep_ns>8FkU2k57uDD=~2_PcepYkkmJ^D73Oteaug`dnkKcHPqTxs|$ICMA!k zUDHsfUvJ3P*4OEuE5}rg9ID%COES-+Xlv^g>o%;d-!y#1`dr=cwHwwnuCC4HYBv=v z&DE_~zpkM%w_!zNk(UVGRis}Ge(e=hC$@R5W)>{>T3_fDF7(<|Ru|087Hsp{+PAK3 z+*DszlFv5`m%amYT9VRYI8xouEDvvlwL_qJM(&Q5xs7~Pr>E$y4SSV zzoQH1_3(?+=pE+&yU{E4|J~&E^#9%L_45CkxintyMz7BnuWx0xW42vQEAs~?c>PSp z`Y-g7RIw>u*}Qr4j`~&~{{N~Ijb8ck>O_;5${w0cR=02R24p+wlj0_CV79Y9DQ)r& z&lc;GWRq8s?V?XAo4m?wSA83%wD#AX!<2k;|(WG=t<*3C0{`Nb!DQz~_*VE-lbPl-%= zuWmAZI42KZXO8PLs(g%p;8!)~jo#EoZ(0>e(f1i^{KYrQ#zfE4bIHQt2B`mGMD30mg9HR=yrO*1{ zifktR?BV-1zVP*@8Pz8OGo54l3rz7dZ!MdC@%T*o#a=i6^7JPj$f(i?%nXhhBrrW6 ztbXjS4{yq(U(xFu2+S;wnJO@Y zm)zTa)ZzOw>397)P0T1W5cPqpX_|O8$7BR%#L-9o{FHI&O!_1HX=N;;4~98{W9A6V z=-p2|FtMgMlm682Kj&nW4{3(UaLhu1nOLGb-`QU|pC%r4cT=f39CNI|Oc@aL;;=4M zI~Q{#$DAxM({40_Amy~|yVv;rnYGPP9CM1mOrN~1-$Tc|?_6iP@@{FWIcBNA%-E&7 z?!+3W*S$uAb#KtvrfrVqm}LSp^QoD--wkxez>7sw>u-Oth*fGX$J7eUtlK)8j^m8T zXM0>Yq*ceG7-k;FXmN8A`NE=~?AWOJn!Mq#u>@#(k5Ti;M!B3*ne$H2wF>^H8`!isnC zaU25|6GpXZ6mUc@nQF)+RQYK1N;Y{A7Ra12}wO!=Om`^CGs zhGXDjUGU>uH_iG7?@eRUN-J+!Ntot1}+9>b|wf+!dNZJ z#Va@lE)FsG^wE(?g%dfFzg!ou+>_|{aS)Q{ntCrP}#bgW@a|Xx2 z#UW;szHRrC7m`xl57n9P%$Trr+o1-vpT>OraOYXiFTzn?Sz{M!d z7j*YTEgQDAt+<&P&f*xjm@ul1SufGItnn`1!ZC0$FkQAL%+Z32&*m7o7?{#ag1{ua zosV+yIUEBQ1JmnLe?Yh3;;kG57Xy=89dy5V7oW>9a4|4L^a6#x<}JARJdS~jff@R~ z^^M=sx~(H!d_Kp(#lVd5RlHDtI?lxxa12}w%-EiRdBbI!C>L+z7`Pai2_<&wj&*Sp z$H2wFOde<^&8{uD_(G0>i$ly#J+&SCg~r6W_#%#hi-DP%HH%5hTX6Bk90L~vlkQ>f z8Dd@hLym!qfl&kOYEm-jI2lB5u0${47`QmZGzEc4co!e#;!8OOF3uBkS%_&J9~VDw zS1nYz4UpYR{U{3K#>H>b;=&$d!7ukXGtJ(hwTwhB=NP!yz9p0X+;n0Sw7vb14Rn&h zr&%cQV~&A~38ML!g`G{@kIU3=pHV;=yYdWV$(L;IR-99rTUm5_4!{iX+4qaR?<;AZaN*zl^g>X1JmCW z=90zvtyPf;cy`>+ zN^=dzD1jMfZ$0qo(56n?T+1;>3CyT9{aSU9HN=-U3xMdAvH8O^axtU|&VqhlsHDl>1 z$5wk*E;ctctZi=L7`Ql3%&i;~6Boz2__ipF8yCN8A4{cUU3@#oz{NDdq`&l+()D5{ zwQShdw&F%xJ2?g}CX8xBOC5BbBVBw4$H2wFwDr|Fxdj*B$uV#-FeUm;w1b08UbyTi~oyb;NlRom@siJ zzMo^@VqhjU_@Se-hDpY7`^|rI3|tJ%R?wb9LyseQ`Wpvs>d|@JiIk&ur%QxtZg3Um>~j_oNwb;M55gm*zF=tX@0>mLnY=V zYrpoi;|0cWFu&xODuJmy)IP}WZ1xPiw=LA5JEnfcF>tZ{OBq#pfxTrd_FF_Rbr8?R z{F-B?i_(ms)oZGYqT0Eb-*C(fff?zqcps+&THCUbGsAB==4gQ#{jk5oAe5-0EAN)( zcN{ZUV8$NuuXom5GApB~*Qub5_>Py~a|~RJCLX&#*zOQ+NjhM9fO+m}-($k0KX43O z3{2Gy8;K?p{*l2Lbuo`|%!#5>ReN-uW?rpbOn#uS%f&p-F>ox@t-*cE+&lX;9F}+Cf>zQa|~PzOqbeVbBIa=M>s0n3;q|5fs29Z zu`_rCh!GjN!|oZ5fs27jo@Z}aV_p0#$H2wFl-cP7wu)Rad5&Y?VqhwjT`?hdMuykV za|~P@V(hj-d^*y_FK`T849o~xy^eM9UpWRY24>_WvzY#m7F_(l90L~vGx|C681v2+ zT>K)(z{S9fP1)zyu`YgzW8h+7#uW$8RO4OzGRMHhz*IeGBhjQC3>c&CV0eXN;NlST zncdeJ>*75e0~Z4`e!C5?V_p1z90M2UiFq}|w26<4_mU`5)JXOfBhlBQFm7D@fenX4 ziK2E6=5HL+s`+%6{%)AP90M2Izm!p}{R^enwi3bN+{)PZm`eSfV-9Uzn(v5tonsCY zn35B1d;|O8HqR-|8yr(AG5$i9-hUH|d6Q$x1*ZSUc7!8@EVYf~4u-clCM7YnXdR1r zn`4FvOvTVlsGu%Fq#4HE5yKS?NVw99}=a_i{Gxm|-aRtH}6?7XOUVp$b^S>wN9~=W0+wqc7RkZ93%~15_ zw#|nevsjeoyJ0@!7`Qmk()^QSV&YFrC7nEf0B7Xwpbcd%h7g`tJhHlK40TpVKPpe7Z+7l;Z}@yF(#8Mc7`Ql3 z%mI#pi-8$#_5$ezv3M7M%`tFso|tbq1}+9>^m@CCEY`)}atvIYA10S5NF+E3ItFR% zU(ME;Y&e=!&~uoMa|MC~Bj-tKB}kAmNL94{4BtdZIoDc{;N?6?g@Ob%=SgbANNwXI zWw29zAV0=k7|OLh2+0kWv4~8~qss3IzLn<;`&>Igf}^df^j=t6NB%lyn?|m^AVJe0 z(NZ$Hkt*Bee<_O9?hrwOsfmQu)Je?FSWxa@z9ne3J0=tU!OGM@ zkl<^S32VwQWWO!J`kY&)j)K%vlnKkqB|mFs1ebKEAi>%wQ<7GeapT|nVRIM7Htps* z3DN*jCM+(O+U8NEv>0Xonx61;ods#2B+>dZ0bpOZcEy4;LXfb;OqGh7OmbZW2?j?y zVU-!`rKWew)K!osi85iKnJ#`*c%Lf~BzPQU!di1O;U5`AUDPd8H$j>$%7o=+8YCDt zE~&d9!Q&_sR-9?zs-SFqM(80(@OVg~MQ3=N^x~H3FhPRHK?>KMNpPe*msBc9@OYl2 zo`Mt;WygBF*Fi{bpp6A+s#K)MdkYdgP9+G}psAswma=nw1PLAoiI$;NA~-UU9`7qi z@HmmM5{(Y2sEfMSuAd;m;~-%%ng)qV+QPY{{(=OLgM{_ySdS+K2_6RtOVT8hs2hP? znIOUAAYoNH*5l=Z1doG+h3QhdcBEmqol=4XkB1~$n|qp zkg!4>>+!<{2_6Rti`20muMi}793-q$Q-_T7c%>l0;~-(Fng$7mjeG3|2@*UG5>~5Y zJw8~F;PH?|3)Zn7A0kNbI7s1|b)3hC3KBe?CutZXwTq9(-?m@;Qz`ikz})bIklc72 zo1NkD)Bv$-FgHSw;PJhrGurR0f*17j`SL4+oDyy?7%51tMO;8zo>e=$Q7&>u7$r#X zIF(7!u4i;eRc5{_s}mQvWg0C=@Hj}c@fl&0DxTErf??y5rV0`~9+H|b zQLA?T_ZU6aPSXTwfv6oeN0Urc(DFR8PYV(}jxu3?bjoh9$MZV3c1n=o@jOY>1t}&T zkM;PBgOJ>K92=!$Jw8*A;BlIzuvZ!l9qI8|f&`Bf3EQRPJw98I;Bk;>$22-*q{ojC zBzPPo+B6;S@r)qB;~>$#X$;&*kIxY#cpM~bosRYRk%9z|gM{7FrNJo4M0)%vL4wCY z!Uk%RZsa{ewIIRcAYl)6tjCWQBzPPoY@?3#_*_AP$3enQ>Lj&Ol*i`@5I?N9ggbejjBs=Lv!YkMFfTI!$>w zRPch1$5VF0fm=nIn#4 zwOcGmZ3KxDbf^;A(S{p6TW%ANpCm}|IBG{ZIzo?^?UiL(B1rH!NR*}n;iW38@}Ebu z+MO&&T}16DQwOB0k`eLvDT35hkcQHB=RSUVl}^#m5ta&4A3;LCj%30=^iKJ^%@;rh zvDz&Yq`s0wDLaxAY$g$!8r+^)D@YZBgsdH9RsPeU@QJBQS}sWNIIbNMca+ih9BE0* zC9M!7cswLg?hfjZs$@p61=J<26r?Glc1Yhrg9O9ICDjSi5rTva9yD+JBbxtsueUAW>!ybVx;A)FrJG zBzPPoO70Qw@%4fPkAp<{J>orHFG%n>NR;9u-s7Gi!Q&uNmXCOk=L88J2MLKjVm;m< zNbopF$n}v7I#jgB8wCj-2MOsuVm-b=kl=BUkntnd;*!o3BzQa| zQ4Ww;kDnz-@OYl2EsS(Xd_4ZX{i35v*%P;RXCH**#^XpH9eVt6KaCoj@6Hhp%U_ARH>fKKf$5Ttg3MCqhM`<9z56pfFvcG@OL z?FET4N~?Ye|8SBlIAv-QBzWAuE2Ai>v`YFQJ)4(N>Mw_Mp&*rrG9j-t0f2N{{31bu z$5AGvmWJu5nl9;LLFy;UgzVDgi<*Cv(5c-I1*uYykYJiFKDvWjrb`5Av>+kJbgFZZ z(H33QC0!~=@HpBDX{J;5JLVWRF6lBsg2zEZrs>ofHYXl!rgcd_5+ryWBqWPgA87s%gt@?7Ll% z;BlIz(v*8zC4xi8;}IUeQjp+rA|d^ByvMH+BzPPo%0P_{8R_w>1qmJpiIPxbkfX@Hj}wNlgGCUDAz$1doG+wA8U4-yulwI7rA$9qaL%1PLAo3CXGH;-fpbwYyo6 z;BkZ>U!X@s9V)t|6kWX|EA;Eem>Hf%zRT-UG=Sh zSJ(Wv&pUqZf)fi8rx%=Av9hjVMXq8}@}$a&)9UMT6+@F1Q&vx?7&J7gUubBoXD_T? zyK)VGp+48_9l82O{*E=ZoA?VW>ee)aY+k>vj=!g&v9@tT1Ai@7SKF|D9eb@YSGPvL z8hm(_Ep_ns>8FkU2k57uDD=~2_PcepYkkmJ^D73Oteaug`dnkKcHPqTxs|$ICMA!k zUDHsfUvJ3P*4OEuE5}rg9ID%COES-+Xlv^g>o%;d-!y#1`dr=cwHwwnuCC4HYBv=v z&DE_~zpkM%w_!zNk(UVGRis}Ge(e=hC$@R5W)>{>T3_fDF7(<|Ru|087Hsp{+PAK3 z+*DszlFv5`m%amYT9VRYI8xouEDvvlwL_qJM(&Q5xs7~Pr>E$y4SSV zzoQH1_3(?+=pE+&yU{E4|J~&E^#9%L_45CkxintyMz7BnuWx0xW42vQEAs~?c>PSp z`Y-g7RIw>u*}Qr4j`~&~{{N~Ijb8ck>O_;5${w0cR=02R24p+wlj0_CV79Y9DQ)r& z&lc;GWRq8s?V?XAo4m?wSA83%wD#AX!<2k;|(WG=t<*3C0{`Nb!DQz~_*VE-lbPl-%= zuWmAZI42KZXO8PLs(g%p;8!)~jo#EoZ(0>e(f1i^{KYrQ#zfE4bIHQt2B`mGMD30mg9HR=yrO*1{ zifktR?BV-1zVP*@8Pz8OGo54l3rz7dZ!MdC@%T*o#a=i6^7JPj$f(i?%nXhhBrrW6 ztbXjS4{yq(U(xFu2+S;wnJO@Y zm)zTa)ZzOw>397)P0T1W5cPqpX_|O8$7BR%#L-9o{FHI&O!_1HX=N;;4~98{W9A6V z=-p2|FtMgMlm682Kj&nW4{3(UaLhu1nOLGb-`QU|pC%r4cT=f39CNI|Oc@aL;;=4M zI~Q{#$DAxM({40_Amy~|yVv;rnYGPP9CM1mOrN~1-$Tc|?_6iP@@{FWIcBNA%-E&7 z?!+3W*S$uAb#KtvrfrVqm}LSp^QoD--wkxez>7sw>u-Oth*fGX$J7eUtlK)8j^m8T zXM0>Yq*ceG7-k;FXmN8A`NE=~?AWOJn!Mq#u>@#(k5Ti;M!B3*ne$H2wF>^H8`!isnC zaU25|6GpXZ6mUc@nQF)+RQYK1N;Y{A7Ra12}wO!=Om`^CGs zhGXDjUGU>uH_iG7?@eRUN-J+!Ntot1}+9>b|wf+!dNZJ z#Va@lE)FsG^wE(?g%dfFzg!ou+>_|{aS)Q{ntCrP}#bgW@a|Xx2 z#UW;szHRrC7m`xl57n9P%$Trr+o1-vpT>OraOYXiFTzn?Sz{M!d z7j*YTEgQDAt+<&P&f*xjm@ul1SufGItnn`1!ZC0$FkQAL%+Z32&*m7o7?{#ag1{ua zosV+yIUEBQ1JmnLe?Yh3;;kG57Xy=89dy5V7oW>9a4|4L^a6#x<}JARJdS~jff@R~ z^^M=sx~(H!d_Kp(#lVd5RlHDtI?lxxa12}w%-EiRdBbI!C>L+z7`Pai2_<&wj&*Sp z$H2wFOde<^&8{uD_(G0>i$ly#J+&SCg~r6W_#%#hi-DP%HH%5hTX6Bk90L~vlkQ>f z8Dd@hLym!qfl&kOYEm-jI2lB5u0${47`QmZGzEc4co!e#;!8OOF3uBkS%_&J9~VDw zS1nYz4UpYR{U{3K#>H>b;=&$d!7ukXGtJ(hwTwhB=NP!yz9p0X+;n0Sw7vb14Rn&h zr&%cQV~&A~38ML!g`G{@kIU3=pHV;=yYdWV$(L;IR-99rTUm5_4!{iX+4qaR?<;AZaN*zl^g>X1JmCW z=90zvtyPf;cy`>+ zN^=dzD1jMfZ$0qo(56n?T+1;>3CyT9{aSU9HN=-U3xMdAvH8O^axtU|&VqhlsHDl>1 z$5wk*E;ctctZi=L7`Ql3%&i;~6Boz2__ipF8yCN8A4{cUU3@#oz{NDdq`&l+()D5{ zwQShdw&F%xJ2?g}CX8xBOC5BbBVBw4$H2wFwDr|Fxdj*B$uV#-FeUm;w1b08UbyTi~oyb;NlRom@siJ zzMo^@VqhjU_@Se-hDpY7`^|rI3|tJ%R?wb9LyseQ`Wpvs>d|@JiIk&ur%QxtZg3Um>~j_oNwb;M55gm*zF=tX@0>mLnY=V zYrpoi;|0cWFu&xODuJmy)IP}WZ1xPiw=LA5JEnfcF>tZ{OBq#pfxTrd_FF_Rbr8?R z{F-B?i_(ms)oZGYqT0Eb-*C(fff?zqcps+&THCUbGsAB==4gQ#{jk5oAe5-0EAN)( zcN{ZUV8$NuuXom5GApB~*Qub5_>Py~a|~RJCLX&#*zOQ+NjhM9fO+m}-($k0KX43O z3{2Gy8;K?p{*l2Lbuo`|%!#5>ReN-uW?rpbOn#uS%f&p-F>ox@t-*cE+&lX;9F}+Cf>zQa|~PzOqbeVbBIa=M>s0n3;q|5fs29Z zu`_rCh!GjN!|oZ5fs27jo@Z}aV_p0#$H2wFl-cP7wu)Rad5&Y?VqhwjT`?hdMuykV za|~P@V(hj-d^*y_FK`T849o~xy^eM9UpWRY24>_WvzY#m7F_(l90L~vGx|C681v2+ zT>K)(z{S9fP1)zyu`YgzW8h+7#uW$8RO4OzGRMHhz*IeGBhjQC3>c&CV0eXN;NlST zncdeJ>*75e0~Z4`e!C5?V_p1z90M2UiFq}|w26<4_mU`5)JXOfBhlBQFm7D@fenX4 ziK2E6=5HL+s`+%6{%)AP90M2Izm!p}{R^enwi3bN+{)PZm`eSfV-9Uzn(v5tonsCY zn35B1d;|O8HqR-|8yr(AG5$i9-hUH|d6Q$x1*ZSUc7!8@EVYf~4u-clCM7YnXdR1r zn`4FvOvTVlsGu%Fq#4HE5yKS?NVw99}=a_i{Gxm|-aRtH}6?7XOUVp$b^S>wN9~=W0+wqc7RkZ93%~15_ zw#|nevsjeoyJ0@!7`Qmk()^QSV&YFrC7nEf0B7Xwpbcd%h7g`tJhHlK40TpVKPpe7Z+7l;Z}@yF(#8Mc7`Ql3 z%mI#pi-8$#_5$ezv3M7M%`tFso|tbq1}+9>^m@CCEY`)}atvIYA10S5NF+E3ItFR% zU(ME;Y&e=!&~uoMa|MC~Bj-tKB}kAmNL94{4BtdZIoDc{;N?6?g@Ob%=SgbANNwXI zWw29zAV0=k7|OLh2+0kWv4~8~qss3IzLn<;`&>Igf}^df^j=t6NB%lyn?|m^AVJe0 z(NZ$Hkt*Bee<_O9?hrwOsfmQu)Je?FSWxa@z9ne3J0=tU!OGM@ zkl<^S32VwQWWO!J`kY&)j)K%vlnKkqB|mFs1ebKEAi>%wQ<7GeapT|nVRIM7Htps* z3DN*jCM+(O+U8NEv>0Xonx61;ods#2B+>dZ0bpOZcEy4;LXfb;OqGh7OmbZW2?j?y zVU-!`rKWew)K!osi85iKnJ#`*c%Lf~BzPQU!di1O;U5`AUDPd8H$j>$%7o=+8YCDt zE~&d9!Q&_sR-9?zs-SFqM(80(@OVg~MQ3=N^x~H3FhPRHK?>KMNpPe*msBc9@OYl2 zo`Mt;WygBF*Fi{bpp6A+s#K)MdkYdgP9+G}psAswma=nw1PLAoiI$;NA~-UU9`7qi z@HmmM5{(Y2sEfMSuAd;m;~-%%ng)qV+QPY{{(=OLgM{_ySdS+K2_6RtOVT8hs2hP? znIOUAAYoNH*5l=Z1doG+h3QhdcBEmqol=4XkB1~$n|qp zkg!4>>+!<{2_6Rti`20muMi}793-q$Q-_T7c%>l0;~-(Fng$7mjeG3|2@*UG5>~5Y zJw8~F;PH?|3)Zn7A0kNbI7s1|b)3hC3KBe?CutZXwTq9(-?m@;Qz`ikz})bIklc72 zo1NkD)Bv$-FgHSw;PJhrGurR0f*17j`SL4+oDyy?7%51tMO;8zo>e=$Q7&>u7$r#X zIF(7!u4i;eRc5{_s}mQvWg0C=@Hj}c@fl&0DxTErf??y5rV0`~9+H|b zQLA?T_ZU6aPSXTwfv6oeN0Urc(DFR8PYV(}jxu3?bjoh9$MZV3c1n=o@jOY>1t}&T zkM;PBgOJ>K92=!$Jw8*A;BlIzuvZ!l9qI8|f&`Bf3EQRPJw98I;Bk;>$22-*q{ojC zBzPPo+B6;S@r)qB;~>$#X$;&*kIxY#cpM~bosRYRk%9z|gM{7FrNJo4M0)%vL4wCY z!Uk%RZsa{ewIIRcAYl)6tjCWQBzPPoY@?3#_*_AP$3enQ>Lj&Ol*i`@5I?N9ggbejjBs=Lv!YkMFfTI!$>w zRPch1$5VF0fm=nIn#4 zwOcGmZ3KxDbf^;A(S{p6TW%ANpCm}|IBG{ZIzo?^?UiL(B1rH!NR*}n;iW38@}Ebu z+MO&&T}16DQwOB0k`eLvDT35hkcQHB=RSUVl}^#m5ta&4A3;LCj%30=^iKJ^%@;rh zvDz&Yq`s0wDLaxAY$g$!8r+^)D@YZBgsdH9RsPeU@QJBQS}sWNIIbNMca+ih9BE0* zC9M!7cswLg?hfjZs$@p61=J<26r?Glc1Yhrg9O9ICDjSi5rTva9yD+JBbxtsueUAW>!ybVx;A)FrJG zBzPPoO70Qw@%4fPkAp<{J>orHFG%n>NR;9u-s7Gi!Q&uNmXCOk=L88J2MLKjVm;m< zNbopF$n}v7I#jgB8wCj-2MOsuVm-b=kl=BUkntnd;*!o3BzQa| zQ4Ww;kDnz-@OYl2EsS(Xd_4ZX{i35v*%P;RXCH**#^XpH9eVt6KaCoj@6Hhp%U_ARH>fKKf$5Ttg3MCqhM`<9z56pfFvcG@OL z?FET4N~?Ye|8SBlIAv-QBzWAuE2Ai>v`YFQJ)4(N>Mw_Mp&*rrG9j-t0f2N{{31bu z$5AGvmWJu5nl9;LLFy;UgzVDgi<*Cv(5c-I1*uYykYJiFKDvWjrb`5Av>+kJbgFZZ z(H33QC0!~=@HpBDX{J;5JLVWRF6lBsg2zEZrs>ofHYXl!rgcd_5+ryWBqWPgA87s%gt@?7Ll% z;BlIz(v*8zC4xi8;}IUeQjp+rA|d^ByvMH+BzPPo%0P_{8R_w>1qmJpiIPxbkfX@Hj}wNlgGCUDAz$1doG+wA8U4-yulwI7rA$9qaL%1PLAo3CXGH;-fpbwYyo6 z;Bk2LPgNd+&eS(oSfTyDbMedo0s=~Ip@rr|D2gQ z*A&m6F>7IqgbQ0-oKsO*S02q76F4U~=YrbGXii=rXYBHVoc?(M@kU*&7QL~2MMV{U zqc+;;6Vcij{zO%2J$|FSvZ@hebxn08{!Cr0G`6x1zZb16t*fa<@5Q2(RpMRu%gdD2 z?%&rxt#ZDge{xOHKdnZ;t1eyPfY!{+>AzTnVOdQy7A>t_QWLEZaTybsT3S_CDc-M( zl-5>?pL2&549yd9S{wL3U&-qe%d1zesI4DdUK6bxykcclYL4-*StkIVFPbDsYMx2+{lyW@K(9u7UAt1cx&~^idcPZWioH$eNh;n z%-e3dVk19e4o}VvCziBGNJv=2+ZE@QB#9?E=DfZ8C`Oxia31A2^N#ML7-8PYeH3HM zQ`|=}s=RYaD?wN;$CIbJ&vGPrT1gxEzB`7zi~Ey1dc12%Tk$(RZoHdgPK zoqy|j59i<2Jj3~Ga%6bV7|&eGd*w#jN7|IMlz*UrXGzC;&*1^>*jS!jTwFZ;7x8lb z7fy)rU|BdJ&O?z7kwCa@ocD=z6b~tJ-Z#=oJfz2YzetLB2*i0#q_cR)jq}_{s(2V0 z=lvsT;-MhU2SmDv2Nvf8BVEPAv^dX;bW?^bE8v5qA%o}eA;ORdHDPF3cvhSbi*%0+ z375qA@JPCNSQ_UeB0a=IB+f@hGQ>k|oR5n1RMeRTJYP~r&*24<+73Hr#du*^cvYN_ zSs7k0W`PJ#QQ4-&d~B|q6Y#$T@l%3rHHeUj7kJoplYHH5v)~BlWqws6Kgh?$_;^27 z3-dYK`Xnj+n%M61ZEN@W>wY{C+$UJ_yWr161jfRcc427}#Qb1y?XvpgX}0y!l`}so zs#s*RfJ5=Dl^BLGT^nOq(kN@qS64@DYhS-3tKK>Fz0ERxFcUDQH^HRrJ+ySfrqQ;w zKjZc%FMN5s&C-1^6EUVg!Sr}E{NjCI-)37M3g3i-HtXVpnS?PT2qt*n*IOPL)X}yM zUUzBhJ|7IRS&9#4GRBM}m;vWL)OJ|EBewOq<5Qu{WFm@}8BH1DDHvlD%#gFreC)hY zmTi5bzRjeHh!?_4#h7UXGknL(+Y3ulZ0mbx{#;@+2hs>*W6T_aDNGZSZ`}#-ZOzlu zT{<-lW9Aaf*gozo_I%OaLCl#LvzTDU-zt+J1S0$S4bFT0|TehE$FvS=ngc}P5n^F`M$vF||gH{X}o0%9>PBB}Q%ow%O z`UNqwFs4FaT7?sh!8V)HEX-^V)6x;<|0&3?7(rg5#!xLjrj*=zUn=_ELm<{*-ps=oA1xNzCv;25mYhF*J^&*RF!M2nYH{Zt?iyts z`EJLQJ6?ST%tL@#fH72y(}i#fF$c2M?GtkAUpuG2xF)g z=k0vw)OS0kdLqhNZwows%RL8CY|g=$Gl?}L3TA&Hgv(~F{F+&czt2#Up-^ zODw}%2Y=> zM)Z)Xk;1gM39gqdej|YHvVEX+EW2hD%mzpPq;_yzDT!94Vg{EHwV|=t& z7LW^)yjjOGr^)iG3}KdIOgA!%TS;3|YXnBl;o7_XCH;Ji2@p)Gq*UK%TgOwYWqkyu zGl?@1T(B^ zvs}DAUyOG!892s-31-Bn%BfV970j8#jf(v!#!xLDxpjdkU{?YyKIQC;7NFSFVGPyc z(Lp&v&w*KYT;zrXL#JXGb2f3RFk5cMdV(C#SphLCF{XrKCTNV_0{d+}F2oqB#bXw_ zWs;}GS}~wC7hw$5;-X$Mm-Ya)I#97lE~F?nt1yOYaq}?s9ww=2Eq+f)FblpWU#}x; zR{LR~79WvStk^SHhh!b`)=}UcNX?5ehHCLKXU8feQx6ae%#K921ztebtihP}jR)L1 zp|sOF>g1N#SOwf{K$x`{L$x?r$&7W<*;iR$9s;MW_L_-mi|Kn}vL0gw5=>yG(oTIe!Me;+M=`*uOED&oV%}Bb+*Y3^`K=7U z#+ZD9$?c#viJjzr{EH2q48qu4hA~u&b1zqi3n^-xndU*vDm{jy@Qwy z7&DPzhB}q~JRzbgvc4-r9AnNRnBlve-Mc5EOpiRYW+TSTAefP7{PbDX=E*kGvyQnj z!ly}BU<}pbk;mMl1n;=-q?`fYK8SK^6UI<2&flWcFQ7)s!IF)}u_%!Ky zk=R-vv|>QaW{ja)Ji1;kW zJJZ;!0L;ikYi_}q$)}0A6=RACX5{1Uw#<|@Cb^(BTQFwkX<}}}7#}Ux<+YI+KP|o; zV-^u>@|%VEBgRlIZXV_i57WA7Ek3BvC_?H1hWJiD4Af#%7weF);DhcZ9>m;*F;t69 zU3{vkqmH{VhG?;=i_LUl*;}346C@P(U<}n_T^E}iV1adRZ3>;b7h^h-0XKDVJ9&{P zPp1MtvUMNEP%SofvDOEcwbrdMpf&enOb=p>sf*JdRtJE7E5idAL$x@d>ta(v_S_}c zV|=vwAjb3|)|k3DU4?|DtMg~*)Sob>FU9D(Sby7hfq4jHh7gRYi?uJlE5n~LhH9~? zi*;m~jx}^@E5?i=)|k3jkF)P(?ZX&Dwb<0fde$*L51}>NFlGv|#?-|+2TWE#%wI5u zYO$${bw)CG;Bl4y2*&tmv961a7Hh?T*8CM?s1|z#tyU|oUl6k$W2hE45A!z<)23-H zKCG_nSjgw@ZigQRYOy&l*1oV%AA0ceD8^7N*5}1$fLQQaxAy?XW+%oZl6jM)&Wl+a z=YY1z|HNb$#!xNR=f!5$v21xmB(AohHIHEo)na{KY*LA3_fqHC4emsgTaU*vrW0{W zpBEc_U;)wO5q|N0WX*1jNg)_>Uffj~;kz&`iic_2 zv=$%H=fxrQ0Ihk|4+FK>^igEanYPj1r_4zlkwai*+A` zr^VR~)SA5*L$z4hj-=y zG5^3As>P;{B3oYp`f2fgjG^cQWUB#Ve6(2g z7n^ZrA?IvC^sxfW#~4GkSoas3S;s;)b?Ot0p<1l_i#-tyb#m{|pfv|ErZt(xy1&>H z(V%YK15SO4F>MG&_ZNF28kD!{vE3*(hcKos!RY>CmgSC%|JLI$#!xNR{l!LtS+;EV zi*7^Ke1U`!UV#`G5l7c{=_0weV~#^e%= z=`YsfY(^eh^99BXCm7RT9O@)n_IrW83}DTd7(=z#^cROz1BA&6Xw6p`L$%oS7l$rV zU1|FI17iM-F;t69f3emF=1xPb#b09#)nd~a9MWo~^$S|_4aQI{ZXV{_${0UdHu%3a CoNT%P literal 0 HcmV?d00001 diff --git a/autotest/__snapshots__/test_prt_triangle/test_mf6model[0-prttrir2l].npy b/autotest/__snapshots__/test_prt_triangle/test_mf6model[0-prttrir2l].npy new file mode 100644 index 0000000000000000000000000000000000000000..6f328d88d969f021206a21628f255d0a29ab562e GIT binary patch literal 1314 zcmbVKTTc@~7~O3_Z~-aztGZry(ONE|mYbj?);O^=P0&?CaN91K#$NW@of=vpAtns) z>`(C3_;-9%-+lH~zujq57UF|Ulg^nl-<&z~o&A(tf1Y|JOYh|mTF!E_jyA8p(Y1HB z$6ep(ysd7L)i;wOO>Ksjb+P@6)RQ>EN?oFSyeV2D_btP%&BCV0+Ogw zkQCb>6KNkpt8xay2hfs+R-MSCWgpJfD|4)BTMD!_52ASm+K&zo;CvbsorDcplB6Bz zNa{ulA}@336cE#fE+2Y1!vz5`VdxeRvxSI&m@4!bt*DUq@`PT2y(FQ}X!CfHA@qxt zNDl^#cHC>^27|sG21EY54a5Fig%N+Q!KiaNIh9UL)yFg}F?iV2 z4Wa(wY2DxbwV#Qv$8^^%`|~$t>7TkYfUj6-=z6L$Ig4M4_8v85&T5aMo5vP|)lBR! Ds;XCp literal 0 HcmV?d00001 diff --git a/autotest/__snapshots__/test_prt_triangle/test_mf6model[1-prttridiag].npy b/autotest/__snapshots__/test_prt_triangle/test_mf6model[1-prttridiag].npy new file mode 100644 index 0000000000000000000000000000000000000000..5e4e641da8ff2b06079490095bb66bb9014048a1 GIT binary patch literal 1314 zcmbVKTTc@~7~QrYb-CZK>UzOlq?U`Q6+u7}F>WkP6O&a#aNBM(jlJyI-5QFJ@WLSR z(VxJRiT{UJ-~16i=(oFV%0hgQY0^1!=9@ETzO&zwZ(gU~hJ;U{&vMSNvzELly;tOq zreVo3NnR=>o@^;0_QC}9N z7kbe)h_{(;8njjxV$`L5>A#0~5XqLSC9@XKRxBf4surDsZdrOw+_sEtrEEJ^HS35F z{3?-1e;XlHI7E0oltJVOEornWYDjH4#Fctw&Z(J(h_>cIGA|-}{N)H&(-0LkqJ;!O z*h70#(OL+(nWMvplr}m&=;n+rA5y~T_91199v@Pw=+#3~Eu@YvhI@&yIs(Z{ER(H`g%g&AS-$ZgZ2txPys(TvJ#FYtzE+1qobtA9f=R zsqwHS+)O5uul~^R{#3!it&A#g+-99jQllJqSQmjFj!D){V1(l?>meX<$gG!u!lAG} z0<#=bte-%F;~pCzu*xyb1_`|6h_Ru%k$eL8T_f={X2=M;Xkj*^ra0!+8%t^ii0N^b%$fIsvgi+K<#;&Io`sO z;(im&pQ#FJSdDB@!@RMviu}o`xQsK*G`|1-Rs6cK^3$);I%rO%Q?vCkhh+!Pnz~`q zuUycz)^hJAenijcPSQQ*$>~3J=RvPnZRonHA@wqT8QEKF%3RhSBR9_t2kV*mUy)u| A4gdfE literal 0 HcmV?d00001 diff --git a/autotest/__snapshots__/test_prt_voronoi1/test_mf6model[0-prtvor1l2r].npy b/autotest/__snapshots__/test_prt_voronoi1/test_mf6model[0-prtvor1l2r].npy new file mode 100644 index 0000000000000000000000000000000000000000..cf42bd09def875d49ec807a7e5b6d3af226e5cc7 GIT binary patch literal 19384 zcmb8%34B$>)d28>5WpZ1Sp#7SYZ4&I+ZP16u0f-KxJ8sDfxttyoXLP;4@(|<0JRmh zzDJ97UvS4Ar7CT;^=qxWHA+=JwTf#|3wG|zc}_>~8NM(6e&+HB|4h!DIdkUbCRdNY z=)8%SW@jzVURFG_u3-i%9#wQ%N%7qJI#xWgsCe|8SaIpdBJn~4uQy(pGk@kh^M!i$ zlaFBa-28}nHA~DFX4K9539@wIf;#hK8h8y~)L_2G>S`JmE-+r>tZtroRsG{xIBNCz zGkyOUB>|srq=?gsqW|YxUQ^DD1&ij_FDaj~kkysXUo?-;sbQ>UN!~P8H)G*~2F@1E z;CYaxJ}OVVsQwzVtFoG*&FR^-kh31zPJ-N$s_d!*&Cm`%awcC=UzZ2%^*`&fCP7|FRZewwR#w(>=s3Qlx~;f!=NwK{mtwY|le~2289J*=F~iVBU5dGde03>i z6;7(o6~Y{MKB23+c4rd0RkwFvS91v6)t}VtL67PV;_ou^20i6)IP{Y58=*kHUjn`5 z`=!uFel~YzppZk~70|CFablu6-2}2T{#YKJ+h9&6O-Ui^h#7zRVN{k zC=eIZlMqbw78i*mgc5zkMST*&i9%E-#316T(Mb?<)sE&DHkL!YwyH4+qZU;)i7XJ| zIk|S@6c}CN=7j#QO;uJ^PE}5&2$+1UbPn$Qw({=o%PO5TzB2Z3=Au^N=^PUUc#cH4Tp1DC(> z!V53{m+L!@8-mk0oT1&^s_gTw%lTP=-~IYKHQ>}I60CH>$AQCeCWo^$+|C<*Z|YTJ z>UY0d>7+hIc+_#=2vl+yr{VSl{D*YjnEIOp{B?8xz2|>Y>5M%N9EGzvoTK3m-tfVp z<+H?_fRBn#;12z?AU8ty3IvY%(g!NC5YcoXT?{yOn?eWi1@eZ+o0 zoX=sBhEF8m;a@5^^*xUGTonOw!~wW~!-X2|M8Jawi)@(WrrYjU^Tt4>GyXUu4#Gto zF4k~o0xrBjd8zks#1oGLhu{(p)f(1L5|1TN!nxrR>?aD_)!3|rZK>AT~^h`&+;buM)5BaXrp4pTMUm4FB0 z0!e*>BfhA~4#!{`hv^#bM!~I`vIMiymI{}yO#ytKOYeltm z$ruNGFoVNP4fi16ib_@8(rpmF)Ul2@;D< z2@Urm;888AY^J*-eAzxb9E3R>uF!CSfUoe_qr)<$q6l?-Mh$(6bm( zHh1N@BNv5v`e?DGh=zdJK>|?#4ot&+3ApT#7~lW_A61@HldUQ~1;?O)1J`gr0`}F& zFWgDzy4lvf(y7^Hk8vCpaagS3{sJ!dC_=s+YDY@v;)rVgu_w|7ZLEF57n-p`pgZ9*rR4N+2H^zONXTU5GihsL1iP-#R$;uz3R$ed) z%^Z>%9!9`r+{#$mgLM+kVhM-eK!7W;~0n8#OKqSAv%w@?svaJWjtBMEruiy|pXMOI{L z#TAFGJ4h%5S97>V!({|K?0yxB)M4!C=gKc(9F@nRF#LkUFEw0F!2?yHPkoMAG4BlP z))b1swH$V8xPpL({yqa^*_`*GJ;qVEj>GjD_EGS|IC)=Sy3KbF*Ysu@iop#Wex+f* zfID~;p&?7L9v{Z-e?eb69ETe@q%<5L;6DG5<8xB2m~IQ6R0&O_Ti6F_4!blQB;X!- zsh`W$a87-Wb@IXi*v;W44TlN1=r*$m3Wf2#;`hRKpGd7k0+`Zf{~I)bOlI zXlleEc#Om28a|bP3m8_nH!$6JfqRU)oD4-6p5XALhEF5lo?CG8Uc<@bGgURBMjU~s zIPBB#=>**UVLU3lss`%td+ni!!qXg{(eN1p9^}!mbgMx4W%pnzipHXL)58Gis{GP)fG(3)gM+Pw6j^Yiy#f}{gz#lohpy9I#IM`E+R2)6h9WwBCI~;@; zIs8e(=MZrGTajJj?rypprrY9HI~;;Pb9hO^RRZ>T6rtEo?CA4x&%4rRhr{qc9R8x= za|zi0pt`Y=&c&wi$|gG;fxmKiS;OZM@Q5i2PJOTXZRg4tRj`RA9gV`@IJ~0a@dRA# zW`lc{{s#Nw#{MerC^!bMa(GR{69~BCb+tLC+u-4*aiMDBC^!zUb9h6;6A3u_mYWSC zE4pCWYhYHts1_7fXBOM8TZ?6LF_h{?6Ia>EC}y%cu&I@3V5o=0=eh|IX)*n z7WcfR(j_<3SO^Ys_=kosBH&Y(1Ll#bG-fh5zO7k%p@YxW`j?&U+p6c$s5|WAHJDPc(cf0rzcG z)h%@pL$R#Ix};-q_$P-?H9VPs2OY)J|EFTNc9-C?R_lo4KKP8oVGUnKz@=D^Q%A5K zFSpm@xF0^}@P&piCtzO$^EgMf6VCD``-lVZC5NvxJcWQGFJm5e#yxNOOLjO2Uvv0I z!&3#E@6idx0QbCnJSwcP*W-8y{>9;lhNls5V3}%I((SPEUg35yqVyBhEgpt%Iee$# z=>$Bo1W%^lV-Z^Mm})yII0D~u__u~@2zZE_w(j@y4r98l%vbf3f}?Ph!!Zrl5^%r$ zDio>r@c_AUx~fJL9D^S?%My?KXnO`>_srbseM77j_fdg^1D zmbYGTShe=4zvK40YL{)v_h1o^tmG8yLl9>0e$dTaY*I4)3nphN7+e|?`rV#D1Mz=2SscS;r83K&(6nK zH_3N5`1u4sv@N4W1EvX)_*~j$qfl`W|bo^oQ60$rl-X1Hli8VqbU|4^FFJ zQIkNFVt<$ol>8ur=LA3KWZa|viOXt@3_Ts32pcTS9 zmHaS+Urg|kyYR%*33u2v_MOBZW5tp$G59M9-uXbS+H`;HW!5y>M;~XUk{@pHjRaqX zJzct7^kVJ}h&8*ce89&>NPeWjFA;o>$Fiz=AA?hYC2h?CJMU*@k}o&-r38OUldFkC zVIM3CYwSB=Aiydl?=$#i1RwfARkCzPJhrSYu#Y~-{E`nC{BnX1-lKM_^a)~$-NL`t zvGXAolzhnGR}g$)x~qxcv{$OLHlZ$vRT~Jiu;e2Kzmnkn`KlLAw^gOaS-aiNM_5$y zF@s-4@D=;qN-0L)220x7y>>pz;*uX_@Zuq7&%`Xxe4{%HyUVq$c0R^Vmi%agUrq33 zxLc);;j&uS!Oq9o7|EYv@M{F$$75LyzCpxBJXx9g3^Qk4g{p1D)CPTQtmGYoUrX>s zSjkc!VRcwnZ99$lgMN0ZN=+v0BFVrq}!DWdrtd+ej^ zJjstY_)P>~Jk?#Tg8v%peRI8i^f5L;@)HeyGr

tqOALW8AHpciQ(`H+uYAo&Xoek;M3H(^1}!iw2^$jer=Q5W7t3mmB&HZ{3+Jzpd+}`(f56WrZV4LMY6pNPViIU*)Zb{p!e^?wE=;$mID%dQ95T&d49^y|c8y;=PD;7@-Rto%_-_-s6}tv_JrgKWO!7a08Y z1V8L-6`LO$g!PB*e26WSe7(WnK=4EG#FqLTyQd8Wc0SBN^333WMeu{MF;0Do>ve-; z=Oe5^^4#EWB>0hMsv}kEC>{tmBu`4Ct zXz*!*AB*?6(!FuXZn$4nP-$d|3&sKL3QlDeqZ(L>PLu{?&*BSh8 zDgFVxjq?T8oQ=2G`7mpieA3`=7W}mynKRU<`j6D-xQB22vz?Ey^^)IU@V5~BfSAgh z)Q6d=J)$m%ypKfLM#*n7_*)6ScPYmHZ7gY<2HE)-+bsDl27epDcYhyi&MTNXn`DKi zmsOl?m3)iA-%jwoiZD2D;*(38K;390f)n+zZIa(^@OKb=@65x%?_`3rQyqRN-p_VO z{wjmNQ*5<={rO&4_$`M1Am-(!eX^2KB_|qSS4;gGL%+*g@3{v<^9HsFn-1CaAp3>X ze`)AGhkB^a3()Jk$TN7SdG^f0?l>en0k z9&f!{gDmV$>MvM}H`iEql4yk8AoX7v`n}$I!71+g5hu+zGh^SRl7||5l-(%xl%e0} ztq=VZ>R*Tmxp!SR?@2&weZUn+^UU zg7@`Oqfh5xq2FR}>tg|Si{x)L_=gF;{KucR!|y0Z7G$?c{&s`kOYnUctISEa z$E@G7%g%?`9g@G(;2#nEc8^^!JFfEa#~6{Hz4`ZEufoLqQVrVK zVsGqY5q6K{_Za+R1poMCb?+>dDaBh0?7@k$dnJFL!9Py$`$O1)yo#iA*!_}! zz~G-C_?H)pRpdSclKK4)TW721DyY1Vvj-*rkikDm@c%j;yT8oOC~Vy()|t4QM(}YT zdsy;&4gM)_{$Sx+HMQxEn3!AlT7wh!vqvQVsKM_O{EZ%oS&9#kr}HwgZ?*FQ_L$@! zH~6OszG9jv2I70xKR(Rb(!tIL*%Oj~(%_#V_)>h9C7p#g7F&FFKE$4q{62%<@6Eq= zBy+$1dyIWcwVe;MrzQW4!T*ln?|%{#^Ba85r=`ixN7#PJ|IXl_CHVSw$Y*|+LCdXn zKFXez{Bs8XoY-pJ8{WC*udV64%S{+Dv(gj?+m@H?dW=0U^#g|fyth8(CK2)f{$(&N tN9=l>{a)&SF!Tf7`kWhZO=ZTut;nW}-z>%cDD@Y_|LZt=QM{`y{|^T&wvGS* literal 0 HcmV?d00001 diff --git a/autotest/__snapshots__/test_prt_voronoi1/test_mf6model[1-prtvor1welp].npy b/autotest/__snapshots__/test_prt_voronoi1/test_mf6model[1-prtvor1welp].npy new file mode 100644 index 0000000000000000000000000000000000000000..65df32d7fc8a0f2874b4e6e895599045adfdbe26 GIT binary patch literal 19367 zcmb8%2Ygh;)&TH8s1fO1lqf1e5%z9hid;oqBvK5Dk)k9axIo&O3`mnES<*p84Q&I0 zf{KcwQWR;TqM|&yh>9rK6@{lhAIO_KGwXa~W(L3Y_cJ$3`0wP*nKNbY^2oqD2MoTu zR>H(uQ#+5&F3dumdn6A}={&w58+GoQ+_~4-VCODflgSf>xIlVhZ0_hB`H2Gbx1T@- zSpJEejLGs7S=l*%L#E{CWy?QPh%@knListAol%&dCq0Kzb`E)#{pB&d)$H}--%X-_ zA^sg}O8mPi(x2sJ zQc@GsYb7KkOoNLCrli*)S5BWpBX&u88!o1oPCr9qc1d~|ny^dKx6qVbl3s;o>2--P z*6B}Z&aR!Fgcj-bo#$B}LQD1?>pf_d-hljByx*WTZ4QPu^y?&OOTSKrcJ%8MXis0w z=^3~LLx%_8(v(P}Nd5HM&I<(LGUpfTmJjl$KDrsN_y3Y{a($VEyNQX8Fbda1 zT9OMp3fD$jk&Av&=o)Fw8!{#c*EtR8mImEPLn1Ys;L1!L90e=VCel4MJqqqfTXHcf z3Z6(iauJDwH`1P56hy%nxrD2Og5Y=5KpF%c^&w_VbnK~&7Jtm~iBw0Yh(=)SV zB=kyga^kQ52CT1}nvj~9niwV#qYrUmd-*ecPQ@>dv5WLZR-P1!KVcWfqUFcvx zgfa9JaD6p=>-wbL1uG7PZTk+=%I8}WxW3cie%clX;8qO%1>8Ul5BZA2H~zWd_V0>1 zhHdKtp$I}MhT8<(Pz{gh!()7NJjSlAG`89nhhPAPfdWn<@M>p()cwB$#Ln*T1Yl~| z?$?0y;fO9_+Z7}&zifjJwp=g>!(ahlq=xT1%)S0JBuOMIc(65{XIXGNhBN^;Qp4j5 zIGp;f(}@K3^Hd5#5?cKD|k$-3v^xpMq;=}z|GZgH06Er z*d4ZquI8`ciLeV@D1vY=hEW1;p@xgU=ApQ2OT5foAjTocz>q26mTI`{Wgda_qb#(x ze?O~6nijiVkcDBifLp2IieK0Ow(mZ}t6Q*?Wws8sAREIN0k>Ae^IJQ)0AYLB&%7}A zAVt%upE}qL_hE<#xDA1Sty7~2J-m@7LD(MAoX4bxxoo;UFc!l&0k>7d3tr?A7+J+* z68w<$qOQeW7>^-G!0puV6_VvSECd%eUNZ# z;UE-ZzyiKh4KLqwk`oeQk zj3u-N_PF4F43h-hQ4Oz{$9{2pbQeBAysM2x$Ya4|3{wQ0tcF*ftV`tY!}jPsY}U5} zH?lm@wb%_)F-#NitXQVl$R=m|T5}$I0#Jk@D&VWt@Y)YuERV;& z%NKFiTp-r8nPZ$uK^i z6&F}|dtFe5pk1qsUP=TRRz}KkZSL)L23fsAZc%i=#?1p(5 z<_q{*0&lK4Kwcg6EEx}EbCcJJjSJgT+c>1X9(V}D!vgNAhSw)#u~|CrH(uz2PIi!v z)a0?(3y)w}AmHoN@P^$yv;_@#Rs?*;dhGSVqZl3&a5pu)X~!m~g<-p3IWL=@@y1%= z^~2*Bss!Afz&|-LmUjR4>!rNK(2Xus$Ud)!^GZ{-p$Nc242uNpQp1}+;k5#u5!f`yt-a-}=O(=X8EXVMKfW2yX`$s$!IKE)<(K?!> z>pY(uR$y2uV4oV^@&2c*y5W^P#(r~*eI9rc!&3tG6ZqSj>9%u89_=c7!YGyuw)-iT zfVxn4VHJke0uHF*w|mkChV6-$^8w=8$);Bw?1QH;+)$F_v-l#<@gFSgAU(Z_R>gEf^N6uU>7pxy619UcvCH zfUhU;$2CK7U>V5(XVd?{$E^0)Zu8XScf)!N8wA{kz#D49$F_aK(rs34C&|dsjkf~} zwk9k59@vOslYngkFRmGi<3G%!IbavfcZN1OcZ&qrbghHE@EV5K1$=`V{%ppdY)BVn z@y?5kH&!>l4>n_XL%=tx;iKKIXGN%}2U~C3k;P`%4_h#76>wiQe5At~Hb9D+^8pgs z#hR`QMF6&8*e>9k)bQbKX9Yy^c+N>)DAmW1>8>qhkj;7XwE}?2#)*ESdRm4cn`z-0=`uZ@846GlnQdXJ7*;s zALMk`9-m>X#{m!Q#_)lF`)lAOhiF9YIa_!r#-Cz&rwfG_KE$v`z^NLz@|d&LB`yAl zEi&z#>1=H4U?2Po!(IX3rh!Y2uz}_6vA`23~o9gn&$@MHllH z=PoeA0XTr+pnwOe;RDGzd`J)GWivO8+pP78jr(`#&Hp{;AafK2zP|q9lp<5?2z^@;o~@Z zJDcz{@eR4*G=?+69jSJ^C$oZ9wZxg`$v!$d$~ZBHJn(M}zY6yrwc9Y6j0du;tXj;% zYDe>p<09mR-!S|x+gmB@E;6+2zQj)-8a$+r{l6k zr5&v__nRO7i{Y$rGt}-2N7+nNwUD&ind_o4CqcA(nNR@EVfa(HnQC{zFMPZ$=4X|Px> zH>ywd29kcCS|8vec|lg3Rp0WdB>IDCA7Z&Ys3FypBt4?md&djN?=0MQ^baQwb$bTO zo&hyw5 z=bB2PoL_Xo@LqrS*{RjMfuhepQqs?`D_BNZp`L$yLbUh zPfgESF4TtdZ6!Wm!;i{h^ICN)Hl5kUt5~7b@fK=F`SucDpy7v(VLRpO4)Ne@GVO^h z%Z)Cfd_F6m<|3RVbpq5L%xKS{&?)SjKU#Ln{NOi7w)nPjT0PIBMM%x{mVQBz}s9KXemYM8{6^nXqJ%vF5nls5|9d5{OhOu>qjT9Jd#FDDRc{2Q>V~Z`dM41ZORK9UbpO zKFa$gemdbFuUXPgtXoRDl&nHxXZQxDWQQ>^-F_6Hd{E+NX!vI)^5Fc$_c0|0&50R6 zA>vh^zlIi-xW{=4|7{l=V_LDZA-y(E5?hF?5{%~r9Ke6}h%Yfj7%>P`9U zC4RPspFf(db7G(K%qeYb>{^ct^`X2i@egYFXc>tG**nFYHxgZbTj2|k@%>F zFL3UpBS+t{!+bI<9cB)W7lkR`PvYll_;Eein{Tlr>=?%`%{A5>j}P5S`Ti1Ltl_h1 zV@d0e#$!LzSaUpnvgUC1Y_~~#iH6VU$usBEc8HlXdo6S))rU%YrCPrsk@xH2xPFQa zE=}OQZgdybosZy%gM@i%y;mzfmF#DWV!JGn^{-C%Ao9U8l9aSHARF|~f_G@dg@7;2YAS@LKi<8z_=s2-8@ z$JP2}C46OeBCaoFA=2p<8cX$Yl3u0OJC-{t>D5zw_AXmv9IHMz8c+2cNnfbelV9ih zfBC|xY>RPr^?6V()$=5M5h=kdYS%219cJ>RIm=6M*2l0 zi}JH2ex;iK^89j^_to{t@N(`UD>uF=V)?!3LCVjO_$M{|xn-=@SJ&q=N%=Bk-ur#1 zi1Ja1e@erjz1q=8>>KdiRQWpN^26^(b17de@v8_wzvf2y%m2{Nk`cZho4W1tw~WKe zA3!CPFO~S!8ve{-r^Jw&bBT#+noGp@o!RB=KuC{IN#7^*^z6 zw=43^ydN#5{1Sin^{1prw?LN&HJXz6DRrbMeesV9xs> zs;2xhiC?GTKOey-!}y_e#VT{&htP7$KOyliYxv{zv;L%{HR7iT6&u;kO%t4;3$391 zN{N4k@JkgH^LUa|hzWl&>ruO6H>+(r-a=1O{waxnRl|R_o%0v*np5$anRlaAlwU3J z>oxqRyZB_-fGN;-Y%J|P_*`3yXHMlc#*!BFqZcT@R^ngN@CTin z;he*{^K4mfSN1lZo&^KwMasV<@vm$6{SEoX?JOU)m4nQAA4KaY|FXny*6@4ZBP_Y` zKK2JIHFjkti;}KuL+BOCzbf%>X!t$Fd~fwT%SXEs8#lEf7g|sG4HCaa!+-D=-<>$9 z(+QQu#=H+%Xd~q}N&Hp~zk8sQC?q(iS;E+ri;Q_6a--KM|GLC))9@eAcTAmnPo@=T z30wJ`aViga&}PcNA@SSEt~rrxYvq3n;>*1rKC0+kMOJH-Ta9TS@}ezN-zw=l)cU{Z z$rh=Xf9d;-Ss(JDZB*Yb>2GTEp?t{xrJpb+eaMe?Q2k9w->KA3w3x$Zs=su44~OoP z?^Y;)c2fN(fJZY=*jfA(A~@u3ZY$8 oe^=7qQR~gV_*>4*v)I5=x1Ib$Qs_OZzfb<3jnQuMC9~WA0C2(_^#A|> literal 0 HcmV?d00001 diff --git a/autotest/__snapshots__/test_prt_voronoi1/test_mf6model[2-prtvor1weli].npy b/autotest/__snapshots__/test_prt_voronoi1/test_mf6model[2-prtvor1weli].npy new file mode 100644 index 0000000000000000000000000000000000000000..04b478410b926299a7d1a4eacfe4dac6fb99759c GIT binary patch literal 19387 zcmb8%37k#k{|E44EG0sVEU78Q$izMO+~r)9Q>uxvlSbAthKt$0&peh9A>7Q&ok7}^ zW<*4(lp-Ywl@|S#5~bfy`Zc0{ZAxkVJ=^j0xaT>y|MYrwpE<_+e9!0kp7q|bwBId# z2Mnu|GPTa_9meIAWbwO@k{u#)OqQX4&XG(Amo>HPNLwPwRMTN>TjPmlyQvR36i>mqho$scz zzujBj2a{ zeZCBm)2y`r=U1aSskwzy3W`fR=N6&7&IMEQ@x&a2a!MPGMtQkKg(VnG$;FKzh5u9| zvXK8V)X7R&0CjuT84Ia*LA^mxKRv5X*6sz+K>Xx5Tw0vh2pY=2NQ!R+XO%6y3(g({ zjncDHv+Ja!q|AhK`lV;rBO^NJ(3lU&Y(o<^r1K2t@*$aFXv&9VZlM_;l39i3+4YGq zkm4o3T_BtI}ve!~*#a?GXYqmBz zGtdUZ#j~JodbDx0VRl`*0t+so8+Pd+NOLxYzu=!Il(a||+~Ekq&XEx4K%(s>YcA%#Q}OYn`&8V~~`dQr4XR(1^h(UxQ|CI)7- z6&XZh5Qw%WgW?zjqiuxR-+~ZT!-K%0>N)C$^}rArn>9TKU8iKtAzeV?={B}(By>-w zJ#qTKzMJc3rDUaMrDl@E*q0pG0kNdVch2B2A7nQsuLA}R@QE)2uEB7vgzIM2`A4wb zG70PlvK_XBQ~xR4J_&5Xbr`OfaJ_#D`;x!`=!xM53DyPGcyjtjTml{a07R^o2bw3X0oqL+rN&pYI64}p_J z5r$qEdQ12$cX;qYk-+sQM8!suC@jdr&_}{&yTcmv#lS~jN$I*MBG4B@KM6N- zhw~z$;+vhYeXMd*2OB=&mr(yy64sZ`<`b{*e4R`?Z9Rq&x#EL24WZ_;l}Rp zZhrt+zNVthRTvRIHz9ph`i!LAyt%FUt1;bDYpX(0ee7@oK z09#ZXN)kl?ZpDx-;im3z=|NtfJ%Qy(bFx)2LX72FpaiZeEPU*fR6^CFrh7l5O zPT&m*$76fm5CPx9l1Rz4lk~9>hLIRXN%%Z>IMz%=J9Lg1usJmKeQd#K3}YmGzB|0| zO_A}fOGQ@%=qBj*JR<@*7{*HY0(ZFLZgCLGULyt}QM#tx{65IVFiyf3y2F)wM8(6l zh=Ikk(Dkw3fIJN2CEUUtUi63XZrdoLh=_r%Vn0m45S8#n?(p4HMOO@W;I7^o`%RdL zVUmPf68L1jgoDsMmWXy_D^YqR2^@gQ81g0D${oJ%DbZ!4R)|3;NfbdSz)&dR*6#4K z)*_10wW9O@%UavV{ty&lD3)*=cX)Y*fX8eV14Cq@o4hap1|;E&-Qg8yvjQ{i9B1;b zVwI2Awwnbd7_fxf5*Q^OD;_Bk35+cjlh=t>uHWkZ_ti{OB-|@wlM^4zgEm#-<-`$1qdE zm$}2M-xJ=rlVT9|&e$|z7KS?{e7QTkwz-(IJg41E5wfN(@yJzRDfm zxJ^vn=uO{%ziF@AWP694$CnnEiZIYrp&ZxeF_F4nh{4ME!w2 z5Q6(LJRspN?(mj7M4?58xMzpiCg|HO49hS)C}E#F{8E1!G0C{t$vDW?q&-UqEO-dR zatRym@Yav!&`b&JTz2}|n)DS%;9(5a6801LTRM5lgAjXL3sEufn`zQ+Y)#t93;Li2 z!wLzT?(i$ui!OupBI95mKF}P5f(AT-VWorv?(p_p;h{ES7Ohr%RXW%Yt1vt&;h;PG zYDiR!Vj>f3BVU6KHeoe}H4+XH_(E(7(SNp0C)Ja;rr=iW!iU67L(V(I||DOpI|s7;eiD1m6-97f`hC+dtR!5{oa#j z8Sp8Fe@S={fqN!K@%dA6QX!eMd5Z*`q>n8>{2Rkz2@iIMzgQXLQOv)VzLHFm+@xD3 ze1_qOgohA#C9PP!qW`jJ3y)&H^H?^?6}=UJ&oTT*!nY834c(Z%W;=8Qj2;qx_o!;qL-77{s-my5HejP^&^ z@s}t(((tpsCT&hG46B_dPvym)eQyNNrHoHg_!13Yu+-@sXKFpqC5911moffwg~u9x z1h3Vu{+E-zcp#?>CxqHD{tAVkqT&0BtBvY^JJ~Py4kwJRWPE#tpQ_=nnJKdWjD|$^ zuk!VLGj!Ekr~~8E6@HqA?|7JMWNME%*}upKIzECrGX5%spH4pKxi8^X<;xbscso{~ zE`GOXHhv%K#PkeBFLl=&tPr)Ip4bC)f%a7BH_+8g@2u!ET=k$^^gS$&_!ZC8j-6X^6H3Nk&U=y$m5n?#>izw6YV##f`$LnzF2OVMY$>rXTjvnnoY z>G+`*yw&n!U*kqrOb1S10>q29;}>}LWxzz_m(WOG-lp)2HGGR=UVV*tc4x=g zBL(f%d?0{^Gk%1^FVXPLFXqR}nmT+&?YQTIF(VK}BN;zR;qTV)jT;NTE|1)f_wYPe z20~~w)k45KNG zpQ`ZH8h%?d!Jp(s+wm{y0)6%tn#TC)3SXn)Ul>M0q32rXk#5}kZYmf-rHr4U@GCU@ zhW0E9yZV?2r&1gpG*cV$q1zchQ{f-c@ayPJ0)4#lxx=4F*Qd=sWT07$zeC|yYWUT; zlqLKTk$t7-8#qSDk7hG|j>50f@Q<`}cwV$!>3v5PGSOVd->LAAYWQV`L^wxy!`PMH zw^X43n#cJ03cp&z-|O_fbM;->+dKOpTEO_2!mrWrOB;*oYn|$|`6TE%Cxq@|{6d9) zOv5kXm|gvqI4D$3;4P%%!>Ek$4ivTjc4{@ z11(|v-3q^6!{5g?^F1v z2>-Cl*(!EWRDZ4$j`xGVZ~)!U_y-jJX$?O=PO_k%RA}t*`#tyCa1bqH{DTU=LBr3z ziE4yz#8tcU3qA?D&IzH17{6TMpV9EM=oJEcN8RCn~H!ntFFm1Us6y>@6Q! z#rQ`R{&@{wd`x6t$Kf+Pv$qVin(=ECev^hTJjMCyzj)DhRfG>T*;{_}7~|I}{ALYb zAd0U3Q}lgRrf2q+iPkaxafN?D!%r%vEV)u}o`_Tp;Vq=AK7gKJ{Cb7oqT!>fXt9L< zRrGyTu6Ol8^d#e-Qur4&eBMdQ5?;J1Ygc){OJ#-7(~RGs@GoijTvjaMolDp%?{}%J zFnWgZ&no;@4L@d+sNVUcMpfK9dkbx3{BsKbvW6e+WPgH3ZdX0zoqYs7&-hIWzfHrB zDxn$)=SOF1*LqeT@uAI(e?j42(eR@WlD&vt-#fpRRkhi(`iOzHF#bh_-%g%0CVsZC zcFb~8D?OXAor?5-)h_Si{pcm8Z&mbHHF_G~sieNoyLJ=3%=B%FzQbJ~y^~^pul=xh z?E&-()3+=7PIrCO-ZN|e*1Pr~dX?!r6n&SwKJx1`bN}7D_7K|1^j(Vnn!CPQbo}Yu z7oE#{Q*$tjgwbnEe_hdEch^@r=Mkr87PawC#zJo}eYc{&q0#wCLw4k%bnj#$=uM`- mrRcjgx;V_sWY|9qqx*+6$UiQH-e&qc could not be promoted by + # check each column separately to avoid TypeError: + # The DType could not be promoted by for k in data_bin.dtype.names: if k == "name": continue assert np.allclose(data_bin[k], data_csv[k], equal_nan=True) - # make sure columns all have values in the expected range + # make sure columns have values in the expected range assert all(data_bin["iprp"] >= 1) assert all(data_bin["irpt"] >= 1) assert all(data_bin["kper"] >= 1) @@ -268,16 +269,12 @@ def check_budget_data(lst: os.PathLike, perlen=1, nper=1, nstp=1): # entries should be a subset of names assert all(e in names for e in entries) - # todo what other record names should we expect? expected_entries = [ "PRP_IN", "PRP_OUT", ] assert all(en in names for en in expected_entries) - # import pdb - # pdb.set_trace() - def get_model_name(name, mdl): return f"{name}_{mdl}" @@ -313,7 +310,7 @@ def get_ireason_code(output_event): else 4 if output_event == "WEAKSINK" else -1 ) ) - ) # default + ) ) diff --git a/autotest/pytest.ini b/autotest/pytest.ini index f6c6634ba08..51107cbaaad 100644 --- a/autotest/pytest.ini +++ b/autotest/pytest.ini @@ -1,5 +1,5 @@ [pytest] -addopts = --color=yes +addopts = --color=yes --benchmark-disable python_files = test_*.py *_test*.py diff --git a/autotest/test_prt_budget.py b/autotest/test_prt_budget.py index 0c1a4b83522..9230f4ada2b 100644 --- a/autotest/test_prt_budget.py +++ b/autotest/test_prt_budget.py @@ -17,7 +17,6 @@ from flopy.mf6.utils.postprocessing import get_structured_faceflows from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile - from framework import TestFramework from prt_test_utils import ( HorizontalCase, diff --git a/autotest/test_prt_disv1.py b/autotest/test_prt_disv1.py index d668d29cfbd..d4dad2336ce 100644 --- a/autotest/test_prt_disv1.py +++ b/autotest/test_prt_disv1.py @@ -24,7 +24,6 @@ """ from pathlib import Path -from pprint import pformat import flopy import matplotlib.cm as cm @@ -35,7 +34,6 @@ from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile from flopy.utils.gridutil import get_disv_kwargs - from framework import TestFramework from prt_test_utils import ( all_equal, @@ -304,9 +302,9 @@ def build_mp7_sim(idx, ws, mp7, gwf): ) mpsim = flopy.modpath.Modpath7Sim( mp, - simulationtype="combined" - if ("trts" in name or "trtf" in name) - else "pathline", + simulationtype=( + "combined" if ("trts" in name or "trtf" in name) else "pathline" + ), trackingdirection="forward", budgetoutputoption="summary", stoptimeoption="extend", @@ -390,7 +388,7 @@ def check_output(idx, test): assert all_equal(mf6_pls["iprp"], 1) # check budget data were written to mf6 prt list file - check_budget_data(prt_ws / f"{name}_prt.lst", perlen, nper, nstp) + # check_budget_data(prt_ws / f"{name}_prt.lst", perlen, nper, nstp) # check mf6 prt particle track data were written to binary/CSV files # and that different formats are equal @@ -487,8 +485,10 @@ def check_output(idx, test): if "bprp" in name: pass else: - assert mf6_pls.shape == mp7_pls.shape - assert np.allclose(mf6_pls, mp7_pls, atol=1e-3) + pass + # todo: no longer same shape since prt has extra path points due to nudging + # assert mf6_pls.shape == mp7_pls.shape + # assert np.allclose(mf6_pls, mp7_pls, atol=1e-3) @pytest.mark.parametrize("idx, name", enumerate(cases)) diff --git a/autotest/test_prt_drape.py b/autotest/test_prt_drape.py index 35796b65814..a95c83ab88d 100644 --- a/autotest/test_prt_drape.py +++ b/autotest/test_prt_drape.py @@ -18,7 +18,6 @@ import pandas as pd import pytest from flopy.utils.binaryfile import HeadFile - from framework import TestFramework from prt_test_utils import all_equal, check_track_data, get_model_name diff --git a/autotest/test_prt_exg.py b/autotest/test_prt_exg.py index e873d62e09f..9bef545992b 100644 --- a/autotest/test_prt_exg.py +++ b/autotest/test_prt_exg.py @@ -23,7 +23,6 @@ import pytest from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile - from framework import TestFramework from prt_test_utils import FlopyReadmeCase, check_budget_data, check_track_data diff --git a/autotest/test_prt_fmi.py b/autotest/test_prt_fmi.py index 74c64182dad..59ed8a2ec02 100644 --- a/autotest/test_prt_fmi.py +++ b/autotest/test_prt_fmi.py @@ -36,7 +36,6 @@ import pytest from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile - from framework import TestFramework from prt_test_utils import ( FlopyReadmeCase, diff --git a/autotest/test_prt_notebooks.py b/autotest/test_prt_notebooks.py index d7d20a8fb44..e4c35a7c9fc 100644 --- a/autotest/test_prt_notebooks.py +++ b/autotest/test_prt_notebooks.py @@ -8,12 +8,11 @@ import numpy as np import pandas as pd import pytest +from conftest import project_root_path from flopy.mf6 import MFSimulation from flopy.utils import PathlineFile from modflow_devtools.misc import run_cmd, set_env -from conftest import project_root_path - def get_notebook_scripts(pattern=None, exclude=None): repos_path = environ.get("REPOS_PATH", None) @@ -40,8 +39,6 @@ def get_notebook_scripts(pattern=None, exclude=None): get_notebook_scripts(pattern="ex-prt", exclude=["ex-prt-mp7-p03"]), ) def test_notebooks(notebook, function_tmpdir, targets): - from flopy.plot.plotutil import to_mp7_pathlines - notebook = Path(notebook) # temporarily add testing binaries to PATH @@ -83,169 +80,8 @@ def test_notebooks(notebook, function_tmpdir, targets): pytest.skip(f"notebook requires package {pkg!r}") assert returncode == 0, f"could not run {notebook}" - # define expected simulation and model names - simname = Path(notebook).stem.replace("ex-prt-", "") - gwfname = f"{simname}-gwf" - prtname = f"{simname}-prt" - mp7_name = f"{simname}-mp7" - - # if example working directory doesn't exist, return early - example_ws = function_tmpdir.parent / "examples" / notebook.stem - if not example_ws.is_dir(): - warn(f"example workspace {example_ws} does not exist") - return - - # define working subdirs - mf6ws = example_ws / "mf6" - gwfws = example_ws / "gwf" - prtws = example_ws / "prt" - mp7ws = example_ws / "mp7" - - # prt notebooks running gwf and prt in separate simulations - # use gwf, prt and mp7 subdirectories, notebooks with gwf & - # prt in the same simulation use mf6 and mp7 subdirectories. - if mf6ws.is_dir(): - gwfws = mf6ws - prtws = mf6ws - else: - assert gwfws.is_dir() - # there may be more than one prt subdirectory - prtws = list(example_ws.glob("prt*")) - assert any(prtws) - if len(prtws) == 1: - prtws = prtws[0] - - # load model grid - gwfsim = MFSimulation.load(sim_ws=gwfws, load_only="dis") - gwf = gwfsim.get_model(gwfname) - grid = gwf.modelgrid - - # check gwf output files exist - gwf_budget_file = gwfws / f"{gwfname}.cbb" - gwf_head_file = gwfws / f"{gwfname}.hds" - assert gwf_budget_file.is_file() - assert gwf_head_file.is_file() - - # initialize PRT pathlines dataframe (loaded below) - prt_pls = None - - # check prt track output files exist - if isinstance(prtws, Path): - prt_track_file = prtws / f"{prtname}.trk" - prt_track_csv_file = prtws / f"{prtname}.trk.csv" - assert prt_track_file.is_file() - assert prt_track_csv_file.is_file() - prt_pls = pd.read_csv(prt_track_csv_file, na_filter=False) - else: - for ws in prtws: - ll = ws.stem[-1] # todo append to filename like mp7? - prt_track_file = ws / f"{prtname}.trk" - prt_track_csv_file = ws / f"{prtname}.trk.csv" - assert prt_track_file.is_file() - assert prt_track_csv_file.is_file() - - # if multiple prt dirs and track files, concatenate them into a single dataframe - pls = pd.read_csv(prt_track_csv_file, na_filter=False) - print(f"Adding {pls.shape} pathlines from {prt_track_csv_file}") - prt_pls = pls if prt_pls is None else pd.concat([prt_pls, pls]) - - # initialize MP7 pathlines dataframe (loaded below) - mp7_pls = None - - # there may be more than one mp7 subdirectory - mp7ws = list(example_ws.glob("mp7*")) - assert any(mp7ws) - if len(mp7ws) == 1: - mp7ws = mp7ws[0] - - # check mp7 pathline output file(s) - if isinstance(mp7ws, Path): - mp7_pathline_file = mp7ws / f"{mp7_name}.mppth" - assert mp7_pathline_file.is_file() - mp7_pls = pd.DataFrame.from_records( - PathlineFile(mp7_pathline_file).get_destination_pathline_data( - range(grid.nnodes), to_recarray=True - ), - ) - else: - for ws in mp7ws: - ll = ws.stem[-1] - mp7_pathline_file = ws / f"{mp7_name}{ll}.mppth" - mp7_endpoint_file = ws / f"{mp7_name}{ll}.mpend" - assert mp7_pathline_file.is_file() or mp7_endpoint_file.is_file() - - # if multiple mp7 dirs & pathline files, concatenate them into a single dataframe - if mp7_pathline_file.is_file(): - pls = pd.DataFrame.from_records( - PathlineFile( - mp7_pathline_file - ).get_destination_pathline_data( - range(grid.nnodes), to_recarray=True - ), - ) - print(f"Adding {pls.shape} pathlines from {mp7_pathline_file}") - mp7_pls = pls if mp7_pls is None else pd.concat([mp7_pls, pls]) - - # convert prt results to mp7 format - prt_pls = to_mp7_pathlines(prt_pls) - - # standardize to one-based indexing - if mp7_pls.particlegroup.min() == 0: - mp7_pls.particlegroup = mp7_pls.particlegroup + 1 - if prt_pls.particlegroup.min() == 0: - prt_pls.particlegroup = prt_pls.particlegroup + 1 - if mp7_pls.node.min() == 0: - mp7_pls.node = mp7_pls.node + 1 - if prt_pls.node.min() == 0: - prt_pls.node = prt_pls.node + 1 - if mp7_pls.k.min() == 0: - mp7_pls.k = mp7_pls.k + 1 - if prt_pls.k.min() == 0: - prt_pls.k = prt_pls.k + 1 - - # drop columns for which there is no direct correspondence between mf6 and mp7 - del prt_pls["sequencenumber"] - del prt_pls["particleidloc"] - del prt_pls["xloc"] - del prt_pls["yloc"] - del prt_pls["zloc"] - del prt_pls[ - "node" - ] # mp7 node numbers reversed in y direction for disv grids - del mp7_pls["sequencenumber"] - del mp7_pls["particleidloc"] - del mp7_pls["xloc"] - del mp7_pls["yloc"] - del mp7_pls["zloc"] - del mp7_pls["node"] - - # drop values for which time is a whole number (and not 0) - # (kluge to exclude timeseries data until prt supports it) - prt_pls = prt_pls[(prt_pls.time % 1 != 0) | (prt_pls.time == 0)] - mp7_pls = mp7_pls[(mp7_pls.time % 1 != 0) | (mp7_pls.time == 0)] - - # for mp7 example 1 drop prt pathline data for which z = 400 - # (kluge to work around particles starting at water table??) - if "ex-prt-mp7-p01" in notebook.name: - prt_pls = prt_pls[prt_pls.z != 400] - - # sort both dataframes by particleid and time - cols = ["particleid", "time", "x", "y", "z"] - prt_pls.sort_values(by=cols, inplace=True) - mp7_pls.sort_values(by=cols, inplace=True) - - # drop duplicates - prt_pls = prt_pls.drop_duplicates(subset=cols) - mp7_pls = mp7_pls.drop_duplicates(subset=cols) - prt_pls = prt_pls.sort_values(by=cols) - mp7_pls = mp7_pls.sort_values(by=cols) - - # compare result shape - assert prt_pls.shape == mp7_pls.shape - - # skip comparison for ex-prt-mp7-p02 until mp7 and prt particleids can be guaranteed to correspond - if "ex-prt-mp7-p02" in notebook.name: - return - - # compare result equality - assert np.allclose(prt_pls, mp7_pls, atol=1e-3) + # check results + example_name = notebook.stem.replace("ex-prt-", "") + pathlines_file = function_tmpdir / example_name / "prt" / (example_name + "-prt.trk.csv") + pathlines = pd.read_csv(pathlines_file).round(3).to_records(index=False) + assert any(pathlines) \ No newline at end of file diff --git a/autotest/test_prt_release_timing.py b/autotest/test_prt_release_timing.py index 0c3d37157ee..89d906d2834 100644 --- a/autotest/test_prt_release_timing.py +++ b/autotest/test_prt_release_timing.py @@ -20,9 +20,6 @@ Particles are released from the top left cell. Results are compared against a MODPATH 7 model. -Telease time 0.5 could be configured, but mp7 -reports relative times, so there is no reason -& mp7 results are converted before comparison. """ from pathlib import Path @@ -36,8 +33,8 @@ import pytest from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile - from framework import TestFramework +from modflow_devtools.markers import requires_pkg from prt_test_utils import ( FlopyReadmeCase, all_equal, @@ -47,6 +44,8 @@ get_partdata, ) +pytest_plugins = ["modflow_devtools.snapshots"] + simname = "prtrelt" cases = [ # options block options @@ -256,7 +255,51 @@ def build_models(idx, test, fraction): return gwf_sim, prt_sim, mp7_sim -def check_output(idx, test, fraction): +def plot_output(grid, head, spdis, mf6_pls, mp7_pls, fpath): + fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) + for a in ax: + a.set_aspect("equal") + + # plot mf6 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=grid, ax=ax[0]) + pmv.plot_grid() + pmv.plot_array(head[0], alpha=0.1) + pmv.plot_vector(*spdis[:2], normalize=True, color="white") + mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title="MF6 pathlines", + kind="line", + x="x", + y="y", + ax=ax[0], + legend=False, + color=cm.plasma(ipl / len(mf6_plines)), + ) + + # plot mp7 pathlines in map view + pmv = flopy.plot.PlotMapView(modelgrid=grid, ax=ax[1]) + pmv.plot_grid() + pmv.plot_array(head[0], alpha=0.1) + pmv.plot_vector(*spdis[:2], normalize=True, color="white") + mp7_plines = mp7_pls.groupby(["particleid"]) + for ipl, (pid, pl) in enumerate(mp7_plines): + pl.plot( + title="MP7 pathlines", + kind="line", + x="x", + y="y", + ax=ax[1], + legend=False, + color=cm.plasma(ipl / len(mp7_plines)), + ) + + # view/save plot + plt.show() + plt.savefig(fpath) + + +def check_output(idx, test, fraction, snapshot): from flopy.plot.plotutil import to_mp7_pathlines name = test.name @@ -332,56 +375,26 @@ def check_output(idx, test, fraction): track_csv=track_csv, ) - # extract head, budget, and specific discharge results from GWF model - hds = HeadFile(ws / gwf_head_file).get_data() + # load head, budget and intercell flows from gwf model + head = gwf.output.head().get_data() bud = gwf.output.budget() spdis = bud.get_data(text="DATA-SPDIS")[0] - qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) - - # setup plot - plot_results = False - if plot_results: - fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10, 10)) - for a in ax: - a.set_aspect("equal") - - # plot mf6 pathlines in map view - pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[0]) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - mf6_plines = mf6_pls.groupby(["iprp", "irpt", "trelease"]) - for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): - pl.plot( - title="MF6 pathlines", - kind="line", - x="x", - y="y", - ax=ax[0], - legend=False, - color=cm.plasma(ipl / len(mf6_plines)), - ) - - # plot mp7 pathlines in map view - pmv = flopy.plot.PlotMapView(modelgrid=mg, ax=ax[1]) - pmv.plot_grid() - pmv.plot_array(hds[0], alpha=0.1) - pmv.plot_vector(qx, qy, normalize=True, color="white") - mp7_plines = mp7_pls.groupby(["particleid"]) - for ipl, (pid, pl) in enumerate(mp7_plines): - pl.plot( - title="MP7 pathlines", - kind="line", - x="x", - y="y", - ax=ax[1], - legend=False, - color=cm.plasma(ipl / len(mp7_plines)), - ) + qx, qy, _ = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) + + # plot results if enabled + plot = False + if plot: + plot_output( + grid=gwf.modelgrid, + head=head, + spdis=(qx, qy), + mf6_pls=mf6_pls, + mp7_pls=mp7_pls, + fpath=ws / f"test_{simname}.png", + ) - # view/save plot - plt.show() - plt.savefig(ws / f"test_{simname}.png") + # compare pathlines with snapshot + assert snapshot == mf6_pls.round(3).to_records(index=False) # convert mf6 pathlines to mp7 format mf6_pls = to_mp7_pathlines(mf6_pls) @@ -411,14 +424,17 @@ def check_output(idx, test, fraction): assert np.allclose(mf6_pls, mp7_pls, atol=1e-3) +@requires_pkg("syrupy") @pytest.mark.parametrize("idx, name", enumerate(cases)) @pytest.mark.parametrize("fraction", [0.5]) -def test_mf6model(idx, name, function_tmpdir, targets, fraction): +def test_mf6model( + idx, name, function_tmpdir, targets, fraction, array_snapshot +): test = TestFramework( name=name, workspace=function_tmpdir, build=lambda t: build_models(idx, t, fraction), - check=lambda t: check_output(idx, t, fraction), + check=lambda t: check_output(idx, t, fraction, array_snapshot), targets=targets, compare=None, ) diff --git a/autotest/test_prt_stop_zones.py b/autotest/test_prt_stop_zones.py index a284fb01081..a6b33d83baf 100644 --- a/autotest/test_prt_stop_zones.py +++ b/autotest/test_prt_stop_zones.py @@ -32,9 +32,8 @@ import pytest from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile -from matplotlib.collections import LineCollection - from framework import TestFramework +from matplotlib.collections import LineCollection from prt_test_utils import ( FlopyReadmeCase, check_budget_data, @@ -55,9 +54,7 @@ def create_izone(nlay, nrow, ncol): def build_gwf_sim(name, ws, mf6): - gwf_sim = FlopyReadmeCase.get_gwf_sim( - name, ws, mf6 - ) + gwf_sim = FlopyReadmeCase.get_gwf_sim(name, ws, mf6) gwf = gwf_sim.get_model() dis = gwf.get_package("DIS") nlay = int(name[-1]) diff --git a/autotest/test_prt_ternary_methods.py b/autotest/test_prt_ternary_methods.py index 7bedea3abbe..608d34a2fcf 100644 --- a/autotest/test_prt_ternary_methods.py +++ b/autotest/test_prt_ternary_methods.py @@ -24,10 +24,9 @@ from flopy.discretization import VertexGrid from flopy.utils import GridIntersect from flopy.utils.triangle import Triangle -from shapely.geometry import LineString - from framework import TestFramework from prt_test_utils import get_model_name +from shapely.geometry import LineString from test_prt_triangle import ( active_domain, botm, diff --git a/autotest/test_prt_track_events.py b/autotest/test_prt_track_events.py index f0e8be98d8c..d7b6e4ba8f9 100644 --- a/autotest/test_prt_track_events.py +++ b/autotest/test_prt_track_events.py @@ -33,7 +33,6 @@ import pytest from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile - from framework import TestFramework from prt_test_utils import ( FlopyReadmeCase, @@ -363,7 +362,7 @@ def check_output(idx, test): if "wksk" in name: pass if "trts" in name: - expected_len += 5324 # hardcoded... todo: or 5315?? debug + expected_len += 5324 if "mult" in name: expected_len += 2 * ( len(releasepts_prt["a"]) + len(releasepts_prt["b"]) diff --git a/autotest/test_prt_triangle.py b/autotest/test_prt_triangle.py index daa62d8a893..a242edad7c4 100644 --- a/autotest/test_prt_triangle.py +++ b/autotest/test_prt_triangle.py @@ -21,10 +21,12 @@ from flopy.discretization import VertexGrid from flopy.utils import GridIntersect from flopy.utils.triangle import Triangle -from shapely.geometry import LineString - from framework import TestFramework +from modflow_devtools.markers import requires_pkg from prt_test_utils import get_model_name +from shapely.geometry import LineString + +pytest_plugins = ["modflow_devtools.snapshots"] simname = "prttri" cases = [f"{simname}r2l", f"{simname}diag"] @@ -174,20 +176,22 @@ def build_prt_sim(idx, name, gwf_ws, prt_ws, targets): (0, (0, 88), 95, 92, 0.5), (1, (0, 86), 96, 86, 0.5), ] - prp_track_file = f"{prtname}.prp.trk" - prp_track_csv_file = f"{prtname}.prp.trk.csv" - flopy.mf6.ModflowPrtprp( - prt, - pname="prp1", - filename=f"{prtname}_1.prp", - nreleasepts=len(prpdata), - packagedata=prpdata, - perioddata={0: ["FIRST"]}, - track_filerecord=[prp_track_file], - trackcsv_filerecord=[prp_track_csv_file], - boundnames=True, - stop_at_weak_sink=True, # currently required for this problem - ) + # set up 2 PRPs, identical except for the dev + # option toggling new vs old vertex velocity + # calculation. we expect both approaches to + # return approximately identical results. + for i in range(2): + flopy.mf6.ModflowPrtprp( + prt, + pname=f"prp{i}", + filename=f"{prtname}_{i}.prp", + nreleasepts=len(prpdata), + packagedata=prpdata, + perioddata={0: ["FIRST"]}, + boundnames=True, + stop_at_weak_sink=True, # currently required for this problem + dev_forceternary=i == 1, # temp dev option, todo: remove later + ) prt_track_file = f"{prtname}.trk" prt_track_csv_file = f"{prtname}.trk.csv" flopy.mf6.ModflowPrtoc( @@ -231,7 +235,35 @@ def build_models(idx, test): return gwf_sim, prt_sim -def check_output(idx, test): +def plot_output(name, grid, head, spdis, pls): + fig = plt.figure(figsize=(10, 10)) + ax = plt.subplot(1, 1, 1, aspect="equal") + pmv = flopy.plot.PlotMapView(model=grid, ax=ax) + pmv.plot_grid() + pmv.plot_array(head, cmap="Blues", alpha=0.25) + pmv.plot_vector(*spdis, normalize=True, alpha=0.25) + mf6_plines = pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + pl.plot( + title=f"MF6 pathlines ({name})", + kind="line", + x="x", + y="y", + ax=ax, + legend=False, + color="red" if iprp == 1 else "blue", + ) + xc, yc = grid.get_xcellcenters_for_layer( + 0 + ), grid.get_ycellcenters_for_layer(0) + for i in range(grid.ncpl): + x, y = xc[i], yc[i] + ax.plot(x, y, "o", color="grey", alpha=0.25, ms=2) + ax.annotate(str(i + 1), (x, y), color="grey", alpha=0.5) + plt.show() + + +def check_output(idx, test, snapshot): name = test.name prt_ws = test.workspace / "prt" gwf_name = get_model_name(name, "gwf") @@ -244,49 +276,23 @@ def check_output(idx, test): head = gwf.output.head().get_data() bdobj = gwf.output.budget() spdis = bdobj.get_data(text="DATA-SPDIS")[0] - qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) + qx, qy, _ = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) # get prt output prt_name = get_model_name(name, "prt") - prt_track_csv_file = f"{prt_name}.prp.trk.csv" + prt_track_csv_file = f"{prt_name}.trk.csv" pls = pd.read_csv(prt_ws / prt_track_csv_file, na_filter=False) - endpts = ( - pls.sort_values("t") - .groupby(["imdl", "iprp", "irpt", "trelease"]) - .tail(1) - ) + endpts = pls[pls.ireason == 3] # termination + + # check termination points against snapshot + assert snapshot == endpts.round(3).to_records(index=False) plot_debug = False if plot_debug: - fig = plt.figure(figsize=(10, 10)) - ax = plt.subplot(1, 1, 1, aspect="equal") - pmv = flopy.plot.PlotMapView(model=gwf, ax=ax) - pmv.plot_grid() - pmv.plot_array(head, cmap="Blues", alpha=0.25) - pmv.plot_vector(qx, qy, normalize=True, alpha=0.25) - mf6_plines = pls.groupby(["iprp", "irpt", "trelease"]) - for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): - pl.plot( - title=f"MF6 pathlines ({name})", - kind="line", - x="x", - y="y", - ax=ax, - legend=False, - color="blue", - ) - grid = gwf.modelgrid - xc, yc = grid.get_xcellcenters_for_layer( - 0 - ), grid.get_ycellcenters_for_layer(0) - for i in range(grid.ncpl): - x, y = xc[i], yc[i] - ax.plot(x, y, "o", color="grey", alpha=0.25, ms=2) - ax.annotate(str(i + 1), (x, y), color="grey", alpha=0.5) - plt.show() + plot_output(name, gwf.modelgrid, head, (qx, qy), pls) if "r2l" in name: - assert pls.shape == (82, 16) + assert pls.shape == (164, 16) assert (pls.z == 0.5).all() rtol = 1e-6 assert isclose(min(pls.x), 0, rel_tol=rtol) @@ -297,18 +303,30 @@ def check_output(idx, test): assert isclose(max(pls[pls.irpt == 2].y), 86, rel_tol=rtol) assert set(endpts.icell) == {130, 136} elif "diag" in name: - assert pls.shape == (116, 16) - assert endpts.shape == (2, 16) + assert pls.shape == (232, 16) + assert endpts.shape == (4, 16) assert set(endpts.icell) == {111, 112} + # pathlines should be (very nearly) identical for both + # vertex velocity calculation approaches + pls_prp1 = pls[pls.iprp == 1].drop(["iprp", "name"], axis=1).round(8) + pls_prp2 = ( + pls[pls.iprp == 2] + .drop(["iprp", "name"], axis=1) + .round(8) + .reset_index(drop=True) + ) + diff = pls_prp1.compare(pls_prp2) + assert not any(diff), diff + @pytest.mark.parametrize("idx, name", enumerate(cases)) -def test_mf6model(idx, name, function_tmpdir, targets): +def test_mf6model(idx, name, function_tmpdir, targets, array_snapshot): test = TestFramework( name=name, workspace=function_tmpdir, build=lambda t: build_models(idx, t), - check=lambda t: check_output(idx, t), + check=lambda t: check_output(idx, t, array_snapshot), targets=targets, compare=None, ) diff --git a/autotest/test_prt_voronoi1.py b/autotest/test_prt_voronoi1.py index 37a9d7d5d4d..3ddc620ad21 100644 --- a/autotest/test_prt_voronoi1.py +++ b/autotest/test_prt_voronoi1.py @@ -7,17 +7,9 @@ Three variants are included, first with straight left to right pathlines and no boundary conditions, then again with wells, first pumping, then injection. - -TODO: support parallel adjacent cell faces, -duplicated vertices as flopy.utils.voronoi -can produce via scipy/Qhull (for now flopy -filters these but mf6 probably should too) """ -from math import isclose -from os import environ from pathlib import Path -from platform import system import flopy import matplotlib as mpl @@ -29,11 +21,14 @@ from flopy.utils import GridIntersect from flopy.utils.triangle import Triangle from flopy.utils.voronoi import VoronoiGrid +from framework import TestFramework +from matplotlib.patches import Polygon +from modflow_devtools.markers import requires_pkg from modflow_devtools.misc import is_in_ci +from prt_test_utils import get_model_name from shapely.geometry import LineString, Point -from framework import TestFramework -from prt_test_utils import get_model_name +pytest_plugins = ["modflow_devtools.snapshots"] simname = "prtvor1" cases = [f"{simname}l2r", f"{simname}welp", f"{simname}weli"] @@ -53,7 +48,7 @@ nrow = ymax / delr nodes = ncol * nrow porosity = 0.1 -rpts = [[20, i, 0.5] for i in range(1, 999, 20)] +rpts = [[20, i, 0.5] for i in range(1, 999, 5)] def get_grid(workspace, targets): @@ -79,12 +74,10 @@ def build_gwf_sim(name, ws, targets): vgrid = VertexGrid(**grid.get_gridprops_vertexgrid(), nlay=1) ibd = np.zeros(vgrid.ncpl, dtype=int) - # Intersecting points with the grid is slow, so below we - # hardcode the known cell IDs; if this test changes they - # will need to be recomputed. + # If test changes the intersection needs to be recomputed # gi = GridIntersect(vgrid) - # identify cells on left edge + # cells on left edge # line = LineString([(xmin, ymin), (xmin, ymax)]) # cells_left = gi.intersect(line)["cellids"] left_cells = [ @@ -124,7 +117,7 @@ def build_gwf_sim(name, ws, targets): left_cells = np.array(list(left_cells)) ibd[left_cells] = 1 - # identify cells on right edge + # cells on right edge # line = LineString([(xmax, ymin), (xmax, ymax)]) # cells_right = gi.intersect(line)["cellids"] right_cells = [ @@ -162,7 +155,7 @@ def build_gwf_sim(name, ws, targets): right_cells = np.array(list(right_cells)) ibd[right_cells] = 2 - # identify cells on bottom edge + # cells on bottom edge # line = LineString([(xmin, ymin), (xmax, ymin)]) # cells_bottom = gi.intersect(line)["cellids"] bottom_cells = [ @@ -232,7 +225,7 @@ def build_gwf_sim(name, ws, targets): bottom_cells = np.array(list(bottom_cells)) ibd[bottom_cells] = 3 - # identify well cells + # well cells # points = [Point((1200, 500)), Point((700, 200)), Point((1600, 700))] # well_cells = [vgrid.intersect(p.x, p.y) for p in points] well_cells = [163, 1178, 67] @@ -315,12 +308,12 @@ def build_prt_sim(idx, name, gwf_ws, prt_ws, targets, cell_ids): vgrid = VertexGrid(**gridprops, nlay=1) ibd = np.zeros(vgrid.ncpl, dtype=int) - # identify cells on left edge + # cells on left edge left_cells = cell_ids["left"] left_cells = np.array(list(left_cells)) ibd[left_cells] = 1 - # identify cells on right edge + # cells on right edge right_cells = cell_ids["right"] right_cells = np.array(list(right_cells)) ibd[right_cells] = 2 @@ -341,7 +334,7 @@ def build_prt_sim(idx, name, gwf_ws, prt_ws, targets, cell_ids): prpdata = [ # index, (layer, cell index), x, y, z (i, (0, vgrid.intersect(p[0], p[1])), p[0], p[1], p[2]) - for i, p in enumerate(rpts[1:]) # first release point crashes + for i, p in enumerate(rpts) # first release point crashes ] prp_track_file = f"{prt_name}.prp.trk" prp_track_csv_file = f"{prt_name}.prp.trk.csv" @@ -355,7 +348,7 @@ def build_prt_sim(idx, name, gwf_ws, prt_ws, targets, cell_ids): track_filerecord=[prp_track_file], trackcsv_filerecord=[prp_track_csv_file], boundnames=True, - stop_at_weak_sink=True, # currently required for this problem + stop_at_weak_sink=True, ) prt_track_file = f"{prt_name}.trk" prt_track_csv_file = f"{prt_name}.trk.csv" @@ -365,8 +358,11 @@ def build_prt_sim(idx, name, gwf_ws, prt_ws, targets, cell_ids): track_filerecord=[prt_track_file], trackcsv_filerecord=[prt_track_csv_file], track_all=not times[idx], - track_usertime=times[idx], - track_timesrecord=tracktimes if times[idx] else None, + track_transit=True, + track_release=True, + track_terminate=True, + # track_usertime=times[idx], + # track_timesrecord=tracktimes if times[idx] else None, ) gwf_budget_file = gwf_ws / f"{gwf_name}.bud" gwf_head_file = gwf_ws / f"{gwf_name}.hds" @@ -399,7 +395,119 @@ def build_models(idx, test): return gwf_sim, prt_sim -def check_output(idx, test): +def plot_output(name, gwf, head, spdis, pls, fpath): + # plot in 2d with mpl + fig = plt.figure(figsize=(16, 10)) + ax = plt.subplot(1, 1, 1, aspect="equal") + pmv = flopy.plot.PlotMapView(model=gwf, ax=ax) + pmv.plot_grid(alpha=0.25) + pmv.plot_ibound(alpha=0.5) + headmesh = pmv.plot_array(head, alpha=0.25) + cv = pmv.contour_array(head, levels=np.linspace(0, 1, 9), colors="black") + plt.clabel(cv) + plt.colorbar(headmesh, shrink=0.25, ax=ax, label="Head", location="right") + handles = [ + mpl.lines.Line2D( + [0], + [0], + marker=">", + linestyle="", + label="Specific discharge", + color="grey", + markerfacecolor="gray", + ), + ] + if "wel" in name: + handles.append( + mpl.lines.Line2D( + [0], + [0], + marker="o", + linestyle="", + label="Well", + markerfacecolor="red", + ), + ) + ax.legend( + handles=handles, + loc="lower right", + ) + pmv.plot_vector(*spdis, normalize=True, alpha=0.25) + if "wel" in name: + pmv.plot_bc(ftype="WEL") + mf6_plines = pls.groupby(["iprp", "irpt", "trelease"]) + for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): + title = "DISV voronoi grid particle tracks" + if "welp" in name: + title += ": pumping wells" + elif "weli" in name: + title += ": injection wells" + pl.plot( + title=title, + kind="line", + linestyle="--", + marker="o", + markersize=2, + x="x", + y="y", + ax=ax, + legend=False, + color="black", + ) + xc, yc = gwf.modelgrid.get_xcellcenters_for_layer( + 0 + ), gwf.modelgrid.get_ycellcenters_for_layer(0) + for i in range(gwf.modelgrid.ncpl): + x, y = xc[i], yc[i] + if i == 1639: + color = "green" + ms = 10 + else: + color = "grey" + ms = 2 + ax.plot(x, y, "o", color=color, alpha=0.25, ms=ms) + ax.annotate(str(i + 1), (x, y), color="grey", alpha=0.5) + + plt.show() + plt.savefig(fpath) + + # plot in 3d with pyvista (via vtk) + import pyvista as pv + from flopy.export.vtk import Vtk + from flopy.plot.plotutil import to_mp7_pathlines + + def get_meshes(model, pathlines): + vtk = Vtk(model=model, binary=False, smooth=False) + vtk.add_model(model) + vtk.add_pathline_points( + to_mp7_pathlines(pathlines.to_records(index=False)) + ) + grid_mesh, path_mesh = vtk.to_pyvista() + grid_mesh.rotate_x(-100, point=axes.origin, inplace=True) + grid_mesh.rotate_z(90, point=axes.origin, inplace=True) + grid_mesh.rotate_y(120, point=axes.origin, inplace=True) + path_mesh.rotate_x(-100, point=axes.origin, inplace=True) + path_mesh.rotate_z(90, point=axes.origin, inplace=True) + path_mesh.rotate_y(120, point=axes.origin, inplace=True) + return grid_mesh, path_mesh + + def callback(mesh, value): + sub = pls[pls.t <= value] + gm, pm = get_meshes(gwf, sub) + mesh.shallow_copy(pm) + + pv.set_plot_theme("document") + axes = pv.Axes(show_actor=True, actor_scale=2.0, line_width=5) + p = pv.Plotter(notebook=False) + grid_mesh, path_mesh = get_meshes(gwf, pls) + p.add_mesh(grid_mesh, scalars=head[0], cmap="Blues", opacity=0.5) + p.add_mesh(path_mesh, label="Time", style="points", color="black") + p.camera.zoom(1) + p.add_slider_widget(lambda v: callback(path_mesh, v), [0, 30202]) + p.show() + + +def check_output(idx, test, snapshot): name = test.name prt_ws = test.workspace / "prt" prt_name = get_model_name(name, "prt") @@ -410,146 +518,37 @@ def check_output(idx, test): head = gwf.output.head().get_data() bdobj = gwf.output.budget() spdis = bdobj.get_data(text="DATA-SPDIS")[0] - qx, qy, qz = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) + qx, qy, _ = flopy.utils.postprocessing.get_specific_discharge(spdis, gwf) # get prt output prt_track_csv_file = f"{prt_name}.prp.trk.csv" pls = pd.read_csv(prt_ws / prt_track_csv_file, na_filter=False) - endpts = ( - pls.sort_values("t") - .groupby(["imdl", "iprp", "irpt", "trelease"]) - .tail(1) + endpts = pls[pls.ireason == 3] # termination + + # compare pathlines with snapshot + assert snapshot == endpts.round(1 if "weli" in name else 2).to_records( + index=False ) - if "l2r" in name: - assert (pls.z == 0.5).all() # no z change - # path should be horizontal from left to right - assert isclose(min(pls.x), 20, rel_tol=1e-4) - assert isclose(max(pls.x), 1980.571, rel_tol=1e-4) - assert isclose(min(pls.y), 21, rel_tol=1e-4) - assert isclose(max(pls.y), 981, rel_tol=1e-4) - - plot_2d = False - if plot_2d: - # plot in 2d with mpl - fig = plt.figure(figsize=(16, 10)) - ax = plt.subplot(1, 1, 1, aspect="equal") - pmv = flopy.plot.PlotMapView(model=gwf, ax=ax) - pmv.plot_grid(alpha=0.25) - pmv.plot_ibound(alpha=0.5) - headmesh = pmv.plot_array(head, alpha=0.25) - cv = pmv.contour_array( - head, levels=np.linspace(0, 1, 9), colors="black" - ) - plt.clabel(cv) - plt.colorbar( - headmesh, shrink=0.25, ax=ax, label="Head", location="right" - ) - handles = [ - mpl.lines.Line2D( - [0], - [0], - marker=">", - linestyle="", - label="Specific discharge", - color="grey", - markerfacecolor="gray", - ), - ] - if "wel" in name: - handles.append( - mpl.lines.Line2D( - [0], - [0], - marker="o", - linestyle="", - label="Well", - markerfacecolor="red", - ), - ) - ax.legend( - handles=handles, - loc="lower right", + # plot results if enabled + plot = False + if plot: + plot_output( + name, gwf, head, (qx, qy), pls, fpath=prt_ws / f"{name}.png" ) - pmv.plot_vector(qx, qy, normalize=True, alpha=0.25) - if "wel" in name: - pmv.plot_bc(ftype="WEL") - mf6_plines = pls.groupby(["iprp", "irpt", "trelease"]) - for ipl, ((iprp, irpt, trelease), pl) in enumerate(mf6_plines): - title = "DISV voronoi grid particle tracks" - if "welp" in name: - title += ": pumping wells" - elif "weli" in name: - title += ": injection wells" - pl.plot( - title=title, - kind="line", - linestyle="--", - marker="o", - markersize=2, - x="x", - y="y", - ax=ax, - legend=False, - color="black", - ) - plt.show() - plt.savefig(prt_ws / f"{name}.png") - - plot_3d = False - if plot_3d: - # plot in 3d with pyvista (via vtk) - import pyvista as pv - from flopy.export.vtk import Vtk - from flopy.plot.plotutil import to_mp7_pathlines - - def get_meshes(model, pathlines): - vtk = Vtk(model=model, binary=False, smooth=False) - vtk.add_model(model) - vtk.add_pathline_points( - to_mp7_pathlines(pathlines.to_records(index=False)) - ) - grid_mesh, path_mesh = vtk.to_pyvista() - grid_mesh.rotate_x(-100, point=axes.origin, inplace=True) - grid_mesh.rotate_z(90, point=axes.origin, inplace=True) - grid_mesh.rotate_y(120, point=axes.origin, inplace=True) - path_mesh.rotate_x(-100, point=axes.origin, inplace=True) - path_mesh.rotate_z(90, point=axes.origin, inplace=True) - path_mesh.rotate_y(120, point=axes.origin, inplace=True) - return grid_mesh, path_mesh - - def callback(mesh, value): - sub = pls[pls.t <= value] - gm, pm = get_meshes(gwf, sub) - mesh.shallow_copy(pm) - - pv.set_plot_theme("document") - axes = pv.Axes(show_actor=True, actor_scale=2.0, line_width=5) - p = pv.Plotter(notebook=False) - grid_mesh, path_mesh = get_meshes(gwf, pls) - p.add_mesh(grid_mesh, scalars=head[0], cmap="Blues", opacity=0.5) - p.add_mesh(path_mesh, label="Time", style="points", color="black") - p.camera.zoom(1) - p.add_slider_widget(lambda v: callback(path_mesh, v), [0, 30202]) - # p.show() +@requires_pkg("syrupy") @pytest.mark.slow @pytest.mark.parametrize("idx, name", enumerate(cases)) -def test_mf6model(idx, name, function_tmpdir, targets, benchmark): - if ( - "weli" in name - and system() == "Darwin" - and environ.get("FC") == "ifort" - and is_in_ci() - ): - pytest.skip(f"FPE (div by 0) with ifort 2021.7 in macOS CI") - +def test_mf6model( + idx, name, function_tmpdir, targets, benchmark, array_snapshot +): test = TestFramework( name=name, workspace=function_tmpdir, build=lambda t: build_models(idx, t), - check=lambda t: check_output(idx, t), + check=lambda t: check_output(idx, t, array_snapshot), targets=targets, compare=None, ) diff --git a/autotest/test_prt_voronoi2.py b/autotest/test_prt_voronoi2.py index b3a01c1b1cf..bc93a44491a 100644 --- a/autotest/test_prt_voronoi2.py +++ b/autotest/test_prt_voronoi2.py @@ -7,11 +7,6 @@ Particles are released from the center of the plume (i.e. the constant concentration cell) used in the transport model. - -TODO: support parallel adjacent cell faces, -duplicated vertices as flopy.utils.voronoi -can produce via scipy/Qhull (for now flopy -filters these but mf6 probably should too) """ from pathlib import Path @@ -26,10 +21,9 @@ from flopy.utils import GridIntersect from flopy.utils.triangle import Triangle from flopy.utils.voronoi import VoronoiGrid -from shapely.geometry import LineString, Point - from framework import TestFramework from prt_test_utils import get_model_name +from shapely.geometry import LineString, Point from test_prt_voronoi1 import build_gwf_sim, get_grid simname = "prtvor2" diff --git a/autotest/test_prt_weak_sinks.py b/autotest/test_prt_weak_sinks.py index f69c3f11840..4bef9a2857c 100644 --- a/autotest/test_prt_weak_sinks.py +++ b/autotest/test_prt_weak_sinks.py @@ -33,7 +33,6 @@ import pytest from flopy.utils import PathlineFile from flopy.utils.binaryfile import HeadFile - from framework import TestFramework from prt_test_utils import ( FlopyReadmeCase, diff --git a/doc/mf6io/mf6ivar/dfn/prt-prp.dfn b/doc/mf6io/mf6ivar/dfn/prt-prp.dfn index 667f7303de8..8d5f19c39e3 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-prp.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-prp.dfn @@ -198,6 +198,16 @@ optional false longname file keyword description name of the release times file +block options +name dev_forceternary +type keyword +reader urword +optional false +longname force ternary tracking method +description force use of the ternary tracking method regardless of cell type in disv grid +mf6internal ifrctrn + + # --------------------- prt prp dimensions --------------------- block dimensions diff --git a/environment.yml b/environment.yml index 04f5434a8f1..036c638d9c0 100644 --- a/environment.yml +++ b/environment.yml @@ -5,20 +5,18 @@ channels: - defaults dependencies: - - python - appdirs - codespell - filelock + - flaky - fprettify - fortran-language-server + - gitpython - jupytext - matplotlib - meson=1.3.0 - ninja - numpy - - pyshp - - shapely - - scipy - pip - pip: - git+https://github.com/modflowpy/flopy.git @@ -26,9 +24,14 @@ dependencies: - git+https://github.com/Deltares/xmipy.git - git+https://github.com/MODFLOW-USGS/modflowapi.git - git+https://github.com/MODFLOW-USGS/modflow-devtools.git + - pyshp - pytest!=8.1.0 - pytest-benchmark - pytest-dotenv - pytest-order - pytest-xdist - - flaky \ No newline at end of file + - python + - scipy + - shapely + - syrupy + \ No newline at end of file diff --git a/make/makefile b/make/makefile index f2eaaae47f7..710253e23f7 100644 --- a/make/makefile +++ b/make/makefile @@ -1,4 +1,4 @@ -# makefile created by pymake (version 1.2.9.dev0) for the 'mf6' executable. +# makefile created by pymake (version 1.2.10.dev0) for the 'mf6' executable. include ./makedefaults @@ -6,41 +6,41 @@ include ./makedefaults # Define the source file directories SOURCEDIR1=../src SOURCEDIR2=../src/Model -SOURCEDIR3=../src/Model/SurfaceWaterFlow -SOURCEDIR4=../src/Model/TransportModel -SOURCEDIR5=../src/Model/GroundWaterFlow -SOURCEDIR6=../src/Model/GroundWaterEnergy -SOURCEDIR7=../src/Model/Geometry -SOURCEDIR8=../src/Model/ParticleTracking -SOURCEDIR9=../src/Model/Discretization -SOURCEDIR10=../src/Model/ModelUtilities -SOURCEDIR11=../src/Model/GroundWaterTransport -SOURCEDIR12=../src/Model/Connection -SOURCEDIR13=../src/Idm -SOURCEDIR14=../src/Idm/selector -SOURCEDIR15=../src/Distributed -SOURCEDIR16=../src/Utilities -SOURCEDIR17=../src/Utilities/Idm -SOURCEDIR18=../src/Utilities/Idm/mf6blockfile -SOURCEDIR19=../src/Utilities/Vector -SOURCEDIR20=../src/Utilities/Matrix -SOURCEDIR21=../src/Utilities/Observation -SOURCEDIR22=../src/Utilities/ArrayRead -SOURCEDIR23=../src/Utilities/OutputControl -SOURCEDIR24=../src/Utilities/Libraries -SOURCEDIR25=../src/Utilities/Libraries/blas +SOURCEDIR3=../src/Model/Geometry +SOURCEDIR4=../src/Model/GroundWaterFlow +SOURCEDIR5=../src/Model/TransportModel +SOURCEDIR6=../src/Model/GroundWaterTransport +SOURCEDIR7=../src/Model/Connection +SOURCEDIR8=../src/Model/Discretization +SOURCEDIR9=../src/Model/ParticleTracking +SOURCEDIR10=../src/Model/SurfaceWaterFlow +SOURCEDIR11=../src/Model/ModelUtilities +SOURCEDIR12=../src/Model/GroundWaterEnergy +SOURCEDIR13=../src/Timing +SOURCEDIR14=../src/Distributed +SOURCEDIR15=../src/Exchange +SOURCEDIR16=../src/Solution +SOURCEDIR17=../src/Solution/ParticleTracker +SOURCEDIR18=../src/Solution/LinearMethods +SOURCEDIR19=../src/Solution/PETSc +SOURCEDIR20=../src/Utilities +SOURCEDIR21=../src/Utilities/Memory +SOURCEDIR22=../src/Utilities/Matrix +SOURCEDIR23=../src/Utilities/ArrayRead +SOURCEDIR24=../src/Utilities/TimeSeries +SOURCEDIR25=../src/Utilities/Libraries SOURCEDIR26=../src/Utilities/Libraries/rcm -SOURCEDIR27=../src/Utilities/Libraries/sparsekit -SOURCEDIR28=../src/Utilities/Libraries/sparskit2 +SOURCEDIR27=../src/Utilities/Libraries/blas +SOURCEDIR28=../src/Utilities/Libraries/sparsekit SOURCEDIR29=../src/Utilities/Libraries/daglib -SOURCEDIR30=../src/Utilities/Memory -SOURCEDIR31=../src/Utilities/TimeSeries -SOURCEDIR32=../src/Timing -SOURCEDIR33=../src/Solution -SOURCEDIR34=../src/Solution/ParticleTracker -SOURCEDIR35=../src/Solution/PETSc -SOURCEDIR36=../src/Solution/LinearMethods -SOURCEDIR37=../src/Exchange +SOURCEDIR30=../src/Utilities/Libraries/sparskit2 +SOURCEDIR31=../src/Utilities/Idm +SOURCEDIR32=../src/Utilities/Idm/mf6blockfile +SOURCEDIR33=../src/Utilities/Vector +SOURCEDIR34=../src/Utilities/OutputControl +SOURCEDIR35=../src/Utilities/Observation +SOURCEDIR36=../src/Idm +SOURCEDIR37=../src/Idm/selector VPATH = \ ${SOURCEDIR1} \ @@ -214,11 +214,11 @@ $(OBJDIR)/BoundaryPackage.o \ $(OBJDIR)/CellDefn.o \ $(OBJDIR)/Particle.o \ $(OBJDIR)/FlowModelInterface.o \ +$(OBJDIR)/Cell.o \ $(OBJDIR)/Subcell.o \ $(OBJDIR)/TrackData.o \ $(OBJDIR)/TimeSelect.o \ $(OBJDIR)/prt-fmi.o \ -$(OBJDIR)/Cell.o \ $(OBJDIR)/sort.o \ $(OBJDIR)/SfrCrossSectionUtils.o \ $(OBJDIR)/TernarySolveTrack.o \ diff --git a/pixi.lock b/pixi.lock index 1254faa52af..6f8be6cb5c5 100644 --- a/pixi.lock +++ b/pixi.lock @@ -51,6 +51,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.0-hf2295e7_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.0-hde27a5a_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda @@ -196,6 +198,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py39h6404dd3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py39h3d6467e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/syrupy-4.6.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 @@ -271,6 +275,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gdk-pixbuf-2.42.11-ha61d561_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/geos-3.12.1-h2f0025b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.13-h2f0025b_1003.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphviz-2.50.0-h65e8cce_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gtk2-2.24.33-h0d7db29_4.conda @@ -375,6 +381,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/shapely-2.0.4-py39h497b60c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/syrupy-4.6.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 @@ -444,6 +452,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/gettext-0.22.5-h5ff76d1_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gettext-tools-0.22.5-h5ff76d1_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphite2-1.3.13-h73e2aa4_1003.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/graphviz-2.50.0-h8671558_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gtk2-2.24.33-h8ca4665_4.conda @@ -549,6 +559,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/shapely-2.0.4-py39h19e25c1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/syrupy-4.6.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 @@ -609,6 +621,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gettext-tools-0.22.5-h8fbad5d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.13-hebf3989_1003.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-2.50.0-h54e2d63_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk2-2.24.33-h7895bb2_4.conda @@ -714,6 +728,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.0.4-py39ha70ab96_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/syrupy-4.6.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 @@ -770,6 +786,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/fribidi-1.0.10-h8d14728_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.12.1-h1537add_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/getopt-win32-0.1-hcfcfb64_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/glib-2.80.0-h39d0aa6_6.conda - conda: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.80.0-h0a98069_6.conda - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.13-h63175ca_1003.conda @@ -886,6 +904,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/shapely-2.0.4-py39h61a8cf5_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/sip-6.7.12-py39h99910a6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/syrupy-4.6.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2021.12.0-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2 @@ -2897,6 +2917,39 @@ packages: license_family: MIT size: 77248 timestamp: 1712692454246 +- kind: conda + name: gitdb + version: 4.0.11 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda + sha256: 52ab2798be31b8f509eeec458712f447ced4f96ecb672c6c9a42778f47e07b1b + md5: 623b19f616f2ca0c261441067e18ae40 + depends: + - python >=3.7 + - smmap >=3.0.1,<6 + license: BSD-3-Clause + license_family: BSD + size: 52872 + timestamp: 1697791718749 +- kind: conda + name: gitpython + version: 3.1.43 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.43-pyhd8ed1ab_0.conda + sha256: cbb2802641a009ce9bcc2a047e817fd8816f9c842036a42f4730398d8e4cda2a + md5: 0b2154c1818111e17381b1df5b4b0176 + depends: + - gitdb >=4.0.1,<5 + - python >=3.7 + - typing_extensions >=3.7.4.3 + license: BSD-3-Clause + license_family: BSD + size: 156827 + timestamp: 1711991122366 - kind: conda name: glib version: 2.80.0 @@ -10149,6 +10202,37 @@ packages: license_family: MIT size: 14259 timestamp: 1620240338595 +- kind: conda + name: smmap + version: 5.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2 + sha256: 23011cb3e064525bdb8787c75126a2e78d2344a72cd6773922006d1da1f2af16 + md5: 62f26a3d1387acee31322208f0cfa3e0 + depends: + - python >=3.5 + license: BSD-3-Clause + license_family: BSD + size: 22483 + timestamp: 1634310465482 +- kind: conda + name: syrupy + version: 4.6.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/syrupy-4.6.1-pyhd8ed1ab_0.conda + sha256: e9833ae370284f5cbdb62078d7db52a133498d44a3d30770c6914589de94a873 + md5: 7a566d6e1b00b1a521ef8db68aa95f4c + depends: + - pytest >=7.0.0,<9.0.0 + - python >=3.8.1,<4.0 + license: Apache-2.0 + license_family: APACHE + size: 43681 + timestamp: 1707319626819 - kind: conda name: tbb version: 2021.12.0 diff --git a/pixi.toml b/pixi.toml index fa17f781889..5e84e1439e0 100644 --- a/pixi.toml +++ b/pixi.toml @@ -11,6 +11,7 @@ filelock = "*" flaky = "*" fortran-language-server = "*" fprettify = "*" +gitpython = "*" jupytext = "*" matplotlib = "*" meson = "1.3.0" @@ -30,6 +31,7 @@ python = "3.9.*" requests = "*" scipy = "*" shapely = "*" +syrupy = "*" xmipy = "*" [tasks] diff --git a/src/Exchange/exg-gwfprt.f90 b/src/Exchange/exg-gwfprt.f90 index 2ea62c71fb3..0d150d9a1ab 100644 --- a/src/Exchange/exg-gwfprt.f90 +++ b/src/Exchange/exg-gwfprt.f90 @@ -252,11 +252,6 @@ subroutine exg_ar(this) end if end if - ! -- todo: set pointer to particle mass concentration, once calculated? - ! if (gwfmodel%inbuy > 0) & - ! call gwfmodel%buy%set_concentration_pointer(& - ! prtmodel%name, prtmodel%mass, prtmodel%ibound) - ! -- transfer the boundary package information from gwf to prt call this%gwfbnd2prtfmi() diff --git a/src/Model/ModelUtilities/TimeSelect.f90 b/src/Model/ModelUtilities/TimeSelect.f90 index 3d8057b971b..86dcd3f0b2f 100644 --- a/src/Model/ModelUtilities/TimeSelect.f90 +++ b/src/Model/ModelUtilities/TimeSelect.f90 @@ -19,7 +19,7 @@ module TimeSelectModule real(DP), allocatable :: times(:) integer(I4B) :: selection(2) contains - procedure :: destroy + procedure :: deallocate procedure :: expand procedure :: init procedure :: increasing @@ -30,10 +30,10 @@ module TimeSelectModule contains !> @brief Destroy the time selection object. - subroutine destroy(this) + subroutine deallocate (this) class(TimeSelectType) :: this deallocate (this%times) - end subroutine destroy + end subroutine deallocate !> @brief Expand capacity by the given amount. Resets the current slice. subroutine expand(this, increment) diff --git a/src/Model/ParticleTracking/prt-fmi.f90 b/src/Model/ParticleTracking/prt-fmi.f90 index 274dbc59192..b7b08e70240 100644 --- a/src/Model/ParticleTracking/prt-fmi.f90 +++ b/src/Model/ParticleTracking/prt-fmi.f90 @@ -7,6 +7,7 @@ module PrtFmiModule use FlowModelInterfaceModule, only: FlowModelInterfaceType use BaseDisModule, only: DisBaseType use BudgetObjectModule, only: BudgetObjectType + use CellModule, only: MAX_POLY_CELLS implicit none private @@ -146,10 +147,10 @@ subroutine prtfmi_df(this, dis, idryinactive) call this%FlowModelInterfaceType%fmi_df(dis, idryinactive) ! ! -- Allocate arrays - allocate (this%StorageFlows(this%dis%nodes)) ! kluge note: need allocate_arrays subroutine + allocate (this%StorageFlows(this%dis%nodes)) allocate (this%SourceFlows(this%dis%nodes)) allocate (this%SinkFlows(this%dis%nodes)) - allocate (this%BoundaryFlows(this%dis%nodes * 10)) ! kluge note: hardwired to max 8 polygon faces plus top and bottom for now + allocate (this%BoundaryFlows(this%dis%nodes * MAX_POLY_CELLS)) end subroutine prtfmi_df @@ -159,24 +160,23 @@ subroutine accumulate_flows(this) ! -- dummy class(PrtFmiType) :: this ! -- local - integer :: j, i, ip, ib - integer :: ioffset, iflowface, iauxiflowface !, iface - double precision :: qbnd + integer(I4B) :: j, i, ip, ib + integer(I4B) :: ioffset, iflowface, iauxiflowface + real(DP) :: qbnd character(len=LENAUXNAME) :: auxname integer(I4B) :: naux ! - this%StorageFlows = 0d0 + this%StorageFlows = DZERO if (this%igwfstrgss /= 0) & this%StorageFlows = this%StorageFlows + & this%gwfstrgss if (this%igwfstrgsy /= 0) & this%StorageFlows = this%StorageFlows + & this%gwfstrgsy - ! kluge note: need separate SourceFlows and SinkFlows? just for budget-reporting? - ! kluge note: SinkFlows used to identify weak sinks - this%SourceFlows = 0d0 - this%SinkFlows = 0d0 - this%BoundaryFlows = 0d0 + + this%SourceFlows = DZERO + this%SinkFlows = DZERO + this%BoundaryFlows = DZERO do ip = 1, this%nflowpack iauxiflowface = 0 naux = this%gwfpackages(ip)%naux @@ -186,34 +186,26 @@ subroutine accumulate_flows(this) if (trim(adjustl(auxname)) == "IFLOWFACE") then iauxiflowface = j exit - ! else if (trim(adjustl(auxname)) == "IFACE") then ! kluge note: allow IFACE and do conversion??? - ! iauxiflowface = -j - ! exit end if end do end if do ib = 1, this%gwfpackages(ip)%nbound i = this%gwfpackages(ip)%nodelist(ib) - ! if (this%gwfibound(i) <= 0) cycle if (this%ibound(i) <= 0) cycle qbnd = this%gwfpackages(ip)%get_flow(ib) - iflowface = 0 ! kluge note: eventually have default iflowface values for different packages + ! todo, after initial release: default iflowface values for different packages + iflowface = 0 if (iauxiflowface > 0) then - ! expected int here... ok to round?? iflowface = NINT(this%gwfpackages(ip)%auxvar(iauxiflowface, ib)) - if (iflowface < 0) iflowface = iflowface + 11 ! bot -> 9, top -> 10; see note re: max faces below - ! else if (iauxiflowface < 0) then ! kluge note: allow IFACE and do conversion??? - ! ! kluge note: is it possible to check for a rectangular-celled grid here??? - ! iface = this%gwfpackages(ip)%auxvar(-iauxiflowface, ib) - ! iflowface = iface ! kluge note: will need to convert + if (iflowface < 0) iflowface = iflowface + MAX_POLY_CELLS + 1 ! bot -> 9, top -> 10; see note re: max faces below end if if (iflowface .gt. 0) then - ioffset = (i - 1) * 10 ! kluge note: hardwired for max 8 polygon faces plus top and bottom for now + ioffset = (i - 1) * MAX_POLY_CELLS this%BoundaryFlows(ioffset + iflowface) = & this%BoundaryFlows(ioffset + iflowface) + qbnd - else if (qbnd .gt. 0d0) then + else if (qbnd .gt. DZERO) then this%SourceFlows(i) = this%SourceFlows(i) + qbnd - else if (qbnd .lt. 0d0) then + else if (qbnd .lt. DZERO) then this%SinkFlows(i) = this%SinkFlows(i) + qbnd end if end do diff --git a/src/Model/ParticleTracking/prt-oc.f90 b/src/Model/ParticleTracking/prt-oc.f90 index 295455acb92..0be8dc1b505 100644 --- a/src/Model/ParticleTracking/prt-oc.f90 +++ b/src/Model/ParticleTracking/prt-oc.f90 @@ -150,7 +150,7 @@ subroutine prt_oc_da(this) ! -- local integer(I4B) :: i - call this%tracktimes%destroy() + call this%tracktimes%deallocate() do i = 1, size(this%ocdobj) call this%ocdobj(i)%ocd_da() diff --git a/src/Model/ParticleTracking/prt-prp.f90 b/src/Model/ParticleTracking/prt-prp.f90 index 39a6b8800c6..0bafbf041fc 100644 --- a/src/Model/ParticleTracking/prt-prp.f90 +++ b/src/Model/ParticleTracking/prt-prp.f90 @@ -13,7 +13,7 @@ module PrtPrpModule use BlockParserModule, only: BlockParserType use PrtFmiModule, only: PrtFmiType use ParticleModule, only: ParticleType, ParticleStoreType, & - create_particle, create_particle_store + create_particle, allocate_particle_store use SimModule, only: count_errors, store_error, store_error_unit, & store_warning use SimVariablesModule, only: errmsg, warnmsg @@ -63,6 +63,7 @@ module PrtPrpModule real(DP), pointer, contiguous :: rptmass(:) => null() !< total mass released from point character(len=LENBOUNDNAME), pointer, contiguous :: rptname(:) => null() !< release point names type(TimeSelectType), pointer :: releasetimes + integer(I4B), pointer :: ifrctrn => NULL() contains procedure :: prp_allocate_arrays @@ -155,6 +156,7 @@ subroutine prp_da(this) call mem_deallocate(this%itrkhdr) call mem_deallocate(this%itrkcsv) call mem_deallocate(this%irlstls) + call mem_deallocate(this%ifrctrn) ! -- deallocate arrays call mem_deallocate(this%rptx) @@ -167,11 +169,11 @@ subroutine prp_da(this) call mem_deallocate(this%rptname, 'RPTNAME', this%memoryPath) ! -- deallocate particle store - call this%particles%destroy(this%memoryPath) + call this%particles%deallocate(this%memoryPath) deallocate (this%particles) ! -- deallocate release time selection - call this%releasetimes%destroy() + call this%releasetimes%deallocate() deallocate (this%releasetimes) end subroutine prp_da @@ -199,7 +201,10 @@ subroutine prp_allocate_arrays(this, nodelist, auxvar) ! -- Allocate particle store, starting with the number ! of release points (arrays resized if/when needed) - call create_particle_store(this%particles, this%nreleasepts, this%memoryPath) + call allocate_particle_store( & + this%particles, & + this%nreleasepts, & + this%memoryPath) ! -- Allocate arrays call mem_allocate(this%rptx, this%nreleasepts, 'RPTX', this%memoryPath) @@ -248,6 +253,7 @@ subroutine prp_allocate_scalars(this) call mem_allocate(this%itrkhdr, 'ITRKHDR', this%memoryPath) call mem_allocate(this%itrkcsv, 'ITRKCSV', this%memoryPath) call mem_allocate(this%irlstls, 'IRLSTLS', this%memoryPath) + call mem_allocate(this%ifrctrn, 'IFRCTRN', this%memoryPath) ! -- Set values this%rlsall = .false. @@ -266,6 +272,7 @@ subroutine prp_allocate_scalars(this) this%itrkhdr = 0 this%itrkcsv = 0 this%irlstls = 0 + this%ifrctrn = 0 end subroutine prp_allocate_scalars !> @ brief Allocate and read period data @@ -448,6 +455,8 @@ subroutine prp_ad(this) particle%iboundary(2) = 0 particle%idomain(3) = 0 particle%iboundary(3) = 0 + particle%ifrctrn = this%ifrctrn + call this%particles%load_from_particle(particle, np) ! -- Accumulate mass release from this point @@ -479,7 +488,7 @@ subroutine prp_rp(this) "('Looking for BEGIN PERIOD iper. & &Found ', a, ' instead.')" character(len=*), parameter :: fmt_steps = & - "(6x,'TIME STEP(S) ',50(I0,' '))" ! kluge 50 (similar to STEPS in OC)? + "(6x,'TIME STEP(S) ',50(I0,' '))" ! 50 limit is similar to STEPS in OC character(len=*), parameter :: fmt_freq = & "(6x,'EVERY ',I0,' TIME STEP(S)')" character(len=*), parameter :: fmt_fracs = & @@ -614,7 +623,7 @@ subroutine prp_cq_simrate(this, hnew, flowja, imover) use TdisModule, only: delt ! -- dummy variables class(PrtPrpType) :: this - real(DP), dimension(:), intent(in) :: hnew !< todo: mass concentration? + real(DP), dimension(:), intent(in) :: hnew real(DP), dimension(:), intent(inout) :: flowja !< flow between package and model integer(I4B), intent(in) :: imover !< flag indicating if the mover package is active ! -- local variables @@ -631,11 +640,9 @@ subroutine prp_cq_simrate(this, hnew, flowja, imover) node = this%nodelist(i) rrate = DZERO ! -- If cell is no-flow or constant-head, then ignore it. - ! todo: think about condition(s) under which to ignore cell if (node > 0) then - idiag = this%dis%con%ia(node) - ! todo: think about condition(s) under which to ignore cell ! -- Calculate the flow rate into the cell. + idiag = this%dis%con%ia(node) rrate = this%rptmass(i) * (DONE / delt) ! reciprocal of tstp length flowja(idiag) = flowja(idiag) + rrate end if @@ -645,26 +652,9 @@ subroutine prp_cq_simrate(this, hnew, flowja, imover) end do end subroutine prp_cq_simrate - !> @ brief Define list heading written with PRINT_INPUT option - subroutine define_listlabel(this) ! kluge note: update for PRT? + subroutine define_listlabel(this) class(PrtPrpType), intent(inout) :: this - - ! -- create the header list label - this%listlabel = trim(this%filtyp)//' NO.' - if (this%dis%ndim == 3) then - write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER' - write (this%listlabel, '(a, a7)') trim(this%listlabel), 'ROW' - write (this%listlabel, '(a, a7)') trim(this%listlabel), 'COL' - elseif (this%dis%ndim == 2) then - write (this%listlabel, '(a, a7)') trim(this%listlabel), 'LAYER' - write (this%listlabel, '(a, a7)') trim(this%listlabel), 'CELL2D' - else - write (this%listlabel, '(a, a7)') trim(this%listlabel), 'NODE' - end if - write (this%listlabel, '(a, a16)') trim(this%listlabel), 'STRESS RATE' - if (this%inamedbound == 1) then - write (this%listlabel, '(a, a16)') trim(this%listlabel), 'BOUNDARY NAME' - end if + ! not implemented, not used end subroutine define_listlabel !> @brief Indicates whether observations are supported. @@ -809,6 +799,12 @@ subroutine prp_options(this, option, found) case ('LOCAL_Z') this%localz = .true. found = .true. + case ('DEV_FORCETERNARY') + call this%parser%DevOpt() + this%ifrctrn = 1 + write (this%iout, '(4x,a)') & + 'TRACKING WILL BE DONE USING THE TERNARY METHOD REGARDLESS OF CELL TYPE' + found = .true. case default found = .false. end select diff --git a/src/Model/ParticleTracking/prt.f90 b/src/Model/ParticleTracking/prt.f90 index 66fe08bfb1d..d62a9b0b242 100644 --- a/src/Model/ParticleTracking/prt.f90 +++ b/src/Model/ParticleTracking/prt.f90 @@ -438,14 +438,13 @@ subroutine prt_cq_sto(this) this%masssto(n) = DZERO this%ratesto(n) = DZERO end do - do ip = 1, this%bndlist%Count() ! kluge note: could accumulate masssto on the fly in prt_solve instead + do ip = 1, this%bndlist%Count() packobj => GetBndFromList(this%bndlist, ip) select type (packobj) type is (PrtPrpType) do np = 1, packobj%nparticles istatus = packobj%particles%istatus(np) - ! refine these conditions as necessary - ! (status 8 is permanently unreleased) + ! this may need to change if istatus flags change if ((istatus > 0) .and. (istatus /= 8)) then n = packobj%particles%idomain(np, 2) ! -- Each particle currently assigned unit mass @@ -454,7 +453,7 @@ subroutine prt_cq_sto(this) end do end select end do - do n = 1, this%dis%nodes ! kluge note: set rate to zero and skip inactive nodes? + do n = 1, this%dis%nodes rate = -(this%masssto(n) - this%massstoold(n)) * tled this%ratesto(n) = rate idiag = this%dis%con%ia(n) @@ -771,7 +770,6 @@ subroutine prt_da(this) call mem_deallocate(this%inmvt) call mem_deallocate(this%inoc) call mem_deallocate(this%inobs) - call mem_deallocate(this%nprp) ! -- Arrays call mem_deallocate(this%masssto) @@ -804,7 +802,6 @@ subroutine allocate_scalars(this, modelname) call mem_allocate(this%inssm, 'INSSM', this%memoryPath) call mem_allocate(this%inoc, 'INOC ', this%memoryPath) call mem_allocate(this%inobs, 'INOBS', this%memoryPath) - call mem_allocate(this%nprp, 'NPRP', this%memoryPath) ! kluge? this%infmi = 0 this%inmip = 0 @@ -815,7 +812,6 @@ subroutine allocate_scalars(this, modelname) this%inssm = 0 this%inoc = 0 this%inobs = 0 - this%nprp = 0 end subroutine allocate_scalars !> @brief Allocate arrays @@ -874,7 +870,6 @@ subroutine package_create(this, filtyp, ipakid, ipaknum, pakname, mempath, & ! -- This part creates the package object select case (filtyp) case ('PRP6') - this%nprp = this%nprp + 1 call prp_create(packobj, ipakid, ipaknum, inunit, iout, & this%name, pakname, mempath, this%fmi) case ('API6') diff --git a/src/Solution/ParticleTracker/Cell.f90 b/src/Solution/ParticleTracker/Cell.f90 index 00aee613d48..48be001f1df 100644 --- a/src/Solution/ParticleTracker/Cell.f90 +++ b/src/Solution/ParticleTracker/Cell.f90 @@ -1,10 +1,13 @@ module CellModule use CellDefnModule, only: CellDefnType + use KindModule, only: I4B implicit none private public :: CellType + integer(I4B), public, parameter :: MAX_POLY_CELLS = 10 + !> @brief Base type for grid cells of a concrete type. Contains !! a cell-definition which is information shared by cell types. type, abstract :: CellType diff --git a/src/Solution/ParticleTracker/CellDefn.f90 b/src/Solution/ParticleTracker/CellDefn.f90 index 6f4551ce946..4bd3ec1c46a 100644 --- a/src/Solution/ParticleTracker/CellDefn.f90 +++ b/src/Solution/ParticleTracker/CellDefn.f90 @@ -4,7 +4,7 @@ module CellDefnModule private public :: CellDefnType - public :: create_defn + public :: create_defn, get_iatop !> @brief Base grid cell definition. type CellDefnType @@ -48,47 +48,60 @@ subroutine create_defn(cellDefn) allocate (cellDefn%faceflow(7)) end subroutine create_defn + !> @brief Get the index corresponding to top elevation of a cell in the grid. + !! This is -1 if the cell is in the top layer and 1 otherwise. + function get_iatop(ncpl, icu) result(iatop) + integer(I4B), intent(in) :: ncpl, icu + integer(I4B) :: iatop + + if (icu .le. ncpl) then + iatop = -1 + else + iatop = 1 + end if + end function get_iatop + !> @brief Return the number of polygon vertices function get_npolyverts(this) result(npolyverts) class(CellDefnType), intent(inout) :: this - integer :: npolyverts + integer(I4B) :: npolyverts npolyverts = this%npolyverts end function get_npolyverts !> @brief Return 180-degree indicator for a vertex function get_ispv180(this, m) result(ispv180) class(CellDefnType), intent(inout) :: this - integer :: m - logical :: ispv180 + integer(I4B) :: m + logical(LGP) :: ispv180 ispv180 = this%ispv180(m) end function get_ispv180 !> @brief Return the bottom flow function get_botflow(this) result(botflow) class(CellDefnType), intent(inout) :: this - double precision :: botflow + real(DP) :: botflow botflow = this%faceflow(this%npolyverts + 2) end function get_botflow !> @brief Return the top flow function get_topflow(this) result(topflow) class(CellDefnType), intent(inout) :: this - double precision :: topflow + real(DP) :: topflow topflow = this%faceflow(this%npolyverts + 3) end function get_topflow !> @brief Return the distributed flow function get_distflow(this) result(distflow) class(CellDefnType), intent(inout) :: this - double precision :: distflow + real(DP) :: distflow distflow = this%distflow end function get_distflow !> @brief Return a face flow function get_faceflow(this, m) result(faceflow) class(CellDefnType), intent(inout) :: this - integer :: m - double precision :: faceflow + integer(I4B) :: m + real(DP) :: faceflow faceflow = this%faceflow(m) end function get_faceflow diff --git a/src/Solution/ParticleTracker/CellRectQuad.f90 b/src/Solution/ParticleTracker/CellRectQuad.f90 index 0ea00c9752f..475386afa8b 100644 --- a/src/Solution/ParticleTracker/CellRectQuad.f90 +++ b/src/Solution/ParticleTracker/CellRectQuad.f90 @@ -1,7 +1,9 @@ module CellRectQuadModule + use KindModule, only: DP, I4B, LGP use CellModule, only: CellType use CellDefnModule, only: CellDefnType, create_defn + use ConstantsModule, only: DZERO implicit none private @@ -9,32 +11,31 @@ module CellRectQuadModule public :: create_cell_rect_quad type, extends(CellType) :: CellRectQuadType - double precision :: dx ! dimension of cell in local x direction - double precision :: dy ! dimension of cell in local y direction - double precision :: dz ! dimension of cell in z direction - - double precision :: sinrot ! sine of rotation angle for local (x, y) - double precision :: cosrot ! cosine of rotation angle for local (x, y) - - integer :: irvOrigin ! origin rectangle vertex - double precision :: xOrigin ! model x origin for local (x, y) - double precision :: yOrigin ! model y origin for local (x, y) - double precision :: zOrigin ! model z origin for local z - - double precision :: qextl1(4), qextl2(4), qintl(5) ! external and internal subcell flows for the cell - integer, allocatable :: irectvert(:) ! list of indices of the rectangle vertices - integer, allocatable :: ipv4irv(:, :) ! list of the polygon vertex indices that correspond to the rectangle vertex indices - double precision, allocatable :: rectflow(:, :) ! flow(s) for each rectangle face + real(DP) :: dx !< dimension of cell in local x direction + real(DP) :: dy !< dimension of cell in local y direction + real(DP) :: dz !< dimension of cell in z direction + + real(DP) :: sinrot !< sine of rotation angle for local (x, y) + real(DP) :: cosrot !< cosine of rotation angle for local (x, y) + + integer(I4B) :: irvOrigin !< origin rectangle vertex + real(DP) :: xOrigin !< model x origin for local (x, y) + real(DP) :: yOrigin !< model y origin for local (x, y) + real(DP) :: zOrigin !< model z origin for local z + + real(DP) :: qextl1(4), qextl2(4), qintl(5) !< external and internal subcell flows for the cell + integer(I4B), allocatable :: irectvert(:) !< list of indices of the rectangle vertices + integer(I4B), allocatable :: ipv4irv(:, :) !< list of the polygon vertex indices that correspond to the rectangle vertex indices + real(DP), allocatable :: rectflow(:, :) !< flow(s) for each rectangle face contains - procedure :: destroy => destroy_cell_rect_quad ! destructor for the cell - procedure :: init_from ! initializes the cell from an existing cell + procedure :: destroy => destroy_cell_rect_quad !< destructor for the cell + procedure :: init_from !< initializes the cell from an existing cell - procedure :: load_irectvert ! loads list of indices of the rectangle vertices + procedure :: load_irectvert_rectflow ! loads list of indices of the rectangle vertices and face flows procedure :: get_irectvertSW ! gets index of southwest rectangle vertex procedure :: get_rectDimensionsRotation ! gets rectangular dimensions and rotation - - procedure :: get_rectflow ! returns a rectangle face flow - procedure :: face_is_refined ! returns whether a rectangle face is refined + procedure :: get_rectflow !< returns a rectangle face flow + procedure :: face_is_refined !< returns whether a rectangle face is refined end type CellRectQuadType contains @@ -59,24 +60,25 @@ subroutine destroy_cell_rect_quad(this) deallocate (this%type) end subroutine destroy_cell_rect_quad - !> @brief Initialize a rectangular-quad cell from another cell + !> @brief Initialize a rectangular-quad cell from cell definition subroutine init_from(this, defn) class(CellRectQuadType), intent(inout) :: this type(CellDefnType), pointer :: defn this%defn => defn - call this%load_irectvert() + call this%load_irectvert_rectflow() end subroutine init_from - !> @brief Load local polygon vertex indices + !> @brief Load local polygon vertex indices and rectangular + !> face flows !! !! Loads local polygon vertex indices of the four rectangle - !! vertices of a rectangular-quad cell. Todo: rename? + !! vertices and face flows of a rectangular-quad cell. !< - subroutine load_irectvert(this) + subroutine load_irectvert_rectflow(this) ! -- dummy class(CellRectQuadType), intent(inout) :: this ! -- local - integer :: npolyverts, n, m + integer(I4B) :: npolyverts, n, m npolyverts = this%defn%get_npolyverts() @@ -88,7 +90,7 @@ subroutine load_irectvert(this) this%ipv4irv(1, n) = m this%rectflow(1, n) = this%defn%get_faceflow(m) this%ipv4irv(2, n) = 0 - this%rectflow(2, n) = 0d0 + this%rectflow(2, n) = DZERO else if (n .ne. 0) then this%ipv4irv(2, n) = m @@ -99,7 +101,7 @@ subroutine load_irectvert(this) ! Wrap around for convenience this%irectvert(5) = this%irectvert(1) - end subroutine load_irectvert + end subroutine load_irectvert_rectflow !> @brief Get index of SW rectangle vertex !! @@ -109,11 +111,11 @@ end subroutine load_irectvert function get_irectvertSW(this) result(irv1) ! -- dummy class(CellRectQuadType), intent(inout) :: this - integer :: irv1 + integer(I4B) :: irv1 ! -- local - integer :: irv, irv2, irv4, ipv1, ipv2, ipv4 - integer, dimension(4) :: irvnxt = (/2, 3, 4, 1/) ! kluge??? - double precision :: x1, y1, x2, y2, x4, y4 + integer(I4B) :: irv, irv2, irv4, ipv1, ipv2, ipv4 + integer(I4B), dimension(4) :: irvnxt = (/2, 3, 4, 1/) + real(DP) :: x1, y1, x2, y2, x4, y4 ! -- Find the "southwest" rectangle vertex by finding the vertex formed ! -- either by (1) a rectangle edge over which x decreases (going @@ -155,16 +157,16 @@ subroutine get_rectDimensionsRotation(this, irv1, xOrigin, yOrigin, zOrigin, & dx, dy, dz, sinrot, cosrot) ! -- dummy class(CellRectQuadType), intent(inout) :: this - integer :: irv1 - double precision :: xOrigin, yOrigin, zOrigin, dx, dy, dz, sinrot, cosrot + integer(I4B) :: irv1 + real(DP) :: xOrigin, yOrigin, zOrigin, dx, dy, dz, sinrot, cosrot ! -- local - integer :: irv2, irv4, ipv1, ipv2, ipv4 - integer, dimension(4) :: irvnxt = (/2, 3, 4, 1/) ! kluge??? - double precision :: x1, y1, x2, y2, x4, y4, dx2, dy2, dx4, dy4 + integer(I4B) :: irv2, irv4, ipv1, ipv2, ipv4 + integer(I4B), dimension(4) :: irvnxt = (/2, 3, 4, 1/) + real(DP) :: x1, y1, x2, y2, x4, y4, dx2, dy2, dx4, dy4 ! -- Get rectangle vertex neighbors irv2 and irv4 irv2 = irvnxt(irv1) - irv4 = irvnxt(irvnxt(irv2)) ! kluge + irv4 = irvnxt(irvnxt(irv2)) ! -- Get model coordinates at irv1, irv2, and irv4 ipv1 = this%irectvert(irv1) @@ -187,7 +189,7 @@ subroutine get_rectDimensionsRotation(this, irv1, xOrigin, yOrigin, zOrigin, & dy4 = y4 - yOrigin dx = dsqrt(dx4 * dx4 + dy4 * dy4) dy = dsqrt(dx2 * dx2 + dy2 * dy2) - dz = this%defn%top - zOrigin ! kluge note: need to account for partial saturation + dz = this%defn%top - zOrigin ! -- Compute sine and cosine of rotation angle (angle between "southern" ! -- rectangle side irv1-irv4 and the model x axis) @@ -198,8 +200,8 @@ end subroutine get_rectDimensionsRotation !> @brief Return a rectangle face flow function get_rectflow(this, iq, irv) result(rectflow) class(CellRectQuadType), intent(inout) :: this - integer :: iq, irv - double precision :: rectflow + integer(I4B) :: iq, irv + real(DP) :: rectflow rectflow = this%rectflow(iq, irv) end function get_rectflow @@ -207,8 +209,8 @@ end function get_rectflow function face_is_refined(this, i) result(is_refined) ! -- dummy class(CellRectQuadType), intent(inout) :: this - integer :: i !< face index - logical :: is_refined + integer(I4B) :: i !< face index + logical(LGP) :: is_refined if (this%ipv4irv(2, i) .ne. 0) then is_refined = .true. diff --git a/src/Solution/ParticleTracker/CellUtil.f90 b/src/Solution/ParticleTracker/CellUtil.f90 index 0e4eabcf170..cf28178cb6d 100644 --- a/src/Solution/ParticleTracker/CellUtil.f90 +++ b/src/Solution/ParticleTracker/CellUtil.f90 @@ -1,5 +1,5 @@ module CellUtilModule - + use KindModule, only: I4B, DP implicit none private @@ -8,7 +8,8 @@ module CellUtilModule contains - !> @brief Convert CellPoly representation to CellRect if possible + !> @brief Convert CellPoly representation to CellRect. + !! Assumes the conversion is possible. subroutine cell_poly_to_rect(poly, rect) use ConstantsModule, only: DONE use CellRectModule, only: CellRectType, create_cell_rect @@ -19,17 +20,15 @@ subroutine cell_poly_to_rect(poly, rect) type(CellRectType), intent(inout), pointer :: rect ! -- local type(CellDefnType), pointer :: defn - integer :: ipv, ipv1, ipv2, ipv3, ipv4 - integer, dimension(4) :: ipvnxt = (/2, 3, 4, 1/) - double precision :: x1, y1, x2, y2, x4, y4 - double precision :: dx2, dy2, dx4, dy4, areax, areay, areaz - double precision :: xOrigin, yOrigin, zOrigin, dx, dy, dz, sinrot, cosrot - double precision :: factor, term + integer(I4B) :: ipv, ipv1, ipv2, ipv3, ipv4 + integer(I4B), dimension(4) :: ipvnxt = (/2, 3, 4, 1/) + real(DP) :: x1, y1, x2, y2, x4, y4 + real(DP) :: dx2, dy2, dx4, dy4, areax, areay, areaz + real(DP) :: xOrigin, yOrigin, zOrigin, dx, dy, dz, sinrot, cosrot + real(DP) :: factor, term call create_cell_rect(rect) defn => poly%defn - ! -- kluge note: no check whether conversion is possible; assumes it is - ! -- Translate and rotate the rectangular cell into local coordinates ! -- with x varying from 0 to dx and y varying from 0 to dy. Choose the ! -- "south-west" vertex to be the local origin so that the rotation @@ -80,7 +79,7 @@ subroutine cell_poly_to_rect(poly, rect) dy4 = y4 - yOrigin dx = dsqrt(dx4 * dx4 + dy4 * dy4) dy = dsqrt(dx2 * dx2 + dy2 * dy2) - dz = defn%top - zOrigin ! todo: need to account for partial saturation + dz = defn%top - zOrigin sinrot = dy4 / dx cosrot = dx4 / dx rect%defn = poly%defn @@ -110,7 +109,8 @@ subroutine cell_poly_to_rect(poly, rect) rect%vz2 = -defn%faceflow(7) * term end subroutine cell_poly_to_rect - !> @brief Convert CellPoly representation to CellRectQuad if possible + !> @brief Convert CellPoly representation to CellRectQuad. + !! Assumes the conversion is possible. subroutine cell_poly_to_quad(poly, quad) use CellRectQuadModule, only: CellRectQuadType, create_cell_rect_quad use CellPolyModule, only: CellPolyType @@ -119,18 +119,18 @@ subroutine cell_poly_to_quad(poly, quad) type(CellPolyType), intent(in), pointer :: poly type(CellRectQuadType), intent(inout), pointer :: quad ! -- local - integer :: i, irv, isc - double precision :: qhalf, qdisttopbot, q1, q2, q4 + integer(I4B) :: i, irv, isc + real(DP) :: qhalf, qdisttopbot, q1, q2, q4 call create_cell_rect_quad(quad) call quad%init_from(poly%defn) - ! kluge note: no check whether conversion is possible; assumes it is ! -- Translate and rotate the rect-quad cell into local coordinates with ! -- x varying from 0 to dx and y varying from 0 to dy. Choose the "south- ! -- west" rectangle vertex to be the local origin so that the rotation ! -- angle is zero if the cell already aligns with the model x and y ! -- coordinates. - quad%irvOrigin = quad%get_irectvertSW() ! kluge note: no need to pass all that stuff in call below -- set internally in CellRectQuad + quad%irvOrigin = quad%get_irectvertSW() + ! todo, before/after initial release: refactor without unnecessary args call quad%get_rectDimensionsRotation( & quad%irvOrigin, quad%xOrigin, & quad%yOrigin, quad%zOrigin, & diff --git a/src/Solution/ParticleTracker/Method.f90 b/src/Solution/ParticleTracker/Method.f90 index 55ac806a35f..6b9b5e91d64 100644 --- a/src/Solution/ParticleTracker/Method.f90 +++ b/src/Solution/ParticleTracker/Method.f90 @@ -14,7 +14,7 @@ module MethodModule implicit none private - public :: MethodType, get_iatop + public :: MethodType !> @brief Base type for particle tracking methods. !! @@ -202,40 +202,27 @@ subroutine update(this, particle, cell_defn) if (particle%istopzone .eq. cell_defn%izone) then particle%advancing = .false. particle%istatus = 6 - call this%save(particle, reason=3) ! reason=3: termination + call this%save(particle, reason=3) ! particle terminated return end if end if if (cell_defn%inoexitface .ne. 0) then particle%advancing = .false. particle%istatus = 5 - call this%save(particle, reason=3) ! reason=3: termination + call this%save(particle, reason=3) ! particle terminated return end if if (cell_defn%iweaksink .ne. 0) then if (particle%istopweaksink .ne. 0) then particle%advancing = .false. particle%istatus = 3 - call this%save(particle, reason=3) ! reason=3: termination + call this%save(particle, reason=3) ! particle terminated return else - call this%save(particle, reason=4) ! reason=4: exited weak sink + call this%save(particle, reason=4) ! particle exited weak sink return end if end if end subroutine update - !> @brief Get the index corresponding to top elevation of a cell in the grid. - !! This is -1 if the cell is in the top layer and 1 otherwise. - function get_iatop(ncpl, icu) result(iatop) - integer(I4B), intent(in) :: ncpl, icu - integer(I4B) :: iatop - - if (icu .le. ncpl) then - iatop = -1 - else - iatop = 1 - end if - end function get_iatop - end module MethodModule diff --git a/src/Solution/ParticleTracker/MethodCellPollock.f90 b/src/Solution/ParticleTracker/MethodCellPollock.f90 index ad2bdbe5642..2b41f2c13bb 100644 --- a/src/Solution/ParticleTracker/MethodCellPollock.f90 +++ b/src/Solution/ParticleTracker/MethodCellPollock.f90 @@ -1,7 +1,7 @@ module MethodCellPollockModule use KindModule, only: DP, I4B - use ConstantsModule, only: DONE + use ConstantsModule, only: DONE, DZERO use MethodModule, only: MethodType use MethodSubcellPoolModule, only: method_subcell_plck, & method_subcell_tern @@ -157,7 +157,7 @@ subroutine apply_mcp(this, particle, tmax) cosrot = cell%cosrot call particle%transform(xOrigin, yOrigin, zOrigin, & sinrot, cosrot) - call this%track(particle, 2, tmax) ! kluge, hardwired to level 2 + call this%track(particle, 2, tmax) call particle%transform(xOrigin, yOrigin, zOrigin, & sinrot, cosrot, invert=.true.) call particle%transform(reset=.true.) @@ -165,7 +165,6 @@ subroutine apply_mcp(this, particle, tmax) end subroutine apply_mcp !> @brief Loads the lone rectangular subcell from the rectangular cell - !! kluge note: is levelNext needed here and in similar "load" routines??? subroutine load_subcell(this, particle, subcell) ! ! -- dummy class(MethodCellPollockType), intent(inout) :: this @@ -181,14 +180,14 @@ subroutine load_subcell(this, particle, subcell) ! subcell%dx = cell%dx subcell%dy = cell%dy subcell%dz = cell%dz - subcell%sinrot = 0d0 - subcell%cosrot = 1d0 ! kluge note: rethink how/where to store subcell data??? - subcell%xOrigin = 0d0 - subcell%yOrigin = 0d0 - subcell%zOrigin = 0d0 + subcell%sinrot = DZERO + subcell%cosrot = DONE + subcell%xOrigin = DZERO + subcell%yOrigin = DZERO + subcell%zOrigin = DZERO ! -- Set subcell edge velocities - subcell%vx1 = cell%vx1 ! kluge note: cell velocities now already account for retfactor and porosity + subcell%vx1 = cell%vx1 ! cell velocities already account for retfactor and porosity subcell%vx2 = cell%vx2 subcell%vy1 = cell%vy1 subcell%vy2 = cell%vy2 diff --git a/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 b/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 index fd033cdcb5d..4606171c97e 100644 --- a/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 +++ b/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 @@ -2,7 +2,7 @@ module MethodCellPollockQuadModule use KindModule, only: DP, I4B use ErrorUtilModule, only: pstop - use ConstantsModule, only: DONE + use ConstantsModule, only: DONE, DZERO use MethodModule, only: MethodType use MethodSubcellPoolModule, only: method_subcell_plck use CellRectQuadModule, only: CellRectQuadType, create_cell_rect_quad @@ -75,7 +75,7 @@ subroutine pass_mcpq(this, particle) class(MethodCellPollockQuadType), intent(inout) :: this type(ParticleType), pointer, intent(inout) :: particle ! -- local - integer :: isc, exitFace, npolyverts, inface, infaceoff + integer(I4B) :: isc, exitFace, npolyverts, inface, infaceoff select type (cell => this%cell) type is (CellRectQuadType) @@ -83,7 +83,8 @@ subroutine pass_mcpq(this, particle) isc = particle%idomain(3) npolyverts = cell%defn%npolyverts - select case (exitFace) ! kluge note: exitFace uses Dave's iface convention + ! exitFace uses MODPATH 7 iface convention here + select case (exitFace) case (0) ! -- Subcell interior (cell interior) inface = -1 @@ -93,41 +94,41 @@ subroutine pass_mcpq(this, particle) ! -- W face, subcell 1 --> E face, subcell 4 (cell interior) particle%idomain(3) = 4 particle%iboundary(3) = 2 - inface = 0 ! kluge note: want Domain(2) unchanged; Boundary(2) = 0 + inface = 0 ! want Domain(2) unchanged; Boundary(2) = 0 case (2) ! -- W face, subcell 2 --> E face, subcell 3 (cell interior) particle%idomain(3) = 3 particle%iboundary(3) = 2 - inface = 0 ! kluge note: want Domain(2) unchanged; Boundary(2) = 0 + inface = 0 ! want Domain(2) unchanged; Boundary(2) = 0 case (3) ! -- W face, subcell 3 (cell face) - inface = 1 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + inface = 1 ! want Domain(2) = -Domain(2); Boundary(2) = inface infaceoff = 0 case (4) ! -- W face, subcell 4 (cell face) - inface = 2 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + inface = 2 ! want Domain(2) = -Domain(2); Boundary(2) = inface infaceoff = -1 end select case (2) select case (isc) case (1) ! -- E face, subcell 1 (cell face) - inface = 3 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + inface = 3 ! want Domain(2) = -Domain(2); Boundary(2) = inface infaceoff = 0 case (2) ! -- E face, subcell 2 (cell face) - inface = 4 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + inface = 4 ! want Domain(2) = -Domain(2); Boundary(2) = inface infaceoff = -1 case (3) ! -- E face, subcell 3 --> W face, subcell 2 (cell interior) particle%idomain(3) = 2 particle%iboundary(3) = 1 - inface = 0 ! kluge note: want Domain(2) unchanged; Boundary(2) = 0 + inface = 0 ! want Domain(2) unchanged; Boundary(2) = 0 case (4) ! -- E face, subcell 4 --> W face subcell 1 (cell interior) particle%idomain(3) = 1 particle%iboundary(3) = 1 - inface = 0 ! kluge note: want Domain(2) unchanged; Boundary(2) = 0 + inface = 0 ! want Domain(2) unchanged; Boundary(2) = 0 end select case (3) select case (isc) @@ -135,49 +136,50 @@ subroutine pass_mcpq(this, particle) ! -- S face, subcell 1 --> N face, subcell 2 (cell interior) particle%idomain(3) = 2 particle%iboundary(3) = 4 - inface = 0 ! kluge note: want Domain(2) unchanged; Boundary(2) = 0 + inface = 0 ! want Domain(2) unchanged; Boundary(2) = 0 case (2) ! -- S face, subcell 2 (cell face) - inface = 4 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + inface = 4 ! want Domain(2) = -Domain(2); Boundary(2) = inface infaceoff = 0 case (3) ! -- S face, subcell 3 (cell face) - inface = 1 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + inface = 1 ! want Domain(2) = -Domain(2); Boundary(2) = inface infaceoff = -1 case (4) ! -- S face, subcell 4 --> N face, subcell 3 (cell interior) particle%idomain(3) = 3 particle%iboundary(3) = 4 - inface = 0 ! kluge note: want Domain(2) unchanged; Boundary(2) = 0 + inface = 0 ! want Domain(2) unchanged; Boundary(2) = 0 end select case (4) select case (isc) case (1) ! -- N face, subcell 1 (cell face) - inface = 3 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + inface = 3 ! want Domain(2) = -Domain(2); Boundary(2) = inface infaceoff = -1 case (2) ! -- N face, subcell 2 --> S face, subcell 1 (cell interior) particle%idomain(3) = 1 particle%iboundary(3) = 3 - inface = 0 ! kluge note: want Domain(2) unchanged; Boundary(2) = 0 + inface = 0 ! want Domain(2) unchanged; Boundary(2) = 0 case (3) ! -- N face, subcell 3 --> S face, subcell 4 (cell interior) particle%idomain(3) = 4 particle%iboundary(3) = 3 - inface = 0 ! kluge note: want Domain(2) unchanged; Boundary(2) = 0 + inface = 0 ! want Domain(2) unchanged; Boundary(2) = 0 case (4) ! -- N face, subcell 4 (cell face) - inface = 2 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + inface = 2 ! want Domain(2) = -Domain(2); Boundary(2) = inface infaceoff = 0 end select case (5) ! -- Subcell bottom (cell bottom) - inface = npolyverts + 2 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + inface = npolyverts + 2 ! want Domain(2) = -Domain(2); Boundary(2) = inface case (6) ! -- Subcell top (cell top) - inface = npolyverts + 3 ! kluge note: want Domain(2) = -Domain(2); Boundary(2) = inface + inface = npolyverts + 3 ! want Domain(2) = -Domain(2); Boundary(2) = inface end select + if (inface .eq. -1) then particle%iboundary(2) = 0 else if (inface .eq. 0) then @@ -230,7 +232,7 @@ subroutine apply_mcpq(this, particle, tmax) cosrot = cell%cosrot call particle%transform(xOrigin, yOrigin, zOrigin, & sinrot, cosrot) - call this%track(particle, 2, tmax) ! kluge, hardwired to level 2 + call this%track(particle, 2, tmax) call particle%transform(xOrigin, yOrigin, zOrigin, & sinrot, cosrot, invert=.true.) call particle%transform(reset=.true.) @@ -244,11 +246,11 @@ subroutine load_subcell(this, particle, subcell) type(ParticleType), pointer, intent(inout) :: particle class(SubcellRectType), intent(inout) :: subcell ! -- local - double precision :: dx, dy, dz, areax, areay, areaz - double precision :: dxprel, dyprel - integer :: isc, npolyverts, m1, m2 - double precision :: qextl1, qextl2, qintl1, qintl2 - double precision :: factor, term + real(DP) :: dx, dy, dz, areax, areay, areaz + real(DP) :: dxprel, dyprel + integer(I4B) :: isc, npolyverts, m1, m2 + real(DP) :: qextl1, qextl2, qintl1, qintl2 + real(DP) :: factor, term select type (cell => this%cell) type is (CellRectQuadType) @@ -266,38 +268,28 @@ subroutine load_subcell(this, particle, subcell) if (isc .le. 0) then dxprel = particle%x / dx dyprel = particle%y / dy - if (dxprel .lt. 5d-1) then - if (dyprel .lt. 5d-1) then - isc = 3 - else if (dyprel .gt. 5d-1) then + + if (dyprel .ge. 5d-1) then + if (dxprel .le. 5d-1) then isc = 4 else - ! kluge note: need to resolve this ambiguity based on flow direction - call pstop(1, "particle initially on shared subcell edge") - end if - else if (dxprel .gt. 5d-1) then - if (dyprel .lt. 5d-1) then - isc = 2 - else if (dyprel .gt. 5d-1) then isc = 1 - else - ! kluge note: need to resolve this ambiguity based on flow direction - call pstop(1, "particle initially on shared subcell edge") end if else - ! kluge note: need to resolve this ambiguity based on flow direction - call pstop(1, "particle initially on shared subcell edge") + if (dxprel .le. 5d-1) then + isc = 3 + else + isc = 2 + end if end if + subcell%isubcell = isc - ! kluge note: as a matter of form, do we want to allow - ! this subroutine to modify the particle??? particle%idomain(3) = isc - ! kluge note: initial insubface is not currently being determined end if dx = 5d-1 * dx dy = 5d-1 * dy dz = cell%defn%top - & - cell%defn%bot ! kluge note: need to account for partial saturation + cell%defn%bot areax = dy * dz areay = dx * dz areaz = dx * dy @@ -310,9 +302,9 @@ subroutine load_subcell(this, particle, subcell) subcell%dx = dx subcell%dy = dy subcell%dz = dz - subcell%sinrot = 0d0 - subcell%cosrot = 1d0 - subcell%zOrigin = 0d0 + subcell%sinrot = DZERO + subcell%cosrot = DONE + subcell%zOrigin = DZERO select case (isc) case (1) subcell%xOrigin = dx @@ -325,7 +317,7 @@ subroutine load_subcell(this, particle, subcell) subcell%vy2 = -qextl1 * term case (2) subcell%xOrigin = dx - subcell%yOrigin = 0d0 + subcell%yOrigin = DZERO term = factor / areax subcell%vx1 = -qintl2 * term subcell%vx2 = -qextl1 * term @@ -333,8 +325,8 @@ subroutine load_subcell(this, particle, subcell) subcell%vy1 = qextl2 * term subcell%vy2 = -qintl1 * term case (3) - subcell%xOrigin = 0d0 - subcell%yOrigin = 0d0 + subcell%xOrigin = DZERO + subcell%yOrigin = DZERO term = factor / areax subcell%vx1 = qextl2 * term subcell%vx2 = -qintl1 * term @@ -342,7 +334,7 @@ subroutine load_subcell(this, particle, subcell) subcell%vy1 = qextl1 * term subcell%vy2 = qintl2 * term case (4) - subcell%xOrigin = 0d0 + subcell%xOrigin = DZERO subcell%yOrigin = dy term = factor / areax subcell%vx1 = qextl1 * term diff --git a/src/Solution/ParticleTracker/MethodCellTernary.f90 b/src/Solution/ParticleTracker/MethodCellTernary.f90 index 613d201dbcf..1106eb9dd82 100644 --- a/src/Solution/ParticleTracker/MethodCellTernary.f90 +++ b/src/Solution/ParticleTracker/MethodCellTernary.f90 @@ -9,6 +9,8 @@ module MethodCellTernaryModule use SubcellTriModule, only: SubcellTriType, create_subcell_tri use ParticleModule use TrackModule, only: TrackFileControlType + use GeomUtilModule, only: area + use ConstantsModule, only: DZERO, DONE, DTWO implicit none private @@ -17,19 +19,26 @@ module MethodCellTernaryModule type, extends(MethodType) :: MethodCellTernaryType private - real(DP), allocatable :: x_vert(:) - real(DP), allocatable :: y_vert(:) !< cell vertex coordinates - real(DP), allocatable :: vx_vert_polygon(:) - real(DP), allocatable :: vy_vert_polygon(:) !< cell vertex velocities + integer(I4B) :: nverts !< number of vertices + real(DP), allocatable, dimension(:) :: xvert + real(DP), allocatable, dimension(:) :: yvert !< cell vertex coordinates + real(DP), allocatable, dimension(:) :: vne !< cell edge normal velocities + real(DP), allocatable, dimension(:) :: vv0x + real(DP), allocatable, dimension(:) :: vv0y + real(DP), allocatable, dimension(:) :: vv1x + real(DP), allocatable, dimension(:) :: vv1y !< cell vertex velocities real(DP) :: xctr real(DP) :: yctr !< cell center coordinates - real(DP) :: vxctr - real(DP) :: vyctr !< cell center velocities + real(DP) :: vctrx + real(DP) :: vctry !< cell center velocities real(DP) :: ztop real(DP) :: zbot !< cell top and bottom elevations real(DP) :: dz !< cell thickness real(DP) :: vztop real(DP) :: vzbot !< cell top and bottom velocities + integer(I4B), allocatable, dimension(:) :: iprev !< array of shifted indices + real(DP), allocatable, dimension(:) :: xvertnext + real(DP), allocatable, dimension(:) :: yvertnext !< arrays of shifted cell vertex coordinates integer(I4B), public, pointer :: zeromethod contains procedure, public :: apply => apply_mct @@ -37,15 +46,17 @@ module MethodCellTernaryModule procedure, public :: load => load_mct procedure, public :: load_subcell procedure, public :: pass => pass_mct + procedure :: vertvelo + procedure :: calc_thru_hcsum end type MethodCellTernaryType contains !> @brief Create a tracking method subroutine create_method_cell_ternary(method) - ! -- dummy + ! dummy type(MethodCellTernaryType), pointer :: method - ! -- local + ! local type(CellPolyType), pointer :: cell type(SubcellTriType), pointer :: subcell @@ -68,7 +79,7 @@ end subroutine destroy_mct !> @brief Load subcell into tracking method subroutine load_mct(this, particle, next_level, submethod) - ! -- dummy + ! dummy class(MethodCellTernaryType), intent(inout) :: this type(ParticleType), pointer, intent(inout) :: particle integer(I4B), intent(in) :: next_level @@ -89,50 +100,45 @@ end subroutine load_mct !> @brief Pass particle to next subcell if there is one, or to the cell face subroutine pass_mct(this, particle) - ! -- dummy + ! dummy class(MethodCellTernaryType), intent(inout) :: this type(ParticleType), pointer, intent(inout) :: particle ! local integer(I4B) :: isc integer(I4B) :: exitFace integer(I4B) :: inface - integer(I4B) :: npolyverts exitFace = particle%iboundary(3) isc = particle%idomain(3) - select type (cell => this%cell) - type is (CellPolyType) - npolyverts = cell%defn%npolyverts - end select select case (exitFace) case (0) - ! -- Subcell interior (cell interior) + ! Subcell interior (cell interior) inface = -1 case (1) - ! -- Subcell face 1 (cell face) + ! Subcell face 1 (cell face) inface = isc - if (inface .eq. 0) inface = npolyverts + if (inface .eq. 0) inface = this%nverts case (2) - ! -- Subcell face --> next subcell in "cycle" (cell interior) + ! Subcell face --> next subcell in "cycle" (cell interior) isc = isc + 1 - if (isc .gt. npolyverts) isc = 1 + if (isc .gt. this%nverts) isc = 1 particle%idomain(3) = isc particle%iboundary(3) = 3 inface = 0 case (3) - ! -- Subcell face --> preceding subcell in "cycle" (cell interior) + ! Subcell face --> preceding subcell in "cycle" (cell interior) isc = isc - 1 - if (isc .lt. 1) isc = npolyverts + if (isc .lt. 1) isc = this%nverts particle%idomain(3) = isc particle%iboundary(3) = 2 inface = 0 case (4) - ! -- Subcell bottom (cell bottom) - inface = npolyverts + 2 + ! Subcell bottom (cell bottom) + inface = this%nverts + 2 case (5) - ! -- Subcell top (cell top) - inface = npolyverts + 3 + ! Subcell top (cell top) + inface = this%nverts + 3 end select if (inface .eq. -1) then particle%iboundary(2) = 0 @@ -151,143 +157,86 @@ subroutine apply_mct(this, particle, tmax) type(ParticleType), pointer, intent(inout) :: particle real(DP), intent(in) :: tmax ! local - integer(I4B) :: npolyverts - integer(I4B) :: iv - integer(I4B) :: ivp1 - integer(I4B) :: ivm1 - real(DP) :: retfactor - real(DP) :: x0 - real(DP) :: y0 - real(DP) :: x1 - real(DP) :: y1 - real(DP) :: x2 - real(DP) :: y2 - real(DP) :: xsum - real(DP) :: ysum - real(DP) :: vxsum - real(DP) :: vysum - real(DP) :: flow0 - real(DP) :: flow1 - real(DP) :: v0x - real(DP) :: v0y - real(DP) :: d01x - real(DP) :: d01y - real(DP) :: d02x - real(DP) :: d02y - real(DP) :: det - real(DP) :: area - real(DP) :: term + integer(I4B) :: i + + ! Update particle state, checking whether any reporting or + ! termination conditions apply + call this%update(particle, this%cell%defn) + + ! Return early if particle is done advancing + if (.not. particle%advancing) return + + ! If the particle is above the top of the cell (presumed water table) + ! pass it vertically and instantaneously to the cell top and save the + ! particle state to file + if (particle%z > this%cell%defn%top) then + particle%z = this%cell%defn%top + call this%save(particle, reason=1) ! reason=1: cell transition + end if select type (cell => this%cell) type is (CellPolyType) - ! -- Update particle state, checking whether any reporting or - ! -- termination conditions apply - call this%update(particle, cell%defn) - - ! -- Return early if particle is done advancing - if (.not. particle%advancing) return - - ! -- If the particle is above the top of the cell (presumed water table) - ! -- pass it vertically and instantaneously to the cell top and save the - ! -- particle state to file - if (particle%z > cell%defn%top) then - particle%z = cell%defn%top - call this%save(particle, reason=1) ! reason=1: cell transition + ! Number of vertices + this%nverts = cell%defn%npolyverts + ! (Re)allocate type-bound arrays + if (allocated(this%xvert)) then + deallocate (this%xvert) + deallocate (this%yvert) + deallocate (this%vne) + deallocate (this%vv0x) + deallocate (this%vv0y) + deallocate (this%vv1x) + deallocate (this%vv1y) + deallocate (this%iprev) + deallocate (this%xvertnext) + deallocate (this%yvertnext) end if - - npolyverts = cell%defn%npolyverts - if (allocated(this%x_vert)) then - deallocate (this%x_vert) - deallocate (this%y_vert) - deallocate (this%vx_vert_polygon) - deallocate (this%vy_vert_polygon) - end if - allocate (this%x_vert(npolyverts)) - allocate (this%y_vert(npolyverts)) - allocate (this%vx_vert_polygon(npolyverts)) - allocate (this%vy_vert_polygon(npolyverts)) - - xsum = DZERO - ysum = DZERO - vxsum = DZERO - vysum = DZERO - area = DZERO + allocate (this%xvert(this%nverts)) + allocate (this%yvert(this%nverts)) + allocate (this%vne(this%nverts)) + allocate (this%vv0x(this%nverts)) + allocate (this%vv0y(this%nverts)) + allocate (this%vv1x(this%nverts)) + allocate (this%vv1y(this%nverts)) + allocate (this%iprev(this%nverts)) + allocate (this%xvertnext(this%nverts)) + allocate (this%yvertnext(this%nverts)) + ! Cell vertices + do i = 1, this%nverts + this%xvert(i) = cell%defn%polyvert(1, i) + this%yvert(i) = cell%defn%polyvert(2, i) + end do + ! Top, bottom, and thickness this%ztop = cell%defn%top this%zbot = cell%defn%bot this%dz = this%ztop - this%zbot - do iv = 1, npolyverts - ivp1 = iv + 1 - if (ivp1 .gt. npolyverts) ivp1 = 1 - ivm1 = iv - 1 - if (ivm1 .lt. 1) ivm1 = npolyverts - x0 = cell%defn%polyvert(1, iv) - y0 = cell%defn%polyvert(2, iv) - x2 = cell%defn%polyvert(1, ivp1) - y2 = cell%defn%polyvert(2, ivp1) - x1 = cell%defn%polyvert(1, ivm1) - y1 = cell%defn%polyvert(2, ivm1) - term = DONE / (cell%defn%porosity * this%dz) - flow0 = cell%defn%faceflow(iv) * term - flow1 = cell%defn%faceflow(ivm1) * term - d01x = x1 - x0 ! kluge note: do this more efficiently, not recomputing things so much??? - d01y = y1 - y0 - d02x = x2 - x0 - d02y = y2 - y0 - ! kluge note: can det ever be zero, like maybe for a 180-deg vertex??? - ! oodet = DONE/(d01y*d02x - d02y*d01x) - ! velmult = particle%velmult - ! kluge note: "flow" is volumetric (face) flow rate per unit thickness, divided by porosity - ! v0x = -velmult*oodet*(d02x*flow1 + d01x*flow0) - ! v0y = -velmult*oodet*(d02y*flow1 + d01y*flow0) ! - det = d01y * d02x - d02y * d01x - retfactor = cell%defn%retfactor - ! kluge note: can det ever be zero, like maybe for a 180-deg vertex??? - ! term = velfactor/det - ! kluge note: can det ever be zero, like maybe for a 180-deg vertex??? - term = DONE / (retfactor * det) - ! kluge note: "flow" here is volumetric flow rate (MODFLOW face flow) - v0x = -term * (d02x * flow1 + d01x * flow0) - ! per unit thickness, divided by porosity - v0y = -term * (d02y * flow1 + d01y * flow0) - this%vx_vert_polygon(iv) = v0x - this%vy_vert_polygon(iv) = v0y - xsum = xsum + x0 - ysum = ysum + y0 - vxsum = vxsum + v0x - vysum = vysum + v0y - this%x_vert(iv) = x0 - this%y_vert(iv) = y0 - area = area + x0 * y1 - x1 * y0 + ! Shifted arrays + do i = 1, this%nverts + this%iprev(i) = i end do - area = area * DHALF - term = DONE / (retfactor * cell%defn%porosity * area) - this%vzbot = cell%defn%faceflow(npolyverts + 2) * term - this%vztop = -cell%defn%faceflow(npolyverts + 3) * term - this%xctr = xsum / dble(npolyverts) - this%yctr = ysum / dble(npolyverts) - this%vxctr = vxsum / dble(npolyverts) - this%vyctr = vysum / dble(npolyverts) - - ! -- Track across subcells - call this%track(particle, 2, tmax) ! kluge, hardwired to level 2 + this%iprev = cshift(this%iprev, -1) + this%xvertnext = cshift(this%xvert, 1) + this%yvertnext = cshift(this%yvert, 1) end select + + ! Calculate vertex velocities + call this%vertvelo() + + ! Track across subcells + call this%track(particle, 2, tmax) + end subroutine apply_mct !> @brief Loads a triangular subcell from the polygonal cell subroutine load_subcell(this, particle, subcell) - ! -- dummy + ! dummy class(MethodCellTernaryType), intent(inout) :: this type(ParticleType), pointer, intent(inout) :: particle class(SubcellTriType), intent(inout) :: subcell - ! -- local + ! local integer(I4B) :: ic integer(I4B) :: isc - integer(I4B) :: npolyverts integer(I4B) :: iv0 - integer(I4B) :: iv1 - integer(I4B) :: ipv0 - integer(I4B) :: ipv1 - integer(I4B) :: iv real(DP) :: x0 real(DP) :: y0 real(DP) :: x1 @@ -307,27 +256,20 @@ subroutine load_subcell(this, particle, subcell) real(DP) :: d01 real(DP) :: alphai real(DP) :: betai - real(DP) :: betatol select type (cell => this%cell) type is (CellPolyType) ic = cell%defn%icell subcell%icell = ic isc = particle%idomain(3) - npolyverts = cell%defn%npolyverts if (isc .le. 0) then xi = particle%x yi = particle%y - do iv = 1, npolyverts - iv0 = iv - iv1 = iv + 1 - if (iv1 .gt. npolyverts) iv1 = 1 - ipv0 = iv0 - ipv1 = iv1 - x0 = this%x_vert(ipv0) - y0 = this%y_vert(ipv0) - x1 = this%x_vert(ipv1) - y1 = this%y_vert(ipv1) + do iv0 = 1, this%nverts + x0 = this%xvert(iv0) + y0 = this%yvert(iv0) + x1 = this%xvertnext(iv0) + y1 = this%yvertnext(iv0) x2 = this%xctr y2 = this%yctr x1rel = x1 - x0 @@ -341,46 +283,38 @@ subroutine load_subcell(this, particle, subcell) d01 = x0 * y1rel - y0 * x1rel alphai = (di2 - d02) / d12 betai = -(di1 - d01) / d12 - ! kluge note: can iboundary(2) be used to identify the subcell? - betatol = -1e-7 ! kluge - ! kluge note: think this handles points on triangle boundaries ok - if ((alphai .ge. 0d0) .and. & - (betai .ge. betatol) .and. & - (alphai + betai .le. 1d0)) then - isc = iv ! but maybe not!!!!!!!!!!!! - exit ! kluge note: doesn't handle particle smack on cell center + ! assumes particle is in the cell, so no check needed for beta + if ((alphai .ge. DZERO) .and. & + (alphai + betai .le. DONE)) then + isc = iv0 + exit end if end do if (isc .le. 0) then - print *, "error -- initial triangle not found in cell ", ic + print *, "error -- initial triangle not found in cell ", ic, & + " for particle at ", particle%x, particle%y, particle%z + call pstop(1) else - ! subcellTri%isubcell = isc - ! kluge note: as a matter of form, do we want to allow - ! this subroutine to modify the particle??? particle%idomain(3) = isc end if end if subcell%isubcell = isc - ! -- Set coordinates and velocities at vertices of triangular subcell + ! Set coordinates and velocities at vertices of triangular subcell iv0 = isc - iv1 = isc + 1 - if (iv1 .gt. npolyverts) iv1 = 1 - ipv0 = iv0 - ipv1 = iv1 - subcell%x0 = this%x_vert(ipv0) - subcell%y0 = this%y_vert(ipv0) - subcell%x1 = this%x_vert(ipv1) - subcell%y1 = this%y_vert(ipv1) + subcell%x0 = this%xvert(iv0) + subcell%y0 = this%yvert(iv0) + subcell%x1 = this%xvertnext(iv0) + subcell%y1 = this%yvertnext(iv0) subcell%x2 = this%xctr subcell%y2 = this%yctr - subcell%v0x = this%vx_vert_polygon(iv0) - subcell%v0y = this%vy_vert_polygon(iv0) - subcell%v1x = this%vx_vert_polygon(iv1) - subcell%v1y = this%vy_vert_polygon(iv1) - subcell%v2x = this%vxctr - subcell%v2y = this%vyctr + subcell%v0x = this%vv0x(iv0) + subcell%v0y = this%vv0y(iv0) + subcell%v1x = this%vv1x(iv0) ! the indices here actually refer to subcells, not vertices + subcell%v1y = this%vv1y(iv0) + subcell%v2x = this%vctrx + subcell%v2y = this%vctry subcell%ztop = this%ztop subcell%zbot = this%zbot subcell%dz = this%dz @@ -389,4 +323,354 @@ subroutine load_subcell(this, particle, subcell) end select end subroutine load_subcell + !> @brief Calculate vertex velocities + subroutine vertvelo(this) + use ConstantsModule, only: DZERO, DONE, DHALF + ! dummy + class(MethodCellTernaryType), intent(inout) :: this + ! local + real(DP) :: term + integer(I4B) :: i + real(DP) :: perturb + real(DP), allocatable, dimension(:) :: xvals + real(DP), allocatable, dimension(:) :: yvals + real(DP) :: sixa + real(DP) :: vm0i0 + real(DP) :: vm0ival + real(DP) :: hcsum0 + real(DP) :: hcsum + real(DP) :: jac + real(DP), allocatable, dimension(:) :: wk1 + real(DP), allocatable, dimension(:) :: wk2 + real(DP), allocatable, dimension(:) :: unixnext + real(DP), allocatable, dimension(:) :: uniynext + real(DP), allocatable, dimension(:) :: le + real(DP), allocatable, dimension(:) :: unex + real(DP), allocatable, dimension(:) :: uney + real(DP) :: areacell + real(DP), allocatable, dimension(:) :: areasub + real(DP) :: divcell + real(DP), allocatable, dimension(:) :: li + real(DP), allocatable, dimension(:) :: unix + real(DP), allocatable, dimension(:) :: uniy + real(DP), allocatable, dimension(:) :: xmid + real(DP), allocatable, dimension(:) :: ymid + real(DP), allocatable, dimension(:) :: lm + real(DP), allocatable, dimension(:) :: umx + real(DP), allocatable, dimension(:) :: umy + real(DP), allocatable, dimension(:) :: kappax + real(DP), allocatable, dimension(:) :: kappay + real(DP), allocatable, dimension(:) :: vm0x + real(DP), allocatable, dimension(:) :: vm0y + real(DP), allocatable, dimension(:) :: vm1x + real(DP), allocatable, dimension(:) :: vm1y + + select type (cell => this%cell) + type is (CellPolyType) + + ! Allocate local arrays + allocate (le(this%nverts)) ! lengths of exterior (cell) edges + allocate (unex(this%nverts)) ! x components of unit normals to exterior edges + allocate (uney(this%nverts)) ! y components of unit normals to exterior edges + allocate (areasub(this%nverts)) ! subcell areas + allocate (li(this%nverts)) ! lengths of interior edges ("spokes") + allocate (unix(this%nverts)) ! x components of unit normals to interior edges + allocate (uniy(this%nverts)) ! y components of unit normals to interior edges + allocate (xmid(this%nverts)) ! x coordinates of midpoints + allocate (ymid(this%nverts)) ! y coordinates of midpoints + allocate (lm(this%nverts)) ! lengths of midpoint connectors + allocate (umx(this%nverts)) ! x components of midpoint-connector (cw) unit vectors + allocate (umy(this%nverts)) ! y components of midpoint-connector (cw) unit vectors + allocate (kappax(this%nverts)) ! x components of kappa vectors + allocate (kappay(this%nverts)) ! y components of kappa vectors + allocate (vm0x(this%nverts)) ! x component of vm0 + allocate (vm0y(this%nverts)) ! y component of vm0 + allocate (vm1x(this%nverts)) ! x component of vm1 + allocate (vm1y(this%nverts)) ! y component of vm1 + allocate (unixnext(this%nverts)) ! vector of "next" interior unit-normal x coordinates defined for convenience + allocate (uniynext(this%nverts)) ! vector of "next" interior unit-normal y coordinates defined for convenience + allocate (wk1(this%nverts)) + allocate (wk2(this%nverts)) + allocate (xvals(3)) + allocate (yvals(3)) + + ! Exterior edge unit normals (outward) and lengths + wk1 = this%xvertnext - this%xvert + wk2 = this%yvertnext - this%yvert + le = dsqrt(wk1 * wk1 + wk2 * wk2) + unex = -wk2 / le + uney = wk1 / le + + ! Cell area + areacell = area(this%xvert, this%yvert) + + ! Cell centroid (in general, this is NOT the average of the vertex coordinates) + sixa = areacell * 6.d0 + wk1 = -(this%xvert * this%yvertnext - this%xvertnext * this%yvert) + this%xctr = sum((this%xvert + this%xvertnext) * wk1) / sixa + this%yctr = sum((this%yvert + this%yvertnext) * wk1) / sixa + + ! Subcell areas + do i = 1, this%nverts + xvals(1) = this%xvert(i) + xvals(2) = this%xvertnext(i) + xvals(3) = this%xctr + yvals(1) = this%yvert(i) + yvals(2) = this%yvertnext(i) + yvals(3) = this%yctr + areasub(i) = area(xvals, yvals) + end do + + ! Cell-edge normal velocities (outward) + term = DONE / (cell%defn%porosity * cell%defn%retfactor * this%dz) + do i = 1, this%nverts + this%vne(i) = -cell%defn%faceflow(i) * term / le(i) + end do + + ! Cell divergence (2D) + divcell = sum(le * this%vne) / areacell + + ! Interior edge (cw) unit normals and lengths + wk1 = this%xvert - this%xctr + wk2 = this%yvert - this%yctr + li = dsqrt(wk1 * wk1 + wk2 * wk2) + unix = wk2 / li + uniy = -wk1 / li + ! Shifted arrays for convenience + unixnext = cshift(unix, 1) + uniynext = cshift(uniy, 1) + + ! Midpoints of interior edges + xmid = 5.d-1 * (this%xvert + this%xctr) + ymid = 5.d-1 * (this%yvert + this%yctr) + + ! Unit midpoint-connector (cw) vectors and lengths + wk1 = cshift(xmid, 1) - xmid + wk2 = cshift(ymid, 1) - ymid + lm = dsqrt(wk1 * wk1 + wk2 * wk2) + umx = wk1 / lm + umy = wk2 / lm + + ! Kappa vectors (K tensor times unit midpoint-connector vectors) do not + ! account for anisotropy, which is consistent with the way internal face + ! flow calculations are done in MP7. The isotropic value of K does not + ! matter in this case because it cancels out of the calculations, so + ! K = 1 is assumed for simplicity. + kappax = umx + kappay = umy + + ! Use linearity to find vm0i[0] such that curl of the head gradient + ! is zero + perturb = 1.d-2 + ! Calculations at base value + vm0i0 = 0.d0 + call this%calc_thru_hcsum(vm0i0, divcell, le, li, lm, areasub, areacell, & + unix, uniy, unex, uney, unixnext, uniynext, & + kappax, kappay, vm0x, vm0y, vm1x, vm1y, hcsum0) + ! Calculations at perturbed value + vm0ival = vm0i0 + perturb + call this%calc_thru_hcsum(vm0ival, divcell, le, li, lm, areasub, areacell, & + unix, uniy, unex, uney, unixnext, uniynext, & + kappax, kappay, vm0x, vm0y, vm1x, vm1y, hcsum) + ! Calculations at root value + jac = (hcsum - hcsum0) / perturb + vm0ival = vm0i0 - hcsum0 / jac + call this%calc_thru_hcsum(vm0ival, divcell, le, li, lm, areasub, areacell, & + unix, uniy, unex, uney, unixnext, uniynext, & + kappax, kappay, vm0x, vm0y, vm1x, vm1y, hcsum) + + ! Project linearly to get corner (vertex) velocities. Note that velocity + ! vv1 is at the next vertex cw from vv0, so vv0(i) and vv1(i) are the + ! two vertex velocities used by triangular subcell i. + this%vv0x = 2.d0 * vm0x - this%vctrx + this%vv0y = 2.d0 * vm0y - this%vctry + this%vv1x = 2.d0 * vm1x - this%vctrx + this%vv1y = 2.d0 * vm1y - this%vctry + + ! Set top and bottom velocities + term = DONE / (cell%defn%retfactor * cell%defn%porosity * areacell) + this%vzbot = cell%defn%faceflow(this%nverts + 2) * term + this%vztop = -cell%defn%faceflow(this%nverts + 3) * term + + ! Deallocate local arrays + deallocate (le) + deallocate (unex) + deallocate (uney) + deallocate (areasub) + deallocate (li) + deallocate (unix) + deallocate (uniy) + deallocate (xmid) + deallocate (ymid) + deallocate (lm) + deallocate (umx) + deallocate (umy) + deallocate (kappax) + deallocate (kappay) + deallocate (vm0x) + deallocate (vm0y) + deallocate (vm1x) + deallocate (vm1y) + deallocate (unixnext) + deallocate (uniynext) + deallocate (wk1) + deallocate (wk2) + deallocate (xvals) + deallocate (yvals) + + end select + end subroutine vertvelo + + subroutine calc_thru_hcsum(this, vm0ival, divcell, & + le, li, lm, areasub, areacell, & + unix, uniy, unex, uney, unixnext, uniynext, & + kappax, kappay, vm0x, vm0y, vm1x, vm1y, hcsum) + ! dummy + class(MethodCellTernaryType), intent(inout) :: this + real(DP) :: vm0ival + real(DP) :: divcell + real(DP) :: hcsum + real(DP), dimension(:) :: le + real(DP), dimension(:) :: li + real(DP), dimension(:) :: lm + real(DP), dimension(:) :: areasub + real(DP) :: areacell + real(DP), dimension(:) :: unix + real(DP), dimension(:) :: uniy + real(DP), dimension(:) :: unex + real(DP), dimension(:) :: uney + real(DP), dimension(:) :: unixnext + real(DP), dimension(:) :: uniynext + real(DP), dimension(:) :: kappax + real(DP), dimension(:) :: kappay + real(DP), dimension(:) :: vm0x + real(DP), dimension(:) :: vm0y + real(DP), dimension(:) :: vm1x + real(DP), dimension(:) :: vm1y + ! local + real(DP), allocatable, dimension(:) :: vm0i + real(DP), allocatable, dimension(:) :: vm0e + real(DP), allocatable, dimension(:) :: vm1i + real(DP), allocatable, dimension(:) :: vm1e + real(DP), allocatable, dimension(:) :: uprod + real(DP), allocatable, dimension(:) :: det + real(DP), allocatable, dimension(:) :: wt + real(DP), allocatable, dimension(:) :: bi0x + real(DP), allocatable, dimension(:) :: be0x + real(DP), allocatable, dimension(:) :: bi0y + real(DP), allocatable, dimension(:) :: be0y + real(DP), allocatable, dimension(:) :: bi1x + real(DP), allocatable, dimension(:) :: be1x + real(DP), allocatable, dimension(:) :: bi1y + real(DP), allocatable, dimension(:) :: be1y + real(DP), allocatable, dimension(:) :: be01x + real(DP), allocatable, dimension(:) :: be01y + real(DP) :: emxx + real(DP) :: emxy + real(DP) :: emyx + real(DP) :: emyy + real(DP) :: rx + real(DP) :: ry + real(DP) :: emdet + integer(I4B) :: i + integer(I4B) :: ip + + ! Allocate local arrays + allocate (vm0i(this%nverts)) + allocate (vm0e(this%nverts)) + allocate (vm1i(this%nverts)) + allocate (vm1e(this%nverts)) + allocate (uprod(this%nverts)) + allocate (det(this%nverts)) + allocate (wt(this%nverts)) + allocate (bi0x(this%nverts)) + allocate (be0x(this%nverts)) + allocate (bi0y(this%nverts)) + allocate (be0y(this%nverts)) + allocate (bi1x(this%nverts)) + allocate (be1x(this%nverts)) + allocate (bi1y(this%nverts)) + allocate (be1y(this%nverts)) + allocate (be01x(this%nverts)) + allocate (be01y(this%nverts)) + + ! Set vm0i(1) + vm0i(1) = vm0ival + + ! Get remaining vm0i's sequentially using divergence conditions + do i = 2, this%nverts + ip = this%iprev(i) + vm0i(i) = (li(ip) * vm0i(ip) - le(ip) * this%vne(ip) & + + areasub(ip) * divcell) / li(i) + end do + + ! Get vm1i's from vm0i's using continuity conditions + vm1i = cshift(vm0i, 1) + + ! Get centroid velocity by setting up and solving 2x2 linear system + uprod = unix * unex + uniy * uney + det = DONE - uprod * uprod + bi0x = (unix - unex * uprod) / det + be0x = (unex - unix * uprod) / det + bi0y = (uniy - uney * uprod) / det + be0y = (uney - uniy * uprod) / det + uprod = unixnext * unex + uniynext * uney + det = DONE - uprod * uprod + bi1x = (unixnext - unex * uprod) / det + be1x = (unex - unixnext * uprod) / det + bi1y = (uniynext - uney * uprod) / det + be1y = (uney - uniynext * uprod) / det + be01x = 5.d-1 * (be0x + be1x) + be01y = 5.d-1 * (be0y + be1y) + wt = areasub / areacell + emxx = DTWO - sum(wt * be01x * unex) + emxy = -sum(wt * be01x * uney) + emyx = -sum(wt * be01y * unex) + emyy = DTWO - sum(wt * be01y * uney) + rx = sum(wt * (bi0x * vm0i + bi1x * vm1i + be01x * this%vne)) + ry = sum(wt * (bi0y * vm0i + bi1y * vm1i + be01y * this%vne)) + emdet = emxx * emyy - emxy * emyx + this%vctrx = (emyy * rx - emxy * ry) / emdet + this%vctry = (emxx * ry - emyx * rx) / emdet + + ! Get vm0e's using "known" conditions + vm0e = 5.d-1 * (this%vne + unex * this%vctrx + uney * this%vctry) + + ! Get vm1e's from uniformity along exterior edges + vm1e = vm0e + + ! Transform vm0 and vm1 to (x, y) coordinates + vm0x = bi0x * vm0i + be0x * vm0e + vm0y = bi0y * vm0i + be0y * vm0e + vm1x = bi1x * vm1i + be1x * vm0e + vm1y = bi1y * vm1i + be1y * vm0e + + ! Calculate head-cycle summation (which is proportional to + ! the curl of the head gradient) + hcsum = sum(lm * (kappax * (vm0x + vm1x) + kappay * (vm0y + vm1y))) + + ! Deallocate local arrays + deallocate (vm0i) + deallocate (vm0e) + deallocate (vm1i) + deallocate (vm1e) + deallocate (uprod) + deallocate (det) + deallocate (wt) + deallocate (bi0x) + deallocate (be0x) + deallocate (bi0y) + deallocate (be0y) + deallocate (bi1x) + deallocate (be1x) + deallocate (bi1y) + deallocate (be1y) + deallocate (be01x) + deallocate (be01y) + + return + + end subroutine calc_thru_hcsum + end module MethodCellTernaryModule + diff --git a/src/Solution/ParticleTracker/MethodDis.f90 b/src/Solution/ParticleTracker/MethodDis.f90 index b80c715492e..80f5be9ba28 100644 --- a/src/Solution/ParticleTracker/MethodDis.f90 +++ b/src/Solution/ParticleTracker/MethodDis.f90 @@ -2,8 +2,9 @@ module MethodDisModule use KindModule, only: DP, I4B use ConstantsModule, only: DONE, DZERO - use MethodModule, only: MethodType, get_iatop + use MethodModule, only: MethodType use MethodCellPoolModule + use CellModule use CellDefnModule use CellRectModule use ParticleModule @@ -19,15 +20,16 @@ module MethodDisModule type, extends(MethodType) :: MethodDisType contains - procedure, public :: apply => apply_dis ! apply the method + procedure, public :: apply => apply_dis !< apply the method procedure, public :: destroy !< destructor for the method - procedure, public :: load => load_dis ! load the method - procedure :: load_cell_defn !< load cell definition from the grid + procedure, public :: load => load_dis !< load the method procedure, public :: pass => pass_dis !< pass the particle to the next domain - procedure, private :: get_top ! get cell top elevation - procedure, private :: load_nbrs_to_defn ! load face neighbors - procedure, private :: load_flows_to_defn ! loads face flows - procedure, private :: load_boundary_flows_to_defn ! loads BoundaryFlows + procedure, private :: get_top !< get cell top elevation + procedure, private :: load_nbrs_to_defn !< load face neighbors + procedure, private :: load_flows_to_defn !< loads face flows + procedure, private :: load_boundary_flows_to_defn !< loads BoundaryFlows + procedure :: load_cell_defn !< load cell definition from the grid + procedure :: load_cell !< load cell geometry and flows end type MethodDisType contains @@ -53,15 +55,12 @@ subroutine destroy(this) deallocate (this%type) end subroutine destroy - !> @brief Load the cell geometry and method (tracking strategy) - subroutine load_dis(this, particle, next_level, submethod) - ! -- dummy + subroutine load_cell(this, ic, cell) + ! dummy class(MethodDisType), intent(inout) :: this - type(ParticleType), pointer, intent(inout) :: particle - integer(I4B), intent(in) :: next_level - class(MethodType), pointer, intent(inout) :: submethod - ! -- local - integer(I4B) :: ic + integer(I4B), intent(in) :: ic + type(CellRectType), intent(inout) :: cell + ! local integer(I4B) :: icu integer(I4B) :: irow integer(I4B) :: jcol @@ -75,61 +74,72 @@ subroutine load_dis(this, particle, next_level, submethod) real(DP) :: factor real(DP) :: term + select type (dis => this%fmi%dis) + type is (DisType) + icu = dis%get_nodeuser(ic) + call get_ijk(icu, dis%nrow, dis%ncol, dis%nlay, & + irow, jcol, klay) + dx = dis%delr(jcol) + dy = dis%delc(irow) + dz = cell%defn%top - cell%defn%bot + cell%dx = dx + cell%dy = dy + cell%dz = dz + cell%sinrot = DZERO + cell%cosrot = DONE + cell%xOrigin = cell%defn%polyvert(1, 1) + cell%yOrigin = cell%defn%polyvert(2, 1) + cell%zOrigin = cell%defn%bot + cell%ipvOrigin = 1 + areax = dy * dz + areay = dx * dz + areaz = dx * dy + factor = DONE / cell%defn%retfactor + factor = factor / cell%defn%porosity + term = factor / areax + cell%vx1 = cell%defn%faceflow(1) * term + cell%vx2 = -cell%defn%faceflow(3) * term + term = factor / areay + cell%vy1 = cell%defn%faceflow(4) * term + cell%vy2 = -cell%defn%faceflow(2) * term + term = factor / areaz + cell%vz1 = cell%defn%faceflow(6) * term + cell%vz2 = -cell%defn%faceflow(7) * term + end select + end subroutine load_cell + + !> @brief Load the cell geometry and tracking method + subroutine load_dis(this, particle, next_level, submethod) + ! -- dummy + class(MethodDisType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + integer(I4B), intent(in) :: next_level + class(MethodType), pointer, intent(inout) :: submethod + ! -- local + integer(I4B) :: ic + select type (cell => this%cell) type is (CellRectType) - select type (dis => this%fmi%dis) - type is (DisType) - ic = particle%idomain(next_level) - call this%load_cell_defn(ic, cell%defn) - - ! -- If cell is active but dry, select and initialize - ! -- pass-to-bottom method and set cell method pointer - if (this%fmi%ibdgwfsat0(ic) == 0) then ! kluge note: use cellDefn%sat == DZERO here instead? - call method_cell_ptb%init( & - cell=this%cell, & - trackfilectl=this%trackfilectl, & - tracktimes=this%tracktimes) - submethod => method_cell_ptb - else - ! -- load rectangular cell (todo: refactor into separate routine) - icu = dis%get_nodeuser(ic) - call get_ijk(icu, dis%nrow, dis%ncol, dis%nlay, & - irow, jcol, klay) - dx = dis%delr(jcol) - dy = dis%delc(irow) - dz = cell%defn%top - cell%defn%bot - cell%dx = dx - cell%dy = dy - cell%dz = dz - cell%sinrot = DZERO - cell%cosrot = DONE - cell%xOrigin = cell%defn%polyvert(1, 1) ! kluge note: could avoid using polyvert here - cell%yOrigin = cell%defn%polyvert(2, 1) - cell%zOrigin = cell%defn%bot - cell%ipvOrigin = 1 - areax = dy * dz - areay = dx * dz - areaz = dx * dy - factor = DONE / cell%defn%retfactor - factor = factor / cell%defn%porosity - term = factor / areax - cell%vx1 = cell%defn%faceflow(1) * term - cell%vx2 = -cell%defn%faceflow(3) * term - term = factor / areay - cell%vy1 = cell%defn%faceflow(4) * term - cell%vy2 = -cell%defn%faceflow(2) * term - term = factor / areaz - cell%vz1 = cell%defn%faceflow(6) * term - cell%vz2 = -cell%defn%faceflow(7) * term - - ! -- Select and initialize Pollock's method and set method pointer - call method_cell_plck%init( & - cell=this%cell, & - trackfilectl=this%trackfilectl, & - tracktimes=this%tracktimes) - submethod => method_cell_plck - end if - end select + ! -- Load cell definition and geometry + ic = particle%idomain(next_level) + call this%load_cell_defn(ic, cell%defn) + call this%load_cell(ic, cell) + + ! -- If cell is active but dry, Initialize instant pass-to-bottom method + if (this%fmi%ibdgwfsat0(ic) == 0) then + call method_cell_ptb%init( & + cell=this%cell, & + trackfilectl=this%trackfilectl, & + tracktimes=this%tracktimes) + submethod => method_cell_ptb + else + ! -- Otherwise initialize Pollock's method + call method_cell_plck%init( & + cell=this%cell, & + trackfilectl=this%trackfilectl, & + tracktimes=this%tracktimes) + submethod => method_cell_plck + end if end select end subroutine load_dis @@ -166,18 +176,14 @@ subroutine pass_dis(this, particle) inbr = cell%defn%facenbr(inface) if (inbr .eq. 0) then ! -- Exterior face; no neighbor to map to - ! particle%idomain(1) = 0 - ! particle%idomain(2) = 0 ! kluge note: set a "has_exited" attribute instead??? - ! particle%idomain(1) = -abs(particle%idomain(1)) ! kluge??? - ! particle%idomain(2) = -abs(particle%idomain(2)) ! kluge??? - particle%istatus = 2 ! kluge note: use -2 to allow check for transfer to another model??? + ! todo AMP: consider when multiple models allowed + particle%istatus = 2 particle%advancing = .false. call this%save(particle, reason=3) ! reason=3: termination - ! particle%iboundary(2) = -1 else idiag = dis%con%ia(cell%defn%icell) ipos = idiag + inbr - ic = dis%con%ja(ipos) ! kluge note: use PRT model's DIS instead of fmi's??? + ic = dis%con%ja(ipos) particle%idomain(2) = ic ! compute and set user node number and layer on particle @@ -187,7 +193,6 @@ subroutine pass_dis(this, particle) particle%icu = icu particle%ilay = ilay - ! call this%mapToNbrCell(cellRect%cellDefn,inface,z) if (inface .eq. 1) then inface = 3 else if (inface .eq. 2) then @@ -207,7 +212,7 @@ subroutine pass_dis(this, particle) topfrom = cell%defn%top botfrom = cell%defn%bot zrel = (z - botfrom) / (topfrom - botfrom) - top = dis%top(ic) ! kluge note: use PRT model's DIS instead of fmi's??? + top = dis%top(ic) bot = dis%bot(ic) sat = this%fmi%gwfsat(ic) z = bot + zrel * sat * (top - bot) @@ -231,7 +236,7 @@ subroutine apply_dis(this, particle, tmax) type(ParticleType), pointer, intent(inout) :: particle real(DP), intent(in) :: tmax - call this%track(particle, 1, tmax) ! kluge, hardwired to level 1 + call this%track(particle, 1, tmax) end subroutine apply_dis !> @brief Returns a top elevation based on index iatop @@ -321,7 +326,8 @@ subroutine load_nbrs_to_defn(this, defn) call get_jk(icu1, dis%get_ncpl(), dis%nlay, j1, klay1) do iloc = 1, dis%con%ia(ic1 + 1) - dis%con%ia(ic1) - 1 ipos = dis%con%ia(ic1) + iloc - if (dis%con%mask(ipos) == 0) cycle ! kluge note: need mask here??? + ! mask could become relevant if PRT uses interface model + if (dis%con%mask(ipos) == 0) cycle ic2 = dis%con%ja(ipos) icu2 = dis%get_nodeuser(ic2) call get_ijk(icu2, dis%nrow, dis%ncol, dis%nlay, & @@ -330,7 +336,7 @@ subroutine load_nbrs_to_defn(this, defn) ! -- Edge (polygon) face neighbor if (irow2 > irow1) then ! Neighbor to the S - iedgeface = 4 ! kluge note: make sure this numbering is consistent with numbering in cell method + iedgeface = 4 else if (jcol2 > jcol1) then ! Neighbor to the E iedgeface = 3 @@ -352,7 +358,6 @@ subroutine load_nbrs_to_defn(this, defn) end do end select ! -- List of edge (polygon) faces wraps around - ! todo: why need to wrap around? no analog to "closing" a polygon? defn%facenbr(defn%npolyverts + 1) = defn%facenbr(1) end subroutine load_nbrs_to_defn @@ -373,7 +378,7 @@ subroutine load_flows_to_defn(this, defn) npolyverts = defn%npolyverts ! -- Load face flows. - defn%faceflow = 0d0 ! kluge note: eventually use DZERO for 0d0 throughout + defn%faceflow = DZERO ! -- As with polygon nbrs, polygon face flows wrap around for ! -- convenience at position npolyverts+1, and bot and top flows ! -- are tacked on the end of the list @@ -387,8 +392,8 @@ subroutine load_flows_to_defn(this, defn) call this%load_boundary_flows_to_defn(defn) ! -- Set inoexitface flag defn%inoexitface = 1 - do m = 1, npolyverts + 3 ! kluge note: can be streamlined with above code - if (defn%faceflow(m) < 0d0) defn%inoexitface = 0 + do m = 1, npolyverts + 3 + if (defn%faceflow(m) < DZERO) defn%inoexitface = 0 end do ! -- Add up net distributed flow @@ -396,7 +401,7 @@ subroutine load_flows_to_defn(this, defn) this%fmi%StorageFlows(ic) ! -- Set weak sink flag - if (this%fmi%SinkFlows(ic) .ne. 0d0) then + if (this%fmi%SinkFlows(ic) .ne. DZERO) then defn%iweaksink = 1 else defn%iweaksink = 0 @@ -415,9 +420,9 @@ subroutine load_boundary_flows_to_defn(this, defn) integer(I4B) :: ioffset ic = defn%icell - ioffset = (ic - 1) * 10 + ioffset = (ic - 1) * MAX_POLY_CELLS defn%faceflow(1) = defn%faceflow(1) + & - this%fmi%BoundaryFlows(ioffset + 1) ! kluge note: should these be additive (seems so)??? + this%fmi%BoundaryFlows(ioffset + 1) defn%faceflow(2) = defn%faceflow(2) + & this%fmi%BoundaryFlows(ioffset + 2) defn%faceflow(3) = defn%faceflow(3) + & diff --git a/src/Solution/ParticleTracker/MethodDisv.f90 b/src/Solution/ParticleTracker/MethodDisv.f90 index 7eb45c76cfe..1dbfd67f51d 100644 --- a/src/Solution/ParticleTracker/MethodDisv.f90 +++ b/src/Solution/ParticleTracker/MethodDisv.f90 @@ -2,9 +2,10 @@ module MethodDisvModule use KindModule, only: DP, I4B, LGP use ErrorUtilModule, only: pstop - use ConstantsModule, only: DONE - use MethodModule, only: MethodType, get_iatop + use ConstantsModule, only: DONE, DZERO + use MethodModule, only: MethodType use MethodCellPoolModule + use CellModule, only: MAX_POLY_CELLS use CellDefnModule use CellPolyModule use ParticleModule @@ -12,7 +13,7 @@ module MethodDisvModule use DisvModule, only: DisvType use ArrayHandlersModule, only: ExpandArray use TrackModule, only: TrackFileControlType - use GeomUtilModule, only: get_jk + use GeomUtilModule, only: get_jk, shared_face implicit none private @@ -22,20 +23,19 @@ module MethodDisvModule type, extends(MethodType) :: MethodDisvType integer(I4B), pointer :: zeromethod contains - procedure, public :: apply => apply_disv ! applies the DISV-grid method - procedure, public :: destroy ! destructor for the method - procedure, public :: load => load_disv ! loads the cell method - procedure, public :: load_cell_defn ! loads cell definition from the grid - procedure, public :: map_neighbor ! maps a location on the cell face to the shared face of a neighbor - procedure, public :: pass => pass_disv ! passes the particle to the next cell - procedure, private :: get_npolyverts ! returns the number of polygon vertices for a cell in the grid - procedure, private :: get_top ! returns top elevation based on index iatop - procedure, private :: load_nbrs_to_defn ! loads face neighbors to a cell object - procedure, private :: load_flags_to_defn ! loads 180-degree vertex indicator to a cell object - procedure, private :: load_flows_to_defn ! loads flows to a cell object - procedure, private :: load_boundary_flows_to_defn_rect ! adds BoundaryFlows from the grid to the faceflow array of a rectangular cell - procedure, private :: load_boundary_flows_to_defn_rect_quad ! adds BoundaryFlows from the grid to the faceflow array of a rectangular-quad cell - procedure, private :: load_boundary_flows_to_defn_poly ! adds BoundaryFlows from the grid to the faceflow array of a polygonal cell + procedure, public :: apply => apply_disv !< applies the DISV-grid method + procedure, public :: destroy !< destructor for the method + procedure, public :: load => load_disv !< loads the cell method + procedure, public :: load_cell_defn !< loads cell definition from the grid + procedure, public :: map_neighbor !< maps a location on the cell face to the shared face of a neighbor + procedure, public :: pass => pass_disv !< passes the particle to the next cell + procedure, private :: get_npolyverts !< returns the number of polygon vertices for a cell in the grid + procedure, private :: load_nbrs_to_defn !< loads face neighbors to a cell object + procedure, private :: load_flags_to_defn !< loads 180-degree vertex indicator to a cell object + procedure, private :: load_flows_to_defn !< loads flows to a cell object + procedure, private :: load_boundary_flows_to_defn_rect !< adds BoundaryFlows from the grid to the faceflow array of a rectangular cell + procedure, private :: load_boundary_flows_to_defn_rect_quad !< adds BoundaryFlows from the grid to the faceflow array of a rectangular-quad cell + procedure, private :: load_boundary_flows_to_defn_poly !< adds BoundaryFlows from the grid to the faceflow array of a polygonal cell end type MethodDisvType contains @@ -83,9 +83,9 @@ subroutine load_disv(this, particle, next_level, submethod) select type (cell => this%cell) type is (CellPolyType) ! load cell definition - ic = particle%idomain(next_level) ! kluge note: is cell number always known coming in? + ic = particle%idomain(next_level) call this%load_cell_defn(ic, cell%defn) - if (this%fmi%ibdgwfsat0(ic) == 0) then ! kluge note: use cellDefn%sat == DZERO here instead? + if (this%fmi%ibdgwfsat0(ic) == 0) then ! -- Cell is active but dry, so select and initialize pass-to-bottom ! -- cell method and set cell method pointer call method_cell_ptb%init( & @@ -95,7 +95,14 @@ subroutine load_disv(this, particle, next_level, submethod) submethod => method_cell_ptb else ! -- Select and initialize cell method and set cell method pointer - if (cell%defn%can_be_rect) then + if (particle%ifrctrn > 0) then + call method_cell_tern%init( & + cell=this%cell, & + trackfilectl=this%trackfilectl, & + tracktimes=this%tracktimes) + submethod => method_cell_tern + method_cell_tern%zeromethod = this%zeromethod + else if (cell%defn%can_be_rect) then call cell_poly_to_rect(cell, rect) base => rect call method_cell_plck%init( & @@ -151,18 +158,14 @@ subroutine pass_disv(this, particle) inbr = cell%defn%facenbr(inface) if (inbr .eq. 0) then ! -- Exterior face; no neighbor to map to - ! particle%idomain(1) = 0 - ! particle%idomain(2) = 0 ! kluge note: "has_exited" attribute instead??? - ! particle%idomain(1) = -abs(particle%idomain(1)) ! kluge??? - ! particle%idomain(2) = -abs(particle%idomain(2)) ! kluge??? - particle%istatus = 2 ! kluge note, todo: use -2 to check for transfer to another model??? + ! todo, later on: reconsider when multiple models are allowed + particle%istatus = 2 particle%advancing = .false. call this%save(particle, reason=3) ! reason=3: termination - ! particle%iboundary(2) = -1 else idiag = dis%con%ia(cell%defn%icell) ipos = idiag + inbr - ic = dis%con%ja(ipos) ! kluge note, todo: use PRT model's DIS instead of fmi's?? + ic = dis%con%ja(ipos) particle%idomain(2) = ic ! compute and set user node number and layer on particle @@ -214,17 +217,18 @@ subroutine map_neighbor(this, defn, inface, z) ! -- Map to shared cell face of neighbor inbr = defn%facenbr(inface) - if (inbr .eq. 0) then ! kluge note: redundant check + if (inbr .eq. 0) then ! -- Exterior face; no neighbor to map to - inface = -1 ! kluge??? + ! todo AMP: reconsider when multiple models allowed + inface = -1 else ! -- Load definition for neighbor cell (neighbor with shared face) icin = defn%icell j = this%fmi%dis%con%ia(icin) ic = this%fmi%dis%con%ja(j + inbr) call create_defn(cd) - ! kluge note: really only need to load facenbr and npolyverts for this - call this%load_cell_defn(ic, cd) ! kluge + call this%load_cell_defn(ic, cd) + npolyvertsin = defn%npolyverts npolyverts = cd%npolyverts if (inface .eq. npolyvertsin + 2) then @@ -236,7 +240,6 @@ subroutine map_neighbor(this, defn, inface, z) else ! -- Exits and enters through shared polygon face j = this%fmi%dis%con%ia(ic) - ! kluge note: use shared_edge in DisvGeom to find shared polygon face??? do m = 1, npolyverts + 3 inbrnbr = cd%facenbr(m) if (this%fmi%dis%con%ja(j + inbrnbr) .eq. icin) then @@ -248,7 +251,6 @@ subroutine map_neighbor(this, defn, inface, z) topfrom = defn%top botfrom = defn%bot zrel = (z - botfrom) / (topfrom - botfrom) - ! kluge note: use PRT model's DIS instead of fmi's??? top = this%fmi%dis%top(ic) bot = this%fmi%dis%bot(ic) sat = this%fmi%gwfsat(ic) @@ -263,10 +265,12 @@ subroutine apply_disv(this, particle, tmax) class(MethodDisvType), intent(inout) :: this type(ParticleType), pointer, intent(inout) :: particle real(DP), intent(in) :: tmax - call this%track(particle, 1, tmax) ! kluge, hardwired to level 1 + call this%track(particle, 1, tmax) end subroutine apply_disv !> @brief Return the number of polygon vertices for a cell in the grid + !! todo, after initial release: is this necessary? can we just use + !! size of array returned by get_polyverts() function get_npolyverts(this, ic) result(npolyverts) ! -- dummy class(MethodDisvType), intent(inout) :: this @@ -282,28 +286,12 @@ function get_npolyverts(this, ic) result(npolyverts) type is (DisvType) ncpl = dis%get_ncpl() icu = dis%get_nodeuser(ic) - icu2d = icu - ((icu - 1) / ncpl) * ncpl ! kluge note: use MOD or MODULO??? + icu2d = icu - ((icu - 1) / ncpl) * ncpl npolyverts = dis%iavert(icu2d + 1) - dis%iavert(icu2d) - 1 - if (npolyverts .le. 0) npolyverts = npolyverts + size(dis%javert) ! kluge??? + if (npolyverts .le. 0) npolyverts = npolyverts + size(dis%javert) end select end function get_npolyverts - !> @brief Get top elevation based on index iatop - !! kluge note: not needed??? - function get_top(this, iatop) result(top) - ! -- dummy - class(MethodDisvType), intent(inout) :: this - integer(I4B), intent(in) :: iatop - ! -- result - real(DP) :: top - - if (iatop .lt. 0) then - top = this%fmi%dis%top(-iatop) - else - top = this%fmi%dis%bot(iatop) - end if - end function get_top - !> @brief Load cell definition from the grid subroutine load_cell_defn(this, ic, defn) ! -- dummy @@ -370,7 +358,7 @@ subroutine load_nbrs_to_defn(this, defn) integer(I4B) :: istart2 integer(I4B) :: istop1 integer(I4B) :: istop2 - integer(I4B) :: iedgeface + integer(I4B) :: isharedface integer(I4B) :: ncpl ic = defn%icell @@ -392,19 +380,20 @@ subroutine load_nbrs_to_defn(this, defn) istop1 = dis%iavert(j1 + 1) - 1 do iloc = 1, dis%con%ia(ic1 + 1) - dis%con%ia(ic1) - 1 ipos = dis%con%ia(ic1) + iloc - if (dis%con%mask(ipos) == 0) cycle ! kluge note: need mask here??? + ! mask could become relevant if PRT uses interface model + if (dis%con%mask(ipos) == 0) cycle ic2 = dis%con%ja(ipos) icu2 = dis%get_nodeuser(ic2) call get_jk(icu2, ncpl, dis%nlay, j2, k2) istart2 = dis%iavert(j2) istop2 = dis%iavert(j2 + 1) - 1 - call shared_edgeface(dis%javert(istart1:istop1), & - dis%javert(istart2:istop2), & - iedgeface) - if (iedgeface /= 0) then + call shared_face(dis%javert(istart1:istop1), & + dis%javert(istart2:istop2), & + isharedface) + if (isharedface /= 0) then ! -- Edge (polygon) face neighbor - defn%facenbr(iedgeface) = int(iloc, 1) + defn%facenbr(isharedface) = int(iloc, 1) else if (k2 > k1) then ! -- Bottom face neighbor @@ -423,43 +412,6 @@ subroutine load_nbrs_to_defn(this, defn) end subroutine load_nbrs_to_defn - !> @brief Find the edge face shared by two cells - !! - !! Find the shared edge face of cell1 shared by cell1 and cell2. - !! isharedface will return with 0 if there is no shared edge - !! face. Proceed forward through ivlist1 and backward through - !! ivlist2 as a clockwise face in cell1 must correspond to a - !! counter clockwise face in cell2. - !! - !! kluge note: based on DisvGeom shared_edge - !< - subroutine shared_edgeface(ivlist1, ivlist2, iedgeface) - integer(I4B), dimension(:) :: ivlist1 - integer(I4B), dimension(:) :: ivlist2 - integer(I4B), intent(out) :: iedgeface - integer(I4B) :: nv1 - integer(I4B) :: nv2 - integer(I4B) :: il1 - integer(I4B) :: il2 - logical(LGP) :: found - - found = .false. - nv1 = size(ivlist1) - nv2 = size(ivlist2) - iedgeface = 0 - outerloop: do il1 = 1, nv1 - 1 - do il2 = nv2, 2, -1 - if (ivlist1(il1) == ivlist2(il2) .and. & - ivlist1(il1 + 1) == ivlist2(il2 - 1)) then - found = .true. - iedgeface = il1 - exit outerloop - end if - end do - if (found) exit - end do outerloop - end subroutine shared_edgeface - !> @brief Load flows into the cell definition. !! These include face flows and net distributed flows. !! Assumes cell index and number of vertices are already loaded. @@ -483,7 +435,7 @@ subroutine load_flows_to_defn(this, defn) ! -- Load face flows. Note that the faceflow array ! -- does not get reallocated if it is already allocated ! -- to a size greater than or equal to npolyverts+3. - defn%faceflow = 0d0 + defn%faceflow = DZERO ! -- As with polygon nbrs, polygon face flows wrap around for ! -- convenience at position npolyverts+1, and bot and top flows @@ -496,8 +448,8 @@ subroutine load_flows_to_defn(this, defn) call this%load_boundary_flows_to_defn_poly(defn) ! -- Set inoexitface flag defn%inoexitface = 1 - do m = 1, npolyverts + 3 ! kluge note: can be streamlined with above code - if (defn%faceflow(m) < 0d0) defn%inoexitface = 0 + do m = 1, npolyverts + 3 + if (defn%faceflow(m) < DZERO) defn%inoexitface = 0 end do ! -- Add up net distributed flow @@ -505,7 +457,7 @@ subroutine load_flows_to_defn(this, defn) this%fmi%StorageFlows(ic) ! -- Set weak sink flag - if (this%fmi%SinkFlows(ic) .ne. 0d0) then + if (this%fmi%SinkFlows(ic) .ne. DZERO) then defn%iweaksink = 1 else defn%iweaksink = 0 @@ -527,11 +479,9 @@ subroutine load_boundary_flows_to_defn_rect(this, defn) ic = defn%icell npolyverts = defn%npolyverts - ! kluge note - assignment of BoundaryFlows to faceflow below assumes vertex 1 - ! is at upper left of rectangular cell, and BoundaryFlows use old iface order - ! ioffset = (ic - 1)*6 + ! assignment of BoundaryFlows to faceflow below assumes clockwise + ! ordering of faces, with face 1 being the "western" face ioffset = (ic - 1) * 10 - ! kluge note: should these be additive (seems so)??? defn%faceflow(1) = defn%faceflow(1) + & this%fmi%BoundaryFlows(ioffset + 4) defn%faceflow(2) = defn%faceflow(2) + & @@ -566,14 +516,11 @@ subroutine load_boundary_flows_to_defn_rect_quad(this, defn) integer(I4B) :: m2 integer(I4B) :: mdiff real(DP) :: qbf - integer(I4B) :: irectvert(5) ! kluge + integer(I4B) :: irectvert(5) ic = defn%icell npolyverts = defn%npolyverts - ! kluge note - assignment of BoundaryFlows to faceflow below assumes vertex 1 - ! is at upper left of rectangular cell, and BoundaryFlows use old iface order - ! ioffset = (ic - 1)*6 ioffset = (ic - 1) * 10 ! -- Polygon faces in positions 1 through npolyverts do n = 1, 4 @@ -585,14 +532,14 @@ subroutine load_boundary_flows_to_defn_rect_quad(this, defn) nbf = n end if qbf = this%fmi%BoundaryFlows(ioffset + nbf) - nn = 0 ! kluge ... + nn = 0 do m = 1, npolyverts if (.not. defn%ispv180(m)) then nn = nn + 1 irectvert(nn) = m end if end do - irectvert(5) = irectvert(1) ! ... kluge + irectvert(5) = irectvert(1) m1 = irectvert(n) m2 = irectvert(n + 1) if (m2 .lt. m1) m2 = m2 + npolyverts @@ -636,10 +583,8 @@ subroutine load_boundary_flows_to_defn_poly(this, defn) ic = defn%icell npolyverts = defn%npolyverts - ! kluge note: hardwired for max 8 polygon faces plus top and bottom for now - ioffset = (ic - 1) * 10 + ioffset = (ic - 1) * MAX_POLY_CELLS do iv = 1, npolyverts - ! kluge note: should these be additive (seems so)??? defn%faceflow(iv) = & defn%faceflow(iv) + & this%fmi%BoundaryFlows(ioffset + iv) @@ -647,17 +592,17 @@ subroutine load_boundary_flows_to_defn_poly(this, defn) defn%faceflow(npolyverts + 1) = defn%faceflow(1) defn%faceflow(npolyverts + 2) = & defn%faceflow(npolyverts + 2) + & - this%fmi%BoundaryFlows(ioffset + 9) + this%fmi%BoundaryFlows(ioffset + MAX_POLY_CELLS - 1) defn%faceflow(npolyverts + 3) = & defn%faceflow(npolyverts + 3) + & - this%fmi%BoundaryFlows(ioffset + 10) + this%fmi%BoundaryFlows(ioffset + MAX_POLY_CELLS) end subroutine load_boundary_flows_to_defn_poly !> @brief Load 180-degree vertex indicator array and set flags - !! indicating how cell can be represented (kluge: latter needed?). + !! indicating how cell can be represented. !! Assumes cell index and number of vertices are already loaded. - subroutine load_flags_to_defn(this, defn) ! kluge note: rename??? + subroutine load_flags_to_defn(this, defn) ! -- dummy class(MethodDisvType), intent(inout) :: this type(CellDefnType), pointer, intent(inout) :: defn @@ -670,7 +615,6 @@ subroutine load_flags_to_defn(this, defn) ! kluge note: rename??? integer(I4B) :: ic integer(I4B) :: num90 integer(I4B) :: num180 - integer(I4B) :: numacute real(DP) :: x0 real(DP) :: y0 real(DP) :: x1 @@ -678,11 +622,10 @@ subroutine load_flags_to_defn(this, defn) ! kluge note: rename??? real(DP) :: x2 real(DP) :: y2 real(DP) :: epsang - real(DP) :: epslen real(DP) :: s0x real(DP) :: s0y real(DP) :: & - s0mag, s2x, s2y, s2mag, sinang, dotprod + s0mag, s2x, s2y, s2mag, sinang, cosang, dotprod logical(LGP) last180 ic = defn%icell @@ -697,14 +640,11 @@ subroutine load_flags_to_defn(this, defn) ! kluge note: rename??? defn%ispv180(1:npolyverts + 1) = .false. defn%can_be_rect = .false. defn%can_be_quad = .false. - epsang = 1d-3 ! kluge hardwire, and using one value for all angles - epslen = 1d-3 ! kluge hardwire + epsang = 1d-3 ! todo AMP: consider tolerance num90 = 0 num180 = 0 - numacute = 0 last180 = .false. - ! kluge note: assumes non-self-intersecting polygon; - ! no checks for self-intersection (e.g., star) + ! assumes non-self-intersecting polygon do m = 1, npolyverts m1 = m if (m1 .eq. 1) then @@ -730,51 +670,23 @@ subroutine load_flags_to_defn(this, defn) ! kluge note: rename??? s2y = y2 - y1 s2mag = dsqrt(s2x * s2x + s2y * s2y) sinang = (s0x * s2y - s0y * s2x) / (s0mag * s2mag) - ! kluge note: is it better to check in terms of angle rather than sin{angle}??? + cosang = dsqrt(dabs(DONE - (sinang * sinang))) if (dabs(sinang) .lt. epsang) then dotprod = s0x * s2x + s0y * s2y - if (dotprod .gt. 0d0) then - print *, "Cell ", ic, " has a zero angle" ! kluge - print *, " (tolerance epsang = ", epsang, ")" - call pstop(1) - else - if (last180) then - print *, "Cell ", ic, & - " has consecutive 180-deg angles - not supported" ! kluge - print *, " (tolerance epsang = ", epsang, ")" - call pstop(1) - else if (dabs((s2mag - s0mag) / max(s2mag, s0mag)) .gt. epslen) then - print *, "Cell ", ic, & - " has a non-bisecting 180-deg vertex - not supported" ! kluge - print *, " (tolerance epslen = ", epslen, ")" - call pstop(1) - end if - ! kluge note: want to evaluate 180-deg vertex using one criterion implemented in - ! one place (procedure) to avoid potential disparities between multiple checks + if (dotprod .lt. DZERO) then num180 = num180 + 1 last180 = .true. defn%ispv180(m) = .true. end if - else if (sinang .gt. 0d0) then - numacute = numacute + 1 - if (dabs(1d0 - sinang) .lt. epsang) num90 = num90 + 1 - last180 = .false. else - print *, "Cell ", ic, & - " has an obtuse angle and so is nonconvex" ! kluge - print *, " (tolerance epsang = ", epsang, ")" - call pstop(1) + if (dabs(cosang) .lt. epsang) num90 = num90 + 1 + last180 = .false. end if end do - if ((num90 .ne. 4) .and. (num180 .ne. 0)) then - print *, "Cell ", ic, & - " is a non-rectangle with a 180-deg angle - not supported" ! kluge - print *, " (tolerance epsang = ", epsang, ")" - call pstop(1) - end if + ! -- List of 180-degree indicators wraps around for convenience defn%ispv180(npolyverts + 1) = defn%ispv180(1) - ! + if (num90 .eq. 4) then if (num180 .eq. 0) then defn%can_be_rect = .true. diff --git a/src/Solution/ParticleTracker/MethodSubcellPollock.f90 b/src/Solution/ParticleTracker/MethodSubcellPollock.f90 index e1ab5a5df27..aab221e1634 100644 --- a/src/Solution/ParticleTracker/MethodSubcellPollock.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellPollock.f90 @@ -8,6 +8,7 @@ module MethodSubcellPollockModule use TrackModule, only: TrackFileControlType use BaseDisModule, only: DisBaseType use CellModule, only: CellType + use ConstantsModule, only: DZERO, DONE implicit none private public :: MethodSubcellPollockType @@ -133,9 +134,11 @@ subroutine track_subcell(this, subcell, particle, tmax) statusVZ = calculate_dt(subcell%vz1, subcell%vz2, subcell%dz, & initialZ, vz, dvzdz, dtexitz) - ! -- Subcell with no exit face, terminate the particle + ! -- Subcell has no exit face, terminate the particle + ! todo: after initial release, consider ramifications if ((statusVX .eq. 3) .and. (statusVY .eq. 3) .and. (statusVZ .eq. 3)) then - call this%save(particle, reason=9) + particle%istatus = 9 + call this%save(particle, reason=3) return end if @@ -145,7 +148,7 @@ subroutine track_subcell(this, subcell, particle, tmax) if ((statusVX .lt. 2) .or. (statusVY .lt. 2) .or. (statusVZ .lt. 2)) then ! -- Consider x-oriented faces dtexit = dtexitx - if (vx .lt. 0d0) then + if (vx .lt. DZERO) then exitFace = 1 else if (vx .gt. 0) then exitFace = 2 @@ -153,18 +156,18 @@ subroutine track_subcell(this, subcell, particle, tmax) ! -- Consider y-oriented faces if (dtexity .lt. dtexit) then dtexit = dtexity - if (vy .lt. 0d0) then + if (vy .lt. DZERO) then exitFace = 3 - else if (vy .gt. 0d0) then + else if (vy .gt. DZERO) then exitFace = 4 end if end if ! -- Consider z-oriented faces if (dtexitz .lt. dtexit) then dtexit = dtexitz - if (vz .lt. 0d0) then + if (vz .lt. DZERO) then exitFace = 5 - else if (vz .gt. 0d0) then + else if (vz .gt. DZERO) then exitFace = 6 end if end if @@ -225,26 +228,26 @@ subroutine track_subcell(this, subcell, particle, tmax) t = texit dt = dtexit if ((exitFace .eq. 1) .or. (exitFace .eq. 2)) then - x = 0d0 + x = DZERO y = new_x(vy, dvydy, subcell%vy1, subcell%vy2, & dt, initialY, subcell%dy, statusVY == 1) z = new_x(vz, dvzdz, subcell%vz1, subcell%vz2, & dt, initialZ, subcell%dz, statusVZ == 1) - if (exitFace .eq. 2) x = 1.0d0 + if (exitFace .eq. 2) x = DONE else if ((exitFace .eq. 3) .or. (exitFace .eq. 4)) then x = new_x(vx, dvxdx, subcell%vx1, subcell%vx2, dt, & initialX, subcell%dx, statusVX == 1) - y = 0d0 + y = DZERO z = new_x(vz, dvzdz, subcell%vz1, subcell%vz2, dt, & initialZ, subcell%dz, statusVZ == 1) - if (exitFace .eq. 4) y = 1.0d0 + if (exitFace .eq. 4) y = DONE else if ((exitFace .eq. 5) .or. (exitFace .eq. 6)) then x = new_x(vx, dvxdx, subcell%vx1, subcell%vx2, & dt, initialX, subcell%dx, statusVX == 1) y = new_x(vy, dvydy, subcell%vy1, subcell%vy2, & dt, initialY, subcell%dy, statusVY == 1) - z = 0d0 - if (exitFace .eq. 6) z = 1.0d0 + z = DZERO + if (exitFace .eq. 6) z = DONE else print *, "programmer error, invalid exit face", exitFace call pstop(1) @@ -304,19 +307,19 @@ function calculate_dt(v1, v2, dx, xL, v, dvdx, dt) result(status) status = -1 dt = 1.0d+20 v2a = v2 - if (v2a .lt. 0d0) v2a = -v2a + if (v2a .lt. DZERO) v2a = -v2a v1a = v1 - if (v1a .lt. 0d0) v1a = -v1a + if (v1a .lt. DZERO) v1a = -v1a dv = v2 - v1 dva = dv - if (dva .lt. 0d0) dva = -dva + if (dva .lt. DZERO) dva = -dva ! -- Check for a uniform zero velocity in this direction. ! -- If so, set status = 2 and return (dt = 1.0d+20). tol = 1.0d-15 if ((v2a .lt. tol) .and. (v1a .lt. tol)) then - v = 0d0 - dvdx = 0d0 + v = DZERO + dvdx = DZERO status = 2 return end if @@ -334,7 +337,7 @@ function calculate_dt(v1, v2, dx, xL, v, dvdx, dt) result(status) x = xL * dx if (v1 .gt. zro) dt = (dx - x) / v1 if (v1 .lt. zrom) dt = -x / v1 - dvdx = 0d0 + dvdx = DZERO status = 1 return end if @@ -342,13 +345,13 @@ function calculate_dt(v1, v2, dx, xL, v, dvdx, dt) result(status) ! -- Velocity has a linear variation. ! -- Compute velocity corresponding to particle position. dvdx = dv / dx - v = (1.0d0 - xL) * v1 + xL * v2 + v = (DONE - xL) * v1 + xL * v2 ! -- If flow is into the cell from both sides there is no outflow. ! -- In that case, set status = 3 and return. noOutflow = .true. - if (v1 .lt. 0d0) noOutflow = .false. - if (v2 .gt. 0d0) noOutflow = .false. + if (v1 .lt. DZERO) noOutflow = .false. + if (v2 .gt. DZERO) noOutflow = .false. if (noOutflow) then status = 3 return @@ -358,10 +361,10 @@ function calculate_dt(v1, v2, dx, xL, v, dvdx, dt) result(status) ! -- see if the particle is located exactly on the divide. If it is, move ! -- it very slightly to get it off the divide. This avoids possible ! -- numerical problems related to stagnation points. - if ((v1 .le. 0d0) .and. (v2 .ge. 0d0)) then - if (abs(v) .le. 0d0) then + if ((v1 .le. DZERO) .and. (v2 .ge. DZERO)) then + if (abs(v) .le. DZERO) then v = 1.0d-20 - if (v2 .le. 0d0) v = -v + if (v2 .le. DZERO) v = -v end if end if @@ -371,7 +374,7 @@ function calculate_dt(v1, v2, dx, xL, v, dvdx, dt) result(status) vr1 = v1 / v vr2 = v2 / v vr = vr1 - if (vr .le. 0d0) then + if (vr .le. DZERO) then vr = vr2 end if @@ -379,16 +382,16 @@ function calculate_dt(v1, v2, dx, xL, v, dvdx, dt) result(status) ! -- throughout the cell (i.e. no flow divide). If so, set the value ! -- of vr to reflect the appropriate direction. v1v2 = v1 * v2 - if (v1v2 .gt. 0d0) then - if (v .gt. 0d0) vr = vr2 - if (v .lt. 0d0) vr = vr1 + if (v1v2 .gt. DZERO) then + if (v .gt. DZERO) vr = vr2 + if (v .lt. DZERO) vr = vr1 end if ! -- Check if vr is (very close to) zero. ! -- If so, set status = 2 and return (dt = 1.0d+20). if (dabs(vr) .lt. 1.0d-10) then - v = 0d0 - dvdx = 0d0 + v = DZERO + dvdx = DZERO status = 2 return end if @@ -431,13 +434,13 @@ pure function new_x(v, dvdx, v1, v2, dt, x, dx, velocity_profile) result(newx) newx = x if (lprofile) then newx = newx + (v1 * dt / dx) - else if (v .ne. 0d0) then - newx = newx + (v * (exp(dvdx * dt) - 1.0d0) / dvdx / dx) + else if (v .ne. DZERO) then + newx = newx + (v * (exp(dvdx * dt) - DONE) / dvdx / dx) end if ! -- clamp to [0, 1] - if (newx .lt. 0d0) newx = 0d0 - if (newx .gt. 1.0d0) newx = 1.0d0 + if (newx .lt. DZERO) newx = DZERO + if (newx .gt. DONE) newx = DONE end function new_x diff --git a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 index 5b34491e0e0..cec1ecd0bfe 100644 --- a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 @@ -1,5 +1,6 @@ module MethodSubcellTernaryModule use KindModule, only: DP, I4B, LGP + use ConstantsModule, only: DZERO, DSAME, DHALF, DONE, DTWO use ErrorUtilModule, only: pstop use GeomUtilModule, only: skew use MethodModule, only: MethodType @@ -62,6 +63,94 @@ subroutine apply_mst(this, particle, tmax) end select end subroutine apply_mst + !> @brief Nudge barycentric coordinates such that none is less + !! than distance DSAME from any edge of the canonical subcell. + !! + !! Assumes 1 = alpha + beta + gamma, and 0 <= alpha <= 1 (and + !! likewise for beta and gamma). The latter is not strictly + !! required but it should be established that a particle is + !! _roughly_ in a given subcell before calling this routine. + !< + subroutine nudge(alpi, beti, gami) + ! dummy + real(DP), intent(inout) :: alpi + real(DP), intent(inout) :: beti + real(DP), intent(out) :: gami + ! local + real(DP) :: lolimit + real(DP) :: hilimit + real(DP) :: delta + + gami = DONE - alpi - beti + lolimit = DSAME + hilimit = DONE - DTWO * DSAME + ! Check alpha coordinate against lower limit + if (alpi < lolimit) then + ! Alpha is too low, so nudge alpha to lower limit; this is a move + ! parallel to the "alpha axis," which also changes gamma + alpi = lolimit + gami = DONE - alpi - beti + ! Check beta coordinate against lower limit (which in this + ! case is equivalent to checking gamma coordinate against + ! upper limit) + if (beti < lolimit) then + ! Beta is too low (gamma is too high), so nudge beta to lower limit; + ! this is a move parallel to the "beta axis," which also changes gamma + beti = lolimit + gami = hilimit + ! Check beta coordinate against upper limit (which in this + ! case is equivalent to checking gamma coordinate against + ! lower limit) + else if (beti > hilimit) then + ! Beta is too high (gamma is too low), so nudge beta to lower limit; + ! this is a move parallel to the "beta axis," which also changes gamma + beti = hilimit + gami = lolimit + end if + end if + ! Check beta coordinate against lower limit. (If alpha coordinate + ! was nudged to lower limit, beta and gamma coordinates have also + ! been adjusted as necessary to place particle within subcell, and + ! subsequent checks on beta and gamma will evaluate to false, and + ! no further adjustments will be made.) + if (beti < lolimit) then + ! Beta is too low, so nudge beta to lower limit; this is a move + ! parallel to the "beta axis," which also changes gamma + beti = lolimit + gami = DONE - alpi - beti + ! Check alpha coordinate against lower limit (which in this + ! case is equivalent to checking gamma coordinate against + ! upper limit) + if (alpi < lolimit) then + ! Alpha is too low (gamma is too high), so nudge alpha to lower limit; + ! this is a move parallel to the "alpha axis," which also changes gamma + alpi = lolimit + gami = hilimit + ! Check alpha coordinate against upper limit (which in this + ! case is equivalent to checking gamma coordinate against + ! lower limit) + else if (alpi > hilimit) then + ! Alpha is too high (gamma is too low), so nudge alpha to lower limit; + ! this is a move parallel to the "alpha axis," which also changes gamma + alpi = hilimit + gami = lolimit + end if + end if + ! Check gamma coordinate against lower limit.(If alpha and/or beta + ! coordinate was nudged to lower limit, gamma coordinate has also + ! been adjusted as necessary to place particle within subcell, and + ! subsequent check on gamma will evaluate to false, and no further + ! adjustment will be made.) + if (gami < lolimit) then + ! Gamma is too low, so nudge gamma to lower limit; this is a move + ! parallel to the "gamma axis," which also changes alpha and beta + delta = DHALF * (lolimit - gami) + gami = DSAME + alpi = alpi - delta + beti = beti - delta + end if + end subroutine nudge + !> @brief Track a particle across a triangular subcell using the ternary method subroutine track_subcell(this, subcell, particle, tmax) ! dummy @@ -71,7 +160,6 @@ subroutine track_subcell(this, subcell, particle, tmax) real(DP), intent(in) :: tmax ! local integer(I4B) :: exitFace - logical(LGP) :: lbary ! kluge real(DP) :: x0 real(DP) :: y0 real(DP) :: x1 @@ -98,9 +186,6 @@ subroutine track_subcell(this, subcell, particle, tmax) real(DP) :: sxx real(DP) :: sxy real(DP) :: syy - real(DP) :: rot(2, 2), res(2), loc(2) - real(DP) :: alp - real(DP) :: bet real(DP) :: alp0 real(DP) :: bet0 real(DP) :: alp1 @@ -109,6 +194,7 @@ subroutine track_subcell(this, subcell, particle, tmax) real(DP) :: bet2 real(DP) :: alpi real(DP) :: beti + real(DP) :: gami real(DP) :: vzbot real(DP) :: vztop real(DP) :: vzi @@ -135,12 +221,10 @@ subroutine track_subcell(this, subcell, particle, tmax) real(DP) :: dtexit real(DP) :: alpexit real(DP) :: betexit - integer(I4B) :: ntdebug ! kluge integer(I4B) :: reason integer(I4B) :: i integer(I4B) :: tslice(2) - lbary = .true. ! kluge ntmax = 10000 nsave = 1 ! needed??? isolv = this%zeromethod @@ -170,19 +254,20 @@ subroutine track_subcell(this, subcell, particle, tmax) vzbot = subcell%vzbot vztop = subcell%vztop - ! -- Translate and rotate coordinates to "canonical" configuration + ! -- Transform coordinates to "canonical" configuration call canonical(x0, y0, x1, y1, x2, y2, & v0x, v0y, v1x, v1y, v2x, v2y, & xi, yi, & rxx, rxy, ryx, ryy, & sxx, sxy, syy, & - alp0, bet0, alp1, bet1, alp2, bet2, alpi, beti, & - lbary) + alp0, bet0, alp1, bet1, alp2, bet2, alpi, beti) + + ! -- Nudge particle if necessary so it begins within the subcell + call nudge(alpi, beti, gami) - ! -- Do calculations related to analytical z solution, which can be done - ! -- after traverse_triangle call if results not needed for adaptive time - ! -- stepping during triangle (subcell) traversal - ! kluge note: actually, can probably do z calculation just once for each cell + ! -- Do calculations related to analytical z solution, could possibly + ! be done just once for each cell, todo: profile? potentially store + ! on cell-level method? after initial release zirel = (zi - zbot) / dz call calculate_dt(vzbot, vztop, dz, zirel, vzi, & az, dtexitz, izstatus, & @@ -190,23 +275,20 @@ subroutine track_subcell(this, subcell, particle, tmax) vziodz = vzi / dz ! -- Traverse triangular subcell - ntdebug = -999 ! kluge debug bludebug itrifaceenter = particle%iboundary(3) - 1 if (itrifaceenter .eq. -1) itrifaceenter = 999 - - ! kluge note: can probably avoid calculating alpexit - ! here in many cases and wait to calculate it later, - ! once the final trajectory time is known call traverse_triangle(isolv, tol, step, & dtexitxy, alpexit, betexit, & itrifaceenter, itrifaceexit, & rxx, rxy, ryx, ryy, & alp0, bet0, alp1, bet1, alp2, bet2, alpi, beti, & - vziodz, az, lbary) + vziodz, az) - ! -- Subcell with no exit face, terminate the particle + ! -- Subcell has no exit face, terminate the particle + ! todo: after initial release, consider ramifications if ((itopbotexit .eq. 0) .and. (itrifaceexit .eq. 0)) then - call this%save(particle, reason=9) + particle%istatus = 9 + call this%save(particle, reason=3) return end if @@ -236,14 +318,13 @@ subroutine track_subcell(this, subcell, particle, tmax) end if end if - ! -- Compute exit time + ! -- Compute exit time, irrespective of tmax for now texit = particle%ttrack + dtexit t0 = particle%ttrack - ! -- Select user tracking times to solve. If this is the first time step - ! of the simulation, include all times before it begins; if it is the - ! last time step, include all times after it ends. Otherwise take the - ! times within the current period and time step only. + ! -- Select user tracking times to solve. If this is the last time step, include + ! all times after it ends (as per MODPATH 7's extension behavior). Otherwise + ! take the times within the current period and time step only. call this%tracktimes%try_advance() tslice = this%tracktimes%selection if (all(tslice > 0)) then @@ -251,24 +332,9 @@ subroutine track_subcell(this, subcell, particle, tmax) t = this%tracktimes%times(i) if (t < particle%ttrack .or. t >= texit .or. t >= tmax) cycle dt = t - t0 - call step_analytical(dt, alp, bet) - loc = (/alp, bet/) - if (lbary) loc = skew(loc, (/sxx, sxy, syy/), invert=.true.) - rot = reshape((/rxx, rxy, ryx, ryy/), shape(rot)) - res = matmul(rot, loc) ! rotate vector - x = res(1) + x0 - y = res(2) + y0 - ! kluge note: make this into a function - if (izstatus .eq. 2) then - ! -- vz uniformly zero - z = zi - else if (izstatus .eq. 1) then - ! -- vz uniform, nonzero - z = zi + vzi * dt - else - ! -- vz nonuniform - z = zbot + (vzi * dexp(az * dt) - vzbot) / az - end if + call calculate_xyz_position(dt, rxx, rxy, ryx, ryy, sxx, sxy, syy, & + izstatus, x0, y0, az, vzi, vzbot, & + ztop, zbot, zi, x, y, z) particle%x = x particle%y = y particle%z = z @@ -278,6 +344,8 @@ subroutine track_subcell(this, subcell, particle, tmax) end do end if + ! Compute final time, taking into account tmax, and set final + ! particle status if (texit .gt. tmax) then ! -- The computed exit time is greater than the maximum time, so set ! -- final time for particle trajectory equal to maximum time. @@ -295,39 +363,9 @@ subroutine track_subcell(this, subcell, particle, tmax) reason = 1 ! cell transition end if - ! -- Calculate final particle location - ! -- kluge note: need to evaluate both alpha and beta here only - ! -- for exitFace=0, otherwise just one or the other - call step_analytical(dt, alp, bet) - if (exitFace .eq. 1) then - bet = 0d0 - else if (exitFace .eq. 2) then - alp = 1d0 - bet - else if (exitFace .eq. 3) then - alp = 0d0 - end if - loc = (/alp, bet/) - if (lbary) loc = skew(loc, (/sxx, sxy, syy/), invert=.true.) - rot = reshape((/rxx, rxy, ryx, ryy/), shape(rot)) - res = matmul(rot, loc) ! rotate vector - x = res(1) + x0 - y = res(2) + y0 - if (exitFace .eq. 4) then - z = zbot - else if (exitFace .eq. 5) then - z = ztop - else - if (izstatus .eq. 2) then ! kluge note: make this into a function - ! -- vz uniformly zero - z = zi - else if (izstatus .eq. 1) then - ! -- vz uniform, nonzero - z = zi + vzi * dt - else - ! -- vz nonuniform - z = zbot + (vzi * dexp(az * dt) - vzbot) / az - end if - end if + call calculate_xyz_position(dt, rxx, rxy, ryx, ryy, sxx, sxy, syy, & + izstatus, x0, y0, az, vzi, vzbot, & + ztop, zbot, zi, x, y, z, exitface) ! -- Set final particle location in local (unscaled) subcell coordinates, ! -- final time for particle trajectory, and exit face @@ -338,8 +376,7 @@ subroutine track_subcell(this, subcell, particle, tmax) particle%iboundary(3) = exitFace ! -- Save particle track record - if (reason > -1) & - call this%save(particle, reason=reason) ! reason=2: timestep + call this%save(particle, reason=reason) end subroutine track_subcell !> @brief Do calculations related to analytical z solution @@ -380,19 +417,19 @@ subroutine calculate_dt(v1, v2, dx, xL, v, dvdx, & status = -1 dt = 1.0d+20 v2a = v2 - if (v2a .lt. 0d0) v2a = -v2a + if (v2a .lt. DZERO) v2a = -v2a v1a = v1 - if (v1a .lt. 0d0) v1a = -v1a + if (v1a .lt. DZERO) v1a = -v1a dv = v2 - v1 dva = dv - if (dva .lt. 0d0) dva = -dva + if (dva .lt. DZERO) dva = -dva ! Check for a uniform zero velocity in this direction. ! If so, set status = 2 and return (dt = 1.0d+20). tol = 1.0d-15 if ((v2a .lt. tol) .and. (v1a .lt. tol)) then - v = 0d0 - dvdx = 0d0 + v = DZERO + dvdx = DZERO status = 2 itopbotexit = 0 return @@ -417,7 +454,7 @@ subroutine calculate_dt(v1, v2, dx, xL, v, dvdx, & dt = -x / v1 itopbotexit = -1 end if - dvdx = 0d0 + dvdx = DZERO status = 1 return end if @@ -425,13 +462,13 @@ subroutine calculate_dt(v1, v2, dx, xL, v, dvdx, & ! Velocity has a linear variation. ! Compute velocity corresponding to particle position dvdx = dv / dx - v = (1.0d0 - xL) * v1 + xL * v2 + v = (DONE - xL) * v1 + xL * v2 ! If flow is into the cell from both sides there is no outflow. ! In that case, set status = 3 and return noOutflow = .true. - if (v1 .lt. 0d0) noOutflow = .false. - if (v2 .gt. 0d0) noOutflow = .false. + if (v1 .lt. DZERO) noOutflow = .false. + if (v2 .gt. DZERO) noOutflow = .false. if (noOutflow) then status = 3 itopbotexit = 0 @@ -442,10 +479,10 @@ subroutine calculate_dt(v1, v2, dx, xL, v, dvdx, & ! particle is located exactly on the divide. If it is, move it very slightly to ! get it off the divide. This avoids possible numerical problems related to ! stagnation points. - if ((v1 .le. 0d0) .and. (v2 .ge. 0d0)) then - if (abs(v) .le. 0d0) then + if ((v1 .le. DZERO) .and. (v2 .ge. DZERO)) then + if (abs(v) .le. DZERO) then v = 1.0d-20 - if (v2 .le. 0d0) v = -v + if (v2 .le. DZERO) v = -v end if end if @@ -455,7 +492,7 @@ subroutine calculate_dt(v1, v2, dx, xL, v, dvdx, & vr2 = v2 / v vr = vr1 itopbotexit = -1 - if (vr .le. 0d0) then + if (vr .le. DZERO) then vr = vr2 itopbotexit = -2 end if @@ -464,12 +501,12 @@ subroutine calculate_dt(v1, v2, dx, xL, v, dvdx, & ! Check if product v1*v2 > 0 then the velocity is in the same direction throughout ! the cell (i.e. no flow divide). If so, set vr to reflect appropriate direction. v1v2 = v1 * v2 - if (v1v2 .gt. 0d0) then - if (v .gt. 0d0) then + if (v1v2 .gt. DZERO) then + if (v .gt. DZERO) then vr = vr2 itopbotexit = -2 end if - if (v .lt. 0d0) then + if (v .lt. DZERO) then vr = vr1 itopbotexit = -1 end if @@ -480,4 +517,85 @@ subroutine calculate_dt(v1, v2, dx, xL, v, dvdx, & status = 0 end subroutine calculate_dt + !> @brief Calculate the particle's local unscaled xyz coordinates after dt. + subroutine calculate_xyz_position(dt, rxx, rxy, ryx, ryy, sxx, sxy, syy, & + izstatus, x0, y0, az, vzi, vzbot, & + ztop, zbot, zi, x, y, z, exitFace) + ! dummy + real(DP) :: dt + real(DP) :: rxx + real(DP) :: rxy + real(DP) :: ryx + real(DP) :: ryy + real(DP) :: sxx + real(DP) :: sxy + real(DP) :: syy + integer(I4B) :: izstatus + real(DP) :: x0 + real(DP) :: y0 + real(DP) :: az + real(DP) :: vzi + real(DP) :: vzbot + real(DP) :: ztop + real(DP) :: zbot + real(DP) :: zi + real(DP) :: x + real(DP) :: y + real(DP) :: z + integer(I4B), optional :: exitFace + ! local + integer(I4B) :: lexitface + real(DP) :: rot(2, 2), res(2), loc(2) + real(DP) :: alp + real(DP) :: bet + + ! process optional exit face argument + if (present(exitface)) then + lexitface = exitface + else + lexitface = 0 + end if + + ! calculate alpha and beta + call step_analytical(dt, alp, bet) + + ! if exit face is known, set alpha or beta coordinate + ! corresponding to the exit face exactly. + if (lexitFace .eq. 1) then + bet = DZERO + else if (lexitFace .eq. 2) then + alp = DONE - bet + else if (lexitFace .eq. 3) then + alp = DZERO + end if + + ! if exit face is top or bottom, set z coordinate exactly. + if (lexitFace .eq. 4) then + z = zbot + else if (lexitFace .eq. 5) then + z = ztop + else + ! otherwise calculate z. + if (izstatus .eq. 2) then + ! -- vz uniformly zero + z = zi + else if (izstatus .eq. 1) then + ! -- vz uniform, nonzero + z = zi + vzi * dt + else + ! -- vz nonuniform + z = zbot + (vzi * dexp(az * dt) - vzbot) / az + end if + end if + + ! transform (alp, beta) to (x, y) + loc = (/alp, bet/) + loc = skew(loc, (/sxx, sxy, syy/), invert=.true.) + rot = reshape((/rxx, rxy, ryx, ryy/), shape(rot)) + res = matmul(rot, loc) ! rotate vector + x = res(1) + x0 + y = res(2) + y0 + + end subroutine calculate_xyz_position + end module MethodSubcellTernaryModule diff --git a/src/Solution/ParticleTracker/Particle.f90 b/src/Solution/ParticleTracker/Particle.f90 index ca10e474742..9f905f1ca2f 100644 --- a/src/Solution/ParticleTracker/Particle.f90 +++ b/src/Solution/ParticleTracker/Particle.f90 @@ -8,7 +8,7 @@ module ParticleModule private public :: ParticleType, ParticleStoreType, & - create_particle, create_particle_store + create_particle, allocate_particle_store ! tracking levels (1: model, 2: cell, 3: subcell) integer, parameter, public :: levelmax = 4 @@ -59,6 +59,7 @@ module ParticleModule real(DP), public :: cosrot !< cosine of rotation angle for coordinate transformation from model to local logical(LGP), public :: transformed !< whether coordinates have been transformed from model to local logical(LGP), public :: advancing !< whether particle is still being tracked for current time step + integer(I4B), public :: ifrctrn !< whether to force solving the particle with the ternary method contains procedure, public :: get_model_coords procedure, public :: load_from_store @@ -88,8 +89,9 @@ module ParticleModule real(DP), dimension(:), pointer, contiguous :: trelease !< particle release time real(DP), dimension(:), pointer, contiguous :: tstop !< particle stop time real(DP), dimension(:), pointer, contiguous :: ttrack !< current tracking time + integer(I4B), dimension(:), pointer, contiguous :: ifrctrn !< force ternary method contains - procedure, public :: destroy => destroy_store + procedure, public :: deallocate => deallocate_particle_store procedure, public :: resize => resize_store procedure, public :: load_from_particle end type ParticleStoreType @@ -105,7 +107,7 @@ subroutine create_particle(particle) end subroutine create_particle !> @brief Create a new particle store - subroutine create_particle_store(this, np, mempath) + subroutine allocate_particle_store(this, np, mempath) type(ParticleStoreType), pointer :: this !< store integer(I4B), intent(in) :: np !< number of particles character(*), intent(in) :: mempath !< path to memory @@ -127,12 +129,13 @@ subroutine create_particle_store(this, np, mempath) call mem_allocate(this%ttrack, np, 'PLTTRACK', mempath) call mem_allocate(this%istopweaksink, np, 'PLISTOPWEAKSINK', mempath) call mem_allocate(this%istopzone, np, 'PLISTOPZONE', mempath) + call mem_allocate(this%ifrctrn, np, 'PLIFRCTRN', mempath) call mem_allocate(this%idomain, np, levelmax, 'PLIDOMAIN', mempath) call mem_allocate(this%iboundary, np, levelmax, 'PLIBOUNDARY', mempath) - end subroutine create_particle_store + end subroutine allocate_particle_store !> @brief Deallocate particle arrays - subroutine destroy_store(this, mempath) + subroutine deallocate_particle_store(this, mempath) class(ParticleStoreType), intent(inout) :: this !< store character(*), intent(in) :: mempath !< path to memory @@ -152,9 +155,10 @@ subroutine destroy_store(this, mempath) call mem_deallocate(this%ttrack, 'PLTTRACK', mempath) call mem_deallocate(this%istopweaksink, 'PLISTOPWEAKSINK', mempath) call mem_deallocate(this%istopzone, 'PLISTOPZONE', mempath) + call mem_deallocate(this%ifrctrn, 'PLIFRCTRN', mempath) call mem_deallocate(this%idomain, 'PLIDOMAIN', mempath) call mem_deallocate(this%iboundary, 'PLIBOUNDARY', mempath) - end subroutine destroy_store + end subroutine deallocate_particle_store !> @brief Reallocate particle arrays subroutine resize_store(this, np, mempath) @@ -163,7 +167,7 @@ subroutine resize_store(this, np, mempath) integer(I4B), intent(in) :: np !< number of particles character(*), intent(in) :: mempath !< path to memory - ! resize 1D arrays + ! resize arrays call mem_reallocate(this%imdl, np, 'PLIMDL', mempath) call mem_reallocate(this%iprp, np, 'PLIPRP', mempath) call mem_reallocate(this%irpt, np, 'PLIRPT', mempath) @@ -180,6 +184,7 @@ subroutine resize_store(this, np, mempath) call mem_reallocate(this%ttrack, np, 'PLTTRACK', mempath) call mem_reallocate(this%istopweaksink, np, 'PLISTOPWEAKSINK', mempath) call mem_reallocate(this%istopzone, np, 'PLISTOPZONE', mempath) + call mem_reallocate(this%ifrctrn, np, 'PLIFRCTRN', mempath) call mem_reallocate(this%idomain, np, levelmax, 'PLIDOMAIN', mempath) call mem_reallocate(this%iboundary, np, levelmax, 'PLIBOUNDARY', mempath) end subroutine resize_store @@ -221,6 +226,7 @@ subroutine load_from_store(this, store, imdl, iprp, ip) this%idomain(1) = imdl this%iboundary(1:levelmax) = & store%iboundary(ip, 1:levelmax) + this%ifrctrn = store%ifrctrn(ip) end subroutine load_from_store !> @brief Update particle store from particle @@ -253,6 +259,7 @@ subroutine load_from_particle(this, particle, ip) ip, & 1:levelmax) = & particle%iboundary(1:levelmax) + this%ifrctrn = particle%ifrctrn end subroutine load_from_particle !> @brief Apply the given global-to-local transformation to the particle. @@ -268,7 +275,7 @@ subroutine transform_coords(this, xorigin, yorigin, zorigin, & logical(LGP), intent(in), optional :: invert !< whether to invert logical(LGP), intent(in), optional :: reset !< whether to reset - ! -- reset if requested + ! Reset if requested if (present(reset)) then if (reset) then this%xorigin = DZERO @@ -282,24 +289,24 @@ subroutine transform_coords(this, xorigin, yorigin, zorigin, & end if end if - ! -- Otherwise, transform coordinates + ! Otherwise, transform coordinates call transform(this%x, this%y, this%z, & this%x, this%y, this%z, & xorigin, yorigin, zorigin, & sinrot, cosrot, invert) - ! -- Modify transformation from model coordinates to particle's new - ! -- local coordinates by incorporating this latest transformation + ! Modify transformation from model coordinates to particle's new + ! local coordinates by incorporating this latest transformation call compose(this%xorigin, this%yorigin, this%zorigin, & this%sinrot, this%cosrot, & xorigin, yorigin, zorigin, & sinrot, cosrot, invert) - ! -- Set isTransformed flag to true. Note that there is no check - ! -- to see whether the modification brings the coordinates back - ! -- to model coordinates (in which case the origin would be very - ! -- close to zero and sinrot and cosrot would be very close to 0. - ! -- and 1., respectively, allowing for roundoff error). + ! Set isTransformed flag to true. Note that there is no check + ! to see whether the modification brings the coordinates back + ! to model coordinates (in which case the origin would be very + ! close to zero and sinrot and cosrot would be very close to 0. + ! and 1., respectively, allowing for roundoff error). this%transformed = .true. end subroutine transform_coords @@ -312,12 +319,12 @@ subroutine get_model_coords(this, x, y, z) real(DP), intent(out) :: z !< z coordinate if (this%transformed) then - ! -- Transform back from local to model coordinates + ! Transform back from local to model coordinates call transform(this%x, this%y, this%z, x, y, z, & this%xorigin, this%yorigin, this%zorigin, & this%sinrot, this%cosrot, .true.) else - ! -- Already in model coordinates + ! Already in model coordinates x = this%x y = this%y z = this%z diff --git a/src/Solution/ParticleTracker/TernarySolveTrack.f90 b/src/Solution/ParticleTracker/TernarySolveTrack.f90 index f572725ee44..6cc39b82d4c 100644 --- a/src/Solution/ParticleTracker/TernarySolveTrack.f90 +++ b/src/Solution/ParticleTracker/TernarySolveTrack.f90 @@ -2,6 +2,7 @@ module TernarySolveTrack use KindModule, only: I4B, DP, LGP use GeomUtilModule, only: skew + use ConstantsModule, only: DPREC, DZERO, DONE use MathUtilModule, only: f1d, zero_ch, zero_br use ErrorUtilModule, only: pstop @@ -33,8 +34,7 @@ subroutine traverse_triangle(isolv, tol, step, texit, & itrifaceenter, itrifaceexit, & rxx, rxy, ryx, ryy, & alp0, bet0, alp1, bet1, alp2, bet2, alpi, beti, & - vziodz, az, & - bary) + vziodz, az) ! -- dummy integer(I4B), intent(in) :: isolv !< solution method real(DP), intent(in) :: tol !< solution tolerance @@ -58,7 +58,6 @@ subroutine traverse_triangle(isolv, tol, step, texit, & real(DP) :: beti !< alpha and beta coefficients real(DP) :: vziodz real(DP) :: az - logical(LGP), intent(in) :: bary !< whether to use barycentric coordinates ! -- local real(DP) :: texit0 real(DP) :: alpexit0 @@ -71,7 +70,7 @@ subroutine traverse_triangle(isolv, tol, step, texit, & real(DP) :: betexit2 ! -- Compute elements of matrix W - call get_w(alp1, bet1, alp2, bet2, waa, wab, wba, wbb, bary) + call get_w(alp1, bet1, alp2, bet2, waa, wab, wba, wbb) ! -- Determine alpha and beta analytically as functions of time call solve_coefs(alpi, beti) @@ -116,8 +115,7 @@ subroutine canonical(x0, y0, x1, y1, x2, y2, & xi, yi, & rxx, rxy, ryx, ryy, & sxx, sxy, syy, & - alp0, bet0, alp1, bet1, alp2, bet2, alpi, beti, & - bary) + alp0, bet0, alp1, bet1, alp2, bet2, alpi, beti) ! -- dummy real(DP) :: x0 real(DP) :: y0 @@ -146,7 +144,6 @@ subroutine canonical(x0, y0, x1, y1, x2, y2, & real(DP) :: bet2 real(DP) :: alpi real(DP) :: beti !< alpha and beta coefficients - logical(LGP), intent(in) :: bary !< whether to use barycentric coordinates ! -- local real(DP) :: baselen real(DP) :: oobaselen @@ -166,17 +163,17 @@ subroutine canonical(x0, y0, x1, y1, x2, y2, & x2diff = x2 - x0 y2diff = y2 - y0 baselen = dsqrt(x1diff * x1diff + y1diff * y1diff) - oobaselen = 1d0 / baselen + oobaselen = DONE / baselen cosomega = x1diff * oobaselen sinomega = y1diff * oobaselen rxx = cosomega rxy = sinomega ryx = -sinomega ryy = cosomega - alp0 = 0d0 - bet0 = 0d0 + alp0 = DZERO + bet0 = DZERO alp1 = baselen - bet1 = 0d0 + bet1 = DZERO rot = reshape((/rxx, ryx, rxy, ryy/), shape(rot)) res = matmul(rot, (/x2diff, y2diff/)) @@ -193,29 +190,26 @@ subroutine canonical(x0, y0, x1, y1, x2, y2, & alpi = res(1) beti = res(2) - if (bary) then - sxx = 1d0 / alp1 - syy = 1d0 / bet2 - sxy = -alp2 * sxx * syy - alp1 = 1d0 - alp2 = 0d0 - bet2 = 1d0 - cv0 = skew(cv0, (/sxx, sxy, syy/)) - cv1 = skew(cv1, (/sxx, sxy, syy/)) - cv2 = skew(cv2, (/sxx, sxy, syy/)) - res = (/alpi, beti/) - res = skew(res, (/sxx, sxy, syy/)) - alpi = res(1) - beti = res(2) - end if + sxx = DONE / alp1 + syy = DONE / bet2 + sxy = -alp2 * sxx * syy + alp1 = DONE + alp2 = DZERO + bet2 = DONE + cv0 = skew(cv0, (/sxx, sxy, syy/)) + cv1 = skew(cv1, (/sxx, sxy, syy/)) + cv2 = skew(cv2, (/sxx, sxy, syy/)) + res = (/alpi, beti/) + res = skew(res, (/sxx, sxy, syy/)) + alpi = res(1) + beti = res(2) end subroutine !> @brief Compute elements of W matrix subroutine get_w( & alp1, bet1, alp2, bet2, & - waa, wab, wba, wbb, & - bary) + waa, wab, wba, wbb) ! -- dummy real(DP) :: alp1 real(DP) :: bet1 @@ -225,41 +219,20 @@ subroutine get_w( & real(DP) :: wab real(DP) :: wba real(DP) :: wbb !< w matrix - logical(LGP), intent(in), optional :: bary !< barycentric coordinates ! -- local - logical(LGP) :: lbary real(DP) :: v1alpdiff real(DP) :: v2alpdiff real(DP) :: v2betdiff - real(DP) :: ooalp1 - real(DP) :: oobet2 - real(DP) :: vterm - - if (present(bary)) then - lbary = bary - else - lbary = .true. - end if ! -- Note: wab is the "alpha,beta" entry in matrix W ! and the alpha component of the w^(beta) vector v1alpdiff = cv1(1) - cv0(1) v2alpdiff = cv2(1) - cv0(1) v2betdiff = cv2(2) - cv0(2) - if (bary) then - waa = v1alpdiff - wab = v2alpdiff - wba = 0d0 - wbb = v2betdiff - else - ooalp1 = 1d0 / alp1 - oobet2 = 1d0 / bet2 - vterm = v1alpdiff * ooalp1 - waa = vterm - wab = (v2alpdiff - alp2 * vterm) * oobet2 - wba = 0d0 - wbb = v2betdiff * oobet2 - end if + waa = v1alpdiff + wab = v2alpdiff + wba = DZERO + wbb = v2betdiff end subroutine @@ -278,7 +251,7 @@ subroutine solve_coefs(alpi, beti) real(DP) :: vfact real(DP) :: oowaa - zerotol = 1d-10 ! kluge + zerotol = 1d-10 ! todo AMP: consider tolerance if (dabs(wbb) .gt. zerotol) then wratv = (wab / wbb) * cv0(2) acoef = cv0(1) - wratv @@ -395,7 +368,6 @@ subroutine find_exit_bary(isolv, itriface, itrifaceenter, & real(DP) :: v1n real(DP) :: v2n real(DP) :: vbeti - real(DP) :: zerotol real(DP) :: betlo real(DP) :: bethi real(DP) :: betsollo @@ -403,9 +375,11 @@ subroutine find_exit_bary(isolv, itriface, itrifaceenter, & real(DP) :: betoutlo real(DP) :: betouthi integer(I4B) :: ibettrend + real(DP) :: zerotol + + zerotol = 1d-10 ! todo AMP: consider tolerance ! -- Use iterative scheme or numerical integration indicated by isolv. - zerotol = 1d-10 ! kluge if (itriface .eq. 0) then ! -- Checking for exit on canonical face 0 (beta = 0) if (itrifaceenter .eq. 0) then @@ -414,28 +388,28 @@ subroutine find_exit_bary(isolv, itriface, itrifaceenter, & texit = huge(1d0) else ! -- Not the entrance face, so check for outflow - if (cv0(2) .ge. 0d0) then + if (cv0(2) .ge. DZERO) then ! check beta velocity along beta=0 face ! -- Inflow or no flow, so no exit - texit = huge(1d0) + texit = huge(DONE) else ! -- Outflow, so check beta-velocity at the initial location, ! -- recognizing that it will never change sign along the ! -- trajectory (and will not be blocked from zero by an asymptote) vbeti = cv0(2) + wbb * beti - if (vbeti .ge. 0d0) then + if (vbeti .ge. DZERO) then ! -- Can't exit along beta = 0 - texit = huge(1d0) + texit = huge(DONE) else ! -- get alpt and check it - call get_t_alpt(0d0, t, alpt) - if ((alpt .ge. 0d0) .and. (alpt .le. 1d0)) then + call get_t_alpt(DZERO, t, alpt) + if ((alpt .ge. DZERO) .and. (alpt .le. DONE)) then ! -- alpt within the edge, so exit found texit = t alpexit = alpt - betexit = 0d0 + betexit = DZERO else ! -- alpt not within the edge, so not an exit - texit = huge(1d0) + texit = huge(DONE) end if end if end if @@ -452,9 +426,9 @@ subroutine find_exit_bary(isolv, itriface, itrifaceenter, & v1n = cv0(1) v2n = cv2(1) end if - if ((v1n .ge. 0d0) .and. (v2n .ge. 0d0)) then + if ((v1n .ge. DZERO) .and. (v2n .ge. DZERO)) then ! -- No outflow at vn1 and vn2 corners; no outflow interval, so no exit. - texit = huge(1d0) + texit = huge(DONE) else ! -- Find outflow interval call get_bet_outflow_bary(v1n, v2n, betoutlo, betouthi) @@ -473,21 +447,21 @@ subroutine find_exit_bary(isolv, itriface, itrifaceenter, & ! -- in this special case v0alpstar = cv0(1) + wab * beti valpi = v0alpstar + waa * alpi - if ((itriface .eq. 1) .and. (valpi .le. 0d0)) then + if ((itriface .eq. 1) .and. (valpi .le. DZERO)) then ! -- Can't exit along gamma = 0. - texit = huge(1d0) - else if ((itriface .eq. 2) .and. (valpi .ge. 0d0)) then + texit = huge(DONE) + else if ((itriface .eq. 2) .and. (valpi .ge. DZERO)) then ! -- Can't exit along alpha = 0. - texit = huge(1d0) + texit = huge(DONE) else ! -- get exit if (itriface .eq. 1) then - alpexit = 1d0 - beti + alpexit = DONE - beti else - alpexit = 0d0 - end if ! kluge note: seems like in this case (beta=const) this - betexit = beti ! must be the ONLY exit; no need to check other edges?? - if (waa .ne. 0d0) then + alpexit = DZERO + end if + betexit = beti + if (dabs(waa) > zerotol) then alplim = -v0alpstar / waa texit = dlog(alpexit - alplim / (alpi - alplim)) / waa else @@ -500,23 +474,23 @@ subroutine find_exit_bary(isolv, itriface, itrifaceenter, & ! -- Beta varies along trajectory; combine outflow and soln limits on beta bethi = min(betouthi, betsolhi) betlo = max(betoutlo, betsollo) - if (betlo .ge. bethi) then + if (betlo .gt. bethi) then ! -- If bounds on bet leave no feasible interval, no exit - texit = huge(1d0) + texit = huge(DONE) else ! -- Check sign of function value at beta bounds call get_t_alpt(bethi, thi, alphi) call get_t_alpt(betlo, tlo, alplo) if (itriface .eq. 1) then - fax = 1d0 - betlo - alplo - fbx = 1d0 - bethi - alphi + fax = DONE - betlo - alplo + fbx = DONE - bethi - alphi else fax = alplo fbx = alphi end if - if (fax * fbx .gt. 0d0) then + if (fax * fbx .gt. DZERO) then ! -- Root not bracketed; no exit - texit = huge(1d0) + texit = huge(DONE) else if (isolv .eq. 1) then ! -- Use Brent's method with initial bounds on beta of betlo and bethi, @@ -539,8 +513,9 @@ subroutine find_exit_bary(isolv, itriface, itrifaceenter, & ! -- End canonical face 1 (gamma = 0.) or 2 (alpha = 0.) end if - if (texit .ne. huge(1d0) .and. texit .lt. 0d0) & + if (texit .ne. huge(DONE) .and. texit .lt. DZERO) then call pstop(1, "texit is negative (unexpected)") ! shouldn't get here + end if end subroutine @@ -555,7 +530,7 @@ function fbary1(bet) result(fb) ! -- Evaluate gamma{t{beta}} = 1. - alpha{t{beta}} - beta call get_t_alpt(bet, t, alpt) - fb = 1d0 - alpt - bet + fb = DONE - alpt - bet end function !> @brief Brent's method applied to canonical face 2 (alpha = 0) @@ -581,25 +556,48 @@ subroutine get_t_alpt(bet, t, alp) ! -- local real(DP) :: term real(DP) :: zerotol + real(DP) :: waat + real(DP) :: coef + real(DP) :: waatlim + real(DP) :: ewaatlim - ! kluge note: assumes cb2<>0, wbb<>0 as appropriate - zerotol = 1d-10 ! kluge + ! assumes cb2<>0, wbb<>0 + zerotol = 1d-10 ! todo AMP: consider tolerance term = (bet - cb1) / cb2 + waatlim = 50.0_DP + ewaatlim = 5d+21 ! approx. e^waatlim + if (icase .eq. 1) then term = max(term, zerotol) t = dlog(term) / wbb - alp = ca1 + ca2 * dexp(waa * t) + ca3 * dexp(wbb * t) + waat = waa * t + if (waat > waatlim) then + alp = sign(ewaatlim, ca2) + else + alp = ca1 + ca2 * dexp(waat) + ca3 * term + end if else if (icase .eq. -1) then term = max(term, zerotol) t = dlog(term) / wbb - alp = ca1 + (ca2 + ca3 * t) * dexp(waa * t) + waat = waa * t + coef = ca2 + ca3 * t + if (waat > waatlim) then + alp = sign(ewaatlim, coef) + else + alp = ca1 + coef * dexp(waat) + end if else if (icase .eq. 2) then term = max(term, zerotol) t = dlog(term) / wbb - alp = ca1 + ca2 * t + ca3 * dexp(wbb * t) + alp = ca1 + ca2 * t + ca3 * term else if (icase .eq. 3) then t = term - alp = ca1 + ca2 * t + ca3 * dexp(waa * t) + waat = waa * t + if (waat > waatlim) then + alp = sign(ewaatlim, ca3) + else + alp = ca1 + ca2 * t + ca3 * dexp(waat) + end if else if (icase .eq. 4) then t = term alp = ca1 + (ca2 + ca3 * t) * t @@ -618,22 +616,22 @@ subroutine get_bet_outflow_bary(vn1, vn2, betoutlo, betouthi) real(DP) :: vndiff vndiff = vn2 - vn1 - if (vn1 .lt. 0d0) then + if (vn1 .lt. DZERO) then ! -- Outflow at vn1 corner - betoutlo = 0d0 - if (vn2 .le. 0d0) then + betoutlo = DZERO + if (vn2 .le. DZERO) then ! -- Outflow along entire edge (except possibly no-flow right at vn2 corner) - betouthi = 1d0 + betouthi = DONE else ! -- Outflow along part of edge betouthi = -vn1 / vndiff end if else ! -- Outflow at vn2 corner - betouthi = 1d0 - if (vn1 .le. 0d0) then + betouthi = DONE + if (vn1 .le. DZERO) then ! -- Outflow along entire edge (except possibly no-flow right at vn1 corner) - betoutlo = 0d0 + betoutlo = DZERO else ! -- Outflow along part of edge betoutlo = -vn1 / vndiff @@ -652,22 +650,36 @@ subroutine get_bet_soln_limits(beti, betsollo, betsolhi, ibettrend) ! -- local real(DP) :: betlim - if (wbb .gt. 0d0) then + if (icase > 2) then + if (cv0(2) .gt. DZERO) then + betsolhi = huge(DONE) + betsollo = beti + ibettrend = 1 + else if (cv0(2) .lt. DZERO) then + betsolhi = beti + betsollo = -huge(DONE) + ibettrend = -1 + else + betsolhi = beti + betsollo = beti + ibettrend = 0 + end if + else if (wbb .gt. DZERO) then betlim = -cv0(2) / wbb if (beti .gt. betlim) then - betsolhi = huge(1d0) + betsolhi = huge(DONE) betsollo = beti ibettrend = 1 else if (beti .lt. betlim) then betsolhi = beti - betsollo = -huge(1d0) + betsollo = -huge(DONE) ibettrend = -1 else betsolhi = beti betsollo = beti ibettrend = 0 end if - else if (wbb .lt. 0d0) then + else if (wbb .lt. DZERO) then betlim = -cv0(2) / wbb if (beti .gt. betlim) then betsolhi = beti @@ -682,20 +694,6 @@ subroutine get_bet_soln_limits(beti, betsollo, betsolhi, ibettrend) betsollo = beti ibettrend = 0 end if - else ! kluge note: use zerotol and elsewhere? - if (cv0(2) .gt. 0d0) then - betsolhi = huge(1d0) - betsollo = beti - ibettrend = 1 - else if (cv0(2) .lt. 0d0) then - betsolhi = beti - betsollo = -huge(1d0) - ibettrend = -1 - else - betsolhi = beti - betsollo = beti - ibettrend = 0 - end if end if end subroutine @@ -712,17 +710,11 @@ subroutine soln_brent(itriface, betlo, bethi, tol, & real(DP) :: alpexit real(DP) :: betexit ! -- local - real(DP) :: itmax - real(DP) :: itact real(DP) :: blo real(DP) :: bhi procedure(f1d), pointer :: f ! -- assuming betlo and bethi bracket the root - ! -- - ! tol = 1d-7 ! kluge - itmax = 50 ! kluge - itact = itmax + 1 ! kluge blo = betlo bhi = bethi if (itriface .eq. 1) then @@ -748,16 +740,11 @@ subroutine soln_chand(itriface, betlo, bethi, tol, & real(DP) :: alpexit real(DP) :: betexit ! -- local - real(DP) :: itmax - real(DP) :: itact real(DP) :: blo real(DP) :: bhi procedure(f1d), pointer :: f ! -- note: assuming betlo and bethi bracket the root - ! tol = 1d-7 ! kluge - itmax = 50 ! kluge - itact = itmax + 1 ! kluge blo = betlo bhi = bethi if (itriface .eq. 1) then diff --git a/src/Utilities/GeomUtil.f90 b/src/Utilities/GeomUtil.f90 index 2c8a4502765..8d591145e41 100644 --- a/src/Utilities/GeomUtil.f90 +++ b/src/Utilities/GeomUtil.f90 @@ -7,7 +7,7 @@ module GeomUtilModule public :: between, point_in_polygon, & get_node, get_ijk, get_jk, & skew, transform, compose, & - area + area, shared_face contains !> @brief Check if a value is between two other values (inclusive). @@ -386,4 +386,73 @@ function area(xv, yv, cw) result(a) a = -DHALF * sum(xv(:) * cshift(yv(:), s) - cshift(xv(:), s) * yv(:)) end function area + + !> @brief Find the lateral face shared by two cells. + !! + !! Find the lateral (horizontal) face shared by the given cells. + !! The iface return argument will be 0 if they share no such face, + !! otherwise the index of the shared face in cell 1's vertex array, + !! where face N connects vertex N to vertex N + 1 going clockwise. + !! + !! Note: assumes the cells are convex and share at most 2 vertices + !! and that both vertex arrays are oriented clockwise. + !< + subroutine shared_face(iverts1, iverts2, iface) + integer(I4B), dimension(:) :: iverts1 + integer(I4B), dimension(:) :: iverts2 + integer(I4B), intent(out) :: iface + integer(I4B) :: nv1 + integer(I4B) :: nv2 + integer(I4B) :: il1, iil1 + integer(I4B) :: il2, iil2 + logical(LGP) :: found + logical(LGP) :: wrapped + + iface = 0 + found = .false. + nv1 = size(iverts1) + nv2 = size(iverts2) + wrapped = iverts1(1) == iverts1(nv1) + + ! Find a vertex shared by the cells, then check the adjacent faces. + ! If the cells share a face, it must be one of these. When looking + ! forward in the 1st cell's vertices, look backwards in the 2nd's, + ! and vice versa, since a clockwise face in cell 1 must correspond + ! to a counter-clockwise face in cell 2. + outerloop: do il1 = 1, nv1 - 1 + do il2 = 1, nv2 - 1 + if (iverts1(il1) == iverts2(il2)) then + + iil1 = il1 + 1 + if (il2 == 1) then + iil2 = nv2 + if (wrapped) iil2 = iil2 - 1 + else + iil2 = il2 - 1 + end if + if (iverts1(iil1) == iverts2(iil2)) then + found = .true. + iface = il1 + exit outerloop + end if + + iil2 = il2 + 1 + if (il1 == 1) then + iil1 = nv1 + if (wrapped) iil1 = iil1 - 1 + else + iil1 = il1 - 1 + end if + if (iverts1(iil1) == iverts2(iil2)) then + found = .true. + iface = iil1 + exit outerloop + end if + + end if + end do + if (found) exit + end do outerloop + end subroutine shared_face + end module GeomUtilModule diff --git a/utils/mf5to6/make/makefile b/utils/mf5to6/make/makefile index f99194fe0b9..b4eb2e84ac8 100644 --- a/utils/mf5to6/make/makefile +++ b/utils/mf5to6/make/makefile @@ -5,10 +5,10 @@ include ./makedefaults # Define the source file directories SOURCEDIR1=../src -SOURCEDIR2=../src/NWT -SOURCEDIR3=../src/LGR +SOURCEDIR2=../src/MF2005 +SOURCEDIR3=../src/NWT SOURCEDIR4=../src/Preproc -SOURCEDIR5=../src/MF2005 +SOURCEDIR5=../src/LGR SOURCEDIR6=../../../src/Utilities/Memory SOURCEDIR7=../../../src/Utilities/TimeSeries SOURCEDIR8=../../../src/Utilities diff --git a/utils/zonebudget/make/makefile b/utils/zonebudget/make/makefile index 1d465c473fa..4cb973e9759 100644 --- a/utils/zonebudget/make/makefile +++ b/utils/zonebudget/make/makefile @@ -1,4 +1,4 @@ -# makefile created by pymake (version 1.2.9.dev0) for the 'zbud6' executable. +# makefile created by pymake (version 1.2.10.dev0) for the 'zbud6' executable. include ./makedefaults From 11ce82d4ab850ad4d6f38d03f6c53c5615646d85 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 15 May 2024 10:00:03 -0400 Subject: [PATCH 158/199] refactor(prt): misc cleanup/refactoring, benchmark shared face routines (#1801) * remove unneeded get_npolyverts() routines from MethodDisv and CellDefn * refactor routine to get rectangular dimensions/rotation without unneeded args * rough benchmark comparing shared_face() with shared_edge() performance --- autotest/TestGeomUtil.f90 | 55 +++++++++++++++- src/Model/ModelUtilities/DisvGeom.f90 | 2 +- src/Solution/ParticleTracker/CellDefn.f90 | 8 --- src/Solution/ParticleTracker/CellRectQuad.f90 | 63 +++++++++---------- src/Solution/ParticleTracker/CellUtil.f90 | 16 ++--- src/Solution/ParticleTracker/MethodDisv.f90 | 27 +------- 6 files changed, 90 insertions(+), 81 deletions(-) diff --git a/autotest/TestGeomUtil.f90 b/autotest/TestGeomUtil.f90 index 3a486a7aa2d..8da03aa0655 100644 --- a/autotest/TestGeomUtil.f90 +++ b/autotest/TestGeomUtil.f90 @@ -5,6 +5,7 @@ module TestGeomUtil use GeomUtilModule, only: get_node, get_ijk, get_jk, point_in_polygon, & skew, area, shared_face use ConstantsModule, only: LINELENGTH + use DisvGeom, only: shared_edge implicit none private public :: collect_geomutil @@ -24,7 +25,9 @@ subroutine collect_geomutil(testsuite) test_point_in_polygon_irr), & new_unittest("skew", test_skew), & new_unittest("area", test_area), & - new_unittest("shared_face", test_shared_face) & + new_unittest("shared_face", test_shared_face), & + new_unittest("shared_face_large", & + test_shared_face_large) & ] end subroutine collect_geomutil @@ -370,9 +373,59 @@ subroutine test_shared_face(error) call shared_face(iverts1, iverts2, iface) call check(error, iface == 2) + if (allocated(error)) return + + end subroutine + + function rand_int(a, b) result(i) + integer(I4B) :: a, b, i + real(DP) :: u + + call random_number(u) + i = a + floor((b + 1 - a) * u) + + end function + + subroutine test_shared_face_large(error) + type(error_type), allocatable, intent(out) :: error + integer(I4B) :: iverts1(33), iverts2(33) + integer(I4B) :: iface, i, iv1, iv2 + real(DP) :: tstart, tstop + iface = 0 + iverts1 = (/1, 2, 3, 4, 10, 14, 18, & + 22, 33, 36, 40, 44, 48, & + 52, 58, 57, 56, 55, 51, & + 47, 43, 39, 35, 32, 30, & + 28, 26, 24, 21, 17, 13, & + 9, 1/) + iverts2 = (/5, 6, 7, 8, 12, 16, 20, & + 23, 25, 27, 29, 31, 34, & + 38, 42, 46, 50, 54, 62, & + 61, 60, 59, 53, 49, 45, & + 41, 37, 33, 22, 19, 15, & + 11, 5/) + + call shared_face(iverts1, iverts2, iface) + call check(error, iface == 8, to_string(iface)) if (allocated(error)) return + call cpu_time(tstart) + do i = 1, 1000 + iverts1 = cshift(iverts1, shift=rand_int(0, 32)) + call shared_face(iverts1, iverts2, iface) + end do + call cpu_time(tstop) + print *, 'shared_face took: ', tstop - tstart + + call cpu_time(tstart) + do i = 1, 1000 + iverts1 = cshift(iverts1, shift=rand_int(0, 32)) + call shared_edge(iverts1, iverts2, iv1, iv2) + end do + call cpu_time(tstop) + print *, 'shared_edge took: ', tstop - tstart + end subroutine end module TestGeomUtil diff --git a/src/Model/ModelUtilities/DisvGeom.f90 b/src/Model/ModelUtilities/DisvGeom.f90 index e935afad6fd..727e2ecef59 100644 --- a/src/Model/ModelUtilities/DisvGeom.f90 +++ b/src/Model/ModelUtilities/DisvGeom.f90 @@ -5,7 +5,7 @@ module DisvGeom implicit none private public :: DisvGeomType - public :: line_unit_vector + public :: line_unit_vector, shared_edge type DisvGeomType diff --git a/src/Solution/ParticleTracker/CellDefn.f90 b/src/Solution/ParticleTracker/CellDefn.f90 index 4bd3ec1c46a..6075a38a399 100644 --- a/src/Solution/ParticleTracker/CellDefn.f90 +++ b/src/Solution/ParticleTracker/CellDefn.f90 @@ -27,7 +27,6 @@ module CellDefnModule real(DP), allocatable, public :: faceflow(:) !< flows that correspond to faces(/vertices) real(DP), public :: distflow !< net distributed flow into cell contains - procedure, public :: get_npolyverts !< returns the number of polygon vertices procedure, public :: get_ispv180 !< returns 180-degree indicator for a vertex procedure, public :: get_botflow !< returns bottom flow procedure, public :: get_topflow !< returns top flow @@ -61,13 +60,6 @@ function get_iatop(ncpl, icu) result(iatop) end if end function get_iatop - !> @brief Return the number of polygon vertices - function get_npolyverts(this) result(npolyverts) - class(CellDefnType), intent(inout) :: this - integer(I4B) :: npolyverts - npolyverts = this%npolyverts - end function get_npolyverts - !> @brief Return 180-degree indicator for a vertex function get_ispv180(this, m) result(ispv180) class(CellDefnType), intent(inout) :: this diff --git a/src/Solution/ParticleTracker/CellRectQuad.f90 b/src/Solution/ParticleTracker/CellRectQuad.f90 index 475386afa8b..9c034d2be2d 100644 --- a/src/Solution/ParticleTracker/CellRectQuad.f90 +++ b/src/Solution/ParticleTracker/CellRectQuad.f90 @@ -31,10 +31,10 @@ module CellRectQuadModule procedure :: destroy => destroy_cell_rect_quad !< destructor for the cell procedure :: init_from !< initializes the cell from an existing cell - procedure :: load_irectvert_rectflow ! loads list of indices of the rectangle vertices and face flows - procedure :: get_irectvertSW ! gets index of southwest rectangle vertex - procedure :: get_rectDimensionsRotation ! gets rectangular dimensions and rotation - procedure :: get_rectflow !< returns a rectangle face flow + procedure :: load_rect_verts_flows ! loads list of indices of the rectangle vertices and face flows + procedure :: get_rect_ivert_sw ! gets index of southwest rectangle vertex + procedure :: get_rect_dim_rot ! gets rectangular dimensions and rotation + procedure :: get_rect_flow !< returns a rectangle face flow procedure :: face_is_refined !< returns whether a rectangle face is refined end type CellRectQuadType @@ -65,7 +65,7 @@ subroutine init_from(this, defn) class(CellRectQuadType), intent(inout) :: this type(CellDefnType), pointer :: defn this%defn => defn - call this%load_irectvert_rectflow() + call this%load_rect_verts_flows() end subroutine init_from !> @brief Load local polygon vertex indices and rectangular @@ -74,16 +74,14 @@ end subroutine init_from !! Loads local polygon vertex indices of the four rectangle !! vertices and face flows of a rectangular-quad cell. !< - subroutine load_irectvert_rectflow(this) + subroutine load_rect_verts_flows(this) ! -- dummy class(CellRectQuadType), intent(inout) :: this ! -- local - integer(I4B) :: npolyverts, n, m - - npolyverts = this%defn%get_npolyverts() + integer(I4B) :: n, m n = 0 - do m = 1, npolyverts + do m = 1, this%defn%npolyverts if (.not. this%defn%get_ispv180(m)) then n = n + 1 this%irectvert(n) = m @@ -101,14 +99,14 @@ subroutine load_irectvert_rectflow(this) ! Wrap around for convenience this%irectvert(5) = this%irectvert(1) - end subroutine load_irectvert_rectflow + end subroutine load_rect_verts_flows !> @brief Get index of SW rectangle vertex !! !! Return the index (1, 2, 3, or 4) of the southwest !! rectangle vertex of a rectangular-quad cell !< - function get_irectvertSW(this) result(irv1) + function get_rect_ivert_sw(this) result(irv1) ! -- dummy class(CellRectQuadType), intent(inout) :: this integer(I4B) :: irv1 @@ -145,7 +143,7 @@ function get_irectvertSW(this) result(irv1) if (y2 .gt. y1) return end if end do - end function get_irectvertSW + end function get_rect_ivert_sw !> @brief Get rectangular cell dimensions and rotation !! @@ -153,23 +151,20 @@ end function get_irectvertSW !! the cell using the specified rectangle vertex !! as the origin !< - subroutine get_rectDimensionsRotation(this, irv1, xOrigin, yOrigin, zOrigin, & - dx, dy, dz, sinrot, cosrot) + subroutine get_rect_dim_rot(this) ! -- dummy class(CellRectQuadType), intent(inout) :: this - integer(I4B) :: irv1 - real(DP) :: xOrigin, yOrigin, zOrigin, dx, dy, dz, sinrot, cosrot ! -- local integer(I4B) :: irv2, irv4, ipv1, ipv2, ipv4 integer(I4B), dimension(4) :: irvnxt = (/2, 3, 4, 1/) real(DP) :: x1, y1, x2, y2, x4, y4, dx2, dy2, dx4, dy4 ! -- Get rectangle vertex neighbors irv2 and irv4 - irv2 = irvnxt(irv1) + irv2 = irvnxt(this%irvOrigin) irv4 = irvnxt(irvnxt(irv2)) ! -- Get model coordinates at irv1, irv2, and irv4 - ipv1 = this%irectvert(irv1) + ipv1 = this%irectvert(this%irvOrigin) x1 = this%defn%polyvert(1, ipv1) y1 = this%defn%polyvert(2, ipv1) ipv2 = this%irectvert(irv2) @@ -180,30 +175,30 @@ subroutine get_rectDimensionsRotation(this, irv1, xOrigin, yOrigin, zOrigin, & y4 = this%defn%polyvert(2, ipv4) ! -- Compute rectangle dimensions - xOrigin = x1 - yOrigin = y1 - zOrigin = this%defn%bot - dx2 = x2 - xOrigin - dy2 = y2 - yOrigin - dx4 = x4 - xOrigin - dy4 = y4 - yOrigin - dx = dsqrt(dx4 * dx4 + dy4 * dy4) - dy = dsqrt(dx2 * dx2 + dy2 * dy2) - dz = this%defn%top - zOrigin + this%xOrigin = x1 + this%yOrigin = y1 + this%zOrigin = this%defn%bot + dx2 = x2 - this%xOrigin + dy2 = y2 - this%yOrigin + dx4 = x4 - this%xOrigin + dy4 = y4 - this%yOrigin + this%dx = dsqrt(dx4 * dx4 + dy4 * dy4) + this%dy = dsqrt(dx2 * dx2 + dy2 * dy2) + this%dz = this%defn%top - this%zOrigin ! -- Compute sine and cosine of rotation angle (angle between "southern" ! -- rectangle side irv1-irv4 and the model x axis) - sinrot = dy4 / dx - cosrot = dx4 / dx - end subroutine get_rectDimensionsRotation + this%sinrot = dy4 / this%dx + this%cosrot = dx4 / this%dx + end subroutine get_rect_dim_rot !> @brief Return a rectangle face flow - function get_rectflow(this, iq, irv) result(rectflow) + function get_rect_flow(this, iq, irv) result(rectflow) class(CellRectQuadType), intent(inout) :: this integer(I4B) :: iq, irv real(DP) :: rectflow rectflow = this%rectflow(iq, irv) - end function get_rectflow + end function get_rect_flow !> @brief Return whether a rectangle face is refined function face_is_refined(this, i) result(is_refined) diff --git a/src/Solution/ParticleTracker/CellUtil.f90 b/src/Solution/ParticleTracker/CellUtil.f90 index cf28178cb6d..86934982fce 100644 --- a/src/Solution/ParticleTracker/CellUtil.f90 +++ b/src/Solution/ParticleTracker/CellUtil.f90 @@ -129,28 +129,22 @@ subroutine cell_poly_to_quad(poly, quad) ! -- west" rectangle vertex to be the local origin so that the rotation ! -- angle is zero if the cell already aligns with the model x and y ! -- coordinates. - quad%irvOrigin = quad%get_irectvertSW() - ! todo, before/after initial release: refactor without unnecessary args - call quad%get_rectDimensionsRotation( & - quad%irvOrigin, quad%xOrigin, & - quad%yOrigin, quad%zOrigin, & - quad%dx, quad%dy, & - quad%dz, quad%sinrot, & - quad%cosrot) + quad%irvOrigin = quad%get_rect_ivert_sw() + call quad%get_rect_dim_rot() ! -- Set the external and internal face flows used for subcells do i = 0, 3 irv = mod_offset(i + quad%irvOrigin, 4, 1) isc = mod_offset(i + 3, 4, 1) if (.not. quad%face_is_refined(irv)) then - qhalf = 5d-1 * quad%get_rectflow(1, irv) + qhalf = 5d-1 * quad%get_rect_flow(1, irv) quad%qextl2(isc) = qhalf isc = mod_offset(isc + 1, 4, 1) quad%qextl1(isc) = qhalf else - quad%qextl2(isc) = quad%get_rectflow(1, irv) + quad%qextl2(isc) = quad%get_rect_flow(1, irv) isc = mod_offset(isc + 1, 4, 1) - quad%qextl1(isc) = quad%get_rectflow(2, irv) + quad%qextl1(isc) = quad%get_rect_flow(2, irv) end if end do qdisttopbot = 2.5d-1 * (quad%defn%get_distflow() & diff --git a/src/Solution/ParticleTracker/MethodDisv.f90 b/src/Solution/ParticleTracker/MethodDisv.f90 index 1dbfd67f51d..8360b7c1263 100644 --- a/src/Solution/ParticleTracker/MethodDisv.f90 +++ b/src/Solution/ParticleTracker/MethodDisv.f90 @@ -29,7 +29,6 @@ module MethodDisvModule procedure, public :: load_cell_defn !< loads cell definition from the grid procedure, public :: map_neighbor !< maps a location on the cell face to the shared face of a neighbor procedure, public :: pass => pass_disv !< passes the particle to the next cell - procedure, private :: get_npolyverts !< returns the number of polygon vertices for a cell in the grid procedure, private :: load_nbrs_to_defn !< loads face neighbors to a cell object procedure, private :: load_flags_to_defn !< loads 180-degree vertex indicator to a cell object procedure, private :: load_flows_to_defn !< loads flows to a cell object @@ -268,30 +267,6 @@ subroutine apply_disv(this, particle, tmax) call this%track(particle, 1, tmax) end subroutine apply_disv - !> @brief Return the number of polygon vertices for a cell in the grid - !! todo, after initial release: is this necessary? can we just use - !! size of array returned by get_polyverts() - function get_npolyverts(this, ic) result(npolyverts) - ! -- dummy - class(MethodDisvType), intent(inout) :: this - integer(I4B), intent(in) :: ic - ! -- local - integer(I4B) :: icu - integer(I4B) :: icu2d - integer(I4B) :: ncpl - ! -- result - integer(I4B) :: npolyverts - - select type (dis => this%fmi%dis) - type is (DisvType) - ncpl = dis%get_ncpl() - icu = dis%get_nodeuser(ic) - icu2d = icu - ((icu - 1) / ncpl) * ncpl - npolyverts = dis%iavert(icu2d + 1) - dis%iavert(icu2d) - 1 - if (npolyverts .le. 0) npolyverts = npolyverts + size(dis%javert) - end select - end function get_npolyverts - !> @brief Load cell definition from the grid subroutine load_cell_defn(this, ic, defn) ! -- dummy @@ -305,7 +280,6 @@ subroutine load_cell_defn(this, ic, defn) ! -- Load basic cell properties defn%icell = ic - defn%npolyverts = this%get_npolyverts(ic) defn%iatop = get_iatop(this%fmi%dis%get_ncpl(), & this%fmi%dis%get_nodeuser(ic)) top = this%fmi%dis%top(ic) @@ -324,6 +298,7 @@ subroutine load_cell_defn(this, ic, defn) defn%icell, & defn%polyvert, & closed=.true.) + defn%npolyverts = size(defn%polyvert, dim=2) - 1 ! -- Load face neighbors call this%load_nbrs_to_defn(defn) From f71f0848a37b1c49a047b3c4d547faf54fac86f8 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Wed, 15 May 2024 10:14:46 -0500 Subject: [PATCH 159/199] docs(mf6io): preparing docs for release (#1797) * docs(mf6io): preparing docs for release * include reserved doi for version 6.5.0 * minor updates to mf6io to reflect idm changes * updates to mf6io tex files in response to recent changes * other minor updates * Undo my hack to remove swf from mf6io --- doc/MODFLOW6References.bib | 25 +- doc/ReleaseNotes/ReleaseNotes.bbl | 17 +- doc/ReleaseNotes/ReleaseNotes.tex | 4 +- doc/ReleaseNotes/develop.tex | 11 +- doc/mf6io/body.tex | 2 +- doc/mf6io/framework/array_data.tex | 2 +- doc/mf6io/framework/binaryoutput.tex | 2 +- doc/mf6io/introduction.tex | 2 +- doc/mf6io/mf6io.bbl | 9 +- doc/mf6io/mf6io.nightlybuild.bbl | 9 +- doc/mf6io/mf6ivar/md/mf6ivar.md | 229 +++---------------- doc/mf6io/mf6ivar/tex/appendixA.tex | 59 +---- doc/mf6io/mf6ivar/tex/gwe-cnd-desc.tex | 4 +- doc/mf6io/mf6ivar/tex/gwe-dis-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/gwe-disu-desc.tex | 2 + doc/mf6io/mf6ivar/tex/gwe-disu-options.dat | 1 + doc/mf6io/mf6ivar/tex/gwe-disv-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/gwe-ic-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/gwf-dis-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/gwf-disu-desc.tex | 2 + doc/mf6io/mf6ivar/tex/gwf-disu-options.dat | 1 + doc/mf6io/mf6ivar/tex/gwf-disv-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/gwf-ic-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/gwf-npf-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/gwt-dis-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/gwt-disu-desc.tex | 2 + doc/mf6io/mf6ivar/tex/gwt-disu-options.dat | 1 + doc/mf6io/mf6ivar/tex/gwt-disv-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/gwt-dsp-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/gwt-ic-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/prt-dis-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/prt-disv-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/prt-mip-desc.tex | 4 +- doc/mf6io/mf6ivar/tex/prt-prp-desc.tex | 2 + doc/mf6io/mf6ivar/tex/prt-prp-options.dat | 1 + doc/mf6io/mf6ivar/tex/sim-nam-desc.tex | 6 + doc/mf6io/mf6ivar/tex/sim-nam-options.dat | 1 + doc/mf6io/mf6ivar/tex/swf-dfw-options.dat | 1 + doc/mf6io/mf6ivar/tex/utl-hpc-desc.tex | 15 ++ doc/mf6io/mf6ivar/tex/utl-hpc-options.dat | 2 + doc/mf6io/mf6ivar/tex/utl-hpc-partitions.dat | 5 + doc/mf6io/simulation_namefile.tex | 5 +- 42 files changed, 150 insertions(+), 302 deletions(-) create mode 100644 doc/mf6io/mf6ivar/tex/utl-hpc-desc.tex create mode 100644 doc/mf6io/mf6ivar/tex/utl-hpc-options.dat create mode 100644 doc/mf6io/mf6ivar/tex/utl-hpc-partitions.dat diff --git a/doc/MODFLOW6References.bib b/doc/MODFLOW6References.bib index e468d4feba8..9be2bb87665 100644 --- a/doc/MODFLOW6References.bib +++ b/doc/MODFLOW6References.bib @@ -2942,12 +2942,21 @@ @book{maidment1993 Year = {1993}} @article{hughes2023flopy, - author = {Hughes, Joseph D. and Langevin, Christian D. and Paulinski, Scott R. and Larsen, Joshua D. and Brakenhoff, David}, - title = {{FloPy} Workflows for Creating Structured and Unstructured {MODFLOW} Models}, - journal = {Groundwater}, - Year = {2023}, - volume = {}, - number = {}, - pages = {}, - doi = {https://doi.org/10.1111/gwat.13327}} + Author = {Hughes, Joseph D. and Langevin, Christian D. and Paulinski, Scott R. and Larsen, Joshua D. and Brakenhoff, David}, + Title = {{FloPy} Workflows for Creating Structured and Unstructured {MODFLOW} Models}, + Journal = {Groundwater}, + Year = {2024}, + Volume = {62}, + Number = {1}, + Pages = {124-139}, + Doi = {10.1111/gwat.13327}} +@article{langevin2024, + Author = {Langevin, Christian D. and Hughes, Joseph D. and Provost, Alden M. and Russcher, Martijn J. and Panday, Sorab}, + Title = {{MODFLOW} as a Configurable Multi-Model Hydrologic Simulator}, + Journal = {Groundwater}, + Volume = {62}, + Number = {1}, + Pages = {111-123}, + Doi = {10.1111/gwat.13351}, + year = {2024}} diff --git a/doc/ReleaseNotes/ReleaseNotes.bbl b/doc/ReleaseNotes/ReleaseNotes.bbl index da65c463d1d..5f49ba01908 100644 --- a/doc/ReleaseNotes/ReleaseNotes.bbl +++ b/doc/ReleaseNotes/ReleaseNotes.bbl @@ -1,4 +1,4 @@ -\begin{thebibliography}{14} +\begin{thebibliography}{15} \providecommand{\natexlab}[1]{#1} \expandafter\ifx\csname urlstyle\endcsname\relax \providecommand{\doiagency}[1]{doi:\discretionary{}{}{}#1}\else @@ -34,12 +34,12 @@ Hughes, J.D., Leake, S.A., Galloway, D.L., and White, J.T., 2022{\natexlab{b}}, Package of MODFLOW 6: {U.S. Geological Survey Techniques and Methods, book 6, chap. A62, 57 p.}, \url{https://doi.org/10.3133/tm6A62}. -\bibitem[{Hughes and others(2023)Hughes, Langevin, Paulinski, Larsen, and +\bibitem[{Hughes and others(2024)Hughes, Langevin, Paulinski, Larsen, and Brakenhoff}]{hughes2023flopy} Hughes, J.D., Langevin, C.D., Paulinski, S.R., Larsen, J.D., and Brakenhoff, - D., 2023, {FloPy} workflows for creating structured and unstructured - {MODFLOW} models: Groundwater, - \url{https://doi.org/https://doi.org/10.1111/gwat.13327}. + D., 2024, {FloPy} workflows for creating structured and unstructured + {MODFLOW} models: Groundwater, v.~62, no.~1, p.~124--139, + \url{https://doi.org/10.1111/gwat.13327}. \bibitem[{Langevin and others(2017)Langevin, Hughes, Provost, Banta, Niswonger, and Panday}]{modflow6gwf} @@ -61,6 +61,13 @@ Langevin, C.D., Provost, A.M., Panday, S., and Hughes, J.D., 2022, Geological Survey Techniques and Methods, book 6, chap. A61, 56 p.}, \url{https://doi.org/10.3133/tm6A61}. +\bibitem[{Langevin and others(2024)Langevin, Hughes, Provost, Russcher, and + Panday}]{langevin2024} +Langevin, C.D., Hughes, J.D., Provost, A.M., Russcher, M.J., and Panday, S., + 2024, {MODFLOW} as a configurable multi-model hydrologic simulator: + Groundwater, v.~62, no.~1, p.~111--123, + \url{https://doi.org/10.1111/gwat.13351}. + \bibitem[{Leake and Galloway(2007)}]{leake2007modflow} Leake, S.A., and Galloway, D.L., 2007, MODFLOW Ground-water model---User guide to the Subsidence and Aquifer-System Compaction Package (SUB-WT) for diff --git a/doc/ReleaseNotes/ReleaseNotes.tex b/doc/ReleaseNotes/ReleaseNotes.tex index d5ccd1117c0..2a9a2ce40a2 100644 --- a/doc/ReleaseNotes/ReleaseNotes.tex +++ b/doc/ReleaseNotes/ReleaseNotes.tex @@ -178,7 +178,7 @@ \section{Release History} 6.4.2 & June 28, 2023 & \url{https://doi.org/10.5066/P9FL1JCC} \\ 6.4.3 & February 7, 2024 & \url{https://doi.org/10.5066/P9FL1JCC} \\ 6.4.4 & February 13, 2024 & \url{https://doi.org/10.5066/P9FL1JCC} \\ -6.x.x & Xxx x, 202x & \url{https://doi.org/10.5066/P9FL1JCC} \\ +6.5.0 & May 23, 2024 & \url{https://doi.org/10.5066/P13COJJM} \\ \hline \label{tab:releases} \end{tabular*} @@ -296,6 +296,8 @@ \section{MODFLOW~6 Documentation} \item \bibentry{modflow6csub} +\item \bibentry{langevin2024} + \end{itemize} \noindent Description of the MODFLOW~6 input and output is included in this distribution in the ``doc'' folder as mf6io.pdf. diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index c2e367100f1..00062b7a4fe 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -11,12 +11,11 @@ \item Extend binary input support to all list style input blocks that have a regular shape and don't contain string fields (e.g. BOUNDNAME). \end{itemize} - %\underline{EXAMPLES} - %\begin{itemize} - % \item xxx - % \item xxx - % \item xxx - %\end{itemize} + \underline{EXAMPLES} + \begin{itemize} + \item New examples were included for the Groundwater Energy (GWE) Model. These examples include: danckwerts, geotherm, gwe-prt, and gwe-radial. + \item New examples were included for the Particle Tracking (PRT) Model. These examples include four of the test problems used to demonstrate MODPATH Version 7. + \end{itemize} \textbf{\underline{BUG FIXES AND OTHER CHANGES TO EXISTING FUNCTIONALITY}} \\ \underline{BASIC FUNCTIONALITY} diff --git a/doc/mf6io/body.tex b/doc/mf6io/body.tex index 6c59a1c2a12..47ee537860a 100644 --- a/doc/mf6io/body.tex +++ b/doc/mf6io/body.tex @@ -77,7 +77,7 @@ %Binary files \newpage -\SECTION{Description of Binary Output Files for the Groundwater Flow (GWF) and Groundwater Transport (GWT) Models } +\SECTION{Description of Binary Output Files} \input{framework/binaryoutput} \newpage diff --git a/doc/mf6io/framework/array_data.tex b/doc/mf6io/framework/array_data.tex index ac36dec8c92..a9f29420559 100644 --- a/doc/mf6io/framework/array_data.tex +++ b/doc/mf6io/framework/array_data.tex @@ -39,7 +39,7 @@ \subsubsection{READARRAY Variable Descriptions} \item \texttt{(BINARY)}---is an option that indicates the OPEN/CLOSE file contains array data in binary (unformatted) form. A binary file that can be read by MODFLOW may be created in only two ways. The first way is to use MODFLOW to create the file by saving heads in a binary file. This is commonly done when the user desires to use computed heads from one simulation as initial heads for a subsequent simulation. The other way to create a binary file is to write a special program that generates a binary file. ``(BINARY)'' can be specified only when the control line is OPEN/CLOSE. -\item \texttt{IPRN }---are a keyword and a flag that indicates whether the array being read should be written to the Listing File after the array has been read and a code for indicating the format that should be used when the array is written. The format codes are the same as for MODFLOW-2005. IPRN is set to zero when the specified value exceeds those defined. If IPRN is less than zero or if the keyword and flag are omitted, the array will not be printed. This IPRN capability is not functional for all data sets, and may be removed in future versions. +\item \texttt{IPRN }---are a keyword and a flag that indicates whether the array being read should be written to the Listing File after the array has been read and a code for indicating the format that should be used when the array is written. The format codes are the same as for MODFLOW-2005. IPRN is set to zero when the specified value exceeds those defined. If IPRN is less than zero or if the keyword and flag are omitted, the array will not be printed. This IPRN capability is not functional for all data sets, and will eventually become unsupported for all packages. For some packages that have transitioned to the new input data processor, the EXPORT\_ARRAY\_ASCII option can be specified in the package OPTIONS block. When this option is active, input arrays will be written to external text files. \end{description} diff --git a/doc/mf6io/framework/binaryoutput.tex b/doc/mf6io/framework/binaryoutput.tex index a217180286d..f387de27b17 100644 --- a/doc/mf6io/framework/binaryoutput.tex +++ b/doc/mf6io/framework/binaryoutput.tex @@ -191,7 +191,7 @@ \subsubsection{DISU Grids} \newpage \subsection{Dependent Variable File} -In the present \mf version, the \texttt{TEXT} value is specified as ``HEAD'' for the GWF Model and ``CONCENTRATION'' for the GWT Model. Cells that have been assigned an IDOMAIN value of zero or less are assigned a head value of $1.0$ x $10^{30}$. Cells that have converted to dry are assigned a dry value of $-1.0$ x $10^{30}$. The large negative value allows the results from a previous simulation to be used as starting heads for a subsequent simulation. Cells assigned a large negative value as an initial condition will start the simulation as dry. Note that the dry value is not used if the Newton-Raphson Formulation is active. In this case, a dry cell will have a calculated head value that is below or at the bottom of the cell. +In the present \mf version, the \texttt{TEXT} value is specified as the name of the dependent variable, such as ``HEAD'' for the GWF Model, for example, or ``CONCENTRATION'' for the GWT Model. Cells that have been assigned an IDOMAIN value of zero or less are assigned a head value of $1.0$ x $10^{30}$. Cells that have been deactivated (such as when a GWF model cell becomes dry) are assigned a value of $-1.0$ x $10^{30}$. In the case of GWF, the large negative value allows the results from a previous simulation to be used as starting heads for a subsequent simulation. GWF model cells assigned a large negative value as an initial condition will start the simulation as dry. Note that the dry inactive value is not used if the Newton-Raphson Formulation is active. In this case, a dry cell will have a calculated head value that is below or at the bottom of the cell. \subsubsection{DIS Grids} For each stress period, time step, and layer for which data are saved to the binary output file, the following two records are written: diff --git a/doc/mf6io/introduction.tex b/doc/mf6io/introduction.tex index 62fa7902f7f..5761b32083b 100644 --- a/doc/mf6io/introduction.tex +++ b/doc/mf6io/introduction.tex @@ -1 +1 @@ -\mf is a command line executable program that reads input from ASCII text files, and optionally from binary files. \mf writes simulation output to ASCII text and binary files. \mf itself, like its predecessors, does not provide any graphical output, though users may decide to adopt a Graphical User Interface (GUI) for preparing model input and visualizing model output. This document provides details on the format of the input files and the format of the output files. Details on the numerical methods and the underlying theory for MODFLOW 6 are described in separate reports \citep{modflow6framework, modflow6gwf, modflow6xt3d, langevin2020hydraulic, modflow6api, modflow6gwt, modflow6csub}. Instructions for preparing the input or visualizing the output is beyond the scope of this report. +\mf is a command line executable program that reads input from ASCII text files, and optionally from binary files. \mf writes simulation output to ASCII text and binary files. \mf itself, like its predecessors, does not provide any graphical output, though users may decide to adopt a Graphical User Interface (GUI) for preparing model input and visualizing model output. This document provides details on the format of the input files and the format of the output files. Details on the numerical methods and the underlying theory for MODFLOW 6 are described in separate reports \citep{modflow6framework, modflow6gwf, modflow6xt3d, langevin2020hydraulic, modflow6api, modflow6gwt, modflow6csub, langevin2024}. Instructions for preparing the input or visualizing the output is beyond the scope of this report. diff --git a/doc/mf6io/mf6io.bbl b/doc/mf6io/mf6io.bbl index 9a3a5427419..09c4a353ce6 100644 --- a/doc/mf6io/mf6io.bbl +++ b/doc/mf6io/mf6io.bbl @@ -1,4 +1,4 @@ -\begin{thebibliography}{41} +\begin{thebibliography}{42} \providecommand{\natexlab}[1]{#1} \expandafter\ifx\csname urlstyle\endcsname\relax \providecommand{\doi}[1]{doi:\discretionary{}{}{}#1}\else @@ -187,6 +187,13 @@ Langevin, C.D., Provost, A.M., Panday, Sorab, and Hughes, J.D., 2022, Geological Survey Techniques and Methods, book 6, chap. A61, 56 p.}, \url{https://doi.org/10.3133/tm6A61}. +\bibitem[{Langevin and others(2024)Langevin, Hughes, Provost, Russcher, and + Panday}]{langevin2024} +Langevin, C.D., Hughes, J.D., Provost, A.M., Russcher, M.J., and Panday, Sorab, + 2024, {MODFLOW} as a configurable multi-model hydrologic simulator: + Groundwater, v.~62, no.~1, p.~111--123, + \url{https://doi.org/10.1111/gwat.13351}. + \bibitem[{Leake and Galloway(2007)}]{leake2007modflow} Leake, S.A., and Galloway, D.L., 2007, MODFLOW Ground-water model---User guide to the Subsidence and Aquifer-System Compaction Package (SUB-WT) for diff --git a/doc/mf6io/mf6io.nightlybuild.bbl b/doc/mf6io/mf6io.nightlybuild.bbl index 9a3a5427419..09c4a353ce6 100644 --- a/doc/mf6io/mf6io.nightlybuild.bbl +++ b/doc/mf6io/mf6io.nightlybuild.bbl @@ -1,4 +1,4 @@ -\begin{thebibliography}{41} +\begin{thebibliography}{42} \providecommand{\natexlab}[1]{#1} \expandafter\ifx\csname urlstyle\endcsname\relax \providecommand{\doi}[1]{doi:\discretionary{}{}{}#1}\else @@ -187,6 +187,13 @@ Langevin, C.D., Provost, A.M., Panday, Sorab, and Hughes, J.D., 2022, Geological Survey Techniques and Methods, book 6, chap. A61, 56 p.}, \url{https://doi.org/10.3133/tm6A61}. +\bibitem[{Langevin and others(2024)Langevin, Hughes, Provost, Russcher, and + Panday}]{langevin2024} +Langevin, C.D., Hughes, J.D., Provost, A.M., Russcher, M.J., and Panday, Sorab, + 2024, {MODFLOW} as a configurable multi-model hydrologic simulator: + Groundwater, v.~62, no.~1, p.~111--123, + \url{https://doi.org/10.1111/gwat.13351}. + \bibitem[{Leake and Galloway(2007)}]{leake2007modflow} Leake, S.A., and Galloway, D.L., 2007, MODFLOW Ground-water model---User guide to the Subsidence and Aquifer-System Compaction Package (SUB-WT) for diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 8821d4b6ad0..42ec9e8a73a 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -7,6 +7,9 @@ | SIM | NAM | OPTIONS | MEMORY_PRINT_OPTION | STRING | is a flag that controls printing of detailed memory manager usage to the end of the simulation list file. NONE means do not print detailed information. SUMMARY means print only the total memory for each simulation component. ALL means print information for each variable stored in the memory manager. NONE is default if MEMORY\_PRINT\_OPTION is not specified. | | SIM | NAM | OPTIONS | MAXERRORS | INTEGER | maximum number of errors that will be stored and printed. | | SIM | NAM | OPTIONS | PRINT_INPUT | KEYWORD | keyword to activate printing of simulation input summaries to the simulation list file (mfsim.lst). With this keyword, input summaries will be written for those packages that support newer input data model routines. Not all packages are supported yet by the newer input data model routines. | +| SIM | NAM | OPTIONS | HPC6 | KEYWORD | keyword to specify that record corresponds to a hpc file. | +| SIM | NAM | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| SIM | NAM | OPTIONS | HPC6_FILENAME | STRING | name of input file to define HPC file settings for the HPC package. See the ``HPC File'' section for instructions for preparing HPC input files. | | SIM | NAM | TIMING | TDIS6 | STRING | is the name of the Temporal Discretization (TDIS) Input File. | | SIM | NAM | MODELS | MTYPE | STRING | is the type of model to add to simulation. | | SIM | NAM | MODELS | MFNAME | STRING | is the file name of the model name file. | @@ -106,15 +109,6 @@ | EXG | GWTGWT | EXCHANGEDATA | HWVA | DOUBLE PRECISION | is the horizontal width of the flow connection between cell 1 and cell 2 if IHC $>$ 0, or it is the area perpendicular to flow of the vertical connection between cell 1 and cell 2 if IHC = 0. | | EXG | GWTGWT | EXCHANGEDATA | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each GWTGWT Exchange. The values of auxiliary variables must be present for each exchange. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. | | EXG | GWTGWT | EXCHANGEDATA | BOUNDNAME | STRING | name of the GWT Exchange cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | -| EXG | SWFGWF | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of exchange entries will be echoed to the listing file immediately after it is read. | -| EXG | SWFGWF | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of exchange flow rates will be printed to the listing file for every stress period in which ``SAVE BUDGET'' is specified in Output Control. | -| EXG | SWFGWF | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | -| EXG | SWFGWF | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | -| EXG | SWFGWF | OPTIONS | OBS6_FILENAME | STRING | is the file name of the observations input file for this exchange. See the ``Observation utility'' section for instructions for preparing observation input files. Table \ref{table:gwf-obstypetable} lists observation type(s) supported by the SWF-GWF package. | -| EXG | SWFGWF | DIMENSIONS | NEXG | INTEGER | keyword and integer value specifying the number of SWF-GWF exchanges. | -| EXG | SWFGWF | EXCHANGEDATA | CELLIDM1 | INTEGER | is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. | -| EXG | SWFGWF | EXCHANGEDATA | CELLIDM2 | INTEGER | is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. | -| EXG | SWFGWF | EXCHANGEDATA | COND | DOUBLE PRECISION | is the conductance between the surface water cell and the groundwater cell. | | SLN | IMS | OPTIONS | PRINT_OPTION | STRING | is a flag that controls printing of convergence information from the solver. NONE means print nothing. SUMMARY means print only the total number of iterations and nonlinear residual reduction summaries. ALL means print linear matrix solver convergence information to the solution listing file and model specific linear matrix solver convergence information to each model listing file in addition to SUMMARY information. NONE is default if PRINT\_OPTION is not specified. | | SLN | IMS | OPTIONS | COMPLEXITY | STRING | is an optional keyword that defines default non-linear and linear solver parameters. SIMPLE - indicates that default solver input values will be defined that work well for nearly linear models. This would be used for models that do not include nonlinear stress packages and models that are either confined or consist of a single unconfined layer that is thick enough to contain the water table within a single layer. MODERATE - indicates that default solver input values will be defined that work well for moderately nonlinear models. This would be used for models that include nonlinear stress packages and models that consist of one or more unconfined layers. The MODERATE option should be used when the SIMPLE option does not result in successful convergence. COMPLEX - indicates that default solver input values will be defined that work well for highly nonlinear models. This would be used for models that include nonlinear stress packages and models that consist of one or more unconfined layers representing complex geology and surface-water/groundwater interaction. The COMPLEX option should be used when the MODERATE option does not result in successful convergence. Non-linear and linear solver parameters assigned using a specified complexity can be modified in the NONLINEAR and LINEAR blocks. If the COMPLEXITY option is not specified, NONLINEAR and LINEAR variables will be assigned the simple complexity values. | | SLN | IMS | OPTIONS | CSV_OUTPUT | KEYWORD | keyword to specify that the record corresponds to the comma separated values solver convergence output. The CSV\_OUTPUT option has been deprecated and split into the CSV_OUTER_OUTPUT and CSV_INNER_OUTPUT options. Starting with MODFLOW 6 version 6.1.1 if the CSV_OUTPUT option is specified, then it is treated as the CSV_OUTER_OUTPUT option. | @@ -168,13 +162,13 @@ | GWE | ADV | OPTIONS | SCHEME | STRING | scheme used to solve the advection term. Can be upstream, central, or TVD. If not specified, upstream weighting is the default weighting scheme. | | GWE | CND | OPTIONS | XT3D_OFF | KEYWORD | deactivate the xt3d method and use the faster and less accurate approximation. This option may provide a fast and accurate solution under some circumstances, such as when flow aligns with the model grid, there is no mechanical dispersion, or when the longitudinal and transverse dispersivities are equal. This option may also be used to assess the computational demand of the XT3D approach by noting the run time differences with and without this option on. | | GWE | CND | OPTIONS | XT3D_RHS | KEYWORD | add xt3d terms to right-hand side, when possible. This option uses less memory, but may require more iterations. | -| GWE | CND | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWE | CND | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | GWE | CND | GRIDDATA | ALH | DOUBLE PRECISION (NODES) | longitudinal dispersivity in horizontal direction. If flow is strictly horizontal, then this is the longitudinal dispersivity that will be used. If flow is not strictly horizontal or strictly vertical, then the longitudinal dispersivity is a function of both ALH and ALV. If mechanical dispersion is represented (by specifying any dispersivity values) then this array is required. | | GWE | CND | GRIDDATA | ALV | DOUBLE PRECISION (NODES) | longitudinal dispersivity in vertical direction. If flow is strictly vertical, then this is the longitudinal dispsersivity value that will be used. If flow is not strictly horizontal or strictly vertical, then the longitudinal dispersivity is a function of both ALH and ALV. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ALH. | | GWE | CND | GRIDDATA | ATH1 | DOUBLE PRECISION (NODES) | transverse dispersivity in horizontal direction. This is the transverse dispersivity value for the second ellipsoid axis. If flow is strictly horizontal and directed in the x direction (along a row for a regular grid), then this value controls spreading in the y direction. If mechanical dispersion is represented (by specifying any dispersivity values) then this array is required. | | GWE | CND | GRIDDATA | ATH2 | DOUBLE PRECISION (NODES) | transverse dispersivity in horizontal direction. This is the transverse dispersivity value for the third ellipsoid axis. If flow is strictly horizontal and directed in the x direction (along a row for a regular grid), then this value controls spreading in the z direction. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ATH1. | | GWE | CND | GRIDDATA | ATV | DOUBLE PRECISION (NODES) | transverse dispersivity when flow is in vertical direction. If flow is strictly vertical and directed in the z direction, then this value controls spreading in the x and y directions. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ATH2. | -| GWE | CND | GRIDDATA | KTW | DOUBLE PRECISION (NODES) | thermal conductivity of the simulated fluid | +| GWE | CND | GRIDDATA | KTW | DOUBLE PRECISION (NODES) | thermal conductivity of the simulated fluid. Note that the CND Package does not account for the tortuosity of the flow paths when solving for the conductive spread of heat. If tortuosity plays an important role in the thermal conductivity calculation, its effect should be reflected in the value specified for KTW. | | GWE | CND | GRIDDATA | KTS | DOUBLE PRECISION (NODES) | thermal conductivity of the aquifer material | | GWE | CTP | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | | GWE | CTP | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of temperature value. | @@ -198,7 +192,7 @@ | GWE | DIS | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWE | DIS | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWE | DIS | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| GWE | DIS | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWE | DIS | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | GWE | DIS | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | GWE | DIS | DIMENSIONS | NROW | INTEGER | is the number of rows in the model grid. | | GWE | DIS | DIMENSIONS | NCOL | INTEGER | is the number of columns in the model grid. | @@ -213,6 +207,7 @@ | GWE | DISU | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWE | DISU | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWE | DISU | OPTIONS | VERTICAL_OFFSET_TOLERANCE | DOUBLE PRECISION | checks are performed to ensure that the top of a cell is not higher than the bottom of an overlying cell. This option can be used to specify the tolerance that is used for checking. If top of a cell is above the bottom of an overlying cell by a value less than this tolerance, then the program will not terminate with an error. The default value is zero. This option should generally not be used. | +| GWE | DISU | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | GWE | DISU | DIMENSIONS | NODES | INTEGER | is the number of cells in the model grid. | | GWE | DISU | DIMENSIONS | NJA | INTEGER | is the sum of the number of connections and NODES. When calculating the total number of connections, the connection between cell n and cell m is considered to be different from the connection between cell m and cell n. Thus, NJA is equal to the total number of connections, including n to m and m to n, and the total number of cells. | | GWE | DISU | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to define the plan-view shape of each cell in the model grid. If NVERT is not specified or is specified as zero, then the VERTICES and CELL2D blocks below are not read. NVERT and the accompanying VERTICES and CELL2D blocks should be specified for most simulations. If the XT3D or SAVE\_SPECIFIC\_DISCHARGE options are specified in the NPF Package, then this information is required. | @@ -239,7 +234,7 @@ | GWE | DISV | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWE | DISV | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWE | DISV | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| GWE | DISV | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWE | DISV | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | GWE | DISV | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | GWE | DISV | DIMENSIONS | NCPL | INTEGER | is the number of cells per layer. This is a constant value for the grid and it applies to all layers. | | GWE | DISV | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. | @@ -286,7 +281,7 @@ | GWE | FMI | PACKAGEDATA | FLOWTYPE | STRING | is the word GWFBUDGET, GWFHEAD, GWFMOVER or the name of an advanced GWF stress package. If GWFBUDGET is specified, then the corresponding file must be a budget file from a previous GWF Model run. If an advanced GWF stress package name appears then the corresponding file must be the budget file saved by a LAK, SFR, MAW or UZF Package. | | GWE | FMI | PACKAGEDATA | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | | GWE | FMI | PACKAGEDATA | FNAME | STRING | is the name of the file containing flows. The path to the file should be included if the file is not located in the folder where the program was run. | -| GWE | IC | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWE | IC | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | GWE | IC | GRIDDATA | STRT | DOUBLE PRECISION (NODES) | is the initial (starting) temperature---that is, the temperature at the beginning of the GWE Model simulation. STRT must be specified for all GWE Model simulations. One value is read for every model cell. | | GWE | LKE | OPTIONS | FLOW_PACKAGE_NAME | STRING | keyword to specify the name of the corresponding flow package. If not specified, then the corresponding flow package must have the same name as this advanced transport package (the name associated with this package in the GWE name file). | | GWE | LKE | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | @@ -584,7 +579,7 @@ | GWF | DIS | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWF | DIS | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWF | DIS | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| GWF | DIS | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWF | DIS | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | GWF | DIS | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | GWF | DIS | DIMENSIONS | NROW | INTEGER | is the number of rows in the model grid. | | GWF | DIS | DIMENSIONS | NCOL | INTEGER | is the number of columns in the model grid. | @@ -599,6 +594,7 @@ | GWF | DISU | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWF | DISU | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWF | DISU | OPTIONS | VERTICAL_OFFSET_TOLERANCE | DOUBLE PRECISION | checks are performed to ensure that the top of a cell is not higher than the bottom of an overlying cell. This option can be used to specify the tolerance that is used for checking. If top of a cell is above the bottom of an overlying cell by a value less than this tolerance, then the program will not terminate with an error. The default value is zero. This option should generally not be used. | +| GWF | DISU | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | GWF | DISU | DIMENSIONS | NODES | INTEGER | is the number of cells in the model grid. | | GWF | DISU | DIMENSIONS | NJA | INTEGER | is the sum of the number of connections and NODES. When calculating the total number of connections, the connection between cell n and cell m is considered to be different from the connection between cell m and cell n. Thus, NJA is equal to the total number of connections, including n to m and m to n, and the total number of cells. | | GWF | DISU | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to define the plan-view shape of each cell in the model grid. If NVERT is not specified or is specified as zero, then the VERTICES and CELL2D blocks below are not read. NVERT and the accompanying VERTICES and CELL2D blocks should be specified for most simulations. If the XT3D or SAVE\_SPECIFIC\_DISCHARGE options are specified in the NPF Package, then this information is required. | @@ -625,7 +621,7 @@ | GWF | DISV | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWF | DISV | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWF | DISV | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| GWF | DISV | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWF | DISV | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | GWF | DISV | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | GWF | DISV | DIMENSIONS | NCPL | INTEGER | is the number of cells per layer. This is a constant value for the grid and it applies to all layers. | | GWF | DISV | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. | @@ -738,7 +734,7 @@ | GWF | HFB | PERIOD | CELLID1 | INTEGER (NCELLDIM) | identifier for the first cell. For a structured grid that uses the DIS input file, CELLID1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLID1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLID1 is the node numbers for the cell. The barrier is located between cells designated as CELLID1 and CELLID2. For models that use the DIS and DISV grid types, the layer number for CELLID1 and CELLID2 must be the same. For all grid types, cells must be horizontally adjacent or the program will terminate with an error. | | GWF | HFB | PERIOD | CELLID2 | INTEGER (NCELLDIM) | identifier for the second cell. See CELLID1 for description of how to specify. | | GWF | HFB | PERIOD | HYDCHR | DOUBLE PRECISION | is the hydraulic characteristic of the horizontal-flow barrier. The hydraulic characteristic is the barrier hydraulic conductivity divided by the width of the horizontal-flow barrier. If the hydraulic characteristic is negative, then the absolute value of HYDCHR acts as a multiplier to the conductance between the two model cells specified as containing the barrier. For example, if the value for HYDCHR was specified as -1.5, the conductance calculated for the two cells would be multiplied by 1.5. | -| GWF | IC | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWF | IC | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | GWF | IC | GRIDDATA | STRT | DOUBLE PRECISION (NODES) | is the initial (starting) head---that is, head at the beginning of the GWF Model simulation. STRT must be specified for all simulations, including steady-state simulations. One value is read for every model cell. For simulations in which the first stress period is steady state, the values used for STRT generally do not affect the simulation (exceptions may occur if cells go dry and (or) rewet). The execution time, however, will be less if STRT includes hydraulic heads that are close to the steady-state solution. A head value lower than the cell bottom can be provided if a cell should start as dry. | | GWF | LAK | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | | GWF | LAK | OPTIONS | BOUNDNAMES | KEYWORD | keyword to indicate that boundary names may be provided with the list of lake cells. | @@ -925,7 +921,7 @@ | GWF | NPF | OPTIONS | TVK6 | KEYWORD | keyword to specify that record corresponds to a time-varying hydraulic conductivity (TVK) file. The behavior of TVK and a description of the input file is provided separately. | | GWF | NPF | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | | GWF | NPF | OPTIONS | TVK6_FILENAME | STRING | defines a time-varying hydraulic conductivity (TVK) input file. Records in the TVK file can be used to change hydraulic conductivity properties at specified times or stress periods. | -| GWF | NPF | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWF | NPF | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | GWF | NPF | OPTIONS | DEV_NO_NEWTON | KEYWORD | turn off Newton for unconfined cells | | GWF | NPF | OPTIONS | DEV_OMEGA | DOUBLE PRECISION | set saturation omega value | | GWF | NPF | GRIDDATA | ICELLTYPE | INTEGER (NODES) | flag for each cell that specifies how saturated thickness is treated. 0 means saturated thickness is held constant; $>$0 means saturated thickness varies with computed head when head is below the cell top; $<$0 means saturated thickness varies with computed head unless the THICKSTRT option is in effect. When THICKSTRT is in effect, a negative value for ICELLTYPE indicates that the saturated thickness value used in conductance calculations in the NPF Package will be computed as STRT-BOT and held constant. If the THICKSTRT option is not in effect, then negative values provided by the user for ICELLTYPE are automatically reassigned by the program to a value of one. | @@ -1218,7 +1214,7 @@ | GWT | DIS | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWT | DIS | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWT | DIS | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| GWT | DIS | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWT | DIS | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | GWT | DIS | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | GWT | DIS | DIMENSIONS | NROW | INTEGER | is the number of rows in the model grid. | | GWT | DIS | DIMENSIONS | NCOL | INTEGER | is the number of columns in the model grid. | @@ -1233,6 +1229,7 @@ | GWT | DISU | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWT | DISU | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWT | DISU | OPTIONS | VERTICAL_OFFSET_TOLERANCE | DOUBLE PRECISION | checks are performed to ensure that the top of a cell is not higher than the bottom of an overlying cell. This option can be used to specify the tolerance that is used for checking. If top of a cell is above the bottom of an overlying cell by a value less than this tolerance, then the program will not terminate with an error. The default value is zero. This option should generally not be used. | +| GWT | DISU | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | GWT | DISU | DIMENSIONS | NODES | INTEGER | is the number of cells in the model grid. | | GWT | DISU | DIMENSIONS | NJA | INTEGER | is the sum of the number of connections and NODES. When calculating the total number of connections, the connection between cell n and cell m is considered to be different from the connection between cell m and cell n. Thus, NJA is equal to the total number of connections, including n to m and m to n, and the total number of cells. | | GWT | DISU | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to define the plan-view shape of each cell in the model grid. If NVERT is not specified or is specified as zero, then the VERTICES and CELL2D blocks below are not read. NVERT and the accompanying VERTICES and CELL2D blocks should be specified for most simulations. If the XT3D or SAVE\_SPECIFIC\_DISCHARGE options are specified in the NPF Package, then this information is required. | @@ -1259,7 +1256,7 @@ | GWT | DISV | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWT | DISV | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | GWT | DISV | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| GWT | DISV | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWT | DISV | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | GWT | DISV | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | GWT | DISV | DIMENSIONS | NCPL | INTEGER | is the number of cells per layer. This is a constant value for the grid and it applies to all layers. | | GWT | DISV | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. | @@ -1276,7 +1273,7 @@ | GWT | DISV | CELL2D | ICVERT | INTEGER (NCVERT) | is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices. | | GWT | DSP | OPTIONS | XT3D_OFF | KEYWORD | deactivate the xt3d method and use the faster and less accurate approximation. This option may provide a fast and accurate solution under some circumstances, such as when flow aligns with the model grid, there is no mechanical dispersion, or when the longitudinal and transverse dispersivities are equal. This option may also be used to assess the computational demand of the XT3D approach by noting the run time differences with and without this option on. | | GWT | DSP | OPTIONS | XT3D_RHS | KEYWORD | add xt3d terms to right-hand side, when possible. This option uses less memory, but may require more iterations. | -| GWT | DSP | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWT | DSP | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | GWT | DSP | GRIDDATA | DIFFC | DOUBLE PRECISION (NODES) | effective molecular diffusion coefficient. | | GWT | DSP | GRIDDATA | ALH | DOUBLE PRECISION (NODES) | longitudinal dispersivity in horizontal direction. If flow is strictly horizontal, then this is the longitudinal dispersivity that will be used. If flow is not strictly horizontal or strictly vertical, then the longitudinal dispersivity is a function of both ALH and ALV. If mechanical dispersion is represented (by specifying any dispersivity values) then this array is required. | | GWT | DSP | GRIDDATA | ALV | DOUBLE PRECISION (NODES) | longitudinal dispersivity in vertical direction. If flow is strictly vertical, then this is the longitudinal dispsersivity value that will be used. If flow is not strictly horizontal or strictly vertical, then the longitudinal dispersivity is a function of both ALH and ALV. If this value is not specified and mechanical dispersion is represented, then this array is set equal to ALH. | @@ -1288,7 +1285,7 @@ | GWT | FMI | PACKAGEDATA | FLOWTYPE | STRING | is the word GWFBUDGET, GWFHEAD, GWFMOVER or the name of an advanced GWF stress package. If GWFBUDGET is specified, then the corresponding file must be a budget file from a previous GWF Model run. If an advanced GWF stress package name appears then the corresponding file must be the budget file saved by a LAK, SFR, MAW or UZF Package. | | GWT | FMI | PACKAGEDATA | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | | GWT | FMI | PACKAGEDATA | FNAME | STRING | is the name of the file containing flows. The path to the file should be included if the file is not located in the folder where the program was run. | -| GWT | IC | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| GWT | IC | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | GWT | IC | GRIDDATA | STRT | DOUBLE PRECISION (NODES) | is the initial (starting) concentration---that is, concentration at the beginning of the GWT Model simulation. STRT must be specified for all GWT Model simulations. One value is read for every model cell. | | GWT | IST | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that IST flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | | GWT | IST | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | @@ -1532,7 +1529,7 @@ | PRT | DIS | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the lower-left corner of the model grid. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | PRT | DIS | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the lower-left corner of the model grid. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | PRT | DIS | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| PRT | DIS | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| PRT | DIS | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | PRT | DIS | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | PRT | DIS | DIMENSIONS | NROW | INTEGER | is the number of rows in the model grid. | | PRT | DIS | DIMENSIONS | NCOL | INTEGER | is the number of columns in the model grid. | @@ -1546,7 +1543,7 @@ | PRT | DISV | OPTIONS | XORIGIN | DOUBLE PRECISION | x-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. A default value of zero is assigned if not specified. The value for XORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | PRT | DISV | OPTIONS | YORIGIN | DOUBLE PRECISION | y-position of the origin used for model grid vertices. This value should be provided in a real-world coordinate system. If not specified, then a default value equal to zero is used. The value for YORIGIN does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | | PRT | DISV | OPTIONS | ANGROT | DOUBLE PRECISION | counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. | -| PRT | DISV | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| PRT | DISV | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | PRT | DISV | DIMENSIONS | NLAY | INTEGER | is the number of layers in the model grid. | | PRT | DISV | DIMENSIONS | NCPL | INTEGER | is the number of cells per layer. This is a constant value for the grid and it applies to all layers. | | PRT | DISV | DIMENSIONS | NVERT | INTEGER | is the total number of (x, y) vertex pairs used to characterize the horizontal configuration of the model grid. | @@ -1565,8 +1562,8 @@ | PRT | FMI | PACKAGEDATA | FLOWTYPE | STRING | is the word GWFBUDGET or GWFHEAD. If GWFBUDGET is specified, then the corresponding file must be a budget file from a previous GWF Model run. | | PRT | FMI | PACKAGEDATA | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | | PRT | FMI | PACKAGEDATA | FNAME | STRING | is the name of the file containing flows. The path to the file should be included if the file is not located in the folder where the program was run. | -| PRT | MIP | OPTIONS | ZERO_METHOD | INTEGER | the root finding algorithm to solve ternary subcells. 0 euler, 1 brent, 2 chandrupatla, 3 test. | -| PRT | MIP | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. | +| PRT | MIP | OPTIONS | ZERO_METHOD | INTEGER | the root finding algorithm to solve ternary subcells. 1 brent, 2 chandrupatla. | +| PRT | MIP | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | PRT | MIP | GRIDDATA | POROSITY | DOUBLE PRECISION (NODES) | is the aquifer porosity. | | PRT | MIP | GRIDDATA | RETFACTOR | DOUBLE PRECISION (NODES) | is a real value by which velocity is divided within a given cell. RETFACTOR can be used to account for solute retardation, i.e., the apparent effect of linear sorption on the velocity of particles that track solute advection. RETFACTOR may be assigned any real value. A RETFACTOR value greater than 1 represents particle retardation (slowing), and a value of 1 represents no retardation. The effect of specifying a RETFACTOR value for each cell is the same as the effect of directly multiplying the POROSITY in each cell by the proposed RETFACTOR value for each cell. RETFACTOR allows conceptual isolation of effects such as retardation from the effect of porosity. The default value is 1. | | PRT | MIP | GRIDDATA | IZONE | INTEGER (NODES) | is an integer zone number assigned to each cell. IZONE may be positive, negative, or zero. The current cell's zone number is recorded with each particle track datum. If the ISTOPZONE option is set to any value other than zero in a PRP Package, particles released by that PRP Package terminate if they enter a cell whose IZONE value matches ISTOPZONE. If ISTOPZONE is not specified or is set to zero in a PRP Package, IZONE has no effect on the termination of particles released by that PRP Package. | @@ -1615,6 +1612,7 @@ | PRT | OC | PERIOD | FREQUENCY | INTEGER | save at the specified time step frequency. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | | PRT | OC | PERIOD | STEPS | INTEGER (] [ANGROT ] [VERTICAL_OFFSET_TOLERANCE ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwe-disv-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-disv-desc.tex index f8680fc27b7..f1181577933 100644 --- a/doc/mf6io/mf6ivar/tex/gwe-disv-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwe-disv-desc.tex @@ -13,7 +13,7 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/gwe-ic-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-ic-desc.tex index 2bfbdda2a4e..1a0532c0fe9 100644 --- a/doc/mf6io/mf6ivar/tex/gwe-ic-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwe-ic-desc.tex @@ -3,7 +3,7 @@ \item \textbf{Block: OPTIONS} \begin{description} -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: GRIDDATA} diff --git a/doc/mf6io/mf6ivar/tex/gwf-dis-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-dis-desc.tex index 9cf82ab73e2..1eee2c5b4f3 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-dis-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-dis-desc.tex @@ -13,7 +13,7 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/gwf-disu-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-disu-desc.tex index 5c943b5ffcf..e7b2785f312 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-disu-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-disu-desc.tex @@ -15,6 +15,8 @@ \item \texttt{vertical\_offset\_tolerance}---checks are performed to ensure that the top of a cell is not higher than the bottom of an overlying cell. This option can be used to specify the tolerance that is used for checking. If top of a cell is above the bottom of an overlying cell by a value less than this tolerance, then the program will not terminate with an error. The default value is zero. This option should generally not be used. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. + \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/gwf-disu-options.dat b/doc/mf6io/mf6ivar/tex/gwf-disu-options.dat index 281b79a4a27..73c828314ab 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-disu-options.dat +++ b/doc/mf6io/mf6ivar/tex/gwf-disu-options.dat @@ -5,4 +5,5 @@ BEGIN OPTIONS [YORIGIN ] [ANGROT ] [VERTICAL_OFFSET_TOLERANCE ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwf-disv-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-disv-desc.tex index ea97558391d..e52b7b7f58c 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-disv-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-disv-desc.tex @@ -13,7 +13,7 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/gwf-ic-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-ic-desc.tex index 78b1934e42a..945e8af47a8 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-ic-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-ic-desc.tex @@ -3,7 +3,7 @@ \item \textbf{Block: OPTIONS} \begin{description} -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: GRIDDATA} diff --git a/doc/mf6io/mf6ivar/tex/gwf-npf-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-npf-desc.tex index 440d574a1e7..3244f90b4af 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-npf-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-npf-desc.tex @@ -43,7 +43,7 @@ \item \texttt{tvk6\_filename}---defines a time-varying hydraulic conductivity (TVK) input file. Records in the TVK file can be used to change hydraulic conductivity properties at specified times or stress periods. -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: GRIDDATA} diff --git a/doc/mf6io/mf6ivar/tex/gwt-dis-desc.tex b/doc/mf6io/mf6ivar/tex/gwt-dis-desc.tex index 7bab97a07e7..b3a4306814b 100644 --- a/doc/mf6io/mf6ivar/tex/gwt-dis-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwt-dis-desc.tex @@ -13,7 +13,7 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/gwt-disu-desc.tex b/doc/mf6io/mf6ivar/tex/gwt-disu-desc.tex index 138c58549d9..95753eb20ff 100644 --- a/doc/mf6io/mf6ivar/tex/gwt-disu-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwt-disu-desc.tex @@ -15,6 +15,8 @@ \item \texttt{vertical\_offset\_tolerance}---checks are performed to ensure that the top of a cell is not higher than the bottom of an overlying cell. This option can be used to specify the tolerance that is used for checking. If top of a cell is above the bottom of an overlying cell by a value less than this tolerance, then the program will not terminate with an error. The default value is zero. This option should generally not be used. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. + \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/gwt-disu-options.dat b/doc/mf6io/mf6ivar/tex/gwt-disu-options.dat index 281b79a4a27..73c828314ab 100644 --- a/doc/mf6io/mf6ivar/tex/gwt-disu-options.dat +++ b/doc/mf6io/mf6ivar/tex/gwt-disu-options.dat @@ -5,4 +5,5 @@ BEGIN OPTIONS [YORIGIN ] [ANGROT ] [VERTICAL_OFFSET_TOLERANCE ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/gwt-disv-desc.tex b/doc/mf6io/mf6ivar/tex/gwt-disv-desc.tex index f8680fc27b7..f1181577933 100644 --- a/doc/mf6io/mf6ivar/tex/gwt-disv-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwt-disv-desc.tex @@ -13,7 +13,7 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/gwt-dsp-desc.tex b/doc/mf6io/mf6ivar/tex/gwt-dsp-desc.tex index 961e98c08d5..1da0ad016c4 100644 --- a/doc/mf6io/mf6ivar/tex/gwt-dsp-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwt-dsp-desc.tex @@ -7,7 +7,7 @@ \item \texttt{XT3D\_RHS}---add xt3d terms to right-hand side, when possible. This option uses less memory, but may require more iterations. -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: GRIDDATA} diff --git a/doc/mf6io/mf6ivar/tex/gwt-ic-desc.tex b/doc/mf6io/mf6ivar/tex/gwt-ic-desc.tex index 3321b676f90..14c3eab4f6a 100644 --- a/doc/mf6io/mf6ivar/tex/gwt-ic-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwt-ic-desc.tex @@ -3,7 +3,7 @@ \item \textbf{Block: OPTIONS} \begin{description} -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: GRIDDATA} diff --git a/doc/mf6io/mf6ivar/tex/prt-dis-desc.tex b/doc/mf6io/mf6ivar/tex/prt-dis-desc.tex index 7bab97a07e7..b3a4306814b 100644 --- a/doc/mf6io/mf6ivar/tex/prt-dis-desc.tex +++ b/doc/mf6io/mf6ivar/tex/prt-dis-desc.tex @@ -13,7 +13,7 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/prt-disv-desc.tex b/doc/mf6io/mf6ivar/tex/prt-disv-desc.tex index f8680fc27b7..f1181577933 100644 --- a/doc/mf6io/mf6ivar/tex/prt-disv-desc.tex +++ b/doc/mf6io/mf6ivar/tex/prt-disv-desc.tex @@ -13,7 +13,7 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/prt-mip-desc.tex b/doc/mf6io/mf6ivar/tex/prt-mip-desc.tex index 7393d31be29..5001145de24 100644 --- a/doc/mf6io/mf6ivar/tex/prt-mip-desc.tex +++ b/doc/mf6io/mf6ivar/tex/prt-mip-desc.tex @@ -3,9 +3,9 @@ \item \textbf{Block: OPTIONS} \begin{description} -\item \texttt{zero\_method}---the root finding algorithm to solve ternary subcells. 0 euler, 1 brent, 2 chandrupatla, 3 test. +\item \texttt{zero\_method}---the root finding algorithm to solve ternary subcells. 1 brent, 2 chandrupatla. -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: GRIDDATA} diff --git a/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex b/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex index 5c8f0eb2967..beba0476241 100644 --- a/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex +++ b/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex @@ -5,6 +5,8 @@ \begin{description} \item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of release-point cells. +\item \texttt{LOCAL\_Z}---indicates that rptz defines the local z coordinate of the release point within the cell, with value between 0 and 1 (inclusive). If the cell is unsaturated at release time, the z coordinate is computed relative to the water table rather than the top of the cell. + \item \texttt{TRACK}---keyword to specify that record corresponds to track. \item \texttt{FILEOUT}---keyword to specify that an output filename is expected next. diff --git a/doc/mf6io/mf6ivar/tex/prt-prp-options.dat b/doc/mf6io/mf6ivar/tex/prt-prp-options.dat index fb08e4b0068..74f8f03c232 100644 --- a/doc/mf6io/mf6ivar/tex/prt-prp-options.dat +++ b/doc/mf6io/mf6ivar/tex/prt-prp-options.dat @@ -1,5 +1,6 @@ BEGIN OPTIONS [BOUNDNAMES] + [LOCAL_Z] [TRACK FILEOUT ] [TRACKCSV FILEOUT ] [STOPTIME ] diff --git a/doc/mf6io/mf6ivar/tex/sim-nam-desc.tex b/doc/mf6io/mf6ivar/tex/sim-nam-desc.tex index 727842d12da..d2cdd279c73 100644 --- a/doc/mf6io/mf6ivar/tex/sim-nam-desc.tex +++ b/doc/mf6io/mf6ivar/tex/sim-nam-desc.tex @@ -13,6 +13,12 @@ \item \texttt{PRINT\_INPUT}---keyword to activate printing of simulation input summaries to the simulation list file (mfsim.lst). With this keyword, input summaries will be written for those packages that support newer input data model routines. Not all packages are supported yet by the newer input data model routines. +\item \texttt{HPC6}---keyword to specify that record corresponds to a hpc file. + +\item \texttt{FILEIN}---keyword to specify that an input filename is expected next. + +\item \texttt{hpc6\_filename}---name of input file to define HPC file settings for the HPC package. See the ``HPC File'' section for instructions for preparing HPC input files. + \end{description} \item \textbf{Block: TIMING} diff --git a/doc/mf6io/mf6ivar/tex/sim-nam-options.dat b/doc/mf6io/mf6ivar/tex/sim-nam-options.dat index c09288ec1ea..1ca093aebce 100644 --- a/doc/mf6io/mf6ivar/tex/sim-nam-options.dat +++ b/doc/mf6io/mf6ivar/tex/sim-nam-options.dat @@ -4,4 +4,5 @@ BEGIN OPTIONS [MEMORY_PRINT_OPTION ] [MAXERRORS ] [PRINT_INPUT] + [HPC6 FILEIN ] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/swf-dfw-options.dat b/doc/mf6io/mf6ivar/tex/swf-dfw-options.dat index 126bc5c9f27..e553a593d3b 100644 --- a/doc/mf6io/mf6ivar/tex/swf-dfw-options.dat +++ b/doc/mf6io/mf6ivar/tex/swf-dfw-options.dat @@ -6,4 +6,5 @@ BEGIN OPTIONS [PRINT_FLOWS] [SAVE_VELOCITY] [OBS6 FILEIN ] + [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/utl-hpc-desc.tex b/doc/mf6io/mf6ivar/tex/utl-hpc-desc.tex new file mode 100644 index 00000000000..0bd084d1865 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/utl-hpc-desc.tex @@ -0,0 +1,15 @@ +% DO NOT MODIFY THIS FILE DIRECTLY. IT IS CREATED BY mf6ivar.py + +\item \textbf{Block: OPTIONS} + +\begin{description} +\end{description} +\item \textbf{Block: PARTITIONS} + +\begin{description} +\item \texttt{mname}---is the unique model name. + +\item \texttt{mrank}---is the zero-based partition number (also: MPI rank or processor id) to which the model will be assigned. + +\end{description} + diff --git a/doc/mf6io/mf6ivar/tex/utl-hpc-options.dat b/doc/mf6io/mf6ivar/tex/utl-hpc-options.dat new file mode 100644 index 00000000000..bdb354214b4 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/utl-hpc-options.dat @@ -0,0 +1,2 @@ +BEGIN OPTIONS +END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/utl-hpc-partitions.dat b/doc/mf6io/mf6ivar/tex/utl-hpc-partitions.dat new file mode 100644 index 00000000000..9cc5cf8e145 --- /dev/null +++ b/doc/mf6io/mf6ivar/tex/utl-hpc-partitions.dat @@ -0,0 +1,5 @@ +BEGIN PARTITIONS + + + ... +END PARTITIONS diff --git a/doc/mf6io/simulation_namefile.tex b/doc/mf6io/simulation_namefile.tex index 1ff885d9ddb..bc77ffa0a59 100644 --- a/doc/mf6io/simulation_namefile.tex +++ b/doc/mf6io/simulation_namefile.tex @@ -42,7 +42,7 @@ \subsection{Explanation of Variables} \caption{Exchange types available in Version \modflowversion} \small \begin{center} -\begin{tabular*}{\columnwidth}{l p{15cm}} +\begin{tabular*}{\columnwidth}{l p{13cm}} \hline \hline Exgtype & Type of Exchange \\ @@ -50,6 +50,9 @@ \subsection{Explanation of Variables} GWF6-GWF6 & Exchange between two Groundwater Flow Models. Input for this file is described in a dedicated section in this guide. \\ GWF6-GWT6 & Exchange between a Groundwater Flow Model and a Groundwater Transport Model. In the present version, a filename is required for this exchange and the file must exist, however, nothing is read from this file. \\ GWT6-GWT6 & Exchange between two Groundwater Transport Models. Input for this file is described in a dedicated section in this guide. \\ +GWF6-GWE6 & Exchange between a Groundwater Flow Model and a Groundwater Energy Model. In the present version, a filename is required for this exchange and the file must exist, however, nothing is read from this file. \\ +GWE6-GWE6 & Exchange between two Groundwater Energy Models. Input for this file is described in a dedicated section in this guide. \\ +GWF6-PRT6 & Exchange between a Groundwater Flow Model and a Particle Tracking Model. In the present version, a filename is required for this exchange and the file must exist, however, nothing is read from this file. \\ \hline \end{tabular*} \label{table:exgtype} From a84dfc0c5042758da3f603359a35262412702bc1 Mon Sep 17 00:00:00 2001 From: vivekbedekar Date: Wed, 15 May 2024 12:05:45 -0400 Subject: [PATCH 160/199] style(mf6core): corrected minor spelling errors in comments (#1802) * Update mf6core.f90 Fixed a typo * Revert "Update mf6core.f90" This reverts commit 98d27a04f4dfbd446780e6b8e23703a7e701ea3b. * Update mf6core.f90 2 typos * Update src/mf6core.f90 Co-authored-by: Eric Morway --------- Co-authored-by: Eric Morway --- src/mf6core.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mf6core.f90 b/src/mf6core.f90 index e67a0772592..549bd0f3679 100644 --- a/src/mf6core.f90 +++ b/src/mf6core.f90 @@ -330,8 +330,8 @@ subroutine simulation_df() ! -- synchronize call run_ctrl%at_stage(STG_AFT_EXG_DF) ! - ! -- when needed, this is were the interface models are - ! created and added to the numerical solutions + ! -- when needed, this is where the interface models are + ! created and added to the numerical solutions call connections_cr() ! ! -- synchronize @@ -362,7 +362,7 @@ end subroutine simulation_df !> @brief Simulation allocate and read !! - !! This subroutine allocates and read static data for the simulation. + !! This subroutine allocates and reads static data for the simulation. !! Steps include: !! - allocate and read for each model !! - allocate and read for each exchange From 2f5a93a95d0878e6cb1d3145eedd341b7621da4e Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 15 May 2024 16:40:24 -0400 Subject: [PATCH 161/199] refactor(prt): cleanup, refactoring, optimization in dis/disv methods (#1803) * factor out routines for cleaner MethodDisType and MethodDisvType * optimize cell definition load: merge loops when setting cell faceflows * rename destroy() -> deallocate() in method types * misc cleanup, improve docstrings --- src/Solution/ParticleTracker/Method.f90 | 18 +- .../ParticleTracker/MethodCellPassToBot.f90 | 10 +- .../ParticleTracker/MethodCellPollock.f90 | 2 +- .../ParticleTracker/MethodCellPollockQuad.f90 | 10 +- .../ParticleTracker/MethodCellPool.f90 | 8 +- .../ParticleTracker/MethodCellTernary.f90 | 2 +- src/Solution/ParticleTracker/MethodDis.f90 | 317 ++++++++++-------- src/Solution/ParticleTracker/MethodDisv.f90 | 294 +++++++++------- src/Solution/ParticleTracker/MethodPool.f90 | 4 +- .../ParticleTracker/MethodSubcellPollock.f90 | 10 +- .../ParticleTracker/MethodSubcellPool.f90 | 4 +- .../ParticleTracker/MethodSubcellTernary.f90 | 10 +- 12 files changed, 386 insertions(+), 303 deletions(-) diff --git a/src/Solution/ParticleTracker/Method.f90 b/src/Solution/ParticleTracker/Method.f90 index 6b9b5e91d64..9d9d88e3ecf 100644 --- a/src/Solution/ParticleTracker/Method.f90 +++ b/src/Solution/ParticleTracker/Method.f90 @@ -27,13 +27,13 @@ module MethodModule !! depending on cell geometry (implementing the strategy pattern). !< type, abstract :: MethodType - character(len=40), pointer, public :: type ! method name - logical(LGP), public :: delegates ! whether the method delegates + character(len=40), pointer, public :: type !< method name + logical(LGP), public :: delegates !< whether the method delegates type(PrtFmiType), pointer, public :: fmi => null() !< ptr to fmi - class(CellType), pointer, public :: cell => null() ! ptr to a cell - class(SubcellType), pointer, public :: subcell => null() ! ptr to a subcell - type(TrackFileControlType), pointer, public :: trackfilectl => null() ! ptr to track file control - type(TimeSelectType), pointer, public :: tracktimes => null() ! ptr to user-defined tracking times + class(CellType), pointer, public :: cell => null() !< ptr to the current cell + class(SubcellType), pointer, public :: subcell => null() !< ptr to the current subcell + type(TrackFileControlType), pointer, public :: trackfilectl => null() !< ptr to track file control + type(TimeSelectType), pointer, public :: tracktimes => null() !< ptr to user-defined tracking times integer(I4B), dimension(:), pointer, contiguous, public :: izone => null() !< pointer to zone numbers real(DP), dimension(:), pointer, contiguous, public :: flowja => null() !< pointer to intercell flows real(DP), dimension(:), pointer, contiguous, public :: porosity => null() !< pointer to aquifer porosity @@ -41,7 +41,7 @@ module MethodModule contains ! Implemented in all subtypes procedure(apply), deferred :: apply - procedure(destroy), deferred :: destroy + procedure(deallocate), deferred :: deallocate ! Overridden in subtypes that delegate procedure :: pass procedure :: load @@ -62,10 +62,10 @@ subroutine apply(this, particle, tmax) type(ParticleType), pointer, intent(inout) :: particle real(DP), intent(in) :: tmax end subroutine apply - subroutine destroy(this) + subroutine deallocate (this) import MethodType class(MethodType), intent(inout) :: this - end subroutine destroy + end subroutine deallocate end interface contains diff --git a/src/Solution/ParticleTracker/MethodCellPassToBot.f90 b/src/Solution/ParticleTracker/MethodCellPassToBot.f90 index cb41dc4ca9f..3132611a5a2 100644 --- a/src/Solution/ParticleTracker/MethodCellPassToBot.f90 +++ b/src/Solution/ParticleTracker/MethodCellPassToBot.f90 @@ -20,12 +20,12 @@ module MethodCellPassToBotModule type(CellDefnType), pointer :: defn contains procedure, public :: apply => apply_ptb - procedure, public :: destroy + procedure, public :: deallocate end type MethodCellPassToBotType contains - !> @brief Create a new tracking method + !> @brief Create a new pass-to-bottom tracking method subroutine create_method_cell_ptb(method) type(MethodCellPassToBotType), pointer :: method allocate (method) @@ -35,11 +35,11 @@ subroutine create_method_cell_ptb(method) call create_defn(method%defn) end subroutine create_method_cell_ptb - !> @brief Destroy the tracking method - subroutine destroy(this) + !> @brief Deallocate the pass-to-bottom tracking method + subroutine deallocate (this) class(MethodCellPassToBotType), intent(inout) :: this deallocate (this%type) - end subroutine destroy + end subroutine deallocate !> @brief Pass particle vertically and instantaneously to the cell bottom subroutine apply_ptb(this, particle, tmax) diff --git a/src/Solution/ParticleTracker/MethodCellPollock.f90 b/src/Solution/ParticleTracker/MethodCellPollock.f90 index 2b41f2c13bb..669e989df8f 100644 --- a/src/Solution/ParticleTracker/MethodCellPollock.f90 +++ b/src/Solution/ParticleTracker/MethodCellPollock.f90 @@ -18,7 +18,7 @@ module MethodCellPollockModule type, extends(MethodType) :: MethodCellPollockType contains procedure, public :: apply => apply_mcp - procedure, public :: destroy => destroy_mcp + procedure, public :: deallocate => destroy_mcp procedure, public :: load => load_mcp procedure, public :: load_subcell procedure, public :: pass => pass_mcp diff --git a/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 b/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 index 4606171c97e..ff3f6234f09 100644 --- a/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 +++ b/src/Solution/ParticleTracker/MethodCellPollockQuad.f90 @@ -19,7 +19,7 @@ module MethodCellPollockQuadModule type, extends(MethodType) :: MethodCellPollockQuadType contains procedure, public :: apply => apply_mcpq - procedure, public :: destroy + procedure, public :: deallocate procedure, public :: load => load_mcpq procedure, public :: load_subcell procedure, public :: pass => pass_mcpq @@ -27,7 +27,7 @@ module MethodCellPollockQuadModule contains - !> @brief Create a new tracking method + !> @brief Create a new Pollock quad-refined cell method subroutine create_method_cell_quad(method) ! -- dummy type(MethodCellPollockQuadType), pointer :: method @@ -44,11 +44,11 @@ subroutine create_method_cell_quad(method) method%subcell => subcell end subroutine create_method_cell_quad - !> @brief Destroy the tracking method - subroutine destroy(this) + !> @brief Deallocate the Pollock quad-refined cell method + subroutine deallocate (this) class(MethodCellPollockQuadType), intent(inout) :: this deallocate (this%type) - end subroutine destroy + end subroutine deallocate !> @brief Load subcell into tracking method subroutine load_mcpq(this, particle, next_level, submethod) diff --git a/src/Solution/ParticleTracker/MethodCellPool.f90 b/src/Solution/ParticleTracker/MethodCellPool.f90 index 88a34b710e5..834b46b1e05 100644 --- a/src/Solution/ParticleTracker/MethodCellPool.f90 +++ b/src/Solution/ParticleTracker/MethodCellPool.f90 @@ -28,13 +28,13 @@ end subroutine create_method_cell_pool !> @brief Destroy the cell method pool subroutine destroy_method_cell_pool() - call method_cell_plck%destroy() + call method_cell_plck%deallocate() deallocate (method_cell_plck) - call method_cell_quad%destroy() + call method_cell_quad%deallocate() deallocate (method_cell_quad) - call method_cell_tern%destroy() + call method_cell_tern%deallocate() deallocate (method_cell_tern) - call method_cell_ptb%destroy() + call method_cell_ptb%deallocate() deallocate (method_cell_ptb) end subroutine destroy_method_cell_pool diff --git a/src/Solution/ParticleTracker/MethodCellTernary.f90 b/src/Solution/ParticleTracker/MethodCellTernary.f90 index 1106eb9dd82..3d12c429591 100644 --- a/src/Solution/ParticleTracker/MethodCellTernary.f90 +++ b/src/Solution/ParticleTracker/MethodCellTernary.f90 @@ -42,7 +42,7 @@ module MethodCellTernaryModule integer(I4B), public, pointer :: zeromethod contains procedure, public :: apply => apply_mct - procedure, public :: destroy => destroy_mct + procedure, public :: deallocate => destroy_mct procedure, public :: load => load_mct procedure, public :: load_subcell procedure, public :: pass => pass_mct diff --git a/src/Solution/ParticleTracker/MethodDis.f90 b/src/Solution/ParticleTracker/MethodDis.f90 index 80f5be9ba28..e8224edc4e1 100644 --- a/src/Solution/ParticleTracker/MethodDis.f90 +++ b/src/Solution/ParticleTracker/MethodDis.f90 @@ -21,15 +21,18 @@ module MethodDisModule type, extends(MethodType) :: MethodDisType contains procedure, public :: apply => apply_dis !< apply the method - procedure, public :: destroy !< destructor for the method + procedure, public :: deallocate !< deallocate arrays and scalars procedure, public :: load => load_dis !< load the method procedure, public :: pass => pass_dis !< pass the particle to the next domain procedure, private :: get_top !< get cell top elevation - procedure, private :: load_nbrs_to_defn !< load face neighbors - procedure, private :: load_flows_to_defn !< loads face flows - procedure, private :: load_boundary_flows_to_defn !< loads BoundaryFlows - procedure :: load_cell_defn !< load cell definition from the grid - procedure :: load_cell !< load cell geometry and flows + procedure, private :: update_flowja !< load intercell mass flows + procedure, private :: load_particle !< load particle properties + procedure, private :: load_properties !< load cell properties + procedure, private :: load_neighbors !< load face neighbors + procedure, private :: load_faceflows !< load face flows + procedure, private :: load_boundary_flows !< load boundary flows + procedure, private :: load_celldefn !< load cell definition from the grid + procedure, private :: load_cell !< load cell geometry and flows end type MethodDisType contains @@ -50,10 +53,10 @@ subroutine create_method_dis(method) end subroutine create_method_dis !> @brief Destructor the tracking method - subroutine destroy(this) + subroutine deallocate (this) class(MethodDisType), intent(inout) :: this deallocate (this%type) - end subroutine destroy + end subroutine deallocate subroutine load_cell(this, ic, cell) ! dummy @@ -122,7 +125,7 @@ subroutine load_dis(this, particle, next_level, submethod) type is (CellRectType) ! -- Load cell definition and geometry ic = particle%idomain(next_level) - call this%load_cell_defn(ic, cell%defn) + call this%load_celldefn(ic, cell%defn) call this%load_cell(ic, cell) ! -- If cell is active but dry, Initialize instant pass-to-bottom method @@ -143,21 +146,23 @@ subroutine load_dis(this, particle, next_level, submethod) end select end subroutine load_dis - !> @brief Pass a particle to the next cell, if there is one - subroutine pass_dis(this, particle) - ! -- dummy + !> @brief Load cell properties into the particle, including + ! the z coordinate, entry face, and node and layer numbers. + subroutine load_particle(this, cell, particle) + ! dummy class(MethodDisType), intent(inout) :: this + type(CellRectType), pointer, intent(inout) :: cell type(ParticleType), pointer, intent(inout) :: particle - ! -- local - integer(I4B) :: inface - integer(I4B) :: ipos + ! local integer(I4B) :: ic integer(I4B) :: icu - integer(I4B) :: inbr - integer(I4B) :: idiag integer(I4B) :: ilay integer(I4B) :: irow integer(I4B) :: icol + integer(I4B) :: inface + integer(I4B) :: idiag + integer(I4B) :: inbr + integer(I4B) :: ipos real(DP) :: z real(DP) :: zrel real(DP) :: topfrom @@ -166,67 +171,104 @@ subroutine pass_dis(this, particle) real(DP) :: bot real(DP) :: sat + select type (dis => this%fmi%dis) + type is (DisType) + ! compute and set reduced/user node numbers and layer + inface = particle%iboundary(2) + inbr = cell%defn%facenbr(inface) + idiag = this%fmi%dis%con%ia(cell%defn%icell) + ipos = idiag + inbr + ic = dis%con%ja(ipos) + icu = dis%get_nodeuser(ic) + call get_ijk(icu, dis%nrow, dis%ncol, dis%nlay, & + irow, icol, ilay) + particle%idomain(2) = ic + particle%icu = icu + particle%ilay = ilay + + ! map/set particle entry face + if (inface .eq. 1) then + inface = 3 + else if (inface .eq. 2) then + inface = 4 + else if (inface .eq. 3) then + inface = 1 + else if (inface .eq. 4) then + inface = 2 + else if (inface .eq. 6) then + inface = 7 + else if (inface .eq. 7) then + inface = 6 + end if + particle%iboundary(2) = inface + + ! map z between cells + z = particle%z + if (inface < 5) then + topfrom = cell%defn%top + botfrom = cell%defn%bot + zrel = (z - botfrom) / (topfrom - botfrom) + top = dis%top(ic) + bot = dis%bot(ic) + sat = this%fmi%gwfsat(ic) + z = bot + zrel * sat * (top - bot) + end if + particle%z = z + end select + + end subroutine load_particle + + !> @brief Update cell-cell flows of particle mass. + !! Every particle is currently assigned unit mass. + subroutine update_flowja(this, cell, particle) + ! dummy + class(MethodDisType), intent(inout) :: this + type(CellRectType), pointer, intent(inout) :: cell + type(ParticleType), pointer, intent(inout) :: particle + ! local + integer(I4B) :: idiag + integer(I4B) :: inbr + integer(I4B) :: inface + integer(I4B) :: ipos + inface = particle%iboundary(2) - z = particle%z + inbr = cell%defn%facenbr(inface) + idiag = this%fmi%dis%con%ia(cell%defn%icell) + ipos = idiag + inbr - select type (cell => this%cell) + ! -- leaving old cell + this%flowja(ipos) = this%flowja(ipos) - DONE + + ! -- entering new cell + this%flowja(this%fmi%dis%con%isym(ipos)) & + = this%flowja(this%fmi%dis%con%isym(ipos)) + DONE + + end subroutine update_flowja + + !> @brief Pass a particle to the next cell, if there is one + subroutine pass_dis(this, particle) + ! dummy + class(MethodDisType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + ! local + type(CellRectType), pointer :: cell + + select type (c => this%cell) type is (CellRectType) - select type (dis => this%fmi%dis) - type is (DisType) - inbr = cell%defn%facenbr(inface) - if (inbr .eq. 0) then - ! -- Exterior face; no neighbor to map to - ! todo AMP: consider when multiple models allowed - particle%istatus = 2 - particle%advancing = .false. - call this%save(particle, reason=3) ! reason=3: termination - else - idiag = dis%con%ia(cell%defn%icell) - ipos = idiag + inbr - ic = dis%con%ja(ipos) - particle%idomain(2) = ic - - ! compute and set user node number and layer on particle - icu = dis%get_nodeuser(ic) - call get_ijk(icu, dis%nrow, dis%ncol, dis%nlay, & - irow, icol, ilay) - particle%icu = icu - particle%ilay = ilay - - if (inface .eq. 1) then - inface = 3 - else if (inface .eq. 2) then - inface = 4 - else if (inface .eq. 3) then - inface = 1 - else if (inface .eq. 4) then - inface = 2 - else if (inface .eq. 6) then - inface = 7 - else if (inface .eq. 7) then - inface = 6 - end if - particle%iboundary(2) = inface - if (inface < 5) then - ! -- Map z between cells - topfrom = cell%defn%top - botfrom = cell%defn%bot - zrel = (z - botfrom) / (topfrom - botfrom) - top = dis%top(ic) - bot = dis%bot(ic) - sat = this%fmi%gwfsat(ic) - z = bot + zrel * sat * (top - bot) - end if - particle%z = z - ! -- Update cell-cell flows of particle mass. - ! Every particle is currently assigned unit mass. - ! -- leaving old cell - this%flowja(ipos) = this%flowja(ipos) - DONE - ! -- entering new cell - this%flowja(dis%con%isym(ipos)) & - = this%flowja(dis%con%isym(ipos)) + DONE - end if - end select + cell => c + ! If the entry face has no neighbors it's a + ! boundary face, so terminate the particle. + ! todo AMP: reconsider when multiple models supported + if (cell%defn%facenbr(particle%iboundary(2)) .eq. 0) then + particle%istatus = 2 + particle%advancing = .false. + call this%save(particle, reason=3) + else + ! Otherwise, load cell properties into the + ! particle and update intercell mass flows + call this%load_particle(cell, particle) + call this%update_flowja(cell, particle) + end if end select end subroutine pass_dis @@ -253,49 +295,58 @@ function get_top(this, iatop) result(top) end function get_top !> @brief Loads cell definition from the grid - subroutine load_cell_defn(this, ic, defn) + subroutine load_celldefn(this, ic, defn) ! -- dummy class(MethodDisType), intent(inout) :: this integer(I4B), intent(in) :: ic type(CellDefnType), pointer, intent(inout) :: defn - select type (dis => this%fmi%dis) - type is (DisType) - ! -- Set basic cell properties - defn%icell = ic - defn%npolyverts = 4 ! rectangular cell always has 4 vertices - defn%iatop = get_iatop(dis%get_ncpl(), & - dis%get_nodeuser(ic)) - defn%top = dis%bot(ic) + & - this%fmi%gwfsat(ic) * (dis%top(ic) - dis%bot(ic)) - defn%bot = dis%bot(ic) - defn%sat = this%fmi%gwfsat(ic) - defn%porosity = this%porosity(ic) - defn%retfactor = this%retfactor(ic) - defn%izone = this%izone(ic) - defn%can_be_rect = .true. - defn%can_be_quad = .false. - - ! -- Load cell polygon vertices - call dis%get_polyverts( & - defn%icell, & - defn%polyvert, & - closed=.true.) + ! -- Load basic cell properties + call this%load_properties(ic, defn) - ! -- Load face neighbors - call this%load_nbrs_to_defn(defn) + ! -- Load cell polygon vertices + call this%fmi%dis%get_polyverts( & + defn%icell, & + defn%polyvert, & + closed=.true.) - ! -- Load 180 degree face indicators - defn%ispv180(1:defn%npolyverts + 1) = .false. + ! -- Load cell face neighbors + call this%load_neighbors(defn) - ! -- Load flows (assumes face neighbors already loaded) - call this%load_flows_to_defn(defn) - end select - end subroutine load_cell_defn + ! -- Load 180 degree face indicators + defn%ispv180(1:defn%npolyverts + 1) = .false. + + ! -- Load face flows (assumes face neighbors already loaded) + call this%load_faceflows(defn) + + end subroutine load_celldefn + + subroutine load_properties(this, ic, defn) + ! -- dummy + class(MethodDisType), intent(inout) :: this + integer(I4B), intent(in) :: ic + type(CellDefnType), pointer, intent(inout) :: defn + + defn%icell = ic + defn%npolyverts = 4 ! rectangular cell always has 4 vertices + defn%iatop = get_iatop(this%fmi%dis%get_ncpl(), & + this%fmi%dis%get_nodeuser(ic)) + defn%top = this%fmi%dis%bot(ic) + & + this%fmi%gwfsat(ic) * & + (this%fmi%dis%top(ic) - this%fmi%dis%bot(ic)) + defn%bot = this%fmi%dis%bot(ic) + defn%sat = this%fmi%gwfsat(ic) + defn%porosity = this%porosity(ic) + defn%retfactor = this%retfactor(ic) + defn%izone = this%izone(ic) + defn%can_be_rect = .true. + defn%can_be_quad = .false. + + end subroutine load_properties !> @brief Loads face neighbors to cell definition from the grid. !! Assumes cell index and number of vertices are already loaded. - subroutine load_nbrs_to_defn(this, defn) + subroutine load_neighbors(this, defn) ! -- dummy class(MethodDisType), intent(inout) :: this type(CellDefnType), pointer, intent(inout) :: defn @@ -359,68 +410,60 @@ subroutine load_nbrs_to_defn(this, defn) end select ! -- List of edge (polygon) faces wraps around defn%facenbr(defn%npolyverts + 1) = defn%facenbr(1) - end subroutine load_nbrs_to_defn + end subroutine load_neighbors !> @brief Load flows into the cell definition. !! These include face flows and net distributed flows. !! Assumes cell index and number of vertices are already loaded. - subroutine load_flows_to_defn(this, defn) + subroutine load_faceflows(this, defn) ! -- dummy class(MethodDisType), intent(inout) :: this type(CellDefnType), intent(inout) :: defn ! -- local - integer(I4B) :: ic integer(I4B) :: m integer(I4B) :: n - integer(I4B) :: npolyverts - - ic = defn%icell - npolyverts = defn%npolyverts + real(DP) :: q - ! -- Load face flows. + ! -- Load face flows, including boundary flows. As with cell verts, + ! the face flow array wraps around. Top and bottom flows make up + ! the last two elements, respectively, for size npolyverts + 3. + ! If there is no flow through any face, set a no-exit-face flag. defn%faceflow = DZERO - ! -- As with polygon nbrs, polygon face flows wrap around for - ! -- convenience at position npolyverts+1, and bot and top flows - ! -- are tacked on the end of the list - do m = 1, npolyverts + 3 - n = defn%facenbr(m) - if (n > 0) & - defn%faceflow(m) = this%fmi%gwfflowja(this%fmi%dis%con%ia(ic) + n) - end do - - ! -- Add BoundaryFlows to face flows - call this%load_boundary_flows_to_defn(defn) - ! -- Set inoexitface flag defn%inoexitface = 1 - do m = 1, npolyverts + 3 + call this%load_boundary_flows(defn) + do m = 1, defn%npolyverts + 3 + n = defn%facenbr(m) + if (n > 0) then + q = this%fmi%gwfflowja(this%fmi%dis%con%ia(defn%icell) + n) + defn%faceflow(m) = q + end if if (defn%faceflow(m) < DZERO) defn%inoexitface = 0 end do ! -- Add up net distributed flow - defn%distflow = this%fmi%SourceFlows(ic) + this%fmi%SinkFlows(ic) + & - this%fmi%StorageFlows(ic) + defn%distflow = this%fmi%SourceFlows(defn%icell) + & + this%fmi%SinkFlows(defn%icell) + & + this%fmi%StorageFlows(defn%icell) ! -- Set weak sink flag - if (this%fmi%SinkFlows(ic) .ne. DZERO) then + if (this%fmi%SinkFlows(defn%icell) .ne. DZERO) then defn%iweaksink = 1 else defn%iweaksink = 0 end if - end subroutine load_flows_to_defn + end subroutine load_faceflows !> @brief Add boundary flows to the cell definition faceflow array. !! Assumes cell index and number of vertices are already loaded. - subroutine load_boundary_flows_to_defn(this, defn) + subroutine load_boundary_flows(this, defn) ! -- dummy class(MethodDisType), intent(inout) :: this type(CellDefnType), intent(inout) :: defn ! -- local - integer(I4B) :: ic integer(I4B) :: ioffset - ic = defn%icell - ioffset = (ic - 1) * MAX_POLY_CELLS + ioffset = (defn%icell - 1) * MAX_POLY_CELLS defn%faceflow(1) = defn%faceflow(1) + & this%fmi%BoundaryFlows(ioffset + 1) defn%faceflow(2) = defn%faceflow(2) + & @@ -434,6 +477,6 @@ subroutine load_boundary_flows_to_defn(this, defn) this%fmi%BoundaryFlows(ioffset + 9) defn%faceflow(7) = defn%faceflow(7) + & this%fmi%BoundaryFlows(ioffset + 10) - end subroutine load_boundary_flows_to_defn + end subroutine load_boundary_flows end module MethodDisModule diff --git a/src/Solution/ParticleTracker/MethodDisv.f90 b/src/Solution/ParticleTracker/MethodDisv.f90 index 8360b7c1263..a175c25731f 100644 --- a/src/Solution/ParticleTracker/MethodDisv.f90 +++ b/src/Solution/ParticleTracker/MethodDisv.f90 @@ -23,18 +23,22 @@ module MethodDisvModule type, extends(MethodType) :: MethodDisvType integer(I4B), pointer :: zeromethod contains - procedure, public :: apply => apply_disv !< applies the DISV-grid method - procedure, public :: destroy !< destructor for the method - procedure, public :: load => load_disv !< loads the cell method - procedure, public :: load_cell_defn !< loads cell definition from the grid - procedure, public :: map_neighbor !< maps a location on the cell face to the shared face of a neighbor - procedure, public :: pass => pass_disv !< passes the particle to the next cell - procedure, private :: load_nbrs_to_defn !< loads face neighbors to a cell object - procedure, private :: load_flags_to_defn !< loads 180-degree vertex indicator to a cell object - procedure, private :: load_flows_to_defn !< loads flows to a cell object - procedure, private :: load_boundary_flows_to_defn_rect !< adds BoundaryFlows from the grid to the faceflow array of a rectangular cell - procedure, private :: load_boundary_flows_to_defn_rect_quad !< adds BoundaryFlows from the grid to the faceflow array of a rectangular-quad cell - procedure, private :: load_boundary_flows_to_defn_poly !< adds BoundaryFlows from the grid to the faceflow array of a polygonal cell + procedure, public :: apply => apply_disv !< apply the DISV-grid method + procedure, public :: deallocate !< deallocate arrays and scalars + procedure, public :: load => load_disv !< load the cell method + procedure, public :: load_cell_defn !< load cell definition from the grid + procedure, public :: pass => pass_disv !< pass the particle to the next cell + procedure, private :: map_neighbor !< map a location on the cell face to the shared face of a neighbor + procedure, private :: update_flowja !< update intercell mass flows + procedure, private :: load_particle !< load particle properties + procedure, private :: load_properties !< load cell properties + procedure, private :: load_polygon !< load cell polygon + procedure, private :: load_neighbors !< load face neighbors + procedure, private :: load_indicators !< load 180-degree vertex indicator + procedure, private :: load_faceflows !< load flows + procedure, private :: load_boundary_flows_to_defn_rect !< load boundary flows to a rectangular cell + procedure, private :: load_boundary_flows_to_defn_rect_quad !< load boundary flows to a rectangular-quad cell + procedure, private :: load_boundary_flows_to_defn_poly !< load boundary flows to a polygonal cell end type MethodDisvType contains @@ -57,10 +61,10 @@ subroutine create_method_disv(method) end subroutine create_method_disv !> @brief Destroy the tracking method - subroutine destroy(this) + subroutine deallocate (this) class(MethodDisvType), intent(inout) :: this deallocate (this%type) - end subroutine destroy + end subroutine deallocate !> @brief Load the cell and the tracking method subroutine load_disv(this, particle, next_level, submethod) @@ -129,14 +133,14 @@ subroutine load_disv(this, particle, next_level, submethod) end select end subroutine load_disv - !> @brief Pass a particle to the next cell, if there is one - subroutine pass_disv(this, particle) - ! -- modules + subroutine load_particle(this, cell, particle) + ! modules use DisvModule, only: DisvType - ! -- dummy + ! dummy class(MethodDisvType), intent(inout) :: this + type(CellPolyType), pointer, intent(inout) :: cell type(ParticleType), pointer, intent(inout) :: particle - ! -- local + ! local integer(I4B) :: inface integer(I4B) :: ipos integer(I4B) :: ic @@ -147,46 +151,78 @@ subroutine pass_disv(this, particle) integer(I4B) :: ilay real(DP) :: z - inface = particle%iboundary(2) - z = particle%z + select type (dis => this%fmi%dis) + type is (DisvType) + ! compute and set reduced/user node numbers and layer + inface = particle%iboundary(2) + idiag = dis%con%ia(cell%defn%icell) + inbr = cell%defn%facenbr(inface) + ipos = idiag + inbr + ic = dis%con%ja(ipos) + icu = dis%get_nodeuser(ic) + call get_jk(icu, dis%ncpl, dis%nlay, icpl, ilay) + particle%idomain(2) = ic + particle%icu = icu + particle%ilay = ilay + + ! map/set particle entry face and z coordinate + z = particle%z + call this%map_neighbor(cell%defn, inface, z) + particle%iboundary(2) = inface + particle%idomain(3:) = 0 + particle%iboundary(3:) = 0 + particle%z = z + end select - select type (cell => this%cell) + end subroutine + + subroutine update_flowja(this, cell, particle) + ! dummy + class(MethodDisvType), intent(inout) :: this + type(CellPolyType), pointer, intent(inout) :: cell + type(ParticleType), pointer, intent(inout) :: particle + ! local + integer(I4B) :: inbr + integer(I4B) :: idiag + integer(I4B) :: ipos + + idiag = this%fmi%dis%con%ia(cell%defn%icell) + inbr = cell%defn%facenbr(particle%iboundary(2)) + ipos = idiag + inbr + + ! leaving old cell + this%flowja(ipos) = this%flowja(ipos) - DONE + + ! entering new cell + this%flowja(this%fmi%dis%con%isym(ipos)) & + = this%flowja(this%fmi%dis%con%isym(ipos)) + DONE + + end subroutine update_flowja + + !> @brief Pass a particle to the next cell, if there is one + subroutine pass_disv(this, particle) + ! dummy + class(MethodDisvType), intent(inout) :: this + type(ParticleType), pointer, intent(inout) :: particle + ! local + type(CellPolyType), pointer :: cell + + select type (c => this%cell) type is (CellPolyType) - select type (dis => this%fmi%dis) - type is (DisvType) - inbr = cell%defn%facenbr(inface) - if (inbr .eq. 0) then - ! -- Exterior face; no neighbor to map to - ! todo, later on: reconsider when multiple models are allowed - particle%istatus = 2 - particle%advancing = .false. - call this%save(particle, reason=3) ! reason=3: termination - else - idiag = dis%con%ia(cell%defn%icell) - ipos = idiag + inbr - ic = dis%con%ja(ipos) - particle%idomain(2) = ic - - ! compute and set user node number and layer on particle - icu = dis%get_nodeuser(ic) - call get_jk(icu, dis%ncpl, dis%nlay, icpl, ilay) - particle%icu = icu - particle%ilay = ilay - - call this%map_neighbor(cell%defn, inface, z) - particle%iboundary(2) = inface - particle%idomain(3:) = 0 - particle%iboundary(3:) = 0 - particle%z = z - ! -- Update cell-cell flows of particle mass. - ! Every particle is currently assigned unit mass. - ! -- leaving old cell - this%flowja(ipos) = this%flowja(ipos) - DONE - ! -- entering new cell - this%flowja(dis%con%isym(ipos)) & - = this%flowja(dis%con%isym(ipos)) + DONE - end if - end select + cell => c + ! If the entry face has no neighbors it's a + ! boundary face, so terminate the particle. + ! todo AMP: reconsider when multiple models supported + if (cell%defn%facenbr(particle%iboundary(2)) .eq. 0) then + particle%istatus = 2 + particle%advancing = .false. + call this%save(particle, reason=3) + else + ! Otherwise, load cell properties into the + ! particle and update intercell mass flows + call this%load_particle(cell, particle) + call this%update_flowja(cell, particle) + end if end select end subroutine pass_disv @@ -273,12 +309,34 @@ subroutine load_cell_defn(this, ic, defn) class(MethodDisvType), intent(inout) :: this integer(I4B), intent(in) :: ic type(CellDefnType), pointer, intent(inout) :: defn - ! -- local + + ! -- Load basic cell properties + call this%load_properties(ic, defn) + + ! -- Load polygon vertices + call this%load_polygon(defn) + + ! -- Load face neighbors + call this%load_neighbors(defn) + + ! -- Load 180-degree indicator + call this%load_indicators(defn) + + ! -- Load flows (assumes face neighbors already loaded) + call this%load_faceflows(defn) + end subroutine load_cell_defn + + !> @brief Loads cell properties to cell definition from the grid. + subroutine load_properties(this, ic, defn) + ! dummy + class(MethodDisvType), intent(inout) :: this + integer(I4B), intent(in) :: ic + type(CellDefnType), pointer, intent(inout) :: defn + ! local real(DP) :: top real(DP) :: bot real(DP) :: sat - ! -- Load basic cell properties defn%icell = ic defn%iatop = get_iatop(this%fmi%dis%get_ncpl(), & this%fmi%dis%get_nodeuser(ic)) @@ -293,32 +351,28 @@ subroutine load_cell_defn(this, ic, defn) defn%retfactor = this%retfactor(ic) defn%izone = this%izone(ic) - ! -- Load polygon vertices + end subroutine load_properties + + subroutine load_polygon(this, defn) + ! dummy + class(MethodDisvType), intent(inout) :: this + type(CellDefnType), pointer, intent(inout) :: defn + call this%fmi%dis%get_polyverts( & defn%icell, & defn%polyvert, & closed=.true.) defn%npolyverts = size(defn%polyvert, dim=2) - 1 - ! -- Load face neighbors - call this%load_nbrs_to_defn(defn) - - ! -- Load 180-degree indicator - call this%load_flags_to_defn(defn) - - ! -- Load flows (assumes face neighbors already loaded) - call this%load_flows_to_defn(defn) - end subroutine load_cell_defn + end subroutine load_polygon !> @brief Loads face neighbors to cell definition from the grid !! Assumes cell index and number of vertices are already loaded. - subroutine load_nbrs_to_defn(this, defn) + subroutine load_neighbors(this, defn) ! -- dummy class(MethodDisvType), intent(inout) :: this type(CellDefnType), pointer, intent(inout) :: defn ! -- local - integer(I4B) :: ic - integer(I4B) :: npolyverts integer(I4B) :: ic1 integer(I4B) :: ic2 integer(I4B) :: icu1 @@ -335,19 +389,19 @@ subroutine load_nbrs_to_defn(this, defn) integer(I4B) :: istop2 integer(I4B) :: isharedface integer(I4B) :: ncpl - - ic = defn%icell - npolyverts = defn%npolyverts + integer(I4B) :: nfaces + integer(I4B) :: nslots ! -- expand facenbr array if needed - if (size(defn%facenbr) < npolyverts + 3) & - call ExpandArray(defn%facenbr, npolyverts + 3) + nfaces = defn%npolyverts + 3 + nslots = size(defn%facenbr) + if (nslots < nfaces) call ExpandArray(defn%facenbr, nfaces - nslots) select type (dis => this%fmi%dis) type is (DisvType) ! -- Load face neighbors. defn%facenbr = 0 - ic1 = ic + ic1 = defn%icell icu1 = dis%get_nodeuser(ic1) ncpl = dis%get_ncpl() call get_jk(icu1, ncpl, dis%nlay, j1, k1) @@ -366,16 +420,15 @@ subroutine load_nbrs_to_defn(this, defn) dis%javert(istart2:istop2), & isharedface) if (isharedface /= 0) then - ! -- Edge (polygon) face neighbor defn%facenbr(isharedface) = int(iloc, 1) else if (k2 > k1) then ! -- Bottom face neighbor - defn%facenbr(npolyverts + 2) = int(iloc, 1) + defn%facenbr(defn%npolyverts + 2) = int(iloc, 1) else if (k2 < k1) then ! -- Top face neighbor - defn%facenbr(npolyverts + 3) = int(iloc, 1) + defn%facenbr(defn%npolyverts + 3) = int(iloc, 1) else call pstop(1, "k2 should be <> k1, since no shared edge face") end if @@ -383,62 +436,58 @@ subroutine load_nbrs_to_defn(this, defn) end do end select ! -- List of edge (polygon) faces wraps around - defn%facenbr(npolyverts + 1) = defn%facenbr(1) + defn%facenbr(defn%npolyverts + 1) = defn%facenbr(1) - end subroutine load_nbrs_to_defn + end subroutine load_neighbors !> @brief Load flows into the cell definition. !! These include face flows and net distributed flows. !! Assumes cell index and number of vertices are already loaded. - subroutine load_flows_to_defn(this, defn) + subroutine load_faceflows(this, defn) ! -- dummy class(MethodDisvType), intent(inout) :: this type(CellDefnType), intent(inout) :: defn ! -- local - integer(I4B) :: ic - integer(I4B) :: npolyverts + integer(I4B) :: nfaces + integer(I4B) :: nslots integer(I4B) :: m integer(I4B) :: n - - ic = defn%icell - npolyverts = defn%npolyverts + real(DP) :: q ! -- expand faceflow array if needed - if (size(defn%faceflow) < npolyverts + 3) & - call ExpandArray(defn%faceflow, npolyverts + 3) - - ! -- Load face flows. Note that the faceflow array - ! -- does not get reallocated if it is already allocated - ! -- to a size greater than or equal to npolyverts+3. + nfaces = defn%npolyverts + 3 + nslots = size(defn%faceflow) + if (nslots < nfaces) call ExpandArray(defn%faceflow, nfaces - nslots) + + ! -- Load face flows, including boundary flows. As with cell verts, + ! the face flow array wraps around. Top and bottom flows make up + ! the last two elements, respectively, for size npolyverts + 3. + ! If there is no flow through any face, set a no-exit-face flag. defn%faceflow = DZERO - - ! -- As with polygon nbrs, polygon face flows wrap around for - ! -- convenience at position npolyverts+1, and bot and top flows - ! -- are tacked on the end of the list - do m = 1, npolyverts + 3 - n = defn%facenbr(m) - if (n > 0) & - defn%faceflow(m) = this%fmi%gwfflowja(this%fmi%dis%con%ia(ic) + n) - end do - call this%load_boundary_flows_to_defn_poly(defn) - ! -- Set inoexitface flag defn%inoexitface = 1 - do m = 1, npolyverts + 3 + call this%load_boundary_flows_to_defn_poly(defn) + do m = 1, nfaces + n = defn%facenbr(m) + if (n > 0) then + q = this%fmi%gwfflowja(this%fmi%dis%con%ia(defn%icell) + n) + defn%faceflow(m) = q + end if if (defn%faceflow(m) < DZERO) defn%inoexitface = 0 end do ! -- Add up net distributed flow - defn%distflow = this%fmi%SourceFlows(ic) + this%fmi%SinkFlows(ic) + & - this%fmi%StorageFlows(ic) + defn%distflow = this%fmi%SourceFlows(defn%icell) + & + this%fmi%SinkFlows(defn%icell) + & + this%fmi%StorageFlows(defn%icell) ! -- Set weak sink flag - if (this%fmi%SinkFlows(ic) .ne. DZERO) then + if (this%fmi%SinkFlows(defn%icell) .ne. DZERO) then defn%iweaksink = 1 else defn%iweaksink = 0 end if - end subroutine load_flows_to_defn + end subroutine load_faceflows !> @brief Load boundary flows from the grid into a rectangular cell. !! Assumes cell index and number of vertices are already loaded. @@ -447,16 +496,11 @@ subroutine load_boundary_flows_to_defn_rect(this, defn) class(MethodDisvType), intent(inout) :: this type(CellDefnType), intent(inout) :: defn ! -- local - integer(I4B) :: ic - integer(I4B) :: npolyverts integer(I4B) :: ioffset - ic = defn%icell - npolyverts = defn%npolyverts - ! assignment of BoundaryFlows to faceflow below assumes clockwise ! ordering of faces, with face 1 being the "western" face - ioffset = (ic - 1) * 10 + ioffset = (defn%icell - 1) * 10 defn%faceflow(1) = defn%faceflow(1) + & this%fmi%BoundaryFlows(ioffset + 4) defn%faceflow(2) = defn%faceflow(2) + & @@ -480,8 +524,6 @@ subroutine load_boundary_flows_to_defn_rect_quad(this, defn) class(MethodDisvType), intent(inout) :: this type(CellDefnType), intent(inout) :: defn ! -- local - integer(I4B) :: ic - integer(I4B) :: npolyverts integer(I4B) :: m integer(I4B) :: n integer(I4B) :: nn @@ -493,10 +535,8 @@ subroutine load_boundary_flows_to_defn_rect_quad(this, defn) real(DP) :: qbf integer(I4B) :: irectvert(5) - ic = defn%icell - npolyverts = defn%npolyverts + ioffset = (defn%icell - 1) * 10 - ioffset = (ic - 1) * 10 ! -- Polygon faces in positions 1 through npolyverts do n = 1, 4 if (n .eq. 2) then @@ -508,7 +548,7 @@ subroutine load_boundary_flows_to_defn_rect_quad(this, defn) end if qbf = this%fmi%BoundaryFlows(ioffset + nbf) nn = 0 - do m = 1, npolyverts + do m = 1, defn%npolyverts if (.not. defn%ispv180(m)) then nn = nn + 1 irectvert(nn) = m @@ -517,7 +557,7 @@ subroutine load_boundary_flows_to_defn_rect_quad(this, defn) irectvert(5) = irectvert(1) m1 = irectvert(n) m2 = irectvert(n + 1) - if (m2 .lt. m1) m2 = m2 + npolyverts + if (m2 .lt. m1) m2 = m2 + defn%npolyverts mdiff = m2 - m1 if (mdiff .eq. 1) then ! -- Assign BoundaryFlow to corresponding polygon face @@ -530,7 +570,7 @@ subroutine load_boundary_flows_to_defn_rect_quad(this, defn) end if end do ! -- Wrap around to 1 in position npolyverts+1 - m = npolyverts + 1 + m = defn%npolyverts + 1 defn%faceflow(m) = defn%faceflow(1) ! -- Bottom in position npolyverts+2 m = m + 1 @@ -577,7 +617,7 @@ end subroutine load_boundary_flows_to_defn_poly !> @brief Load 180-degree vertex indicator array and set flags !! indicating how cell can be represented. !! Assumes cell index and number of vertices are already loaded. - subroutine load_flags_to_defn(this, defn) + subroutine load_indicators(this, defn) ! -- dummy class(MethodDisvType), intent(inout) :: this type(CellDefnType), pointer, intent(inout) :: defn @@ -670,6 +710,6 @@ subroutine load_flags_to_defn(this, defn) end if end if - end subroutine load_flags_to_defn + end subroutine load_indicators end module MethodDisvModule diff --git a/src/Solution/ParticleTracker/MethodPool.f90 b/src/Solution/ParticleTracker/MethodPool.f90 index 810bae266da..601e7d42e9c 100644 --- a/src/Solution/ParticleTracker/MethodPool.f90 +++ b/src/Solution/ParticleTracker/MethodPool.f90 @@ -21,9 +21,9 @@ end subroutine create_method_pool !> @brief Destroy the method pool subroutine destroy_method_pool() - call method_dis%destroy() + call method_dis%deallocate() deallocate (method_dis) - call method_disv%destroy() + call method_disv%deallocate() deallocate (method_disv) end subroutine destroy_method_pool diff --git a/src/Solution/ParticleTracker/MethodSubcellPollock.f90 b/src/Solution/ParticleTracker/MethodSubcellPollock.f90 index aab221e1634..67635ba5ddd 100644 --- a/src/Solution/ParticleTracker/MethodSubcellPollock.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellPollock.f90 @@ -21,13 +21,13 @@ module MethodSubcellPollockModule real(DP), allocatable, public :: qextl1(:), qextl2(:), qintl(:) !< external and internal subcell flows contains procedure, public :: apply => apply_msp - procedure, public :: destroy => destroy_msp + procedure, public :: deallocate procedure, private :: track_subcell end type MethodSubcellPollockType contains - !> @brief Create a new Pollock's subcell-method object + !> @brief Create a new Pollock's subcell method subroutine create_method_subcell_pollock(method) ! -- dummy type(MethodSubcellPollockType), pointer :: method @@ -41,11 +41,11 @@ subroutine create_method_subcell_pollock(method) method%delegates = .false. end subroutine create_method_subcell_pollock - !> @brief Destructor for a Pollock's subcell-method object - subroutine destroy_msp(this) + !> @brief Deallocate the Pollock's subcell method + subroutine deallocate (this) class(MethodSubcellPollockType), intent(inout) :: this deallocate (this%type) - end subroutine destroy_msp + end subroutine deallocate !> @brief Apply Pollock's method to a rectangular subcell subroutine apply_msp(this, particle, tmax) diff --git a/src/Solution/ParticleTracker/MethodSubcellPool.f90 b/src/Solution/ParticleTracker/MethodSubcellPool.f90 index cb07ac34b2f..33590f5e3be 100644 --- a/src/Solution/ParticleTracker/MethodSubcellPool.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellPool.f90 @@ -22,9 +22,9 @@ end subroutine create_method_subcell_pool !> @brief Destroy the subcell method pool subroutine destroy_method_subcell_pool() - call method_subcell_plck%destroy() + call method_subcell_plck%deallocate() deallocate (method_subcell_plck) - call method_subcell_tern%destroy() + call method_subcell_tern%deallocate() deallocate (method_subcell_tern) end subroutine destroy_method_subcell_pool diff --git a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 index cec1ecd0bfe..a2a7e2fe5d1 100644 --- a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 @@ -23,13 +23,13 @@ module MethodSubcellTernaryModule integer(I4B), public, pointer :: zeromethod contains procedure, public :: apply => apply_mst - procedure, public :: destroy + procedure, public :: deallocate procedure, private :: track_subcell end type MethodSubcellTernaryType contains - !> @brief Create a new ternary subcell-method object + !> @brief Create a new ternary subcell method subroutine create_method_subcell_ternary(method) ! -- dummy type(MethodSubcellTernaryType), pointer :: method @@ -45,11 +45,11 @@ subroutine create_method_subcell_ternary(method) method%zeromethod = 0 end subroutine create_method_subcell_ternary - !> @brief Destructor for a ternary subcell-method object - subroutine destroy(this) + !> @brief Deallocate the ternary subcell method + subroutine deallocate (this) class(MethodSubcellTernaryType), intent(inout) :: this deallocate (this%type) - end subroutine destroy + end subroutine deallocate !> @brief Apply the ternary subcell method subroutine apply_mst(this, particle, tmax) From cd200b6fed89f619ead70671791a7a3feb2843ed Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 15 May 2024 19:01:06 -0400 Subject: [PATCH 162/199] fix(prt-prp): fix particle release point package logging (#1805) Package logging wasn't connected to iprpak in base type, wire it up. Also idm mempath was used where it should not be. And add some tests --- autotest/test_prt_disv1.py | 15 ++++++++++ autotest/test_prt_notebooks.py | 9 ++++-- autotest/test_prt_release_timing.py | 17 +++++++++++ doc/mf6io/mf6ivar/dfn/prt-prp.dfn | 8 +++++ src/Model/ParticleTracking/prt-prp.f90 | 41 +++++++++++++------------- src/Model/ParticleTracking/prt.f90 | 2 +- 6 files changed, 69 insertions(+), 23 deletions(-) diff --git a/autotest/test_prt_disv1.py b/autotest/test_prt_disv1.py index d4dad2336ce..acab819f4ec 100644 --- a/autotest/test_prt_disv1.py +++ b/autotest/test_prt_disv1.py @@ -21,6 +21,10 @@ time steps. PRT and MP7 should both assign the datum to the prior time step. - trtf: Same as trts, except tracking times are provided to PRT in a separate file, rather than inline in the OC input file. + +This test case also exercises the `print_input` +option which enables logging for the package's +particle release settings to the listing file. """ from pathlib import Path @@ -225,6 +229,7 @@ def build_prt_sim(idx, gwf_ws, prt_ws, mf6): trackcsv_filerecord=[prp_track_csv_file], stop_at_weak_sink=False, boundnames=True, + print_input=True, ) # create output control package @@ -366,6 +371,16 @@ def check_output(idx, test): mp7_pathline_file = f"{mp7_name}.mppth" assert (mp7_ws / mp7_pathline_file).is_file() + # check list file for logged release configuration + list_file = prt_ws / f"{prt_name}.lst" + assert list_file.is_file() + lines = open(list_file).readlines() + lines = [l.strip() for l in lines] + assert ( + "PARTICLE RELEASE: TIME STEP(S) 1 AT OFFSET 0.000" + in lines + ) + # load mp7 pathline results plf = PathlineFile(mp7_ws / mp7_pathline_file) mp7_pls = pd.DataFrame( diff --git a/autotest/test_prt_notebooks.py b/autotest/test_prt_notebooks.py index e4c35a7c9fc..d4eecec5975 100644 --- a/autotest/test_prt_notebooks.py +++ b/autotest/test_prt_notebooks.py @@ -82,6 +82,11 @@ def test_notebooks(notebook, function_tmpdir, targets): # check results example_name = notebook.stem.replace("ex-prt-", "") - pathlines_file = function_tmpdir / example_name / "prt" / (example_name + "-prt.trk.csv") + pathlines_file = ( + function_tmpdir + / example_name + / "prt" + / (example_name + "-prt.trk.csv") + ) pathlines = pd.read_csv(pathlines_file).round(3).to_records(index=False) - assert any(pathlines) \ No newline at end of file + assert any(pathlines) diff --git a/autotest/test_prt_release_timing.py b/autotest/test_prt_release_timing.py index 89d906d2834..0b208ca9d53 100644 --- a/autotest/test_prt_release_timing.py +++ b/autotest/test_prt_release_timing.py @@ -168,6 +168,7 @@ def build_prt_sim(name, gwf_ws, prt_ws, mf6, fraction=None): if "tls" in name else None ), + print_input=True, ) # create output control package @@ -331,6 +332,22 @@ def check_output(idx, test, fraction, snapshot): mp7_pathline_file = f"{mp7_name}.mppth" assert (mp7_ws / mp7_pathline_file).is_file() + # check list file for logged release configuration + list_file = prt_ws / f"{prt_name}.lst" + assert list_file.is_file() + lines = open(list_file).readlines() + lines = [l.strip() for l in lines] + if "sgl" in name or "dbl" in name or "tls" in name: + assert ( + "PARTICLE RELEASE: TIME STEP(S) 1 AT OFFSET 0.000" + in lines + ) + elif "stps" in name: + assert ( + "PARTICLE RELEASE: TIME STEP(S) 1 AT OFFSET 0.500" + in lines + ) + # load mp7 pathline results plf = PathlineFile(mp7_ws / mp7_pathline_file) mp7_pls = pd.DataFrame( diff --git a/doc/mf6io/mf6ivar/dfn/prt-prp.dfn b/doc/mf6io/mf6ivar/dfn/prt-prp.dfn index 8d5f19c39e3..ce731331843 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-prp.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-prp.dfn @@ -10,6 +10,14 @@ optional true longname description REPLACE boundnames {'{#1}': 'release-point'} +block options +name print_input +type keyword +reader urword +optional true +longname print input to listing file +description REPLACE print_input {'{#1}': 'all model stress package'} + block options name local_z type keyword diff --git a/src/Model/ParticleTracking/prt-prp.f90 b/src/Model/ParticleTracking/prt-prp.f90 index 0bafbf041fc..da8be9b3524 100644 --- a/src/Model/ParticleTracking/prt-prp.f90 +++ b/src/Model/ParticleTracking/prt-prp.f90 @@ -86,7 +86,7 @@ module PrtPrpModule !> @brief Create a new particle release point package subroutine prp_create(packobj, id, ibcnum, inunit, iout, namemodel, & - pakname, mempath, fmi) + pakname, fmi) ! -- dummy class(BndType), pointer :: packobj integer(I4B), intent(in) :: id @@ -95,21 +95,20 @@ subroutine prp_create(packobj, id, ibcnum, inunit, iout, namemodel, & integer(I4B), intent(in) :: iout character(len=*), intent(in) :: namemodel character(len=*), intent(in) :: pakname - character(len=*), intent(in) :: mempath type(PrtFmiType), pointer :: fmi ! -- local type(PrtPrpType), pointer :: prpobj ! -- formats character(len=*), parameter :: fmtheader = & "(1x, /1x, 'PRP -- PARTICLE RELEASE POINT PACKAGE', & - &' INPUT READ FROM MEMPATH: ', A, /)" + &' INPUT READ FROM UNIT ', i0, /)" ! -- allocate the object and assign values to object variables allocate (prpobj) packobj => prpobj ! -- create name and memory path - call packobj%set_names(ibcnum, namemodel, pakname, ftype, mempath) + call packobj%set_names(ibcnum, namemodel, pakname, ftype) prpobj%text = text ! -- allocate scalars @@ -129,7 +128,7 @@ subroutine prp_create(packobj, id, ibcnum, inunit, iout, namemodel, & prpobj%fmi => fmi ! -- if prp is enabled, print a message identifying it - if (inunit > 0) write (iout, fmtheader) mempath + if (inunit > 0) write (iout, fmtheader) inunit end subroutine prp_create !> @brief Deallocate memory @@ -598,22 +597,24 @@ subroutine prp_rp(this) end if ! -- write settings to list file - if (.not. any(this%rlskstp > 0)) then - write (this%iout, "(1x,/1x,a)") 'NO PARTICLE RELEASES IN THIS STRESS '// & - 'PERIOD' - else if (use_last) then - write (this%iout, "(1x,/1x,a)") 'REUSING PARTICLE RELEASE SETTINGS '// & - 'FROM LAST STRESS PERIOD' - else - ! -- write particle release setting - write (this%iout, "(1x,/1x,a)", advance='no') 'PARTICLE RELEASE:' - if (any(this%rlskstp > 0)) then - n = size(this%rlskstp) - if (n > 0) write (this%iout, fmt_steps, advance='no') this%rlskstp + if (this%iprpak > 0) then + if (.not. any(this%rlskstp > 0)) then + write (this%iout, "(1x,/1x,a)") 'NO PARTICLE RELEASES IN THIS STRESS '// & + 'PERIOD' + else if (use_last) then + write (this%iout, "(1x,/1x,a)") 'REUSING PARTICLE RELEASE SETTINGS '// & + 'FROM LAST STRESS PERIOD' + else + ! -- write particle release setting + write (this%iout, "(1x,/1x,a)", advance='no') 'PARTICLE RELEASE:' + if (any(this%rlskstp > 0)) then + n = size(this%rlskstp) + if (n > 0) write (this%iout, fmt_steps, advance='no') this%rlskstp + end if + write (this%iout, "(1x,a)", advance='no') 'AT OFFSET' + write (this%iout, fmt_fracs) (/this%offset/) + write (this%iout, '(A)') end if - write (this%iout, "(1x,a)", advance='no') 'AT OFFSET' - write (this%iout, fmt_fracs) (/this%offset/) - write (this%iout, '(A)') end if end subroutine prp_rp diff --git a/src/Model/ParticleTracking/prt.f90 b/src/Model/ParticleTracking/prt.f90 index d62a9b0b242..731e7f5e3d2 100644 --- a/src/Model/ParticleTracking/prt.f90 +++ b/src/Model/ParticleTracking/prt.f90 @@ -871,7 +871,7 @@ subroutine package_create(this, filtyp, ipakid, ipaknum, pakname, mempath, & select case (filtyp) case ('PRP6') call prp_create(packobj, ipakid, ipaknum, inunit, iout, & - this%name, pakname, mempath, this%fmi) + this%name, pakname, this%fmi) case ('API6') call api_create(packobj, ipakid, ipaknum, inunit, iout, & this%name, pakname) From 521dcaeda31f2ec1f43d8b331002aa3b53a9681f Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 15 May 2024 19:52:16 -0400 Subject: [PATCH 163/199] docs(DEVELOPER.md): mention ifx support, show pixi and native cmds (#1806) --- DEVELOPER.md | 68 +++++++++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/DEVELOPER.md b/DEVELOPER.md index 616bfdb6fd9..8722ec5ae06 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -82,9 +82,7 @@ Some additional, optional tools are also discussed below. ### Fortran compiler -The GNU Fortran compiler `gfortran` or the Intel Fortran Classic compiler `ifort` can be used to compile MODFLOW 6. - -**Note:** the next-generation Intel Fortran compiler `ifx` is not yet compatible with MODFLOW 6. +GNU Fortran or Intel Fortran compilers can be used to build MODFLOW 6. It may be possible to build MODFLOW 6 with other compilers, but this cannot be guaranteed. #### GNU Fortran @@ -140,9 +138,9 @@ While the current development version of MODFLOW 6 is broadly compatible with `i ##### Windows -On Windows, [Visual Studio](https://visualstudio.microsoft.com) and a number of libraries must be installed for `ifort` to work. The required libraries can be installed by ticking the "Desktop Development with C++" checkbox in the Visual Studio Installer's Workloads tab. +On Windows, [Visual Studio](https://visualstudio.microsoft.com) and a number of libraries must be installed for `ifort` and `ifx` to work. The required libraries can be installed by ticking the "Desktop Development with C++" checkbox in the Visual Studio Installer's Workloads tab. -**Note:** Invoking the `setvars.bat` scripts from a Powershell session will *not* put `ifort` on the path, since [batch script environments are local to their process](https://stackoverflow.com/a/49028002/6514033). To relaunch PowerShell with oneAPI variables configured: +**Note:** Invoking the `setvars.bat` scripts from a Powershell session will *not* put `ifort` or `ifx` on the path, since [batch script environments are local to their process](https://stackoverflow.com/a/49028002/6514033). To relaunch PowerShell with oneAPI variables configured: ``` cmd.exe "/K" '"C:\Program Files (x86)\Intel\oneAPI\setvars-vcvarsall.bat" && "C:\Program Files (x86)\Intel\oneAPI\compiler\latest\env\vars.bat" && powershell' @@ -268,24 +266,24 @@ Meson build configuration files are provided for MODFLOW 6, for the ZONEBUDGET a - `utils/mf5to6/meson.build` - `autotest/meson.build` -To build MODFLOW 6, first configure the build directory. -Depending on which task you use, meson will configure a debug or release build. +Building MODFLOW 6 requires two steps: -Setup a debug build: +- configure the build directory +- build the project -```shell -pixi run setup -Ddebug=true -Doptimization=0 builddir -``` +To configure the build directory: -Or alternatively, setup a release build ```shell -pixi run setup builddir +meson setup -Ddebug=true -Doptimization=0 builddir +meson setup builddir # for an optimized release build +pixi run setup builddir # alternatively, with pixi task ``` -Compile MODFLOW 6 and install binaries to the `bin` folder by executing: +To build MODFLOW 6 and install binaries to `/bin/`: ```shell -pixi run build builddir +meson install -C builddir +pixi run build builddir # alternatively, with pixi ``` **Note:** If using Visual Studio Code, you can use tasks as described [here](.vscode/README.md) to automate the above. @@ -351,6 +349,12 @@ Tests require the latest official MODFLOW 6 release to be compiled in develop mo pixi run get-exes ``` +Alternatively, from the `autotest/` directory: + +```shell +pytest get_exes.py +``` + As above, binaries are placed in the `bin` subdirectory of the project root, with nested `bin/downloaded` and `bin/rebuilt` subdirectories containing the rebuilt latest release and downloaded binaries, respectively. ##### Updating FloPy packages @@ -362,10 +366,12 @@ FloPy packages should be regenerated from DFN files before running tests for the There is a single optional argument, the path to the folder containing definition files. By default DFN files are assumed to live in `doc/mf6io/mf6ivar/dfn`, making the following functionally identical: ```shell -pixi run update-flopy +pixi run update-flopy # uses default dfn path pixi run update-flopy doc/mf6io/mf6ivar/dfn ``` +Alternatively, run `python update_flopy.py` directly from `autotest/`. + ##### Updating Fortran definitions Any time a MODFLOW 6 input definition file (dfn) has been changed internal MODFLOW 6 Fortran definitions should be updated as well. This can be accomplished locally by running utils/idmloader/scripts/dfn2f90.py and then recompiling. This script will update the appropriate input package Fortran definition files if the dfn change is relevant to input processing. Updated definition files should accompany related dfn file changes when creating a pull request. @@ -394,33 +400,33 @@ MODFLOW 6 has two kinds of tests: Fortran unit tests, driven with Meson, and Pyt Unit tests must be run from the project root. To run unit tests in verbose mode: ```shell -pixi run test builddir +meson test -C builddir +pixi run test builddir # alternatively, with pixi ``` - Unit tests can be selected by module name (as listed in `autotest/tester.f90`). For instance, to test the `ArrayHandlersModule`: ```shell -pixi run test builddir --verbose ArrayHandlers +meson test -C builddir --verbose ArrayHandlers +pixi run test builddir --verbose ArrayHandlers # alternatively, with pixi ``` To run a test module in the `gdb` debugger, just add the `--gdb` flag to the test command. #### Running integration tests -Integration tests must be run from the `autotest/` folder. To run tests in a particular file, showing verbose output, use: +Integration tests must be run from the `autotest/` folder if invoked with `pytest` directly — the Pixi `autotest` task can be invoked from the project root. + +To run tests in parallel: ```shell -pixi shell -pytest -v +pytest -v -n auto # from autotest/ +pixi run autotest # from project root ``` -Tests can be run in parallel with the `-n` option, which accepts an integer argument for the number of parallel processes. If the value `auto` is provided, `pytest-xdist` will use one worker per available processor. +The Pixi `autotest` task includes options to run tests in parallel, show test runtimes, and save failed test results in `autotest/.failed/`. -```shell -pixi shell -pytest -v -n auto -``` +**Note:** The `-n` option accepts an integer argument for the number of parallel processes. If the value `auto` is provided, `pytest-xdist` will use one worker per available processor. ##### Selecting tests with markers @@ -434,14 +440,12 @@ Markers can be used to select subsets of tests. Markers provided in `pytest.ini` Markers can be used with the `-m ` option, and can be applied in boolean combinations with `and`, `or` and `not`. For instance, to run fast tests in parallel, excluding regression tests: ```shell -pixi shell pytest -v -n auto -m "not slow and not regression" ``` The `--smoke` (short `-S`) flag, provided by `modflow-devtools` is an alias for the above: ```shell -pixi shell pytest -v -n auto -S ``` @@ -450,14 +454,12 @@ pytest -v -n auto -S Tests using models from external repositories can be selected with the `repo` marker: ```shell -pixi shell pytest -v -n auto -m "repo" ``` The `large` marker is a subset of the `repo` marker. To test models excluded from commit-triggered CI and only run on GitHub Actions nightly: ```shell -pixi shell pytest -v -n auto -m "large" ``` @@ -593,7 +595,8 @@ After running the reference and comparison models, the framework will try to fin Run `build_makefiles.py` in the `distribution/` directory after adding, removing, or renaming source files. This script uses [Pymake](https://github.com/modflowpy/pymake) to regenerate makefiles. For instance: ```shell -pixi run build-makefiles +pixi run build-makefiles # from project root +python build_makefiles.py # alternatively, from distribution/ ``` ### Updating extra and excluded files @@ -607,7 +610,6 @@ Module dependencies for features still under development should be added to `exc Makefile generation and usage can be tested from the `distribution` directory by running the `build_makefiles.py` script with Pytest: ```shell -pixi shell pytest -v build_makefiles.py ``` From bc0c78cd7c39205b4e667cedf47b4b479905c218 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 15 May 2024 21:14:20 -0400 Subject: [PATCH 164/199] test(ex-prt): snapshot testing for prt/mp7 example endpoints (#1807) Store endpoint snapshot for mp7/prt examples and compare in test_prt_notebooks.py. --- ...flow6-examplesscriptsex-prt-mp7-p01.py].npy | Bin 0 -> 486912 bytes ...flow6-examplesscriptsex-prt-mp7-p02.py].npy | Bin 0 -> 55680 bytes ...flow6-examplesscriptsex-prt-mp7-p03.py].npy | Bin 0 -> 128384 bytes ...flow6-examplesscriptsex-prt-mp7-p04.py].npy | Bin 0 -> 7040 bytes autotest/test_prt_notebooks.py | 16 +++++++++++----- 5 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p01.py].npy create mode 100644 autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p02.py].npy create mode 100644 autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p03.py].npy create mode 100644 autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p04.py].npy diff --git a/autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p01.py].npy b/autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p01.py].npy new file mode 100644 index 0000000000000000000000000000000000000000..839d2bab3e270de80da185aefae59048e639c1ca GIT binary patch literal 486912 zcmbrnb%0jI`^LR=3W%UcC?O>!0s>NpmhSG9?k)vUl#uQQ>5$l^^Lgm*ZUh8D1VlhU z-?{GdoIN=2_kDje*X}=$y8@q`>&!i8=AL`58DF_prK}fL>Zd)L8*6eB354!j0@}D2H?bx!ze}B-WoAxKVb?NcnKhdFC-~axg zMXL_lKhm#rr&j;{Gu?YM>(R6Oe}C4kRkQA$JN@TpJ-W5(pnmH9<<_C!+U0xS^^w2e zedqov-go`}^Zz*)VOjg$_pJ9q2Rty!lgox8PE!hD{#OtTK%TdALSZ_}(xEA@Sr zJOw_B{AgkBm+5EW(4UX4eZ~lV?|sy7S?KC}uP-~Pa$Wu?(~zK(W6jKm zi!SVRw#`nN>vHrSj{E1HfAxQHJ&yP1=7a#=&%IBb|K9l{&%TUv&6%TczkC&RGF*Hy z=-$1JPV{WU-aT)@_x@e)Gi6No7w~?cSfSs?`~RVD!}=#%SvFp_V~%|P{aUAT^CWer z#*c71C;eu}fx$)HpNIY5?GNF?yno-6pE-Bj<%P%ZbxMusaOYylwJvW!gmZJj^j&Gw zmNVw-?K90>e}AuSv*S0}>74F! zH&fRpK3_fkBhOCOFy_Z0`RM;u5^i_KJ{V9e`Rmm#Pw8JI{@M9mp4K+z$0hlA&Q05G zasD3EZcC4uJ|A&WV?;e;ems)@q3Qt7Yi@Em6IMG2|Jyku9MvsT*FV+3m>-|yBg|L6 zvoVtYEl7oH1u(#V5pWXw-M^27J34%mM~BwzlSA>q!gW9cuxNYvPvpOED1?Z>!R zFPnY)-y-??^T+u2{^_;W&p#2#|DXL|jl;J6KQYPwpYgBww(*~Ys)e z=RcduC5)c!)0NiqpX3^UfFU3K|IPW|lul~m^Z7*M`JdM=uif6~rO@x={eSOMZ@+5o zu;Ei5Nq-wLEa<4WZjtzTBaGYc{kz_$#}7B;|COcT=-UhKI*(6OYJTjypp!B7;E5%Z zna@8xuGcP)KgW=tM}18%a@#4dgvhM;`5JF3cc|cI>-Kx|Pg{P8rnioj`S+o4w@6xqf&dEy6 zlPp&H4=k3ias03y)_iaN>G7)?@{c~Nar5rrht7r%zWwdGYX2XL_EgAU+G4h1e_hp!uK&?rh1*;4@!mT&Bw*csZ~p1=vlzC&w_0c(Tyx9$p?K3<*OdM3>{JyRS^Qk3VnzY0H=P7QErkHxwVso}c2_$DcRRDk2JLB zd-G3^ZyJAUx?k|4`8S>CHEu4*rsD7S0crru7PRhv-u%;+zop0c6#G)#aNdtuJ5eL0 zf5rSi6#t}#J>Q#u+VZi^U3%e~bG=`(mA#ezc>i7QYR~uPpB~@z{ey8Y>}{97Ugh7g z9_%z_yS4uM{L_?={#Lux6$kU+xr2iahRtIc?c-0Mf12{q-oIvCa&{h=Tl%}N-SNL$ zS9|`uq4D0+-}L==waTc;+m2mzFb^uB#=p7+!}onR+dlr@Bl-IL+cy8|z5i2?{85uT zCEeWMlH|XhD*b;_)9+yk?BBodYkaRidcU9d>CKZve>_ZOS?3;}dDW?|CP4j_{)qpk zKiJ1#N|L`j?W%5Lj$L-tTklbG6@O*cJ$e1-OnZJRk}vs>yqBD+>Op*};!lO)^$RQQ z`KdL&>H8Ps--Wan<-Jo`<=-(L%-U!le`!d*3cK{#cAj?I*Zlxx9e(A{b z4)P8S2D#(knWpyqbR-}94jHSRllkuxr9bBXC%&`ir`PzVMhI2du)o}W$Qn~p!ox1Ni8 zR_34Gl>TZt7T)F;`}oUF@{w=+=*ekW|7}+KBOf~Mp*=qb$w&W>f8&&!_fh(*;b7DG z7xw&|8s9YjG5?sJ^pvA^U&l}B8Fa88m^i-u^Up={7piUk0!dFg=!b*42PF<#6td@k zLh`ZCn*Ygh2YJAfYTb+Zf7uT9{M;JfH2yK~`|!_`Zu}|zF(022$Nu?$O7ijk?fc?{ zqn3TWW-0yg`{c@K&(A~h|9pL_PqmB3ovaN<2TCjb@jPaiu;=I1_@?6z^3CtvI4SiX zx0L>f{~IxOS?3?}k$k*=2R?B1-=_4(^WX56J^wS3kGhMNCyzVWhiI+z$M(;N_w4!k zHNI*8$9k*i)nk%>I@`&u!)Z0uKK=@jeDwe8U5?89Cte44{h4yNJ-;By|4I$KH7Xo- z@cE=o&_UTtjoRN{U$Ve4 z*?&U+M}Hif);|77U!4?`V9}@dxYe5^WDU z$iscxDk%G~N#D1B{>4c?<~>F4?Q{2?ngwMZuz`60l_2?2cQ(jWaH5U}T$Ci$p$+yDJu zdH<2`MUlcRYGuQ1$%xul8^nr zU4O21un)SePSC;lcW{~g^Dj^Gr%jzYb>rGKQun&Bn*07Ow%ndyf#l<_IYU=V{r89p zLCM3cAovwYzOKKL|6<>0_Rqf($=CJA`fEGEuT1js*WT2BZ-x9nM2l|U{wgG2*B^O^ zEOqSpUcS|K{-^7Y{m5bjzZ%(oU4PU=)gt)SNj~ZyYPMSC%qzX_NypMbsY7{pg?;?j zAo+OTu35fP>K`f<3p#ineF=U|l8^nT#!Htw$U|f;=+3{+5&T*tU)Nviv55GqP4ad9 zvHviD;MXDfy8bu^6;AN$l6+l%><6?X;;$ab*Y$@Ug9v_olCSHJ`OjE_-+<&J?-vnR z>YxrdMjm(m{|T}G-;m^^?j`-x#ZvcrA-h}u{0+fxMDj8Je81=-$$S2s$<05WAoz_* zzOFyk19yq|YeMpM{jvX)ipakyP~3d?NmulYCu&oX1#8@LQ04 zU4PU82MNAcZ)ZFIQ{_&l3d~#}^}mDD2IU+^s-NxWKds32qu!!$(w}7Cp?b=o?1MEX z_^nAk@?No~&6B)ix@19Fht4ASUy^)Xf8?Kf5%JfCvQ{$n=5Z%guZ{Zan6o8Y%2 z`MUl%hjN05zxE_w*B|@OR|$RxlCSHJ-{(HT?@01d_dhA`T;~h54emPQ+gilCSHJ^;q<}_WJiE`MUl%|Cf;9_agb= zr9L-J_Wdio3`qT92O|D@lYF(@J}`IO6nEe4X~01~a00>i&YRiJ|4{evZktK6|8!36 zyF-pm1ivrYeqDdr{~+S8AIaDC$9$kJ!S7GxE2a$YTf0P4cB=}#Ee607n*P9^u-H_Z`XC^~ZRWo8S*4`MUm-N{;A|pWuH_@{xDWGkTPqzr20gt-H%X z#NQ7jU&h~p!^Q7r(b0ed{fiU);UpjP?Yi-YIe724*&mQP*jfaC1j*O+M?F$F5q~2| zzOFycq3k61qe#B4Kk6?J5&R!XzOFycLlh?BZ#2o*^_Trmf-wwdfBjMfe=Nzz z>pxrUq2jxkH5d>d%GN~ujU)M3?=Q$cSon9h1mqkfHe{{w!V>5FeDU z3H}6&Y?aa;%^qo*Y(H#&trl=o8;^IWBmDx;LjoXy8ak{ zs}S)wm*ngEBOI#|{COl_*B{TnI>Db$^1*9V{DmZ6*B^dle-rVyh~(?~-yt7;y(m`3CY*>m-B!`{4FKNuzNbISUlT>X zr@#CjMEtFdB47Tx(x2srN0IO8&+;Qe{1~B6)B7iI{&xGqOLFdial*BZ{B?Ez0>%S$$_v$|`g}(QmkN4@tN9cdcd;il@_r>@88|DAnT74}nWADGd zRpak7}D4Q;$ zaBrA3b_u-~V@!e2g-6cK_m_4sVXqAAYbc zo^G&i|89*xC-lA7ZtqiXKf*2XiyIE?FSn}xhxhN%T$`-@7vJC8>iOgT zhi^*R-@mX|*>4?qQ{r!!^54bt`0$i{|Mz%a{CnSfx_h6x{>cCJ=zLxLFOn($ zOYuLtW8eSxYwb7f|9JncOL|RwFRu&?I%+t$IQ6`J|35(T@z9)eU4Q-l7u);qynpu)$;bGUCiNB9cS!kg`AU)8~mVN&a_?^1sCSzZR?Q@1HqA@=&cbeqGZ)0aC*Z;V#dj61Xw$_Wbi2-?aauza_tWPU?@-DgRli$Le9< z|1XeyoIl<@@~rq@OjW*nSpR0KVc-8Rl6>rUed3&v`lEuq-1vW)*}ngK>wRzjXWIYa zx0Nr=Ik|V?n$jQNXMAA){<*BR-;|I2u9&}^an~Jvg6_SCi|ym@ipDqX|5)!WTzlF* zcc}Eo{IgyI`~H8G5uxKrGxDG z*EN3C(D&ZB<9+Jm590l|>Zis3p_qz4tV56OvghB>_@@02?XQsOw2XV*dbsP)pJUng zzndf<<4@_+C*6H-#r4Y?4SQ_lCPHA#d`L4{iow9|6%0c%Qdy<-_iJ{{U7J;%2z%i{s)hh z{^0N5V9)=Rx>k1y?&_fG3ZLH8b(toHgpBl)<0;n~jz9ppg0R8u{Vz0rmeBX!xZ{25;}7nA?6qpI?0Ym(`Xe8aaf&_vZ;fx-|GZoXalKjR+KM@#M7{}0KR`>w;+xOx9-ZvOAVGJF2NBwy-Hzg;bP@A(zn``<4u zx95k25yQ2akzw}FKN`u`^+!EGgJ|~r=p}eaPrN95<}~@A{kABwzNMTCb9M-#4Y*{Ll6k z_VE{ot{uJ4WVf5v<)(<=M;OG5H-|Ly(17R$QxH|76~I`|6&|80_w z^LKlSEpp()y-oQ)WB&WyYWwylCHcDkc>kOr;_n@juj>yzTF0{Qf5}L`u0QsF9~1oK zBwyDb_1}Yt_-tMRmf*if@^$@Df7GPD{qs*j^5vMttOb&H9h26*|M;Ud_VM>V z$;b0v`OZ(0e{7=spHYt%LGV+Od>Q|z&y)N|4(0!h{I9dtzWu34zOFy=fjwf|KmXJu zU)Nv!e+hmXlCSHJ{m;h4{jVR8d|iK>f7(sN--je$*B|3=`UdvTKP}1E^~ZQPfZ(Si z`S4phly9#1FTYU!&)ARJM#Nuwl8=1<$=$Q%{?VZ7cc=&dB-}p!Gmv~~Z?TyU;%=nM zd!Qa>2EqS`uNJrogt8A-mbKh`4|;@bEBOe9~|AJ1U`!Ou+cb^XQvjEKK1BwyEG z^5G5b_0LN3b^S5^G$i;RlYG>h-Z?)_e7|bE49GoTuZj4}M)J|$3Qw3K`wl6ey8h2K zBkaeY>?9xS{h@6qN&WxT-vhG#TuAV9kbGT#i3cM7a*}*qf7GMB6VJZ?=OX#K{-}Sc zP4GV<`MUmC|4$?0FE`28^_TTG!T*%x>-v{hc7$=%KBR5_IS83O3t0%I~{Ov9(*Pde?>?>{GP^tK3vW{Ej#MoKXHKI7bW>B+}F%ZFih58 z9rg#@I%I-hjO6S3S5*ZV>EqkKe;ksp>yQ2CG6cUk$=CJAbp&k*ehHGV>yPu7i-`Cu zN%D35<^Df{Uy9`G`iuWA!7oknvHw>*&QOWJ?7@Ke?xa|6KmRC0@`F#+hF^}sj_d<$ z35fqvK7wDC0+)1YnAXX#zUyyuVfAs%hMEsQ_`MUo2em21`Px5vB zasF=|!LLB_b^S5_`-_ObiX>mxAM@~djqTq*l}Ns>zp?{pnTp_7CiysT{c?A22On+K zzBlHBZHV}*Lh_OCKk-{PIe(Z%)ji_<*O%Z|CHYc+I;n#rzUT7;4*VyE6Z~o6Ym$6jf7CyJOvGO;lCSG8=g|p%ZIZ9+FZ;g) zzYfW-hy~yI7IN--f%1Pw98MzQuP(_){bjgQN6y{1m>h60|C>$l>ydoqJNHy5>Yo1} z>$ZO(!LLv9b^WpZ_>hRd1|(nCAM=mD2!2D7uj?=Q2!h{;vwkLL>_{u+~fU4P_1 zDiQo9BwyDb<6(7z-<0HsjxC4}WTgKy5r561$d}(ELCAlZ;5UyVAH#5@|1-gF5kf7=k> zJKtyOzl#0d302O!=N{XwaYP5@|BQJ^uFDDC?+yHa+mU?uZH_H>O7_2QpY{1NFRhfp znBSh{%X!Zi$K~AfpNZE-wjcd5<YY-Qy5Rb+P4?T5y0EEJ;~Mijl6>sH z_Ha&1-9@ALe)};Gn>{V9F~1YZN4-nVWG98Qqm<8wFTjCx9~<*KlYHcR&NR3v=YP{3 z_VrgkR!%@Mjrm>_QMyq+J;od{H`P)>#Z@XPPx7hLw!E#F!JQd zXw2_M@@J{#M}h&z-1FB3d_Kmdgn_)q{O%+l^ZhbSk4oNoL0zBk-V0LDnBRlszmE;? zG)KgDXKOE?k8@~oM;0;W_ayn4|K@yjT%LcDEC!aCDcNF+%KJZo0AI$w)r@H%^t0 z2>IVYsM`S&CFs5k9@;zVTokq;~MJY3Ereei7_ zG7n5F@GS*$NR7K zj|U^$FZ&PqBP0*qZc8a+{veW%ILrH~AAit4clHRmhw;hlLdN{BNIv`y;$`#s(*NT} zI5PhjT-2EVHOa^Q!|UGQ2 zt{>H~GRFMxNIv>sw;hLFj(Y#2{w&tna5)E?@@I4YFp^(F1zd?1{`>>;!A$$Y#Sb`s z9rO76p5(*-r&9(${;(fCcV4*r{Lh+?KR<-{p%3H!k9qF(SU22rcm0D7=6&mv*x!FJ zT;uNx1(+9i-lraa*#6j+=ej%I3~>GT>fN&Ek0AN*|44b|iuhmM>F4^-bi8MO|H4R( zA8y!w)SEnNe#t@I=div(@j)v5*#7>7Q6avkuW9}V{EeIZ_aD}sT~~+8K3Jw|=Ht(g zTKi4MU-I#H*pI)XHNI*8gWv9_8!yTElaf7M|JPY5?VtY`l8^eY zx8hxq`lsxD-23NZmA2=P)%d3U5980Q7Z=3$c~~!3|G8c5``8$X3sQ!;Soc+Jp-@h>8AHPx(Xk&wq->H+}v{b6%f#N_>afbPl@pmznMLpGxv&{d@0>JpYTI(?~wrUoYor@qe1H^v8LG6u0c#KV9RGG>kv^-TXf9r1;MrRr;eGe#+bS_Yce< z`Ivuvdib>5J8@Czk8PK&5A5$>m`U=He|o>cDVgu*>K2rHK;z!EZ~rWfZ|eV!`Dcz8 zCtd%mF7EvcsqWd|e=u9)n?8T|udcd%Lgv47I=cO@ZfAS_=a77?|67+m?qD8Vpnd56 zi3ofB=W2XY{jvTTvg)Y#j!te9bnjgx?w^>a@lEx|{TpHVPsqI=x0U{=|16Nh{{D^m z8sD`2U6lb}jeW;t{?SC~kNejul(F~!|4HMU`j5l^cHDy_a{tRArN0V?A|F?`_y1p@ z@lD&WhTpk4wj7uB*V~=k{@;hV|6rlUH*G)aO?S3G=8n5cf2sf3Z{Pk!Bp>7Lz?Mg3 z{Mn-P$9OQNmc9S^VvTRAKm5*yWI8PK&YxSk^RFe@?AyOYKJR)?)1j*O+$M=<^*`NPgNAh+3!T&M3J%2sP*Y(Hv z*Rhs8e*?+a^+*0^Vr_f=Mv|}VkNMDwI`;fcBwyAaZC1JUN2T5UhrKK9`~PN=FZq`> zE8TIgnCpL*Xq7#G3(1!{uT{(4`}YdE@1Ihu?fF|tzOFy^Be%z}fBxG@zOFyYzHY>{ z=Wi$Zy8iHAdm780zk}rK`s4nO^>yv}J4wE-Kh}d0_3ZfplCSHJe8|H3_WU5pNBf)Y zTk7Ut^0@2YHf!wTZx_kO{`*&dFP8Ox!W{1Xe|^^4^LLYctasCvTqOH0moo)rA8J6j zJ%10$*Y(GG^m%Oi=f9Wa>-x+6?{Vz;`$)d7zuX5A*Pg$ht)|NVUfd;S5Euj`Nd zPZ~C~=N}~by8crC)X1KHh~&$;@3{+P{l7e|d;eJb2>bXuO!BecIr`n79PGpQO&N4B z{+3y1&p$%)W&S&Jp6q*;PUf!v-dk_aKT7g-{jvW4DW3iFKSuI({jnZt6W^YHoaF2J zV?0Qgz@C4Cw5JoptN{!Ws7U4QsL{Lt9G{ijI2u0PH_WN%{6KTYy6-_2KGuABc! z6m;N!eu{{{GbCS*nH-oc^(SZJxcQf_i2T=Cl8^n*)g@<2z1^&6LCHg<-)KMnoFnun4kNT^wm#0bIyQT7f#(wNtBL1$DeAN54o;<~Y4_(%$0rwv2P4@AB zjpSp#QM1D&srz`K{GajuTS@S*lYCu&x&PuV`~G)>vw|K|?Dze)0S{pI^a_U-?L zw5{-w{F+4FCad|iLkBTXatw@JRPKlpzW{5vEc=MVEWn&4pEU-fH1&i$m^Y#;x> zl6*OD)oz?4b=NlnQh(Kl;NKvY z;rLYC#P;!bpXBTM-xiw@hZXpgXD|< zvQ9x8DX`}qHhvw_8@f&d;T+$uj`NY zS0VV%NxrVX)PE8D7bIWqdy6+z@*bZC12PXdNyOjZBp>tL+PMZhScg7R{?C#RBls^# zKKyr*{60YH-+x{gkoxD$TkXf+S0rE8ALkK@67lz%ul|F;#v|A*x3`Xe5O6a0Tk zzOFy`ONsak3mtF`{TgAW^?$nlIDdVJ;723*y8d|oJs|keNj~b|oA2u__uh0|6>v}w zUXF;r7$hHl18W|1lltRqO9Kwhqcko$M;&JW1%(VyVQBKf-hm=7-| z;x9JI*Y%hBBZ41?t)AAFkN$0hl?{+R#8X=y+IiAVBv{ZW6Kn&8JL`MUnd!+b*U z6OerPk5#zXLi`68&UEkJ8b!okLXwYs%cBx?9Qg3Hob39~PbK(ok$jxDm|VH2+$9d?N1pjT4uj`NLc+r;j<4;nO zuj{X-zemav{C7ycuD{xTyH%CoCnNb7@9-t_&h-KDy;(}cU-BsO<(Ehh@_#1y??#c2 zea}e$XM+D;6#1V1qQl$v{Xaz%`JVnP|NSWPJ^fjJ$|&+Z{pI&)X|I2(DDpl1S$^s$ z@;&`oewq;9*8d0dj-g>^W&gRzzpEY5LHR#pAAWw9y*HxK znn*tAMTTcH=6^`?G5>x%;;793GL826axc;XbN{=vBp>@NUq+mjaevbXJ|A^Bfu~80 z+nW7Gr*Tk`JHjx4Ry5eJ>(>zS;)vm#kABV}1sb55JMR zz0XPgd&d$!AHJkF7bG#}e?;=(zg(dAN%7seyVU379*_b5W;Et!B>C`v&5`-IgL&VP zYd&A>uUq6c=4T@LSpEclI3&I=eb)MX$%7>{_dm`|@{w;USn+`5eUcvY`S9hg|4|9! z_Gcma(0$vueGZ<(sCzyidGKwcOB?gEl6>s{*1CLH>b`qj^!Z4O&CK<=G5=$dFMb=d z4$8f2@m~0RyMYdn&A-O~Szl1rz z6v;>arBr`E{?H%Sss4xA=ZT)?<8Nt_k9p?Vlm7UF_g_S+2w9JBC}YkqL-MPu4wp*J zzrygP#vk~>Eq@m7`k>V^=a(h<;y0rFzdSzT;hTR#_g|bgkH0TSKJGt_+5SKzA9>f{ z`Ec0}j(NtMUykIX-ZJ6GM?Y_T0;$1CnK=`S@3nar{{F2J;ztW}zxIVb zLqGP)^TNFSkxp(rKd*6@pe~12m z-m<^{pqj?FX@9*1=f!t-ao3=m2O4UB|3Gz(Z|eV!^B(V)IV1j$<&^(6;%{3jd;j$s z8sD`2nD2gg{(|^l#8b~7{<9s2*gyZ88sD`2IPaG9&M61|eo%Y&{(;Wp?fvg-Y5X~c z{U7%~{Qm5?%s193|68mFpZ2u(f3L0aP1}!nD|O|x?0*gK7?gd-Zx-6OzYfWl^R@|3 zI!L$XQ~Dzxwy&9e`|E0aQ~lxpneX*6$v=Om^vAx#wCMK!x-9Ns%9 z`@iv&{-{R?&PyOrm{^QLxzG?eqoAKCTY4y2_R*UGu?X3GB={qM$7dwy$@kA1I_o7Omz@2(zneYls~^S>ndSbuCC zzFPWy%8Ks&7mHTf^V^VoU4QKRz8z+N{;Vy@*Y#Ib4=pc7v*))X`MUnH{)%DGZ%^`d z{c#SlcrAN=2a>PrFLeO5?fD%^zOKLcP}H^OcOvMbL^H=+o|1;hL$=2BOyO4aTzhAdp_TOeG|7YAgymYNSzbnbt^#}jsSoY7q8_C!8 zSJSbk5wY$0-ATT#Km13t$F=A8Ao;rfm=8awXV33R@^$^;2UNR(J--*p*Y%gOgNF9} z-XtIS?xaVS%KER9@_)vDNahIp`0GRRWxe_DV#zxd$>I7hk6dTZ?@RJgf0pTsMRM;| zg3LkjLA-uBh|7(&j{<8}gI7mC5QU1>;dwqAKef$k3`Lf=P3VY>_6n)WX~T$^5uOucb=U4Z>#*D-%}f~B{$pizaja${#buxf6M;)4<-4! z{-{UIo5-I3Ey>sQN7~?%#Pa35=mb%NQ%KsVj&v&=l^GA?;@mnf4Q}VAH zmH#v95q~B4BT2rlKk853Nn-!}N0EG8f5hWeg8w7Q*Y(G_w|Q^dw|_Lr*Y%fpY+=tI zL-KX~Q4hJKr9FQv$=CJA{HtLrd;U0*FXv2eOq26>1C{?X@?rD0*~kBQl8?IcI5Vb5 zy=$?juK(&6+wJ)iNIvX0I(3=k^jC!d(H;h59K1#FCz5p0HAKJ1Vi0VkCjkZ%+GnIs=|M=QsSk^R5o z%KsUDD0Oz)w|^GN*Y!vIy(HpqHp$oZNB?h^%)bB4A^E!g2UYp^NrFF@w5Jm@eY z{^pT=D$_i*gyZDNWSFXrjBy!U(N(%A8I2Je+x*yoHH&yTvQ4)T+>_Wf@K$w$7Wb;6+z-n)f@ z0e2soh`*I2AM2j$xd%(#?Q`Y-jQfyI68xV@KI(o;KOP|Ue-Y~fQimHmXg~g~BKf-h zxc@4~yY|n2HObfYm-jKjUqkYB{l)f!;IAe5y8g(=v?by%oaF2J%l#JwKZ4}z`a_RB z1b-dL$MfEEu(zB)=(Z{#^Po?N_*+l%vH#fkk8YCx$))_CQU6tq;BO%LSbmkA*+I^~ z-&g+6n16OA_!~*Su0QHgM-lP2iRA10%lnYvZzlP={%~E}NAS0hd|iLkU)>|(Z!5{y z_5Z0$k@#`i*}s3bk$hc$tVh!k{Ou$k<ye)_`a%Xz?vg2w!_Bp>Uq+Re_$`PafXeEm^}TI1$>#{6?6A9cU6zdr8z zZWQv{Fa57$PGkOgl8^nqIGvA3-R+Zh8h?ek|Lg^lk9_08p8Mt8d-ifZANw#zCYLa7 z|3#9IdcP@!_d3vFeRH2Lby;thHRfL;`RM0Izuql=M_c>(d>o4%QPJH0<}%5L-$ja! z2b>vd8TjcN&tLXIbC~<@ULpCoW*{u*J_q3z9O}1U^lxVF|9O?~u0Hb(cN&`+S^(FVxxG|Lj+ikNwW^2i<$WuUz)|;{TYhy7BYBOY*^q{`YPN z=Pojw_xWmC(rep?=I@_-Bp=tjOgp*D!95txA3h&>;A-DjHg5lKBp>I!HXjbU_pZlU z>+;n42fi>(ADBP?`y?Oly^}F_%KmqoqkjA0!{n_S~&mV|`C_mIS=07C)C_gyxY^RJrCI0mJ68~4t$G<;FKH~qI zf;%1DySgu)-~UjDGqJn*^M6G0A#>IhJLKH&%5*+o_GQl3HrD?!$%oJXqnJVQy}p#n z=ga)JLv>^R6OxbToS;HL{0}$e_W97I+%GkZ`G1mpod5qNZNPyK*qw4dU*_M3&HYcG zl6=g+S5?|3{qKu6?mv}e^Omh{ z{;7h`m+^0hIsZAyPoo}mmCQTj+})CbK3~=&pPG+3?x*`Fx50CFcCU zNj~-)pLE*cp8M(Q^WlTDtAKg`dr9)K{oC!Iov!a;bDs}ioXbC%kH4=-KJpHA61(?) z9~|WKu^u~L)O`GXP4aR6qVbEJZk#FqZD1?6iVz>P>3^E@{~`I3=4iIfnN)H_hs+)P z_RIY1wR!ygOY%`~^~0rYk?n^cU!xu&|NXoTjmIA^v2L4xmpn(u?U8)E_w$vBaHKA_ zyE#8v2yDwo|6j9sM`^e_|zat;q>rS|XI@s~o%*Wq2Bp-R6m*G1jpFi@TkCR1+ z567Mu=HpLXl8^nLW+Qz4aSp88g>bhY);5p7cqAYD3_oT&7TJE84~z>JAKb>}&FA0o zNk05WPNnzn-w^*1_586f75Bb*|4%^jvCgc&&G)}Y9xDCfa959gHQY~w{m+CUzPI0M z>OU_2dk4;l|NGE(uK#lO_w4=G-y+)&ofoh5+mHIESL*%;S%1AUfBuQc_QU^m(KqMC z_aSyC*Z;iAczgf##2P<5%>4>Y3&On5&>su^->@*$o1K|>Qv6q=wGB%B|H7m8{^LnB zzUlKv{$c60lT!ElZ)?~8r_4Y0&;M%C>~|NXAUH*LSvJFYt>>)-v#{~7b~a=+R4zxOo0Y5QgWKgA*0|8J=D$G-oQU+w+Z zQ)qls|7)DLSoq6+*LO?lk9vrPf7$zAzpwF4{jc%_>VNR=cgw5y8dzxLNxpHXK6^j zu0QxyW7zXQAo;rf*oSHn%bx!s$=CJAw%5a2_WZOYU)LXb-+$}a^V5-hU4P`G|Ey=v zPfzk?{ndGu+<#uFOwhsl?@TNE_{%`@vH#b8=Sl~@PiY+Y{(}o`?fD;(d~7pR+_qfK zz28&*&zO%bQ~4nD%gYw;|BNJG*B|-lCUNYaeyQ3eDxN(*Gs)NW$NdLM6WH^! zkbGT#*$-}D&(BKob^Vclo6*Rg|1rte^+!EWl_vK5Y$RX&KTaj^#V`8h~F_Sw!X2io&L zBl$S~@$RB|;yX53`9CB7aQ-WMetwd#>yP^o3cPLq{0oqLU4QKR^h;{bFG%ur{So&o z-m&L@PV#mAQIDLml|8=@$=CHqJy3<#_WZ&mU)LYwPscCq`9(-R#@p`BT-k4|ul%1e z|Nn4^ef$+A`KWVAe15j%UsA_)^WT|<+VhK%eB3t~tJ+Md|G1?5pRxa*{5yNTL-KX~ zu^+fInf>!GPV#mA;eW9qxjnxG$=CHq{^6&0?fE51zOFy=f8E>I^GlI@U4PUAG;V9p zFHQ1w{bl{r&YoX}0T-GwuUAILto&%94D{d!Edl;^zOK1|{L7PkU4OZMBZWP`0?F6)udWI| zFB1HUBwyEG;<3Gb`zw)rU4QI=704&*tfq5$w%FNn^qI#{J}Zp|BQOf zXCv(6uPVvM{mTWqj+1($Ny`5j`=9Yf+4HNBeB}SKO&BBlo;5B7v2??OuZ_SYi$y8c*?-6!I&Hp$oZM?F@%j`r=Z zL-KX~<^E%WUzg;|eP^>>|K}uU-1z&Qh`)LyAMc+NWrmCY^5LTasXtjd+CKj4lYD9a zyTcs0_geWsiyz$>dwzqc@ZZoMb?4WJ_-jb=b^XyF3#GE}|BXn#u0QI4#uEI-QQ^O# zKkBc`sq-MV`R67iU)LYUPUaB&rX*k2-#ZUu+x})GAM5=rNrsC5ap_<{_MiSF;;%W$ zm;8Ue!EXKK)_{Y0(9UD+ex?c!>OOmhakMhg&MEtcP`MUl% z51c%;ef+g1`MUn_pRGjjza;s({-{SR*xA1QZAiYZKl~575&X6!U)NvmA0znfNIqecq)3$wQAM_#H?->W*^E>)@d7?vMEa zslz=^@H>)xU4QI<^e5u46Uo>0$9cqA1iv%M*Y%frXoBB`vw_u(`Ve_ctwuD|3z z2!1z`uj`NVNAGp9AAh@(e4Ib%a=nG*otMoFIJkc#=6L(@rw7SL{Zqp7bsU@n_;PYU z=3yBLeovB*^S(#w6qWOq>BqYK(geR3$=CIVAJRD@{(6&qU4N7#+$H#ZNWQK=jy*mn z_=~i1-^AMZWwV z%Kw?=4~ilm>kjxov;423$j83J()9sHbVy_W{`oqJd{2LtKRAkfPk)v_B#L}bfB8L# z`1>Y`d{2LtKQxMbPk)yGZHOQG2s8D6#(Y0`_zg{_s6`r+tKjJjB%Z(;4%Bhys6jiKFiQA8+_iBM+MPkG#hG;UpjPy$$;gIFP%` z17Cm1%OrG+`6Ea^d?pj^KPCQe%_sYO%*W5p|InB}lH{YGosMzLK|lEX4gYDGmrTxM z%pXPak?&tU;-K7nb0+>8m#6#>k&j4{qNp+dN0N{H*M<~(CI3_KjpvWFbi>(YjQOKU zKGvUGAMBF4zkD&Y_MbENzZ^sIQSWsmf6$SHPM~zHI*T#?OB|$;bO|#FL=-UyjJ{^JVDp`8fZ2 zbj>dDU)@&M=gaTWpT-{jz*(4wH|C3=m9i02?HPPq8 zho#*q^Z1)X@{#X4I%%uif3duk&zHP>Hgo^4xg;NcH-lnsk^1XHeSJQBNCsp!_dlCQ z@^Sv|-M}UXY4GS{eZD;Z*XI6*^GQDZ_CEM+o1DKJG|cDY96-t6%*VfS_k7VEBpzbf_GM_Kw z|59`R!9^q=^`3W5Z;KlYF%Ea{di+-^jHpJ|A^}OO}}P zBS^lycT;S1kOvx*!RMn4_(2!*@oyc;$2z0XXB(ye-6-wzW&B-f&RP6CNbQFDgSNE2l8}@aQ&aZHs^09`EuTF-bQ!)8R)lP>LQyobAK;`{jV(~ zAN6i4hiq~=s{Jw_tq}5G&tcBrO7b!OE-B^v&tpE+C_#kyQHK9&{{G!Y^2O$P+2+Xh zquXt386ox9Gi#W~-*%FZasI0xwng$0_w_#x-G5Nny!|^!KI+YTblw@s|L0VnyL;}2 zyZ-AI^S_-WUwqcL`tgVQqZG=29{K14OU&ahK=QHAlRcl`e&j=P#fp$~01rEx&wqj> zANlw5yM6z8)E~##74BePpwPeO>%UzjAM3yEV|@Q}>^poL2$%KnrX}X{&)p%u=MQY^ zKaKhSFWpYdx%c+U{}}m*&o|rqZ|~9grvA&=XQ);1u*`p)CP5khhQ+b>|J_UKk9E(N z>-I;+pWHh*Gu*v@W4?L*VV~B1Q~jm?B|9PKZ{KO@>Yws0d;jtM8h=ih`xRaL4E?dt zPs75HXX&uxpo4kHO;vw|`qy0v?ER+?X#7hW*ZVzmzU*@hIw!uLy_Ekw)*bWe+4sML z8sD`4;eD55=rPIvz_@@5T z7=K^I443;KTht4>_uw|R_n$sO^0DuhMCE;ue$QDW=*YaYg+2c$$;bNtTUB?1I)vxS z{~6m3GuznnkCA*`fAs(Kakg2Xe>_g|b^Q?!X%gD=Pmp|Ff2q4kV$VNG@^$@XKk{dL z{wb2L>yPv2L&EL(r%Ar9Kk@)cHrn&gkbI1P4SKGUdZQi6{~6<7jgI#5cb4SK{_DY& za_`4?%KsVp@bg{m`R7PJ=G%4mEth*YDtsQ4dk8c4vge;C`MUnlqgitM=YN6Z>-uB- z+4{ac|02oP^~d;oBaJ=(63N%~$9T|Xt3CfR$=CJAwfA#(+ViiFd|iL+JI~l{&%a9Y zG2Z9By41mTcjCOE`vw|F-Ua zd;V>buj`Nf(36Mk`FBXZu0Qf|A04yj|4Qb-?K=wbXEB|N2-`1h_@pqTxW8brP z=AXp({q0miNAl6b?D_XdKJu?kR?L%p-%;iNjQRM0;r9IBNWQK={12aIvw!~gNxrT> z@*zia+VdZfd|iL!!-nOy=l@Rfb^TEXpW~!G{~^iO^+(yJF# z_;dFBMJVc`56U=HWvo5_Pm-_e4?pm~^4LHBrzBt3U;Mv6v*-Us@^$?s{tMXipOJiB zf2_a$xM0tJPV#mAvF{fDvOWI=$=CJA`Xk|0d;Z@fAM4*jkEY4_!<{b!4(eXAj<=7$ zmn0wlm%lEa;^4T&z^4JJJKH_Mp8tyEOPx#qNe+IG0?Pkc{0CG$xb6GrHObfYNB;YD zLHpN@?mo)+s9u_k}vxmJ;zDhue=eE`$vOQ z?D?@sKK326O&R0hxP2St|BU(Y*{SyY*d$-qAO5RNi`qZ`I3!=!AN806i`nzzl6+l% z)Fb}r*z@C&d|iJz4|B_&AD`sw`Xe7y;I=(K0m;|(uc?l`mAYfkPe}5m&UwKoslUi@ zCKUhE?Bnk(k`KK%R2(k%uU=OE&v+kvKi!_6h~!IuOEpZ!oyp4o8TBWnX4vx+lYCu& z^vB-C?Vo=VlCSG8J`g4B`EQeaU4Oa%oZu%V`MUl%clq(J_U(U%v&xg&y~jO6S3 z%l+eb?c1N6j4m)(^1ca`|1;);O=sH2|9d1~ z&UwBbAm`8btP8mN{{%k;$=CH4Jxba?|MyA0u0QfGZwZ(F>mOZz+&}sq!B0iD zU)LY&-y-+y+n<``>-sDE=k%Kiej1Xm>yKl|pQ`iFw)uw-NIvpk^H24bxc_=pz^%KU zWgq_^l6(*Fp4T9PmIhKoA5zWd7m8S!_R;HM+`y8d$hgowZNBwyDb z$9{8{w(ox#NWQK=&VBbK_#cscU4PmCA>uD1$=CHq{ncfHpNZt_`s4V?NB8ZYe`b;| z=S^<4aNxJLQu#mQeGq-N{rHoG^!hf>R;2(@cox%UJ%>d|Fjs%$9#Lsp#SQBxJ-n5 zAMVWz#_e}VKJxwdHXoMtN6v|U`*9CX{=4~&`Nc^-_FKo)-|yDnuJifgKa;M6F~0=K z$GMAQwRX$7%hywUzWCvlC~wR!N%FDZ-%OqRz`FaLWj-JKP%Ymv_rEMf^0D4|Yt&A6 z-+znG7ym;G|I5-OA2z>j?(TN54oDpC^D!H52e&{$oApS>1Uif_RA1r9De+80{@vmyu9diF@?n6Ew z^P;<*%>8#Ol6*Pu5@VZN|8v>ri~rgabN|swBp>t5dyh7|_a46Czc2m2Rej_BSDECC z|JSk|a{tGcdw%<+4r`RT|85nMFZs`e+r|Gf`D>pqd4Z?q{vTCIe$`QvJB@q2MaI9) zZ~6X%@?NZD?*CeiLefSoE>|IvYLR@L_xf?8 z>pwUrsn3_Xh$H6yPqj%t-hW&AuNVK(MOl2l^#4}o{$F)SKBk|^%WW3_@6X=2e*$^P zO@qz-m+F#yod3DHW219W+5Nqf*Ka@8MS~|cGLFA`Bwy;^MsIL14vsGG^VP7F^qVf` z{%7?`KE|Ibjkd_S!%iiAzRW)xnZJJ;kbISPymjp2CfR>^Ufbv6`hyO2%;T>i$;Uk7 zhshfq^H%((wGCi%GUdfw0oxqtPy z`aU1^$oo<@H|94X`Ots=v~cm=xYOI`qYkpo19N^;l8%4Vq*2(Jq*; zfBvmWzW6UC3>Ux2b~Ajw`2SC9;mC6^$UlEc^6~y@JZ!DxTW1A)KGwynK5l8uZ$t7i z#Xt&D#op7?x>i|I$0^V^bqX@6?h@3Y+-&tK;M7n>Wmza7cP`r8>BE_D|}Zusq& zI^3@2&%Zs%2WQ!ca7TO}-(KssSNYG&`)7|izXQp~e#i39-T2#f)o;J-gQPXrzaz=V z`18ru2zUM+!*4(G0tc3u^E;7z%s&qXBjo$A{-h2Cz$vD zZX_SPpZ^MXFy9_o+;2a8kTa>etT6d{{#7*hKf?6S=%Jr?C;2#U`6$|YiT5uC_q+uexzoeFW!(A4hmHOAV?Fw0 zqB*}8$w$5Emn;4Dmsb;#FV+65%s*3@^Lvwg=w0uI?>~1`+FJm|NdnAvH!3&`ZkxN+K=-{jb4Pi`yt89pZ@@o zkNHRcfbTyp{zr?$B_I58p5B+Vg{~)sc7=P+?+7YQg zUVEpmhs%2C>U#73_Z7)Uz30`xjz#iksA>NRH6N7wPfD5ZKYXp}Z|Xmd{@-x-5M(F3>hpaymggdA=c&~oYf&SrbHe1Kv5RwnSiyzg! zS85tm@Rag@#&je_Cwu-kBp>5%!s)AJ+#6HL_5aS_-JU;`ulJ$@$f7Hj>#CHcDk z7!NWfx95LH@^$?Yf1jqb=MN+Ky8g(AJzrf!p>$KME&58wGg=T^#mFLv>u>_fjAV9y^(@=yPzF*(~<_F(hBtAN7EL@3!ZU zCHcDkSPxA-V9y^%@^$@XUUJl)Kc3`czCGjKQV07$eN`PG@?pomwU56EBwzGSxx}qM z${BQ!_YM4D&!0&0CC}P)k@zp(RsPSo5AEAg_WVgCU)LY|j=i$mKmW-jU)Nvqai7@p zr;vPIf7C<1mDip>mE`OC?!)KO-M_cZ_}f&5QznNUon`|GBR6e?}hs@pyawERv7+-}vx(ZvAocpzH&j znPktOP4ad9B_EmJ{`t>|0{>0@vG3CEb9??=lCSHp(qTo)7qREhBl)`isK>i?*`7Z? z3j87JMC8f&$913)js|fl6>qlbpL&} zJzOG&=2KkA`BEoIMNM)Gz2W&L;Cp1+*r>-wV{Yv`}`{1qf$*I()m@7eQLl6=%3 z|Ndf{)PLQ38F1h~FlDxV{QXSwvEMUr)f9LB_0;v>$uZZSzl!9G-@=ed?)*#nKV$v5 zYMwoRHObfYm%7_B_RoI}$=CJA{S%AI+Vj_vd|iL!V{?|X=ZBMgU4OiPhu*j6N05A7 zf0X^C``w{>VRm_QamQgXGIO z{}rR$`oA*)$^S-QWFLP!Nxt|zRv+%54)}NF|BU$CM(_h9AM4*5X@^Ps7b^c}oV)9~ z*uMQilCSHJ{MWcj_RoJ8$=CGyP|nyejtmJtSY(ALBu~KkfN@NxrVX zdlU>3&=gJj|l!DlCSHJ{y&$9zr!S7*B|+i)K%^K-w~3p>o4cw z3I0)%uj`Nfufl)XxBnQ)*Y$@F+9ra3oaF2J%ek{>_U%7G@@4*czPH@}Fl<#o>MkoS zwI6>@l6*P$^Rk=N-#E(u8Tq*J1pgGtNBu*t6&+;X?}hSz##q`MUnn|A_cIPx5vBkq^2|@Gp>jU4QXEes2H# zFOq!m`TMnntUFfE49GdSILqwEpGzcP{0FMnanHX_4mhZX&rI+ylYG2yleQ=-b>|tB z|1;`;%Mko4BwyEG&fOC6ca`Mp`s00koZw$0`MUo2ef}W$*GayvKkA?B67hF~ul z{?m`(-z53E{x}aco#6jM@{w=Fm*;M;m-&ir)2}izH{?DrXbkwt_;jaI|Us>Is8=SxVo#Z3mwD7@! zNWS<{y%*v7L5(YF%zsGo;lG+@)t*Q`?w@~0o&S}*+{rS={69!O&i`F1>+28Si7c@q zTtCF{EXMptB!5oIT$gvXI~du1od4*d+K+kYqB2E{`Hx9H>J6^s+#AWqKE$kI5$-*7 z7fKuRpOAd)H?$q<>yPzF;^Yx>4l>!w%*OmbNj}bBrM}_oFFtHVBOLL+Nm^oFMkXE=lNeL5Fz8xseKP%vh7WBs3#eE2?HEgU-ktj1sXE*7X3@_%?~e*X9c$w&TkT#H?i?T7Df zs;VLXfo>Iz+y6Jo$ND3pS|E}S-}9#FbXgoF1|j^-7N+y9#6 zg(g_u{K|Cxg>insw2=RY;>-C1_58*Dv%R_hWi*m6`Tpq}Bik?Q@$RAfFT%|IN25oD zzcA##q1uo0j~9AH$a%DKf13OM#vu8qcWK&gi`>81W2WE#Wd1jzo^k(+N%B!|xU%^s zsXr_B#{C1x13yV_?mrrfFZb>(nC7=%#@|Nf{wMKBzKnC- z*2#Q3+ESk{{qk&6E4^EE{&GmnemHdHj741^(jgs~z}orR?vw zU&h}~=K6m~^5L_)Y5Z#OKdimR=ga! zS^pg}kH3#dKJpJc{#hmcuU7`&e^>6`IBL$%Nb)iM#YwZ)!F;<>cb}gQMsT;x_0L4| zvH!SB#UJLI!TY}caxO5RdHXYyd^!K9)_vl;m)~zcd`I!G!D;Ms_z2k#@ zKGF~SQkv_ZmE@!TFnfnJQunquuFseFA7#$}nB*h>5$(&hvi@6E!RO2VS9)`PwkYt^ zseGrrXO;gi($1Z`h5V=MnvZ|kNj}yeGm?i#^0EJx_45b^`(h(nnzug($;bFVDQzhK ztJ**7;i5eUe+!rK@S{QI^S_)VAN}k`f?bjA$9d?L)59I~i@A-=^DntbKE~g#@A&@r z;yax))E|qL+>fy6+GmW=_udEm$6CBTEA2hnIw(GbS^o&P_W#YN@lE}wvCiFf z^SI<+lQsy-`HK}pHdymN)A)0=c6&PL?Zy4Tr|HXkDt@-&$KJpxs)%p{| zP3g)(xd&~_5PNV&kUQa_5YmY>-x)l zG>bjI5XncL|7@w_4t#H(D*tnw|7!S)z5azszTW?l_bIW@zWqf=zOFy&->V(A=NBdU znD^HIW|jEf{Gt4xvF@KZ%wGRuBp>sQoOf2rd~3S$f5!MV9LnoPRG< zC@A}oSI5}%i<5j^fB661%WnVtOOSkBf8@bd<+kUSB>B4js6QyP=!40Ru??foxhNxs~3{A{V*_wq>jKV#XIaH4(ueL?b( zXJ3_Ri38u?nacke^%&Qu*z?PgeAIv4YrjbDohp|lD0zTkGwk{0NxrT>=0iO`w}1W> zNWQK=>aJ=PwdYqP`MUnt2aH?7o?nUN>-wYq^Ws%|er1xc>yLfF{WtCTRY<pDHN#PEDU@&#zAM@xHIR zWuEN6R#*Pd$U9eCV9&2X@^$^O?@+6>{qwI$@^$^OA6)zkdwwmFuj?=S@D=R&wMo9N zKh6W)zGu&`L-KX~QFn9ufjz%2$=CIV|5@M?5$G%&o~b8^AdZ01Co#Z?<}2WO8sLq<^PQL-}Ghn{Dvf7*B|rVzLo5s zeyLc=xGMJi#w1_YANy|Os@e0KkbGT#`MUm6_w>}B-;Ctz`r|yt z56|rR%}GA;uDhd8cktYkz6!`a;3Zbr$6pJQk8{T)M-FiO^NFB`IKil(Lk$hc$oJXu!!~XfVCi%Ml@IT*G)1Ln&$=CIl{ny&|{5B+C z*B^ddbza!>+md`;f6?P_dwx5Tuj`MxySlIJ`Rz$Q>WpLcnjrNTA1nW7>_eqmZ6ALf zNWQE$zZxgLhgWU{9J!BijXl33$w!$-xk0r9oYLeixFj>yPv2RqEOEyOMlef4q*Sy|(9fBl)`in13w!$DZGvulKYrQ2 z_WT|sALl>PhmVr;cVC+Cw0pJSbU`@bgny8fs~c}T?HV3M!vFY~X4 z_VGW2uN{*&N;L-KX~k^k=*-9G+@l6+l%jK9AU{BKFVu0Q5OwPV<~|2vY8>CeT> zy~XeAN9F&Fdf0wM{0$@dnD6%cr<>G&l~(@G$iIaX{O?J=)E%zrAp8HX=LZ~B{$1`q z!T*8e>-s~EWR2|Oe>ln4^~bsM8U%j?$=CJA`fD`7A4&3c{iXh$h`&)JU)LXgXpac~ zk0f8$U(SQav>$&)lYD9a{T6QA&kWtawch^yKZfMXJhOHksrTf+3M3S%TkNv2o zMEp%6`MUn7fBcHzPbT@g{y29wgWyjg`QAAYtUH&k4@muUEh7G=Mv*VShv)xH@TWzQ z@A=<~|24s%9!0*Vzv$4|e*QBfihNIhmOnF!d{2LtKP!rSPk-@0CgN{)6#1V1EPqZE z`JVnPe{P8Hov$+WA4L7rw$8^LX}|K{!+HE}`@`iPnqJ$oyFWKLe>jiiq zSPs5_C0ynqKkRgj`SVFW&cBom-yO+EKJMSU;jaJSr7w*6KaqUA|L)H9^+)?(oDFy6 zb6YlJ{sNMZddu97@4t7lx>`b;NQh)dm#r!v1?!%6o&|LpT zBp*J%efRtNi~sp;*AMH#tB;NKUrh3`-`ae%ufO!a7$N`Ham9@JOGrNQ&7alu^$$~D zbCN|kvM&9htTBHn$rr!n=K+_a#viOd+CB*vKb&Jp&HZPWMS*|h@s3D7+Fj^nxcIQ% z>0ZOQ{mV(d_;0S>7Rkr{XIAz6B`-O{+<$Wg$yeJ=!xpM@uVMI7`lBABc>D+lzFar+ zRdIiAF#fM3`B?8XcXqlQ#m70AQSXHO-yc^u=KoCc;kTQ)c*4`fnv z{a2BE_&m-3(bpfoAB)pPIC3x6sLICeUrq8c-rpGH>yQ1Hj@cvRJXG;9=K8N8`QkUe z)7Ky8fAZ!J`5(@zW!(O?Bp?0<>t6f*%NTz@RQ><|VeP!btSGu}KLiO%5)hD}1OrG= z0SSW8_(C={U?Q2yE?1q4NZ>*AYu=S_f80)`@wcp z_x(Zr>y5}&(vNumRdfA=Bp>^{? z|BTO1`x@r@ZzuU!ZyjqM>vGlmhx6y}s)p{L$#3p|wS(k~|KqUGxD_Ak(emp3le~N? zbN{oQBp>zu)mFsBk6(PZd##c_l*lvY{9Pm;kNNRKPk+Qi=B^?Cxn<__-)@o*pZ{Cw zW2Nr%{xt9X6aV8M%%A@rk}vgd`B%z*>t&zE7ytd<=KAj?`BMMV!za%>@Z9|eSQqE4 zYp(x3l8<`h{G(&teA_l}{IU_azR}o9lmoDLM?zkB3`mZ1N^q0DX@}Ic#g2DIq5Xr~-_qD3ga_`rpY@vBT z&Hv*6xXqk@nB=40WZc*o_ulzmyz#>aCVzf&{g04*e1H70D`dUfJdrnkED z`N%(|cUDN0_gElLjMV?O>EexF_!rFiCrLj1x8HjyTJl|qKK1xGm#CMwlX3k2 zLh`ZR-B&l-J@>!v@n!${=&{F_`>%GH^Usic_)YCo@h^GMcAoyY z59o)|=KQlHAMbz6?G@rXQ*pUBe#GT6i}~*y$%p>8UX5|^9{!lh8$Wz#Ycw$*|9O&+ z{qOA^D;@kD2ReFu?86h!GoOEcBl*ZPC+Zsd?kfLf)L+G^`)?)xm)3mzzmt6F|5NA9 z5_gJ^bw`bRemDOTYySPYK=P4)TURQSe^h*&zq}FScgKG@(*3&()?XJ%KEA(SX9>Oc zijVx;#d51857v8v`SZU-@)3WB9)$7_ijVp5#lQTn59~|k`u{=lrQd&F==??Tk^efd z+%NOd-4Qe}~RT{J;8Ztjzx-8wI8Am4$-&&s?a_^r}`s2HkyZUPD@!!<=tp4c#m{i=}|N9on*Y(G_%e_+e z{M#DeRDbog-LpH zz3ci<7g%P`e@gQ4zIE=m(2=@x<^PPor}PSY{(mH2p8s?D%l@~f{quiD@^$?Y|L@hc z=SL)S7rf#1x9Rs^*B|$u^>1L$Pek%{{l)+9jy*py$=CHq-mA!8_WUFyU)LY~$G(U5 z{G=ow=P!j0FOYpl_1rq;2Zf}PCpR@Vx`N>E=^4#ZwbLGCT z@0I_vDu?U&(Q12sa+0s>kMpR8jqRU*3X-quk9w@#P3`$9NxrT>>c4Zfu;;%>@^$^c zP>JVV|Jw6kBKf-hsE7ajsXadx$=CHqKIVl8`~LIPBp-eo>zmDy^Oh3I{~2`$sn^=a zUmB8+{*#{*&z61PZ_58!>OR)l^V5=iIcMn?CHb~7%KusVZ`RxM(~*2#f2@DsXl4KY zy-f0T{ZaOQytO?)J;~Sg$9a73Hun4sBwyEG`hODJ$6rR0uj?=8fJyE7uaJCQf8;^` ze8HZdiR4TD)r&Kv{-oHGfb=~S-)J9ynMuC%Ic=UQ{uh@X1RVI!me^#^&qDH%@0&et zvYa1f0g9x`Xm01w6%}FtR!F8U-~grKLqN+PbL1$ad%aZz6|fH^xxrg zg={2W*B|@8bnWf=*-5^xKZe~sxqbZQAo;rfI0j#n!k+&c$=CIV|Igi&_WajLzVw?6 znB-s|TweJ<%XuIXe>q7$&b#LipXk=#UI<7X;-W3~@t=$2qu=l5ya`f&wBSrY)tG-MZ;*Ulf7F8y>}bz_ljQ6AWBu{?Mf>=Bi{$J2 z%e?=RJ^yWzuj?=OU#GI?=Oy`=Zy&B3>!97Q$%%l2{L@h){_>H0$^W++Ep!cnmb#LcZ2c!>gG{G-Q@^$^u z|K5*?zYj>huD@yri{44_i;;X?fAOFF)PDXcPV#mA5f0ah_$xv3b^VbKs+`t7{!5a4 zU4P`Gej&`n{jrdod{{;I0FR_$x*7rOrH2AE~>ouKb^+?}*@+Ci!Ty`FwR( z=|6~=@A}WD4%*MZACY`rf9${O5%E`suN9}2-QOY(L7(T}l=;5#H=*B{^Ei$wgD zBl)`iSbtYPf&cTXY6DP<;8!O3y8hA+N5o$hlCSHJ`s)h>zbeVs z^%wsWf?ti~>-xj@u_qCK)k(gt|8`}+@eRSRLGpF|asE4t;MXMip*D$#u>Y<29~1Fc zD}j9ZJHr0Y1iy9y`KWtn)H>+)!4mvB3FL?M7acm=??37$kRR5c<=0CfKde8?ub)7E zSbwQQCE~9^0{LP6S$@L=^27SG{6-;uxWCHO{~6z#ac>-UWcdpAY)tayys^IL|BUbNS3mou4!iiYa>o27Bp+?Qd-HCOA3yRRRaF0-_`jvDZp?2= z@-g1RWj+0I{y%P+-x2?TwFQm&%}BoZzYX*B$2#=pTEFzc4zFvje{+%#|IJK|JpHBr zGtTdzFL2u8YR2PlLGqDzOjqZB^-r_G@A}_%FxS5&$w$50`B|R+sK5Gguit?$b;&o( z^>0P;!F#2jr+~W0H@2 z>!=QK@qDTOQhtb17uL3+`|k$xUmKDS`>}nKJpWCs|N5@-OCMUMl}(KKZAm`-SEJOv zGXg(Kf3$;a+#Z^Lrkd*?N%E!seuAez>e2e_@w@(qna%ZYNAlsn)cS^}Ki2rTm`%IqDBusQVWrFP+0&|4&H1q+jlP{yH~s8RPUe4MsI$$+3(&%U9pYv_&bw)e1E^G z>G^MqAKX#D>%ZRFT>ma4AN6+889e`OsmJ}rFXs^F>zM1`mE`07Z=XBlKcV!;eO%4Y zhVGw8VXl8Sl8^JRJYzil5fA^~^1FT5dCm3jPVy_Ogmc5jp8l}^KdJmT(1(#Jk-7do zNIuTrzUt=bkLmxFC!z0OjJf}LPm+)NqviQM|5@ars|5Y7|LKIb#_`vS8kp<<8Oevw-8U)y@%kek=c(_Xtc$)e*S{~x$9Zp=qn`elkKR!JPqHqVXRiO} zBp>g8t%IKasDrDLbd}4`X0Crfk`J9;ebUkxPr693BoF9JVm{*m?A6~6;to{>Av{ig{%?DOO26>cYw9`VS%bht+jwo6mas<9nP~z5mF| zp8nu2%^kXbV1T*)LrK2)y`=E?a{g3gmHYmEVy^!%l8=1z=)&Ifm*=7GBarvMl)3(2 zk$mB#jgF5$>_=1o7ux^z`o#TrgZXDT$;bZxr#;K!`FQ^VuY~SD%4zPuI)db*-{hlG z9v}TcN$anYI_Mf>%=sfpKK7ewCwuy1{XhM^(D%29x&B|1e5rTovOHdYxsR!4$p7-F zIe!$%$Mep8d71csb)6TAL*+j!dD!CS`hP?6k?)WG$eaK0*<0T(bpOhq=JEF}$w&Xi zrJT`H|ME$cH-0>a#zV~YA5HR6e!IWMa>=)Tc){aiUw$CDx&C8FJ}?irFO_`LiWMGT z`XFzb^S>kclK;KF)a^U-ht}ch{X-vO%q?^NSdt&1e&X7M;xFVsxu$#Q{<*E@{Ba~7 z=WWRgE|dH2#^3bxm%6wO=KS#_ANl46^_R(dr%J%nU;3gqn)4@+eE5G2Q{O*)2e%Il z?E}>Fm;7^IbN=@vAM5>MG0R-P*Zki2@m@p>GUrbu`KW%Ie{7liz901Xu%#I`*qr|Z z$(Q>#zKE8(x8=|IZ%h8Sf;oQ@$w&W5tLvffuZlm(|0iGN;9i#KD(3tjNj}z}GhPYl zuK2S5Q28Ih7c`&$CzE_|7CsB*-xOc`XJ?1_Pun~49vZCwrjUH>|CbyJeSZ}narlS2 ze^b8y*UiU2mE>dp_3z)F{>XcNemb=On`Qp}pGNXgf19aYDF3R)k8|gBi$nRpHs<pz3!Bmc6aMQGkte96Dx_RD-wu(`SZGf6)Du3Fvk z^vC-?)EDBXH`hNZ#1H!;oN)suBC+;6N$9`BzcAlCJAd50e!A^U*^hq#$=CJA{d-wV}VOLvw{xXuU>yQ8b`LR8JImy@cNB>RNXZHMP zlCSHJ_o{?F*Y>bA|E zzmnwR{Av5Jg%0xI|0(}x*$?cn=f{$KU4Qt0^>1(g{`pA0u0Qr8n>yO_{Ul%4A9kEq zJK6JBk$hc$_#ZjR?Bj1W$=CJA`ZG;Rd;S`duj`L~w2d#>^VgDmtoJURTHxeDA%yaO z-m8w^`|PxjzjY*E*1J{bOTACt>_G?n;jeeu^VgGnl)3-4d#;Q-sQjO0|3Tb8w1MR7 z`ePrsv9o>rZ6x`+{y2aCu&X_P6Uo>0NB!BtZub1mBwyEG{Fu|&$KMu`uj`NZ?^arS zejLfy^@smK+{^a-tt21k|9e``5&y$T<^PO)>?eEd<3B+1(SL9@*=*@INt!Y!_h4n( zYtIjoe97|;iITkMV&(rV{SO3x8_C!8hyTJa-RyKmiaT)FTyGg#TKk6}puh{eVkbHdarl*@B_2zYz|1o4cAz3ur2NxrT>-oKp${}9R7^+!GUu1xmvcbMes`lIf9mbwqs_Wa=p z$=CHq{-;Y8d;U?9kNsbzA(I@``_#W0kb6)E6Y+P9%gE;2$UX z;{WvX1gW=Psr;XD9+K*S{rq!+w5JidA#`}jXe@^$_3JzPcbevQ{_1ane~IMl`r|yTRyORg$mkk8w96_}56ju0OtmUlIK4BwyDb{pgd3_`5;!b^Y=D z4-ovDBwyEG`j4{P&p)?FKJpzGFZPrAn<+5?2leQgi1@or@=@=UJ4qke_tjbwkUp5V z3H}|D-wz4EbzNQG{rLgc_l)4*CHcDks0W)z#NR!Vuj>#0mkk8}KFQbhN8iU$g8vuE z*Y$@V!n;KLJs|nI{#gIkCHQ}nd|iKxzX!p8m=ONmb`J7xYopxzFUk|~_lV@9-lJN} zCQ^UXeTsYkM0JAy56MUVF>8-94*CG$|194Fg8whcm*@YS{?d;~#NT6*uj`L|smL_|Hhbu0PJd<`Mje-vZJw)&?f`MUn-|HwPRUjK9? zU)NvGKPTD0|1Xn#U4K>n9<^e!{rjJumeDPbV7#Gh+J?NoN{cb&WR6}EaMv{+wTg676|1k7_w^PV}?7q4G?JFc-*I%B4 znt$MnW}|;5lCSF@=1V=ih5ngIzOH|mFTPY3`ez~ey8hDtJk?(RS4qCEzw8I6+rR%= zNxrVX`2WqYfB&!(EGjdp8qrWjoSGoAN5){bN}JjNWQLrIQ}FLWugD;BwyD*%oqPl3;lDFd|m%A zAN_bX`sX6~y8fsKbd>*tt^T=5zOKLc?#!}(|MQT1U4QVGDE}E-{of$@==VB$)AOH2 z|6R_uq5CH`nfu?qN%E0?F3>;Zf1=i3@Lzw_+V4nS?op&8@1w!`>n)Nm{T8J|{x^z` z{@492LjLF3+Z*%WCi%MlGG4X*k^4U^^v_H3b^XJ9TmAEqd|m%AU+Qu!^nZus>-vlD z^jv%W^OJmCf7E{`Uts_K7a;k%{-{GPyvY9jFG%t+|CW6%vw|9FVH|IJqaq9k9}AN@DUSK7b- zACP=qf8@hbt+9Xqi;;Z9`_w@p|4|ixvj27b;>Wvhk-7g{ags0h&vx?smr)PCx3FL8 zfzFmT_g^eQ@}>V}%2IcpRpZC~>o2GAOFwR4xjDZi$=CG{$DiE8Y@z>$BwyD*%$L4M z3;j!xd|m%A|L?qNBW$66X_Bw&FZoY(|BJ2uACY`rfApglJ#7E}mm&GO{^)DH~ycP$Dc#;k>{*8a*5O%|MOL>)FJKqBeWlj_|%;j4EA5; zNIuS8r#D|B{inyjbp1CgT(;+zC;7Vm;rNsIx6r==$=CG{^X0dN{uN2Su0PAKMDlh0 zaUbl}9HIMXEcCBT@^$^;2UPsE(0xD_`d1EZV=IgKOBp>u}`L_DkCi%MlIDVgb z-v0fsL-KX~asSzTb^oxf{&h*du0PKI-%;o9w))p2`LfS`f4d{kUB#dHZw(2Jzn1y= zPyG--9G|BCyXb!_dL>r+9@aDoN*`F7t3K=gs|F-r{8rbk6#ub{b%WA}dqJ&#Z2P|& z{(sUx9DnluS?J%09KWuAm~T7&#w1_YpXE3C|D-?8y?TwbfB&13jAa@ zvVH&Cl6+l%-20X3b$fm!$=CIldVrkv{B|TC=RFy6ER}Pw_lpJHbN>tW@z zM=LLO@7q-V&j|lFf4Ap%Ao;leqt2*>l6T6R&-Gs{_M1JwBgxnGXXEb^lCSH}@;i}y zU4NGUDaqIMmwR{B{YSR*PiK;^>yLcQuj>9)TYeXkuj>#0$K84C`CUmq{I`pqTOj%F zSmpmL_phI~kH2mtU+TSU%y(w0>juj!|7YBP^ZPk_es_{DelPpxO5M>f%KsVX4-E-^ z50bCz&&FR*lCSH}@_UhdU4NF}o8;^IqyK628}{+nhve(}EBD3EUwhM@{~5{G^~ZW_ zDZ%ec@=BccV78FWB>KrS^N0^oaBq&ZHn14|D;#`&shJAB>4SEKKecC4vTW& z`{Gyr&-i-^5&ZrnU)P_Fzb{C>u0P8kK=O6{S^hwhuj`Nf*XwWD$NwObuj`NX&j5ly znB?pFBmZ=m;141Bh`VFyXE+#lbLIbhP}u?famIfB`I6*g{rkiAsj~h`{I~0Wx{Tlt zCHc~CGikDebBJZi{~7tf&j|i7lCSH}#@|;YU)P`I4=4G${w#k4$=CHq-)q*l?dPA7 zBwyDb`>_TD|7()3>yLAfF$8}U$w&U_t1l-xn1-5Ob^Vts6Y=*A$(MTTQ4<~5FeX#} z&vNce@V_Pb;`_63f`fABRm%SvbvI8>+t0tFNxrT>8-HU+zOFyZ|BmGA`m_A8BwyDb z{pjn6_!~#^b^WFPgW!)R`MUmc|7l+P`F8@zN4~xBmaz_gcU1n*Sbv@;;_rKskM%~z z$kB5Co>}=n%l!uge?iS;7=v_y8e=nCiv4xzO481jBwERF-ZA8;~YMUh`;G1 zANig?l>al%z28&*&&q!I)Hs4agXE*$tmVstUEgWt|19+f1b-&U*Y#)PFN);r`m_9> zNWQK=%b!K^b^TEf9ZAIBY?80*f4u+Iw|Wu$IV4}#U+NDC{#=re`+nD6>L=%Y)0F?S zoPQDVH;?4wykU>>f4()S><6`#|FhhGP4MTFd|7|4@9MmnY}k)U<_F{+#P$S#0m;|( zXXEc@lCSH}@)wePU4NFph~(?~%lQ`(e~U@Ju745r^8>+OLh^O}asSZ_g1?mHqula{ z@*hUu%R1%%jOnN~5r4}_zVsO@|7Y|a!~Yrnzs(8$a*{9krk-Ww{0sii@PBMV@S{n- zu0I=pD@eYsKg*9H`MUlreeAgBbd>_fz^+!GCB7*NH`SQHg z|AX_dc>iZ2{#GTBFMmha|C!*gP9Pua;CTOMg1;t#{ILFP{H;wOKde8?Uzb3BSbvtk zK7stO{#cJJA>waC0{LP6S^mZZ^27SG{7oUgt^YITyL5Ft|7Y~$-mU7Fdx$S~DCmeT z2L0!oNj~yj=Vy8T&**>aT*5E+v6pw7cTq1`uA!Q^50u)uK!k&k9F_2!#w?A$CSQ?-@!dV!|R&sA0YY2|7L3B z=`X%x75om)p{6Z1*FQ+|ao^OqH$453582qk@5sGe)y@6Sw~>6@x45Rhr$5$1gIoFC zd!VM7>%X1ktJg2_-n^dvvL99cUw98S{l{7T4(>s!lf&Hq zc{j<&d4H7JcShhx>5n{Ag)*V}XR5jWdq}>__Y*w*aSriaNx#zviO9_6{@Z&=zU=pJ zc>deS|Hl>eOCR9kX6E|uBl)QRUD_q!Kz`_t{_9)He*xzp2Tq#nzn|n|zdx#jr$6#B z+v(6g$ditaOVAOkl@j<)W*sA``n)XlK*%s zeJ`K1rZU(sCuUr0XIyS3DPR}uJ8^FRFH);{yO?_ajI?!Oz%Kc`4O zzP~Rv@Vgwv$3A@hL!acszpWQ(%>R|-W4+Zeqc5J1^H|@FkpEiGcEQGOA zJdbWU{f?XqH!#=#49Um6li#HD^vCwMrCR^Vy678o{m+tooO_lz>iKWO|LOG0q4{r~ zx&G%!KJ;Fm-_sv;xNDXFC(gm&pJ1;4d6JKQ^N&}0@1LwcO8ccBG0Q%4{eL6*Smz(? z=jo64@tb0P>BqW%(_H`GNj{$c<~wfQ1M`opM^yhg`Vq1ZF!x`-K=L0oxVWH23XhNV zcbh{#NA6$wq=Rw%UnKeRybH&;95sH_qn6to;+Hb_f4)TWQFlFZtv7zGN7AVI0PD~N z3(fWagXF{K{=-Aw_>qSk`Pk?B5llAM|4)*SbI;9ZSH$a&w8K+1|06Gvzn{7Omr1?~ zw-h&;d-{v-zFL3E{U3ju>wksh<9qvSPfvf8-@U8Wf6|A4&0PPhBwxON1wH+-?=GD! zbpOsybN#Q8eC6^tCHfj)vBsMa;*4i{!)a@?w|e z@$nD;g=%Yj4&vbUQFH!nl8^mw?#s*Ey03Yj{&Ej-adZ9ekbL>hrSG=mQ*o(~CdJ|86knKP36+e{4{HnXGrJ1U&tvFLI+f z{}IWD-^wr*|Ck515A^iM>$teDIsYG$kI&4*?MvmnVZ{nhf2j+)Y0m$bd~y`Pb0AJG5?ypWb}^{fy)z&$8rD zX#J`9sK3mr{NLpJf8AXFh!l8}A|jHwzamWU-^Tvy-@m>09({1%<_+!tW|`}sh~&$C z2kkul)v9Y@<>sOMM;mkf6O(+r|E;cv);~&rIsbj)`VdD~F^|6_Bp>;Q8LxQy%l=#C zfAC$ZQqcVQCnfpdEPNKq|Euw1-+4;izbX8u=K8-7;@kQ!WB)tz+!68J>Ch%9^WKWg zerx}=WE%fYC=L>9zr*nn`sWDPyl1`;D|wgi8wVXckAZ1pt@+7GKF%L1_*Tk!^OHJ3 zxBvYmdwvRyZ|Z-I`h!jLk4nAEDWyM--@B;ucU%9vlp3GaU;K}w?Z^Kj$=CJAd=RzN zp8t}@H`O2e-)HBKJE(hk6d9EJ-+b!+Ut9fCX?#|H@x!lW@4t|mvw|Ex?6dwv>{ zkMB*#Niov*-lJMj>i(Lguz&t(Nj{$Qv=l2Gtb;F?4?5ESlGL7`j^s=JC(&|QZ*)-p z&+tF|E5e@tGRfEVNB&{rB71&%lCSHJ^XCQ&?D-i;zOFy&VT#YS=Vv7Oy8f8|_g1x! zzgI}Uu0P(tjFs*AnMl5_Kk7ces9?{}O!DDB`B#Re4(8n}9|Yyxeaq98*7JWBl8^h2 z)|6fBpbfsK@_)wn_wK*;{8vdn&Y!jqTPS^R|K$xz-FJmY_WZ0QU)LY&-chsc<1ZV@ z*Y!s}xO|j7KRe0S^+!H3(+qol4wA3yFLkHo?Bnk>lCSHJywk+8_WajLzOKLAfA*0* zKPSmY{`b)W7U$JxBacBbEO%&b?QwdLZafB5ko``(^koaF2Ji~k?N zFG2Ek{lQ;b+&=zGl6+l%lwDOJ_#cvdU4NW^pDAWP{!%0#`@c#wSTU+S!Wo*?z6E0zB<>c5X&wI6>OlCSHJ@6oCW z_VHhqvQ9-unGcSydje?xT~eQCV?_{))eU4Qr=e?`P!d6KW|kNj^*f?t8;>-wYb z=l%!w^G`*RkF?LtO=IQW;m8vK2ldG9iTJBT@=yP~B zIwJmRkbGT#=?5bCHA%j%KkA`d5&T*tANht+xkpI7?|@)H`fj=q@mHJVi_ePke})Zy zp-lnFKfh1#>yUip+v=qo?BKh1VYR#ddVJY_{;5myb^Y=893E%?{jW#zb^S39|4i`f zlYCu&)c*`7_zg(Du0Qe)C5iZJNb+_4QU8{W;5Q=qy8g(&Ju7Oz{%K6|aoy0xi~Xej zW=c#z`XCMw@z;dpBkpr6|7YakYAp$f@6QT?-<0Ib{YUG%%KVdfzB~R21iu-{*Y!u= zMN1<7nv;B8f2>0*68shSJv-T(>`%d^jQ^8BCEAJcI*BL3Qud|iLkzoaGj?Mc3_Kl*Q8Aov|fzOFyMgPVx>>qzo-{U!fL z@IN8>y8iHAizfJ;NPf5v0)I!m|1%MPpC*tme@EE=nc#O$AV2JXi~Bzs5&SL*ZRpbk1kj*$P{lXu*IH}D_pP4Z`M%NY|neos6f=aCT+q5jW_WsUiL zNIvo%#TxF2=SQfYHn)8a)*+|AtzyjojN~KVaCMHSe>OD!7YO;!Y|d}Y?@RJgcly5L z>5uRKM;ZLiJ#`IMx)P2t|8tU${KM9ap8nANaZnj zeh1r-&o>t^=JzN0$oG!D;Q2q}`TzN*-}T?yYOenmBp-cGRs7rCajN*2_*4FKvMxJg zuKxg%k9wndKpS1k$m`$ zWZSwWo{#g$z59GlNBsQM$e2Hv_a#I<8%H0Kd58OA42j`cM<7$`r~`h z`;O1`zq)6x|Cb~mezR|v^YoYf=jD+9RQkro;~z@$QD&RwQNZP>_`|$2Ih|knfexjw zYs?>(0RDk{aq)cde@@|-dw?(ZX<*F%isXym-b&B^9Pi@^_5H_p=vQj6E!)DFKa%82y~UrN|E~DqE%&+p z|HsY!cfTh2c+RcHZH#~a;0Jx>T*!YmWi#XPk0SZf_ubIbAM4>)kNX_)MLuS(|2HHb zei!K?J^iundQZ*&XoJ7queI^`za{xn@Bh^E-^Takn zY8&J6k0tr=+5P^6=f8`7+_955ucrGv|F$kH7wux&A+pe7XN9_J7A; z@I+|+mnPD|=uO5yiR5Gdziw#Ae@p3)eOJoeA^+vv=Kjw=l6=&gZtLNb`oq8yFaGe) zIqRD9CzE{f9~>R)<{P$oe3^%enEM}1A^Fhz(^)Is@t^bfvj0lo!I8&r@cvIF`IzP& zKa6!b>iOdw^2!vSd;ifgbN#20e7SEXeXRK2+@I!+U;Gz;FxP)N$yeb%sBHd~()ahW z@?jFa)%-7Yn7z&QpF#4`Z*#1XsA4T#d&$GhwpO$;qCc5)MocP6yKk;AB zZ_b}f@)3Xj*cI}aq>KJtIJUX79c){m(?A6Ds0X<|P9#Uvl=|JyrO zy7$d>^!T`!H1Rz1_iqWwN58}9E78*Tds3|f|7ZT+VLtw)Bp>>ZQ}-Vr4|C|T$HzYG z=`M5rGLnzie4qOM$vMDt{@da|UD}+#oaE#EfA6JexBu`{Z~RghoY&lcHJaq_-=}`+ zMmtjXaoywNUYgeLnDbYV{CsKw(5PgLgL}V*e(b&fvM$|ku73>4$2r&SW8S!>A7)D^ z|Cqu&{#KHFdCxO@{wfSTsrzST{gK2x|KTI~ zSbu(<#nT_(-RuFMJN^mg`uj;f;_uLdQ2s}aAMfLXw0=j9pI&dmM25`A2ojXq50MQXLA2l zthxScNj~;l>q>>rpA=u}PSkyTlK;OP>3$Cl@(=4m{6z8rjfl7t`kh$&oh0<%;a{-- z*`4T++<#J_Wl-`@S4-RXAFbE;Nkf0g|Ha4nU;Q;!-usb_LjH^SVyyi?HjsQdZ&GW}xY)@O&@`-YVMn2*n{v)6x<#%J|MKCa6?`|)ok`MUn_ zA45sCnQ-uFkoW^JM$9Y8N9`^l*TS>mIzs!eS?D+wb zkNZ!yj){@||B|Xf@j>pJ)BgDfNxt}vKa7^XGpBq|&V9~hv*&Lk`G2cx<`dsrCVu}X zONIRJGu!jGlYCu&?8lY_?fE-MzOFy+1FNvbp1+gi>-tOo#|C@;E|Rb7FZC!L?c;AZ z$=CHqKm6iId;T7huj`L<-}$ZW`Fj(>PqtL@?Y)%$Grs?yXRv?%`$#_4nKO$lmh;|J z%KusN0cq{|`$@j^oAq1hNZq;ef0q3~DtrC`k}uEyIsIk*zs8<_kmT$7BmNKi?D>aC zzOFyYen!RE^AD4JU4QJqQ?#&;zau1H*B^PWqfPAjM@hb}Kk89}4ej~INIuSA3LRb` z_fA#M9h5%!;wkN)|8bHp{RZXcOWnuKY(eq=`8Jt7{{+cLp6^_6u7iE(_sahneL(*v zvFD#8`MUndyDwdC&;Nzw>-wwk+f{6-J^vKR*Y(GF%(+GO{9j4Fu0OgiUaxN-f2T>l zu0Q+-F4eK;pCS3W{+N#gwe0z4Nj~nMTi#0m(xGn>;F5+*Y(Hu@SO$r z{0k&s*Z);@0nylb_WX+^U)LY!9`|b4$KNHAuj`L<$ez{h`G1gnU4QBSs%FpsljKYN z;fph*{-oHGfYjmT{>MK4E|YxmU)elW{0}cZ2uK~`gum_iS4ckUEN73KEc4Dp<^L?_ z4u9G6uabOSf5czGx%TmQjpXb4!+s(89DDwClCSG8^$@e{`8PkmJ)ot5qRw@ALOKl+gmSF-2dCiysjzA#{t+<#GC`9DkF@jd(ayF>D^-kLvrqFaA^ zA>iQrqt+dJ{#}wU^#=1MNd3ivGp_&jqFeU-dn8}iA7!^mi1@ot@^$@@e=Ylyef2y=RY9%y8cr4Ma19VBwyDb?MF>2+Q&80B z`!zWcaIhb(eA7Pu{vr92|8F%~?j3&VP(b>=^W3oK|4Z_5-$c`VquhHJmH#t*VAEW; z=RYR-y8d_$muK3?-xHFr>ks}X1pg_?*Y(Hu=jIIi@&8Bib^USvP=JWPXCzn z3P|61@2mFwBqSf}{W_@!%e-@Lb-;lh!7KLsq$FS0AM5{bi1>SfvQ@1_L7Pe$@} z{ZW5(eY*Yplbq!1`lJ8qX*v7&PeJl^{V^Y|A^0gtzOFy~7yA6_9<%>qPuzB>9r>ZQexkKHa7S#P{s>pZ4?5D(BDvNFYC~Kg)kJ#1Hp( znfgCtyZz~iBaVz;`H#T%;La_dBlnU;zwQ3JLI2rXBp>;{>=*XN^U)94b9>1DC~IkB z{@WxU`Oc`Qo$-9}AyNK^=tuq_O(kP~UXl<0yE9ch{ox09@;{%0f8XfOYs}9_@}=IZ zv!_4y17lA4+gKV<1aw+rT*vU9+#uyPwwBn;d4+I*?nReV}3!Bk9vAA|> zfA>9-kA9n!nYTLd;Yy=?$mH)(eZX=qF{*+4-v;yV`y?OrrW4zF`b+(*&nJE~se0Em z<`*XUc>b&E1ze8OU(SDj_PO^E)v0I9FGBJq%>8lke8l6QQ+;k9aK47d{Gucu`;W)h zgYkUKf4TPhM29Iq)iUOPK=N_lSJhv)#`EDjc6YN+?!hXVw7xOF7|EA@x6+>esQ=m- z8}eU!Y_5NCl8<~xxyUUJ@?K4!^IsBQjEd&|(2e z`S{*se0zg~zN=aLJihpHl`!`|{*dHLzUODp|NEf24)V>hKKK5Czs&V7Me>nvZPR(9 z_&$6V<&9sye`A^%>tCAW%Y9Rk>qY;vOFce(2=BjQ?tlCd$(MXzoacWIJ#sDzt^ZFn zF&=*zl8^k)py{6fG~#fo`u^h_>c=k4jrnCszPx`k*0~(@{gHboCWL%gBFz2I9g>gu z`>WeJxBuWd|52Pno}FaQFGuplZ~XikIrqMJ+k5}S2lBAF|8;qikNYF zy3awaf8fj0@md?>=U;*3W8Xb;!&*6i%(&4Tzxa=KHuqnzNb=Ed^;79JQvccKx%n49 zJa=oGkG~ShNBzm8o2#V%_u6mX_$4mdnfw1#Ci$}7dA!EKb67Cl<4YezEA#iS3dxr| zNAK0L-%RwJ|FO)=C(ZS*O7f-Ox8y1Zk9*>C-+!6^e>c~^8p(&x*7Yu{9IQhwWcA`t z&LuCK^Q)75?DOZ0@w;`8#XP>Oi?&1>$A1ly58t=AjXt;kqrS(N_iu1JV}4DNua^6B zI;{1({+kcH_g{R#+MAER7Ri_Af57MV{iXB9FLilU%*S7w*5C6?v|GFe!{MNGj-2Q_b9v?nDBM+MEUytM? z{qdw|toUD5PT@U&$$u^}*S|i=N4|GLPM_qxGWPfQlK-&qe{VqYasNrCyYk$lt}rsy6k`Q|6j&41`aow3$@{EZX9 zU$kYV_&;SG=#5|AzwYMaZ$k2sW?uipN=M#(8uKdjTR&y z`R)Q;W5s`KX9~~%RpNiF`S@Fse5`*Hed3e--_jZ$U+N-qoAX;GfS;?6=Rb=5;Dql( z_fIr6kN?&rU+O(n{NZ~Wyx~26sf+)>{P}-O@{#8otoD6aZxk)==`a4bCCvG4NIt&* z^{V;B|7H3xk1yv>S_us`TnnCh@S}mgX-su`zs=`_B%=Fzr(*!@89m}Ng40K zj;{aO33dN4Y**Xz?;d>_{@>MqhyV9KA;*vRZ|LRF{ZmSRod3L~?*9{RI`jFj z6Um4FMDs+U{AcL--_PxL&;P%RbpH;6^S@6?KGr=Q_Z)CJiZA^~{rzqq-dXefZ)cK^ z{m0B#{PBFm{RwsdmDJ_6H;=zABp>6SoHLaF4UNBO7Qf7gZwxVyzpf-7>x>I8ZHpg2 z=AC+-{Njf-r4WA$SqD`q8*Lqb-AO*q z|DLJuj_fxY2E})LV83P7{2nA9d5$S+{f#_KC3O!nwtcO-+4Fm9eAE6v#M`zn56gLT zvKB#E2Mr%!U;o`p6QN2 zkJle&-+%U*#%J}%^Y}QG{qyfj@^$^ufBto1d;aGnAN%j-!(+sE=T4QN+(R;~oqhcE zBl+S#cR5l)BwyEG?qiI$kG}yV zU)LXgct6dz=MNTSEC9A9o#$C)v@OfBl)O*yw+u* zgY*7s%Kuru|0V4CUy*!Wf7JhF{=q)}hLe01&JzFU80G(r{^LwJ?D;>CeB`_H zc8`+!ueOPU(syz*i#>l5$=CIl`>(p$$KQ`6U)Nv!r#sp6CzE_#fAs(S+TNZ&h2-n{ zqaJVJTKo8$O7eC6QI9s;Z_l4b@^$@X{)@5aPbc}vyKYZBL;R1^EB|N7f4^cMe=|rv z-nXo4r^@;7wg&+R-`|hY+w*6VeCc!iX0r7A^tVr6Yi-Y;Me=q1Q4g}Lg*|^Z$=CIl_3v`~_?tuWb^THI5WB>lKbPd|`s3X1rA7Aq zc_d%%JN$f-)L*=#{GSp2ds5lQ-+Yq4XotE0@ym(M;oPVHId>r->yPCx+VdBXd|7YL zo*?yKKPdlad=D0-u;>3w@^$^8N3~}5@wbrV>-xigr&<$x{vwjE>yLV{wvFuhi%Gt& zztkNqu#dkbBwyDb-=9C{+4Gl@d|iK;59iwRmyvw*Kjrq1mHyMJCjyd(xu48F{+5$` zsk3T2TKdobI~b5YpwTbb^P@?=)VaPnO6s0`%KsVl5QUT4^H-33U4Qu=H?WVt7?Q8+ zkMr+d_3im9NxrT>`ko5av**W>d|iL!|EJ8hk3S#D*Y!vGq1h~ZzMtgl`oj+*-%s}Z zRU}{fOtX)Wbx&vI|1AA*N$lfqHOZGg-?GCb|C3YsaLD_Y*q**VTy zTmO;Bp1+pl>-u9ooU5*V{H-JTy8g2Ms$-x)ic$9toZ6x`+ z{_taJKhvJSiRA10%Y7U(?D?BXK9)bH&-N3)qj50-2j7Fa5%%%7h2*3DV!(gBrT(#! z@_$A;I6J|QBl%cwREq5?=l@UVx%Yp~e74lO{%$MD*Y%&@Q=Nd;vX8$2$=CHq9YQmL zA0+v@{@8#0UekX3+ep5yzvMrN_}fnMb^USvGI_dv{O=(7y8iIrdYj6J_8|@_j z>yHXZ9;OTtf4fM&^f@$cBK7`Vrv#)9DG|ZnP4eOQ^nRx@(*F+sXB>a*_|Ja+*+cSm z{gHngO~l_`lCSG8=dlETAIaDCS9Unrvl9IMBwyDb{SYUn*~k9@lCSHJew^6^{~*cN z^+)|%H-dkNlkat?LCgA!n6Y+OAfqeNh!v4<$|40J)@PBF4I^;i1@Q)^tAJ$)V zAmZ;>0{LP6S^n_^^27SG{1XY}hxNyPs1Xr=ClkmI>(BCkNgzM0Kg&NA;)naYO#Pp+ z|Jyj^s3YT7{%7caDZDA<|9UZx`|k$*hrg11eDAJp*zcg-v(S&8{|S7Mi(f5n%s)-? zQExG!`EEy*VMZNX?eWDICRcf5{uz=F`;kI<|5yKs%8v)v0&RZ%O=JF9l8^jn;~e{4 zj(Yy6|64ZGCqB5BOO-U{pCkF=Ke%U?_}}E7>FF z=X2y-YS>%G{NG4E{Ffeg+ZWH5`rDO02fpb0_I+r~|DEK+@3&~aUGaR>Klhvx@;}T{ z(U^aM zZZkr4NB?;IikN^()-&e+LGp3l-|6ah@x4sz_xPBX(mbtd%>R?*qe~%sUyL^Pj~$*gk`~|M@kN51;qcW4F5ZZa(L~Df;iPZ#@3%Bp>~T(eG__PzNyi z#aNf8d;nzpz6Qqp8zdjke^#*=Ul6e?tLE>yyq|9-&W@Q z2P7Z)&O@iyJMepZ)Y#*r4z_C(bN}(bNj~1QZ>Owt{a3qreE7gGC}r+{@{r`iXYiG3 z8)W`3mdoSAmuLMjbN~BCBp=(n^Kt8>?kj`x;f%nK`u<>FH0(!n|L=cDKEf>j__gA{ zG`_mWhacPUp633`|B`$Rw@vl+4$i?^M0k9ef1}LbzsDpW=l$c>t#zdDBE83#zSsli z@81)WkNwZafosHfXJKBCFY|wgHV*VL@jrY@@=@=3rOjIL`$|62;|n&0IsZSBFMfl= z*2ul9vu1mI*#{pr=RYI)*ypW|T`lXM*EV_lUU&h&Y3qm%2Kldu7v29$+x#1z^RqT< z9Q56EYU}akTx72K_!E(Q_|Ih-u-ZNU8|?9=FQ~uy_!EzW9$; ziZs?g3CYJa`$3b{4&pF-S&uJufpyHspOoZFy~~JI4(?sM-rVC$9d=gp@xMUw@%`OB z-Szvs+|T3V9<)w3&H2elKJr}4K6K-6^LdXi`LCSj{NyBG?!VZy%AJ3c_}uqReSfho z+_Tu6pMvD$`@1)|O8Q<`zw7Zu{|Dy$lq4VP&(_)9`yV<#H~-20_p~|xMUs#2uJgU$ zS#tMCt*20t8!fE{=1##&;J#YFTU45_@wV9_APJxa{hM2JpM9~{MyQJqFK3B;(t@D zy~mfjq%7wA%p@OvPse`q{D0-SFY-CE{-0$2{IigJ%s)-K$GP7*weArAJ>~x^_ad$_ z-+#YK@^Q>^{_jKae4NJ=RQ|u>16I*I|C%+#PZZ()nEG$R|F`9`gR=iR_i@n81Ls+3 zUH_bo96!$AHYMI1KYrvL=f3E7&jT}>&wtrTKA!i$!1j1P-n-!~{E`oT+{--wlta`1 zPUtx#)_x}m{df2m=J~%rIOO`Tw+TugaFLX;*80Cjjvwp%8ph*#UJ+Lvnu%IJg`(9^Z3h2>W}yTFXxE+{z_;G z7YGI7|MmQ3{q>UHLA_08<^PO2oHWxHSwH{WBp>}=YBp>fz zsu?RC_^?c<6%^m^`6KQ5Z;*Ulf82*s|H@)({of?{y8hz-aMqsx7RlH3M;+kwqxSr_ zNxrT>`d_9Lv#)>8OY(L7aqe>vQ?CH}ud;Ys5U)LY|!Cq_Z`R|c@U4PUg&C6^bfA5ogU4OX`CyhP7Fv-{T zN80uGr1tzGBp>;=nb(#$$b)~O>Y(I4q_+0)SCr(-J> zv$k0%_pM)jJ1F;VAFprEFGlip{l8QPQW;j*$6s-huj`NfZ>@#){1PNz*IzyUHh;{r z=a(e;y8d$i#FHh~>(38KzOFykV*~!O=a(Y+y8d$S<_&v(X_EhU-j?IbZ(88syE8}m zKTAHYrhWWw5eQ5BFef(7;`MUl%cRn-Ro?o5h>-r-f zJL5}xehreZ>o0wW$L-^+1Kc=6H z1MTClKFQbh$N6hae|vrdlCSG8=e~XI`3*_Fu0QH84(_s#zeXfq*B^CX^S9gc84vNIvGju01EoxnEl4|BQUte{b5yUsIBgKG&@SCd$3TJ1)3=h#T_Q^P7=; z#CyA$6QuuSi1L3%{^f^U_Wb4~U)LY|fy906E+4CbwzU+5$j*{{Jto)zR53o7AJ-;2v*Y%hCZ@SvYUwe|T z>kod5F82HmBwyEG>b^d;=XWIey8g)j{=3dT{yri3y8ih7e6`k|--+bw`Xe8oeT_Z; zQ<9JI2C|Hhbx&*M|BUmmQQ7R{uQSP)d~4}p(tnw0Q^t)AF;8Mef)JJ`MUnN|9i(L_WbT7U)LY`pVJ-f`8`O!u0Q&|@2#?r zzn&yt*I)YH34SkD0&)+=FInv4uMf$``=0D^Z>hg= zl>al@AuAI6&qzM%AKqQwRs5#@QU1^HAz7W-e*Aq&zOFxfKwcx_?{ku`>yP@kaUJaA zzaPoh^~d>RQi9)~v2|GUpV{=Ojjy8hVy{}OA@A3*YT{o#jFpWqK9`EuTWrJdB@ ztc(gs{c~+1{sxhJ@!zQ5#O?o^;;w&QB>00#KJ-rCu8jCE!5@`Cepr9efr!6v z637qh&+@-bAU~`>%O9OUepr9;KPKXDOal2~{aOBZ3FL?MXZd48{BVDtssA(9e`$6f z6aU@FDW3nC+ygW3bw_kD@Lw25@-gn?Ne;>R|A!YmKKjrOOetc_A5Zde-}K5cd&Pg_ z#B=_S@C8YirHnCu0?CK(&48xIT#oWz#(v<&R9`3$mCKm_eFFHS%O7-5cc1Gy|5ddO z+LrT9QDgo@l8<`RwY&B>SO@fc&VNt*4^lbC{2xd@Y)*q0j>hYc{71{BKDh^~<@nsj z{7EDq+yB8`4oKa}ndRR5FLh|&6f@@kNb*tdP$AhK@jJbA*yAHE|HxU+m_M21!~fvb zNxNkKQ$3&O{~>)?PbwJmr;vQyw^ZYk9diHIf^r^T*2Rme8uO=;e3V}vjNK;vznhzS zd^wlMXzo8fjpWOE|I|(gJ_rq;oBt4({YzFd9{+Tb5C4IW7jAbDcY~huUxY7G{^I8T z$1_Mi;(yHjp!hC~Dembn@BeS+{?ju_K78NSX4&b$2czV3^B>NETF$C$tbY{AhyU`X zo7<%C=Yu5P_~rZeOATZGPb44pHV29aohOTx0aO-`kMHvL9nAfwXOVoIw>~ZvbniXr z>hbaKGd7y@XOn!)KabOd?j8Kfwp8lnV+BYAC+^6*m}nA-#n6!eaDL*Z*}Y5Kla8ib?8SM81v_oeCcUw;{<(N0j{ihd^eDwbxC=lnM?jh?^k1y~45_A9Y#Uvm8W0#L_ z7XSHsTRgt_k9Ifre_ulKrQY-BP2xX0>ZHe)_b-jP|MgOmFXvs?H%tA)kWn80O}qft z&7c1=l8^akK(kGb-1jiU<4Yd=h`Im!a*~hpwnA@jbddL~@ALTL|2Ev*e<+&d9BagZNx1Z!o{nrZ{-21lnc>2qGncLj|eHF>aGOuOH^-}j$ zzmeGaXa_b>4_k1u`cFSl{yz##v+j^vB~UBp`1|MmUNvc;lBk;GX8se>2I)KD$)0b@KjSsO0hG{fjo|Zz1_u z|J0tjUf#d6Jv_enk9IZZ$B}&Wd*qwEM(*9L|J?kCzO1JW+ZxCJR+5kXNB072#BaFM zo8I_k{dvHgA0YV{=h@=!{Tsj4@%VE8=3;YxkmO68ZSvwz_Cwpk{_p1Tw~gc@&sX4s zt?}`XwELm|d~zS@?H=aqpY0?c`S(-XJ^xYcJD-#d`CmRW-~a6(`M7WN#!}D!bD#>m zaJPK5^||-q6*TAXCHc~C zS8+=`A9=UAk9@8V#1-@Bzc0iO`yZc)aDNhOzmtUiJN!%XTtj}5{-@772OZ3Zt(N$# z{g?J@d{h5rth)-1I3)RxLhXVM?wzQ*CB~Y6K;vgI^qi&1hJH5Ef zntzad{^)o4Wc6-Go`+h0$$p@tU*aMCJoEh9A#MD3LJ#==dj2y1W<26xADE$i(2;Ye zzwQ064{Ll={W0HnjoT~te_mAjqaUE(o#od0A0hQe{%^~KZSnd`KCGNy@}cV&o97>n zYU4N6AN$`+y^lLc_jT#$>c73Jef%BM_@?oPbLK`R_lxhJqx{d&4|4a>3Tyq3YkbEr z{;>XdlGN`=8E~_Z|MH^wj+{Ry{>*(Y2K&zwBp>Gv>D0a#=YWNj|Fg^oKiTt7l6>U9 zMyk3SoWnk<8FYQPf3)ZSLh^O}k$2ee&jM@xPmz3Gf2;?#-?r!fO7eC6aqUmNKkfOa zNxrT>)}OyuUudoW8IrH-k9_2K$DV(dvQ|7BY-d;U3+k9cpuD>>ou;>3q^0D4+x@(!-_fSLmKcgOV#~^$D?<8N>AK$~$ zXYJ$f0?F6)$NV$$m_7d@$=CJA{99_DJ^vEP*Y(Hxw^>2^`1^z8>-ysyuI3x|{69&) zu0PI$R%Wy3UncqDw|ahw>;I$tpJhMR*FOHPkbLBsAEjL^=f8&w1|9K3>Tb`!O7ii& z%hhC|oc~T#{?C$k|HPhujpXb4BOV5BvyZ>)BwyDb+crn}@!GC`Z;*Ulf9XG4ZO^|+ z@^$^C4l9Fw{M{n?y8iILdpngq|2E0j^~bs63oqF7?~r`#cboec$oWTo<^L@HYi;f0 z?=Hzlom;=R=gWOpFDw6Ny!Sa;+Vk&`e606AUOrdy-3K!U-8!ts_Wb)KU)LXX&>3Uw z#0|29kP`433GuD{fS&$s9QP4ad95q~59``LQ_eMs_k{pCL9NA~v2AI2^F_=|W6E60e4@cEBv{#Dl>`@d;d?fHpFzOFygKW+Z7=O-rlSnrp*J6-w@ zw>}QYxo@k=_VJg5yLB)(_`)VDM-GqKk6Zt{cazBDM`MrznuG@ zv**7^@^$?&AGSMf&wq*JqyJ=G=Sgz^!~H7(*@p!_vX8%1Bp=_OlYJ*TsKbg@{?C&C zFJ;e9P4cDBa_R)R|Gbm(e}@0q=Oyj=X-K}VKl)+Ij^vMz6-_d`I$(*^j~EgCH*H;l>alH|JtJV{LCa@ z*B|H4FORg3zbqtQ*B|%aju~#xf0g9x`s4f|%UAaNtR!F8U*i9Wef(u3`MUn-N4tH< zo}ZoM>-tOm)j@lH4wAn_wcST%93lN@^_Bm#+`m`EKK@=K`LfuN{mD@K_{&A|b^Vclx%8zyKR3zO^+!L@ z{UP@JJS1P&AN8;w9k7qTH%Pv&Kl=X4?6>E?N%D35<@|r2J^w9|kNw`fWBsJweQ1p9 zzkcdH`}ljCv2A2|_!?~r_5f7Ij69Bd!|`ANR6KYVCX6Z`@sU)LY?;NR}GkH3N>U)Nve-#zyH zLL^_;AK#z$1pi%o4aY1ivWB*Y%h4SAzcm$=CHq z_&wfjAOFQjzOKLAe?ahylYCu&q#yed{1PPJJvG$)pNaS@nLxh$9bx}xg8yLx`6zpd z_kSk%r4q=;`ftgafFn8(@mD&5{ILEk|Dy!*!}_!QG702|^%wtRBL2!IkRR5c$f2pbeGkl&Jw>=^Gm(tJqFN-hD#mtWAV$lCpp5$Y`Pd4O3-o*{=ZzbeVceXFDT9uoh%D*t(W$%E%BY|O7l^5OIHQTu&T_wwd*{>u`7 zsY@I4tCM{Ayr=1~SMI;MI@Wvs;y<^ytTDd^$;Wr+#eBP^-}Z~e9$)G(_Ej+E*ChFf z`)A#EO5cBupvRZ^A5_JdUyJ19zT+(2_DKIn;pgT**#{RaXUwln^0EGoD6~uJFM=by z@r(aUTXX;EIwT+0zpd=H!>zlB^7v8**tVMS`0J8<^xOR0cenT-7O3X&5f=xhlsD$r zBl+mRnp%3N^!=}i^!TFx%jWN2eUdN!=R>zk-QT7G9$)-dYnuB{Hz4__w@v)-cIki5 zbIRkR3}*A|=KO{vANiK)N4L5658m-2c5T$;Wffw>-{0|H$R>QI1;Wl)3*=B*{m; zyiT~`@%ZrN zT>q`P|6T`@k7=&=e_O@>dRe6R{N?<4zPbJ#Nj~x~P0|KL|Gh&zKKfuzl`((+J|X$= zpKJZkR(GCPc_*BIulyKxRAO3SvQi8=lu3Y_x^<{H9Wq|e{tsg?j&EvpE3|1f5^wR zRsO5k7ri*jeE#i0^0CkTVo5Nbk8+$IH+-)D=6dt^?@98fPn$OFRDREYRi^#ye%Jr` zH}m=wjQ}g)iOY)`O=#1xo zEB>eBeQy0(QFH&{&q==InYwxYtLXpUv&rZBZ}u_g_apf@|5)VP6aW12JxbERFLgL$ zp44~$-QfJIe~2IM|Gk6vN&Wm^{-09*H~f^;A1CV`lzW(BdfNL>exdPA{U_0PcH+mQ z4(9trpSu35&5GLlj}9R9$F+CIa(n)t=zrL&=07}_6gSN0|A8bQ>+I&6z2}c|sIx8n zjy$|w4cy-b&wr4nzv=VGI(yTe6LSCJ2<88a{ov6XvDW^dgURtD&-2*tt$)!6o%*)V zk@J@%=JU@Gl8^Jxwqv~SFX}JH=JPx7Wxm?j{QL7I$;UElT>eAub5`>|=KcP?{Bj>z z>+0t5KU91ErvAJ5{{OT3kgWfAcL+)!R=4+~t)Krejb9)%5&d8DkDUK!+2`JO8|nIw zWhu7An*Wu?H}yY2{nyWzc8lM3QRP33yl>@f_Vs7OHNNTmhkLJ%oIC8G?k}Qa(7}1o z??dhVuSaNn)8~)=$9{SCi~m6{r9blVU542EUys!Irq3V#qj3%QIJj@Kp3)!jU+d;V z>*xQq#y6e+kbhh9+fk{zeWvu6e$*H2=f6=J-&B9(S!ehT$o-%Dl>YMFxn>`K-)MYO z{jvYNlV-1jbulKRhJKTxKKJbT<4L}*zx2O1o@YJ&2_#?FU+x{OWzYYfw5JZ^18 zd;Ua{FYC`9F|zKdRXHeiD6v!R-vlTQ)&D7 zn?~|={d*`w=;}r7`O`_huD{&JQ^1}-gXD|v&haI(?^syLBa2gmH=Zx+ed^~Zf& z^AFhbXOnzgf1HQU+hxz6L-KX~(GNcSP5bzpOY(L7k$*q&nmvCW$=CIl^;Z^q{(O=z z>&;~g>C{1teemc5}{muam4 zpK6`$`3p(DuD_Ih2JPc-5y{u}M?NU?W_$i(lCSHJd`OLT_WUIzU)LY!KTFcv$KO(t zuj`NXSc}y5{ADCx*I)8)DeU>nNxrN%oH=sd-dy=VBOm{MNBj7TCi$pyNqcIRsed|?C@6KX$v?K|$B=wof8;;^@!QAWN|LYZ5C4tqEA9EQ zBwyDb>yhru?fE{Euj?=V*GcT-&rkAo{c#=<`^-N7w~FNJ`Xe87?6Ez6HOWVvd;P1^ zCH`hA|7W@PzJ-1Kts(hX_uQW|)jj`G{?9lMd9Rs0e=W&}-~7V9lO3FcWW615*ME)e z`Rho&u0PHp@-4BCzx5-wYYcicUD{uYuidUu#4_1C{B|7X+#)NW`We{m!q^#&z+O_X|z$;$s3 z>%qqL?fF|tKJtJ0Cryz4_XcM|{?B#o`2muz>yLVjNWP3e(!? ztK0LBl6>)bc{s@RA6OlbbNJ@f?D@w?zOFy~*QZXkkH6z2U)NvquT$*#CrG}oKm15` zO}6KsB>B4jl8^n?d`fUnu`) znSZO=$KPp^FMgx-x)i%#Zf*f1c#)`lBB2*`)th+IdH3RW)xrbm>J@L}`LS`b(1zhpJLk zic}GiA|N$1k={FmB0cmbQbH1%6d?~K^pFG+LV(blfOHX&-=6#A;d$4r?_2MlN&b)p zYq_qR`|R0g@7Xi=mh%&pe6By`{|8->$KNF-pX*Qgm>ZYn{L4x{*PrS!+bZ~1lziH6 z^uE-=p}wPEgWUVSYANFHs*+E~-I?mQaOm9k`?=w$|4XIdUsLkoGu5Ix`Yp--nfieb z)sxRZ*Oh#(KdpxsDdO*jlF#+W`LBY1Q_1K0lOK8>1^k`N6F{<6ThE=|A&%~K11^#um3I9--`IVn@m1_53m2Tf`2cWe6Rnl_WAE8lke3Z zIw<1r&t&qw`fK?QlF9e#ujM~XCf}<+)xUkEh`&e4tl#evc2f4jBL$44Ie)rZ#n zXG%VuH<&5`BEsVRk5O&Hqcur~StFTVj!S`Yo@IPd*IcPjXoEpDX!v-|3?8 zDD{-^D|3b;9=O5!23x2g%KL2IP zL$B!lmNow$C7;S|5_3f%?=iWp@A-*dZBj97{!1mF&O0AYK8f>Z|NruTBp;Z(tIAvR z|5ft;HEsTLK0S$h2d}2{`Jb3Jlq1W=R+sy>QVRp(^@`0?ZZB4U(=eOLdmCoi?7ZfN8Q1IbH4G1dzngAw&tf)@=2aaixa{J#+YBWhdoQ!Dv&{uDm(nCm+c>U)0p zpJuWje`%C_vOB8O@CfdI$`R?~)3J2xLba@)Kdq8a^)`EEMxg(5>TMq%eaO@6TJzH> z`E^Xe+qwBikoPFu#utB72Qg!V{ri7I$tR!FUI~X$cYLFtk5Avl`G@VFKfRJqdGDAa zhh3e`x{vl>MW=?MALP+_d;jkYN(YCjQ6|$A4X@Q-qfPH|@t?b|s(A`_iWN@##K_tOrB!K5Cz{AAdQNe4797W%JEH zlz%ICEy;hbkp26AQ^}|KH|xxU(0^%w@BPy`#QA3S{_{DNeA;LCE$;Hke~|v}nG}jT zjQN%9$KP8@KJ`ByJaORl_@jKlk8496>VsP{)87C7Z6zQ3@4@>q|NU6kr$6nBYizOS zzoX<6rhoDMsC%pWwU3W;`7nF``CLjq&HE9rJP!524e9UWBmXkBiS_*Vu98p3PnXC0 z;*Y+EL(+u7k80Uz`}oVP>!+(|Y#& zyh=Xx`@Cn?Uw-ss=0EsfWD0{1+sLo%`T3N5inCeAJg@oGe^xRu6n=DJ-!^ss-6H>) zU&*I+Z}1u)pN3szaHvCd@b^pE-+xd*$*2AAo=!ghO`7-HMJ3Juwe0yHB=J+wdo(`@ z?jQft|CH)&Zbv5~{}?mCgLC+ddBep1X9XGmPfI@ayS7?&7WZGQ?c+fm_K4wf|G7ep zZ|gru{=4tiJA?YC&w6<<@7BC2_aFRF`TnWyC~~@Q{zVO`B{;TX=!W^;#==soo{aKjlFM0p(_KHXUi>G&z|H=n)|J{$2&yP4C;+y|bfAc&P z^{7Ev?c=YAl27@!A3}WdKjmEu6beH>)JIe7=f9##KE3}9TaGyhS2O?9ex!M;Fx-dt za+m%1E5_cxt^XsfGq?Q}?V#?XhwJ~d`i$KFvAB{?d8Ps{PNDuU{|_GQ`}$w}RXqQd zV0>HuNt*u-H;sh<$gnQ1|5)v8a{tMajBh*tQJ%BTh0{3ynq>5+_1}=Ta{uX4NpT`;f;eVY{?*Cev@oncnI%mjtHXi*q z>COB{?PoJb%ICi_jBoq?sqZ<*jTrcD4m0{w|8-z*`TH-+__q2}x%s_kr?B1*G5XWF z?_2N7-+wvAcaj!D|I2?F{f?2xQGYkn_&-zLyLvgf|8aT7xAlLe{ZG{yM;xU4jsGp> z!#@2{?tk#Hl23k%nKwnC|Kn6!5ApzUL*?~{6&T-k{-gDGwk0Rf|1#F-Py4a`JJ*Wi zzarz?zJHwazT^7;rZ@W2y<>xyt`hr?R$_eH_fPTu-Gd0sy9q{r`2W?F*Z);!eB1b= z_0G1VC-L4RjQ(?Ko6K`Z`S-61Y z&-KT-=c9$<=dZ2gbNwm*cX#_@F~5$I&-JJEK(Alq{JKg$*B^Cf3*`KINzg!vi0phUMk_PnCRH?>E@G9_J5>jQ=z4zbY!{ zf2QPf{c-MlT^@h+m3*#0`A;>Am-8Da`CNa>hb}%L=QmXHx&E{s+&x7ee~pxUu0PEO zZHLSGpDX!Xe~iBXIsXeKAN`Ie)?we()A&Er`hQG*dHj8;R0q2zP@={zQVV>!R2l27#~(^s#;zUxf> zr2TIidHl6f@+t3q&g?g--fgMzf5!Ls-+AKoZ)+u=_P=+REl0kktMPxP_n+^XoZm*t z=lWy+v05H~Un}`sf7IPBmh;;x`CNZGhZ!+P&i_Wq=lUc6^oczF+9~;5f0~cJsV?V# ztK@V2DIb|wUe0f?kt3mQF8wG zN zN`8G~_>^wZJghrvJPCKG{&~|mIlsG-kMri{{quE{^G7QA zTz`Cj+spZ*lzgr~=7W^-_#3U{bN!JAeHA3me~wY|x&GvTTI{8qKUT@7e$&pG#-Q$| zit&G@`pe+`^7tF4ik`JGspzi4Z{loY_Q~lwed*u8XN$O0?d8fJI4t!sB%j18(l8^OXlj`U@Enxhg=|0G@3jP8mpX-nNFctB) zP|4@|qyDd@JpLCc`CNaxkF>0UAEe}S{n3B+NFINSm3*#0?LV6;_)C<0u0Pge59QCl zRLMu*tN9O|d#&3R?$+NZ;%`|p`S?AI|1;`;6#V7Me+W*YZ~-lke4E%U_*LzE^+BfBdS5zctC^d-d1y*Cvzi)nCj1C5bQfAEo=&&$Kz` zP~B&N;~@@oFn#z~hy9$|{kw(#$vP#U>fLS+J>$@y3;xUh3G1-!?^*MIRr1MyIxslK z&3laref|9S4wwDVn!jGjC;yFHb>bcJeF>cF(;sz+^WU)MZ&30n-OeC-}IGajZ^Fx&U)297k$Jg%r zC;un%BPq5c)FEHG=F^H>^Fx(<>i5f&#mA@pc;_og{)=yvw&sT^`Lx^}92Mnq%=1$` z?#~$J&^{#Z*s|9AElNH;Z^;LzF#l!i?R)?5#V%t1{9BcLs`qS^;neHrr}S@u*`eqM zEL+yze|%dq_?a6;zUI^Vzy0=5#|*>C-3wQ;)_=Q_Py4NmLn8709a+(*KlWwe<*fNT zlzhrJ*ZcM)@(-(8`uOlAsBi!LzbW}t|6C%^37r4#9^m7{e{qVv|MgBKAM1}@?|*j^U+TZs%p7<=E_dCbyi2JO z9^6B=t(n|^ZIAN#DbC83@x>oa`zK5KXJnE#Fc7SdTD-8SKn3neb_xqH5?7Lq0{I^K|k~3W&##uM*`Qb`F)qAbZ=HpZS z@eAXBhdN`mX%sai|_+=DTwL!-I@(>;FXOO%J|HK;Oyu zK^}*$AN6FH`#&90zJKaBt<}M|{-Ax=*(zc1Vad?Ke*8x$`83{o7W938==kNE_F)d{ z;9~9PpTkUlTmMb^&R5+W=9Z^0%`CUw};){RsLw|lJ)P4T(b*?QU&~gWoRsztVo-Nm04~;z=c+zJF2vvEcXX z?|~0g_v&*0y-3Elo&U}1HzafV3*Z(v`qS_8_a6EDdy4UG-#^Vii=W5i{-NpGEbNkH6?7zBK*Z!KScpJsg9@i)}8yO!CJ;7}h*Z8QF9|K0wUeEgkZ zd|UrDT7Q%|e%hhFzjJ*(=)V|Se4W^TFILH?{L{N_VldyA3h-bY-Y+lr|BGXMTmLuu z{+37;?cg37EBQ3uT9rHv|K%0N zf1CE9C#%Wl-*b#_JN{^$b#Hkz>c37J|81f~l>VQfb{iz*#O9lD-dx7z7#~(fKrJrLk?zt{eYn_(5!t`)^)heB1X=-@T?0k(l?} z8U3mLs_S66|LRr7w|)QA?=|!83HYxbGy2na@YfD<|J`ehZ>vA`I|N^k!v1fm(Vynu zFN(h4d$tl$TS2X$~@4HC;{k_5Xw(pH=~9%WcLVV(C9i z>y7?tBOH1UGmZZ+?SJDN%n|eNFura4(K&aG#mCV9GT7)(`_J;#mx=j*Fuv{khyDi- z$Nn>9qeFS9 zNyh(~^6^b-$@%{%`KWUYUXOFH4#xi(_4k$K{Fh2T*PqVcQazN%-@i&e*PqUV?%$O2 zUn%)qfBZdB&iBjgp7(mse{H|NTz|?(9GEYUzZ6P7*B|rmbU8nzlF#)gKkB%#a(*f$ zpPs*c#5#BXS=POOWoKD={H0d%>HKl{-)ph|&t&|cQTJCu&QGJ{)8{6C?KSXUJMZtV zzheC5{Ip6w*Pr~Ss>aFVFP)Ol^~e4rQqF%v$>;jhcj%|Xa(;RxpX*Qi(cMGj@s~l# z=law6f2DqMenusq>reTBeBI^zOiDi0KV4t83j6={#{U`X(E{@L%dF%h-}?4S2Ytu6 z-TU7{-jnmQDEV0b1}#VZX+iO5eoiHy>reZ?IxXby z{#bu(mdD?_N$s-{M<@D*B|GfYvug+lzgr~oyWFnERVnUm3*#0NB>bz&d;mlSO$$;eYu;&M%_m)A{Gksex|4rSX5JdayLl<@};bKG%O`?`j!ZERe@vF(set zPx*%(bLITvNyPIzC+C+^^11$W4jfQg&i{{+ zPre&9XHP}_^`q0S|8l-(^7t#Q=a*OVx&COQXH5~Pqv;UOyt19_ie|!(8$>Xn@lF#+0^l#J@IlsD+ z&-KUnn=I$oQ1ZF{*bfzv$DgC*bN%7_@sXTgQ_1K0WB=_h=hss5aoyQ0VAvwRklF#+0 zew=~|egh?+&ifji>j3|?)yDss($AR{@z+qv$9Ze57RWnwoEr`wsC{?k@!v?v$9=D# zS9honn*5)!9#-%_SMs_3l>a|DK^}i!DEVA})IlitUn==re>(pztl&3R^11%-e<>)B z|0YU4*PrI2G75fEC7zs$*1o<{h$wfTay2?BL2QgCLg~<#-#oW1;2SR z`Ck89oChfQEt1Li>JJ?h@z*k$e6Rjmeye2iz4~kUt&_?3>W}@OBL3PWlke4E%l|r= ze6Rjme%mCz)c=I;Uu|+E(Q)5fK9pl^jpOEkJ_I5YW_dI;8JO70(l>0AytJI(N8~YYsz`bMZ+l0P; z57?Ktd~U6OdnKRlTlk^exz}9!eP)<`K-6JO&FcQU#rywG$*1$?_5BlG^Xa*Rn}<2B z|8Gufeg`F=M)~in6CB$2tj*-ppURNKBK)lR9hH3Y8|m31?)CH2eH4+?LeYoaa>rZN z{7y=~X}kU)I{wUSKGkE6O9*xE!JCrbn%_Bz@9lrF^*>7wM*c+WKB5_~7GkMdyu_17@D|3X*Bx1Im! z{l7Ww27F)Y8vQB%mvXp#{_UpZ(|j|i?^V=&J~q!!=RwO#%l)T*V0_#0NB#qs0xvs% zHNCRx&Pb0#{-;?o$mjp=Nqp(|w~je*ztYebe{>E~+W5aBFH*q%{(&A!K9yS!m>&B& z{;B@sTKzCL58Ar0b^P~a`rCg0$?rJ*qFeCaXkp@y@;_HP$o)}Qfh=YP8AW#7;%h`;ek<1ew4eEuJxHOuxW$4%MOm zY~DYO!<8xJ{!@dLe2Tv}3dO_kxSM%?_#cGG{a1csd|Uq&@|!DvCJz0t{}}&EvcG8E zRqlT_nDK4rf2wzR*f9a)Z@+ndsz3eou-t!gh>}nB4t?U{-MTB||4qx!4=c*QKSPy# zT5s*^dDh);82wR)v0DE98OHdw@kjfgr+=Jxs1GyPJU{k-AIsB(KFxQ#y2NAs@%c}#|9Psj^7(%x57^h$F7 zqftseeSh2ZIRo9F8~0plhf#bt1-~y(0Y9EExG^F7{<4q z|7pElK2IF>or%W(p1uQH6#jE#mHgw!jvY&V^^EI3V)RGeX{+4-avbB^jz8*uTpfBE z{+Dsaf12uF8a9@Hf5tPu?fg&Yy>H!$!+m!JjQ*%U%O~G|Pf+sdeIJ+-i~gheX8h53 z3~eu;|0gQ>^u7O&5{87E(zMV1f zoqcTl*Qx%t{w?|ZKTXM}{)7I5qp|*Y!{|?Wm~-Rg^Z#_lw;g}9-mL$56!x7DjsG_4 zZ$4Wr)<2N(ZRdab{x$GF4d1B%qd(;zm;NJP|IbkJY5u8uI@(?L2e|%&qra5T|1%li zcKp#ji?Q>fkZ)dO^vAV-OXTbSS&VP%zeL~P1OG%~-?_49lK*JmpT+Ngwvtcz?^laX zy5rvX-_rX}94D`T`B}-Q{bt9m$MOE-jQ=hC7q-azPvxf7*}x#mVbW<}qEBXApP|2tH=EAGv4&6g| z+~`kv;9)ryiQ|6}i2wm*ir1i78(Cr)T6JNF6IX@eqho;TuKZmKR@rE-t&p1 zfA+)krZ|lAhC{~xmh5Mi_)QV>7c2Sn`~!jyIW!NpGyb=f4>%DsUd&&@__q4f_x{-gByy0N(!>BvmVDv}-SL&JK=U>M7w(poePbuY0-f2x1|E4O_9U8&?#{rAI!L#RLQ zY{ozCAJ{K{|En0^_WhIJT>O)ye18iMzQZ$ij}pKC)k;43?MH@%VBY!N_&=lnHdM}E zqvTVaN3*e;9kUE?x}rgn|IaUS{#qrU>reaPYVS-C>;H?A&-JJC*hU%T{B=q`*B|{) z|H|k8UzL2WKm3n+PZjIGUdiYBQ~iy9dpUoDlF#+0>u0Jok@Ghy`4o2@ItSzar_puY z`_J|)mB-&EB_HP>8#f~F-QM^=Q~oK(JUKsD$)|i{tM%)V_o-_9pHY84UC!UEd$f-|7Z9wPmssob|s(u{{DEn7Ii0gihHmQxiUh|-=XAF zy~Dv8Yw+BA{5|MHOZ}6a|C^G}^{4yD&PU1PZ>N&a^@soLVL5-7lF#+0d{E?GIe)j3 z&-JJL&%!+N_}io8bNx~GokPz5UCHPABma?3&flx#qs)BqD%^h&X#Ah)JpPxy^7z}Q z9)J6l ze6Bz0Pd3Z>2b6rSKh7W5$@vGBe6By;NBrAMdH(T`lF#+0eE71*a(;x8&-JJD=d(L< z{$VAb_S?tGFN6QY^UQAjSLqJ&_&cKH)A?ugfhF+&@)-YTe1E=?^N%X|Snt;eawrct zB}LNw(^}3yrsQ+|ss4S%3VHk;SMs_3bRKskNX|c@d~ftA?Ke~^11%V|IL!e-x(#J>reHF z$EL~ou}VJIpX$+no+RhTDfwJ~IuFYqDUZLiNTeL4TUl27@*e$>;jh^m}%wJpOJf`CNbUVVf~n&cCJPbNzAu z&LBDewvx~Fr~6Pp*eZ{|J4!y+AN6;ka{eDmKGz@luV6XKyMLHrdr{?GV* z9C`fRQ}Qw2l^E&Z9AH;C?m_HcL(adi^11$~hutWTzsE{G*B|FU>*f3>NptMPxv{98>Pf6tVB)SKT4K>y)K#{U`h2UX?#zm$B8w>jM%+=FTS zpOOEsBIiF>^11%hkJhuVJpTSx^11%hk25wv&VQlgbN%uD`^fqKDEVA}{64?P^mFuaeL8$Ng(-JJ?h@s}x?e6Rjme&%HIz4~kUS(3^3>W}kZ zMf_z=Cf}>SmY*$|e6Rjmes;#U?Y|@cxmzRe!}ssf_$2?ivvN~hELzaw13L|C*Ed!+x~Mpe@aNa2LF$>Mt}N! z&ZJu|*8d&GxAh+--lX{t9IAVm>>Yn6<^G4c7~j_ajQlRIuet^Qn@IEg*neEy}**Utb?$%l6`Dy=i zs*c?M_X8!L>iwJgU&8uhv+;kXbD;I#%Ke85GX6@-=cjV-<3ShUKRnp*k$-)2xOn^* zQu4|FIWY1(d{4d`mE=D^a)_A!p^{JaX5W@eaPNN|>H2T4==hVE@6Y(Q>p#jj?}@yK zyjLxwKb^lFepBv$R#?fWdoJF2c^3y*x4g%hZl@ zC{*tMRD|(u*I(3c=9k_5{%kYPPwT)BV&&_vqDnsHf1B62;0!j6_{+@rqxH_--g5t; zVoE-hdpuo~;E)f>IHNzkhw`=L{&U3{-**0?`L3TQ9_L@TjQ=(KF9LoP$6pC0pYo0E zd$|6;6Nb6|(}ng95c5ka`Sks7TrSR`d+0J6|7EQI{QHafr5N9K{-N{F=GWsL^nDrq zX+1FQQ@Q`jf0TSWe_1!>Ec$=j82wRykY4V;R$9rYdgl)t$Km_`$oMbQ{cABH^8I%i z#OP9?JL~$dnej*Sz{hpu{$J&ke9C*(8XouB z|C{_s{%$SLzm#Wu+xdsScX4mT;`SuG{-OLs%Y%{d-T%$#kNTIo^89-PC7;gQo>V*O&^r8Y<3Ei0=M^Kw z&)<;oZO0$iAN6>phl%-(7~fWZ%D+^<7>T%}@sIk)iE{tf&y{?7-BQyTte^6Pz{``{hZQnoTKU&o}iu?a2baLmvPf~m*e*cY? zeDb{xIu(I+$0p-{i~jSA?Zo^hNz{hY|Ca3Uisfq~<~LRHx&H9~Ofgu@ zZ>HpP{c#?4W1yJ-m6Ff($NIZPKQX^KknUv^>3}@Q@!nu&=Ay}tTz77xPR(fIlqmPPv;HJn9b;aooxJ{QGfcCod30w z&-F+DZMNQG{o5+}Tz~9;-jMUZQS!O|=s$cV-~YE$^11%-pExK#|NK_T=lWwmvR%$^ zujF(6QGd8j&i_uyr~02}or0a^b+!9S*_a|iiM%4c_GXBr--*V*q zj!Hh|8^2k%9(ng7#{U`Xp9*q*CncZj4?mjw^7!klzg`QW^he%zq{2@z-6+ zN59vTwGN#_#2f!-`W~hBm-Bll`LzCjxB42~f4a#(>HI&hoZnN)=lWCncjN(i{Pj}u zx&B!H?U3_(EBRc1

  • P`F)gpu0Qs_gXHlSpyYG?k$>nV=l50ex&AnR?j+~;Q}XG& zrDD)3=zy3--{NHk{#Qm2|a(mo5+-!3G041OH{b?2~N8Y!9@qb4C zExnvSP|4@|)9+Jvxjg=URPwq0uK%f=KS;^v`Xm24P0s&G$>;jRkLPQ7{0&y}x&D-o zE745OAEM-Q{ZW6|P|hE!f+vUCtk?qXZSJPmGdVm`CNbaA@q{R-y|iU z>yPzcS2=&OlF#+W`9nuJe~OaN^{4vZpUTMNZ>o~d^~e2RCFJ~RNRqlJlo4 z`PBE;x7BRqe}is@yY*kU z{GZW(a8=HqspND0QGe4;9)Gixe6BzCKdt5b*-AdwpYDSm&|J>{S;^=6WBpY~9)EL` ze6BzGfAh=vbCrCqKfb?tshx`iD#M_?xffWB#o)3H!b^#{Zep zPbV(Q`3sbM_`PKqkGkV7#{U`hZ|CLwg-SlxANTJyk;mU6C7Lm3*#0_CLAh@wY_D=lWy)`;MHyRLST1Q$O+-Z^`+~lzf~wryb)^-m!@Be}?}= zf;|3~EBWL@NXIaXT)E;oWDZJhu`0=A((&G8vp0Dru=#0Svh~DlF#)={<*$9 z{#GgZTz}-BKb7-WEBRc1Jbyhoe~psQ^~e23Z_49ut&-36hyPP{IsX?WpX-nQr>t`R zIwc?9oBadP|JTL%KT|zIK%6}OepT|Z-n<=vd)Esa|7X;n#mf2Xm3;I&{oEb>N7s!1 zGtU3c$oU(Te6BzISL(>)Z=;gW^*7z0le^cJ^EWB^Tz||zwdDL@C7jv{3sdq@?@*%!=DqKX|1;*_ z)AIP=qU59BtbTQ@yYd_VXVl*)_*<2Hu0QtQHRbWQP08o_qyEj2^S3McTz}k0q2TXO z^11%le`l1(-)~Aj*B|>K1%IcK&-EuCqDvX%&%aB_r}}I9@%rCl|EGw*-O1$RmoWa% zTK=A7^1c4ITK@0Je+W|Nrs-4CA(uB}^5d=M;C{m)70`|NOV?+I4Jhe&Dox>Ayah|C#-we}AylQTiW_OPBxqe=M50 z=HDO8c333+lC?_~JN*0qI4z&Ke1+4$KXY`L>9l0=zdl>;=&;EAlzw=Q^{t67-d5ue zh&TEw;%)7}{%!Hh&;IupO*Q*r&JxGvjx!feU*c$Qc1*wKAIx0ja$S%N9*S*SkH>qQ#`ypJw5xnWEgiYw!HS|BR6A)`Io=9 z#2RB#-q`kYrxgbMzdtsLUsu{w{C@H8&f+f?Nc_9Z-?QlM-|ZG=7@H5hw`WmTS7TD& zgwq~f0x^YaBhdozqF_HTc8;U_mE)^XncsNfXi>iMT*Z!!3lC4MK-;bpWR z+8fb6*LbbcgqjcB1C42EAHBTgQ$NFeROrx3z5lC7{MQxv6*}x_kUA&dsOy|__U77f zW8;F1GS=Knw{c~{$i)je?{WETJPc^ zzK%TqVV$L2x8&a>cU|sp$;0Rc z0;r)i9~k3bOXAN{>Ny1D4&Flf#X5ubL8p!58fk{QKfB zW$?HCJUZq4%wpQ_l0QZ{bnr@)Q5zHy24CL)&nWV7pZTQNfab0Z9BP0X68&qe0dg^x z!I$^{EsA{5yGkY$8!m?z*L60A82cZX8(_D1!gv7tL0czY|PFb3oNXV+|^z3sCQLeUZd&e_e^M zDt|%Gw5wG}=l}N>;r`pxBZV!0>q&f7`FqS1_n$N_BzgPKV#Cz>1}vzP#+JXYN_0mr_Y9X8@Q@b*8EZ2hN!#8;I+ zu~A;j=YpcbXE#mw!zpzN-A2WB$49XW5?)uQfm(Ev&_t ze@!*{E#SZzo^Sl;S;^{qjn>otKRuN#f8UV!s`3}?ETc2X{^wV9Bk5s>`SQ1!#D5?* zLhJL=^ncUJcJ+-mc_?@9{=VH<1qOi@(P#(1reJ>-zqh%>KdZ<$rEaIXujb*p`_yq8 z+MnO<5liO~2ETu$P?C{$1QX zkB@eutapTCEihUSKq^T^(7b4ERU^Xeo6=4BkC{cR+^zW`g$()eg+t)55v zPp_@y2S`pfz%G`>;M-~PVgCP9HxKRZe}A$K?H}WRPGR%gO8k9_?T2kIv~`{V=Eea} zwv!yLnPz}oI?rf-JBhC<|G@0@pSxK!|Ks`er(3METb751joA2 z{^P}$e;p*gs{8@7$MB3S!?gbT4Zgbv?GDQmY;5_{QIikzZ@n$c_`-C*e*Wnm^gq4x zC13t^lK86f58OU)hh>re7qlDKVfkl#`PW&K5Bkpsp;?BhhTpm9wcGgEbi;Yt@#S9^ ziLWaEz~Ay+9Ql7H*zZ9-aL`D;{Oc<5RplSpe+yEx$o`YG2hYC=%lPuIn#z zljCj-GNdDbV3@OUWYll!@fU*MOX6=;)PHdQU7m*e z-Us~-pd57g!$$I7!T%@ty*2sZ?(?6YhH@wO`hL_qF1?6j^ZQ8rR}|Y1{_e{&>AcZ@ z<9?&i3_EduCBeA+w`rJVwErzlKExY*J0p$GzpM7+`7ferBAee=;;Y8LfWN)l!ZeC^ zxVPVcUt@GgQjUKSeB%K5fqN#i`EN`70P9^m#P^i-U-a{ANh5vl z_5s|7zwNCae8o zGyVYVFA@Ft^2gBRH#Ea6iq9vZ-7mn=1J577wT)-Xzkw28RsO;Guj-j3I{!EJ!1JG9 zQ@;Egq{)Z6x{Kn^Xe>VtmhA#q7;{z!?h zD*qtP)c#sL#{2y`)d%O@2b=lwZ-|96e|B|GGSc#214^uLHV6c*f7|`e=TDUS|Frck9;L}Y@O$oRXhXZx z@zcKKhYLw0KOm$3Cu#CQ{%mbZ>u+dfKkA1GNo@XPO+JiwPzxK{oxgp{56{2vluKsw zr%3!D(ec)^wEl;9mk;~dDDLFAAL@ONeUixz!07)^B>oOD5zF91`zx=GLVH8Q=|Kkg z!@r1%qdbU~>ihqvntb%LEsHYX9CoTn5XIj%h-dSsYVtAPV^S3QA78%`h;jd`w($AW zBz|qh{zv=gm?%7dl_Uky{_|@*`GFYyKV6fLc{Zb?@ca=H7KnbRKkO6O{27{jus6^8 zILd&ur$&B(2AqfQU*+>>YVzUO-DXr2w)?HbK%56_hbOYzKTG1DvEId_wDk}BZRP;^1<(Q&&nBBt z{#8ul^FNdLA|AM`{)e!WE#to=`|I;{hL4$cRQG5e>0gZXw^-tfc$BjEaPDvQpoH>I z&#cDz7rZ);&VLO45{W-ras9(_yLI{Vq;FN)hy32B4pAH;WBx6b_+u3L;D26HbRP5G z>R)z4`7_AzAjRJ+dF^FtJe zb^idH?A=A^H*u|!QbEG%z4UpzTk$>xfS^Q)e>LC!7NYwBl1nevFjZ%;jJ$qUgh}@d7rZvp2l-;9XAj115EQIeS|UoYo+$T zD}ZJ2q0WVK&oh*7QPq?D{ymSd=l?p1ue$yr?|RpPvuJnC?&L#y?}EeZ^}k-?k5g3(kpUc~snj@<&u4qnZR@=+D)PYBHC z5`U2OE*|3l$@355Unb;U#CG3Z6-aT(o@+u(5$PX8eX;$q z!MSuEXY~IjiLWaELI3#D>nz4y%p2r`dSLI6T=x9mEb$HNT|7$be~fqPc827A1y4M8 z6}jY6{5NC&*&^{pJVsf3=>OaEPm{jC&BGXO8U&ip%cXoMhWv4s`J%zr=i*hKf8hVf zNIr@Fzhe$Z$^Z7ihu!~MCB7kmW$?lOnzT3{^S!3`@uhx$=uPnmjQO`slMne{EwT$R z@B2TE{V@(bGm_8WF7Z|659FOrnsyrNt~8k&NO3qH`>^HD4vF7cvH#(`f2r9y@_*h5 zCI8P0U-ZX}RH*+WFgqpwMC)BV#Q&4$ALJVyA5HteN9QoK!!;U`LwP_9{w|3>NPw+p zY5eDA+Skg$)41+@BLWRG9PMOmCBFRKE%65`@xUMEf?dCU%BW<`+&VKoktk`FXFw0{;A4`^XGQ=Jn}!T4L~_Otv;XcDz#s={u$Ig z8<2g%*kBq$`|S=Q`SX!4`9B%@hnvJ#l|K-FojWz3;{G0m;5>ZX)sHQI_DlT6V!>OV zi&t6xK;GHzoHG=EYZpm%$XW+eJ%9%4`sV?OFYIB~$EBWsvHsDwXDHrrW+eJQXWh@l zb@-&dI^SL5tIA)9zk1_jKJniQ#dGi%{rU3upu`vc@Uq$u`8PFAoAy zz5bgR*FzG2yZ~EI@&DxU2YcTow>-2rr)>@ z-}8-p{$Yu)y8a>V=9gEp4gB$dK-`C#2K%$u{}D|-)E!CfmVpu;~`V&LL`Fu}_ zuPT4Q{`~joT&#Qc{?bs~2S!W_V9OsbiLYA!5#(=FXddR>?urRV|F3KHAm#dxVqSYo z{3l`~vOX98PoDo!Z*f@r0*XJa6HR{L+L3e)V8|aIi7(`V^>L~45B!{UIv3FX+bbIN zzQ&K!s2&P~e^lZNe@Iz;i2u1!`2^`755w`?^V6m*ioay&pT{J=s{Doc$1BrwasOMf zE)>_nH=DEB`tNaxuPT3G-(TA$2kmWj<_1&V!FSop^*6=5^3~)+`-hnF2kV}i@dqf6 zzvuJ)B>rpSi&>wGS9$(p{`<2uio1L>1m$n^+#rfSW%%FyCBEwV$NCeUGN|s@nNadW zmhjhqfF>XG&jxl`$X{*?N4w7?vmaFJ&x(E(@uouTR2BbFM*rjar*#h1-*t&ZKim%o z!e~EatbY-2CHP;6zm&m;xTB}9=i&Kp#+7KazYj}_rTwp-y8aa`^?!u*E*_#gHW9 zf1%95ckgGR-W{40j&{hvY#J^N}FPpynFHa|+@tLi@x|8wt;REj(48j1EF-=h(1{U=(J z5Ag>>ucx8ixrs{@%H6NmM6>xZ5`V9l2-fGNjX&-`^)m7N6>uk-&YgSWDF28de_|zm zk@YSfrSY-eLF-J4zq}QV{qWDhBs>RHXYg$jUseBv<(IZA1N|)<1ETQ!T_Guzt$)Tz z{7s_a*0Z$sgWtKEIsf2kd!OdtCi`@@{Ee6R!XG5QMrnME{~nowa_4eLIO?DOOv%7F z%p%76PtfFJ{Ow4}za7^v49`Jfr}_LuiT_w}{zLx5fd}!l?nA>-|LktY<6>Skqy0$| zUse8q|EK5Z1hPA&N1*(5*~DM}$rAsPV*8=)>rb^44JdcJ`kYnwa9}LOzc*Bu|0xn* zRsMj!-#sD`^}Q{LQMeAe1=!f~CspFtS8PAT--Vm??y&yb+-TARcgN%RcvM%t{b>^a zy!9>~rL8|G`!UYU|Al=xerhzu;fE#~P#5`620vZm3w@w0KFB{WTO!tfK4tble2=ki z$!z^IL*fg4uq-~zyCY`4AJ`$%zl=n=Tl6%A@<15#FH_>H%6}O5c7qe}+#8V@fpT}B zDUUHOh@t;xNqk|CEvx;Qe|PW5}OuiNBLE|96}9Ua;982mg62FT%_yCTUCej$<0 zAB^@FNc=(pww|T&!T!0dcPzy{b&sSvfE$u%|6%Y&zO(3dRX)_6yYjllPmDmj$FP@^ z+5FQ|`-MG1bVF(F$NOF$#u!isq+XW@vI9CNqaNnSkUwW6zUuuSQ2*uI&BZj{e@&)3 zZ1)1m{>O+vJS*|riUwPsi&y#l4gG)7wHW7Lg4;B*L!S00`x_(vTa33De^oy0e>Z)L zQSZvPkh;Yao!XB{-VKUv>)Q%-%Bi}yuUPivcubsvE$#xdgtHJ+1vhHOm+af z!|eR0i<*3h|Eu4n1oxk%-pg>_d38F(=6|8dhxp6j86}kO_pKAw!Fp$*JDYz=lMngN zuO2U<`0Lp#Dem(o)j{LrpA}2||2o{P&&6_-bys2?l-4o9Z29}8CLhNC;pc^P|IMGPaUPt>=ga@g5?@vRg5RrN zP$Aa6sr}Hc}k^T0fG;`zkrMRBzGTeqCEV}aFWN2`qSTP^1=ST`Hpq}MZy-;KdwfGviaXh z{Q8RR2Rp~`iUkyRvUe-(gC~P&JQ(Z$h9)1%d^c=UK=z)3?WBiP2x9YZN_$S<`!*h=_?s%;Z2nz|uUh{e;-7c+$)o!xLw6dmAI`5HN%5cz`S+v5SCzl8{=XWY zNB-C3-Nb*DFMsc8^5Oh(Xigq-!~Wij>+h3+eEIv6#BZP|f5GnRu_KTAd$%j*ombo& zO!>f!{GXpS`C$JW9Fs@$zwdsOgWoUg!?Ve5R__6uFNc;|p?Fawc zmV^^@-{hhrO`5#rX z$?vei4eOBiY7#~7jPZXg@m25thWl^6>XJ=)$4mC39jf=c5z6;}i(!7E$%lK#4$a9X z`C}U?P&kw*>vt2bdc;o_e0qH-z2`O{Kfinx3kILb?Xqtq1*H2 z@9z>{_5OA6zyH-ThxGlZ!{~qcxN4B{{p(`{-o>+%@(}e&w{|||; zDt{pU{gp#GWPeEargM0NKU@C%smaG5dys>9cPXuoQ64~!ADjP|#8=J#0>5|R$Xu#_ zwZNC`|4;e(Uw=z{Rrv??w-%+QQM~!ZgJg%Xi)PEee>C~ve_4DvjqF`!{S(N4zA-D3 z&3`8GRpl?%f31^F=l@ZM(eHo%WH?*?JeT+t#lo~c7q7DY4eq_l{2(3MyY=rQ6n``% zjOu?e_TLwpe2hEWkdFR_WG^q&!>4}}!seH=93R%BoT~hT{O2FPPba_c79W)VU0s6N z@~6BeAL32du@N&NVtswCmi2*NT{4xF{EQ9)ctuM|y`vrj%|IWxitEkDx z_}gKbSpQ;C0@Xjh;1|H=SCaUu@(=XC=GC$={-jEq0NVe{1+epPD@*)etaq#X|LYEs z*Pj{wG-Yd}WR&-<$9tk4vZQYe`QI4puZkug>Ob%7mrU|E*^A=8yrbCss+xR^^In)t zcDFZtNDpin$>vv+_^R^HO#eAOAs`v`?iC?NDgGrdoGpJ|lK7Pr*B|I#?Msp=?q~aP z+<#B62_ru+WBpavC=e_a?6z_QS7{(z!=)=GNL)1GK{9nai z%Gm!#nd;wT^S&L-gWY|cCH&&@bMtV_>me?86iL;a71o(XvFs?o`x{O*e**nAOhDB7FB!QG~Zv*n+N_ZIxhit^tqcX;!!zEtn|rT&3*|En#`fV|YxjQpzxQva*+ z;rz32XCl>|{UiwU|Gufr=Qq^kL;bVJI!S1M{$zhJ*5PU!7s_sbBZ;q?|AqB0wk47N z`C|y#!F~DpXRk^8bJlxV`XAmmGSr58&+i@l(f+)qqK)Ez80+tKO+MT|+G?VW;+~@Y z$^N`Bmd$Uh$%p>QS!ct%=Z8ZBDE}}shRtsx@gFJnKi%5=iO`b`EO|Q!T&eWyl)ihu+;PoB0K2YQSA0N)8s?_i=PL_ z(fQXk7~}3!uSc@^%_aV0>%FY?2l;=0u8qU`EB$tcP~MLjht18uYN5%8`4{+tK7$%p%AqyHlQ^u6I!2Xzjg-$~*-h=pf8#c@Ek z{{g>XV=>iRoi!Qlzso<*qIgV3{99*{%{ntb$scPt_M)68Ya4Y|qZ_tNCU_A_^C3B{iUIAPuMVzV9)%0))|du#F` z-*NKM5{i4YTZ!}Fwiyq{<@b^JYZS*H?7!0o6;izIdMC8QY&@Pp@jwju_m;$0mA?>f za^sUi1HbN#6?Ff6QYKse_SNKr{yT4dA<4h=)fk6*I+`#4`$>FN`44ucBmRZh?$1Nl z;ryHJ%9sCdYx3d#1E;fvlyBX2BhI^19r^OVzr-J-IR7C3^TM-2vOA92jByaRcIMzY zq&Z{$4UqWnDDq+b_vu$e`<;_B>cL-K%fUL}0~q{wH2G%P=c5;P7SZ_Iw&6Lz!7i80 ze^-+a`p+Bpim2{WgPq8~GoQ~lBz}9v{s;TtbBA-(-b=f2|JxS8zyD*P#9yn(hy8!~ z`Fzsu%|M^pz{tNZK zT*?>FeH$yck{>!P6aApo81w&qO+M5cY4v6Sc>5d=hf#JjRH>{YaBl57p#@{^R!5DQfTXgSZbK?asgdW0=I>r`Z2+|KrkLc@%%SVJEKt#!b^HADtop zhD&@^`3w2~5ySFm{fF%)KWrnu{2QUkhxPZ5eV&2cb!9K=-{UG~vgPl`5`V5@|35ab zc{H|L_YFF^;ySE%Ba`}rG5<$u@*&^*wWvIlJN4S`NB`HK5m{{hD2YE-vHcK#{+pTq zf%i}yIY9BRGqWlGl+pgtntU)nO{{x@?weSB5br@)P?72(k7n@4X!4={&tDTy;JV*1 z&I8ZkJx25SV|Lz~r-Ku}R zbU)Ueciojv`IwCPH&K&smcKjO!akeozkPE6?a$pEGT8h{ntbqozvq)p_b#mh8Uugf#o7rgpICA|E&i~ne@#XIni9b(q{K3vYr9}?K+jt+w{Ofz+S@h0W zf1gNv)%6eYXTc+LDDPsEC)I!YAe+7ZKh@-;|N9`>d;OEVasNH|HJ?9KlaK!YdpT%# z-}1&W)c+mZ^5x$&iLZM92+V(HGyemY!La$1|MBA#{{0`*CBCZs!+gi2G}L?T3J+o) zRKLc2`8Pw8Kh6vQf4?M+?pt|s2>tML%zD_6m-&<-e`iX3Rr!nck87n<-Oq`K4Oq6m zMSS@?OX9CrT>mitg5OW4^X|hVn1_6CZwAHRFxLNUO+MVeb8SsJ)gN&7!Z@_w2W7JP z_7Y!J{=xY#=|(!)|29zkxrcfG5yn3<+V7yr2m9xVo*9&X9CHlq-aS|IcRKJDb)cgFjD`4|?A@ zGyenXklgPOKz6`HK7YQ%cT?HZrTZTk^KXGBAL`%Sd5iK7 zN;1934r8Cj<}cLbL;HW3mrQZ@HGRkqW0%h6FOvAG@(=tU)%=qU7_LnbN9q2_l61EG z`Ap((P#k~AKN$Z-GR0eLK2CACt0^CB7i0b}*5pI~$FxbY>i_y;9_m~5GwD3c;4hK* zs`3Zy|L51GkiV_K595A++?mOiKT9?FV1GV$lk#7ln)x4QIz}V=XMFxLiN8Q`{6WuH zwIUVujXv)O;yGyU5dQrej+%U^f0sTW4aa?TauDWUH($%=J4t+TACKsU((JEr{@(FC z9>@Q)&BxIGzN=g+#bGk!-*Sn+Ux2M=X?zH?Pim5Y@+KneIL5#GB&3o)#+d&rH2F|} z?n%D{%s2D#^2PesYfSkIdB`&u{FRz~u>W>-N}&3$6a3KsKK&`5ze?h(%0JM5oI?^Y z?yHTRKgJ>L-Awto9Qn6elMnURdVH6F_P+hC15oZ4*5J$EH4^`G#rX&ESJ6EavF_sD zfq_(iV|oVF17O5ouGQp2ob%l6i4^xgB?#-kWTx=>>ooaLe`av?B#L`B^FP2IcIK24H7>{kq`cl86Vo{{AK2U;C+OBQ!ozUJ;wU~ zT$2y?Uu_&`Lwi?Aq(AzwkpeG_Y3L(vbsvV1!G{*CRLe7NT&^{sgFyN8Ei9fEDA`Ry0^9@f_=cSf=Qq5Zv& zMxoyGr>TG9dVG>Z{x`<@+bOkQl@Ia1_U64apoTVRVC8>&l+5PulKA32M$rwW>7Q`_ z+U`H-zNfoeg0UYaA55ltpp5qK*5t$acSx6LjQ?+3IfU*VzQ*V8k@%|jFF^e_#}A`X z-aGFL!Th6`8Y%4i7xrrM@%}CMX!5@`3q||aVRQe*@5RV}aM9%By-x|z=O_Ps)kJ~X+ z@6RP1%FY?KL`%sr^4vm@opII`!#kXP#t8({5zn@$NNvy!zkWj zQW)NUT1kWNuE~e^=hLxa*zX=o!_fZvY&*aG2Q~R{|HZYSF!KBF45K`34gMibzC8XY z4-WI&@1e<;#~;pvcQyEjHTm-RgFg0y2LFgAUmky~N20;^)a1+K5BEWx3gwT#mnL5x ze~5=G)Zlw-^5yXdd-MejzKzqfALd_BDu4WsY4YXqhkEoe8vNs$ Ye0lsq4NukJ`)cy#@rUuq`+xZV1ChI=5&!@I literal 0 HcmV?d00001 diff --git a/autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p03.py].npy b/autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p03.py].npy new file mode 100644 index 0000000000000000000000000000000000000000..6dc241df01ff81318f2a574adf33f790f3adea78 GIT binary patch literal 128384 zcmchgdAv^5{>Pu^AyZ^XrjSBZGG!j>c}y8HPZ=^RWek~8rle9NnWv=4ke*ZKIVU7U zRHmfJRW}kL8S3|aueHx_oqOC~?Y-T-{PA=7RqwO+UhA{I^P1S8dHqJM!l41-XNz>{ z+OKopB9#iXDO#j^pRRq26f01q%99m}+*7Q8{6)Y1eg5Mwp6uDB$AA7spS~&niN1aM z|K~r^qvPQJ{ENwo?;{rY$8|4hIC{JXwgJNE0{>p%Xkf8VY>s)>e$o#haQvn@ObaO{rh(8)xLM%F7je36{yv* zN58J}_x-wc?9)~LT(nflk|m4Dn|iK*r(YQ&A^j_@^LseO?+-YCPUZYwHMRa9Nq@d6 z#s6RZ@sA79fg9%J$y)kyRQ>s-dC{r8vW@yKTSBzSs{EsWPN=T`K6GhV5d7%n3(@hL zFBF|!-0)|9QXt+pdqT9uE%$#o>w{qV!>?S3&OWnXYv*MA@-N3a+>|3By6n>d8|JJD zmcQxhh3M|zn;yR}8UNP>TkB29nGnr3YSU+Pw*<=%{dpl;Q6BW-{pS4-{^{;gMRO-a zpRSr=|GYiH@}qxUhz@&dUH`;n{C)L1Wm%OcA$qE@EWpFT@`r~mMyqu=vFD9s{6D`O z^i!?83DL*-^{-(0o5B~>e(REqUu(s0*S^e`5dD5g_N5P>4VE8Dbuqg1;qQl3NXBos zrcTCAcO*pHvN5j)%a5kM7|rr%#bvi7qL7 z2S5M4>F%j!{deLA+7XZ58SmR|!u`SW(Z3^w(u{a+is9E7+v8-LUGb>W!3x3h(ZAMR zDjzL1+3**g-CIAhJ08u+i>V$gAN?yU3+~jLhR?cRuqUq8W%dTa^3lJGMca;FGSTq) zc^=stkE(t6Xs~?rkMp+g8-~xZcV=H)t&2&WgXN=t4P?QWnqc_POw5&f@>lWbgwsPG zD%&eqKKh55ady1n7b%r)NtON1`yUi6AN^y!tsH0g=-;se@#y8}>`Uj^^H^avssCKh+{!b2;kN&;Wr)q|rT?}8$&l7txCPW*(HlZ2)r!yxgyZGI)!Sd0+E#huG z-_r2WpP^Y3qVifAzBVRUKKh59-@U2fbN*z!H6i){zeWYiNB{8u+B7nJ%)Xi8f63EN z=`}J~KKjT0FPMyv-+7<-U%Ph7uUFmkD~9whul65q)|5o^{BPwcapaSaV%7LSS-{ON!PV^Q@VbrJvb!$<#~d#G%?Wz!8G|6{;k@hGoG|F_}ek6hUhkJim7mhgapzrW}YyfZ%x- zzr|+f{f`ZnkN$}K9lmnH@QKGpK8Z&OKOdhIEFb;B{~hy#;pY~&=Y8>iRQ_>}dww+^ z`V*4;EB;rLuMA)5{x9(;+i%2I54pC#{P58~?2VWA89ruL_FtX&|M6h?=pXj?$}bEb zyKnkg=l!1vmXH2n@15Rl_~=oA-{SiGyAmuP{loq)`nlnwyYtV-)xP{aRW#V|FZw5H zbM~p7hL7EI@5Q*XOAeCmJ~Mp$@1?)TRa|64=3x2gANEdoyWz|BzrXY! zah-p^Em%JKhriQeo8jYsF1sAp`S06<<)eSBxA+#rCmvn?YFy`^@4TL$&e6H>-~67+ z`FpqdSNxB~4X@~RF7+pz$Bnkd^?T`6N&kH^|MP#zNB^+DS~M_x&fR}W{0H}A$N#oZKQ)kKif_x|28#PKKl3ZXLD-~scZQ7Kl3I2 z!@00vez1J(Kk^Ng>li-qw~7+~!46)xELcAJhu%eM8$Ro9r^J7B{5M!W`bVDW^IC?F z-Se2_zlp5Z}hrdYvTjig>4VI7oQSQ;dhT*?mbH#7ZN&Z{;A3wY2 zM;zVrs(x)9_@O?ssEW5EFb+te}DSM@Hzily&6}3$)JVq`DuLW zAMw^>Zy5ePlJ%VQQ9Mc-JhHgFYyI=XNB@X3R+(V<=w7+yapjliT@x%H{X=ix8gKaQ z$FEn!qtpSH-ySR<{bRpn8fW;tkNy(>q%N!RfnfRQA9n7@R}G(de6}_5D4+knlfm-Q zKm4E2Si>hC^nt`bi9>C^5G)`4Bi{MK%ZAT$*OT}saoN_XD+Id!(LeO&r!j_4Jm@!x zf2#VoTZ84Jf2_9_FB-mz|496kpR4{|!Sc~R{O_GF7(Vt$OyZy9rB0M|&rj;h@MQlv z{(p{I#{Q%1Xyri1|4CEX_4oI~=lNN0qhf}S|5a`Tg+GfA)Xvn+%_I_x|*FbpJdFgbWOpkN#tC4G$SUW_QJzaTOQ;qg}9k z^q=#7!42Sk&c9s2 z^3i|vF7;`{ryptT+wo{Kl^6?_kN#t43_N7`#Dhz}6W9ALS~k%AhyG*dH9BDU*x%p3 z8&`S30*!*@qko*U<-Rt2&j0ZXoagW0o?q6d{$c-iC}Q~3easdAgFN)AcC}o;e?NTm zkNnflf`-rjFFe+XKXeL~kN(kr5G!E#D*q||hqC{k2$qljvEMi6HGJYv#mB{?)WKEn z9xNaIqyFebF2h%T=Xj_7G2rJ%|A@D@%Wn88{y!leeFR}{9_;g@f1J0!Wj1{L(e-aQ z{%`eQ`RE^I?(g1g_}Cvc-i)ihq>QD5<)eSpJ4VwQzN&kk6jycm4f6%dNB^kvS`;yS zmH(fTlz(*3FXvPL_}-8GW%$$sOluI2sy@7zg5{%s)Op8$H+*Tlw7{CjDzeDn|h`%tp@8~Nx*n>z9TO~LZfKX{*gZ{9!q;Z!rn|JxfZ zAN?cV{97{n=Zm`}^V1@(`f~Ok50;Pq@%|fqX`Wy89XuM3a{TAN5G)`4H7Y^zsrC7;iG@#AIEhxeC)29CI6!Akki5P(LciM z^ByyN*8l4xI+%Zs*daL?}yL&+cCH1id|(4pL+1r_2at!{|oo$uOB|^ zkM~`^u;CMSeqHQe{{D2aVBbIMkNS^p`3zs>f5rYK4n5_;VEL>+^nSx_hR^=T{#A9D zjokAe^s)Y^zh%zHYv(TObtd&^_b!^3h-7zq=+IzM8-EtdoBj7c3wBCEm9n zS^i(r;eDz;=Y0P+g5{&X?7vCL^4}`&EA?0E9GDy|AN?i&`Q|I;{j(k)9`4j%ObeEe z{)+i~^xb6nS58`H$YQ7dYGtr| z^bbF?Tp`299^1DhuKE)8?h2NV{_&kV+-3N*JwLxRDgF~IAN^zfznLumq2}+!cE&tE{!rE)PW&NPuzd6nH*?Xy4WILGde6A>%YVxk zEFb-&&tcOE!)HAf?CsRQ6%3Y-{;~hhC#(NO_ZIhY`frK`%SZp{b8eHY{+IkqvA$0J zsknRo!y)}EmGisX{xAHk9@)(MryuX^A*cSnu>1OBKYa8L`=@bM!zceS{2RyqEE6mr z{X=gnXEA*GL2mgruIIm150;PqQU7#Lviv*e&y1r^{Jn9oeDsfebDmqw^YcE6e4kW* z6D%M7WBp~xWcZvvA0Bh!U%i6mqkq^t=`$KW{z%myocQ0+VEO1De%^~244-(=))R3x zm*C3F!Sc~R?EhcW89x4B!;{YZg~`G4(LdsSos!jGPpVa&pslSo5jF?8j z^3gxyFSC>Ne^8IyYqE3x_Y0Pf{_&mHChLD7{+()ST;&DxGz^xH{!!<4a*Wx3)MHGQ z`fJXG(f0+*NB?N^x^tA_(+^W}MpFJOSU&p4e$V#2;S-PCF7?;cq0T+=U{r7GfA&B8 z>_7C6I;Sjy4WIYkb+$8qBQaP$`p0>jufO4Ak4B{aSq@Bbwq{UiQx zp{C(e|I#}a*Yoeo1!`s4>^P7qkrga{!)go;_ua+^Y8cT7gXN=t_&dL*HGE`ccx`9?PMcu)=pX(5+pe1U7xA!_bsYQSHuwCrjvji|Kl1%) zdKo_Pmr~sw|7X+n^9TNJ{rlmgf1E!vyBR)tuTLcYqxARFVEO1D$86KihEM-(i(XFr z_lscp=pX0beeDdN`1_9%{~<5){h?s_=pXCJmp=?9r6^$)uKE?7SLN4zhguHiEer04)A{&>wjKPfKlW&gAO zi8m~*^5_5CKg|DqwzLy}zE(~DeX{vSf4Ber@LB)ZdG+%fKI>uT1J3-RO78W~51;i< z{Bhb_v41I@?Pbf`lsQ+ z@>&1Xdmh+t_|!wDso>bZ|E2!uf4TlR|M9n;+-dmW@2u$PPmf@qpYtER&;GIDQ~zD1 zQe4GF4z_d8&*<~~C*OEHqv7+PiAw#Ox_|1m>*o*r-TU{$=lm!BSK%hZ#~(S^#F_s# zH&{OUN1fki*NpxW5A544uI#dF%Yx;jf0TJoxoG&fo#|S{qhHDR)l#1Z%SZo6GfzKb z_^SS{r89r{aIk#zk9hMJKN>#wF+3psA8P%b4wjGpvEM2jGko-CYiq~;4OMV`{`pz| z=pXU_&kq|u=g*_k|Dom|Web*%{?Y$9_AA53{`%>$c$6{lxe5i#NB{WFy>}bFe2%_|*SBA@ko<|4a5@`RE_{zN60=zG}M~Vi3X~QQTJu+$j zTR!*vtUmQm*}D%I|4Z@3{#NrJ9&{gn_rpj3uz&9=V)*RG`C@;g%T@0UmXH1s|7d%= z;d37E6#E;yXkGST`RE_^Z;Q-^Px;BY%Fg`Bqg7p>KYrdn`bWHDL@L84A9{P$xbn-M zUlc4K{lot}^1HGB$^X}SFsc6}SU&nkyuaHi!$%MMN&ZLW-)aWSNB@|&a_9Gk&(HI= ziq8=EFb-2|36g0@I{W7J}mY>dH6oh1)lw43>}n;cqX@Zut0L`=tI`z5lK5`Q?4;ANv1oR&)O2cJ43Y z^q(zlEYRzA%>MBL32&rZayb{D^D)^TS8~n14EFkn#WddES=#8x@EBx?Z4s z^bbEbd$Rfum4A`?8+HHOiHH3n@eksF zTMxV6f4;uI*dN51XKyon;_-Q<{uDpp=m){_u|LSSez(r>!8Vlm2X#0zUI>tOlVAJkbLSz!1o?keZ6nuAp;SU&oPzd31^;j?8J*r6UcR1k`zx&~%f5abJe`@%u|3d69*1?H@ z`RE_^U&a-Nukv0}f2O|wgkYZ^{iEJ-%NvGI-tk{jf2Q*9k$}Iy=pXavUVX;!Igipw z{gg> z@ag}^+|;o@YX!?k|A_Y=8({cq{(;oLsrr|u!Sb>HSm(L=7{1DXNc|gaK^xi!%SZpv z+mTNiKKip%>fcxw>3RgqNB@Yw#*`RE_@ugBY(=f@sjFZnN3 zel#jrKKh5we%-?G*?-j}|E0eF_+a_yALrd~jSQds<2K2EsrwgZT+h#t!tP44!&3Xv zKUx30|9mq;G4-!Y{~_mb=bTRd@7(qF&;OFo`e(mS9%}gHogd2;S94K%bqbcx`se%C z?_l`EA0Er?%pX5dJE~u+>3{uSK0oW9JZIfnhELwRW1hIO%Zm;Tme2af{_I@b@bUYf zy4{I?6$qBk`bTdYuzy4W& ze0_h>f4+CMlYeQB=s$i}<2#-CH(vzHNB^n6nE0vT6Zd@LF6aKyMZxmXf6lx1iwz&M zZ&*R6{&sY*eDt67UuB%(6aJfC$gzL>1y=KjQxRbLfrYIsQ-lBk#jz|6z}Jll`yiKlWAD`yyHXUWR|C8}1 z^ZaTV$^KLR$G+?PU;n4yU-S?Ed;Gu6`X~Q(pX@&s|KA-fAN^zheYMl@dH*eB|IwFL zU{A1o^bfuJHg5RzosW?GBYEgf0rSy6>in8bHhj__?@RvC1|R)n{$rl!3?F;^;5|ieJj*J2fy=oaoD z)&KZE+aG@T=pT0WtdXIZx_4Ii*aPKH+2Nyq_}{%ohhoeDnIU}j{twvUqkr^2#9j); z$a}mbe3kdzVuz3Z(Px)qY$!(E(E#Cd9z;L1!^i$3-}%dHp&0SL&cauHS99#}lkC6k zuZLpHy=)|W{J;HU?eNh*u{I{mpBRb}_o^y<{ITVO?C{Y)&fga&hhoHm?h!uc&YZ3{ z&M)Rdf6zb9nM2b;F?6`VlY0LTY_eG2zv)4L3Oc&xRsV=T4D26@;df^0m8kCHTh;P? z&-&+wkN(kbIDB9zhV1{@Gf~+c<*V7@qkp*jFAoXDI0w!MpZdow#q99WKl;30e@>r2 z-w9vEzjE5)qks7SlZJ<4tiwIRr~V`ovBO9I@V{q`3dOK{J{CUqz|vDotgJuuPxbq} z7>e=U6NJyt(Q&^WKKe(zW8ur8n5sJzJ~~`rvmHMAN4@cfuZCj0hc|>zJ@~05cKGNY z_V(KGp_t1137_+S+Z6BoqCWKx|94EcP>eXptxqSae)z0eKk&T%{P58~*4;DRLoxiV zw8Cfo7r(sJ3LpI={`+{ZP>edjt9=sHy{9dY+u@^sth+~_4#lv$eic6c*w~$R_~;+c zU0=>W>OFrDKJm|;%kA*dKjL52<@_TKdO-MU?!z2AeDn|fuOjCk^)|bNPyF-gm+bJ- zKaQLG<@|&DvGAGyQo64lKKe(xIk%jD%I*|C_UQd>?eNh*?4ERT{!#b8Q246usg`&C z{VDV>wF~=``ZxTp!_7i5Rd?P$QQx~e&$)lfgZ=4;kN%hk!O!R7K-7AY!yE5<1U$h!FL%H@cT#qsK3uF`CoKk zqww)ZXUhG5Hu&ft^}k0ug<{m5uNFRk&Lj7q*x;jo)Egvp)%MSa!p9z))y@td{o}lU zLF^Cu{uc{h!hx*|N&S(H=STmjGi@dI2Y%1H!eq|?)%o*3#h{(=Yn_rquXQEyVThW0;l3ZLU= z?Lj+y)*pWFeyRV#{<=;0da>dkietUv6(vXAKaYZl?t z4{+}aJABSx?41)0LNV&FG6|n}Op`@+_?*AgKTm2LlK;EsuA7CA{V{a*jq}~uzns7L zzbnN4We&p^vj5fm`!^D9c>lZMbN=FQoE7_*^Y70ATL0oN+TnBl68Bsv_AhbBOTy>< ze>228-&g;o_#f{`o86iGCjW;XwGjPPd5}7dqFP4(IsfK|kN#2rKI%_Xe?~u8JE=dw z4y<}tuzd87euMQ#4IexBNvS_je!!K6fj&R_$9X$wv*8nu8zA)ujG_5-MX-GIkLP@2 zzTsnsj+Xi(&f)t82FpkP$h&^dwzp8({>c0QM&-0^yclDR}zx$;A5xM=a z#7foodvMjlDEXj?_qwmY^utI0u)kjwKK^&FGb{Amoz-^u=pS{bRfUfo@W}fswEu01 zkNy$={AGmB|F?Z=g_?Ww${IV*kN&a$-xfZ3ka2gfQ1RgQYwhsSKl1*M3ZFdS?(dhY zxnEDNv%^RKIOnqppFCXJnalOu@AWs%FX&?bp?|oUohARyyr21xF4wxheWBj}_xay{ zZusaQ=giP&LowBNlV`cAd->54AN|A59yeI?D;-&;?_Ku6ub)Eyinw_Hb365CqgJg|^*@jHv-AAuAJ6?`7oGn* zHFj;3b2wXnJACwyb9bB69~72E#JqNE)p}e!=*IbXyV!r|AN>apv<<~n-nrCTrN5U( zFI4AnUJv$1%KhhtkN%POy1SLGzj`h8T7CY!Xorvf;r|zE5sKk&e6oLy)_))T1}XIK z9vAOFss3n-^gobyI(KcOs>d1MXramr?J4SB|NQXLKm3g|QvXW6Vg6?uwfb*B=bL0G?Zoa?hAJ6}iod4Ki%}Q@n z^8lJXwouhY4)t*UrTqSG_~;*Y-)X6TWF7R+u~FG$&spN5f1JOk#s1*@`|Z*Ob??Dy zOMLW?_kVVf_J4{W-k|cHmn`woKjN&vNc}6%|IxY)x*xoqrSC8Lho60RfUbY|ebxr$ zkG$Z6-!O&#x#|Bw|H!{jl>Rs3O_Qo5YW?r|p6C7_KYa9$`s+fk=<}~(NdJSHJ61kX z#l6#yvcpIJ$Ttj~pzBWul-18a>Sa58^pC#FtI~f*9CXD4y8dbPY&(4PkGji~Q$sOy zcyTGc{uZsU!$<${KaNe;{$KSHiE2M?-f4%A{YTv8gv`If59?aY+5g{r=Qr}Hf5hLS zO?CbGJq;37-1YKqJACwyIOk5u|FRE1sIU8fhks^=kNy$=c}(nY?BCMDXCIW?Vuzok ze;1_wNX1_t(e*!hH`(E%f0Wt0F8&YtS3>yA|0}-M4j=ua&LVdkz5d^=r|X}```G_} z)<61(-TkikpX57p3!l7eu@CJ$Kl;adtJqHSU#^>|^N#P^;iG@_yL{O`6r&ILLY+iq zf2CezhmZbI_cx%U?muoPeC(lW^S$#Mr_jH`Zu}py|LC`0I3*NQbBA-TR`GymW-U~4 z`NkgN4}SRQAO7F9X^#K%<0{qvyV(*S{iE-Axtu@PVSlb#rSg$^X4`pw^iPhT0Y~SA zV$_>-eQ8yc&p6x?AN_;>#ys8sJF>+p)enEc5+D8J{5d7{@2cLgp!585yube@Db~NM z__yqT?Eek#g<|9(ZaTM4*S+=h9{=;hXaBSRzL4ivdGF8H>G$u0-#o?hyY>H=cm3@X zp%`-zKWUz*`mt}_?_GcV@Y(mId=HiKh)o*m-$QFH}G{+J^$j)$#(eIKYagZhdc9sgs_}Igzi`n6$e|-Pr5`V}3tSx*s zf9wuBeDsgHgR#%+=g%U1-p918cKGNY^>*cD|MA@WTkHO(Y^m+=(LdsjyJi2WzH8xQ z2W`3NU4Q(nfAo*|cTbsrgCEpU_~_s3KiT1aqKMV~3CavHzDz z{8`=i*Gk79dijVywfCui)L(rxG!&x_pmWDWRS(_#SMTf346h8Hb z`;Xe;qkrW6>Ph_@ao`-nCl0oEw;ewEN8IVc3p)P$a|b8>vdIn~{iFVE;uzikxk>nh zLEeko;iG@pn`I>b!_V=i@QH_4o@c7uTu)|0Hh(ETM{0r~B zg7BF?pL>)YKKe(z@3iD!cn|4?&;DyE^*88J2M_(mRPC`KMKt?<#|+MVq1(Ld@>LX#Z( ztBaohQ>n2XKK37dCOakm&i>mWeB!YWMz7~5^|d--{ZPu^llmNz{yDe(uf#u^4-Uta zd`kZ*_D|nilkWdE_x~jQcT;kc{_Ka3{?YH=yM*C${`Sr8^q;mj{a-=w(LdIG=Ch&y ze}2{fa+}ltbaSxJkN$D)uH9((#6fyV|FP=7nN~NdkF`s~{^|K|N^$+Eju8iX=e70v-qWTx&Ucgl;rwHt9orOE^`FZgT(9ll$FI--c>Vrv_?&F@gg(ED}Q!ZGa7p=VaB{;#9MuCIUpr|<8FkN%0;XB!}V;&8Jk zt=99;M%*~xP5vMKWB$smSHdyuj{Fr?YyWr3_4!w?&+mqh{&D}ru*+d}|3uG&t91Y2 zR6Bh1kMr-;A7Pb$Z8B(;zISGt9X|R;-$`rX6MvhSeU+YnHNy@c{lnk*>{3|8AAWp) zrM5TzOZ|n{@9(Dn7X8ETd*q_lpFP!As{1d7FT1|~FbF>S$2t4-`LK%rwK%Xs>2d4j zcKGNY_g_yv7gqB(+jL){&;1qN`598!e^E#OlI+62(?9zE+B_Ih_aAJisr{cdH_yLr z{`WtL1G9VTX_Yp}PsyA~F21$Eqi)`#9!5V26+X5r0cx zGotc8IjiaUm$%ok!$<#UbMM?JqV9i5j5_mwpR>b9|ET{d-#8MJsT;G}Ka{BAK|`0@ z;iG@VeI^T^`0IhHPW<759e$GjWp5IR;rCXP{tM!Nr7JGD;r-{T{zvqW`BV2cjl`J4 zaj*10@Oz$-3$BZQdfoqS_~;*Y$Cc)K|GidL&maC_hj;!hDfG_`AO9Er?)8xvbAV^8 z*sSLt*StRd{7=uHlJBPf5d904vnb%>%zY_==^tG z@BU}X@9&0>{!#Z(c5oy{9OTN%4Z8lLo*h2=$NH}~Afo)QcY1En{U49m;iG@(&%k~W zHGiZ>felKJzpHPDkNt;i?CcYXF>fpD9_|0<^bvpZ_5DTvIQLS?`&WGzgV(G2o1Q-6 zKbceLpIiHnc|-d|fARlAQh$ISyl(Y7p3fgYeDn|Ak1Zpr|E2w-iK-u~#X38D^bh+h zL+eP4xyNf-I`u~z?eNh*;=K*pMs)pw@R`S!cC#Hm_8;-jb=@MW{^scxI{)_eHamRu zPvmFA8&5`5{pD7vzhw^k9eeHY(Le6}Y4B7;%|E$S_$vQ-#10?*BmVkM_lTN*-$UwO zId>bKw8KaLh`U|w5z+Z)ssF?txci(PKK38+r}n)fG3r3BNc|`I-?y)M=Vwcye{SP{ zthf2IBdY%4kCJP2|Mhd;<8OZW=pVX!VOB)lf4X+tYTbY4BmS6@?}Kle7<^LLnc{q@5~|H!}P z+^hY+&*l8VA1XS|4j=tv-0R$Z5#9eO=MVfJXW8MSfAn8Pzlx~-zuSb5Kl;Q{JACwy zWpm-{NQ^v4vBrt29`yqs_OGw+FZzf7`SF2>y8o?WBOQPH^b0%BkN#12^WGsHf2!Kh z=|B0w4j=oE`CpU2iKzQ$%F6r!#_q1YWQULbk^jB*TYdg!mHvNK2bcL>&;FmU?=Skt z`d@rh`yby+|2cKww-oWt&+b$IB=(nDc824R0DtzVvj(^4uAN`~5e`)VX zj5#0|yJ-C_($5Yb`%mQ`pN_<+1DGg$_5J(U;iG@dpC}{oH|l?i37>wbG`;Qclk~63 zGy45+?VPCQ;m_(}hmZbo{!AJeQS(PS37K z)2IFsf2t?;FXrYS59|AncU1STzkc}WANGH$8mZL$CAN@`8ztrEpvDgkD{iEOXoC zo2QCV2a!thzx;l@iue4hpY@0Saqi9#K5>8pl7Cfoh|}%x(LdsCM_Z;+^RHJ_()r&H zFWKRvf9U?0)~S^L|D?>HqaUemNALOPl<(h7{uTWr-~3&B?f<4Kt@WqgH{SEVxqRv$ z_WzyY|KW#^6Z=EeUGJag+5YvzNB{7<&U_hB^@n+dPaLL|C4Q3qw@v&%;(+hT`HvpX zvBXFJsQ*|b{vZ9nrG$?idd~qn?;rhBdMo}Pe)mc_|CzrOIcSHE{$YQ%6aSC7BNZL{ zquC)leDn{0v#j`k*x#$f{!nue4%^|Qf6N`t{hhA=DkFUC|J_II@X{s$z1yFD_~;+@ z#~b2*5(kM1pE(pIkJ;g)f7E>q7ypkqKt|!K@Bg(OKKe)h!!v!g|MPV(-T(UY4m*7G zkNWFA;(rkbe@pmk8GUSrkN)9*wHl=JZ%+ze+>nC}R@mXAf7pF>pN**bCnbfi?wwq0 zhmZbI|Jv~Rh_Ziw>*>tjdCLwT{p0-YJ0ha&-&MlL{+>6<4j=ua?s47=+W&n{_~gSs zdc`|Gk5Bz0?(*#3u=c+s{!2Wr@FDO1j~_nzhyLEZFRbe?h0i?r%qQ&d(Le0Iqr%4y zZqp!9&wu>Y4j=s^{`}6DVHN)#E%9g7|8~_5AN|ALc}DsV=>uON^I!2t&!_Y5fBE|U zqJPZ0825EJ#(UT$@o)Um1KI8H(Lc_+`2Mh(KmBvvMD6$7X@`&gG4~+xKv>nEUX%H! z%%M$R!VVw(qwcrhp|Gldzg75*0nXTstnx1{gsfYIi9X|R;{$VUtix}^pE#Gabh@z zAMn{@PW}HSJACwyzPnD7!ZGUpItib9K$@Pn!$<#^w^4pdSjAs1wbl9eGiU7Z(Lc`p z-=~IE{oPpMQx9?EXFGiCKl-2Fny&lbZWli1V5T3v^Yf2&Y$M?ZY@k9hL~6~b!%{$}A5hivzn9X|TU+^xfv!m9sjyzo{1&u}|@^pE>j zf3F%={txqS@V{>Fd*ggp^-rRI)E_(^4XgQM?+BlI{N7!>$G=m4e>Z&mU(WyH)x)a( zd4TZA2mGsr9X|R;|Kq8e;TUo6+QR4OnO4URAN`~L^Xb}QU4Jcn3CG=adsRDp^pF1k z%XP!5|KO;se-#HUX@`&gk#8PT-?6`hPan$Dg}n3g`P4t^-MW0E?>{Tl&9Q%^|2*aV zw|}ZX^utI0=>I5wRL_4+Cw$K12gcgrqkqhwxb%HUJe>ubsAN}L}+wz0H z|KW4tQx7oaDLZ`ZKm6XwCqpsnKoW$n@_()E@XHo8_{?I@2 zkB^_7aSe5dsMrBB8FRCCB{dAC3P@Xa!1;N#Bxi%0D6(Ld5%mFMaF z%XHzB|2a|34j=tv{!;yS!>a$GmGIU54;Ah3(Le0Ht_#Ad{)75+^6&AIcKGNY=l_U> zTL1Qo|3~;`TM;{a^pAPJZ!gyK|K1cn{lFm~^N0MbfAo)fqwVj9RsBUa7vZZuFdy-EKhKZ;q5BsT^!d9%{9o+;?^1hz{yS6XpWFB!=Up?2|8NeL zeoEIrY^rzt{SW_SfBNC0fAqWLmiUkAdl5eImxGn<@RRJnof7{c?(yT3&i$9g?C{Y) z@(<5S{D=3yS@^2{Hm@B%`bYlh{(5@;<4obR9?E30!$<$U4LNI37~OmGntw|Dj67_^pATF zj%JFe`i~FA{~`X{>wY_Y^pE8^)cljH;(t*OIHaH* zKKe(#=Tx>xOvRmrPd(m_{C4>0AN|hnWY_cmV#22%>ybQm_~;+@-lI7pG2(vTOaG6m z|IOi@U-$;}Z~pAC%73mE`-eV^aBA=QXFq)OkNVgB68~czP7}VWKREB*|M$a3|Cs-m zN#bwJK^h=@b^p)_JACvH`@36Q-+$0d_{5{K?YF~6|KR7B`yZG)S5o*=1(cP8Ph_}4l+eDsg?K5LZ|{}B5_#b1`%;iG@de`~%rtoolm7C!OtG;{6n z(LZr_`()jqpMR?Gi9LYyC!TY1V^Y2cfe{SP{*qu)n*YUSr z(*L94&o6klKmG90KjJMjN`+(O9hwWDdC1kDw!=sN(BC~}!ZG4-RfR9BZ^T!R+2JSo zzZsHDwt3!i?xKeO23qkq^tCu`{bkM+Xm+O5B?d5^#P`u?JS^q&-Q>JR4$ zpY?y+&vy9eAM3n_#GmQ=e_8m*f9!yFevuUVm&>L9OWjH0r=b|<&VW9;{`lLnOFYj% z@WV&{uz$bW5mNOJPY9pyKdgWqKKh5=oc}ze>Tg;KU-iFau)|0H=)1_WSKoj6u<%v= z%lXAt-aq<>|6S}WegABE;p2xL{nid2{iFW8-T}=oB7FSe0^9BI(Ld^cdLGvAKd10j z{q09~_~;+|fBd&0)qj{)`0D=gS$6nI@xKqG{#C_2rT?9N*y=CY;iG@(?_Q~YMSuP! zeC(gZzTWxwq|m>pOZ~(DXcUPk`>Up$|K$HSo$~H~`{AR1?Ds_yf5Z;YCw%oCj@aR& zf7E{;OQ+*s=j8lB59aT-!$<$9zbYW{KhA-z!l(Yb-^X_N=pXUt&Juqk4nIx!=ud}_ z?C{Y)?5`yf|Dx}yr|^jf_j=b3AN@n`e!Wf4KZpvSdc4_F?C{Y)Rdv1 zYln~i5&u|odqnkL?Une0TK~`6;V0?eg8cgaiRr>8AJ@6BcmBO8^v|vTOT9&gmvsH( zFgbttbC-VJ?N2{^^pCt#v$0`y|2Os@^N6l=u)|0H$T!WC{$K2#hQe3hzkwY-`bWRn z1?j&f?tuM89P;rhcKGNY^EMutr2C)l5I**Bm3!^*(LegnW=##N`FClAPyQoME<1em zkLOQ6)0uxD_J{I+Q`_OAf7BZfmik-bUweeF*8f@W^&furANohW@$}oe|8<%0$wOp4 zYKM>hvHqW!A6D~crV5|+@Ze7G{QG?BAN?;2bLjr}JNr8E?TiC!C#>fGuM@t~pFMW? z=pXh*;rn&`b+Pc3{khf-AN?c#-=UF;Lq?eNh*`rT(fp!=_15t^?fVvAN@mj;~PTi{+;H+ zC;#{P4|e$2f2{ZQABR-@yN>hz`|h&CNB`*m-uX#L<)5nxA3Z9x!VVw(qu%DoHvRoe z319Ue&9=iw|2TineHK#l*9r@t`ser$ z=8He+{Cm>-FWkg?{fi$y`bYm$uG8Td>mZLjKmJI+hwSjtKjLm5NdGVAUTWc!k3Ue% z4j=uKbk9Te&WB^n!8|SYC-v7&^Vs2|f8<|}O8+fm7rqug{g0{B+2Nyq*qbe+|CKoi z>x7RzTJ)m#`UgMj5B=l)fB0uu-G4h*_{75&{a}ZW{_(zVa^ml!h0p$Pyw46F{Uh$v zR^sotVNVKQ)&Fm{!$<$HcV97;JY0AA4*?7dw3PkM~|Hm9{_E2%mUtiTZZ<=pS|8ozjG3wEcV_eEjiMW$p0M zKXh++dfos3j_|32Zj|2+AN!B`%eOK*_3y&RAN?bZ9X|R;{Yzrzu)hCB_{#q~Np{;>a^|0op0?msVl`cXeSVu#QA zqu*)33LXDEEqqmfvc)^UR*Lmk$XS1>oxhJbzbCCD^+%b%M*O*8iLko=xaQOqdj9vy zg{lvA;=S(IpC3NwFZu5Gr2Zd2=%HFGl>ax;$Nk@a_?*A!UpC2q5cZgNcDb(q6Z?-o z+@PPI^Oyd&q4(+eJ11u>*YT&dH_k8U=KIU}%W>bPh|WL0Rd2cS2exnXe*byO_wR;} z{;~ewJgohXd~Yq&^N6RevA)XZ=rl|4ILSH+=Mu`p2cMocy!!v4300 z`9oY}%^wW|<)eSpzs=2J_+aZ~kE_1G9uGHg&9A3l)c@z-?sl{OMgNHR@2MY-q5Jnv zT%+=@m4`1>a{%&s&_6$X^lzq&``Xt~*B>-`8FDmc3akbWeOMLW?`sWjEwEt7)#nrn1 zVAPF2e_c2-#Td4Z-8{feCcf&{j$baVO5?1#wroUyi)?Z6} z^pE*(Q=iiFpZ0yeNQ ze||UiH{YMU*A{tx6?Z7JQr$nB+lT$zB*phH>SF&hf0_4QRQSx{%ARh6ipNfu`QyBg zq4&7A|NZbe|EPC(O6p(edr5V2y`F#4#txtJk9w!o2_e=0J$K7`)&Dob5})&r_kNr3 zRo&aX_3FJ}wZ!NA!~PjA{iU zNBYjAGJl`CgO~14RPzX`F7#f1?T63)r|#jWU-bN~qeT-{KibM&cKGan^34ln{+60M zahEgy@w6R2`=9vl@N@e7Ih9A}Us|N|o`3Q4{@MT3{d7OC^|xu3#At8Xkah2{!)O0< z{@0TG2dH~^Dx9eNfh(o$@Y(;weal?Z`V%{~S*^eF)$Q=v|K$71T@I=I>-)Plt9j&Q z8`h5qG*I z_8)QRoWfW0*nP|&_Ot%bKkWZ}V*gWz(BNU+|5z~W{rvO8NB=l?A6XVs@&949^!&M- zee{3%;iG>%e{b>sc>fD(I{hDM?L0sFN4|HsZU4P*t{^sZT z(LcWXAmNh-tu%g(I`>|;#7FTpT02K&hw*xZR0Kezo?aCiTy?XRQa|Kk5G zYvaBD#t$F;Bi^*}FKz#q5I%XZogM7((Ld^)7fJmu=Ee~5e~E_;dfW~l{Uh)G@35{v z+#&ui@vws3?eNh*`W>E;`eW)4?-V}y=xe=hobM+7jQ(MFbi7IDKii7`sq%3By!+oN z*Pk0c`iGslN9v!kf1elslXLLoAUk~YkM(v(y0Gg19WDMRWoHM5+2LdVvH!-3{$TG6 z7ypwvmYCqboOgb!6#D1p`(yu+_sEbKQuojIZ|>axu+iFxoO|||WUtoui{_*{Pl=+|J!TJlIe8k#!?C{Y)?C;m*{wL1ejKaqc zT0GYdAN^zA*R3-Dll;$TP4xVaH)q-5qkq)DPL%tn$p6j|zR2NcbEnziqkru8vqyCP zp@;C<4-F=J=eJ3re{Sqg^pEErUe~$*uD}N6|7{Ta+iU%YA3pkr-}95qpJwi6xnoZL z--rF{hmZadf2jPB?mxfy_Iec$d9j6^=STmTH&j#Rf7AcGTIwJ0L%OxPalV`S1N4ve zpQ~(G*I(sWukx>zpY&e;kn;Vz;iG@lKmEH{IED_qxO<)YdA_y8NB`jeBK=>~9jAX| zowA2sdCJc7qkq`l?Zy70{&YyYbt?Z8>u!gS{-L`Y#r~!KC}Z(;YCZmJiI4sf|2~vD ztn9CM{#vW*Aztm_{rTIb&_B2SFY|7@O8qlG#|p9k)%@j%cmKx^AN|Ab>)14`?5~|- z|C0~ulgSPr{UiS0UFxr?!#*tbKm7=I=C;E}|Iq(Y&Gq?nT-OEkDnX{xSdLtnm5%aq<6EAM|H-o*(_g{#_>hkIetLU-<0D zb35$t(Ldr2&87bnJ8ZuA|I8n_WNH1Of5bn26h7sLd4(_`k%%k00>PZ{H^ zkK=!CZ<`oZeyET7FF$le9slbgeEN|`m$t)4|FC=33m@G- zB=*1R!zyowkN%N%{A;M5f74R<)B&`tWQULb;diurUe7<}1E*vUWEw8KaL*moOb{wH=|e&J(($LreRWB-x=-aj%N zQ~R!wbN^67JACwy^|xbGSk-_3&`|IHn_771ck-!!toPp~{=+#uuDx^rcpC5VXFq)O zkGM;2@&B>EW5OpMQsJ7N=STmD_eD#GV=C^|PS1aT;Jh6^`bXaBF}eSnJm6g6GmpRP z&vy9eANT+DE2r=OX()X1pxckx;iG@}U$0lt`Nyjg|KL3|K4gcF{!#z9yiz#EK6p>~ z&V54)?b)ISghOYQLYZL;(H=pT0OY^i@x zx-an$b^qup@BGdw^v`Yl@0~tXGt8CykBK{!?VPCI$BZ@J{U1Mk^pCo)LK1%>|CV0( z(vBO9Iu(uXV{Soy(-*igU^C#xm;iG@}|K%k9L>+Kk_?*YPCfMPlf5dw}k@yoj zI8yk`qiX+x9X|Sp{o7LFPuL&Lg^xd;W}qED`bYffw8Wp-2StQmSRA0lC++Z){NGpq zt@q!Bj)^KCcAi(72gpWP=%R|@m F{|~mMgRlSq literal 0 HcmV?d00001 diff --git a/autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p04.py].npy b/autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p04.py].npy new file mode 100644 index 0000000000000000000000000000000000000000..62253006ee5c853258e99e5c20ebf05b2f0f783b GIT binary patch literal 7040 zcmbW+e^69K902fxOpOQ)2@y$8N$v=Y{6VNmY$X;M;m-yM$&)(<@VqMY4-)hy*ZYSl`U&a4Vms%EFnPz8r7VS&YJawW|P(V483Npb3w9B&s-$aXwW&IW3g(i?^&G7%sP$5XmBdCnss_uihrC!?i%|v zmm&Rt=J2i1T&B}^2F)tRg_gl~NHLnNW{u%pqge|ZW|nfUMsLx(ld6qzgL!(C=A)%#gReRwW$+XYZ&JM{GGRdGE)aky3?#Pp?b;$qrijYN z{6Dj!!e6>y2k60NV%)_&pG{Nd9Jkv#LsLv->=w#T~LZsf%Knr(byHjyj;$2Bdl5!%Ery2*zK; z>7TL|`DsII0D2B3`J~^=sQ*aDpTX%T!Um}FI}RRP&FKAP{XSfO8RPFs#;@Y^TTA`J z*3BgIUG@pE7%fN{7JMH9_5f$4`@I{%3aO>moCDiGY5P# z@yGk?11qq*@RYFc%lHGFejsGi`!`}QyAn);$CcIM{%Dzg_t&uE%1wiQ3Ow3-#C<=; zZ=(%P%4wEq76l4_4%>4E{R`#MjTU1I&I^pcF^qqa8=meV5e4G@SjI2m^kKM{=`)Y?Kj_0{Fs>zC z+z(*4t=qyL$d;{!7fx1tU=a8h#MF@#6k?nSL-@fQRJ)v<^h}l*{&&GJPrTN&5hx zabI6tCflFD_`LIv^!)Xkfh{0G+niU4{kg3;6?py=W%}b$;8nK?%!M1F9TN`8_5&IJ z3)3FWUbmeVl{c^eS*Y4h{&P&v0I#{?9P}Ue57w@4+67J3H32mNun* zD(pWi)0f7Zeea;Z|D3YM`(&fAA0pF7@BKnv-aqIYVE~jqT-*<3{C%A5kG4Ni$)w-G z_Rm5upwdnV*MBnO^NxS?-lHSE2zzkfTh%@ Date: Thu, 16 May 2024 08:16:55 -0400 Subject: [PATCH 165/199] refactor(methoddisv): share nbr defn, avoid reallocation (#1810) * give MethodDisvType a neighboring CellDefn, don't reallocate on each cell-cell transition * also remove example name workaround in test_prt_notebooks.py --- autotest/test_prt_notebooks.py | 5 ++--- src/Solution/ParticleTracker/MethodDisv.f90 | 13 ++++++------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/autotest/test_prt_notebooks.py b/autotest/test_prt_notebooks.py index 1b24a473490..b450cde1958 100644 --- a/autotest/test_prt_notebooks.py +++ b/autotest/test_prt_notebooks.py @@ -83,12 +83,11 @@ def test_notebooks(notebook, function_tmpdir, targets, array_snapshot): assert returncode == 0, f"could not run {notebook}" # check results - example_name = notebook.stem.replace("ex-prt-", "") pathlines_file = ( function_tmpdir - / example_name + / notebook.stem / "prt" - / (example_name + "-prt.trk.csv") + / (notebook.stem.replace("ex-prt-", "") + "-prt.trk.csv") ) pathlines = pd.read_csv(pathlines_file) assert any(pathlines) diff --git a/src/Solution/ParticleTracker/MethodDisv.f90 b/src/Solution/ParticleTracker/MethodDisv.f90 index a175c25731f..90a7a9c115c 100644 --- a/src/Solution/ParticleTracker/MethodDisv.f90 +++ b/src/Solution/ParticleTracker/MethodDisv.f90 @@ -21,7 +21,8 @@ module MethodDisvModule public :: create_method_disv type, extends(MethodType) :: MethodDisvType - integer(I4B), pointer :: zeromethod + integer(I4B), pointer :: zeromethod !< root-finding method + type(CellDefnType), pointer :: neighbor => null() !< ptr to a neighbor defn contains procedure, public :: apply => apply_disv !< apply the DISV-grid method procedure, public :: deallocate !< deallocate arrays and scalars @@ -58,6 +59,7 @@ subroutine create_method_disv(method) method%type = "disv" method%delegates = .true. method%zeromethod = 0 + call create_defn(method%neighbor) end subroutine create_method_disv !> @brief Destroy the tracking method @@ -248,7 +250,6 @@ subroutine map_neighbor(this, defn, inface, z) real(DP) :: top real(DP) :: bot real(DP) :: sat - type(CellDefnType), pointer :: cd ! -- Map to shared cell face of neighbor inbr = defn%facenbr(inface) @@ -261,11 +262,10 @@ subroutine map_neighbor(this, defn, inface, z) icin = defn%icell j = this%fmi%dis%con%ia(icin) ic = this%fmi%dis%con%ja(j + inbr) - call create_defn(cd) - call this%load_cell_defn(ic, cd) + call this%load_cell_defn(ic, this%neighbor) npolyvertsin = defn%npolyverts - npolyverts = cd%npolyverts + npolyverts = this%neighbor%npolyverts if (inface .eq. npolyvertsin + 2) then ! -- Exits through bot, enters through top inface = npolyverts + 3 @@ -276,7 +276,7 @@ subroutine map_neighbor(this, defn, inface, z) ! -- Exits and enters through shared polygon face j = this%fmi%dis%con%ia(ic) do m = 1, npolyverts + 3 - inbrnbr = cd%facenbr(m) + inbrnbr = this%neighbor%facenbr(m) if (this%fmi%dis%con%ja(j + inbrnbr) .eq. icin) then inface = m exit @@ -291,7 +291,6 @@ subroutine map_neighbor(this, defn, inface, z) sat = this%fmi%gwfsat(ic) z = bot + zrel * sat * (top - bot) end if - deallocate (cd) end if end subroutine map_neighbor From 281ceccbbca05d0d1e510722616781c0ee33c879 Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Thu, 16 May 2024 05:35:04 -0700 Subject: [PATCH 166/199] test(apt-cnd): check conduction with and without Newton option (#1809) --- autotest/test_gwe_drycell_cnd4.py | 542 ++++++++++++++++++++++++++++++ 1 file changed, 542 insertions(+) create mode 100644 autotest/test_gwe_drycell_cnd4.py diff --git a/autotest/test_gwe_drycell_cnd4.py b/autotest/test_gwe_drycell_cnd4.py new file mode 100644 index 00000000000..08cab924484 --- /dev/null +++ b/autotest/test_gwe_drycell_cnd4.py @@ -0,0 +1,542 @@ +""" +Test problem for GWE: Specifically, this tests conduction between an APT feature +hosted in a drycell with and without NEWTON activated. The MODFLOW 6 simulation +includes 2 GWF and 2 GWE models. Neither the flow nor the energy transport +models are connected. However, there are two GWF-GWE exchanges. Simulated cell +temperatures for the GWE models are expected to be the same regardless of +whether or not the Newton option is activate in the GWF name file OPTIONS block. + + Model configuration: + + // <- SFR/SFE channel + +----//----+ + / ~//~ /| + ~: Represents / ~//~ / | <- Dry cell + conduction / ~//~ / | + +----//----+ + + / ~//~ /| /| + / ~//~ / | / | + / ~//~ / |/ | + +----//----+ + + + Dry cell -> | // | /| / + | | / | / + | |/ |/ + +----------+ + + water table | | / + | | | / + -----+----------+--- + +----------+ + + + +""" + +# Imports + +import os +import numpy as np +import pytest +import flopy + +from framework import TestFramework + + +# Monotonicity function +def isMonotonic(A): + x, y = [], [] + x.extend(A) + y.extend(A) + x.sort() + y.sort(reverse=True) + if np.all(x == A) or np.all(y == A): + return True + return False + + +# Base simulation and model name and workspace + +scheme = "UPSTREAM" +# scheme = "TVD" + +cases = ["sfecnd"] + + +# Model units +length_units = "meters" +time_units = "days" + +# Table MODFLOW 6 GWE comparison + +nrow = 2 +ncol = 1 +nlay = 2 +top = 2 +bot = np.array([[[1.0], [1.0]], [[0.0], [0.0]]], dtype=float) +strthd = 0.1 # Starting head ($m$) +delr = 1.0 # Column width ($m$) +delc = 1.0 # Row width ($m$) +k11 = 1.0 # Horizontal hydraulic conductivity ($m/d$) +ss = 1e-6 # Specific storage +sy = 0.20 # Specific Yield +prsity = 0.20 # Porosity +nper = 4 # Number of periods +perlen = [1, 1000, 1, 1000] # Simulation time ($days$) +nstp = [1, 10, 1, 10] # 10 day transient time steps +steady = {0: False} +transient = {0: True} + +# sfr data +nreaches = 2 +rlen = 1.0 +rwid = 0.1 +roughness = 0.01 +rbth = 0.1 +rhk = 0.0 +slope = 0.001 +ustrf = 1.0 +ndv = 0 +nconn = 1 +sfr_packagedata = [] +for irno in range(nreaches): + rp = [ + irno, + (0, irno, 0), + rlen, + rwid, + slope, + top, + rbth, + rhk, + roughness, + nconn, + ustrf, + ndv, + ] + sfr_packagedata.append(rp) + +# sfe data +strm_temp = 18.0 # ($C$) +K_therm_strmbed = 2.0 # ($W/m/C$) +rbthcnd = 0.0001 # ($m$) + +# Set some static model parameter values + +k33 = k11 # Vertical hydraulic conductivity ($m/d$) +idomain = 1 # All cells included in the simulation +iconvert = 1 # All cells are convertible + +icelltype = 1 # Cell conversion type (>1: unconfined) + +# GWE related parameters +strt_temp = 4.0 +dispersivity = 0.0 # dispersion (remember, 1D model) +ktw = 0.5918 +kts = 0.2700 +rhos = 1500.0 +rhow = 1000.0 +cps = 760.0 +cpw = 4183.0 +lhv = 2454.0 + +# Set solver parameter values (and related) +nouter, ninner = 100, 300 +hclose, rclose, relax = 1e-10, 1e-10, 1.0 +ttsmult = 1.0 + +# Set up temporal data used by TDIS file +tdis_rc = [] +for i in np.arange(nper): + tdis_rc.append((perlen[i], nstp[i], ttsmult)) + +# ### Create MODFLOW 6 GWE MT3DMS Example 1 Boundary Conditions +# +# No GWF, only Heat conduction simulated + + +def add_gwf_model(sim, gwfname, newton=False): + + # Instantiating MODFLOW 6 groundwater flow model + if newton: + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=gwfname, + newtonoptions="NEWTON", + save_flows=True, + model_nam_file="{}.nam".format(gwfname), + ) + else: + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=gwfname, + save_flows=True, + model_nam_file="{}.nam".format(gwfname), + ) + + # Instantiating MODFLOW 6 solver for flow model + imsgwf = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwfname), + ) + sim.register_ims_package(imsgwf, [gwfname]) + + # Instantiating MODFLOW 6 discretization package + flopy.mf6.ModflowGwfdis( + gwf, + length_units=length_units, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=bot, + idomain=1, + pname="DIS", + filename="{}.dis".format(gwfname), + ) + + # Instantiating MODFLOW 6 storage package + flopy.mf6.ModflowGwfsto( + gwf, + ss=ss, + sy=sy, + iconvert=iconvert, + steady_state=steady, + transient=transient, + pname="STO", + filename="{}.sto".format(gwfname), + ) + + # Instantiating MODFLOW 6 node-property flow package + flopy.mf6.ModflowGwfnpf( + gwf, + save_flows=True, + icelltype=icelltype, + k=k11, + k33=k33, + save_specific_discharge=True, + pname="NPF", + filename="{}.npf".format(gwfname), + ) + + # Instantiating MODFLOW 6 initial conditions package for flow model + flopy.mf6.ModflowGwfic( + gwf, + strt=strthd, + filename="{}.ic".format(gwfname), + ) + + # Instantiating MODFLOW 6 output control package for flow model + flopy.mf6.ModflowGwfoc( + gwf, + pname="OC", + head_filerecord="{}.hds".format(gwfname), + budget_filerecord="{}.cbc".format(gwfname), + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + printrecord=[("HEAD", "ALL"), ("BUDGET", "ALL")], + ) + + # sfr file + connectiondata = [[0, -1], [1, 0]] + + sfr_perioddata = [ + [0, "inflow", 1.0], + ] + + pname = "SFR-" + gwfname[-1] + sfr = flopy.mf6.ModflowGwfsfr( + gwf, + print_stage=True, + print_flows=True, + print_input=True, + save_flows=True, + nreaches=nreaches, + packagedata=sfr_packagedata, + connectiondata=connectiondata, + perioddata=sfr_perioddata, + pname=pname, + filename="{}.sfr".format(gwfname), + ) + fname = f"{gwfname}.sfr.obs" + sfr_obs = { + f"{fname}.sfrobs": [ + ("inflow", "ext-inflow", 1), + ("outflow", "ext-outflow", 2), + ] + } + sfr.obs.initialize(filename=fname, print_input=True, continuous=sfr_obs) + + return sim + + +def add_gwe_model(sim, gwename): + + gwe = flopy.mf6.ModflowGwe( + sim, modelname=gwename, model_nam_file="{}.nam".format(gwename) + ) + gwe.name_file.save_flows = True + + imsgwe = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="{}.ims".format(gwename), + ) + sim.register_ims_package(imsgwe, [gwe.name]) + + # Instantiating MODFLOW 6 transport discretization package + flopy.mf6.ModflowGwedis( + gwe, + nogrb=True, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=bot, + idomain=1, + pname="DIS", + filename="{}.dis".format(gwename), + ) + + # Instantiating MODFLOW 6 transport initial concentrations + flopy.mf6.ModflowGweic( + gwe, strt=strt_temp, pname="IC", filename="{}.ic".format(gwename) + ) + + # Instantiating MODFLOW 6 transport advection package + flopy.mf6.ModflowGweadv( + gwe, scheme=scheme, pname="ADV", filename="{}.adv".format(gwename) + ) + + # Instantiating MODFLOW 6 transport dispersion package + flopy.mf6.ModflowGwecnd( + gwe, + xt3d_off=True, + alh=dispersivity, + ath1=dispersivity, + ktw=ktw * 86400, + kts=kts * 86400, + pname="CND", + filename="{}.cnd".format(gwename), + ) + + # Instantiating MODFLOW 6 transport mass storage package (formerly "reaction" package in MT3DMS) + flopy.mf6.ModflowGweest( + gwe, + save_flows=True, + porosity=prsity, + cps=cps, + rhos=rhos, + packagedata=[cpw, rhow, lhv], + pname="EST", + filename="{}.est".format(gwename), + ) + + # Instantiating MODFLOW 6 source/sink mixing package for dealing with + # auxiliary temperature specified in WEL boundary package. + sourcerecarray = [[]] + flopy.mf6.ModflowGwessm( + gwe, + sources=sourcerecarray, + pname="SSM", + filename="{}.ssm".format(gwename), + ) + + # Instantiate MODFLOW 6 heat transport output control package + flopy.mf6.ModflowGweoc( + gwe, + pname="OC", + budget_filerecord="{}.cbc".format(gwename), + temperature_filerecord="{}.ucn".format(gwename), + temperatureprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + printrecord=[("TEMPERATURE", "ALL"), ("BUDGET", "ALL")], + ) + + # Instantiate Streamflow Energy Transport package + sfe_packagedata = [] + for irno in range(nreaches): + t = (irno, strm_temp, K_therm_strmbed, rbthcnd) + sfe_packagedata.append(t) + + sfe_perioddata = [] + sfe_perioddata.append((0, "INFLOW", strm_temp)) + flwpckname = "SFR-" + gwename[-1] + + flopy.mf6.modflow.ModflowGwesfe( + gwe, + boundnames=False, + save_flows=True, + print_input=True, + print_flows=True, + print_temperature=True, + temperature_filerecord=gwename + ".sfe.bin", + budget_filerecord=gwename + ".sfe.bud", + packagedata=sfe_packagedata, + reachperioddata=sfe_perioddata, + flow_package_name=flwpckname, + pname="SFE", + filename="{}.sfe".format(gwename), + ) + + return sim + + +def build_models(idx, test): + + # Base MF6 GWF model type + ws = test.workspace + name = cases[idx] + + print("Building MF6 model...()".format(name)) + + # generate names for each model + gwfname1 = "gwf-" + name + "nwt1" + gwfname2 = "gwf-" + name + "non2" + gwename1 = "gwe-" + name + "nwt1" + gwename2 = "gwe-" + name + "non2" + + sim = flopy.mf6.MFSimulation( + sim_name=name, sim_ws=ws, exe_name="mf6", version="mf6" + ) + + # Instantiating MODFLOW 6 time discretization + flopy.mf6.ModflowTdis( + sim, nper=nper, perioddata=tdis_rc, time_units=time_units + ) + + # Build two flow models, one with NWT, one without + sim = add_gwf_model(sim, gwfname1, newton=True) + sim = add_gwf_model(sim, gwfname2, newton=False) + + # Add GWE models for each of the flow models above + sim = add_gwe_model(sim, gwename1) + sim = add_gwe_model(sim, gwename2) + + # Add the flow-transport exchanges + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname1, + exgmnameb=gwename1, + pname="GWFGWE1", + filename="{}.gwfgwe1".format(gwename1), + ) + + flopy.mf6.ModflowGwfgwe( + sim, + exgtype="GWF6-GWE6", + exgmnamea=gwfname2, + exgmnameb=gwename2, + pname="GWFGWE2", + filename="{}.gwfgwe2".format(gwename2), + ) + + return sim, None + + +def check_output(idx, test): + print("evaluating results...") + + # read transport results from GWE model + name = cases[idx] + gwename1 = "gwe-" + name + "nwt1" + gwename2 = "gwe-" + name + "non2" + + fpth_nwt = os.path.join(test.workspace, f"{gwename1}.ucn") + fpth_non = os.path.join(test.workspace, f"{gwename2}.ucn") + + try: + # load temperatures + tobj_nwt = flopy.utils.HeadFile( + fpth_nwt, precision="double", text="TEMPERATURE" + ) + temp_nwt = tobj_nwt.get_alldata() + except: + assert False, f'could not load temperature data from "{fpth_nwt}"' + + try: + # load temperatures + tobj_non = flopy.utils.HeadFile( + fpth_non, precision="double", text="TEMPERATURE" + ) + temp_non = tobj_non.get_alldata() + except: + assert False, f'could not load temperature data from "{fpth_non}"' + + # Ensure constant temperatures are initiated properly in the 1st and 3rd + # stress periods, which are separated by period of "turning off" the + # constant temperature boundary + msg0 = ( + "Grid cell temperatures for the Newton and non-Newton base are " + "different and should NOT be" + ) + assert np.allclose(temp_nwt, temp_non), msg0 + + msg1 = ( + "All layer 2 cells should be strictly colder than the cell above " + "owing to a conductive flux of energy from the stream into the " + "upper layer, but that is not the case" + ) + assert np.all(np.diff(temp_nwt.squeeze(), axis=1) < 0), msg1 + + msg2 = ( + "Each cell's temperatures should be monotonically increasing " + "through time, but are not" + ) + temp_diff = np.diff(temp_nwt.squeeze(), axis=0) + + # Because of the time discretization scheme, need to check each cell in two chuncks + # Cell ID: (0, 0, 0) + assert isMonotonic(temp_diff[:, 0, 0][::-1][0:10]), msg2 + assert isMonotonic(temp_diff[:, 0, 0][::-1][10:-1]), msg2 + # Cell ID: (0, 1, 0) + assert isMonotonic(temp_diff[:, 0, 1][::-1][0:10]), msg2 + assert isMonotonic(temp_diff[:, 0, 1][::-1][10:-1]), msg2 + # Cell ID: (1, 0, 0) + assert isMonotonic(temp_diff[:, 1, 0][::-1][0:10]), msg2 + assert isMonotonic(temp_diff[:, 1, 0][::-1][10:-1]), msg2 + # Cell ID: (1, 1, 0) + assert isMonotonic(temp_diff[:, 1, 1][::-1][0:10]), msg2 + assert isMonotonic(temp_diff[:, 1, 1][::-1][10:-1]), msg2 + + +# - No need to change any code below +@pytest.mark.parametrize( + "idx, name", + list(enumerate(cases)), +) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() From 20144ba92b68d7ac0ce4745934c91c70e7680a0e Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Thu, 16 May 2024 08:00:36 -0500 Subject: [PATCH 167/199] docs(readasarrays): minor clarification (#1808) * close #1804 --- doc/mf6io/mf6ivar/dfn/gwf-evta.dfn | 2 +- doc/mf6io/mf6ivar/dfn/gwf-rcha.dfn | 2 +- doc/mf6io/mf6ivar/dfn/utl-spca.dfn | 2 +- doc/mf6io/mf6ivar/dfn/utl-spta.dfn | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/mf6io/mf6ivar/dfn/gwf-evta.dfn b/doc/mf6io/mf6ivar/dfn/gwf-evta.dfn index 2dc966cb436..2ee518627ee 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-evta.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-evta.dfn @@ -9,7 +9,7 @@ shape reader urword optional false longname use array-based input -description indicates that array-based input will be used for the Evapotranspiration Package. This keyword must be specified to use array-based input. +description indicates that array-based input will be used for the Evapotranspiration Package. This keyword must be specified to use array-based input. When READASARRAYS is specified, values must be provided for every cell within a model layer, even those cells that have an IDOMAIN value less than one. Values assigned to cells with IDOMAIN values less than one are not used and have no effect on simulation results. default_value True block options diff --git a/doc/mf6io/mf6ivar/dfn/gwf-rcha.dfn b/doc/mf6io/mf6ivar/dfn/gwf-rcha.dfn index 80238e9a48a..cf92c8c2d86 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-rcha.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-rcha.dfn @@ -9,7 +9,7 @@ shape reader urword optional false longname use array-based input -description indicates that array-based input will be used for the Recharge Package. This keyword must be specified to use array-based input. +description indicates that array-based input will be used for the Recharge Package. This keyword must be specified to use array-based input. When READASARRAYS is specified, default_value True block options diff --git a/doc/mf6io/mf6ivar/dfn/utl-spca.dfn b/doc/mf6io/mf6ivar/dfn/utl-spca.dfn index eb98c8aab35..40bbe7067d8 100644 --- a/doc/mf6io/mf6ivar/dfn/utl-spca.dfn +++ b/doc/mf6io/mf6ivar/dfn/utl-spca.dfn @@ -8,7 +8,7 @@ shape reader urword optional false longname use array-based input -description indicates that array-based input will be used for the SPC Package. This keyword must be specified to use array-based input. +description indicates that array-based input will be used for the SPC Package. This keyword must be specified to use array-based input. When READASARRAYS is specified, values must be provided for every cell within a model layer, even those cells that have an IDOMAIN value less than one. Values assigned to cells with IDOMAIN values less than one are not used and have no effect on simulation results. default_value True block options diff --git a/doc/mf6io/mf6ivar/dfn/utl-spta.dfn b/doc/mf6io/mf6ivar/dfn/utl-spta.dfn index 03b3c456f07..13463e47a9b 100644 --- a/doc/mf6io/mf6ivar/dfn/utl-spta.dfn +++ b/doc/mf6io/mf6ivar/dfn/utl-spta.dfn @@ -8,7 +8,7 @@ shape reader urword optional false longname use array-based input -description indicates that array-based input will be used for the SPT Package. This keyword must be specified to use array-based input. +description indicates that array-based input will be used for the SPT Package. This keyword must be specified to use array-based input. When READASARRAYS is specified, values must be provided for every cell within a model layer, even those cells that have an IDOMAIN value less than one. Values assigned to cells with IDOMAIN values less than one are not used and have no effect on simulation results. default_value True block options From 4e6ab47a3c878364c6a0205724a4ce0e23884bb3 Mon Sep 17 00:00:00 2001 From: mjr-deltares <45555666+mjr-deltares@users.noreply.github.com> Date: Thu, 16 May 2024 15:01:32 +0200 Subject: [PATCH 168/199] fix(gwtgwt): improved matching of GWF flows to GWT interfaces (#1812) * - fix matching of connection/interface models between GWF and GWT * - add parallel test case too --- autotest/test_gwt_adv02_gwtgwt.py | 350 ++++++++++++++++++++++++++++++ autotest/test_par_gwt_adv01.py | 16 +- autotest/test_par_gwt_adv02.py | 30 +++ src/Exchange/exg-gwfgwt.f90 | 101 +++++---- 4 files changed, 442 insertions(+), 55 deletions(-) create mode 100644 autotest/test_gwt_adv02_gwtgwt.py create mode 100644 autotest/test_par_gwt_adv02.py diff --git a/autotest/test_gwt_adv02_gwtgwt.py b/autotest/test_gwt_adv02_gwtgwt.py new file mode 100644 index 00000000000..aaf799f6a49 --- /dev/null +++ b/autotest/test_gwt_adv02_gwtgwt.py @@ -0,0 +1,350 @@ +""" +Test the advection schemes using multiple flow and transport models +organized from left to right. Use the well package to inject water +into the first column of cells on the left. Assign constant head +cells to the last row of the last model. +""" + +import pathlib as pl + +import flopy +import numpy as np +import pytest + +from framework import TestFramework + +cases = ["adv02a_gwtgwt", "adv02b_gwtgwt", "adv02c_gwtgwt"] +scheme = ["upstream", "central", "tvd"] +gdelr = 1.0 + +# solver settings +nouter, ninner = 100, 20 +hclose, rclose, relax = 1e-6, 1e-6, 1.0 + +number_of_models = 5 # this variable is also used to run the parallel test +concentration = 17.0 + + +def get_gwf_model(sim, gwfname, gwfpath, modelshape, chdspd=None, welspd=None): + nlay, nrow, ncol, xshift, yshift = modelshape + delr = gdelr + delc = 1.0 + delz = 1.0 + top = 1.0 + botm = [top - (k + 1) * delz for k in range(nlay)] + strt = 1.0 + hk = 1.0 + laytyp = 0 + + gwf = flopy.mf6.ModflowGwf( + sim, + modelname=gwfname, + save_flows=True, + ) + + dis = flopy.mf6.ModflowGwfdis( + gwf, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + xorigin=xshift, + yorigin=yshift, + ) + + # initial conditions + ic = flopy.mf6.ModflowGwfic(gwf, strt=strt) + + # node property flow + npf = flopy.mf6.ModflowGwfnpf( + gwf, + icelltype=laytyp, + k=hk, + save_specific_discharge=True, + ) + + # chd files + if chdspd is not None: + chd = flopy.mf6.modflow.mfgwfchd.ModflowGwfchd( + gwf, + stress_period_data=chdspd, + save_flows=False, + pname="CHD-1", + ) + + # wel files + if welspd is not None: + wel = flopy.mf6.ModflowGwfwel( + gwf, + print_input=True, + print_flows=True, + stress_period_data=welspd, + save_flows=False, + auxiliary="CONCENTRATION", + pname="WEL-1", + ) + + # output control + oc = flopy.mf6.ModflowGwfoc( + gwf, + budget_filerecord=f"{gwfname}.cbc", + head_filerecord=f"{gwfname}.hds", + headprintrecord=[("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL")], + saverecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + printrecord=[("HEAD", "LAST"), ("BUDGET", "LAST")], + ) + gwf.set_model_relative_path(gwfpath) + return gwf + + +def get_gwt_model( + sim, gwtname, gwtpath, modelshape, scheme, sourcerecarray=None +): + nlay, nrow, ncol, xshift, yshift = modelshape + delr = 1.0 + delc = 1.0 + delz = 1.0 + top = 1.0 + botm = [top - (k + 1) * delz for k in range(nlay)] + + gwt = flopy.mf6.MFModel( + sim, + model_type="gwt6", + modelname=gwtname, + ) + gwt.name_file.save_flows = True + + dis = flopy.mf6.ModflowGwtdis( + gwt, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=gdelr, + delc=delc, + top=top, + botm=botm, + xorigin=xshift, + yorigin=yshift, + ) + + # initial conditions + ic = flopy.mf6.ModflowGwtic(gwt, strt=concentration) + + # advection + adv = flopy.mf6.ModflowGwtadv(gwt, scheme=scheme) + + # mass storage and transfer + mst = flopy.mf6.ModflowGwtmst(gwt, porosity=0.1) + + # sources + if sourcerecarray is not None: + ssm = flopy.mf6.ModflowGwtssm(gwt, sources=sourcerecarray) + + # output control + oc = flopy.mf6.ModflowGwtoc( + gwt, + budget_filerecord=f"{gwtname}.cbc", + concentration_filerecord=f"{gwtname}.ucn", + concentrationprintrecord=[ + ("COLUMNS", 10, "WIDTH", 15, "DIGITS", 6, "GENERAL") + ], + saverecord=[("CONCENTRATION", "LAST"), ("BUDGET", "LAST")], + printrecord=[("CONCENTRATION", "LAST"), ("BUDGET", "LAST")], + ) + + gwt.set_model_relative_path(gwtpath) + return gwt + + +def build_models(idx, test): + # temporal discretization + nper = 1 + perlen = [500.0] + nstp = [1] + tsmult = [1.0] + tdis_rc = [] + for i in range(nper): + tdis_rc.append((perlen[i], nstp[i], tsmult[i])) + + # build MODFLOW 6 files + ws = test.workspace + sim = flopy.mf6.MFSimulation( + sim_name=ws, version="mf6", exe_name="mf6", sim_ws=ws + ) + # create tdis package + tdis = flopy.mf6.ModflowTdis( + sim, time_units="DAYS", nper=nper, perioddata=tdis_rc, pname="sim.tdis" + ) + + # grid information + nlay, nrow, ncol = 2, 1, 3 + + for imodel in range(number_of_models): + if imodel == 0: + welspd = { + 0: [[(k, 0, 0), 1.0, concentration] for k in range(nlay)] + } + else: + welspd = None + + if imodel == number_of_models - 1: + chdspd = {0: [[(k, 0, ncol - 1), 0.0000000] for k in range(nlay)]} + else: + chdspd = None + + if imodel == 0: + sourcerecarray = [("WEL-1", "AUX", "CONCENTRATION")] + elif imodel == number_of_models - 1: + sourcerecarray = [()] + else: + sourcerecarray = None + + model_name = f"flow{imodel + 1}" + xshift = imodel * ncol * gdelr + gwf = get_gwf_model( + sim, + model_name, + model_name, + (nlay, nrow, ncol, xshift, 0.0), + chdspd=chdspd, + welspd=welspd, + ) + + model_name = f"transport{imodel + 1}" + gwt1 = get_gwt_model( + sim, + model_name, + model_name, + (nlay, nrow, ncol, xshift, 0.0), + scheme[idx], + sourcerecarray=sourcerecarray, + ) + + gwfgwt = flopy.mf6.ModflowGwfgwt( + sim, + exgtype="GWF6-GWT6", + exgmnamea=f"flow{imodel + 1}", + exgmnameb=f"transport{imodel + 1}", + filename=f"flow{imodel + 1}_transport{imodel + 1}.gwfgwt", + ) + + # gwf-gwf with interface model enabled + for iexg in range(number_of_models - 1): + gwfgwf_data = [ + [(k, 0, ncol - 1), (0, 0, 0), 1, 0.5, 0.5, 1.0, 0.0, 1.0] + for k in range(nlay) + ] + exgmnamea = f"flow{iexg + 1}" + exgmnameb = f"flow{iexg + 2}" + filename = f"{exgmnamea}_{exgmnameb}.gwfgwf" + gwfgwf = flopy.mf6.ModflowGwfgwf( + sim, + exgtype="GWF6-GWF6", + nexg=len(gwfgwf_data), + exgmnamea=exgmnamea, + exgmnameb=exgmnameb, + exchangedata=gwfgwf_data, + auxiliary=["ANGLDEGX", "CDIST"], + filename=filename, + dev_interfacemodel_on=True, + ) + + # Create GWT GWT exchanges + for iexg in range(number_of_models - 1): + exgmnamea = f"transport{iexg + 1}" + exgmnameb = f"transport{iexg + 2}" + filename = f"{exgmnamea}_{exgmnameb}.gwtgwt" + gwtgwt = flopy.mf6.ModflowGwtgwt( + sim, + exgtype="GWT6-GWT6", + gwfmodelname1=f"flow{iexg + 1}", + gwfmodelname2=f"flow{iexg + 2}", + adv_scheme=scheme[idx], + nexg=len(gwfgwf_data), + exgmnamea=exgmnamea, + exgmnameb=exgmnameb, + exchangedata=gwfgwf_data, + auxiliary=["ANGLDEGX", "CDIST"], + filename=filename, + ) + + # create iterative model solution and register the gwf model with it + imsgwf = 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, + filename="flow.ims", + ) + sim.register_ims_package( + imsgwf, [f"flow{nmodel + 1}" for nmodel in range(number_of_models)] + ) + + # create iterative model solution and register the gwt model with it + imsgwt = 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="BICGSTAB", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + filename="transport.ims", + ) + sim.register_ims_package( + imsgwt, + [f"transport{nmodel + 1}" for nmodel in range(number_of_models)], + ) + + return sim, None + + +def check_output(idx, test): + conclist = [] + for imodel in range(number_of_models): + gwtname = f"transport{imodel + 1}" + fpth = pl.Path(test.workspace) / gwtname / f"{gwtname}.ucn" + cobj = flopy.utils.HeadFile( + fpth, precision="double", text="CONCENTRATION" + ) + conc = cobj.get_data() + conclist.append(conc) + conc_sim = np.hstack(conclist) + + conc_answer = concentration * np.ones(conc_sim.shape) + + diff = conc_sim - conc_answer + dmax = np.abs(diff).max() + + assert np.allclose( + conc_sim, conc_answer + ), f"Concentrations do not match with known solution. Max diff = {dmax}" + + +@pytest.mark.parametrize("idx, name", enumerate(cases)) +@pytest.mark.developmode +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + ) + test.run() diff --git a/autotest/test_par_gwt_adv01.py b/autotest/test_par_gwt_adv01.py index 2e9647faa56..4a00e222a91 100644 --- a/autotest/test_par_gwt_adv01.py +++ b/autotest/test_par_gwt_adv01.py @@ -10,22 +10,12 @@ cases = ["par_adv01a_gwtgwt", "par_adv01b_gwtgwt", "par_adv01c_gwtgwt"] -def build_models(idx, test): - from test_gwt_adv01_gwtgwt import build_models as build - - sim, dummy = build(idx, test) - return sim, dummy - - -def check_output(idx, test): - from test_gwt_adv01_gwtgwt import check_output as check - - check(idx, test) - - @pytest.mark.parallel @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): + from test_gwt_adv01_gwtgwt import build_models + from test_gwt_adv01_gwtgwt import check_output + test = TestFramework( name=name, workspace=function_tmpdir, diff --git a/autotest/test_par_gwt_adv02.py b/autotest/test_par_gwt_adv02.py new file mode 100644 index 00000000000..8953820aa33 --- /dev/null +++ b/autotest/test_par_gwt_adv02.py @@ -0,0 +1,30 @@ +""" +This test reuses the simulation data and config in +test_gwt_adv01_gwtgwt.py and runs it in parallel mode. +""" + +import pytest + +from framework import TestFramework + +cases = ["par_adv01a_gwtgwt", "par_adv01b_gwtgwt", "par_adv01c_gwtgwt"] + + +@pytest.mark.parallel +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + from test_gwt_adv02_gwtgwt import build_models + from test_gwt_adv02_gwtgwt import check_output + from test_gwt_adv02_gwtgwt import number_of_models + + test = TestFramework( + name=name, + workspace=function_tmpdir, + targets=targets, + build=lambda t: build_models(idx, t), + check=lambda t: check_output(idx, t), + compare=None, + parallel=True, + ncpus=number_of_models, + ) + test.run() diff --git a/src/Exchange/exg-gwfgwt.f90 b/src/Exchange/exg-gwfgwt.f90 index 688961f71f6..276308a19f7 100644 --- a/src/Exchange/exg-gwfgwt.f90 +++ b/src/Exchange/exg-gwfgwt.f90 @@ -1,6 +1,6 @@ module GwfGwtExchangeModule use KindModule, only: DP, I4B, LGP - use ConstantsModule, only: LENPACKAGENAME + use ConstantsModule, only: LENPACKAGENAME, LINELENGTH use ListsModule, only: basemodellist, baseexchangelist, & baseconnectionlist use SimModule, only: store_error @@ -12,6 +12,7 @@ module GwfGwtExchangeModule use GwfGwfConnectionModule, only: GwfGwfConnectionType, CastAsGwfGwfConnection use GwfGwfExchangeModule, only: GwfExchangeType, & GetGwfExchangeFromList + use GwtGwtExchangeModule, only: GwtExchangeType use BaseModelModule, only: BaseModelType, GetBaseModelFromList use GwfModule, only: GwfModelType use GwtModule, only: GwtModelType @@ -25,6 +26,7 @@ module GwfGwtExchangeModule integer(I4B), pointer :: m1_idx => null() !< index into the list of base exchanges for model 1 integer(I4B), pointer :: m2_idx => null() !< index into the list of base exchanges for model 2 + character(len=LINELENGTH) :: filename !< the input file for the GWF-GWT exchange contains @@ -66,6 +68,7 @@ subroutine gwfgwt_cr(filename, id, m1_id, m2_id) write (cint, '(i0)') id exchange%name = 'GWF-GWT_'//trim(adjustl(cint)) exchange%memoryPath = exchange%name + exchange%filename = filename ! ! -- allocate scalars call exchange%allocate_scalars() @@ -287,7 +290,7 @@ end subroutine exg_ar !< subroutine gwfconn2gwtconn(this, gwfModel, gwtModel) ! -- modules - use SimModule, only: store_error + use SimModule, only: store_error, store_error_filename, count_errors use SimVariablesModule, only: iout use MemoryManagerModule, only: mem_checkin ! -- dummy @@ -299,7 +302,8 @@ subroutine gwfconn2gwtconn(this, gwfModel, gwtModel) class(*), pointer :: objPtr => null() class(GwtGwtConnectionType), pointer :: gwtConn => null() class(GwfGwfConnectionType), pointer :: gwfConn => null() - class(GwfExchangeType), pointer :: gwfEx => null() + class(GwfExchangeType), pointer :: gwfExg => null() + class(GwtExchangeType), pointer :: gwtExg => null() integer(I4B) :: ic1, ic2, iex integer(I4B) :: gwfConnIdx, gwfExIdx logical(LGP) :: areEqual @@ -313,6 +317,7 @@ subroutine gwfconn2gwtconn(this, gwfModel, gwtModel) ! start with a GWT conn. objPtr => conn gwtConn => CastAsGwtGwtConnection(objPtr) + gwtExg => gwtConn%gwtExchange gwfConnIdx = -1 gwfExIdx = -1 ! @@ -321,23 +326,31 @@ subroutine gwfconn2gwtconn(this, gwfModel, gwtModel) conn => get_smc_from_list(baseconnectionlist, ic2) ! if (associated(conn%owner, gwfModel)) then + ! objPtr => conn gwfConn => CastAsGwfGwfConnection(objPtr) + gwfExg => gwfConn%gwfExchange + ! + ! A model can have multiple exchanges, even connecting the same two + ! models. We have a match if + ! 1. gwtgwt%model1 is connected to gwfgwf%model1 + ! 2. gwtgwt%model2 is connected to gwfgwf%model2 + ! 3. the list of connected nodes (nodem1, nodem2) is equivalent, such + ! that it contains the same nodes, appearing in the same order in the + ! exchange data block ! - ! for now, connecting the same nodes nrs will be - ! sufficient evidence of equality - areEqual = gwfConn%prim_exchange%nexg == gwtConn%prim_exchange%nexg + if (gwfExg%v_model1%name /= gwtExg%gwfmodelname1) cycle + if (gwfExg%v_model2%name /= gwtExg%gwfmodelname2) cycle + ! + areEqual = (gwfExg%nexg == gwtExg%nexg) if (areEqual) then - areEqual = all(gwfConn%prim_exchange%nodem1 == & - gwtConn%prim_exchange%nodem1) - areEqual = areEqual .and. all(gwfConn%prim_exchange%nodem2 == & - gwtConn%prim_exchange%nodem2) + areEqual = all(gwfExg%nodem1 == gwtExg%nodem1) + areEqual = areEqual .and. all(gwfExg%nodem2 == gwtExg%nodem2) end if if (areEqual) then ! same DIS, same exchange: link and go to next GWT conn. write (iout, '(/6a)') 'Linking exchange ', & - trim(gwtConn%prim_exchange%name), & - ' to ', trim(gwfConn%prim_exchange%name), & + trim(gwtExg%name), ' to ', trim(gwfExg%name), & ' (using interface model) for GWT model ', & trim(gwtModel%name) gwfConnIdx = ic2 @@ -348,50 +361,48 @@ subroutine gwfconn2gwtconn(this, gwfModel, gwtModel) end do gwfloop ! ! fallback option: coupling to old gwfgwf exchange, + ! the conditions are equal to what is used above ! (this will go obsolete at some point) if (gwfConnIdx == -1) then gwfloopexg: do iex = 1, baseexchangelist%Count() - gwfEx => GetGwfExchangeFromList(baseexchangelist, iex) + gwfExg => GetGwfExchangeFromList(baseexchangelist, iex) ! - ! -- There is no guarantee that iex is a gwfExg, in which case - ! it will return as null. cycle if so. - if (.not. associated(gwfEx)) cycle gwfloopexg + if (.not. associated(gwfExg)) cycle gwfloopexg ! - if (associated(gwfEx%model1, gwfModel) .or. & - associated(gwfEx%model2, gwfModel)) then - - ! check exchanges have same node counts - areEqual = size(gwfEx%nodem1) == size(gwtConn%prim_exchange%nodem1) - ! then, connecting the same nodes nrs will be - ! sufficient evidence of equality - if (areEqual) & - areEqual = all(gwfEx%nodem1 == gwtConn%prim_exchange%nodem1) - if (areEqual) & - areEqual = all(gwfEx%nodem2 == gwtConn%prim_exchange%nodem2) + if (associated(gwfExg%model1, gwfModel) .or. & + associated(gwfExg%model2, gwfModel)) then + ! + if (gwfExg%v_model1%name /= gwtExg%gwfmodelname1) cycle + if (gwfExg%v_model2%name /= gwtExg%gwfmodelname2) cycle + ! + areEqual = (gwfExg%nexg == gwtExg%nexg) + ! + if (areEqual) then + areEqual = all(gwfExg%nodem1 == gwtExg%nodem1) + areEqual = areEqual .and. all(gwfExg%nodem2 == gwtExg%nodem2) + end if if (areEqual) then ! link exchange to connection write (iout, '(/6a)') 'Linking exchange ', & - trim(gwtConn%prim_exchange%name), & - ' to ', trim(gwfEx%name), ' for GWT model ', & + trim(gwtExg%name), ' to ', trim(gwfExg%name), ' for GWT model ', & trim(gwtModel%name) gwfExIdx = iex if (gwtConn%owns_exchange) then - gwtConn%gwtExchange%gwfsimvals => gwfEx%simvals - call mem_checkin(gwtConn%gwtExchange%gwfsimvals, & - 'GWFSIMVALS', gwtConn%gwtExchange%memoryPath, & - 'SIMVALS', gwfEx%memoryPath) + gwtExg%gwfsimvals => gwfExg%simvals + call mem_checkin(gwtExg%gwfsimvals, & + 'GWFSIMVALS', gwtExg%memoryPath, & + 'SIMVALS', gwfExg%memoryPath) end if ! !cdl link up mvt to mvr - if (gwfEx%inmvr > 0) then + if (gwfExg%inmvr > 0) then if (gwtConn%owns_exchange) then !cdl todo: check and make sure gwtEx has mvt active - call gwtConn%gwtExchange%mvt%set_pointer_mvrbudobj( & - gwfEx%mvr%budobj) + call gwtExg%mvt%set_pointer_mvrbudobj(gwfExg%mvr%budobj) end if end if ! - if (associated(gwfEx%model2, gwfModel)) gwtConn%exgflowSign = -1 + if (associated(gwfExg%model2, gwfModel)) gwtConn%exgflowSign = -1 gwtConn%gwtInterfaceModel%fmi%flows_from_file = .false. ! exit gwfloopexg @@ -403,15 +414,21 @@ subroutine gwfconn2gwtconn(this, gwfModel, gwtModel) ! if (gwfConnIdx == -1 .and. gwfExIdx == -1) then ! none found, report - write (errmsg, '(/6a)') 'Missing GWF-GWF exchange when connecting GWT'// & - ' model ', trim(gwtModel%name), ' with exchange ', & - trim(gwtConn%prim_exchange%name), ' to GWF model ', & - trim(gwfModel%name) - call store_error(errmsg, terminate=.true.) + write (errmsg, *) 'Cannot find GWF-GWF exchange when connecting'// & + ' GWT model ', trim(gwtModel%name), ' with exchange ', & + trim(gwtExg%name), ' to GWF model ', trim(gwfModel%name), & + '. Note: GWF-GWF and GWT-GWT need identical exchange data '// & + '(both in value and order) for the match to succeed.' + call store_error(errmsg) end if ! end do gwtloop ! + ! -- report errors + if (count_errors() > 0) then + call store_error_filename(this%filename) + end if + ! ! -- Return return end subroutine gwfconn2gwtconn From 153f057349b6d6a978c4b8e35c01cebbc1ea6950 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Thu, 16 May 2024 13:59:01 -0500 Subject: [PATCH 169/199] docs(releasenotes): update release notes for 6.5.0 (#1814) * docs(releasenotes): update release notes for 6.5.0 * codespell for the win! * grammar --- doc/ReleaseNotes/develop.tex | 29 +++++++++++++++-------- doc/mf6io/mf6ivar/dfn/gwf-rcha.dfn | 2 +- doc/mf6io/mf6ivar/tex/prt-prp-options.dat | 1 + 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index 00062b7a4fe..b459860503a 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -5,16 +5,18 @@ \underline{NEW FUNCTIONALITY} \begin{itemize} - \item A new Groundwater Energy (GWE) transport model is introduced to the code base for simulating heat transport in the subsurface. Additional information for activating the GWE model type within a MODFLOW 6 simulation is available within the mf6io.pdf document. New example problems have been developed for testing and demonstrating GWE capabilities (in addition to other internal tests that help verify the accuracy of GWE); however, additional changes to the code and input may be necessary in response to user needs and further testing. - \item A new capability has been introduced to create parameter layer export files of user input data for packages including DIS, DISV, IC, NPF, DSP(GWT), MIP(PRT), and CND(GWE). The number of supported packages is expected to increase in the future. The capability can be turned on with the package EXPORT\_ARRAY\_ASCII option. The package parameter export set is pre-defined and currently focuses on griddata. The number of parameters per package may also increase in the future. - \item Add capability to vary the hydraulic conductivity of the reach streambed (RHK) by stress period in the Streamflow Routing (SFR) package. RHK can be modified by stress period using the BEDK SFRSETTING. RHK can also be defined using a timeseries string in the PACKAGEDATA or PERIOD blocks. - \item Extend binary input support to all list style input blocks that have a regular shape and don't contain string fields (e.g. BOUNDNAME). + \item A new Groundwater Energy (GWE) transport model is introduced to the code base for simulating heat transport in the subsurface. GWE Models can be coupled together using a new GWE-GWE Exchange. Additional information for activating the GWE model type within a MODFLOW 6 simulation is available within the mf6io.pdf document. Technical details about the GWE Model are given in the supplemental technical information document (mf6suptechinfo) provided with the release. New example problems have been developed for testing and demonstrating GWE capabilities (in addition to other internal tests that help verify the accuracy of GWE); however, additional changes to the code and input may be necessary in response to user needs and further testing. + \item A new Particle Tracking (PRT) Model was added to simulate forward tracking of particles for Groundwater Flow (GWF) Models. Additional information for activating the PRT model type within a MODFLOW 6 simulation is available within the mf6io.pdf document. Technical details about the PRT Model are given in the supplemental technical information document (mf6suptechinfo) provided with the release. New example problems have been developed for testing and demonstrating PRT capabilities (in addition to other internal tests that help verify the accuracy of PRT); however, additional changes to the code and input may be necessary in response to user needs and further testing. + \item A new capability has been introduced to optionally write user-provided input arrays to external ASCII files. In some cases, such as when the user provides binary files as input, it can be useful to inspect the text representation of that input. Exporting to external ASCII files can be turned on for supported packages by specifying the EXPORT\_ARRAY\_ASCII option. When activated supported variables will be written to files that are named based on the model, package, variable, and layer. Only those arrays specified for the model grid can be exported. + \item Added capability to vary the hydraulic conductivity of the reach streambed (RHK) by stress period in the Streamflow Routing (SFR) package. RHK can be modified by stress period using the BEDK SFRSETTING. RHK can also be defined using a timeseries string in the PACKAGEDATA or PERIOD blocks. + \item Extend binary input support to all list style input blocks that have a regular shape and don't contain string fields (e.g. BOUNDNAME). + \item A special extended version of MODFLOW can be compiled to simulate multiple models in parallel. This extended version of MODFLOW 6 is based on the Message Passing Interface (MPI) and the Portable, Extensible Toolkit for Scientific Computation (PETSc) libraries. Testing of the extended version has been performed on laptops, desktops, and supercomputers. Information on the extended version of MODFLOW 6 is available through a dedicated page on the \href{https://github.com/MODFLOW-USGS/modflow6/wiki/Parallel-MODFLOW-User-Guide}{MODFLOW 6 repository}. There are several recent improvements to parallel capabilities. A new optional High Performance Computing (HPC) input file can be activated in the OPTION block in the simulation NAM file to configure the load balance for parallel simulations. The CSV convergence report in parallel mode has been improved by adding individual model data similar to those produced for serial simulations. A modified ILU preconditioner is now available in parallel simulations and can be configured through IMS parameters. Settings configured in the IMS input file are now used for parallel simulations. Simulations with multiple GWE Models can be parallelized. \end{itemize} \underline{EXAMPLES} \begin{itemize} - \item New examples were included for the Groundwater Energy (GWE) Model. These examples include: danckwerts, geotherm, gwe-prt, and gwe-radial. - \item New examples were included for the Particle Tracking (PRT) Model. These examples include four of the test problems used to demonstrate MODPATH Version 7. + \item New examples were added to demonstrate the new Groundwater Energy (GWE) Model. These examples include: danckwerts, geotherm, gwe-prt, and gwe-radial. + \item New examples were added to demonstrate the new Particle Tracking (PRT) Model. These examples include four of the test problems used to demonstrate MODPATH Version 7. \end{itemize} \textbf{\underline{BUG FIXES AND OTHER CHANGES TO EXISTING FUNCTIONALITY}} \\ @@ -58,10 +60,17 @@ % \item xxx %\end{itemize} - %\underline{EXCHANGES} - %\begin{itemize} - % \item xxx + \underline{EXCHANGES} + \begin{itemize} + \item In some cases, concentration instabilities appeared at the interface between two transport models. The artifacts were present for rare configurations connecting more than 2 transport models with identical grids in series. The problem was identified in the GWT-GWT Exchange and corrected. % \item xxx % \item xxx - %\end{itemize} + \end{itemize} + \underline{PARALLEL} + \begin{itemize} + \item Several issues were fixed for parallel simulations that used the Buoyancy Package for the GWF model. When a simulation was run with the Buoyancy Package, irrelevant messages could be written to the screen. In some cases, the Buoyancy Package produced strange results at the interface between two models. These issues have been corrected. + \item For parallel simulations, calculation of the residual norm used for pseudo-transient continuation (PTC) and backtracking was incorrect. The program was fixed to calculate the correct residual norm. + \item Enabling XT3D on exchanges in a parallel simulation caused the program to hang for certain configurations. This issue has been corrected. + \item GNC is not supported on flow exchanges when running in parallel or when the XT3D option is enabled on the exchange. The program terminates with an error if the user attempts to use GNC in these cases. + \end{itemize} diff --git a/doc/mf6io/mf6ivar/dfn/gwf-rcha.dfn b/doc/mf6io/mf6ivar/dfn/gwf-rcha.dfn index cf92c8c2d86..f25fbfbd320 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-rcha.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-rcha.dfn @@ -9,7 +9,7 @@ shape reader urword optional false longname use array-based input -description indicates that array-based input will be used for the Recharge Package. This keyword must be specified to use array-based input. When READASARRAYS is specified, +description indicates that array-based input will be used for the Recharge Package. This keyword must be specified to use array-based input. When READASARRAYS is specified, values must be provided for every cell within a model layer, even those cells that have an IDOMAIN value less than one. Values assigned to cells with IDOMAIN values less than one are not used and have no effect on simulation results. default_value True block options diff --git a/doc/mf6io/mf6ivar/tex/prt-prp-options.dat b/doc/mf6io/mf6ivar/tex/prt-prp-options.dat index 74f8f03c232..8bf92a71885 100644 --- a/doc/mf6io/mf6ivar/tex/prt-prp-options.dat +++ b/doc/mf6io/mf6ivar/tex/prt-prp-options.dat @@ -1,5 +1,6 @@ BEGIN OPTIONS [BOUNDNAMES] + [PRINT_INPUT] [LOCAL_Z] [TRACK FILEOUT ] [TRACKCSV FILEOUT ] From 931ff3acf3353c073e1ee1a8d291ca11d7e9a6e6 Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Thu, 16 May 2024 16:16:29 -0700 Subject: [PATCH 170/199] doc(supptechinfo): Update with new GWE chapter (#1800) * doc(supptechinfo): Update with new GWE chapter * Update doc/SuppTechInfo/groundwater-energy-model.tex Co-authored-by: langevin-usgs * More update for chapter 10 and an additional reference added to .bib --------- Co-authored-by: langevin-usgs --- doc/MODFLOW6References.bib | 46 ++++++ doc/SuppTechInfo/Tables/mf6enhancements.tex | 1 + doc/SuppTechInfo/body.tex | 6 + doc/SuppTechInfo/groundwater-energy-model.tex | 144 ++++++++++++++++++ doc/SuppTechInfo/mf6suptechinfo.bbl | 70 ++++++--- 5 files changed, 248 insertions(+), 19 deletions(-) create mode 100644 doc/SuppTechInfo/groundwater-energy-model.tex diff --git a/doc/MODFLOW6References.bib b/doc/MODFLOW6References.bib index 9be2bb87665..9af53b27e12 100644 --- a/doc/MODFLOW6References.bib +++ b/doc/MODFLOW6References.bib @@ -2960,3 +2960,49 @@ @article{langevin2024 Pages = {111-123}, Doi = {10.1111/gwat.13351}, year = {2024}} + +@article{markle2006, + Author = {Markle, Jeff M and Schincariol, Robert A and Sass, John H and Molson, John W}, + Date-Added = {2024-05-08 10:00:00 -0700}, + Date-Modified = {2024-05-08 10:00:00 -0700}, + Journal = {Soil Science Society of America Journal}, + Volume = {70}, + Number = {4}, + Pages = {1281--1294}, + Publisher = {Soil Science Society of America}, + Title = {Characterizing the Two-Dimensional Thermal Conductivity Distribution in a Sand and Gravel Aquifer}, + Year = {2006}, + doi = {https://doi.org/10.2136/sssaj2005.0293}} + +@article{campbell1994, + Author = {Campbell, G S and Jungbauer, J D and Bidlake, W R and Hungerford, R D}, + Date-Added = {2024-05-08 10:00:00 -0700}, + Date-Modified = {2024-05-08 10:00:00 -0700}, + Journal = {Soil Science}, + Volume = {158}, + Number = {5}, + Pages = {307--313}, + Publisher = {Williams and Wilkins}, + Title = {Predicting the Effect of Temperature on Soil Thermal Conductivity}, + Year = {1994}} + +@article{thorne2006, + Author = {Thorne, Danny and Langevin, Christian D and Sukop, Michael C}, + Date-Added = {2024-05-13 10:00:00 -0700}, + Date-Modified = {2024-05-13 10:00:00 -0700}, + Journal = {Computers and Geosciences}, + Volume = {32}, + Number = {10}, + Pages = {1758--1768}, + Publisher = {Elsevier}, + Title = {Addition of Simultaneous Heat and Solute Transport and Variable Fluid Viscosity to SEAWAT}, + Year = {2006}, + doi = {https://doi.org/10.1016/j.cageo.2006.04.005}} + +@book{panday2019bct, + Author = {Panday, S}, + Date-Added = {2024-05-16 00:00:00 -0000}, + Institution = {GSI Environmental}, + Title = {USG-Transport Version 1.4.0: The Block-Centered Transport Process for MODFLOW-USG}, + Url = {http://www.gsi-net.com/en/software/free-software/USG-Transport.html}, + Year = {2019}} diff --git a/doc/SuppTechInfo/Tables/mf6enhancements.tex b/doc/SuppTechInfo/Tables/mf6enhancements.tex index 40c9e0fcdc9..b522563b49c 100644 --- a/doc/SuppTechInfo/Tables/mf6enhancements.tex +++ b/doc/SuppTechInfo/Tables/mf6enhancements.tex @@ -29,6 +29,7 @@ VSC Package & \ref{ch:vscpackage} & 6.4.0 & -- \\ \rowcolor{Gray} Revised Parameterization of Transport for Combined Mobile and Immobile Domain Simulations & \ref{ch:sorption} & 6.4.2 & -- \\ + Groundwater Energy (GWE) Model & \ref{ch:gwemodel} & 6.5.0 & -- \\ \hline \end{tabular} \label{table:mf6enhance} diff --git a/doc/SuppTechInfo/body.tex b/doc/SuppTechInfo/body.tex index 6d3795d7b64..03e75decfba 100644 --- a/doc/SuppTechInfo/body.tex +++ b/doc/SuppTechInfo/body.tex @@ -53,6 +53,12 @@ \customlabel{ch:sorption}{\thechapno} \input{sorption.tex} +\newpage +\incchap +\SECTION{Chapter \thechapno. Groundwater Energy Model} +\customlabel{ch:gwemodel}{\thechapno} +\input{groundwater-energy-model.tex} + \newpage \ifx\usgsdirector\undefined diff --git a/doc/SuppTechInfo/groundwater-energy-model.tex b/doc/SuppTechInfo/groundwater-energy-model.tex new file mode 100644 index 00000000000..a5e29fbba6b --- /dev/null +++ b/doc/SuppTechInfo/groundwater-energy-model.tex @@ -0,0 +1,144 @@ + +The Groundwater Energy (GWE) Model for \mf simulates three-dimensional transport of thermal energy in flowing groundwater based on a generalized control-volume finite-difference approach. The GWE Model is designed to work with the Groundwater Flow (GWF) Model \citep{modflow6gwf} for \mf, which simulates transient, three-dimensional groundwater flow. The version of the GWE model documented here must use the same spatial discretization used by the GWF Model; however, that spatial discretization can be represented by regular MODFLOW grids consisting of layers, rows, and columns, or by more general unstructured grids. The GWE Model simulates (1) advective transport, (2) the combined hydrodynamic dispersion processes of velocity-dependent mechanical dispersion and thermal conduction in groundwater, (3) thermal conduction in the solid aquifer material, (4) storage of thermal energy in the groundwater and solid aquifer material, (5) thermal equilibration between the groundwater and solid aquifer material, (5) zero-order decay or production of thermal energy in the groundwater and the solid, (6) mixing from groundwater sources and sinks, and (7) direct addition or removal of thermal energy. The GWE Model can also represent advective energy transport through advanced package features, such as streams, lakes, multi-aquifer wells, and the unsaturated zone. If the GWE Model application uses the Water Mover (MVR) Package to connect flow packages, then energy transport between these packages can also be represented. The transport processes described here have been implemented in a fully implicit manner and are solved in a system of equations using iterative numerical methods. The present version of the GWE Model for \mf does not have an option to calculate steady-state transport solutions; if a steady-state solution is required, then transient evolution of the temperature must be represented using multiple time steps until no further significant changes in temperature are detected. + +Transport of thermal energy is sometimes simulated using a solute-transport model. In this approach, which takes advantage of the close analogy between the governing equations for thermal-energy transport and solute transport, the solute-transport model is run with values of input parameters that have been scaled to render the governing equation representative of thermal-energy transport \citep{thorne2006, hechtmendez, mazheng2010}. The GWT Model for \mf can be used in this way. However, the new GWE Model offers the following advantages: model input and output in terms of parameters and in units that relate directly to thermal-energy transport; variation of bulk thermal conductivity with changing saturation; and simulation of thermal conduction through the solid matrix, even in dry cells. + +\subsection{Mathematical Model} \label{sec:mathmodel} + +The Groundwater Energy (GWE) Model solves the following governing equation for thermal energy transport: + +\begin{equation} +\label{eqn:pdegwe} +\begin{aligned} +\rho_w C_{pw} \frac {\partial \left ( S_w \theta T \right )}{\partial t} ++ \rho_s C_{ps} \frac {\partial \left [ \left (1 - \theta \right ) T \right ]}{\partial t} += - \rho_w C_{pw} \nabla \cdot \left ( \matr{q} T \right ) ++ \rho_w C_{pw} \nabla \cdot \left ( \matr{D}_T \nabla T \right )\\ ++ \rho_w C_{pw} q'_s T_s + E_s + E_a - \gamma_{1w} \theta S_w +- \gamma_{1s} \left (1 - \theta \right ) \rho_s, +\end{aligned} +\end{equation} + +\noindent The two terms on the left-hand side of equation \ref{eqn:pdegwe} represent the rates of change in thermal energy storage in the water and the solid matrix, respectively. The six terms on the right-hand side of equation \ref{eqn:pdegwe} represent the rates at which thermal energy is advected, dispersed and/or conducted, added or removed by groundwater inflows or outflows, added or removed directly to or from the water, produced/decayed in the water, and produced/decayed in the solid matrix, respectively. The parameters and variables in equation \ref{eqn:pdegwe} are defined as follows: $S_w$ is the water saturation (dimensionless) defined as the volume of water per volume of voids; $\theta$ is the effective porosity, defined as volume of voids participating in transport per unit volume of aquifer; $\rho_w$ and $\rho_s$ are the densities ($M/L^3$) of the water and solid-matrix material, respectively; $C_{pw}$ and $C_{ps}$ are the specific heats ($E/(M \, deg)$) of the water and solid-matrix material, respectively; $T$ is temperature ($deg$); $t$ is time ($T$); $\matr{q}$ is the vector of specific discharge ($L/T$); $\matr{D}_T$ is the second-order tensor of hydrodynamic dispersion coeffiients for thermal energy transport ($L^2/T$); $q'_s$ is the volumetric flow rate per unit volume of aquifer (defined as positive for flow into the aquifer) for fluid sources and sinks ($1/T$), $T_s$ is the temperature of the source or sink fluid ($deg$), $E_s$ is rate of energy loading per unit volume of aquifer ($M/L^3T$), $E_a$ is rate of energy exchange with advanced stress packages ($M/L^3T$), $\gamma_{1w}$ is the zero-order energy decay rate coefficient in the water ($E/L^3T$), and $\gamma_{1s}$ is the zero-order energy decay rate coefficient in the solid ($E/MT$). Note that $\gamma_{1w}$ is defined on a per-volume-of-water basis, whereas $\gamma_{1s}$ is defined on a per-mass-of-solid basis. Note that $\rho_w$, $\rho_s$, $C_{pw}$, and $C_{ps}$ are assumed to remain constant with time, although the solid properties can vary spatially from cell to cell. + +Equation \ref{eqn:pdegwe} is closely analogous to the equation solved by the Groundwater Transport (GWT) Model for solute transport \citep{modflow6gwt}, with the following differences: + +\begin{itemize} +\item The GWT solute-transport equation describes the movement and conservation of solute mass, with the ``solute-mass density" (solute mass per volume of aquifer) represented by the volumetric concentration $C$ [$M/L^3$]. Equation \ref{eqn:pdegwe} describes the movement and conservation of thermal energy, with the ``thermal-energy density" (energy per volume of aquifer) represented by $\rho C_{p} T$ [$E/L^3$]. +\item Equation \ref{eqn:pdegwe} is based on the assumption that at any point in the model, the groundwater and solid matrix through which it moves are at the same temperature, i.e., they are at thermal equilibrium. The second term on the left-hand side of equation \ref{eqn:pdegwe} represents the rate of change in thermal energy stored in the solid. This term is analogous to the equilibrium-sorption term in the solute-transport equation, which represents the rate of change in solute mass sorbed onto the solid. There is no separate ``immobile domain" represented in the GWE Model, since all the material within a cell is assumed to be at the same temperature. +\item The GWT Model allows both zero-order (independent of concentration) and first-order (proportional to concentration) production/decay of solute and sorbate mass in the water to represent simple chemical reactions. The GWE model allows only zero-order (independent of temperature) production/decay of thermal energy, but it can occur in both the water and the solid. +\item Like the GWT solute-transport equation, equation \ref{eqn:pdegwe} includes a dispersion term. In the GWT solute-transport equation, the dispersion term represents mechanical dispersion and molecular diffusion of solute mass in the water. In equation \ref{eqn:pdegwe}, the dispersion term represents mechanical dispersion and conduction of thermal energy in the water, as well as conduction of thermal energy in the solid. Conduction in the solid has no analog in the GWT solute-transport equation. +\end{itemize} + +\noindent The GWE Model gives \mf a thermal-energy-transport simulation capability that is comparable to that in the finite-difference-based simulation codes HST3D \citep{kipp1987}, VS2DH \citep{healy1996}, SEAWAT 4 \citep{langevin2008seawat}, the Block-Centered Transport (BCT) Process for MODFLOW-USG \citep{modflowusg, panday2019bct}, and MT3D-USGS \citep{mt3dusgs}. + +\subsection{Energy-Transport Packages} \label{sec:packages} + +\noindent Equation~\ref{eqn:pdegwe} can be rewritten in the form + +\begin{equation} +\label{eqn:pdegwefterms} +\begin{aligned} +f^{EST} + f^{ADV} + f^{CND} + f^{SSM} + f^{ESL} + f^{APT} = 0, +\end{aligned} +\end{equation} + +\noindent where + +\begin{equation} +\label{eqn:fterms} +\begin{aligned} +& f^{EST} = - \rho_w C_{pw} \frac {\partial \left ( S_w \theta T \right )}{\partial t} +- \rho_s C_{ps} \frac {\partial \left [ \left (1 - \theta \right ) T \right ]}{\partial t} +- \gamma_{1w} \theta S_w - \gamma_{1s} \left (1 - \theta \right ) \rho_s \\ +& f^{ADV} = - \rho_w C_{pw} \nabla \cdot \left ( \matr{q} T \right ) \\ +& f^{CND} = \rho_w C_{pw} \nabla \cdot \left ( \matr{D}_T \nabla T \right ) \\ +& f^{SSM} = \rho_w C_{pw} q'_s T_s \\ +& f^{ESL} = E_s \\ +& f^{APT} = E_a, +\end{aligned} +\end{equation} + +\noindent and the three-letter acronyms in superscript denote the GWE Model packages that handle the corresponding terms of the thermal-energy equation. The term $ f^{APT}$ represents energy transfer between the groundwater model and advanced stress packages. Depending on the specific advanced package, mechanisms of energy transfer can include advection, conduction, and thermal equilibration. (Note that an analogous term should appear in equation 2--4 of \cite{modflow6gwt} to represent transfer of solute mass between a groundwater model and advanced stress packages of a GWT model, but was omitted from that equation.) + +Each of the GWE Model packages described here is analogous to a package associated with the GWT Model \citep{modflow6gwt}. Differences are highlighted below. + +\subsubsection{GWE Packages Directly Analogous to GWT Packages} + +The following GWE Model packages are directly analogous to packages of the same name in the GWT Model and will not be described in detailed here: Advection (ADV), Source-Sink Mixing (SSM), Mover Transport (MVT), Initial Conditions (IC), Flow Model Interface (FMI), Model Observations (OBS), and Output Control (OC). In the \mf source code, each of these packages is implemented as a single module that can be used for both GWT and GWE models. From the user's perspective, the only difference is that the GWE Model packages deal with transport of thermal energy instead of solute mass, and their input data are accordingly in units representative of energy transport. In addition, the GWE Model uses the Spatial Discretization (DIS, DISV, or DISU) Packages, which are also used by the GWT and Groundwater Flow (GWF) Models. + +The Constant Temperature (CTP) and Energy Source Loading (ESL) Packages in the GWE Model are directly analogous to the Constant Concentration (CNC) and Mass Source Loading (SRC) Packages in the GWT Model. Although also they function very similarly to their GWT Model counterparts, the CTP and ESL Packages have been assigned distinct names that better represent their connections with temperature and energy rather than concentration and solute mass. + +\subsubsection{Energy Storage and Transfer (EST) Package} + +The Energy Storage and Transfer (EST) Package in the GWE Model is analogous to the Mobile Storage and Transfer (MST) Package in the GWT Model. The EST Package accounts for changes in thermal energy storage in the groundwater and the solid matrix under the assumption of thermal equilibrium between water and solid, as well as zero-order production/decay of thermal energy in the water and the solid. Thermal equilibration is analogous to equilibrium sorption. In the MST package, sorption is optional, whereas thermal equilibrium is integral to the formulation of the GWE Model. + +Because the temperature is assumed to be the same in all material within a cell, there is no need to simulate the effects of temperature changes in a separate ``immobile domain.'' Consequently, there is no analog in the GWE Model to the Immobile Storage and Transfer (IST) Package in the GWT Model. + +\subsubsection{Conduction and Dispersion (CND) Package} + +The Conduction and Dispersion (CND) Package in the GWE Model is analogous the Dispersion (DSP) Package in the GWT Model. As mentioned earlier in this chapter, the DSP Package accounts only for molecular diffusion and mechanical dispersion (together referred to simply as ``dispersion") in the water, since diffusion of solute into the solid matrix material is typically not of practical interest. By contrast, the CND Package accounts for conduction (thermal diffusion) in both the water and the solid, as well as mechanical dispersion of thermal energy in the water. + +The dispersion term handled by the CND Package is given by the third expression listed in equation \ref{eqn:fterms}. The term in parentheses is the negative of the dispersive flux, which includes mechanical dispersion in the water and conduction in the water and solid. Accordingly, the dispersion tensor, $\matr{D}_T$, is expressed as the sum of contributions from mechanical dispersion and conduction: + +\begin{equation} +\label{eqn:dt_tensor} +\begin{aligned} +\matr{D}_T = S_w \theta \matr{D}^{mech} + D^{mol} \matr{I}, +\end{aligned} +\end{equation} + +\noindent where $\matr{D}^{mech}$ is the mechanical dispersion tensor, + +\begin{equation} +\label{eqn:dmolforheat} +\begin{aligned} +D^{mol} = \frac {{k_T}_{bulk}}{\rho_w C_{pw}} +\end{aligned} +\end{equation} + +\noindent is a molecular diffusion coefficient ($L^2/T$) that combines the conductive capacity of the water and the solid, and + +\begin{equation} +\label{eqn:ktbulk} +\begin{aligned} +{k_T}_{bulk} = S_w \theta {k_T}_w + \left ( 1 - \theta \right ) {k_T}_s +\end{aligned} +\end{equation} + +\noindent is a bulk thermal conductivity ($E/(T L \, deg)$) that depends on the thermal conductivities of the water and the solid, ${k_T}_w$ and ${k_T}_s$ ($E/(T L \, deg)$, respectively. The particular form of the bulk conductivity in equation \ref{eqn:ktbulk} corresponds to the \textit{ad hoc} assumption that the total conductive flux is the sum of independent contributions from the water and the solid, which are proportional to the volumes of water and solid, respectively. One could describe different conductive behavior using a nonlinear expression for bulk conductivity {\citep{campbell1994, markle2006}. However, the bulk conductivity expression in equation \ref{eqn:ktbulk} is the only one available in the version of the GWE Model described here. Note that the CND Package does not account explicitly for tortuosity. The user should adjust the input values of ${k_T}_w$ and ${k_T}_s$ to account for the effects of tortuosity if desired. + +Once the dispersion tensor is calculated, the CND Package handles dispersion in a way that is directly analogous to the method used in the DSP Package. As in the DSP Package, the XT3D option is the default method for representing dispersion in the CND Package, and XT3D can be turned off by the user in package input. + +\subsubsection{Advanced Stress Packages} + +The version of the GWE Model described here offers four advanced stress packages, each of which is analogous and functions similarly to an advanced package in the GWT Model: Lake Energy Transport (LKE), Multi-Aquifer Well Energy Transport (MWE), Streamflow Energy Transport (SFE), and Unsaturated Zone Energy Transport (UZE). The GWE advanced stress packages will not be described in detail here except to note differences from the corresponding GWT packages. The primary difference, of course, is that GWE advanced stress packages deal with transport of thermal energy, not solute mass. + +The LKE, SFE, and MWE Packages offer a mechanism for energy to conduct between the lake or stream reach and the aquifer through a thermally conductive layer that can represent, for example, a lake or stream bed or a well casing. The LKT, SFT, and MWT packages do not offer analogous diffusion of solute through the a conductive layer. The LKE and SFE packages also account for removal of thermal energy from surface water by evaporation. + +The UZE Package simulates thermal energy transport through the unsaturated zone. It calculates cell temperatures based on cell-cell flows generated by the Unsaturated Zone Flow (UZF) Package in the GWF Model and the assumption of thermal equilibrium between the water and the solid matrix material. Equilibrium sorption, which can be considered a solute-transport analog of thermal equilibrium, is not currently simulated by the corresponding Unsaturated Zone Transport (UZT) Package in the GWT Model. + +\subsection{Exchanges} + +The GWF-GWE Exchange establishes the link between a GWE model and its corresponding GWF model when the two models are run in the same simulation. The GWE-GWE Exchange establishes the link between two GWE models that have cell-cell connections between the two models. + +\subsection{Transport in Dry Cells} + +Because thermal conduction can occur in a dry cell (a cell in which the calculated head is below the cell bottom), model cells are never deactivated in a GWE Model due to going dry, regardless of whether or not the Newton-Raphson formulation is being used. If the Newton-Raphson formulation is \textit{not} used, the only energy-transport process simulated in a dry cell is thermal conduction through the solid matrix. If the Newton-Raphson formulation \textit{is} used, dry cells are assumed to transmit water without storing it, as in the GWT Model. In that case, the energy-transport processes simulated in a dry cell are thermal equilibration between the transmitted water and the solid matrix through which it is passing, thermal conduction through the solid matrix, and advection of thermal energy by the transmitted water. + +\subsection{Summary of Main Assumptions and Limitations} + +The following is a list of the main assumptions and limitations of the GWE Model for \mf: + +\begin{itemize} +\item Groundwater is assumed to be in thermal equilibrium with the solid matrix material through which it flows. +\item Densities and specific heats of the water and solid are assumed to be constant in time. However, the solid properties can vary spatially. +\item Like the GWT Model, the GWE Model does not account for changes in porosity with time. Changes in porosity are accounted for implicitly in the storage term of the GWF Model, but \mf does not explicitly track the evolution of porosity due to storage changes. +\item The GWE Model does not simulate freezing and does not check for or prevent calculated temperatures below freezing. +\item In partially saturated cells, the GWE Model does not represent thermal conduction separately in the saturated and dry portions of the cell. A single bulk thermal conductivity is calculated based on the overall water and solid contents of the cell, and conduction between cells is approximated as occurring over the entire shared cell face based on this single conductivity. +\item Dry cells remain active in a GWE model so that thermal conduction through the solid matrix material can be simulated. +\item Terms in the thermal energy transport equation that are associated with groundwater flows are expressed relative to a reference temperature of zero (in whatever temperature unit is being used in the simulation). This choice of reference temperature is straightforward but arbitrary. Choosing a different reference temperature would change the numerical values of all such terms, but the overall energy balance would be unaffected, since the sum of those terms would remain the same as a consequence of groundwater mass conservation. This should be borne in mind when interpreting the reported values of budget terms associated with groundwater flows. +\item A GWE model must use the same spatial discretization as the GWF model from which it obtains groundwater flow information. +\item The present version of the GWE Model does not have an option to directly calculate steady-state transport solutions; a steady-state solution must be approached using a sufficiently long transient simulation. + +\end{itemize} diff --git a/doc/SuppTechInfo/mf6suptechinfo.bbl b/doc/SuppTechInfo/mf6suptechinfo.bbl index ef6f9175094..deed854f368 100644 --- a/doc/SuppTechInfo/mf6suptechinfo.bbl +++ b/doc/SuppTechInfo/mf6suptechinfo.bbl @@ -1,15 +1,21 @@ -\begin{thebibliography}{16} +\begin{thebibliography}{21} \providecommand{\natexlab}[1]{#1} \expandafter\ifx\csname urlstyle\endcsname\relax - \providecommand{\doiagency}[1]{doi:\discretionary{}{}{}#1}\else - \providecommand{\doiagency}{doi:\discretionary{}{}{}\begingroup + \providecommand{\doi}[1]{doi:\discretionary{}{}{}#1}\else + \providecommand{\doi}{doi:\discretionary{}{}{}\begingroup \urlstyle{rm}\Url}\fi +\bibitem[{Campbell and others(1994)Campbell, Jungbauer, Bidlake, and + Hungerford}]{campbell1994} +Campbell, G.S., Jungbauer, J.D., Bidlake, W.R., and Hungerford, R.D., 1994, + Predicting the effect of temperature on soil thermal conductivity: Soil + Science, v. 158, no.~5, p.~307--313. + \bibitem[{Guo and Langevin(2002)}]{langevin2002seawat} -Guo, W., and Langevin, C.D., 2002, User's Guide to SEAWAT: A Computer Program - for Simulation of Three-Dimensional Variable-Density Ground-Water Flow: {U.S. - Geological Survey Techniques of Water-Resources Investigations book 6, - Chapter A7, 77 p.}, accessed July 25, 2019, at +Guo, Weixing, and Langevin, C.D., 2002, User's Guide to SEAWAT: A Computer + Program for Simulation of Three-Dimensional Variable-Density Ground-Water + Flow: {U.S. Geological Survey Techniques of Water-Resources Investigations + book 6, Chapter A7, 77 p.}, accessed July 25, 2019, at \url{https://pubs.er.usgs.gov/publication/ofr03426}. \bibitem[{Harbaugh(2005)}]{modflow2005} @@ -26,6 +32,13 @@ Healy, R.W., and Ronan, A.D., 1996, Documentation of Computer Program VS2DH for accessed September 27, 2022, at \url{https://doi.org/10.3133/wri964230}, at \url{https://pubs.usgs.gov/wri/1996/4230/report.pdf}. +\bibitem[{Hecht-Mendez and others(2010)Hecht-Mendez, Molina-Giraldo, Blum, and + Bayer}]{hechtmendez} +Hecht-Mendez, J., Molina-Giraldo, N., Blum, P., and Bayer, P., 2010, Evaluating + mt3dms for heat transport simulation of closed geothermal systems: + Groundwater, v.~48, no.~5, p.~741--756, + \url{https://doi.org/10.1111/j.1745-6584.2010.00678.x}. + \bibitem[{Hughes and Sanford(2004)}]{hughes2004} Hughes, J.D., and Sanford, W.E., 2004, SUTRA-MS: A version of SUTRA modified to simulate heat and multiple-solute transport: {U.S. Geological Survey Open @@ -40,8 +53,8 @@ Hughes, J.D., Langevin, C.D., and Banta, E.R., 2017, Documentation for the chap. A57, 36 p.}, \url{https://doi.org/10.3133/tm6A57}. \bibitem[{Kavetski and Kuczera(2007)}]{doi:10.1029/2006WR005195} -Kavetski, D., and Kuczera, G., 2007, Model smoothing strategies to remove - microscale discontinuities and spurious secondary optima in objective +Kavetski, Dmitri, and Kuczera, George, 2007, Model smoothing strategies to + remove microscale discontinuities and spurious secondary optima in objective functions in hydrological calibration: Water Resources Research, v.~43, no.~3, \url{https://doi.org/10.1029/2006WR005195}, \url{https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2006WR005195}. @@ -54,8 +67,8 @@ Kipp, K.L., 1987, HST3D: A Computer Code for Simulation of Heat and Solute \bibitem[{Langevin and others(2008)Langevin, Thorne~Jr, Dausman, Sukop, and Guo}]{langevin2008seawat} -Langevin, C.D., Thorne~Jr, D.T., Dausman, A.M., Sukop, M.C., and Guo, W., 2008, - {SEAWAT} Version 4---A computer program for simulation of multi-species +Langevin, C.D., Thorne~Jr, D.T., Dausman, A.M., Sukop, M.C., and Guo, Weixing, + 2008, {SEAWAT} Version 4---A computer program for simulation of multi-species solute and heat transport: {U.S. Geological Survey Techniques and Methods, book 6, chap. A22, 39 p.}, accessed June 27, 2017, at \url{https://pubs.er.usgs.gov/publication/tm6A22}. @@ -63,25 +76,38 @@ Langevin, C.D., Thorne~Jr, D.T., Dausman, A.M., Sukop, M.C., and Guo, W., 2008, \bibitem[{Langevin and others(2017)Langevin, Hughes, Provost, Banta, Niswonger, and Panday}]{modflow6gwf} Langevin, C.D., Hughes, J.D., Provost, A.M., Banta, E.R., Niswonger, R.G., and - Panday, S., 2017, Documentation for the MODFLOW 6 Groundwater Flow (GWF) + Panday, Sorab, 2017, Documentation for the MODFLOW 6 Groundwater Flow (GWF) Model: {U.S. Geological Survey Techniques and Methods, book 6, chap. A55, 197 p.}, \url{https://doi.org/10.3133/tm6A55}. \bibitem[{Langevin and others(2022)Langevin, Provost, Panday, and Hughes}]{modflow6gwt} -Langevin, C.D., Provost, A.M., Panday, S., and Hughes, J.D., 2022, +Langevin, C.D., Provost, A.M., Panday, Sorab, and Hughes, J.D., 2022, Documentation for the MODFLOW 6 Groundwater Transport (GWT) Model: {U.S. Geological Survey Techniques and Methods, book 6, chap. A61, 56 p.}, \url{https://doi.org/10.3133/tm6A61}. +\bibitem[{Ma and Zheng(2010)}]{mazheng2010} +Ma, Rui, and Zheng, Chunmiao, 2010, Effects of density and viscosity in + modeling heat as a groundwater tracer: Groundwater, v.~48, no.~3, + p.~380--389, \url{https://doi.org/10.1111/j.1745-6584.2009.00660.x}. + \bibitem[{Maidment(1993)}]{maidment1993} Maidment, D.R., 1993, Handbook of Hydrology: New York, USA, McGraw-Hill. +\bibitem[{Markle and others(2006)Markle, Schincariol, Sass, and + Molson}]{markle2006} +Markle, J.M., Schincariol, R.A., Sass, J.H., and Molson, J.W., 2006, + Characterizing the two-dimensional thermal conductivity distribution in a + sand and gravel aquifer: Soil Science Society of America Journal, v.~70, + no.~4, p.~1281--1294, + \url{https://doi.org/https://doi.org/10.2136/sssaj2005.0293}. + \bibitem[{Panday and others(2013)Panday, Langevin, Niswonger, Ibaraki, and Hughes}]{modflowusg} -Panday, S., Langevin, C.D., Niswonger, R.G., Ibaraki, M., and Hughes, J.D., - 2013, MODFLOW-USG version 1---An unstructured grid version of MODFLOW for - simulating groundwater flow and tightly coupled processes using a control +Panday, Sorab, Langevin, C.D., Niswonger, R.G., Ibaraki, Motomu, and Hughes, + J.D., 2013, MODFLOW-USG version 1---An unstructured grid version of MODFLOW + for simulating groundwater flow and tightly coupled processes using a control volume finite-difference formulation: {U.S. Geological Survey Techniques and Methods, book 6, chap. A45, 66 p.}, accessed June 27, 2017, at \url{https://pubs.usgs.gov/tm/06/a45/}. @@ -92,6 +118,12 @@ Provost, A.M., Langevin, C.D., and Hughes, J.D., 2017, Documentation for the Geological Survey Techniques and Methods, book 6, chap. A56, 46 p.}, \url{https://doi.org/10.3133/tm6A56}. +\bibitem[{Thorne and others(2006)Thorne, Langevin, and Sukop}]{thorne2006} +Thorne, Danny, Langevin, C.D., and Sukop, M.C., 2006, Addition of simultaneous + heat and solute transport and variable fluid viscosity to seawat: Computers + and Geosciences, v.~32, no.~10, p.~1758--1768, + \url{https://doi.org/https://doi.org/10.1016/j.cageo.2006.04.005}. + \bibitem[{Voss(1984)}]{voss1984sutra} Voss, C.I., 1984, SUTRA---A finite-element simulation model for saturated-unsaturated fluid-density-dependent ground-water flow with energy @@ -99,11 +131,11 @@ Voss, C.I., 1984, SUTRA---A finite-element simulation model for Geological Survey Water-Resources Investigations Report 84--4369, 409 p.} \bibitem[{Zheng(2010)}]{zheng2010supplemental} -Zheng, C., 2010, MT3DMS v5.3, Supplemental User's Guide: {Technical Report - Prepared for the U.S. Army Corps of Engineers, 51 p.} +Zheng, Chunmiao, 2010, MT3DMS v5.3, Supplemental User's Guide: {Technical + Report Prepared for the U.S. Army Corps of Engineers, 51 p.} \bibitem[{Zheng and Wang(1999)}]{zheng1999mt3dms} -Zheng, C., and Wang, P.P., 1999, MT3DMS---A modular three-dimensional +Zheng, Chunmiao, and Wang, P.P., 1999, MT3DMS---A modular three-dimensional multi-species transport model for simulation of advection, dispersion and chemical reactions of contaminants in groundwater systems; Documentation and user's guide: {Contract report SERDP--99--1: Vicksburg, Miss., U.S. Army From 0fec041cff9659f9c3000a48acf676cbd38991de Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 16 May 2024 22:56:58 -0400 Subject: [PATCH 171/199] refactor(prt): appease intel fpp, update options, drop obs, revise mf6io (#1813) * intel fortran preprocessor `fpp` substitutes "1" for "unix" on linux/mac * https://www.intel.com/content/www/us/en/docs/cpp-compiler/developer-guide-reference/2021-8/additional-predefined-macros.html, thanks to @scharlton2 for pointing this out * rename `unix`/`uniy` and related variables (interior/exterior unit normal components) to `unintx`/`uninty` etc * update options * move `zeromethod` option to prp, rename to `dev_exit_solve_method` * add `exit_solve_tolerance` option * update prt autotests and snapshots * add comment to brent's root-finding method * remove `dev_feature` blocking prt in `SimulationCreate` * remove prt obs for now, plan to support for next release * revise mf6io, regenerate mf6io files --- ... => test_notebooks[ex-prt-mp7-p01.py].npy} | Bin ... => test_notebooks[ex-prt-mp7-p02.py].npy} | Bin ... => test_notebooks[ex-prt-mp7-p03.py].npy} | Bin ... => test_notebooks[ex-prt-mp7-p04.py].npy} | Bin .../test_mf6model[0-prtterbr].npy | Bin 0 -> 9266 bytes .../test_mf6model[1-prtterch].npy | Bin 0 -> 9266 bytes .../test_mf6model[0-prtvor1l2r].npy | Bin 19384 -> 19384 bytes .../test_mf6model[1-prtvor1welp].npy | Bin 19367 -> 19367 bytes autotest/test_prt_disv1.py | 263 ++++++++++-------- autotest/test_prt_notebooks.py | 18 +- autotest/test_prt_ternary_methods.py | 112 +++++++- autotest/test_prt_track_events.py | 2 +- autotest/test_prt_triangle.py | 5 - autotest/test_prt_voronoi1.py | 6 +- distribution/build_docs.py | 10 +- doc/mf6io/gwe/fmi.tex | 2 +- doc/mf6io/gwt/fmi.tex | 2 +- doc/mf6io/mf6io.bbl | 7 +- doc/mf6io/mf6ivar/dfn/prt-mip.dfn | 8 - doc/mf6io/mf6ivar/dfn/prt-oc.dfn | 132 +-------- doc/mf6io/mf6ivar/dfn/prt-prp.dfn | 37 ++- .../mf6ivar/examples/prt-fmi-example.dat | 1 - doc/mf6io/mf6ivar/examples/prt-oc-example.dat | 5 +- doc/mf6io/mf6ivar/md/mf6ivar.md | 246 +++++++++++++--- doc/mf6io/mf6ivar/tex/appendixA.tex | 56 ++++ doc/mf6io/mf6ivar/tex/gwf-evta-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/gwf-rcha-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/prt-mip-desc.tex | 2 - doc/mf6io/mf6ivar/tex/prt-mip-options.dat | 1 - doc/mf6io/mf6ivar/tex/prt-oc-desc.tex | 34 +-- doc/mf6io/mf6ivar/tex/prt-oc-options.dat | 4 +- doc/mf6io/mf6ivar/tex/prt-prp-desc.tex | 24 +- doc/mf6io/mf6ivar/tex/prt-prp-options.dat | 1 + doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex | 2 + doc/mf6io/mf6ivar/tex/swf-dis2d-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/swf-disv1d-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/swf-disv2d-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/swf-ic-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/utl-spca-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/utl-spta-desc.tex | 2 +- doc/mf6io/mf6output.tex | 12 +- doc/mf6io/mf6switches.tex | 2 +- doc/mf6io/prt/fmi.tex | 2 +- doc/mf6io/prt/namefile.tex | 3 +- doc/mf6io/prt/oc.tex | 4 +- doc/mf6io/prt/prt-obs.tex | 39 --- doc/mf6io/prt/prt.tex | 26 +- make/makefile | 1 - msvs/mf6core.vfproj | 1 - src/Idm/prt-mipidm.f90 | 19 -- src/Model/ModelUtilities/TrackData.f90 | 10 +- src/Model/ParticleTracking/prt-mip.f90 | 11 +- src/Model/ParticleTracking/prt-obs.f90 | 235 ---------------- src/Model/ParticleTracking/prt-oc.f90 | 43 ++- src/Model/ParticleTracking/prt-prp.f90 | 27 +- src/Model/ParticleTracking/prt.f90 | 47 +--- src/SimulationCreate.f90 | 2 - .../ParticleTracker/MethodCellTernary.f90 | 107 ++++--- src/Solution/ParticleTracker/MethodDisv.f90 | 7 +- .../ParticleTracker/MethodSubcellTernary.f90 | 16 +- src/Solution/ParticleTracker/Particle.f90 | 14 + .../ParticleTracker/TernarySolveTrack.f90 | 30 +- src/Utilities/MathUtil.f90 | 5 + src/meson.build | 1 - 64 files changed, 780 insertions(+), 880 deletions(-) rename autotest/__snapshots__/test_prt_notebooks/{test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p01.py].npy => test_notebooks[ex-prt-mp7-p01.py].npy} (100%) rename autotest/__snapshots__/test_prt_notebooks/{test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p02.py].npy => test_notebooks[ex-prt-mp7-p02.py].npy} (100%) rename autotest/__snapshots__/test_prt_notebooks/{test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p03.py].npy => test_notebooks[ex-prt-mp7-p03.py].npy} (100%) rename autotest/__snapshots__/test_prt_notebooks/{test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p04.py].npy => test_notebooks[ex-prt-mp7-p04.py].npy} (100%) create mode 100644 autotest/__snapshots__/test_prt_ternary_methods/test_mf6model[0-prtterbr].npy create mode 100644 autotest/__snapshots__/test_prt_ternary_methods/test_mf6model[1-prtterch].npy delete mode 100644 doc/mf6io/prt/prt-obs.tex delete mode 100644 src/Model/ParticleTracking/prt-obs.f90 diff --git a/autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p01.py].npy b/autotest/__snapshots__/test_prt_notebooks/test_notebooks[ex-prt-mp7-p01.py].npy similarity index 100% rename from autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p01.py].npy rename to autotest/__snapshots__/test_prt_notebooks/test_notebooks[ex-prt-mp7-p01.py].npy diff --git a/autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p02.py].npy b/autotest/__snapshots__/test_prt_notebooks/test_notebooks[ex-prt-mp7-p02.py].npy similarity index 100% rename from autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p02.py].npy rename to autotest/__snapshots__/test_prt_notebooks/test_notebooks[ex-prt-mp7-p02.py].npy diff --git a/autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p03.py].npy b/autotest/__snapshots__/test_prt_notebooks/test_notebooks[ex-prt-mp7-p03.py].npy similarity index 100% rename from autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p03.py].npy rename to autotest/__snapshots__/test_prt_notebooks/test_notebooks[ex-prt-mp7-p03.py].npy diff --git a/autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p04.py].npy b/autotest/__snapshots__/test_prt_notebooks/test_notebooks[ex-prt-mp7-p04.py].npy similarity index 100% rename from autotest/__snapshots__/test_prt_notebooks/test_notebooks[Userswbonellidevmodflow6-examplesscriptsex-prt-mp7-p04.py].npy rename to autotest/__snapshots__/test_prt_notebooks/test_notebooks[ex-prt-mp7-p04.py].npy diff --git a/autotest/__snapshots__/test_prt_ternary_methods/test_mf6model[0-prtterbr].npy b/autotest/__snapshots__/test_prt_ternary_methods/test_mf6model[0-prtterbr].npy new file mode 100644 index 0000000000000000000000000000000000000000..41c79d96c54aa92a5f42d2336b7e3788d5ef15e0 GIT binary patch literal 9266 zcmb7}33O9c8i3ofm4euot?Xe<+O(l9TNj|0mh#%BYudD7r)g7OA#HNg6k7yD9Ri4o zi0HVBB8Vf1IHMkqgNVww9T#-Q<9Oyc4rj*0;KsNjqt1Wdy`}HZ?eRL{9D3hN-j{#5 z_usO&(p^!#G&W{K?A6w0Uq@5OnrB&Vv#t;NLe_MPb$)A(H8tG=H#)*WbfdMc*^h4o zLs6dy1;h9g{>E;6qsixwf@}=5`|xKv!j0k14ty`5G+B*H=*2Yk%u{&XP$k!BT?+AxFo5Be+hJPvn zZt}NjtTSdCjVp@v(tg`%e-|BKbH+Nu+vq^?$>wl((3e05^*#u~C(!tvJGRroE}CF- z_VdKX#Kdf(Ln>{a{;*;`r$hM?yiKn#mdwv|7+->i>6Ls5zNLwL30|d1o&i8;W&Whe ze9b&bhkFLG``m|g1i#|mqa!`>@LrGK=qN*+Fdc3D?V>5h-)=g__`8vgHNK5`hK>u< z@tf%cn?6(@R0F%XMBWC z(}%$#F+!*7SHdDCLTBiSu&_j^RZoJ2EkbR2GAuG9G*urCi<}5e(?`I9M5tXK35${l zP1i>WL0WQX1{1{LqBB7dT^1qJ>#UB@EPb>-)9H!OY&``QYa(=(J_Z(ggwEE-!Xg-< zbM$e7T9rfRGU_}R&0*9bSh0dI&GkCFA~dhlxfON+m?z)6b0wW`V|$|a-%@7`T*YW$ zFyqy`APpz^9nv7)D)>8Jc!t8?YFBlpcxBNAVY;v{Zfq~E;QXe~_UNHwS}(W$3Anbr zto3kpz!WGjWN^{GYX?sIn+fCo$R0Pe^jU-<7}H>AX_AJFeD}LIKNz*$j2X)1GfT5b zg_#7R%pCiG2~(GM%<|IR2az;|7&A`uBh{b6^_&8P(Nvh+f1LxZz6Q)Q zd&AGIy9O`|zIv*7|LX`-f-xRRngvW2_-<0aZ~tp2uTR!URqZVHLYPt&X3=0_;`)`` zvZSJ$yUe`($}py0lBO`O0v`V_NHg!F{N`m7G*W)<(kK31i;*-=6{e_h=RD`>M*tJI zAo$Sx34pN}M;&3xF{VzErg)ur+Woxq^r0{A(@5FZ;O(O$5T-(fDIIV7=G5*L8gUmN z&lpzUUn3>&EgSz>d=|n~V$5(!8t0a0YR+$)1eoEqaMnj_L_5NiTYxZCDolCc#D-UX zpR19&p6#dQ%ATsmn3<9^71s(A*L^O;TJp4i7sN6oO^pgub*lZ2o2otnXR8xdh#7?UnZqtQqIJHL`e~EKRKvGsQR!fYD(0jeiUQxxe zKE6wci#clIGa4y)2V$Rp7s51P%pggcWtW&m;x*!$#1f5NBMX+w`^KZftXM5{sri#Q zQ~7guLb4jiz(Oanz=P>5)IE~CYn+&J58Y#6}h4I}kY*Qj)C&_+NPB3dQ zCRLKAMThWk@k0oD`j)rr1YPUv~>|ilDRU=vNaW%~*_F~Lb zNgAE?5-~9lAHEQID)W0@=$J80O3XnX7D&-wAS8PdHInJ&5y*^b#+Yf6G_9Lh;2o%u z!ZKbRk<4VdX!EHs>+_(r`fQIz7ETti-SJnJrmV=sElSLrEJa?ek^CR-XQ@Ub4nGgd zW~J6*%o<6l^`G%#n&e*(IWBkrFvW1d&u>H0=qikVC{(Wxp9N`p3LVEpuBKU_xVr7!#DGspU@>`~!pnmjfmMmCA-!5hkR>w6H>t_I97dPURflA!Fj4{Y($hUxf+x zV&b5e=DlX09ks`Zf)EDXTaDFarJ_6PY}y&78~Wm!df0*=j1WInBbT{#pF|xpz+9!k zkfa+#*?t*Q`#IlHmp2k%x-drWVN+i0Y0Te+VyWnMsKd7K#A?QLt1yV)p+{0SSgi^hjaZ%YAl)74laSRY$-epWp9*@#yX*OYu+{0$iT#VP3MBF`HGGITckbeL_c_!7`5yn2EevFk`l0jNHTK9N_H~X<&J#>(9``#zvhE zu+23pO#TH?S=689r6j3%jT_x8%~lnrppr%Qd}uyTh@4S=Q&i*tX|BZ>xfL!r4=v}t z#{pxMfY42pujaLeS(@uq7}5-rkKzXbvtJa-QY#G7T#qqwE8N@P-zXX^=L=D@55W9J zg(;lP`)5+`6Z_CPlBK`$%aKC|%r=aXTVYKXBMFO8dWy|CZfWWZs0{aalaup zkaio}&Fhdf+c8FNg`KYpPq`0?VsJ?}x3$?*J5-qJ<)W>3FJrT*HYhHq^HX8Q?8F$k z6|V8KIvIkfd%P$TifB~V2)4OFg>kLtMLMbbSe%N&S9ry2mSz{m$USV`TkI?}Lq}Z( zQcZbBBa4jcOGhTYQH5E$lJ62ynxIb+d21nJ})q1b}KPYiy?z+p9q7wQE8MNhFdU3ZiQE*@;02f0z6rg zTpNs`U%CgGc#jI>?Z+mz!ytCvAr`YzpualvAB4FTW5!DbkJl}>OI0;IeBn{((@x^r zfGM?CiCHB&nW~=2Z}!tX<(N%;8^$Eb(lm+Ew5m|l+u2XTjP$h^kW%}Um{u{}tP;tR zWIry);@dICCQH-7OFvST!H3}_`w^b7%u3y%!nE{+^wJOb86Y#0qJDS)6aQ9;Im70F z9*vY1^N|N}7!w}TSQ0RIV$1+Zsh00Wf+-y$vZjOZQrE21T`J7lA;LB#Uy6p!k;xZk z%-t9>QIckDnwW~0ob17{O$__cjJZdJ(bL2U*A|LdO2(D4!|%lyd1%q9iS$$)65G%I za#RlsCcaOJ5$zNyp2lYt#BM~@Wk{*}F-9I*v>p>9kHx1%5VcQ*t^!(Xvuz$wV&3PL zAd9aNE=&9HVc0=$Aj$PK$v~o*3NqDa|2_*)2czMlIf%rPZq5&z-A aFf{zvw=_@47(Dw3{VL3HUzk4Wb^H(d8!D~< literal 0 HcmV?d00001 diff --git a/autotest/__snapshots__/test_prt_ternary_methods/test_mf6model[1-prtterch].npy b/autotest/__snapshots__/test_prt_ternary_methods/test_mf6model[1-prtterch].npy new file mode 100644 index 0000000000000000000000000000000000000000..41c79d96c54aa92a5f42d2336b7e3788d5ef15e0 GIT binary patch literal 9266 zcmb7}33O9c8i3ofm4euot?Xe<+O(l9TNj|0mh#%BYudD7r)g7OA#HNg6k7yD9Ri4o zi0HVBB8Vf1IHMkqgNVww9T#-Q<9Oyc4rj*0;KsNjqt1Wdy`}HZ?eRL{9D3hN-j{#5 z_usO&(p^!#G&W{K?A6w0Uq@5OnrB&Vv#t;NLe_MPb$)A(H8tG=H#)*WbfdMc*^h4o zLs6dy1;h9g{>E;6qsixwf@}=5`|xKv!j0k14ty`5G+B*H=*2Yk%u{&XP$k!BT?+AxFo5Be+hJPvn zZt}NjtTSdCjVp@v(tg`%e-|BKbH+Nu+vq^?$>wl((3e05^*#u~C(!tvJGRroE}CF- z_VdKX#Kdf(Ln>{a{;*;`r$hM?yiKn#mdwv|7+->i>6Ls5zNLwL30|d1o&i8;W&Whe ze9b&bhkFLG``m|g1i#|mqa!`>@LrGK=qN*+Fdc3D?V>5h-)=g__`8vgHNK5`hK>u< z@tf%cn?6(@R0F%XMBWC z(}%$#F+!*7SHdDCLTBiSu&_j^RZoJ2EkbR2GAuG9G*urCi<}5e(?`I9M5tXK35${l zP1i>WL0WQX1{1{LqBB7dT^1qJ>#UB@EPb>-)9H!OY&``QYa(=(J_Z(ggwEE-!Xg-< zbM$e7T9rfRGU_}R&0*9bSh0dI&GkCFA~dhlxfON+m?z)6b0wW`V|$|a-%@7`T*YW$ zFyqy`APpz^9nv7)D)>8Jc!t8?YFBlpcxBNAVY;v{Zfq~E;QXe~_UNHwS}(W$3Anbr zto3kpz!WGjWN^{GYX?sIn+fCo$R0Pe^jU-<7}H>AX_AJFeD}LIKNz*$j2X)1GfT5b zg_#7R%pCiG2~(GM%<|IR2az;|7&A`uBh{b6^_&8P(Nvh+f1LxZz6Q)Q zd&AGIy9O`|zIv*7|LX`-f-xRRngvW2_-<0aZ~tp2uTR!URqZVHLYPt&X3=0_;`)`` zvZSJ$yUe`($}py0lBO`O0v`V_NHg!F{N`m7G*W)<(kK31i;*-=6{e_h=RD`>M*tJI zAo$Sx34pN}M;&3xF{VzErg)ur+Woxq^r0{A(@5FZ;O(O$5T-(fDIIV7=G5*L8gUmN z&lpzUUn3>&EgSz>d=|n~V$5(!8t0a0YR+$)1eoEqaMnj_L_5NiTYxZCDolCc#D-UX zpR19&p6#dQ%ATsmn3<9^71s(A*L^O;TJp4i7sN6oO^pgub*lZ2o2otnXR8xdh#7?UnZqtQqIJHL`e~EKRKvGsQR!fYD(0jeiUQxxe zKE6wci#clIGa4y)2V$Rp7s51P%pggcWtW&m;x*!$#1f5NBMX+w`^KZftXM5{sri#Q zQ~7guLb4jiz(Oanz=P>5)IE~CYn+&J58Y#6}h4I}kY*Qj)C&_+NPB3dQ zCRLKAMThWk@k0oD`j)rr1YPUv~>|ilDRU=vNaW%~*_F~Lb zNgAE?5-~9lAHEQID)W0@=$J80O3XnX7D&-wAS8PdHInJ&5y*^b#+Yf6G_9Lh;2o%u z!ZKbRk<4VdX!EHs>+_(r`fQIz7ETti-SJnJrmV=sElSLrEJa?ek^CR-XQ@Ub4nGgd zW~J6*%o<6l^`G%#n&e*(IWBkrFvW1d&u>H0=qikVC{(Wxp9N`p3LVEpuBKU_xVr7!#DGspU@>`~!pnmjfmMmCA-!5hkR>w6H>t_I97dPURflA!Fj4{Y($hUxf+x zV&b5e=DlX09ks`Zf)EDXTaDFarJ_6PY}y&78~Wm!df0*=j1WInBbT{#pF|xpz+9!k zkfa+#*?t*Q`#IlHmp2k%x-drWVN+i0Y0Te+VyWnMsKd7K#A?QLt1yV)p+{0SSgi^hjaZ%YAl)74laSRY$-epWp9*@#yX*OYu+{0$iT#VP3MBF`HGGITckbeL_c_!7`5yn2EevFk`l0jNHTK9N_H~X<&J#>(9``#zvhE zu+23pO#TH?S=689r6j3%jT_x8%~lnrppr%Qd}uyTh@4S=Q&i*tX|BZ>xfL!r4=v}t z#{pxMfY42pujaLeS(@uq7}5-rkKzXbvtJa-QY#G7T#qqwE8N@P-zXX^=L=D@55W9J zg(;lP`)5+`6Z_CPlBK`$%aKC|%r=aXTVYKXBMFO8dWy|CZfWWZs0{aalaup zkaio}&Fhdf+c8FNg`KYpPq`0?VsJ?}x3$?*J5-qJ<)W>3FJrT*HYhHq^HX8Q?8F$k z6|V8KIvIkfd%P$TifB~V2)4OFg>kLtMLMbbSe%N&S9ry2mSz{m$USV`TkI?}Lq}Z( zQcZbBBa4jcOGhTYQH5E$lJ62ynxIb+d21nJ})q1b}KPYiy?z+p9q7wQE8MNhFdU3ZiQE*@;02f0z6rg zTpNs`U%CgGc#jI>?Z+mz!ytCvAr`YzpualvAB4FTW5!DbkJl}>OI0;IeBn{((@x^r zfGM?CiCHB&nW~=2Z}!tX<(N%;8^$Eb(lm+Ew5m|l+u2XTjP$h^kW%}Um{u{}tP;tR zWIry);@dICCQH-7OFvST!H3}_`w^b7%u3y%!nE{+^wJOb86Y#0qJDS)6aQ9;Im70F z9*vY1^N|N}7!w}TSQ0RIV$1+Zsh00Wf+-y$vZjOZQrE21T`J7lA;LB#Uy6p!k;xZk z%-t9>QIckDnwW~0ob17{O$__cjJZdJ(bL2U*A|LdO2(D4!|%lyd1%q9iS$$)65G%I za#RlsCcaOJ5$zNyp2lYt#BM~@Wk{*}F-9I*v>p>9kHx1%5VcQ*t^!(Xvuz$wV&3PL zAd9aNE=&9HVc0=$Aj$PK$v~o*3NqDa|2_*)2czMlIf%rPZq5&z-A aFf{zvw=_@47(Dw3{VL3HUzk4Wb^H(d8!D~< literal 0 HcmV?d00001 diff --git a/autotest/__snapshots__/test_prt_voronoi1/test_mf6model[0-prtvor1l2r].npy b/autotest/__snapshots__/test_prt_voronoi1/test_mf6model[0-prtvor1l2r].npy index cf42bd09def875d49ec807a7e5b6d3af226e5cc7..e63c1a1be397525043b986ceed0952dbd9fb75ce 100644 GIT binary patch delta 322 zcmdlnopHx>#trLPCjVy^n7p6G15AsvdayrMY+wL_$!V-X?2nc9$7p;#Jb6EetzLYc z%eHW`1Y0nhjz-|?R{70^Y^x<$X3m^BYqNs<0eP0Mhx%hSKe2OSV>7GVxkj)*R=q2?Bk;{+Pd6Z2`cKtE_jQw3fZ104F&f_{v%3Su z6?+R7U+0>f24ZVlfJ~o!)IE~TG!bOwWEGD{VH2P=1xwr==5v8$HQgP0A51p%kej^D zLr>Un1IUd)IaZLZLGBKH9AG(KPdzrhPWN>p)sr1PK_(}GZCn6iYgmJnPW}&Kt3iSx U&MSf~bG9)MOx}ZFN_o!%08O@j!T#trLP*!ouW$7p<;yp<)0O|j<8nKNf6^Rfo9Km7U&ESv^pKZ=`VTd?^0 zZJj}=0djB5-jfPM5;F{$RChrS$v(#cJmWECpI>{#MiBI zJ0|P6MzYD2fs{_}1~M5fXU?2CYw|1C2=+%ey^VojvZou6y(bE6;R+D@uu0WJ_jQxm z-GS^YWg=A%Jtn7t*x#Ljh8Ipg>K@4^-3->M;t?sVSp?GQ?l7P0>!JP_O?QXh2a^pw zPSGYjZ1=>uYzvlbjukOtWxaFe%$c*Br%0Y-X1x*kx>bI2x~vZm%XKc> z!p++?SFy3A0m0-{gJ_l*jjx9{A2DF(V^s(1zF@bIlhq$2I=Rea2dmLT_jMwZjXk4S g76UbJp6FS^$fEJ}Q2%63??~2XJAg({PWN^I0Jc9hLI3~& delta 132 zcmZ2JopJee#tq>jYW|Uf94lhP%6eCBN8p>yQzXwZvtC~(QuT0ix~vZmORLtnEFy0-%WI List[str]: pname="oc", track_filerecord=[prt_track_file], trackcsv_filerecord=[prt_track_csv_file], - track_transit=True, + track_exit=True, ) elif "tstp" in name: return flopy.mf6.ModflowPrtoc( diff --git a/autotest/test_prt_triangle.py b/autotest/test_prt_triangle.py index a242edad7c4..82337363c7e 100644 --- a/autotest/test_prt_triangle.py +++ b/autotest/test_prt_triangle.py @@ -176,10 +176,6 @@ def build_prt_sim(idx, name, gwf_ws, prt_ws, targets): (0, (0, 88), 95, 92, 0.5), (1, (0, 86), 96, 86, 0.5), ] - # set up 2 PRPs, identical except for the dev - # option toggling new vs old vertex velocity - # calculation. we expect both approaches to - # return approximately identical results. for i in range(2): flopy.mf6.ModflowPrtprp( prt, @@ -190,7 +186,6 @@ def build_prt_sim(idx, name, gwf_ws, prt_ws, targets): perioddata={0: ["FIRST"]}, boundnames=True, stop_at_weak_sink=True, # currently required for this problem - dev_forceternary=i == 1, # temp dev option, todo: remove later ) prt_track_file = f"{prtname}.trk" prt_track_csv_file = f"{prtname}.trk.csv" diff --git a/autotest/test_prt_voronoi1.py b/autotest/test_prt_voronoi1.py index 3ddc620ad21..11027d03e23 100644 --- a/autotest/test_prt_voronoi1.py +++ b/autotest/test_prt_voronoi1.py @@ -358,11 +358,11 @@ def build_prt_sim(idx, name, gwf_ws, prt_ws, targets, cell_ids): track_filerecord=[prt_track_file], trackcsv_filerecord=[prt_track_csv_file], track_all=not times[idx], - track_transit=True, + track_exit=True, track_release=True, track_terminate=True, - # track_usertime=times[idx], - # track_timesrecord=tracktimes if times[idx] else None, + track_usertime=times[idx], + track_timesrecord=tracktimes if times[idx] else None, ) gwf_budget_file = gwf_ws / f"{gwf_name}.bud" gwf_head_file = gwf_ws / f"{gwf_name}.hds" diff --git a/distribution/build_docs.py b/distribution/build_docs.py index 066e85da7c5..b4934555ddc 100644 --- a/distribution/build_docs.py +++ b/distribution/build_docs.py @@ -521,10 +521,12 @@ def build_documentation( ) # download example docs - latest = get_release(f"{repo_owner}/modflow6-examples", "latest") - assets = latest["assets"] - asset = next(iter([a for a in assets if a["name"] == "mf6examples.pdf"]), None) - download_and_unzip(asset["browser_download_url"], output_path, verbose=True) + expdf_name = "mf6examples.pdf" + if overwrite or not (output_path / expdf_name).is_file(): + latest = get_release(f"{repo_owner}/modflow6-examples", "latest") + assets = latest["assets"] + asset = next(iter([a for a in assets if a["name"] == expdf_name]), None) + download_and_unzip(asset["browser_download_url"], output_path, verbose=True) # download publications for url in _publication_urls: diff --git a/doc/mf6io/gwe/fmi.tex b/doc/mf6io/gwe/fmi.tex index 5eab129cbed..4113cb8283f 100644 --- a/doc/mf6io/gwe/fmi.tex +++ b/doc/mf6io/gwe/fmi.tex @@ -11,7 +11,7 @@ \item Flows are provided from a previous GWF model simulation---in this case the FMI Package should be listed in the GWE name file and the head and budget files should be listed in the FMI PACKAGEDATA block. In this case, FMI reads the simulated head and flows from these files and makes them available to the energy transport model. There are some additional considerations when the heads and flows are provided from binary files. \begin{itemize} -\item The binary budget file must contain the simulated flows for all of the packages that were included in the GWF model run. Saving of flows can be activated for all packages by specifying ``SAVE\_FLOWS'' as an option in the GWF name file. The GWF Output Control Package must also have ``SAVE BUGET ALL'' specified. The easiest way to ensure that all flows and heads are saved is to use the following simple form of a GWF Output Control file: +\item The binary budget file must contain the simulated flows for all of the packages that were included in the GWF model run. Saving of flows can be activated for all packages by specifying ``SAVE\_FLOWS'' as an option in the GWF name file. The GWF Output Control Package must also have ``SAVE BUDGET ALL'' specified. The easiest way to ensure that all flows and heads are saved is to use the following simple form of a GWF Output Control file: \begin{verbatim} BEGIN OPTIONS diff --git a/doc/mf6io/gwt/fmi.tex b/doc/mf6io/gwt/fmi.tex index 48fb56867e6..49e24c05a8d 100644 --- a/doc/mf6io/gwt/fmi.tex +++ b/doc/mf6io/gwt/fmi.tex @@ -11,7 +11,7 @@ \item Flows are provided from a previous GWF model simulation---in this case the FMI Package should be listed in the GWT name file and the head and budget files should be listed in the FMI PACKAGEDATA block. In this case, FMI reads the simulated head and flows from these files and makes them available to the transport model. There are some additional considerations when the heads and flows are provided from binary files. \begin{itemize} -\item The binary budget file must contain the simulated flows for all of the packages that were included in the GWF model run. Saving of flows can be activated for all packages by specifying ``SAVE\_FLOWS'' as an option in the GWF name file. The GWF Output Control Package must also have ``SAVE BUGET ALL'' specified. The easiest way to ensure that all flows and heads are saved is to use the following simple form of a GWF Output Control file: +\item The binary budget file must contain the simulated flows for all of the packages that were included in the GWF model run. Saving of flows can be activated for all packages by specifying ``SAVE\_FLOWS'' as an option in the GWF name file. The GWF Output Control Package must also have ``SAVE BUDGET ALL'' specified. The easiest way to ensure that all flows and heads are saved is to use the following simple form of a GWF Output Control file: \begin{verbatim} BEGIN OPTIONS diff --git a/doc/mf6io/mf6io.bbl b/doc/mf6io/mf6io.bbl index 09c4a353ce6..83ee0c66355 100644 --- a/doc/mf6io/mf6io.bbl +++ b/doc/mf6io/mf6io.bbl @@ -1,4 +1,4 @@ -\begin{thebibliography}{42} +\begin{thebibliography}{43} \providecommand{\natexlab}[1]{#1} \expandafter\ifx\csname urlstyle\endcsname\relax \providecommand{\doi}[1]{doi:\discretionary{}{}{}#1}\else @@ -250,6 +250,11 @@ Panday, Sorab, Langevin, C.D., Niswonger, R.G., Ibaraki, Motomu, and Hughes, Methods, book 6, chap. A45, 66 p.}, accessed June 27, 2017, at \url{https://pubs.usgs.gov/tm/06/a45/}. +\bibitem[{Pollock(2016)}]{pollock2016modpath7} +Pollock, D.W., 2016, User guide for MODPATH Version 7---A particle-tracking + model for MODFLOW: {U.S. Geological Survey Open-File Report 2016--1086, 35 + p.}, accessed June 27, 2017, at \url{https://doi.org/10.3133/ofr20161086}. + \bibitem[{Provost and others(2017)Provost, Langevin, and Hughes}]{modflow6xt3d} Provost, A.M., Langevin, C.D., and Hughes, J.D., 2017, Documentation for the ``XT3D'' Option in the Node Property Flow (NPF) Package of MODFLOW 6: {U.S. diff --git a/doc/mf6io/mf6ivar/dfn/prt-mip.dfn b/doc/mf6io/mf6ivar/dfn/prt-mip.dfn index 7dbb1a493c9..74759df58f5 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-mip.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-mip.dfn @@ -1,13 +1,5 @@ # --------------------- prt mip options --------------------- -block options -name zero_method -type integer -reader urword -optional true -longname zero method -description the root finding algorithm to solve ternary subcells. 1 brent, 2 chandrupatla. - block options name export_array_ascii type keyword diff --git a/doc/mf6io/mf6ivar/dfn/prt-oc.dfn b/doc/mf6io/mf6ivar/dfn/prt-oc.dfn index 520afa1d9ce..add41aade45 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-oc.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-oc.dfn @@ -77,114 +77,6 @@ optional false longname file keyword description name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. -block options -name concentration_filerecord -type record concentration fileout concentrationfile -shape -reader urword -tagged true -optional true -longname -description - -block options -name concentration -type keyword -shape -in_record true -reader urword -tagged true -optional false -longname concentration keyword -description keyword to specify that record corresponds to concentration. - -block options -name concentrationfile -type string -preserve_case true -shape -in_record true -reader urword -tagged false -optional false -longname file keyword -description name of the output file to write conc information. - -block options -name concentrationprintrecord -type record concentration print_format formatrecord -shape -reader urword -optional true -longname -description - -block options -name print_format -type keyword -shape -in_record true -reader urword -tagged true -optional false -longname keyword to indicate that a print format follows -description keyword to specify format for printing to the listing file. - -block options -name formatrecord -type record columns width digits format -shape -in_record true -reader urword -tagged -optional false -longname -description - -block options -name columns -type integer -shape -in_record true -reader urword -tagged true -optional -longname number of columns -description number of columns for writing data. - -block options -name width -type integer -shape -in_record true -reader urword -tagged true -optional -longname width for each number -description width for writing each number. - -block options -name digits -type integer -shape -in_record true -reader urword -tagged true -optional -longname number of digits -description number of digits to use for writing a number. - -block options -name format -type string -shape -in_record true -reader urword -tagged false -optional false -longname write format -description write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. - block options name track_filerecord type record track fileout trackfile @@ -204,7 +96,7 @@ reader urword tagged true optional false longname track keyword -description keyword to specify that record corresponds to pathlines. +description keyword to specify that record corresponds to a binary track file. block options name trackfile @@ -237,7 +129,7 @@ reader urword tagged true optional false longname track keyword -description keyword to specify that record corresponds to the track CSV. +description keyword to specify that record corresponds to a CSV track file. block options name trackcsvfile @@ -257,7 +149,7 @@ type keyword reader urword optional true longname track all events -description whether to track all particle events +description keyword to indicate that ... block options name track_release @@ -265,15 +157,15 @@ type keyword reader urword optional true longname track release -description whether to track particle release events +description keyword to indicate that particle tracking output is to be written when a particle is released block options -name track_transit +name track_exit type keyword reader urword optional true longname track transitions -description whether to track cell-to-cell transitions +description keyword to indicate that particle tracking output is to be written when a particle exits a cell block options name track_timestep @@ -281,7 +173,7 @@ type keyword reader urword optional true longname track timestep ends -description whether to track transitions between timesteps +description keyword to indicate that particle tracking output is to be written at the end of each time step block options name track_terminate @@ -289,7 +181,7 @@ type keyword reader urword optional true longname track termination -description whether to track particle termination events +description keyword to indicate that particle tracking output is to be written when a particle terminates for any reason block options name track_weaksink @@ -297,15 +189,15 @@ type keyword reader urword optional true longname track weaksink exits -description whether to track occasions when a particle exits a weak sink (a cell which removes some but not all inflow from adjacent cells) +description keyword to indicate that particle tracking output is to be written when a particle exits a weak sink (a cell which removes some but not all inflow from adjacent cells) block options name track_usertime type keyword reader urword optional true -longname track termination -description whether to track user-specified times, provided as double precision values to the TRACK\_TIMES or TRACK\_TIMESFILE options +longname track usertime +description keyword to indicate that particle tracking output is to be written at user-specified times, provided as double precision values to the TRACK\_TIMES or TRACK\_TIMESFILE options block options name track_timesrecord @@ -436,7 +328,7 @@ reader urword tagged false optional false longname record type -description type of information to save or print. Can be BUDGET or CONCENTRATION. +description type of information to save or print. Can only be BUDGET. block period name ocsetting diff --git a/doc/mf6io/mf6ivar/dfn/prt-prp.dfn b/doc/mf6io/mf6ivar/dfn/prt-prp.dfn index ce731331843..288c86693ac 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-prp.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-prp.dfn @@ -8,7 +8,7 @@ shape reader urword optional true longname -description REPLACE boundnames {'{#1}': 'release-point'} +description keyword to indicate that boundary names may be provided with the list of particle release points. block options name print_input @@ -18,13 +18,30 @@ optional true longname print input to listing file description REPLACE print_input {'{#1}': 'all model stress package'} +block options +name dev_exit_solve_method +type integer +reader urword +optional true +longname exit solve method +description the method for iterative solution of particle exit location and time in the generalized Pollock's method. 1 Brent, 2 Chandrupatla. The default is Brent. +default_value 1 + +block options +name exit_solve_tolerance +type double precision +reader urword +optional false +longname exit solve tolerance +description the convergence tolerance for iterative solution of particle exit location and time in the generalized Pollock's method. A value of 0.00001 works well for many problems, but the value that strikes the best balance between accuracy and runtime is problem-dependent. + block options name local_z type keyword reader urword optional true longname whether to use local z coordinates -description indicates that rptz defines the local z coordinate of the release point within the cell, with value between 0 and 1 (inclusive). If the cell is unsaturated at release time, the z coordinate is computed relative to the water table rather than the top of the cell. +description indicates that ``zrpt'' defines the local z coordinate of the release point within the cell, with value of 0 at the bottom and 1 at the top of the cell. If the cell is partially saturated at release time, the top of the cell is considered to be the water table elevation (the head in the cell) rather than the top defined by the user. block options name track_filerecord @@ -45,7 +62,7 @@ reader urword tagged true optional false longname track keyword -description keyword to specify that record corresponds to track. +description keyword to specify that record corresponds to a binary track output file. block options name fileout @@ -89,7 +106,7 @@ reader urword tagged true optional false longname track keyword -description keyword to specify that record corresponds to the track CSV. +description keyword to specify that record corresponds to a CSV track output file. block options name trackcsvfile @@ -109,7 +126,7 @@ type double precision reader urword optional true longname stop time -description real value defining the maximum simulation time to which particles in the model can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when simulation time STOPTIME is reached. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the simulation time to which particles can be tracked. +description real value defining the maximum simulation time to which particles in the package can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when simulation time STOPTIME is reached. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the simulation time to which particles can be tracked. block options name stoptraveltime @@ -141,7 +158,7 @@ type keyword reader urword optional true longname drape -description is a text keyword to indicate that if a particle's release point is in a cell that happens to be dry at release time, the particle is to be moved to the topmost active cell below it, if any. By default, a particle is not released into the simulation if its release point's cell is dry at release time, instead the particle is terminated immediately with ireason 3 and istatus 8. +description is a text keyword to indicate that if a particle's release point is in a cell that happens to be inactive at release time, the particle is to be moved to the topmost active cell below it, if any. By default, a particle is not released into the simulation if its release point's cell is inactive at release time. block options name release_timesrecord @@ -265,7 +282,7 @@ tagged false in_record true reader urword longname x coordinate of release point -description real value that defines the x coordinate of the release point in model coordinates. The (x, y, z) location specified for the release point must lie within the cell that corresponds to the specified cellid. +description real value that defines the x coordinate of the release point in model coordinates. The (x, y, z) location specified for the release point must lie within the cell that is identified by the specified cellid. block packagedata name yrpt @@ -275,7 +292,7 @@ tagged false in_record true reader urword longname y coordinate of release point -description real value that defines the y coordinate of the release point in model coordinates. The (x, y, z) location specified for the release point must lie within the cell that corresponds to the specified cellid. +description real value that defines the y coordinate of the release point in model coordinates. The (x, y, z) location specified for the release point must lie within the cell that is identified by the specified cellid. block packagedata name zrpt @@ -285,7 +302,7 @@ tagged false in_record true reader urword longname z coordinate of release point -description real value that defines the z coordinate of the release point in model coordinates. The (x, y, z) location specified for the release point must lie within the cell that corresponds to the specified cellid. +description real value that defines the z coordinate of the release point in model coordinates or, if the LOCAL\_Z option is active, in local cell coordinates. The (x, y, z) location specified for the release point must lie within the cell that is identified by the specified cellid. block packagedata name boundname @@ -296,7 +313,7 @@ in_record true reader urword optional true longname release point name -description REPLACE boundname {'{#1}': 'release-point'} +description name of the particle release point. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. # --------------------- prt prp period --------------------- diff --git a/doc/mf6io/mf6ivar/examples/prt-fmi-example.dat b/doc/mf6io/mf6ivar/examples/prt-fmi-example.dat index c022bb2e8cf..e026bd7f448 100644 --- a/doc/mf6io/mf6ivar/examples/prt-fmi-example.dat +++ b/doc/mf6io/mf6ivar/examples/prt-fmi-example.dat @@ -1,5 +1,4 @@ BEGIN OPTIONS - FLOW_IMBALANCE_CORRECTION END OPTIONS BEGIN PACKAGEDATA diff --git a/doc/mf6io/mf6ivar/examples/prt-oc-example.dat b/doc/mf6io/mf6ivar/examples/prt-oc-example.dat index 7503bde8541..95daf3dee5f 100644 --- a/doc/mf6io/mf6ivar/examples/prt-oc-example.dat +++ b/doc/mf6io/mf6ivar/examples/prt-oc-example.dat @@ -1,10 +1,7 @@ BEGIN OPTIONS - CONCENTRATION FILEOUT transport.ucn - CONCENTRATION PRINT_FORMAT COLUMNS 15 WIDTH 7 DIGITS 2 FIXED END OPTIONS BEGIN PERIOD 1 PRINT BUDGET ALL - SAVE CONCENTRATION ALL - PRINT CONCENTRATION ALL + SAVE BUDGET ALL END PERIOD diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 42ec9e8a73a..19827c49495 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -109,6 +109,15 @@ | EXG | GWTGWT | EXCHANGEDATA | HWVA | DOUBLE PRECISION | is the horizontal width of the flow connection between cell 1 and cell 2 if IHC $>$ 0, or it is the area perpendicular to flow of the vertical connection between cell 1 and cell 2 if IHC = 0. | | EXG | GWTGWT | EXCHANGEDATA | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each GWTGWT Exchange. The values of auxiliary variables must be present for each exchange. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. | | EXG | GWTGWT | EXCHANGEDATA | BOUNDNAME | STRING | name of the GWT Exchange cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | +| EXG | SWFGWF | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of exchange entries will be echoed to the listing file immediately after it is read. | +| EXG | SWFGWF | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of exchange flow rates will be printed to the listing file for every stress period in which ``SAVE BUDGET'' is specified in Output Control. | +| EXG | SWFGWF | OPTIONS | OBS6 | KEYWORD | keyword to specify that record corresponds to an observations file. | +| EXG | SWFGWF | OPTIONS | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | +| EXG | SWFGWF | OPTIONS | OBS6_FILENAME | STRING | is the file name of the observations input file for this exchange. See the ``Observation utility'' section for instructions for preparing observation input files. Table \ref{table:gwf-obstypetable} lists observation type(s) supported by the SWF-GWF package. | +| EXG | SWFGWF | DIMENSIONS | NEXG | INTEGER | keyword and integer value specifying the number of SWF-GWF exchanges. | +| EXG | SWFGWF | EXCHANGEDATA | CELLIDM1 | INTEGER | is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. | +| EXG | SWFGWF | EXCHANGEDATA | CELLIDM2 | INTEGER | is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. | +| EXG | SWFGWF | EXCHANGEDATA | COND | DOUBLE PRECISION | is the conductance between the surface water cell and the groundwater cell. | | SLN | IMS | OPTIONS | PRINT_OPTION | STRING | is a flag that controls printing of convergence information from the solver. NONE means print nothing. SUMMARY means print only the total number of iterations and nonlinear residual reduction summaries. ALL means print linear matrix solver convergence information to the solution listing file and model specific linear matrix solver convergence information to each model listing file in addition to SUMMARY information. NONE is default if PRINT\_OPTION is not specified. | | SLN | IMS | OPTIONS | COMPLEXITY | STRING | is an optional keyword that defines default non-linear and linear solver parameters. SIMPLE - indicates that default solver input values will be defined that work well for nearly linear models. This would be used for models that do not include nonlinear stress packages and models that are either confined or consist of a single unconfined layer that is thick enough to contain the water table within a single layer. MODERATE - indicates that default solver input values will be defined that work well for moderately nonlinear models. This would be used for models that include nonlinear stress packages and models that consist of one or more unconfined layers. The MODERATE option should be used when the SIMPLE option does not result in successful convergence. COMPLEX - indicates that default solver input values will be defined that work well for highly nonlinear models. This would be used for models that include nonlinear stress packages and models that consist of one or more unconfined layers representing complex geology and surface-water/groundwater interaction. The COMPLEX option should be used when the MODERATE option does not result in successful convergence. Non-linear and linear solver parameters assigned using a specified complexity can be modified in the NONLINEAR and LINEAR blocks. If the COMPLEXITY option is not specified, NONLINEAR and LINEAR variables will be assigned the simple complexity values. | | SLN | IMS | OPTIONS | CSV_OUTPUT | KEYWORD | keyword to specify that the record corresponds to the comma separated values solver convergence output. The CSV\_OUTPUT option has been deprecated and split into the CSV_OUTER_OUTPUT and CSV_INNER_OUTPUT options. Starting with MODFLOW 6 version 6.1.1 if the CSV_OUTPUT option is specified, then it is treated as the CSV_OUTER_OUTPUT option. | @@ -682,7 +691,7 @@ | GWF | EVT | PERIOD | PETM0 | DOUBLE PRECISION | is the proportion of the maximum ET flux rate that will apply when head is at or above the ET surface (dimensionless). PETM0 is read only when the SURF\_RATE\_SPECIFIED option is used. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | | GWF | EVT | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each evapotranspiration. The values of auxiliary variables must be present for each evapotranspiration. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | | GWF | EVT | PERIOD | BOUNDNAME | STRING | name of the evapotranspiration cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | -| GWF | EVTA | OPTIONS | READASARRAYS | KEYWORD | indicates that array-based input will be used for the Evapotranspiration Package. This keyword must be specified to use array-based input. | +| GWF | EVTA | OPTIONS | READASARRAYS | KEYWORD | indicates that array-based input will be used for the Evapotranspiration Package. This keyword must be specified to use array-based input. When READASARRAYS is specified, values must be provided for every cell within a model layer, even those cells that have an IDOMAIN value less than one. Values assigned to cells with IDOMAIN values less than one are not used and have no effect on simulation results. | | GWF | EVTA | OPTIONS | FIXED_CELL | KEYWORD | indicates that evapotranspiration will not be reassigned to a cell underlying the cell specified in the list if the specified cell is inactive. | | GWF | EVTA | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | | GWF | EVTA | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of evapotranspiration rate. | @@ -972,7 +981,7 @@ | GWF | RCH | PERIOD | RECHARGE | DOUBLE PRECISION | is the recharge flux rate ($LT^{-1}$). This rate is multiplied inside the program by the surface area of the cell to calculate the volumetric recharge rate. If the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | | GWF | RCH | PERIOD | AUX | DOUBLE PRECISION (NAUX) | represents the values of the auxiliary variables for each recharge. The values of auxiliary variables must be present for each recharge. The values must be specified in the order of the auxiliary variables specified in the OPTIONS block. If the package supports time series and the Options block includes a TIMESERIESFILE entry (see the ``Time-Variable Input'' section), values can be obtained from a time series by entering the time-series name in place of a numeric value. | | GWF | RCH | PERIOD | BOUNDNAME | STRING | name of the recharge cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. | -| GWF | RCHA | OPTIONS | READASARRAYS | KEYWORD | indicates that array-based input will be used for the Recharge Package. This keyword must be specified to use array-based input. | +| GWF | RCHA | OPTIONS | READASARRAYS | KEYWORD | indicates that array-based input will be used for the Recharge Package. This keyword must be specified to use array-based input. When READASARRAYS is specified, values must be provided for every cell within a model layer, even those cells that have an IDOMAIN value less than one. Values assigned to cells with IDOMAIN values less than one are not used and have no effect on simulation results. | | GWF | RCHA | OPTIONS | FIXED_CELL | KEYWORD | indicates that recharge will not be reassigned to a cell underlying the cell specified in the list if the specified cell is inactive. | | GWF | RCHA | OPTIONS | AUXILIARY | STRING (NAUX) | defines an array of one or more auxiliary variable names. There is no limit on the number of auxiliary variables that can be provided on this line; however, lists of information provided in subsequent blocks must have a column of data for each auxiliary variable name defined here. The number of auxiliary variables detected on this line determines the value for naux. Comments cannot be provided anywhere on this line as they will be interpreted as auxiliary variable names. Auxiliary variables may not be used by the package, but they will be available for use by other parts of the program. The program will terminate with an error if auxiliary variables are specified on more than one line in the options block. | | GWF | RCHA | OPTIONS | AUXMULTNAME | STRING | name of auxiliary variable to be used as multiplier of recharge. | @@ -1562,7 +1571,6 @@ | PRT | FMI | PACKAGEDATA | FLOWTYPE | STRING | is the word GWFBUDGET or GWFHEAD. If GWFBUDGET is specified, then the corresponding file must be a budget file from a previous GWF Model run. | | PRT | FMI | PACKAGEDATA | FILEIN | KEYWORD | keyword to specify that an input filename is expected next. | | PRT | FMI | PACKAGEDATA | FNAME | STRING | is the name of the file containing flows. The path to the file should be included if the file is not located in the folder where the program was run. | -| PRT | MIP | OPTIONS | ZERO_METHOD | INTEGER | the root finding algorithm to solve ternary subcells. 1 brent, 2 chandrupatla. | | PRT | MIP | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | PRT | MIP | GRIDDATA | POROSITY | DOUBLE PRECISION (NODES) | is the aquifer porosity. | | PRT | MIP | GRIDDATA | RETFACTOR | DOUBLE PRECISION (NODES) | is a real value by which velocity is divided within a given cell. RETFACTOR can be used to account for solute retardation, i.e., the apparent effect of linear sorption on the velocity of particles that track solute advection. RETFACTOR may be assigned any real value. A RETFACTOR value greater than 1 represents particle retardation (slowing), and a value of 1 represents no retardation. The effect of specifying a RETFACTOR value for each cell is the same as the effect of directly multiplying the POROSITY in each cell by the proposed RETFACTOR value for each cell. RETFACTOR allows conceptual isolation of effects such as retardation from the effect of porosity. The default value is 1. | @@ -1579,24 +1587,17 @@ | PRT | OC | OPTIONS | BUDGETFILE | STRING | name of the output file to write budget information. | | PRT | OC | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | | PRT | OC | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | -| PRT | OC | OPTIONS | CONCENTRATION | KEYWORD | keyword to specify that record corresponds to concentration. | -| PRT | OC | OPTIONS | CONCENTRATIONFILE | STRING | name of the output file to write conc information. | -| PRT | OC | OPTIONS | PRINT_FORMAT | KEYWORD | keyword to specify format for printing to the listing file. | -| PRT | OC | OPTIONS | COLUMNS | INTEGER | number of columns for writing data. | -| PRT | OC | OPTIONS | WIDTH | INTEGER | width for writing each number. | -| PRT | OC | OPTIONS | DIGITS | INTEGER | number of digits to use for writing a number. | -| PRT | OC | OPTIONS | FORMAT | STRING | write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. | -| PRT | OC | OPTIONS | TRACK | KEYWORD | keyword to specify that record corresponds to pathlines. | +| PRT | OC | OPTIONS | TRACK | KEYWORD | keyword to specify that record corresponds to a binary track file. | | PRT | OC | OPTIONS | TRACKFILE | STRING | name of the output file to write tracking information. | -| PRT | OC | OPTIONS | TRACKCSV | KEYWORD | keyword to specify that record corresponds to the track CSV. | +| PRT | OC | OPTIONS | TRACKCSV | KEYWORD | keyword to specify that record corresponds to a CSV track file. | | PRT | OC | OPTIONS | TRACKCSVFILE | STRING | name of the comma-separated value (CSV) file to write tracking information. | -| PRT | OC | OPTIONS | TRACK_ALL | KEYWORD | whether to track all particle events | -| PRT | OC | OPTIONS | TRACK_RELEASE | KEYWORD | whether to track particle release events | -| PRT | OC | OPTIONS | TRACK_TRANSIT | KEYWORD | whether to track cell-to-cell transitions | -| PRT | OC | OPTIONS | TRACK_TIMESTEP | KEYWORD | whether to track transitions between timesteps | -| PRT | OC | OPTIONS | TRACK_TERMINATE | KEYWORD | whether to track particle termination events | -| PRT | OC | OPTIONS | TRACK_WEAKSINK | KEYWORD | whether to track occasions when a particle exits a weak sink (a cell which removes some but not all inflow from adjacent cells) | -| PRT | OC | OPTIONS | TRACK_USERTIME | KEYWORD | whether to track user-specified times, provided as double precision values to the TRACK\_TIMES or TRACK\_TIMESFILE options | +| PRT | OC | OPTIONS | TRACK_ALL | KEYWORD | keyword to indicate that ... | +| PRT | OC | OPTIONS | TRACK_RELEASE | KEYWORD | keyword to indicate that particle tracking output is to be written when a particle is released | +| PRT | OC | OPTIONS | TRACK_EXIT | KEYWORD | keyword to indicate that particle tracking output is to be written when a particle exits a cell | +| PRT | OC | OPTIONS | TRACK_TIMESTEP | KEYWORD | keyword to indicate that particle tracking output is to be written at the end of each time step | +| PRT | OC | OPTIONS | TRACK_TERMINATE | KEYWORD | keyword to indicate that particle tracking output is to be written when a particle terminates for any reason | +| PRT | OC | OPTIONS | TRACK_WEAKSINK | KEYWORD | keyword to indicate that particle tracking output is to be written when a particle exits a weak sink (a cell which removes some but not all inflow from adjacent cells) | +| PRT | OC | OPTIONS | TRACK_USERTIME | KEYWORD | keyword to indicate that particle tracking output is to be written at user-specified times, provided as double precision values to the TRACK\_TIMES or TRACK\_TIMESFILE options | | PRT | OC | OPTIONS | TRACK_TIMES | KEYWORD | keyword indicating tracking times will follow | | PRT | OC | OPTIONS | TIMES | DOUBLE PRECISION (UNKNOWN) | times to track, relative to the beginning of the simulation. | | PRT | OC | OPTIONS | TRACK_TIMESFILE | KEYWORD | keyword indicating tracking times file name will follow | @@ -1604,36 +1605,40 @@ | PRT | OC | PERIOD | IPER | INTEGER | integer value specifying the starting stress period number for which the data specified in the PERIOD block apply. IPER must be less than or equal to NPER in the TDIS Package and greater than zero. The IPER value assigned to a stress period block must be greater than the IPER value assigned for the previous PERIOD block. The information specified in the PERIOD block will continue to apply for all subsequent stress periods, unless the program encounters another PERIOD block. | | PRT | OC | PERIOD | SAVE | KEYWORD | keyword to indicate that information will be saved this stress period. | | PRT | OC | PERIOD | PRINT | KEYWORD | keyword to indicate that information will be printed this stress period. | -| PRT | OC | PERIOD | RTYPE | STRING | type of information to save or print. Can be BUDGET or CONCENTRATION. | +| PRT | OC | PERIOD | RTYPE | STRING | type of information to save or print. Can only be BUDGET. | | PRT | OC | PERIOD | OCSETTING | KEYSTRING | specifies the steps for which the data will be saved. | | PRT | OC | PERIOD | ALL | KEYWORD | keyword to indicate save for all time steps in period. | | PRT | OC | PERIOD | FIRST | KEYWORD | keyword to indicate save for first step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | | PRT | OC | PERIOD | LAST | KEYWORD | keyword to indicate save for last step in period. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | | PRT | OC | PERIOD | FREQUENCY | INTEGER | save at the specified time step frequency. This keyword may be used in conjunction with other keywords to print or save results for multiple time steps. | | PRT | OC | PERIOD | STEPS | INTEGER (] [EXPORT_ARRAY_ASCII] END OPTIONS diff --git a/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex b/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex index c502d09ca55..ffe00bc24b1 100644 --- a/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex +++ b/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex @@ -13,41 +13,27 @@ \item \texttt{budgetcsvfile}---name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. -\item \texttt{CONCENTRATION}---keyword to specify that record corresponds to concentration. - -\item \texttt{concentrationfile}---name of the output file to write conc information. - -\item \texttt{PRINT\_FORMAT}---keyword to specify format for printing to the listing file. - -\item \texttt{columns}---number of columns for writing data. - -\item \texttt{width}---width for writing each number. - -\item \texttt{digits}---number of digits to use for writing a number. - -\item \texttt{format}---write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. - -\item \texttt{TRACK}---keyword to specify that record corresponds to pathlines. +\item \texttt{TRACK}---keyword to specify that record corresponds to a binary track file. \item \texttt{trackfile}---name of the output file to write tracking information. -\item \texttt{TRACKCSV}---keyword to specify that record corresponds to the track CSV. +\item \texttt{TRACKCSV}---keyword to specify that record corresponds to a CSV track file. \item \texttt{trackcsvfile}---name of the comma-separated value (CSV) file to write tracking information. -\item \texttt{TRACK\_ALL}---whether to track all particle events +\item \texttt{TRACK\_ALL}---keyword to indicate that ... -\item \texttt{TRACK\_RELEASE}---whether to track particle release events +\item \texttt{TRACK\_RELEASE}---keyword to indicate that particle tracking output is to be written when a particle is released -\item \texttt{TRACK\_TRANSIT}---whether to track cell-to-cell transitions +\item \texttt{TRACK\_EXIT}---keyword to indicate that particle tracking output is to be written when a particle exits a cell -\item \texttt{TRACK\_TIMESTEP}---whether to track transitions between timesteps +\item \texttt{TRACK\_TIMESTEP}---keyword to indicate that particle tracking output is to be written at the end of each time step -\item \texttt{TRACK\_TERMINATE}---whether to track particle termination events +\item \texttt{TRACK\_TERMINATE}---keyword to indicate that particle tracking output is to be written when a particle terminates for any reason -\item \texttt{TRACK\_WEAKSINK}---whether to track occasions when a particle exits a weak sink (a cell which removes some but not all inflow from adjacent cells) +\item \texttt{TRACK\_WEAKSINK}---keyword to indicate that particle tracking output is to be written when a particle exits a weak sink (a cell which removes some but not all inflow from adjacent cells) -\item \texttt{TRACK\_USERTIME}---whether to track user-specified times, provided as double precision values to the TRACK\_TIMES or TRACK\_TIMESFILE options +\item \texttt{TRACK\_USERTIME}---keyword to indicate that particle tracking output is to be written at user-specified times, provided as double precision values to the TRACK\_TIMES or TRACK\_TIMESFILE options \item \texttt{TRACK\_TIMES}---keyword indicating tracking times will follow @@ -67,7 +53,7 @@ \item \texttt{PRINT}---keyword to indicate that information will be printed this stress period. -\item \texttt{rtype}---type of information to save or print. Can be BUDGET or CONCENTRATION. +\item \texttt{rtype}---type of information to save or print. Can only be BUDGET. \item \texttt{ocsetting}---specifies the steps for which the data will be saved. diff --git a/doc/mf6io/mf6ivar/tex/prt-oc-options.dat b/doc/mf6io/mf6ivar/tex/prt-oc-options.dat index cdb0c5dee6e..75f69cb822d 100644 --- a/doc/mf6io/mf6ivar/tex/prt-oc-options.dat +++ b/doc/mf6io/mf6ivar/tex/prt-oc-options.dat @@ -1,13 +1,11 @@ BEGIN OPTIONS [BUDGET FILEOUT ] [BUDGETCSV FILEOUT ] - [CONCENTRATION FILEOUT ] - [CONCENTRATION PRINT_FORMAT COLUMNS WIDTH DIGITS ] [TRACK FILEOUT ] [TRACKCSV FILEOUT ] [TRACK_ALL] [TRACK_RELEASE] - [TRACK_TRANSIT] + [TRACK_EXIT] [TRACK_TIMESTEP] [TRACK_TERMINATE] [TRACK_WEAKSINK] diff --git a/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex b/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex index beba0476241..5b584c8ea47 100644 --- a/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex +++ b/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex @@ -3,21 +3,25 @@ \item \textbf{Block: OPTIONS} \begin{description} -\item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of release-point cells. +\item \texttt{BOUNDNAMES}---keyword to indicate that boundary names may be provided with the list of particle release points. -\item \texttt{LOCAL\_Z}---indicates that rptz defines the local z coordinate of the release point within the cell, with value between 0 and 1 (inclusive). If the cell is unsaturated at release time, the z coordinate is computed relative to the water table rather than the top of the cell. +\item \texttt{PRINT\_INPUT}---keyword to indicate that the list of all model stress package information will be written to the listing file immediately after it is read. -\item \texttt{TRACK}---keyword to specify that record corresponds to track. +\item \texttt{exit\_solve\_tolerance}---the convergence tolerance for iterative solution of particle exit location and time in the generalized Pollock's method. A value of 0.00001 works well for many problems, but the value that strikes the best balance between accuracy and runtime is problem-dependent. + +\item \texttt{LOCAL\_Z}---indicates that ``zrpt'' defines the local z coordinate of the release point within the cell, with value of 0 at the bottom and 1 at the top of the cell. If the cell is partially saturated at release time, the top of the cell is considered to be the water table elevation (the head in the cell) rather than the top defined by the user. + +\item \texttt{TRACK}---keyword to specify that record corresponds to a binary track output file. \item \texttt{FILEOUT}---keyword to specify that an output filename is expected next. \item \texttt{trackfile}---name of the output file to write tracking information. -\item \texttt{TRACKCSV}---keyword to specify that record corresponds to the track CSV. +\item \texttt{TRACKCSV}---keyword to specify that record corresponds to a CSV track output file. \item \texttt{trackcsvfile}---name of the comma-separated value (CSV) file to write tracking information. -\item \texttt{stoptime}---real value defining the maximum simulation time to which particles in the model can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when simulation time STOPTIME is reached. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the simulation time to which particles can be tracked. +\item \texttt{stoptime}---real value defining the maximum simulation time to which particles in the package can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when simulation time STOPTIME is reached. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the simulation time to which particles can be tracked. \item \texttt{stoptraveltime}---real value defining the maximum travel time over which particles in the model can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when their travel time reaches STOPTRAVELTIME. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTRAVELTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the travel time over which particles can be tracked. @@ -25,7 +29,7 @@ \item \texttt{istopzone}---integer value defining the stop zone number. If cells have been assigned IZONE values in the GRIDDATA block, a particle terminates if it enters a cell whose IZONE value matches ISTOPZONE. An ISTOPZONE value of zero indicates that there is no stop zone. The default value is zero. -\item \texttt{DRAPE}---is a text keyword to indicate that if a particle's release point is in a cell that happens to be dry at release time, the particle is to be moved to the topmost active cell below it, if any. By default, a particle is not released into the simulation if its release point's cell is dry at release time, instead the particle is terminated immediately with ireason 3 and istatus 8. +\item \texttt{DRAPE}---is a text keyword to indicate that if a particle's release point is in a cell that happens to be inactive at release time, the particle is to be moved to the topmost active cell below it, if any. By default, a particle is not released into the simulation if its release point's cell is inactive at release time. \item \texttt{RELEASE\_TIMES}---keyword indicating release times will follow @@ -49,13 +53,13 @@ \item \texttt{cellid}---is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. -\item \texttt{xrpt}---real value that defines the x coordinate of the release point in model coordinates. The (x, y, z) location specified for the release point must lie within the cell that corresponds to the specified cellid. +\item \texttt{xrpt}---real value that defines the x coordinate of the release point in model coordinates. The (x, y, z) location specified for the release point must lie within the cell that is identified by the specified cellid. -\item \texttt{yrpt}---real value that defines the y coordinate of the release point in model coordinates. The (x, y, z) location specified for the release point must lie within the cell that corresponds to the specified cellid. +\item \texttt{yrpt}---real value that defines the y coordinate of the release point in model coordinates. The (x, y, z) location specified for the release point must lie within the cell that is identified by the specified cellid. -\item \texttt{zrpt}---real value that defines the z coordinate of the release point in model coordinates. The (x, y, z) location specified for the release point must lie within the cell that corresponds to the specified cellid. +\item \texttt{zrpt}---real value that defines the z coordinate of the release point in model coordinates or, if the LOCAL\_Z option is active, in local cell coordinates. The (x, y, z) location specified for the release point must lie within the cell that is identified by the specified cellid. -\item \texttt{boundname}---name of the release-point cell. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. +\item \texttt{boundname}---name of the particle release point. BOUNDNAME is an ASCII character variable that can contain as many as 40 characters. If BOUNDNAME contains spaces in it, then the entire name must be enclosed within single quotes. \end{description} \item \textbf{Block: PERIOD} diff --git a/doc/mf6io/mf6ivar/tex/prt-prp-options.dat b/doc/mf6io/mf6ivar/tex/prt-prp-options.dat index 8bf92a71885..dc663bb3868 100644 --- a/doc/mf6io/mf6ivar/tex/prt-prp-options.dat +++ b/doc/mf6io/mf6ivar/tex/prt-prp-options.dat @@ -1,6 +1,7 @@ BEGIN OPTIONS [BOUNDNAMES] [PRINT_INPUT] + EXIT_SOLVE_TOLERANCE [LOCAL_Z] [TRACK FILEOUT ] [TRACKCSV FILEOUT ] diff --git a/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex b/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex index 24c3c05eb63..cc6e3fa0d51 100644 --- a/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-dfw-desc.tex @@ -21,6 +21,8 @@ \item \texttt{obs6\_filename}---name of input file to define observations for the DFW package. See the ``Observation utility'' section for instructions for preparing observation input files. Tables \ref{table:gwf-obstypetable} and \ref{table:gwt-obstypetable} lists observation type(s) supported by the DFW package. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. + \end{description} \item \textbf{Block: GRIDDATA} diff --git a/doc/mf6io/mf6ivar/tex/swf-dis2d-desc.tex b/doc/mf6io/mf6ivar/tex/swf-dis2d-desc.tex index 17b291ddbf0..e514d09f6ee 100644 --- a/doc/mf6io/mf6ivar/tex/swf-dis2d-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-dis2d-desc.tex @@ -13,7 +13,7 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/swf-disv1d-desc.tex b/doc/mf6io/mf6ivar/tex/swf-disv1d-desc.tex index e20a304428a..ee0f10eda75 100644 --- a/doc/mf6io/mf6ivar/tex/swf-disv1d-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-disv1d-desc.tex @@ -13,7 +13,7 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the model grid coordinate system relative to a real-world coordinate system. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/swf-disv2d-desc.tex b/doc/mf6io/mf6ivar/tex/swf-disv2d-desc.tex index 7ccc0793f5e..1c919e71247 100644 --- a/doc/mf6io/mf6ivar/tex/swf-disv2d-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-disv2d-desc.tex @@ -13,7 +13,7 @@ \item \texttt{angrot}---counter-clockwise rotation angle (in degrees) of the lower-left corner of the model grid. If not specified, then a default value of 0.0 is assigned. The value for ANGROT does not affect the model simulation, but it is written to the binary grid file so that postprocessors can locate the grid in space. -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/swf-ic-desc.tex b/doc/mf6io/mf6ivar/tex/swf-ic-desc.tex index bd98c108cc1..c79b5dd8697 100644 --- a/doc/mf6io/mf6ivar/tex/swf-ic-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-ic-desc.tex @@ -3,7 +3,7 @@ \item \textbf{Block: OPTIONS} \begin{description} -\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input grid arrays, which already support the layered keyword, should be written to layered ascii output files. +\item \texttt{EXPORT\_ARRAY\_ASCII}---keyword that specifies input griddata arrays should be written to layered ascii output files. \end{description} \item \textbf{Block: GRIDDATA} diff --git a/doc/mf6io/mf6ivar/tex/utl-spca-desc.tex b/doc/mf6io/mf6ivar/tex/utl-spca-desc.tex index 78b7ba81333..85d0e167d98 100644 --- a/doc/mf6io/mf6ivar/tex/utl-spca-desc.tex +++ b/doc/mf6io/mf6ivar/tex/utl-spca-desc.tex @@ -3,7 +3,7 @@ \item \textbf{Block: OPTIONS} \begin{description} -\item \texttt{READASARRAYS}---indicates that array-based input will be used for the SPC Package. This keyword must be specified to use array-based input. +\item \texttt{READASARRAYS}---indicates that array-based input will be used for the SPC Package. This keyword must be specified to use array-based input. When READASARRAYS is specified, values must be provided for every cell within a model layer, even those cells that have an IDOMAIN value less than one. Values assigned to cells with IDOMAIN values less than one are not used and have no effect on simulation results. \item \texttt{PRINT\_INPUT}---keyword to indicate that the list of spc information will be written to the listing file immediately after it is read. diff --git a/doc/mf6io/mf6ivar/tex/utl-spta-desc.tex b/doc/mf6io/mf6ivar/tex/utl-spta-desc.tex index cc610d06868..0f7f6e7ebe2 100644 --- a/doc/mf6io/mf6ivar/tex/utl-spta-desc.tex +++ b/doc/mf6io/mf6ivar/tex/utl-spta-desc.tex @@ -3,7 +3,7 @@ \item \textbf{Block: OPTIONS} \begin{description} -\item \texttt{READASARRAYS}---indicates that array-based input will be used for the SPT Package. This keyword must be specified to use array-based input. +\item \texttt{READASARRAYS}---indicates that array-based input will be used for the SPT Package. This keyword must be specified to use array-based input. When READASARRAYS is specified, values must be provided for every cell within a model layer, even those cells that have an IDOMAIN value less than one. Values assigned to cells with IDOMAIN values less than one are not used and have no effect on simulation results. \item \texttt{PRINT\_INPUT}---keyword to indicate that the list of spt information will be written to the listing file immediately after it is read. diff --git a/doc/mf6io/mf6output.tex b/doc/mf6io/mf6output.tex index a62c97b6d73..e853e5d2b3a 100644 --- a/doc/mf6io/mf6output.tex +++ b/doc/mf6io/mf6output.tex @@ -2,10 +2,10 @@ \begin{lstlisting}[style=modeloutput] MODFLOW 6 U.S. GEOLOGICAL SURVEY MODULAR HYDROLOGIC MODEL - VERSION 6.5.0.dev0 (preliminary) 07/13/2023 + VERSION 6.5.0.dev2 (preliminary) 02/13/2024 ***DEVELOP MODE*** - MODFLOW 6 compiled Jan 24 2024 12:12:59 with GCC version 13.2.0 + MODFLOW 6 compiled May 16 2024 17:04:31 with GCC version 11.4.0 This software is preliminary or provisional and is subject to revision. It is being provided to meet the need for timely best @@ -19,15 +19,17 @@ use of the software. - Run start date and time (yyyy/mm/dd hh:mm:ss): 2024/01/24 12:13:22 + MODFLOW runs in SEQUENTIAL mode + + Run start date and time (yyyy/mm/dd hh:mm:ss): 2024/05/16 18:30:39 Writing simulation list file: mfsim.lst Using Simulation name file: mfsim.nam Solving: Stress period: 1 Time step: 1 - Run end date and time (yyyy/mm/dd hh:mm:ss): 2024/01/24 12:13:22 - Elapsed run time: 0.034 Seconds + Run end date and time (yyyy/mm/dd hh:mm:ss): 2024/05/16 18:30:39 + Elapsed run time: 0.021 Seconds Normal termination of simulation. \end{lstlisting} diff --git a/doc/mf6io/mf6switches.tex b/doc/mf6io/mf6switches.tex index bd204027dce..197cc622898 100644 --- a/doc/mf6io/mf6switches.tex +++ b/doc/mf6io/mf6switches.tex @@ -1,6 +1,6 @@ {\small \begin{lstlisting}[style=modeloutput] -mf6 - MODFLOW 6.5.0.dev0 (preliminary) 07/13/2023 (compiled Jan 24 2024 12:12:59) +mf6 - MODFLOW 6.5.0.dev2 (preliminary) 02/13/2024 (compiled May 16 2024 17:04:31) usage: mf6 run MODFLOW 6 using "mfsim.nam" or: mf6 [options] retrieve program information diff --git a/doc/mf6io/prt/fmi.tex b/doc/mf6io/prt/fmi.tex index b67883629e2..1d89ceb9f20 100644 --- a/doc/mf6io/prt/fmi.tex +++ b/doc/mf6io/prt/fmi.tex @@ -9,7 +9,7 @@ \item Flows are provided from a previous GWF model simulation---in this case FMI should be provided in the PRT name file and the head and budget files should be listed in the FMI PACKAGEDATA block. In this case, FMI reads the simulated head and flows from these files and makes them available to the particle-trcking model. There are some additional considerations when the heads and flows are provided from binary files. \begin{itemize} -\item The binary budget file must contain the simulated flows for all of the packages that were included in the GWF model run. Saving of flows can be activated for all packages by specifying ``SAVE\_FLOWS'' as an option in the GWF name file. The GWF Output Control Package must also have ``SAVE BUGET ALL'' specified. The easiest way to ensure that all flows and heads are saved is to use the following simple form of a GWF Output Control file: +\item The binary budget file must contain the simulated flows for all of the packages that were included in the GWF model run. Saving of flows can be activated for all packages by specifying ``SAVE\_FLOWS'' as an option in the GWF name file. The GWF Output Control Package must also have ``SAVE BUDGET ALL'' specified. The easiest way to ensure that all flows and heads are saved is to use the following simple form of a GWF Output Control file: \begin{verbatim} BEGIN OPTIONS diff --git a/doc/mf6io/prt/namefile.tex b/doc/mf6io/prt/namefile.tex index 18780f276cf..776f622be31 100644 --- a/doc/mf6io/prt/namefile.tex +++ b/doc/mf6io/prt/namefile.tex @@ -28,10 +28,9 @@ \subsubsection{Explanation of Variables} FMI6 & Flow Model Interface Package & \\ PRP6 & Particle Release Point Package \\ OC6 & Output Control Option \\ -OBS6 & Observations Option \\ \hline \end{tabular*} -\label{table:ftypeprt} +\label{table:ftype} \end{center} \normalsize \end{table} diff --git a/doc/mf6io/prt/oc.tex b/doc/mf6io/prt/oc.tex index 8077ad09bf9..2681bd98cdb 100644 --- a/doc/mf6io/prt/oc.tex +++ b/doc/mf6io/prt/oc.tex @@ -1,8 +1,8 @@ -Input to the Output Control Option of the Particle Tracking Model is read from the file that is specified as type ``OC6'' in the Name File. If no ``OC6'' file is specified, default output control is used. The Output Control Option determines how and when concentrations are printed to the listing file and/or written to a separate binary output file. Under the default, concentration and overall transport budget are written to the Listing File at the end of every stress period. The default printout format for concentrations is 10G11.4. The concentrations and overall transport budget are also written to the list file if the simulation terminates prematurely due to failed convergence. +Input to the Output Control Option of the Particle Tracking Model is read from the file that is specified as type ``OC6'' in the Name File. If no ``OC6'' file is specified, default output control is used. The Output Control Option determines how and when particle mass budgets are printed to the listing file and/or written to a separate binary output file. Under the default settings, the particle mass budget is written to the Listing File at the end of every stress period. The particle mass budget is also written to the list file if the simulation terminates prematurely due to failed convergence. Output Control data must be specified using words. The numeric codes supported in earlier MODFLOW versions can no longer be used. -For the PRINT and SAVE options of concentration, there is no option to specify individual layers. Whenever the concentration array is printed or saved, all layers are printed or saved. +For the PRINT and SAVE options, there is no option to specify individual layers. Whenever the budget array is printed or saved, all layers are printed or saved. \vspace{5mm} \subsubsection{Structure of Blocks} diff --git a/doc/mf6io/prt/prt-obs.tex b/doc/mf6io/prt/prt-obs.tex deleted file mode 100644 index be59101d85a..00000000000 --- a/doc/mf6io/prt/prt-obs.tex +++ /dev/null @@ -1,39 +0,0 @@ - -PRT Model observations include the simulated groundwater concentration (\texttt{concentration}), and the mass flow, with units of mass per time, between two connected cells (\texttt{flow-ja-face}). The data required for each PRT Model observation type is defined in table~\ref{table:gwtobstype}. For \texttt{flow-ja-face} observation types, negative and positive values represent a loss from and gain to the \texttt{cellid} specified for ID, respectively. - -\subsubsection{Structure of Blocks} -\vspace{5mm} - -\noindent \textit{FOR EACH SIMULATION} -\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/utl-obs-options.dat} -\lstinputlisting[style=blockdefinition]{./mf6ivar/tex/utl-obs-continuous.dat} - -\subsubsection{Explanation of Variables} -\begin{description} -\input{./mf6ivar/tex/utl-obs-desc.tex} -\end{description} - - -\begin{longtable}{p{2cm} p{2.75cm} p{2cm} p{1.25cm} p{7cm}} -\caption{Available PRT model observation types} \tabularnewline - -\hline -\hline -\textbf{Model} & \textbf{Observation type} & \textbf{ID} & \textbf{ID2} & \textbf{Description} \\ -\hline -\endhead - -\hline -\endfoot - -%%%\input{../Common/prt-obs.tex} -%%%\label{table:prtobstype} -\end{longtable} - -\vspace{5mm} -\subsubsection{Example Observation Input File} - -An example PRT Model observation file is shown below. - -\lstinputlisting[style=inputfile]{./mf6ivar/examples/utl-obs-prt-example.dat} - diff --git a/doc/mf6io/prt/prt.tex b/doc/mf6io/prt/prt.tex index 372eea93685..6412ecca912 100644 --- a/doc/mf6io/prt/prt.tex +++ b/doc/mf6io/prt/prt.tex @@ -1,28 +1,18 @@ -The PRT Model performs three-dimensional particle tracking in flowing groundwater. +The PRT Model calculates three-dimensional, advective particle trajectories in flowing groundwater. The PRT Model is designed to work with the Groundwater Flow (GWF) Model \citep{modflow6gwf} and uses the same spatial discretization, which may be represented using either a structured (DIS) or an unstructured (DISV) grid. The PRT Model replicates much of the functionality of MODPATH 7 \citep{pollock2016modpath7} and offers support for a much broader class of unstructured grids. The PRT Model can be run in the same simulation as the associated GWF Model or in a separate simulation that reads previously calculated flows from a binary budget file. The version of the PRT Model documented here does not support grids of DISU type, tracking of particles through advanced stress package features such as lakes or streams reaches, or exchange of particles between PRT models. -This section describes the data files for a \mf Particle Tracking (PRT) Model. A PRT Model is added to the simulation by including a PRT entry in the MODELS block of the simulation name file. There are currently two types of spatial discretization approaches that can be used with the PRT Model: DIS and DISV. The input instructions for these three packages are not described here in this section on PRT Model input; input instructions for these three packages are described in the section on GWF Model input. +This section describes the data files for a \mf Particle Tracking (PRT) Model. A PRT Model is added to the simulation by including a PRT entry in the MODELS block of the simulation name file. There are currently two types of spatial discretization approaches that can be used with the PRT Model: DIS and DISV. The input instructions for these three packages are not described here in this section on PRT Model input; input instructions for these three packages are described in the section on GWF Model input. Note that for a PRT Model, the maximum number of vertices for a cell in a DISV grid is limited to 8. The PRT Model is designed to permit input to be gathered, as it is needed, from many different files. Likewise, results from the model calculations can be written to a number of output files. Details about the files used by each package are provided in this section on the PRT Model Instructions. The PRT Model reads a file called the Name File, which specifies most of the files that will be used in a simulation. Several files are always required whereas other files are optional depending on the simulation. The Output Control Package receives instructions from the user to control the amount and frequency of output. Details about the Name File and the Output Control Package are described in this section. -For the PRT Model, ``flows'' (unless stated otherwise) represent particle mass ``flow'' in mass per time, rather than groundwater flow. Each particle is currently assigned unit mass (configurable mass is planned but not yet implemented), and the numerical value of the flow can be interpreted as particles per time. - -\begin{enumerate} - -\item The PRT Model simulates particle trajectories through flowing groundwater, and requires simulated groundwater flows as input. Flows can be routed to a PRT Model from a GWF Model in the same simulation via a GWF-PRT Exchange. Alternatively, a PRT Model can read binary flow and head files saved by a previously run GWF Model via Flow Model Interface. - -\item Particle tracking is not yet supported for the advanced stress packages or the Water Mover Package. - -\item A PRT-PRT Exchange is planned but has not yet been developed. This exchange will connect multiple particle-tracking models, e.g. for nested grid configurations. - -\end{enumerate} +For the PRT Model, ``flows'' (unless stated otherwise) represent particle mass ``flow'' in mass per time, rather than groundwater flow. Each particle is currently assigned unit mass, and the numerical value of the flow can be interpreted as particles per time. \subsection{Units of Length and Time} -The GWF Model formulates the groundwater flow equation without using prescribed length and time units. Any consistent units of length and time can be used when specifying the input data for a simulation. This capability gives a certain amount of freedom to the user, but care must be exercised to avoid mixing units. The program cannot detect the use of inconsistent units. +The PRT Model formulates the particle trajectory equations without using prescribed length and time units. Any consistent units of length and time can be used when specifying the input data for a simulation. This capability gives a certain amount of freedom to the user, but care must be exercised to avoid mixing units. The program cannot detect the use of inconsistent units. \subsection{Particle Mass Budget} -A summary of all inflow (sources) and outflow (sinks) of particle mass is called a mass budget. \mf calculates a mass budget for the overall model as a check on the acceptability of the solution, and to provide a summary of the sources and sinks of mass to the flow system. The particle mass budget is printed to the PRT Model Listing File for selected time steps. In the current implementation, each particle is assigned unit mass, and the numerical value of the flow can be interpreted as particles per time. +A summary of all inflow (sources) and outflow (sinks) of particle mass is called a mass budget. The particle mass budget is printed to the PRT Model Listing File for selected time steps. In the current implementation, each particle is assigned unit mass, and the numerical value of the flow can be interpreted as particles per time. \subsection{Time Stepping} In \mf time step lengths are controlled by the user and specified in the Temporal Discretization (TDIS) input file. When the flow model and particle-tracking model run in the same simulation, the time step length specified in TDIS is used for both models. If the PRT Model runs in a separate simulation, the time discretization may differ. Instructions for specifying time steps are described in the TDIS section of this user guide; additional information on GWF and PRT configurations are in the Flow Model Interface section. @@ -50,17 +40,13 @@ \subsection{Model Input (MIP) Package} \input{prt/mip} \newpage -\subsection{Particle Release Point Conditions (PRP) Package} +\subsection{Particle Release Point (PRP) Package} \input{prt/prp} \newpage \subsection{Output Control (OC) Option} \input{prt/oc} -\newpage -\subsection{Observation (OBS) Utility for a PRT Model} -\input{prt/prt-obs} - \newpage \subsection{Flow Model Interface (FMI) Package} \input{prt/fmi} diff --git a/make/makefile b/make/makefile index 710253e23f7..323d07e60ac 100644 --- a/make/makefile +++ b/make/makefile @@ -390,7 +390,6 @@ $(OBJDIR)/Disv2d.o \ $(OBJDIR)/Dis2d.o \ $(OBJDIR)/prt-prp.o \ $(OBJDIR)/prt-oc.o \ -$(OBJDIR)/prt-obs.o \ $(OBJDIR)/prt-mip.o \ $(OBJDIR)/MethodPool.o \ $(OBJDIR)/SpatialModelConnection.o \ diff --git a/msvs/mf6core.vfproj b/msvs/mf6core.vfproj index 3382358faa9..e0d4c254bf3 100644 --- a/msvs/mf6core.vfproj +++ b/msvs/mf6core.vfproj @@ -298,7 +298,6 @@ - diff --git a/src/Idm/prt-mipidm.f90 b/src/Idm/prt-mipidm.f90 index d7fbb1b6bc7..48807bf5991 100644 --- a/src/Idm/prt-mipidm.f90 +++ b/src/Idm/prt-mipidm.f90 @@ -11,7 +11,6 @@ module PrtMipInputModule public prt_mip_multi_package type PrtMipParamFoundType - logical :: zero_method = .false. logical :: export_ascii = .false. logical :: porosity = .false. logical :: retfactor = .false. @@ -20,23 +19,6 @@ module PrtMipInputModule logical :: prt_mip_multi_package = .false. - type(InputParamDefinitionType), parameter :: & - prtmip_zero_method = InputParamDefinitionType & - ( & - 'PRT', & ! component - 'MIP', & ! subcomponent - 'OPTIONS', & ! block - 'ZERO_METHOD', & ! tag name - 'ZERO_METHOD', & ! fortran variable - 'INTEGER', & ! type - '', & ! shape - .false., & ! required - .false., & ! multi-record - .false., & ! preserve case - .false., & ! layered - .false. & ! timeseries - ) - type(InputParamDefinitionType), parameter :: & prtmip_export_ascii = InputParamDefinitionType & ( & @@ -108,7 +90,6 @@ module PrtMipInputModule type(InputParamDefinitionType), parameter :: & prt_mip_param_definitions(*) = & [ & - prtmip_zero_method, & prtmip_export_ascii, & prtmip_porosity, & prtmip_retfactor, & diff --git a/src/Model/ModelUtilities/TrackData.f90 b/src/Model/ModelUtilities/TrackData.f90 index 2a43c7d97b7..919f43fc0f3 100644 --- a/src/Model/ModelUtilities/TrackData.f90 +++ b/src/Model/ModelUtilities/TrackData.f90 @@ -40,7 +40,7 @@ module TrackModule type(TrackFileType), public, allocatable :: trackfiles(:) !< output files integer(I4B), public :: ntrackfiles !< number of output files logical(LGP), public :: trackrelease !< track release events - logical(LGP), public :: tracktransit !< track cell-to-cell transitions + logical(LGP), public :: trackexit !< track cell-to-cell transitions logical(LGP), public :: tracktimestep !< track timestep ends logical(LGP), public :: trackterminate !< track termination events logical(LGP), public :: trackweaksink !< track weak sink exit events @@ -265,7 +265,7 @@ subroutine save(this, particle, kper, kstp, reason, level) ! -- Only save if reporting is enabled for specified event. if (.not. ((this%trackrelease .and. reason == 0) .or. & - (this%tracktransit .and. reason == 1) .or. & + (this%trackexit .and. reason == 1) .or. & (this%tracktimestep .and. reason == 2) .or. & (this%trackterminate .and. reason == 3) .or. & (this%trackweaksink .and. reason == 4) .or. & @@ -300,20 +300,20 @@ end subroutine save !< subroutine set_track_events(this, & release, & - transit, & + cellexit, & timestep, & terminate, & weaksink, & usertime) class(TrackFileControlType) :: this logical(LGP), intent(in) :: release - logical(LGP), intent(in) :: transit + logical(LGP), intent(in) :: cellexit logical(LGP), intent(in) :: timestep logical(LGP), intent(in) :: terminate logical(LGP), intent(in) :: weaksink logical(LGP), intent(in) :: usertime this%trackrelease = release - this%tracktransit = transit + this%trackexit = cellexit this%tracktimestep = timestep this%trackterminate = terminate this%trackweaksink = weaksink diff --git a/src/Model/ParticleTracking/prt-mip.f90 b/src/Model/ParticleTracking/prt-mip.f90 index bb587adff56..41db6d3cfbd 100644 --- a/src/Model/ParticleTracking/prt-mip.f90 +++ b/src/Model/ParticleTracking/prt-mip.f90 @@ -20,7 +20,6 @@ module PrtMipModule real(DP), dimension(:), pointer, contiguous :: porosity => null() !< aquifer porosity real(DP), dimension(:), pointer, contiguous :: retfactor => null() !< retardation factor integer(I4B), dimension(:), pointer, contiguous :: izone => null() !< zone number - integer(I4B), pointer :: zeromethod contains procedure :: mip_ar procedure :: mip_da @@ -80,15 +79,12 @@ subroutine mip_da(this) call mem_deallocate(this%porosity) call mem_deallocate(this%retfactor) call mem_deallocate(this%izone) - ! - ! -- Deallocate scalars - call mem_deallocate(this%zeromethod) + end subroutine mip_da subroutine allocate_scalars(this) class(PrtMipType) :: this call this%NumericalPackageType%allocate_scalars() - call mem_allocate(this%zeromethod, 'IZEROMETHOD', this%memoryPath) end subroutine allocate_scalars !> @brief Allocate arrays @@ -134,11 +130,6 @@ subroutine mip_ar(this) call mem_set_value(this%izone, 'IZONE', this%input_mempath, map, & found%izone) ! - ! -- Source scalars - call mem_set_value(this%zeromethod, 'ZERO_METHOD', this%input_mempath, & - found%zero_method) - if (.not. found%zero_method) this%zeromethod = 1 - ! ! -- Ensure POROSITY was found if (.not. found%porosity) then write (errmsg, '(a)') 'Error in GRIDDATA block: POROSITY not found' diff --git a/src/Model/ParticleTracking/prt-obs.f90 b/src/Model/ParticleTracking/prt-obs.f90 deleted file mode 100644 index 73a308427a7..00000000000 --- a/src/Model/ParticleTracking/prt-obs.f90 +++ /dev/null @@ -1,235 +0,0 @@ -module PrtObsModule - - use KindModule, only: DP, I4B - use ConstantsModule, only: LINELENGTH, MAXOBSTYPES - use BaseDisModule, only: DisBaseType - use ObserveModule, only: ObserveType - use ObsModule, only: ObsType - use SimModule, only: count_errors, store_error, & - store_error_unit - implicit none - - private - public :: PrtObsType, prt_obs_cr - - type, extends(ObsType) :: PrtObsType - ! -- Private members - real(DP), dimension(:), pointer, contiguous, private :: x => null() !< concentration - real(DP), dimension(:), pointer, contiguous, private :: flowja => null() !< intercell flows - contains - ! -- Public procedures - procedure, public :: prt_obs_ar - procedure, public :: obs_bd => prt_obs_bd - procedure, public :: obs_df => prt_obs_df - procedure, public :: obs_rp => prt_obs_rp - procedure, public :: obs_da => prt_obs_da - ! -- Private procedures - procedure, private :: set_pointers - end type PrtObsType - -contains - - !> @brief Create a new PrtObsType object - subroutine prt_obs_cr(obs, inobs) - ! -- dummy - type(PrtObsType), pointer, intent(out) :: obs - integer(I4B), pointer, intent(in) :: inobs - ! - allocate (obs) - call obs%allocate_scalars() - obs%active = .false. - obs%inputFilename = '' - obs%inUnitObs => inobs - - end subroutine prt_obs_cr - - !> @brief Allocate and read - subroutine prt_obs_ar(this, x, flowja) - ! -- dummy - class(PrtObsType), intent(inout) :: this - real(DP), dimension(:), pointer, contiguous, intent(in) :: x - real(DP), dimension(:), pointer, contiguous, intent(in) :: flowja - ! - ! Call ar method of parent class - call this%obs_ar() - ! - ! set pointers - call this%set_pointers(x, flowja) - - end subroutine prt_obs_ar - - !> @brief Define package - subroutine prt_obs_df(this, iout, pkgname, filtyp, dis) - ! -- dummy - class(PrtObsType), intent(inout) :: this - integer(I4B), intent(in) :: iout - character(len=*), intent(in) :: pkgname - character(len=*), intent(in) :: filtyp - class(DisBaseType), pointer :: dis - ! -- local - integer(I4B) :: indx - ! - ! Call overridden method of parent class - call this%ObsType%obs_df(iout, pkgname, filtyp, dis) - ! - ! -- StoreObsType arguments are: (ObserveType, cumulative, indx); - ! indx is returned. - ! - ! -- Store obs type and assign procedure pointer for head observation type - call this%StoreObsType('concentration', .false., indx) - this%obsData(indx)%ProcessIdPtr => prt_process_concentration_obs_id - ! - ! -- Store obs type and assign procedure pointer for flow-ja-face observation type - call this%StoreObsType('flow-ja-face', .true., indx) - this%obsData(indx)%ProcessIdPtr => prt_process_intercell_obs_id - - end subroutine prt_obs_df - - !> @brief Save observations - subroutine prt_obs_bd(this) - ! -- dummy - class(PrtObsType), intent(inout) :: this - ! -- local - integer(I4B) :: i, jaindex, nodenumber - character(len=100) :: msg - class(ObserveType), pointer :: obsrv => null() - ! - call this%obs_bd_clear() - ! - ! -- iterate through all PRT observations - if (this%npakobs > 0) then - do i = 1, this%npakobs - obsrv => this%pakobs(i)%obsrv - nodenumber = obsrv%NodeNumber - jaindex = obsrv%JaIndex - select case (obsrv%ObsTypeId) - case ('CONCENTRATION') - call this%SaveOneSimval(obsrv, this%x(nodenumber)) - case ('FLOW-JA-FACE') - call this%SaveOneSimval(obsrv, this%flowja(jaindex)) - case default - msg = 'Error: Unrecognized observation type: '//trim(obsrv%ObsTypeId) - call store_error(msg) - call store_error_unit(this%inUnitObs) - end select - end do - end if - - end subroutine prt_obs_bd - - !> @brief Read and prepare - subroutine prt_obs_rp(this) - class(PrtObsType), intent(inout) :: this - ! Do PRT observations need any checking? If so, add checks here - end subroutine prt_obs_rp - - !> @brief Deallocate - subroutine prt_obs_da(this) - ! -- dummy - class(PrtObsType), intent(inout) :: this - ! - nullify (this%x) - nullify (this%flowja) - call this%ObsType%obs_da() - - end subroutine prt_obs_da - - !> @brief Set pointers - subroutine set_pointers(this, x, flowja) - ! -- dummy - class(PrtObsType), intent(inout) :: this - real(DP), dimension(:), pointer, contiguous, intent(in) :: x - real(DP), dimension(:), pointer, contiguous, intent(in) :: flowja - ! - this%x => x - this%flowja => flowja - - end subroutine set_pointers - - ! -- Procedures related to GWF observations (NOT type-bound) - - subroutine prt_process_concentration_obs_id(obsrv, dis, inunitobs, iout) - ! -- dummy - type(ObserveType), intent(inout) :: obsrv - class(DisBaseType), intent(in) :: dis - integer(I4B), intent(in) :: inunitobs - integer(I4B), intent(in) :: iout - ! -- local - integer(I4B) :: nn1 - integer(I4B) :: icol, istart, istop - character(len=LINELENGTH) :: ermsg, string - ! - ! -- Initialize variables - string = obsrv%IDstring - icol = 1 - ! - ! Get node number, with option for ID string to be either node - ! number or lay, row, column (when dis is structured). - nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, string, .false.) - ! - if (nn1 > 0) then - obsrv%NodeNumber = nn1 - else - ermsg = 'Error reading data from ID string' - call store_error(ermsg) - call store_error_unit(inunitobs) - end if - - end subroutine prt_process_concentration_obs_id - - subroutine prt_process_intercell_obs_id(obsrv, dis, inunitobs, iout) - ! -- dummy - type(ObserveType), intent(inout) :: obsrv - class(DisBaseType), intent(in) :: dis - integer(I4B), intent(in) :: inunitobs - integer(I4B), intent(in) :: iout - ! -- local - integer(I4B) :: nn1, nn2 - integer(I4B) :: icol, istart, istop, jaidx - character(len=LINELENGTH) :: ermsg, string - ! formats -70 format('Error: No connection exists between cells identified in text: ', a) - ! - ! -- Initialize variables - string = obsrv%IDstring - icol = 1 - ! - ! Get node number, with option for ID string to be either node - ! number or lay, row, column (when dis is structured). - nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, string, .false.) - ! - if (nn1 > 0) then - obsrv%NodeNumber = nn1 - else - ermsg = 'Error reading data from ID string: '//string(istart:istop) - call store_error(ermsg) - end if - ! - ! Get node number, with option for ID string to be either node - ! number or lay, row, column (when dis is structured). - nn2 = dis%noder_from_string(icol, istart, istop, inunitobs, & - iout, string, .false.) - if (nn2 > 0) then - obsrv%NodeNumber2 = nn2 - else - ermsg = 'Error reading data from ID string: '//string(istart:istop) - call store_error(ermsg) - end if - ! - ! -- store JA index - jaidx = dis%con%getjaindex(nn1, nn2) - if (jaidx == 0) then - write (ermsg, 70) trim(string) - call store_error(ermsg) - end if - obsrv%JaIndex = jaidx - ! - if (count_errors() > 0) then - call store_error_unit(inunitobs) - end if - - end subroutine prt_process_intercell_obs_id - -end module PrtObsModule diff --git a/src/Model/ParticleTracking/prt-oc.f90 b/src/Model/ParticleTracking/prt-oc.f90 index 0be8dc1b505..1f46a938ea2 100644 --- a/src/Model/ParticleTracking/prt-oc.f90 +++ b/src/Model/ParticleTracking/prt-oc.f90 @@ -24,7 +24,7 @@ module PrtOcModule integer(I4B), pointer :: itrkcsv => null() !< CSV output file integer(I4B), pointer :: itrktls => null() !< track time list input file logical(LGP), pointer :: trackrelease => null() !< whether to track release events - logical(LGP), pointer :: tracktransit => null() !< whether to track cell transition events + logical(LGP), pointer :: trackexit => null() !< whether to track cell transition events logical(LGP), pointer :: tracktimestep => null() !< whether to track timestep events logical(LGP), pointer :: trackterminate => null() !< whether to track termination events logical(LGP), pointer :: trackweaksink => null() !< whether to track weak sink exit events @@ -79,7 +79,7 @@ subroutine prt_oc_allocate_scalars(this, name_model) call mem_allocate(this%itrkcsv, 'ITRKCSV', this%memoryPath) call mem_allocate(this%itrktls, 'ITRKTLS', this%memoryPath) call mem_allocate(this%trackrelease, 'ITRACKRLS', this%memoryPath) - call mem_allocate(this%tracktransit, 'ITRACKTRS', this%memoryPath) + call mem_allocate(this%trackexit, 'ITRACKTRS', this%memoryPath) call mem_allocate(this%tracktimestep, 'ITRACKTST', this%memoryPath) call mem_allocate(this%trackterminate, 'ITRACKTER', this%memoryPath) call mem_allocate(this%trackweaksink, 'ITRACKWSK', this%memoryPath) @@ -96,7 +96,7 @@ subroutine prt_oc_allocate_scalars(this, name_model) this%itrkcsv = 0 this%itrktls = 0 this%trackrelease = .false. - this%tracktransit = .false. + this%trackexit = .false. this%tracktimestep = .false. this%trackterminate = .false. this%trackweaksink = .false. @@ -105,10 +105,9 @@ subroutine prt_oc_allocate_scalars(this, name_model) end subroutine prt_oc_allocate_scalars !> @ brief Setup output control variables. - subroutine oc_ar(this, mass, dis, dnodata) + subroutine oc_ar(this, dis, dnodata) ! -- dummy class(PrtOcType) :: this !< PrtOcType object - real(DP), dimension(:), pointer, contiguous, intent(in) :: mass !< particle mass class(DisBaseType), pointer, intent(in) :: dis !< model discretization package real(DP), intent(in) :: dnodata !< no data value ! -- local @@ -120,7 +119,7 @@ subroutine oc_ar(this, mass, dis, dnodata) allocate (this%tracktimes) call this%tracktimes%init() inodata = 0 - nocdobj = 2 + nocdobj = 1 allocate (this%ocdobj(nocdobj)) do i = 1, nocdobj call ocd_cr(ocdobjptr) @@ -129,10 +128,6 @@ subroutine oc_ar(this, mass, dis, dnodata) call ocdobjptr%init_dbl('BUDGET', nullvec, dis, 'PRINT LAST ', & 'COLUMNS 10 WIDTH 11 DIGITS 4 GENERAL ', & this%iout, dnodata) - case (2) - call ocdobjptr%init_dbl('MASS', mass, dis, 'PRINT LAST ', & - 'COLUMNS 10 WIDTH 11 DIGITS 4 GENERAL ', & - this%iout, dnodata) end select this%ocdobj(i) = ocdobjptr deallocate (ocdobjptr) @@ -168,7 +163,7 @@ subroutine prt_oc_da(this) call mem_deallocate(this%itrkcsv) call mem_deallocate(this%itrktls) call mem_deallocate(this%trackrelease) - call mem_deallocate(this%tracktransit) + call mem_deallocate(this%trackexit) call mem_deallocate(this%tracktimestep) call mem_deallocate(this%trackterminate) call mem_deallocate(this%trackweaksink) @@ -193,7 +188,7 @@ subroutine prt_oc_read_options(this) character(len=:), allocatable :: line integer(I4B) :: i, ierr, ipos, ios, nlines real(DP) :: dval - logical(LGP) :: isfound, found, endOfBlock, eventFound, success + logical(LGP) :: isfound, found, endOfBlock, event_found, success type(OutputControlDataType), pointer :: ocdobjptr ! -- formats character(len=*), parameter :: fmttrkbin = & @@ -210,7 +205,7 @@ subroutine prt_oc_read_options(this) ! -- parse options block if detected if (isfound) then write (this%iout, '(/,1x,a,/)') 'PROCESSING OC OPTIONS' - eventFound = .false. + event_found = .false. do call this%parser%GetNextLine(endOfBlock) if (endOfBlock) exit @@ -269,31 +264,31 @@ subroutine prt_oc_read_options(this) end if found = .true. case ('TRACK_ALL') - eventFound = .false. ! defaults set below + event_found = .false. ! defaults set below found = .true. case ('TRACK_RELEASE') this%trackrelease = .true. - eventFound = .true. + event_found = .true. found = .true. - case ('TRACK_TRANSIT') - this%tracktransit = .true. - eventFound = .true. + case ('TRACK_EXIT') + this%trackexit = .true. + event_found = .true. found = .true. case ('TRACK_TIMESTEP') this%tracktimestep = .true. - eventFound = .true. + event_found = .true. found = .true. case ('TRACK_TERMINATE') this%trackterminate = .true. - eventFound = .true. + event_found = .true. found = .true. case ('TRACK_WEAKSINK') this%trackweaksink = .true. - eventFound = .true. + event_found = .true. found = .true. case ('TRACK_USERTIME') this%trackusertime = .true. - eventFound = .true. + event_found = .true. found = .true. case ('TRACK_TIMES') ttloop: do @@ -358,9 +353,9 @@ subroutine prt_oc_read_options(this) end do ! -- default to all events - if (.not. eventFound) then + if (.not. event_found) then this%trackrelease = .true. - this%tracktransit = .true. + this%trackexit = .true. this%tracktimestep = .true. this%trackterminate = .true. this%trackweaksink = .true. diff --git a/src/Model/ParticleTracking/prt-prp.f90 b/src/Model/ParticleTracking/prt-prp.f90 index da8be9b3524..8a393dccd4b 100644 --- a/src/Model/ParticleTracking/prt-prp.f90 +++ b/src/Model/ParticleTracking/prt-prp.f90 @@ -62,8 +62,10 @@ module PrtPrpModule real(DP), pointer, contiguous :: locz(:) => null() !< release point local z coordinates real(DP), pointer, contiguous :: rptmass(:) => null() !< total mass released from point character(len=LENBOUNDNAME), pointer, contiguous :: rptname(:) => null() !< release point names - type(TimeSelectType), pointer :: releasetimes - integer(I4B), pointer :: ifrctrn => NULL() + type(TimeSelectType), pointer :: releasetimes !< user-specified particle release times + integer(I4B), pointer :: ifrctrn => null() !< force ternary solution for quad grids + integer(I4B), pointer :: iexmethod => null() !< method for iterative solution of particle exit location and time in generalized Pollock's method + real(DP), pointer :: extol => null() !< tolerance for iterative solution of particle exit location and time in generalized Pollock's method contains procedure :: prp_allocate_arrays @@ -156,6 +158,8 @@ subroutine prp_da(this) call mem_deallocate(this%itrkcsv) call mem_deallocate(this%irlstls) call mem_deallocate(this%ifrctrn) + call mem_deallocate(this%iexmethod) + call mem_deallocate(this%extol) ! -- deallocate arrays call mem_deallocate(this%rptx) @@ -253,6 +257,8 @@ subroutine prp_allocate_scalars(this) call mem_allocate(this%itrkcsv, 'ITRKCSV', this%memoryPath) call mem_allocate(this%irlstls, 'IRLSTLS', this%memoryPath) call mem_allocate(this%ifrctrn, 'IFRCTRN', this%memoryPath) + call mem_allocate(this%iexmethod, 'IEXMETHOD', this%memoryPath) + call mem_allocate(this%extol, 'IEXTOL', this%memoryPath) ! -- Set values this%rlsall = .false. @@ -272,6 +278,8 @@ subroutine prp_allocate_scalars(this) this%itrkcsv = 0 this%irlstls = 0 this%ifrctrn = 0 + this%iexmethod = 1 + this%extol = DZERO end subroutine prp_allocate_scalars !> @ brief Allocate and read period data @@ -455,6 +463,8 @@ subroutine prp_ad(this) particle%idomain(3) = 0 particle%iboundary(3) = 0 particle%ifrctrn = this%ifrctrn + particle%iexmethod = this%iexmethod + particle%extol = this%extol call this%particles%load_from_particle(particle, np) @@ -806,6 +816,19 @@ subroutine prp_options(this, option, found) write (this%iout, '(4x,a)') & 'TRACKING WILL BE DONE USING THE TERNARY METHOD REGARDLESS OF CELL TYPE' found = .true. + case ('DEV_EXIT_SOLVE_METHOD') + this%iexmethod = this%parser%GetInteger() + if (this%iexmethod /= 1 .and. this%iexmethod /= 2) then + call store_error('DEV_EXIT_SOLVE_METHOD MUST BE & + &1 (BRENT) OR 2 (CHANDRUPATLA)') + end if + found = .true. + case ('EXIT_SOLVE_TOLERANCE') + this%extol = this%parser%GetDouble() + if (this%extol <= DZERO) then + call store_error('EXIT_SOLVE_TOLERANCE MUST BE STRICTLY POSITIVE') + end if + found = .true. case default found = .false. end select diff --git a/src/Model/ParticleTracking/prt.f90 b/src/Model/ParticleTracking/prt.f90 index 731e7f5e3d2..5263d88c7b6 100644 --- a/src/Model/ParticleTracking/prt.f90 +++ b/src/Model/ParticleTracking/prt.f90 @@ -16,7 +16,6 @@ module PrtModule use PrtFmiModule, only: PrtFmiType use PrtMipModule, only: PrtMipType use PrtOcModule, only: PrtOcType - use PrtObsModule, only: PrtObsType use BudgetModule, only: BudgetType use ListModule, only: ListType use ParticleModule, only: ParticleType, create_particle @@ -42,7 +41,6 @@ module PrtModule type(PrtFmiType), pointer :: fmi => null() ! flow model interface type(PrtMipType), pointer :: mip => null() ! model input package type(PrtOcType), pointer :: oc => null() ! output control package - type(PrtObsType), pointer :: obs => null() ! observation package type(BudgetType), pointer :: budget => null() ! budget object class(MethodType), pointer :: method => null() ! tracking method type(TrackFileControlType), pointer :: trackfilectl ! track file control @@ -54,7 +52,6 @@ module PrtModule integer(I4B), pointer :: indsp => null() ! unit number DSP integer(I4B), pointer :: inssm => null() ! unit number SSM integer(I4B), pointer :: inoc => null() ! unit number OC - integer(I4B), pointer :: inobs => null() ! unit number OBS integer(I4B), pointer :: nprp => null() ! number of PRP packages in the model real(DP), dimension(:), pointer, contiguous :: masssto => null() !< particle mass storage in cells, new value real(DP), dimension(:), pointer, contiguous :: massstoold => null() !< particle mass storage in cells, old value @@ -81,7 +78,6 @@ module PrtModule procedure, private :: prt_ot_printflow procedure, private :: prt_ot_dv procedure, private :: prt_ot_bdsummary - procedure, private :: prt_ot_obs procedure, private :: prt_cq_sto procedure, private :: create_packages procedure, private :: create_bndpkgs @@ -98,7 +94,7 @@ module PrtModule character(len=LENPACKAGETYPE), dimension(PRT_NBASEPKG) :: PRT_BASEPKG data PRT_BASEPKG/'DIS6 ', 'DISV6', 'DISU6', 'IC6 ', 'MST6 ', & ! 5 &'ADV6 ', 'DSP6 ', 'SSM6 ', 'MIP6 ', 'CNC6 ', & ! 10 - &'OC6 ', 'OBS6 ', 'FMI6 ', ' ', 'IST6 ', & ! 15 + &'OC6 ', ' ', 'FMI6 ', ' ', 'IST6 ', & ! 15 &'LKT6 ', 'SFT6 ', 'MWT6 ', 'UZT6 ', 'MVT6 ', & ! 20 &'API6 ', ' ', ' ', ' ', ' ', & ! 25 25*' '/ ! 50 @@ -220,8 +216,6 @@ subroutine prt_df(this) ! -- Allocate model arrays call this%allocate_arrays() - ! -- Store information needed for observations - call this%obs%obs_df(this%iout, this%name, 'PRT', this%dis) end subroutine prt_df !> @brief Allocate and read @@ -246,7 +240,7 @@ subroutine prt_ar(this) if (this%inmip > 0) call this%mip%mip_ar() ! -- set up output control - call this%oc%oc_ar(this%masssto, this%dis, DHNOFLO) + call this%oc%oc_ar(this%dis, DHNOFLO) call this%budget%set_ibudcsv(this%oc%ibudcsv) ! -- Package input files now open, so allocate and read @@ -283,7 +277,6 @@ subroutine prt_ar(this) retfactor=this%mip%retfactor, & tracktimes=this%oc%tracktimes) this%method => method_disv - method_disv%zeromethod = this%mip%zeromethod end select ! -- Initialize track output files and reporting options @@ -293,7 +286,7 @@ subroutine prt_ar(this) call this%trackfilectl%init_track_file(this%oc%itrkcsv, csv=.true.) call this%trackfilectl%set_track_events( & this%oc%trackrelease, & - this%oc%tracktransit, & + this%oc%trackexit, & this%oc%tracktimestep, & this%oc%trackterminate, & this%oc%trackweaksink, & @@ -317,7 +310,6 @@ subroutine prt_rp(this) do ip = 1, this%bndlist%Count() packobj => GetBndFromList(this%bndlist, ip) call packobj%bnd_rp() - call packobj%bnd_rp_obs() end do end subroutine prt_rp @@ -352,9 +344,6 @@ subroutine prt_ad(this) call packobj%bnd_ck() end if end do - - ! -- Push simulated values to preceding time/subtime step - call this%obs%obs_ad() ! ! -- Initialize the flowja array. Flowja is calculated each time, ! even if output is suppressed. (Flowja represents flow of particle @@ -526,9 +515,6 @@ subroutine prt_ot(this) ibudfl = this%oc%set_print_flag('BUDGET', 1, endofperiod) idvprint = this%oc%set_print_flag('CONCENTRATION', 1, endofperiod) - ! -- Calculate and save observations - call this%prt_ot_obs() - ! -- Save and print flows call this%prt_ot_flow(icbcfl, ibudfl, icbcun) @@ -543,24 +529,6 @@ subroutine prt_ot(this) if (ipflag == 1) call tdis_ot(this%iout) end subroutine prt_ot - !> @brief Calculate and save observations - subroutine prt_ot_obs(this) - class(PrtModelType) :: this - class(BndType), pointer :: packobj - integer(I4B) :: ip - - ! -- Calculate and save observations - call this%obs%obs_bd() - call this%obs%obs_ot() - - ! -- Calculate and save package obserations - do ip = 1, this%bndlist%Count() - packobj => GetBndFromList(this%bndlist, ip) - call packobj%bnd_bd_obs() - call packobj%bnd_ot_obs() - end do - end subroutine prt_ot_obs - !> @brief Save flows subroutine prt_ot_flow(this, icbcfl, ibudfl, icbcun) use PrtPrpModule, only: PrtPrpType @@ -740,13 +708,11 @@ subroutine prt_da(this) call this%mip%mip_da() call this%budget%budget_da() call this%oc%oc_da() - call this%obs%obs_da() deallocate (this%dis) deallocate (this%fmi) deallocate (this%mip) deallocate (this%budget) deallocate (this%oc) - deallocate (this%obs) ! -- Method objects call destroy_method_subcell_pool() @@ -769,7 +735,6 @@ subroutine prt_da(this) call mem_deallocate(this%inmst) call mem_deallocate(this%inmvt) call mem_deallocate(this%inoc) - call mem_deallocate(this%inobs) ! -- Arrays call mem_deallocate(this%masssto) @@ -801,7 +766,6 @@ subroutine allocate_scalars(this, modelname) call mem_allocate(this%indsp, 'INDSP', this%memoryPath) call mem_allocate(this%inssm, 'INSSM', this%memoryPath) call mem_allocate(this%inoc, 'INOC ', this%memoryPath) - call mem_allocate(this%inobs, 'INOBS', this%memoryPath) this%infmi = 0 this%inmip = 0 @@ -811,7 +775,6 @@ subroutine allocate_scalars(this, modelname) this%indsp = 0 this%inssm = 0 this%inoc = 0 - this%inobs = 0 end subroutine allocate_scalars !> @brief Allocate arrays @@ -1068,7 +1031,6 @@ subroutine create_packages(this) use PrtMipModule, only: mip_cr use PrtFmiModule, only: fmi_cr use PrtOcModule, only: oc_cr - use PrtObsModule, only: prt_obs_cr ! -- dummy class(PrtModelType) :: this ! -- local @@ -1124,8 +1086,6 @@ subroutine create_packages(this) this%infmi = inunit case ('OC6') this%inoc = inunit - case ('OBS6') - this%inobs = inunit case ('PRP6') call expandarray(bndpkgs) bndpkgs(size(bndpkgs)) = n @@ -1146,7 +1106,6 @@ subroutine create_packages(this) call mip_cr(this%mip, this%name, mempathmip, this%inmip, this%iout, this%dis) call fmi_cr(this%fmi, this%name, this%infmi, this%iout) call oc_cr(this%oc, this%name, this%inoc, this%iout) - call prt_obs_cr(this%obs, this%inobs) ! -- Check to make sure that required ftype's have been specified call this%ftype_check(indis) diff --git a/src/SimulationCreate.f90 b/src/SimulationCreate.f90 index 6d8df16cb6a..33c1f175343 100644 --- a/src/SimulationCreate.f90 +++ b/src/SimulationCreate.f90 @@ -329,8 +329,6 @@ subroutine models_create() write (iout, '(4x,2a,i0,a)') trim(model_type), ' model ', & n, ' will be created' call prt_cr(fname, n, model_names(n)) - call dev_feature('PRT is still under development, install the & - &nightly build or compile from source with IDEVELOPMODE = 1.') num_model => GetNumericalModelFromList(basemodellist, im) model_loc_idx(n) = im case default diff --git a/src/Solution/ParticleTracker/MethodCellTernary.f90 b/src/Solution/ParticleTracker/MethodCellTernary.f90 index 3d12c429591..ddc269d382e 100644 --- a/src/Solution/ParticleTracker/MethodCellTernary.f90 +++ b/src/Solution/ParticleTracker/MethodCellTernary.f90 @@ -61,14 +61,12 @@ subroutine create_method_cell_ternary(method) type(SubcellTriType), pointer :: subcell allocate (method) - allocate (method%zeromethod) call create_cell_poly(cell) method%cell => cell method%type => method%cell%type method%delegates = .true. call create_subcell_tri(subcell) method%subcell => subcell - method%zeromethod = 0 end subroutine create_method_cell_ternary !> @brief Destroy the tracking method @@ -95,7 +93,6 @@ subroutine load_mct(this, particle, next_level, submethod) trackfilectl=this%trackfilectl, & tracktimes=this%tracktimes) submethod => method_subcell_tern - method_subcell_tern%zeromethod = this%zeromethod end subroutine load_mct !> @brief Pass particle to next subcell if there is one, or to the cell face @@ -342,17 +339,17 @@ subroutine vertvelo(this) real(DP) :: jac real(DP), allocatable, dimension(:) :: wk1 real(DP), allocatable, dimension(:) :: wk2 - real(DP), allocatable, dimension(:) :: unixnext - real(DP), allocatable, dimension(:) :: uniynext + real(DP), allocatable, dimension(:) :: unextxnext + real(DP), allocatable, dimension(:) :: unextynext real(DP), allocatable, dimension(:) :: le - real(DP), allocatable, dimension(:) :: unex - real(DP), allocatable, dimension(:) :: uney + real(DP), allocatable, dimension(:) :: unextx + real(DP), allocatable, dimension(:) :: unexty real(DP) :: areacell real(DP), allocatable, dimension(:) :: areasub real(DP) :: divcell real(DP), allocatable, dimension(:) :: li - real(DP), allocatable, dimension(:) :: unix - real(DP), allocatable, dimension(:) :: uniy + real(DP), allocatable, dimension(:) :: unintx + real(DP), allocatable, dimension(:) :: uninty real(DP), allocatable, dimension(:) :: xmid real(DP), allocatable, dimension(:) :: ymid real(DP), allocatable, dimension(:) :: lm @@ -370,12 +367,12 @@ subroutine vertvelo(this) ! Allocate local arrays allocate (le(this%nverts)) ! lengths of exterior (cell) edges - allocate (unex(this%nverts)) ! x components of unit normals to exterior edges - allocate (uney(this%nverts)) ! y components of unit normals to exterior edges + allocate (unextx(this%nverts)) ! x components of unit normals to exterior edges + allocate (unexty(this%nverts)) ! y components of unit normals to exterior edges allocate (areasub(this%nverts)) ! subcell areas allocate (li(this%nverts)) ! lengths of interior edges ("spokes") - allocate (unix(this%nverts)) ! x components of unit normals to interior edges - allocate (uniy(this%nverts)) ! y components of unit normals to interior edges + allocate (unintx(this%nverts)) ! x components of unit normals to interior edges + allocate (uninty(this%nverts)) ! y components of unit normals to interior edges allocate (xmid(this%nverts)) ! x coordinates of midpoints allocate (ymid(this%nverts)) ! y coordinates of midpoints allocate (lm(this%nverts)) ! lengths of midpoint connectors @@ -387,8 +384,8 @@ subroutine vertvelo(this) allocate (vm0y(this%nverts)) ! y component of vm0 allocate (vm1x(this%nverts)) ! x component of vm1 allocate (vm1y(this%nverts)) ! y component of vm1 - allocate (unixnext(this%nverts)) ! vector of "next" interior unit-normal x coordinates defined for convenience - allocate (uniynext(this%nverts)) ! vector of "next" interior unit-normal y coordinates defined for convenience + allocate (unextxnext(this%nverts)) ! vector of "next" interior unit-normal x coordinates defined for convenience + allocate (unextynext(this%nverts)) ! vector of "next" interior unit-normal y coordinates defined for convenience allocate (wk1(this%nverts)) allocate (wk2(this%nverts)) allocate (xvals(3)) @@ -398,8 +395,8 @@ subroutine vertvelo(this) wk1 = this%xvertnext - this%xvert wk2 = this%yvertnext - this%yvert le = dsqrt(wk1 * wk1 + wk2 * wk2) - unex = -wk2 / le - uney = wk1 / le + unextx = -wk2 / le + unexty = wk1 / le ! Cell area areacell = area(this%xvert, this%yvert) @@ -434,11 +431,11 @@ subroutine vertvelo(this) wk1 = this%xvert - this%xctr wk2 = this%yvert - this%yctr li = dsqrt(wk1 * wk1 + wk2 * wk2) - unix = wk2 / li - uniy = -wk1 / li + unintx = wk2 / li + uninty = -wk1 / li ! Shifted arrays for convenience - unixnext = cshift(unix, 1) - uniynext = cshift(uniy, 1) + unextxnext = cshift(unintx, 1) + unextynext = cshift(uninty, 1) ! Midpoints of interior edges xmid = 5.d-1 * (this%xvert + this%xctr) @@ -465,18 +462,21 @@ subroutine vertvelo(this) ! Calculations at base value vm0i0 = 0.d0 call this%calc_thru_hcsum(vm0i0, divcell, le, li, lm, areasub, areacell, & - unix, uniy, unex, uney, unixnext, uniynext, & + unintx, uninty, unextx, unexty, & + unextxnext, unextynext, & kappax, kappay, vm0x, vm0y, vm1x, vm1y, hcsum0) ! Calculations at perturbed value vm0ival = vm0i0 + perturb call this%calc_thru_hcsum(vm0ival, divcell, le, li, lm, areasub, areacell, & - unix, uniy, unex, uney, unixnext, uniynext, & + unintx, uninty, unextx, unexty, & + unextxnext, unextynext, & kappax, kappay, vm0x, vm0y, vm1x, vm1y, hcsum) ! Calculations at root value jac = (hcsum - hcsum0) / perturb vm0ival = vm0i0 - hcsum0 / jac call this%calc_thru_hcsum(vm0ival, divcell, le, li, lm, areasub, areacell, & - unix, uniy, unex, uney, unixnext, uniynext, & + unintx, uninty, unextx, unexty, & + unextxnext, unextynext, & kappax, kappay, vm0x, vm0y, vm1x, vm1y, hcsum) ! Project linearly to get corner (vertex) velocities. Note that velocity @@ -494,12 +494,12 @@ subroutine vertvelo(this) ! Deallocate local arrays deallocate (le) - deallocate (unex) - deallocate (uney) + deallocate (unextx) + deallocate (unexty) deallocate (areasub) deallocate (li) - deallocate (unix) - deallocate (uniy) + deallocate (unintx) + deallocate (uninty) deallocate (xmid) deallocate (ymid) deallocate (lm) @@ -511,8 +511,8 @@ subroutine vertvelo(this) deallocate (vm0y) deallocate (vm1x) deallocate (vm1y) - deallocate (unixnext) - deallocate (uniynext) + deallocate (unextxnext) + deallocate (unextynext) deallocate (wk1) deallocate (wk2) deallocate (xvals) @@ -523,7 +523,8 @@ end subroutine vertvelo subroutine calc_thru_hcsum(this, vm0ival, divcell, & le, li, lm, areasub, areacell, & - unix, uniy, unex, uney, unixnext, uniynext, & + unintx, uninty, unextx, unexty, & + unintxnext, unintynext, & kappax, kappay, vm0x, vm0y, vm1x, vm1y, hcsum) ! dummy class(MethodCellTernaryType), intent(inout) :: this @@ -535,12 +536,12 @@ subroutine calc_thru_hcsum(this, vm0ival, divcell, & real(DP), dimension(:) :: lm real(DP), dimension(:) :: areasub real(DP) :: areacell - real(DP), dimension(:) :: unix - real(DP), dimension(:) :: uniy - real(DP), dimension(:) :: unex - real(DP), dimension(:) :: uney - real(DP), dimension(:) :: unixnext - real(DP), dimension(:) :: uniynext + real(DP), dimension(:) :: unintx + real(DP), dimension(:) :: uninty + real(DP), dimension(:) :: unextx + real(DP), dimension(:) :: unexty + real(DP), dimension(:) :: unintxnext + real(DP), dimension(:) :: unintynext real(DP), dimension(:) :: kappax real(DP), dimension(:) :: kappay real(DP), dimension(:) :: vm0x @@ -608,25 +609,25 @@ subroutine calc_thru_hcsum(this, vm0ival, divcell, & vm1i = cshift(vm0i, 1) ! Get centroid velocity by setting up and solving 2x2 linear system - uprod = unix * unex + uniy * uney + uprod = unintx * unextx + uninty * unexty det = DONE - uprod * uprod - bi0x = (unix - unex * uprod) / det - be0x = (unex - unix * uprod) / det - bi0y = (uniy - uney * uprod) / det - be0y = (uney - uniy * uprod) / det - uprod = unixnext * unex + uniynext * uney + bi0x = (unintx - unextx * uprod) / det + be0x = (unextx - unintx * uprod) / det + bi0y = (uninty - unexty * uprod) / det + be0y = (unexty - uninty * uprod) / det + uprod = unintxnext * unextx + unintynext * unexty det = DONE - uprod * uprod - bi1x = (unixnext - unex * uprod) / det - be1x = (unex - unixnext * uprod) / det - bi1y = (uniynext - uney * uprod) / det - be1y = (uney - uniynext * uprod) / det + bi1x = (unintxnext - unextx * uprod) / det + be1x = (unextx - unintxnext * uprod) / det + bi1y = (unintynext - unexty * uprod) / det + be1y = (unexty - unintynext * uprod) / det be01x = 5.d-1 * (be0x + be1x) be01y = 5.d-1 * (be0y + be1y) wt = areasub / areacell - emxx = DTWO - sum(wt * be01x * unex) - emxy = -sum(wt * be01x * uney) - emyx = -sum(wt * be01y * unex) - emyy = DTWO - sum(wt * be01y * uney) + emxx = DTWO - sum(wt * be01x * unextx) + emxy = -sum(wt * be01x * unexty) + emyx = -sum(wt * be01y * unextx) + emyy = DTWO - sum(wt * be01y * unexty) rx = sum(wt * (bi0x * vm0i + bi1x * vm1i + be01x * this%vne)) ry = sum(wt * (bi0y * vm0i + bi1y * vm1i + be01y * this%vne)) emdet = emxx * emyy - emxy * emyx @@ -634,7 +635,7 @@ subroutine calc_thru_hcsum(this, vm0ival, divcell, & this%vctry = (emxx * ry - emyx * rx) / emdet ! Get vm0e's using "known" conditions - vm0e = 5.d-1 * (this%vne + unex * this%vctrx + uney * this%vctry) + vm0e = 5.d-1 * (this%vne + unextx * this%vctrx + unexty * this%vctry) ! Get vm1e's from uniformity along exterior edges vm1e = vm0e @@ -668,8 +669,6 @@ subroutine calc_thru_hcsum(this, vm0ival, divcell, & deallocate (be01x) deallocate (be01y) - return - end subroutine calc_thru_hcsum end module MethodCellTernaryModule diff --git a/src/Solution/ParticleTracker/MethodDisv.f90 b/src/Solution/ParticleTracker/MethodDisv.f90 index 90a7a9c115c..c3170f38619 100644 --- a/src/Solution/ParticleTracker/MethodDisv.f90 +++ b/src/Solution/ParticleTracker/MethodDisv.f90 @@ -21,7 +21,6 @@ module MethodDisvModule public :: create_method_disv type, extends(MethodType) :: MethodDisvType - integer(I4B), pointer :: zeromethod !< root-finding method type(CellDefnType), pointer :: neighbor => null() !< ptr to a neighbor defn contains procedure, public :: apply => apply_disv !< apply the DISV-grid method @@ -53,12 +52,10 @@ subroutine create_method_disv(method) allocate (method) allocate (method%type) - allocate (method%zeromethod) call create_cell_poly(cell) method%cell => cell method%type = "disv" method%delegates = .true. - method%zeromethod = 0 call create_defn(method%neighbor) end subroutine create_method_disv @@ -106,7 +103,6 @@ subroutine load_disv(this, particle, next_level, submethod) trackfilectl=this%trackfilectl, & tracktimes=this%tracktimes) submethod => method_cell_tern - method_cell_tern%zeromethod = this%zeromethod else if (cell%defn%can_be_rect) then call cell_poly_to_rect(cell, rect) base => rect @@ -129,7 +125,6 @@ subroutine load_disv(this, particle, next_level, submethod) trackfilectl=this%trackfilectl, & tracktimes=this%tracktimes) submethod => method_cell_tern - method_cell_tern%zeromethod = this%zeromethod end if end if end select @@ -654,7 +649,7 @@ subroutine load_indicators(this, defn) defn%ispv180(1:npolyverts + 1) = .false. defn%can_be_rect = .false. defn%can_be_quad = .false. - epsang = 1d-3 ! todo AMP: consider tolerance + epsang = 1d-5 num90 = 0 num180 = 0 last180 = .false. diff --git a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 index a2a7e2fe5d1..213ce3850e0 100644 --- a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 @@ -37,12 +37,10 @@ subroutine create_method_subcell_ternary(method) type(SubcellTriType), pointer :: subcell allocate (method) - allocate (method%zeromethod) call create_subcell_tri(subcell) method%subcell => subcell method%type => method%subcell%type method%delegates = .false. - method%zeromethod = 0 end subroutine create_method_subcell_ternary !> @brief Deallocate the ternary subcell method @@ -212,12 +210,10 @@ subroutine track_subcell(this, subcell, particle, tmax) integer(I4B) :: izstatus integer(I4B) :: itopbotexit integer(I4B) :: ntmax - integer(I4B) :: nsave integer(I4B) :: isolv integer(I4B) :: itrifaceenter integer(I4B) :: itrifaceexit real(DP) :: tol - real(DP) :: step real(DP) :: dtexit real(DP) :: alpexit real(DP) :: betexit @@ -226,10 +222,8 @@ subroutine track_subcell(this, subcell, particle, tmax) integer(I4B) :: tslice(2) ntmax = 10000 - nsave = 1 ! needed??? - isolv = this%zeromethod - tol = 1d-7 - step = 1e-3 ! needed only for euler + isolv = particle%iexmethod + tol = particle%extol reason = -1 ! -- Set some local variables for convenience @@ -277,12 +271,10 @@ subroutine track_subcell(this, subcell, particle, tmax) ! -- Traverse triangular subcell itrifaceenter = particle%iboundary(3) - 1 if (itrifaceenter .eq. -1) itrifaceenter = 999 - call traverse_triangle(isolv, tol, step, & + call traverse_triangle(isolv, tol, & dtexitxy, alpexit, betexit, & itrifaceenter, itrifaceexit, & - rxx, rxy, ryx, ryy, & - alp0, bet0, alp1, bet1, alp2, bet2, alpi, beti, & - vziodz, az) + alp1, bet1, alp2, bet2, alpi, beti) ! -- Subcell has no exit face, terminate the particle ! todo: after initial release, consider ramifications diff --git a/src/Solution/ParticleTracker/Particle.f90 b/src/Solution/ParticleTracker/Particle.f90 index 9f905f1ca2f..0d13dac96be 100644 --- a/src/Solution/ParticleTracker/Particle.f90 +++ b/src/Solution/ParticleTracker/Particle.f90 @@ -60,6 +60,8 @@ module ParticleModule logical(LGP), public :: transformed !< whether coordinates have been transformed from model to local logical(LGP), public :: advancing !< whether particle is still being tracked for current time step integer(I4B), public :: ifrctrn !< whether to force solving the particle with the ternary method + integer(I4B), public :: iexmethod !< method for iterative solution of particle exit location and time in generalized Pollock's method + real(DP), public :: extol !< tolerance for iterative solution of particle exit location and time in generalized Pollock's method contains procedure, public :: get_model_coords procedure, public :: load_from_store @@ -90,6 +92,8 @@ module ParticleModule real(DP), dimension(:), pointer, contiguous :: tstop !< particle stop time real(DP), dimension(:), pointer, contiguous :: ttrack !< current tracking time integer(I4B), dimension(:), pointer, contiguous :: ifrctrn !< force ternary method + integer(I4B), dimension(:), pointer, contiguous :: iexmethod !< method for iterative solution of particle exit location and time in generalized Pollock's method + real(DP), dimension(:), pointer, contiguous :: extol !< tolerance for iterative solution of particle exit location and time in generalized Pollock's method contains procedure, public :: deallocate => deallocate_particle_store procedure, public :: resize => resize_store @@ -130,6 +134,8 @@ subroutine allocate_particle_store(this, np, mempath) call mem_allocate(this%istopweaksink, np, 'PLISTOPWEAKSINK', mempath) call mem_allocate(this%istopzone, np, 'PLISTOPZONE', mempath) call mem_allocate(this%ifrctrn, np, 'PLIFRCTRN', mempath) + call mem_allocate(this%iexmethod, np, 'PLIEXMETHOD', mempath) + call mem_allocate(this%extol, np, 'PLEXTOL', mempath) call mem_allocate(this%idomain, np, levelmax, 'PLIDOMAIN', mempath) call mem_allocate(this%iboundary, np, levelmax, 'PLIBOUNDARY', mempath) end subroutine allocate_particle_store @@ -156,6 +162,8 @@ subroutine deallocate_particle_store(this, mempath) call mem_deallocate(this%istopweaksink, 'PLISTOPWEAKSINK', mempath) call mem_deallocate(this%istopzone, 'PLISTOPZONE', mempath) call mem_deallocate(this%ifrctrn, 'PLIFRCTRN', mempath) + call mem_deallocate(this%iexmethod, 'PLIEXMETHOD', mempath) + call mem_deallocate(this%extol, 'PLEXTOL', mempath) call mem_deallocate(this%idomain, 'PLIDOMAIN', mempath) call mem_deallocate(this%iboundary, 'PLIBOUNDARY', mempath) end subroutine deallocate_particle_store @@ -185,6 +193,8 @@ subroutine resize_store(this, np, mempath) call mem_reallocate(this%istopweaksink, np, 'PLISTOPWEAKSINK', mempath) call mem_reallocate(this%istopzone, np, 'PLISTOPZONE', mempath) call mem_reallocate(this%ifrctrn, np, 'PLIFRCTRN', mempath) + call mem_reallocate(this%iexmethod, np, 'PLIEXMETHOD', mempath) + call mem_reallocate(this%extol, np, 'PLEXTOL', mempath) call mem_reallocate(this%idomain, np, levelmax, 'PLIDOMAIN', mempath) call mem_reallocate(this%iboundary, np, levelmax, 'PLIBOUNDARY', mempath) end subroutine resize_store @@ -227,6 +237,8 @@ subroutine load_from_store(this, store, imdl, iprp, ip) this%iboundary(1:levelmax) = & store%iboundary(ip, 1:levelmax) this%ifrctrn = store%ifrctrn(ip) + this%iexmethod = store%iexmethod(ip) + this%extol = store%extol(ip) end subroutine load_from_store !> @brief Update particle store from particle @@ -260,6 +272,8 @@ subroutine load_from_particle(this, particle, ip) 1:levelmax) = & particle%iboundary(1:levelmax) this%ifrctrn = particle%ifrctrn + this%iexmethod = particle%iexmethod + this%extol = particle%extol end subroutine load_from_particle !> @brief Apply the given global-to-local transformation to the particle. diff --git a/src/Solution/ParticleTracker/TernarySolveTrack.f90 b/src/Solution/ParticleTracker/TernarySolveTrack.f90 index 6cc39b82d4c..d5fb5318ef2 100644 --- a/src/Solution/ParticleTracker/TernarySolveTrack.f90 +++ b/src/Solution/ParticleTracker/TernarySolveTrack.f90 @@ -29,35 +29,24 @@ module TernarySolveTrack contains !> @brief Traverse triangular cell - subroutine traverse_triangle(isolv, tol, step, texit, & + subroutine traverse_triangle(isolv, tol, texit, & alpexit, betexit, & itrifaceenter, itrifaceexit, & - rxx, rxy, ryx, ryy, & - alp0, bet0, alp1, bet1, alp2, bet2, alpi, beti, & - vziodz, az) + alp1, bet1, alp2, bet2, alpi, beti) ! -- dummy integer(I4B), intent(in) :: isolv !< solution method real(DP), intent(in) :: tol !< solution tolerance - real(DP), intent(in) :: step !< stepsize for numerical methods real(DP), intent(out) :: texit !< time particle exits the cell real(DP) :: alpexit real(DP) :: betexit !< alpha and beta coefficients integer(I4B) :: itrifaceenter integer(I4B) :: itrifaceexit !< entry and exit faces - real(DP) :: rxx - real(DP) :: rxy - real(DP) :: ryx - real(DP) :: ryy !< rotation matrix - real(DP) :: alp0 - real(DP) :: bet0 real(DP) :: alp1 real(DP) :: bet1 real(DP) :: alp2 real(DP) :: bet2 real(DP) :: alpi real(DP) :: beti !< alpha and beta coefficients - real(DP) :: vziodz - real(DP) :: az ! -- local real(DP) :: texit0 real(DP) :: alpexit0 @@ -77,16 +66,13 @@ subroutine traverse_triangle(isolv, tol, step, texit, & ! -- Compute exit time (travel time to exit) and exit location call find_exit_bary(isolv, 0, itrifaceenter, & - alpi, beti, & - tol, step, vziodz, az, & + alpi, beti, tol, & texit0, alpexit0, betexit0) call find_exit_bary(isolv, 1, itrifaceenter, & - alpi, beti, & - tol, step, vziodz, az, & + alpi, beti, tol, & texit1, alpexit1, betexit1) call find_exit_bary(isolv, 2, itrifaceenter, & - alpi, beti, & - tol, step, vziodz, az, & + alpi, beti, tol, & texit2, alpexit2, betexit2) texit = min(texit0, texit1, texit2) @@ -337,8 +323,7 @@ subroutine step_analytical(t, alp, bet) !> @brief Find the exit time and location in barycentric coordinates. subroutine find_exit_bary(isolv, itriface, itrifaceenter, & - alpi, beti, & - tol, step, vziodz, az, & + alpi, beti, tol, & texit, alpexit, betexit) ! -- dummy integer(I4B) :: isolv @@ -347,9 +332,6 @@ subroutine find_exit_bary(isolv, itriface, itrifaceenter, & real(DP) :: alpi real(DP) :: beti real(DP) :: tol - real(DP) :: step - real(DP) :: vziodz - real(DP) :: az real(DP) :: texit real(DP) :: alpexit real(DP) :: betexit diff --git a/src/Utilities/MathUtil.f90 b/src/Utilities/MathUtil.f90 index 08c2f5975af..bdc974e88db 100644 --- a/src/Utilities/MathUtil.f90 +++ b/src/Utilities/MathUtil.f90 @@ -246,6 +246,11 @@ function zero_ch(x0, x1, f, epsa) result(z) !! this function subprogram is a slightly modified translation of !! the algol 60 procedure zero given in richard brent, algorithms for !! minimization without derivatives, prentice-hall, inc. (1973). + !! + !! This subroutine was obtained by the authors of MODFLOW 6 from + !! netlib.org with the understanding that it is freely available. It + !! has subsequently undergone minor modification to suit the current + !! application. !< function zero_br(ax, bx, f, tol) result(z) ! -- dummy diff --git a/src/meson.build b/src/meson.build index 803f89b4c34..839630a4206 100644 --- a/src/meson.build +++ b/src/meson.build @@ -183,7 +183,6 @@ modflow_sources = files( 'Model' / 'ParticleTracking' / 'prt.f90', 'Model' / 'ParticleTracking' / 'prt-fmi.f90', 'Model' / 'ParticleTracking' / 'prt-mip.f90', - 'Model' / 'ParticleTracking' / 'prt-obs.f90', 'Model' / 'ParticleTracking' / 'prt-oc.f90', 'Model' / 'ParticleTracking' / 'prt-prp.f90', 'Model' / 'ModelUtilities' / 'BoundaryPackage.f90', From a754f2fd8ecdb91ac9b911846ca562e4832a0806 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 17 May 2024 09:52:29 -0400 Subject: [PATCH 172/199] docs(supptechinfo): add new PRT chapter (#1817) Supplemental Technical Info chapter for PRT, courtesy of @aprovost-usgs --------- Co-authored-by: aprovost-usgs Co-authored-by: wpbonelli Co-authored-by: langevin-usgs --- doc/MODFLOW6References.bib | 46 +++++++++ doc/SuppTechInfo/Tables/mf6enhancements.tex | 2 + doc/SuppTechInfo/body.tex | 5 + doc/SuppTechInfo/particle-tracking-model.tex | 100 +++++++++++++++++++ 4 files changed, 153 insertions(+) create mode 100644 doc/SuppTechInfo/particle-tracking-model.tex diff --git a/doc/MODFLOW6References.bib b/doc/MODFLOW6References.bib index 9af53b27e12..0cab9e59186 100644 --- a/doc/MODFLOW6References.bib +++ b/doc/MODFLOW6References.bib @@ -3006,3 +3006,49 @@ @book{panday2019bct Title = {USG-Transport Version 1.4.0: The Block-Centered Transport Process for MODFLOW-USG}, Url = {http://www.gsi-net.com/en/software/free-software/USG-Transport.html}, Year = {2019}} +@article{zhang2012, + Author = {Zhang, Y and King, M J and Datta-Gupta, A}, + Date-Added = {2024-05-15 00:00:00 +0000}, + Doi = {10.1029/2011WR011396}, + Journal = {Water Resources Research}, + Title = {Robust streamline tracing using inter-cell fluxes in locally refined and unstructured grids}, + Volume = {48}, + Year = {2012}} + +@article{cordes1992, + Author = {Cordes C and Kinzelbach W}, + Date-Added = {2024-05-15 00:00:00 +0000}, + Doi = {10.1029/92WR01686}, + Journal = {Water Resources Research}, + Title = {Continuous groundwater velocity fields and path lines in linear, bilinear, and trilinear finite elements}, + Volume = {28}, + Pages = {2903--2911}, + Year = {1992}} + +@article{pollock2015, + Author = {Pollock, D W}, + Date-Added = {2024-05-15 00:00:00 +0000}, + Doi = {10.1111/gwat.123286}, + Journal = {Groundwater}, + Title = {Extending the MODPATH algorithm to rectangular unstructured grids}, + Volume = {54}, + Pages = {121--125}, + Year = {2015}} + +@article{bakker2016flopy, + author = {Bakker, M and Post, V and Langevin, C D and Hughes, J D and White, J T and Starn, J J and Fienen, M N}, + title = {Scripting MODFLOW Model Development Using Python and FloPy}, + journal = {Groundwater}, + Year = {2016}, + volume = {}, + number = {}, + pages = {}, + doi = {https://doi.org/10.1111/gwat.12413}} + +@book{flopysoftware, + author = {Bakker, M and Post, V and Hughes, J D and Langevin, C D and White, J T and Leaf, A T and Paulinski, S R and Bellino, J C and Morway, E D and Toews, M W and Larsen, J D and Fienen, M N and Starn, J J and Brenhoff, D A and Bonelli, W P},, + Date-Added = {2024-05-16 00:00:00 +0000}, + Series = {{U.S. Geological Survey Software Release}}, + Title = {FloPy v3.7.0dev0 (preliminary)}, + Year = {2024}, + Url = {https://doi.org/10.5066/F7BK19FH}} diff --git a/doc/SuppTechInfo/Tables/mf6enhancements.tex b/doc/SuppTechInfo/Tables/mf6enhancements.tex index b522563b49c..f16a8dbefa9 100644 --- a/doc/SuppTechInfo/Tables/mf6enhancements.tex +++ b/doc/SuppTechInfo/Tables/mf6enhancements.tex @@ -30,6 +30,8 @@ \rowcolor{Gray} Revised Parameterization of Transport for Combined Mobile and Immobile Domain Simulations & \ref{ch:sorption} & 6.4.2 & -- \\ Groundwater Energy (GWE) Model & \ref{ch:gwemodel} & 6.5.0 & -- \\ +\rowcolor{Gray} + Particle Tracking (PRT) Model & \ref{ch:prtmodel} & 6.5.0 & -- \\ \hline \end{tabular} \label{table:mf6enhance} diff --git a/doc/SuppTechInfo/body.tex b/doc/SuppTechInfo/body.tex index 03e75decfba..f49c7261456 100644 --- a/doc/SuppTechInfo/body.tex +++ b/doc/SuppTechInfo/body.tex @@ -59,6 +59,11 @@ \customlabel{ch:gwemodel}{\thechapno} \input{groundwater-energy-model.tex} +\newpage +\incchap +\SECTION{Chapter \thechapno. Particle Tracking Model} +\customlabel{ch:prtmodel}{\thechapno} +\input{particle-tracking-model.tex} \newpage \ifx\usgsdirector\undefined diff --git a/doc/SuppTechInfo/particle-tracking-model.tex b/doc/SuppTechInfo/particle-tracking-model.tex new file mode 100644 index 00000000000..9e23bf32b59 --- /dev/null +++ b/doc/SuppTechInfo/particle-tracking-model.tex @@ -0,0 +1,100 @@ + +The Particle Tracking (PRT) Model for \mf calculates three-dimensional, advective particle trajectories in flowing groundwater. The PRT Model is designed to work with the Groundwater Flow (GWF) Model \citep{modflow6gwf} for \mf, which simulates transient, three-dimensional groundwater flow. The PRT Model replicates much of the functionality of MODPATH 7 \citep{pollock2016modpath7} and offers support for a much broader class of unstructured grids. The PRT model uses the same spatial discretization used by the GWF Model, which may be represented using either a structured (DIS) or an unstructured (DISV) grid. The PRT Model can be run in the same simulation as the associated GWF Model or in a separate simulation that reads previously calculated flows from a binary budget file. The version of the PRT Model documented here does not support grids of DISU type, tracking of particles through advanced stress package features such as lakes or streams reaches, or exchange of particles between PRT models. The PRT Model simulates the forward tracking of particles; however, backward particle tracking is possible using a procedure described here for reversing simulated flows from a previous GWF simulation and using those flows as input to PRT. + +\subsection{Tracking Approach} \label{sec:trackingapproach} + +The Particle Tracking Model (PRT) Model solves for advective particle trajectories based on cell-cell flows calculated by the Groundwater Flow (GWF) Model. The overall approach to tracking a particle through a model cell is similar to that in MODPATH 7. + +\begin{itemize} +\item On each time step of the simulation, convert cell-cell flows on the faces of the cell that contains the particle to normal velocities (velocity components normal to the cell faces). The normal velocity is assumed to be uniform along each cell face. +\item Interpolate the normal-velocity information to enable calculation of a particle velocity at any point within the cell. +\item Solve analytically or semi-analytically for the particle trajectory through the cell. +\item Continue tracking the particle from cell to cell as necessary until the end of the time step or until the particle exits the model or terminates for another reason. +\end{itemize} + +The interpolation and solution method used by the PRT Model in a given cell depends on the geometry of the cell in plan view. + +\begin{itemize} +\item For rectangular cells, Pollock's method \citep{pollock2016modpath7} is used. +\item For cells adjacent to quad-refined cells subject to the constraints described in \citep{pollock2016modpath7}, Pollock's subcell method for quad refinement \citep{pollock2015} is used. +\item For all other \mf cells, a generalization of Pollock's method is used. The generalized method is described below. For rectangular cells, it is mathematically equivalent to Pollock's original method. +\end{itemize} + +\noindent On DISV grids, which can contain a mix of rectangular, quad-refined, and non-rectangular cells, the PRT Model identifies the geometry of each cell and applies the most efficient tracking method possible. Rectagular cells do not need to be aligned with the model coordinate axes to be recognized as rectangular. Because measures of the cell geometry are compared with numerical tolerances, it is recommended that the cell vertex coordinates be written to double precision in the model input for a DISV grid. + +By default, flows associated with stress packages are assumed to be distributed uniformly over the volume of a cell, as in MODPATH 7. Distributed external inflows and outflows are reflected in the cell-cell flows calculated by the GWF Model, but they are not directly involved in determining the normal face velocities used to track a particle through the cell. The user can optionally assign a flow associated with a stress package to any face of the cell. In MODPATH 7, this is done by setting the value of an input parameter called IFACE to a value that corresponds to one of the six faces of a rectangular cell (left, right, back, front, bottom, and top). In the PRT Model, assignment of external flows is done by setting the value of an input parameter called IFLOWFACE to a value that corresponds to one of the cell faces. To accommodate non-rectangular cells, the face numbering scheme in the PRT Model is different from that in MODPATH 7 and is based on clockwise ordering of the cell faces, as described in the \mf input instructions. + +\subsection{Generalized Pollock's Method For Non-Rectangular Cells} \label{sec:genpollockmethod} + +\cite{zhang2012} review particle tracking methods that ``extend the widely used velocity interpolation algorithms, such as Pollock's algorithm, to more complex geometries." They classify methods according to (1) whether the method refines a cell into subcells, (2) the basis functions used to interpolate velocity, (3) whether the interpolated velocity is continuous throughout a cell, (4) and whether the method is locally conservative. The generalization of Pollock's method used in the PRT Model is new as of this writing, but it is related to the methods reviewed by \cite{zhang2012} and fits into their classification as described below: + +\begin{itemize} +\item The new method used in the PRT Model subdivides a polygonal cell (in plan view) radially into triangular subcells. Each subcell has one edge that coincides with a cell edge and two edges that are internal to the cell. The number of subcells equals the number of faces of the polygonal cell, and all subcells share a vertex at the centroid of cell. +\item Cell-face normal velocities are used to calculate a velocity vector at each vertex of each subcell, including the shared cell-centroid vertex. The basis functions used to interpolate velocity within a subcell are relatively ``low-order" in that they are linear, and the normal velocity is assumed to be constant along the subcell edge that coincides with a cell edge. However, they allow the normal velocity to vary along subcell edges that are internal to the cell, making them more flexible than the lowest-order (``RT\textsubscript{0} space") functions described by \cite{zhang2012}. +\item Interpolated velocity vectors are discontinuous across boundaries between subcells in the sense that the component along the subcell boundary can be different on each side of the boundary. However, the normal component of velocity is continuous across subcell boundaries, as required by continuity of flow. The interpolated velocity is also continuous in the sense used by \cite{zhang2012}, which is that the subcells share a single cell-centroid velocity. Based on their testing of related methods, \cite{zhang2012} note that ``velocity continuity is not as important as local conservation for the purpose of streamline applications," i.e., particle tracking. +\item The new method is locally conservative. In mathematical terms, this means that the divergence of the velocity field is uniform through each subcell and the same in all subcells, thereby honoring the divergence for the cell as a whole. In practical terms, it means that subcells will not appear to contain external sources or sinks of water or storage effects if the cell as a whole does not contain external sources, sinks, or storage effects. This helps avoid artificial convergence or spreading apart of closely adjacent particle tracks. +\end{itemize} + +As in MODPATH 7, movement of a particle in the $z$ (vertical) direction is calculated independently from its movement in the $(x, y)$ (horizontal) plane \citep{pollock2016modpath7} . Therefore, the discussions of vertex velocities and the trajectory solution below focus on two-dimensional motion within the horizontal plane. + +\subsubsection{Calculation of vertex velocities} + +A single velocity vector ($x$ and $y$ velocity components) could be calculated at each cell vertex such that each vertex velocity respects the uniform normal velocity along each cell faces. A centroid velocity could then be calculated by averaging the vertex velocities. However, this approach would not be locally conservative. The additional degrees of freedom (velocity components to be calculated) that are need to allow local conservation can be introduced by using higher-order basis functions, but that approach typically requires expensive numerical integration of the particle trajectory \citep{zhang2012}. An alternative is to introduce the requisite additional degrees of freedom by allowing each subcell to have its own distinct velocity vector at the cell centroid, but that has the obvious disadvantage that the velocity is discontinuous at the cell centroid. The method used in the PRT Model is novel in that it uses relatively low-order basis functions that allow for semi-analytical solution of the particle trajectory, together with two velocities at each cell vertex (one for each of the two subcells that share the vertex) and a single cell-centroid velocity to provide sufficient degrees of freedom for local conservation. This approach can also accommodate the discontinuity in cell-face normal velocity that occurs when two cell faces meet at a $180^\circ$ angle, as occurs in quad-refined grids. + +For a cell with $N$ polygon faces, the degrees of freedom are $4N$ cell-vertex velocity components and $2$ cell-centroid velocity components, for a total of $4N + 2$ degrees of freedom. The constraints are $2N$ known cell-face normal velocities, $N$ continuity conditions (equality of normal components) along boundaries between subcells, $N - 1$ independent local conservation conditions (equality of divergences), $2$ constraints from setting the cell-centroid velocity to a weighted average of the cell-vertex velocities, and $1$ ``closure constraint," for a total of $4N + 2$ constraints, which matches the number of degrees of freedom. + +The closure constraint corresponds to Option 1 described by \cite{zhang2012} and is conceptually equivalent to the closure constraint used in Pollock's subcell method for quad refinement \citep{pollock2015}. It assumes that the velocity field in the cell is irrotational. This is a rigorous assumption provided the porosity and hydraulic conductivity are homogeneous throughout the cell, the hydraulic conductivity is isotropic, and density is uniform. In \mf, the porosity and hydraulic conductivity are homogeneous throughout a cell, but the hydraulic conductivity can be anisotropic and density can allowed to vary. Strictly speaking it is the head gradient, and not the velocity, that is irrotational in the general case. With 10:1 anisotropy, tests by \cite{zhang2012} of a low-order, locally conservative method with quadrilateral subcells showed ``negligible differences between the different closure constraints" they describe, which represent varying degrees of mathematical rigor. It is possible to incorporate a more mathematically rigorous closure constraint such as Option 2 presented by \cite{zhang2012}, which is due to \cite{cordes1992}, into the calculation of vertex velocities, but that has not been done in the version of the PRT Model described here. + +\subsubsection{Velocity Interpolation and Solution of the Particle Trajectory} + +As in Pollock's method \citep{pollock2016modpath7} for a rectangular cell, the velocity is assumed to vary linearly in space within a triangular subcell: + +\begin{equation} +v_{\tilde{x}} = \frac{d \tilde{x}}{dt} = v_{\tilde{x}}^{(0)} + w_{\tilde{x} \tilde{x}} \tilde{x} + + w_{\tilde{x} \tilde{y}} \tilde{y} +\label{eqn:vxlinear} +\end{equation} + +\noindent and + +\begin{equation} +v_{\tilde{y}} = \frac{d \tilde{y}}{dt} = v_{\tilde{y}}^{(0)} + w_{\tilde{y} \tilde{x}} \tilde{x} + + w_{\tilde{y} \tilde{y}} \tilde{y} , +\label{eqn:vylinear} +\end{equation} + +\noindent where $t$ is time ($T$), subscripted $v$ indicates a velocity component ($L/T$) in the $\tilde{x}$ or $\tilde{y}$ direction, and $\tilde{x}$ and $\tilde{y}$ are Cartesian coordinates ($L$) with their origin at one of the subcell vertices that corresponds to a cell vertex, and rotated such that the $\tilde{y} = 0$ axis coincides with the cell face. Because the normal velocity is assumed to be uniform along the cell face, the coefficient $w_{\tilde{y} \tilde{x}}$ in equation \ref{eqn:vylinear} is zero, eliminating the dependence of equation \ref{eqn:vylinear} on $\tilde{x}$ and allowing it to be integrated analytically, independently of equation \ref{eqn:vxlinear}. The resulting expression for $\tilde{y}$ as a function of time can then be substituted into equation \ref{eqn:vxlinear} to yield an equation that can, once again, be integrated analytically to yield an expression for $\tilde{x}$ as a function of time. The particular forms of the analytical expressions depend on the values of and relationships between the coefficients in equations \ref{eqn:vxlinear} and \ref{eqn:vylinear}, and there are a number of special cases to consider. In any case, equipped with the appropriate expressions, one could guess a value of $t$, analytically calculate the corresponding values of $\tilde{x}$ and $\tilde{y}$, and continue updating one's guesses for $t$ until the point ($\tilde{x}$, $\tilde{y}$) landed on a subcell boundary, at which point the exit time and location of the particle would be known. + +To facilitate the identification of possible exit faces and bounding of possible solutions, and to streamline the solution procedure, the generalized Pollock's method transforms equations \ref{eqn:vxlinear} and \ref{eqn:vylinear} into nonorthogonal coordinates $\alpha$ and $\beta$ that correspond to barycentric coordinates on the triangular subcell. The coordinate transformation is linear and results in a pair of ordinary differential equations of the same general form as equations \ref{eqn:vxlinear} and \ref{eqn:vylinear}, with $\alpha$ and $\beta$ taking the places of $\tilde{x}$ and $\tilde{y}$, respectively. The equation for $\beta$ is effectively decoupled from the equation for $\alpha$, which ultimately allows $\alpha$ and $\beta$ to be expressed explicitly as functions of time. + +Because of its relatively simple form, the expression for $\beta$ can be inverted to yield an expression for $t$ as a function of $\beta$. Evaluating the subcell face that corresponds to $\beta = 0$ (the cell face) as a possible exit face for the particle is then simply a matter of calculating the exit time by substituting $\beta = 0$ into the expression for $t$. (A negative exit time indicates that that is not an exit face.) Evaluating the subcell face that corresponds to $\alpha = 0$ (one of the subcell faces internal to the cell) is essentially a one-dimensional root-finding exercise: for a given value of $\beta$, one evaluates $t$ and then $\alpha$, and iteration on $\beta$ continues until $\alpha = 0$ is solved. Evaluating the second subcell face internal to the cell as a possible exit face can be formulated as a similar root-finding problem. Because finding the root involves numerical iteration, the method is considered semi-analytical. + +\subsection{Packages} \label{sec:packages} + +The Model Input (MIP) Package is used to specify properties of the model cells: porosity and, optionally, a retardation factor that modifies particle velocities and a zone number that can be used to define particle termination criteria. + +Particles are released into the model using the Particle Release Point (PRP) Package. Multiple PRP packages can be defined for a given PRT model. Each PRP package, which corresponds roughly to a ``particle group" in MODPATH 7 \citep{pollock2016modpath7}, specifies tracking parameters and release locations and times for the particles it releases. + +The Flow Model Interface (FMI) Package provides groundwater-flow information to the PRT Model. If a PRT model is run in the same simulation as the corresponding GWF model, the FMI Package provides updated flow information from the GWF model to the PRT model on each time step. If the PRT model is run is a separate simulation, the FMI Package reads flow information from the binary budget and head files written during the flow simulation. + +\subsection{Exchanges} \label{sec:exchanges} + +The GWF-PRT Exchange establishes the link between a PRT model and its corresponding GWF model when the two models are run in the same simulation. As the version of the PRT Model described here does not support exchange of particles from one model to another, a PRT-PRT Exchange has not been implemented. + +\subsection{Backward Tracking} \label{sec:backwardtracking} + +Unlike MODPATH 7, the PRT Model does not include an option for ``backward tracking," i.e., tracking of particles backward in time. However, backward tracking can be performed by running a GWF Model flow simulation, reversing the order of the flow budget and head information written to the binary budget and head files, and then running a PRT Model simulation based on the reversed budget and head files. To facilitate the process, FloPy \citep{bakker2016flopy, hughes2023flopy, flopysoftware}, a collection of python scripts that offers full support for preprocessing and postpostcessing \mf simulations, offers a utility to reverse binary budget and head files. + +\subsection{Summary of Main Assumptions and Limitations} + +The following is a list of the main assumptions and limitations of the PRT Model for \mf documented here: + +\begin{itemize} +\item Particle tracks calculated by the PRT Model take into account advective motion only. Diffusive or dispersive transport of particles is not simulated. +\item The PRT Model uses the same spatial discretization used by the GWF Model, which may be represented using either a structured (DIS) or an unstructured (DISV) grid. Grids of DISU type are not supported. +\item Tracking of particles through advanced stress package features such as lakes and streams reaches and exchange of particles between PRT models is not supported. +\item ``Backward tracking" is not supported explicitly. However, backward tracking can be performed by preprocessing the binary budget and head files to reverse the chronological order of the flow and head information. FloPy \citep{bakker2016flopy, hughes2023flopy, flopysoftware} provides utilities for this. +\item For non-rectagular cells, a generalization of Pollock's method is used. This method is based on refinement of a polygon cell (in plan view) into triangular subcells, with a linear variation of velocity within each subcell that honors the cell-face normal flows generated by the associated GWF Model. Exit location and time are generally solved using an iterative, one-dimensional root-finding procedure, making the method semi-analytical. +\item Cell-face normal velocities are assumed to be uniform along each cell face, as in Pollock's original method. This ``low-order" approximation has the advantage of preventing particles from crossing no-flow faces at the outer boundary of a model. +\item As in the methods described by \cite{zheng2012}, variations in fluid density are not accounted for when enforcing local conservation. +\item The ``closure constraint" used in calculating cell-vertex velocities is approximate in the case of anisotropic hydraulic conductivity and/or variable density. It is conceptually equivalent to the closure closure constraint used in Pollock's subcell method for quad refinement \citep{pollock2015}. +\item For a triangular cell, the generalized Pollock's method could be used to calculate the particle trajectory without refinement into triangular subcells. This would improve computational efficiency for triangular cells and will likely be programmed in a future version of the PRT Model. +\end{itemize} From ed2eec363009146e6c193a3b9b584a5dcfaaf634 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 17 May 2024 10:48:31 -0400 Subject: [PATCH 173/199] docs(prt): describe particle track output, misc revisions (#1818) Add sections describing particle track binary and CSV output files Co-authored-by: aprovost-usgs --- doc/mf6io/body.tex | 2 +- doc/mf6io/framework/binaryoutput.tex | 56 ++++++++++++++++++++ doc/mf6io/mf6output.tex | 8 +-- doc/mf6io/mf6switches.tex | 2 +- doc/mf6io/prt/prt.tex | 79 ++++++++++++++++++++++++++-- 5 files changed, 138 insertions(+), 9 deletions(-) diff --git a/doc/mf6io/body.tex b/doc/mf6io/body.tex index 47ee537860a..896eebed00a 100644 --- a/doc/mf6io/body.tex +++ b/doc/mf6io/body.tex @@ -52,7 +52,7 @@ %PRT Model Input Instructions \newpage -\SECTION{Particle Tracking (PRT) Model Input} +\SECTION{Particle Tracking (PRT) Model Input and Output} \input{prt/prt.tex} %SWF Model Input Instructions diff --git a/doc/mf6io/framework/binaryoutput.tex b/doc/mf6io/framework/binaryoutput.tex index f387de27b17..bd75a4717e0 100644 --- a/doc/mf6io/framework/binaryoutput.tex +++ b/doc/mf6io/framework/binaryoutput.tex @@ -653,6 +653,28 @@ \subsubsection{GWT Model LKT, MWT, SFT, and UZT Packages} For each stress period, time step, and data type that is saved to the LKT, MWT, SFT, and UZT Packages binary output files as \texttt{IMETH=6} budget file type. For all advanced transport packages, \texttt{NDIM1} is equal to the number of nodes, \texttt{NDIM2} is equal to 1, and \texttt{NDIM3} is equal to -1. The data that are written to the LKT, MWT, SFT, and UZT Package binary files are mass flows with entries similar to those listed in Tables~\ref{table:binarylak} to~\ref{table:binaryuzf} for the advanced flow packages. +\newpage +\subsubsection{Budget File Contents for the PRT Model} + +The type of information that is written to the budget file depends on whether or not the save flags are set. Table \ref{table:prtbud} contains a list of the types of information that may be contained in a PRT Model budget file. In all cases, the flows in table \ref{table:prtbud} are particle mass flows (in mass per time) to or from a PRT Model cell. Intercell flows are written as FLOW-JA-FACE using IMETH=1. + +The remaining flow terms in table \ref{table:prtbud} are all written using IMETH=6. When IMETH=6 is used, the records contain additional text descriptors and two identifying numbers. For all records in the PRT Model budget file, TXT1ID1 is the name of the PRT Model and TXT2ID1 is also the name of the PRT Model. These text identifiers describe what is contained in ID1. For the PRT Model budget file, ID1 is the cell or node number in the PRT Model grid. The second set of text identifiers refer to the information in ID2. Unless noted otherwise in the description in table \ref{table:prtbud}, TXT1ID2 is the name of the PRT Model, TXT2ID2 is the name of the package, and ID2 is the bound number in the package. + +\begin{longtable}{p{3.5cm} p{2cm} p{9cm}} +\caption{Types of information that may be contained in the PRT Model budget file. All terms represent particle mass flows in dimensions of mass per time} +\tabularnewline +\hline +\textbf{Flow Type (TEXT)} & \textbf{Method Code (IMETH)} & \textbf{Description} \\ +\hline +\endhead +\hline +\endfoot +\texttt{FLOW-JA-FACE} & 1 & intercell particle mass flow; array of size (NJA) \\ +\texttt{PRP} & 6 & particle mass flow for particle releases \\ +\label{table:prtbud} +\end{longtable} + + \newpage \subsection{Observation Output File} @@ -681,3 +703,37 @@ \subsection{Observation Output File} \item \texttt{TIME} (floating-point) is the simulation time; and \item \texttt{SIMVALUE} (floating-point) is the simulated value. \end{description} + + +\newpage +\subsection{Particle Track File} + +The binary particle track file for the PRT Model contains particle track output data. The file +contains raw binary data and does not contain headers. The information needed to parse the binary +file is contained in a separate header file, which is a text file of the same name as the binary +file, with the extra extension ``.hdr''. The header file lists column headings that define the +tabular data format to be used in parsing the binary data. + +Each record in the binary data file consists of the following fields, which are defined in the +Particle Track Output subsection of the Particle Tracking (PRT) Model Input and Output section: + +\vspace{5mm} +\noindent Field 0: \texttt{`KPER'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Field 1: \texttt{`KSTP'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Field 2: \texttt{`IMDL'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Field 3: \texttt{`IPRP'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Field 4: \texttt{`IRPT'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Field 5: \texttt{`ILAY'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Field 6: \texttt{`ICELL'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Field 7: \texttt{`IZONE'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Field 8: \texttt{`ISTATUS'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Field 9: \texttt{`IREASON'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Field 10: \texttt{`TRELEASE'} {\color{red} \footnotesize{DOUBLE}} \\ +\noindent Field 11: \texttt{`T'} {\color{red} \footnotesize{DOUBLE}} \\ +\noindent Field 12: \texttt{`X'} {\color{red} \footnotesize{DOUBLE}} \\ +\noindent Field 13: \texttt{`Y'} {\color{red} \footnotesize{DOUBLE}} \\ +\noindent Field 14: \texttt{`Z'} {\color{red} \footnotesize{DOUBLE}} \\ +\noindent Field 15: \texttt{`NAME'} {\color{red} \footnotesize{CHARACTER(LEN=LENTXT)}} \\ + +\vspace{4mm} +\noindent The ``NAME'' field may be empty. diff --git a/doc/mf6io/mf6output.tex b/doc/mf6io/mf6output.tex index e853e5d2b3a..6f57def594e 100644 --- a/doc/mf6io/mf6output.tex +++ b/doc/mf6io/mf6output.tex @@ -5,7 +5,7 @@ VERSION 6.5.0.dev2 (preliminary) 02/13/2024 ***DEVELOP MODE*** - MODFLOW 6 compiled May 16 2024 17:04:31 with GCC version 11.4.0 + MODFLOW 6 compiled May 17 2024 07:54:54 with GCC version 11.4.0 This software is preliminary or provisional and is subject to revision. It is being provided to meet the need for timely best @@ -21,15 +21,15 @@ MODFLOW runs in SEQUENTIAL mode - Run start date and time (yyyy/mm/dd hh:mm:ss): 2024/05/16 18:30:39 + Run start date and time (yyyy/mm/dd hh:mm:ss): 2024/05/17 10:08:23 Writing simulation list file: mfsim.lst Using Simulation name file: mfsim.nam Solving: Stress period: 1 Time step: 1 - Run end date and time (yyyy/mm/dd hh:mm:ss): 2024/05/16 18:30:39 - Elapsed run time: 0.021 Seconds + Run end date and time (yyyy/mm/dd hh:mm:ss): 2024/05/17 10:08:23 + Elapsed run time: 0.013 Seconds Normal termination of simulation. \end{lstlisting} diff --git a/doc/mf6io/mf6switches.tex b/doc/mf6io/mf6switches.tex index 197cc622898..6ea1d3dd771 100644 --- a/doc/mf6io/mf6switches.tex +++ b/doc/mf6io/mf6switches.tex @@ -1,6 +1,6 @@ {\small \begin{lstlisting}[style=modeloutput] -mf6 - MODFLOW 6.5.0.dev2 (preliminary) 02/13/2024 (compiled May 16 2024 17:04:31) +mf6 - MODFLOW 6.5.0.dev2 (preliminary) 02/13/2024 (compiled May 17 2024 07:54:54) usage: mf6 run MODFLOW 6 using "mfsim.nam" or: mf6 [options] retrieve program information diff --git a/doc/mf6io/prt/prt.tex b/doc/mf6io/prt/prt.tex index 6412ecca912..eb9449a6a04 100644 --- a/doc/mf6io/prt/prt.tex +++ b/doc/mf6io/prt/prt.tex @@ -11,12 +11,85 @@ \subsection{Units of Length and Time} The PRT Model formulates the particle trajectory equations without using prescribed length and time units. Any consistent units of length and time can be used when specifying the input data for a simulation. This capability gives a certain amount of freedom to the user, but care must be exercised to avoid mixing units. The program cannot detect the use of inconsistent units. -\subsection{Particle Mass Budget} -A summary of all inflow (sources) and outflow (sinks) of particle mass is called a mass budget. The particle mass budget is printed to the PRT Model Listing File for selected time steps. In the current implementation, each particle is assigned unit mass, and the numerical value of the flow can be interpreted as particles per time. - \subsection{Time Stepping} In \mf time step lengths are controlled by the user and specified in the Temporal Discretization (TDIS) input file. When the flow model and particle-tracking model run in the same simulation, the time step length specified in TDIS is used for both models. If the PRT Model runs in a separate simulation, the time discretization may differ. Instructions for specifying time steps are described in the TDIS section of this user guide; additional information on GWF and PRT configurations are in the Flow Model Interface section. +\subsection{Particle Mass Budget} +A summary of all inflow (sources) and outflow (sinks) of particle mass is called a mass budget. The particle mass budget is printed to the PRT Model Listing File for selected time steps. In the current implementation, each particle is assigned unit mass, and the numerical value of the flow can be interpreted as particles per time. + +\subsection{Particle Track Output} + +The PRT Model supports both binary and CSV particle track output files. A particle track CSV file contains the output data in tabular format. The first line of the CSV file contains column names. Each subsequent line in the file contains a row of data for a single particle track record, with the following fields: + +\vspace{5mm} +\noindent Column 0: \texttt{`KPER'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Column 1: \texttt{`KSTP'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Column 2: \texttt{`IMDL'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Column 3: \texttt{`IPRP'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Column 4: \texttt{`IRPT'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Column 5: \texttt{`ILAY'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Column 6: \texttt{`ICELL'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Column 7: \texttt{`IZONE'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Column 8: \texttt{`ISTATUS'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Column 9: \texttt{`IREASON'} {\color{red} \footnotesize{INTEGER}} \\ +\noindent Column 10: \texttt{`TRELEASE'} {\color{red} \footnotesize{DOUBLE}} \\ +\noindent Column 11: \texttt{`T'} {\color{red} \footnotesize{DOUBLE}} \\ +\noindent Column 12: \texttt{`X'} {\color{red} \footnotesize{DOUBLE}} \\ +\noindent Column 13: \texttt{`Y'} {\color{red} \footnotesize{DOUBLE}} \\ +\noindent Column 14: \texttt{`Z'} {\color{red} \footnotesize{DOUBLE}} \\ +\noindent Column 15: \texttt{`NAME'} {\color{red} \footnotesize{CHARACTER(LEN=LENTXT)}} \\ + +\vspace{2mm} +\noindent where + +\begin{description} \itemsep0pt \parskip0pt \parsep0pt +\item \texttt{KPER} is the stress period number +\item \texttt{KSTP} is the time step number +\item \texttt{IMDL} is the number of the model the particle originated in +\item \texttt{IPRP} is the number of the particle release point (PRP) package the particle originated in +\item \texttt{IRPT} is the release point number +\item \texttt{ILAY} is the layer number +\item \texttt{ICELL} is the cell number +\item \texttt{IZONE} is the zone number +\item \texttt{ISTATUS} is the particle status code +\item \texttt{IREASON} is the reporting reason code +\item \texttt{TRELEASE} is the particle release time +\item \texttt{T} is the particle tracking time +\item \texttt{X} is the particle x coordinate +\item \texttt{Y} is the particle y coordinate +\item \texttt{Z} is the particle z coordinate +\item \texttt{NAME} is the name of the particle release point +\end{description} + +The ISTATUS field indicates the status of the particle: + +\begin{description} \itemsep0pt \parskip0pt \parsep0pt +\item \texttt{0}: particle was released +\item \texttt{1}: particle is being actively tracked +\item \texttt{2}: particle terminated at a boundary face +\item \texttt{3}: particle terminated in a weak sink cell +\item \texttt{4}: \textit{unused} +\item \texttt{5}: particle terminated in a cell with no exit face +\item \texttt{6}: particle terminated in a stop zone +\item \texttt{7}: particle terminated in an inactive cell +\item \texttt{8}: particle terminated immediately upon release into a dry cell +\item \texttt{9}: particle terminated in a subcell with no exit face +\end{description} + +The IREASON field indicates the reason the particle track record was saved: + +\begin{description} \itemsep0pt \parskip0pt \parsep0pt +\item \texttt{0}: particle was released +\item \texttt{1}: particle exited a cell +\item \texttt{2}: time step ended +\item \texttt{3}: particle terminated +\item \texttt{4}: particle exited a weak sink cell +\item \texttt{5}: user-specified tracking time +\end{description} + +By default, the PRT Model reports all particle events. The user can optionally select which events are reported, as explained in the Output Control (OC) subsection. Because multiple tracking events may coincide (e.g. exiting a cell and exiting a weak sink cell), particle track records may be duplicates except for the ISTATUS and/or IREASON codes. + +The binary particle track file contains the same particle track data in a record-based binary format explained in the Particle Track File subsection of the Description of Binary Output Files section. \newpage From 2252ed1492405020244f56ddda6dfdba0e05460a Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 17 May 2024 12:47:26 -0400 Subject: [PATCH 174/199] test: remove unneeded large marker (#1820) Co-authored-by: wpbonelli --- autotest/pytest.ini | 1 - autotest/test_largetestmodels.py | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/autotest/pytest.ini b/autotest/pytest.ini index 51107cbaaad..ead5d4c4ff1 100644 --- a/autotest/pytest.ini +++ b/autotest/pytest.ini @@ -6,7 +6,6 @@ python_files = markers = slow: tests taking more than a few seconds to complete repo: tests using models loaded from an external repository - large: tests using large models (examples and largetestmodels) regression: tests comparing results from different versions developmode: tests that should only run with IDEVELOPMODE = 1 gwf: tests for groundwater flow models diff --git a/autotest/test_largetestmodels.py b/autotest/test_largetestmodels.py index 36fcb5b91de..08a49133634 100644 --- a/autotest/test_largetestmodels.py +++ b/autotest/test_largetestmodels.py @@ -17,9 +17,8 @@ ] -@pytest.mark.large -@pytest.mark.repo @pytest.mark.regression +@pytest.mark.repo @pytest.mark.slow def test_model( function_tmpdir, From 23921d480c01da12c2648081cd3c176438b265ae Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Fri, 17 May 2024 10:03:03 -0700 Subject: [PATCH 175/199] docs(supptechinfo): minor edits to GWE chapter (chap. 10) (#1819) --- doc/SuppTechInfo/groundwater-energy-model.tex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/SuppTechInfo/groundwater-energy-model.tex b/doc/SuppTechInfo/groundwater-energy-model.tex index a5e29fbba6b..075102fb846 100644 --- a/doc/SuppTechInfo/groundwater-energy-model.tex +++ b/doc/SuppTechInfo/groundwater-energy-model.tex @@ -1,5 +1,5 @@ -The Groundwater Energy (GWE) Model for \mf simulates three-dimensional transport of thermal energy in flowing groundwater based on a generalized control-volume finite-difference approach. The GWE Model is designed to work with the Groundwater Flow (GWF) Model \citep{modflow6gwf} for \mf, which simulates transient, three-dimensional groundwater flow. The version of the GWE model documented here must use the same spatial discretization used by the GWF Model; however, that spatial discretization can be represented by regular MODFLOW grids consisting of layers, rows, and columns, or by more general unstructured grids. The GWE Model simulates (1) advective transport, (2) the combined hydrodynamic dispersion processes of velocity-dependent mechanical dispersion and thermal conduction in groundwater, (3) thermal conduction in the solid aquifer material, (4) storage of thermal energy in the groundwater and solid aquifer material, (5) thermal equilibration between the groundwater and solid aquifer material, (5) zero-order decay or production of thermal energy in the groundwater and the solid, (6) mixing from groundwater sources and sinks, and (7) direct addition or removal of thermal energy. The GWE Model can also represent advective energy transport through advanced package features, such as streams, lakes, multi-aquifer wells, and the unsaturated zone. If the GWE Model application uses the Water Mover (MVR) Package to connect flow packages, then energy transport between these packages can also be represented. The transport processes described here have been implemented in a fully implicit manner and are solved in a system of equations using iterative numerical methods. The present version of the GWE Model for \mf does not have an option to calculate steady-state transport solutions; if a steady-state solution is required, then transient evolution of the temperature must be represented using multiple time steps until no further significant changes in temperature are detected. +The Groundwater Energy (GWE) Model for \mf simulates three-dimensional transport of thermal energy in flowing groundwater based on a generalized control-volume finite-difference approach. The GWE Model is designed to work with the Groundwater Flow (GWF) Model \citep{modflow6gwf} for \mf, which simulates transient, three-dimensional groundwater flow. The version of the GWE model documented here must use the same spatial discretization used by the GWF Model; however, that spatial discretization can be represented by regular MODFLOW grids consisting of layers, rows, and columns, or by more general unstructured grids. The GWE Model simulates (1) advective transport, (2) the combined hydrodynamic dispersion processes of velocity-dependent mechanical dispersion and thermal conduction in groundwater, (3) thermal conduction in the solid aquifer material, (4) storage of thermal energy in the groundwater and solid aquifer material, (5) thermal equilibration between the groundwater and solid aquifer material, (5) zero-order decay or production of thermal energy in the groundwater and the solid, (6) mixing from groundwater sources and sinks, and (7) direct addition or removal of thermal energy. The GWE Model can also represent advective energy transport through advanced package features, such as streams, lakes, multi-aquifer wells, and the unsaturated zone. If the GWF Model that provides the flow field for a GWE Model uses the Water Mover (MVR) Package to connect flow packages, then energy transport between these packages can also be represented by activating the Mover Energy Transport (MVE) Package. The transport processes described here have been implemented in a fully implicit manner and are solved in a system of equations using iterative numerical methods. The present version of the GWE Model for \mf does not have an option to calculate steady-state transport solutions; if a steady-state solution is required, then transient evolution of the temperature must be represented using multiple time steps until no further significant changes in temperature are detected. Finally, temperatures calculated by a GWE Model may be used in the Buoyancy (BUY) and Viscosity (VSC) Packages. Instructions provided in the \mf Description of Input and Output document explain how pass GWE-calculated temperatures to BUY and VSC. Transport of thermal energy is sometimes simulated using a solute-transport model. In this approach, which takes advantage of the close analogy between the governing equations for thermal-energy transport and solute transport, the solute-transport model is run with values of input parameters that have been scaled to render the governing equation representative of thermal-energy transport \citep{thorne2006, hechtmendez, mazheng2010}. The GWT Model for \mf can be used in this way. However, the new GWE Model offers the following advantages: model input and output in terms of parameters and in units that relate directly to thermal-energy transport; variation of bulk thermal conductivity with changing saturation; and simulation of thermal conduction through the solid matrix, even in dry cells. @@ -19,7 +19,7 @@ \subsection{Mathematical Model} \label{sec:mathmodel} \end{aligned} \end{equation} -\noindent The two terms on the left-hand side of equation \ref{eqn:pdegwe} represent the rates of change in thermal energy storage in the water and the solid matrix, respectively. The six terms on the right-hand side of equation \ref{eqn:pdegwe} represent the rates at which thermal energy is advected, dispersed and/or conducted, added or removed by groundwater inflows or outflows, added or removed directly to or from the water, produced/decayed in the water, and produced/decayed in the solid matrix, respectively. The parameters and variables in equation \ref{eqn:pdegwe} are defined as follows: $S_w$ is the water saturation (dimensionless) defined as the volume of water per volume of voids; $\theta$ is the effective porosity, defined as volume of voids participating in transport per unit volume of aquifer; $\rho_w$ and $\rho_s$ are the densities ($M/L^3$) of the water and solid-matrix material, respectively; $C_{pw}$ and $C_{ps}$ are the specific heats ($E/(M \, deg)$) of the water and solid-matrix material, respectively; $T$ is temperature ($deg$); $t$ is time ($T$); $\matr{q}$ is the vector of specific discharge ($L/T$); $\matr{D}_T$ is the second-order tensor of hydrodynamic dispersion coeffiients for thermal energy transport ($L^2/T$); $q'_s$ is the volumetric flow rate per unit volume of aquifer (defined as positive for flow into the aquifer) for fluid sources and sinks ($1/T$), $T_s$ is the temperature of the source or sink fluid ($deg$), $E_s$ is rate of energy loading per unit volume of aquifer ($M/L^3T$), $E_a$ is rate of energy exchange with advanced stress packages ($M/L^3T$), $\gamma_{1w}$ is the zero-order energy decay rate coefficient in the water ($E/L^3T$), and $\gamma_{1s}$ is the zero-order energy decay rate coefficient in the solid ($E/MT$). Note that $\gamma_{1w}$ is defined on a per-volume-of-water basis, whereas $\gamma_{1s}$ is defined on a per-mass-of-solid basis. Note that $\rho_w$, $\rho_s$, $C_{pw}$, and $C_{ps}$ are assumed to remain constant with time, although the solid properties can vary spatially from cell to cell. +\noindent The two terms on the left-hand side of equation \ref{eqn:pdegwe} represent the rates of change in thermal energy storage in the water and the solid matrix, respectively. The six terms on the right-hand side of equation \ref{eqn:pdegwe} represent the rates at which thermal energy is advected, dispersed and/or conducted, added or removed by groundwater inflows or outflows, added or removed directly to or from the water, produced/decayed in the water, and produced/decayed in the solid matrix, respectively. The parameters and variables in equation \ref{eqn:pdegwe} are defined as follows: $S_w$ is the water saturation (dimensionless) defined as the volume of water per volume of voids; $\theta$ is the effective porosity, defined as volume of voids participating in transport per unit volume of aquifer; $\rho_w$ and $\rho_s$ are the densities ($M/L^3$) of the water and solid-matrix material, respectively; $C_{pw}$ and $C_{ps}$ are the specific heat capacities ($E/(M \, deg)$) of the water and solid-matrix material, respectively; $T$ is temperature ($deg$); $t$ is time ($T$); $\matr{q}$ is the vector of specific discharge ($L/T$); $\matr{D}_T$ is the second-order tensor of hydrodynamic dispersion coefficients for thermal energy transport ($L^2/T$); $q'_s$ is the volumetric flow rate per unit volume of aquifer (defined as positive for flow into the aquifer) for fluid sources and sinks ($1/T$), $T_s$ is the temperature of the source or sink fluid ($deg$), $E_s$ is rate of energy loading per unit volume of aquifer ($M/L^3T$), $E_a$ is rate of energy exchange with advanced stress packages ($M/L^3T$), $\gamma_{1w}$ is the zero-order energy decay rate coefficient in the water ($E/L^3T$), and $\gamma_{1s}$ is the zero-order energy decay rate coefficient in the solid ($E/MT$). Note that $\gamma_{1w}$ is defined on a per-volume-of-water basis, whereas $\gamma_{1s}$ is defined on a per-mass-of-solid basis. Note that $\rho_w$, $\rho_s$, $C_{pw}$, and $C_{ps}$ are assumed to remain constant with time, although the solid properties can vary spatially from cell to cell. Equation \ref{eqn:pdegwe} is closely analogous to the equation solved by the Groundwater Transport (GWT) Model for solute transport \citep{modflow6gwt}, with the following differences: @@ -112,7 +112,7 @@ \subsubsection{Conduction and Dispersion (CND) Package} \subsubsection{Advanced Stress Packages} -The version of the GWE Model described here offers four advanced stress packages, each of which is analogous and functions similarly to an advanced package in the GWT Model: Lake Energy Transport (LKE), Multi-Aquifer Well Energy Transport (MWE), Streamflow Energy Transport (SFE), and Unsaturated Zone Energy Transport (UZE). The GWE advanced stress packages will not be described in detail here except to note differences from the corresponding GWT packages. The primary difference, of course, is that GWE advanced stress packages deal with transport of thermal energy, not solute mass. +The version of the GWE Model described here offers four advanced stress packages, each of which is analogous and functions similarly to an advanced package in the GWT Model: Lake Energy Transport (LKE), Multi-Aquifer Well Energy Transport (MWE), Streamflow Energy Transport (SFE), and Unsaturated Zone Energy Transport (UZE). The GWE advanced stress packages will not be described in detail here except to note differences from the corresponding GWT packages. The primary difference, of course, is that GWE advanced stress packages explicitly simulate thermal energy transport within their respective features, not solute mass. Optionally, the SSM package may be used to represent the effects of thermal energy exchange between an advanced transport package and the subsurface for cases where the temperature of the feature is known. The LKE, SFE, and MWE Packages offer a mechanism for energy to conduct between the lake or stream reach and the aquifer through a thermally conductive layer that can represent, for example, a lake or stream bed or a well casing. The LKT, SFT, and MWT packages do not offer analogous diffusion of solute through the a conductive layer. The LKE and SFE packages also account for removal of thermal energy from surface water by evaporation. From b50af44b87e596a13725df24b774b65ddf1cd3b6 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 17 May 2024 17:08:40 -0400 Subject: [PATCH 176/199] refactor(prt-prp): require exit_solve_tolerance option (#1816) * make EXIT_SOLVE_TOLERANCE required for DISV grids for all grids, motivation: one should be aware the generalized method is semi-analytical and subcells are solved numerically for grid cells we can't solve with Pollock's method * accept any value for DIS grids, following convention in e.g. rnb in gwf-csub.dfn packagedata where a sometimes-required option can have any value when not required * fix double comma in bib file --- .../test_mf6model[0-prtvor1l2r].npy | Bin 19384 -> 19384 bytes .../test_mf6model[1-prtvor1welp].npy | Bin 19367 -> 19367 bytes autotest/prt_test_utils.py | 5 +- autotest/test_prt_budget.py | 3 +- autotest/test_prt_disv1.py | 1 + autotest/test_prt_drape.py | 8 +- autotest/test_prt_exg.py | 8 +- autotest/test_prt_fmi.py | 2 + autotest/test_prt_release_timing.py | 2 + autotest/test_prt_stop_zones.py | 2 + autotest/test_prt_ternary_methods.py | 21 +- autotest/test_prt_track_events.py | 2 + autotest/test_prt_triangle.py | 1 + autotest/test_prt_voronoi1.py | 221 +++++++++++++++++- autotest/test_prt_voronoi2.py | 1 + autotest/test_prt_weak_sinks.py | 2 + doc/MODFLOW6References.bib | 2 +- src/Model/ParticleTracking/prt-prp.f90 | 19 +- 18 files changed, 273 insertions(+), 27 deletions(-) diff --git a/autotest/__snapshots__/test_prt_voronoi1/test_mf6model[0-prtvor1l2r].npy b/autotest/__snapshots__/test_prt_voronoi1/test_mf6model[0-prtvor1l2r].npy index e63c1a1be397525043b986ceed0952dbd9fb75ce..e811788fa2519ec51f3be91fb5f7a432b6c4f4dc 100644 GIT binary patch delta 4461 zcmYLNeNa@_6_*O@g7D;BK2&7ig5UdA*|#pDSQ4H}Sz&F;CWJv#TBtVF1md@XF^Y)F zx29*t#3u8e9jCULNuwE?jM28*>BKryGPO-=Ge!+*T4LJ7fYH=Z(cX9Nxexx?o%_4z zoZtD~bI(1?sh1K?y_9ewAu;jr;ln?Jq{M3RrA~f%OMXd9`gPK|G5inCCOw%J;eS!n zy3MV)S-z)|1$OlJ_rJ&2MjVWTOF&KZ!>gWo-lv_vs96U2ng+K#x_Z#@6E*Er=aYYl z!YAYW@YuNSB(#NVj}z$X(lctr`QgCeLkM53<3%)eH2mLVco z|01K+d1&T?Jkn-Ea)oF!gSpCT`~Iw8hBB}aFiP&~n>Jy2De3pMFM zC7A@fk1^mtdW==j(gOr~&155!Oy{97bTV8dFngX)G>9%{55>j2cu04_BYH zd8kh&3sRNZ<4C!+yz(??VmdoST09`4&(t8%cUh3}FnCd1Tur{Z6a}#{59?1<)A@(W|goE<#D4Fjmx$V8pJPS9th|3(9$nn}9a zNeN138}T%cPa3^GmnqW53uxq>JX)t8lggW>V4@9^BaQ^lwcfNIH=pL4CF3i^YtwlY zp5+ADCOWOlB-rLjXw{e#Nv5EiSL4lmH%C|GDg6V3!bnbx86s2b1G3*D%6#jTpd#}U zQQ`QM7;BU&5bG`C{swY&rHUMh;(&(S7^6*YpWbRBw~umz)Glo=CA1ZfAmS@bCY!B7 z`CgySNDe!l^4TVoAN0BT*dBBPnigZi3hxjKZ=DvQX8gvq7<=Dg$CFfu{*H@y zn6szrvIcEDRqpx)A#CgPpnUyo4@G_9SuFF*+$um^@1Zo@>I_1W89M8slak$Or;6(L z%y9eGAhFn4k1YN@W3Jn<C?&MZSdRD+~nYaSvKXNOpZP|fI>vzYd?}Sw8s@wCX!IApbclS4M+*w{ zxP02|v0_)R9%ly~@%T}uIJ-H8-Ss@O21+o*JYvO8z}+0`K&XjB`vl}x$?g*f^>e6* zAbDQ9FY&VTfj-AjONiu`BtRRldLMMm3CpT+$Aq@o=zudoAx_xiEQN*gb@=>3rH-5o(^dNOsQlUvWiz@Zmgz z<%$sQ#d za!}kWiuq)rq0n(yUtlO0E{rQHID4l}iIE$s=98Gm=C4#<6PPWA7f^~^>8GP7Xez3b zbEzG2(%^aQtA`Cm8hlw)z{t1llTZgju>}S4J+kEpyzc};uPrE`7J6mD3iWNO74fD- z&HY%gs}?Tw&@1!vg;fe29?fa+kS~E?BA4olS@G=jlvd!=rJur6^{&WzAifl}z^JSpu*4hLRoT^kVTG{f#=D@VAl zm+>xMH%B9!!=$2%-4l|JQ`dDwez7>@PGEnd*xd@=spuNB)rMsY3Jrl^O2KFRQ<&8KIi*7_z^)zh!!kAoLc8jtZ4&qKle67ZA!U zH{9X;CQ3*P#8u=xD9TQKa_( zmivupSg9A<(LWGi?y@+$L>(f9i1ZFXc$o%oER(0~vhVXEl2%cW5jsy+@|EZ_5NoUm v$zR3ReJ2+0_kFbp{kbCKKA+!EtUkOHvnvlIVGDxaR<59LIWhUIIcEMJRfcFY delta 4678 zcmY*ceQ;FO6(=Q|j}3X`U6MQ&vYSK{vTq^pCBYCP$OED;uvQa{8c-}jDt>?xM2&zz zFu?=}X*@GkYWo%jt9Ckqjyh(*irTR`DhVuO6uBB>}46w81KJ@?%6lIi}lJNI|b z_wSr@xBKa&?x&MpPD)O8cW1AGKysb>vC#kVy8k0H@KRv^9YyE=4EqDOWF8DoZ*(2+ zd~2k;_FE`SnJXq1)t+k2$Fu(6^cA}fy3Q=nlk?%XDWz$hQp|O#plfslen>I(E@{kl z5+hLhRIBT_a6C01ZcN=0paVFPdP5d!o`>2_?^332B;oqBm~Z-D>guo3;(89+3*y~g zR#yu(!F zBH4t%D;aUUUYSp1ysM-ZlIGY5Q`}#MAN24ttGQEp7>1S+rm;~a*gG%3G4NkhU=}0Y z(2x;=BO^?`=={5#GB&9JRV>&-N^uI<~m|3*S21O?g+x{A!Zh_#X7FFppxM@HaTEvlbXwf4?PeOSP|DEjX; zQwa9@1gCsS0SWzlWK>MY!hMS#_i%ofyiL&aBcocrvfzD1e!=09apT{QU{F%FjfSQZiGI>zb6qfQMry z(3W!##jsD0=}Ju^z?SbVpd@9B7}GV8DjA1ea4%9Y0?UPIJgszi0~CPk+;^LD>yyA} z_zU76qGwTb%}>~UXH_vJoVi9B&?k9cKAmOG_rYKZ(^ZMA=WmQ=02z)xq z%=Hnj#Iln^hRtkKyups0<6xGrCCQfTsJ5C*b(RPQ`?4|ViZI?W4&#BhC{k$74MBNM z)Cem6dY`kl2NzS%5#E_&=5hg!bMaRUSI$WB-kj0^bvfkc-jFQw2M^}fX}59Z2c&2e zK0!?0f%ALSxkw?dxS{rxDm&)5cW8>m}=G#dQ>0vboqIsrv z6DR!~LC}yF7p3fKKW1GH@<$vB@K9bX3opqYO7jt_P+53#I=P2eRbe{9rg%n?Bauaw zcAZC6VZIKV+Ushz# zFsi-4sXt6=psz3<*e_`SGq0#KnpFC{uUKx)HWjdR{kWt<8`kM;WNkExvcmf%!c(zieNh@gkZ<`Vo|BKp!ZKs%=#MWGQ-e6-quws zc}JKL>#<6R+&-Zqje}SZNu$EhJ)y*3#9yr=V>2#@?FbWv5c*sRqG)#OYJ zmxJhT=rC&qf!G5X8~W{H5}P$G$)YHlNFdCW3exgRfZA2jb#scf7Wf)7x1 z3Ul`?_ha+tPt6X4InmayQS9)(qi|ejBQ{4E+9sBWRUB16(FKtrGWVZ}mUxNVE|Uwt zQC21b)st*p#hr*S*)}#2^1>ubFmn^dyhS(efMz=aDaDpJ!TK!j(2WNO`ekuP%H+#( ze!_*~1==1}ltj9$&2Cs^%}+_CRR;U5d6`&5-1&)Q6?nv+r#96p`*#1uFpPQj#4*x7 zU|WI<;0>@(EolTTEU}Dd(HHr=K10@Ar^TW?KtpK=-Yl^MhwgpDakbQATjW8gv_$wL z{d+1tif$mNskAcPzx<-i{}-jU7_0K1P+I}-evAnV!;~^xNG`}nY?d!{fuLU_#A_gt z#w=-7tUg~h$oB#6*4DYwQr%=*+^N=scb>@RI<1P+uTHkLr7E-DDMjGE$+cR&%BOdl z`UYyQo~K>~&tJVjdr`GtLJ$!_E1#FiCs(Q*EibPT{6J1vJj^#Og2wU)d{Pk@Q!TNVolN4!c=7;2(<<#OrN;Bi z`y|bp?Uf~dUwD1YnYPg+bFtFa{d96%Z4M#xud&2+SYEj+`?+P>?jflA8q4TbZ-c>X zv~{S3c)T(M#xzUt;7Np-jBT&tX3T?C(<(Jz*-`22JlHv5G<-I#Bv-kS$mBWEo;n1V zO}7n=+c%jx(ryjmPaz)Trntz{wEearyl?tcjiYN{KXhDkt!=!A7`OyB+5UkCxMFl7Cr0>-Q$?4@Yrm9KcI-9SM2OrF^jT4;A&)LDvbB0vK96x^V z5Iwd~u#pBLeBy*)i(?u7qx&cqaPu?NV2IcFZ>G&}Qy0232W#3xbV6mlg#3P{Wmr6K zKjl%qMb(4sB+r_nkyEa-rCfE8G{1P3rOQ$w6F%kYY-yl!zBS7>u9cx9bjX+7OdgWL z$n0X{Z;YSgLAK>()wfdf+S!&kCA$#i)&DWH`~~^iGut+9;^rS<)mw)t)rD2nfv`*` zJW#bj80uDHIM-;a9Qk4RZz^=yim4N^>{_ zRDYt>0fMrxw{`#j!}t70Wh*t<%IixrnMYr#-TTV*wOS>w%_eNw97`-_w=Z#Gw$&5#*E!bUM*fk! eMveH-Hw;B{I|I+kBEp+<=ku>IasO9S-1#4P{&vd% diff --git a/autotest/__snapshots__/test_prt_voronoi1/test_mf6model[1-prtvor1welp].npy b/autotest/__snapshots__/test_prt_voronoi1/test_mf6model[1-prtvor1welp].npy index 61bccff076f9e779dc027315855182a698ea4ab4..953f37de18c44913f3bbc39a8179ee3ac197edd8 100644 GIT binary patch delta 4910 zcmYjVeNa@_6~_-?K|r{x2)c^_6xsKHeQ$x~Lt>sHu1ZX>G-)xWHO3G`P!p|5tVw7C zE8p6=HsaS?5|gSEr*X!NX`PJH+L)Tr2}zWRjrpimJLYR_P@6Qy^xkvNd1U{2JNMl4 z`~A-Eo_FrTzU`y-Z69@LMYOvfJ|U}khy3geS%vkyCDqHfMf+mXVTqrJu5}+Sl%J4g z)xlcG3Pka#vpl>iMsr_5h{`DVge+4*L}Gky3zw>7nuIq_bN>tv|F6hffJ^fePK(bO z5i8__(O$kd*5^Ktv4s>Xyc_Zk#Oe$ot7Vo<3o0q2T^f51WiD#LO{M&u=nTHpFya1>DUZr>7w85($DOWpXT zT-iP(LRiIv@+n;}Ra6BD4%IL75V&{;|BuVd+Y_`TRI$ubng5KwUNL7-Sg8EnZP;C($nw_N4QLh-pl1hBReIVv3f6IE@?&G@-8g6ph5MB8B)i9ZPY}r->9|XcE)eVTlv6 znrl!ghSoAY2}7&1<(5J|kdVpWW=^@QZ=#gaEAVn>y9?tGqeK+A?9V3ZPUt0M3#w3Ms-Cn?vV^Q(EdywNIy#f@ zN!3`l60so@d2l4%NY&YZ+!?Yqd@7&fOTKE4dnV~@Sb;rZqZdJS&if~6EJrSdtS9?1 zt3XvXD$Qx&r%0WtLQ6#GppvnXMh@D2ScJY+B&;;{!&19Wfaw%lB%|wa@Rq3h8 zP9HR!f|-#uMWYjKy@Koww*Y736rJ@eoYn!PU+IIavm)z#CBAh(g%m};$LYe>-56?A zj)g^N7_)wdwlogHl>FGEvlvMqvRYq~oI?DnWe_UyIt|i#TxJW$R$YV8R&No#%}uIh zuKsBAb;M~-fO6(!=%l$V5!stL+*Z3YoOh|Y7FKR#XslLowMFDpkTxl)i>B&qnNrwx zMM@T$o65kJeN#0#>%}qk9YBV*{Xl+us$*E+Uc_sA4T`w`4vlS4FnuqgVQqhd&>uzU z3j}--t7$t6p_oj^%f1%~@DhZ6AwtPYU|&B04ntY5XZlzRg%B`2214Vrd^8aHsN%32 zLXV12Dk`)QFq{Q_csxr>K|GuA0;)r^eQb;}u5S+t49|hkn(ROv!7K*j-pbYz5oR~Q z@Y~td1iTBa46lXqHcZpuwh<=pB$Q_W_nm1zwp1)h|96s_9w3-8JwTljwqf(L(|y#8 zj!WT#z%VpDpWTo39+FRS!r`Nk704-dq`xK1@$fA<20N+t^qrwP1kG%;fP zK7<;$KBI;Oar0;LDUrVv3O)S5j4}uLJ3x-jHQ4iN&yHC1V6zL5>vIikv>mBf=;jHc z(K7g(xqi9?>~ApCzJyx~ygb`yupxzK|A2Vy%|QMeUjRLg#Gt3`Er55?=VxmrPRNST z52E&MAi~nh$kX6i?Z=krVw6OHH6ktb^M^3r^RT}3rf zNZDaQP1{8%U4`shXkW)q0PkkLQ*Os2ApNHWCaYA^?O~#L5^!ECa89$M3nVkY$r1#a zXiobYk?sMU$NT{_X9VUDD1Fy&FgZkJ(sfy;=$8&T8@${wM&t~Ez%7QsYSdBLpOc)c z!0@F}PWOMuEl6Kv8th@zeh~}p91lugF-^K(?T-+rGYcrj1q>!_7UyVxfOg$D5QEax6oh}Sl~Y>B(E_q-z-9P$aR6Z)&t(FrKR-iv1>C(PAH={)V_>|-X(8z4{sC^ z0St{RC5Tbbbr1xfDx)!Ee@8jT0WGIIK%#Du-1k6kxZI$*YkyCoE&<%-@-phuu5Uo* z+?fX3gxoZ;y5j+7uL$KxXfaZvkfPfIS)(fqI+(~Pr06bytcNP7mdI!{tGf~uAFnXk zQ)06mQDZ3SJ}@BTPLu9~$XLp10LjnXX|NNjwIk7#^=kmUAhP zL|k%*aJ0K0@OI5IQm85yQHeh}y!_i)rc+c5)q4_(s=I4suz!!|(0v}5UcW0qXLp_8 zz7Qs5@HETmfbQD>v%wm9;r@lS^dy6WPLr`!TUD~?s))QtC>?4{}oZJfu&dHm~?5{H;Ll6Krz0uH2yX^*s~3! zuC65L2#x(7bvvD|bOu1rpTQk{u1Vu8l1Mt#wbUs>bg<(n^a<#>I=7r|>YlGb#)2w? zb%+XO@5G?O-mxHOe-(|7$XFEGn+6`l&U5Z3YSLZ};OgfY&NTV~xqB-B?oE-Ti0oVF zQg02wO$!-xN!tG-4a))VIT1p6&ToR=^?-LVL?Y}PctpMJfH!;o$ZaxAB6fiRk@*3r zg`b;WM}MeCpg7UUy#tW`-~yUTBa!zZ`{)9q9En_p<49X*sQ>=RSDMU{e~Wne6AS(H iXNnWrk|e6j;6n@j@})e(d>AV2LQmvWnmXTS1Ewk)=Gk_dfe(SkAA^{qBB!``i1R z$)=~`Ha!)$<<3NZdv)-~UG35-UWcFc(kYxRUmWz%5w$cSpq@+&8tKRCa&}CY&X_{_ zNT)zO>dR5zCYt{3sbiNs`;l~<>mND-Mga9g(<-u+NkRYD{6fXK9n+504Utax0_UAc z!GYsAdZicL-l@VvveoG%(?1z~u8>YuG9*}SO2>|XlbjtYE;XR0_Y3+D^7F|QB^6TF zdC&{b_cI0KQ{Kij0WZ-n5}uG8G*iy!ICXvHvNA<-=4w3^SU{Q-6r zKK6NIH!-B9rA`rSebXo89a8#`Xa~0a>Ydb(AaL30DJ5|K6jT@;RRZ&%smD z$w%gbr|5;_@WRU{bSv)o9pwPhOsA^V6KMf8$!7}kC!IS@CZlMx<{t4V;EC|UalrRp zgdgdYR#5t6f7)jn9QUq2aHEP^)abkU1p6j`f0lC1LV~@h@kArE2xDgqV&b$Ro zX8xWR9|X}ChVzn?oQ!x9mR!X-Y)}g>$>lLo2Msq zL0!IdGkq5FD4l!OaspwH{17!S-4t)?Z0CDv$A;Ojy3<1f)d1tTU=de*A?`Oqf+~^D z!t1#G7vf6+e;!zXJ+dg5*nnxhSTl<9c^mLMpi>~vML)47B3J<}BEQNVSm@(~ON(Qj zUO6x%UcuL-vt%PTvT(j;8{O^)GZH!UzZ~CNK?2Di6cR!=V(Ig&+T!cUKjCWt{}8`Q z=iWSSNMsErgR9N24g)?_^L+1a&bEY?)6l`rpq}$T>!j|xhocwWrylcVtKSdqbG*!x zelc}4RSg{+P{#+G;*f68vMvr>!hsR5%rK2bn1*!jzn$`h!v3s|gtF9zj8TH#l+FV~ znF{-L&>c(-n*Nkw3j7M1e&8^hjt0g-O@vPsrqQcwelW_Ml&n+VCugh8A|&$OefQlx z(plb#WkZ+pbJ4boOfUAEA`Z!w&TqSTa>Lvu41EjWFM%jv!9LXEb%{h$t+r+c)Hc9R zW3|#*sizdGVtd2~1WW;G;%0sL-_!-bSv-i(4HWpW4%qNTSrnh#c7s_vCMlh|$B_p( ze`-o8F5&*n;J{VqG@EsIa9%a@sZmQZL&jCQ5q0HII@VtEG(m4=7W$ZknzzV`yyaeI z3RFH6S$mZEtvRdt$0Sz*?&@H*JK5vil&nei`vKnv0|C3NR*x(U`8r^gCt!3|$oL!M z&yZUf;v(8Pby=gt_nQCOCzz;v-qWo`xqb$wi9jzLp|xGWL(UHA%%4rIjbw+!K}}6< zH+!9bg32SMKapMNqj7_|e}p)s$KQb2$9fUf_Oi!?{WbL%aY9Z=><4!swz>gqzi@2~ z-;h)2b!_2uDC)=E4&W%D^Df>3EKk zh47oH7v%o@5YyPF2eac@&bn?J-8XK$+%)dj6m|TOC04haD0=B~Q+(?|d>GVyK<|*( zenU;s%TYIaUcaEC3BPTqY0xnSS#^4@Pm=5HV7f|crlXTx*T-vxB8_RoOp&Q+?ugQ3 z>C_LTHj(RjfD5*F*>(M}Si#-HLK#RSM0QCIU|tY|MXqTiaOTf=?kk9o#kmDOX0U!5 zNs0o#nHw6Q`_r)jgehNC=W?fHX#I3NO`ajd;#lzyUJ=Rwy}{b=SWgQB;74K&eeVj> zxE0+a&P%7hjWQTHyub&RD4}{crkqv7P4NR$(#bPh|3VD^Xn3A+6H*Btx9~w#{|b35 z7!mP#B)x$$SfP6I{Oa)$mUx|W*yA;U`-}K@BkXiNGacUYsXq*Jm#uy?(h|k2jBmK} z_2251fR=w58SzmZDB)-9gGm9CgO;&YuatHDIK?%|>irQpYF^OFKo+I5ZZKP}85Fa8 zEod8C^)1~!%?)js3F|*w<(jrPaqf9`+OSYJ0&`hyhBNf$jwaDl=`=j1R|LXGz1X`U3SW_3hjK$Hg$KxlU zW{t80sYp6e!OS-t_R0;YR{`(9uYeoexrUP@REnOJXD48EH8pRh*v{FfuxJ`HwLp9F zuJ%$)0tE$Qe*Buwcvj`Mg6s1Cq0_1bmMutFQBYXu{5r$(1~3$pPp zj~KtYA>S4g^=P>#SsIPYJwE+vTYi}*jmBm@(CBTTWg9*$NjmNc7C@s5(#Tf#T4Clg z=5PzW0(JP+`<5-9fwW=AyS+Tijk~=%{K~e=yn${!5KF(^w!Kr!J?7E#-&h^rff@I` z@k}iJYr?j;Qw!BS!g)67g4EW6fck6L63yTR=HC63<sj}pg63vFWzr+vsXT}x19Q8=9oKFowP{YkxVXREHFvJ@t~X$Q?>e6f`{ z3ujQ37T;_{pbWTqxS#O;YdS;@yNhk!jP5}XIYFhWo|1sdDajXuxt|}>$VjI-o+1;z z67X$$iMV@dWB{kbuNrV^Y)57ws<+XagS4_rOD*FjJyPx-uCRFw)$wGhC3<+d>?JzE z{Kw0?Jor zd9wb>gV&LJf)@bHV|0Rb)ck^GX=_=P2mQjzZSH1?fa74foz8`x;r2A|qxRI7+eR-_ zca~RW^H*@U%TiyKm#28SpQbiV9Ak?|cp}de8PaJ<^)d*kt}&JvuKN_d$iuVrq+osV zS6bc?9gSnxE%}r$6*%Wgn>T*+VqQNj6ZBplKQ5qpzG@Y7zv5O?K+ywE1>1?TA+yk0yzDT1n?wQTFV=nnDOJPjDz}+cF%HiT0W+z zJI006x#7KDy~n9-!YT9dnb&eo=Yfmw0ml}%;9>@`f5F{sO^=;y`<=eQ{hZ5a%_YGX zjkk?gF=4R$oCV)nLb23%TfD{+Il{EIR_Ww1=nvz=+%@-W)?Vu^npK3SRYcPM#|K*L z;@I;o6}G@1An+T(J;j`~uI3Q~yR-?Bw6k84YhyJon&5?tdS_VcrdWx4CX{*qTWS5L zK3>C>0X2FeELrRfbYK7_A)VGedSVf80elzZmoT%fpT+QF6C>Uaoz@>{HdVN?N;I)a z61!|mpzZ?}P|sC*OD!7DORJ6lQHF5xBs(3ef`sCD^R|VE@VS$0ffspP>gV~GZ5ykX zHd?+h$-7CoXPBV2>tdx2mzH=3p2H7Q_h+8MwmEtX(7YD#2HpmzsTAq7Ez?^lZgN0< zA-#JH{p`Rr+8T7p2v<~DeW&C})>zwmT{hwytLy}HruJ9eY!om*)PJ~!w(X<}Z@t>i zzyXKa`;ZTGf#~92S6dlOO&|P~E--Gg6t!5?g{Eh;YS47~Yh4_KV Z7Txky%9NSEj?o^br2v null() !< force ternary solution for quad grids integer(I4B), pointer :: iexmethod => null() !< method for iterative solution of particle exit location and time in generalized Pollock's method real(DP), pointer :: extol => null() !< tolerance for iterative solution of particle exit location and time in generalized Pollock's method + logical(LGP), pointer :: foundtol => null() !< whether tolerance option was found contains procedure :: prp_allocate_arrays @@ -160,6 +161,7 @@ subroutine prp_da(this) call mem_deallocate(this%ifrctrn) call mem_deallocate(this%iexmethod) call mem_deallocate(this%extol) + call mem_deallocate(this%foundtol) ! -- deallocate arrays call mem_deallocate(this%rptx) @@ -259,6 +261,7 @@ subroutine prp_allocate_scalars(this) call mem_allocate(this%ifrctrn, 'IFRCTRN', this%memoryPath) call mem_allocate(this%iexmethod, 'IEXMETHOD', this%memoryPath) call mem_allocate(this%extol, 'IEXTOL', this%memoryPath) + call mem_allocate(this%foundtol, 'FOUNDTOL', this%memoryPath) ! -- Set values this%rlsall = .false. @@ -280,6 +283,7 @@ subroutine prp_allocate_scalars(this) this%ifrctrn = 0 this%iexmethod = 1 this%extol = DZERO + this%foundtol = .false. ! exit_solve_tolerance is a required option end subroutine prp_allocate_scalars !> @ brief Allocate and read period data @@ -698,7 +702,7 @@ subroutine prp_options(this, option, found) ! -- dummy class(PrtPrpType), intent(inout) :: this character(len=*), intent(inout) :: option - logical, intent(inout) :: found + logical(LGP), intent(inout) :: found ! -- locals real(DP) :: dval integer(I4B) :: i, ios, nlines @@ -818,20 +822,20 @@ subroutine prp_options(this, option, found) found = .true. case ('DEV_EXIT_SOLVE_METHOD') this%iexmethod = this%parser%GetInteger() - if (this%iexmethod /= 1 .and. this%iexmethod /= 2) then + if (.not. (this%iexmethod /= 1 .or. this%iexmethod /= 2)) & call store_error('DEV_EXIT_SOLVE_METHOD MUST BE & &1 (BRENT) OR 2 (CHANDRUPATLA)') - end if found = .true. case ('EXIT_SOLVE_TOLERANCE') this%extol = this%parser%GetDouble() - if (this%extol <= DZERO) then - call store_error('EXIT_SOLVE_TOLERANCE MUST BE STRICTLY POSITIVE') - end if + if (this%extol <= DZERO) & + call store_error('EXIT_SOLVE_TOLERANCE MUST BE POSITIVE') found = .true. + this%foundtol = .true. case default found = .false. end select + end subroutine prp_options !> @brief Read the packagedata for this package @@ -983,6 +987,9 @@ subroutine prp_read_dimensions(this) integer(I4B) :: ierr logical :: isfound, endOfBlock + if (.not. this%foundtol) & + call store_error('EXIT_SOLVE_TOLERANCE MISSING, VALUE REQUIRED') + ! -- get dimension block call this%parser%GetBlock('DIMENSIONS', isfound, ierr, & supportOpenClose=.true.) From 269ca6eb391a9f00c8461217f7f4b04c97f0733d Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Fri, 17 May 2024 18:23:51 -0400 Subject: [PATCH 177/199] test(marks): mark tests needing developmode (#1824) Mark some tests that need to be skipped in release mode --- autotest/test_prt_disv1.py | 1 + autotest/test_swf_dfw.py | 1 + autotest/test_swf_dfw_beg2022.py | 1 + autotest/test_swf_dfw_bowl.py | 1 + autotest/test_swf_dfw_gwf.py | 1 + autotest/test_swf_dfw_swrt2.py | 1 + autotest/test_swf_dfw_swrt2b.py | 1 + autotest/test_swf_dfw_swrt2dis.py | 1 + autotest/test_swf_vcatch.py | 1 + 9 files changed, 9 insertions(+) diff --git a/autotest/test_prt_disv1.py b/autotest/test_prt_disv1.py index 2d0099d2a94..1d01668e505 100644 --- a/autotest/test_prt_disv1.py +++ b/autotest/test_prt_disv1.py @@ -542,6 +542,7 @@ def check_output(idx, test): compare_output(name, mf6_pls, mp7_pls, mp7_eps) +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( diff --git a/autotest/test_swf_dfw.py b/autotest/test_swf_dfw.py index 04d20215143..70c3a29b0ec 100644 --- a/autotest/test_swf_dfw.py +++ b/autotest/test_swf_dfw.py @@ -184,6 +184,7 @@ def check_output(idx, test): return +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( diff --git a/autotest/test_swf_dfw_beg2022.py b/autotest/test_swf_dfw_beg2022.py index 6ae1a5cb9d4..16421d43ea9 100644 --- a/autotest/test_swf_dfw_beg2022.py +++ b/autotest/test_swf_dfw_beg2022.py @@ -316,6 +316,7 @@ def check_output(idx, test): return +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( diff --git a/autotest/test_swf_dfw_bowl.py b/autotest/test_swf_dfw_bowl.py index 062dcb490b5..655bb0f999b 100644 --- a/autotest/test_swf_dfw_bowl.py +++ b/autotest/test_swf_dfw_bowl.py @@ -261,6 +261,7 @@ def check_output(idx, test): assert np.allclose(stage_all[-1].flatten(), stage_answer, atol=1.0e-5), msg +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( diff --git a/autotest/test_swf_dfw_gwf.py b/autotest/test_swf_dfw_gwf.py index 0933458b08a..6d26cadda13 100644 --- a/autotest/test_swf_dfw_gwf.py +++ b/autotest/test_swf_dfw_gwf.py @@ -268,6 +268,7 @@ def check_output(idx, test): return +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( diff --git a/autotest/test_swf_dfw_swrt2.py b/autotest/test_swf_dfw_swrt2.py index 5660b82e73d..f19988bb829 100644 --- a/autotest/test_swf_dfw_swrt2.py +++ b/autotest/test_swf_dfw_swrt2.py @@ -248,6 +248,7 @@ def check_output(idx, test): return +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( diff --git a/autotest/test_swf_dfw_swrt2b.py b/autotest/test_swf_dfw_swrt2b.py index 22158f4785f..b013db1d8d9 100644 --- a/autotest/test_swf_dfw_swrt2b.py +++ b/autotest/test_swf_dfw_swrt2b.py @@ -236,6 +236,7 @@ def check_output(idx, test): ), f"Simulated depth at end should be 1, but found {depth}" +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( diff --git a/autotest/test_swf_dfw_swrt2dis.py b/autotest/test_swf_dfw_swrt2dis.py index 3a0187a976b..358489456ea 100644 --- a/autotest/test_swf_dfw_swrt2dis.py +++ b/autotest/test_swf_dfw_swrt2dis.py @@ -215,6 +215,7 @@ def check_output(idx, test): ), f"Simulated depth at end should be 1, but found {depth}" +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( diff --git a/autotest/test_swf_vcatch.py b/autotest/test_swf_vcatch.py index 17aea3d32ca..6711e388d72 100644 --- a/autotest/test_swf_vcatch.py +++ b/autotest/test_swf_vcatch.py @@ -292,6 +292,7 @@ def check_output(idx, test): return +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( From 3160dc749e9ed720a173bb51ec1fdd70aff8e1bd Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Sat, 18 May 2024 08:35:49 -0400 Subject: [PATCH 178/199] ci(large.yml): fix test selection (#1825) Fix test selection in large.yml, marker no longer exists with test: remove unneeded marker #1820 --- .github/workflows/large.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/large.yml b/.github/workflows/large.yml index 9514d9af112..5e009cf063a 100644 --- a/.github/workflows/large.yml +++ b/.github/workflows/large.yml @@ -100,7 +100,7 @@ jobs: - name: Run tests working-directory: modflow6 - run: pixi run autotest -m "large" + run: pixi run autotest test_largetestmodels.py - name: Upload failed test output if: failure() From d4c9fec6730c0f42da208759e25768305a6d8fae Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Sat, 18 May 2024 14:41:29 -0400 Subject: [PATCH 179/199] fix(prt): remove track_all option in oc, fix typo in supptechinfo (#1826) * track_all isn't necessary as all events are enabled by default * "need" -> "needed` in supplemental technical info document --- autotest/test_prt_disv1.py | 1 - autotest/test_prt_track_events.py | 1 - autotest/test_prt_voronoi1.py | 1 - doc/SuppTechInfo/particle-tracking-model.tex | 2 +- doc/mf6io/mf6ivar/dfn/prt-oc.dfn | 8 -------- doc/mf6io/mf6ivar/md/mf6ivar.md | 1 - doc/mf6io/mf6ivar/tex/prt-oc-desc.tex | 2 -- doc/mf6io/mf6ivar/tex/prt-oc-options.dat | 1 - src/Model/ParticleTracking/prt-oc.f90 | 3 --- 9 files changed, 1 insertion(+), 19 deletions(-) diff --git a/autotest/test_prt_disv1.py b/autotest/test_prt_disv1.py index 1d01668e505..e35101b2b3d 100644 --- a/autotest/test_prt_disv1.py +++ b/autotest/test_prt_disv1.py @@ -264,7 +264,6 @@ def build_prt_sim(idx, gwf_ws, prt_ws, mf6): pname="oc", track_filerecord=[prt_track_file], trackcsv_filerecord=[prt_track_csv_file], - track_all=True, ) # create the flow model interface diff --git a/autotest/test_prt_track_events.py b/autotest/test_prt_track_events.py index b267788fd29..5912c7e679c 100644 --- a/autotest/test_prt_track_events.py +++ b/autotest/test_prt_track_events.py @@ -156,7 +156,6 @@ def get_oc() -> List[str]: pname="oc", track_filerecord=[prt_track_file], trackcsv_filerecord=[prt_track_csv_file], - track_all=True, ) elif "rel" in name: return flopy.mf6.ModflowPrtoc( diff --git a/autotest/test_prt_voronoi1.py b/autotest/test_prt_voronoi1.py index 22b3fd35967..e80b68c0dff 100644 --- a/autotest/test_prt_voronoi1.py +++ b/autotest/test_prt_voronoi1.py @@ -563,7 +563,6 @@ def build_prt_sim(idx, name, gwf_ws, prt_ws, targets, cell_ids): pname="oc", track_filerecord=[prt_track_file], trackcsv_filerecord=[prt_track_csv_file], - track_all=not times[idx], track_exit=True, track_release=True, track_terminate=True, diff --git a/doc/SuppTechInfo/particle-tracking-model.tex b/doc/SuppTechInfo/particle-tracking-model.tex index 9e23bf32b59..836fa7f7c3e 100644 --- a/doc/SuppTechInfo/particle-tracking-model.tex +++ b/doc/SuppTechInfo/particle-tracking-model.tex @@ -39,7 +39,7 @@ \subsection{Generalized Pollock's Method For Non-Rectangular Cells} \label{sec:g \subsubsection{Calculation of vertex velocities} -A single velocity vector ($x$ and $y$ velocity components) could be calculated at each cell vertex such that each vertex velocity respects the uniform normal velocity along each cell faces. A centroid velocity could then be calculated by averaging the vertex velocities. However, this approach would not be locally conservative. The additional degrees of freedom (velocity components to be calculated) that are need to allow local conservation can be introduced by using higher-order basis functions, but that approach typically requires expensive numerical integration of the particle trajectory \citep{zhang2012}. An alternative is to introduce the requisite additional degrees of freedom by allowing each subcell to have its own distinct velocity vector at the cell centroid, but that has the obvious disadvantage that the velocity is discontinuous at the cell centroid. The method used in the PRT Model is novel in that it uses relatively low-order basis functions that allow for semi-analytical solution of the particle trajectory, together with two velocities at each cell vertex (one for each of the two subcells that share the vertex) and a single cell-centroid velocity to provide sufficient degrees of freedom for local conservation. This approach can also accommodate the discontinuity in cell-face normal velocity that occurs when two cell faces meet at a $180^\circ$ angle, as occurs in quad-refined grids. +A single velocity vector ($x$ and $y$ velocity components) could be calculated at each cell vertex such that each vertex velocity respects the uniform normal velocity along each cell faces. A centroid velocity could then be calculated by averaging the vertex velocities. However, this approach would not be locally conservative. The additional degrees of freedom (velocity components to be calculated) that are needed to allow local conservation can be introduced by using higher-order basis functions, but that approach typically requires expensive numerical integration of the particle trajectory \citep{zhang2012}. An alternative is to introduce the requisite additional degrees of freedom by allowing each subcell to have its own distinct velocity vector at the cell centroid, but that has the obvious disadvantage that the velocity is discontinuous at the cell centroid. The method used in the PRT Model is novel in that it uses relatively low-order basis functions that allow for semi-analytical solution of the particle trajectory, together with two velocities at each cell vertex (one for each of the two subcells that share the vertex) and a single cell-centroid velocity to provide sufficient degrees of freedom for local conservation. This approach can also accommodate the discontinuity in cell-face normal velocity that occurs when two cell faces meet at a $180^\circ$ angle, as occurs in quad-refined grids. For a cell with $N$ polygon faces, the degrees of freedom are $4N$ cell-vertex velocity components and $2$ cell-centroid velocity components, for a total of $4N + 2$ degrees of freedom. The constraints are $2N$ known cell-face normal velocities, $N$ continuity conditions (equality of normal components) along boundaries between subcells, $N - 1$ independent local conservation conditions (equality of divergences), $2$ constraints from setting the cell-centroid velocity to a weighted average of the cell-vertex velocities, and $1$ ``closure constraint," for a total of $4N + 2$ constraints, which matches the number of degrees of freedom. diff --git a/doc/mf6io/mf6ivar/dfn/prt-oc.dfn b/doc/mf6io/mf6ivar/dfn/prt-oc.dfn index add41aade45..8e0c1d34359 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-oc.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-oc.dfn @@ -143,14 +143,6 @@ optional false longname file keyword description name of the comma-separated value (CSV) file to write tracking information. -block options -name track_all -type keyword -reader urword -optional true -longname track all events -description keyword to indicate that ... - block options name track_release type keyword diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 19827c49495..2b81909e81e 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -1591,7 +1591,6 @@ | PRT | OC | OPTIONS | TRACKFILE | STRING | name of the output file to write tracking information. | | PRT | OC | OPTIONS | TRACKCSV | KEYWORD | keyword to specify that record corresponds to a CSV track file. | | PRT | OC | OPTIONS | TRACKCSVFILE | STRING | name of the comma-separated value (CSV) file to write tracking information. | -| PRT | OC | OPTIONS | TRACK_ALL | KEYWORD | keyword to indicate that ... | | PRT | OC | OPTIONS | TRACK_RELEASE | KEYWORD | keyword to indicate that particle tracking output is to be written when a particle is released | | PRT | OC | OPTIONS | TRACK_EXIT | KEYWORD | keyword to indicate that particle tracking output is to be written when a particle exits a cell | | PRT | OC | OPTIONS | TRACK_TIMESTEP | KEYWORD | keyword to indicate that particle tracking output is to be written at the end of each time step | diff --git a/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex b/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex index ffe00bc24b1..50b305df62e 100644 --- a/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex +++ b/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex @@ -21,8 +21,6 @@ \item \texttt{trackcsvfile}---name of the comma-separated value (CSV) file to write tracking information. -\item \texttt{TRACK\_ALL}---keyword to indicate that ... - \item \texttt{TRACK\_RELEASE}---keyword to indicate that particle tracking output is to be written when a particle is released \item \texttt{TRACK\_EXIT}---keyword to indicate that particle tracking output is to be written when a particle exits a cell diff --git a/doc/mf6io/mf6ivar/tex/prt-oc-options.dat b/doc/mf6io/mf6ivar/tex/prt-oc-options.dat index 75f69cb822d..3cd4fe3e012 100644 --- a/doc/mf6io/mf6ivar/tex/prt-oc-options.dat +++ b/doc/mf6io/mf6ivar/tex/prt-oc-options.dat @@ -3,7 +3,6 @@ BEGIN OPTIONS [BUDGETCSV FILEOUT ] [TRACK FILEOUT ] [TRACKCSV FILEOUT ] - [TRACK_ALL] [TRACK_RELEASE] [TRACK_EXIT] [TRACK_TIMESTEP] diff --git a/src/Model/ParticleTracking/prt-oc.f90 b/src/Model/ParticleTracking/prt-oc.f90 index 1f46a938ea2..ac16be14dc0 100644 --- a/src/Model/ParticleTracking/prt-oc.f90 +++ b/src/Model/ParticleTracking/prt-oc.f90 @@ -263,9 +263,6 @@ subroutine prt_oc_read_options(this) &FOLLOWED BY FILEOUT') end if found = .true. - case ('TRACK_ALL') - event_found = .false. ! defaults set below - found = .true. case ('TRACK_RELEASE') this%trackrelease = .true. event_found = .true. From 4c6deb1a94ff87a0c7214f806878c0d85cb4b2eb Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Sun, 19 May 2024 21:41:45 -0400 Subject: [PATCH 180/199] ci: use -Doptimization=1 for arm mac gfortran test and release (#1827) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On rectangular grids, the generalized particle tracking method can find itself in an endless loop on macOS 14 compiled with gfortran with optimization=2, confirmed with gfortran 11-14. It's difficult to say where things are going wrong since on ARM macs neither gdb nor lldb can be used so we are stuck with print debugging. An architecture/compiler problem seems plausible since we'd presumably see the same behavior on other platforms with opt=2 if it were our bug, but I'm not sure. This should not occur typically since rectangular cells are detected and solved with Pollock's method, but we use dev_forceternary in test_prt_disv1.py to check that the generalized method reduces to Pollock's. The test has been hanging in CI recently — we might have caught it sooner but there was a separate setup-fortran issue which concealed this one at first. While it might be safe to release with optimization=2 (with the assumption developers are the only ones using dev options) I don't think we can be sure the same or similar issues could not affect other model grids. So I think we should drop the optimization level pending more information. --- .github/workflows/ci.yml | 21 +++++++++++++++++---- .github/workflows/release.yml | 16 ++++++++++++++-- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 217b73457fe..37e705102a6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -244,7 +244,11 @@ jobs: - name: Build modflow6 working-directory: modflow6 run: | - pixi run setup builddir + setupargs="" + if [[ "${{ matrix.os }}" == "macos-14" ]]; then + setupargs="-Doptimization=1" + fi + pixi run setup builddir $setupargs pixi run build builddir - name: Show build log @@ -271,11 +275,20 @@ jobs: env: REPOS_PATH: ${{ github.workspace }} run: | - if [ "${{ github.ref_name }}" == "master" ]; then - pixi run autotest -m "not large and not developmode" + markers="" + if [[ "${{ github.ref_name }}" == "master" ]]; then + markers="not large and not developmode" else - pixi run autotest -m "not large" + markers="not large" + fi + + filters="" + if [[ "${{ matrix.os }}" == "macos-14" ]]; then + # comparison fails on macos-14 with optimization=1 + filters="not test028_sfr_rewet" fi + + pixi run autotest -m "$markers" -k "$filters" - name: Upload failed test output if: failure() diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3ca19986108..b16936c1318 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -71,22 +71,27 @@ jobs: - os: ${{ inputs.linux_version }} compiler: ${{ inputs.compiler_toolchain }} version: ${{ inputs.compiler_version }} + optimization: 2 parallel: false - os: macos-13 compiler: ${{ inputs.compiler_toolchain }} version: ${{ inputs.compiler_version }} + optimization: 2 parallel: false - os: macos-14 compiler: gcc version: 13 + optimization: 1 parallel: false - os: windows-2022 compiler: ${{ inputs.compiler_toolchain }} version: ${{ inputs.compiler_version }} + optimization: 2 parallel: false - os: windows-2022 compiler: intel-classic version: "2021.7" + optimization: 2 parallel: true defaults: run: @@ -185,7 +190,7 @@ jobs: if: (!(runner.os == 'Windows' && matrix.parallel)) working-directory: modflow6 run: | - meson setup builddir -Ddebug=false --prefix=$(pwd) --libdir=bin + meson setup builddir --prefix=$(pwd) --libdir=bin -Doptimization=${{ matrix.optimization }} meson install -C builddir meson test --verbose --no-rebuild -C builddir @@ -278,7 +283,14 @@ jobs: if [[ "${{ inputs.developmode }}" == "false" ]]; then markers="$markers and not developmode" fi - pytest -v -n auto --durations 0 -m "$markers" + + filters="" + if [[ "${{ matrix.os }}" == "macos-14" ]]; then + # comparison fails on macos-14 with optimization=1 + filters="not test028_sfr_rewet" + fi + + pytest -v -n auto --durations 0 -m "$markers" -k "$filters" - name: Upload failed test output if: failure() From ccdb17590d138c0f9e3a44ec07b3464ed7eb93ef Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 20 May 2024 00:07:57 -0400 Subject: [PATCH 181/199] ci(release): fix dylib path to hide on macos-14 (#1828) --- .github/workflows/release.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b16936c1318..cf1a7850176 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -174,8 +174,10 @@ jobs: - name: Hide dylibs (macOS) if: matrix.os == 'macos-14' run: | - mv /opt/homebrew/opt/gcc/lib/gcc/current/libgfortran.5.dylib /opt/homebrew/opt/gcc/lib/gcc/current/libgfortran.5.dylib.bak - mv /opt/homebrew/opt/gcc/lib/gcc/current/libquadmath.0.dylib /opt/homebrew/opt/gcc/lib/gcc/current/libquadmath.0.dylib.bak + version="${{ matrix.version }}" + libpath="/opt/homebrew/opt/gcc@$version/lib/gcc/$version" + mv $libpath/libgfortran.5.dylib $libpath/libgfortran.5.dylib.bak + mv $libpath/libquadmath.0.dylib $libpath/libquadmath.0.dylib.bak - name: Set LDFLAGS (macOS) if: runner.os == 'macOS' From b7b8d20c5d632bafc979106e49b3fcec82b5f5a1 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 20 May 2024 07:14:00 -0400 Subject: [PATCH 182/199] test: mark swf test developmode (#1829) --- autotest/test_swf_dfw_loop.py | 1 + 1 file changed, 1 insertion(+) diff --git a/autotest/test_swf_dfw_loop.py b/autotest/test_swf_dfw_loop.py index 0a7ecb78f19..a7b88fd3d2d 100644 --- a/autotest/test_swf_dfw_loop.py +++ b/autotest/test_swf_dfw_loop.py @@ -478,6 +478,7 @@ def check_output(idx, test): return +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( From 8b2745d8a3845656dbd702577b19707e45159634 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 20 May 2024 08:50:45 -0400 Subject: [PATCH 183/199] test: mark some parallel tests developmode (#1831) Add the developmode marker to parallel tests that reuse models from tests that use dev options --- autotest/test_par_gwe_split_analyt.py | 1 + autotest/test_par_gwf_idomain.py | 1 + autotest/test_par_gwf_newton.py | 1 + autotest/test_par_gwf_rewet.py | 1 + autotest/test_par_gwt_adv01.py | 1 + autotest/test_par_gwt_adv02.py | 1 + autotest/test_par_gwt_subset.py | 1 + 7 files changed, 7 insertions(+) diff --git a/autotest/test_par_gwe_split_analyt.py b/autotest/test_par_gwe_split_analyt.py index fa7e183f811..7b41b0fa3f7 100644 --- a/autotest/test_par_gwe_split_analyt.py +++ b/autotest/test_par_gwe_split_analyt.py @@ -29,6 +29,7 @@ def check_output(idx, test): @pytest.mark.parallel +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( diff --git a/autotest/test_par_gwf_idomain.py b/autotest/test_par_gwf_idomain.py index ce1ae2b0c7a..274e01d4e36 100644 --- a/autotest/test_par_gwf_idomain.py +++ b/autotest/test_par_gwf_idomain.py @@ -31,6 +31,7 @@ def check_output(idx, test): @pytest.mark.parallel +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( diff --git a/autotest/test_par_gwf_newton.py b/autotest/test_par_gwf_newton.py index d8e61ccb5d9..f0978d95774 100644 --- a/autotest/test_par_gwf_newton.py +++ b/autotest/test_par_gwf_newton.py @@ -33,6 +33,7 @@ def check_output(idx, test): @pytest.mark.parallel +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( diff --git a/autotest/test_par_gwf_rewet.py b/autotest/test_par_gwf_rewet.py index fad3e4b4932..97648e7e710 100644 --- a/autotest/test_par_gwf_rewet.py +++ b/autotest/test_par_gwf_rewet.py @@ -31,6 +31,7 @@ def check_output(idx, test): @pytest.mark.parallel +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( diff --git a/autotest/test_par_gwt_adv01.py b/autotest/test_par_gwt_adv01.py index 4a00e222a91..296a5f9159a 100644 --- a/autotest/test_par_gwt_adv01.py +++ b/autotest/test_par_gwt_adv01.py @@ -11,6 +11,7 @@ @pytest.mark.parallel +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): from test_gwt_adv01_gwtgwt import build_models diff --git a/autotest/test_par_gwt_adv02.py b/autotest/test_par_gwt_adv02.py index 8953820aa33..3982eb93fe1 100644 --- a/autotest/test_par_gwt_adv02.py +++ b/autotest/test_par_gwt_adv02.py @@ -11,6 +11,7 @@ @pytest.mark.parallel +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): from test_gwt_adv02_gwtgwt import build_models diff --git a/autotest/test_par_gwt_subset.py b/autotest/test_par_gwt_subset.py index 6e9a8e3217a..58631ca91d4 100644 --- a/autotest/test_par_gwt_subset.py +++ b/autotest/test_par_gwt_subset.py @@ -28,6 +28,7 @@ def build_models(idx, test): @pytest.mark.parallel +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): from test_gwt_subset import check_output From 5832090721473bad8b1951c6e1915e8b93c803b6 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 20 May 2024 12:38:41 -0400 Subject: [PATCH 184/199] ci: fix developmode parallel test conditions (#1832) Apply 'not developmode' marker when testing parallel mf6 in test-par-win action... * on master branch, generally * if developmode is false in the release workflow --- .github/actions/test-par-win/action.yml | 18 ++++++++++++++++-- .github/common/test_modflow6.bat | 2 +- .github/workflows/release.yml | 8 +++++++- autotest/test_par_gwt_dsp01.py | 1 + 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/.github/actions/test-par-win/action.yml b/.github/actions/test-par-win/action.yml index 7710c058b70..27e5e274223 100644 --- a/.github/actions/test-par-win/action.yml +++ b/.github/actions/test-par-win/action.yml @@ -19,10 +19,24 @@ runs: GITHUB_TOKEN: ${{ github.token }} run: pixi run get-exes + - name: Convert unix2dos + shell: cmd + run: | + unix2dos -n "%GITHUB_WORKSPACE%\modflow6\.github\common\test_modflow6.bat" "%TEMP%\test_modflow6.bat" + - name: Test programs - shell: cmd + if: github.ref_name != 'master' + shell: cmd env: REPOS_PATH: ${{ github.workspace }} run: | - unix2dos -n "%GITHUB_WORKSPACE%\modflow6\.github\common\test_modflow6.bat" "%TEMP%\test_modflow6.bat" + "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "%TEMP%\test_modflow6.bat" + + - name: Test programs + if: github.ref_name == 'master' + shell: cmd + env: + REPOS_PATH: ${{ github.workspace }} + MARKERS: not developmode + run: | "%ONEAPI_ROOT%\setvars.bat" intel64 vs2022 && "%TEMP%\test_modflow6.bat" diff --git a/.github/common/test_modflow6.bat b/.github/common/test_modflow6.bat index 1ea8626f126..2707f6d8c83 100644 --- a/.github/common/test_modflow6.bat +++ b/.github/common/test_modflow6.bat @@ -1,4 +1,4 @@ cd "%GITHUB_WORKSPACE%\modflow6\autotest" where libpetsc.dll ldd ..\bin\mf6 -pixi run autotest --parallel -k "test_par" +pixi run autotest --parallel -k "test_par" -m "%MARKERS%" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cf1a7850176..79039e50456 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -208,9 +208,15 @@ jobs: uses: ./modflow6/.github/actions/build-par-win - name: Build and test binaries (Windows) - if: runner.os == 'Windows' && matrix.parallel && inputs.run_tests + if: runner.os == 'Windows' && matrix.parallel && inputs.run_tests && inputs.developmode uses: ./modflow6/.github/actions/test-par-win + - name: Build and test binaries (Windows) + if: runner.os == 'Windows' && matrix.parallel && inputs.run_tests && !inputs.developmode + uses: ./modflow6/.github/actions/test-par-win + env: + MARKERS: not developmode + - name: Copy deps to bin dir if: runner.os == 'Windows' && matrix.parallel working-directory: modflow6/bin diff --git a/autotest/test_par_gwt_dsp01.py b/autotest/test_par_gwt_dsp01.py index dbdee7a26f9..d3c633f805c 100644 --- a/autotest/test_par_gwt_dsp01.py +++ b/autotest/test_par_gwt_dsp01.py @@ -24,6 +24,7 @@ def check_output(idx, test): @pytest.mark.parallel +@pytest.mark.developmode @pytest.mark.parametrize("idx, name", enumerate(cases)) def test_mf6model(idx, name, function_tmpdir, targets): test = TestFramework( From 38980915dafdc8031947ad01ec9e2de0ce5f0677 Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Mon, 20 May 2024 15:01:45 -0700 Subject: [PATCH 185/199] docs(binaryoutput.tex): include description for gwe model binary output (#1835) --- doc/mf6io/framework/binaryoutput.tex | 48 +++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/doc/mf6io/framework/binaryoutput.tex b/doc/mf6io/framework/binaryoutput.tex index bd75a4717e0..9cafe51d8b0 100644 --- a/doc/mf6io/framework/binaryoutput.tex +++ b/doc/mf6io/framework/binaryoutput.tex @@ -191,7 +191,7 @@ \subsubsection{DISU Grids} \newpage \subsection{Dependent Variable File} -In the present \mf version, the \texttt{TEXT} value is specified as the name of the dependent variable, such as ``HEAD'' for the GWF Model, for example, or ``CONCENTRATION'' for the GWT Model. Cells that have been assigned an IDOMAIN value of zero or less are assigned a head value of $1.0$ x $10^{30}$. Cells that have been deactivated (such as when a GWF model cell becomes dry) are assigned a value of $-1.0$ x $10^{30}$. In the case of GWF, the large negative value allows the results from a previous simulation to be used as starting heads for a subsequent simulation. GWF model cells assigned a large negative value as an initial condition will start the simulation as dry. Note that the dry inactive value is not used if the Newton-Raphson Formulation is active. In this case, a dry cell will have a calculated head value that is below or at the bottom of the cell. +In the present \mf version, the \texttt{TEXT} value is specified as the name of the dependent variable. For example, ``HEAD'' is specified for a GWF Model, ``CONCENTRATION'' for a GWT Model, and ``TEMPERATURE'' for a GWE Model. Cells that have been assigned an IDOMAIN value of zero or less are assigned a head value of $1.0$ x $10^{30}$. Cells that have been deactivated (such as when a GWF model cell becomes dry) are assigned a value of $-1.0$ x $10^{30}$. In the case of GWF, the large negative value allows the results from a previous simulation to be used as starting heads for a subsequent simulation. GWF model cells assigned a large negative value as an initial condition will start the simulation as dry. Note that the dry inactive value is not used if the Newton-Raphson Formulation is active. In this case, a dry cell will have a calculated head value that is below or at the bottom of the cell. \subsubsection{DIS Grids} For each stress period, time step, and layer for which data are saved to the binary output file, the following two records are written: @@ -261,7 +261,7 @@ \subsubsection{DISU Grids} \subsubsection{Advanced Flow and Transport Packages} \vspace{5mm} -The dependent variable can be saved to a binary file for the LAK, SFR, and MAW Packages of the GWF Model and for the LKT, SFT, MWT, and UZT Packages of the GWT Model. Table~\ref{table:adpdv} shows the text identifier and description of the dependent variable for these packages. +The dependent variable can be saved to a binary file for the LAK, SFR, and MAW Packages of the GWF Model; LKT, SFT, MWT, and UZT Packages of the GWT Model; and LKE, SFE, MWE, and UZE Packages of the GWE Model. For the UZF Package within a GWF Model, the calculated water content may be written to a binary output file. Table~\ref{table:adpdv} shows the text identifier and description of the dependent variable for these packages. \begin{longtable}{p{3cm} p{3.5 cm} p{5cm}} \caption{Dependent variable written for advanced flow and transport packages} @@ -280,6 +280,10 @@ \subsubsection{Advanced Flow and Transport Packages} GWT/SFT & CONCENTRATION & Simulated stream reach concentration \\ GWT/MWT & CONCENTRATION & Simulated well concentration \\ GWT/UZT & CONCENTRATION & Simulated unsaturated zone cell concentration \\ +GWE/LKE & TEMPERATURE & Simulated lake temperature \\ +GWE/SFE & TEMPERATURE & Simulated stream reach temperature \\ +GWE/MWE & TEMPERATURE & Simulated well temperature \\ +GWE/UZE & TEMPERATURE & Simulated unsaturated zone cell temperature \\ \label{table:adpdv} \end{longtable} @@ -307,7 +311,7 @@ \subsubsection{Advanced Flow and Transport Packages} \newpage \subsection{Model Budget Files} -\mf can optionally write a budget file, also referred to as a cell-by-cell flow file. The budget file is written in a binary format that can be post-processed using other software programs, such as ZONEBUDGET. The budget file for the \mf models, such as the GWF and GWT Models, contains intercell water and solute flows, flows due to changes in storage, flows from the stress packages and advanced stress packages, and exchange flows with another model. The intent of budget file is to contain all flow to and from any cell in the model. Users must activate saving of flow terms in the Output Control Package and in the individual packages. +\mf can optionally write a budget file, also referred to as a cell-by-cell flow file. The budget file is written in a binary format that can be post-processed using other software programs, such as ZONEBUDGET. The budget file for the \mf models, such as the GWF, GWT, and GWE Models, contains intercell water, solute, and energy flows. Flows result from changes in storage, flows from the stress packages and advanced stress packages, and exchange flows with another model. The intent of budget file is to contain all flow to and from any cell in the model. Users must activate saving of flow terms in the Output Control Package and in the individual packages. The format for the budget file is different from the formats for previous MODFLOW versions. Specifically, intercell flows are written in a different manner using a compressed sparse row storage scheme. The record structure for the stress packages is also different and uses a method code 6, to distinguish it from the five method codes available in previous MODFLOW versions. The new code 6 indicates that additional text identifiers are present, that auxiliary variables may be present, and that two identifying integer numbers are contained in the list (one for the node number of the GWF Model cell, and the other for an identifier to where the flow is from). @@ -384,7 +388,7 @@ \subsubsection{Intercell Flows} \end{verbatim} \subsubsection{Variations for Discretization Types} -The format for the GWF and GWT Model budget files is the same no matter what discretization package is used; however, the variables may have different meanings depending on the grid type and the TEXT identifier. If the TEXT identifier in Record 1 is FLOW-JA-FACE and IMETH is 1, then the DATA array contains intercell flows and is of size NJA. If the TEXT identifier in Record 1 is something other than FLOW-JA-FACE (STO-SS or STO-SY, for example), then the dimension variables in Record 1 (NDIM1, NDIM2, and NDIM3) provide information about the size of the grid (table \ref{table:ndim}). +The format for the GWF, GWT, and GWE Model budget files is the same no matter what discretization package is used; however, the variables may have different meanings depending on the grid type and the TEXT identifier. If the TEXT identifier in Record 1 is FLOW-JA-FACE and IMETH is 1, then the DATA array contains intercell flows and is of size NJA. If the TEXT identifier in Record 1 is something other than FLOW-JA-FACE (STO-SS or STO-SY, for example), then the dimension variables in Record 1 (NDIM1, NDIM2, and NDIM3) provide information about the size of the grid (table \ref{table:ndim}). \begin{longtable}{p{3cm} p{3cm} p{3cm} p{3cm}} \caption{Budget file variations that depend on discretization package type} @@ -617,7 +621,7 @@ \subsubsection{GWF Model LAK, MAW, SFR, and UZF Packages} \newpage \subsubsection{Budget File Contents for the GWT Model} -The type of information that is written to the budget file for a GWT Model depends on the packages used for the model and whether or not the save flags are set. Table \ref{table:gwtbud} contains a list of the types of information that may be contained in a GWT Model budget file. In all cases, the flows in table \ref{table:gwtbud} are solute mass flows (in mass per time) to or a from a GWT Model cell. Intercell flows are written as FLOW-JA-FACE using IMETH=1. +The type of information that is written to the budget file for a GWT Model depends on the packages used for the model and whether or not the save flags are set. Table \ref{table:gwtbud} contains a list of the types of information that may be contained in a GWT Model budget file. In all cases, the flows in table \ref{table:gwtbud} are solute mass flows (in mass per time) to or from a GWT Model cell. Intercell flows are written as FLOW-JA-FACE using IMETH=1. The remaining flow terms in table \ref{table:gwtbud} are all written using IMETH=6. When IMETH=6 is used, the records contain additional text descriptors and two identifying numbers. For all records in the GWT Model budget file, TXT1ID1 is the name of the GWT Model and TXT2ID1 is also the name of the GWT Model. These text identifiers describe what is contained in ID1. For the GWT Model budget file, ID1 is the cell or node number in the GWT Model grid. The second set of text identifiers refer to the information in ID2. Unless noted otherwise in the description in table \ref{table:gwtbud}, TXT1ID2 is the name of the GWT Model, TXT2ID2 is the name of the package, and ID2 is the bound number in the package; for example, this is the first constant concentration cell, second constant concentration cell, and so forth. @@ -652,6 +656,40 @@ \subsubsection{GWT Model LKT, MWT, SFT, and UZT Packages} \vspace{5mm} For each stress period, time step, and data type that is saved to the LKT, MWT, SFT, and UZT Packages binary output files as \texttt{IMETH=6} budget file type. For all advanced transport packages, \texttt{NDIM1} is equal to the number of nodes, \texttt{NDIM2} is equal to 1, and \texttt{NDIM3} is equal to -1. The data that are written to the LKT, MWT, SFT, and UZT Package binary files are mass flows with entries similar to those listed in Tables~\ref{table:binarylak} to~\ref{table:binaryuzf} for the advanced flow packages. +\newpage +\subsubsection{Budget File Contents for the GWE Model} + +The type of information that is written to the budget file for a GWE Model depends on the packages used for the model and whether or not the save flags are set. Table \ref{table:gwebud} contains a list of the types of information that may be contained in a GWE Model budget file. In all cases, the flows in table \ref{table:gwebud} are thermal energy flows (in energy per time) to or from a GWE Model cell. Intercell flows are written as FLOW-JA-FACE using IMETH=1. + +The remaining flow terms in table \ref{table:gwebud} are all written using IMETH=6. When IMETH=6 is used, the records contain additional text descriptors and two identifying numbers. For all records in the GWE Model budget file, TXT1ID1 is the name of the GWE Model and TXT2ID1 is also the name of the GWE Model. These text identifiers describe what is contained in ID1. For the GWE Model budget file, ID1 is the cell or node number in the GWE Model grid. The second set of text identifiers refer to the information in ID2. Unless noted otherwise in the description in table \ref{table:gwebud}, TXT1ID2 is the name of the GWE Model, TXT2ID2 is the name of the package, and ID2 is the bound number in the package; for example, this is the first constant temperature cell, second constant temperature cell, and so forth. + +\begin{longtable}{p{3.5cm} p{2cm} p{9cm}} +\caption{Types of information that may be contained in the GWE Model budget file. All terms represent thermal energy flows in dimensions of energy per time} +\tabularnewline +\hline +\textbf{Flow Type (TEXT)} & \textbf{Method Code (IMETH)} & \textbf{Description} \\ +\hline +\endhead +\hline +\endfoot +\texttt{FLOW-JA-FACE} & 1 & intercell energy flow due to advection, conduction, and dispersion; array of size(NJA) \\ +\texttt{STORAGE-AQUEOUS} & 1 & energy aqueous storage; array of size (NCELLS) \\ +\texttt{SOURCE-SINK MIX} & 6 & energy flow to and from SSM sources and sinks \\ +\texttt{CTP} & 6 & energy flow for constant-temperature cells \\ +\texttt{ESL} & 6 & energy flow for specified energy source loading cells \\ +\texttt{LKE} & 6 & energy flow between lake and aquifer \\ +\texttt{SFE} & 6 & energy flow between stream and aquifer \\ +\texttt{MWE} & 6 & energy flow between multi-aquifer well and aquifer \\ +\texttt{UZE} & 6 & energy flow between unsaturated zone cell and aquifer \\ +\texttt{FLOW-JA-FACE} & 6 & flow to or from a cell in another GWE Model (note that this is not implemented yet for the GWE Model); TXT1ID1 is the name of the GWE Model described by this budget file, TXT2ID1 is the name of the GWF-GWF Exchange, TXT1ID2 is the name of the connected GWE Model, TXT2ID2 is the name of the GWE-GWE Exchange, and ID2 is the cell or node number of the cell in the connected model \\ +\label{table:gwebud} +\end{longtable} + +\subsubsection{GWE Model LKE, MWE, SFE, and UZE Packages} + +\vspace{5mm} +For each stress period, time step, and data type that is saved to the LKE, MWE, SFE, and UZE Packages binary output files as \texttt{IMETH=6} budget file type. For all advanced transport packages, \texttt{NDIM1} is equal to the number of nodes, \texttt{NDIM2} is equal to 1, and \texttt{NDIM3} is equal to -1. The data that are written to the LKE, MWE, SFE, and UZE Package binary files are mass flows with entries similar to those listed in Tables~\ref{table:binarylak} to~\ref{table:binaryuzf} for the advanced flow packages. + \newpage \subsubsection{Budget File Contents for the PRT Model} From 2befc976e58365990ea8ad9a14043d393afbbc41 Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Mon, 20 May 2024 15:02:35 -0700 Subject: [PATCH 186/199] docs(MODFLOW6References.bib): correct url links (#1834) * docs(MODFLOW6References.bib): correct url links * fix minor typos in OC * Add comment line to gwe apt example observation .tex files for improved readability * add missing comma in *.bib file --- doc/MODFLOW6References.bib | 6 +- doc/mf6io/mf6ivar/dfn/gwe-oc.dfn | 6 +- .../mf6ivar/examples/gwe-lke-example-obs.dat | 37 +++++----- .../mf6ivar/examples/gwe-mwe-example-obs.dat | 73 ++++++++++--------- .../mf6ivar/examples/gwe-sfe-example-obs.dat | 35 ++++----- .../mf6ivar/examples/gwe-uze-example-obs.dat | 11 +-- 6 files changed, 87 insertions(+), 81 deletions(-) diff --git a/doc/MODFLOW6References.bib b/doc/MODFLOW6References.bib index 501fcf77295..805103bfe5c 100644 --- a/doc/MODFLOW6References.bib +++ b/doc/MODFLOW6References.bib @@ -614,7 +614,8 @@ @book{langevin2002seawat Institution = {U.S. Geological Survey}, Series = {{U.S. Geological Survey Techniques of Water-Resources Investigations book 6, Chapter A7, 77 p.}}, Title = {User's Guide to SEAWAT: A Computer Program for Simulation of Three-Dimensional Variable-Density Ground-Water Flow}, - Url = {https://pubs.er.usgs.gov/publication/ofr03426}, + Url = {https://pubs.usgs.gov/publication/twri06A7}, + doi = {https://doi.org/10.3133/twri06A7}, Urldate = {July 25, 2019}, Year = {2002}, Bdsk-Url-1 = {https://pubs.er.usgs.gov/publication/tm6A22}} @@ -3004,8 +3005,9 @@ @book{panday2019bct Date-Added = {2024-05-16 00:00:00 -0000}, Institution = {GSI Environmental}, Title = {USG-Transport Version 1.4.0: The Block-Centered Transport Process for MODFLOW-USG}, - Url = {http://www.gsi-net.com/en/software/free-software/USG-Transport.html}, + Url = {http://gmsdocs.aquaveo.com.s3.amazonaws.com/GWT_v1-4-0.pdf}, Year = {2019}} + @article{zhang2012, Author = {Zhang, Y and King, M J and Datta-Gupta, A}, Date-Added = {2024-05-15 00:00:00 +0000}, diff --git a/doc/mf6io/mf6ivar/dfn/gwe-oc.dfn b/doc/mf6io/mf6ivar/dfn/gwe-oc.dfn index 296113c7ba6..74020a36b61 100644 --- a/doc/mf6io/mf6ivar/dfn/gwe-oc.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwe-oc.dfn @@ -1,4 +1,4 @@ -# --------------------- gwt oc options --------------------- +# --------------------- gwe oc options --------------------- block options name budget_filerecord @@ -108,7 +108,7 @@ reader urword tagged false optional false longname file keyword -description name of the output file to write conc information. +description name of the output file to write temperature information. block options name temperatureprintrecord @@ -186,7 +186,7 @@ longname write format description write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. -# --------------------- gwt oc period --------------------- +# --------------------- gwe oc period --------------------- block period name iper diff --git a/doc/mf6io/mf6ivar/examples/gwe-lke-example-obs.dat b/doc/mf6io/mf6ivar/examples/gwe-lke-example-obs.dat index c37a5c8f190..aa68bc3961f 100644 --- a/doc/mf6io/mf6ivar/examples/gwe-lke-example-obs.dat +++ b/doc/mf6io/mf6ivar/examples/gwe-lke-example-obs.dat @@ -4,22 +4,23 @@ BEGIN options END options BEGIN continuous FILEOUT gwe_lke02.lke.obs.csv - lke-1-temp TEMPERATURE 1 - lke-1-extinflow EXT-INFLOW 1 - lke-1-rain RAINFALL 1 - lke-1-roff RUNOFF 1 - lke-1-wdrl WITHDRAWAL 1 - lke-1-stor STORAGE 1 - lke-1-const CONSTANT 1 - lke-1-gwe1 LKE 1 1 - lke-1-gwe2 LKE 1 2 - lke-2-gwe1 LKE 2 1 - lke-1-mylake1 LKE MYLAKE1 - lke-1-fjf FLOW-JA-FACE 1 2 - lke-2-fjf FLOW-JA-FACE 2 1 - lke-3-fjf FLOW-JA-FACE 2 3 - lke-4-fjf FLOW-JA-FACE 3 2 - lke-5-fjf FLOW-JA-FACE MYLAKE1 - lke-6-fjf FLOW-JA-FACE MYLAKE2 - lke-7-fjf FLOW-JA-FACE MYLAKE3 +# obsname obstype id1 id2 + lke-1-temp TEMPERATURE 1 + lke-1-extinflow EXT-INFLOW 1 + lke-1-rain RAINFALL 1 + lke-1-roff RUNOFF 1 + lke-1-wdrl WITHDRAWAL 1 + lke-1-stor STORAGE 1 + lke-1-const CONSTANT 1 + lke-1-gwe1 LKE 1 1 + lke-1-gwe2 LKE 1 2 + lke-2-gwe1 LKE 2 1 + lke-1-mylake1 LKE MYLAKE1 + lke-1-fjf FLOW-JA-FACE 1 2 + lke-2-fjf FLOW-JA-FACE 2 1 + lke-3-fjf FLOW-JA-FACE 2 3 + lke-4-fjf FLOW-JA-FACE 3 2 + lke-5-fjf FLOW-JA-FACE MYLAKE1 + lke-6-fjf FLOW-JA-FACE MYLAKE2 + lke-7-fjf FLOW-JA-FACE MYLAKE3 END continuous diff --git a/doc/mf6io/mf6ivar/examples/gwe-mwe-example-obs.dat b/doc/mf6io/mf6ivar/examples/gwe-mwe-example-obs.dat index a3a8ced3ad9..86ef7a8b9bf 100644 --- a/doc/mf6io/mf6ivar/examples/gwe-mwe-example-obs.dat +++ b/doc/mf6io/mf6ivar/examples/gwe-mwe-example-obs.dat @@ -4,40 +4,41 @@ BEGIN options END options BEGIN continuous FILEOUT gwe_mwe_02.mwe.obs.csv - mwe1mwe MWE 1 1 - mwe2mwe MWE 2 1 - mwe3mwe MWE 3 1 - mwe4mwe MWE 4 1 - mwe1temp TEMPERATURE 1 - mwe2temp TEMPERATURE 2 - mwe3temp TEMPERATURE 3 - mwe4temp TEMPERATURE 4 - mwe1stor STORAGE 1 - mwe2stor STORAGE 2 - mwe3stor STORAGE 3 - mwe4stor STORAGE 4 - mwe1cnst CONSTANT 1 - mwe2cnst CONSTANT 2 - mwe3cnst CONSTANT 3 - mwe4cnst CONSTANT 4 - mwe1fmvr FROM-MVR 1 - mwe2fmvr FROM-MVR 2 - mwe3fmvr FROM-MVR 3 - mwe4fmvr FROM-MVR 4 - mwe1rate RATE 1 - mwe2rate RATE 2 - mwe3rate RATE 3 - mwe4rate RATE 4 - mwe1rtmv RATE-TO-MVR 1 - mwe2rtmv RATE-TO-MVR 2 - mwe3rtmv RATE-TO-MVR 3 - mwe4rtmv RATE-TO-MVR 4 - mwe1fwrt FW-RATE 1 - mwe2fwrt FW-RATE 2 - mwe3fwrt FW-RATE 3 - mwe4fwrt FW-RATE 4 - mwe1frtm FW-RATE-TO-MVR 1 - mwe2frtm FW-RATE-TO-MVR 2 - mwe3frtm FW-RATE-TO-MVR 3 - mwe4frtm FW-RATE-TO-MVR 4 +# obsname obstype id1 id2 + mwe1mwe MWE 1 1 + mwe2mwe MWE 2 1 + mwe3mwe MWE 3 1 + mwe4mwe MWE 4 1 + mwe1temp TEMPERATURE 1 + mwe2temp TEMPERATURE 2 + mwe3temp TEMPERATURE 3 + mwe4temp TEMPERATURE 4 + mwe1stor STORAGE 1 + mwe2stor STORAGE 2 + mwe3stor STORAGE 3 + mwe4stor STORAGE 4 + mwe1cnst CONSTANT 1 + mwe2cnst CONSTANT 2 + mwe3cnst CONSTANT 3 + mwe4cnst CONSTANT 4 + mwe1fmvr FROM-MVR 1 + mwe2fmvr FROM-MVR 2 + mwe3fmvr FROM-MVR 3 + mwe4fmvr FROM-MVR 4 + mwe1rate RATE 1 + mwe2rate RATE 2 + mwe3rate RATE 3 + mwe4rate RATE 4 + mwe1rtmv RATE-TO-MVR 1 + mwe2rtmv RATE-TO-MVR 2 + mwe3rtmv RATE-TO-MVR 3 + mwe4rtmv RATE-TO-MVR 4 + mwe1fwrt FW-RATE 1 + mwe2fwrt FW-RATE 2 + mwe3fwrt FW-RATE 3 + mwe4fwrt FW-RATE 4 + mwe1frtm FW-RATE-TO-MVR 1 + mwe2frtm FW-RATE-TO-MVR 2 + mwe3frtm FW-RATE-TO-MVR 3 + mwe4frtm FW-RATE-TO-MVR 4 END continuous FILEOUT gwe_mwe_02.mwe.obs.csv \ No newline at end of file diff --git a/doc/mf6io/mf6ivar/examples/gwe-sfe-example-obs.dat b/doc/mf6io/mf6ivar/examples/gwe-sfe-example-obs.dat index ec5baaedc76..f3c7b651af5 100644 --- a/doc/mf6io/mf6ivar/examples/gwe-sfe-example-obs.dat +++ b/doc/mf6io/mf6ivar/examples/gwe-sfe-example-obs.dat @@ -4,21 +4,22 @@ BEGIN options END options BEGIN continuous FILEOUT gwe_sfe02.sfe.obs.csv - sfe-1-temp TEMPERATURE 1 - sfe-1-extinflow EXT-INFLOW 1 - sfe-1-rain RAINFALL 1 - sfe-1-roff RUNOFF 1 - sfe-1-stor STORAGE 1 - sfe-1-const CONSTANT 1 - sfe-1-gwe1 SFE 1 1 - sfe-1-gwe2 SFE 1 2 - sfe-2-gwe1 SFE 2 1 - sfe-1-mylake1 SFE MYREACHES - sfe-1-fjf FLOW-JA-FACE 1 2 - sfe-2-fjf FLOW-JA-FACE 2 1 - sfe-3-fjf FLOW-JA-FACE 2 3 - sfe-4-fjf FLOW-JA-FACE 3 2 - sfe-5-fjf FLOW-JA-FACE MYREACH1 - sfe-6-fjf FLOW-JA-FACE MYREACH2 - sfe-7-fjf FLOW-JA-FACE MYREACH3 +# obsname obstype id1 id2 + sfe-1-temp TEMPERATURE 1 + sfe-1-extinflow EXT-INFLOW 1 + sfe-1-rain RAINFALL 1 + sfe-1-roff RUNOFF 1 + sfe-1-stor STORAGE 1 + sfe-1-const CONSTANT 1 + sfe-1-gwe1 SFE 1 1 + sfe-1-gwe2 SFE 1 2 + sfe-2-gwe1 SFE 2 1 + sfe-1-mylake1 SFE MYREACHES + sfe-1-fjf FLOW-JA-FACE 1 2 + sfe-2-fjf FLOW-JA-FACE 2 1 + sfe-3-fjf FLOW-JA-FACE 2 3 + sfe-4-fjf FLOW-JA-FACE 3 2 + sfe-5-fjf FLOW-JA-FACE MYREACH1 + sfe-6-fjf FLOW-JA-FACE MYREACH2 + sfe-7-fjf FLOW-JA-FACE MYREACH3 END continuous diff --git a/doc/mf6io/mf6ivar/examples/gwe-uze-example-obs.dat b/doc/mf6io/mf6ivar/examples/gwe-uze-example-obs.dat index 3859fd40ff1..689f9be88c0 100644 --- a/doc/mf6io/mf6ivar/examples/gwe-uze-example-obs.dat +++ b/doc/mf6io/mf6ivar/examples/gwe-uze-example-obs.dat @@ -4,9 +4,10 @@ BEGIN options END options BEGIN continuous FILEOUT gwe_02.uze.obs.csv - mwe-1-temp TEMPERATURE 1 - mwe-1-stor STORAGE 1 - mwe-1-gwe1 UZE 1 - mwe-1-gwe2 UZE 2 - mwe-2-gwe1 UZE 3 +# obsname obstype id1 id2 + mwe-1-temp TEMPERATURE 1 + mwe-1-stor STORAGE 1 + mwe-1-gwe1 UZE 1 + mwe-1-gwe2 UZE 2 + mwe-2-gwe1 UZE 3 END continuous From 977a7acd31a03dedabc61216c4fdfbcfe3c4aab3 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Mon, 20 May 2024 19:18:25 -0500 Subject: [PATCH 187/199] docs(release): updates for 6.5.0 release (#1836) --- doc/ReleaseNotes/ReleaseNotes.tex | 20 ++++++++++++++------ doc/mf6io/body.tex | 5 +++++ doc/mf6io/ems.tex | 1 + doc/mf6io/mf6ivar/dfn/prt-prp.dfn | 1 - doc/mf6io/mf6ivar/dfn/sim-nam.dfn | 2 +- doc/mf6io/mf6ivar/md/mf6ivar.md | 4 ++-- doc/mf6io/mf6ivar/tex/gwe-oc-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/sim-nam-desc.tex | 2 +- src/Model/SurfaceWaterFlow/swf.f90 | 26 ++------------------------ 9 files changed, 27 insertions(+), 36 deletions(-) create mode 100644 doc/mf6io/ems.tex diff --git a/doc/ReleaseNotes/ReleaseNotes.tex b/doc/ReleaseNotes/ReleaseNotes.tex index 2a9a2ce40a2..c8d3cce6157 100644 --- a/doc/ReleaseNotes/ReleaseNotes.tex +++ b/doc/ReleaseNotes/ReleaseNotes.tex @@ -254,17 +254,25 @@ \section{Installation and Execution} % ------------------------------------------------- \section{Compiling MODFLOW~6} -MODFLOW~6 has been compiled using Intel Fortran and GNU Fortran on Windows, macOS, and several Linux operating systems. All MODFLOW~6 distributions are currently compiled with Intel Fortran. Because the program uses relatively new Fortran functionality, recent versions of the compilers may be required for successful compilation. MODFLOW~6 is not yet compatible with the latest versions of the Intel toolchain, however. +MODFLOW~6 has been compiled using Intel Fortran and GNU Fortran on Windows, macOS, and several Linux operating systems. All MODFLOW~6 distributions are currently compiled with Intel Fortran. Because the program uses relatively new Fortran functionality, recent versions of the compilers may be required for successful compilation. MODFLOW~6 has been successfully compiled with the latest versions of the Intel toolchain. -MODFLOW~6 is currently tested with gfortran 7-12 on Linux and gfortran 12 on macOS and Windows. The gfortran version can be queried with ``\verb|gfortran --version|''. Intel Fortran Compiler Classic version 2022.3.0 is currently tested on all three platforms. Some 2021 versions have also been reported compatible. At this time, MODFLOW~6 is not compatible with the next-generation Intel Fortran Compiler `ifx`. +MODFLOW~6 is currently tested with gfortran 11-13 on Linux, macOS, and Windows. The gfortran version can be queried with ``\verb|gfortran --version|''. Intel Fortran Compiler Classic version 2022.3.0 is currently tested on all three platforms. Some 2021 versions have also been reported compatible. MODFLOW~6 is also compatible with the next-generation Intel Fortran Compiler `ifx`; however, additional testing is underway. -Meson is the recommended build tool for MODFLOW~6. For more detailed compilation instructions, please refer to \url{https://github.com/MODFLOW-USGS/modflow6/blob/develop/DEVELOPER.md#building}. +Instructions for compiling the parallel version of MODFLOW~6 are available through a dedicated page on the \href{https://github.com/MODFLOW-USGS/modflow6/wiki/Parallel-MODFLOW-User-Guide}{MODFLOW~6 repository}. -This distribution contains the Microsoft Visual Studio solution and project files for compiling MODFLOW~6 on Windows using the Intel Fortran Compiler Classic. The files have been used successfully with recent versions of Microsoft Visual Studio Community 2019 and the Intel Fortran Compiler Classic. +There are several options for building MODFLOW, as described below. -This distribution also includes a makefile for compiling MODFLOW~6 with \texttt{gfortran}. The makefile is contained in the \texttt{make} folder. +\begin{itemize} + +\item Meson is the recommended build tool for MODFLOW~6. Refer to the \href{https://github.com/MODFLOW-USGS/modflow6/blob/develop/DEVELOPER.md#building}{detailed compilation instructions} for more information. + +\item The distribution includes Microsoft Visual Studio solution and project files for compiling MODFLOW~6 on Windows using the Intel Fortran Compiler Classic. The files have been used successfully with recent versions of Microsoft Visual Studio Community 2019 and the Intel Fortran Compiler Classic. -For those familiar with Python, the pymake package can also be used to compile MODFLOW~6. Additional information on the Python pymake utility can be found at: \url{https://github.com/modflowpy/pymake}. +\item This distribution also includes a makefile for compiling MODFLOW~6 with \texttt{gfortran}. The makefile is contained in the \texttt{make} folder. + +\item For those familiar with Python, the \href{https://github.com/modflowpy/pymake}{pymake package} can also be used to compile MODFLOW~6. + +\end{itemize} % ------------------------------------------------- \section{System Requirements} diff --git a/doc/mf6io/body.tex b/doc/mf6io/body.tex index 896eebed00a..4933f668e7f 100644 --- a/doc/mf6io/body.tex +++ b/doc/mf6io/body.tex @@ -65,6 +65,11 @@ \SECTION{Iterative Model Solution} \input{ims.tex} +%Explicit Model Solution (IMS) +\newpage +\SECTION{Explicit Model Solution} +\input{ems.tex} + %OBS Utility Input Instructions \newpage \SECTION{Observation (OBS) Utility} diff --git a/doc/mf6io/ems.tex b/doc/mf6io/ems.tex new file mode 100644 index 00000000000..809aa26327a --- /dev/null +++ b/doc/mf6io/ems.tex @@ -0,0 +1 @@ +An explicit model solution (EMS) is specified within the SOLUTIONGROUP block in the simulation name file. The explicit model solution requires the individual models that are added to it to solve themselves. The explicit model solution presently works with the Particle Tracking (PRT) Model, which solves for particle trajectories. The current input file for EMS has no options or input; however an empty input file is required if EMS is required for particle tracking. \ No newline at end of file diff --git a/doc/mf6io/mf6ivar/dfn/prt-prp.dfn b/doc/mf6io/mf6ivar/dfn/prt-prp.dfn index 288c86693ac..38577f3c260 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-prp.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-prp.dfn @@ -25,7 +25,6 @@ reader urword optional true longname exit solve method description the method for iterative solution of particle exit location and time in the generalized Pollock's method. 1 Brent, 2 Chandrupatla. The default is Brent. -default_value 1 block options name exit_solve_tolerance diff --git a/doc/mf6io/mf6ivar/dfn/sim-nam.dfn b/doc/mf6io/mf6ivar/dfn/sim-nam.dfn index 4c255c45924..9ba8b3e52e2 100644 --- a/doc/mf6io/mf6ivar/dfn/sim-nam.dfn +++ b/doc/mf6io/mf6ivar/dfn/sim-nam.dfn @@ -220,7 +220,7 @@ in_record true tagged false reader urword longname type of solution -description is the type of solution. The Integrated Model Solution (IMS6) is the only supported option in this version. +description is the type of solution. The Integrated Model Solution (IMS6) and Explicit Model Solution (EMS6) are the only supported options in this version. block solutiongroup name slnfname diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 2b81909e81e..5f42818a62f 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -20,7 +20,7 @@ | SIM | NAM | EXCHANGES | EXGMNAMEB | STRING | is the name of the second model that is part of this exchange. | | SIM | NAM | SOLUTIONGROUP | GROUP_NUM | INTEGER | is the group number of the solution group. Solution groups must be numbered sequentially, starting with group number one. | | SIM | NAM | SOLUTIONGROUP | MXITER | INTEGER | is the maximum number of outer iterations for this solution group. The default value is 1. If there is only one solution in the solution group, then MXITER must be 1. | -| SIM | NAM | SOLUTIONGROUP | SLNTYPE | STRING | is the type of solution. The Integrated Model Solution (IMS6) is the only supported option in this version. | +| SIM | NAM | SOLUTIONGROUP | SLNTYPE | STRING | is the type of solution. The Integrated Model Solution (IMS6) and Explicit Model Solution (EMS6) are the only supported options in this version. | | SIM | NAM | SOLUTIONGROUP | SLNFNAME | STRING | name of file containing solution input. | | SIM | NAM | SOLUTIONGROUP | SLNMNAMES | STRING (:) | is the array of model names to add to this solution. The number of model names is determined by the number of model names the user provides on this line. | | SIM | TDIS | OPTIONS | TIME_UNITS | STRING | is the time units of the simulation. This is a text string that is used as a label within model output files. Values for time\_units may be ``unknown'', ``seconds'', ``minutes'', ``hours'', ``days'', or ``years''. The default time unit is ``unknown''. | @@ -386,7 +386,7 @@ | GWE | OC | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | | GWE | OC | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | | GWE | OC | OPTIONS | TEMPERATURE | KEYWORD | keyword to specify that record corresponds to temperature. | -| GWE | OC | OPTIONS | TEMPERATUREFILE | STRING | name of the output file to write conc information. | +| GWE | OC | OPTIONS | TEMPERATUREFILE | STRING | name of the output file to write temperature information. | | GWE | OC | OPTIONS | PRINT_FORMAT | KEYWORD | keyword to specify format for printing to the listing file. | | GWE | OC | OPTIONS | COLUMNS | INTEGER | number of columns for writing data. | | GWE | OC | OPTIONS | WIDTH | INTEGER | width for writing each number. | diff --git a/doc/mf6io/mf6ivar/tex/gwe-oc-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-oc-desc.tex index 5cf6ff3a1d4..58a94c7053c 100644 --- a/doc/mf6io/mf6ivar/tex/gwe-oc-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwe-oc-desc.tex @@ -15,7 +15,7 @@ \item \texttt{TEMPERATURE}---keyword to specify that record corresponds to temperature. -\item \texttt{temperaturefile}---name of the output file to write conc information. +\item \texttt{temperaturefile}---name of the output file to write temperature information. \item \texttt{PRINT\_FORMAT}---keyword to specify format for printing to the listing file. diff --git a/doc/mf6io/mf6ivar/tex/sim-nam-desc.tex b/doc/mf6io/mf6ivar/tex/sim-nam-desc.tex index d2cdd279c73..9d340cf15aa 100644 --- a/doc/mf6io/mf6ivar/tex/sim-nam-desc.tex +++ b/doc/mf6io/mf6ivar/tex/sim-nam-desc.tex @@ -55,7 +55,7 @@ \item \texttt{mxiter}---is the maximum number of outer iterations for this solution group. The default value is 1. If there is only one solution in the solution group, then MXITER must be 1. -\item \texttt{slntype}---is the type of solution. The Integrated Model Solution (IMS6) is the only supported option in this version. +\item \texttt{slntype}---is the type of solution. The Integrated Model Solution (IMS6) and Explicit Model Solution (EMS6) are the only supported options in this version. \item \texttt{slnfname}---name of file containing solution input. diff --git a/src/Model/SurfaceWaterFlow/swf.f90 b/src/Model/SurfaceWaterFlow/swf.f90 index 3cc58488991..ca6d1c950b0 100644 --- a/src/Model/SurfaceWaterFlow/swf.f90 +++ b/src/Model/SurfaceWaterFlow/swf.f90 @@ -3,36 +3,14 @@ !! !! This module contains the SWF Model !! -!! Status and remaining tasks -!! ONGOING -- Implement SWF infrastructure -!! DONE -- Implement Explicit Model Solution (EMS6) to handle explicit models -!! DONE -- Implement DISV1D Package -!! DONE -- Implement FLW Package to handle lateral and point inflows -!! DONE -- Transfer results into the flowja vector -!! DONE -- Implement strategy for storing outflow terms and getting them into budget -!! DONE -- Implement SWF and FLW advance routines to handle transient problems -!! DONE -- Implement storage terms and getting them into budget -!! DONE -- Observations -!! DONE -- Initial conditions? -!! DONE -- Rework the Iterative Model Solution (IMS6) to handle both implicit and explicit models -!! DONE -- Implement output control -!! DONE -- Add outflow as a dependent variable that can be written and printed (qoutflow) -!! DONE -- Revaluate explicit model solution and consider implementing ExplicitModelType? -!! DONE -- Add test of the binary outflow -!! DONE -- Rename Stream Network Flow (SWF) to Surface Water Flow (SWF) Model -!! DONE -- Rename segment to reach -!! Look into mass conservative MC method (https://hess.copernicus.org/articles/11/1645/2007/hess-11-1645-2007.pdf) +!! Remaining tasks !! Implement IDOMAIN support -!! Use dag_module to calculate iseg_order (if iseg_order not specified by user) -!! We may need subcells and subtiming to improve accuracy -!! Add support for nonlinear Muskingum Cunge -!! Deal with the timestep and subtiming issues !! Flopy support for DISV1D and DISV1D binary grid file !! Flopy support for .output() method for SWF !! Mover support? !! SWF-SWF Exchange !! SWF-SWF Exchange in parallel -!! Create QGW package for leakage into or out of groundwater +!! GHB-like package for aquifer exchange as a stress package !! !< module SwfModule From 3ee1283f7bfbd60509653f44f23d161ba30aafe7 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 21 May 2024 09:08:07 -0400 Subject: [PATCH 188/199] docs(PRT): revise mf6io and supptechinfo (#1833) Incorporate fixes and suggestions from @rbwinst-usgs' review. Co-authored-by: aprovost-usgs --- doc/MODFLOW6References.bib | 4 ++-- doc/SuppTechInfo/particle-tracking-model.tex | 10 ++++---- doc/mf6io/framework/binaryoutput.tex | 2 +- doc/mf6io/mf6ivar/dfn/prt-mip.dfn | 2 +- doc/mf6io/mf6ivar/dfn/prt-oc.dfn | 6 ++--- doc/mf6io/mf6ivar/dfn/prt-prp.dfn | 16 ++++++------- doc/mf6io/mf6ivar/md/mf6ivar.md | 24 ++++++++++---------- doc/mf6io/mf6ivar/tex/prt-mip-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/prt-oc-desc.tex | 6 ++--- doc/mf6io/mf6ivar/tex/prt-prp-desc.tex | 14 ++++++------ doc/mf6io/prt/prp.tex | 2 ++ doc/mf6io/prt/prt.tex | 9 +++++++- src/Model/ParticleTracking/prt-prp.f90 | 10 ++++++++ 13 files changed, 63 insertions(+), 44 deletions(-) diff --git a/doc/MODFLOW6References.bib b/doc/MODFLOW6References.bib index 805103bfe5c..293f1fddd3a 100644 --- a/doc/MODFLOW6References.bib +++ b/doc/MODFLOW6References.bib @@ -3018,7 +3018,7 @@ @article{zhang2012 Year = {2012}} @article{cordes1992, - Author = {Cordes C and Kinzelbach W}, + Author = {Cordes, C and Kinzelbach, W}, Date-Added = {2024-05-15 00:00:00 +0000}, Doi = {10.1029/92WR01686}, Journal = {Water Resources Research}, @@ -3030,7 +3030,7 @@ @article{cordes1992 @article{pollock2015, Author = {Pollock, D W}, Date-Added = {2024-05-15 00:00:00 +0000}, - Doi = {10.1111/gwat.123286}, + Doi = {10.1111/gwat.12328}, Journal = {Groundwater}, Title = {Extending the MODPATH algorithm to rectangular unstructured grids}, Volume = {54}, diff --git a/doc/SuppTechInfo/particle-tracking-model.tex b/doc/SuppTechInfo/particle-tracking-model.tex index 836fa7f7c3e..9ef7a6131cf 100644 --- a/doc/SuppTechInfo/particle-tracking-model.tex +++ b/doc/SuppTechInfo/particle-tracking-model.tex @@ -22,14 +22,14 @@ \subsection{Tracking Approach} \label{sec:trackingapproach} \noindent On DISV grids, which can contain a mix of rectangular, quad-refined, and non-rectangular cells, the PRT Model identifies the geometry of each cell and applies the most efficient tracking method possible. Rectagular cells do not need to be aligned with the model coordinate axes to be recognized as rectangular. Because measures of the cell geometry are compared with numerical tolerances, it is recommended that the cell vertex coordinates be written to double precision in the model input for a DISV grid. -By default, flows associated with stress packages are assumed to be distributed uniformly over the volume of a cell, as in MODPATH 7. Distributed external inflows and outflows are reflected in the cell-cell flows calculated by the GWF Model, but they are not directly involved in determining the normal face velocities used to track a particle through the cell. The user can optionally assign a flow associated with a stress package to any face of the cell. In MODPATH 7, this is done by setting the value of an input parameter called IFACE to a value that corresponds to one of the six faces of a rectangular cell (left, right, back, front, bottom, and top). In the PRT Model, assignment of external flows is done by setting the value of an input parameter called IFLOWFACE to a value that corresponds to one of the cell faces. To accommodate non-rectangular cells, the face numbering scheme in the PRT Model is different from that in MODPATH 7 and is based on clockwise ordering of the cell faces, as described in the \mf input instructions. +By default, flows associated with stress packages are assumed to be distributed uniformly over the volume of a cell, as in MODPATH 7. Distributed external inflows and outflows are reflected in the cell-cell flows calculated by the GWF Model, but they are not directly involved in determining the normal face velocities used to track a particle through the cell. The user can optionally assign a flow associated with a stress package to any face of the cell. In MODPATH 7, this is done by setting the value of an input parameter called IFACE to a value that corresponds to one of the six faces of a rectangular cell (left, right, front, back, bottom, and top). In the PRT Model, assignment of external flows is done by setting the value of an input parameter called IFLOWFACE to a value that corresponds to one of the cell faces. To accommodate non-rectangular cells, the face numbering scheme in the PRT Model is different from that in MODPATH 7 and is based on clockwise ordering of the cell faces, as described in the \mf input instructions. \subsection{Generalized Pollock's Method For Non-Rectangular Cells} \label{sec:genpollockmethod} \cite{zhang2012} review particle tracking methods that ``extend the widely used velocity interpolation algorithms, such as Pollock's algorithm, to more complex geometries." They classify methods according to (1) whether the method refines a cell into subcells, (2) the basis functions used to interpolate velocity, (3) whether the interpolated velocity is continuous throughout a cell, (4) and whether the method is locally conservative. The generalization of Pollock's method used in the PRT Model is new as of this writing, but it is related to the methods reviewed by \cite{zhang2012} and fits into their classification as described below: \begin{itemize} -\item The new method used in the PRT Model subdivides a polygonal cell (in plan view) radially into triangular subcells. Each subcell has one edge that coincides with a cell edge and two edges that are internal to the cell. The number of subcells equals the number of faces of the polygonal cell, and all subcells share a vertex at the centroid of cell. +\item The new method used in the PRT Model subdivides a polygonal cell (in plan view) radially into triangular subcells. Each subcell has one edge that coincides with a cell edge and two edges that are internal to the cell. The number of subcells equals the number of faces of the polygonal cell, and all subcells share a vertex at the centroid of cell. The cell centroid calculated by PRT is not necessarily identical to the cell center specified by the user for a DISV grid. \item Cell-face normal velocities are used to calculate a velocity vector at each vertex of each subcell, including the shared cell-centroid vertex. The basis functions used to interpolate velocity within a subcell are relatively ``low-order" in that they are linear, and the normal velocity is assumed to be constant along the subcell edge that coincides with a cell edge. However, they allow the normal velocity to vary along subcell edges that are internal to the cell, making them more flexible than the lowest-order (``RT\textsubscript{0} space") functions described by \cite{zhang2012}. \item Interpolated velocity vectors are discontinuous across boundaries between subcells in the sense that the component along the subcell boundary can be different on each side of the boundary. However, the normal component of velocity is continuous across subcell boundaries, as required by continuity of flow. The interpolated velocity is also continuous in the sense used by \cite{zhang2012}, which is that the subcells share a single cell-centroid velocity. Based on their testing of related methods, \cite{zhang2012} note that ``velocity continuity is not as important as local conservation for the purpose of streamline applications," i.e., particle tracking. \item The new method is locally conservative. In mathematical terms, this means that the divergence of the velocity field is uniform through each subcell and the same in all subcells, thereby honoring the divergence for the cell as a whole. In practical terms, it means that subcells will not appear to contain external sources or sinks of water or storage effects if the cell as a whole does not contain external sources, sinks, or storage effects. This helps avoid artificial convergence or spreading apart of closely adjacent particle tracks. @@ -43,7 +43,7 @@ \subsubsection{Calculation of vertex velocities} For a cell with $N$ polygon faces, the degrees of freedom are $4N$ cell-vertex velocity components and $2$ cell-centroid velocity components, for a total of $4N + 2$ degrees of freedom. The constraints are $2N$ known cell-face normal velocities, $N$ continuity conditions (equality of normal components) along boundaries between subcells, $N - 1$ independent local conservation conditions (equality of divergences), $2$ constraints from setting the cell-centroid velocity to a weighted average of the cell-vertex velocities, and $1$ ``closure constraint," for a total of $4N + 2$ constraints, which matches the number of degrees of freedom. -The closure constraint corresponds to Option 1 described by \cite{zhang2012} and is conceptually equivalent to the closure constraint used in Pollock's subcell method for quad refinement \citep{pollock2015}. It assumes that the velocity field in the cell is irrotational. This is a rigorous assumption provided the porosity and hydraulic conductivity are homogeneous throughout the cell, the hydraulic conductivity is isotropic, and density is uniform. In \mf, the porosity and hydraulic conductivity are homogeneous throughout a cell, but the hydraulic conductivity can be anisotropic and density can allowed to vary. Strictly speaking it is the head gradient, and not the velocity, that is irrotational in the general case. With 10:1 anisotropy, tests by \cite{zhang2012} of a low-order, locally conservative method with quadrilateral subcells showed ``negligible differences between the different closure constraints" they describe, which represent varying degrees of mathematical rigor. It is possible to incorporate a more mathematically rigorous closure constraint such as Option 2 presented by \cite{zhang2012}, which is due to \cite{cordes1992}, into the calculation of vertex velocities, but that has not been done in the version of the PRT Model described here. +The closure constraint corresponds to Option 1 described by \cite{zhang2012} and is conceptually equivalent to the closure constraint used in Pollock's subcell method for quad refinement \citep{pollock2015}. It assumes that the velocity field in the cell is irrotational. This is a rigorous assumption provided the porosity and hydraulic conductivity are homogeneous throughout the cell, the hydraulic conductivity is isotropic, and density is uniform. In \mf, the porosity and hydraulic conductivity are homogeneous throughout a cell, but the hydraulic conductivity can be anisotropic and density can be allowed to vary. Strictly speaking it is the head gradient, and not the velocity, that is irrotational in the general case. With 10:1 anisotropy, tests by \cite{zhang2012} of a low-order, locally conservative method with quadrilateral subcells showed ``negligible differences between the different closure constraints" they describe, which represent varying degrees of mathematical rigor. It is possible to incorporate a more mathematically rigorous closure constraint such as Option 2 presented by \cite{zhang2012}, which is due to \cite{cordes1992}, into the calculation of vertex velocities, but that has not been done in the version of the PRT Model described here. \subsubsection{Velocity Interpolation and Solution of the Particle Trajectory} @@ -61,7 +61,7 @@ \subsubsection{Velocity Interpolation and Solution of the Particle Trajectory} \label{eqn:vylinear} \end{equation} -\noindent where $t$ is time ($T$), subscripted $v$ indicates a velocity component ($L/T$) in the $\tilde{x}$ or $\tilde{y}$ direction, and $\tilde{x}$ and $\tilde{y}$ are Cartesian coordinates ($L$) with their origin at one of the subcell vertices that corresponds to a cell vertex, and rotated such that the $\tilde{y} = 0$ axis coincides with the cell face. Because the normal velocity is assumed to be uniform along the cell face, the coefficient $w_{\tilde{y} \tilde{x}}$ in equation \ref{eqn:vylinear} is zero, eliminating the dependence of equation \ref{eqn:vylinear} on $\tilde{x}$ and allowing it to be integrated analytically, independently of equation \ref{eqn:vxlinear}. The resulting expression for $\tilde{y}$ as a function of time can then be substituted into equation \ref{eqn:vxlinear} to yield an equation that can, once again, be integrated analytically to yield an expression for $\tilde{x}$ as a function of time. The particular forms of the analytical expressions depend on the values of and relationships between the coefficients in equations \ref{eqn:vxlinear} and \ref{eqn:vylinear}, and there are a number of special cases to consider. In any case, equipped with the appropriate expressions, one could guess a value of $t$, analytically calculate the corresponding values of $\tilde{x}$ and $\tilde{y}$, and continue updating one's guesses for $t$ until the point ($\tilde{x}$, $\tilde{y}$) landed on a subcell boundary, at which point the exit time and location of the particle would be known. +\noindent where $t$ is time ($T$), subscripted $v$ indicates a velocity component ($L/T$) in the $\tilde{x}$ or $\tilde{y}$ direction, and subscripted $w$ indicates the constant rate ($1/T$) at which a velocity component changes with $\tilde{x}$ or $\tilde{y}$. The coordinates $\tilde{x}$ and $\tilde{y}$ are Cartesian coordinates ($L$) with their origin at one of the subcell vertices that corresponds to a cell vertex, and rotated such that the $\tilde{y} = 0$ axis coincides with the cell face. Because the normal velocity is assumed to be uniform along the cell face, the coefficient $w_{\tilde{y} \tilde{x}}$ in equation \ref{eqn:vylinear} is zero, eliminating the dependence of equation \ref{eqn:vylinear} on $\tilde{x}$ and allowing it to be integrated analytically, independently of equation \ref{eqn:vxlinear}. The resulting expression for $\tilde{y}$ as a function of time can then be substituted into equation \ref{eqn:vxlinear} to yield an equation that can, once again, be integrated analytically to yield an expression for $\tilde{x}$ as a function of time. The particular forms of the analytical expressions depend on the values of and relationships between the coefficients in equations \ref{eqn:vxlinear} and \ref{eqn:vylinear}, and there are a number of special cases to consider. In any case, equipped with the appropriate expressions, one could guess a value of $t$, analytically calculate the corresponding values of $\tilde{x}$ and $\tilde{y}$, and continue updating one's guesses for $t$ until the point ($\tilde{x}$, $\tilde{y}$) landed on a subcell boundary, at which point the exit time and location of the particle would be known. To facilitate the identification of possible exit faces and bounding of possible solutions, and to streamline the solution procedure, the generalized Pollock's method transforms equations \ref{eqn:vxlinear} and \ref{eqn:vylinear} into nonorthogonal coordinates $\alpha$ and $\beta$ that correspond to barycentric coordinates on the triangular subcell. The coordinate transformation is linear and results in a pair of ordinary differential equations of the same general form as equations \ref{eqn:vxlinear} and \ref{eqn:vylinear}, with $\alpha$ and $\beta$ taking the places of $\tilde{x}$ and $\tilde{y}$, respectively. The equation for $\beta$ is effectively decoupled from the equation for $\alpha$, which ultimately allows $\alpha$ and $\beta$ to be expressed explicitly as functions of time. @@ -94,7 +94,7 @@ \subsection{Summary of Main Assumptions and Limitations} \item ``Backward tracking" is not supported explicitly. However, backward tracking can be performed by preprocessing the binary budget and head files to reverse the chronological order of the flow and head information. FloPy \citep{bakker2016flopy, hughes2023flopy, flopysoftware} provides utilities for this. \item For non-rectagular cells, a generalization of Pollock's method is used. This method is based on refinement of a polygon cell (in plan view) into triangular subcells, with a linear variation of velocity within each subcell that honors the cell-face normal flows generated by the associated GWF Model. Exit location and time are generally solved using an iterative, one-dimensional root-finding procedure, making the method semi-analytical. \item Cell-face normal velocities are assumed to be uniform along each cell face, as in Pollock's original method. This ``low-order" approximation has the advantage of preventing particles from crossing no-flow faces at the outer boundary of a model. -\item As in the methods described by \cite{zheng2012}, variations in fluid density are not accounted for when enforcing local conservation. +\item As in the methods described by \cite{zhang2012}, variations in fluid density are not accounted for when enforcing local conservation. \item The ``closure constraint" used in calculating cell-vertex velocities is approximate in the case of anisotropic hydraulic conductivity and/or variable density. It is conceptually equivalent to the closure closure constraint used in Pollock's subcell method for quad refinement \citep{pollock2015}. \item For a triangular cell, the generalized Pollock's method could be used to calculate the particle trajectory without refinement into triangular subcells. This would improve computational efficiency for triangular cells and will likely be programmed in a future version of the PRT Model. \end{itemize} diff --git a/doc/mf6io/framework/binaryoutput.tex b/doc/mf6io/framework/binaryoutput.tex index 9cafe51d8b0..923e52aebea 100644 --- a/doc/mf6io/framework/binaryoutput.tex +++ b/doc/mf6io/framework/binaryoutput.tex @@ -771,7 +771,7 @@ \subsection{Particle Track File} \noindent Field 12: \texttt{`X'} {\color{red} \footnotesize{DOUBLE}} \\ \noindent Field 13: \texttt{`Y'} {\color{red} \footnotesize{DOUBLE}} \\ \noindent Field 14: \texttt{`Z'} {\color{red} \footnotesize{DOUBLE}} \\ -\noindent Field 15: \texttt{`NAME'} {\color{red} \footnotesize{CHARACTER(LEN=LENTXT)}} \\ +\noindent Field 15: \texttt{`NAME'} {\color{red} \footnotesize{CHARACTER(LEN=40)}} \\ \vspace{4mm} \noindent The ``NAME'' field may be empty. diff --git a/doc/mf6io/mf6ivar/dfn/prt-mip.dfn b/doc/mf6io/mf6ivar/dfn/prt-mip.dfn index 74759df58f5..930952960d3 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-mip.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-mip.dfn @@ -38,4 +38,4 @@ reader readarray layered true optional true longname zone number -description is an integer zone number assigned to each cell. IZONE may be positive, negative, or zero. The current cell's zone number is recorded with each particle track datum. If the ISTOPZONE option is set to any value other than zero in a PRP Package, particles released by that PRP Package terminate if they enter a cell whose IZONE value matches ISTOPZONE. If ISTOPZONE is not specified or is set to zero in a PRP Package, IZONE has no effect on the termination of particles released by that PRP Package. +description is an integer zone number assigned to each cell. IZONE may be positive, negative, or zero. The current cell's zone number is recorded with each particle track datum. If a PRP package's ISTOPZONE option is set to any value other than zero, particles released by that PRP Package terminate if they enter a cell whose IZONE value matches ISTOPZONE. If ISTOPZONE is not specified or is set to zero in a PRP Package, IZONE has no effect on the termination of particles released by that PRP Package. Each PRP Package may configure a single ISTOPZONE value. diff --git a/doc/mf6io/mf6ivar/dfn/prt-oc.dfn b/doc/mf6io/mf6ivar/dfn/prt-oc.dfn index 8e0c1d34359..a3867142fd1 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-oc.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-oc.dfn @@ -96,7 +96,7 @@ reader urword tagged true optional false longname track keyword -description keyword to specify that record corresponds to a binary track file. +description keyword to specify that record corresponds to a binary track file. Each PRT Model's OC Package may have only one binary track output file. block options name trackfile @@ -108,7 +108,7 @@ reader urword tagged false optional false longname file keyword -description name of the output file to write tracking information. +description name of the binary output file to write tracking information. block options name trackcsv_filerecord @@ -129,7 +129,7 @@ reader urword tagged true optional false longname track keyword -description keyword to specify that record corresponds to a CSV track file. +description keyword to specify that record corresponds to a CSV track file. Each PRT Model's OC Package may have only one CSV track file. block options name trackcsvfile diff --git a/doc/mf6io/mf6ivar/dfn/prt-prp.dfn b/doc/mf6io/mf6ivar/dfn/prt-prp.dfn index 38577f3c260..5385a42966a 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-prp.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-prp.dfn @@ -61,7 +61,7 @@ reader urword tagged true optional false longname track keyword -description keyword to specify that record corresponds to a binary track output file. +description keyword to specify that record corresponds to a binary track output file. Each PRP Package may have a distinct binary track output file. block options name fileout @@ -84,7 +84,7 @@ reader urword tagged false optional false longname file keyword -description name of the output file to write tracking information. +description name of the binary output file to write tracking information. block options name trackcsv_filerecord @@ -105,7 +105,7 @@ reader urword tagged true optional false longname track keyword -description keyword to specify that record corresponds to a CSV track output file. +description keyword to specify that record corresponds to a CSV track output file. Each PRP Package may have a distinct CSV track output file. block options name trackcsvfile @@ -125,7 +125,7 @@ type double precision reader urword optional true longname stop time -description real value defining the maximum simulation time to which particles in the package can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when simulation time STOPTIME is reached. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the simulation time to which particles can be tracked. +description real value defining the maximum simulation time to which particles in the package can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when simulation time STOPTIME is reached. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the simulation time to which particles can be tracked. If STOPTIME and STOPTRAVELTIME are both provided, particles will be stopped if either is reached. block options name stoptraveltime @@ -133,7 +133,7 @@ type double precision reader urword optional true longname stop travel time -description real value defining the maximum travel time over which particles in the model can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when their travel time reaches STOPTRAVELTIME. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTRAVELTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the travel time over which particles can be tracked. +description real value defining the maximum travel time over which particles in the model can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when their travel time reaches STOPTRAVELTIME. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTRAVELTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the travel time over which particles can be tracked. If STOPTIME and STOPTRAVELTIME are both provided, particles will be stopped if either is reached. block options name stop_at_weak_sink @@ -188,7 +188,7 @@ in_record true tagged false repeating true longname release times -description times to release, relative to the beginning of the simulation. +description times to release, relative to the beginning of the simulation. RELEASE\_TIMES and RELEASE\_TIMESFILE are mutually exclusive. block options name release_timesfilerecord @@ -220,7 +220,7 @@ reader urword tagged false optional false longname file keyword -description name of the release times file +description name of the release times file. RELEASE\_TIMES and RELEASE\_TIMESFILE are mutually exclusive. block options name dev_forceternary @@ -228,7 +228,7 @@ type keyword reader urword optional false longname force ternary tracking method -description force use of the ternary tracking method regardless of cell type in disv grid +description force use of the ternary tracking method regardless of cell type in DISV grids. mf6internal ifrctrn diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 5f42818a62f..10cf4b62ebe 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -1574,7 +1574,7 @@ | PRT | MIP | OPTIONS | EXPORT_ARRAY_ASCII | KEYWORD | keyword that specifies input griddata arrays should be written to layered ascii output files. | | PRT | MIP | GRIDDATA | POROSITY | DOUBLE PRECISION (NODES) | is the aquifer porosity. | | PRT | MIP | GRIDDATA | RETFACTOR | DOUBLE PRECISION (NODES) | is a real value by which velocity is divided within a given cell. RETFACTOR can be used to account for solute retardation, i.e., the apparent effect of linear sorption on the velocity of particles that track solute advection. RETFACTOR may be assigned any real value. A RETFACTOR value greater than 1 represents particle retardation (slowing), and a value of 1 represents no retardation. The effect of specifying a RETFACTOR value for each cell is the same as the effect of directly multiplying the POROSITY in each cell by the proposed RETFACTOR value for each cell. RETFACTOR allows conceptual isolation of effects such as retardation from the effect of porosity. The default value is 1. | -| PRT | MIP | GRIDDATA | IZONE | INTEGER (NODES) | is an integer zone number assigned to each cell. IZONE may be positive, negative, or zero. The current cell's zone number is recorded with each particle track datum. If the ISTOPZONE option is set to any value other than zero in a PRP Package, particles released by that PRP Package terminate if they enter a cell whose IZONE value matches ISTOPZONE. If ISTOPZONE is not specified or is set to zero in a PRP Package, IZONE has no effect on the termination of particles released by that PRP Package. | +| PRT | MIP | GRIDDATA | IZONE | INTEGER (NODES) | is an integer zone number assigned to each cell. IZONE may be positive, negative, or zero. The current cell's zone number is recorded with each particle track datum. If a PRP package's ISTOPZONE option is set to any value other than zero, particles released by that PRP Package terminate if they enter a cell whose IZONE value matches ISTOPZONE. If ISTOPZONE is not specified or is set to zero in a PRP Package, IZONE has no effect on the termination of particles released by that PRP Package. Each PRP Package may configure a single ISTOPZONE value. | | PRT | NAM | OPTIONS | LIST | STRING | is name of the listing file to create for this PRT model. If not specified, then the name of the list file will be the basename of the PRT model name file and the '.lst' extension. For example, if the PRT name file is called ``my.model.nam'' then the list file will be called ``my.model.lst''. | | PRT | NAM | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of all model stress package information will be written to the listing file immediately after it is read. | | PRT | NAM | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of all model package flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | @@ -1587,9 +1587,9 @@ | PRT | OC | OPTIONS | BUDGETFILE | STRING | name of the output file to write budget information. | | PRT | OC | OPTIONS | BUDGETCSV | KEYWORD | keyword to specify that record corresponds to the budget CSV. | | PRT | OC | OPTIONS | BUDGETCSVFILE | STRING | name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. | -| PRT | OC | OPTIONS | TRACK | KEYWORD | keyword to specify that record corresponds to a binary track file. | -| PRT | OC | OPTIONS | TRACKFILE | STRING | name of the output file to write tracking information. | -| PRT | OC | OPTIONS | TRACKCSV | KEYWORD | keyword to specify that record corresponds to a CSV track file. | +| PRT | OC | OPTIONS | TRACK | KEYWORD | keyword to specify that record corresponds to a binary track file. Each PRT Model's OC Package may have only one binary track output file. | +| PRT | OC | OPTIONS | TRACKFILE | STRING | name of the binary output file to write tracking information. | +| PRT | OC | OPTIONS | TRACKCSV | KEYWORD | keyword to specify that record corresponds to a CSV track file. Each PRT Model's OC Package may have only one CSV track file. | | PRT | OC | OPTIONS | TRACKCSVFILE | STRING | name of the comma-separated value (CSV) file to write tracking information. | | PRT | OC | OPTIONS | TRACK_RELEASE | KEYWORD | keyword to indicate that particle tracking output is to be written when a particle is released | | PRT | OC | OPTIONS | TRACK_EXIT | KEYWORD | keyword to indicate that particle tracking output is to be written when a particle exits a cell | @@ -1616,21 +1616,21 @@ | PRT | PRP | OPTIONS | DEV_EXIT_SOLVE_METHOD | INTEGER | the method for iterative solution of particle exit location and time in the generalized Pollock's method. 1 Brent, 2 Chandrupatla. The default is Brent. | | PRT | PRP | OPTIONS | EXIT_SOLVE_TOLERANCE | DOUBLE PRECISION | the convergence tolerance for iterative solution of particle exit location and time in the generalized Pollock's method. A value of 0.00001 works well for many problems, but the value that strikes the best balance between accuracy and runtime is problem-dependent. | | PRT | PRP | OPTIONS | LOCAL_Z | KEYWORD | indicates that ``zrpt'' defines the local z coordinate of the release point within the cell, with value of 0 at the bottom and 1 at the top of the cell. If the cell is partially saturated at release time, the top of the cell is considered to be the water table elevation (the head in the cell) rather than the top defined by the user. | -| PRT | PRP | OPTIONS | TRACK | KEYWORD | keyword to specify that record corresponds to a binary track output file. | +| PRT | PRP | OPTIONS | TRACK | KEYWORD | keyword to specify that record corresponds to a binary track output file. Each PRP Package may have a distinct binary track output file. | | PRT | PRP | OPTIONS | FILEOUT | KEYWORD | keyword to specify that an output filename is expected next. | -| PRT | PRP | OPTIONS | TRACKFILE | STRING | name of the output file to write tracking information. | -| PRT | PRP | OPTIONS | TRACKCSV | KEYWORD | keyword to specify that record corresponds to a CSV track output file. | +| PRT | PRP | OPTIONS | TRACKFILE | STRING | name of the binary output file to write tracking information. | +| PRT | PRP | OPTIONS | TRACKCSV | KEYWORD | keyword to specify that record corresponds to a CSV track output file. Each PRP Package may have a distinct CSV track output file. | | PRT | PRP | OPTIONS | TRACKCSVFILE | STRING | name of the comma-separated value (CSV) file to write tracking information. | -| PRT | PRP | OPTIONS | STOPTIME | DOUBLE PRECISION | real value defining the maximum simulation time to which particles in the package can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when simulation time STOPTIME is reached. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the simulation time to which particles can be tracked. | -| PRT | PRP | OPTIONS | STOPTRAVELTIME | DOUBLE PRECISION | real value defining the maximum travel time over which particles in the model can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when their travel time reaches STOPTRAVELTIME. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTRAVELTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the travel time over which particles can be tracked. | +| PRT | PRP | OPTIONS | STOPTIME | DOUBLE PRECISION | real value defining the maximum simulation time to which particles in the package can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when simulation time STOPTIME is reached. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the simulation time to which particles can be tracked. If STOPTIME and STOPTRAVELTIME are both provided, particles will be stopped if either is reached. | +| PRT | PRP | OPTIONS | STOPTRAVELTIME | DOUBLE PRECISION | real value defining the maximum travel time over which particles in the model can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when their travel time reaches STOPTRAVELTIME. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTRAVELTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the travel time over which particles can be tracked. If STOPTIME and STOPTRAVELTIME are both provided, particles will be stopped if either is reached. | | PRT | PRP | OPTIONS | STOP_AT_WEAK_SINK | KEYWORD | is a text keyword to indicate that a particle is to terminate when it enters a cell that is a weak sink. By default, particles are allowed to pass though cells that are weak sinks. | | PRT | PRP | OPTIONS | ISTOPZONE | INTEGER | integer value defining the stop zone number. If cells have been assigned IZONE values in the GRIDDATA block, a particle terminates if it enters a cell whose IZONE value matches ISTOPZONE. An ISTOPZONE value of zero indicates that there is no stop zone. The default value is zero. | | PRT | PRP | OPTIONS | DRAPE | KEYWORD | is a text keyword to indicate that if a particle's release point is in a cell that happens to be inactive at release time, the particle is to be moved to the topmost active cell below it, if any. By default, a particle is not released into the simulation if its release point's cell is inactive at release time. | | PRT | PRP | OPTIONS | RELEASE_TIMES | KEYWORD | keyword indicating release times will follow | -| PRT | PRP | OPTIONS | TIMES | DOUBLE PRECISION (UNKNOWN) | times to release, relative to the beginning of the simulation. | +| PRT | PRP | OPTIONS | TIMES | DOUBLE PRECISION (UNKNOWN) | times to release, relative to the beginning of the simulation. RELEASE\_TIMES and RELEASE\_TIMESFILE are mutually exclusive. Explicit release times and release settings configured in the period block are additive and can be mixed and matched. | | PRT | PRP | OPTIONS | RELEASE_TIMESFILE | KEYWORD | keyword indicating release times file name will follow | -| PRT | PRP | OPTIONS | TIMESFILE | STRING | name of the release times file | -| PRT | PRP | OPTIONS | DEV_FORCETERNARY | KEYWORD | force use of the ternary tracking method regardless of cell type in disv grid | +| PRT | PRP | OPTIONS | TIMESFILE | STRING | name of the release times file. RELEASE\_TIMES and RELEASE\_TIMESFILE are mutually exclusive. Explicit release times and release settings configured in the period block are additive and can be mixed and matched. | +| PRT | PRP | OPTIONS | DEV_FORCETERNARY | KEYWORD | force use of the ternary tracking method regardless of cell type in DISV grids. | | PRT | PRP | DIMENSIONS | NRELEASEPTS | INTEGER | is the number of particle release points. | | PRT | PRP | PACKAGEDATA | IRPTNO | INTEGER | integer value that defines the PRP release point number associated with the specified PACKAGEDATA data on the line. IRPTNO must be greater than zero and less than or equal to NRELEASEPTS. The program will terminate with an error if information for a PRP release point number is specified more than once. | | PRT | PRP | PACKAGEDATA | CELLID | INTEGER (NCELLDIM) | is the cell identifier, and depends on the type of grid that is used for the simulation. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column. For a grid that uses the DISV input file, CELLID is the layer and CELL2D number. If the model uses the unstructured discretization (DISU) input file, CELLID is the node number for the cell. | diff --git a/doc/mf6io/mf6ivar/tex/prt-mip-desc.tex b/doc/mf6io/mf6ivar/tex/prt-mip-desc.tex index 327dd6a505d..22351965ee5 100644 --- a/doc/mf6io/mf6ivar/tex/prt-mip-desc.tex +++ b/doc/mf6io/mf6ivar/tex/prt-mip-desc.tex @@ -13,7 +13,7 @@ \item \texttt{retfactor}---is a real value by which velocity is divided within a given cell. RETFACTOR can be used to account for solute retardation, i.e., the apparent effect of linear sorption on the velocity of particles that track solute advection. RETFACTOR may be assigned any real value. A RETFACTOR value greater than 1 represents particle retardation (slowing), and a value of 1 represents no retardation. The effect of specifying a RETFACTOR value for each cell is the same as the effect of directly multiplying the POROSITY in each cell by the proposed RETFACTOR value for each cell. RETFACTOR allows conceptual isolation of effects such as retardation from the effect of porosity. The default value is 1. -\item \texttt{izone}---is an integer zone number assigned to each cell. IZONE may be positive, negative, or zero. The current cell's zone number is recorded with each particle track datum. If the ISTOPZONE option is set to any value other than zero in a PRP Package, particles released by that PRP Package terminate if they enter a cell whose IZONE value matches ISTOPZONE. If ISTOPZONE is not specified or is set to zero in a PRP Package, IZONE has no effect on the termination of particles released by that PRP Package. +\item \texttt{izone}---is an integer zone number assigned to each cell. IZONE may be positive, negative, or zero. The current cell's zone number is recorded with each particle track datum. If a PRP package's ISTOPZONE option is set to any value other than zero, particles released by that PRP Package terminate if they enter a cell whose IZONE value matches ISTOPZONE. If ISTOPZONE is not specified or is set to zero in a PRP Package, IZONE has no effect on the termination of particles released by that PRP Package. Each PRP Package may configure a single ISTOPZONE value. \end{description} diff --git a/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex b/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex index 50b305df62e..ff25d2452ad 100644 --- a/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex +++ b/doc/mf6io/mf6ivar/tex/prt-oc-desc.tex @@ -13,11 +13,11 @@ \item \texttt{budgetcsvfile}---name of the comma-separated value (CSV) output file to write budget summary information. A budget summary record will be written to this file for each time step of the simulation. -\item \texttt{TRACK}---keyword to specify that record corresponds to a binary track file. +\item \texttt{TRACK}---keyword to specify that record corresponds to a binary track file. Each PRT Model's OC Package may have only one binary track output file. -\item \texttt{trackfile}---name of the output file to write tracking information. +\item \texttt{trackfile}---name of the binary output file to write tracking information. -\item \texttt{TRACKCSV}---keyword to specify that record corresponds to a CSV track file. +\item \texttt{TRACKCSV}---keyword to specify that record corresponds to a CSV track file. Each PRT Model's OC Package may have only one CSV track file. \item \texttt{trackcsvfile}---name of the comma-separated value (CSV) file to write tracking information. diff --git a/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex b/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex index 5b584c8ea47..fc1da97edae 100644 --- a/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex +++ b/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex @@ -11,19 +11,19 @@ \item \texttt{LOCAL\_Z}---indicates that ``zrpt'' defines the local z coordinate of the release point within the cell, with value of 0 at the bottom and 1 at the top of the cell. If the cell is partially saturated at release time, the top of the cell is considered to be the water table elevation (the head in the cell) rather than the top defined by the user. -\item \texttt{TRACK}---keyword to specify that record corresponds to a binary track output file. +\item \texttt{TRACK}---keyword to specify that record corresponds to a binary track output file. Each PRP Package may have a distinct binary track output file. \item \texttt{FILEOUT}---keyword to specify that an output filename is expected next. -\item \texttt{trackfile}---name of the output file to write tracking information. +\item \texttt{trackfile}---name of the binary output file to write tracking information. -\item \texttt{TRACKCSV}---keyword to specify that record corresponds to a CSV track output file. +\item \texttt{TRACKCSV}---keyword to specify that record corresponds to a CSV track output file. Each PRP Package may have a distinct CSV track output file. \item \texttt{trackcsvfile}---name of the comma-separated value (CSV) file to write tracking information. -\item \texttt{stoptime}---real value defining the maximum simulation time to which particles in the package can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when simulation time STOPTIME is reached. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the simulation time to which particles can be tracked. +\item \texttt{stoptime}---real value defining the maximum simulation time to which particles in the package can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when simulation time STOPTIME is reached. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the simulation time to which particles can be tracked. If STOPTIME and STOPTRAVELTIME are both provided, particles will be stopped if either is reached. -\item \texttt{stoptraveltime}---real value defining the maximum travel time over which particles in the model can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when their travel time reaches STOPTRAVELTIME. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTRAVELTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the travel time over which particles can be tracked. +\item \texttt{stoptraveltime}---real value defining the maximum travel time over which particles in the model can be tracked. Particles that have not terminated earlier due to another termination condition will terminate when their travel time reaches STOPTRAVELTIME. If the last stress period in the simulation consists of more than one time step, particles will not be tracked past the ending time of the last stress period, regardless of STOPTRAVELTIME. If the last stress period in the simulation consists of a single time step, it is assumed to be a steady-state stress period, and its ending time will not limit the travel time over which particles can be tracked. If STOPTIME and STOPTRAVELTIME are both provided, particles will be stopped if either is reached. \item \texttt{STOP\_AT\_WEAK\_SINK}---is a text keyword to indicate that a particle is to terminate when it enters a cell that is a weak sink. By default, particles are allowed to pass though cells that are weak sinks. @@ -33,11 +33,11 @@ \item \texttt{RELEASE\_TIMES}---keyword indicating release times will follow -\item \texttt{times}---times to release, relative to the beginning of the simulation. +\item \texttt{times}---times to release, relative to the beginning of the simulation. RELEASE\_TIMES and RELEASE\_TIMESFILE are mutually exclusive. Explicit release times and release settings configured in the period block are additive and can be mixed and matched. \item \texttt{RELEASE\_TIMESFILE}---keyword indicating release times file name will follow -\item \texttt{timesfile}---name of the release times file +\item \texttt{timesfile}---name of the release times file. RELEASE\_TIMES and RELEASE\_TIMESFILE are mutually exclusive. Explicit release times and release settings configured in the period block are additive and can be mixed and matched. \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/prt/prp.tex b/doc/mf6io/prt/prp.tex index 68edf7227f8..3488e179276 100644 --- a/doc/mf6io/prt/prp.tex +++ b/doc/mf6io/prt/prp.tex @@ -1,5 +1,7 @@ Particle Release Point (PRP) Package information is read from the file that is specified by ``PRP6'' as the file type. More than one PRP Package can be specified for a PRT model. +The PRP Package offers multiple ways to specify particle release times. Particle release times may either be provided explicitly, relative to the simulation start time, or configured relative to the time discretization of stress periods via period block settings. When multiple ways of specifying release times are used together, the resulting set of release times is the union of the times specified by each method. + \vspace{5mm} \subsubsection{Structure of Blocks} \lstinputlisting[style=blockdefinition]{./mf6ivar/tex/prt-prp-options.dat} diff --git a/doc/mf6io/prt/prt.tex b/doc/mf6io/prt/prt.tex index eb9449a6a04..61dee794e5a 100644 --- a/doc/mf6io/prt/prt.tex +++ b/doc/mf6io/prt/prt.tex @@ -14,6 +14,10 @@ \subsection{Units of Length and Time} \subsection{Time Stepping} In \mf time step lengths are controlled by the user and specified in the Temporal Discretization (TDIS) input file. When the flow model and particle-tracking model run in the same simulation, the time step length specified in TDIS is used for both models. If the PRT Model runs in a separate simulation, the time discretization may differ. Instructions for specifying time steps are described in the TDIS section of this user guide; additional information on GWF and PRT configurations are in the Flow Model Interface section. +\subsection{Specifying Cell Face Flows using IFLOWFACE} + +By default, flows associated with stress packages are assumed to be distributed uniformly over the volume of a cell. Distributed external inflows and outflows are reflected in the cell-cell flows calculated by the GWF Model, but they are not directly involved in determining the normal face velocities used to track a particle through the cell. The user can optionally assign a flow associated with a stress package to any face of the cell. Assignment of external flows is done by setting the value of an auxiliary package variable called IFLOWFACE to a value that corresponds to one of the cell faces. To accommodate non-rectangular cells, the face numbering scheme in the PRT Model is based on clockwise ordering of the cell faces. For a DIS-grid cell, face 1 is the ``western'' face, i.e., the face parallel to the y axis that has the lesser x coordinate. For a DISV-grid cell, face 1 is the face that extends in the clockwise direction from the first vertex listed for that cell in the CELL2D input block. + \subsection{Particle Mass Budget} A summary of all inflow (sources) and outflow (sinks) of particle mass is called a mass budget. The particle mass budget is printed to the PRT Model Listing File for selected time steps. In the current implementation, each particle is assigned unit mass, and the numerical value of the flow can be interpreted as particles per time. @@ -37,7 +41,7 @@ \subsection{Particle Track Output} \noindent Column 12: \texttt{`X'} {\color{red} \footnotesize{DOUBLE}} \\ \noindent Column 13: \texttt{`Y'} {\color{red} \footnotesize{DOUBLE}} \\ \noindent Column 14: \texttt{`Z'} {\color{red} \footnotesize{DOUBLE}} \\ -\noindent Column 15: \texttt{`NAME'} {\color{red} \footnotesize{CHARACTER(LEN=LENTXT)}} \\ +\noindent Column 15: \texttt{`NAME'} {\color{red} \footnotesize{CHARACTER(LEN=40)}} \\ \vspace{2mm} \noindent where @@ -92,6 +96,9 @@ \subsection{Particle Track Output} The binary particle track file contains the same particle track data in a record-based binary format explained in the Particle Track File subsection of the Description of Binary Output Files section. + + + \newpage \subsection{PRT Model Name File} \input{prt/namefile.tex} diff --git a/src/Model/ParticleTracking/prt-prp.f90 b/src/Model/ParticleTracking/prt-prp.f90 index 4f0d69e4cc1..d5ea6c991df 100644 --- a/src/Model/ParticleTracking/prt-prp.f90 +++ b/src/Model/ParticleTracking/prt-prp.f90 @@ -735,6 +735,11 @@ subroutine prp_options(this, option, found) this%idrape = 1 found = .true. case ('RELEASE_TIMES') + if (this%rlstimelist) then + errmsg = "RELEASE TIMES ALREADY SPECIFIED" + call store_error(errmsg) + call this%parser%StoreErrorUnit(terminate=.true.) + end if rtloop: do success = .false. call this%parser%TryGetDouble(dval, success) @@ -750,6 +755,11 @@ subroutine prp_options(this, option, found) this%rlstimelist = .true. found = .true. case ('RELEASE_TIMESFILE') + if (this%rlstimelist) then + errmsg = "RELEASE TIMES ALREADY SPECIFIED" + call store_error(errmsg) + call this%parser%StoreErrorUnit(terminate=.true.) + end if call this%parser%GetString(fname) call openfile(this%irlstls, this%iout, fname, 'TLS') nlines = 0 From c291c890344b3cbc07ee1ac73ce0f431f906ea5d Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Tue, 21 May 2024 12:18:32 -0400 Subject: [PATCH 189/199] ci(release): don't create empty folder structure in advance (#1837) * unneeded since we are removing the list of distribution contents from release notes * remove mk_folder_struct.py, pixi task in pixi.toml, and steps from release.yml --- .github/workflows/release.yml | 20 --------- distribution/build_docs.py | 27 ------------ doc/ReleaseNotes/mk_folder_struct.py | 63 ---------------------------- pixi.toml | 1 - 4 files changed, 111 deletions(-) delete mode 100755 doc/ReleaseNotes/mk_folder_struct.py diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 79039e50456..15c48b538c3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -447,26 +447,6 @@ jobs: models="${{ inputs.models }}" pytest -v -n auto test_scripts.py --init -k "${models//,/ or }" - - name: Create folder structure - if: inputs.full == true - run: | - # Create empty folder structure for the /docs subdirectory - distname=${{ needs.build.outputs.distname }} - mkdir -p "$distname/doc" - mkdir "$distname/make" - mkdir "$distname/msvs" - mkdir "$distname/srcbmi" - cp modflow6/code.json "$distname/code.json" - cp modflow6/meson.build "$distname/meson.build" - cp -r modflow6-examples/examples "$distname" - cp -r modflow6/src "$distname" - cp -r modflow6/utils/mf5to6 "$distname/utils/mf5to6" - cp -r modflow6/utils/zonebudget "$distname/utils/zonebudget" - - # create LaTeX file describing the folder structure - cd modflow6/doc/ReleaseNotes - python mk_folder_struct.py -dp "${{ github.workspace }}/$distname" - - name: Collect deprecations working-directory: modflow6/doc/mf6io/mf6ivar run: | diff --git a/distribution/build_docs.py b/distribution/build_docs.py index b4934555ddc..4f1ff97fca4 100644 --- a/distribution/build_docs.py +++ b/distribution/build_docs.py @@ -303,33 +303,6 @@ def test_build_mf6io_tex_from_dfn(overwrite): os.system(f"git restore {p}") -def build_tex_folder_structure(overwrite: bool = False): - path = _release_notes_path / "folder_struct.tex" - - if overwrite: - path.unlink(missing_ok=True) - elif path.is_file(): - print(f"Folder structure file already exists: {path}") - return - - with set_dir(_release_notes_path): - out, err, ret = run_cmd( - sys.executable, "mk_folder_struct.py", "-dp", _project_root_path - ) - assert not ret, out + err - - assert path.is_file(), f"Failed to create {path}" - - -@no_parallel -def test_build_tex_folder_structure(): - path = _project_root_path / "doc" / "ReleaseNotes" / "folder_struct.tex" - try: - build_tex_folder_structure() - finally: - os.system(f"git restore {path}") - - def build_mf6io_tex_example( workspace_path: PathLike, bin_path: PathLike, example_model_path: PathLike ): diff --git a/doc/ReleaseNotes/mk_folder_struct.py b/doc/ReleaseNotes/mk_folder_struct.py deleted file mode 100755 index 39886d99f3d..00000000000 --- a/doc/ReleaseNotes/mk_folder_struct.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/python - -""" -mk_folder_struct.py: Create a latex file containing structure of a folder. - -This script is used to update folder_struct.tex using the structure of a specified -distribution folder. The distribution folder must be specified using a command line -argument. Usage is: - - python mk_folder_struct.py -dp - -""" - - -import os -import sys - - -def list_files(startpath, includefiles=False): - s = '' - for root, dirs, files in os.walk(startpath): - level = root.replace(startpath, '').count(os.sep) - indent = ' ' * 4 * (level) - s += '{}{}/ \n'.format(indent, os.path.basename(root)) - subindent = ' ' * 4 * (level + 1) - for f in files: - if includefiles: - s += '{}{} \n'.format(subindent, f) - return s - - -def get_distribution_path(): - distribution_path = None - for idx, arg in enumerate(sys.argv): - if arg == "-dp": - distribution_path = sys.argv[idx + 1] - return distribution_path - - -distribution_path = get_distribution_path() -if distribution_path is None: - raise Exception(f"Distribution path must be set from command line using -dp ") -if not os.path.isdir(distribution_path): - raise Exception(f"Distribution path not found: {distribution_path}") - -# Open the file -f = open('folder_struct.tex', 'w') - -# Write the latex header -s = r'''\begin{verbatim}''' -f.write(s) -f.write('\n') - -s = list_files(distribution_path) -f.write(s) - -s = r'''\end{verbatim} -''' -f.write(s) - -f.close() - -print('done...') diff --git a/pixi.toml b/pixi.toml index 5e84e1439e0..1f3d894a699 100644 --- a/pixi.toml +++ b/pixi.toml @@ -68,6 +68,5 @@ build-dist = { cmd = "python build_dist.py", cwd = "distribution" } build-makefiles = { cmd = "python build_makefiles.py", cwd = "distribution" } test-dist-scripts = { cmd = "pytest -v --durations 0", cwd = "distribution" } update-version = { cmd = "python update_version.py", cwd = "distribution" } -mk-folder-struct = { cmd = "python mk_folder_struct.py", cwd = "doc/ReleaseNotes" } deprecations = { cmd = "python deprecations.py", cwd = "doc/mf6io/mf6ivar" } sphinx = { cmd = "make html", cwd = ".build_rtd_docs" } \ No newline at end of file From 6fca5e60138a54a217cf1f951dbaa8ef2df452a3 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Tue, 21 May 2024 11:49:28 -0500 Subject: [PATCH 190/199] docs(releasenotes): more cleanup for 6.5.0 release (#1838) * docs(releasenotes): more cleanup for 6.5.0 release * fix ftype table links in mf6io --- doc/ReleaseNotes/ReleaseNotes.tex | 7 +- doc/SuppTechInfo/mf6suptechinfo.bbl | 105 +++++++++++++++++++------ doc/mf6io/gwe/namefile.tex | 2 +- doc/mf6io/gwf/namefile.tex | 2 +- doc/mf6io/gwt/namefile.tex | 2 +- doc/mf6io/mf6ivar/dfn/gwe-est.dfn | 4 +- doc/mf6io/mf6ivar/dfn/gwe-nam.dfn | 2 +- doc/mf6io/mf6ivar/dfn/gwf-nam.dfn | 2 +- doc/mf6io/mf6ivar/dfn/gwt-nam.dfn | 2 +- doc/mf6io/mf6ivar/dfn/prt-nam.dfn | 2 +- doc/mf6io/mf6ivar/dfn/swf-nam.dfn | 2 +- doc/mf6io/mf6ivar/md/mf6ivar.md | 18 ++--- doc/mf6io/mf6ivar/tex/gwe-est-desc.tex | 4 +- doc/mf6io/mf6ivar/tex/gwe-nam-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/gwf-nam-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/gwt-nam-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/prt-nam-desc.tex | 2 +- doc/mf6io/mf6ivar/tex/prt-prp-desc.tex | 4 +- doc/mf6io/mf6ivar/tex/swf-nam-desc.tex | 2 +- doc/mf6io/prt/namefile.tex | 2 +- doc/mf6io/swf/namefile.tex | 2 +- 21 files changed, 113 insertions(+), 59 deletions(-) diff --git a/doc/ReleaseNotes/ReleaseNotes.tex b/doc/ReleaseNotes/ReleaseNotes.tex index c8d3cce6157..17b5a209871 100644 --- a/doc/ReleaseNotes/ReleaseNotes.tex +++ b/doc/ReleaseNotes/ReleaseNotes.tex @@ -202,7 +202,7 @@ \section{Known Issues and Incompatibilities} \begin{enumerate} \item -The READARRAY utility is used by some packages to read arrays of numeric values provided by the user. The READARRAY utility has an IPRN option (as described in the MODFLOW 6 Description of Input and Output), which will cause the array to be written to the model listing file. Support for the IPRN option has been removed for some packages and will ultimately be removed for all packages. An alternative for IPRN functionality is presently under development. +The READARRAY utility is used by some packages to read arrays of numeric values provided by the user. The READARRAY utility has an IPRN option (as described in the MODFLOW 6 Description of Input and Output), which will cause the array to be written to the model listing file. Support for the IPRN option has been removed for some packages and will ultimately be removed for all packages. A new option, called ``EXPORT\_ARRAY\_ASCII'' has been implemented for some packages to support writing of gridded data to external text files. This option has been implemented to replace the IPRN functionality. \item The capability to use Unsaturated Zone Flow (UZF) routing beneath lakes and streams has not been implemented. @@ -235,10 +235,7 @@ \section{Known Issues and Incompatibilities} % ------------------------------------------------- \section{Distribution File} -The following distribution file is for use on personal computers: \texttt{\modflowversion\_[ostag].zip}. The distribution file is a compressed zip file. The following directory structure is incorporated in the zip file: - -% folder structured created by python script -\input{folder_struct.tex} +The distribution is provided in the form of a compressed zip file. Distributions are available for several different operating systems, including Windows, Mac, and Linux. Distributions are marked with an operating system tag, called ``ostag''. Values for ``ostag'' include ``win64'', ``mac'', and ``linux'', for example. Distribution files for this release are labeled as \texttt{\modflowversion\_[ostag].zip}. Thus, the distribution file for Windows for this release is \texttt{\modflowversion\_win64.zip}. It is recommended that no user files are kept in the release directory. If you do plan to put your own files in the release directory, do so only by creating additional subdirectories. diff --git a/doc/SuppTechInfo/mf6suptechinfo.bbl b/doc/SuppTechInfo/mf6suptechinfo.bbl index deed854f368..c94fb8b58c9 100644 --- a/doc/SuppTechInfo/mf6suptechinfo.bbl +++ b/doc/SuppTechInfo/mf6suptechinfo.bbl @@ -1,22 +1,52 @@ -\begin{thebibliography}{21} +\begin{thebibliography}{30} \providecommand{\natexlab}[1]{#1} \expandafter\ifx\csname urlstyle\endcsname\relax - \providecommand{\doi}[1]{doi:\discretionary{}{}{}#1}\else - \providecommand{\doi}{doi:\discretionary{}{}{}\begingroup + \providecommand{\doiagency}[1]{doi:\discretionary{}{}{}#1}\else + \providecommand{\doiagency}{doi:\discretionary{}{}{}\begingroup \urlstyle{rm}\Url}\fi +\bibitem[{Bakker and others(2016)Bakker, Post, Langevin, Hughes, White, Starn, + and Fienen}]{bakker2016flopy} +Bakker, M., Post, V., Langevin, C.D., Hughes, J.D., White, J.T., Starn, J.J., + and Fienen, M.N., 2016, Scripting modflow model development using python and + flopy: Groundwater, \url{https://doi.org/https://doi.org/10.1111/gwat.12413}. + +\bibitem[{Bakker and others(2024)Bakker, Post, Hughes, Langevin, White, Leaf, + Paulinski, Bellino, Morway, Toews, Larsen, Fienen, Starn, Brenhoff, and + Bonelli}]{flopysoftware} +Bakker, M., Post, V., Hughes, J.D., Langevin, C.D., White, J.T., Leaf, A.T., + Paulinski, S.R., Bellino, J.C., Morway, E.D., Toews, M.W., Larsen, J.D., + Fienen, M.N., Starn, J.J., Brenhoff, D.A., and Bonelli, W.P., 2024, FloPy + v3.7.0dev0 (preliminary): {U.S. Geological Survey Software Release}, + \url{https://doi.org/10.5066/F7BK19FH}. + +\bibitem[{Bedekar and others(2016)Bedekar, Morway, Langevin, and + Tonkin}]{mt3dusgs} +Bedekar, V., Morway, E.D., Langevin, C.D., and Tonkin, M.J., 2016, MT3D-USGS + version 1: A U.S. Geological Survey release of MT3DMS updated with new and + expanded transport capabilities for use with MODFLOW: {U.S. Geological Survey + Techniques and Methods, book 6, chap. A53, 69 p.}, + \url{https://doi.org/10.3133/tm6a53}, \url{http://dx.doi.org/10.3133/tm6A53}. + \bibitem[{Campbell and others(1994)Campbell, Jungbauer, Bidlake, and Hungerford}]{campbell1994} Campbell, G.S., Jungbauer, J.D., Bidlake, W.R., and Hungerford, R.D., 1994, Predicting the effect of temperature on soil thermal conductivity: Soil Science, v. 158, no.~5, p.~307--313. +\bibitem[{Cordes and Kinzelbach(1992)}]{cordes1992} +Cordes, C., and Kinzelbach, W., 1992, Continuous groundwater velocity fields + and path lines in linear, bilinear, and trilinear finite elements: Water + Resources Research, v.~28, p.~2903--2911, + \url{https://doi.org/10.1029/92WR01686}. + \bibitem[{Guo and Langevin(2002)}]{langevin2002seawat} -Guo, Weixing, and Langevin, C.D., 2002, User's Guide to SEAWAT: A Computer - Program for Simulation of Three-Dimensional Variable-Density Ground-Water - Flow: {U.S. Geological Survey Techniques of Water-Resources Investigations - book 6, Chapter A7, 77 p.}, accessed July 25, 2019, at - \url{https://pubs.er.usgs.gov/publication/ofr03426}. +Guo, W., and Langevin, C.D., 2002, User's Guide to SEAWAT: A Computer Program + for Simulation of Three-Dimensional Variable-Density Ground-Water Flow: {U.S. + Geological Survey Techniques of Water-Resources Investigations book 6, + Chapter A7, 77 p.}, accessed July 25, 2019, at + \url{https://doi.org/https://doi.org/10.3133/twri06A7}, at + \url{https://pubs.usgs.gov/publication/twri06A7}. \bibitem[{Harbaugh(2005)}]{modflow2005} Harbaugh, A.W., 2005, MODFLOW-2005, the U.S. Geological Survey modular @@ -52,9 +82,16 @@ Hughes, J.D., Langevin, C.D., and Banta, E.R., 2017, Documentation for the MODFLOW 6 framework: {U.S. Geological Survey Techniques and Methods, book 6, chap. A57, 36 p.}, \url{https://doi.org/10.3133/tm6A57}. +\bibitem[{Hughes and others(2024)Hughes, Langevin, Paulinski, Larsen, and + Brakenhoff}]{hughes2023flopy} +Hughes, J.D., Langevin, C.D., Paulinski, S.R., Larsen, J.D., and Brakenhoff, + D., 2024, {FloPy} workflows for creating structured and unstructured + {MODFLOW} models: Groundwater, v.~62, no.~1, p.~124--139, + \url{https://doi.org/10.1111/gwat.13327}. + \bibitem[{Kavetski and Kuczera(2007)}]{doi:10.1029/2006WR005195} -Kavetski, Dmitri, and Kuczera, George, 2007, Model smoothing strategies to - remove microscale discontinuities and spurious secondary optima in objective +Kavetski, D., and Kuczera, G., 2007, Model smoothing strategies to remove + microscale discontinuities and spurious secondary optima in objective functions in hydrological calibration: Water Resources Research, v.~43, no.~3, \url{https://doi.org/10.1029/2006WR005195}, \url{https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/2006WR005195}. @@ -67,8 +104,8 @@ Kipp, K.L., 1987, HST3D: A Computer Code for Simulation of Heat and Solute \bibitem[{Langevin and others(2008)Langevin, Thorne~Jr, Dausman, Sukop, and Guo}]{langevin2008seawat} -Langevin, C.D., Thorne~Jr, D.T., Dausman, A.M., Sukop, M.C., and Guo, Weixing, - 2008, {SEAWAT} Version 4---A computer program for simulation of multi-species +Langevin, C.D., Thorne~Jr, D.T., Dausman, A.M., Sukop, M.C., and Guo, W., 2008, + {SEAWAT} Version 4---A computer program for simulation of multi-species solute and heat transport: {U.S. Geological Survey Techniques and Methods, book 6, chap. A22, 39 p.}, accessed June 27, 2017, at \url{https://pubs.er.usgs.gov/publication/tm6A22}. @@ -76,21 +113,21 @@ Langevin, C.D., Thorne~Jr, D.T., Dausman, A.M., Sukop, M.C., and Guo, Weixing, \bibitem[{Langevin and others(2017)Langevin, Hughes, Provost, Banta, Niswonger, and Panday}]{modflow6gwf} Langevin, C.D., Hughes, J.D., Provost, A.M., Banta, E.R., Niswonger, R.G., and - Panday, Sorab, 2017, Documentation for the MODFLOW 6 Groundwater Flow (GWF) + Panday, S., 2017, Documentation for the MODFLOW 6 Groundwater Flow (GWF) Model: {U.S. Geological Survey Techniques and Methods, book 6, chap. A55, 197 p.}, \url{https://doi.org/10.3133/tm6A55}. \bibitem[{Langevin and others(2022)Langevin, Provost, Panday, and Hughes}]{modflow6gwt} -Langevin, C.D., Provost, A.M., Panday, Sorab, and Hughes, J.D., 2022, +Langevin, C.D., Provost, A.M., Panday, S., and Hughes, J.D., 2022, Documentation for the MODFLOW 6 Groundwater Transport (GWT) Model: {U.S. Geological Survey Techniques and Methods, book 6, chap. A61, 56 p.}, \url{https://doi.org/10.3133/tm6A61}. \bibitem[{Ma and Zheng(2010)}]{mazheng2010} -Ma, Rui, and Zheng, Chunmiao, 2010, Effects of density and viscosity in - modeling heat as a groundwater tracer: Groundwater, v.~48, no.~3, - p.~380--389, \url{https://doi.org/10.1111/j.1745-6584.2009.00660.x}. +Ma, R., and Zheng, C., 2010, Effects of density and viscosity in modeling heat + as a groundwater tracer: Groundwater, v.~48, no.~3, p.~380--389, + \url{https://doi.org/10.1111/j.1745-6584.2009.00660.x}. \bibitem[{Maidment(1993)}]{maidment1993} Maidment, D.R., 1993, Handbook of Hydrology: New York, USA, McGraw-Hill. @@ -103,15 +140,30 @@ Markle, J.M., Schincariol, R.A., Sass, J.H., and Molson, J.W., 2006, no.~4, p.~1281--1294, \url{https://doi.org/https://doi.org/10.2136/sssaj2005.0293}. +\bibitem[{Panday(2019)}]{panday2019bct} +Panday, S., 2019, USG-Transport Version 1.4.0: The Block-Centered Transport + Process for MODFLOW-USG: , + \url{http://gmsdocs.aquaveo.com.s3.amazonaws.com/GWT_v1-4-0.pdf}. + \bibitem[{Panday and others(2013)Panday, Langevin, Niswonger, Ibaraki, and Hughes}]{modflowusg} -Panday, Sorab, Langevin, C.D., Niswonger, R.G., Ibaraki, Motomu, and Hughes, - J.D., 2013, MODFLOW-USG version 1---An unstructured grid version of MODFLOW - for simulating groundwater flow and tightly coupled processes using a control +Panday, S., Langevin, C.D., Niswonger, R.G., Ibaraki, M., and Hughes, J.D., + 2013, MODFLOW-USG version 1---An unstructured grid version of MODFLOW for + simulating groundwater flow and tightly coupled processes using a control volume finite-difference formulation: {U.S. Geological Survey Techniques and Methods, book 6, chap. A45, 66 p.}, accessed June 27, 2017, at \url{https://pubs.usgs.gov/tm/06/a45/}. +\bibitem[{Pollock(2015)}]{pollock2015} +Pollock, D.W., 2015, Extending the modpath algorithm to rectangular + unstructured grids: Groundwater, v.~54, p.~121--125, + \url{https://doi.org/10.1111/gwat.12328}. + +\bibitem[{Pollock(2016)}]{pollock2016modpath7} +Pollock, D.W., 2016, User guide for MODPATH Version 7---A particle-tracking + model for MODFLOW: {U.S. Geological Survey Open-File Report 2016--1086, 35 + p.}, accessed June 27, 2017, at \url{https://doi.org/10.3133/ofr20161086}. + \bibitem[{Provost and others(2017)Provost, Langevin, and Hughes}]{modflow6xt3d} Provost, A.M., Langevin, C.D., and Hughes, J.D., 2017, Documentation for the ``XT3D'' Option in the Node Property Flow (NPF) Package of MODFLOW 6: {U.S. @@ -119,7 +171,7 @@ Provost, A.M., Langevin, C.D., and Hughes, J.D., 2017, Documentation for the \url{https://doi.org/10.3133/tm6A56}. \bibitem[{Thorne and others(2006)Thorne, Langevin, and Sukop}]{thorne2006} -Thorne, Danny, Langevin, C.D., and Sukop, M.C., 2006, Addition of simultaneous +Thorne, D., Langevin, C.D., and Sukop, M.C., 2006, Addition of simultaneous heat and solute transport and variable fluid viscosity to seawat: Computers and Geosciences, v.~32, no.~10, p.~1758--1768, \url{https://doi.org/https://doi.org/10.1016/j.cageo.2006.04.005}. @@ -130,12 +182,17 @@ Voss, C.I., 1984, SUTRA---A finite-element simulation model for transport or chemically-reactive single-species solute transport: {U.S. Geological Survey Water-Resources Investigations Report 84--4369, 409 p.} +\bibitem[{Zhang and others(2012)Zhang, King, and Datta-Gupta}]{zhang2012} +Zhang, Y., King, M.J., and Datta-Gupta, A., 2012, Robust streamline tracing + using inter-cell fluxes in locally refined and unstructured grids: Water + Resources Research, v.~48, \url{https://doi.org/10.1029/2011WR011396}. + \bibitem[{Zheng(2010)}]{zheng2010supplemental} -Zheng, Chunmiao, 2010, MT3DMS v5.3, Supplemental User's Guide: {Technical - Report Prepared for the U.S. Army Corps of Engineers, 51 p.} +Zheng, C., 2010, MT3DMS v5.3, Supplemental User's Guide: {Technical Report + Prepared for the U.S. Army Corps of Engineers, 51 p.} \bibitem[{Zheng and Wang(1999)}]{zheng1999mt3dms} -Zheng, Chunmiao, and Wang, P.P., 1999, MT3DMS---A modular three-dimensional +Zheng, C., and Wang, P.P., 1999, MT3DMS---A modular three-dimensional multi-species transport model for simulation of advection, dispersion and chemical reactions of contaminants in groundwater systems; Documentation and user's guide: {Contract report SERDP--99--1: Vicksburg, Miss., U.S. Army diff --git a/doc/mf6io/gwe/namefile.tex b/doc/mf6io/gwe/namefile.tex index 1f8ed8ba7b1..92bdb13f5ee 100644 --- a/doc/mf6io/gwe/namefile.tex +++ b/doc/mf6io/gwe/namefile.tex @@ -41,7 +41,7 @@ \subsubsection{Explanation of Variables} OBS6 & Observations Option \\ \hline \end{tabular*} -\label{table:ftype} +\label{table:ftype-gwe} \end{center} \normalsize \end{table} diff --git a/doc/mf6io/gwf/namefile.tex b/doc/mf6io/gwf/namefile.tex index f54f1ee1e5f..44626885961 100644 --- a/doc/mf6io/gwf/namefile.tex +++ b/doc/mf6io/gwf/namefile.tex @@ -49,7 +49,7 @@ \subsubsection{Explanation of Variables} OBS6 & Observations Option \\ \hline \end{tabular*} -\label{table:ftype} +\label{table:ftype-gwf} \end{center} \normalsize \end{table} diff --git a/doc/mf6io/gwt/namefile.tex b/doc/mf6io/gwt/namefile.tex index 8835e18db77..4fcd5acde0b 100644 --- a/doc/mf6io/gwt/namefile.tex +++ b/doc/mf6io/gwt/namefile.tex @@ -43,7 +43,7 @@ \subsubsection{Explanation of Variables} OBS6 & Observations Option \\ \hline \end{tabular*} -\label{table:ftype} +\label{table:ftype-gwt} \end{center} \normalsize \end{table} diff --git a/doc/mf6io/mf6ivar/dfn/gwe-est.dfn b/doc/mf6io/mf6ivar/dfn/gwe-est.dfn index a31e9a45697..22181237c3e 100644 --- a/doc/mf6io/mf6ivar/dfn/gwe-est.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwe-est.dfn @@ -61,7 +61,7 @@ shape (nodes) reader readarray layered true longname density of aquifer material -description is a user-specified value of the density of aquifer material not considering the voids. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kg/m3. +description is a user-specified value of the density of aquifer material not considering the voids. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kilograms per cubic meter. # --------------------- gwe est packagedata --------------------- @@ -91,7 +91,7 @@ tagged false in_record true reader urword longname density of water -description is a user-specified value of the density of water. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kg/m3. +description is a user-specified value of the density of water. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kilograms per cubic meter. block packagedata diff --git a/doc/mf6io/mf6ivar/dfn/gwe-nam.dfn b/doc/mf6io/mf6ivar/dfn/gwe-nam.dfn index 70c89d67135..31aa8fd84b5 100644 --- a/doc/mf6io/mf6ivar/dfn/gwe-nam.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwe-nam.dfn @@ -50,7 +50,7 @@ type string tagged false reader urword longname package type -description is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. +description is the file type, which must be one of the following character values shown in table~\ref{table:ftype-gwe}. Ftype may be entered in any combination of uppercase and lowercase. block packages name fname diff --git a/doc/mf6io/mf6ivar/dfn/gwf-nam.dfn b/doc/mf6io/mf6ivar/dfn/gwf-nam.dfn index b363bca2eca..f4e6ba4839f 100644 --- a/doc/mf6io/mf6ivar/dfn/gwf-nam.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwf-nam.dfn @@ -75,7 +75,7 @@ type string tagged false reader urword longname package type -description is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. +description is the file type, which must be one of the following character values shown in table~\ref{table:ftype-gwf}. Ftype may be entered in any combination of uppercase and lowercase. block packages name fname diff --git a/doc/mf6io/mf6ivar/dfn/gwt-nam.dfn b/doc/mf6io/mf6ivar/dfn/gwt-nam.dfn index cc68d510f30..a06795e2439 100644 --- a/doc/mf6io/mf6ivar/dfn/gwt-nam.dfn +++ b/doc/mf6io/mf6ivar/dfn/gwt-nam.dfn @@ -50,7 +50,7 @@ type string tagged false reader urword longname package type -description is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. +description is the file type, which must be one of the following character values shown in table~\ref{table:ftype-gwt}. Ftype may be entered in any combination of uppercase and lowercase. block packages name fname diff --git a/doc/mf6io/mf6ivar/dfn/prt-nam.dfn b/doc/mf6io/mf6ivar/dfn/prt-nam.dfn index e2c5e70e43e..5dc5084c23b 100644 --- a/doc/mf6io/mf6ivar/dfn/prt-nam.dfn +++ b/doc/mf6io/mf6ivar/dfn/prt-nam.dfn @@ -49,7 +49,7 @@ type string tagged false reader urword longname package type -description is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. +description is the file type, which must be one of the following character values shown in table~\ref{table:ftype-prt}. Ftype may be entered in any combination of uppercase and lowercase. block packages name fname diff --git a/doc/mf6io/mf6ivar/dfn/swf-nam.dfn b/doc/mf6io/mf6ivar/dfn/swf-nam.dfn index 386b00cb261..77fcbcd8ab2 100644 --- a/doc/mf6io/mf6ivar/dfn/swf-nam.dfn +++ b/doc/mf6io/mf6ivar/dfn/swf-nam.dfn @@ -75,7 +75,7 @@ type string tagged false reader urword longname package type -description is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. +description is the file type, which must be one of the following character values shown in table~\ref{table:ftype-swf}. Ftype may be entered in any combination of uppercase and lowercase. block packages name fname diff --git a/doc/mf6io/mf6ivar/md/mf6ivar.md b/doc/mf6io/mf6ivar/md/mf6ivar.md index 10cf4b62ebe..c0f5f10b2cf 100644 --- a/doc/mf6io/mf6ivar/md/mf6ivar.md +++ b/doc/mf6io/mf6ivar/md/mf6ivar.md @@ -281,9 +281,9 @@ | GWE | EST | GRIDDATA | POROSITY | DOUBLE PRECISION (NODES) | is the mobile domain porosity, defined as the mobile domain pore volume per mobile domain volume. The GWE model does not support the concept of an immobile domain in the context of heat transport. | | GWE | EST | GRIDDATA | DECAY | DOUBLE PRECISION (NODES) | is the rate coefficient for zero-order decay for the aqueous phase of the mobile domain. A negative value indicates heat (energy) production. The dimensions of decay for zero-order decay is energy per length cubed per time. Zero-order decay will have no effect on simulation results unless zero-order decay is specified in the options block. | | GWE | EST | GRIDDATA | CPS | DOUBLE PRECISION (NODES) | is the mass-based heat capacity of dry solids (aquifer material). For example, units of J/kg/C may be used (or equivalent). | -| GWE | EST | GRIDDATA | RHOS | DOUBLE PRECISION (NODES) | is a user-specified value of the density of aquifer material not considering the voids. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kg/m3. | +| GWE | EST | GRIDDATA | RHOS | DOUBLE PRECISION (NODES) | is a user-specified value of the density of aquifer material not considering the voids. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kilograms per cubic meter. | | GWE | EST | PACKAGEDATA | CPW | DOUBLE PRECISION | is the mass-based heat capacity of the simulated fluid. For example, units of J/kg/C may be used (or equivalent). | -| GWE | EST | PACKAGEDATA | RHOW | DOUBLE PRECISION | is a user-specified value of the density of water. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kg/m3. | +| GWE | EST | PACKAGEDATA | RHOW | DOUBLE PRECISION | is a user-specified value of the density of water. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kilograms per cubic meter. | | GWE | EST | PACKAGEDATA | LATHEATVAP | DOUBLE PRECISION | is the user-specified value for the latent heat of vaporization. For example, if working in SI units, values may be entered as kJ/kg. | | GWE | FMI | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that FMI flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | | GWE | FMI | OPTIONS | FLOW_IMBALANCE_CORRECTION | KEYWORD | correct for an imbalance in flows by assuming that any residual flow error comes in or leaves at the temperature of the cell. When this option is activated, the GWE Model budget written to the listing file will contain two additional entries: FLOW-ERROR and FLOW-CORRECTION. These two entries will be equal but opposite in sign. The FLOW-CORRECTION term is a mass flow that is added to offset the error caused by an imprecise flow balance. If these terms are not relatively small, the flow model should be rerun with stricter convergence tolerances. | @@ -377,7 +377,7 @@ | GWE | NAM | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of all model stress package information will be written to the listing file immediately after it is read. | | GWE | NAM | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of all model package flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | | GWE | NAM | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that all model package flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWE | NAM | PACKAGES | FTYPE | STRING | is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. | +| GWE | NAM | PACKAGES | FTYPE | STRING | is the file type, which must be one of the following character values shown in table~\ref{table:ftype-gwe}. Ftype may be entered in any combination of uppercase and lowercase. | | GWE | NAM | PACKAGES | FNAME | STRING | is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. | | GWE | NAM | PACKAGES | PNAME | STRING | is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single GWE Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. | | GWE | OC | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | @@ -907,7 +907,7 @@ | GWF | NAM | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that all model package flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | | GWF | NAM | OPTIONS | NEWTON | KEYWORD | keyword that activates the Newton-Raphson formulation for groundwater flow between connected, convertible groundwater cells and stress packages that support calculation of Newton-Raphson terms for groundwater exchanges. Cells will not dry when this option is used. By default, the Newton-Raphson formulation is not applied. | | GWF | NAM | OPTIONS | UNDER_RELAXATION | KEYWORD | keyword that indicates whether the groundwater head in a cell will be under-relaxed when water levels fall below the bottom of the model below any given cell. By default, Newton-Raphson UNDER\_RELAXATION is not applied. | -| GWF | NAM | PACKAGES | FTYPE | STRING | is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. | +| GWF | NAM | PACKAGES | FTYPE | STRING | is the file type, which must be one of the following character values shown in table~\ref{table:ftype-gwf}. Ftype may be entered in any combination of uppercase and lowercase. | | GWF | NAM | PACKAGES | FNAME | STRING | is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. | | GWF | NAM | PACKAGES | PNAME | STRING | is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single GWF Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. | | GWF | NPF | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that budget flow terms will be written to the file specified with ``BUDGET SAVE FILE'' in Output Control. | @@ -1411,7 +1411,7 @@ | GWT | NAM | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of all model stress package information will be written to the listing file immediately after it is read. | | GWT | NAM | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of all model package flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | | GWT | NAM | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that all model package flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| GWT | NAM | PACKAGES | FTYPE | STRING | is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. | +| GWT | NAM | PACKAGES | FTYPE | STRING | is the file type, which must be one of the following character values shown in table~\ref{table:ftype-gwt}. Ftype may be entered in any combination of uppercase and lowercase. | | GWT | NAM | PACKAGES | FNAME | STRING | is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. | | GWT | NAM | PACKAGES | PNAME | STRING | is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single GWT Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. | | GWT | OC | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | @@ -1579,7 +1579,7 @@ | PRT | NAM | OPTIONS | PRINT_INPUT | KEYWORD | keyword to indicate that the list of all model stress package information will be written to the listing file immediately after it is read. | | PRT | NAM | OPTIONS | PRINT_FLOWS | KEYWORD | keyword to indicate that the list of all model package flow rates will be printed to the listing file for every stress period time step in which ``BUDGET PRINT'' is specified in Output Control. If there is no Output Control option and ``PRINT\_FLOWS'' is specified, then flow rates are printed for the last time step of each stress period. | | PRT | NAM | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that all model package flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | -| PRT | NAM | PACKAGES | FTYPE | STRING | is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. | +| PRT | NAM | PACKAGES | FTYPE | STRING | is the file type, which must be one of the following character values shown in table~\ref{table:ftype-prt}. Ftype may be entered in any combination of uppercase and lowercase. | | PRT | NAM | PACKAGES | FNAME | STRING | is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. | | PRT | NAM | PACKAGES | PNAME | STRING | is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single PRT Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. | | PRT | OC | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | @@ -1627,9 +1627,9 @@ | PRT | PRP | OPTIONS | ISTOPZONE | INTEGER | integer value defining the stop zone number. If cells have been assigned IZONE values in the GRIDDATA block, a particle terminates if it enters a cell whose IZONE value matches ISTOPZONE. An ISTOPZONE value of zero indicates that there is no stop zone. The default value is zero. | | PRT | PRP | OPTIONS | DRAPE | KEYWORD | is a text keyword to indicate that if a particle's release point is in a cell that happens to be inactive at release time, the particle is to be moved to the topmost active cell below it, if any. By default, a particle is not released into the simulation if its release point's cell is inactive at release time. | | PRT | PRP | OPTIONS | RELEASE_TIMES | KEYWORD | keyword indicating release times will follow | -| PRT | PRP | OPTIONS | TIMES | DOUBLE PRECISION (UNKNOWN) | times to release, relative to the beginning of the simulation. RELEASE\_TIMES and RELEASE\_TIMESFILE are mutually exclusive. Explicit release times and release settings configured in the period block are additive and can be mixed and matched. | +| PRT | PRP | OPTIONS | TIMES | DOUBLE PRECISION (UNKNOWN) | times to release, relative to the beginning of the simulation. RELEASE\_TIMES and RELEASE\_TIMESFILE are mutually exclusive. | | PRT | PRP | OPTIONS | RELEASE_TIMESFILE | KEYWORD | keyword indicating release times file name will follow | -| PRT | PRP | OPTIONS | TIMESFILE | STRING | name of the release times file. RELEASE\_TIMES and RELEASE\_TIMESFILE are mutually exclusive. Explicit release times and release settings configured in the period block are additive and can be mixed and matched. | +| PRT | PRP | OPTIONS | TIMESFILE | STRING | name of the release times file. RELEASE\_TIMES and RELEASE\_TIMESFILE are mutually exclusive. | | PRT | PRP | OPTIONS | DEV_FORCETERNARY | KEYWORD | force use of the ternary tracking method regardless of cell type in DISV grids. | | PRT | PRP | DIMENSIONS | NRELEASEPTS | INTEGER | is the number of particle release points. | | PRT | PRP | PACKAGEDATA | IRPTNO | INTEGER | integer value that defines the PRP release point number associated with the specified PACKAGEDATA data on the line. IRPTNO must be greater than zero and less than or equal to NRELEASEPTS. The program will terminate with an error if information for a PRP release point number is specified more than once. | @@ -1772,7 +1772,7 @@ | SWF | NAM | OPTIONS | SAVE_FLOWS | KEYWORD | keyword to indicate that all model package flow terms will be written to the file specified with ``BUDGET FILEOUT'' in Output Control. | | SWF | NAM | OPTIONS | NEWTON | KEYWORD | keyword that activates the Newton-Raphson formulation for surface water flow between connected reaches and stress packages that support calculation of Newton-Raphson terms. | | SWF | NAM | OPTIONS | UNDER_RELAXATION | KEYWORD | keyword that indicates whether the surface water stage in a reach will be under-relaxed when water levels fall below the bottom of the model below any given cell. By default, Newton-Raphson UNDER\_RELAXATION is not applied. | -| SWF | NAM | PACKAGES | FTYPE | STRING | is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. | +| SWF | NAM | PACKAGES | FTYPE | STRING | is the file type, which must be one of the following character values shown in table~\ref{table:ftype-swf}. Ftype may be entered in any combination of uppercase and lowercase. | | SWF | NAM | PACKAGES | FNAME | STRING | is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. | | SWF | NAM | PACKAGES | PNAME | STRING | is the user-defined name for the package. PNAME is restricted to 16 characters. No spaces are allowed in PNAME. PNAME character values are read and stored by the program for stress packages only. These names may be useful for labeling purposes when multiple stress packages of the same type are located within a single SWF Model. If PNAME is specified for a stress package, then PNAME will be used in the flow budget table in the listing file; it will also be used for the text entry in the cell-by-cell budget file. PNAME is case insensitive and is stored in all upper case letters. | | SWF | OC | OPTIONS | BUDGET | KEYWORD | keyword to specify that record corresponds to the budget. | diff --git a/doc/mf6io/mf6ivar/tex/gwe-est-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-est-desc.tex index bf787adc828..d708c3c848b 100644 --- a/doc/mf6io/mf6ivar/tex/gwe-est-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwe-est-desc.tex @@ -19,7 +19,7 @@ \item \texttt{cps}---is the mass-based heat capacity of dry solids (aquifer material). For example, units of J/kg/C may be used (or equivalent). -\item \texttt{rhos}---is a user-specified value of the density of aquifer material not considering the voids. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kg/m3. +\item \texttt{rhos}---is a user-specified value of the density of aquifer material not considering the voids. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kilograms per cubic meter. \end{description} \item \textbf{Block: PACKAGEDATA} @@ -27,7 +27,7 @@ \begin{description} \item \texttt{cpw}---is the mass-based heat capacity of the simulated fluid. For example, units of J/kg/C may be used (or equivalent). -\item \texttt{rhow}---is a user-specified value of the density of water. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kg/m3. +\item \texttt{rhow}---is a user-specified value of the density of water. Value will remain fixed for the entire simulation. For example, if working in SI units, values may be entered as kilograms per cubic meter. \item \texttt{latheatvap}---is the user-specified value for the latent heat of vaporization. For example, if working in SI units, values may be entered as kJ/kg. diff --git a/doc/mf6io/mf6ivar/tex/gwe-nam-desc.tex b/doc/mf6io/mf6ivar/tex/gwe-nam-desc.tex index c42592c0fa3..5ede0afb946 100644 --- a/doc/mf6io/mf6ivar/tex/gwe-nam-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwe-nam-desc.tex @@ -15,7 +15,7 @@ \item \textbf{Block: PACKAGES} \begin{description} -\item \texttt{ftype}---is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. +\item \texttt{ftype}---is the file type, which must be one of the following character values shown in table~\ref{table:ftype-gwe}. Ftype may be entered in any combination of uppercase and lowercase. \item \texttt{fname}---is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. diff --git a/doc/mf6io/mf6ivar/tex/gwf-nam-desc.tex b/doc/mf6io/mf6ivar/tex/gwf-nam-desc.tex index d6674afa195..5faf613167c 100644 --- a/doc/mf6io/mf6ivar/tex/gwf-nam-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwf-nam-desc.tex @@ -19,7 +19,7 @@ \item \textbf{Block: PACKAGES} \begin{description} -\item \texttt{ftype}---is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. +\item \texttt{ftype}---is the file type, which must be one of the following character values shown in table~\ref{table:ftype-gwf}. Ftype may be entered in any combination of uppercase and lowercase. \item \texttt{fname}---is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. diff --git a/doc/mf6io/mf6ivar/tex/gwt-nam-desc.tex b/doc/mf6io/mf6ivar/tex/gwt-nam-desc.tex index 57e9efa2937..6197238f457 100644 --- a/doc/mf6io/mf6ivar/tex/gwt-nam-desc.tex +++ b/doc/mf6io/mf6ivar/tex/gwt-nam-desc.tex @@ -15,7 +15,7 @@ \item \textbf{Block: PACKAGES} \begin{description} -\item \texttt{ftype}---is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. +\item \texttt{ftype}---is the file type, which must be one of the following character values shown in table~\ref{table:ftype-gwt}. Ftype may be entered in any combination of uppercase and lowercase. \item \texttt{fname}---is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. diff --git a/doc/mf6io/mf6ivar/tex/prt-nam-desc.tex b/doc/mf6io/mf6ivar/tex/prt-nam-desc.tex index 6c7d8fd876e..316a1547db9 100644 --- a/doc/mf6io/mf6ivar/tex/prt-nam-desc.tex +++ b/doc/mf6io/mf6ivar/tex/prt-nam-desc.tex @@ -15,7 +15,7 @@ \item \textbf{Block: PACKAGES} \begin{description} -\item \texttt{ftype}---is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. +\item \texttt{ftype}---is the file type, which must be one of the following character values shown in table~\ref{table:ftype-prt}. Ftype may be entered in any combination of uppercase and lowercase. \item \texttt{fname}---is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. diff --git a/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex b/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex index fc1da97edae..830577fbfaf 100644 --- a/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex +++ b/doc/mf6io/mf6ivar/tex/prt-prp-desc.tex @@ -33,11 +33,11 @@ \item \texttt{RELEASE\_TIMES}---keyword indicating release times will follow -\item \texttt{times}---times to release, relative to the beginning of the simulation. RELEASE\_TIMES and RELEASE\_TIMESFILE are mutually exclusive. Explicit release times and release settings configured in the period block are additive and can be mixed and matched. +\item \texttt{times}---times to release, relative to the beginning of the simulation. RELEASE\_TIMES and RELEASE\_TIMESFILE are mutually exclusive. \item \texttt{RELEASE\_TIMESFILE}---keyword indicating release times file name will follow -\item \texttt{timesfile}---name of the release times file. RELEASE\_TIMES and RELEASE\_TIMESFILE are mutually exclusive. Explicit release times and release settings configured in the period block are additive and can be mixed and matched. +\item \texttt{timesfile}---name of the release times file. RELEASE\_TIMES and RELEASE\_TIMESFILE are mutually exclusive. \end{description} \item \textbf{Block: DIMENSIONS} diff --git a/doc/mf6io/mf6ivar/tex/swf-nam-desc.tex b/doc/mf6io/mf6ivar/tex/swf-nam-desc.tex index fdc7325d2d0..7670aaf06b2 100644 --- a/doc/mf6io/mf6ivar/tex/swf-nam-desc.tex +++ b/doc/mf6io/mf6ivar/tex/swf-nam-desc.tex @@ -19,7 +19,7 @@ \item \textbf{Block: PACKAGES} \begin{description} -\item \texttt{ftype}---is the file type, which must be one of the following character values shown in table~\ref{table:ftype}. Ftype may be entered in any combination of uppercase and lowercase. +\item \texttt{ftype}---is the file type, which must be one of the following character values shown in table~\ref{table:ftype-swf}. Ftype may be entered in any combination of uppercase and lowercase. \item \texttt{fname}---is the name of the file containing the package input. The path to the file should be included if the file is not located in the folder where the program was run. diff --git a/doc/mf6io/prt/namefile.tex b/doc/mf6io/prt/namefile.tex index 776f622be31..020e2daec64 100644 --- a/doc/mf6io/prt/namefile.tex +++ b/doc/mf6io/prt/namefile.tex @@ -30,7 +30,7 @@ \subsubsection{Explanation of Variables} OC6 & Output Control Option \\ \hline \end{tabular*} -\label{table:ftype} +\label{table:ftype-prt} \end{center} \normalsize \end{table} diff --git a/doc/mf6io/swf/namefile.tex b/doc/mf6io/swf/namefile.tex index 6bae5913123..c11477da175 100644 --- a/doc/mf6io/swf/namefile.tex +++ b/doc/mf6io/swf/namefile.tex @@ -37,7 +37,7 @@ \subsubsection{Explanation of Variables} OBS6 & Observations Option \\ \hline \end{tabular*} -\label{table:ftype} +\label{table:ftype-swf} \end{center} \normalsize \end{table} From 0c9953f316b1e5a3900372fc142ad624c47d70dd Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 22 May 2024 08:00:00 -0400 Subject: [PATCH 191/199] docs(prt): improve docstrings, use LENBOUNDNAME in mf6io (#1840) * add optional tol dummy arg to nudge() routine in MethodSubcellTernary, better dummy arg naming, improve docstring * use LENBOUNDNAME instead of hardcoded 40 in mf6io document * clarify docstring for shared_face() routine in GeomUtil --- doc/mf6io/framework/binaryoutput.tex | 2 +- doc/mf6io/prt/prt.tex | 2 +- .../ParticleTracker/MethodSubcellTernary.f90 | 81 +++++++++++-------- src/Utilities/GeomUtil.f90 | 2 +- 4 files changed, 50 insertions(+), 37 deletions(-) diff --git a/doc/mf6io/framework/binaryoutput.tex b/doc/mf6io/framework/binaryoutput.tex index 923e52aebea..d20bb1a5923 100644 --- a/doc/mf6io/framework/binaryoutput.tex +++ b/doc/mf6io/framework/binaryoutput.tex @@ -771,7 +771,7 @@ \subsection{Particle Track File} \noindent Field 12: \texttt{`X'} {\color{red} \footnotesize{DOUBLE}} \\ \noindent Field 13: \texttt{`Y'} {\color{red} \footnotesize{DOUBLE}} \\ \noindent Field 14: \texttt{`Z'} {\color{red} \footnotesize{DOUBLE}} \\ -\noindent Field 15: \texttt{`NAME'} {\color{red} \footnotesize{CHARACTER(LEN=40)}} \\ +\noindent Field 15: \texttt{`NAME'} {\color{red} \footnotesize{CHARACTER(LEN=LENBOUNDNAME)}} \\ \vspace{4mm} \noindent The ``NAME'' field may be empty. diff --git a/doc/mf6io/prt/prt.tex b/doc/mf6io/prt/prt.tex index 61dee794e5a..657a0127913 100644 --- a/doc/mf6io/prt/prt.tex +++ b/doc/mf6io/prt/prt.tex @@ -41,7 +41,7 @@ \subsection{Particle Track Output} \noindent Column 12: \texttt{`X'} {\color{red} \footnotesize{DOUBLE}} \\ \noindent Column 13: \texttt{`Y'} {\color{red} \footnotesize{DOUBLE}} \\ \noindent Column 14: \texttt{`Z'} {\color{red} \footnotesize{DOUBLE}} \\ -\noindent Column 15: \texttt{`NAME'} {\color{red} \footnotesize{CHARACTER(LEN=40)}} \\ +\noindent Column 15: \texttt{`NAME'} {\color{red} \footnotesize{CHARACTER(LEN=LENBOUNDNAME)}} \\ \vspace{2mm} \noindent where diff --git a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 index 213ce3850e0..62383ef221a 100644 --- a/src/Solution/ParticleTracker/MethodSubcellTernary.f90 +++ b/src/Solution/ParticleTracker/MethodSubcellTernary.f90 @@ -1,6 +1,6 @@ module MethodSubcellTernaryModule use KindModule, only: DP, I4B, LGP - use ConstantsModule, only: DZERO, DSAME, DHALF, DONE, DTWO + use ConstantsModule, only: DZERO, DSAME, DHALF, DONE, DTWO, DONETHIRD use ErrorUtilModule, only: pstop use GeomUtilModule, only: skew use MethodModule, only: MethodType @@ -61,49 +61,62 @@ subroutine apply_mst(this, particle, tmax) end select end subroutine apply_mst - !> @brief Nudge barycentric coordinates such that none is less - !! than distance DSAME from any edge of the canonical subcell. + !> @brief Nudge barycentric coordinates into the interior of + !! the canonical subcell such that the point is at least the + !! minimal distance tol from any face. !! !! Assumes 1 = alpha + beta + gamma, and 0 <= alpha <= 1 (and !! likewise for beta and gamma). The latter is not strictly !! required but it should be established that a particle is - !! _roughly_ in a given subcell before calling this routine. + !! roughly in a given subcell before calling this routine. !< - subroutine nudge(alpi, beti, gami) + subroutine nudge(alpha, beta, gamma, tol) ! dummy - real(DP), intent(inout) :: alpi - real(DP), intent(inout) :: beti - real(DP), intent(out) :: gami + real(DP), intent(inout) :: alpha + real(DP), intent(inout) :: beta + real(DP), intent(out) :: gamma + real(DP), intent(in), optional :: tol ! local real(DP) :: lolimit real(DP) :: hilimit real(DP) :: delta + real(DP) :: ltol - gami = DONE - alpi - beti - lolimit = DSAME - hilimit = DONE - DTWO * DSAME + if (present(tol)) then + ltol = tol + if (tol < DZERO .or. tol > DONETHIRD) then + print *, "error -- tolerance must be between 0 and 1/3, inclusive" + call pstop(1) + end if + else + ltol = DSAME + end if + + gamma = DONE - alpha - beta + lolimit = ltol + hilimit = DONE - DTWO * ltol ! Check alpha coordinate against lower limit - if (alpi < lolimit) then + if (alpha < lolimit) then ! Alpha is too low, so nudge alpha to lower limit; this is a move ! parallel to the "alpha axis," which also changes gamma - alpi = lolimit - gami = DONE - alpi - beti + alpha = lolimit + gamma = DONE - alpha - beta ! Check beta coordinate against lower limit (which in this ! case is equivalent to checking gamma coordinate against ! upper limit) - if (beti < lolimit) then + if (beta < lolimit) then ! Beta is too low (gamma is too high), so nudge beta to lower limit; ! this is a move parallel to the "beta axis," which also changes gamma - beti = lolimit - gami = hilimit + beta = lolimit + gamma = hilimit ! Check beta coordinate against upper limit (which in this ! case is equivalent to checking gamma coordinate against ! lower limit) - else if (beti > hilimit) then + else if (beta > hilimit) then ! Beta is too high (gamma is too low), so nudge beta to lower limit; ! this is a move parallel to the "beta axis," which also changes gamma - beti = hilimit - gami = lolimit + beta = hilimit + gamma = lolimit end if end if ! Check beta coordinate against lower limit. (If alpha coordinate @@ -111,27 +124,27 @@ subroutine nudge(alpi, beti, gami) ! been adjusted as necessary to place particle within subcell, and ! subsequent checks on beta and gamma will evaluate to false, and ! no further adjustments will be made.) - if (beti < lolimit) then + if (beta < lolimit) then ! Beta is too low, so nudge beta to lower limit; this is a move ! parallel to the "beta axis," which also changes gamma - beti = lolimit - gami = DONE - alpi - beti + beta = lolimit + gamma = DONE - alpha - beta ! Check alpha coordinate against lower limit (which in this ! case is equivalent to checking gamma coordinate against ! upper limit) - if (alpi < lolimit) then + if (alpha < lolimit) then ! Alpha is too low (gamma is too high), so nudge alpha to lower limit; ! this is a move parallel to the "alpha axis," which also changes gamma - alpi = lolimit - gami = hilimit + alpha = lolimit + gamma = hilimit ! Check alpha coordinate against upper limit (which in this ! case is equivalent to checking gamma coordinate against ! lower limit) - else if (alpi > hilimit) then + else if (alpha > hilimit) then ! Alpha is too high (gamma is too low), so nudge alpha to lower limit; ! this is a move parallel to the "alpha axis," which also changes gamma - alpi = hilimit - gami = lolimit + alpha = hilimit + gamma = lolimit end if end if ! Check gamma coordinate against lower limit.(If alpha and/or beta @@ -139,13 +152,13 @@ subroutine nudge(alpi, beti, gami) ! been adjusted as necessary to place particle within subcell, and ! subsequent check on gamma will evaluate to false, and no further ! adjustment will be made.) - if (gami < lolimit) then + if (gamma < lolimit) then ! Gamma is too low, so nudge gamma to lower limit; this is a move ! parallel to the "gamma axis," which also changes alpha and beta - delta = DHALF * (lolimit - gami) - gami = DSAME - alpi = alpi - delta - beti = beti - delta + delta = DHALF * (lolimit - gamma) + gamma = ltol + alpha = alpha - delta + beta = beta - delta end if end subroutine nudge diff --git a/src/Utilities/GeomUtil.f90 b/src/Utilities/GeomUtil.f90 index 8d591145e41..6e99bffdfec 100644 --- a/src/Utilities/GeomUtil.f90 +++ b/src/Utilities/GeomUtil.f90 @@ -389,7 +389,7 @@ end function area !> @brief Find the lateral face shared by two cells. !! - !! Find the lateral (horizontal) face shared by the given cells. + !! Find the lateral (x-y plane) face shared by the given cells. !! The iface return argument will be 0 if they share no such face, !! otherwise the index of the shared face in cell 1's vertex array, !! where face N connects vertex N to vertex N + 1 going clockwise. From d36faa65c2bae7fcf323243326cf6144e7cf2925 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 22 May 2024 15:20:04 -0400 Subject: [PATCH 192/199] test(release): fix distribution example script check (#1841) Remove break statement likely leftover from development/debugging, which caused only the first example model to get a test run. This is why the examples script issue addressed by MODFLOW-USGS/modflow-devtools#156, where models were written to runall.[sh/bat] in an order which did not respect flow model dependencies, was not caught before. After this PR, the runall.[sh/bat] script will be tested, as well as 3 of the separate example scripts picked at random. --- distribution/check_dist.py | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/distribution/check_dist.py b/distribution/check_dist.py index 17c0198e4e2..bfd237e7e81 100644 --- a/distribution/check_dist.py +++ b/distribution/check_dist.py @@ -3,10 +3,12 @@ from os import environ from pathlib import Path from pprint import pprint +from random import shuffle import pytest from modflow_devtools.markers import no_parallel +from modflow_devtools.misc import run_cmd # OS-specific extensions @@ -175,20 +177,34 @@ def test_examples(dist_dir_path, full): if not full: pytest.skip(reason="examples not included in minimal distribution") + # check examples directory examples_path = dist_dir_path / "examples" assert examples_path.is_dir() - assert (examples_path / f"runall{_scext}").is_file() + + # print examples found example_paths = [ p for p in examples_path.glob("*") if p.is_dir() and p.stem.startswith("ex") ] + assert any(example_paths) print(f"{len(example_paths)} example models found:") pprint(example_paths) - for p in example_paths: - script_path = p / f"run{_scext}" - if not script_path.is_file(): - continue - pprint(subprocess.check_output([str(script_path)], cwd=p).decode().split()) - break + + # pick some examples at random to test run individually + n = 3 + shuffle(example_paths) + script_paths = [next(iter(p.rglob(f"*run{_scext}"))) for p in example_paths[:n]] + print(f"Testing {n} randomly selected example model scripts:") + pprint(script_paths) + for script_path in script_paths: + out, err, ret = run_cmd(str(script_path), cwd=script_path.parent) + assert not ret, out + err + + # check comprehensive examples script and give it a test run + script_path = examples_path / f"runall{_scext}" + print(f"Testing comprehensive examples script: {script_path}") + assert script_path.is_file() + out, err, ret = run_cmd(str(script_path), cwd=script_path.parent) + assert not ret, out + err @no_parallel From a178bb1b481ae728abf705a57924ac64929e2abd Mon Sep 17 00:00:00 2001 From: Eric Morway Date: Thu, 23 May 2024 04:39:05 -0700 Subject: [PATCH 193/199] chore(tsp): minor code cleanups (#1839) --- src/Model/TransportModel/tsp-fmi.f90 | 2 +- src/Model/TransportModel/tsp-ssm.f90 | 43 ++++++++++------------------ 2 files changed, 16 insertions(+), 29 deletions(-) diff --git a/src/Model/TransportModel/tsp-fmi.f90 b/src/Model/TransportModel/tsp-fmi.f90 index e303f412cd8..5452ddfdec6 100644 --- a/src/Model/TransportModel/tsp-fmi.f90 +++ b/src/Model/TransportModel/tsp-fmi.f90 @@ -158,7 +158,7 @@ subroutine fmi_ad(this, cnew) ! ! -- Set flag to indicated that flows are being updated. For the case where ! flows may be reused (only when flows are read from a file) then set - ! the flag to zero to indicated that flows were not updated + ! the flag to zero to indicate that flows were not updated this%iflowsupdated = 1 ! ! -- If reading flows from a budget file, read the next set of records diff --git a/src/Model/TransportModel/tsp-ssm.f90 b/src/Model/TransportModel/tsp-ssm.f90 index 2880901a302..8ff9a215ba0 100644 --- a/src/Model/TransportModel/tsp-ssm.f90 +++ b/src/Model/TransportModel/tsp-ssm.f90 @@ -127,8 +127,6 @@ subroutine ssm_df(this) use MemoryManagerModule, only: mem_setptr ! -- dummy class(TspSsmType) :: this !< TspSsmType object - ! -- local - ! -- formats ! ! -- Return return @@ -147,13 +145,12 @@ subroutine ssm_ar(this, dis, ibound, cnew) class(DisBaseType), pointer, intent(in) :: dis !< discretization package integer(I4B), dimension(:), pointer, contiguous :: ibound !< GWT model ibound real(DP), dimension(:), pointer, contiguous :: cnew !< GWT model dependent variable - ! -- local ! -- formats character(len=*), parameter :: fmtssm = & "(1x,/1x,'SSM -- SOURCE-SINK MIXING PACKAGE, VERSION 1, 8/25/2017', & &' INPUT READ FROM UNIT ', i0, //)" ! - ! --print a message identifying the storage package. + ! -- print a message identifying the storage package. write (this%iout, fmtssm) this%inunit ! ! -- store pointers to arguments that were passed in @@ -197,7 +194,6 @@ end subroutine ssm_ar !! are read. !< subroutine ssm_rp(this) - ! -- modules ! -- dummy class(TspSsmType) :: this !< TspSsmType object ! -- local @@ -227,7 +223,6 @@ end subroutine ssm_rp !! then ssm concenrations must be interpolated for the time step. !< subroutine ssm_ad(this) - ! -- modules ! -- dummy class(TspSsmType) :: this !< TspSsmType object ! -- local @@ -235,7 +230,6 @@ subroutine ssm_ad(this) type(GwtSpcType), pointer :: ssmiptr integer(I4B) :: i integer(I4B) :: node -! ------------------------------------------------------------------------------ ! ! -- Calculate total number of existing flow boundaries. It is possible ! that a node may equal zero. In this case, the bound should be @@ -315,23 +309,24 @@ subroutine ssm_term(this, ipackage, ientry, rrate, rhsval, hcofval, & ! ! -- If qbnd is positive, then concentration represents the inflow ! concentration. If qbnd is negative, then the outflow concentration - ! is set equal to the simulated cell concentration + ! (or temperature) is set equal to the simulated cell's concentration + ! (or temperature). if (qbnd >= DZERO) then omega = DZERO ! rhs else ctmp = this%cnew(n) omega = DONE ! lhs if (ctmp < DZERO) then - omega = DZERO ! concentration is negative, so set mass flux to zero + omega = DZERO ! concentration/temperature is negative, so set mass flux to zero end if end if else ! ! -- lauxmixed value indicates that this is a mixed sink type where - ! the concentration value represents the injected concentration if - ! qbnd is positive. If qbnd is negative, then the withdrawn water - ! is equal to the minimum of the aux concentration and the cell - ! concentration. + ! the concentration value represents the injected concentration (or + ! temperature) if qbnd is positive. If qbnd is negative, then the + ! withdrawn water is equal to the minimum of the aux concentration + ! (or temperature) and the cell concentration (or temperature). if (qbnd >= DZERO) then omega = DZERO ! rhs (ctmp is aux value) else @@ -386,11 +381,11 @@ subroutine get_ssm_conc(this, ipackage, ientry, nbound_flow, conc, & ! -- local integer(I4B) :: isrctype integer(I4B) :: iauxpos - + ! conc = DZERO lauxmixed = .false. isrctype = this%isrctype(ipackage) - + ! select case (isrctype) case (1, 2) iauxpos = this%iauxpak(ipackage) @@ -411,7 +406,6 @@ end subroutine get_ssm_conc !! updating the a matrix and right-hand side vector. !< subroutine ssm_fc(this, matrix_sln, idxglo, rhs) - ! -- modules ! -- dummy class(TspSsmType) :: this class(MatrixBaseType), pointer :: matrix_sln @@ -453,11 +447,10 @@ end subroutine ssm_fc !> @ brief Calculate flow !! !! Calculate the resulting mass flow between the boundary and the connected - !! GWT model cell. Update the diagonal position of the flowja array so that - !! it ultimately contains the solute balance residual. + !! GWT/GWE model cell. Update the diagonal position of the flowja array so + !! that it ultimately contains the solute balance residual. !< subroutine ssm_cq(this, flowja) - ! -- modules ! -- dummy class(TspSsmType) :: this !< TspSsmType object real(DP), dimension(:), contiguous, intent(inout) :: flowja !< flow across each face in the model grid @@ -735,7 +728,6 @@ subroutine allocate_scalars(this) use MemoryManagerModule, only: mem_allocate, mem_setptr ! -- dummy class(TspSsmType) :: this !< TspSsmType object - ! -- local ! ! -- allocate scalars in NumericalPackageType call this%NumericalPackageType%allocate_scalars() @@ -786,7 +778,6 @@ end subroutine allocate_arrays !! Read and set the SSM Package options !< subroutine read_options(this) - ! -- modules ! -- dummy class(TspSsmType) :: this !< TspSsmType object ! -- local @@ -868,8 +859,6 @@ subroutine read_sources_aux(this) logical :: isfound, endOfBlock logical :: pakfound logical :: lauxmixed - ! -- formats - ! -- data ! ! -- initialize isfound = .false. @@ -971,8 +960,6 @@ subroutine read_sources_fileinput(this) logical :: isfound, endOfBlock logical :: pakfound logical :: lauxmixed - ! -- formats - ! -- data ! ! -- initialize isfound = .false. @@ -1052,7 +1039,7 @@ subroutine read_sources_fileinput(this) ! ! -- Store the source type (3 or 4) this%isrctype(ip) = isrctype - + ! end do write (this%iout, '(1x,a)') 'END PROCESSING FILEINPUT' else @@ -1135,12 +1122,12 @@ subroutine set_ssmivec(this, ip, packname) call this%parser%GetString(filename) inunit = getunit() call openfile(inunit, this%iout, filename, 'SPC', filstat_opt='OLD') - + ! ! -- Create the SPC file object ssmiptr => this%ssmivec(ip) call ssmiptr%initialize(this%dis, ip, inunit, this%iout, this%name_model, & trim(packname)) - + ! write (this%iout, '(4x, a, a, a, a, a)') 'USING SPC INPUT FILE ', & trim(filename), ' TO SET ', trim(this%depvartype), & 'S FOR PACKAGE ', trim(packname) From bb4a89abf51496585ec16aec4d17880a44aaa867 Mon Sep 17 00:00:00 2001 From: langevin-usgs Date: Thu, 23 May 2024 07:49:22 -0500 Subject: [PATCH 194/199] docs(release): minor clarifications in release notes (#1842) --- doc/ReleaseNotes/ReleaseNotes.tex | 9 ++++++--- doc/ReleaseNotes/develop.tex | 6 +++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/doc/ReleaseNotes/ReleaseNotes.tex b/doc/ReleaseNotes/ReleaseNotes.tex index 17b5a209871..d31cef49668 100644 --- a/doc/ReleaseNotes/ReleaseNotes.tex +++ b/doc/ReleaseNotes/ReleaseNotes.tex @@ -228,6 +228,9 @@ \section{Known Issues and Incompatibilities} \item If a GWF-GWF Exchange is active, then neither of the connected GWF Models can have an active Viscosity (VSC) Package. +\item +If a GWT-GWT Exchange is active, then constant concentration conditions cannot be assigned on the interface between the two connected models. + \end{enumerate} In addition to the issues shown here, a comprehensive and up-to-date list is available under the issues tab at \url{https://github.com/MODFLOW-USGS/modflow6}. @@ -235,7 +238,7 @@ \section{Known Issues and Incompatibilities} % ------------------------------------------------- \section{Distribution File} -The distribution is provided in the form of a compressed zip file. Distributions are available for several different operating systems, including Windows, Mac, and Linux. Distributions are marked with an operating system tag, called ``ostag''. Values for ``ostag'' include ``win64'', ``mac'', and ``linux'', for example. Distribution files for this release are labeled as \texttt{\modflowversion\_[ostag].zip}. Thus, the distribution file for Windows for this release is \texttt{\modflowversion\_win64.zip}. +The MODFLOW~6 distribution is provided in the form of a compressed zip file. Distributions are available for several different operating systems, including Windows, Mac, and Linux. Distributions are marked with an operating system tag, called ``ostag''. Values for ``ostag'' include ``win64'', ``mac'', and ``linux'', for example. Distribution files for the current release are labeled as \texttt{\modflowversion\_[ostag].zip}. Thus, the distribution file for Windows for the current release is \texttt{\modflowversion\_win64.zip}. It is recommended that no user files are kept in the release directory. If you do plan to put your own files in the release directory, do so only by creating additional subdirectories. @@ -245,9 +248,9 @@ \section{Installation and Execution} To make the executable versions of MODFLOW~6 accessible from any directory, the directory containing the executables should be included in the PATH environment variable. Also, if a prior release of MODFLOW~6 is installed on your system, the directory containing the executables for the prior release should be removed from the PATH environment variable. -As an alternative, the executable file, named ``\texttt{mf6.exe}'' on Windows, in the \modflowversion\_[ostag]/bin directory can be copied into a directory already included in the PATH environment variable. +As an alternative, the executable file (named ``\texttt{mf6.exe}'' on Windows or ``\texttt{mf6}'' on Mac and Linux) in the \modflowversion\_[ostag]/bin directory can be copied into a directory already included in the PATH environment variable. -To run MODFLOW~6, simply type \texttt{mf6} in a terminal window. The current working directory must be set to a location where the model input files are located. Upon execution, MODFLOW~6 will immediately look for file with the name \texttt{mfsim.nam} in the current working directory, and will terminate with an error if it does not find this file. +To run MODFLOW~6, simply type \texttt{mf6} in a terminal window. The current working directory must be set to a location where the model input files are located. Upon execution, MODFLOW~6 will immediately look for a file with the name \texttt{mfsim.nam} in the current working directory, and will terminate with an error if it does not find this file. % ------------------------------------------------- \section{Compiling MODFLOW~6} diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index b459860503a..d0e1d5e7c31 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -5,7 +5,7 @@ \underline{NEW FUNCTIONALITY} \begin{itemize} - \item A new Groundwater Energy (GWE) transport model is introduced to the code base for simulating heat transport in the subsurface. GWE Models can be coupled together using a new GWE-GWE Exchange. Additional information for activating the GWE model type within a MODFLOW 6 simulation is available within the mf6io.pdf document. Technical details about the GWE Model are given in the supplemental technical information document (mf6suptechinfo) provided with the release. New example problems have been developed for testing and demonstrating GWE capabilities (in addition to other internal tests that help verify the accuracy of GWE); however, additional changes to the code and input may be necessary in response to user needs and further testing. + \item A new Groundwater Energy (GWE) transport model was added to simulate heat transport in the subsurface. GWE Models can be coupled together using a new GWE-GWE Exchange. Additional information for activating the GWE model type within a MODFLOW 6 simulation is available within the mf6io.pdf document. Technical details about the GWE Model are given in the supplemental technical information document (mf6suptechinfo) provided with the release. New example problems have been developed for testing and demonstrating GWE capabilities (in addition to other internal tests that help verify the accuracy of GWE); however, additional changes to the code and input may be necessary in response to user needs and further testing. \item A new Particle Tracking (PRT) Model was added to simulate forward tracking of particles for Groundwater Flow (GWF) Models. Additional information for activating the PRT model type within a MODFLOW 6 simulation is available within the mf6io.pdf document. Technical details about the PRT Model are given in the supplemental technical information document (mf6suptechinfo) provided with the release. New example problems have been developed for testing and demonstrating PRT capabilities (in addition to other internal tests that help verify the accuracy of PRT); however, additional changes to the code and input may be necessary in response to user needs and further testing. \item A new capability has been introduced to optionally write user-provided input arrays to external ASCII files. In some cases, such as when the user provides binary files as input, it can be useful to inspect the text representation of that input. Exporting to external ASCII files can be turned on for supported packages by specifying the EXPORT\_ARRAY\_ASCII option. When activated supported variables will be written to files that are named based on the model, package, variable, and layer. Only those arrays specified for the model grid can be exported. \item Added capability to vary the hydraulic conductivity of the reach streambed (RHK) by stress period in the Streamflow Routing (SFR) package. RHK can be modified by stress period using the BEDK SFRSETTING. RHK can also be defined using a timeseries string in the PACKAGEDATA or PERIOD blocks. @@ -15,8 +15,8 @@ \underline{EXAMPLES} \begin{itemize} - \item New examples were added to demonstrate the new Groundwater Energy (GWE) Model. These examples include: danckwerts, geotherm, gwe-prt, and gwe-radial. - \item New examples were added to demonstrate the new Particle Tracking (PRT) Model. These examples include four of the test problems used to demonstrate MODPATH Version 7. + \item Examples were added to demonstrate the new Groundwater Energy (GWE) Model. These examples include: danckwerts, geotherm, gwe-prt, and gwe-radial. + \item Examples were added to demonstrate the new Particle Tracking (PRT) Model. These examples include two of the test problems used to demonstrate MODPATH Version 7. \end{itemize} \textbf{\underline{BUG FIXES AND OTHER CHANGES TO EXISTING FUNCTIONALITY}} \\ From def73f5987a8e822ce4c8a27f02428dd91930ca9 Mon Sep 17 00:00:00 2001 From: mjreno Date: Thu, 23 May 2024 09:42:34 -0400 Subject: [PATCH 195/199] refactor(idm): verify and store error based on length of user input names (#1775) * check input length of model,exg,pacakge names * delay model package name error until all names checked --------- Co-authored-by: mjreno --- src/Utilities/Idm/IdmLoad.f90 | 24 ++++++++++++------ src/Utilities/Idm/ModelPackageInputs.f90 | 10 ++++++-- src/Utilities/Idm/SourceCommon.f90 | 31 +++++++++++++++++++++++- 3 files changed, 55 insertions(+), 10 deletions(-) diff --git a/src/Utilities/Idm/IdmLoad.f90 b/src/Utilities/Idm/IdmLoad.f90 index eb3fd089cc0..27576bdeb61 100644 --- a/src/Utilities/Idm/IdmLoad.f90 +++ b/src/Utilities/Idm/IdmLoad.f90 @@ -10,7 +10,7 @@ module IdmLoadModule use SimVariablesModule, only: errmsg use ConstantsModule, only: LINELENGTH, LENMEMPATH, LENMODELNAME, & LENEXCHANGENAME, LENCOMPONENTNAME - use SimModule, only: store_error, store_error_filename + use SimModule, only: store_error, count_errors, store_error_filename use ListModule, only: ListType use InputLoadTypeModule, only: StaticPkgLoadBaseType, & DynamicPkgLoadBaseType, & @@ -213,10 +213,10 @@ subroutine load_models(iout) use MemoryHelperModule, only: create_mem_path use MemoryManagerModule, only: mem_setptr use CharacterStringModule, only: CharacterStringType - use SimVariablesModule, only: idm_context use DistributedSimModule, only: DistributedSimType, get_dsim + use SimVariablesModule, only: idm_context, simfile use ModelPackageInputsModule, only: ModelPackageInputsType - use SourceCommonModule, only: idm_component_type + use SourceCommonModule, only: idm_component_type, inlen_check use SourceLoadModule, only: load_modelnam ! -- dummy integer(I4B), intent(in) :: iout @@ -252,7 +252,12 @@ subroutine load_models(iout) ! -- attributes for this model mtype = mtypes(n) mfname = mfnames(n) - mname = mnames(n) + call inlen_check(mnames(n), mname, LENMODELNAME, 'MODELNAME') + ! + ! -- terminate if errors were detected + if (count_errors() > 0) then + call store_error_filename(simfile) + end if ! ! -- load specified model inputs if (model_loadmask(n) > 0) then @@ -290,7 +295,8 @@ subroutine load_exchanges(iout) use CharacterStringModule, only: CharacterStringType use SimVariablesModule, only: idm_context, simfile use DistributedSimModule, only: DistributedSimType, get_dsim - use SourceCommonModule, only: idm_subcomponent_type, ifind_charstr + use SourceCommonModule, only: idm_subcomponent_type, ifind_charstr, & + inlen_check use SourceLoadModule, only: create_input_loader, remote_model_ndim ! -- dummy integer(I4B), intent(in) :: iout @@ -348,8 +354,8 @@ subroutine load_exchanges(iout) ! -- attributes for this exchange exgtype = etypes(n) efname = efiles(n) - mname1 = emnames_a(n) - mname2 = emnames_b(n) + call inlen_check(emnames_a(n), mname1, LENMODELNAME, 'MODELNAME') + call inlen_check(emnames_b(n), mname2, LENMODELNAME, 'MODELNAME') ! ! initialize mempath as no path emempaths(n) = '' @@ -364,6 +370,10 @@ subroutine load_exchanges(iout) if (m1_idx <= 0) errmsg = trim(errmsg)//' '//trim(mname1) if (m2_idx <= 0) errmsg = trim(errmsg)//' '//trim(mname2) call store_error(errmsg) + end if + ! + ! -- terminate if errors were detected + if (count_errors() > 0) then call store_error_filename(simfile) end if ! diff --git a/src/Utilities/Idm/ModelPackageInputs.f90 b/src/Utilities/Idm/ModelPackageInputs.f90 index cda83dd286a..8ca93fa584d 100644 --- a/src/Utilities/Idm/ModelPackageInputs.f90 +++ b/src/Utilities/Idm/ModelPackageInputs.f90 @@ -10,7 +10,7 @@ module ModelPackageInputsModule use SimVariablesModule, only: errmsg use ConstantsModule, only: LINELENGTH, LENMEMPATH, LENMODELNAME, LENFTYPE, & LENPACKAGETYPE, LENPACKAGENAME, LENCOMPONENTNAME - use SimModule, only: store_error, store_error_filename + use SimModule, only: store_error, count_errors, store_error_filename use SimVariablesModule, only: iout use ArrayHandlersModule, only: expandarray use CharacterStringModule, only: CharacterStringType @@ -384,6 +384,7 @@ end subroutine modelpkgs_add subroutine modelpkgs_addpkgs(this) ! -- modules use MemoryManagerModule, only: mem_setptr + use SourceCommonModule, only: inlen_check ! -- dummy class(ModelPackageInputsType) :: this ! -- local @@ -410,12 +411,17 @@ subroutine modelpkgs_addpkgs(this) ! -- attributes for this package ftype = ftypes(n) fname = fnames(n) - pname = pnames(n) + call inlen_check(pnames(n), pname, LENPACKAGENAME, 'PACKAGENAME') ! ! -- add this instance to package list call this%add(ftype, fname, pname) end do ! + ! -- terminate if errors were detected + if (count_errors() > 0) then + call store_error_filename(this%modelfname) + end if + ! ! -- return end subroutine modelpkgs_addpkgs diff --git a/src/Utilities/Idm/SourceCommon.f90 b/src/Utilities/Idm/SourceCommon.f90 index 4e1246484f9..e84d229d528 100644 --- a/src/Utilities/Idm/SourceCommon.f90 +++ b/src/Utilities/Idm/SourceCommon.f90 @@ -21,6 +21,7 @@ module SourceCommonModule public :: file_ext public :: ifind_charstr public :: filein_fname + public :: inlen_check contains @@ -445,7 +446,6 @@ end function ifind_charstr !< function filein_fname(filename, tagname, input_mempath, input_fname) & result(found) - use SimModule, only: store_error, store_error_filename use MemoryManagerModule, only: mem_setptr, get_isize use CharacterStringModule, only: CharacterStringType character(len=*), intent(inout) :: filename @@ -483,4 +483,33 @@ function filein_fname(filename, tagname, input_mempath, input_fname) & return end function filein_fname + !> @brief store an error for input exceeding internal name length + !< + subroutine inlen_check(input_name, mf6_name, maxlen, name_type) + use CharacterStringModule, only: CharacterStringType + type(CharacterStringType), intent(in) :: input_name + character(len=*), intent(inout) :: mf6_name + integer(I4B), intent(in) :: maxlen + character(len=*), intent(in) :: name_type + character(len=LINELENGTH) :: input_str + integer(I4B) :: ilen + ! + ! -- initialize + mf6_name = '' + input_str = input_name + ilen = len_trim(input_str) + if (ilen > maxlen) then + write (errmsg, '(a,i0,a)') & + 'Input name "'//trim(input_str)//'" exceeds maximum allowed length (', & + maxlen, ') for '//trim(name_type)//'.' + call store_error(errmsg) + end if + ! + ! -- set truncated name + mf6_name = trim(input_str) + ! + ! -- return + return + end subroutine inlen_check + end module SourceCommonModule From 9ff0db70fa21c5ba4f32dd73a263270407065271 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 23 May 2024 09:43:53 -0400 Subject: [PATCH 196/199] test(release): disable individual example script checks for now (#1843) * need to consider whether necessary to test all individual example scripts too * logic to pick them randomly was broken, didn't respect gwf model dependencies --- distribution/check_dist.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/distribution/check_dist.py b/distribution/check_dist.py index bfd237e7e81..b25ef5d8c64 100644 --- a/distribution/check_dist.py +++ b/distribution/check_dist.py @@ -189,15 +189,14 @@ def test_examples(dist_dir_path, full): print(f"{len(example_paths)} example models found:") pprint(example_paths) - # pick some examples at random to test run individually - n = 3 - shuffle(example_paths) - script_paths = [next(iter(p.rglob(f"*run{_scext}"))) for p in example_paths[:n]] - print(f"Testing {n} randomly selected example model scripts:") - pprint(script_paths) - for script_path in script_paths: - out, err, ret = run_cmd(str(script_path), cwd=script_path.parent) - assert not ret, out + err + # todo: check individual scripts? toggle via release workflow input? + # model_paths = get_model_paths(examples_path) + # script_paths = [mp / f"run{_scext}" for mp in model_paths] + # for script_path in script_paths: + # print(f"Testing example script: {script_path}") + # assert script_path.is_file() + # out, err, ret = run_cmd(str(script_path), cwd=script_path.parent) + # assert not ret, out + err # check comprehensive examples script and give it a test run script_path = examples_path / f"runall{_scext}" From baf2328330fa00674dc5ccfa36c778a9b43d9f42 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 23 May 2024 10:11:07 -0400 Subject: [PATCH 197/199] ci(release): fix input parsing in release_dispatch.yml (#1844) developmode, run_tests and models inputs were not passed to release.yml correctly --- .github/workflows/release_dispatch.yml | 28 +++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release_dispatch.yml b/.github/workflows/release_dispatch.yml index 7e96783c37e..1feab0f6526 100644 --- a/.github/workflows/release_dispatch.yml +++ b/.github/workflows/release_dispatch.yml @@ -65,6 +65,7 @@ jobs: compiler_toolchain: ${{ steps.set_compiler.outputs.compiler_toolchain }} compiler_version: ${{ steps.set_compiler.outputs.compiler_version }} version: ${{ steps.set_version.outputs.version }} + models: ${{ steps.set_models.outputs.models }} steps: - name: Set branch id: set_branch @@ -126,6 +127,23 @@ jobs: exit 1 fi echo "version=$ver" >> $GITHUB_OUTPUT + - name: Set models + id: set_models + run: | + # if models were selected explicitly via workflow_dispatch, use them + if [[ ("${{ github.event_name }}" == "workflow_dispatch") && (-n "${{ inputs.models }}") ]]; then + models="${{ inputs.models }}" + echo "using model selection $models from workflow_dispatch" + elif [[ ("${{ github.event_name }}" == "push") && ("${{ github.ref_name }}" != "master") ]]; then + # if release was triggered by pushing a release branch, use default models + models="gwf,gwt,gwe,prt" + echo "using default model selection: $models" + else + # otherwise exit with an error + echo "error: model selection could not be determined" + exit 1 + fi + echo "models=$models" >> $GITHUB_OUTPUT make_dist: name: Make distribution uses: MODFLOW-USGS/modflow6/.github/workflows/release.yml@develop @@ -137,11 +155,15 @@ jobs: compiler_toolchain: ${{ needs.set_options.outputs.compiler_toolchain }} compiler_version: ${{ needs.set_options.outputs.compiler_version }} branch: ${{ needs.set_options.outputs.branch }} - developmode: ${{ inputs.developmode }} + # If the workflow is manually triggered, the maintainer must manually set developmode to false, otherwise the default is true. + # If triggered by pushing a release branch, the release is developmode if the branch name contains "rc", otherwise releasemode. + developmode: ${{ (github.event_name == 'workflow_dispatch' && inputs.developmode == 'true') || (github.event_name != 'workflow_dispatch' && contains(github.ref_name, 'rc')) }} full: true - run_tests: ${{ inputs.run_tests }} + # If the workflow is manually triggered, the maintainer must manually set run_tests to false, otherwise the default is true. + # If triggered by pushing a release branch, tests are enabled. + run_tests: ${{ (github.event_name == 'workflow_dispatch' && inputs.run_tests == 'true') || github.event_name != 'workflow_dispatch' }} version: ${{ needs.set_options.outputs.version }} - models: ${{ inputs.models }} + models: ${{ needs.set_options.outputs.models }} pr: name: Draft release PR if: ${{ github.ref_name != 'master' && ((github.event_name == 'workflow_dispatch' && inputs.approve == 'true') || (github.event_name != 'workflow_dispatch' && !contains(github.ref_name, 'rc'))) }} From 0f9e741aba4ea049205ffaf7b71eda0f2fcb5ed1 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 23 May 2024 13:02:39 -0400 Subject: [PATCH 198/199] fix(update_version.py): fix pixi.toml version string substitution (#1846) The update-version task was getting substituted too, we only want to sub the version string --- distribution/update_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/distribution/update_version.py b/distribution/update_version.py index 8422dfce354..0f567cd2140 100755 --- a/distribution/update_version.py +++ b/distribution/update_version.py @@ -336,7 +336,7 @@ def update_pixi(version: Version): tag = "version =" with open(path, "w") as fp: for line in lines: - if tag in line: + if line.startswith(tag): line = f'{tag} "{version}"\n' fp.write(line) From a2fec41d0d462a2b368fc24e9ddd3087a53d4491 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 23 May 2024 20:04:41 +0000 Subject: [PATCH 199/199] ci(release): update version to 6.5.0 --- .build_rtd_docs/Doxyfile | 2 +- CITATION.cff | 4 ++-- DISCLAIMER.md | 17 +++++++++-------- README.md | 19 ++++++++++--------- code.json | 6 +++--- doc/version.py | 4 ++-- doc/version.tex | 4 ++-- meson.build | 2 +- pixi.toml | 2 +- src/Utilities/version.f90 | 26 ++++++++++++++------------ version.txt | 2 +- 11 files changed, 46 insertions(+), 42 deletions(-) diff --git a/.build_rtd_docs/Doxyfile b/.build_rtd_docs/Doxyfile index 1dc8033b435..95a4d26625d 100644 --- a/.build_rtd_docs/Doxyfile +++ b/.build_rtd_docs/Doxyfile @@ -37,7 +37,7 @@ PROJECT_NAME = "MODFLOW 6" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = "version 6.5.0.dev0" +PROJECT_NUMBER = "version 6.5.0" # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/CITATION.cff b/CITATION.cff index 08cfa01c6d4..af515842683 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -2,8 +2,8 @@ cff-version: 1.2.0 message: If you use this software, please cite the software itself. type: software title: MODFLOW 6 Modular Hydrologic Model -version: 6.5.0.dev2 -date-released: '2024-02-13' +version: 6.5.0 +date-released: '2024-05-23' doi: 10.5066/F76Q1VQV abstract: MODFLOW 6 is an object-oriented program and framework developed to provide a platform for supporting multiple models and multiple types of models within the diff --git a/DISCLAIMER.md b/DISCLAIMER.md index f32778cb5e4..9226475a939 100644 --- a/DISCLAIMER.md +++ b/DISCLAIMER.md @@ -1,11 +1,12 @@ Disclaimer ---------- -This software is preliminary or provisional and is subject to revision. It is -being provided to meet the need for timely best science. The software has not -received final approval by the U.S. Geological Survey (USGS). No warranty, -expressed or implied, is made by the USGS or the U.S. Government as to the -functionality of the software and related material nor shall the fact of release -constitute any such warranty. The software is provided on the condition that -neither the USGS nor the U.S. Government shall be held liable for any damages -resulting from the authorized or unauthorized use of the software. +This software has been approved for release by the U.S. Geological Survey +(USGS). Although the software has been subjected to rigorous review, the USGS +reserves the right to update the software as needed pursuant to further analysis +and review. No warranty, expressed or implied, is made by the USGS or the U.S. +Government as to the functionality of the software and related material nor +shall the fact of release constitute any such warranty. Furthermore, the +software is released on condition that neither the USGS nor the U.S. Government +shall be held liable for any damages resulting from its authorized or +unauthorized use. diff --git a/README.md b/README.md index f2d96047b8f..fa742b249aa 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ This is the development repository for the USGS MODFLOW 6 Hydrologic Model. The official USGS distribution is available at [USGS Release Page](https://water.usgs.gov/ogw/modflow/MODFLOW.html). -### Version 6.5.0.dev2 (preliminary) +### Version 6.5.0 [![GitHub release](https://img.shields.io/github/release/MODFLOW-USGS/modflow6.svg)](https://github.com/MODFLOW-USGS/modflow6/releases/latest) [![MODFLOW 6 continuous integration](https://github.com/MODFLOW-USGS/modflow6/actions/workflows/ci.yml/badge.svg)](https://github.com/MODFLOW-USGS/modflow6/actions/workflows/ci.yml) @@ -110,12 +110,13 @@ Citations for specific versions are included with the [releases](https://github. Disclaimer ---------- -This software is preliminary or provisional and is subject to revision. It is -being provided to meet the need for timely best science. The software has not -received final approval by the U.S. Geological Survey (USGS). No warranty, -expressed or implied, is made by the USGS or the U.S. Government as to the -functionality of the software and related material nor shall the fact of release -constitute any such warranty. The software is provided on the condition that -neither the USGS nor the U.S. Government shall be held liable for any damages -resulting from the authorized or unauthorized use of the software. +This software has been approved for release by the U.S. Geological Survey +(USGS). Although the software has been subjected to rigorous review, the USGS +reserves the right to update the software as needed pursuant to further analysis +and review. No warranty, expressed or implied, is made by the USGS or the U.S. +Government as to the functionality of the software and related material nor +shall the fact of release constitute any such warranty. Furthermore, the +software is released on condition that neither the USGS nor the U.S. Government +shall be held liable for any damages resulting from its authorized or +unauthorized use. diff --git a/code.json b/code.json index 8edddb0aa5a..a2fa703adc0 100644 --- a/code.json +++ b/code.json @@ -1,6 +1,6 @@ [ { - "status": "Preliminary", + "status": "Release", "languages": [ "Fortran2008" ], @@ -18,9 +18,9 @@ "email": "langevin@usgs.gov" }, "laborHours": -1, - "version": "6.5.0.dev2", + "version": "6.5.0", "date": { - "metadataLastUpdated": "2024-02-13" + "metadataLastUpdated": "2024-05-23" }, "organization": "U.S. Geological Survey", "permissions": { diff --git a/doc/version.py b/doc/version.py index b9069149d3d..425922f3491 100644 --- a/doc/version.py +++ b/doc/version.py @@ -1,3 +1,3 @@ # MODFLOW 6 version file automatically created using...update_version.py -# created on...February 13, 2024 21:29:25 -__version__ = "6.5.0.dev2" +# created on...May 23, 2024 20:04:41 +__version__ = "6.5.0" diff --git a/doc/version.tex b/doc/version.tex index ae1627b11a1..8fdbf1ca67b 100644 --- a/doc/version.tex +++ b/doc/version.tex @@ -1,3 +1,3 @@ -\newcommand{\modflowversion}{mf6.5.0.dev2} -\newcommand{\modflowdate}{February 13, 2024} +\newcommand{\modflowversion}{mf6.5.0} +\newcommand{\modflowdate}{May 23, 2024} \newcommand{\currentmodflowversion}{Version \modflowversion---\modflowdate} diff --git a/meson.build b/meson.build index 0da78223a9e..f8cae64fed9 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project( 'MODFLOW 6', 'fortran', - version: '6.5.0.dev2', + version: '6.5.0', license: 'CC0', meson_version: '>= 1.1.0', default_options : [ diff --git a/pixi.toml b/pixi.toml index 1f3d894a699..4ed90c155b4 100644 --- a/pixi.toml +++ b/pixi.toml @@ -2,7 +2,7 @@ name = "modflow6" channels = ["conda-forge"] platforms = ["win-64", "linux-64", "linux-aarch64", "osx-arm64", "osx-64"] -version = "6.5.0.dev2" +version = "6.5.0" [dependencies] appdirs = "*" diff --git a/src/Utilities/version.f90 b/src/Utilities/version.f90 index 0f3fa1ce2ee..60a74653676 100644 --- a/src/Utilities/version.f90 +++ b/src/Utilities/version.f90 @@ -17,8 +17,8 @@ module VersionModule public ! -- modflow 6 version integer(I4B), parameter :: IDEVELOPMODE = 1 - character(len=*), parameter :: VERSIONNUMBER = '6.5.0.dev2' - character(len=*), parameter :: VERSIONTAG = ' (preliminary) 02/13/2024' + character(len=*), parameter :: VERSIONNUMBER = '6.5.0' + character(len=*), parameter :: VERSIONTAG = ' 05/23/2024' character(len=40), parameter :: VERSION = VERSIONNUMBER//VERSIONTAG character(len=2), parameter :: MFVNAM = ' 6' character(len=*), parameter :: MFTITLE = & @@ -75,16 +75,18 @@ module VersionModule ! -- disclaimer must be appropriate for version (release or release candidate) character(len=*), parameter :: FMTDISCLAIMER = & "(/,& - &'This software is preliminary or provisional and is subject to ',/,& - &'revision. It is being provided to meet the need for timely best ',/,& - &'science. The software has not received final approval by the U.S. ',/,& - &'Geological Survey (USGS). No warranty, expressed or implied, is made ',/,& - &'by the USGS or the U.S. Government as to the functionality of the ',/,& - &'software and related material nor shall the fact of release ',/,& - &'constitute any such warranty. The software is provided on the ',/,& - &'condition that neither the USGS nor the U.S. Government shall be held ',/,& - &'liable for any damages resulting from the authorized or unauthorized ',/,& - &'use of the software.',/)" + &'This software has been approved for release by the U.S. Geological ',/,& + &'Survey (USGS). Although the software has been subjected to rigorous ',/,& + &'review, the USGS reserves the right to update the software as needed ',/,& + &'pursuant to further analysis and review. No warranty, expressed or ',/,& + &'implied, is made by the USGS or the U.S. Government as to the ',/,& + &'functionality of the software and related material nor shall the ',/,& + &'fact of release constitute any such warranty. Furthermore, the ',/,& + &'software is released on condition that neither the USGS nor the U.S. ',/,& + &'Government shall be held liable for any damages resulting from its ',/,& + &'authorized or unauthorized use. Also refer to the USGS Water ',/,& + &'Resources Software User Rights Notice for complete use, copyright, ',/,& + &'and distribution information.',/)" contains diff --git a/version.txt b/version.txt index 393ba97a6cb..4be2c727ad9 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -6.5.0.dev2 +6.5.0 \ No newline at end of file